Coverage Report

Created: 2023-06-07 08:11

/src/opencv/3rdparty/openjpeg/openjp2/t2.c
Line
Count
Source (jump to first uncovered line)
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
0
{
169
0
    while (--n >= 0) {
170
0
        opj_bio_write(bio, 1, 1);
171
0
    }
172
0
    opj_bio_write(bio, 0, 1);
173
0
}
174
175
static OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio)
176
728k
{
177
728k
    OPJ_UINT32 n = 0;
178
1.00M
    while (opj_bio_read(bio, 1)) {
179
276k
        ++n;
180
276k
    }
181
728k
    return n;
182
728k
}
183
184
static void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n)
185
0
{
186
0
    if (n == 1) {
187
0
        opj_bio_write(bio, 0, 1);
188
0
    } else if (n == 2) {
189
0
        opj_bio_write(bio, 2, 2);
190
0
    } else if (n <= 5) {
191
0
        opj_bio_write(bio, 0xc | (n - 3), 4);
192
0
    } else if (n <= 36) {
193
0
        opj_bio_write(bio, 0x1e0 | (n - 6), 9);
194
0
    } else if (n <= 164) {
195
0
        opj_bio_write(bio, 0xff80 | (n - 37), 16);
196
0
    }
197
0
}
198
199
static OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio)
200
728k
{
201
728k
    OPJ_UINT32 n;
202
728k
    if (!opj_bio_read(bio, 1)) {
203
272k
        return 1;
204
272k
    }
205
455k
    if (!opj_bio_read(bio, 1)) {
206
155k
        return 2;
207
155k
    }
208
300k
    if ((n = opj_bio_read(bio, 2)) != 3) {
209
64.7k
        return (3 + n);
210
64.7k
    }
211
235k
    if ((n = opj_bio_read(bio, 5)) != 31) {
212
232k
        return (6 + n);
213
232k
    }
214
3.00k
    return (37 + opj_bio_read(bio, 7));
215
235k
}
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_tcd_marker_info_t* p_marker_info,
228
                               OPJ_UINT32 p_tp_num,
229
                               OPJ_INT32 p_tp_pos,
230
                               OPJ_UINT32 p_pino,
231
                               J2K_T2_MODE p_t2_mode,
232
                               opj_event_mgr_t *p_manager)
233
0
{
234
0
    OPJ_BYTE *l_current_data = p_dest;
235
0
    OPJ_UINT32 l_nb_bytes = 0;
236
0
    OPJ_UINT32 compno;
237
0
    OPJ_UINT32 poc;
238
0
    opj_pi_iterator_t *l_pi = 00;
239
0
    opj_pi_iterator_t *l_current_pi = 00;
240
0
    opj_image_t *l_image = p_t2->image;
241
0
    opj_cp_t *l_cp = p_t2->cp;
242
0
    opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no];
243
0
    OPJ_UINT32 pocno = (l_cp->rsiz == OPJ_PROFILE_CINEMA_4K) ? 2 : 1;
244
0
    OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ?
245
0
                            l_image->numcomps : 1;
246
0
    OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
247
248
0
    l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode, p_manager);
249
0
    if (!l_pi) {
250
0
        return OPJ_FALSE;
251
0
    }
252
253
0
    * p_data_written = 0;
254
255
0
    if (p_t2_mode == THRESH_CALC) { /* Calculating threshold */
256
0
        l_current_pi = l_pi;
257
258
0
        for (compno = 0; compno < l_max_comp; ++compno) {
259
0
            OPJ_UINT32 l_comp_len = 0;
260
0
            l_current_pi = l_pi;
261
262
0
            for (poc = 0; poc < pocno ; ++poc) {
263
0
                OPJ_UINT32 l_tp_num = compno;
264
265
                /* TODO MSD : check why this function cannot fail (cf. v1) */
266
0
                opj_pi_create_encode(l_pi, l_cp, p_tile_no, poc, l_tp_num, p_tp_pos, p_t2_mode);
267
268
0
                if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
269
                    /* TODO ADE : add an error */
270
0
                    opj_pi_destroy(l_pi, l_nb_pocs);
271
0
                    return OPJ_FALSE;
272
0
                }
273
0
                while (opj_pi_next(l_current_pi)) {
274
0
                    if (l_current_pi->layno < p_maxlayers) {
275
0
                        l_nb_bytes = 0;
276
277
0
                        if (! opj_t2_encode_packet(p_tile_no, p_tile, l_tcp, l_current_pi,
278
0
                                                   l_current_data, &l_nb_bytes,
279
0
                                                   p_max_len, cstr_info,
280
0
                                                   p_t2_mode,
281
0
                                                   p_manager)) {
282
0
                            opj_pi_destroy(l_pi, l_nb_pocs);
283
0
                            return OPJ_FALSE;
284
0
                        }
285
286
0
                        l_comp_len += l_nb_bytes;
287
0
                        l_current_data += l_nb_bytes;
288
0
                        p_max_len -= l_nb_bytes;
289
290
0
                        * p_data_written += l_nb_bytes;
291
0
                    }
292
0
                }
293
294
0
                if (l_cp->m_specific_param.m_enc.m_max_comp_size) {
295
0
                    if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {
296
0
                        opj_pi_destroy(l_pi, l_nb_pocs);
297
0
                        return OPJ_FALSE;
298
0
                    }
299
0
                }
300
301
0
                ++l_current_pi;
302
0
            }
303
0
        }
304
0
    } else { /* t2_mode == FINAL_PASS  */
305
0
        opj_pi_create_encode(l_pi, l_cp, p_tile_no, p_pino, p_tp_num, p_tp_pos,
306
0
                             p_t2_mode);
307
308
0
        l_current_pi = &l_pi[p_pino];
309
0
        if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
310
            /* TODO ADE : add an error */
311
0
            opj_pi_destroy(l_pi, l_nb_pocs);
312
0
            return OPJ_FALSE;
313
0
        }
314
315
0
        if (p_marker_info && p_marker_info->need_PLT) {
316
            /* One time use intended */
317
0
            assert(p_marker_info->packet_count == 0);
318
0
            assert(p_marker_info->p_packet_size == NULL);
319
320
0
            p_marker_info->p_packet_size = (OPJ_UINT32*) opj_malloc(
321
0
                                               opj_get_encoding_packet_count(l_image, l_cp, p_tile_no) * sizeof(OPJ_UINT32));
322
0
            if (p_marker_info->p_packet_size == NULL) {
323
0
                opj_pi_destroy(l_pi, l_nb_pocs);
324
0
                return OPJ_FALSE;
325
0
            }
326
0
        }
327
328
0
        while (opj_pi_next(l_current_pi)) {
329
0
            if (l_current_pi->layno < p_maxlayers) {
330
0
                l_nb_bytes = 0;
331
332
0
                if (! opj_t2_encode_packet(p_tile_no, p_tile, l_tcp, l_current_pi,
333
0
                                           l_current_data, &l_nb_bytes, p_max_len,
334
0
                                           cstr_info, p_t2_mode, p_manager)) {
335
0
                    opj_pi_destroy(l_pi, l_nb_pocs);
336
0
                    return OPJ_FALSE;
337
0
                }
338
339
0
                l_current_data += l_nb_bytes;
340
0
                p_max_len -= l_nb_bytes;
341
342
0
                * p_data_written += l_nb_bytes;
343
344
0
                if (p_marker_info && p_marker_info->need_PLT) {
345
0
                    p_marker_info->p_packet_size[p_marker_info->packet_count] = l_nb_bytes;
346
0
                    p_marker_info->packet_count ++;
347
0
                }
348
349
                /* INDEX >> */
350
0
                if (cstr_info) {
351
0
                    if (cstr_info->index_write) {
352
0
                        opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];
353
0
                        opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
354
0
                        if (!cstr_info->packno) {
355
0
                            info_PK->start_pos = info_TL->end_header + 1;
356
0
                        } else {
357
0
                            info_PK->start_pos = ((l_cp->m_specific_param.m_enc.m_tp_on | l_tcp->POC) &&
358
0
                                                  info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno -
359
0
                                                                            1].end_pos + 1;
360
0
                        }
361
0
                        info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;
362
0
                        info_PK->end_ph_pos += info_PK->start_pos -
363
0
                                               1;  /* End of packet header which now only represents the distance
364
                                                                                                                                                                                                                                                   to start of packet is incremented by value of start of packet*/
365
0
                    }
366
367
0
                    cstr_info->packno++;
368
0
                }
369
                /* << INDEX */
370
0
                ++p_tile->packno;
371
0
            }
372
0
        }
373
0
    }
374
375
0
    opj_pi_destroy(l_pi, l_nb_pocs);
376
377
0
    return OPJ_TRUE;
378
0
}
379
380
/* see issue 80 */
381
#if 0
382
#define JAS_FPRINTF fprintf
383
#else
384
/* issue 290 */
385
static void opj_null_jas_fprintf(FILE* file, const char * format, ...)
386
41.9M
{
387
41.9M
    (void)file;
388
41.9M
    (void)format;
389
41.9M
}
390
41.9M
#define JAS_FPRINTF opj_null_jas_fprintf
391
#endif
392
393
OPJ_BOOL opj_t2_decode_packets(opj_tcd_t* tcd,
394
                               opj_t2_t *p_t2,
395
                               OPJ_UINT32 p_tile_no,
396
                               opj_tcd_tile_t *p_tile,
397
                               OPJ_BYTE *p_src,
398
                               OPJ_UINT32 * p_data_read,
399
                               OPJ_UINT32 p_max_len,
400
                               opj_codestream_index_t *p_cstr_index,
401
                               opj_event_mgr_t *p_manager)
402
1.22k
{
403
1.22k
    OPJ_BYTE *l_current_data = p_src;
404
1.22k
    opj_pi_iterator_t *l_pi = 00;
405
1.22k
    OPJ_UINT32 pino;
406
1.22k
    opj_image_t *l_image = p_t2->image;
407
1.22k
    opj_cp_t *l_cp = p_t2->cp;
408
1.22k
    opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);
409
1.22k
    OPJ_UINT32 l_nb_bytes_read;
410
1.22k
    OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
411
1.22k
    opj_pi_iterator_t *l_current_pi = 00;
412
#ifdef TODO_MSD
413
    OPJ_UINT32 curtp = 0;
414
    OPJ_UINT32 tp_start_packno;
415
#endif
416
1.22k
    opj_packet_info_t *l_pack_info = 00;
417
1.22k
    opj_image_comp_t* l_img_comp = 00;
418
419
1.22k
    OPJ_ARG_NOT_USED(p_cstr_index);
420
421
#ifdef TODO_MSD
422
    if (p_cstr_index) {
423
        l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;
424
    }
425
#endif
426
427
    /* create a packet iterator */
428
1.22k
    l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no, p_manager);
429
1.22k
    if (!l_pi) {
430
1
        return OPJ_FALSE;
431
1
    }
432
433
434
1.21k
    l_current_pi = l_pi;
435
436
3.21k
    for (pino = 0; pino <= l_tcp->numpocs; ++pino) {
437
438
        /* if the resolution needed is too low, one dim of the tilec could be equal to zero
439
         * and no packets are used to decode this resolution and
440
         * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions
441
         * and no l_img_comp->resno_decoded are computed
442
         */
443
2.04k
        OPJ_BOOL* first_pass_failed = NULL;
444
445
2.04k
        if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
446
            /* TODO ADE : add an error */
447
0
            opj_pi_destroy(l_pi, l_nb_pocs);
448
0
            return OPJ_FALSE;
449
0
        }
450
451
2.04k
        first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));
452
2.04k
        if (!first_pass_failed) {
453
0
            opj_pi_destroy(l_pi, l_nb_pocs);
454
0
            return OPJ_FALSE;
455
0
        }
456
2.04k
        memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));
457
458
18.8M
        while (opj_pi_next(l_current_pi)) {
459
18.8M
            OPJ_BOOL skip_packet = OPJ_FALSE;
460
18.8M
            JAS_FPRINTF(stderr,
461
18.8M
                        "packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\n\n",
462
18.8M
                        l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno,
463
18.8M
                        l_current_pi->precno, l_current_pi->layno);
464
465
            /* If the packet layer is greater or equal than the maximum */
466
            /* number of layers, skip the packet */
467
18.8M
            if (l_current_pi->layno >= l_tcp->num_layers_to_decode) {
468
0
                skip_packet = OPJ_TRUE;
469
0
            }
470
            /* If the packet resolution number is greater than the minimum */
471
            /* number of resolution allowed, skip the packet */
472
18.8M
            else if (l_current_pi->resno >=
473
18.8M
                     p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {
474
0
                skip_packet = OPJ_TRUE;
475
18.8M
            } else {
476
                /* If no precincts of any band intersects the area of interest, */
477
                /* skip the packet */
478
18.8M
                OPJ_UINT32 bandno;
479
18.8M
                opj_tcd_tilecomp_t *tilec = &p_tile->comps[l_current_pi->compno];
480
18.8M
                opj_tcd_resolution_t *res = &tilec->resolutions[l_current_pi->resno];
481
482
18.8M
                skip_packet = OPJ_TRUE;
483
18.8M
                for (bandno = 0; bandno < res->numbands; ++bandno) {
484
18.8M
                    opj_tcd_band_t* band = &res->bands[bandno];
485
18.8M
                    opj_tcd_precinct_t* prec = &band->precincts[l_current_pi->precno];
486
487
18.8M
                    if (opj_tcd_is_subband_area_of_interest(tcd,
488
18.8M
                                                            l_current_pi->compno,
489
18.8M
                                                            l_current_pi->resno,
490
18.8M
                                                            band->bandno,
491
18.8M
                                                            (OPJ_UINT32)prec->x0,
492
18.8M
                                                            (OPJ_UINT32)prec->y0,
493
18.8M
                                                            (OPJ_UINT32)prec->x1,
494
18.8M
                                                            (OPJ_UINT32)prec->y1)) {
495
18.7M
                        skip_packet = OPJ_FALSE;
496
18.7M
                        break;
497
18.7M
                    }
498
18.8M
                }
499
                /*
500
                                printf("packet cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d -> %s\n",
501
                                    l_current_pi->compno, l_current_pi->resno,
502
                                    l_current_pi->precno, l_current_pi->layno, skip_packet ? "skipped" : "kept");
503
                */
504
18.8M
            }
505
18.8M
            if (!skip_packet) {
506
18.7M
                l_nb_bytes_read = 0;
507
508
18.7M
                first_pass_failed[l_current_pi->compno] = OPJ_FALSE;
509
510
18.7M
                if (! opj_t2_decode_packet(p_t2, p_tile, l_tcp, l_current_pi, l_current_data,
511
18.7M
                                           &l_nb_bytes_read, p_max_len, l_pack_info, p_manager)) {
512
56
                    opj_pi_destroy(l_pi, l_nb_pocs);
513
56
                    opj_free(first_pass_failed);
514
56
                    return OPJ_FALSE;
515
56
                }
516
517
18.7M
                l_img_comp = &(l_image->comps[l_current_pi->compno]);
518
18.7M
                l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno,
519
18.7M
                                            l_img_comp->resno_decoded);
520
18.7M
            } else {
521
3.97k
                l_nb_bytes_read = 0;
522
3.97k
                if (! opj_t2_skip_packet(p_t2, p_tile, l_tcp, l_current_pi, l_current_data,
523
3.97k
                                         &l_nb_bytes_read, p_max_len, l_pack_info, p_manager)) {
524
0
                    opj_pi_destroy(l_pi, l_nb_pocs);
525
0
                    opj_free(first_pass_failed);
526
0
                    return OPJ_FALSE;
527
0
                }
528
3.97k
            }
529
530
18.8M
            if (first_pass_failed[l_current_pi->compno]) {
531
608
                l_img_comp = &(l_image->comps[l_current_pi->compno]);
532
608
                if (l_img_comp->resno_decoded == 0) {
533
3
                    l_img_comp->resno_decoded =
534
3
                        p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;
535
3
                }
536
608
            }
537
538
18.8M
            l_current_data += l_nb_bytes_read;
539
18.8M
            p_max_len -= l_nb_bytes_read;
540
541
            /* INDEX >> */
542
#ifdef TODO_MSD
543
            if (p_cstr_info) {
544
                opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
545
                opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
546
                tp_start_packno = 0;
547
                if (!p_cstr_info->packno) {
548
                    info_PK->start_pos = info_TL->end_header + 1;
549
                } else if (info_TL->packet[p_cstr_info->packno - 1].end_pos >=
550
                           (OPJ_INT32)
551
                           p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos) { /* New tile part */
552
                    info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno -
553
                                                     tp_start_packno; /* Number of packets in previous tile-part */
554
                    tp_start_packno = p_cstr_info->packno;
555
                    curtp++;
556
                    info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header + 1;
557
                } else {
558
                    info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on &&
559
                                          info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno -
560
                                                                      1].end_pos + 1;
561
                }
562
                info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;
563
                info_PK->end_ph_pos += info_PK->start_pos -
564
                                       1;  /* End of packet header which now only represents the distance */
565
                ++p_cstr_info->packno;
566
            }
567
#endif
568
            /* << INDEX */
569
18.8M
        }
570
1.99k
        ++l_current_pi;
571
572
1.99k
        opj_free(first_pass_failed);
573
1.99k
    }
574
    /* INDEX >> */
575
#ifdef TODO_MSD
576
    if
577
    (p_cstr_info) {
578
        p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno -
579
                tp_start_packno; /* Number of packets in last tile-part */
580
    }
581
#endif
582
    /* << INDEX */
583
584
    /* don't forget to release pi */
585
1.16k
    opj_pi_destroy(l_pi, l_nb_pocs);
586
1.16k
    *p_data_read = (OPJ_UINT32)(l_current_data - p_src);
587
1.16k
    return OPJ_TRUE;
588
1.21k
}
589
590
/* ----------------------------------------------------------------------- */
591
592
/**
593
 * Creates a Tier 2 handle
594
 *
595
 * @param       p_image         Source or destination image
596
 * @param       p_cp            Image coding parameters.
597
 * @return              a new T2 handle if successful, NULL otherwise.
598
*/
599
opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp)
600
1.22k
{
601
    /* create the t2 structure */
602
1.22k
    opj_t2_t *l_t2 = (opj_t2_t*)opj_calloc(1, sizeof(opj_t2_t));
603
1.22k
    if (!l_t2) {
604
0
        return NULL;
605
0
    }
606
607
1.22k
    l_t2->image = p_image;
608
1.22k
    l_t2->cp = p_cp;
609
610
1.22k
    return l_t2;
611
1.22k
}
612
613
void opj_t2_destroy(opj_t2_t *t2)
614
1.22k
{
615
1.22k
    if (t2) {
616
1.22k
        opj_free(t2);
617
1.22k
    }
618
1.22k
}
619
620
static OPJ_BOOL opj_t2_decode_packet(opj_t2_t* p_t2,
621
                                     opj_tcd_tile_t *p_tile,
622
                                     opj_tcp_t *p_tcp,
623
                                     opj_pi_iterator_t *p_pi,
624
                                     OPJ_BYTE *p_src,
625
                                     OPJ_UINT32 * p_data_read,
626
                                     OPJ_UINT32 p_max_length,
627
                                     opj_packet_info_t *p_pack_info,
628
                                     opj_event_mgr_t *p_manager)
629
18.7M
{
630
18.7M
    OPJ_BOOL l_read_data;
631
18.7M
    OPJ_UINT32 l_nb_bytes_read = 0;
632
18.7M
    OPJ_UINT32 l_nb_total_bytes_read = 0;
633
634
18.7M
    *p_data_read = 0;
635
636
18.7M
    if (! opj_t2_read_packet_header(p_t2, p_tile, p_tcp, p_pi, &l_read_data, p_src,
637
18.7M
                                    &l_nb_bytes_read, p_max_length, p_pack_info, p_manager)) {
638
7
        return OPJ_FALSE;
639
7
    }
640
641
18.7M
    p_src += l_nb_bytes_read;
642
18.7M
    l_nb_total_bytes_read += l_nb_bytes_read;
643
18.7M
    p_max_length -= l_nb_bytes_read;
644
645
    /* we should read data for the packet */
646
18.7M
    if (l_read_data) {
647
1.31M
        l_nb_bytes_read = 0;
648
649
1.31M
        if (! opj_t2_read_packet_data(p_t2, p_tile, p_pi, p_src, &l_nb_bytes_read,
650
1.31M
                                      p_max_length, p_pack_info, p_manager)) {
651
49
            return OPJ_FALSE;
652
49
        }
653
654
1.31M
        l_nb_total_bytes_read += l_nb_bytes_read;
655
1.31M
    }
656
657
18.7M
    *p_data_read = l_nb_total_bytes_read;
658
659
18.7M
    return OPJ_TRUE;
660
18.7M
}
661
662
static OPJ_BOOL opj_t2_encode_packet(OPJ_UINT32 tileno,
663
                                     opj_tcd_tile_t * tile,
664
                                     opj_tcp_t * tcp,
665
                                     opj_pi_iterator_t *pi,
666
                                     OPJ_BYTE *dest,
667
                                     OPJ_UINT32 * p_data_written,
668
                                     OPJ_UINT32 length,
669
                                     opj_codestream_info_t *cstr_info,
670
                                     J2K_T2_MODE p_t2_mode,
671
                                     opj_event_mgr_t *p_manager)
672
0
{
673
0
    OPJ_UINT32 bandno, cblkno;
674
0
    OPJ_BYTE* c = dest;
675
0
    OPJ_UINT32 l_nb_bytes;
676
0
    OPJ_UINT32 compno = pi->compno;     /* component value */
677
0
    OPJ_UINT32 resno  = pi->resno;      /* resolution level value */
678
0
    OPJ_UINT32 precno = pi->precno;     /* precinct value */
679
0
    OPJ_UINT32 layno  = pi->layno;      /* quality layer value */
680
0
    OPJ_UINT32 l_nb_blocks;
681
0
    opj_tcd_band_t *band = 00;
682
0
    opj_tcd_cblk_enc_t* cblk = 00;
683
0
    opj_tcd_pass_t *pass = 00;
684
685
0
    opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
686
0
    opj_tcd_resolution_t *res = &tilec->resolutions[resno];
687
688
0
    opj_bio_t *bio = 00;    /* BIO component */
689
#ifdef ENABLE_EMPTY_PACKET_OPTIMIZATION
690
    OPJ_BOOL packet_empty = OPJ_TRUE;
691
#else
692
0
    OPJ_BOOL packet_empty = OPJ_FALSE;
693
0
#endif
694
695
#ifdef DEBUG_VERBOSE
696
    if (p_t2_mode == FINAL_PASS) {
697
        fprintf(stderr,
698
                "encode packet compono=%d, resno=%d, precno=%d, layno=%d\n",
699
                compno, resno, precno, layno);
700
    }
701
#endif
702
703
    /* <SOP 0xff91> */
704
0
    if (tcp->csty & J2K_CP_CSTY_SOP) {
705
0
        if (length < 6) {
706
0
            if (p_t2_mode == FINAL_PASS) {
707
0
                opj_event_msg(p_manager, EVT_ERROR,
708
0
                              "opj_t2_encode_packet(): only %u bytes remaining in "
709
0
                              "output buffer. %u needed.\n",
710
0
                              length, 6);
711
0
            }
712
0
            return OPJ_FALSE;
713
0
        }
714
0
        c[0] = 255;
715
0
        c[1] = 145;
716
0
        c[2] = 0;
717
0
        c[3] = 4;
718
#if 0
719
        c[4] = (tile->packno % 65536) / 256;
720
        c[5] = (tile->packno % 65536) % 256;
721
#else
722
0
        c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
723
0
        c[5] = tile->packno & 0xff;
724
0
#endif
725
0
        c += 6;
726
0
        length -= 6;
727
0
    }
728
    /* </SOP> */
729
730
0
    if (!layno) {
731
0
        band = res->bands;
732
733
0
        for (bandno = 0; bandno < res->numbands; ++bandno, ++band) {
734
0
            opj_tcd_precinct_t *prc;
735
736
            /* Skip empty bands */
737
0
            if (opj_tcd_is_band_empty(band)) {
738
0
                continue;
739
0
            }
740
741
            /* Avoid out of bounds access of https://github.com/uclouvain/openjpeg/issues/1294 */
742
            /* but likely not a proper fix. */
743
0
            if (precno >= res->pw * res->ph) {
744
0
                opj_event_msg(p_manager, EVT_ERROR,
745
0
                              "opj_t2_encode_packet(): accessing precno=%u >= %u\n",
746
0
                              precno, res->pw * res->ph);
747
0
                return OPJ_FALSE;
748
0
            }
749
750
0
            prc = &band->precincts[precno];
751
0
            opj_tgt_reset(prc->incltree);
752
0
            opj_tgt_reset(prc->imsbtree);
753
754
0
            l_nb_blocks = prc->cw * prc->ch;
755
0
            for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
756
0
                cblk = &prc->cblks.enc[cblkno];
757
758
0
                cblk->numpasses = 0;
759
0
                opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
760
0
            }
761
0
        }
762
0
    }
763
764
0
    bio = opj_bio_create();
765
0
    if (!bio) {
766
        /* FIXME event manager error callback */
767
0
        return OPJ_FALSE;
768
0
    }
769
0
    opj_bio_init_enc(bio, c, length);
770
771
#ifdef ENABLE_EMPTY_PACKET_OPTIMIZATION
772
    /* WARNING: this code branch is disabled, since it has been reported that */
773
    /* such packets cause decoding issues with cinema J2K hardware */
774
    /* decoders: https://groups.google.com/forum/#!topic/openjpeg/M7M_fLX_Bco */
775
776
    /* Check if the packet is empty */
777
    /* Note: we could also skip that step and always write a packet header */
778
    band = res->bands;
779
    for (bandno = 0; bandno < res->numbands; ++bandno, ++band) {
780
        opj_tcd_precinct_t *prc;
781
        /* Skip empty bands */
782
        if (opj_tcd_is_band_empty(band)) {
783
            continue;
784
        }
785
786
        prc = &band->precincts[precno];
787
        l_nb_blocks = prc->cw * prc->ch;
788
        cblk = prc->cblks.enc;
789
        for (cblkno = 0; cblkno < l_nb_blocks; cblkno++, ++cblk) {
790
            opj_tcd_layer_t *layer = &cblk->layers[layno];
791
792
            /* if cblk not included, go to the next cblk  */
793
            if (!layer->numpasses) {
794
                continue;
795
            }
796
            packet_empty = OPJ_FALSE;
797
            break;
798
        }
799
        if (!packet_empty) {
800
            break;
801
        }
802
    }
803
#endif
804
0
    opj_bio_write(bio, packet_empty ? 0 : 1, 1);           /* Empty header bit */
805
806
    /* Writing Packet header */
807
0
    band = res->bands;
808
0
    for (bandno = 0; !packet_empty &&
809
0
            bandno < res->numbands; ++bandno, ++band)      {
810
0
        opj_tcd_precinct_t *prc;
811
812
        /* Skip empty bands */
813
0
        if (opj_tcd_is_band_empty(band)) {
814
0
            continue;
815
0
        }
816
817
        /* Avoid out of bounds access of https://github.com/uclouvain/openjpeg/issues/1297 */
818
        /* but likely not a proper fix. */
819
0
        if (precno >= res->pw * res->ph) {
820
0
            opj_event_msg(p_manager, EVT_ERROR,
821
0
                          "opj_t2_encode_packet(): accessing precno=%u >= %u\n",
822
0
                          precno, res->pw * res->ph);
823
0
            return OPJ_FALSE;
824
0
        }
825
826
0
        prc = &band->precincts[precno];
827
0
        l_nb_blocks = prc->cw * prc->ch;
828
0
        cblk = prc->cblks.enc;
829
830
0
        for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
831
0
            opj_tcd_layer_t *layer = &cblk->layers[layno];
832
833
0
            if (!cblk->numpasses && layer->numpasses) {
834
0
                opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
835
0
            }
836
837
0
            ++cblk;
838
0
        }
839
840
0
        cblk = prc->cblks.enc;
841
0
        for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
842
0
            opj_tcd_layer_t *layer = &cblk->layers[layno];
843
0
            OPJ_UINT32 increment = 0;
844
0
            OPJ_UINT32 nump = 0;
845
0
            OPJ_UINT32 len = 0, passno;
846
0
            OPJ_UINT32 l_nb_passes;
847
848
            /* cblk inclusion bits */
849
0
            if (!cblk->numpasses) {
850
0
                opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
851
0
            } else {
852
0
                opj_bio_write(bio, layer->numpasses != 0, 1);
853
0
            }
854
855
            /* if cblk not included, go to the next cblk  */
856
0
            if (!layer->numpasses) {
857
0
                ++cblk;
858
0
                continue;
859
0
            }
860
861
            /* if first instance of cblk --> zero bit-planes information */
862
0
            if (!cblk->numpasses) {
863
0
                cblk->numlenbits = 3;
864
0
                opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
865
0
            }
866
867
            /* number of coding passes included */
868
0
            opj_t2_putnumpasses(bio, layer->numpasses);
869
0
            l_nb_passes = cblk->numpasses + layer->numpasses;
870
0
            pass = cblk->passes +  cblk->numpasses;
871
872
            /* computation of the increase of the length indicator and insertion in the header     */
873
0
            for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
874
0
                ++nump;
875
0
                len += pass->len;
876
877
0
                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
878
0
                    increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment,
879
0
                                                        opj_int_floorlog2((OPJ_INT32)len) + 1
880
0
                                                        - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
881
0
                    len = 0;
882
0
                    nump = 0;
883
0
                }
884
885
0
                ++pass;
886
0
            }
887
0
            opj_t2_putcommacode(bio, (OPJ_INT32)increment);
888
889
            /* computation of the new Length indicator */
890
0
            cblk->numlenbits += increment;
891
892
0
            pass = cblk->passes +  cblk->numpasses;
893
            /* insertion of the codeword segment length */
894
0
            for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
895
0
                nump++;
896
0
                len += pass->len;
897
898
0
                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
899
0
                    opj_bio_write(bio, (OPJ_UINT32)len,
900
0
                                  cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
901
0
                    len = 0;
902
0
                    nump = 0;
903
0
                }
904
0
                ++pass;
905
0
            }
906
907
0
            ++cblk;
908
0
        }
909
0
    }
910
911
0
    if (!opj_bio_flush(bio)) {
912
0
        opj_bio_destroy(bio);
913
0
        return OPJ_FALSE;               /* modified to eliminate longjmp !! */
914
0
    }
915
916
0
    l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
917
0
    c += l_nb_bytes;
918
0
    length -= l_nb_bytes;
919
920
0
    opj_bio_destroy(bio);
921
922
    /* <EPH 0xff92> */
923
0
    if (tcp->csty & J2K_CP_CSTY_EPH) {
924
0
        if (length < 2) {
925
0
            if (p_t2_mode == FINAL_PASS) {
926
0
                opj_event_msg(p_manager, EVT_ERROR,
927
0
                              "opj_t2_encode_packet(): only %u bytes remaining in "
928
0
                              "output buffer. %u needed.\n",
929
0
                              length, 2);
930
0
            }
931
0
            return OPJ_FALSE;
932
0
        }
933
0
        c[0] = 255;
934
0
        c[1] = 146;
935
0
        c += 2;
936
0
        length -= 2;
937
0
    }
938
    /* </EPH> */
939
940
    /* << INDEX */
941
    /* End of packet header position. Currently only represents the distance to start of packet
942
       Will be updated later by incrementing with packet start value*/
943
0
    if (cstr_info && cstr_info->index_write) {
944
0
        opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
945
0
        info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
946
0
    }
947
    /* INDEX >> */
948
949
    /* Writing the packet body */
950
0
    band = res->bands;
951
0
    for (bandno = 0; !packet_empty && bandno < res->numbands; bandno++, ++band) {
952
0
        opj_tcd_precinct_t *prc;
953
954
        /* Skip empty bands */
955
0
        if (opj_tcd_is_band_empty(band)) {
956
0
            continue;
957
0
        }
958
959
0
        prc = &band->precincts[precno];
960
0
        l_nb_blocks = prc->cw * prc->ch;
961
0
        cblk = prc->cblks.enc;
962
963
0
        for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
964
0
            opj_tcd_layer_t *layer = &cblk->layers[layno];
965
966
0
            if (!layer->numpasses) {
967
0
                ++cblk;
968
0
                continue;
969
0
            }
970
971
0
            if (layer->len > length) {
972
0
                if (p_t2_mode == FINAL_PASS) {
973
0
                    opj_event_msg(p_manager, EVT_ERROR,
974
0
                                  "opj_t2_encode_packet(): only %u bytes remaining in "
975
0
                                  "output buffer. %u needed.\n",
976
0
                                  length, layer->len);
977
0
                }
978
0
                return OPJ_FALSE;
979
0
            }
980
981
0
            memcpy(c, layer->data, layer->len);
982
0
            cblk->numpasses += layer->numpasses;
983
0
            c += layer->len;
984
0
            length -= layer->len;
985
986
            /* << INDEX */
987
0
            if (cstr_info && cstr_info->index_write) {
988
0
                opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
989
0
                info_PK->disto += layer->disto;
990
0
                if (cstr_info->D_max < info_PK->disto) {
991
0
                    cstr_info->D_max = info_PK->disto;
992
0
                }
993
0
            }
994
995
0
            ++cblk;
996
            /* INDEX >> */
997
0
        }
998
0
    }
999
1000
0
    assert(c >= dest);
1001
0
    * p_data_written += (OPJ_UINT32)(c - dest);
1002
1003
0
    return OPJ_TRUE;
1004
0
}
1005
1006
static OPJ_BOOL opj_t2_skip_packet(opj_t2_t* p_t2,
1007
                                   opj_tcd_tile_t *p_tile,
1008
                                   opj_tcp_t *p_tcp,
1009
                                   opj_pi_iterator_t *p_pi,
1010
                                   OPJ_BYTE *p_src,
1011
                                   OPJ_UINT32 * p_data_read,
1012
                                   OPJ_UINT32 p_max_length,
1013
                                   opj_packet_info_t *p_pack_info,
1014
                                   opj_event_mgr_t *p_manager)
1015
3.97k
{
1016
3.97k
    OPJ_BOOL l_read_data;
1017
3.97k
    OPJ_UINT32 l_nb_bytes_read = 0;
1018
3.97k
    OPJ_UINT32 l_nb_total_bytes_read = 0;
1019
1020
3.97k
    *p_data_read = 0;
1021
1022
3.97k
    if (! opj_t2_read_packet_header(p_t2, p_tile, p_tcp, p_pi, &l_read_data, p_src,
1023
3.97k
                                    &l_nb_bytes_read, p_max_length, p_pack_info, p_manager)) {
1024
0
        return OPJ_FALSE;
1025
0
    }
1026
1027
3.97k
    p_src += l_nb_bytes_read;
1028
3.97k
    l_nb_total_bytes_read += l_nb_bytes_read;
1029
3.97k
    p_max_length -= l_nb_bytes_read;
1030
1031
    /* we should read data for the packet */
1032
3.97k
    if (l_read_data) {
1033
521
        l_nb_bytes_read = 0;
1034
1035
521
        if (! opj_t2_skip_packet_data(p_t2, p_tile, p_pi, &l_nb_bytes_read,
1036
521
                                      p_max_length, p_pack_info, p_manager)) {
1037
0
            return OPJ_FALSE;
1038
0
        }
1039
1040
521
        l_nb_total_bytes_read += l_nb_bytes_read;
1041
521
    }
1042
3.97k
    *p_data_read = l_nb_total_bytes_read;
1043
1044
3.97k
    return OPJ_TRUE;
1045
3.97k
}
1046
1047
1048
static OPJ_BOOL opj_t2_read_packet_header(opj_t2_t* p_t2,
1049
        opj_tcd_tile_t *p_tile,
1050
        opj_tcp_t *p_tcp,
1051
        opj_pi_iterator_t *p_pi,
1052
        OPJ_BOOL * p_is_data_present,
1053
        OPJ_BYTE *p_src_data,
1054
        OPJ_UINT32 * p_data_read,
1055
        OPJ_UINT32 p_max_length,
1056
        opj_packet_info_t *p_pack_info,
1057
        opj_event_mgr_t *p_manager)
1058
1059
18.8M
{
1060
    /* loop */
1061
18.8M
    OPJ_UINT32 bandno, cblkno;
1062
18.8M
    OPJ_UINT32 l_nb_code_blocks;
1063
18.8M
    OPJ_UINT32 l_remaining_length;
1064
18.8M
    OPJ_UINT32 l_header_length;
1065
18.8M
    OPJ_UINT32 * l_modified_length_ptr = 00;
1066
18.8M
    OPJ_BYTE *l_current_data = p_src_data;
1067
18.8M
    opj_cp_t *l_cp = p_t2->cp;
1068
18.8M
    opj_bio_t *l_bio = 00;  /* BIO component */
1069
18.8M
    opj_tcd_band_t *l_band = 00;
1070
18.8M
    opj_tcd_cblk_dec_t* l_cblk = 00;
1071
18.8M
    opj_tcd_resolution_t* l_res =
1072
18.8M
        &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
1073
1074
18.8M
    OPJ_BYTE *l_header_data = 00;
1075
18.8M
    OPJ_BYTE **l_header_data_start = 00;
1076
1077
18.8M
    OPJ_UINT32 l_present;
1078
1079
18.8M
    if (p_pi->layno == 0) {
1080
1.68M
        l_band = l_res->bands;
1081
1082
        /* reset tagtrees */
1083
3.38M
        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
1084
1.69M
            if (!opj_tcd_is_band_empty(l_band)) {
1085
1.69M
                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
1086
1.69M
                if (!(p_pi->precno < (l_band->precincts_data_size / sizeof(
1087
1.69M
                                          opj_tcd_precinct_t)))) {
1088
0
                    opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct\n");
1089
0
                    return OPJ_FALSE;
1090
0
                }
1091
1092
1093
1.69M
                opj_tgt_reset(l_prc->incltree);
1094
1.69M
                opj_tgt_reset(l_prc->imsbtree);
1095
1.69M
                l_cblk = l_prc->cblks.dec;
1096
1097
1.69M
                l_nb_code_blocks = l_prc->cw * l_prc->ch;
1098
3.90M
                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
1099
2.20M
                    l_cblk->numsegs = 0;
1100
2.20M
                    l_cblk->real_num_segs = 0;
1101
2.20M
                    ++l_cblk;
1102
2.20M
                }
1103
1.69M
            }
1104
1105
1.69M
            ++l_band;
1106
1.69M
        }
1107
1.68M
    }
1108
1109
    /* SOP markers */
1110
1111
18.8M
    if (p_tcp->csty & J2K_CP_CSTY_SOP) {
1112
11.0k
        if (p_max_length < 6) {
1113
9.27k
            opj_event_msg(p_manager, EVT_WARNING,
1114
9.27k
                          "Not enough space for expected SOP marker\n");
1115
9.27k
        } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
1116
1.77k
            opj_event_msg(p_manager, EVT_WARNING, "Expected SOP marker\n");
1117
1.77k
        } else {
1118
10
            l_current_data += 6;
1119
10
        }
1120
1121
        /** TODO : check the Nsop value */
1122
11.0k
    }
1123
1124
    /*
1125
    When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
1126
    This part deal with this characteristic
1127
    step 1: Read packet header in the saved structure
1128
    step 2: Return to codestream for decoding
1129
    */
1130
1131
18.8M
    l_bio = opj_bio_create();
1132
18.8M
    if (! l_bio) {
1133
0
        return OPJ_FALSE;
1134
0
    }
1135
1136
18.8M
    if (l_cp->ppm == 1) { /* PPM */
1137
366
        l_header_data_start = &l_cp->ppm_data;
1138
366
        l_header_data = *l_header_data_start;
1139
366
        l_modified_length_ptr = &(l_cp->ppm_len);
1140
1141
18.8M
    } else if (p_tcp->ppt == 1) { /* PPT */
1142
0
        l_header_data_start = &(p_tcp->ppt_data);
1143
0
        l_header_data = *l_header_data_start;
1144
0
        l_modified_length_ptr = &(p_tcp->ppt_len);
1145
18.8M
    } else { /* Normal Case */
1146
18.8M
        l_header_data_start = &(l_current_data);
1147
18.8M
        l_header_data = *l_header_data_start;
1148
18.8M
        l_remaining_length = (OPJ_UINT32)(p_src_data + p_max_length - l_header_data);
1149
18.8M
        l_modified_length_ptr = &(l_remaining_length);
1150
18.8M
    }
1151
1152
18.8M
    opj_bio_init_dec(l_bio, l_header_data, *l_modified_length_ptr);
1153
1154
18.8M
    l_present = opj_bio_read(l_bio, 1);
1155
18.8M
    JAS_FPRINTF(stderr, "present=%d \n", l_present);
1156
18.8M
    if (!l_present) {
1157
        /* TODO MSD: no test to control the output of this function*/
1158
17.4M
        opj_bio_inalign(l_bio);
1159
17.4M
        l_header_data += opj_bio_numbytes(l_bio);
1160
17.4M
        opj_bio_destroy(l_bio);
1161
1162
        /* EPH markers */
1163
17.4M
        if (p_tcp->csty & J2K_CP_CSTY_EPH) {
1164
17.2M
            if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data -
1165
17.2M
                    *l_header_data_start)) < 2U) {
1166
15.2M
                opj_event_msg(p_manager, EVT_WARNING,
1167
15.2M
                              "Not enough space for expected EPH marker\n");
1168
15.2M
            } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
1169
2.04M
                opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
1170
2.04M
            } else {
1171
191
                l_header_data += 2;
1172
191
            }
1173
17.2M
        }
1174
1175
17.4M
        l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
1176
17.4M
        *l_modified_length_ptr -= l_header_length;
1177
17.4M
        *l_header_data_start += l_header_length;
1178
1179
        /* << INDEX */
1180
        /* End of packet header position. Currently only represents the distance to start of packet
1181
           Will be updated later by incrementing with packet start value */
1182
17.4M
        if (p_pack_info) {
1183
0
            p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
1184
0
        }
1185
        /* INDEX >> */
1186
1187
17.4M
        * p_is_data_present = OPJ_FALSE;
1188
17.4M
        *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
1189
17.4M
        return OPJ_TRUE;
1190
17.4M
    }
1191
1192
1.31M
    l_band = l_res->bands;
1193
2.63M
    for (bandno = 0; bandno < l_res->numbands; ++bandno, ++l_band) {
1194
1.32M
        opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
1195
1196
1.32M
        if (opj_tcd_is_band_empty(l_band)) {
1197
1.99k
            continue;
1198
1.99k
        }
1199
1200
1.31M
        l_nb_code_blocks = l_prc->cw * l_prc->ch;
1201
1.31M
        l_cblk = l_prc->cblks.dec;
1202
2.95M
        for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
1203
1.64M
            OPJ_UINT32 l_included, l_increment, l_segno;
1204
1.64M
            OPJ_INT32 n;
1205
1206
            /* if cblk not yet included before --> inclusion tagtree */
1207
1.64M
            if (!l_cblk->numsegs) {
1208
1.25M
                l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno,
1209
1.25M
                                            (OPJ_INT32)(p_pi->layno + 1));
1210
                /* else one bit */
1211
1.25M
            } else {
1212
385k
                l_included = opj_bio_read(l_bio, 1);
1213
385k
            }
1214
1215
            /* if cblk not included */
1216
1.64M
            if (!l_included) {
1217
912k
                l_cblk->numnewpasses = 0;
1218
912k
                ++l_cblk;
1219
912k
                JAS_FPRINTF(stderr, "included=%d \n", l_included);
1220
912k
                continue;
1221
912k
            }
1222
1223
            /* if cblk not yet included --> zero-bitplane tagtree */
1224
728k
            if (!l_cblk->numsegs) {
1225
464k
                OPJ_UINT32 i = 0;
1226
1227
1.42M
                while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
1228
962k
                    ++i;
1229
962k
                }
1230
1231
464k
                l_cblk->Mb = (OPJ_UINT32)l_band->numbps;
1232
464k
                l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
1233
464k
                l_cblk->numlenbits = 3;
1234
464k
            }
1235
1236
            /* number of coding passes */
1237
728k
            l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
1238
728k
            l_increment = opj_t2_getcommacode(l_bio);
1239
1240
            /* length indicator increment */
1241
728k
            l_cblk->numlenbits += l_increment;
1242
728k
            l_segno = 0;
1243
1244
728k
            if (!l_cblk->numsegs) {
1245
464k
                if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
1246
0
                    opj_bio_destroy(l_bio);
1247
0
                    return OPJ_FALSE;
1248
0
                }
1249
464k
            } else {
1250
263k
                l_segno = l_cblk->numsegs - 1;
1251
263k
                if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
1252
5.46k
                    ++l_segno;
1253
5.46k
                    if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
1254
0
                        opj_bio_destroy(l_bio);
1255
0
                        return OPJ_FALSE;
1256
0
                    }
1257
5.46k
                }
1258
263k
            }
1259
728k
            n = (OPJ_INT32)l_cblk->numnewpasses;
1260
1261
728k
            if ((p_tcp->tccps[p_pi->compno].cblksty & J2K_CCP_CBLKSTY_HT) != 0)
1262
4.21k
                do {
1263
4.21k
                    OPJ_UINT32 bit_number;
1264
4.21k
                    l_cblk->segs[l_segno].numnewpasses = l_segno == 0 ? 1 : (OPJ_UINT32)n;
1265
4.21k
                    bit_number = l_cblk->numlenbits + opj_uint_floorlog2(
1266
4.21k
                                     l_cblk->segs[l_segno].numnewpasses);
1267
4.21k
                    if (bit_number > 32) {
1268
1
                        opj_event_msg(p_manager, EVT_ERROR,
1269
1
                                      "Invalid bit number %d in opj_t2_read_packet_header()\n",
1270
1
                                      bit_number);
1271
1
                        opj_bio_destroy(l_bio);
1272
1
                        return OPJ_FALSE;
1273
1
                    }
1274
4.21k
                    l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, bit_number);
1275
4.21k
                    JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n",
1276
4.21k
                                l_included, l_cblk->segs[l_segno].numnewpasses, l_increment,
1277
4.21k
                                l_cblk->segs[l_segno].newlen);
1278
1279
4.21k
                    n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
1280
4.21k
                    if (n > 0) {
1281
1.20k
                        ++l_segno;
1282
1283
1.20k
                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
1284
0
                            opj_bio_destroy(l_bio);
1285
0
                            return OPJ_FALSE;
1286
0
                        }
1287
1.20k
                    }
1288
4.21k
                } while (n > 0);
1289
725k
            else
1290
831k
                do {
1291
831k
                    OPJ_UINT32 bit_number;
1292
831k
                    l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(
1293
831k
                            l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);
1294
831k
                    bit_number = l_cblk->numlenbits + opj_uint_floorlog2(
1295
831k
                                     l_cblk->segs[l_segno].numnewpasses);
1296
831k
                    if (bit_number > 32) {
1297
6
                        opj_event_msg(p_manager, EVT_ERROR,
1298
6
                                      "Invalid bit number %d in opj_t2_read_packet_header()\n",
1299
6
                                      bit_number);
1300
6
                        opj_bio_destroy(l_bio);
1301
6
                        return OPJ_FALSE;
1302
6
                    }
1303
831k
                    l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, bit_number);
1304
831k
                    JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n",
1305
831k
                                l_included, l_cblk->segs[l_segno].numnewpasses, l_increment,
1306
831k
                                l_cblk->segs[l_segno].newlen);
1307
1308
831k
                    n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
1309
831k
                    if (n > 0) {
1310
106k
                        ++l_segno;
1311
1312
106k
                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
1313
0
                            opj_bio_destroy(l_bio);
1314
0
                            return OPJ_FALSE;
1315
0
                        }
1316
106k
                    }
1317
831k
                } while (n > 0);
1318
1319
728k
            ++l_cblk;
1320
728k
        }
1321
1.31M
    }
1322
1323
1.31M
    if (!opj_bio_inalign(l_bio)) {
1324
0
        opj_bio_destroy(l_bio);
1325
0
        return OPJ_FALSE;
1326
0
    }
1327
1328
1.31M
    l_header_data += opj_bio_numbytes(l_bio);
1329
1.31M
    opj_bio_destroy(l_bio);
1330
1331
    /* EPH markers */
1332
1.31M
    if (p_tcp->csty & J2K_CP_CSTY_EPH) {
1333
1.31M
        if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data -
1334
1.31M
                *l_header_data_start)) < 2U) {
1335
255
            opj_event_msg(p_manager, EVT_WARNING,
1336
255
                          "Not enough space for expected EPH marker\n");
1337
1.31M
        } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
1338
1.31M
            opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
1339
1.31M
        } else {
1340
1.18k
            l_header_data += 2;
1341
1.18k
        }
1342
1.31M
    }
1343
1344
1.31M
    l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
1345
1.31M
    JAS_FPRINTF(stderr, "hdrlen=%d \n", l_header_length);
1346
1.31M
    JAS_FPRINTF(stderr, "packet body\n");
1347
1.31M
    *l_modified_length_ptr -= l_header_length;
1348
1.31M
    *l_header_data_start += l_header_length;
1349
1350
    /* << INDEX */
1351
    /* End of packet header position. Currently only represents the distance to start of packet
1352
     Will be updated later by incrementing with packet start value */
1353
1.31M
    if (p_pack_info) {
1354
0
        p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
1355
0
    }
1356
    /* INDEX >> */
1357
1358
1.31M
    *p_is_data_present = OPJ_TRUE;
1359
1.31M
    *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
1360
1361
1.31M
    return OPJ_TRUE;
1362
1.31M
}
1363
1364
static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
1365
                                        opj_tcd_tile_t *p_tile,
1366
                                        opj_pi_iterator_t *p_pi,
1367
                                        OPJ_BYTE *p_src_data,
1368
                                        OPJ_UINT32 * p_data_read,
1369
                                        OPJ_UINT32 p_max_length,
1370
                                        opj_packet_info_t *pack_info,
1371
                                        opj_event_mgr_t* p_manager)
1372
1.31M
{
1373
1.31M
    OPJ_UINT32 bandno, cblkno;
1374
1.31M
    OPJ_UINT32 l_nb_code_blocks;
1375
1.31M
    OPJ_BYTE *l_current_data = p_src_data;
1376
1.31M
    opj_tcd_band_t *l_band = 00;
1377
1.31M
    opj_tcd_cblk_dec_t* l_cblk = 00;
1378
1.31M
    opj_tcd_resolution_t* l_res =
1379
1.31M
        &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
1380
1.31M
    OPJ_BOOL partial_buffer = OPJ_FALSE;
1381
1382
1.31M
    OPJ_ARG_NOT_USED(p_t2);
1383
1.31M
    OPJ_ARG_NOT_USED(pack_info);
1384
1385
1.31M
    l_band = l_res->bands;
1386
2.63M
    for (bandno = 0; bandno < l_res->numbands; ++bandno) {
1387
1.31M
        opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
1388
1389
1.31M
        if ((l_band->x1 - l_band->x0 == 0) || (l_band->y1 - l_band->y0 == 0)) {
1390
427
            ++l_band;
1391
427
            continue;
1392
427
        }
1393
1394
1.31M
        l_nb_code_blocks = l_prc->cw * l_prc->ch;
1395
1.31M
        l_cblk = l_prc->cblks.dec;
1396
1397
2.94M
        for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
1398
1.63M
            opj_tcd_seg_t *l_seg = 00;
1399
1400
            // if we have a partial data stream, set numchunks to zero
1401
            // since we have no data to actually decode.
1402
1.63M
            if (partial_buffer) {
1403
0
                l_cblk->numchunks = 0;
1404
0
            }
1405
1406
1.63M
            if (!l_cblk->numnewpasses) {
1407
                /* nothing to do */
1408
905k
                ++l_cblk;
1409
905k
                continue;
1410
905k
            }
1411
1412
724k
            if (!l_cblk->numsegs) {
1413
461k
                l_seg = l_cblk->segs;
1414
461k
                ++l_cblk->numsegs;
1415
461k
            } else {
1416
263k
                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
1417
1418
263k
                if (l_seg->numpasses == l_seg->maxpasses) {
1419
5.43k
                    ++l_seg;
1420
5.43k
                    ++l_cblk->numsegs;
1421
5.43k
                }
1422
263k
            }
1423
1424
828k
            do {
1425
                /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */
1426
828k
                if ((((OPJ_SIZE_T)l_current_data + (OPJ_SIZE_T)l_seg->newlen) <
1427
828k
                        (OPJ_SIZE_T)l_current_data) ||
1428
828k
                        (l_current_data + l_seg->newlen > p_src_data + p_max_length) ||
1429
828k
                        (partial_buffer)) {
1430
49
                    if (p_t2->cp->strict) {
1431
49
                        opj_event_msg(p_manager, EVT_ERROR,
1432
49
                                      "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1433
49
                                      l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1434
49
                                      p_pi->compno);
1435
49
                        return OPJ_FALSE;
1436
49
                    } else {
1437
0
                        opj_event_msg(p_manager, EVT_WARNING,
1438
0
                                      "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1439
0
                                      l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1440
0
                                      p_pi->compno);
1441
                        // skip this codeblock since it is a partial read
1442
0
                        partial_buffer = OPJ_TRUE;
1443
0
                        l_cblk->numchunks = 0;
1444
1445
0
                        l_seg->numpasses += l_seg->numnewpasses;
1446
0
                        l_cblk->numnewpasses -= l_seg->numnewpasses;
1447
0
                        if (l_cblk->numnewpasses > 0) {
1448
0
                            ++l_seg;
1449
0
                            ++l_cblk->numsegs;
1450
0
                            break;
1451
0
                        }
1452
0
                        continue;
1453
0
                    }
1454
49
                }
1455
1456
#ifdef USE_JPWL
1457
                /* we need here a j2k handle to verify if making a check to
1458
                the validity of cblocks parameters is selected from user (-W) */
1459
1460
                /* let's check that we are not exceeding */
1461
                if ((l_cblk->len + l_seg->newlen) > 8192) {
1462
                    opj_event_msg(p_manager, EVT_WARNING,
1463
                                  "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1464
                                  l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1465
                    if (!JPWL_ASSUME) {
1466
                        opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
1467
                        return OPJ_FALSE;
1468
                    }
1469
                    l_seg->newlen = 8192 - l_cblk->len;
1470
                    opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n",
1471
                                  l_seg->newlen);
1472
                    break;
1473
                };
1474
1475
#endif /* USE_JPWL */
1476
1477
828k
                if (l_cblk->numchunks == l_cblk->numchunksalloc) {
1478
633k
                    OPJ_UINT32 l_numchunksalloc = l_cblk->numchunksalloc * 2 + 1;
1479
633k
                    opj_tcd_seg_data_chunk_t* l_chunks =
1480
633k
                        (opj_tcd_seg_data_chunk_t*)opj_realloc(l_cblk->chunks,
1481
633k
                                l_numchunksalloc * sizeof(opj_tcd_seg_data_chunk_t));
1482
633k
                    if (l_chunks == NULL) {
1483
0
                        opj_event_msg(p_manager, EVT_ERROR,
1484
0
                                      "cannot allocate opj_tcd_seg_data_chunk_t* array");
1485
0
                        return OPJ_FALSE;
1486
0
                    }
1487
633k
                    l_cblk->chunks = l_chunks;
1488
633k
                    l_cblk->numchunksalloc = l_numchunksalloc;
1489
633k
                }
1490
1491
828k
                l_cblk->chunks[l_cblk->numchunks].data = l_current_data;
1492
828k
                l_cblk->chunks[l_cblk->numchunks].len = l_seg->newlen;
1493
828k
                l_cblk->numchunks ++;
1494
1495
828k
                l_current_data += l_seg->newlen;
1496
828k
                l_seg->len += l_seg->newlen;
1497
828k
                l_seg->numpasses += l_seg->numnewpasses;
1498
828k
                l_cblk->numnewpasses -= l_seg->numnewpasses;
1499
1500
828k
                l_seg->real_num_passes = l_seg->numpasses;
1501
1502
828k
                if (l_cblk->numnewpasses > 0) {
1503
103k
                    ++l_seg;
1504
103k
                    ++l_cblk->numsegs;
1505
103k
                }
1506
828k
            } while (l_cblk->numnewpasses > 0);
1507
1508
724k
            l_cblk->real_num_segs = l_cblk->numsegs;
1509
724k
            ++l_cblk;
1510
724k
        } /* next code_block */
1511
1512
1.31M
        ++l_band;
1513
1.31M
    }
1514
1515
    // return the number of bytes read
1516
1.31M
    if (partial_buffer) {
1517
0
        *(p_data_read) = p_max_length;
1518
1.31M
    } else {
1519
1.31M
        *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
1520
1.31M
    }
1521
1522
1.31M
    return OPJ_TRUE;
1523
1.31M
}
1524
1525
static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
1526
                                        opj_tcd_tile_t *p_tile,
1527
                                        opj_pi_iterator_t *p_pi,
1528
                                        OPJ_UINT32 * p_data_read,
1529
                                        OPJ_UINT32 p_max_length,
1530
                                        opj_packet_info_t *pack_info,
1531
                                        opj_event_mgr_t *p_manager)
1532
521
{
1533
521
    OPJ_UINT32 bandno, cblkno;
1534
521
    OPJ_UINT32 l_nb_code_blocks;
1535
521
    opj_tcd_band_t *l_band = 00;
1536
521
    opj_tcd_cblk_dec_t* l_cblk = 00;
1537
521
    opj_tcd_resolution_t* l_res =
1538
521
        &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
1539
1540
521
    OPJ_ARG_NOT_USED(p_t2);
1541
521
    OPJ_ARG_NOT_USED(pack_info);
1542
1543
521
    *p_data_read = 0;
1544
521
    l_band = l_res->bands;
1545
1546
2.08k
    for (bandno = 0; bandno < l_res->numbands; ++bandno) {
1547
1.56k
        opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
1548
1549
1.56k
        if ((l_band->x1 - l_band->x0 == 0) || (l_band->y1 - l_band->y0 == 0)) {
1550
1.56k
            ++l_band;
1551
1.56k
            continue;
1552
1.56k
        }
1553
1554
0
        l_nb_code_blocks = l_prc->cw * l_prc->ch;
1555
0
        l_cblk = l_prc->cblks.dec;
1556
1557
0
        for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
1558
0
            opj_tcd_seg_t *l_seg = 00;
1559
1560
0
            if (!l_cblk->numnewpasses) {
1561
                /* nothing to do */
1562
0
                ++l_cblk;
1563
0
                continue;
1564
0
            }
1565
1566
0
            if (!l_cblk->numsegs) {
1567
0
                l_seg = l_cblk->segs;
1568
0
                ++l_cblk->numsegs;
1569
0
            } else {
1570
0
                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
1571
1572
0
                if (l_seg->numpasses == l_seg->maxpasses) {
1573
0
                    ++l_seg;
1574
0
                    ++l_cblk->numsegs;
1575
0
                }
1576
0
            }
1577
1578
0
            do {
1579
                /* Check possible overflow then size */
1580
0
                if (((*p_data_read + l_seg->newlen) < (*p_data_read)) ||
1581
0
                        ((*p_data_read + l_seg->newlen) > p_max_length)) {
1582
0
                    if (p_t2->cp->strict) {
1583
0
                        opj_event_msg(p_manager, EVT_ERROR,
1584
0
                                      "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1585
0
                                      l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1586
0
                                      p_pi->compno);
1587
0
                        return OPJ_FALSE;
1588
0
                    } else {
1589
0
                        opj_event_msg(p_manager, EVT_WARNING,
1590
0
                                      "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1591
0
                                      l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
1592
0
                                      p_pi->compno);
1593
0
                    }
1594
0
                }
1595
1596
#ifdef USE_JPWL
1597
                /* we need here a j2k handle to verify if making a check to
1598
                the validity of cblocks parameters is selected from user (-W) */
1599
1600
                /* let's check that we are not exceeding */
1601
                if ((l_cblk->len + l_seg->newlen) > 8192) {
1602
                    opj_event_msg(p_manager, EVT_WARNING,
1603
                                  "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
1604
                                  l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
1605
                    if (!JPWL_ASSUME) {
1606
                        opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
1607
                        return -999;
1608
                    }
1609
                    l_seg->newlen = 8192 - l_cblk->len;
1610
                    opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n",
1611
                                  l_seg->newlen);
1612
                    break;
1613
                };
1614
1615
#endif /* USE_JPWL */
1616
0
                JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read,
1617
0
                            l_seg->newlen);
1618
0
                *(p_data_read) += l_seg->newlen;
1619
1620
0
                l_seg->numpasses += l_seg->numnewpasses;
1621
0
                l_cblk->numnewpasses -= l_seg->numnewpasses;
1622
0
                if (l_cblk->numnewpasses > 0) {
1623
0
                    ++l_seg;
1624
0
                    ++l_cblk->numsegs;
1625
0
                }
1626
0
            } while (l_cblk->numnewpasses > 0);
1627
1628
0
            ++l_cblk;
1629
0
        }
1630
1631
0
        ++l_band;
1632
0
    }
1633
1634
521
    return OPJ_TRUE;
1635
521
}
1636
1637
1638
static OPJ_BOOL opj_t2_init_seg(opj_tcd_cblk_dec_t* cblk,
1639
                                OPJ_UINT32 index,
1640
                                OPJ_UINT32 cblksty,
1641
                                OPJ_UINT32 first)
1642
577k
{
1643
577k
    opj_tcd_seg_t* seg = 00;
1644
577k
    OPJ_UINT32 l_nb_segs = index + 1;
1645
1646
577k
    if (l_nb_segs > cblk->m_current_max_segs) {
1647
5.99k
        opj_tcd_seg_t* new_segs;
1648
5.99k
        OPJ_UINT32 l_m_current_max_segs = cblk->m_current_max_segs +
1649
5.99k
                                          OPJ_J2K_DEFAULT_NB_SEGS;
1650
1651
5.99k
        new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs,
1652
5.99k
                                                l_m_current_max_segs * sizeof(opj_tcd_seg_t));
1653
5.99k
        if (! new_segs) {
1654
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
1655
0
            return OPJ_FALSE;
1656
0
        }
1657
5.99k
        cblk->segs = new_segs;
1658
5.99k
        memset(new_segs + cblk->m_current_max_segs,
1659
5.99k
               0, OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));
1660
5.99k
        cblk->m_current_max_segs = l_m_current_max_segs;
1661
5.99k
    }
1662
1663
577k
    seg = &cblk->segs[index];
1664
577k
    opj_tcd_reinit_segment(seg);
1665
1666
577k
    if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
1667
22.1k
        seg->maxpasses = 1;
1668
554k
    } else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
1669
113k
        if (first) {
1670
24.8k
            seg->maxpasses = 10;
1671
88.1k
        } else {
1672
88.1k
            seg->maxpasses = (((seg - 1)->maxpasses == 1) ||
1673
88.1k
                              ((seg - 1)->maxpasses == 10)) ? 2 : 1;
1674
88.1k
        }
1675
441k
    } else {
1676
        /* See paragraph "B.10.6 Number of coding passes" of the standard.
1677
         * Probably that 109 must be interpreted a (Mb-1)*3 + 1 with Mb=37,
1678
         * Mb being the maximum number of bit-planes available for the
1679
         * representation of coefficients in the sub-band */
1680
441k
        seg->maxpasses = 109;
1681
441k
    }
1682
1683
577k
    return OPJ_TRUE;
1684
577k
}