+ for (tileno = 0; tileno < image_info->tw * image_info->th; tileno++) {
+ int start_pos, end_pos;
+ double disto = 0;
+ pack_nb = 0;
+
+ /*
+ fprintf(stream, "pkno tileno layerno resno compno precno start_pos end_pos deltaSE \n");
+ */
+
+ if (image_info->prog == LRCP) { /* LRCP */
+ /*
+ fprintf(stream, "pack_nb tileno layno resno compno precno start_pos end_pos disto");
+ */
+ for (layno = 0; layno < image_info->layer; layno++) {
+ for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+ for (compno = 0; compno < image_info->comp; compno++) {
+ int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+ for (precno = 0; precno < prec_max; precno++) {
+ start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+ end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+ disto = image_info->tile[tileno].packet[pack_nb].disto;
+ fprintf(stream, "%4d %6d %7d %5d %6d %6d %9d %9d %8e\n",
+ pack_nb, tileno, layno, resno, compno, precno, start_pos, end_pos, disto);
+ total_disto += disto;
+ pack_nb++;
+ }
+ }
+ }
+ }
+ } /* LRCP */
+ else if (image_info->prog == RLCP) { /* RLCP */
+ /*
+ fprintf(stream, "pack_nb tileno resno layno compno precno start_pos end_pos disto");
+ */
+ for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+ for (layno = 0; layno < image_info->layer; layno++) {
+ for (compno = 0; compno < image_info->comp; compno++) {
+ int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+ for (precno = 0; precno < prec_max; precno++) {
+ start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+ end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+ disto = image_info->tile[tileno].packet[pack_nb].disto;
+ fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %8e\n",
+ pack_nb, tileno, resno, layno, compno, precno, start_pos, end_pos, disto);
+ total_disto += disto;
+ pack_nb++;
+ }
+ }
+ }
+ }
+ } /* RLCP */
+ else if (image_info->prog == RPCL) { /* RPCL */
+ /*
+ fprintf(stream, "\npack_nb tileno resno precno compno layno start_pos end_pos disto\n");
+ */
+ for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+ /* I suppose components have same XRsiz, YRsiz */
+ int x0 = image_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tw * image_info->tile_x;
+ int y0 = image_info->tile_Ox + (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tile_y;
+ int x1 = x0 + image_info->tile_x;
+ int y1 = y0 + image_info->tile_y;
+ for(y = y0; y < y1; y++) {
+ for(x = x0; x < x1; x++) {
+ for (compno = 0; compno < image_info->comp; compno++) {
+ int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+ for (precno = 0; precno < prec_max; precno++) {
+ int pcnx = image_info->tile[tileno].pw[resno];
+ int pcx = (int) pow( 2, image_info->tile[tileno].pdx[resno] + image_info->decomposition - resno );
+ int pcy = (int) pow( 2, image_info->tile[tileno].pdy[resno] + image_info->decomposition - resno );
+ int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+ int precno_y = (int) floor( (float)precno/(float)pcnx );
+ if (precno_y*pcy == y ) {
+ if (precno_x*pcx == x ) {
+ for (layno = 0; layno < image_info->layer; layno++) {
+ start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+ end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+ disto = image_info->tile[tileno].packet[pack_nb].disto;
+ fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %8e\n",
+ pack_nb, tileno, resno, precno, compno, layno, start_pos, end_pos, disto);
+ total_disto += disto;
+ pack_nb++;
+ }
+ }
+ }
+ } /* precno */
+ } /* compno */
+ } /* x = x0..x1 */
+ } /* y = y0..y1 */
+ } /* resno */
+ } /* RPCL */
+ else if (image_info->prog == PCRL) { /* PCRL */
+ /* I suppose components have same XRsiz, YRsiz */
+ int x0 = image_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tw * image_info->tile_x;
+ int y0 = image_info->tile_Ox + (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tile_y;
+ int x1 = x0 + image_info->tile_x;
+ int y1 = y0 + image_info->tile_y;
+ /*
+ fprintf(stream, "\npack_nb tileno precno compno resno layno start_pos end_pos disto\n");
+ */
+ for(y = y0; y < y1; y++) {
+ for(x = x0; x < x1; x++) {
+ for (compno = 0; compno < image_info->comp; compno++) {
+ for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+ int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+ for (precno = 0; precno < prec_max; precno++) {
+ int pcnx = image_info->tile[tileno].pw[resno];
+ int pcx = (int) pow( 2, image_info->tile[tileno].pdx[resno] + image_info->decomposition - resno );
+ int pcy = (int) pow( 2, image_info->tile[tileno].pdy[resno] + image_info->decomposition - resno );
+ int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+ int precno_y = (int) floor( (float)precno/(float)pcnx );
+ if (precno_y*pcy == y ) {
+ if (precno_x*pcx == x ) {
+ for (layno = 0; layno < image_info->layer; layno++) {
+ start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+ end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+ disto = image_info->tile[tileno].packet[pack_nb].disto;
+ fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n",
+ pack_nb, tileno, precno, compno, resno, layno, start_pos, end_pos, disto);
+ total_disto += disto;
+ pack_nb++;
+ }
+ }
+ }
+ } /* precno */
+ } /* resno */
+ } /* compno */
+ } /* x = x0..x1 */
+ } /* y = y0..y1 */
+ } /* PCRL */
+ else { /* CPRL */
+ /*
+ fprintf(stream, "\npack_nb tileno compno precno resno layno start_pos end_pos disto\n");
+ */
+ for (compno = 0; compno < image_info->comp; compno++) {
+ /* I suppose components have same XRsiz, YRsiz */
+ int x0 = image_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tw * image_info->tile_x;
+ int y0 = image_info->tile_Ox + (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tile_y;
+ int x1 = x0 + image_info->tile_x;
+ int y1 = y0 + image_info->tile_y;
+ for(y = y0; y < y1; y++) {
+ for(x = x0; x < x1; x++) {
+ for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+ int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+ for (precno = 0; precno < prec_max; precno++) {
+ int pcnx = image_info->tile[tileno].pw[resno];
+ int pcx = (int) pow( 2, image_info->tile[tileno].pdx[resno] + image_info->decomposition - resno );
+ int pcy = (int) pow( 2, image_info->tile[tileno].pdy[resno] + image_info->decomposition - resno );
+ int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+ int precno_y = (int) floor( (float)precno/(float)pcnx );
+ if (precno_y*pcy == y ) {
+ if (precno_x*pcx == x ) {
+ for (layno = 0; layno < image_info->layer; layno++) {
+ start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+ end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+ disto = image_info->tile[tileno].packet[pack_nb].disto;
+ fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n",
+ pack_nb, tileno, compno, precno, resno, layno, start_pos, end_pos, disto);
+ total_disto += disto;
+ pack_nb++;
+ }
+ }
+ }
+ } /* precno */
+ } /* resno */
+ } /* x = x0..x1 */
+ } /* y = y0..y1 */
+ } /* comno */
+ } /* CPRL */
+ } /* tileno */
+
+ fprintf(stream, "%8e\n", image_info->D_max); /* SE max */
+ fprintf(stream, "%.8e\n", total_disto); /* SE totale */
+ fclose(stream);
+
+ return 1;
+}
+
+bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, char *index) {
+ int tileno, compno;
+ opj_image_info_t *image_info = NULL;
+ opj_cp_t *cp = NULL;
+
+ opj_tcd_t *tcd = NULL; /* TCD component */
+
+ j2k->cio = cio;
+ j2k->image = image;
+
+ cp = j2k->cp;
+
+ /* j2k_dump_cp(stdout, image, cp); */
+
+ /* INDEX >> */
+ image_info = j2k->image_info;
+ if (image_info && cp->index_on) {
+ image_info->index_on = cp->index_on;
+ image_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tile_info_t));
+ image_info->image_w = image->x1 - image->x0;
+ image_info->image_h = image->y1 - image->y0;
+ image_info->prog = (&cp->tcps[0])->prg;
+ image_info->tw = cp->tw;
+ image_info->th = cp->th;
+ image_info->tile_x = cp->tdx; /* new version parser */
+ image_info->tile_y = cp->tdy; /* new version parser */
+ image_info->tile_Ox = cp->tx0; /* new version parser */
+ image_info->tile_Oy = cp->ty0; /* new version parser */
+ image_info->comp = image->numcomps;
+ image_info->layer = (&cp->tcps[0])->numlayers;
+ image_info->decomposition = (&cp->tcps[0])->tccps->numresolutions - 1;
+ image_info->D_max = 0; /* ADD Marcela */
+ }
+ /* << INDEX */