struct opj_j2k: remove unused fields, and add some documentation
[openjpeg.git] / src / lib / openjp2 / t2.c
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@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 #ifdef ENABLE_EMPTY_PACKET_OPTIMIZATION
671     OPJ_BOOL packet_empty = OPJ_TRUE;
672 #else
673     OPJ_BOOL packet_empty = OPJ_FALSE;
674 #endif
675
676 #ifdef DEBUG_VERBOSE
677     if (p_t2_mode == FINAL_PASS) {
678         fprintf(stderr,
679                 "encode packet compono=%d, resno=%d, precno=%d, layno=%d\n",
680                 compno, resno, precno, layno);
681     }
682 #endif
683
684     /* <SOP 0xff91> */
685     if (tcp->csty & J2K_CP_CSTY_SOP) {
686         if (length < 6) {
687             if (p_t2_mode == FINAL_PASS) {
688                 opj_event_msg(p_manager, EVT_ERROR,
689                               "opj_t2_encode_packet(): only %u bytes remaining in "
690                               "output buffer. %u needed.\n",
691                               length, 6);
692             }
693             return OPJ_FALSE;
694         }
695         c[0] = 255;
696         c[1] = 145;
697         c[2] = 0;
698         c[3] = 4;
699 #if 0
700         c[4] = (tile->packno % 65536) / 256;
701         c[5] = (tile->packno % 65536) % 256;
702 #else
703         c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
704         c[5] = tile->packno & 0xff;
705 #endif
706         c += 6;
707         length -= 6;
708     }
709     /* </SOP> */
710
711     if (!layno) {
712         band = res->bands;
713
714         for (bandno = 0; bandno < res->numbands; ++bandno, ++band) {
715             opj_tcd_precinct_t *prc;
716
717             /* Skip empty bands */
718             if (opj_tcd_is_band_empty(band)) {
719                 continue;
720             }
721
722             prc = &band->precincts[precno];
723             opj_tgt_reset(prc->incltree);
724             opj_tgt_reset(prc->imsbtree);
725
726             l_nb_blocks = prc->cw * prc->ch;
727             for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
728                 cblk = &prc->cblks.enc[cblkno];
729
730                 cblk->numpasses = 0;
731                 opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
732             }
733         }
734     }
735
736     bio = opj_bio_create();
737     if (!bio) {
738         /* FIXME event manager error callback */
739         return OPJ_FALSE;
740     }
741     opj_bio_init_enc(bio, c, length);
742
743 #ifdef ENABLE_EMPTY_PACKET_OPTIMIZATION
744     /* WARNING: this code branch is disabled, since it has been reported that */
745     /* such packets cause decoding issues with cinema J2K hardware */
746     /* decoders: https://groups.google.com/forum/#!topic/openjpeg/M7M_fLX_Bco */
747
748     /* Check if the packet is empty */
749     /* Note: we could also skip that step and always write a packet header */
750     band = res->bands;
751     for (bandno = 0; bandno < res->numbands; ++bandno, ++band) {
752         opj_tcd_precinct_t *prc;
753         /* Skip empty bands */
754         if (opj_tcd_is_band_empty(band)) {
755             continue;
756         }
757
758         prc = &band->precincts[precno];
759         l_nb_blocks = prc->cw * prc->ch;
760         cblk = prc->cblks.enc;
761         for (cblkno = 0; cblkno < l_nb_blocks; cblkno++, ++cblk) {
762             opj_tcd_layer_t *layer = &cblk->layers[layno];
763
764             /* if cblk not included, go to the next cblk  */
765             if (!layer->numpasses) {
766                 continue;
767             }
768             packet_empty = OPJ_FALSE;
769             break;
770         }
771         if (!packet_empty) {
772             break;
773         }
774     }
775 #endif
776     opj_bio_write(bio, packet_empty ? 0 : 1, 1);           /* Empty header bit */
777
778     /* Writing Packet header */
779     band = res->bands;
780     for (bandno = 0; !packet_empty &&
781             bandno < res->numbands; ++bandno, ++band)      {
782         opj_tcd_precinct_t *prc;
783
784         /* Skip empty bands */
785         if (opj_tcd_is_band_empty(band)) {
786             continue;
787         }
788
789         prc = &band->precincts[precno];
790         l_nb_blocks = prc->cw * prc->ch;
791         cblk = prc->cblks.enc;
792
793         for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
794             opj_tcd_layer_t *layer = &cblk->layers[layno];
795
796             if (!cblk->numpasses && layer->numpasses) {
797                 opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
798             }
799
800             ++cblk;
801         }
802
803         cblk = prc->cblks.enc;
804         for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
805             opj_tcd_layer_t *layer = &cblk->layers[layno];
806             OPJ_UINT32 increment = 0;
807             OPJ_UINT32 nump = 0;
808             OPJ_UINT32 len = 0, passno;
809             OPJ_UINT32 l_nb_passes;
810
811             /* cblk inclusion bits */
812             if (!cblk->numpasses) {
813                 opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
814             } else {
815                 opj_bio_write(bio, layer->numpasses != 0, 1);
816             }
817
818             /* if cblk not included, go to the next cblk  */
819             if (!layer->numpasses) {
820                 ++cblk;
821                 continue;
822             }
823
824             /* if first instance of cblk --> zero bit-planes information */
825             if (!cblk->numpasses) {
826                 cblk->numlenbits = 3;
827                 opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
828             }
829
830             /* number of coding passes included */
831             opj_t2_putnumpasses(bio, layer->numpasses);
832             l_nb_passes = cblk->numpasses + layer->numpasses;
833             pass = cblk->passes +  cblk->numpasses;
834
835             /* computation of the increase of the length indicator and insertion in the header     */
836             for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
837                 ++nump;
838                 len += pass->len;
839
840                 if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
841                     increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment,
842                                                         opj_int_floorlog2((OPJ_INT32)len) + 1
843                                                         - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
844                     len = 0;
845                     nump = 0;
846                 }
847
848                 ++pass;
849             }
850             opj_t2_putcommacode(bio, (OPJ_INT32)increment);
851
852             /* computation of the new Length indicator */
853             cblk->numlenbits += increment;
854
855             pass = cblk->passes +  cblk->numpasses;
856             /* insertion of the codeword segment length */
857             for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
858                 nump++;
859                 len += pass->len;
860
861                 if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
862                     opj_bio_write(bio, (OPJ_UINT32)len,
863                                   cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
864                     len = 0;
865                     nump = 0;
866                 }
867                 ++pass;
868             }
869
870             ++cblk;
871         }
872     }
873
874     if (!opj_bio_flush(bio)) {
875         opj_bio_destroy(bio);
876         return OPJ_FALSE;               /* modified to eliminate longjmp !! */
877     }
878
879     l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
880     c += l_nb_bytes;
881     length -= l_nb_bytes;
882
883     opj_bio_destroy(bio);
884
885     /* <EPH 0xff92> */
886     if (tcp->csty & J2K_CP_CSTY_EPH) {
887         if (length < 2) {
888             if (p_t2_mode == FINAL_PASS) {
889                 opj_event_msg(p_manager, EVT_ERROR,
890                               "opj_t2_encode_packet(): only %u bytes remaining in "
891                               "output buffer. %u needed.\n",
892                               length, 2);
893             }
894             return OPJ_FALSE;
895         }
896         c[0] = 255;
897         c[1] = 146;
898         c += 2;
899         length -= 2;
900     }
901     /* </EPH> */
902
903     /* << INDEX */
904     /* End of packet header position. Currently only represents the distance to start of packet
905        Will be updated later by incrementing with packet start value*/
906     if (cstr_info && cstr_info->index_write) {
907         opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
908         info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
909     }
910     /* INDEX >> */
911
912     /* Writing the packet body */
913     band = res->bands;
914     for (bandno = 0; !packet_empty && bandno < res->numbands; bandno++, ++band) {
915         opj_tcd_precinct_t *prc;
916
917         /* Skip empty bands */
918         if (opj_tcd_is_band_empty(band)) {
919             continue;
920         }
921
922         prc = &band->precincts[precno];
923         l_nb_blocks = prc->cw * prc->ch;
924         cblk = prc->cblks.enc;
925
926         for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
927             opj_tcd_layer_t *layer = &cblk->layers[layno];
928
929             if (!layer->numpasses) {
930                 ++cblk;
931                 continue;
932             }
933
934             if (layer->len > length) {
935                 if (p_t2_mode == FINAL_PASS) {
936                     opj_event_msg(p_manager, EVT_ERROR,
937                                   "opj_t2_encode_packet(): only %u bytes remaining in "
938                                   "output buffer. %u needed.\n",
939                                   length, layer->len);
940                 }
941                 return OPJ_FALSE;
942             }
943
944             memcpy(c, layer->data, layer->len);
945             cblk->numpasses += layer->numpasses;
946             c += layer->len;
947             length -= layer->len;
948
949             /* << INDEX */
950             if (cstr_info && cstr_info->index_write) {
951                 opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
952                 info_PK->disto += layer->disto;
953                 if (cstr_info->D_max < info_PK->disto) {
954                     cstr_info->D_max = info_PK->disto;
955                 }
956             }
957
958             ++cblk;
959             /* INDEX >> */
960         }
961     }
962
963     assert(c >= dest);
964     * p_data_written += (OPJ_UINT32)(c - dest);
965
966     return OPJ_TRUE;
967 }
968
969 static OPJ_BOOL opj_t2_skip_packet(opj_t2_t* p_t2,
970                                    opj_tcd_tile_t *p_tile,
971                                    opj_tcp_t *p_tcp,
972                                    opj_pi_iterator_t *p_pi,
973                                    OPJ_BYTE *p_src,
974                                    OPJ_UINT32 * p_data_read,
975                                    OPJ_UINT32 p_max_length,
976                                    opj_packet_info_t *p_pack_info,
977                                    opj_event_mgr_t *p_manager)
978 {
979     OPJ_BOOL l_read_data;
980     OPJ_UINT32 l_nb_bytes_read = 0;
981     OPJ_UINT32 l_nb_total_bytes_read = 0;
982
983     *p_data_read = 0;
984
985     if (! opj_t2_read_packet_header(p_t2, p_tile, p_tcp, p_pi, &l_read_data, p_src,
986                                     &l_nb_bytes_read, p_max_length, p_pack_info, p_manager)) {
987         return OPJ_FALSE;
988     }
989
990     p_src += l_nb_bytes_read;
991     l_nb_total_bytes_read += l_nb_bytes_read;
992     p_max_length -= l_nb_bytes_read;
993
994     /* we should read data for the packet */
995     if (l_read_data) {
996         l_nb_bytes_read = 0;
997
998         if (! opj_t2_skip_packet_data(p_t2, p_tile, p_pi, &l_nb_bytes_read,
999                                       p_max_length, p_pack_info, p_manager)) {
1000             return OPJ_FALSE;
1001         }
1002
1003         l_nb_total_bytes_read += l_nb_bytes_read;
1004     }
1005     *p_data_read = l_nb_total_bytes_read;
1006
1007     return OPJ_TRUE;
1008 }
1009
1010
1011 static OPJ_BOOL opj_t2_read_packet_header(opj_t2_t* p_t2,
1012         opj_tcd_tile_t *p_tile,
1013         opj_tcp_t *p_tcp,
1014         opj_pi_iterator_t *p_pi,
1015         OPJ_BOOL * p_is_data_present,
1016         OPJ_BYTE *p_src_data,
1017         OPJ_UINT32 * p_data_read,
1018         OPJ_UINT32 p_max_length,
1019         opj_packet_info_t *p_pack_info,
1020         opj_event_mgr_t *p_manager)
1021
1022 {
1023     /* loop */
1024     OPJ_UINT32 bandno, cblkno;
1025     OPJ_UINT32 l_nb_code_blocks;
1026     OPJ_UINT32 l_remaining_length;
1027     OPJ_UINT32 l_header_length;
1028     OPJ_UINT32 * l_modified_length_ptr = 00;
1029     OPJ_BYTE *l_current_data = p_src_data;
1030     opj_cp_t *l_cp = p_t2->cp;
1031     opj_bio_t *l_bio = 00;  /* BIO component */
1032     opj_tcd_band_t *l_band = 00;
1033     opj_tcd_cblk_dec_t* l_cblk = 00;
1034     opj_tcd_resolution_t* l_res =
1035         &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
1036
1037     OPJ_BYTE *l_header_data = 00;
1038     OPJ_BYTE **l_header_data_start = 00;
1039
1040     OPJ_UINT32 l_present;
1041
1042     if (p_pi->layno == 0) {
1043         l_band = l_res->bands;
1044
1045         /* reset tagtrees */
1046         for (bandno = 0; bandno < l_res->numbands; ++bandno) {
1047             if (!opj_tcd_is_band_empty(l_band)) {
1048                 opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
1049                 if (!(p_pi->precno < (l_band->precincts_data_size / sizeof(
1050                                           opj_tcd_precinct_t)))) {
1051                     opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct\n");
1052                     return OPJ_FALSE;
1053                 }
1054
1055
1056                 opj_tgt_reset(l_prc->incltree);
1057                 opj_tgt_reset(l_prc->imsbtree);
1058                 l_cblk = l_prc->cblks.dec;
1059
1060                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
1061                 for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
1062                     l_cblk->numsegs = 0;
1063                     l_cblk->real_num_segs = 0;
1064                     ++l_cblk;
1065                 }
1066             }
1067
1068             ++l_band;
1069         }
1070     }
1071
1072     /* SOP markers */
1073
1074     if (p_tcp->csty & J2K_CP_CSTY_SOP) {
1075         if (p_max_length < 6) {
1076             opj_event_msg(p_manager, EVT_WARNING,
1077                           "Not enough space for expected SOP marker\n");
1078         } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
1079             opj_event_msg(p_manager, EVT_WARNING, "Expected SOP marker\n");
1080         } else {
1081             l_current_data += 6;
1082         }
1083
1084         /** TODO : check the Nsop value */
1085     }
1086
1087     /*
1088     When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
1089     This part deal with this caracteristic
1090     step 1: Read packet header in the saved structure
1091     step 2: Return to codestream for decoding
1092     */
1093
1094     l_bio = opj_bio_create();
1095     if (! l_bio) {
1096         return OPJ_FALSE;
1097     }
1098
1099     if (l_cp->ppm == 1) { /* PPM */
1100         l_header_data_start = &l_cp->ppm_data;
1101         l_header_data = *l_header_data_start;
1102         l_modified_length_ptr = &(l_cp->ppm_len);
1103
1104     } else if (p_tcp->ppt == 1) { /* PPT */
1105         l_header_data_start = &(p_tcp->ppt_data);
1106         l_header_data = *l_header_data_start;
1107         l_modified_length_ptr = &(p_tcp->ppt_len);
1108     } else { /* Normal Case */
1109         l_header_data_start = &(l_current_data);
1110         l_header_data = *l_header_data_start;
1111         l_remaining_length = (OPJ_UINT32)(p_src_data + p_max_length - l_header_data);
1112         l_modified_length_ptr = &(l_remaining_length);
1113     }
1114
1115     opj_bio_init_dec(l_bio, l_header_data, *l_modified_length_ptr);
1116
1117     l_present = opj_bio_read(l_bio, 1);
1118     JAS_FPRINTF(stderr, "present=%d \n", l_present);
1119     if (!l_present) {
1120         /* TODO MSD: no test to control the output of this function*/
1121         opj_bio_inalign(l_bio);
1122         l_header_data += opj_bio_numbytes(l_bio);
1123         opj_bio_destroy(l_bio);
1124
1125         /* EPH markers */
1126         if (p_tcp->csty & J2K_CP_CSTY_EPH) {
1127             if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data -
1128                     *l_header_data_start)) < 2U) {
1129                 opj_event_msg(p_manager, EVT_WARNING,
1130                               "Not enough space for expected EPH marker\n");
1131             } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
1132                 opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
1133             } else {
1134                 l_header_data += 2;
1135             }
1136         }
1137
1138         l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
1139         *l_modified_length_ptr -= l_header_length;
1140         *l_header_data_start += l_header_length;
1141
1142         /* << INDEX */
1143         /* End of packet header position. Currently only represents the distance to start of packet
1144            Will be updated later by incrementing with packet start value */
1145         if (p_pack_info) {
1146             p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
1147         }
1148         /* INDEX >> */
1149
1150         * p_is_data_present = OPJ_FALSE;
1151         *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
1152         return OPJ_TRUE;
1153     }
1154
1155     l_band = l_res->bands;
1156     for (bandno = 0; bandno < l_res->numbands; ++bandno, ++l_band) {
1157         opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
1158
1159         if (opj_tcd_is_band_empty(l_band)) {
1160             continue;
1161         }
1162
1163         l_nb_code_blocks = l_prc->cw * l_prc->ch;
1164         l_cblk = l_prc->cblks.dec;
1165         for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
1166             OPJ_UINT32 l_included, l_increment, l_segno;
1167             OPJ_INT32 n;
1168
1169             /* if cblk not yet included before --> inclusion tagtree */
1170             if (!l_cblk->numsegs) {
1171                 l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno,
1172                                             (OPJ_INT32)(p_pi->layno + 1));
1173                 /* else one bit */
1174             } else {
1175                 l_included = opj_bio_read(l_bio, 1);
1176             }
1177
1178             /* if cblk not included */
1179             if (!l_included) {
1180                 l_cblk->numnewpasses = 0;
1181                 ++l_cblk;
1182                 JAS_FPRINTF(stderr, "included=%d \n", l_included);
1183                 continue;
1184             }
1185
1186             /* if cblk not yet included --> zero-bitplane tagtree */
1187             if (!l_cblk->numsegs) {
1188                 OPJ_UINT32 i = 0;
1189
1190                 while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
1191                     ++i;
1192                 }
1193
1194                 l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
1195                 l_cblk->numlenbits = 3;
1196             }
1197
1198             /* number of coding passes */
1199             l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
1200             l_increment = opj_t2_getcommacode(l_bio);
1201
1202             /* length indicator increment */
1203             l_cblk->numlenbits += l_increment;
1204             l_segno = 0;
1205
1206             if (!l_cblk->numsegs) {
1207                 if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
1208                     opj_bio_destroy(l_bio);
1209                     return OPJ_FALSE;
1210                 }
1211             } else {
1212                 l_segno = l_cblk->numsegs - 1;
1213                 if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
1214                     ++l_segno;
1215                     if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
1216                         opj_bio_destroy(l_bio);
1217                         return OPJ_FALSE;
1218                     }
1219                 }
1220             }
1221             n = (OPJ_INT32)l_cblk->numnewpasses;
1222
1223             do {
1224                 OPJ_UINT32 bit_number;
1225                 l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(
1226                         l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);
1227                 bit_number = l_cblk->numlenbits + opj_uint_floorlog2(
1228                                  l_cblk->segs[l_segno].numnewpasses);
1229                 if (bit_number > 32) {
1230                     opj_event_msg(p_manager, EVT_ERROR,
1231                                   "Invalid bit number %d in opj_t2_read_packet_header()\n",
1232                                   bit_number);
1233                     opj_bio_destroy(l_bio);
1234                     return OPJ_FALSE;
1235                 }
1236                 l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, bit_number);
1237                 JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n",
1238                             l_included, l_cblk->segs[l_segno].numnewpasses, l_increment,
1239                             l_cblk->segs[l_segno].newlen);
1240
1241                 n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
1242                 if (n > 0) {
1243                     ++l_segno;
1244
1245                     if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
1246                         opj_bio_destroy(l_bio);
1247                         return OPJ_FALSE;
1248                     }
1249                 }
1250             } while (n > 0);
1251
1252             ++l_cblk;
1253         }
1254     }
1255
1256     if (!opj_bio_inalign(l_bio)) {
1257         opj_bio_destroy(l_bio);
1258         return OPJ_FALSE;
1259     }
1260
1261     l_header_data += opj_bio_numbytes(l_bio);
1262     opj_bio_destroy(l_bio);
1263
1264     /* EPH markers */
1265     if (p_tcp->csty & J2K_CP_CSTY_EPH) {
1266         if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data -
1267                 *l_header_data_start)) < 2U) {
1268             opj_event_msg(p_manager, EVT_WARNING,
1269                           "Not enough space for expected EPH marker\n");
1270         } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
1271             opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
1272         } else {
1273             l_header_data += 2;
1274         }
1275     }
1276
1277     l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
1278     JAS_FPRINTF(stderr, "hdrlen=%d \n", l_header_length);
1279     JAS_FPRINTF(stderr, "packet body\n");
1280     *l_modified_length_ptr -= l_header_length;
1281     *l_header_data_start += l_header_length;
1282
1283     /* << INDEX */
1284     /* End of packet header position. Currently only represents the distance to start of packet
1285      Will be updated later by incrementing with packet start value */
1286     if (p_pack_info) {
1287         p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
1288     }
1289     /* INDEX >> */
1290
1291     *p_is_data_present = OPJ_TRUE;
1292     *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
1293
1294     return OPJ_TRUE;
1295 }
1296
1297 static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
1298                                         opj_tcd_tile_t *p_tile,
1299                                         opj_pi_iterator_t *p_pi,
1300                                         OPJ_BYTE *p_src_data,
1301                                         OPJ_UINT32 * p_data_read,
1302                                         OPJ_UINT32 p_max_length,
1303                                         opj_packet_info_t *pack_info,
1304                                         opj_event_mgr_t* p_manager)
1305 {
1306     OPJ_UINT32 bandno, cblkno;
1307     OPJ_UINT32 l_nb_code_blocks;
1308     OPJ_BYTE *l_current_data = p_src_data;
1309     opj_tcd_band_t *l_band = 00;
1310     opj_tcd_cblk_dec_t* l_cblk = 00;
1311     opj_tcd_resolution_t* l_res =
1312         &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
1313
1314     OPJ_ARG_NOT_USED(p_t2);
1315     OPJ_ARG_NOT_USED(pack_info);
1316
1317     l_band = l_res->bands;
1318     for (bandno = 0; bandno < l_res->numbands; ++bandno) {
1319         opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
1320
1321         if ((l_band->x1 - l_band->x0 == 0) || (l_band->y1 - l_band->y0 == 0)) {
1322             ++l_band;
1323             continue;
1324         }
1325
1326         l_nb_code_blocks = l_prc->cw * l_prc->ch;
1327         l_cblk = l_prc->cblks.dec;
1328
1329         for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
1330             opj_tcd_seg_t *l_seg = 00;
1331
1332             if (!l_cblk->numnewpasses) {
1333                 /* nothing to do */
1334                 ++l_cblk;
1335                 continue;
1336             }
1337
1338             if (!l_cblk->numsegs) {
1339                 l_seg = l_cblk->segs;
1340                 ++l_cblk->numsegs;
1341             } else {
1342                 l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
1343
1344                 if (l_seg->numpasses == l_seg->maxpasses) {
1345                     ++l_seg;
1346                     ++l_cblk->numsegs;
1347                 }
1348             }
1349
1350             do {
1351                 /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */
1352                 if ((((OPJ_SIZE_T)l_current_data + (OPJ_SIZE_T)l_seg->newlen) <
1353                         (OPJ_SIZE_T)l_current_data) ||
1354                         (l_current_data + l_seg->newlen > p_src_data + p_max_length)) {
1355                     opj_event_msg(p_manager, EVT_ERROR,
1356                                   "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1357                                   l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1358                                   p_pi->compno);
1359                     return OPJ_FALSE;
1360                 }
1361
1362 #ifdef USE_JPWL
1363                 /* we need here a j2k handle to verify if making a check to
1364                 the validity of cblocks parameters is selected from user (-W) */
1365
1366                 /* let's check that we are not exceeding */
1367                 if ((l_cblk->len + l_seg->newlen) > 8192) {
1368                     opj_event_msg(p_manager, EVT_WARNING,
1369                                   "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1370                                   l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1371                     if (!JPWL_ASSUME) {
1372                         opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
1373                         return OPJ_FALSE;
1374                     }
1375                     l_seg->newlen = 8192 - l_cblk->len;
1376                     opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n",
1377                                   l_seg->newlen);
1378                     break;
1379                 };
1380
1381 #endif /* USE_JPWL */
1382
1383                 if (l_cblk->numchunks == l_cblk->numchunksalloc) {
1384                     OPJ_UINT32 l_numchunksalloc = l_cblk->numchunksalloc * 2 + 1;
1385                     opj_tcd_seg_data_chunk_t* l_chunks =
1386                         (opj_tcd_seg_data_chunk_t*)opj_realloc(l_cblk->chunks,
1387                                 l_numchunksalloc * sizeof(opj_tcd_seg_data_chunk_t));
1388                     if (l_chunks == NULL) {
1389                         opj_event_msg(p_manager, EVT_ERROR,
1390                                       "cannot allocate opj_tcd_seg_data_chunk_t* array");
1391                         return OPJ_FALSE;
1392                     }
1393                     l_cblk->chunks = l_chunks;
1394                     l_cblk->numchunksalloc = l_numchunksalloc;
1395                 }
1396
1397                 l_cblk->chunks[l_cblk->numchunks].data = l_current_data;
1398                 l_cblk->chunks[l_cblk->numchunks].len = l_seg->newlen;
1399                 l_cblk->numchunks ++;
1400
1401                 l_current_data += l_seg->newlen;
1402                 l_seg->len += l_seg->newlen;
1403                 l_seg->numpasses += l_seg->numnewpasses;
1404                 l_cblk->numnewpasses -= l_seg->numnewpasses;
1405
1406                 l_seg->real_num_passes = l_seg->numpasses;
1407
1408                 if (l_cblk->numnewpasses > 0) {
1409                     ++l_seg;
1410                     ++l_cblk->numsegs;
1411                 }
1412             } while (l_cblk->numnewpasses > 0);
1413
1414             l_cblk->real_num_segs = l_cblk->numsegs;
1415             ++l_cblk;
1416         } /* next code_block */
1417
1418         ++l_band;
1419     }
1420
1421     *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
1422
1423
1424     return OPJ_TRUE;
1425 }
1426
1427 static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
1428                                         opj_tcd_tile_t *p_tile,
1429                                         opj_pi_iterator_t *p_pi,
1430                                         OPJ_UINT32 * p_data_read,
1431                                         OPJ_UINT32 p_max_length,
1432                                         opj_packet_info_t *pack_info,
1433                                         opj_event_mgr_t *p_manager)
1434 {
1435     OPJ_UINT32 bandno, cblkno;
1436     OPJ_UINT32 l_nb_code_blocks;
1437     opj_tcd_band_t *l_band = 00;
1438     opj_tcd_cblk_dec_t* l_cblk = 00;
1439     opj_tcd_resolution_t* l_res =
1440         &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
1441
1442     OPJ_ARG_NOT_USED(p_t2);
1443     OPJ_ARG_NOT_USED(pack_info);
1444
1445     *p_data_read = 0;
1446     l_band = l_res->bands;
1447
1448     for (bandno = 0; bandno < l_res->numbands; ++bandno) {
1449         opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
1450
1451         if ((l_band->x1 - l_band->x0 == 0) || (l_band->y1 - l_band->y0 == 0)) {
1452             ++l_band;
1453             continue;
1454         }
1455
1456         l_nb_code_blocks = l_prc->cw * l_prc->ch;
1457         l_cblk = l_prc->cblks.dec;
1458
1459         for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
1460             opj_tcd_seg_t *l_seg = 00;
1461
1462             if (!l_cblk->numnewpasses) {
1463                 /* nothing to do */
1464                 ++l_cblk;
1465                 continue;
1466             }
1467
1468             if (!l_cblk->numsegs) {
1469                 l_seg = l_cblk->segs;
1470                 ++l_cblk->numsegs;
1471             } else {
1472                 l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
1473
1474                 if (l_seg->numpasses == l_seg->maxpasses) {
1475                     ++l_seg;
1476                     ++l_cblk->numsegs;
1477                 }
1478             }
1479
1480             do {
1481                 /* Check possible overflow then size */
1482                 if (((*p_data_read + l_seg->newlen) < (*p_data_read)) ||
1483                         ((*p_data_read + l_seg->newlen) > p_max_length)) {
1484                     opj_event_msg(p_manager, EVT_ERROR,
1485                                   "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1486                                   l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1487                                   p_pi->compno);
1488                     return OPJ_FALSE;
1489                 }
1490
1491 #ifdef USE_JPWL
1492                 /* we need here a j2k handle to verify if making a check to
1493                 the validity of cblocks parameters is selected from user (-W) */
1494
1495                 /* let's check that we are not exceeding */
1496                 if ((l_cblk->len + l_seg->newlen) > 8192) {
1497                     opj_event_msg(p_manager, EVT_WARNING,
1498                                   "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1499                                   l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1500                     if (!JPWL_ASSUME) {
1501                         opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
1502                         return -999;
1503                     }
1504                     l_seg->newlen = 8192 - l_cblk->len;
1505                     opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n",
1506                                   l_seg->newlen);
1507                     break;
1508                 };
1509
1510 #endif /* USE_JPWL */
1511                 JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read,
1512                             l_seg->newlen);
1513                 *(p_data_read) += l_seg->newlen;
1514
1515                 l_seg->numpasses += l_seg->numnewpasses;
1516                 l_cblk->numnewpasses -= l_seg->numnewpasses;
1517                 if (l_cblk->numnewpasses > 0) {
1518                     ++l_seg;
1519                     ++l_cblk->numsegs;
1520                 }
1521             } while (l_cblk->numnewpasses > 0);
1522
1523             ++l_cblk;
1524         }
1525
1526         ++l_band;
1527     }
1528
1529     return OPJ_TRUE;
1530 }
1531
1532
1533 static OPJ_BOOL opj_t2_init_seg(opj_tcd_cblk_dec_t* cblk,
1534                                 OPJ_UINT32 index,
1535                                 OPJ_UINT32 cblksty,
1536                                 OPJ_UINT32 first)
1537 {
1538     opj_tcd_seg_t* seg = 00;
1539     OPJ_UINT32 l_nb_segs = index + 1;
1540
1541     if (l_nb_segs > cblk->m_current_max_segs) {
1542         opj_tcd_seg_t* new_segs;
1543         OPJ_UINT32 l_m_current_max_segs = cblk->m_current_max_segs +
1544                                           OPJ_J2K_DEFAULT_NB_SEGS;
1545
1546         new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs,
1547                                                 l_m_current_max_segs * sizeof(opj_tcd_seg_t));
1548         if (! new_segs) {
1549             /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
1550             return OPJ_FALSE;
1551         }
1552         cblk->segs = new_segs;
1553         memset(new_segs + cblk->m_current_max_segs,
1554                0, OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));
1555         cblk->m_current_max_segs = l_m_current_max_segs;
1556     }
1557
1558     seg = &cblk->segs[index];
1559     opj_tcd_reinit_segment(seg);
1560
1561     if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
1562         seg->maxpasses = 1;
1563     } else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
1564         if (first) {
1565             seg->maxpasses = 10;
1566         } else {
1567             seg->maxpasses = (((seg - 1)->maxpasses == 1) ||
1568                               ((seg - 1)->maxpasses == 10)) ? 2 : 1;
1569         }
1570     } else {
1571         /* See paragraph "B.10.6 Number of coding passes" of the standard.
1572          * Probably that 109 must be interpreted a (Mb-1)*3 + 1 with Mb=37,
1573          * Mb being the maximum number of bit-planes available for the
1574          * representation of coefficients in the sub-band */
1575         seg->maxpasses = 109;
1576     }
1577
1578     return OPJ_TRUE;
1579 }