[trunk] WIP: enhance j2k_to_image with new get_decoded_tile functionality

This commit is contained in:
Mickael Savinaud 2011-11-17 14:24:51 +00:00
parent 380a357b08
commit aaf6e84373
5 changed files with 71 additions and 26 deletions

View File

@ -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.

View File

@ -143,7 +143,11 @@ void decode_help_display(void) {
fprintf(stdout," -d <x0,y0,x1,y1>\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 <tile_number>\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", &parameters->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 */
}

View File

@ -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;

View File

@ -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>> */

View File

@ -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