Added information regarding the end of packet position in the index
authorFrancois-Olivier Devaux <fodevaux@users.noreply.github.com>
Thu, 30 Aug 2007 15:32:51 +0000 (15:32 +0000)
committerFrancois-Olivier Devaux <fodevaux@users.noreply.github.com>
Thu, 30 Aug 2007 15:32:51 +0000 (15:32 +0000)
ChangeLog
codec/image_to_j2k.c
libopenjpeg/openjpeg.h
libopenjpeg/t2.c

index 42b4e6d16c51052ccf8257e76977ef199212c02b..111a60e79b7ef057f6c3388245860a7e914a321b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,7 @@ August 30, 2007
 * [FOD] Changed the OpenJPEG library interface to enable users to access information regarding the codestream (also called codestream index).
                This index is usefull for all applications requiring to have a scalable acces to the codestream (like JPIP applications, ...)
         Currently, this information is only available when encoding an image.       
++ [FOD] Added the information regarding the end of packet position in the index        
 
 August 28, 2007
 * [FOD] Fixed wrong destructors called in openjpeg.c
index c259e7eab3225dcc23dfb37504db8357047de008..327ad3c8a7640b06b63cfb8c3a24cd65e89313dc 100644 (file)
@@ -598,14 +598,14 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
        }
                
        for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
-               int start_pos, end_pos;
+               int start_pos, end_ph_pos, end_pos;
                double disto = 0;
                pack_nb = 0;
 
                fprintf(stream, "\nTILE %d DETAILS\n", tileno);                         
                if (cstr_info->prog == LRCP) {  /* LRCP */
 
-                       fprintf(stream, "pack_nb tileno layno resno compno precno start_pos  end_pos disto\n");
+                       fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\n");
 
                        for (layno = 0; layno < cstr_info->layer; layno++) {
                                for (resno = 0; resno < cstr_info->decomposition + 1; resno++) {
@@ -613,10 +613,11 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                                                int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
                                                for (precno = 0; precno < prec_max; precno++) {
                                                        start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
                                                        end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
                                                        disto = cstr_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);
+                                                       fprintf(stream, "%4d %6d %7d %5d %6d  %6d    %6d     %6d %7d %8e\n",
+                                                               pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos, disto);
                                                        total_disto += disto;
                                                        pack_nb++;
                                                }
@@ -626,7 +627,7 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                } /* LRCP */
                else if (cstr_info->prog == RLCP) {     /* RLCP */
 
-                       fprintf(stream, "pack_nb tileno resno layno compno precno start_pos  end_pos disto\n");
+                       fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos disto\n");
 
                        for (resno = 0; resno < cstr_info->decomposition + 1; resno++) {
                                for (layno = 0; layno < cstr_info->layer; layno++) {
@@ -634,10 +635,11 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                                                int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
                                                for (precno = 0; precno < prec_max; precno++) {
                                                        start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
                                                        end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
                                                        disto = cstr_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);
+                                                       fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d   %9d %7d %8e\n",
+                                                               pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos, disto);
                                                        total_disto += disto;
                                                        pack_nb++;
                                                }
@@ -647,7 +649,7 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                } /* RLCP */
                else if (cstr_info->prog == RPCL) {     /* RPCL */
 
-                       fprintf(stream, "pack_nb tileno resno precno compno layno start_pos  end_pos disto\n"); 
+                       fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos disto\n"); 
 
                        for (resno = 0; resno < cstr_info->decomposition + 1; resno++) {
                                /* I suppose components have same XRsiz, YRsiz */
@@ -669,10 +671,11 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                                                                        if (precno_x*pcx == x ) {
                                                                                for (layno = 0; layno < cstr_info->layer; layno++) {
                                                                                        start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
                                                                                        end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
                                                                                        disto = cstr_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); 
+                                                                                       fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d   %9d %7d %8e\n",
+                                                                                               pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos, disto); 
                                                                                        total_disto += disto;
                                                                                        pack_nb++; 
                                                                                }
@@ -691,7 +694,7 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                        int x1 = x0 + cstr_info->tile_x;
                        int y1 = y0 + cstr_info->tile_y;
 
-                       fprintf(stream, "pack_nb tileno precno compno resno layno start_pos  end_pos disto\n"); 
+                       fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos disto\n"); 
 
                        for (compno = 0; compno < cstr_info->comp; compno++) {
                                for (resno = 0; resno < cstr_info->decomposition + 1; resno++) {
@@ -708,10 +711,11 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                                                                        if (precno_x*pcx == x ) {
                                                                                for (layno = 0; layno < cstr_info->layer; layno++) {
                                                                                        start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
                                                                                        end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
                                                                                        disto = cstr_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); 
+                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d %8e\n",
+                                                                                               pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos, disto); 
                                                                                        total_disto += disto;
                                                                                        pack_nb++; 
                                                                                }
@@ -725,7 +729,7 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                } /* PCRL */
                else {  /* CPRL */
 
-                       fprintf(stream, "pack_nb tileno compno precno resno layno start_pos  end_pos disto\n"); 
+                       fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos disto\n"); 
 
                        for (compno = 0; compno < cstr_info->comp; compno++) {
                                /* I suppose components have same XRsiz, YRsiz */
@@ -748,10 +752,11 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
                                                                        if (precno_x*pcx == x ) {
                                                                                for (layno = 0; layno < cstr_info->layer; layno++) {
                                                                                        start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
                                                                                        end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
                                                                                        disto = cstr_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); 
+                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d %8e\n",
+                                                                                               pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos, disto); 
                                                                                        total_disto += disto;
                                                                                        pack_nb++; 
                                                                                }
index 24e2f6a576ed741ae79854be16eee8f431d7016c..c2bb3c58574d982c465494f2fa2beffa644967fe 100644 (file)
@@ -590,9 +590,11 @@ typedef struct opj_image_comptparm {
 Index structure : Information concerning a packet inside tile
 */
 typedef struct opj_packet_info {
-       /** start position */
+       /** packet start position (including SOP marker if it exists) */
        int start_pos;
-       /** end position */
+       /** end of packet header position (including EPH marker if it exists)*/
+       int end_ph_pos;
+       /** packet end position */
        int end_pos;
        /** packet distorsion */
        double disto;
index 53d5868b29c313ab7ca8b9108219512c0164892c..4d8ec3f0d7ab951f4273e40b3fd29479d21cb3f4 100644 (file)
@@ -128,7 +128,6 @@ static int t2_getnumpasses(opj_bio_t *bio) {
 
 static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_codestream_info_t *cstr_info, int tileno) {
        int bandno, cblkno;
-       unsigned char *sop = 0, *eph = 0;
        unsigned char *c = dest;
 
        int compno = pi->compno;        /* component value */
@@ -143,15 +142,12 @@ static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_itera
        
        /* <SOP 0xff91> */
        if (tcp->csty & J2K_CP_CSTY_SOP) {
-               sop = (unsigned char *) opj_malloc(6 * sizeof(unsigned char));
-               sop[0] = 255;
-               sop[1] = 145;
-               sop[2] = 0;
-               sop[3] = 4;
-               sop[4] = (cstr_info->num % 65536) / 256;
-               sop[5] = (cstr_info->num % 65536) % 256;
-               memcpy(c, sop, 6);
-               opj_free(sop);
+               c[0] = 255;
+               c[1] = 145;
+               c[2] = 0;
+               c[3] = 4;
+               c[4] = (cstr_info->num % 65536) / 256;
+               c[5] = (cstr_info->num % 65536) % 256;
                c += 6;
        }
        /* </SOP> */
@@ -245,19 +241,24 @@ static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_itera
        }
 
        c += bio_numbytes(bio);
-
        bio_destroy(bio);
        
        /* <EPH 0xff92> */
        if (tcp->csty & J2K_CP_CSTY_EPH) {
-               eph = (unsigned char *) opj_malloc(2 * sizeof(unsigned char));
-               eph[0] = 255;
-               eph[1] = 146;
-               memcpy(c, eph, 2);
-               opj_free(eph);
+               c[0] = 255;
+               c[1] = 146;
                c += 2;
        }
        /* </EPH> */
+
+       /* << INDEX */
+       // End of packet header position. Currently only represents the distance to start of packet
+       // Will be updated later by incrementing with packet start value
+       if(cstr_info && cstr_info->index_write && cstr_info->index_on) {
+               opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->num];
+               info_PK->end_ph_pos = (int)(c - dest);
+       }
+       /* INDEX >> */
        
        /* Writing the packet body */
        
@@ -277,16 +278,15 @@ static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_itera
                        memcpy(c, layer->data, layer->len);
                        cblk->numpasses += layer->numpasses;
                        c += layer->len;
-                       /* ADD for index Cfr. Marcela --> delta disto by packet */
+                       /* << INDEX */ 
                        if(cstr_info && cstr_info->index_write && cstr_info->index_on) {
-                               opj_tile_info_t *info_TL = &cstr_info->tile[tileno];
-                               opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->num];
+                               opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->num];
                                info_PK->disto += layer->disto;
                                if (cstr_info->D_max < info_PK->disto) {
                                        cstr_info->D_max = info_PK->disto;
                                }
                        }
-                       /* </ADD> */
+                       /* INDEX >> */
                }
        }
        
@@ -630,6 +630,8 @@ int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlaye
                                                        info_PK->start_pos = (cp->tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->num - 1].end_pos + 1;
                                                }
                                                info_PK->end_pos = info_PK->start_pos + e - 1;
+                                               info_PK->end_ph_pos += info_PK->start_pos - 1;  // End of packet header which now only represents the distance 
+                                                                                                                                                                                                                                               // to start of packet is incremented by value of start of packet
                                        }
                                        
                                        cstr_info->num++;