summaryrefslogtreecommitdiff
path: root/libopenjpeg
diff options
context:
space:
mode:
authorAntonin Descampe <antonin@gmail.com>2010-12-08 11:06:41 +0000
committerAntonin Descampe <antonin@gmail.com>2010-12-08 11:06:41 +0000
commitd08a96e2517c545b8ff2d7b89c7778eb5b1fd4ba (patch)
tree16f839d4499afc2ead2b759b22907a50bd012de3 /libopenjpeg
parent59d9b97ffe35f17c71b25a749b885054cb4727d9 (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.txt8
-rw-r--r--libopenjpeg/Makefile.am4
-rw-r--r--libopenjpeg/jp2.c378
-rw-r--r--libopenjpeg/jp2.h10
-rw-r--r--libopenjpeg/openjpeg.h4
-rw-r--r--libopenjpeg/opj_convert.c216
-rw-r--r--libopenjpeg/opj_convert.h6
-rw-r--r--libopenjpeg/opj_includes.h1
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"