From d08a96e2517c545b8ff2d7b89c7778eb5b1fd4ba Mon Sep 17 00:00:00 2001 From: Antonin Descampe Date: Wed, 8 Dec 2010 11:06:41 +0000 Subject: [PATCH] (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. --- CHANGES | 9 + JavaOpenJPEG/JavaOpenJPEG.c | 19 +- JavaOpenJPEG/JavaOpenJPEGDecoder.c | 20 +- Makefile.nix | 5 +- OPJ_Validate/OPJ_Validate.c | 10 +- codec/CMakeLists.txt | 6 +- codec/Makefile.am | 9 +- codec/Makefile.nix | 9 +- codec/convert.c | 8 +- codec/image_to_j2k.c | 34 +-- codec/j2k_dump.c | 47 ++- codec/j2k_to_image.c | 58 ++-- common/color.c | 463 +++++++++++++++++++++++++++++ common/color.h | 38 +++ common/format_defs.h | 48 +++ common/getopt.c | 261 ++++++++++++++++ common/getopt.h | 29 ++ config.nix | 21 +- indexer_JPIP/fix.c | 6 +- indexer_JPIP/index_create.c | 4 +- indexer_JPIP/j2k.h | 2 +- jp3d/Makefile.nix | 2 - jp3d/codec/convert.c | 4 +- jp3d/codec/jp3d_to_volume.c | 6 +- jp3d/codec/volume_to_jp3d.c | 6 +- jp3d/libjp3dvm/event.c | 4 +- jp3d/libjp3dvm/jp3d_lib.c | 8 +- jp3d/libjp3dvm/openjpeg.c | 8 +- jpwl/CMakeLists.txt | 22 +- jpwl/Makefile.am | 16 +- jpwl/Makefile.nix | 18 +- libopenjpeg/CMakeLists.txt | 8 - libopenjpeg/Makefile.am | 4 +- libopenjpeg/jp2.c | 378 +++++------------------ libopenjpeg/jp2.h | 10 +- libopenjpeg/openjpeg.h | 4 + libopenjpeg/opj_convert.c | 216 -------------- libopenjpeg/opj_convert.h | 6 - libopenjpeg/opj_includes.h | 1 - mj2/CMakeLists.txt | 7 +- mj2/Makefile.am | 8 +- mj2/Makefile.nix | 7 +- mj2/mj2.c | 6 +- mj2/mj2_to_frames.c | 27 +- mj2/mj2_to_metadata.c | 2 +- 45 files changed, 1144 insertions(+), 740 deletions(-) create mode 100644 common/color.c create mode 100644 common/color.h create mode 100644 common/format_defs.h create mode 100644 common/getopt.c create mode 100644 common/getopt.h delete mode 100644 libopenjpeg/opj_convert.c delete mode 100644 libopenjpeg/opj_convert.h diff --git a/CHANGES b/CHANGES index baeabafa..e1ff8e50 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,15 @@ What's New for OpenJPEG ! : changed + : added +December 8, 2010 + (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. + December 5, 2010 ! [antonin] revert to previous behaviour for cmake: builds (and links) dynamically by default. Static build only if -DBUILD_SHARED_LIBS is set to OFF. * [antonin] added a definition in getopt.h and an initial value in convert.c diff --git a/JavaOpenJPEG/JavaOpenJPEG.c b/JavaOpenJPEG/JavaOpenJPEG.c index 6af3a44a..b1f03028 100644 --- a/JavaOpenJPEG/JavaOpenJPEG.c +++ b/JavaOpenJPEG/JavaOpenJPEG.c @@ -37,32 +37,19 @@ #include #include "openjpeg.h" -#include "compat/getopt.h" +#include "getopt.h" #include "convert.h" #include "index.h" #include "dirent.h" #include "org_openJpeg_OpenJPEGJavaEncoder.h" -#ifndef WIN32 +#ifndef _WIN32 #define stricmp strcasecmp #define strnicmp strncasecmp #endif -/* ----------------------------------------------------------------------- */ +#include "format_defs.h" -#define J2K_CFMT 0 -#define JP2_CFMT 1 -#define JPT_CFMT 2 - -#define PXM_DFMT 10 -#define PGX_DFMT 11 -#define BMP_DFMT 12 -#define YUV_DFMT 13 -#define TIF_DFMT 14 -#define RAW_DFMT 15 -#define TGA_DFMT 16 - -/* ----------------------------------------------------------------------- */ #define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/ #define CINEMA_48_CS 651041 /*Codestream length for 48fps*/ #define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/ diff --git a/JavaOpenJPEG/JavaOpenJPEGDecoder.c b/JavaOpenJPEG/JavaOpenJPEGDecoder.c index 3f65655a..decc1373 100644 --- a/JavaOpenJPEG/JavaOpenJPEGDecoder.c +++ b/JavaOpenJPEG/JavaOpenJPEGDecoder.c @@ -37,31 +37,17 @@ #include #include "openjpeg.h" -#include "compat/getopt.h" +#include "getopt.h" #include "convert.h" #include "dirent.h" #include "org_openJpeg_OpenJPEGJavaDecoder.h" -#ifndef WIN32 +#ifndef _WIN32 #define stricmp strcasecmp #define strnicmp strncasecmp #endif -/* ----------------------------------------------------------------------- */ - -#define J2K_CFMT 0 -#define JP2_CFMT 1 -#define JPT_CFMT 2 - -#define PXM_DFMT 10 -#define PGX_DFMT 11 -#define BMP_DFMT 12 -#define YUV_DFMT 13 -#define TIF_DFMT 14 -#define RAW_DFMT 15 -#define TGA_DFMT 16 - -/* ----------------------------------------------------------------------- */ +#include "format_defs.h" typedef struct callback_variables { JNIEnv *env; diff --git a/Makefile.nix b/Makefile.nix index a40030b3..72f995b1 100644 --- a/Makefile.nix +++ b/Makefile.nix @@ -13,7 +13,6 @@ SRCS = ./libopenjpeg/bio.c ./libopenjpeg/cio.c ./libopenjpeg/dwt.c \ ./libopenjpeg/mct.c ./libopenjpeg/mqc.c ./libopenjpeg/openjpeg.c \ ./libopenjpeg/pi.c ./libopenjpeg/raw.c ./libopenjpeg/t1.c \ ./libopenjpeg/t2.c ./libopenjpeg/tcd.c ./libopenjpeg/tgt.c \ - ./libopenjpeg/opj_convert.c INCLS = ./libopenjpeg/bio.h ./libopenjpeg/cio.h ./libopenjpeg/dwt.h \ ./libopenjpeg/event.h ./libopenjpeg/fix.h ./libopenjpeg/image.h \ @@ -22,9 +21,7 @@ INCLS = ./libopenjpeg/bio.h ./libopenjpeg/cio.h ./libopenjpeg/dwt.h \ ./libopenjpeg/mqc.h ./libopenjpeg/openjpeg.h ./libopenjpeg/pi.h \ ./libopenjpeg/raw.h ./libopenjpeg/t1.h ./libopenjpeg/t2.h \ ./libopenjpeg/tcd.h ./libopenjpeg/tgt.h ./libopenjpeg/opj_malloc.h \ - ./libopenjpeg/opj_convert.h ./libopenjpeg/opj_includes.h - -AR = ar + ./libopenjpeg/opj_includes.h INSTALL_LIBDIR = $(prefix)/lib headerdir = openjpeg-$(MAJOR).$(MINOR) diff --git a/OPJ_Validate/OPJ_Validate.c b/OPJ_Validate/OPJ_Validate.c index 7153725a..9bd1da5b 100644 --- a/OPJ_Validate/OPJ_Validate.c +++ b/OPJ_Validate/OPJ_Validate.c @@ -26,9 +26,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifdef WIN32 +#ifdef _WIN32 #include -#endif +#endif /* _WIN32 */ #include #include #include "md5.h" @@ -37,7 +37,7 @@ int doprocess(char programme[4096],char command_line[4096]) { -#ifdef WIN32 +#ifdef _WIN32 int exit=STILL_ACTIVE; STARTUPINFO siStartupInfo; @@ -67,12 +67,12 @@ int doprocess(char programme[4096],char command_line[4096]) { return 0; -#else // #ifndef WIN32 +#else /* !_WIN32 */ printf("\n%s\n", command_line); system(command_line); return 0; -#endif +#endif /* _WIN32 */ } diff --git a/codec/CMakeLists.txt b/codec/CMakeLists.txt index 5ad89589..6fd128f7 100644 --- a/codec/CMakeLists.txt +++ b/codec/CMakeLists.txt @@ -1,16 +1,17 @@ -# Build the demo app, small examples + # Build the demo app, small examples # First thing define the common source: SET(common_SRCS convert.c index.c + ${PROJECT_SOURCE_DIR}/common/color.c ) # If not getopt was found then add it to the lib: IF(DONT_HAVE_GETOPT) SET(common_SRCS ${common_SRCS} - compat/getopt.c + ${PROJECT_SOURCE_DIR}/common/getopt.c ) ENDIF(DONT_HAVE_GETOPT) @@ -18,6 +19,7 @@ ENDIF(DONT_HAVE_GETOPT) INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/libopenjpeg ${LCMS_INCLUDE_DIR} + ${OPENJPEG_SOURCE_DIR}/common ) IF(PNG_FOUND) INCLUDE_DIRECTORIES(${PNG_INCLUDE_DIR}) diff --git a/codec/Makefile.am b/codec/Makefile.am index 43d54506..5db41850 100644 --- a/codec/Makefile.am +++ b/codec/Makefile.am @@ -1,6 +1,6 @@ COMPILERFLAGS = -Wall -static USERLIBS = -lm -INCLUDES = -I.. -I. -I../libopenjpeg +INCLUDES = -I.. -I. -I../libopenjpeg -I../common if with_libtiff INCLUDES += @tiffincludes@ @@ -27,11 +27,12 @@ bin_PROGRAMS = j2k_to_image image_to_j2k j2k_dump CFLAGS = $(COMPILERFLAGS) $(INCLUDES) LDADD = $(USERLIBS) ../libopenjpeg/libopenjpeg.la -j2k_to_image_SOURCES = compat/getopt.c index.c convert.c j2k_to_image.c +j2k_to_image_SOURCES = ../common/getopt.c index.c convert.c \ + ../common/color.c j2k_to_image.c -image_to_j2k_SOURCES = compat/getopt.c index.c convert.c image_to_j2k.c +image_to_j2k_SOURCES = ../common/getopt.c index.c convert.c image_to_j2k.c -j2k_dump_SOURCES = compat/getopt.c index.c j2k_dump.c +j2k_dump_SOURCES = ../common/getopt.c index.c j2k_dump.c REPBIN=$(bin_PROGRAMS) diff --git a/codec/Makefile.nix b/codec/Makefile.nix index 129b2a4b..ace579a3 100644 --- a/codec/Makefile.nix +++ b/codec/Makefile.nix @@ -5,7 +5,7 @@ CFLAGS = -Wall INSTALL_BIN = $(prefix)/bin -INCLUDE = -I.. -I. -I../libopenjpeg +INCLUDE = -I.. -I. -I../libopenjpeg -I../common USERLIBS = -lm ifeq ($(WITH_TIFF),yes) @@ -35,15 +35,16 @@ all: j2k_to_image image_to_j2k j2k_dump install j2k_to_image image_to_j2k j2k_dump ../bin j2k_to_image: j2k_to_image.c ../libopenjpeg.a - $(CC) $(CFLAGS) compat/getopt.c index.c convert.c j2k_to_image.c \ + $(CC) $(CFLAGS) ../common/getopt.c index.c convert.c \ + ../common/color.c j2k_to_image.c \ -o j2k_to_image ../libopenjpeg.a $(USERLIBS) image_to_j2k: image_to_j2k.c ../libopenjpeg.a - $(CC) $(CFLAGS) compat/getopt.c index.c convert.c image_to_j2k.c \ + $(CC) $(CFLAGS) ../common/getopt.c index.c convert.c image_to_j2k.c \ -o image_to_j2k ../libopenjpeg.a $(USERLIBS) j2k_dump: j2k_dump.c ../libopenjpeg.a - $(CC) $(CFLAGS) compat/getopt.c index.c j2k_dump.c \ + $(CC) $(CFLAGS) ../common/getopt.c index.c j2k_dump.c \ -o j2k_dump ../libopenjpeg.a $(USERLIBS) clean: diff --git a/codec/convert.c b/codec/convert.c index de08e4c7..25e715bf 100644 --- a/codec/convert.c +++ b/codec/convert.c @@ -36,19 +36,19 @@ #include #ifdef HAVE_LIBTIFF -#ifdef WIN32 +#ifdef _WIN32 #include "../libs/libtiff/tiffio.h" #else #include -#endif /* WIN32 */ +#endif /* _WIN32 */ #endif /* HAVE_LIBTIFF */ #ifdef HAVE_LIBPNG -#ifdef WIN32 +#ifdef _WIN32 #include "../libs/png/png.h" #else #include -#endif /* WIN32 */ +#endif /* _WIN32 */ #endif /* HAVE_LIBPNG */ #include "../libopenjpeg/openjpeg.h" diff --git a/codec/image_to_j2k.c b/codec/image_to_j2k.c index a223adb8..443d4e07 100644 --- a/codec/image_to_j2k.c +++ b/codec/image_to_j2k.c @@ -35,38 +35,28 @@ #include #include -#include "opj_config.h" -#include "openjpeg.h" -#include "compat/getopt.h" -#include "convert.h" -#ifdef WIN32 +#ifdef _WIN32 #include "windirent.h" #else #include -#endif /* WIN32 */ -#include "index.h" +#endif /* _WIN32 */ -#ifndef WIN32 +#ifdef _WIN32 +#include +#else #include #define _stricmp strcasecmp #define _strnicmp strncasecmp -#endif +#endif /* _WIN32 */ -/* ----------------------------------------------------------------------- */ +#include "opj_config.h" +#include "openjpeg.h" +#include "getopt.h" +#include "convert.h" +#include "index.h" -#define J2K_CFMT 0 -#define JP2_CFMT 1 -#define JPT_CFMT 2 +#include "format_defs.h" -#define PXM_DFMT 10 -#define PGX_DFMT 11 -#define BMP_DFMT 12 -#define YUV_DFMT 13 -#define TIF_DFMT 14 -#define RAW_DFMT 15 -#define TGA_DFMT 16 -#define PNG_DFMT 17 -/* ----------------------------------------------------------------------- */ #define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/ #define CINEMA_48_CS 651041 /*Codestream length for 48fps*/ #define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/ diff --git a/codec/j2k_dump.c b/codec/j2k_dump.c index 83fc1c94..3c3e8d91 100644 --- a/codec/j2k_dump.c +++ b/codec/j2k_dump.c @@ -29,40 +29,29 @@ #include #include +#ifdef _WIN32 +#include "windirent.h" +#else +#include +#endif /* _WIN32 */ + +#ifdef _WIN32 +#include +#else +#include +#define _stricmp strcasecmp +#define _strnicmp strncasecmp +#endif /* _WIN32 */ + #include "opj_config.h" #include "openjpeg.h" #include "../libopenjpeg/j2k.h" #include "../libopenjpeg/jp2.h" -#include "compat/getopt.h" +#include "getopt.h" #include "convert.h" -#ifdef WIN32 -#include "windirent.h" -#else -#include -#endif /* WIN32 */ #include "index.h" -#ifndef WIN32 -#include -#define _stricmp strcasecmp -#define _strnicmp strncasecmp -#endif - -/* ----------------------------------------------------------------------- */ - -#define J2K_CFMT 0 -#define JP2_CFMT 1 -#define JPT_CFMT 2 - -#define PXM_DFMT 10 -#define PGX_DFMT 11 -#define BMP_DFMT 12 -#define YUV_DFMT 13 -#define TIF_DFMT 14 -#define RAW_DFMT 15 -#define TGA_DFMT 16 -#define PNG_DFMT 17 -/* ----------------------------------------------------------------------- */ +#include "format_defs.h" typedef struct dircnt{ /** Buffer for holding images read from Directory*/ @@ -477,6 +466,10 @@ int main(int argc, char *argv[]) return 1; } /* dump image */ + if(image->icc_profile_buf) + { + free(image->icc_profile_buf); image->icc_profile_buf = NULL; + } j2k_dump_image(stdout, image); /* dump cp */ diff --git a/codec/j2k_to_image.c b/codec/j2k_to_image.c index bbf40ad9..ff6141ee 100644 --- a/codec/j2k_to_image.c +++ b/codec/j2k_to_image.c @@ -35,38 +35,35 @@ #include #include -#include "opj_config.h" -#include "openjpeg.h" -#include "compat/getopt.h" -#include "convert.h" -#ifdef WIN32 +#ifdef _WIN32 #include "windirent.h" #else #include -#endif /* WIN32 */ -#include "index.h" +#endif /* _WIN32 */ -#ifndef WIN32 +#ifdef _WIN32 +#include +#else #include #define _stricmp strcasecmp #define _strnicmp strncasecmp +#endif /* _WIN32 */ + +#include "opj_config.h" +#include "openjpeg.h" +#include "getopt.h" +#include "convert.h" +#include "index.h" + +#ifdef HAVE_LIBLCMS2 +#include #endif +#ifdef HAVE_LIBLCMS1 +#include +#endif +#include "color.h" -/* ----------------------------------------------------------------------- */ - -#define J2K_CFMT 0 -#define JP2_CFMT 1 -#define JPT_CFMT 2 - -#define PXM_DFMT 10 -#define PGX_DFMT 11 -#define BMP_DFMT 12 -#define YUV_DFMT 13 -#define TIF_DFMT 14 -#define RAW_DFMT 15 -#define TGA_DFMT 16 -#define PNG_DFMT 17 -/* ----------------------------------------------------------------------- */ +#include "format_defs.h" typedef struct dircnt{ /** Buffer for holding images read from Directory*/ @@ -740,6 +737,21 @@ int main(int argc, char **argv) { free(src); src = NULL; + if(image->color_space == CLRSPC_SYCC) + { + color_sycc_to_rgb(image); + } + + if(image->icc_profile_buf) + { +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) + color_apply_icc_profile(image); +#endif + + free(image->icc_profile_buf); + image->icc_profile_buf = NULL; image->icc_profile_len = 0; + } + /* create output image */ /* ------------------- */ switch (parameters.cod_format) { diff --git a/common/color.c b/common/color.c new file mode 100644 index 00000000..ac0921a0 --- /dev/null +++ b/common/color.c @@ -0,0 +1,463 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include "opj_config.h" +#include "openjpeg.h" +#include "color.h" + +#ifdef HAVE_LIBLCMS2 +#include +#endif +#ifdef HAVE_LIBLCMS1 +#include +#endif + +/*-------------------------------------------------------- +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 sycc444_to_rgb(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<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*)malloc(sizeof(int) * max); + d1 = g = (int*)malloc(sizeof(int) * max); + d2 = b = (int*)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; + } + free(img->comps[0].data); img->comps[0].data = d0; + free(img->comps[1].data); img->comps[1].data = d1; + free(img->comps[2].data); img->comps[2].data = d2; + +}/* sycc444_to_rgb() */ + +static void sycc422_to_rgb(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<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*)malloc(sizeof(int) * max); + d1 = g = (int*)malloc(sizeof(int) * max); + d2 = b = (int*)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; + } + } + free(img->comps[0].data); img->comps[0].data = d0; + free(img->comps[1].data); img->comps[1].data = d1; + 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; + +}/* sycc422_to_rgb() */ + +static void sycc420_to_rgb(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<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*)malloc(sizeof(int) * max); + d1 = g = (int*)malloc(sizeof(int) * max); + d2 = b = (int*)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; + } + free(img->comps[0].data); img->comps[0].data = d0; + free(img->comps[1].data); img->comps[1].data = d1; + 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; + +}/* sycc420_to_rgb() */ + +void color_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 */ + { + sycc420_to_rgb(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 */ + { + sycc422_to_rgb(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 */ + { + sycc444_to_rgb(img); + } + else + { + fprintf(stderr,"%s:%d:color_sycc_to_rgb\n\tCAN NOT CONVERT\n", + __FILE__,__LINE__); + return; + } + img->color_space = CLRSPC_SRGB; + +}/* color_sycc_to_rgb() */ + +#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 */ + +void color_apply_icc_profile(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(image->icc_profile_buf, image->icc_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: color_apply_icc_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:color_apply_icc_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:color_apply_icc_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*)malloc(nr_samples); + out = outbuf = (unsigned short*)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++; + } + free(inbuf); 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*)malloc(nr_samples); + out = outbuf = (unsigned char*)malloc(nr_samples); + + image->comps = (opj_image_comp_t*) + 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*)calloc(max, sizeof(int)); + image->comps[2].data = (int*)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++; + } + free(inbuf); free(outbuf); + + }/* if(image->numcomps */ + + cmsDeleteTransform(transform); + +#ifdef HAVE_LIBLCMS1 + cmsCloseProfile(in_prof); + cmsCloseProfile(out_prof); +#endif +}/* color_apply_icc_profile() */ + +#endif /* HAVE_LIBLCMS2 || HAVE_LIBLCMS1 */ + diff --git a/common/color.h b/common/color.h new file mode 100644 index 00000000..26117b02 --- /dev/null +++ b/common/color.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _OPJ_COLOR_H_ +#define _OPJ_COLOR_H_ + +extern void color_sycc_to_rgb(opj_image_t *img); +extern void color_apply_icc_profile(opj_image_t *image); + +#endif /* _OPJ_COLOR_H_ */ diff --git a/common/format_defs.h b/common/format_defs.h new file mode 100644 index 00000000..d4be93b5 --- /dev/null +++ b/common/format_defs.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _OPJ_FORMAT_DEFS_H_ +#define _OPJ_FORMAT_DEFS_H_ + +#define J2K_CFMT 0 +#define JP2_CFMT 1 +#define JPT_CFMT 2 + +#define PXM_DFMT 10 +#define PGX_DFMT 11 +#define BMP_DFMT 12 +#define YUV_DFMT 13 +#define TIF_DFMT 14 +#define RAW_DFMT 15 +#define TGA_DFMT 16 +#define PNG_DFMT 17 + +#endif /* _OPJ_FORMAT_DEFS_H_ */ \ No newline at end of file diff --git a/common/getopt.c b/common/getopt.c new file mode 100644 index 00000000..5e444d39 --- /dev/null +++ b/common/getopt.c @@ -0,0 +1,261 @@ +/* + * Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* last review : october 29th, 2002 */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +int opterr = 1, /* if error message should be printed */ + optind = 1, /* index into parent argv vector */ + optopt, /* character checked for validity */ + optreset; /* reset getopt */ +const char *optarg; /* argument associated with option */ + +typedef struct option +{ + const char *name; + int has_arg; + int *flag; + int val; +}option_t; + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" + +/* As this class remembers its values from one Java call to the other, reset the values before each use */ +void reset_options_reading() { + opterr = 1; + optind = 1; +} + +/* + * getopt -- + * Parse argc/argv argument vector. + */ +int getopt(int nargc, char *const *nargv, const char *ostr) { +# define __progname nargv[0] + static const char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc || *(place = nargv[optind]) != '-') { + place = EMSG; + return (-1); + } + if (place[1] && *++place == '-') { /* found "--" */ + ++optind; + place = EMSG; + return (-1); + } + } /* option letter okay? */ + if ((optopt = (int) *place++) == (int) ':' || + !(oli = strchr(ostr, optopt))) { + /* + * if the user didn't specify '-' as an option, + * assume it means -1. + */ + if (optopt == (int) '-') + return (-1); + if (!*place) + ++optind; + if (opterr && *ostr != ':') { + fprintf(stderr, + "%s: illegal option -- %c\n", __progname, optopt); + return (BADCH); + } + } + if (*++oli != ':') { /* don't need argument */ + optarg = NULL; + if (!*place) + ++optind; + } else { /* need an argument */ + if (*place) /* no white space */ + optarg = place; + else if (nargc <= ++optind) { /* no arg */ + place = EMSG; + if (*ostr == ':') + return (BADARG); + if (opterr) { + fprintf(stderr, + "%s: option requires an argument -- %c\n", + __progname, optopt); + return (BADCH); + } + } else /* white space */ + optarg = nargv[optind]; + place = EMSG; + ++optind; + } + return (optopt); /* dump back option letter */ +} + + +int getopt_long(int argc, char * const argv[], const char *optstring, +struct option *longopts, int totlen) { + static int lastidx,lastofs; + char *tmp; + int i,len; + char param = 1; + +again: + if (optind >= argc || !argv[optind] || *argv[optind]!='-') + return -1; + + if (argv[optind][0]=='-' && argv[optind][1]==0) { + if(optind >= (argc - 1)){ /* no more input parameters */ + param = 0; + } + else{ /* more input parameters */ + if(argv[optind + 1][0] == '-'){ + param = 0; /* Missing parameter after '-' */ + } + else{ + param = 2; + } + } + } + + if (param == 0) { + ++optind; + return (BADCH); + } + + if (argv[optind][0]=='-') { /* long option */ + char* arg=argv[optind]+1; + const struct option* o; + o=longopts; + len=sizeof(longopts[0]); + + if (param > 1){ + arg = argv[optind+1]; + optind++; + } + else + arg = argv[optind]+1; + + if(strlen(arg)>1){ + for (i=0;iname,arg)) { /* match */ + if (o->has_arg == 0) { + if ((argv[optind+1])&&(!(argv[optind+1][0]=='-'))){ + fprintf(stderr,"%s: option does not require an argument. Ignoring %s\n",arg,argv[optind+1]); + ++optind; + } + }else{ + optarg=argv[optind+1]; + if(optarg){ + if (optarg[0] == '-'){ /* Has read next input parameter: No arg for current parameter */ + if (opterr) { + fprintf(stderr,"%s: option requires an argument\n",arg); + return (BADCH); + } + } + } + if (!optarg && o->has_arg==1) { /* no argument there */ + if (opterr) { + fprintf(stderr,"%s: option requires an argument \n",arg); + return (BADCH); + } + } + ++optind; + } + ++optind; + if (o->flag) + *(o->flag)=o->val; + else + return o->val; + return 0; + } + }//(end for)String not found in the list + fprintf(stderr,"Invalid option %s\n",arg); + ++optind; + return (BADCH); + }else{ /*Single character input parameter*/ + if (*optstring==':') return ':'; + if (lastidx!=optind) { + lastidx=optind; lastofs=0; + } + optopt=argv[optind][lastofs+1]; + if ((tmp=strchr(optstring,optopt))) {/*Found input parameter in list*/ + if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */ + ++optind; + goto again; + } + if (tmp[1]==':') { /* argument expected */ + if (tmp[2]==':' || argv[optind][lastofs+2]) { /* "-foo", return "oo" as optarg */ + if (!*(optarg=argv[optind]+lastofs+2)) optarg=0; + goto found; + } + optarg=argv[optind+1]; + if(optarg){ + if (optarg[0] == '-'){ /* Has read next input parameter: No arg for current parameter */ + if (opterr) { + fprintf(stderr,"%s: option requires an argument\n",arg); + return (BADCH); + } + } + } + if (!optarg) { /* missing argument */ + if (opterr) { + fprintf(stderr,"%s: option requires an argument\n",arg); + return (BADCH); + } + } + ++optind; + }else {/*Argument not expected*/ + ++lastofs; + return optopt; + } +found: + ++optind; + return optopt; + } else { /* not found */ + fprintf(stderr,"Invalid option %s\n",arg); + ++optind; + return (BADCH); + }//end of not found + + }// end of single character + }//end '-' + fprintf(stderr,"Invalid option\n"); + ++optind; + return (BADCH);; +}//end function diff --git a/common/getopt.h b/common/getopt.h new file mode 100644 index 00000000..779fe470 --- /dev/null +++ b/common/getopt.h @@ -0,0 +1,29 @@ +/* last review : october 29th, 2002 */ + +#ifndef _GETOPT_H_ +#define _GETOPT_H_ + +typedef struct option +{ + const char *name; + int has_arg; + int *flag; + int val; +}option_t; + +#define NO_ARG 0 +#define REQ_ARG 1 +#define OPT_ARG 2 + +extern int opterr; +extern int optind; +extern int optopt; +extern int optreset; +extern char *optarg; + +extern int getopt(int nargc, char *const *nargv, const char *ostr); +extern int getopt_long(int argc, char * const argv[], const char *optstring, + const struct option *longopts, int totlen); +extern void reset_options_reading(); + +#endif /* _GETOPT_H_ */ diff --git a/config.nix b/config.nix index 7658b31b..3932b24c 100644 --- a/config.nix +++ b/config.nix @@ -9,6 +9,7 @@ JP3D_BUILD = 0 prefix=/usr/local CC = gcc LDCONFIG = /sbin/ldconfig +AR = ar # #Set this to no if you do no want to compile/install shared libs. ENABLE_SHARED = yes @@ -19,15 +20,15 @@ ENABLE_SHARED = yes #==== HAVE YOU CREATED opj_config.h FROM opj_config.h.in.user ? ==== #==== SHOULD BE IN SYNC WITH opj_config.h ==== WITH_LCMS1 = no -WITH_LCMS2 = no -WITH_PNG = no -WITH_TIFF = no +WITH_LCMS2 = yes +WITH_PNG = yes +WITH_TIFF = yes # # Set to yes if you want compile/install # jpwl libraries/binaries # jp3d libraries/binaries -WITH_JPWL = no -WITH_JP3D = no +WITH_JPWL = yes +WITH_JP3D = yes # #Set to yes if you have doxygen installed #Set to no if doxygen is missing. @@ -39,7 +40,9 @@ LCMS2_INCLUDE = -I/usr/include PNG_INCLUDE = -I/usr/include TIFF_INCLUDE = -I/usr/include -LCMS1_LIB = -L/usr/lib -llcms -lm -LCMS2_LIB = -L/usr/lib -llcms2 -lm -PNG_LIB = -L/usr/lib -lpng -lz -lm -TIFF_LIB = -L/usr/lib -ltiff -lm +LCMS1_LIB = -L/usr/lib -llcms +LCMS2_LIB = -L/usr/lib -llcms2 +PNG_LIB = -L/usr/lib -lpng -lz +#tiff with jpeg support? +JPEG_LIB = -ljpeg +TIFF_LIB = -L/usr/lib -ltiff $(JPEG_LIB) diff --git a/indexer_JPIP/fix.c b/indexer_JPIP/fix.c index 9699bf6b..6bf08c62 100644 --- a/indexer_JPIP/fix.c +++ b/indexer_JPIP/fix.c @@ -28,11 +28,13 @@ #include "fix.h" -#ifdef WIN32 +#ifdef _WIN32 +#include + #define int64 __int64 #else #define int64 long long -#endif +#endif /* _WIN32 */ /// /// Multiply two fixed-precision rational numbers. diff --git a/indexer_JPIP/index_create.c b/indexer_JPIP/index_create.c index a8d40b0a..518e70f4 100644 --- a/indexer_JPIP/index_create.c +++ b/indexer_JPIP/index_create.c @@ -1130,7 +1130,7 @@ int j2k_decode(unsigned char *src, int len, j2k_image_t **image, j2k_cp_t **cp) } -#ifdef WIN32 +#ifdef _WIN32 #include BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { @@ -1143,7 +1143,7 @@ BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserve } return TRUE; } -#endif +#endif /* _WIN32 */ int main(int argc, char **argv) { diff --git a/indexer_JPIP/j2k.h b/indexer_JPIP/j2k.h index 5ead3b45..6c9a3c6f 100644 --- a/indexer_JPIP/j2k.h +++ b/indexer_JPIP/j2k.h @@ -28,7 +28,7 @@ #define VERSION "0.0.8" -#ifdef WIN32 +#ifdef _WIN32 #ifdef LIBJ2K_EXPORTS #define LIBJ2K_API __declspec(dllexport) #else diff --git a/jp3d/Makefile.nix b/jp3d/Makefile.nix index 0dd57ea3..4ca053e5 100644 --- a/jp3d/Makefile.nix +++ b/jp3d/Makefile.nix @@ -21,8 +21,6 @@ INCLS = ./libjp3dvm/t1_3d.h ./libjp3dvm/bio.h ./libjp3dvm/cio.h \ INCLUDE = -I.. -Ilibjp3dvm -AR = ar - INSTALL_LIBDIR = $(prefix)/lib headerdir = openjpeg3d-$(JP3D_MAJOR).$(JP3D_MINOR) INSTALL_INCLUDE = $(prefix)/include/$(headerdir) diff --git a/jp3d/codec/convert.c b/jp3d/codec/convert.c index b9aa656f..99eb7f2e 100755 --- a/jp3d/codec/convert.c +++ b/jp3d/codec/convert.c @@ -32,11 +32,11 @@ #include #include #include "../libjp3dvm/openjpeg.h" -#ifdef WIN32 +#ifdef _WIN32 #include "windirent.h" #else #include -#endif /* WIN32 */ +#endif /* _WIN32 */ diff --git a/jp3d/codec/jp3d_to_volume.c b/jp3d/codec/jp3d_to_volume.c index ee4425f2..995faaec 100755 --- a/jp3d/codec/jp3d_to_volume.c +++ b/jp3d/codec/jp3d_to_volume.c @@ -37,10 +37,12 @@ #include "getopt.h" #include "convert.h" -#ifndef WIN32 +#ifdef _WIN32 +#include +#else #define stricmp strcasecmp #define strnicmp strncasecmp -#endif +#endif /* _WIN32 */ /* ----------------------------------------------------------------------- */ static double calc_PSNR(opj_volume_t *original, opj_volume_t *decoded) diff --git a/jp3d/codec/volume_to_jp3d.c b/jp3d/codec/volume_to_jp3d.c index 238c47f5..d448fbe1 100755 --- a/jp3d/codec/volume_to_jp3d.c +++ b/jp3d/codec/volume_to_jp3d.c @@ -36,10 +36,12 @@ #include "getopt.h" #include "convert.h" -#ifndef WIN32 +#ifdef _WIN32 +#include +#else #define stricmp strcasecmp #define strnicmp strncasecmp -#endif +#endif /* _WIN32 */ /* ----------------------------------------------------------------------- */ diff --git a/jp3d/libjp3dvm/event.c b/jp3d/libjp3dvm/event.c index 6fe8ae2e..c558218c 100755 --- a/jp3d/libjp3dvm/event.c +++ b/jp3d/libjp3dvm/event.c @@ -30,7 +30,7 @@ // Utility functions // ========================================================== -#ifndef WIN32 +#ifndef _WIN32 static char* i2a(unsigned i, char *a, unsigned r) { if (i/r > 0) a = i2a(i/r,a,r); @@ -57,7 +57,7 @@ _itoa(int i, char *a, int r) { return a; } -#endif // !WIN32 +#endif // !_WIN32 /* ----------------------------------------------------------------------- */ diff --git a/jp3d/libjp3dvm/jp3d_lib.c b/jp3d/libjp3dvm/jp3d_lib.c index fe19ab8b..b2303991 100755 --- a/jp3d/libjp3dvm/jp3d_lib.c +++ b/jp3d/libjp3dvm/jp3d_lib.c @@ -24,17 +24,17 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifdef WIN32 +#ifdef _WIN32 #include #else #include #include #include -#endif /* WIN32 */ +#endif /* _WIN32 */ #include "opj_includes.h" double opj_clock() { -#ifdef WIN32 +#ifdef _WIN32 /* WIN32: use QueryPerformance (very accurate) */ LARGE_INTEGER freq , t ; /* freq is the clock speed of the CPU */ @@ -54,7 +54,7 @@ double opj_clock() { procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec; /* (2b) More precisely! Get the microseconds part ! */ return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; -#endif +#endif /* _WIN32 */ } void* opj_malloc( size_t size ) { diff --git a/jp3d/libjp3dvm/openjpeg.c b/jp3d/libjp3dvm/openjpeg.c index eb4c39bf..8e3a0782 100755 --- a/jp3d/libjp3dvm/openjpeg.c +++ b/jp3d/libjp3dvm/openjpeg.c @@ -25,14 +25,14 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifdef WIN32 +#ifdef _WIN32 #include -#endif /* WIN32 */ +#endif /* _WIN32 */ #include "opj_includes.h" #define JP3D_VERSION "1.3.0" /* ---------------------------------------------------------------------- */ -#ifdef WIN32 +#ifdef _WIN32 #ifndef OPJ_STATIC BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { @@ -49,7 +49,7 @@ DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } #endif /* OPJ_STATIC */ -#endif /* WIN32 */ +#endif /* _WIN32 */ /* ---------------------------------------------------------------------- */ diff --git a/jpwl/CMakeLists.txt b/jpwl/CMakeLists.txt index a4e39905..71e0f7b1 100755 --- a/jpwl/CMakeLists.txt +++ b/jpwl/CMakeLists.txt @@ -21,7 +21,6 @@ SET(OPJ_SRCS ../libopenjpeg/t2.c ../libopenjpeg/tcd.c ../libopenjpeg/tgt.c -../libopenjpeg/opj_convert.c ) SET(JPWL_SRCS crc.c jpwl.c jpwl_lib.c rs.c) @@ -29,14 +28,10 @@ SET(JPWL_SRCS crc.c jpwl.c jpwl_lib.c rs.c) IF(DONT_HAVE_GETOPT) SET(OPJ_SRCS ${OPJ_SRCS} - ../codec/compat/getopt.c + ../common/getopt.c ) ENDIF(DONT_HAVE_GETOPT) -IF(LCMS_INCLUDE_DIR) - INCLUDE_DIRECTORIES( ${LCMS_INCLUDE_DIR} ) -ENDIF(LCMS_INCLUDE_DIR) - # Build the library IF(WIN32) IF(BUILD_SHARED_LIBS) @@ -47,18 +42,22 @@ IF(WIN32) ENDIF(WIN32) ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}_JPWL ${JPWL_SRCS} ${OPJ_SRCS}) SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JPWL PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) -IF(LCMS_LIB) - TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME}_JPWL ${LCMS_LIB}) -ENDIF(LCMS_LIB) + # Install library INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}_JPWL DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ) +# Build executables + INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/libopenjpeg - ${LCMS_INCLUDE_DIR} + ${OPENJPEG_SOURCE_DIR}/common ) + +IF(LCMS_INCLUDE_DIR) + INCLUDE_DIRECTORIES( ${LCMS_INCLUDE_DIR} ) +ENDIF(LCMS_INCLUDE_DIR) IF(PNG_FOUND) INCLUDE_DIRECTORIES(${PNG_INCLUDE_DIR}) ENDIF(PNG_FOUND) @@ -68,9 +67,10 @@ ENDIF(TIFF_FOUND) ADD_EXECUTABLE(JPWL_j2k_to_image +../codec/j2k_to_image.c ../codec/convert.c ../codec/index.c -../codec/j2k_to_image.c +../common/color.c ) TARGET_LINK_LIBRARIES(JPWL_j2k_to_image ${OPENJPEG_LIBRARY_NAME}_JPWL ${LCMS_LIB}) IF(PNG_FOUND) diff --git a/jpwl/Makefile.am b/jpwl/Makefile.am index eeca7abb..f6bc78ab 100644 --- a/jpwl/Makefile.am +++ b/jpwl/Makefile.am @@ -17,7 +17,7 @@ SRCS = ../libopenjpeg/bio.c ../libopenjpeg/cio.c ../libopenjpeg/dwt.c \ ../libopenjpeg/mct.c ../libopenjpeg/mqc.c ../libopenjpeg/openjpeg.c \ ../libopenjpeg/pi.c ../libopenjpeg/raw.c ../libopenjpeg/t1.c \ ../libopenjpeg/t2.c ../libopenjpeg/tcd.c ../libopenjpeg/tgt.c \ - ../libopenjpeg/opj_convert.c $(JPWL_SRCS) + $(JPWL_SRCS) INCLS = ../libopenjpeg/bio.h ../libopenjpeg/cio.h ../libopenjpeg/dwt.h \ ../libopenjpeg/event.h ../libopenjpeg/fix.h ../libopenjpeg/image.h \ @@ -26,7 +26,7 @@ INCLS = ../libopenjpeg/bio.h ../libopenjpeg/cio.h ../libopenjpeg/dwt.h \ ../libopenjpeg/mqc.h ../libopenjpeg/openjpeg.h ../libopenjpeg/pi.h \ ../libopenjpeg/raw.h ../libopenjpeg/t1.h ../libopenjpeg/t2.h \ ../libopenjpeg/tcd.h ../libopenjpeg/tgt.h ../libopenjpeg/opj_malloc.h \ - ../libopenjpeg/opj_convert.h ../libopenjpeg/opj_includes.h \ + ../libopenjpeg/opj_includes.h \ $(JPWL_INCLS) libopenjpeg_JPWL_la_SOURCES = $(SRCS) $(INCLS) @@ -40,8 +40,8 @@ dos2unix: COMPILERFLAGS = -Wall -ffast-math -std=c99 -USERLIBS = -lm -INCLUDES = -I.. -I. -I../libopenjpeg +USERLIBS = +INCLUDES = -I.. -I. -I../libopenjpeg -I../common if with_libtiff INCLUDES += @tiffincludes@ @@ -63,6 +63,8 @@ INCLUDES += @lcms1includes@ USERLIBS += @lcms1libs@ endif +USERLIBS += -lm + bin_PROGRAMS = JPWL_j2k_to_image JPWL_image_to_j2k JPWL_j2k_to_image_CFLAGS = $(COMPILERFLAGS) $(INCLUDES) -DUSE_JPWL -static @@ -71,10 +73,10 @@ JPWL_image_to_j2k_CFLAGS = $(COMPILERFLAGS) $(INCLUDES) -DUSE_JPWL -static CFLAGS = $(COMPILERFLAGS) $(INCLUDES) -DUSE_JPWL LDADD = ./libopenjpeg_JPWL.la $(USERLIBS) -JPWL_j2k_to_image_SOURCES = ../codec/compat/getopt.c ../codec/index.c \ - ../codec/convert.c ../codec/j2k_to_image.c +JPWL_j2k_to_image_SOURCES = ../common/getopt.c ../codec/index.c \ + ../codec/convert.c ../common/color.c ../codec/j2k_to_image.c -JPWL_image_to_j2k_SOURCES = ../codec/compat/getopt.c ../codec/index.c \ +JPWL_image_to_j2k_SOURCES = ../common/getopt.c ../codec/index.c \ ../codec/convert.c ../codec/image_to_j2k.c REPBIN=$(bin_PROGRAMS) diff --git a/jpwl/Makefile.nix b/jpwl/Makefile.nix index 8b43a775..20b1cebd 100644 --- a/jpwl/Makefile.nix +++ b/jpwl/Makefile.nix @@ -3,7 +3,7 @@ include ../config.nix TARGET = openjpeg_JPWL COMPILERFLAGS = -Wall -ffast-math -std=c99 -fPIC -USERLIBS = -lm +USERLIBS = JPWL_SRCS = ./crc.c ./jpwl.c ./jpwl_lib.c ./rs.c @@ -13,7 +13,7 @@ SRCS = ../libopenjpeg/bio.c ../libopenjpeg/cio.c ../libopenjpeg/dwt.c \ ../libopenjpeg/mct.c ../libopenjpeg/mqc.c ../libopenjpeg/openjpeg.c \ ../libopenjpeg/pi.c ../libopenjpeg/raw.c ../libopenjpeg/t1.c \ ../libopenjpeg/t2.c ../libopenjpeg/tcd.c ../libopenjpeg/tgt.c \ - ../libopenjpeg/opj_convert.c $(JPWL_SRCS) + $(JPWL_SRCS) INCLS = ../libopenjpeg/bio.h ../libopenjpeg/cio.h ../libopenjpeg/dwt.h \ ../libopenjpeg/event.h ../libopenjpeg/fix.h ../libopenjpeg/image.h \ @@ -22,11 +22,9 @@ INCLS = ../libopenjpeg/bio.h ../libopenjpeg/cio.h ../libopenjpeg/dwt.h \ ../libopenjpeg/mqc.h ../libopenjpeg/openjpeg.h ../libopenjpeg/pi.h \ ../libopenjpeg/raw.h ../libopenjpeg/t1.h ../libopenjpeg/t2.h \ ../libopenjpeg/tcd.h ../libopenjpeg/tgt.h ../libopenjpeg/opj_malloc.h \ - ../libopenjpeg/opj_convert.h ../libopenjpeg/opj_includes.h + ../libopenjpeg/opj_includes.h -INCLUDE = -I.. -I. -I../libopenjpeg - -AR = ar +INCLUDE = -I.. -I. -I../libopenjpeg -I../common INSTALL_LIBDIR = $(prefix)/lib INSTALL_BIN = $(prefix)/bin @@ -57,6 +55,8 @@ INCLUDE += $(LCMS1_INCLUDE) USERLIBS += $(LCMS1_LIB) endif +USERLIBS += -lm + LIBRARIES += $(USERLIBS) MODULES = $(SRCS:.c=.o) @@ -101,12 +101,12 @@ $(SHAREDLIB): $(MODULES) endif JPWL_j2k_to_image: ../codec/j2k_to_image.c - $(CC) $(CFLAGS) ../codec/compat/getopt.c ../codec/index.c \ - ../codec/convert.c ../codec/j2k_to_image.c \ + $(CC) $(CFLAGS) ../common/getopt.c ../codec/index.c \ + ../codec/convert.c ../common/color.c ../codec/j2k_to_image.c \ -o JPWL_j2k_to_image ./libopenjpeg_JPWL.a $(USERLIBS) JPWL_image_to_j2k: ../codec/image_to_j2k.c - $(CC) $(CFLAGS) ../codec/compat/getopt.c ../codec/index.c \ + $(CC) $(CFLAGS) ../common/getopt.c ../codec/index.c \ ../codec/convert.c ../codec/image_to_j2k.c \ -o JPWL_image_to_j2k ./libopenjpeg_JPWL.a $(USERLIBS) 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 -#include -#endif -#ifdef HAVE_LIBLCMS1 -#include -#include -#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(color.icc_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) - { - 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<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<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<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" diff --git a/mj2/CMakeLists.txt b/mj2/CMakeLists.txt index 9f92a52c..e65145ca 100644 --- a/mj2/CMakeLists.txt +++ b/mj2/CMakeLists.txt @@ -3,13 +3,13 @@ # Headers file are located here: INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/libopenjpeg - ${OPENJPEG_SOURCE_DIR}/codec/compat + ${OPENJPEG_SOURCE_DIR}/common ${LCMS_INCLUDE_DIR} ) ADD_EXECUTABLE(frames_to_mj2 frames_to_mj2.c - ${PROJECT_SOURCE_DIR}/codec/compat/getopt.c + ${PROJECT_SOURCE_DIR}/common/getopt.c mj2_convert.c mj2.c ) @@ -20,9 +20,10 @@ ENDIF(UNIX) ADD_EXECUTABLE(mj2_to_frames mj2_to_frames.c - ${PROJECT_SOURCE_DIR}/codec/compat/getopt.c + ${PROJECT_SOURCE_DIR}/common/getopt.c mj2_convert.c mj2.c + ${PROJECT_SOURCE_DIR}/common/color.c ) TARGET_LINK_LIBRARIES(mj2_to_frames ${OPENJPEG_LIBRARY_NAME} ${LCMS_LIB}) IF(UNIX) diff --git a/mj2/Makefile.am b/mj2/Makefile.am index b5495387..5e7a0ae9 100644 --- a/mj2/Makefile.am +++ b/mj2/Makefile.am @@ -1,7 +1,7 @@ COMPILERFLAGS = -Wall -static USERLIBS = -INCLUDES = -I.. -I. -I../libopenjpeg +INCLUDES = -I.. -I. -I../libopenjpeg -I../common if with_liblcms2 INCLUDES += @lcms2includes@ @@ -18,11 +18,11 @@ bin_PROGRAMS = frames_to_mj2 mj2_to_frames extract_j2k_from_mj2 wrap_j2k_in_mj2 CFLAGS = $(COMPILERFLAGS) $(INCLUDES) LDADD = ../libopenjpeg/libopenjpeg.la $(USERLIBS) -frames_to_mj2_SOURCES = ../codec/compat/getopt.c mj2_convert.c mj2.c \ +frames_to_mj2_SOURCES = ../common/getopt.c mj2_convert.c mj2.c \ frames_to_mj2.c -mj2_to_frames_SOURCES = ../codec/compat/getopt.c mj2_convert.c mj2.c \ - mj2_to_frames.c +mj2_to_frames_SOURCES = ../common/getopt.c mj2_convert.c mj2.c \ + ../common/color.c mj2_to_frames.c extract_j2k_from_mj2_SOURCES = mj2.c extract_j2k_from_mj2.c diff --git a/mj2/Makefile.nix b/mj2/Makefile.nix index 4a76c59a..da369451 100644 --- a/mj2/Makefile.nix +++ b/mj2/Makefile.nix @@ -5,7 +5,7 @@ CFLAGS = -Wall INSTALL_BIN = $(prefix)/bin USERLIBS = -lm -INCLUDE = -I.. -I. -I../libopenjpeg +INCLUDE = -I.. -I. -I../libopenjpeg -I../common ifeq ($(WITH_LCMS2),yes) INCLUDE += $(LCMS2_INCLUDE) @@ -25,11 +25,12 @@ all: frames_to_mj2 mj2_to_frames extract_j2k_from_mj2 wrap_j2k_in_mj2 wrap_j2k_in_mj2 ../bin frames_to_mj2: frames_to_mj2.c ../libopenjpeg.a - $(CC) $(CFLAGS) ../codec/compat/getopt.c mj2_convert.c mj2.c frames_to_mj2.c \ + $(CC) $(CFLAGS) ../common/getopt.c mj2_convert.c mj2.c frames_to_mj2.c \ -o frames_to_mj2 ../libopenjpeg.a $(USERLIBS) mj2_to_frames: mj2_to_frames.c ../libopenjpeg.a - $(CC) $(CFLAGS) ../codec/compat/getopt.c mj2_convert.c mj2.c mj2_to_frames.c \ + $(CC) $(CFLAGS) ../common/getopt.c mj2_convert.c mj2.c \ + ../common/color.c mj2_to_frames.c \ -o mj2_to_frames ../libopenjpeg.a $(USERLIBS) extract_j2k_from_mj2: extract_j2k_from_mj2.c ../libopenjpeg.a diff --git a/mj2/mj2.c b/mj2/mj2.c index 7066ed08..01ee90c5 100644 --- a/mj2/mj2.c +++ b/mj2/mj2.c @@ -1101,7 +1101,7 @@ int mj2_read_smj2(opj_image_t * img, mj2_tk_t * tk, opj_cio_t *cio) mj2_box_t box; mj2_box_t box2; int i; - struct extension ext; + opj_jp2_color_t color; mj2_read_boxhdr(&box, cio); @@ -1159,9 +1159,9 @@ int mj2_read_smj2(opj_image_t * img, mj2_tk_t * tk, opj_cio_t *cio) tk->or_fieldorder = 0; cio_skip(cio,2); /* Pre-defined = -1 */ - memset(&ext, 0, sizeof(struct extension)); + memset(&color, 0, sizeof(opj_jp2_color_t)); - if (!jp2_read_jp2h(&tk->jp2_struct, cio, &ext)) { + if (!jp2_read_jp2h(&tk->jp2_struct, cio, &color)) { opj_event_msg(tk->cinfo, EVT_ERROR, "Error reading JP2H Box\n"); return 1; } diff --git a/mj2/mj2_to_frames.c b/mj2/mj2_to_frames.c index fda388c4..63869ea9 100644 --- a/mj2/mj2_to_frames.c +++ b/mj2/mj2_to_frames.c @@ -29,6 +29,7 @@ #include #include +#include "opj_config.h" #include "openjpeg.h" #include "../libopenjpeg/j2k_lib.h" #include "../libopenjpeg/j2k.h" @@ -36,6 +37,13 @@ #include "mj2.h" #include "mj2_convert.h" +#ifdef HAVE_LIBLCMS2 +#include +#endif +#ifdef HAVE_LIBLCMS1 +#include +#endif +#include "color.h" /* -------------------------------------------------------------------------- */ /** @@ -168,7 +176,24 @@ int main(int argc, char *argv[]) { cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); img = opj_decode(dinfo, cio); // Decode J2K to image - + +#ifdef WANT_SYCC_TO_RGB + if(img->color_space == CLRSPC_SYCC) + { + color_sycc_to_rgb(img); + } +#endif + + if(img->icc_profile_buf) + { +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) + color_apply_icc_profile(img); +#endif + + free(img->icc_profile_buf); + img->icc_profile_buf = NULL; img->icc_profile_len = 0; + } + if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) || (img->numcomps == 1)) { diff --git a/mj2/mj2_to_metadata.c b/mj2/mj2_to_metadata.c index 7dde60da..90be6202 100644 --- a/mj2/mj2_to_metadata.c +++ b/mj2/mj2_to_metadata.c @@ -16,7 +16,7 @@ can be bound by the Open JPEG open-source license and disclaimer, expressed else #include "mj2_to_metadata.h" #include -#include "compat/getopt.h" +#include "getopt.h" /* -------------------------------------------------------------------------- */