(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.
This commit is contained in:
parent
59d9b97ffe
commit
d08a96e251
9
CHANGES
9
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
|
||||
|
@ -37,32 +37,19 @@
|
||||
#include <math.h>
|
||||
|
||||
#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*/
|
||||
|
@ -37,31 +37,17 @@
|
||||
#include <math.h>
|
||||
|
||||
#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;
|
||||
|
@ -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)
|
||||
|
@ -26,9 +26,9 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#endif /* _WIN32 */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#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 */
|
||||
|
||||
}
|
||||
|
||||
|
@ -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})
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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:
|
||||
|
@ -36,19 +36,19 @@
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_LIBTIFF
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include "../libs/libtiff/tiffio.h"
|
||||
#else
|
||||
#include <tiffio.h>
|
||||
#endif /* WIN32 */
|
||||
#endif /* _WIN32 */
|
||||
#endif /* HAVE_LIBTIFF */
|
||||
|
||||
#ifdef HAVE_LIBPNG
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include "../libs/png/png.h"
|
||||
#else
|
||||
#include <png.h>
|
||||
#endif /* WIN32 */
|
||||
#endif /* _WIN32 */
|
||||
#endif /* HAVE_LIBPNG */
|
||||
|
||||
#include "../libopenjpeg/openjpeg.h"
|
||||
|
@ -35,38 +35,28 @@
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "opj_config.h"
|
||||
#include "openjpeg.h"
|
||||
#include "compat/getopt.h"
|
||||
#include "convert.h"
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include "windirent.h"
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#endif /* WIN32 */
|
||||
#include "index.h"
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifndef WIN32
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#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*/
|
||||
|
@ -29,40 +29,29 @@
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include "windirent.h"
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#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 <dirent.h>
|
||||
#endif /* WIN32 */
|
||||
#include "index.h"
|
||||
|
||||
#ifndef WIN32
|
||||
#include <strings.h>
|
||||
#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 */
|
||||
|
@ -35,38 +35,35 @@
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "opj_config.h"
|
||||
#include "openjpeg.h"
|
||||
#include "compat/getopt.h"
|
||||
#include "convert.h"
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include "windirent.h"
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#endif /* WIN32 */
|
||||
#include "index.h"
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifndef WIN32
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#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 <lcms2.h>
|
||||
#endif
|
||||
#ifdef HAVE_LIBLCMS1
|
||||
#include <lcms.h>
|
||||
#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) {
|
||||
|
463
common/color.c
Normal file
463
common/color.c
Normal file
@ -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 <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "opj_config.h"
|
||||
#include "openjpeg.h"
|
||||
#include "color.h"
|
||||
|
||||
#ifdef HAVE_LIBLCMS2
|
||||
#include <lcms2.h>
|
||||
#endif
|
||||
#ifdef HAVE_LIBLCMS1
|
||||
#include <lcms.h>
|
||||
#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<<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*)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<<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*)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<<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*)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 */
|
||||
|
38
common/color.h
Normal file
38
common/color.h
Normal file
@ -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_ */
|
48
common/format_defs.h
Normal file
48
common/format_defs.h
Normal file
@ -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_ */
|
261
common/getopt.c
Normal file
261
common/getopt.c
Normal file
@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
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;i<totlen;i=i+len,o++) {
|
||||
if (!strcmp(o->name,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
|
29
common/getopt.h
Normal file
29
common/getopt.h
Normal file
@ -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_ */
|
21
config.nix
21
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)
|
||||
|
@ -28,11 +28,13 @@
|
||||
|
||||
#include "fix.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
|
||||
#define int64 __int64
|
||||
#else
|
||||
#define int64 long long
|
||||
#endif
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/// <summary>
|
||||
/// Multiply two fixed-precision rational numbers.
|
||||
|
@ -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 <windows.h>
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
#define VERSION "0.0.8"
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#ifdef LIBJ2K_EXPORTS
|
||||
#define LIBJ2K_API __declspec(dllexport)
|
||||
#else
|
||||
|
@ -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)
|
||||
|
@ -32,11 +32,11 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "../libjp3dvm/openjpeg.h"
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include "windirent.h"
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#endif /* WIN32 */
|
||||
#endif /* _WIN32 */
|
||||
|
||||
|
||||
|
||||
|
@ -37,10 +37,12 @@
|
||||
#include "getopt.h"
|
||||
#include "convert.h"
|
||||
|
||||
#ifndef WIN32
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#define stricmp strcasecmp
|
||||
#define strnicmp strncasecmp
|
||||
#endif
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
static double calc_PSNR(opj_volume_t *original, opj_volume_t *decoded)
|
||||
|
@ -36,10 +36,12 @@
|
||||
#include "getopt.h"
|
||||
#include "convert.h"
|
||||
|
||||
#ifndef WIN32
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#define stricmp strcasecmp
|
||||
#define strnicmp strncasecmp
|
||||
#endif
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
|
@ -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
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
|
@ -24,17 +24,17 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/times.h>
|
||||
#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 ) {
|
||||
|
@ -25,14 +25,14 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#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 */
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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}
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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(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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
|
@ -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() */
|
@ -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_ */
|
@ -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"
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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 <lcms2.h>
|
||||
#endif
|
||||
#ifdef HAVE_LIBLCMS1
|
||||
#include <lcms.h>
|
||||
#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)) {
|
||||
|
@ -16,7 +16,7 @@ can be bound by the Open JPEG open-source license and disclaimer, expressed else
|
||||
|
||||
#include "mj2_to_metadata.h"
|
||||
#include <string.h>
|
||||
#include "compat/getopt.h"
|
||||
#include "getopt.h"
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user