! : 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
int tileno, compno, layno, resno, precno, pack_nb, x, y;
FILE *stream = NULL;
double total_disto = 0;
+/* UniPG>> */
+ int tilepartno;
+/* <<UniPG */
if (!cstr_info)
return 1;
(1 << cstr_info->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);
+/* <<UniPG */
fprintf(stream, "%d\n", cstr_info->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"
+/* <<UniPG */
+ " disto nbpix disto/nbpix\n");
for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
- fprintf(stream, "%4d %9d %9d %9d %9e %9d %9e\n",
+ fprintf(stream, "%4d %9d %9d %9d "
+/* UniPG>> */
+ "%9d "
+/* <<UniPG */
+ "%9e %9d %9e\n",
cstr_info->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,
+/* <<UniPG */
cstr_info->tile[tileno].distotile, cstr_info->tile[tileno].nbpix,
cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].nbpix);
}
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]
+ );
+/* <<UniPG */
if (cstr_info->prog == LRCP) { /* LRCP */
fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\n");
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 */
+/* <<UniPG */
}
return totnum_tp;
}
opj_tile_info_t *tile_info = &cstr_info->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 */
+/* <<UniPG */
}
opj_free(cstr_info->tile);
}
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 */
+/* <<UniPG */
}
else if (cstr_info) {
cstr_info->index_on = 0;
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 */
+/* <<UniPG */
j2k_write_sot(j2k);
if(j2k->cur_tp_num == 0 && cp->cinema == 0){
}
}
+/* 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 */
+/* <<UniPG */
j2k_write_sod(j2k, tcd);
+/* UniPG>> */
+ /* 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 */
+/* <<UniPG */
j2k->cur_tp_num ++;
}
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;
+/* <<UniPG */
}
#ifdef USE_JPWL
int nbpix;
/** add fixed_quality */
double distotile;
+ /* UniPG>> */
+ /** 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;
/**
int layer;
/** number of decomposition */
int decomposition;
+/* UniPG>> */
+ /** main header position */
+ int main_head_start;
+/* <<UniPG */
/** main header position */
int main_head_end;
/** codestream's size */