diff options
| author | Antonin Descampe <antonin@gmail.com> | 2010-12-08 11:06:41 +0000 |
|---|---|---|
| committer | Antonin Descampe <antonin@gmail.com> | 2010-12-08 11:06:41 +0000 |
| commit | d08a96e2517c545b8ff2d7b89c7778eb5b1fd4ba (patch) | |
| tree | 16f839d4499afc2ead2b759b22907a50bd012de3 /libopenjpeg | |
| parent | 59d9b97ffe35f17c71b25a749b885054cb4727d9 (diff) | |
(thanks to Winfried for his help)
* [antonin] changed remaining "WIN32" to "_WIN32"
! [antonin] libopenjpeg has no more dependency on LCMS lib. Everything concerning color (icc profile, conversion to rgb, etc) has been put outside libopenjpeg and is used in j2k_to_image.c and mj2_to_frames.c.
- [antonin] removed "opj_convert{.c,.h}"
+ [antonin] added a directory "common/" that contains "getopt{.c,.h}" (previously in "codec/compat").
+ [antonin] added files "color{.c,.h}" in "common/" that define the code for icc profile management and sycc_to_rgb conversion
+ [antonin] added "common/format_defs.h" that contains common definitions used in image_to_j2k, j2k_to_image, j2k_dump.
Diffstat (limited to 'libopenjpeg')
| -rw-r--r-- | libopenjpeg/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | libopenjpeg/Makefile.am | 4 | ||||
| -rw-r--r-- | libopenjpeg/jp2.c | 378 | ||||
| -rw-r--r-- | libopenjpeg/jp2.h | 10 | ||||
| -rw-r--r-- | libopenjpeg/openjpeg.h | 4 | ||||
| -rw-r--r-- | libopenjpeg/opj_convert.c | 216 | ||||
| -rw-r--r-- | libopenjpeg/opj_convert.h | 6 | ||||
| -rw-r--r-- | libopenjpeg/opj_includes.h | 1 |
8 files changed, 89 insertions, 538 deletions
diff --git a/libopenjpeg/CMakeLists.txt b/libopenjpeg/CMakeLists.txt index d1d77a2b..39fb2a9a 100644 --- a/libopenjpeg/CMakeLists.txt +++ b/libopenjpeg/CMakeLists.txt @@ -19,13 +19,8 @@ SET(OPENJPEG_SRCS t2.c tcd.c tgt.c - opj_convert.c ) -IF(LCMS_INCLUDE_DIR) - INCLUDE_DIRECTORIES( ${LCMS_INCLUDE_DIR} ) -ENDIF(LCMS_INCLUDE_DIR) - # Build the library IF(WIN32) IF(BUILD_SHARED_LIBS) @@ -36,9 +31,6 @@ IF(WIN32) ENDIF(WIN32) ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS}) SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) -IF(LCMS_LIB) - TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME} ${LCMS_LIB}) -ENDIF(LCMS_LIB) # Install library INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME} diff --git a/libopenjpeg/Makefile.am b/libopenjpeg/Makefile.am index 11e6249e..157f2806 100644 --- a/libopenjpeg/Makefile.am +++ b/libopenjpeg/Makefile.am @@ -13,11 +13,11 @@ libopenjpeg_la_LDFLAGS = -no-undefined \ libopenjpeg_la_LIBADD = @LDLIBS@ SRCS = bio.c cio.c dwt.c event.c image.c j2k.c j2k_lib.c jp2.c jpt.c \ - mct.c mqc.c openjpeg.c pi.c raw.c t1.c t2.c tcd.c tgt.c opj_convert.c + mct.c mqc.c openjpeg.c pi.c raw.c t1.c t2.c tcd.c tgt.c INCLS = bio.h cio.h dwt.h event.h fix.h image.h int.h j2k.h j2k_lib.h \ jp2.h jpt.h mct.h mqc.h pi.h raw.h t1.h t2.h tcd.h tgt.h opj_malloc.h \ - opj_convert.h opj_includes.h + opj_includes.h libopenjpeg_la_SOURCES = $(SRCS) $(INCLS) diff --git a/libopenjpeg/jp2.c b/libopenjpeg/jp2.c index 61b22cf1..20cf2e67 100644 --- a/libopenjpeg/jp2.c +++ b/libopenjpeg/jp2.c @@ -28,15 +28,6 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ -#include "opj_config.h" -#ifdef HAVE_LIBLCMS2 -#include <math.h> -#include <lcms2.h> -#endif -#ifdef HAVE_LIBLCMS1 -#include <math.h> -#include <lcms.h> -#endif #include "opj_includes.h" /** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ @@ -92,53 +83,47 @@ static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio); Decode the structure of a JP2 file @param jp2 JP2 handle @param cio Input buffer stream -@param ext Collector for profile, cdef and pclr data +@param color Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, - struct extension *ext); + opj_jp2_color_t *color); /** Apply collected palette data -@param ext Collector for profile, cdef and pclr data +@param color Collector for profile, cdef and pclr data @param image */ -static void jp2_apply_pclr(struct extension *ext, opj_image_t *image); +static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image); /** Collect palette data @param jp2 JP2 handle @param cio Input buffer stream @param box -@param ext Collector for profile, cdef and pclr data +@param color Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, struct extension *ext); + opj_jp2_box_t *box, opj_jp2_color_t *color); /** Collect component mapping data @param jp2 JP2 handle @param cio Input buffer stream @param box -@param ext Collector for profile, cdef and pclr data +@param color Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, struct extension *ext); + opj_jp2_box_t *box, opj_jp2_color_t *color); /** Collect colour specification data @param jp2 JP2 handle @param cio Input buffer stream @param box -@param ext Collector for profile, cdef and pclr data +@param color Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, struct extension *ext); -/** -Apply ICC profile if Color Management System available -@param ext Collector for profile, cdef and pclr data -@param image -*/ -static void jp2_apply_profile(struct extension *ext, opj_image_t *image); + opj_jp2_box_t *box, opj_jp2_color_t *color); /*@}*/ /*@}*/ @@ -308,32 +293,32 @@ static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) { cio_seek(cio, box.init_pos + box.length); } -static void jp2_free_pclr(struct extension *ext) +static void jp2_free_pclr(opj_jp2_color_t *color) { - opj_free(ext->jp2_pclr->channel_sign); - opj_free(ext->jp2_pclr->channel_size); - opj_free(ext->jp2_pclr->entries); + opj_free(color->jp2_pclr->channel_sign); + opj_free(color->jp2_pclr->channel_size); + opj_free(color->jp2_pclr->entries); - if(ext->jp2_pclr->cmap) opj_free(ext->jp2_pclr->cmap); + if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap); - opj_free(ext->jp2_pclr); ext->jp2_pclr = NULL; + opj_free(color->jp2_pclr); color->jp2_pclr = NULL; } -static void free_ext_data(struct extension *ext) +static void free_color_data(opj_jp2_color_t *color) { - if(ext->jp2_pclr) + if(color->jp2_pclr) { - jp2_free_pclr(ext); + jp2_free_pclr(color); } - if(ext->jp2_cdef) + if(color->jp2_cdef) { - if(ext->jp2_cdef->info) opj_free(ext->jp2_cdef->info); - opj_free(ext->jp2_cdef); + if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info); + opj_free(color->jp2_cdef); } - if(ext->jp2_profile_buf) opj_free(ext->jp2_profile_buf); + if(color->icc_profile_buf) opj_free(color->icc_profile_buf); } -static void jp2_apply_pclr(struct extension *ext, opj_image_t *image) +static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image) { opj_image_comp_t *old_comps, *new_comps; unsigned char *channel_size, *channel_sign; @@ -344,11 +329,11 @@ static void jp2_apply_pclr(struct extension *ext, opj_image_t *image) unsigned short i, nr_channels, cmp, pcol; int k, top_k; - channel_size = ext->jp2_pclr->channel_size; - channel_sign = ext->jp2_pclr->channel_sign; - entries = ext->jp2_pclr->entries; - cmap = ext->jp2_pclr->cmap; - nr_channels = ext->jp2_pclr->nr_channels; + channel_size = color->jp2_pclr->channel_size; + channel_sign = color->jp2_pclr->channel_sign; + entries = color->jp2_pclr->entries; + cmap = color->jp2_pclr->cmap; + nr_channels = color->jp2_pclr->nr_channels; old_comps = image->comps; new_comps = (opj_image_comp_t*) @@ -370,7 +355,7 @@ static void jp2_apply_pclr(struct extension *ext, opj_image_t *image) new_comps[pcol].prec = channel_size[i]; new_comps[pcol].sgnd = channel_sign[i]; } - top_k = ext->jp2_pclr->nr_entries - 1; + top_k = color->jp2_pclr->nr_entries - 1; for(i = 0; i < nr_channels; ++i) { @@ -400,12 +385,12 @@ static void jp2_apply_pclr(struct extension *ext, opj_image_t *image) image->comps = new_comps; image->numcomps = nr_channels; - jp2_free_pclr(ext); + jp2_free_pclr(color); }/* apply_pclr() */ static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, struct extension *ext) + opj_jp2_box_t *box, opj_jp2_color_t *color) { opj_jp2_pclr_t *jp2_pclr; unsigned char *channel_size, *channel_sign; @@ -417,7 +402,7 @@ static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, /* Part 1, I.5.3.4: 'There shall be at most one Palette box inside * a JP2 Header box' : */ - if(ext->jp2_pclr) return false; + if(color->jp2_pclr) return false; nr_entries = cio_read(cio, 2); /* NE */ nr_channels = cio_read(cio, 1);/* NPC */ @@ -435,7 +420,7 @@ static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, jp2_pclr->nr_channels = nr_channels; jp2_pclr->cmap = NULL; - ext->jp2_pclr = jp2_pclr; + color->jp2_pclr = jp2_pclr; for(i = 0; i < nr_channels; ++i) { @@ -457,20 +442,20 @@ static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, }/* jp2_read_pclr() */ static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, struct extension *ext) + opj_jp2_box_t *box, opj_jp2_color_t *color) { opj_jp2_cmap_comp_t *cmap; unsigned short i, nr_channels; /* Need nr_channels: */ - if(ext->jp2_pclr == NULL) return false; + if(color->jp2_pclr == NULL) return false; /* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box * inside a JP2 Header box' : */ - if(ext->jp2_pclr->cmap) return false; + if(color->jp2_pclr->cmap) return false; - nr_channels = ext->jp2_pclr->nr_channels; + nr_channels = color->jp2_pclr->nr_channels; cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t)); @@ -481,20 +466,20 @@ static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, cmap[i].pcol = cio_read(cio, 1); } - ext->jp2_pclr->cmap = cmap; + color->jp2_pclr->cmap = cmap; return true; }/* jp2_read_cmap() */ -static void jp2_apply_cdef(opj_image_t *image, struct extension *ext) +static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color) { opj_jp2_cdef_info_t *info; int color_space; unsigned short i, n, cn, typ, asoc, acn; color_space = image->color_space; - info = ext->jp2_cdef->info; - n = ext->jp2_cdef->n; + info = color->jp2_cdef->info; + n = color->jp2_cdef->n; for(i = 0; i < n; ++i) { @@ -515,14 +500,14 @@ static void jp2_apply_cdef(opj_image_t *image, struct extension *ext) info[acn].asoc = info[acn].cn + 1; } } - if(ext->jp2_cdef->info) opj_free(ext->jp2_cdef->info); + if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info); - opj_free(ext->jp2_cdef); ext->jp2_cdef = NULL; + opj_free(color->jp2_cdef); color->jp2_cdef = NULL; }/* jp2_apply_cdef() */ static bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, struct extension *ext) + opj_jp2_box_t *box, opj_jp2_color_t *color) { opj_jp2_cdef_info_t *info; unsigned short i, n; @@ -530,16 +515,16 @@ static bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio, /* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box * inside a JP2 Header box.' */ - if(ext->jp2_cdef) return false; + if(color->jp2_cdef) return false; if((n = cio_read(cio, 2)) == 0) return false; /* szukw000: FIXME */ info = (opj_jp2_cdef_info_t*) opj_malloc(n * sizeof(opj_jp2_cdef_info_t)); - ext->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t)); - ext->jp2_cdef->info = info; - ext->jp2_cdef->n = n; + color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t)); + color->jp2_cdef->info = info; + color->jp2_cdef->n = n; for(i = 0; i < n; ++i) { @@ -552,7 +537,7 @@ static bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio, }/* jp2_read_cdef() */ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, struct extension *ext) + opj_jp2_box_t *box, opj_jp2_color_t *color) { int skip_len; opj_common_ptr cinfo; @@ -560,7 +545,7 @@ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, /* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour * Specification boxes after the first.' */ - if(ext->jp2_has_colr) return false; + if(color->jp2_has_colr) return false; cinfo = jp2->cinfo; @@ -586,12 +571,12 @@ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, unsigned char *start; start = cio_getbp(cio); - ext->jp2_profile_buf = (unsigned char*)opj_malloc(skip_len); - ext->jp2_profile_len = skip_len; + color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len); + color->icc_profile_len = skip_len; cio_skip(cio, box->init_pos + box->length - cio_tell(cio)); - memcpy(ext->jp2_profile_buf, start, skip_len); + memcpy(color->icc_profile_buf, start, skip_len); } } @@ -600,213 +585,12 @@ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n"); return false; } - ext->jp2_has_colr = 1; + color->jp2_has_colr = 1; return true; }/* jp2_read_colr() */ -#if defined(HAVE_LIBLCMS2) || defined(HAVE_LIBLCMS1) -#ifdef HAVE_LIBLCMS1 -/* Bob Friesenhahn proposed:*/ -#define cmsSigXYZData icSigXYZData -#define cmsSigLabData icSigLabData -#define cmsSigCmykData icSigCmykData -#define cmsSigYCbCrData icSigYCbCrData -#define cmsSigLuvData icSigLuvData -#define cmsSigGrayData icSigGrayData -#define cmsSigRgbData icSigRgbData -#define cmsUInt32Number DWORD - -#define cmsColorSpaceSignature icColorSpaceSignature -#define cmsGetHeaderRenderingIntent cmsTakeRenderingIntent - -#endif /* HAVE_LIBLCMS1 */ - -static void jp2_apply_profile(struct extension *ext, opj_image_t *image) -{ - cmsHPROFILE in_prof, out_prof; - cmsHTRANSFORM transform; - cmsColorSpaceSignature in_space, out_space; - cmsUInt32Number intent, in_type, out_type, nr_samples; - int *r, *g, *b; - int prec, i, max, max_w, max_h; - OPJ_COLOR_SPACE oldspace; - - in_prof = - cmsOpenProfileFromMem(ext->jp2_profile_buf, ext->jp2_profile_len); - in_space = cmsGetPCS(in_prof); - out_space = cmsGetColorSpace(in_prof); - intent = cmsGetHeaderRenderingIntent(in_prof); - - - max_w = image->comps[0].w; max_h = image->comps[0].h; - prec = image->comps[0].prec; - oldspace = image->color_space; - - if(out_space == cmsSigRgbData) /* enumCS 16 */ - { - in_type = TYPE_RGB_16; - out_type = TYPE_RGB_16; - out_prof = cmsCreate_sRGBProfile(); - image->color_space = CLRSPC_SRGB; - } - else - if(out_space == cmsSigGrayData) /* enumCS 17 */ - { - in_type = TYPE_GRAY_8; - out_type = TYPE_RGB_8; - out_prof = cmsCreate_sRGBProfile(); - image->color_space = CLRSPC_SRGB; - } - else - if(out_space == cmsSigYCbCrData) /* enumCS 18 */ - { - in_type = TYPE_YCbCr_16; - out_type = TYPE_RGB_16; - out_prof = cmsCreate_sRGBProfile(); - image->color_space = CLRSPC_SRGB; - } - else - { -#ifdef DEBUG_PROFILE -fprintf(stderr,"%s:%d: jp2_apply_profile\n\tICC Profile has unknown " -"output colorspace(%#x)(%c%c%c%c)\n\tICC Profile ignored.\n", -__FILE__,__LINE__,out_space, -(out_space>>24) & 0xff,(out_space>>16) & 0xff, -(out_space>>8) & 0xff, out_space & 0xff); -#endif - return; - } - -#ifdef DEBUG_PROFILE -fprintf(stderr,"%s:%d:jp2_apply_profile\n\tchannels(%d) prec(%d) w(%d) h(%d)" -"\n\tprofile: in(%p) out(%p)\n",__FILE__,__LINE__,image->numcomps,prec, -max_w,max_h, (void*)in_prof,(void*)out_prof); - -fprintf(stderr,"\trender_intent (%u)\n\t" -"color_space: in(%#x)(%c%c%c%c) out:(%#x)(%c%c%c%c)\n\t" -" type: in(%u) out:(%u)\n", -intent, -in_space, -(in_space>>24) & 0xff,(in_space>>16) & 0xff, -(in_space>>8) & 0xff, in_space & 0xff, - -out_space, -(out_space>>24) & 0xff,(out_space>>16) & 0xff, -(out_space>>8) & 0xff, out_space & 0xff, - -in_type,out_type - ); -#endif /* DEBUG_PROFILE */ - - transform = cmsCreateTransform(in_prof, in_type, - out_prof, out_type, intent, 0); - -#ifdef HAVE_LIBLCMS2 -/* Possible for: LCMS_VERSION >= 2000 :*/ - cmsCloseProfile(in_prof); - cmsCloseProfile(out_prof); -#endif - - if(transform == NULL) - { -#ifdef DEBUG_PROFILE -fprintf(stderr,"%s:%d:jp2_apply_profile\n\tcmsCreateTransform failed. " -"ICC Profile ignored.\n",__FILE__,__LINE__); -#endif - image->color_space = oldspace; -#ifdef HAVE_LIBLCMS1 - cmsCloseProfile(in_prof); - cmsCloseProfile(out_prof); -#endif - return; - } - - if(image->numcomps > 2)/* RGB, RGBA */ - { - unsigned short *inbuf, *outbuf, *in, *out; - max = max_w * max_h; nr_samples = max * 3 * sizeof(unsigned short); - in = inbuf = (unsigned short*)opj_malloc(nr_samples); - out = outbuf = (unsigned short*)opj_malloc(nr_samples); - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - - for(i = 0; i < max; ++i) - { - *in++ = (unsigned short)*r++; - *in++ = (unsigned short)*g++; - *in++ = (unsigned short)*b++; - } - - cmsDoTransform(transform, inbuf, outbuf, max); - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - - for(i = 0; i < max; ++i) - { - *r++ = (int)*out++; - *g++ = (int)*out++; - *b++ = (int)*out++; - } - opj_free(inbuf); opj_free(outbuf); - } - else /* GRAY, GRAYA */ - { - unsigned char *in, *inbuf, *out, *outbuf; - - max = max_w * max_h; nr_samples = max * 3 * sizeof(unsigned char); - in = inbuf = (unsigned char*)opj_malloc(nr_samples); - out = outbuf = (unsigned char*)opj_malloc(nr_samples); - - image->comps = (opj_image_comp_t*) - opj_realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t)); - - if(image->numcomps == 2) - image->comps[3] = image->comps[1]; - - image->comps[1] = image->comps[0]; - image->comps[2] = image->comps[0]; - - image->comps[1].data = (int*)opj_calloc(max, sizeof(int)); - image->comps[2].data = (int*)opj_calloc(max, sizeof(int)); - - image->numcomps += 2; - - r = image->comps[0].data; - - for(i = 0; i < max; ++i) - { - *in++ = (unsigned char)*r++; - } - cmsDoTransform(transform, inbuf, outbuf, max); - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - - for(i = 0; i < max; ++i) - { - *r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++; - } - opj_free(inbuf); opj_free(outbuf); - - }/* if(image->numcomps */ - - cmsDeleteTransform(transform); - -#ifdef HAVE_LIBLCMS1 - cmsCloseProfile(in_prof); - cmsCloseProfile(out_prof); -#endif -}/* jp2_apply_profile() */ - -#endif /* HAVE_LIBLCMS2 || HAVE_LIBLCMS1 */ - -bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext) +bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color) { opj_jp2_box_t box; unsigned int jp2h_end; @@ -846,7 +630,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext) { if(box.type == JP2_COLR) { - if( !jp2_read_colr(jp2, cio, &box, ext)) + if( !jp2_read_colr(jp2, cio, &box, color)) { cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); @@ -856,7 +640,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext) } if(box.type == JP2_CDEF) { - if( !jp2_read_cdef(jp2, cio, &box, ext)) + if( !jp2_read_cdef(jp2, cio, &box, color)) { cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); @@ -866,7 +650,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext) } if(box.type == JP2_PCLR) { - if( !jp2_read_pclr(jp2, cio, &box, ext)) + if( !jp2_read_pclr(jp2, cio, &box, color)) { cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); @@ -876,7 +660,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext) } if(box.type == JP2_CMAP) { - if( !jp2_read_cmap(jp2, cio, &box, ext)) + if( !jp2_read_cmap(jp2, cio, &box, color)) { cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); @@ -893,7 +677,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext) cio_seek(cio, jp2h_end); /* Part 1, I.5.3.3 : 'must contain at least one' */ - return (ext->jp2_has_colr == 1); + return (color->jp2_has_colr == 1); }/* jp2_read_jp2h() */ @@ -902,19 +686,19 @@ opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, { opj_common_ptr cinfo; opj_image_t *image = NULL; - struct extension ext; + opj_jp2_color_t color; if(!jp2 || !cio) { return NULL; } - memset(&ext, 0, sizeof(struct extension)); + memset(&color, 0, sizeof(opj_jp2_color_t)); cinfo = jp2->cinfo; /* JP2 decoding */ - if(!jp2_read_struct(jp2, cio, &ext)) + if(!jp2_read_struct(jp2, cio, &color)) { - free_ext_data(&ext); + free_color_data(&color); opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n"); return NULL; } @@ -924,7 +708,7 @@ opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, if(!image) { - free_ext_data(&ext); + free_color_data(&color); opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n"); return NULL; } @@ -939,29 +723,23 @@ opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, else image->color_space = CLRSPC_UNKNOWN; - if(ext.jp2_cdef) + if(color.jp2_cdef) { - jp2_apply_cdef(image, &ext); + jp2_apply_cdef(image, &color); } - if(ext.jp2_pclr) + if(color.jp2_pclr) { /* Part 1, I.5.3.4: Either both or none : */ - if( !ext.jp2_pclr->cmap) - jp2_free_pclr(&ext); + if( !color.jp2_pclr->cmap) + jp2_free_pclr(&color); else - jp2_apply_pclr(&ext, image); + jp2_apply_pclr(&color, image); } - if(ext.jp2_profile_buf) - { -#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) - jp2_apply_profile(&ext, image); -#endif - opj_free(ext.jp2_profile_buf); - } - else - if(image->color_space == CLRSPC_SYCC) + if(color.icc_profile_buf) { - opj_convert_sycc_to_rgb(image); + image->icc_profile_buf = color.icc_profile_buf; + color.icc_profile_buf = NULL; + image->icc_profile_len = color.icc_profile_len; } return image; @@ -1125,12 +903,12 @@ static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) { static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, - struct extension *ext) { + opj_jp2_color_t *color) { if (!jp2_read_jp(jp2, cio)) return false; if (!jp2_read_ftyp(jp2, cio)) return false; - if (!jp2_read_jp2h(jp2, cio, ext)) + if (!jp2_read_jp2h(jp2, cio, color)) return false; if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset)) return false; diff --git a/libopenjpeg/jp2.h b/libopenjpeg/jp2.h index 3cfaef4a..9ad662cb 100644 --- a/libopenjpeg/jp2.h +++ b/libopenjpeg/jp2.h @@ -95,15 +95,15 @@ typedef struct opj_jp2_pclr /** Collector for ICC profile, palette, component mapping, channel description */ -struct extension +typedef struct opj_jp2_color { - unsigned char *jp2_profile_buf; - int jp2_profile_len; + unsigned char *icc_profile_buf; + int icc_profile_len; opj_jp2_cdef_t *jp2_cdef; opj_jp2_pclr_t *jp2_pclr; unsigned char jp2_has_colr; -}; +} opj_jp2_color_t; /** JP2 component @@ -167,7 +167,7 @@ Read the JP2H box - JP2 Header box (used in MJ2) @param ext Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ -bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext); +bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color); /** Creates a JP2 decompression structure @param cinfo Codec context info diff --git a/libopenjpeg/openjpeg.h b/libopenjpeg/openjpeg.h index 101c7e8b..7ad62bf6 100644 --- a/libopenjpeg/openjpeg.h +++ b/libopenjpeg/openjpeg.h @@ -554,6 +554,10 @@ typedef struct opj_image { OPJ_COLOR_SPACE color_space; /** image components */ opj_image_comp_t *comps; + /** 'restricted' ICC profile */ + unsigned char *icc_profile_buf; + /** size of ICC profile */ + int icc_profile_len; } opj_image_t; /** diff --git a/libopenjpeg/opj_convert.c b/libopenjpeg/opj_convert.c deleted file mode 100644 index 0355e502..00000000 --- a/libopenjpeg/opj_convert.c +++ /dev/null @@ -1,216 +0,0 @@ -#include "opj_includes.h" - -/*-------------------------------------------------------- -Matrix für sYCC, Amendment 1 to IEC 61966-2-1 - -Y : 0.299 0.587 0.114 :R -Cb: -0.1687 -0.3312 0.5 :G -Cr: 0.5 -0.4187 -0.0812 :B - -Inverse: - -R: 1 -3.68213e-05 1.40199 :Y -G: 1.00003 -0.344125 -0.714128 :Cb - 2^(prec - 1) -B: 0.999823 1.77204 -8.04142e-06 :Cr - 2^(prec - 1) - ------------------------------------------------------------*/ -static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr, - int *out_r, int *out_g, int *out_b) -{ - int r, g, b; - - cb -= offset; cr -= offset; - r = y + (int)(1.402 * (float)cr); - if(r < 0) r = 0; else if(r > upb) r = upb; *out_r = r; - - g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr); - if(g < 0) g = 0; else if(g > upb) g = upb; *out_g = g; - - b = y + (int)(1.772 * (float)cb); - if(b < 0) b = 0; else if(b > upb) b = upb; *out_b = b; -} - -static void opj_convert_sycc444(opj_image_t *img) -{ - int *d0, *d1, *d2, *r, *g, *b; - const int *y, *cb, *cr; - int maxw, maxh, max, i, offset, upb; - - i = img->comps[0].prec; - offset = 1<<(i - 1); upb = (1<<i)-1; - - maxw = img->comps[0].w; maxh = img->comps[0].h; - max = maxw * maxh; - - y = img->comps[0].data; - cb = img->comps[1].data; - cr = img->comps[2].data; - - d0 = r = (int*)opj_malloc(sizeof(int) * max); - d1 = g = (int*)opj_malloc(sizeof(int) * max); - d2 = b = (int*)opj_malloc(sizeof(int) * max); - - for(i = 0; i < max; ++i) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - - ++y; ++cb; ++cr; ++r; ++g; ++b; - } - opj_free(img->comps[0].data); img->comps[0].data = d0; - opj_free(img->comps[1].data); img->comps[1].data = d1; - opj_free(img->comps[2].data); img->comps[2].data = d2; - -}/* opj_convert_sycc444() */ - -static void opj_convert_sycc422(opj_image_t *img) -{ - int *d0, *d1, *d2, *r, *g, *b; - const int *y, *cb, *cr; - int maxw, maxh, max, offset, upb; - int i, j; - - i = img->comps[0].prec; - offset = 1<<(i - 1); upb = (1<<i)-1; - - maxw = img->comps[0].w; maxh = img->comps[0].h; - max = maxw * maxh; - - y = img->comps[0].data; - cb = img->comps[1].data; - cr = img->comps[2].data; - - d0 = r = (int*)opj_malloc(sizeof(int) * max); - d1 = g = (int*)opj_malloc(sizeof(int) * max); - d2 = b = (int*)opj_malloc(sizeof(int) * max); - - for(i=0; i < maxh; ++i) - { - for(j=0; j < maxw; j += 2) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - - ++y; ++r; ++g; ++b; - - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - - ++y; ++r; ++g; ++b; ++cb; ++cr; - } - } - opj_free(img->comps[0].data); img->comps[0].data = d0; - opj_free(img->comps[1].data); img->comps[1].data = d1; - opj_free(img->comps[2].data); img->comps[2].data = d2; - - img->comps[1].w = maxw; img->comps[1].h = maxh; - img->comps[2].w = maxw; img->comps[2].h = maxh; - img->comps[1].dx = img->comps[0].dx; - img->comps[2].dx = img->comps[0].dx; - img->comps[1].dy = img->comps[0].dy; - img->comps[2].dy = img->comps[0].dy; - -}/* opj_convert_sycc422() */ - -static void opj_convert_sycc420(opj_image_t *img) -{ - int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb; - const int *y, *cb, *cr, *ny; - int maxw, maxh, max, offset, upb; - int i, j; - - i = img->comps[0].prec; - offset = 1<<(i - 1); upb = (1<<i)-1; - - maxw = img->comps[0].w; maxh = img->comps[0].h; - max = maxw * maxh; - - y = img->comps[0].data; - cb = img->comps[1].data; - cr = img->comps[2].data; - - d0 = r = (int*)opj_malloc(sizeof(int) * max); - d1 = g = (int*)opj_malloc(sizeof(int) * max); - d2 = b = (int*)opj_malloc(sizeof(int) * max); - - for(i=0; i < maxh; i += 2) - { - ny = y + maxw; - nr = r + maxw; ng = g + maxw; nb = b + maxw; - - for(j=0; j < maxw; j += 2) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - - ++y; ++r; ++g; ++b; - - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - - ++y; ++r; ++g; ++b; - - sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); - - ++ny; ++nr; ++ng; ++nb; - - sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); - - ++ny; ++nr; ++ng; ++nb; ++cb; ++cr; - } - y += maxw; r += maxw; g += maxw; b += maxw; - } - opj_free(img->comps[0].data); img->comps[0].data = d0; - opj_free(img->comps[1].data); img->comps[1].data = d1; - opj_free(img->comps[2].data); img->comps[2].data = d2; - - img->comps[1].w = maxw; img->comps[1].h = maxh; - img->comps[2].w = maxw; img->comps[2].h = maxh; - img->comps[1].dx = img->comps[0].dx; - img->comps[2].dx = img->comps[0].dx; - img->comps[1].dy = img->comps[0].dy; - img->comps[2].dy = img->comps[0].dy; - -}/* opj_convert_sycc420() */ - -void opj_convert_sycc_to_rgb(opj_image_t *img) -{ - if(img->numcomps < 3) - { - img->color_space = CLRSPC_GRAY; - return; - } - - if((img->comps[0].dx == 1) - && (img->comps[1].dx == 2) - && (img->comps[2].dx == 2) - && (img->comps[0].dy == 1) - && (img->comps[1].dy == 2) - && (img->comps[2].dy == 2))/* horizontal and vertical sub-sample */ - { - opj_convert_sycc420(img); - } - else - if((img->comps[0].dx == 1) - && (img->comps[1].dx == 2) - && (img->comps[2].dx == 2) - && (img->comps[0].dy == 1) - && (img->comps[1].dy == 1) - && (img->comps[2].dy == 1))/* horizontal sub-sample only */ - { - opj_convert_sycc422(img); - } - else - if((img->comps[0].dx == 1) - && (img->comps[1].dx == 1) - && (img->comps[2].dx == 1) - && (img->comps[0].dy == 1) - && (img->comps[1].dy == 1) - && (img->comps[2].dy == 1))/* no sub-sample */ - { - opj_convert_sycc444(img); - } - else - { - fprintf(stderr,"%s:%d:opj_convert_sycc_to_rgb\n\tCAN NOT CONVERT\n", - __FILE__,__LINE__); - return; - } - img->color_space = CLRSPC_SRGB; - -}/* opj_convert_sycc_to_rgb() */ diff --git a/libopenjpeg/opj_convert.h b/libopenjpeg/opj_convert.h deleted file mode 100644 index 029072c2..00000000 --- a/libopenjpeg/opj_convert.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _OPJ_CONVERT_H_ -#define _OPJ_CONVERT_H_ - -extern void opj_convert_sycc_to_rgb(opj_image_t *img); - -#endif /* _OPJ_CONVERT_H_ */ diff --git a/libopenjpeg/opj_includes.h b/libopenjpeg/opj_includes.h index 7ec641bc..53739abf 100644 --- a/libopenjpeg/opj_includes.h +++ b/libopenjpeg/opj_includes.h @@ -104,7 +104,6 @@ static INLINE long lrintf(float f){ } #endif -#include "opj_convert.h" #include "j2k_lib.h" #include "opj_malloc.h" #include "event.h" |
