[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 + : added
November 17, 2011 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: 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. + [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," -d <x0,y0,x1,y1>\n");
fprintf(stdout," OPTIONAL\n"); fprintf(stdout," OPTIONAL\n");
fprintf(stdout," Decoding area\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"); fprintf(stdout,"\n");
/* UniPG>> */ /* UniPG>> */
#ifdef USE_JPWL #ifdef USE_JPWL
@ -271,8 +275,12 @@ static int infile_format(const char *fname)
return -1; return -1;
memset(buf, 0, 12); memset(buf, 0, 12);
fread(buf, 1, 12, reader); unsigned int l_nb_read = fread(buf, 1, 12, reader);
fclose(reader); fclose(reader);
if (l_nb_read != 12)
return -1;
ext_format = get_file_format(fname); 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'}, {"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>> */ /* UniPG>> */
#ifdef USE_JPWL #ifdef USE_JPWL
@ -468,6 +476,16 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
free(ROI_values); 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; return EXIT_FAILURE;
} }
if (! opj_set_decode_area( dinfo, image, if (!parameters.nb_tile_to_decode) {
parameters.DA_x0, parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)){ // Optional if you want decode the entire image
fprintf(stderr, "ERROR -> j2k_to_image: failed to set the decoded area\n"); if (!opj_set_decode_area(dinfo, image, parameters.DA_x0,
opj_stream_destroy(cio); parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)){
opj_destroy_codec(dinfo); fprintf(stderr,
opj_image_destroy(image); "ERROR -> j2k_to_image: failed to set the decoded area\n");
fclose(fsrc); opj_stream_destroy(cio);
return EXIT_FAILURE; opj_destroy_codec(dinfo);
opj_image_destroy(image);
fclose(fsrc);
return EXIT_FAILURE;
} }
/* Get the decoded image */ /* Get the decoded image */
if ( !( opj_decode_v2(dinfo, cio, image) && opj_end_decompress(dinfo,cio) ) ) { if (!(opj_decode_v2(dinfo, cio, image) && opj_end_decompress(dinfo,
fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); cio))) {
opj_destroy_codec(dinfo); fprintf(stderr,
opj_stream_destroy(cio); "ERROR -> j2k_to_image: failed to decode image!\n");
opj_image_destroy(image); opj_destroy_codec(dinfo);
fclose(fsrc); opj_stream_destroy(cio);
return EXIT_FAILURE; 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 */ /* Close the byte stream */
opj_stream_destroy(cio); opj_stream_destroy(cio);
fclose(fsrc); fclose(fsrc);
if(image->color_space == CLRSPC_SYCC){ if(image->color_space == CLRSPC_SYCC){
color_sycc_to_rgb(image); /* FIXME */ 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; 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*/ /* Compute the dimension of the desired tile*/
l_tile_x = tile_index % p_j2k->m_cp.tw; l_tile_x = tile_index % p_j2k->m_cp.tw;
l_tile_y = 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 */ /** Verbose mode */
opj_bool m_verbose; 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>> */ /* 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_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_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 # 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.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 j2k_to_image -i @INPUT_CONF_PATH@/p0_04.j2k -o @TEMP_PATH@/p0_04_1.j2k.png -d 128,0,256,128