From dc43ebf96c079fb2a91a0e18f4d8f180855dd9ac Mon Sep 17 00:00:00 2001 From: mayeut Date: Sat, 11 Jul 2015 11:35:21 +0200 Subject: [PATCH] Add option to force component splitting in imagetopnm Update uclouvain/openjpeg#289 --- src/bin/jp2/convert.c | 9 +++++---- src/bin/jp2/convert.h | 2 +- src/bin/jp2/opj_decompress.c | 9 +++++++-- src/lib/openjp2/j2k.c | 10 ++-------- tests/conformance/CMakeLists.txt | 8 +++++++- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/bin/jp2/convert.c b/src/bin/jp2/convert.c index 92e043b6..5cde4fbd 100644 --- a/src/bin/jp2/convert.c +++ b/src/bin/jp2/convert.c @@ -1350,7 +1350,7 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { return image; }/* pnmtoimage() */ -int imagetopnm(opj_image_t * image, const char *outfile) +int imagetopnm(opj_image_t * image, const char *outfile, int force_split) { int *red, *green, *blue, *alpha; int wr, hr, max; @@ -1380,7 +1380,8 @@ int imagetopnm(opj_image_t * image, const char *outfile) if(want_gray) ncomp = 1; - if (ncomp == 2 /* GRAYA */ + if ((force_split == 0) && + (ncomp == 2 /* GRAYA */ || (ncomp > 2 /* RGB, RGBA */ && image->comps[0].dx == image->comps[1].dx && image->comps[1].dx == image->comps[2].dx @@ -1388,8 +1389,8 @@ int imagetopnm(opj_image_t * image, const char *outfile) && image->comps[1].dy == image->comps[2].dy && image->comps[0].prec == image->comps[1].prec && image->comps[1].prec == image->comps[2].prec - )) - { + ))) + { fdest = fopen(outfile, "wb"); if (!fdest) diff --git a/src/bin/jp2/convert.h b/src/bin/jp2/convert.h index d375e86b..51018c0b 100644 --- a/src/bin/jp2/convert.h +++ b/src/bin/jp2/convert.h @@ -91,7 +91,7 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters); int imagetopgx(opj_image_t *image, const char *outfile); opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters); -int imagetopnm(opj_image_t *image, const char *outfile); +int imagetopnm(opj_image_t *image, const char *outfile, int force_split); /* RAW conversion */ int imagetoraw(opj_image_t * image, const char *outfile); diff --git a/src/bin/jp2/opj_decompress.c b/src/bin/jp2/opj_decompress.c index c6e5cff8..7479097b 100644 --- a/src/bin/jp2/opj_decompress.c +++ b/src/bin/jp2/opj_decompress.c @@ -145,6 +145,8 @@ typedef struct opj_decompress_params int force_rgb; /* upsample components according to their dx/dy values */ int upsample; + /* split output components to different files */ + int split_pnm; }opj_decompress_parameters; /* -------------------------------------------------------------------------- */ @@ -218,6 +220,8 @@ static void decode_help_display(void) { " Force output image colorspace to RGB\n" " -upsample\n" " Downsampled components will be upsampled to image size\n" + " -split-pnm\n" + " Split output components to different files when writing to PNM\n" "\n"); /* UniPG>> */ #ifdef USE_JPWL @@ -506,7 +510,8 @@ int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *para {"ImgDir", REQ_ARG, NULL ,'y'}, {"OutFor", REQ_ARG, NULL ,'O'}, {"force-rgb", NO_ARG, &(parameters->force_rgb), 1}, - {"upsample", NO_ARG, &(parameters->upsample), 1} + {"upsample", NO_ARG, &(parameters->upsample), 1}, + {"split-pnm", NO_ARG, &(parameters->split_pnm), 1} }; const char optlist[] = "i:o:r:l:x:d:t:p:" @@ -1433,7 +1438,7 @@ int main(int argc, char **argv) /* ------------------- */ switch (parameters.cod_format) { case PXM_DFMT: /* PNM PGM PPM */ - if (imagetopnm(image, parameters.outfile)) { + if (imagetopnm(image, parameters.outfile, parameters.split_pnm)) { fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile); failed = 1; } diff --git a/src/lib/openjp2/j2k.c b/src/lib/openjp2/j2k.c index 67301547..5892d579 100644 --- a/src/lib/openjp2/j2k.c +++ b/src/lib/openjp2/j2k.c @@ -2031,14 +2031,8 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k, } /* testcase issue427-illegal-tile-offset.jp2 */ - l_tx1 = l_cp->tx0 + l_cp->tdx; - if (l_tx1 < l_cp->tx0) { /* manage overflow */ - l_tx1 = 0xFFFFFFFFU; - } - l_ty1 = l_cp->ty0 + l_cp->tdy; - if (l_ty1 < l_cp->ty0) { /* manage overflow */ - l_ty1 = 0xFFFFFFFFU; - } + l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */ + l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */ if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) || (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0) ) { opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: illegal tile offset\n"); return OPJ_FALSE; diff --git a/tests/conformance/CMakeLists.txt b/tests/conformance/CMakeLists.txt index c4d1bb66..3a07dbc4 100644 --- a/tests/conformance/CMakeLists.txt +++ b/tests/conformance/CMakeLists.txt @@ -510,11 +510,17 @@ foreach(kdu_file ${kdu_j2k_conf_files}) set( filenameInput "${kdu_file}.j2c" ) set( filenameRef "${kdu_file}.ppm" ) + if("${kdu_file}" STREQUAL "a6_mono_colr") + set(kdu_test_args -upsample -split-pnm ) + else() + set(kdu_test_args -upsample ) + endif() + add_test(NAME ETS-KDU-${filenameInput}-decode COMMAND opj_decompress -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/${filenameInput}.ppm - -upsample + ${kdu_test_args} ) if("${kdu_file}" STREQUAL "a6_mono_colr")