Home | History | Annotate | Download | only in libopenjpeg20
      1 /*
      2  * The copyright in this software is being made available under the 2-clauses
      3  * BSD License, included below. This software may be subject to other third
      4  * party and contributor rights, including patent rights, and no such rights
      5  * are granted under this license.
      6  *
      7  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
      8  * Copyright (c) 2002-2014, Professor Benoit Macq
      9  * Copyright (c) 2001-2003, David Janssens
     10  * Copyright (c) 2002-2003, Yannick Verschueren
     11  * Copyright (c) 2003-2007, Francois-Olivier Devaux
     12  * Copyright (c) 2003-2014, Antonin Descampe
     13  * Copyright (c) 2005, Herve Drolon, FreeImage Team
     14  * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
     15  * Copyright (c) 2012, CS Systemes d'Information, France
     16  * All rights reserved.
     17  *
     18  * Redistribution and use in source and binary forms, with or without
     19  * modification, are permitted provided that the following conditions
     20  * are met:
     21  * 1. Redistributions of source code must retain the above copyright
     22  *    notice, this list of conditions and the following disclaimer.
     23  * 2. Redistributions in binary form must reproduce the above copyright
     24  *    notice, this list of conditions and the following disclaimer in the
     25  *    documentation and/or other materials provided with the distribution.
     26  *
     27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
     28  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     30  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     31  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37  * POSSIBILITY OF SUCH DAMAGE.
     38  */
     39 
     40 #include "opj_includes.h"
     41 
     42 /** @defgroup T2 T2 - Implementation of a tier-2 coding */
     43 /*@{*/
     44 
     45 /** @name Local static functions */
     46 /*@{*/
     47 
     48 static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n);
     49 
     50 static OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio);
     51 /**
     52 Variable length code for signalling delta Zil (truncation point)
     53 @param bio  Bit Input/Output component
     54 @param n    delta Zil
     55 */
     56 static void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n);
     57 static OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio);
     58 
     59 /**
     60 Encode a packet of a tile to a destination buffer
     61 @param tileno Number of the tile encoded
     62 @param tile Tile for which to write the packets
     63 @param tcp Tile coding parameters
     64 @param pi Packet identity
     65 @param dest Destination buffer
     66 @param p_data_written   FIXME DOC
     67 @param len Length of the destination buffer
     68 @param cstr_info Codestream information structure
     69 @return
     70 */
     71 static OPJ_BOOL opj_t2_encode_packet(   OPJ_UINT32 tileno,
     72                                         opj_tcd_tile_t *tile,
     73                                         opj_tcp_t *tcp,
     74                                         opj_pi_iterator_t *pi,
     75                                         OPJ_BYTE *dest,
     76                                         OPJ_UINT32 * p_data_written,
     77                                         OPJ_UINT32 len,
     78                                         opj_codestream_info_t *cstr_info);
     79 
     80 /**
     81 Decode a packet of a tile from a source buffer
     82 @param t2 T2 handle
     83 @param tile Tile for which to write the packets
     84 @param tcp Tile coding parameters
     85 @param pi Packet identity
     86 @param src Source buffer
     87 @param data_read   FIXME DOC
     88 @param max_length  FIXME DOC
     89 @param pack_info Packet information
     90 
     91 @return  FIXME DOC
     92 */
     93 static OPJ_BOOL opj_t2_decode_packet(   opj_t2_t* t2,
     94                                         opj_tcd_tile_t *tile,
     95                                         opj_tcp_t *tcp,
     96                                         opj_pi_iterator_t *pi,
     97                                         OPJ_BYTE *src,
     98                                         OPJ_UINT32 * data_read,
     99                                         OPJ_UINT32 max_length,
    100                                         opj_packet_info_t *pack_info);
    101 
    102 static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
    103                                     opj_tcd_tile_t *p_tile,
    104                                     opj_tcp_t *p_tcp,
    105                                     opj_pi_iterator_t *p_pi,
    106                                     OPJ_BYTE *p_src,
    107                                     OPJ_UINT32 * p_data_read,
    108                                     OPJ_UINT32 p_max_length,
    109                                     opj_packet_info_t *p_pack_info);
    110 
    111 static OPJ_BOOL opj_t2_read_packet_header(  opj_t2_t* p_t2,
    112                                             opj_tcd_tile_t *p_tile,
    113                                             opj_tcp_t *p_tcp,
    114                                             opj_pi_iterator_t *p_pi,
    115                                             OPJ_BOOL * p_is_data_present,
    116                                             OPJ_BYTE *p_src_data,
    117                                             OPJ_UINT32 * p_data_read,
    118                                             OPJ_UINT32 p_max_length,
    119                                             opj_packet_info_t *p_pack_info);
    120 
    121 static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
    122                                         opj_tcd_tile_t *p_tile,
    123                                         opj_pi_iterator_t *p_pi,
    124                                         OPJ_BYTE *p_src_data,
    125                                         OPJ_UINT32 * p_data_read,
    126                                         OPJ_UINT32 p_max_length,
    127                                         opj_packet_info_t *pack_info);
    128 
    129 static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
    130                                         opj_tcd_tile_t *p_tile,
    131                                         opj_pi_iterator_t *p_pi,
    132                                         OPJ_UINT32 * p_data_read,
    133                                         OPJ_UINT32 p_max_length,
    134                                         opj_packet_info_t *pack_info);
    135 
    136 /**
    137 @param cblk
    138 @param index
    139 @param cblksty
    140 @param first
    141 */
    142 static OPJ_BOOL opj_t2_init_seg(    opj_tcd_cblk_dec_t* cblk,
    143                                     OPJ_UINT32 index,
    144                                     OPJ_UINT32 cblksty,
    145                                     OPJ_UINT32 first);
    146 
    147 /*@}*/
    148 
    149 /*@}*/
    150 
    151 /* ----------------------------------------------------------------------- */
    152 
    153 /* #define RESTART 0x04 */
    154 static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n) {
    155         while (--n >= 0) {
    156                 opj_bio_write(bio, 1, 1);
    157         }
    158         opj_bio_write(bio, 0, 1);
    159 }
    160 
    161 OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio)
    162 {
    163     OPJ_UINT32 n = 0;
    164     while (opj_bio_read(bio, 1)) {
    165 	    ++n;
    166     }
    167     return n;
    168 }
    169 
    170 void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n) {
    171         if (n == 1) {
    172                 opj_bio_write(bio, 0, 1);
    173         } else if (n == 2) {
    174                 opj_bio_write(bio, 2, 2);
    175         } else if (n <= 5) {
    176                 opj_bio_write(bio, 0xc | (n - 3), 4);
    177         } else if (n <= 36) {
    178                 opj_bio_write(bio, 0x1e0 | (n - 6), 9);
    179         } else if (n <= 164) {
    180                 opj_bio_write(bio, 0xff80 | (n - 37), 16);
    181         }
    182 }
    183 
    184 OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio) {
    185         OPJ_UINT32 n;
    186         if (!opj_bio_read(bio, 1))
    187                 return 1;
    188         if (!opj_bio_read(bio, 1))
    189                 return 2;
    190         if ((n = opj_bio_read(bio, 2)) != 3)
    191                 return (3 + n);
    192         if ((n = opj_bio_read(bio, 5)) != 31)
    193                 return (6 + n);
    194         return (37 + opj_bio_read(bio, 7));
    195 }
    196 
    197 /* ----------------------------------------------------------------------- */
    198 
    199 OPJ_BOOL opj_t2_encode_packets( opj_t2_t* p_t2,
    200                                 OPJ_UINT32 p_tile_no,
    201                                 opj_tcd_tile_t *p_tile,
    202                                 OPJ_UINT32 p_maxlayers,
    203                                 OPJ_BYTE *p_dest,
    204                                 OPJ_UINT32 * p_data_written,
    205                                 OPJ_UINT32 p_max_len,
    206                                 opj_codestream_info_t *cstr_info,
    207                                 OPJ_UINT32 p_tp_num,
    208                                 OPJ_INT32 p_tp_pos,
    209                                 OPJ_UINT32 p_pino,
    210                                 J2K_T2_MODE p_t2_mode)
    211 {
    212         OPJ_BYTE *l_current_data = p_dest;
    213         OPJ_UINT32 l_nb_bytes = 0;
    214         OPJ_UINT32 compno;
    215         OPJ_UINT32 poc;
    216         opj_pi_iterator_t *l_pi = 00;
    217         opj_pi_iterator_t *l_current_pi = 00;
    218         opj_image_t *l_image = p_t2->image;
    219         opj_cp_t *l_cp = p_t2->cp;
    220         opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no];
    221         OPJ_UINT32 pocno = l_cp->m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24? 2: 1;
    222         OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ? l_image->numcomps : 1;
    223         OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
    224 
    225         l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode);
    226         if (!l_pi) {
    227                 return OPJ_FALSE;
    228         }
    229 
    230         * p_data_written = 0;
    231 
    232         if (p_t2_mode == THRESH_CALC ){ /* Calculating threshold */
    233                 l_current_pi = l_pi;
    234 
    235                 for     (compno = 0; compno < l_max_comp; ++compno) {
    236                         OPJ_UINT32 l_comp_len = 0;
    237                         l_current_pi = l_pi;
    238 
    239                         for (poc = 0; poc < pocno ; ++poc) {
    240                                 OPJ_UINT32 l_tp_num = compno;
    241 
    242                                 /* TODO MSD : check why this function cannot fail (cf. v1) */
    243                                 opj_pi_create_encode(l_pi, l_cp,p_tile_no,poc,l_tp_num,p_tp_pos,p_t2_mode);
    244 
    245                                 while (opj_pi_next(l_current_pi)) {
    246                                         if (l_current_pi->layno < p_maxlayers) {
    247                                                 l_nb_bytes = 0;
    248 
    249                                                 if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
    250                                                         opj_pi_destroy(l_pi, l_nb_pocs);
    251                                                         return OPJ_FALSE;
    252                                                 }
    253 
    254                                                 l_comp_len += l_nb_bytes;
    255                                                 l_current_data += l_nb_bytes;
    256                                                 p_max_len -= l_nb_bytes;
    257 
    258                                                 * p_data_written += l_nb_bytes;
    259                                         }
    260                                 }
    261 
    262                                 if (l_cp->m_specific_param.m_enc.m_max_comp_size) {
    263                                         if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {
    264                                                 opj_pi_destroy(l_pi, l_nb_pocs);
    265                                                 return OPJ_FALSE;
    266                                         }
    267                                 }
    268 
    269                                 ++l_current_pi;
    270                         }
    271                 }
    272         }
    273         else {  /* t2_mode == FINAL_PASS  */
    274                 opj_pi_create_encode(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode);
    275 
    276                 l_current_pi = &l_pi[p_pino];
    277 
    278                 while (opj_pi_next(l_current_pi)) {
    279                         if (l_current_pi->layno < p_maxlayers) {
    280                                 l_nb_bytes=0;
    281 
    282                                 if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
    283                                         opj_pi_destroy(l_pi, l_nb_pocs);
    284                                         return OPJ_FALSE;
    285                                 }
    286 
    287                                 l_current_data += l_nb_bytes;
    288                                 p_max_len -= l_nb_bytes;
    289 
    290                                 * p_data_written += l_nb_bytes;
    291 
    292                                 /* INDEX >> */
    293                                 if(cstr_info) {
    294                                         if(cstr_info->index_write) {
    295                                                 opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];
    296                                                 opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
    297                                                 if (!cstr_info->packno) {
    298                                                         info_PK->start_pos = info_TL->end_header + 1;
    299                                                 } else {
    300                                                         info_PK->start_pos = ((l_cp->m_specific_param.m_enc.m_tp_on | l_tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
    301                                                 }
    302                                                 info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;
    303                                                 info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance
    304                                                                                                                                                                                                                                                    to start of packet is incremented by value of start of packet*/
    305                                         }
    306 
    307                                         cstr_info->packno++;
    308                                 }
    309                                 /* << INDEX */
    310                                 ++p_tile->packno;
    311                         }
    312                 }
    313         }
    314 
    315         opj_pi_destroy(l_pi, l_nb_pocs);
    316 
    317         return OPJ_TRUE;
    318 }
    319 
    320 /* see issue 80 */
    321 #if 0
    322 #define JAS_FPRINTF fprintf
    323 #else
    324 /* issue 290 */
    325 static void opj_null_jas_fprintf(FILE* file, const char * format, ...)
    326 {
    327   (void)file;
    328   (void)format;
    329 }
    330 #define JAS_FPRINTF opj_null_jas_fprintf
    331 #endif
    332 
    333 OPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2,
    334                                 OPJ_UINT32 p_tile_no,
    335                                 opj_tcd_tile_t *p_tile,
    336                                 OPJ_BYTE *p_src,
    337                                 OPJ_UINT32 * p_data_read,
    338                                 OPJ_UINT32 p_max_len,
    339                                 opj_codestream_index_t *p_cstr_index)
    340 {
    341         OPJ_BYTE *l_current_data = p_src;
    342         opj_pi_iterator_t *l_pi = 00;
    343         OPJ_UINT32 pino;
    344         opj_image_t *l_image = p_t2->image;
    345         opj_cp_t *l_cp = p_t2->cp;
    346         opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);
    347         OPJ_UINT32 l_nb_bytes_read;
    348         OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
    349         opj_pi_iterator_t *l_current_pi = 00;
    350 #ifdef TODO_MSD
    351         OPJ_UINT32 curtp = 0;
    352         OPJ_UINT32 tp_start_packno;
    353 #endif
    354         opj_packet_info_t *l_pack_info = 00;
    355         opj_image_comp_t* l_img_comp = 00;
    356 
    357         OPJ_ARG_NOT_USED(p_cstr_index);
    358 
    359 #ifdef TODO_MSD
    360         if (p_cstr_index) {
    361                 l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;
    362         }
    363 #endif
    364 
    365         /* create a packet iterator */
    366         l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no);
    367         if (!l_pi) {
    368                 return OPJ_FALSE;
    369         }
    370 
    371 
    372         l_current_pi = l_pi;
    373 
    374         for     (pino = 0; pino <= l_tcp->numpocs; ++pino) {
    375 
    376                 /* if the resolution needed is too low, one dim of the tilec could be equal to zero
    377                  * and no packets are used to decode this resolution and
    378                  * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions
    379                  * and no l_img_comp->resno_decoded are computed
    380                  */
    381                 OPJ_BOOL* first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));
    382                 if (!first_pass_failed)
    383                 {
    384                     opj_pi_destroy(l_pi,l_nb_pocs);
    385                     return OPJ_FALSE;
    386                 }
    387                 memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));
    388 
    389                 while (opj_pi_next(l_current_pi)) {
    390                   JAS_FPRINTF( stderr, "packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\n\n",
    391                     l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno, l_current_pi->precno, l_current_pi->layno );
    392 
    393                         if (l_tcp->num_layers_to_decode > l_current_pi->layno
    394                                         && l_current_pi->resno < p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {
    395                                 l_nb_bytes_read = 0;
    396 
    397                                 first_pass_failed[l_current_pi->compno] = OPJ_FALSE;
    398 
    399                                 if (! opj_t2_decode_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) {
    400                                         opj_pi_destroy(l_pi,l_nb_pocs);
    401                                         opj_free(first_pass_failed);
    402                                         return OPJ_FALSE;
    403                                 }
    404 
    405                                 l_img_comp = &(l_image->comps[l_current_pi->compno]);
    406                                 l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno, l_img_comp->resno_decoded);
    407                         }
    408                         else {
    409                                 l_nb_bytes_read = 0;
    410                                 if (! opj_t2_skip_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) {
    411                                         opj_pi_destroy(l_pi,l_nb_pocs);
    412                                         opj_free(first_pass_failed);
    413                                         return OPJ_FALSE;
    414                                 }
    415                         }
    416 
    417                         if (first_pass_failed[l_current_pi->compno]) {
    418                                 l_img_comp = &(l_image->comps[l_current_pi->compno]);
    419                                 if (l_img_comp->resno_decoded == 0)
    420                                         l_img_comp->resno_decoded = p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;
    421                         }
    422 
    423                         l_current_data += l_nb_bytes_read;
    424                         p_max_len -= l_nb_bytes_read;
    425 
    426                         /* INDEX >> */
    427 #ifdef TODO_MSD
    428                         if(p_cstr_info) {
    429                                 opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
    430                                 opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
    431                                 tp_start_packno = 0;
    432                                 if (!p_cstr_info->packno) {
    433                                         info_PK->start_pos = info_TL->end_header + 1;
    434                                 } else if (info_TL->packet[p_cstr_info->packno-1].end_pos >= (OPJ_INT32)p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos){ /* New tile part */
    435                                         info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part */
    436                                         tp_start_packno = p_cstr_info->packno;
    437                                         curtp++;
    438                                         info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header+1;
    439                                 } else {
    440                                         info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno - 1].end_pos + 1;
    441                                 }
    442                                 info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;
    443                                 info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance */
    444                                 ++p_cstr_info->packno;
    445                         }
    446 #endif
    447                         /* << INDEX */
    448                 }
    449                 ++l_current_pi;
    450 
    451                 opj_free(first_pass_failed);
    452         }
    453         /* INDEX >> */
    454 #ifdef TODO_MSD
    455         if
    456                 (p_cstr_info) {
    457                 p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part */
    458         }
    459 #endif
    460         /* << INDEX */
    461 
    462         /* don't forget to release pi */
    463         opj_pi_destroy(l_pi,l_nb_pocs);
    464         *p_data_read = (OPJ_UINT32)(l_current_data - p_src);
    465         return OPJ_TRUE;
    466 }
    467 
    468 /* ----------------------------------------------------------------------- */
    469 
    470 /**
    471  * Creates a Tier 2 handle
    472  *
    473  * @param       p_image         Source or destination image
    474  * @param       p_cp            Image coding parameters.
    475  * @return              a new T2 handle if successful, NULL otherwise.
    476 */
    477 opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp)
    478 {
    479         /* create the t2 structure */
    480         opj_t2_t *l_t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));
    481         if (!l_t2) {
    482                 return NULL;
    483         }
    484         memset(l_t2,0,sizeof(opj_t2_t));
    485 
    486         l_t2->image = p_image;
    487         l_t2->cp = p_cp;
    488 
    489         return l_t2;
    490 }
    491 
    492 void opj_t2_destroy(opj_t2_t *t2) {
    493         if(t2) {
    494                 opj_free(t2);
    495         }
    496 }
    497 
    498 OPJ_BOOL opj_t2_decode_packet(  opj_t2_t* p_t2,
    499                                 opj_tcd_tile_t *p_tile,
    500                                 opj_tcp_t *p_tcp,
    501                                 opj_pi_iterator_t *p_pi,
    502                                 OPJ_BYTE *p_src,
    503                                 OPJ_UINT32 * p_data_read,
    504                                 OPJ_UINT32 p_max_length,
    505                                 opj_packet_info_t *p_pack_info)
    506 {
    507         OPJ_BOOL l_read_data;
    508         OPJ_UINT32 l_nb_bytes_read = 0;
    509         OPJ_UINT32 l_nb_total_bytes_read = 0;
    510 
    511         *p_data_read = 0;
    512 
    513         if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
    514                 return OPJ_FALSE;
    515         }
    516 
    517         p_src += l_nb_bytes_read;
    518         l_nb_total_bytes_read += l_nb_bytes_read;
    519         p_max_length -= l_nb_bytes_read;
    520 
    521         /* we should read data for the packet */
    522         if (l_read_data) {
    523                 l_nb_bytes_read = 0;
    524 
    525                 if (! opj_t2_read_packet_data(p_t2,p_tile,p_pi,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
    526                         return OPJ_FALSE;
    527                 }
    528 
    529                 l_nb_total_bytes_read += l_nb_bytes_read;
    530         }
    531 
    532         *p_data_read = l_nb_total_bytes_read;
    533 
    534         return OPJ_TRUE;
    535 }
    536 
    537 OPJ_BOOL opj_t2_encode_packet(  OPJ_UINT32 tileno,
    538                                 opj_tcd_tile_t * tile,
    539                                 opj_tcp_t * tcp,
    540                                 opj_pi_iterator_t *pi,
    541                                 OPJ_BYTE *dest,
    542                                 OPJ_UINT32 * p_data_written,
    543                                 OPJ_UINT32 length,
    544                                 opj_codestream_info_t *cstr_info)
    545 {
    546         OPJ_UINT32 bandno, cblkno;
    547         OPJ_BYTE* c = dest;
    548         OPJ_UINT32 l_nb_bytes;
    549         OPJ_UINT32 compno = pi->compno;     /* component value */
    550         OPJ_UINT32 resno  = pi->resno;      /* resolution level value */
    551         OPJ_UINT32 precno = pi->precno;     /* precinct value */
    552         OPJ_UINT32 layno  = pi->layno;      /* quality layer value */
    553         OPJ_UINT32 l_nb_blocks;
    554         opj_tcd_band_t *band = 00;
    555         opj_tcd_cblk_enc_t* cblk = 00;
    556         opj_tcd_pass_t *pass = 00;
    557 
    558         opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
    559         opj_tcd_resolution_t *res = &tilec->resolutions[resno];
    560 
    561         opj_bio_t *bio = 00;    /* BIO component */
    562 
    563         /* <SOP 0xff91> */
    564         if (tcp->csty & J2K_CP_CSTY_SOP) {
    565                 c[0] = 255;
    566                 c[1] = 145;
    567                 c[2] = 0;
    568                 c[3] = 4;
    569 #if 0
    570                 c[4] = (tile->packno % 65536) / 256;
    571                 c[5] = (tile->packno % 65536) % 256;
    572 #else
    573                 c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
    574                 c[5] = tile->packno & 0xff;
    575 #endif
    576                 c += 6;
    577                 length -= 6;
    578         }
    579         /* </SOP> */
    580 
    581         if (!layno) {
    582                 band = res->bands;
    583 
    584                 for(bandno = 0; bandno < res->numbands; ++bandno) {
    585                         opj_tcd_precinct_t *prc = &band->precincts[precno];
    586 
    587                         opj_tgt_reset(prc->incltree);
    588                         opj_tgt_reset(prc->imsbtree);
    589 
    590                         l_nb_blocks = prc->cw * prc->ch;
    591                         for     (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
    592                                 cblk = &prc->cblks.enc[cblkno];
    593 
    594                                 cblk->numpasses = 0;
    595                                 opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
    596                         }
    597                         ++band;
    598                 }
    599         }
    600 
    601         bio = opj_bio_create();
    602         opj_bio_init_enc(bio, c, length);
    603         opj_bio_write(bio, 1, 1);           /* Empty header bit */
    604 
    605         /* Writing Packet header */
    606         band = res->bands;
    607         for (bandno = 0; bandno < res->numbands; ++bandno)      {
    608                 opj_tcd_precinct_t *prc = &band->precincts[precno];
    609 
    610                 l_nb_blocks = prc->cw * prc->ch;
    611                 cblk = prc->cblks.enc;
    612 
    613                 for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
    614                         opj_tcd_layer_t *layer = &cblk->layers[layno];
    615 
    616                         if (!cblk->numpasses && layer->numpasses) {
    617                                 opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
    618                         }
    619 
    620                         ++cblk;
    621                 }
    622 
    623                 cblk = prc->cblks.enc;
    624                 for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
    625                         opj_tcd_layer_t *layer = &cblk->layers[layno];
    626                         OPJ_UINT32 increment = 0;
    627                         OPJ_UINT32 nump = 0;
    628                         OPJ_UINT32 len = 0, passno;
    629                         OPJ_UINT32 l_nb_passes;
    630 
    631                         /* cblk inclusion bits */
    632                         if (!cblk->numpasses) {
    633                                 opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
    634                         } else {
    635                                 opj_bio_write(bio, layer->numpasses != 0, 1);
    636                         }
    637 
    638                         /* if cblk not included, go to the next cblk  */
    639                         if (!layer->numpasses) {
    640                                 ++cblk;
    641                                 continue;
    642                         }
    643 
    644                         /* if first instance of cblk --> zero bit-planes information */
    645                         if (!cblk->numpasses) {
    646                                 cblk->numlenbits = 3;
    647                                 opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
    648                         }
    649 
    650                         /* number of coding passes included */
    651                         opj_t2_putnumpasses(bio, layer->numpasses);
    652                         l_nb_passes = cblk->numpasses + layer->numpasses;
    653                         pass = cblk->passes +  cblk->numpasses;
    654 
    655                         /* computation of the increase of the length indicator and insertion in the header     */
    656                         for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
    657                                 ++nump;
    658                                 len += pass->len;
    659 
    660                                 if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
    661                                   increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment, opj_int_floorlog2((OPJ_INT32)len) + 1
    662                                     - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
    663                                         len = 0;
    664                                         nump = 0;
    665                                 }
    666 
    667                                 ++pass;
    668                         }
    669                         opj_t2_putcommacode(bio, (OPJ_INT32)increment);
    670 
    671                         /* computation of the new Length indicator */
    672                         cblk->numlenbits += increment;
    673 
    674                         pass = cblk->passes +  cblk->numpasses;
    675                         /* insertion of the codeword segment length */
    676                         for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
    677                                 nump++;
    678                                 len += pass->len;
    679 
    680                                 if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
    681                                         opj_bio_write(bio, (OPJ_UINT32)len, cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
    682                                         len = 0;
    683                                         nump = 0;
    684                                 }
    685                                 ++pass;
    686                         }
    687 
    688                         ++cblk;
    689                 }
    690 
    691                 ++band;
    692         }
    693 
    694         if (!opj_bio_flush(bio)) {
    695                 opj_bio_destroy(bio);
    696                 return OPJ_FALSE;               /* modified to eliminate longjmp !! */
    697         }
    698 
    699         l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
    700         c += l_nb_bytes;
    701         length -= l_nb_bytes;
    702 
    703         opj_bio_destroy(bio);
    704 
    705         /* <EPH 0xff92> */
    706         if (tcp->csty & J2K_CP_CSTY_EPH) {
    707                 c[0] = 255;
    708                 c[1] = 146;
    709                 c += 2;
    710                 length -= 2;
    711         }
    712         /* </EPH> */
    713 
    714         /* << INDEX */
    715         /* End of packet header position. Currently only represents the distance to start of packet
    716            Will be updated later by incrementing with packet start value*/
    717         if(cstr_info && cstr_info->index_write) {
    718                 opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
    719                 info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
    720         }
    721         /* INDEX >> */
    722 
    723         /* Writing the packet body */
    724         band = res->bands;
    725         for (bandno = 0; bandno < res->numbands; bandno++) {
    726                 opj_tcd_precinct_t *prc = &band->precincts[precno];
    727 
    728                 l_nb_blocks = prc->cw * prc->ch;
    729                 cblk = prc->cblks.enc;
    730 
    731                 for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
    732                         opj_tcd_layer_t *layer = &cblk->layers[layno];
    733 
    734                         if (!layer->numpasses) {
    735                                 ++cblk;
    736                                 continue;
    737                         }
    738 
    739                         if (layer->len > length) {
    740                                 return OPJ_FALSE;
    741                         }
    742 
    743                         memcpy(c, layer->data, layer->len);
    744                         cblk->numpasses += layer->numpasses;
    745                         c += layer->len;
    746                         length -= layer->len;
    747 
    748                         /* << INDEX */
    749                         if(cstr_info && cstr_info->index_write) {
    750                                 opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
    751                                 info_PK->disto += layer->disto;
    752                                 if (cstr_info->D_max < info_PK->disto) {
    753                                         cstr_info->D_max = info_PK->disto;
    754                                 }
    755                         }
    756 
    757                         ++cblk;
    758                         /* INDEX >> */
    759                 }
    760                 ++band;
    761         }
    762 
    763         assert( c >= dest );
    764         * p_data_written += (OPJ_UINT32)(c - dest);
    765 
    766         return OPJ_TRUE;
    767 }
    768 
    769 static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
    770                                     opj_tcd_tile_t *p_tile,
    771                                     opj_tcp_t *p_tcp,
    772                                     opj_pi_iterator_t *p_pi,
    773                                     OPJ_BYTE *p_src,
    774                                     OPJ_UINT32 * p_data_read,
    775                                     OPJ_UINT32 p_max_length,
    776                                     opj_packet_info_t *p_pack_info)
    777 {
    778         OPJ_BOOL l_read_data;
    779         OPJ_UINT32 l_nb_bytes_read = 0;
    780         OPJ_UINT32 l_nb_total_bytes_read = 0;
    781 
    782         *p_data_read = 0;
    783 
    784         if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
    785                 return OPJ_FALSE;
    786         }
    787 
    788         p_src += l_nb_bytes_read;
    789         l_nb_total_bytes_read += l_nb_bytes_read;
    790         p_max_length -= l_nb_bytes_read;
    791 
    792         /* we should read data for the packet */
    793         if (l_read_data) {
    794                 l_nb_bytes_read = 0;
    795 
    796                 if (! opj_t2_skip_packet_data(p_t2,p_tile,p_pi,&l_nb_bytes_read,p_max_length,p_pack_info)) {
    797                         return OPJ_FALSE;
    798                 }
    799 
    800                 l_nb_total_bytes_read += l_nb_bytes_read;
    801         }
    802         *p_data_read = l_nb_total_bytes_read;
    803 
    804         return OPJ_TRUE;
    805 }
    806 
    807 
    808 OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,
    809                                     opj_tcd_tile_t *p_tile,
    810                                     opj_tcp_t *p_tcp,
    811                                     opj_pi_iterator_t *p_pi,
    812                                     OPJ_BOOL * p_is_data_present,
    813                                     OPJ_BYTE *p_src_data,
    814                                     OPJ_UINT32 * p_data_read,
    815                                     OPJ_UINT32 p_max_length,
    816                                     opj_packet_info_t *p_pack_info)
    817 
    818 {
    819         /* loop */
    820         OPJ_UINT32 bandno, cblkno;
    821         OPJ_UINT32 l_nb_code_blocks;
    822         OPJ_UINT32 l_remaining_length;
    823         OPJ_UINT32 l_header_length;
    824         OPJ_UINT32 * l_modified_length_ptr = 00;
    825         OPJ_BYTE *l_current_data = p_src_data;
    826         opj_cp_t *l_cp = p_t2->cp;
    827         opj_bio_t *l_bio = 00;  /* BIO component */
    828         opj_tcd_band_t *l_band = 00;
    829         opj_tcd_cblk_dec_t* l_cblk = 00;
    830         opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
    831 
    832         OPJ_BYTE *l_header_data = 00;
    833         OPJ_BYTE **l_header_data_start = 00;
    834 
    835         OPJ_UINT32 l_present;
    836 
    837         if (p_pi->layno == 0) {
    838                 l_band = l_res->bands;
    839 
    840                 /* reset tagtrees */
    841                 for (bandno = 0; bandno < l_res->numbands; ++bandno) {
    842                         opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
    843 
    844                         if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {
    845                                 opj_tgt_reset(l_prc->incltree);
    846                                 opj_tgt_reset(l_prc->imsbtree);
    847                                 l_cblk = l_prc->cblks.dec;
    848 
    849                                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
    850                                 for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
    851                                         l_cblk->numsegs = 0;
    852                                         l_cblk->real_num_segs = 0;
    853                                         ++l_cblk;
    854                                 }
    855                         }
    856 
    857                         ++l_band;
    858                 }
    859         }
    860 
    861         /* SOP markers */
    862 
    863         if (p_tcp->csty & J2K_CP_CSTY_SOP) {
    864                 if (p_max_length < 6) {
    865                         /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Not enough space for expected SOP marker\n"); */
    866                         printf("Not enough space for expected SOP marker\n");
    867                 } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
    868                         /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Expected SOP marker\n"); */
    869                         printf("Expected SOP marker\n");
    870                         fprintf(stderr, "Error : expected SOP marker\n");
    871                 } else {
    872                         l_current_data += 6;
    873                 }
    874 
    875                 /** TODO : check the Nsop value */
    876         }
    877 
    878         /*
    879         When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
    880         This part deal with this caracteristic
    881         step 1: Read packet header in the saved structure
    882         step 2: Return to codestream for decoding
    883         */
    884 
    885         l_bio = opj_bio_create();
    886         if (! l_bio) {
    887                 return OPJ_FALSE;
    888         }
    889 
    890         if (l_cp->ppm == 1) { /* PPM */
    891                 l_header_data_start = &l_cp->ppm_data;
    892                 l_header_data = *l_header_data_start;
    893                 l_modified_length_ptr = &(l_cp->ppm_len);
    894 
    895         }
    896         else if (p_tcp->ppt == 1) { /* PPT */
    897                 l_header_data_start = &(p_tcp->ppt_data);
    898                 l_header_data = *l_header_data_start;
    899                 l_modified_length_ptr = &(p_tcp->ppt_len);
    900         }
    901         else {  /* Normal Case */
    902                 l_header_data_start = &(l_current_data);
    903                 l_header_data = *l_header_data_start;
    904                 l_remaining_length = (OPJ_UINT32)(p_src_data+p_max_length-l_header_data);
    905                 l_modified_length_ptr = &(l_remaining_length);
    906         }
    907 
    908         opj_bio_init_dec(l_bio, l_header_data,*l_modified_length_ptr);
    909 
    910         l_present = opj_bio_read(l_bio, 1);
    911         JAS_FPRINTF(stderr, "present=%d \n", l_present );
    912         if (!l_present) {
    913             /* TODO MSD: no test to control the output of this function*/
    914                 opj_bio_inalign(l_bio);
    915                 l_header_data += opj_bio_numbytes(l_bio);
    916                 opj_bio_destroy(l_bio);
    917 
    918                 /* EPH markers */
    919                 if (p_tcp->csty & J2K_CP_CSTY_EPH) {
    920                         if (p_max_length < 2) {
    921                                 fprintf(stderr, "Not enough space for expected EPH marker\n");
    922                         } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
    923                                 fprintf(stderr, "Error : expected EPH marker\n");
    924                         } else {
    925                                 l_header_data += 2;
    926                         }
    927                 }
    928 
    929                 l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
    930                 *l_modified_length_ptr -= l_header_length;
    931                 *l_header_data_start += l_header_length;
    932 
    933                 /* << INDEX */
    934                 /* End of packet header position. Currently only represents the distance to start of packet
    935                    Will be updated later by incrementing with packet start value */
    936                 if (p_pack_info) {
    937                         p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
    938                 }
    939                 /* INDEX >> */
    940 
    941                 * p_is_data_present = OPJ_FALSE;
    942                 *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
    943                 return OPJ_TRUE;
    944         }
    945 
    946         l_band = l_res->bands;
    947         for (bandno = 0; bandno < l_res->numbands; ++bandno) {
    948                 opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
    949 
    950                 if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
    951                         ++l_band;
    952                         continue;
    953                 }
    954 
    955                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
    956                 l_cblk = l_prc->cblks.dec;
    957                 for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
    958                         OPJ_UINT32 l_included,l_increment, l_segno;
    959                         OPJ_INT32 n;
    960 
    961                         /* if cblk not yet included before --> inclusion tagtree */
    962                         if (!l_cblk->numsegs) {
    963                                 l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno, (OPJ_INT32)(p_pi->layno + 1));
    964                                 /* else one bit */
    965                         }
    966                         else {
    967                                 l_included = opj_bio_read(l_bio, 1);
    968                         }
    969 
    970                         /* if cblk not included */
    971                         if (!l_included) {
    972                                 l_cblk->numnewpasses = 0;
    973                                 ++l_cblk;
    974         JAS_FPRINTF(stderr, "included=%d \n", l_included);
    975                                 continue;
    976                         }
    977 
    978                         /* if cblk not yet included --> zero-bitplane tagtree */
    979                         if (!l_cblk->numsegs) {
    980                                 OPJ_UINT32 i = 0;
    981 
    982                                 while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
    983                                         ++i;
    984                                 }
    985 
    986                                 l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
    987                                 l_cblk->numlenbits = 3;
    988                         }
    989 
    990                         /* number of coding passes */
    991                         l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
    992                         l_increment = opj_t2_getcommacode(l_bio);
    993 
    994                         /* length indicator increment */
    995                         l_cblk->numlenbits += l_increment;
    996                         l_segno = 0;
    997 
    998                         if (!l_cblk->numsegs) {
    999                                 if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
   1000                                         opj_bio_destroy(l_bio);
   1001                                         return OPJ_FALSE;
   1002                                 }
   1003                         }
   1004                         else {
   1005                                 l_segno = l_cblk->numsegs - 1;
   1006                                 if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
   1007                                         ++l_segno;
   1008                                         if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
   1009                                                 opj_bio_destroy(l_bio);
   1010                                                 return OPJ_FALSE;
   1011                                         }
   1012                                 }
   1013                         }
   1014                         n = (OPJ_INT32)l_cblk->numnewpasses;
   1015 
   1016                         do {
   1017                                 l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);
   1018                                 l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + opj_uint_floorlog2(l_cblk->segs[l_segno].numnewpasses));
   1019                                         JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n", l_included, l_cblk->segs[l_segno].numnewpasses, l_increment, l_cblk->segs[l_segno].newlen );
   1020 
   1021                                 n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
   1022                                 if (n > 0) {
   1023                                         ++l_segno;
   1024 
   1025                                         if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
   1026                                                 opj_bio_destroy(l_bio);
   1027                                                 return OPJ_FALSE;
   1028                                         }
   1029                                 }
   1030                         } while (n > 0);
   1031 
   1032                         ++l_cblk;
   1033                 }
   1034 
   1035                 ++l_band;
   1036         }
   1037 
   1038         if (!opj_bio_inalign(l_bio)) {
   1039                 opj_bio_destroy(l_bio);
   1040                 return OPJ_FALSE;
   1041         }
   1042 
   1043         l_header_data += opj_bio_numbytes(l_bio);
   1044         opj_bio_destroy(l_bio);
   1045 
   1046         /* EPH markers */
   1047         if (p_tcp->csty & J2K_CP_CSTY_EPH) {
   1048                 if (p_max_length < 2) {
   1049                         fprintf(stderr, "Not enough space for expected EPH marker\n");
   1050                 } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
   1051                         /* TODO opj_event_msg(t2->cinfo->event_mgr, EVT_ERROR, "Expected EPH marker\n"); */
   1052                         fprintf(stderr, "Error : expected EPH marker\n");
   1053                 } else {
   1054                         l_header_data += 2;
   1055                 }
   1056         }
   1057 
   1058         l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
   1059         JAS_FPRINTF( stderr, "hdrlen=%d \n", l_header_length );
   1060         JAS_FPRINTF( stderr, "packet body\n");
   1061         *l_modified_length_ptr -= l_header_length;
   1062         *l_header_data_start += l_header_length;
   1063 
   1064         /* << INDEX */
   1065         /* End of packet header position. Currently only represents the distance to start of packet
   1066          Will be updated later by incrementing with packet start value */
   1067         if (p_pack_info) {
   1068                 p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
   1069         }
   1070         /* INDEX >> */
   1071 
   1072         *p_is_data_present = OPJ_TRUE;
   1073         *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
   1074 
   1075         return OPJ_TRUE;
   1076 }
   1077 
   1078 OPJ_BOOL opj_t2_read_packet_data(   opj_t2_t* p_t2,
   1079                                     opj_tcd_tile_t *p_tile,
   1080                                     opj_pi_iterator_t *p_pi,
   1081                                     OPJ_BYTE *p_src_data,
   1082                                     OPJ_UINT32 * p_data_read,
   1083                                     OPJ_UINT32 p_max_length,
   1084                                     opj_packet_info_t *pack_info)
   1085 {
   1086         OPJ_UINT32 bandno, cblkno;
   1087         OPJ_UINT32 l_nb_code_blocks;
   1088         OPJ_BYTE *l_current_data = p_src_data;
   1089         opj_tcd_band_t *l_band = 00;
   1090         opj_tcd_cblk_dec_t* l_cblk = 00;
   1091         opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
   1092 
   1093         OPJ_ARG_NOT_USED(p_t2);
   1094         OPJ_ARG_NOT_USED(pack_info);
   1095 
   1096         l_band = l_res->bands;
   1097         for (bandno = 0; bandno < l_res->numbands; ++bandno) {
   1098                 opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
   1099 
   1100                 if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
   1101                         ++l_band;
   1102                         continue;
   1103                 }
   1104 
   1105                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
   1106                 l_cblk = l_prc->cblks.dec;
   1107 
   1108                 for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
   1109                         opj_tcd_seg_t *l_seg = 00;
   1110 
   1111                         if (!l_cblk->numnewpasses) {
   1112                                 /* nothing to do */
   1113                                 ++l_cblk;
   1114                                 continue;
   1115                         }
   1116 
   1117                         if (!l_cblk->numsegs) {
   1118                                 l_seg = l_cblk->segs;
   1119                                 ++l_cblk->numsegs;
   1120                                 l_cblk->data_current_size = 0;
   1121                         }
   1122                         else {
   1123                                 l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
   1124 
   1125                                 if (l_seg->numpasses == l_seg->maxpasses) {
   1126                                         ++l_seg;
   1127                                         ++l_cblk->numsegs;
   1128                                 }
   1129                         }
   1130 
   1131                         do {
   1132                                 if (l_current_data + l_seg->newlen > p_src_data + p_max_length) {
   1133                                         fprintf(stderr, "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1134                                                 l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1135                                         return OPJ_FALSE;
   1136                                 }
   1137 
   1138 #ifdef USE_JPWL
   1139                         /* we need here a j2k handle to verify if making a check to
   1140                         the validity of cblocks parameters is selected from user (-W) */
   1141 
   1142                                 /* let's check that we are not exceeding */
   1143                                 if ((l_cblk->len + l_seg->newlen) > 8192) {
   1144                                         opj_event_msg(p_t2->cinfo, EVT_WARNING,
   1145                                                 "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1146                                                 l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1147                                         if (!JPWL_ASSUME) {
   1148                                                 opj_event_msg(p_t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
   1149                                                 return OPJ_FALSE;
   1150                                         }
   1151                                         l_seg->newlen = 8192 - l_cblk->len;
   1152                                         opj_event_msg(p_t2->cinfo, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
   1153                                         break;
   1154                                 };
   1155 
   1156 #endif /* USE_JPWL */
   1157                                 /* Check if the cblk->data have allocated enough memory */
   1158                                 if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) {
   1159                                     OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen);
   1160                                     if(! new_cblk_data) {
   1161                                         opj_free(l_cblk->data);
   1162                                         l_cblk->data_max_size = 0;
   1163                                         /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to realloc code block cata!\n"); */
   1164                                         return OPJ_FALSE;
   1165                                     }
   1166                                     l_cblk->data_max_size = l_cblk->data_current_size + l_seg->newlen;
   1167                                     l_cblk->data = new_cblk_data;
   1168                                 }
   1169 
   1170                                 memcpy(l_cblk->data + l_cblk->data_current_size, l_current_data, l_seg->newlen);
   1171 
   1172                                 if (l_seg->numpasses == 0) {
   1173                                         l_seg->data = &l_cblk->data;
   1174                                         l_seg->dataindex = l_cblk->data_current_size;
   1175                                 }
   1176 
   1177                                 l_current_data += l_seg->newlen;
   1178                                 l_seg->numpasses += l_seg->numnewpasses;
   1179                                 l_cblk->numnewpasses -= l_seg->numnewpasses;
   1180 
   1181                                 l_seg->real_num_passes = l_seg->numpasses;
   1182                                 l_cblk->data_current_size += l_seg->newlen;
   1183                                 l_seg->len += l_seg->newlen;
   1184 
   1185                                 if (l_cblk->numnewpasses > 0) {
   1186                                         ++l_seg;
   1187                                         ++l_cblk->numsegs;
   1188                                 }
   1189                         } while (l_cblk->numnewpasses > 0);
   1190 
   1191                         l_cblk->real_num_segs = l_cblk->numsegs;
   1192                         ++l_cblk;
   1193                 } /* next code_block */
   1194 
   1195                 ++l_band;
   1196         }
   1197 
   1198         *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
   1199 
   1200         return OPJ_TRUE;
   1201 }
   1202 
   1203 OPJ_BOOL opj_t2_skip_packet_data(   opj_t2_t* p_t2,
   1204                                     opj_tcd_tile_t *p_tile,
   1205                                     opj_pi_iterator_t *p_pi,
   1206                                     OPJ_UINT32 * p_data_read,
   1207                                     OPJ_UINT32 p_max_length,
   1208                                     opj_packet_info_t *pack_info)
   1209 {
   1210         OPJ_UINT32 bandno, cblkno;
   1211         OPJ_UINT32 l_nb_code_blocks;
   1212         opj_tcd_band_t *l_band = 00;
   1213         opj_tcd_cblk_dec_t* l_cblk = 00;
   1214         opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
   1215 
   1216         OPJ_ARG_NOT_USED(p_t2);
   1217         OPJ_ARG_NOT_USED(pack_info);
   1218 
   1219         *p_data_read = 0;
   1220         l_band = l_res->bands;
   1221 
   1222         for (bandno = 0; bandno < l_res->numbands; ++bandno) {
   1223                 opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
   1224 
   1225                 if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
   1226                         ++l_band;
   1227                         continue;
   1228                 }
   1229 
   1230                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
   1231                 l_cblk = l_prc->cblks.dec;
   1232 
   1233                 for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
   1234                         opj_tcd_seg_t *l_seg = 00;
   1235 
   1236                         if (!l_cblk->numnewpasses) {
   1237                                 /* nothing to do */
   1238                                 ++l_cblk;
   1239                                 continue;
   1240                         }
   1241 
   1242                         if (!l_cblk->numsegs) {
   1243                                 l_seg = l_cblk->segs;
   1244                                 ++l_cblk->numsegs;
   1245                                 l_cblk->data_current_size = 0;
   1246                         }
   1247                         else {
   1248                                 l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
   1249 
   1250                                 if (l_seg->numpasses == l_seg->maxpasses) {
   1251                                         ++l_seg;
   1252                                         ++l_cblk->numsegs;
   1253                                 }
   1254                         }
   1255 
   1256                         do {
   1257                                 if (* p_data_read + l_seg->newlen > p_max_length) {
   1258                                         fprintf(stderr, "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1259                                                 l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1260                                         return OPJ_FALSE;
   1261                                 }
   1262 
   1263 #ifdef USE_JPWL
   1264                         /* we need here a j2k handle to verify if making a check to
   1265                         the validity of cblocks parameters is selected from user (-W) */
   1266 
   1267                                 /* let's check that we are not exceeding */
   1268                                 if ((l_cblk->len + l_seg->newlen) > 8192) {
   1269                                         opj_event_msg(p_t2->cinfo, EVT_WARNING,
   1270                                                 "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1271                                                 l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1272                                         if (!JPWL_ASSUME) {
   1273                                                 opj_event_msg(p_t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
   1274                                                 return -999;
   1275                                         }
   1276                                         l_seg->newlen = 8192 - l_cblk->len;
   1277                                         opj_event_msg(p_t2->cinfo, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
   1278                                         break;
   1279                                 };
   1280 
   1281 #endif /* USE_JPWL */
   1282                                         JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read, l_seg->newlen );
   1283                                 *(p_data_read) += l_seg->newlen;
   1284 
   1285                                 l_seg->numpasses += l_seg->numnewpasses;
   1286                                 l_cblk->numnewpasses -= l_seg->numnewpasses;
   1287                                 if (l_cblk->numnewpasses > 0)
   1288                                 {
   1289                                         ++l_seg;
   1290                                         ++l_cblk->numsegs;
   1291                                 }
   1292                         } while (l_cblk->numnewpasses > 0);
   1293 
   1294                         ++l_cblk;
   1295                 }
   1296 
   1297                 ++l_band;
   1298         }
   1299 
   1300         return OPJ_TRUE;
   1301 }
   1302 
   1303 
   1304 OPJ_BOOL opj_t2_init_seg(   opj_tcd_cblk_dec_t* cblk,
   1305                             OPJ_UINT32 index,
   1306                             OPJ_UINT32 cblksty,
   1307                             OPJ_UINT32 first)
   1308 {
   1309         opj_tcd_seg_t* seg = 00;
   1310         OPJ_UINT32 l_nb_segs = index + 1;
   1311 
   1312         if (l_nb_segs > cblk->m_current_max_segs) {
   1313                 opj_tcd_seg_t* new_segs;
   1314                 cblk->m_current_max_segs += OPJ_J2K_DEFAULT_NB_SEGS;
   1315 
   1316                 new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, cblk->m_current_max_segs * sizeof(opj_tcd_seg_t));
   1317                 if(! new_segs) {
   1318                         opj_free(cblk->segs);
   1319                         cblk->segs = NULL;
   1320                         cblk->m_current_max_segs = 0;
   1321                         /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
   1322                         return OPJ_FALSE;
   1323                 }
   1324                 cblk->segs = new_segs;
   1325         }
   1326 
   1327         seg = &cblk->segs[index];
   1328         memset(seg,0,sizeof(opj_tcd_seg_t));
   1329 
   1330         if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
   1331                 seg->maxpasses = 1;
   1332         }
   1333         else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
   1334                 if (first) {
   1335                         seg->maxpasses = 10;
   1336                 } else {
   1337                         seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;
   1338                 }
   1339         } else {
   1340                 seg->maxpasses = 109;
   1341         }
   1342 
   1343         return OPJ_TRUE;
   1344 }
   1345