[trunk] WIP: enhance j2k_to_image with new get_decoded_tile functionality
[openjpeg.git] / libopenjpeg / jp2.c
index 322abc75c73638eb68513cfac86fabe17946da82..ad5527bb19b117922c41c9c030ca1c885874a2d6 100644 (file)
@@ -2635,6 +2635,67 @@ opj_bool jp2_set_decode_area(    opj_jp2_v2_t *p_jp2,
        return j2k_set_decode_area(p_jp2->j2k, p_image, p_start_x, p_start_y, p_end_x, p_end_y, p_manager);
 }
 
+/**
+ * Get the decoded tile.
+ *
+ * @param      p_jp2                   the jpeg2000 codec.
+ * @param      p_stream                input_stream
+ * @param      p_image                 output image.   .
+ * @param      p_manager               the user event manager
+ * @param      tile_index              index of the tile we want decode
+ *
+ * @return     true                    if succeed.
+ */
+opj_bool jp2_get_tile( opj_jp2_v2_t *jp2,
+                                               opj_stream_private_t *p_stream,
+                                               opj_image_t* p_image,
+                                               struct opj_event_mgr * p_manager,
+                                               OPJ_UINT32 tile_index )
+{
+       if (!p_image)
+               return OPJ_FALSE;
+
+       opj_event_msg_v2(p_manager, EVT_WARNING, "JP2 box which are after the codestream will not be read by this function.\n");
+
+       if (! j2k_get_tile(jp2->j2k, p_stream, p_image, p_manager, tile_index) ){
+               opj_event_msg_v2(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
+               return OPJ_FALSE;
+       }
+
+       /* Set Image Color Space */
+       if (jp2->enumcs == 16)
+               p_image->color_space = CLRSPC_SRGB;
+       else if (jp2->enumcs == 17)
+               p_image->color_space = CLRSPC_GRAY;
+       else if (jp2->enumcs == 18)
+               p_image->color_space = CLRSPC_SYCC;
+       else
+               p_image->color_space = CLRSPC_UNKNOWN;
+
+       /* Apply the color space if needed */
+       if(jp2->color.jp2_cdef) {
+               jp2_apply_cdef(p_image, &(jp2->color));
+       }
+
+       if(jp2->color.jp2_pclr) {
+               /* Part 1, I.5.3.4: Either both or none : */
+               if( !jp2->color.jp2_pclr->cmap)
+                       jp2_free_pclr(&(jp2->color));
+               else
+                       jp2_apply_pclr(p_image, &(jp2->color));
+       }
+
+       if(jp2->color.icc_profile_buf) {
+               p_image->icc_profile_buf = jp2->color.icc_profile_buf;
+               p_image->icc_profile_len = jp2->color.icc_profile_len;
+               jp2->color.icc_profile_buf = NULL;
+       }
+
+       return OPJ_TRUE;
+}
+
+
+
 /* ----------------------------------------------------------------------- */
 /* JP2 encoder interface                                             */
 /* ----------------------------------------------------------------------- */
@@ -2703,3 +2764,8 @@ opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_v2_t* p_jp2)
        return j2k_get_cstr_info(p_jp2->j2k);
 }
 
+opj_bool jp2_set_decoded_resolution_factor(opj_jp2_v2_t *p_jp2, OPJ_UINT32 res_factor, opj_event_mgr_t * p_manager)
+{
+       return j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);
+}
+