From aaf6e84373014df770e838e0e423e764d3f8e1c1 Mon Sep 17 00:00:00 2001 From: Mickael Savinaud Date: Thu, 17 Nov 2011 14:24:51 +0000 Subject: [PATCH] [trunk] WIP: enhance j2k_to_image with new get_decoded_tile functionality --- CHANGES | 1 + applications/codec/j2k_to_image.c | 80 +++++++++++++++++-------- libopenjpeg/j2k.c | 6 ++ libopenjpeg/openjpeg.h | 5 ++ tests/nonregression/test_suite.ctest.in | 5 ++ 5 files changed, 71 insertions(+), 26 deletions(-) diff --git a/CHANGES b/CHANGES index 9eed0d55..b9c829ae 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ What's New for OpenJPEG + : added November 17, 2011 ++ [mickael] WIP: enhance j2k_to_image with new get_decoded_tile functionality + [mickael] WIP: clean j2k_dump and enhance j2k_dump with commit 1052. + [mickael] WIP: add a set decoded resolution factor function and update j2k_to_image help about decoded region. diff --git a/applications/codec/j2k_to_image.c b/applications/codec/j2k_to_image.c index cae7c163..449a71e9 100644 --- a/applications/codec/j2k_to_image.c +++ b/applications/codec/j2k_to_image.c @@ -143,7 +143,11 @@ void decode_help_display(void) { fprintf(stdout," -d \n"); fprintf(stdout," OPTIONAL\n"); fprintf(stdout," Decoding area\n"); - fprintf(stdout," By default all tiles header are read.\n"); + fprintf(stdout," By default all the image is decoded.\n"); + fprintf(stdout," -t \n"); + fprintf(stdout," OPTIONAL\n"); + fprintf(stdout," Set the tile number of the decoded tile. Follow the JPEG2000 convention from left-up to bottom-up\n"); + fprintf(stdout," By default all tiles are decoded.\n"); fprintf(stdout,"\n"); /* UniPG>> */ #ifdef USE_JPWL @@ -271,8 +275,12 @@ static int infile_format(const char *fname) return -1; memset(buf, 0, 12); - fread(buf, 1, 12, reader); + unsigned int l_nb_read = fread(buf, 1, 12, reader); fclose(reader); + if (l_nb_read != 12) + return -1; + + ext_format = get_file_format(fname); @@ -316,7 +324,7 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i {"OutFor",REQ_ARG, NULL ,'O'}, }; - const char optlist[] = "i:o:r:l:x:d:" + const char optlist[] = "i:o:r:l:x:d:t:" /* UniPG>> */ #ifdef USE_JPWL @@ -468,6 +476,16 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i free(ROI_values); } + break; + + /* ----------------------------------------------------- */ + + case 't': /* Input tile index */ + { + sscanf(opj_optarg, "%d", ¶meters->tile_index); + parameters->nb_tile_to_decode = 1; + } + break; /* ----------------------------------------------------- */ @@ -785,37 +803,47 @@ int main(int argc, char **argv) return EXIT_FAILURE; } - if (! opj_set_decode_area( dinfo, image, - parameters.DA_x0, parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)){ - fprintf(stderr, "ERROR -> j2k_to_image: failed to set the decoded area\n"); - opj_stream_destroy(cio); - opj_destroy_codec(dinfo); - opj_image_destroy(image); - fclose(fsrc); - return EXIT_FAILURE; + if (!parameters.nb_tile_to_decode) { + // Optional if you want decode the entire image + if (!opj_set_decode_area(dinfo, image, parameters.DA_x0, + parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)){ + fprintf(stderr, + "ERROR -> j2k_to_image: failed to set the decoded area\n"); + opj_stream_destroy(cio); + opj_destroy_codec(dinfo); + opj_image_destroy(image); + fclose(fsrc); + return EXIT_FAILURE; } - /* Get the decoded image */ - if ( !( opj_decode_v2(dinfo, cio, image) && opj_end_decompress(dinfo,cio) ) ) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_codec(dinfo); - opj_stream_destroy(cio); - opj_image_destroy(image); - fclose(fsrc); - return EXIT_FAILURE; + /* Get the decoded image */ + if (!(opj_decode_v2(dinfo, cio, image) && opj_end_decompress(dinfo, + cio))) { + fprintf(stderr, + "ERROR -> j2k_to_image: failed to decode image!\n"); + opj_destroy_codec(dinfo); + opj_stream_destroy(cio); + opj_image_destroy(image); + fclose(fsrc); + return EXIT_FAILURE; + } + } + else { + if (!opj_get_decoded_tile(dinfo, cio, image, parameters.tile_index)) { + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode tile!\n"); + opj_destroy_codec(dinfo); + opj_stream_destroy(cio); + opj_image_destroy(image); + fclose(fsrc); + return EXIT_FAILURE; + } + fprintf(stdout, "tile %d is decoded!\n\n", parameters.tile_index); } - - /*opj_dump_codec(dinfo, OPJ_J2K_MH_IND, stdout ); - - cstr_index = opj_get_cstr_index(dinfo);*/ - - fprintf(stderr, "image is decoded!\n"); /* Close the byte stream */ opj_stream_destroy(cio); fclose(fsrc); - if(image->color_space == CLRSPC_SYCC){ color_sycc_to_rgb(image); /* FIXME */ } diff --git a/libopenjpeg/j2k.c b/libopenjpeg/j2k.c index c41ada7f..0de530f9 100644 --- a/libopenjpeg/j2k.c +++ b/libopenjpeg/j2k.c @@ -8371,6 +8371,12 @@ opj_bool j2k_get_tile( opj_j2k_v2_t *p_j2k, return OPJ_FALSE; } + if (tile_index >= p_j2k->m_cp.th * p_j2k->m_cp.tw) { + opj_event_msg_v2(p_manager, EVT_ERROR, "Decoded tile index is " + "inconsistent with the number of tiles in the codestream (%d vs %d).\n", tile_index, p_j2k->m_cp.th * p_j2k->m_cp.tw ); + return OPJ_FALSE; + } + /* Compute the dimension of the desired tile*/ l_tile_x = tile_index % p_j2k->m_cp.tw; l_tile_y = tile_index / p_j2k->m_cp.tw; diff --git a/libopenjpeg/openjpeg.h b/libopenjpeg/openjpeg.h index a1f3b83a..d71b4286 100644 --- a/libopenjpeg/openjpeg.h +++ b/libopenjpeg/openjpeg.h @@ -439,6 +439,11 @@ typedef struct opj_dparameters { /** Verbose mode */ opj_bool m_verbose; + /** tile number ot the decoded tile*/ + OPJ_UINT32 tile_index; + /** Nb of tile to decode */ + OPJ_UINT32 nb_tile_to_decode; + /*@}*/ /* UniPG>> */ diff --git a/tests/nonregression/test_suite.ctest.in b/tests/nonregression/test_suite.ctest.in index d969ef5c..2fd4daf4 100644 --- a/tests/nonregression/test_suite.ctest.in +++ b/tests/nonregression/test_suite.ctest.in @@ -96,6 +96,11 @@ j2k_to_image -i @INPUT_CONF_PATH@/p1_06.j2k -o @TEMP_PATH@/p1_06_4.j2k.png -d 3, j2k_to_image -i @INPUT_CONF_PATH@/p1_06.j2k -o @TEMP_PATH@/p1_06_5.j2k.png -d 4,4,7,7 -r 1 j2k_to_image -i @INPUT_CONF_PATH@/p1_06.j2k -o @TEMP_PATH@/p1_06_6.j2k.png -d 4,4,5,5 -r 1 +j2k_to_image -i @INPUT_CONF_PATH@/p1_06.j2k -o @TEMP_PATH@/p1_06.j2k_0.png -t 0 +j2k_to_image -i @INPUT_CONF_PATH@/p1_06.j2k -o @TEMP_PATH@/p1_06_1.j2k_5.png -t 5 +j2k_to_image -i @INPUT_CONF_PATH@/p1_06.j2k -o @TEMP_PATH@/p1_06_2.j2k_9.png -t 9 +j2k_to_image -i @INPUT_CONF_PATH@/p1_06.j2k -o @TEMP_PATH@/p1_06_3.j2k_15.png -t 15 + # prec=4; nb_c=3 ; signd=yes j2k_to_image -i @INPUT_CONF_PATH@/p0_04.j2k -o @TEMP_PATH@/p0_04.j2k.png -d 0,0,256,256 j2k_to_image -i @INPUT_CONF_PATH@/p0_04.j2k -o @TEMP_PATH@/p0_04_1.j2k.png -d 128,0,256,128