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