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->rsiz == OPJ_PROFILE_CINEMA_4K)? 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                                 if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
    246                                     /* TODO ADE : add an error */
    247                                     opj_pi_destroy(l_pi, l_nb_pocs);
    248                                     return OPJ_FALSE;
    249                                 }
    250                                 while (opj_pi_next(l_current_pi)) {
    251                                         if (l_current_pi->layno < p_maxlayers) {
    252                                                 l_nb_bytes = 0;
    253 
    254                                                 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)) {
    255                                                         opj_pi_destroy(l_pi, l_nb_pocs);
    256                                                         return OPJ_FALSE;
    257                                                 }
    258 
    259                                                 l_comp_len += l_nb_bytes;
    260                                                 l_current_data += l_nb_bytes;
    261                                                 p_max_len -= l_nb_bytes;
    262 
    263                                                 * p_data_written += l_nb_bytes;
    264                                         }
    265                                 }
    266 
    267                                 if (l_cp->m_specific_param.m_enc.m_max_comp_size) {
    268                                         if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {
    269                                                 opj_pi_destroy(l_pi, l_nb_pocs);
    270                                                 return OPJ_FALSE;
    271                                         }
    272                                 }
    273 
    274                                 ++l_current_pi;
    275                         }
    276                 }
    277         }
    278         else {  /* t2_mode == FINAL_PASS  */
    279                 opj_pi_create_encode(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode);
    280 
    281                 l_current_pi = &l_pi[p_pino];
    282                 if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
    283                     /* TODO ADE : add an error */
    284                     opj_pi_destroy(l_pi, l_nb_pocs);
    285                     return OPJ_FALSE;
    286                 }
    287                 while (opj_pi_next(l_current_pi)) {
    288                         if (l_current_pi->layno < p_maxlayers) {
    289                                 l_nb_bytes=0;
    290 
    291                                 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)) {
    292                                         opj_pi_destroy(l_pi, l_nb_pocs);
    293                                         return OPJ_FALSE;
    294                                 }
    295 
    296                                 l_current_data += l_nb_bytes;
    297                                 p_max_len -= l_nb_bytes;
    298 
    299                                 * p_data_written += l_nb_bytes;
    300 
    301                                 /* INDEX >> */
    302                                 if(cstr_info) {
    303                                         if(cstr_info->index_write) {
    304                                                 opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];
    305                                                 opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
    306                                                 if (!cstr_info->packno) {
    307                                                         info_PK->start_pos = info_TL->end_header + 1;
    308                                                 } else {
    309                                                         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;
    310                                                 }
    311                                                 info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;
    312                                                 info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance
    313                                                                                                                                                                                                                                                    to start of packet is incremented by value of start of packet*/
    314                                         }
    315 
    316                                         cstr_info->packno++;
    317                                 }
    318                                 /* << INDEX */
    319                                 ++p_tile->packno;
    320                         }
    321                 }
    322         }
    323 
    324         opj_pi_destroy(l_pi, l_nb_pocs);
    325 
    326         return OPJ_TRUE;
    327 }
    328 
    329 /* see issue 80 */
    330 #if 0
    331 #define JAS_FPRINTF fprintf
    332 #else
    333 /* issue 290 */
    334 static void opj_null_jas_fprintf(FILE* file, const char * format, ...)
    335 {
    336   (void)file;
    337   (void)format;
    338 }
    339 #define JAS_FPRINTF opj_null_jas_fprintf
    340 #endif
    341 
    342 OPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2,
    343                                 OPJ_UINT32 p_tile_no,
    344                                 opj_tcd_tile_t *p_tile,
    345                                 OPJ_BYTE *p_src,
    346                                 OPJ_UINT32 * p_data_read,
    347                                 OPJ_UINT32 p_max_len,
    348                                 opj_codestream_index_t *p_cstr_index)
    349 {
    350         OPJ_BYTE *l_current_data = p_src;
    351         opj_pi_iterator_t *l_pi = 00;
    352         OPJ_UINT32 pino;
    353         opj_image_t *l_image = p_t2->image;
    354         opj_cp_t *l_cp = p_t2->cp;
    355         opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);
    356         OPJ_UINT32 l_nb_bytes_read;
    357         OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
    358         opj_pi_iterator_t *l_current_pi = 00;
    359 #ifdef TODO_MSD
    360         OPJ_UINT32 curtp = 0;
    361         OPJ_UINT32 tp_start_packno;
    362 #endif
    363         opj_packet_info_t *l_pack_info = 00;
    364         opj_image_comp_t* l_img_comp = 00;
    365 
    366         OPJ_ARG_NOT_USED(p_cstr_index);
    367 
    368 #ifdef TODO_MSD
    369         if (p_cstr_index) {
    370                 l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;
    371         }
    372 #endif
    373 
    374         /* create a packet iterator */
    375         l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no);
    376         if (!l_pi) {
    377                 return OPJ_FALSE;
    378         }
    379 
    380 
    381         l_current_pi = l_pi;
    382 
    383         for     (pino = 0; pino <= l_tcp->numpocs; ++pino) {
    384 
    385                 /* if the resolution needed is too low, one dim of the tilec could be equal to zero
    386                  * and no packets are used to decode this resolution and
    387                  * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions
    388                  * and no l_img_comp->resno_decoded are computed
    389                  */
    390                 OPJ_BOOL* first_pass_failed = NULL;
    391 
    392                 if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
    393                     /* TODO ADE : add an error */
    394                     opj_pi_destroy(l_pi, l_nb_pocs);
    395                     return OPJ_FALSE;
    396                 }
    397 
    398                 first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));
    399                 if (!first_pass_failed)
    400                 {
    401                     opj_pi_destroy(l_pi,l_nb_pocs);
    402                     return OPJ_FALSE;
    403                 }
    404                 memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));
    405 
    406                 while (opj_pi_next(l_current_pi)) {
    407                   JAS_FPRINTF( stderr, "packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\n\n",
    408                     l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno, l_current_pi->precno, l_current_pi->layno );
    409 
    410                         if (l_tcp->num_layers_to_decode > l_current_pi->layno
    411                                         && l_current_pi->resno < p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {
    412                                 l_nb_bytes_read = 0;
    413 
    414                                 first_pass_failed[l_current_pi->compno] = OPJ_FALSE;
    415 
    416                                 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)) {
    417                                         opj_pi_destroy(l_pi,l_nb_pocs);
    418                                         opj_free(first_pass_failed);
    419                                         return OPJ_FALSE;
    420                                 }
    421 
    422                                 l_img_comp = &(l_image->comps[l_current_pi->compno]);
    423                                 l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno, l_img_comp->resno_decoded);
    424                         }
    425                         else {
    426                                 l_nb_bytes_read = 0;
    427                                 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)) {
    428                                         opj_pi_destroy(l_pi,l_nb_pocs);
    429                                         opj_free(first_pass_failed);
    430                                         return OPJ_FALSE;
    431                                 }
    432                         }
    433 
    434                         if (first_pass_failed[l_current_pi->compno]) {
    435                                 l_img_comp = &(l_image->comps[l_current_pi->compno]);
    436                                 if (l_img_comp->resno_decoded == 0)
    437                                         l_img_comp->resno_decoded = p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;
    438                         }
    439 
    440                         l_current_data += l_nb_bytes_read;
    441                         p_max_len -= l_nb_bytes_read;
    442 
    443                         /* INDEX >> */
    444 #ifdef TODO_MSD
    445                         if(p_cstr_info) {
    446                                 opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
    447                                 opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
    448                                 tp_start_packno = 0;
    449                                 if (!p_cstr_info->packno) {
    450                                         info_PK->start_pos = info_TL->end_header + 1;
    451                                 } 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 */
    452                                         info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part */
    453                                         tp_start_packno = p_cstr_info->packno;
    454                                         curtp++;
    455                                         info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header+1;
    456                                 } else {
    457                                         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;
    458                                 }
    459                                 info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;
    460                                 info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance */
    461                                 ++p_cstr_info->packno;
    462                         }
    463 #endif
    464                         /* << INDEX */
    465                 }
    466                 ++l_current_pi;
    467 
    468                 opj_free(first_pass_failed);
    469         }
    470         /* INDEX >> */
    471 #ifdef TODO_MSD
    472         if
    473                 (p_cstr_info) {
    474                 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 */
    475         }
    476 #endif
    477         /* << INDEX */
    478 
    479         /* don't forget to release pi */
    480         opj_pi_destroy(l_pi,l_nb_pocs);
    481         *p_data_read = (OPJ_UINT32)(l_current_data - p_src);
    482         return OPJ_TRUE;
    483 }
    484 
    485 /* ----------------------------------------------------------------------- */
    486 
    487 /**
    488  * Creates a Tier 2 handle
    489  *
    490  * @param       p_image         Source or destination image
    491  * @param       p_cp            Image coding parameters.
    492  * @return              a new T2 handle if successful, NULL otherwise.
    493 */
    494 opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp)
    495 {
    496         /* create the t2 structure */
    497         opj_t2_t *l_t2 = (opj_t2_t*)opj_calloc(1,sizeof(opj_t2_t));
    498         if (!l_t2) {
    499                 return NULL;
    500         }
    501 
    502         l_t2->image = p_image;
    503         l_t2->cp = p_cp;
    504 
    505         return l_t2;
    506 }
    507 
    508 void opj_t2_destroy(opj_t2_t *t2) {
    509         if(t2) {
    510                 opj_free(t2);
    511         }
    512 }
    513 
    514 OPJ_BOOL opj_t2_decode_packet(  opj_t2_t* p_t2,
    515                                 opj_tcd_tile_t *p_tile,
    516                                 opj_tcp_t *p_tcp,
    517                                 opj_pi_iterator_t *p_pi,
    518                                 OPJ_BYTE *p_src,
    519                                 OPJ_UINT32 * p_data_read,
    520                                 OPJ_UINT32 p_max_length,
    521                                 opj_packet_info_t *p_pack_info)
    522 {
    523         OPJ_BOOL l_read_data;
    524         OPJ_UINT32 l_nb_bytes_read = 0;
    525         OPJ_UINT32 l_nb_total_bytes_read = 0;
    526 
    527         *p_data_read = 0;
    528 
    529         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)) {
    530                 return OPJ_FALSE;
    531         }
    532 
    533         p_src += l_nb_bytes_read;
    534         l_nb_total_bytes_read += l_nb_bytes_read;
    535         p_max_length -= l_nb_bytes_read;
    536 
    537         /* we should read data for the packet */
    538         if (l_read_data) {
    539                 l_nb_bytes_read = 0;
    540 
    541                 if (! opj_t2_read_packet_data(p_t2,p_tile,p_pi,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
    542                         return OPJ_FALSE;
    543                 }
    544 
    545                 l_nb_total_bytes_read += l_nb_bytes_read;
    546         }
    547 
    548         *p_data_read = l_nb_total_bytes_read;
    549 
    550         return OPJ_TRUE;
    551 }
    552 
    553 OPJ_BOOL opj_t2_encode_packet(  OPJ_UINT32 tileno,
    554                                 opj_tcd_tile_t * tile,
    555                                 opj_tcp_t * tcp,
    556                                 opj_pi_iterator_t *pi,
    557                                 OPJ_BYTE *dest,
    558                                 OPJ_UINT32 * p_data_written,
    559                                 OPJ_UINT32 length,
    560                                 opj_codestream_info_t *cstr_info)
    561 {
    562         OPJ_UINT32 bandno, cblkno;
    563         OPJ_BYTE* c = dest;
    564         OPJ_UINT32 l_nb_bytes;
    565         OPJ_UINT32 compno = pi->compno;     /* component value */
    566         OPJ_UINT32 resno  = pi->resno;      /* resolution level value */
    567         OPJ_UINT32 precno = pi->precno;     /* precinct value */
    568         OPJ_UINT32 layno  = pi->layno;      /* quality layer value */
    569         OPJ_UINT32 l_nb_blocks;
    570         opj_tcd_band_t *band = 00;
    571         opj_tcd_cblk_enc_t* cblk = 00;
    572         opj_tcd_pass_t *pass = 00;
    573 
    574         opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
    575         opj_tcd_resolution_t *res = &tilec->resolutions[resno];
    576 
    577         opj_bio_t *bio = 00;    /* BIO component */
    578 
    579         /* <SOP 0xff91> */
    580         if (tcp->csty & J2K_CP_CSTY_SOP) {
    581                 c[0] = 255;
    582                 c[1] = 145;
    583                 c[2] = 0;
    584                 c[3] = 4;
    585 #if 0
    586                 c[4] = (tile->packno % 65536) / 256;
    587                 c[5] = (tile->packno % 65536) % 256;
    588 #else
    589                 c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
    590                 c[5] = tile->packno & 0xff;
    591 #endif
    592                 c += 6;
    593                 length -= 6;
    594         }
    595         /* </SOP> */
    596 
    597         if (!layno) {
    598                 band = res->bands;
    599 
    600                 for(bandno = 0; bandno < res->numbands; ++bandno) {
    601                         opj_tcd_precinct_t *prc = &band->precincts[precno];
    602 
    603                         opj_tgt_reset(prc->incltree);
    604                         opj_tgt_reset(prc->imsbtree);
    605 
    606                         l_nb_blocks = prc->cw * prc->ch;
    607                         for     (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
    608                                 cblk = &prc->cblks.enc[cblkno];
    609 
    610                                 cblk->numpasses = 0;
    611                                 opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
    612                         }
    613                         ++band;
    614                 }
    615         }
    616 
    617         bio = opj_bio_create();
    618         if (!bio) {
    619                 /* FIXME event manager error callback */
    620                 return OPJ_FALSE;
    621         }
    622         opj_bio_init_enc(bio, c, length);
    623         opj_bio_write(bio, 1, 1);           /* Empty header bit */
    624 
    625         /* Writing Packet header */
    626         band = res->bands;
    627         for (bandno = 0; bandno < res->numbands; ++bandno)      {
    628                 opj_tcd_precinct_t *prc = &band->precincts[precno];
    629 
    630                 l_nb_blocks = prc->cw * prc->ch;
    631                 cblk = prc->cblks.enc;
    632 
    633                 for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
    634                         opj_tcd_layer_t *layer = &cblk->layers[layno];
    635 
    636                         if (!cblk->numpasses && layer->numpasses) {
    637                                 opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
    638                         }
    639 
    640                         ++cblk;
    641                 }
    642 
    643                 cblk = prc->cblks.enc;
    644                 for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
    645                         opj_tcd_layer_t *layer = &cblk->layers[layno];
    646                         OPJ_UINT32 increment = 0;
    647                         OPJ_UINT32 nump = 0;
    648                         OPJ_UINT32 len = 0, passno;
    649                         OPJ_UINT32 l_nb_passes;
    650 
    651                         /* cblk inclusion bits */
    652                         if (!cblk->numpasses) {
    653                                 opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
    654                         } else {
    655                                 opj_bio_write(bio, layer->numpasses != 0, 1);
    656                         }
    657 
    658                         /* if cblk not included, go to the next cblk  */
    659                         if (!layer->numpasses) {
    660                                 ++cblk;
    661                                 continue;
    662                         }
    663 
    664                         /* if first instance of cblk --> zero bit-planes information */
    665                         if (!cblk->numpasses) {
    666                                 cblk->numlenbits = 3;
    667                                 opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
    668                         }
    669 
    670                         /* number of coding passes included */
    671                         opj_t2_putnumpasses(bio, layer->numpasses);
    672                         l_nb_passes = cblk->numpasses + layer->numpasses;
    673                         pass = cblk->passes +  cblk->numpasses;
    674 
    675                         /* computation of the increase of the length indicator and insertion in the header     */
    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                                   increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment, opj_int_floorlog2((OPJ_INT32)len) + 1
    682                                     - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
    683                                         len = 0;
    684                                         nump = 0;
    685                                 }
    686 
    687                                 ++pass;
    688                         }
    689                         opj_t2_putcommacode(bio, (OPJ_INT32)increment);
    690 
    691                         /* computation of the new Length indicator */
    692                         cblk->numlenbits += increment;
    693 
    694                         pass = cblk->passes +  cblk->numpasses;
    695                         /* insertion of the codeword segment length */
    696                         for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
    697                                 nump++;
    698                                 len += pass->len;
    699 
    700                                 if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
    701                                         opj_bio_write(bio, (OPJ_UINT32)len, cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
    702                                         len = 0;
    703                                         nump = 0;
    704                                 }
    705                                 ++pass;
    706                         }
    707 
    708                         ++cblk;
    709                 }
    710 
    711                 ++band;
    712         }
    713 
    714         if (!opj_bio_flush(bio)) {
    715                 opj_bio_destroy(bio);
    716                 return OPJ_FALSE;               /* modified to eliminate longjmp !! */
    717         }
    718 
    719         l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
    720         c += l_nb_bytes;
    721         length -= l_nb_bytes;
    722 
    723         opj_bio_destroy(bio);
    724 
    725         /* <EPH 0xff92> */
    726         if (tcp->csty & J2K_CP_CSTY_EPH) {
    727                 c[0] = 255;
    728                 c[1] = 146;
    729                 c += 2;
    730                 length -= 2;
    731         }
    732         /* </EPH> */
    733 
    734         /* << INDEX */
    735         /* End of packet header position. Currently only represents the distance to start of packet
    736            Will be updated later by incrementing with packet start value*/
    737         if(cstr_info && cstr_info->index_write) {
    738                 opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
    739                 info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
    740         }
    741         /* INDEX >> */
    742 
    743         /* Writing the packet body */
    744         band = res->bands;
    745         for (bandno = 0; bandno < res->numbands; bandno++) {
    746                 opj_tcd_precinct_t *prc = &band->precincts[precno];
    747 
    748                 l_nb_blocks = prc->cw * prc->ch;
    749                 cblk = prc->cblks.enc;
    750 
    751                 for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
    752                         opj_tcd_layer_t *layer = &cblk->layers[layno];
    753 
    754                         if (!layer->numpasses) {
    755                                 ++cblk;
    756                                 continue;
    757                         }
    758 
    759                         if (layer->len > length) {
    760                                 return OPJ_FALSE;
    761                         }
    762 
    763                         memcpy(c, layer->data, layer->len);
    764                         cblk->numpasses += layer->numpasses;
    765                         c += layer->len;
    766                         length -= layer->len;
    767 
    768                         /* << INDEX */
    769                         if(cstr_info && cstr_info->index_write) {
    770                                 opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
    771                                 info_PK->disto += layer->disto;
    772                                 if (cstr_info->D_max < info_PK->disto) {
    773                                         cstr_info->D_max = info_PK->disto;
    774                                 }
    775                         }
    776 
    777                         ++cblk;
    778                         /* INDEX >> */
    779                 }
    780                 ++band;
    781         }
    782 
    783         assert( c >= dest );
    784         * p_data_written += (OPJ_UINT32)(c - dest);
    785 
    786         return OPJ_TRUE;
    787 }
    788 
    789 static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
    790                                     opj_tcd_tile_t *p_tile,
    791                                     opj_tcp_t *p_tcp,
    792                                     opj_pi_iterator_t *p_pi,
    793                                     OPJ_BYTE *p_src,
    794                                     OPJ_UINT32 * p_data_read,
    795                                     OPJ_UINT32 p_max_length,
    796                                     opj_packet_info_t *p_pack_info)
    797 {
    798         OPJ_BOOL l_read_data;
    799         OPJ_UINT32 l_nb_bytes_read = 0;
    800         OPJ_UINT32 l_nb_total_bytes_read = 0;
    801 
    802         *p_data_read = 0;
    803 
    804         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)) {
    805                 return OPJ_FALSE;
    806         }
    807 
    808         p_src += l_nb_bytes_read;
    809         l_nb_total_bytes_read += l_nb_bytes_read;
    810         p_max_length -= l_nb_bytes_read;
    811 
    812         /* we should read data for the packet */
    813         if (l_read_data) {
    814                 l_nb_bytes_read = 0;
    815 
    816                 if (! opj_t2_skip_packet_data(p_t2,p_tile,p_pi,&l_nb_bytes_read,p_max_length,p_pack_info)) {
    817                         return OPJ_FALSE;
    818                 }
    819 
    820                 l_nb_total_bytes_read += l_nb_bytes_read;
    821         }
    822         *p_data_read = l_nb_total_bytes_read;
    823 
    824         return OPJ_TRUE;
    825 }
    826 
    827 
    828 OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,
    829                                     opj_tcd_tile_t *p_tile,
    830                                     opj_tcp_t *p_tcp,
    831                                     opj_pi_iterator_t *p_pi,
    832                                     OPJ_BOOL * p_is_data_present,
    833                                     OPJ_BYTE *p_src_data,
    834                                     OPJ_UINT32 * p_data_read,
    835                                     OPJ_UINT32 p_max_length,
    836                                     opj_packet_info_t *p_pack_info)
    837 
    838 {
    839         /* loop */
    840         OPJ_UINT32 bandno, cblkno;
    841         OPJ_UINT32 l_nb_code_blocks;
    842         OPJ_UINT32 l_remaining_length;
    843         OPJ_UINT32 l_header_length;
    844         OPJ_UINT32 * l_modified_length_ptr = 00;
    845         OPJ_BYTE *l_current_data = p_src_data;
    846         opj_cp_t *l_cp = p_t2->cp;
    847         opj_bio_t *l_bio = 00;  /* BIO component */
    848         opj_tcd_band_t *l_band = 00;
    849         opj_tcd_cblk_dec_t* l_cblk = 00;
    850         opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
    851 
    852         OPJ_BYTE *l_header_data = 00;
    853         OPJ_BYTE **l_header_data_start = 00;
    854 
    855         OPJ_UINT32 l_present;
    856 
    857         if (p_pi->layno == 0) {
    858                 l_band = l_res->bands;
    859 
    860                 /* reset tagtrees */
    861                 for (bandno = 0; bandno < l_res->numbands; ++bandno) {
    862                         opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
    863 
    864                         if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {
    865                                 opj_tgt_reset(l_prc->incltree);
    866                                 opj_tgt_reset(l_prc->imsbtree);
    867                                 l_cblk = l_prc->cblks.dec;
    868 
    869                                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
    870                                 for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
    871                                         l_cblk->numsegs = 0;
    872                                         l_cblk->real_num_segs = 0;
    873                                         ++l_cblk;
    874                                 }
    875                         }
    876 
    877                         ++l_band;
    878                 }
    879         }
    880 
    881         /* SOP markers */
    882 
    883         if (p_tcp->csty & J2K_CP_CSTY_SOP) {
    884                 if (p_max_length < 6) {
    885                         /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Not enough space for expected SOP marker\n"); */
    886                         fprintf(stderr, "Not enough space for expected SOP marker\n");
    887                 } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
    888                         /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Expected SOP marker\n"); */
    889                         fprintf(stderr, "Warning: expected SOP marker\n");
    890                 } else {
    891                         l_current_data += 6;
    892                 }
    893 
    894                 /** TODO : check the Nsop value */
    895         }
    896 
    897         /*
    898         When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
    899         This part deal with this caracteristic
    900         step 1: Read packet header in the saved structure
    901         step 2: Return to codestream for decoding
    902         */
    903 
    904         l_bio = opj_bio_create();
    905         if (! l_bio) {
    906                 return OPJ_FALSE;
    907         }
    908 
    909         if (l_cp->ppm == 1) { /* PPM */
    910                 l_header_data_start = &l_cp->ppm_data;
    911                 l_header_data = *l_header_data_start;
    912                 l_modified_length_ptr = &(l_cp->ppm_len);
    913 
    914         }
    915         else if (p_tcp->ppt == 1) { /* PPT */
    916                 l_header_data_start = &(p_tcp->ppt_data);
    917                 l_header_data = *l_header_data_start;
    918                 l_modified_length_ptr = &(p_tcp->ppt_len);
    919         }
    920         else {  /* Normal Case */
    921                 l_header_data_start = &(l_current_data);
    922                 l_header_data = *l_header_data_start;
    923                 l_remaining_length = (OPJ_UINT32)(p_src_data+p_max_length-l_header_data);
    924                 l_modified_length_ptr = &(l_remaining_length);
    925         }
    926 
    927         opj_bio_init_dec(l_bio, l_header_data,*l_modified_length_ptr);
    928 
    929         l_present = opj_bio_read(l_bio, 1);
    930         JAS_FPRINTF(stderr, "present=%d \n", l_present );
    931         if (!l_present) {
    932             /* TODO MSD: no test to control the output of this function*/
    933                 opj_bio_inalign(l_bio);
    934                 l_header_data += opj_bio_numbytes(l_bio);
    935                 opj_bio_destroy(l_bio);
    936 
    937                 /* EPH markers */
    938                 if (p_tcp->csty & J2K_CP_CSTY_EPH) {
    939                         if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data - *l_header_data_start)) < 2U) {
    940                                 fprintf(stderr, "Not enough space for expected EPH marker\n");
    941                         } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
    942                                 fprintf(stderr, "Error : expected EPH marker\n");
    943                         } else {
    944                                 l_header_data += 2;
    945                         }
    946                 }
    947 
    948                 l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
    949                 *l_modified_length_ptr -= l_header_length;
    950                 *l_header_data_start += l_header_length;
    951 
    952                 /* << INDEX */
    953                 /* End of packet header position. Currently only represents the distance to start of packet
    954                    Will be updated later by incrementing with packet start value */
    955                 if (p_pack_info) {
    956                         p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
    957                 }
    958                 /* INDEX >> */
    959 
    960                 * p_is_data_present = OPJ_FALSE;
    961                 *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
    962                 return OPJ_TRUE;
    963         }
    964 
    965         l_band = l_res->bands;
    966         for (bandno = 0; bandno < l_res->numbands; ++bandno) {
    967                 opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
    968 
    969                 if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
    970                         ++l_band;
    971                         continue;
    972                 }
    973 
    974                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
    975                 l_cblk = l_prc->cblks.dec;
    976                 for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
    977                         OPJ_UINT32 l_included,l_increment, l_segno;
    978                         OPJ_INT32 n;
    979 
    980                         /* if cblk not yet included before --> inclusion tagtree */
    981                         if (!l_cblk->numsegs) {
    982                                 l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno, (OPJ_INT32)(p_pi->layno + 1));
    983                                 /* else one bit */
    984                         }
    985                         else {
    986                                 l_included = opj_bio_read(l_bio, 1);
    987                         }
    988 
    989                         /* if cblk not included */
    990                         if (!l_included) {
    991                                 l_cblk->numnewpasses = 0;
    992                                 ++l_cblk;
    993         JAS_FPRINTF(stderr, "included=%d \n", l_included);
    994                                 continue;
    995                         }
    996 
    997                         /* if cblk not yet included --> zero-bitplane tagtree */
    998                         if (!l_cblk->numsegs) {
    999                                 OPJ_UINT32 i = 0;
   1000 
   1001                                 while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
   1002                                         ++i;
   1003                                 }
   1004 
   1005                                 l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
   1006                                 l_cblk->numlenbits = 3;
   1007                         }
   1008 
   1009                         /* number of coding passes */
   1010                         l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
   1011                         l_increment = opj_t2_getcommacode(l_bio);
   1012 
   1013                         /* length indicator increment */
   1014                         l_cblk->numlenbits += l_increment;
   1015                         l_segno = 0;
   1016 
   1017                         if (!l_cblk->numsegs) {
   1018                                 if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
   1019                                         opj_bio_destroy(l_bio);
   1020                                         return OPJ_FALSE;
   1021                                 }
   1022                         }
   1023                         else {
   1024                                 l_segno = l_cblk->numsegs - 1;
   1025                                 if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
   1026                                         ++l_segno;
   1027                                         if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
   1028                                                 opj_bio_destroy(l_bio);
   1029                                                 return OPJ_FALSE;
   1030                                         }
   1031                                 }
   1032                         }
   1033                         n = (OPJ_INT32)l_cblk->numnewpasses;
   1034 
   1035                         do {
   1036                                 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);
   1037                                 l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + opj_uint_floorlog2(l_cblk->segs[l_segno].numnewpasses));
   1038                                         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 );
   1039 
   1040                                 n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
   1041                                 if (n > 0) {
   1042                                         ++l_segno;
   1043 
   1044                                         if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
   1045                                                 opj_bio_destroy(l_bio);
   1046                                                 return OPJ_FALSE;
   1047                                         }
   1048                                 }
   1049                         } while (n > 0);
   1050 
   1051                         ++l_cblk;
   1052                 }
   1053 
   1054                 ++l_band;
   1055         }
   1056 
   1057         if (!opj_bio_inalign(l_bio)) {
   1058                 opj_bio_destroy(l_bio);
   1059                 return OPJ_FALSE;
   1060         }
   1061 
   1062         l_header_data += opj_bio_numbytes(l_bio);
   1063         opj_bio_destroy(l_bio);
   1064 
   1065         /* EPH markers */
   1066         if (p_tcp->csty & J2K_CP_CSTY_EPH) {
   1067                 if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data - *l_header_data_start)) < 2U) {
   1068                         fprintf(stderr, "Not enough space for expected EPH marker\n");
   1069                 } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
   1070                         /* TODO opj_event_msg(t2->cinfo->event_mgr, EVT_ERROR, "Expected EPH marker\n"); */
   1071                         fprintf(stderr, "Error : expected EPH marker\n");
   1072                 } else {
   1073                         l_header_data += 2;
   1074                 }
   1075         }
   1076 
   1077         l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
   1078         JAS_FPRINTF( stderr, "hdrlen=%d \n", l_header_length );
   1079         JAS_FPRINTF( stderr, "packet body\n");
   1080         *l_modified_length_ptr -= l_header_length;
   1081         *l_header_data_start += l_header_length;
   1082 
   1083         /* << INDEX */
   1084         /* End of packet header position. Currently only represents the distance to start of packet
   1085          Will be updated later by incrementing with packet start value */
   1086         if (p_pack_info) {
   1087                 p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
   1088         }
   1089         /* INDEX >> */
   1090 
   1091         *p_is_data_present = OPJ_TRUE;
   1092         *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
   1093 
   1094         return OPJ_TRUE;
   1095 }
   1096 
   1097 OPJ_BOOL opj_t2_read_packet_data(   opj_t2_t* p_t2,
   1098                                     opj_tcd_tile_t *p_tile,
   1099                                     opj_pi_iterator_t *p_pi,
   1100                                     OPJ_BYTE *p_src_data,
   1101                                     OPJ_UINT32 * p_data_read,
   1102                                     OPJ_UINT32 p_max_length,
   1103                                     opj_packet_info_t *pack_info)
   1104 {
   1105         OPJ_UINT32 bandno, cblkno;
   1106         OPJ_UINT32 l_nb_code_blocks;
   1107         OPJ_BYTE *l_current_data = p_src_data;
   1108         opj_tcd_band_t *l_band = 00;
   1109         opj_tcd_cblk_dec_t* l_cblk = 00;
   1110         opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
   1111 
   1112         OPJ_ARG_NOT_USED(p_t2);
   1113         OPJ_ARG_NOT_USED(pack_info);
   1114 
   1115         l_band = l_res->bands;
   1116         for (bandno = 0; bandno < l_res->numbands; ++bandno) {
   1117                 opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
   1118 
   1119                 if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
   1120                         ++l_band;
   1121                         continue;
   1122                 }
   1123 
   1124                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
   1125                 l_cblk = l_prc->cblks.dec;
   1126 
   1127                 for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
   1128                         opj_tcd_seg_t *l_seg = 00;
   1129 
   1130                         if (!l_cblk->numnewpasses) {
   1131                                 /* nothing to do */
   1132                                 ++l_cblk;
   1133                                 continue;
   1134                         }
   1135 
   1136                         if (!l_cblk->numsegs) {
   1137                                 l_seg = l_cblk->segs;
   1138                                 ++l_cblk->numsegs;
   1139                                 l_cblk->data_current_size = 0;
   1140                         }
   1141                         else {
   1142                                 l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
   1143 
   1144                                 if (l_seg->numpasses == l_seg->maxpasses) {
   1145                                         ++l_seg;
   1146                                         ++l_cblk->numsegs;
   1147                                 }
   1148                         }
   1149 
   1150                         do {
   1151                                 /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */
   1152                                 if ((((OPJ_SIZE_T)l_current_data + (OPJ_SIZE_T)l_seg->newlen) < (OPJ_SIZE_T)l_current_data) || (l_current_data + l_seg->newlen > p_src_data + p_max_length)) {
   1153                                         fprintf(stderr, "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1154                                                 l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1155                                         return OPJ_FALSE;
   1156                                 }
   1157 
   1158 #ifdef USE_JPWL
   1159                         /* we need here a j2k handle to verify if making a check to
   1160                         the validity of cblocks parameters is selected from user (-W) */
   1161 
   1162                                 /* let's check that we are not exceeding */
   1163                                 if ((l_cblk->len + l_seg->newlen) > 8192) {
   1164                                         opj_event_msg(p_t2->cinfo, EVT_WARNING,
   1165                                                 "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1166                                                 l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1167                                         if (!JPWL_ASSUME) {
   1168                                                 opj_event_msg(p_t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
   1169                                                 return OPJ_FALSE;
   1170                                         }
   1171                                         l_seg->newlen = 8192 - l_cblk->len;
   1172                                         opj_event_msg(p_t2->cinfo, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
   1173                                         break;
   1174                                 };
   1175 
   1176 #endif /* USE_JPWL */
   1177                                 /* Check possible overflow on size */
   1178                                 if ((l_cblk->data_current_size + l_seg->newlen) < l_cblk->data_current_size) {
   1179                                         fprintf(stderr, "read: segment too long (%d) with current size (%d > %d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1180                                                 l_seg->newlen, l_cblk->data_current_size, 0xFFFFFFFF - l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1181                                         return OPJ_FALSE;
   1182                                 }
   1183                                 /* Check if the cblk->data have allocated enough memory */
   1184                                 if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) {
   1185                                     OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen);
   1186                                     if(! new_cblk_data) {
   1187                                         opj_free(l_cblk->data);
   1188                                         l_cblk->data = NULL;
   1189                                         l_cblk->data_max_size = 0;
   1190                                         /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to realloc code block cata!\n"); */
   1191                                         return OPJ_FALSE;
   1192                                     }
   1193                                     l_cblk->data_max_size = l_cblk->data_current_size + l_seg->newlen;
   1194                                     l_cblk->data = new_cblk_data;
   1195                                 }
   1196 
   1197                                 memcpy(l_cblk->data + l_cblk->data_current_size, l_current_data, l_seg->newlen);
   1198 
   1199                                 if (l_seg->numpasses == 0) {
   1200                                         l_seg->data = &l_cblk->data;
   1201                                         l_seg->dataindex = l_cblk->data_current_size;
   1202                                 }
   1203 
   1204                                 l_current_data += l_seg->newlen;
   1205                                 l_seg->numpasses += l_seg->numnewpasses;
   1206                                 l_cblk->numnewpasses -= l_seg->numnewpasses;
   1207 
   1208                                 l_seg->real_num_passes = l_seg->numpasses;
   1209                                 l_cblk->data_current_size += l_seg->newlen;
   1210                                 l_seg->len += l_seg->newlen;
   1211 
   1212                                 if (l_cblk->numnewpasses > 0) {
   1213                                         ++l_seg;
   1214                                         ++l_cblk->numsegs;
   1215                                 }
   1216                         } while (l_cblk->numnewpasses > 0);
   1217 
   1218                         l_cblk->real_num_segs = l_cblk->numsegs;
   1219                         ++l_cblk;
   1220                 } /* next code_block */
   1221 
   1222                 ++l_band;
   1223         }
   1224 
   1225         *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
   1226 
   1227 
   1228         return OPJ_TRUE;
   1229 }
   1230 
   1231 OPJ_BOOL opj_t2_skip_packet_data(   opj_t2_t* p_t2,
   1232                                     opj_tcd_tile_t *p_tile,
   1233                                     opj_pi_iterator_t *p_pi,
   1234                                     OPJ_UINT32 * p_data_read,
   1235                                     OPJ_UINT32 p_max_length,
   1236                                     opj_packet_info_t *pack_info)
   1237 {
   1238         OPJ_UINT32 bandno, cblkno;
   1239         OPJ_UINT32 l_nb_code_blocks;
   1240         opj_tcd_band_t *l_band = 00;
   1241         opj_tcd_cblk_dec_t* l_cblk = 00;
   1242         opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
   1243 
   1244         OPJ_ARG_NOT_USED(p_t2);
   1245         OPJ_ARG_NOT_USED(pack_info);
   1246 
   1247         *p_data_read = 0;
   1248         l_band = l_res->bands;
   1249 
   1250         for (bandno = 0; bandno < l_res->numbands; ++bandno) {
   1251                 opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
   1252 
   1253                 if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
   1254                         ++l_band;
   1255                         continue;
   1256                 }
   1257 
   1258                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
   1259                 l_cblk = l_prc->cblks.dec;
   1260 
   1261                 for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
   1262                         opj_tcd_seg_t *l_seg = 00;
   1263 
   1264                         if (!l_cblk->numnewpasses) {
   1265                                 /* nothing to do */
   1266                                 ++l_cblk;
   1267                                 continue;
   1268                         }
   1269 
   1270                         if (!l_cblk->numsegs) {
   1271                                 l_seg = l_cblk->segs;
   1272                                 ++l_cblk->numsegs;
   1273                                 l_cblk->data_current_size = 0;
   1274                         }
   1275                         else {
   1276                                 l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
   1277 
   1278                                 if (l_seg->numpasses == l_seg->maxpasses) {
   1279                                         ++l_seg;
   1280                                         ++l_cblk->numsegs;
   1281                                 }
   1282                         }
   1283 
   1284                         do {
   1285                                 /* Check possible overflow then size */
   1286                                 if (((*p_data_read + l_seg->newlen) < (*p_data_read)) || ((*p_data_read + l_seg->newlen) > p_max_length)) {
   1287                                         fprintf(stderr, "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1288                                                 l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1289                                         return OPJ_FALSE;
   1290                                 }
   1291 
   1292 #ifdef USE_JPWL
   1293                         /* we need here a j2k handle to verify if making a check to
   1294                         the validity of cblocks parameters is selected from user (-W) */
   1295 
   1296                                 /* let's check that we are not exceeding */
   1297                                 if ((l_cblk->len + l_seg->newlen) > 8192) {
   1298                                         opj_event_msg(p_t2->cinfo, EVT_WARNING,
   1299                                                 "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
   1300                                                 l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
   1301                                         if (!JPWL_ASSUME) {
   1302                                                 opj_event_msg(p_t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
   1303                                                 return -999;
   1304                                         }
   1305                                         l_seg->newlen = 8192 - l_cblk->len;
   1306                                         opj_event_msg(p_t2->cinfo, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
   1307                                         break;
   1308                                 };
   1309 
   1310 #endif /* USE_JPWL */
   1311                                         JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read, l_seg->newlen );
   1312                                 *(p_data_read) += l_seg->newlen;
   1313 
   1314                                 l_seg->numpasses += l_seg->numnewpasses;
   1315                                 l_cblk->numnewpasses -= l_seg->numnewpasses;
   1316                                 if (l_cblk->numnewpasses > 0)
   1317                                 {
   1318                                         ++l_seg;
   1319                                         ++l_cblk->numsegs;
   1320                                 }
   1321                         } while (l_cblk->numnewpasses > 0);
   1322 
   1323                         ++l_cblk;
   1324                 }
   1325 
   1326                 ++l_band;
   1327         }
   1328 
   1329         return OPJ_TRUE;
   1330 }
   1331 
   1332 
   1333 OPJ_BOOL opj_t2_init_seg(   opj_tcd_cblk_dec_t* cblk,
   1334                             OPJ_UINT32 index,
   1335                             OPJ_UINT32 cblksty,
   1336                             OPJ_UINT32 first)
   1337 {
   1338         opj_tcd_seg_t* seg = 00;
   1339         OPJ_UINT32 l_nb_segs = index + 1;
   1340 
   1341         if (l_nb_segs > cblk->m_current_max_segs) {
   1342                 opj_tcd_seg_t* new_segs;
   1343                 cblk->m_current_max_segs += OPJ_J2K_DEFAULT_NB_SEGS;
   1344 
   1345                 new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, cblk->m_current_max_segs * sizeof(opj_tcd_seg_t));
   1346                 if(! new_segs) {
   1347                         opj_free(cblk->segs);
   1348                         cblk->segs = NULL;
   1349                         cblk->m_current_max_segs = 0;
   1350                         /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
   1351                         return OPJ_FALSE;
   1352                 }
   1353                 cblk->segs = new_segs;
   1354         }
   1355 
   1356         seg = &cblk->segs[index];
   1357         memset(seg,0,sizeof(opj_tcd_seg_t));
   1358 
   1359         if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
   1360                 seg->maxpasses = 1;
   1361         }
   1362         else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
   1363                 if (first) {
   1364                         seg->maxpasses = 10;
   1365                 } else {
   1366                         seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;
   1367                 }
   1368         } else {
   1369                 seg->maxpasses = 109;
   1370         }
   1371 
   1372         return OPJ_TRUE;
   1373 }
   1374