diff --git a/ChangeLog b/ChangeLog index 6dbb09ab..3e498095 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,8 @@ What's New for OpenJPEG ! : changed + : added +September 4, 2007 ++ [GB] Added some fields in the codestream_info structure: they are used to record the position of single tile parts. Changed also the write_index function in the codec, to reflect the presence of this new information. September 3, 2007 + [GB] Added the knowledge of JPSEC SEC and INSEC markers (you have to compile the JPWL project). Management of these markers is limited to skipping them without crashing: no real security function at this stage. Deprecated USE_JPSEC will be removed next diff --git a/codec/image_to_j2k.c b/codec/image_to_j2k.c index 327ad3c8..e522a505 100644 --- a/codec/image_to_j2k.c +++ b/codec/image_to_j2k.c @@ -559,6 +559,9 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) { int tileno, compno, layno, resno, precno, pack_nb, x, y; FILE *stream = NULL; double total_disto = 0; +/* UniPG>> */ + int tilepartno; +/* <tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 */ } fprintf(stream, "\n"); +/* UniPG>> */ + fprintf(stream, "%d\n", cstr_info->main_head_start); +/* <main_head_end); fprintf(stream, "%d\n", cstr_info->codestream_size); fprintf(stream, "\nINFO ON TILES\n"); - fprintf(stream, "tileno start_pos end_hd end_tile disto nbpix disto/nbpix\n"); + fprintf(stream, "tileno start_pos end_hd end_tile" +/* UniPG>> */ + " nbparts" +/* <tw * cstr_info->th; tileno++) { - fprintf(stream, "%4d %9d %9d %9d %9e %9d %9e\n", + fprintf(stream, "%4d %9d %9d %9d " +/* UniPG>> */ + "%9d " +/* <tile[tileno].num_tile, cstr_info->tile[tileno].start_pos, cstr_info->tile[tileno].end_header, cstr_info->tile[tileno].end_pos, +/* UniPG>> */ + cstr_info->tile[tileno].num_tps, +/* <tile[tileno].distotile, cstr_info->tile[tileno].nbpix, cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].nbpix); } @@ -602,7 +619,17 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) { double disto = 0; pack_nb = 0; - fprintf(stream, "\nTILE %d DETAILS\n", tileno); + fprintf(stream, "\nTILE %d DETAILS\n", tileno); +/* UniPG>> */ + fprintf(stream, "part_nb tileno start_pos end_tph_pos end_pos\n"); + for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++) + fprintf(stream, "%4d %9d %9d %11d %9d\n", + tilepartno, tileno, + cstr_info->tile[tileno].tp_start_pos[tilepartno], + cstr_info->tile[tileno].tp_end_header[tilepartno], + cstr_info->tile[tileno].tp_end_pos[tilepartno] + ); +/* <prog == LRCP) { /* LRCP */ fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\n"); diff --git a/libopenjpeg/j2k.c b/libopenjpeg/j2k.c index 476b68c5..9a6d7458 100644 --- a/libopenjpeg/j2k.c +++ b/libopenjpeg/j2k.c @@ -421,6 +421,16 @@ int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t * pi_destroy(pi, cp, tileno); } j2k->cur_totnum_tp[tileno] = cur_totnum_tp; +/* UniPG>> */ + /* INDEX >> */ + if (j2k->cstr_info && j2k->cstr_info->index_on) { + j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp; + j2k->cstr_info->tile[tileno].tp_start_pos = (int *) opj_malloc(cur_totnum_tp * sizeof(int)); + j2k->cstr_info->tile[tileno].tp_end_header = (int *) opj_malloc(cur_totnum_tp * sizeof(int)); + j2k->cstr_info->tile[tileno].tp_end_pos = (int *) opj_malloc(cur_totnum_tp * sizeof(int)); + } + /* << INDEX */ +/* <tile[tileno]; opj_free(tile_info->thresh); opj_free(tile_info->packet); +/* UniPG>> */ + /* INDEX >> */ + opj_free(tile_info->tp_start_pos); + opj_free(tile_info->tp_end_header); + opj_free(tile_info->tp_end_pos); + /* << INDEX */ +/* <tile); } @@ -2229,6 +2246,9 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre cstr_info->layer = (&cp->tcps[0])->numlayers; cstr_info->decomposition = (&cp->tcps[0])->tccps->numresolutions - 1; cstr_info->D_max = 0; /* ADD Marcela */ +/* UniPG>> */ + cstr_info->main_head_start = cio_tell(cio); /* position of SOC */ +/* <index_on = 0; @@ -2313,6 +2333,13 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre for(tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++){ j2k->tp_num = tilepartno; +/* UniPG>> */ + /* INDEX >> */ + if(cstr_info && cstr_info->index_on) + cstr_info->tile[j2k->curtileno].tp_start_pos[j2k->cur_tp_num] = + cio_tell(cio) + j2k->pos_correction; + /* << INDEX */ +/* <cur_tp_num == 0 && cp->cinema == 0){ @@ -2325,7 +2352,21 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre } } +/* UniPG>> */ + /* INDEX >> */ + if(cstr_info && cstr_info->index_on) + cstr_info->tile[j2k->curtileno].tp_end_header[j2k->cur_tp_num] = + cio_tell(cio) + j2k->pos_correction + 1; + /* << INDEX */ +/* <> */ + /* INDEX >> */ + if(cstr_info && cstr_info->index_on) + cstr_info->tile[j2k->curtileno].tp_end_pos[j2k->cur_tp_num] = + cio_tell(cio) + j2k->pos_correction - 1; + /* << INDEX */ +/* <cur_tp_num ++; } @@ -2364,7 +2405,13 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre j2k_write_eoc(j2k); if(cstr_info && cstr_info->index_on) { - cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction; + cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction; +/* UniPG>> */ + /* The following adjustment is done to adjust the codestream size */ + /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */ + /* the first unch of bytes is not in the codestream */ + cstr_info->codestream_size -= cstr_info->main_head_start; +/* <> */ + /** number of tile parts */ + int num_tps; + /** start position of tile part */ + int *tp_start_pos; + /** end position of tile part header */ + int *tp_end_header; + /** end position of tile part */ + int *tp_end_pos; + /* << UniPG */ } opj_tile_info_t; /** @@ -666,6 +676,10 @@ typedef struct opj_codestream_info { int layer; /** number of decomposition */ int decomposition; +/* UniPG>> */ + /** main header position */ + int main_head_start; +/* <