Coverage Report

Created: 2026-05-16 07:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openjpeg/src/lib/openjp2/j2k.c
Line
Count
Source
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, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
15
 * Copyright (c) 2006-2007, Parvatha Elangovan
16
 * Copyright (c) 2010-2011, Kaori Hagihara
17
 * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
18
 * Copyright (c) 2012, CS Systemes d'Information, France
19
 * Copyright (c) 2017, IntoPIX SA <support@intopix.com>
20
 * All rights reserved.
21
 *
22
 * Redistribution and use in source and binary forms, with or without
23
 * modification, are permitted provided that the following conditions
24
 * are met:
25
 * 1. Redistributions of source code must retain the above copyright
26
 *    notice, this list of conditions and the following disclaimer.
27
 * 2. Redistributions in binary form must reproduce the above copyright
28
 *    notice, this list of conditions and the following disclaimer in the
29
 *    documentation and/or other materials provided with the distribution.
30
 *
31
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
32
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
35
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
36
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
37
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
38
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
39
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41
 * POSSIBILITY OF SUCH DAMAGE.
42
 */
43
44
#include "opj_includes.h"
45
46
/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
47
/*@{*/
48
49
/** @name Local static functions */
50
/*@{*/
51
52
/**
53
 * Sets up the procedures to do on reading header. Developers wanting to extend the library can add their own reading procedures.
54
 */
55
static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
56
        opj_event_mgr_t * p_manager);
57
58
/**
59
 * The read header procedure.
60
 */
61
static OPJ_BOOL opj_j2k_read_header_procedure(opj_j2k_t *p_j2k,
62
        opj_stream_private_t *p_stream,
63
        opj_event_mgr_t * p_manager);
64
65
/**
66
 * The default encoding validation procedure without any extension.
67
 *
68
 * @param       p_j2k                   the jpeg2000 codec to validate.
69
 * @param       p_stream                the input stream to validate.
70
 * @param       p_manager               the user event manager.
71
 *
72
 * @return true if the parameters are correct.
73
 */
74
static OPJ_BOOL opj_j2k_encoding_validation(opj_j2k_t * p_j2k,
75
        opj_stream_private_t *p_stream,
76
        opj_event_mgr_t * p_manager);
77
78
/**
79
 * The default decoding validation procedure without any extension.
80
 *
81
 * @param       p_j2k                   the jpeg2000 codec to validate.
82
 * @param       p_stream                                the input stream to validate.
83
 * @param       p_manager               the user event manager.
84
 *
85
 * @return true if the parameters are correct.
86
 */
87
static OPJ_BOOL opj_j2k_decoding_validation(opj_j2k_t * p_j2k,
88
        opj_stream_private_t *p_stream,
89
        opj_event_mgr_t * p_manager);
90
91
/**
92
 * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
93
 * are valid. Developers wanting to extend the library can add their own validation procedures.
94
 */
95
static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
96
        opj_event_mgr_t * p_manager);
97
98
/**
99
 * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
100
 * are valid. Developers wanting to extend the library can add their own validation procedures.
101
 */
102
static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
103
        opj_event_mgr_t * p_manager);
104
105
/**
106
 * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
107
 * are valid. Developers wanting to extend the library can add their own validation procedures.
108
 */
109
static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
110
        opj_event_mgr_t * p_manager);
111
112
/**
113
 * The mct encoding validation procedure.
114
 *
115
 * @param       p_j2k                   the jpeg2000 codec to validate.
116
 * @param       p_stream                                the input stream to validate.
117
 * @param       p_manager               the user event manager.
118
 *
119
 * @return true if the parameters are correct.
120
 */
121
static OPJ_BOOL opj_j2k_mct_validation(opj_j2k_t * p_j2k,
122
                                       opj_stream_private_t *p_stream,
123
                                       opj_event_mgr_t * p_manager);
124
125
/**
126
 * Builds the tcd decoder to use to decode tile.
127
 */
128
static OPJ_BOOL opj_j2k_build_decoder(opj_j2k_t * p_j2k,
129
                                      opj_stream_private_t *p_stream,
130
                                      opj_event_mgr_t * p_manager);
131
/**
132
 * Builds the tcd encoder to use to encode tile.
133
 */
134
static OPJ_BOOL opj_j2k_build_encoder(opj_j2k_t * p_j2k,
135
                                      opj_stream_private_t *p_stream,
136
                                      opj_event_mgr_t * p_manager);
137
138
/**
139
 * Creates a tile-coder encoder.
140
 *
141
 * @param       p_stream                        the stream to write data to.
142
 * @param       p_j2k                           J2K codec.
143
 * @param       p_manager                   the user event manager.
144
*/
145
static OPJ_BOOL opj_j2k_create_tcd(opj_j2k_t *p_j2k,
146
                                   opj_stream_private_t *p_stream,
147
                                   opj_event_mgr_t * p_manager);
148
149
/**
150
 * Executes the given procedures on the given codec.
151
 *
152
 * @param       p_procedure_list        the list of procedures to execute
153
 * @param       p_j2k                           the jpeg2000 codec to execute the procedures on.
154
 * @param       p_stream                        the stream to execute the procedures on.
155
 * @param       p_manager                       the user manager.
156
 *
157
 * @return      true                            if all the procedures were successfully executed.
158
 */
159
static OPJ_BOOL opj_j2k_exec(opj_j2k_t * p_j2k,
160
                             opj_procedure_list_t * p_procedure_list,
161
                             opj_stream_private_t *p_stream,
162
                             opj_event_mgr_t * p_manager);
163
164
/**
165
 * Updates the rates of the tcp.
166
 *
167
 * @param       p_stream                                the stream to write data to.
168
 * @param       p_j2k                           J2K codec.
169
 * @param       p_manager               the user event manager.
170
*/
171
static OPJ_BOOL opj_j2k_update_rates(opj_j2k_t *p_j2k,
172
                                     opj_stream_private_t *p_stream,
173
                                     opj_event_mgr_t * p_manager);
174
175
/**
176
 * Copies the decoding tile parameters onto all the tile parameters.
177
 * Creates also the tile decoder.
178
 */
179
static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,
180
        opj_stream_private_t *p_stream,
181
        opj_event_mgr_t * p_manager);
182
183
/**
184
 * Destroys the memory associated with the decoding of headers.
185
 */
186
static OPJ_BOOL opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,
187
        opj_stream_private_t *p_stream,
188
        opj_event_mgr_t * p_manager);
189
190
/**
191
 * Reads the lookup table containing all the marker, status and action, and returns the handler associated
192
 * with the marker value.
193
 * @param       p_id            Marker value to look up
194
 *
195
 * @return      the handler associated with the id.
196
*/
197
static const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler(
198
    OPJ_UINT32 p_id);
199
200
/**
201
 * Destroys a tile coding parameter structure.
202
 *
203
 * @param       p_tcp           the tile coding parameter to destroy.
204
 */
205
static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp);
206
207
/**
208
 * Destroys the data inside a tile coding parameter structure.
209
 *
210
 * @param       p_tcp           the tile coding parameter which contain data to destroy.
211
 */
212
static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp);
213
214
/**
215
 * Destroys a coding parameter structure.
216
 *
217
 * @param       p_cp            the coding parameter to destroy.
218
 */
219
static void opj_j2k_cp_destroy(opj_cp_t *p_cp);
220
221
/**
222
 * Compare 2 a SPCod/ SPCoc elements, i.e. the coding style of a given component of a tile.
223
 *
224
 * @param       p_j2k            J2K codec.
225
 * @param       p_tile_no        Tile number
226
 * @param       p_first_comp_no  The 1st component number to compare.
227
 * @param       p_second_comp_no The 1st component number to compare.
228
 *
229
 * @return OPJ_TRUE if SPCdod are equals.
230
 */
231
static OPJ_BOOL opj_j2k_compare_SPCod_SPCoc(opj_j2k_t *p_j2k,
232
        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
233
234
/**
235
 * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
236
 *
237
 * @param       p_j2k           J2K codec.
238
 * @param       p_tile_no       FIXME DOC
239
 * @param       p_comp_no       the component number to output.
240
 * @param       p_data          FIXME DOC
241
 * @param       p_header_size   FIXME DOC
242
 * @param       p_manager       the user event manager.
243
 *
244
 * @return FIXME DOC
245
*/
246
static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(opj_j2k_t *p_j2k,
247
        OPJ_UINT32 p_tile_no,
248
        OPJ_UINT32 p_comp_no,
249
        OPJ_BYTE * p_data,
250
        OPJ_UINT32 * p_header_size,
251
        opj_event_mgr_t * p_manager);
252
253
/**
254
 * Gets the size taken by writing a SPCod or SPCoc for the given tile and component.
255
 *
256
 * @param       p_j2k                   the J2K codec.
257
 * @param       p_tile_no               the tile index.
258
 * @param       p_comp_no               the component being outputted.
259
 *
260
 * @return      the number of bytes taken by the SPCod element.
261
 */
262
static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t *p_j2k,
263
        OPJ_UINT32 p_tile_no,
264
        OPJ_UINT32 p_comp_no);
265
266
/**
267
 * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
268
 * @param       p_j2k           the jpeg2000 codec.
269
 * @param       compno          FIXME DOC
270
 * @param       p_header_data   the data contained in the COM box.
271
 * @param       p_header_size   the size of the data contained in the COM marker.
272
 * @param       p_manager       the user event manager.
273
*/
274
static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
275
        OPJ_UINT32 compno,
276
        OPJ_BYTE * p_header_data,
277
        OPJ_UINT32 * p_header_size,
278
        opj_event_mgr_t * p_manager);
279
280
/**
281
 * Gets the size taken by writing SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
282
 *
283
 * @param       p_tile_no               the tile index.
284
 * @param       p_comp_no               the component being outputted.
285
 * @param       p_j2k                   the J2K codec.
286
 *
287
 * @return      the number of bytes taken by the SPCod element.
288
 */
289
static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size(opj_j2k_t *p_j2k,
290
        OPJ_UINT32 p_tile_no,
291
        OPJ_UINT32 p_comp_no);
292
293
/**
294
 * Compares 2 SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
295
 *
296
 * @param       p_j2k                   J2K codec.
297
 * @param       p_tile_no               the tile to output.
298
 * @param       p_first_comp_no         the first component number to compare.
299
 * @param       p_second_comp_no        the second component number to compare.
300
 *
301
 * @return OPJ_TRUE if equals.
302
 */
303
static OPJ_BOOL opj_j2k_compare_SQcd_SQcc(opj_j2k_t *p_j2k,
304
        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
305
306
307
/**
308
 * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
309
 *
310
 * @param       p_tile_no               the tile to output.
311
 * @param       p_comp_no               the component number to output.
312
 * @param       p_data                  the data buffer.
313
 * @param       p_header_size   pointer to the size of the data buffer, it is changed by the function.
314
 * @param       p_j2k                   J2K codec.
315
 * @param       p_manager               the user event manager.
316
 *
317
*/
318
static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
319
                                        OPJ_UINT32 p_tile_no,
320
                                        OPJ_UINT32 p_comp_no,
321
                                        OPJ_BYTE * p_data,
322
                                        OPJ_UINT32 * p_header_size,
323
                                        opj_event_mgr_t * p_manager);
324
325
/**
326
 * Updates the Tile Length Marker.
327
 */
328
static void opj_j2k_update_tlm(opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size);
329
330
/**
331
 * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
332
 *
333
 * @param       p_j2k           J2K codec.
334
 * @param       compno          the component number to output.
335
 * @param       p_header_data   the data buffer.
336
 * @param       p_header_size   pointer to the size of the data buffer, it is changed by the function.
337
 * @param       p_manager       the user event manager.
338
 *
339
*/
340
static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
341
                                       OPJ_UINT32 compno,
342
                                       OPJ_BYTE * p_header_data,
343
                                       OPJ_UINT32 * p_header_size,
344
                                       opj_event_mgr_t * p_manager);
345
346
/**
347
 * Copies the tile component parameters of all the component from the first tile component.
348
 *
349
 * @param               p_j2k           the J2k codec.
350
 */
351
static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k);
352
353
/**
354
 * Copies the tile quantization parameters of all the component from the first tile component.
355
 *
356
 * @param               p_j2k           the J2k codec.
357
 */
358
static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k);
359
360
/**
361
 * Reads the tiles.
362
 */
363
static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
364
                                     opj_stream_private_t *p_stream,
365
                                     opj_event_mgr_t * p_manager);
366
367
static OPJ_BOOL opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,
368
                                       OPJ_UINT32 p_tile_index,
369
                                       opj_stream_private_t *p_stream,
370
                                       opj_event_mgr_t * p_manager);
371
372
static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd,
373
        opj_image_t* p_output_image);
374
375
static void opj_get_tile_dimensions(opj_image_t * l_image,
376
                                    opj_tcd_tilecomp_t * l_tilec,
377
                                    opj_image_comp_t * l_img_comp,
378
                                    OPJ_UINT32* l_size_comp,
379
                                    OPJ_UINT32* l_width,
380
                                    OPJ_UINT32* l_height,
381
                                    OPJ_UINT32* l_offset_x,
382
                                    OPJ_UINT32* l_offset_y,
383
                                    OPJ_UINT32* l_image_width,
384
                                    OPJ_UINT32* l_stride,
385
                                    OPJ_UINT32* l_tile_offset);
386
387
static void opj_j2k_get_tile_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
388
389
static OPJ_BOOL opj_j2k_post_write_tile(opj_j2k_t * p_j2k,
390
                                        opj_stream_private_t *p_stream,
391
                                        opj_event_mgr_t * p_manager);
392
393
/**
394
 * Sets up the procedures to do on writing header.
395
 * Developers wanting to extend the library can add their own writing procedures.
396
 */
397
static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
398
        opj_event_mgr_t * p_manager);
399
400
static OPJ_BOOL opj_j2k_write_first_tile_part(opj_j2k_t *p_j2k,
401
        OPJ_BYTE * p_data,
402
        OPJ_UINT32 * p_data_written,
403
        OPJ_UINT32 total_data_size,
404
        opj_stream_private_t *p_stream,
405
        struct opj_event_mgr * p_manager);
406
407
static OPJ_BOOL opj_j2k_write_all_tile_parts(opj_j2k_t *p_j2k,
408
        OPJ_BYTE * p_data,
409
        OPJ_UINT32 * p_data_written,
410
        OPJ_UINT32 total_data_size,
411
        opj_stream_private_t *p_stream,
412
        struct opj_event_mgr * p_manager);
413
414
/**
415
 * Gets the offset of the header.
416
 *
417
 * @param       p_stream                the stream to write data to.
418
 * @param       p_j2k                   J2K codec.
419
 * @param       p_manager               the user event manager.
420
*/
421
static OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
422
                                       opj_stream_private_t *p_stream,
423
                                       opj_event_mgr_t * p_manager);
424
425
static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k);
426
427
/*
428
 * -----------------------------------------------------------------------
429
 * -----------------------------------------------------------------------
430
 * -----------------------------------------------------------------------
431
 */
432
433
/**
434
 * Writes the SOC marker (Start Of Codestream)
435
 *
436
 * @param       p_stream                        the stream to write data to.
437
 * @param       p_j2k                   J2K codec.
438
 * @param       p_manager       the user event manager.
439
*/
440
static OPJ_BOOL opj_j2k_write_soc(opj_j2k_t *p_j2k,
441
                                  opj_stream_private_t *p_stream,
442
                                  opj_event_mgr_t * p_manager);
443
444
/**
445
 * Reads a SOC marker (Start of Codestream)
446
 * @param       p_j2k           the jpeg2000 file codec.
447
 * @param       p_stream        XXX needs data
448
 * @param       p_manager       the user event manager.
449
*/
450
static OPJ_BOOL opj_j2k_read_soc(opj_j2k_t *p_j2k,
451
                                 opj_stream_private_t *p_stream,
452
                                 opj_event_mgr_t * p_manager);
453
454
/**
455
 * Writes the SIZ marker (image and tile size)
456
 *
457
 * @param       p_j2k           J2K codec.
458
 * @param       p_stream        the stream to write data to.
459
 * @param       p_manager       the user event manager.
460
*/
461
static OPJ_BOOL opj_j2k_write_siz(opj_j2k_t *p_j2k,
462
                                  opj_stream_private_t *p_stream,
463
                                  opj_event_mgr_t * p_manager);
464
465
/**
466
 * Reads a SIZ marker (image and tile size)
467
 * @param       p_j2k           the jpeg2000 file codec.
468
 * @param       p_header_data   the data contained in the SIZ box.
469
 * @param       p_header_size   the size of the data contained in the SIZ marker.
470
 * @param       p_manager       the user event manager.
471
*/
472
static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
473
                                 OPJ_BYTE * p_header_data,
474
                                 OPJ_UINT32 p_header_size,
475
                                 opj_event_mgr_t * p_manager);
476
477
/**
478
 * Writes the COM marker (comment)
479
 *
480
 * @param       p_stream                        the stream to write data to.
481
 * @param       p_j2k                   J2K codec.
482
 * @param       p_manager       the user event manager.
483
*/
484
static OPJ_BOOL opj_j2k_write_com(opj_j2k_t *p_j2k,
485
                                  opj_stream_private_t *p_stream,
486
                                  opj_event_mgr_t * p_manager);
487
488
/**
489
 * Reads a COM marker (comments)
490
 * @param       p_j2k           the jpeg2000 file codec.
491
 * @param       p_header_data   the data contained in the COM box.
492
 * @param       p_header_size   the size of the data contained in the COM marker.
493
 * @param       p_manager       the user event manager.
494
*/
495
static OPJ_BOOL opj_j2k_read_com(opj_j2k_t *p_j2k,
496
                                 OPJ_BYTE * p_header_data,
497
                                 OPJ_UINT32 p_header_size,
498
                                 opj_event_mgr_t * p_manager);
499
/**
500
 * Writes the COD marker (Coding style default)
501
 *
502
 * @param       p_stream                        the stream to write data to.
503
 * @param       p_j2k                   J2K codec.
504
 * @param       p_manager       the user event manager.
505
*/
506
static OPJ_BOOL opj_j2k_write_cod(opj_j2k_t *p_j2k,
507
                                  opj_stream_private_t *p_stream,
508
                                  opj_event_mgr_t * p_manager);
509
510
/**
511
 * Reads a COD marker (Coding style defaults)
512
 * @param       p_header_data   the data contained in the COD box.
513
 * @param       p_j2k                   the jpeg2000 codec.
514
 * @param       p_header_size   the size of the data contained in the COD marker.
515
 * @param       p_manager               the user event manager.
516
*/
517
static OPJ_BOOL opj_j2k_read_cod(opj_j2k_t *p_j2k,
518
                                 OPJ_BYTE * p_header_data,
519
                                 OPJ_UINT32 p_header_size,
520
                                 opj_event_mgr_t * p_manager);
521
522
/**
523
 * Compares 2 COC markers (Coding style component)
524
 *
525
 * @param       p_j2k            J2K codec.
526
 * @param       p_first_comp_no  the index of the first component to compare.
527
 * @param       p_second_comp_no the index of the second component to compare.
528
 *
529
 * @return      OPJ_TRUE if equals
530
 */
531
static OPJ_BOOL opj_j2k_compare_coc(opj_j2k_t *p_j2k,
532
                                    OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
533
534
/**
535
 * Writes the COC marker (Coding style component)
536
 *
537
 * @param       p_j2k       J2K codec.
538
 * @param       p_comp_no   the index of the component to output.
539
 * @param       p_stream    the stream to write data to.
540
 * @param       p_manager   the user event manager.
541
*/
542
static OPJ_BOOL opj_j2k_write_coc(opj_j2k_t *p_j2k,
543
                                  OPJ_UINT32 p_comp_no,
544
                                  opj_stream_private_t *p_stream,
545
                                  opj_event_mgr_t * p_manager);
546
547
/**
548
 * Writes the COC marker (Coding style component)
549
 *
550
 * @param       p_j2k                   J2K codec.
551
 * @param       p_comp_no               the index of the component to output.
552
 * @param       p_data          FIXME DOC
553
 * @param       p_data_written  FIXME DOC
554
 * @param       p_manager               the user event manager.
555
*/
556
static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
557
                                        OPJ_UINT32 p_comp_no,
558
                                        OPJ_BYTE * p_data,
559
                                        OPJ_UINT32 * p_data_written,
560
                                        opj_event_mgr_t * p_manager);
561
562
/**
563
 * Gets the maximum size taken by a coc.
564
 *
565
 * @param       p_j2k   the jpeg2000 codec to use.
566
 */
567
static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k);
568
569
/**
570
 * Reads a COC marker (Coding Style Component)
571
 * @param       p_header_data   the data contained in the COC box.
572
 * @param       p_j2k                   the jpeg2000 codec.
573
 * @param       p_header_size   the size of the data contained in the COC marker.
574
 * @param       p_manager               the user event manager.
575
*/
576
static OPJ_BOOL opj_j2k_read_coc(opj_j2k_t *p_j2k,
577
                                 OPJ_BYTE * p_header_data,
578
                                 OPJ_UINT32 p_header_size,
579
                                 opj_event_mgr_t * p_manager);
580
581
/**
582
 * Writes the QCD marker (quantization default)
583
 *
584
 * @param       p_j2k                   J2K codec.
585
 * @param       p_stream                the stream to write data to.
586
 * @param       p_manager               the user event manager.
587
*/
588
static OPJ_BOOL opj_j2k_write_qcd(opj_j2k_t *p_j2k,
589
                                  opj_stream_private_t *p_stream,
590
                                  opj_event_mgr_t * p_manager);
591
592
/**
593
 * Reads a QCD marker (Quantization defaults)
594
 * @param       p_header_data   the data contained in the QCD box.
595
 * @param       p_j2k                   the jpeg2000 codec.
596
 * @param       p_header_size   the size of the data contained in the QCD marker.
597
 * @param       p_manager               the user event manager.
598
*/
599
static OPJ_BOOL opj_j2k_read_qcd(opj_j2k_t *p_j2k,
600
                                 OPJ_BYTE * p_header_data,
601
                                 OPJ_UINT32 p_header_size,
602
                                 opj_event_mgr_t * p_manager);
603
604
/**
605
 * Compare QCC markers (quantization component)
606
 *
607
 * @param       p_j2k                 J2K codec.
608
 * @param       p_first_comp_no       the index of the first component to compare.
609
 * @param       p_second_comp_no      the index of the second component to compare.
610
 *
611
 * @return OPJ_TRUE if equals.
612
 */
613
static OPJ_BOOL opj_j2k_compare_qcc(opj_j2k_t *p_j2k,
614
                                    OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
615
616
/**
617
 * Writes the QCC marker (quantization component)
618
 *
619
 * @param       p_comp_no       the index of the component to output.
620
 * @param       p_stream                the stream to write data to.
621
 * @param       p_j2k                   J2K codec.
622
 * @param       p_manager               the user event manager.
623
*/
624
static OPJ_BOOL opj_j2k_write_qcc(opj_j2k_t *p_j2k,
625
                                  OPJ_UINT32 p_comp_no,
626
                                  opj_stream_private_t *p_stream,
627
                                  opj_event_mgr_t * p_manager);
628
629
/**
630
 * Writes the QCC marker (quantization component)
631
 *
632
 * @param       p_j2k           J2K codec.
633
 * @param       p_comp_no       the index of the component to output.
634
 * @param       p_data          FIXME DOC
635
 * @param       p_data_written  the stream to write data to.
636
 * @param       p_manager       the user event manager.
637
*/
638
static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
639
                                        OPJ_UINT32 p_comp_no,
640
                                        OPJ_BYTE * p_data,
641
                                        OPJ_UINT32 * p_data_written,
642
                                        opj_event_mgr_t * p_manager);
643
644
/**
645
 * Gets the maximum size taken by a qcc.
646
 */
647
static OPJ_UINT32 opj_j2k_get_max_qcc_size(opj_j2k_t *p_j2k);
648
649
/**
650
 * Reads a QCC marker (Quantization component)
651
 * @param       p_header_data   the data contained in the QCC box.
652
 * @param       p_j2k                   the jpeg2000 codec.
653
 * @param       p_header_size   the size of the data contained in the QCC marker.
654
 * @param       p_manager               the user event manager.
655
*/
656
static OPJ_BOOL opj_j2k_read_qcc(opj_j2k_t *p_j2k,
657
                                 OPJ_BYTE * p_header_data,
658
                                 OPJ_UINT32 p_header_size,
659
                                 opj_event_mgr_t * p_manager);
660
/**
661
 * Writes the POC marker (Progression Order Change)
662
 *
663
 * @param       p_stream                                the stream to write data to.
664
 * @param       p_j2k                           J2K codec.
665
 * @param       p_manager               the user event manager.
666
*/
667
static OPJ_BOOL opj_j2k_write_poc(opj_j2k_t *p_j2k,
668
                                  opj_stream_private_t *p_stream,
669
                                  opj_event_mgr_t * p_manager);
670
/**
671
 * Writes the POC marker (Progression Order Change)
672
 *
673
 * @param       p_j2k          J2K codec.
674
 * @param       p_data         FIXME DOC
675
 * @param       p_data_written the stream to write data to.
676
 * @param       p_manager      the user event manager.
677
 */
678
static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
679
                                        OPJ_BYTE * p_data,
680
                                        OPJ_UINT32 * p_data_written,
681
                                        opj_event_mgr_t * p_manager);
682
/**
683
 * Gets the maximum size taken by the writing of a POC.
684
 */
685
static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k);
686
687
/**
688
 * Reads a POC marker (Progression Order Change)
689
 *
690
 * @param       p_header_data   the data contained in the POC box.
691
 * @param       p_j2k                   the jpeg2000 codec.
692
 * @param       p_header_size   the size of the data contained in the POC marker.
693
 * @param       p_manager               the user event manager.
694
*/
695
static OPJ_BOOL opj_j2k_read_poc(opj_j2k_t *p_j2k,
696
                                 OPJ_BYTE * p_header_data,
697
                                 OPJ_UINT32 p_header_size,
698
                                 opj_event_mgr_t * p_manager);
699
700
/**
701
 * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.
702
 */
703
static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k);
704
705
/**
706
 * Gets the maximum size taken by the headers of the SOT.
707
 *
708
 * @param       p_j2k   the jpeg2000 codec to use.
709
 */
710
static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k);
711
712
/**
713
 * Reads a CRG marker (Component registration)
714
 *
715
 * @param       p_header_data   the data contained in the TLM box.
716
 * @param       p_j2k                   the jpeg2000 codec.
717
 * @param       p_header_size   the size of the data contained in the TLM marker.
718
 * @param       p_manager               the user event manager.
719
*/
720
static OPJ_BOOL opj_j2k_read_crg(opj_j2k_t *p_j2k,
721
                                 OPJ_BYTE * p_header_data,
722
                                 OPJ_UINT32 p_header_size,
723
                                 opj_event_mgr_t * p_manager);
724
/**
725
 * Reads a TLM marker (Tile Length Marker)
726
 *
727
 * @param       p_header_data   the data contained in the TLM box.
728
 * @param       p_j2k                   the jpeg2000 codec.
729
 * @param       p_header_size   the size of the data contained in the TLM marker.
730
 * @param       p_manager               the user event manager.
731
*/
732
static OPJ_BOOL opj_j2k_read_tlm(opj_j2k_t *p_j2k,
733
                                 OPJ_BYTE * p_header_data,
734
                                 OPJ_UINT32 p_header_size,
735
                                 opj_event_mgr_t * p_manager);
736
737
/**
738
 * Writes the updated tlm.
739
 *
740
 * @param       p_stream                the stream to write data to.
741
 * @param       p_j2k                   J2K codec.
742
 * @param       p_manager               the user event manager.
743
*/
744
static OPJ_BOOL opj_j2k_write_updated_tlm(opj_j2k_t *p_j2k,
745
        opj_stream_private_t *p_stream,
746
        opj_event_mgr_t * p_manager);
747
748
/**
749
 * Reads a PLM marker (Packet length, main header marker)
750
 *
751
 * @param       p_header_data   the data contained in the TLM box.
752
 * @param       p_j2k                   the jpeg2000 codec.
753
 * @param       p_header_size   the size of the data contained in the TLM marker.
754
 * @param       p_manager               the user event manager.
755
*/
756
static OPJ_BOOL opj_j2k_read_plm(opj_j2k_t *p_j2k,
757
                                 OPJ_BYTE * p_header_data,
758
                                 OPJ_UINT32 p_header_size,
759
                                 opj_event_mgr_t * p_manager);
760
/**
761
 * Reads a PLT marker (Packet length, tile-part header)
762
 *
763
 * @param       p_header_data   the data contained in the PLT box.
764
 * @param       p_j2k                   the jpeg2000 codec.
765
 * @param       p_header_size   the size of the data contained in the PLT marker.
766
 * @param       p_manager               the user event manager.
767
*/
768
static OPJ_BOOL opj_j2k_read_plt(opj_j2k_t *p_j2k,
769
                                 OPJ_BYTE * p_header_data,
770
                                 OPJ_UINT32 p_header_size,
771
                                 opj_event_mgr_t * p_manager);
772
773
/**
774
 * Reads a PPM marker (Packed headers, main header)
775
 *
776
 * @param       p_header_data   the data contained in the POC box.
777
 * @param       p_j2k                   the jpeg2000 codec.
778
 * @param       p_header_size   the size of the data contained in the POC marker.
779
 * @param       p_manager               the user event manager.
780
 */
781
782
static OPJ_BOOL opj_j2k_read_ppm(
783
    opj_j2k_t *p_j2k,
784
    OPJ_BYTE * p_header_data,
785
    OPJ_UINT32 p_header_size,
786
    opj_event_mgr_t * p_manager);
787
788
/**
789
 * Merges all PPM markers read (Packed headers, main header)
790
 *
791
 * @param       p_cp      main coding parameters.
792
 * @param       p_manager the user event manager.
793
 */
794
static OPJ_BOOL opj_j2k_merge_ppm(opj_cp_t *p_cp, opj_event_mgr_t * p_manager);
795
796
/**
797
 * Reads a PPT marker (Packed packet headers, tile-part header)
798
 *
799
 * @param       p_header_data   the data contained in the PPT box.
800
 * @param       p_j2k                   the jpeg2000 codec.
801
 * @param       p_header_size   the size of the data contained in the PPT marker.
802
 * @param       p_manager               the user event manager.
803
*/
804
static OPJ_BOOL opj_j2k_read_ppt(opj_j2k_t *p_j2k,
805
                                 OPJ_BYTE * p_header_data,
806
                                 OPJ_UINT32 p_header_size,
807
                                 opj_event_mgr_t * p_manager);
808
809
/**
810
 * Merges all PPT markers read (Packed headers, tile-part header)
811
 *
812
 * @param       p_tcp   the tile.
813
 * @param       p_manager               the user event manager.
814
 */
815
static OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp,
816
                                  opj_event_mgr_t * p_manager);
817
818
819
/**
820
 * Writes the TLM marker (Tile Length Marker)
821
 *
822
 * @param       p_stream                                the stream to write data to.
823
 * @param       p_j2k                           J2K codec.
824
 * @param       p_manager               the user event manager.
825
*/
826
static OPJ_BOOL opj_j2k_write_tlm(opj_j2k_t *p_j2k,
827
                                  opj_stream_private_t *p_stream,
828
                                  opj_event_mgr_t * p_manager);
829
830
/**
831
 * Writes the SOT marker (Start of tile-part)
832
 *
833
 * @param       p_j2k            J2K codec.
834
 * @param       p_data           Output buffer
835
 * @param       total_data_size  Output buffer size
836
 * @param       p_data_written   Number of bytes written into stream
837
 * @param       p_stream         the stream to write data to.
838
 * @param       p_manager        the user event manager.
839
*/
840
static OPJ_BOOL opj_j2k_write_sot(opj_j2k_t *p_j2k,
841
                                  OPJ_BYTE * p_data,
842
                                  OPJ_UINT32 total_data_size,
843
                                  OPJ_UINT32 * p_data_written,
844
                                  const opj_stream_private_t *p_stream,
845
                                  opj_event_mgr_t * p_manager);
846
847
/**
848
 * Reads values from a SOT marker (Start of tile-part)
849
 *
850
 * the j2k decoder state is not affected. No side effects, no checks except for p_header_size.
851
 *
852
 * @param       p_header_data   the data contained in the SOT marker.
853
 * @param       p_header_size   the size of the data contained in the SOT marker.
854
 * @param       p_tile_no       Isot.
855
 * @param       p_tot_len       Psot.
856
 * @param       p_current_part  TPsot.
857
 * @param       p_num_parts     TNsot.
858
 * @param       p_manager       the user event manager.
859
 */
860
static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE *  p_header_data,
861
                                       OPJ_UINT32  p_header_size,
862
                                       OPJ_UINT32* p_tile_no,
863
                                       OPJ_UINT32* p_tot_len,
864
                                       OPJ_UINT32* p_current_part,
865
                                       OPJ_UINT32* p_num_parts,
866
                                       opj_event_mgr_t * p_manager);
867
/**
868
 * Reads a SOT marker (Start of tile-part)
869
 *
870
 * @param       p_header_data   the data contained in the SOT marker.
871
 * @param       p_j2k           the jpeg2000 codec.
872
 * @param       p_header_size   the size of the data contained in the PPT marker.
873
 * @param       p_manager       the user event manager.
874
*/
875
static OPJ_BOOL opj_j2k_read_sot(opj_j2k_t *p_j2k,
876
                                 OPJ_BYTE * p_header_data,
877
                                 OPJ_UINT32 p_header_size,
878
                                 opj_event_mgr_t * p_manager);
879
/**
880
 * Writes the SOD marker (Start of data)
881
 *
882
 * This also writes optional PLT markers (before SOD)
883
 *
884
 * @param       p_j2k               J2K codec.
885
 * @param       p_tile_coder        FIXME DOC
886
 * @param       p_data              FIXME DOC
887
 * @param       p_data_written      FIXME DOC
888
 * @param       total_data_size   FIXME DOC
889
 * @param       p_stream            the stream to write data to.
890
 * @param       p_manager           the user event manager.
891
*/
892
static OPJ_BOOL opj_j2k_write_sod(opj_j2k_t *p_j2k,
893
                                  opj_tcd_t * p_tile_coder,
894
                                  OPJ_BYTE * p_data,
895
                                  OPJ_UINT32 * p_data_written,
896
                                  OPJ_UINT32 total_data_size,
897
                                  const opj_stream_private_t *p_stream,
898
                                  opj_event_mgr_t * p_manager);
899
900
/**
901
 * Reads a SOD marker (Start Of Data)
902
 *
903
 * @param       p_j2k                   the jpeg2000 codec.
904
 * @param       p_stream                FIXME DOC
905
 * @param       p_manager               the user event manager.
906
*/
907
static OPJ_BOOL opj_j2k_read_sod(opj_j2k_t *p_j2k,
908
                                 opj_stream_private_t *p_stream,
909
                                 opj_event_mgr_t * p_manager);
910
911
static void opj_j2k_update_tlm(opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size)
912
1.05k
{
913
1.05k
    if (p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte) {
914
1.05k
        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
915
1.05k
                        p_j2k->m_current_tile_number, 1);
916
1.05k
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 1;
917
1.05k
    } else {
918
0
        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
919
0
                        p_j2k->m_current_tile_number, 2);
920
0
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 2;
921
0
    }
922
923
1.05k
    opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
924
1.05k
                    p_tile_part_size, 4);                                       /* PSOT */
925
1.05k
    p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
926
1.05k
}
927
928
/**
929
 * Writes the RGN marker (Region Of Interest)
930
 *
931
 * @param       p_tile_no               the tile to output
932
 * @param       p_comp_no               the component to output
933
 * @param       nb_comps                the number of components
934
 * @param       p_stream                the stream to write data to.
935
 * @param       p_j2k                   J2K codec.
936
 * @param       p_manager               the user event manager.
937
*/
938
static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
939
                                  OPJ_UINT32 p_tile_no,
940
                                  OPJ_UINT32 p_comp_no,
941
                                  OPJ_UINT32 nb_comps,
942
                                  opj_stream_private_t *p_stream,
943
                                  opj_event_mgr_t * p_manager);
944
945
/**
946
 * Reads a RGN marker (Region Of Interest)
947
 *
948
 * @param       p_header_data   the data contained in the POC box.
949
 * @param       p_j2k                   the jpeg2000 codec.
950
 * @param       p_header_size   the size of the data contained in the POC marker.
951
 * @param       p_manager               the user event manager.
952
*/
953
static OPJ_BOOL opj_j2k_read_rgn(opj_j2k_t *p_j2k,
954
                                 OPJ_BYTE * p_header_data,
955
                                 OPJ_UINT32 p_header_size,
956
                                 opj_event_mgr_t * p_manager);
957
958
/**
959
 * Writes the EOC marker (End of Codestream)
960
 *
961
 * @param       p_stream                the stream to write data to.
962
 * @param       p_j2k                   J2K codec.
963
 * @param       p_manager               the user event manager.
964
*/
965
static OPJ_BOOL opj_j2k_write_eoc(opj_j2k_t *p_j2k,
966
                                  opj_stream_private_t *p_stream,
967
                                  opj_event_mgr_t * p_manager);
968
969
#if 0
970
/**
971
 * Reads a EOC marker (End Of Codestream)
972
 *
973
 * @param       p_j2k                   the jpeg2000 codec.
974
 * @param       p_stream                FIXME DOC
975
 * @param       p_manager               the user event manager.
976
*/
977
static OPJ_BOOL opj_j2k_read_eoc(opj_j2k_t *p_j2k,
978
                                 opj_stream_private_t *p_stream,
979
                                 opj_event_mgr_t * p_manager);
980
#endif
981
982
/**
983
 * Writes the CBD-MCT-MCC-MCO markers (Multi components transform)
984
 *
985
 * @param       p_stream                        the stream to write data to.
986
 * @param       p_j2k                   J2K codec.
987
 * @param       p_manager       the user event manager.
988
*/
989
static OPJ_BOOL opj_j2k_write_mct_data_group(opj_j2k_t *p_j2k,
990
        opj_stream_private_t *p_stream,
991
        opj_event_mgr_t * p_manager);
992
993
/**
994
 * Inits the Info
995
 *
996
 * @param       p_stream                the stream to write data to.
997
 * @param       p_j2k                   J2K codec.
998
 * @param       p_manager               the user event manager.
999
*/
1000
static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
1001
                                  opj_stream_private_t *p_stream,
1002
                                  opj_event_mgr_t * p_manager);
1003
1004
/**
1005
Add main header marker information
1006
@param cstr_index    Codestream information structure
1007
@param type         marker type
1008
@param pos          byte offset of marker segment
1009
@param len          length of marker segment
1010
 */
1011
static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
1012
                                     OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;
1013
/**
1014
Add tile header marker information
1015
@param tileno       tile index number
1016
@param cstr_index   Codestream information structure
1017
@param type         marker type
1018
@param pos          byte offset of marker segment
1019
@param len          length of marker segment
1020
 */
1021
static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
1022
                                     opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
1023
                                     OPJ_UINT32 len);
1024
1025
/**
1026
 * Reads an unknown marker
1027
 *
1028
 * @param       p_j2k                   the jpeg2000 codec.
1029
 * @param       p_stream                the stream object to read from.
1030
 * @param       output_marker           FIXME DOC
1031
 * @param       p_manager               the user event manager.
1032
 *
1033
 * @return      true                    if the marker could be deduced.
1034
*/
1035
static OPJ_BOOL opj_j2k_read_unk(opj_j2k_t *p_j2k,
1036
                                 opj_stream_private_t *p_stream,
1037
                                 OPJ_UINT32 *output_marker,
1038
                                 opj_event_mgr_t * p_manager);
1039
1040
/**
1041
 * Writes the MCT marker (Multiple Component Transform)
1042
 *
1043
 * @param       p_j2k           J2K codec.
1044
 * @param       p_mct_record    FIXME DOC
1045
 * @param       p_stream        the stream to write data to.
1046
 * @param       p_manager       the user event manager.
1047
*/
1048
static OPJ_BOOL opj_j2k_write_mct_record(opj_j2k_t *p_j2k,
1049
        opj_mct_data_t * p_mct_record,
1050
        opj_stream_private_t *p_stream,
1051
        opj_event_mgr_t * p_manager);
1052
1053
/**
1054
 * Reads a MCT marker (Multiple Component Transform)
1055
 *
1056
 * @param       p_header_data   the data contained in the MCT box.
1057
 * @param       p_j2k                   the jpeg2000 codec.
1058
 * @param       p_header_size   the size of the data contained in the MCT marker.
1059
 * @param       p_manager               the user event manager.
1060
*/
1061
static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
1062
                                 OPJ_BYTE * p_header_data,
1063
                                 OPJ_UINT32 p_header_size,
1064
                                 opj_event_mgr_t * p_manager);
1065
1066
/**
1067
 * Writes the MCC marker (Multiple Component Collection)
1068
 *
1069
 * @param       p_j2k                   J2K codec.
1070
 * @param       p_mcc_record            FIXME DOC
1071
 * @param       p_stream                the stream to write data to.
1072
 * @param       p_manager               the user event manager.
1073
*/
1074
static OPJ_BOOL opj_j2k_write_mcc_record(opj_j2k_t *p_j2k,
1075
        opj_simple_mcc_decorrelation_data_t * p_mcc_record,
1076
        opj_stream_private_t *p_stream,
1077
        opj_event_mgr_t * p_manager);
1078
1079
/**
1080
 * Reads a MCC marker (Multiple Component Collection)
1081
 *
1082
 * @param       p_header_data   the data contained in the MCC box.
1083
 * @param       p_j2k                   the jpeg2000 codec.
1084
 * @param       p_header_size   the size of the data contained in the MCC marker.
1085
 * @param       p_manager               the user event manager.
1086
*/
1087
static OPJ_BOOL opj_j2k_read_mcc(opj_j2k_t *p_j2k,
1088
                                 OPJ_BYTE * p_header_data,
1089
                                 OPJ_UINT32 p_header_size,
1090
                                 opj_event_mgr_t * p_manager);
1091
1092
/**
1093
 * Writes the MCO marker (Multiple component transformation ordering)
1094
 *
1095
 * @param       p_stream                                the stream to write data to.
1096
 * @param       p_j2k                           J2K codec.
1097
 * @param       p_manager               the user event manager.
1098
*/
1099
static OPJ_BOOL opj_j2k_write_mco(opj_j2k_t *p_j2k,
1100
                                  opj_stream_private_t *p_stream,
1101
                                  opj_event_mgr_t * p_manager);
1102
1103
/**
1104
 * Reads a MCO marker (Multiple Component Transform Ordering)
1105
 *
1106
 * @param       p_header_data   the data contained in the MCO box.
1107
 * @param       p_j2k                   the jpeg2000 codec.
1108
 * @param       p_header_size   the size of the data contained in the MCO marker.
1109
 * @param       p_manager               the user event manager.
1110
*/
1111
static OPJ_BOOL opj_j2k_read_mco(opj_j2k_t *p_j2k,
1112
                                 OPJ_BYTE * p_header_data,
1113
                                 OPJ_UINT32 p_header_size,
1114
                                 opj_event_mgr_t * p_manager);
1115
1116
static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
1117
                                OPJ_UINT32 p_index);
1118
1119
static void  opj_j2k_read_int16_to_float(const void * p_src_data,
1120
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1121
static void  opj_j2k_read_int32_to_float(const void * p_src_data,
1122
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1123
static void  opj_j2k_read_float32_to_float(const void * p_src_data,
1124
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1125
static void  opj_j2k_read_float64_to_float(const void * p_src_data,
1126
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1127
1128
static void  opj_j2k_read_int16_to_int32(const void * p_src_data,
1129
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1130
static void  opj_j2k_read_int32_to_int32(const void * p_src_data,
1131
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1132
static void  opj_j2k_read_float32_to_int32(const void * p_src_data,
1133
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1134
static void  opj_j2k_read_float64_to_int32(const void * p_src_data,
1135
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1136
1137
static void  opj_j2k_write_float_to_int16(const void * p_src_data,
1138
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1139
static void  opj_j2k_write_float_to_int32(const void * p_src_data,
1140
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1141
static void  opj_j2k_write_float_to_float(const void * p_src_data,
1142
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1143
static void  opj_j2k_write_float_to_float64(const void * p_src_data,
1144
        void * p_dest_data, OPJ_UINT32 p_nb_elem);
1145
1146
/**
1147
 * Ends the encoding, i.e. frees memory.
1148
 *
1149
 * @param       p_stream                the stream to write data to.
1150
 * @param       p_j2k                   J2K codec.
1151
 * @param       p_manager               the user event manager.
1152
*/
1153
static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
1154
                                     opj_stream_private_t *p_stream,
1155
                                     opj_event_mgr_t * p_manager);
1156
1157
/**
1158
 * Writes the CBD marker (Component bit depth definition)
1159
 *
1160
 * @param       p_stream                                the stream to write data to.
1161
 * @param       p_j2k                           J2K codec.
1162
 * @param       p_manager               the user event manager.
1163
*/
1164
static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
1165
                                  opj_stream_private_t *p_stream,
1166
                                  opj_event_mgr_t * p_manager);
1167
1168
/**
1169
 * Reads a CBD marker (Component bit depth definition)
1170
 * @param       p_header_data   the data contained in the CBD box.
1171
 * @param       p_j2k                   the jpeg2000 codec.
1172
 * @param       p_header_size   the size of the data contained in the CBD marker.
1173
 * @param       p_manager               the user event manager.
1174
*/
1175
static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
1176
                                 OPJ_BYTE * p_header_data,
1177
                                 OPJ_UINT32 p_header_size,
1178
                                 opj_event_mgr_t * p_manager);
1179
1180
/**
1181
 * Reads a CAP marker (extended capabilities definition). Empty implementation.
1182
 * Found in HTJ2K files
1183
 *
1184
 * @param       p_header_data   the data contained in the CAP box.
1185
 * @param       p_j2k                   the jpeg2000 codec.
1186
 * @param       p_header_size   the size of the data contained in the CAP marker.
1187
 * @param       p_manager               the user event manager.
1188
*/
1189
static OPJ_BOOL opj_j2k_read_cap(opj_j2k_t *p_j2k,
1190
                                 OPJ_BYTE * p_header_data,
1191
                                 OPJ_UINT32 p_header_size,
1192
                                 opj_event_mgr_t * p_manager);
1193
1194
/**
1195
 * Reads a CPF marker (corresponding profile). Empty implementation. Found in HTJ2K files
1196
 * @param       p_header_data   the data contained in the CPF box.
1197
 * @param       p_j2k                   the jpeg2000 codec.
1198
 * @param       p_header_size   the size of the data contained in the CPF marker.
1199
 * @param       p_manager               the user event manager.
1200
*/
1201
static OPJ_BOOL opj_j2k_read_cpf(opj_j2k_t *p_j2k,
1202
                                 OPJ_BYTE * p_header_data,
1203
                                 OPJ_UINT32 p_header_size,
1204
                                 opj_event_mgr_t * p_manager);
1205
1206
1207
/**
1208
 * Writes COC marker for each component.
1209
 *
1210
 * @param       p_stream                the stream to write data to.
1211
 * @param       p_j2k                   J2K codec.
1212
 * @param       p_manager               the user event manager.
1213
*/
1214
static OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,
1215
                                      opj_stream_private_t *p_stream,
1216
                                      opj_event_mgr_t * p_manager);
1217
1218
/**
1219
 * Writes QCC marker for each component.
1220
 *
1221
 * @param       p_stream                the stream to write data to.
1222
 * @param       p_j2k                   J2K codec.
1223
 * @param       p_manager               the user event manager.
1224
*/
1225
static OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,
1226
                                      opj_stream_private_t *p_stream,
1227
                                      opj_event_mgr_t * p_manager);
1228
1229
/**
1230
 * Writes regions of interests.
1231
 *
1232
 * @param       p_stream                the stream to write data to.
1233
 * @param       p_j2k                   J2K codec.
1234
 * @param       p_manager               the user event manager.
1235
*/
1236
static OPJ_BOOL opj_j2k_write_regions(opj_j2k_t *p_j2k,
1237
                                      opj_stream_private_t *p_stream,
1238
                                      opj_event_mgr_t * p_manager);
1239
1240
/**
1241
 * Writes EPC ????
1242
 *
1243
 * @param       p_stream                the stream to write data to.
1244
 * @param       p_j2k                   J2K codec.
1245
 * @param       p_manager               the user event manager.
1246
*/
1247
static OPJ_BOOL opj_j2k_write_epc(opj_j2k_t *p_j2k,
1248
                                  opj_stream_private_t *p_stream,
1249
                                  opj_event_mgr_t * p_manager);
1250
1251
/**
1252
 * Checks the progression order changes values. Tells of the poc given as input are valid.
1253
 * A nice message is outputted at errors.
1254
 *
1255
 * @param       p_pocs                  the progression order changes.
1256
 * @param       tileno                  the tile number of interest
1257
 * @param       p_nb_pocs               the number of progression order changes.
1258
 * @param       p_nb_resolutions        the number of resolutions.
1259
 * @param       numcomps                the number of components
1260
 * @param       numlayers               the number of layers.
1261
 * @param       p_manager               the user event manager.
1262
 *
1263
 * @return      true if the pocs are valid.
1264
 */
1265
static OPJ_BOOL opj_j2k_check_poc_val(const opj_poc_t *p_pocs,
1266
                                      OPJ_UINT32 tileno,
1267
                                      OPJ_UINT32 p_nb_pocs,
1268
                                      OPJ_UINT32 p_nb_resolutions,
1269
                                      OPJ_UINT32 numcomps,
1270
                                      OPJ_UINT32 numlayers,
1271
                                      opj_event_mgr_t * p_manager);
1272
1273
/**
1274
 * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
1275
 *
1276
 * @param               cp                      the coding parameters.
1277
 * @param               pino            the offset of the given poc (i.e. its position in the coding parameter).
1278
 * @param               tileno          the given tile.
1279
 *
1280
 * @return              the number of tile parts.
1281
 */
1282
static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino,
1283
                                     OPJ_UINT32 tileno);
1284
1285
/**
1286
 * Calculates the total number of tile parts needed by the encoder to
1287
 * encode such an image. If not enough memory is available, then the function return false.
1288
 *
1289
 * @param       p_nb_tiles      pointer that will hold the number of tile parts.
1290
 * @param       cp                      the coding parameters for the image.
1291
 * @param       image           the image to encode.
1292
 * @param       p_j2k                   the p_j2k encoder.
1293
 * @param       p_manager       the user event manager.
1294
 *
1295
 * @return true if the function was successful, false else.
1296
 */
1297
static OPJ_BOOL opj_j2k_calculate_tp(opj_j2k_t *p_j2k,
1298
                                     opj_cp_t *cp,
1299
                                     OPJ_UINT32 * p_nb_tiles,
1300
                                     opj_image_t *image,
1301
                                     opj_event_mgr_t * p_manager);
1302
1303
static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream);
1304
1305
static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream);
1306
1307
static opj_codestream_index_t* opj_j2k_create_cstr_index(void);
1308
1309
static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp);
1310
1311
static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp);
1312
1313
static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres);
1314
1315
static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
1316
        opj_image_t *image, opj_event_mgr_t *p_manager);
1317
1318
static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
1319
        opj_event_mgr_t *p_manager);
1320
1321
static void opj_j2k_set_imf_parameters(opj_cparameters_t *parameters,
1322
                                       opj_image_t *image, opj_event_mgr_t *p_manager);
1323
1324
static OPJ_BOOL opj_j2k_is_imf_compliant(opj_cparameters_t *parameters,
1325
        opj_image_t *image,
1326
        opj_event_mgr_t *p_manager);
1327
1328
/**
1329
 * Checks for invalid number of tile-parts in SOT marker (TPsot==TNsot). See issue 254.
1330
 *
1331
 * @param       p_stream            the stream to read data from.
1332
 * @param       tile_no             tile number we're looking for.
1333
 * @param       p_correction_needed output value. if true, non conformant codestream needs TNsot correction.
1334
 * @param       p_manager       the user event manager.
1335
 *
1336
 * @return true if the function was successful, false else.
1337
 */
1338
static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t
1339
        *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
1340
        opj_event_mgr_t * p_manager);
1341
1342
/*@}*/
1343
1344
/*@}*/
1345
1346
/* ----------------------------------------------------------------------- */
1347
typedef struct j2k_prog_order {
1348
    OPJ_PROG_ORDER enum_prog;
1349
    char str_prog[5];
1350
} j2k_prog_order_t;
1351
1352
static const j2k_prog_order_t j2k_prog_order_list[] = {
1353
    {OPJ_CPRL, "CPRL"},
1354
    {OPJ_LRCP, "LRCP"},
1355
    {OPJ_PCRL, "PCRL"},
1356
    {OPJ_RLCP, "RLCP"},
1357
    {OPJ_RPCL, "RPCL"},
1358
    {(OPJ_PROG_ORDER) - 1, ""}
1359
};
1360
1361
/**
1362
 * FIXME DOC
1363
 */
1364
static const OPJ_UINT32 MCT_ELEMENT_SIZE [] = {
1365
    2,
1366
    4,
1367
    4,
1368
    8
1369
};
1370
1371
typedef void (* opj_j2k_mct_function)(const void * p_src_data,
1372
                                      void * p_dest_data, OPJ_UINT32 p_nb_elem);
1373
1374
static const opj_j2k_mct_function j2k_mct_read_functions_to_float [] = {
1375
    opj_j2k_read_int16_to_float,
1376
    opj_j2k_read_int32_to_float,
1377
    opj_j2k_read_float32_to_float,
1378
    opj_j2k_read_float64_to_float
1379
};
1380
1381
static const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] = {
1382
    opj_j2k_read_int16_to_int32,
1383
    opj_j2k_read_int32_to_int32,
1384
    opj_j2k_read_float32_to_int32,
1385
    opj_j2k_read_float64_to_int32
1386
};
1387
1388
static const opj_j2k_mct_function j2k_mct_write_functions_from_float [] = {
1389
    opj_j2k_write_float_to_int16,
1390
    opj_j2k_write_float_to_int32,
1391
    opj_j2k_write_float_to_float,
1392
    opj_j2k_write_float_to_float64
1393
};
1394
1395
typedef struct opj_dec_memory_marker_handler {
1396
    /** marker value */
1397
    OPJ_UINT32 id;
1398
    /** value of the state when the marker can appear */
1399
    OPJ_UINT32 states;
1400
    /** action linked to the marker */
1401
    OPJ_BOOL(*handler)(opj_j2k_t *p_j2k,
1402
                       OPJ_BYTE * p_header_data,
1403
                       OPJ_UINT32 p_header_size,
1404
                       opj_event_mgr_t * p_manager);
1405
}
1406
opj_dec_memory_marker_handler_t;
1407
1408
static const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
1409
{
1410
    {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},
1411
    {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},
1412
    {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},
1413
    {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},
1414
    {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},
1415
    {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},
1416
    {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},
1417
    {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},
1418
    {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},
1419
    {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},
1420
    {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},
1421
    {J2K_MS_PPM, J2K_STATE_MH, opj_j2k_read_ppm},
1422
    {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},
1423
    {J2K_MS_SOP, 0, 0},
1424
    {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},
1425
    {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},
1426
    {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},
1427
    {J2K_MS_CBD, J2K_STATE_MH, opj_j2k_read_cbd},
1428
    {J2K_MS_CAP, J2K_STATE_MH, opj_j2k_read_cap},
1429
    {J2K_MS_CPF, J2K_STATE_MH, opj_j2k_read_cpf},
1430
    {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},
1431
    {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},
1432
#ifdef USE_JPWL
1433
#ifdef TODO_MS /* remove these functions which are not compatible with the v2 API */
1434
    {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
1435
    {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
1436
    {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
1437
    {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
1438
#endif
1439
#endif /* USE_JPWL */
1440
#ifdef USE_JPSEC
1441
    {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
1442
    {J2K_MS_INSEC, 0, j2k_read_insec}
1443
#endif /* USE_JPSEC */
1444
    {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/
1445
};
1446
1447
static void  opj_j2k_read_int16_to_float(const void * p_src_data,
1448
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1449
2.55k
{
1450
2.55k
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1451
2.55k
    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1452
2.55k
    OPJ_UINT32 i;
1453
2.55k
    OPJ_UINT32 l_temp;
1454
1455
12.7k
    for (i = 0; i < p_nb_elem; ++i) {
1456
10.2k
        opj_read_bytes(l_src_data, &l_temp, 2);
1457
1458
10.2k
        l_src_data += sizeof(OPJ_INT16);
1459
1460
10.2k
        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1461
10.2k
    }
1462
2.55k
}
1463
1464
static void  opj_j2k_read_int32_to_float(const void * p_src_data,
1465
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1466
2.27k
{
1467
2.27k
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1468
2.27k
    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1469
2.27k
    OPJ_UINT32 i;
1470
2.27k
    OPJ_UINT32 l_temp;
1471
1472
10.7k
    for (i = 0; i < p_nb_elem; ++i) {
1473
8.50k
        opj_read_bytes(l_src_data, &l_temp, 4);
1474
1475
8.50k
        l_src_data += sizeof(OPJ_INT32);
1476
1477
8.50k
        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1478
8.50k
    }
1479
2.27k
}
1480
1481
static void  opj_j2k_read_float32_to_float(const void * p_src_data,
1482
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1483
3.25k
{
1484
3.25k
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1485
3.25k
    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1486
3.25k
    OPJ_UINT32 i;
1487
3.25k
    OPJ_FLOAT32 l_temp;
1488
1489
16.0k
    for (i = 0; i < p_nb_elem; ++i) {
1490
12.8k
        opj_read_float(l_src_data, &l_temp);
1491
1492
12.8k
        l_src_data += sizeof(OPJ_FLOAT32);
1493
1494
12.8k
        *(l_dest_data++) = l_temp;
1495
12.8k
    }
1496
3.25k
}
1497
1498
static void  opj_j2k_read_float64_to_float(const void * p_src_data,
1499
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1500
2.42k
{
1501
2.42k
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1502
2.42k
    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1503
2.42k
    OPJ_UINT32 i;
1504
2.42k
    OPJ_FLOAT64 l_temp;
1505
1506
9.88k
    for (i = 0; i < p_nb_elem; ++i) {
1507
7.46k
        opj_read_double(l_src_data, &l_temp);
1508
1509
7.46k
        l_src_data += sizeof(OPJ_FLOAT64);
1510
1511
7.46k
        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1512
7.46k
    }
1513
2.42k
}
1514
1515
static void  opj_j2k_read_int16_to_int32(const void * p_src_data,
1516
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1517
698
{
1518
698
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1519
698
    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1520
698
    OPJ_UINT32 i;
1521
698
    OPJ_UINT32 l_temp;
1522
1523
2.09k
    for (i = 0; i < p_nb_elem; ++i) {
1524
1.39k
        opj_read_bytes(l_src_data, &l_temp, 2);
1525
1526
1.39k
        l_src_data += sizeof(OPJ_INT16);
1527
1528
1.39k
        *(l_dest_data++) = (OPJ_INT32) l_temp;
1529
1.39k
    }
1530
698
}
1531
1532
static void  opj_j2k_read_int32_to_int32(const void * p_src_data,
1533
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1534
869
{
1535
869
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1536
869
    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1537
869
    OPJ_UINT32 i;
1538
869
    OPJ_UINT32 l_temp;
1539
1540
2.41k
    for (i = 0; i < p_nb_elem; ++i) {
1541
1.54k
        opj_read_bytes(l_src_data, &l_temp, 4);
1542
1543
1.54k
        l_src_data += sizeof(OPJ_INT32);
1544
1545
1.54k
        *(l_dest_data++) = (OPJ_INT32) l_temp;
1546
1.54k
    }
1547
869
}
1548
1549
static void  opj_j2k_read_float32_to_int32(const void * p_src_data,
1550
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1551
1.06k
{
1552
1.06k
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1553
1.06k
    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1554
1.06k
    OPJ_UINT32 i;
1555
1.06k
    OPJ_FLOAT32 l_temp;
1556
1557
2.97k
    for (i = 0; i < p_nb_elem; ++i) {
1558
1.90k
        opj_read_float(l_src_data, &l_temp);
1559
1560
1.90k
        l_src_data += sizeof(OPJ_FLOAT32);
1561
1562
1.90k
        *(l_dest_data++) = (OPJ_INT32) l_temp;
1563
1.90k
    }
1564
1.06k
}
1565
1566
static void  opj_j2k_read_float64_to_int32(const void * p_src_data,
1567
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1568
1.51k
{
1569
1.51k
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1570
1.51k
    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1571
1.51k
    OPJ_UINT32 i;
1572
1.51k
    OPJ_FLOAT64 l_temp;
1573
1574
3.73k
    for (i = 0; i < p_nb_elem; ++i) {
1575
2.22k
        opj_read_double(l_src_data, &l_temp);
1576
1577
2.22k
        l_src_data += sizeof(OPJ_FLOAT64);
1578
1579
2.22k
        *(l_dest_data++) = (OPJ_INT32) l_temp;
1580
2.22k
    }
1581
1.51k
}
1582
1583
static void  opj_j2k_write_float_to_int16(const void * p_src_data,
1584
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1585
0
{
1586
0
    OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1587
0
    OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1588
0
    OPJ_UINT32 i;
1589
0
    OPJ_UINT32 l_temp;
1590
1591
0
    for (i = 0; i < p_nb_elem; ++i) {
1592
0
        l_temp = (OPJ_UINT32) * (l_src_data++);
1593
1594
0
        opj_write_bytes(l_dest_data, l_temp, sizeof(OPJ_INT16));
1595
1596
0
        l_dest_data += sizeof(OPJ_INT16);
1597
0
    }
1598
0
}
1599
1600
static void opj_j2k_write_float_to_int32(const void * p_src_data,
1601
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1602
0
{
1603
0
    OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1604
0
    OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1605
0
    OPJ_UINT32 i;
1606
0
    OPJ_UINT32 l_temp;
1607
1608
0
    for (i = 0; i < p_nb_elem; ++i) {
1609
0
        l_temp = (OPJ_UINT32) * (l_src_data++);
1610
1611
0
        opj_write_bytes(l_dest_data, l_temp, sizeof(OPJ_INT32));
1612
1613
0
        l_dest_data += sizeof(OPJ_INT32);
1614
0
    }
1615
0
}
1616
1617
static void  opj_j2k_write_float_to_float(const void * p_src_data,
1618
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1619
0
{
1620
0
    OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1621
0
    OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1622
0
    OPJ_UINT32 i;
1623
0
    OPJ_FLOAT32 l_temp;
1624
1625
0
    for (i = 0; i < p_nb_elem; ++i) {
1626
0
        l_temp = (OPJ_FLOAT32) * (l_src_data++);
1627
1628
0
        opj_write_float(l_dest_data, l_temp);
1629
1630
0
        l_dest_data += sizeof(OPJ_FLOAT32);
1631
0
    }
1632
0
}
1633
1634
static void  opj_j2k_write_float_to_float64(const void * p_src_data,
1635
        void * p_dest_data, OPJ_UINT32 p_nb_elem)
1636
0
{
1637
0
    OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1638
0
    OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1639
0
    OPJ_UINT32 i;
1640
0
    OPJ_FLOAT64 l_temp;
1641
1642
0
    for (i = 0; i < p_nb_elem; ++i) {
1643
0
        l_temp = (OPJ_FLOAT64) * (l_src_data++);
1644
1645
0
        opj_write_double(l_dest_data, l_temp);
1646
1647
0
        l_dest_data += sizeof(OPJ_FLOAT64);
1648
0
    }
1649
0
}
1650
1651
const char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order)
1652
58.5k
{
1653
58.5k
    const j2k_prog_order_t *po;
1654
88.2k
    for (po = j2k_prog_order_list; po->enum_prog != -1; po++) {
1655
88.2k
        if (po->enum_prog == prg_order) {
1656
58.5k
            return po->str_prog;
1657
58.5k
        }
1658
88.2k
    }
1659
0
    return po->str_prog;
1660
58.5k
}
1661
1662
static OPJ_BOOL opj_j2k_check_poc_val(const opj_poc_t *p_pocs,
1663
                                      OPJ_UINT32 tileno,
1664
                                      OPJ_UINT32 p_nb_pocs,
1665
                                      OPJ_UINT32 p_nb_resolutions,
1666
                                      OPJ_UINT32 p_num_comps,
1667
                                      OPJ_UINT32 p_num_layers,
1668
                                      opj_event_mgr_t * p_manager)
1669
0
{
1670
0
    OPJ_UINT32* packet_array;
1671
0
    OPJ_UINT32 index, resno, compno, layno;
1672
0
    OPJ_UINT32 i;
1673
0
    OPJ_UINT32 step_c = 1;
1674
0
    OPJ_UINT32 step_r = p_num_comps * step_c;
1675
0
    OPJ_UINT32 step_l = p_nb_resolutions * step_r;
1676
0
    OPJ_BOOL loss = OPJ_FALSE;
1677
1678
0
    assert(p_nb_pocs > 0);
1679
1680
0
    packet_array = (OPJ_UINT32*) opj_calloc((size_t)step_l * p_num_layers,
1681
0
                                            sizeof(OPJ_UINT32));
1682
0
    if (packet_array == 00) {
1683
0
        opj_event_msg(p_manager, EVT_ERROR,
1684
0
                      "Not enough memory for checking the poc values.\n");
1685
0
        return OPJ_FALSE;
1686
0
    }
1687
1688
    /* iterate through all the pocs that match our tile of interest. */
1689
0
    for (i = 0; i < p_nb_pocs; ++i) {
1690
0
        const opj_poc_t *poc = &p_pocs[i];
1691
0
        if (tileno + 1 == poc->tile) {
1692
0
            index = step_r * poc->resno0;
1693
1694
            /* take each resolution for each poc */
1695
0
            for (resno = poc->resno0 ;
1696
0
                    resno < opj_uint_min(poc->resno1, p_nb_resolutions); ++resno) {
1697
0
                OPJ_UINT32 res_index = index + poc->compno0 * step_c;
1698
1699
                /* take each comp of each resolution for each poc */
1700
0
                for (compno = poc->compno0 ;
1701
0
                        compno < opj_uint_min(poc->compno1, p_num_comps); ++compno) {
1702
                    /* The layer index always starts at zero for every progression. */
1703
0
                    const OPJ_UINT32 layno0 = 0;
1704
0
                    OPJ_UINT32 comp_index = res_index + layno0 * step_l;
1705
1706
                    /* and finally take each layer of each res of ... */
1707
0
                    for (layno = layno0; layno < opj_uint_min(poc->layno1, p_num_layers);
1708
0
                            ++layno) {
1709
0
                        packet_array[comp_index] = 1;
1710
0
                        comp_index += step_l;
1711
0
                    }
1712
1713
0
                    res_index += step_c;
1714
0
                }
1715
1716
0
                index += step_r;
1717
0
            }
1718
0
        }
1719
0
    }
1720
1721
0
    index = 0;
1722
0
    for (layno = 0; layno < p_num_layers ; ++layno) {
1723
0
        for (resno = 0; resno < p_nb_resolutions; ++resno) {
1724
0
            for (compno = 0; compno < p_num_comps; ++compno) {
1725
0
                loss |= (packet_array[index] != 1);
1726
#ifdef DEBUG_VERBOSE
1727
                if (packet_array[index] != 1) {
1728
                    fprintf(stderr,
1729
                            "Missing packet in POC: layno=%d resno=%d compno=%d\n",
1730
                            layno, resno, compno);
1731
                }
1732
#endif
1733
0
                index += step_c;
1734
0
            }
1735
0
        }
1736
0
    }
1737
1738
0
    if (loss) {
1739
0
        opj_event_msg(p_manager, EVT_ERROR, "Missing packets possible loss of data\n");
1740
0
    }
1741
1742
0
    opj_free(packet_array);
1743
1744
0
    return !loss;
1745
0
}
1746
1747
/* ----------------------------------------------------------------------- */
1748
1749
static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino,
1750
                                     OPJ_UINT32 tileno)
1751
21.9k
{
1752
21.9k
    const OPJ_CHAR *prog = 00;
1753
21.9k
    OPJ_INT32 i;
1754
21.9k
    OPJ_UINT32 tpnum = 1;
1755
21.9k
    opj_tcp_t *tcp = 00;
1756
21.9k
    opj_poc_t * l_current_poc = 00;
1757
1758
    /*  preconditions */
1759
21.9k
    assert(tileno < (cp->tw * cp->th));
1760
21.9k
    assert(pino < (cp->tcps[tileno].numpocs + 1));
1761
1762
    /* get the given tile coding parameter */
1763
21.9k
    tcp = &cp->tcps[tileno];
1764
21.9k
    assert(tcp != 00);
1765
1766
21.9k
    l_current_poc = &(tcp->pocs[pino]);
1767
21.9k
    assert(l_current_poc != 0);
1768
1769
    /* get the progression order as a character string */
1770
21.9k
    prog = opj_j2k_convert_progression_order(tcp->prg);
1771
21.9k
    assert(strlen(prog) > 0);
1772
1773
21.9k
    if (cp->m_specific_param.m_enc.m_tp_on == 1) {
1774
2.10k
        for (i = 0; i < 4; ++i) {
1775
2.10k
            switch (prog[i]) {
1776
            /* component wise */
1777
2.10k
            case 'C':
1778
2.10k
                tpnum *= l_current_poc->compE;
1779
2.10k
                break;
1780
            /* resolution wise */
1781
0
            case 'R':
1782
0
                tpnum *= l_current_poc->resE;
1783
0
                break;
1784
            /* precinct wise */
1785
0
            case 'P':
1786
0
                tpnum *= l_current_poc->prcE;
1787
0
                break;
1788
            /* layer wise */
1789
0
            case 'L':
1790
0
                tpnum *= l_current_poc->layE;
1791
0
                break;
1792
2.10k
            }
1793
            /* would we split here ? */
1794
2.10k
            if (cp->m_specific_param.m_enc.m_tp_flag == prog[i]) {
1795
2.10k
                cp->m_specific_param.m_enc.m_tp_pos = i;
1796
2.10k
                break;
1797
2.10k
            }
1798
2.10k
        }
1799
19.8k
    } else {
1800
19.8k
        tpnum = 1;
1801
19.8k
    }
1802
1803
21.9k
    return tpnum;
1804
21.9k
}
1805
1806
static OPJ_BOOL opj_j2k_calculate_tp(opj_j2k_t *p_j2k,
1807
                                     opj_cp_t *cp,
1808
                                     OPJ_UINT32 * p_nb_tiles,
1809
                                     opj_image_t *image,
1810
                                     opj_event_mgr_t * p_manager
1811
                                    )
1812
10.9k
{
1813
10.9k
    OPJ_UINT32 pino, tileno;
1814
10.9k
    OPJ_UINT32 l_nb_tiles;
1815
10.9k
    opj_tcp_t *tcp;
1816
1817
    /* preconditions */
1818
10.9k
    assert(p_nb_tiles != 00);
1819
10.9k
    assert(cp != 00);
1820
10.9k
    assert(image != 00);
1821
10.9k
    assert(p_j2k != 00);
1822
10.9k
    assert(p_manager != 00);
1823
1824
10.9k
    OPJ_UNUSED(p_j2k);
1825
10.9k
    OPJ_UNUSED(p_manager);
1826
1827
10.9k
    l_nb_tiles = cp->tw * cp->th;
1828
10.9k
    * p_nb_tiles = 0;
1829
10.9k
    tcp = cp->tcps;
1830
1831
    /* INDEX >> */
1832
    /* TODO mergeV2: check this part which use cstr_info */
1833
    /*if (p_j2k->cstr_info) {
1834
            opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
1835
1836
            for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1837
                    OPJ_UINT32 cur_totnum_tp = 0;
1838
1839
                    opj_pi_update_encoding_parameters(image,cp,tileno);
1840
1841
                    for (pino = 0; pino <= tcp->numpocs; ++pino)
1842
                    {
1843
                            OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
1844
1845
                            *p_nb_tiles = *p_nb_tiles + tp_num;
1846
1847
                            cur_totnum_tp += tp_num;
1848
                    }
1849
1850
                    tcp->m_nb_tile_parts = cur_totnum_tp;
1851
1852
                    l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
1853
                    if (l_info_tile_ptr->tp == 00) {
1854
                            return OPJ_FALSE;
1855
                    }
1856
1857
                    memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
1858
1859
                    l_info_tile_ptr->num_tps = cur_totnum_tp;
1860
1861
                    ++l_info_tile_ptr;
1862
                    ++tcp;
1863
            }
1864
    }
1865
    else */{
1866
21.9k
        for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1867
10.9k
            OPJ_UINT32 cur_totnum_tp = 0;
1868
1869
10.9k
            opj_pi_update_encoding_parameters(image, cp, tileno);
1870
1871
21.9k
            for (pino = 0; pino <= tcp->numpocs; ++pino) {
1872
10.9k
                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp, pino, tileno);
1873
1874
10.9k
                *p_nb_tiles = *p_nb_tiles + tp_num;
1875
1876
10.9k
                cur_totnum_tp += tp_num;
1877
10.9k
            }
1878
10.9k
            tcp->m_nb_tile_parts = cur_totnum_tp;
1879
1880
10.9k
            ++tcp;
1881
10.9k
        }
1882
10.9k
    }
1883
1884
10.9k
    return OPJ_TRUE;
1885
10.9k
}
1886
1887
static OPJ_BOOL opj_j2k_write_soc(opj_j2k_t *p_j2k,
1888
                                  opj_stream_private_t *p_stream,
1889
                                  opj_event_mgr_t * p_manager)
1890
10.9k
{
1891
    /* 2 bytes will be written */
1892
10.9k
    OPJ_BYTE * l_start_stream = 00;
1893
1894
    /* preconditions */
1895
10.9k
    assert(p_stream != 00);
1896
10.9k
    assert(p_j2k != 00);
1897
10.9k
    assert(p_manager != 00);
1898
1899
10.9k
    l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1900
1901
    /* write SOC identifier */
1902
10.9k
    opj_write_bytes(l_start_stream, J2K_MS_SOC, 2);
1903
1904
10.9k
    if (opj_stream_write_data(p_stream, l_start_stream, 2, p_manager) != 2) {
1905
0
        return OPJ_FALSE;
1906
0
    }
1907
1908
    /* UniPG>> */
1909
#ifdef USE_JPWL
1910
    /* update markers struct */
1911
    /*
1912
            OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
1913
    */
1914
    assert(0 && "TODO");
1915
#endif /* USE_JPWL */
1916
    /* <<UniPG */
1917
1918
10.9k
    return OPJ_TRUE;
1919
10.9k
}
1920
1921
/**
1922
 * Reads a SOC marker (Start of Codestream)
1923
 * @param       p_j2k           the jpeg2000 file codec.
1924
 * @param       p_stream        FIXME DOC
1925
 * @param       p_manager       the user event manager.
1926
*/
1927
static OPJ_BOOL opj_j2k_read_soc(opj_j2k_t *p_j2k,
1928
                                 opj_stream_private_t *p_stream,
1929
                                 opj_event_mgr_t * p_manager
1930
                                )
1931
50.1k
{
1932
50.1k
    OPJ_BYTE l_data [2];
1933
50.1k
    OPJ_UINT32 l_marker;
1934
1935
    /* preconditions */
1936
50.1k
    assert(p_j2k != 00);
1937
50.1k
    assert(p_manager != 00);
1938
50.1k
    assert(p_stream != 00);
1939
1940
50.1k
    if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
1941
97
        return OPJ_FALSE;
1942
97
    }
1943
1944
50.0k
    opj_read_bytes(l_data, &l_marker, 2);
1945
50.0k
    if (l_marker != J2K_MS_SOC) {
1946
26
        return OPJ_FALSE;
1947
26
    }
1948
1949
    /* Next marker should be a SIZ marker in the main header */
1950
50.0k
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;
1951
1952
    /* FIXME move it in a index structure included in p_j2k*/
1953
50.0k
    p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
1954
1955
50.0k
    opj_event_msg(p_manager, EVT_INFO,
1956
50.0k
                  "Start to read j2k main header (%" PRId64 ").\n",
1957
50.0k
                  p_j2k->cstr_index->main_head_start);
1958
1959
    /* Add the marker to the codestream index*/
1960
50.0k
    if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC,
1961
50.0k
                                          p_j2k->cstr_index->main_head_start, 2)) {
1962
0
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
1963
0
        return OPJ_FALSE;
1964
0
    }
1965
50.0k
    return OPJ_TRUE;
1966
50.0k
}
1967
1968
static OPJ_BOOL opj_j2k_write_siz(opj_j2k_t *p_j2k,
1969
                                  opj_stream_private_t *p_stream,
1970
                                  opj_event_mgr_t * p_manager)
1971
10.9k
{
1972
10.9k
    OPJ_UINT32 i;
1973
10.9k
    OPJ_UINT32 l_size_len;
1974
10.9k
    OPJ_BYTE * l_current_ptr;
1975
10.9k
    opj_image_t * l_image = 00;
1976
10.9k
    opj_cp_t *cp = 00;
1977
10.9k
    opj_image_comp_t * l_img_comp = 00;
1978
1979
    /* preconditions */
1980
10.9k
    assert(p_stream != 00);
1981
10.9k
    assert(p_j2k != 00);
1982
10.9k
    assert(p_manager != 00);
1983
1984
10.9k
    l_image = p_j2k->m_private_image;
1985
10.9k
    cp = &(p_j2k->m_cp);
1986
10.9k
    l_size_len = 40 + 3 * l_image->numcomps;
1987
10.9k
    l_img_comp = l_image->comps;
1988
1989
10.9k
    if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
1990
1991
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
1992
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);
1993
0
        if (! new_header_tile_data) {
1994
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
1995
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
1996
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
1997
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n");
1998
0
            return OPJ_FALSE;
1999
0
        }
2000
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2001
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
2002
0
    }
2003
2004
10.9k
    l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2005
2006
    /* write SOC identifier */
2007
10.9k
    opj_write_bytes(l_current_ptr, J2K_MS_SIZ, 2);  /* SIZ */
2008
10.9k
    l_current_ptr += 2;
2009
2010
10.9k
    opj_write_bytes(l_current_ptr, l_size_len - 2, 2); /* L_SIZ */
2011
10.9k
    l_current_ptr += 2;
2012
2013
10.9k
    opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */
2014
10.9k
    l_current_ptr += 2;
2015
2016
10.9k
    opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
2017
10.9k
    l_current_ptr += 4;
2018
2019
10.9k
    opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
2020
10.9k
    l_current_ptr += 4;
2021
2022
10.9k
    opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
2023
10.9k
    l_current_ptr += 4;
2024
2025
10.9k
    opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
2026
10.9k
    l_current_ptr += 4;
2027
2028
10.9k
    opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */
2029
10.9k
    l_current_ptr += 4;
2030
2031
10.9k
    opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */
2032
10.9k
    l_current_ptr += 4;
2033
2034
10.9k
    opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */
2035
10.9k
    l_current_ptr += 4;
2036
2037
10.9k
    opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */
2038
10.9k
    l_current_ptr += 4;
2039
2040
10.9k
    opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */
2041
10.9k
    l_current_ptr += 2;
2042
2043
23.5k
    for (i = 0; i < l_image->numcomps; ++i) {
2044
        /* TODO here with MCT ? */
2045
12.5k
        opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7),
2046
12.5k
                        1);      /* Ssiz_i */
2047
12.5k
        ++l_current_ptr;
2048
2049
12.5k
        opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */
2050
12.5k
        ++l_current_ptr;
2051
2052
12.5k
        opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */
2053
12.5k
        ++l_current_ptr;
2054
2055
12.5k
        ++l_img_comp;
2056
12.5k
    }
2057
2058
10.9k
    if (opj_stream_write_data(p_stream,
2059
10.9k
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len,
2060
10.9k
                              p_manager) != l_size_len) {
2061
0
        return OPJ_FALSE;
2062
0
    }
2063
2064
10.9k
    return OPJ_TRUE;
2065
10.9k
}
2066
2067
/**
2068
 * Reads a SIZ marker (image and tile size)
2069
 * @param       p_j2k           the jpeg2000 file codec.
2070
 * @param       p_header_data   the data contained in the SIZ box.
2071
 * @param       p_header_size   the size of the data contained in the SIZ marker.
2072
 * @param       p_manager       the user event manager.
2073
*/
2074
static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
2075
                                 OPJ_BYTE * p_header_data,
2076
                                 OPJ_UINT32 p_header_size,
2077
                                 opj_event_mgr_t * p_manager
2078
                                )
2079
49.7k
{
2080
49.7k
    OPJ_UINT32 i;
2081
49.7k
    OPJ_UINT32 l_nb_comp;
2082
49.7k
    OPJ_UINT32 l_nb_comp_remain;
2083
49.7k
    OPJ_UINT32 l_remaining_size;
2084
49.7k
    OPJ_UINT32 l_nb_tiles;
2085
49.7k
    OPJ_UINT32 l_tmp, l_tx1, l_ty1;
2086
49.7k
    OPJ_UINT32 l_prec0, l_sgnd0;
2087
49.7k
    opj_image_t *l_image = 00;
2088
49.7k
    opj_cp_t *l_cp = 00;
2089
49.7k
    opj_image_comp_t * l_img_comp = 00;
2090
49.7k
    opj_tcp_t * l_current_tile_param = 00;
2091
2092
    /* preconditions */
2093
49.7k
    assert(p_j2k != 00);
2094
49.7k
    assert(p_manager != 00);
2095
49.7k
    assert(p_header_data != 00);
2096
2097
49.7k
    l_image = p_j2k->m_private_image;
2098
49.7k
    l_cp = &(p_j2k->m_cp);
2099
2100
    /* minimum size == 39 - 3 (= minimum component parameter) */
2101
49.7k
    if (p_header_size < 36) {
2102
85
        opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2103
85
        return OPJ_FALSE;
2104
85
    }
2105
2106
49.6k
    l_remaining_size = p_header_size - 36;
2107
49.6k
    l_nb_comp = l_remaining_size / 3;
2108
49.6k
    l_nb_comp_remain = l_remaining_size % 3;
2109
49.6k
    if (l_nb_comp_remain != 0) {
2110
123
        opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2111
123
        return OPJ_FALSE;
2112
123
    }
2113
2114
49.5k
    opj_read_bytes(p_header_data, &l_tmp,
2115
49.5k
                   2);                                                /* Rsiz (capabilities) */
2116
49.5k
    p_header_data += 2;
2117
49.5k
    l_cp->rsiz = (OPJ_UINT16) l_tmp;
2118
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */
2119
49.5k
    p_header_data += 4;
2120
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */
2121
49.5k
    p_header_data += 4;
2122
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */
2123
49.5k
    p_header_data += 4;
2124
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */
2125
49.5k
    p_header_data += 4;
2126
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx,
2127
49.5k
                   4);             /* XTsiz */
2128
49.5k
    p_header_data += 4;
2129
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy,
2130
49.5k
                   4);             /* YTsiz */
2131
49.5k
    p_header_data += 4;
2132
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0,
2133
49.5k
                   4);             /* XT0siz */
2134
49.5k
    p_header_data += 4;
2135
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0,
2136
49.5k
                   4);             /* YT0siz */
2137
49.5k
    p_header_data += 4;
2138
49.5k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp,
2139
49.5k
                   2);                 /* Csiz */
2140
49.5k
    p_header_data += 2;
2141
49.5k
    if (l_tmp < 16385) {
2142
49.4k
        l_image->numcomps = (OPJ_UINT16) l_tmp;
2143
49.4k
    } else {
2144
38
        opj_event_msg(p_manager, EVT_ERROR,
2145
38
                      "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
2146
38
        return OPJ_FALSE;
2147
38
    }
2148
2149
49.4k
    if (l_image->numcomps != l_nb_comp) {
2150
148
        opj_event_msg(p_manager, EVT_ERROR,
2151
148
                      "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n",
2152
148
                      l_image->numcomps, l_nb_comp);
2153
148
        return OPJ_FALSE;
2154
148
    }
2155
2156
    /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
2157
    /* testcase issue427-null-image-size.jp2 */
2158
49.3k
    if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) {
2159
94
        opj_event_msg(p_manager, EVT_ERROR,
2160
94
                      "Error with SIZ marker: negative or zero image size (%" PRId64 " x %" PRId64
2161
94
                      ")\n", (OPJ_INT64)l_image->x1 - l_image->x0,
2162
94
                      (OPJ_INT64)l_image->y1 - l_image->y0);
2163
94
        return OPJ_FALSE;
2164
94
    }
2165
    /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
2166
49.2k
    if ((l_cp->tdx == 0U) || (l_cp->tdy == 0U)) {
2167
38
        opj_event_msg(p_manager, EVT_ERROR,
2168
38
                      "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx,
2169
38
                      l_cp->tdy);
2170
38
        return OPJ_FALSE;
2171
38
    }
2172
2173
    /* testcase issue427-illegal-tile-offset.jp2 */
2174
49.1k
    l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */
2175
49.1k
    l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */
2176
49.1k
    if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) ||
2177
48.9k
            (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0)) {
2178
328
        opj_event_msg(p_manager, EVT_ERROR,
2179
328
                      "Error with SIZ marker: illegal tile offset\n");
2180
328
        return OPJ_FALSE;
2181
328
    }
2182
48.8k
    if (!p_j2k->dump_state) {
2183
48.8k
        OPJ_UINT32 siz_w, siz_h;
2184
2185
48.8k
        siz_w = l_image->x1 - l_image->x0;
2186
48.8k
        siz_h = l_image->y1 - l_image->y0;
2187
2188
48.8k
        if (p_j2k->ihdr_w > 0 && p_j2k->ihdr_h > 0
2189
1.73k
                && (p_j2k->ihdr_w != siz_w || p_j2k->ihdr_h != siz_h)) {
2190
277
            opj_event_msg(p_manager, EVT_ERROR,
2191
277
                          "Error with SIZ marker: IHDR w(%u) h(%u) vs. SIZ w(%u) h(%u)\n", p_j2k->ihdr_w,
2192
277
                          p_j2k->ihdr_h, siz_w, siz_h);
2193
277
            return OPJ_FALSE;
2194
277
        }
2195
48.8k
    }
2196
#ifdef USE_JPWL
2197
    if (l_cp->correct) {
2198
        /* if JPWL is on, we check whether TX errors have damaged
2199
          too much the SIZ parameters */
2200
        if (!(l_image->x1 * l_image->y1)) {
2201
            opj_event_msg(p_manager, EVT_ERROR,
2202
                          "JPWL: bad image size (%d x %d)\n",
2203
                          l_image->x1, l_image->y1);
2204
            if (!JPWL_ASSUME) {
2205
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2206
                return OPJ_FALSE;
2207
            }
2208
        }
2209
2210
        /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ?
2211
                if (l_image->numcomps != ((len - 38) / 3)) {
2212
                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2213
                                "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
2214
                                l_image->numcomps, ((len - 38) / 3));
2215
                        if (!JPWL_ASSUME) {
2216
                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2217
                                return OPJ_FALSE;
2218
                        }
2219
        */              /* we try to correct */
2220
        /*              opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n");
2221
                        if (l_image->numcomps < ((len - 38) / 3)) {
2222
                                len = 38 + 3 * l_image->numcomps;
2223
                                opj_event_msg(p_manager, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
2224
                                        len);
2225
                        } else {
2226
                                l_image->numcomps = ((len - 38) / 3);
2227
                                opj_event_msg(p_manager, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
2228
                                        l_image->numcomps);
2229
                        }
2230
                }
2231
        */
2232
2233
        /* update components number in the jpwl_exp_comps filed */
2234
        l_cp->exp_comps = l_image->numcomps;
2235
    }
2236
#endif /* USE_JPWL */
2237
2238
    /* Allocate the resulting image components */
2239
48.5k
    l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps,
2240
48.5k
                     sizeof(opj_image_comp_t));
2241
48.5k
    if (l_image->comps == 00) {
2242
139
        l_image->numcomps = 0;
2243
139
        opj_event_msg(p_manager, EVT_ERROR,
2244
139
                      "Not enough memory to take in charge SIZ marker\n");
2245
139
        return OPJ_FALSE;
2246
139
    }
2247
2248
48.4k
    l_img_comp = l_image->comps;
2249
2250
48.4k
    l_prec0 = 0;
2251
48.4k
    l_sgnd0 = 0;
2252
    /* Read the component information */
2253
276k
    for (i = 0; i < l_image->numcomps; ++i) {
2254
227k
        OPJ_UINT32 tmp;
2255
227k
        opj_read_bytes(p_header_data, &tmp, 1); /* Ssiz_i */
2256
227k
        ++p_header_data;
2257
227k
        l_img_comp->prec = (tmp & 0x7f) + 1;
2258
227k
        l_img_comp->sgnd = tmp >> 7;
2259
2260
227k
        if (p_j2k->dump_state == 0) {
2261
227k
            if (i == 0) {
2262
48.4k
                l_prec0 = l_img_comp->prec;
2263
48.4k
                l_sgnd0 = l_img_comp->sgnd;
2264
179k
            } else if (!l_cp->allow_different_bit_depth_sign
2265
3.04k
                       && (l_img_comp->prec != l_prec0 || l_img_comp->sgnd != l_sgnd0)) {
2266
762
                opj_event_msg(p_manager, EVT_WARNING,
2267
762
                              "Despite JP2 BPC!=255, precision and/or sgnd values for comp[%d] is different than comp[0]:\n"
2268
762
                              "        [0] prec(%d) sgnd(%d) [%d] prec(%d) sgnd(%d)\n", i, l_prec0, l_sgnd0,
2269
762
                              i, l_img_comp->prec, l_img_comp->sgnd);
2270
762
            }
2271
            /* TODO: we should perhaps also check against JP2 BPCC values */
2272
227k
        }
2273
227k
        opj_read_bytes(p_header_data, &tmp, 1); /* XRsiz_i */
2274
227k
        ++p_header_data;
2275
227k
        l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2276
227k
        opj_read_bytes(p_header_data, &tmp, 1); /* YRsiz_i */
2277
227k
        ++p_header_data;
2278
227k
        l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2279
227k
        if (l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
2280
227k
                l_img_comp->dy < 1 || l_img_comp->dy > 255) {
2281
127
            opj_event_msg(p_manager, EVT_ERROR,
2282
127
                          "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n",
2283
127
                          i, l_img_comp->dx, l_img_comp->dy);
2284
127
            return OPJ_FALSE;
2285
127
        }
2286
        /* Avoids later undefined shift in computation of */
2287
        /* p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
2288
                    << (l_image->comps[i].prec - 1); */
2289
227k
        if (l_img_comp->prec > 31) {
2290
91
            opj_event_msg(p_manager, EVT_ERROR,
2291
91
                          "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm. OpenJpeg only supports up to 31)\n",
2292
91
                          i, l_img_comp->prec);
2293
91
            return OPJ_FALSE;
2294
91
        }
2295
#ifdef USE_JPWL
2296
        if (l_cp->correct) {
2297
            /* if JPWL is on, we check whether TX errors have damaged
2298
                    too much the SIZ parameters, again */
2299
            if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {
2300
                opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2301
                              "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
2302
                              i, i, l_image->comps[i].dx, l_image->comps[i].dy);
2303
                if (!JPWL_ASSUME) {
2304
                    opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2305
                    return OPJ_FALSE;
2306
                }
2307
                /* we try to correct */
2308
                opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
2309
                if (!l_image->comps[i].dx) {
2310
                    l_image->comps[i].dx = 1;
2311
                    opj_event_msg(p_manager, EVT_WARNING,
2312
                                  "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
2313
                                  i, l_image->comps[i].dx);
2314
                }
2315
                if (!l_image->comps[i].dy) {
2316
                    l_image->comps[i].dy = 1;
2317
                    opj_event_msg(p_manager, EVT_WARNING,
2318
                                  "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
2319
                                  i, l_image->comps[i].dy);
2320
                }
2321
            }
2322
        }
2323
#endif /* USE_JPWL */
2324
227k
        l_img_comp->resno_decoded =
2325
227k
            0;                                                          /* number of resolution decoded */
2326
227k
        l_img_comp->factor =
2327
227k
            l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
2328
227k
        ++l_img_comp;
2329
227k
    }
2330
2331
48.2k
    if (l_cp->tdx == 0 || l_cp->tdy == 0) {
2332
0
        return OPJ_FALSE;
2333
0
    }
2334
2335
    /* Compute the number of tiles */
2336
48.2k
    l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
2337
48.2k
    l_cp->th = opj_uint_ceildiv(l_image->y1 - l_cp->ty0, l_cp->tdy);
2338
2339
    /* Check that the number of tiles is valid */
2340
48.2k
    if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
2341
230
        opj_event_msg(p_manager, EVT_ERROR,
2342
230
                      "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
2343
230
                      l_cp->tw, l_cp->th);
2344
230
        return OPJ_FALSE;
2345
230
    }
2346
48.0k
    l_nb_tiles = l_cp->tw * l_cp->th;
2347
2348
    /* Define the tiles which will be decoded */
2349
48.0k
    if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
2350
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_x =
2351
0
            (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
2352
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_y =
2353
0
            (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
2354
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv(
2355
0
                    p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0,
2356
0
                    l_cp->tdx);
2357
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv(
2358
0
                    p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0,
2359
0
                    l_cp->tdy);
2360
48.0k
    } else {
2361
48.0k
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
2362
48.0k
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
2363
48.0k
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
2364
48.0k
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
2365
48.0k
    }
2366
2367
#ifdef USE_JPWL
2368
    if (l_cp->correct) {
2369
        /* if JPWL is on, we check whether TX errors have damaged
2370
          too much the SIZ parameters */
2371
        if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) ||
2372
                (l_cp->th > l_cp->max_tiles)) {
2373
            opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2374
                          "JPWL: bad number of tiles (%d x %d)\n",
2375
                          l_cp->tw, l_cp->th);
2376
            if (!JPWL_ASSUME) {
2377
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2378
                return OPJ_FALSE;
2379
            }
2380
            /* we try to correct */
2381
            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
2382
            if (l_cp->tw < 1) {
2383
                l_cp->tw = 1;
2384
                opj_event_msg(p_manager, EVT_WARNING,
2385
                              "- setting %d tiles in x => HYPOTHESIS!!!\n",
2386
                              l_cp->tw);
2387
            }
2388
            if (l_cp->tw > l_cp->max_tiles) {
2389
                l_cp->tw = 1;
2390
                opj_event_msg(p_manager, EVT_WARNING,
2391
                              "- too large x, increase expectance of %d\n"
2392
                              "- setting %d tiles in x => HYPOTHESIS!!!\n",
2393
                              l_cp->max_tiles, l_cp->tw);
2394
            }
2395
            if (l_cp->th < 1) {
2396
                l_cp->th = 1;
2397
                opj_event_msg(p_manager, EVT_WARNING,
2398
                              "- setting %d tiles in y => HYPOTHESIS!!!\n",
2399
                              l_cp->th);
2400
            }
2401
            if (l_cp->th > l_cp->max_tiles) {
2402
                l_cp->th = 1;
2403
                opj_event_msg(p_manager, EVT_WARNING,
2404
                              "- too large y, increase expectance of %d to continue\n",
2405
                              "- setting %d tiles in y => HYPOTHESIS!!!\n",
2406
                              l_cp->max_tiles, l_cp->th);
2407
            }
2408
        }
2409
    }
2410
#endif /* USE_JPWL */
2411
2412
    /* memory allocations */
2413
48.0k
    l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
2414
48.0k
    if (l_cp->tcps == 00) {
2415
0
        opj_event_msg(p_manager, EVT_ERROR,
2416
0
                      "Not enough memory to take in charge SIZ marker\n");
2417
0
        return OPJ_FALSE;
2418
0
    }
2419
2420
#ifdef USE_JPWL
2421
    if (l_cp->correct) {
2422
        if (!l_cp->tcps) {
2423
            opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2424
                          "JPWL: could not alloc tcps field of cp\n");
2425
            if (!JPWL_ASSUME) {
2426
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2427
                return OPJ_FALSE;
2428
            }
2429
        }
2430
    }
2431
#endif /* USE_JPWL */
2432
2433
48.0k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
2434
48.0k
        (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
2435
48.0k
    if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps  == 00) {
2436
0
        opj_event_msg(p_manager, EVT_ERROR,
2437
0
                      "Not enough memory to take in charge SIZ marker\n");
2438
0
        return OPJ_FALSE;
2439
0
    }
2440
2441
48.0k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
2442
48.0k
        (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS,
2443
48.0k
                                    sizeof(opj_mct_data_t));
2444
2445
48.0k
    if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {
2446
0
        opj_event_msg(p_manager, EVT_ERROR,
2447
0
                      "Not enough memory to take in charge SIZ marker\n");
2448
0
        return OPJ_FALSE;
2449
0
    }
2450
48.0k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records =
2451
48.0k
        OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
2452
2453
48.0k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
2454
48.0k
        (opj_simple_mcc_decorrelation_data_t*)
2455
48.0k
        opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS,
2456
48.0k
                   sizeof(opj_simple_mcc_decorrelation_data_t));
2457
2458
48.0k
    if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {
2459
0
        opj_event_msg(p_manager, EVT_ERROR,
2460
0
                      "Not enough memory to take in charge SIZ marker\n");
2461
0
        return OPJ_FALSE;
2462
0
    }
2463
48.0k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records =
2464
48.0k
        OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
2465
2466
    /* set up default dc level shift */
2467
272k
    for (i = 0; i < l_image->numcomps; ++i) {
2468
224k
        if (! l_image->comps[i].sgnd) {
2469
203k
            p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
2470
203k
                    << (l_image->comps[i].prec - 1);
2471
203k
        }
2472
224k
    }
2473
2474
48.0k
    l_current_tile_param = l_cp->tcps;
2475
10.2M
    for (i = 0; i < l_nb_tiles; ++i) {
2476
10.2M
        l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps,
2477
10.2M
                                      sizeof(opj_tccp_t));
2478
10.2M
        if (l_current_tile_param->tccps == 00) {
2479
0
            opj_event_msg(p_manager, EVT_ERROR,
2480
0
                          "Not enough memory to take in charge SIZ marker\n");
2481
0
            return OPJ_FALSE;
2482
0
        }
2483
2484
10.2M
        ++l_current_tile_param;
2485
10.2M
    }
2486
2487
    /*Allocate and initialize some elements of codestrem index*/
2488
48.0k
    if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
2489
0
        return OPJ_FALSE;
2490
0
    }
2491
2492
48.0k
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MH;
2493
48.0k
    opj_image_comp_header_update(l_image, l_cp);
2494
2495
48.0k
    return OPJ_TRUE;
2496
48.0k
}
2497
2498
static OPJ_BOOL opj_j2k_write_com(opj_j2k_t *p_j2k,
2499
                                  opj_stream_private_t *p_stream,
2500
                                  opj_event_mgr_t * p_manager
2501
                                 )
2502
10.9k
{
2503
10.9k
    OPJ_UINT32 l_comment_size;
2504
10.9k
    OPJ_UINT32 l_total_com_size;
2505
10.9k
    const OPJ_CHAR *l_comment;
2506
10.9k
    OPJ_BYTE * l_current_ptr = 00;
2507
2508
    /* preconditions */
2509
10.9k
    assert(p_j2k != 00);
2510
10.9k
    assert(p_stream != 00);
2511
10.9k
    assert(p_manager != 00);
2512
2513
10.9k
    l_comment = p_j2k->m_cp.comment;
2514
10.9k
    l_comment_size = (OPJ_UINT32)strlen(l_comment);
2515
10.9k
    l_total_com_size = l_comment_size + 6;
2516
2517
10.9k
    if (l_total_com_size >
2518
10.9k
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2519
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2520
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);
2521
0
        if (! new_header_tile_data) {
2522
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2523
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2524
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2525
0
            opj_event_msg(p_manager, EVT_ERROR,
2526
0
                          "Not enough memory to write the COM marker\n");
2527
0
            return OPJ_FALSE;
2528
0
        }
2529
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2530
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
2531
0
    }
2532
2533
10.9k
    l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2534
2535
10.9k
    opj_write_bytes(l_current_ptr, J2K_MS_COM, 2);  /* COM */
2536
10.9k
    l_current_ptr += 2;
2537
2538
10.9k
    opj_write_bytes(l_current_ptr, l_total_com_size - 2, 2);        /* L_COM */
2539
10.9k
    l_current_ptr += 2;
2540
2541
10.9k
    opj_write_bytes(l_current_ptr, 1,
2542
10.9k
                    2);   /* General use (IS 8859-15:1999 (Latin) values) */
2543
10.9k
    l_current_ptr += 2;
2544
2545
10.9k
    memcpy(l_current_ptr, l_comment, l_comment_size);
2546
2547
10.9k
    if (opj_stream_write_data(p_stream,
2548
10.9k
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size,
2549
10.9k
                              p_manager) != l_total_com_size) {
2550
0
        return OPJ_FALSE;
2551
0
    }
2552
2553
10.9k
    return OPJ_TRUE;
2554
10.9k
}
2555
2556
/**
2557
 * Reads a COM marker (comments)
2558
 * @param       p_j2k           the jpeg2000 file codec.
2559
 * @param       p_header_data   the data contained in the COM box.
2560
 * @param       p_header_size   the size of the data contained in the COM marker.
2561
 * @param       p_manager               the user event manager.
2562
*/
2563
static OPJ_BOOL opj_j2k_read_com(opj_j2k_t *p_j2k,
2564
                                 OPJ_BYTE * p_header_data,
2565
                                 OPJ_UINT32 p_header_size,
2566
                                 opj_event_mgr_t * p_manager
2567
                                )
2568
15.9k
{
2569
    /* preconditions */
2570
15.9k
    assert(p_j2k != 00);
2571
15.9k
    assert(p_manager != 00);
2572
15.9k
    assert(p_header_data != 00);
2573
2574
15.9k
    OPJ_UNUSED(p_j2k);
2575
15.9k
    OPJ_UNUSED(p_header_data);
2576
15.9k
    OPJ_UNUSED(p_header_size);
2577
15.9k
    OPJ_UNUSED(p_manager);
2578
2579
15.9k
    return OPJ_TRUE;
2580
15.9k
}
2581
2582
static OPJ_BOOL opj_j2k_write_cod(opj_j2k_t *p_j2k,
2583
                                  opj_stream_private_t *p_stream,
2584
                                  opj_event_mgr_t * p_manager)
2585
10.9k
{
2586
10.9k
    opj_cp_t *l_cp = 00;
2587
10.9k
    opj_tcp_t *l_tcp = 00;
2588
10.9k
    OPJ_UINT32 l_code_size, l_remaining_size;
2589
10.9k
    OPJ_BYTE * l_current_data = 00;
2590
2591
    /* preconditions */
2592
10.9k
    assert(p_j2k != 00);
2593
10.9k
    assert(p_manager != 00);
2594
10.9k
    assert(p_stream != 00);
2595
2596
10.9k
    l_cp = &(p_j2k->m_cp);
2597
10.9k
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2598
10.9k
    l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2599
10.9k
                  p_j2k->m_current_tile_number, 0);
2600
10.9k
    l_remaining_size = l_code_size;
2601
2602
10.9k
    if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2603
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2604
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);
2605
0
        if (! new_header_tile_data) {
2606
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2607
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2608
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2609
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n");
2610
0
            return OPJ_FALSE;
2611
0
        }
2612
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2613
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
2614
0
    }
2615
2616
10.9k
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2617
2618
10.9k
    opj_write_bytes(l_current_data, J2K_MS_COD, 2);           /* COD */
2619
10.9k
    l_current_data += 2;
2620
2621
10.9k
    opj_write_bytes(l_current_data, l_code_size - 2, 2);      /* L_COD */
2622
10.9k
    l_current_data += 2;
2623
2624
10.9k
    opj_write_bytes(l_current_data, l_tcp->csty, 1);          /* Scod */
2625
10.9k
    ++l_current_data;
2626
2627
10.9k
    opj_write_bytes(l_current_data, (OPJ_UINT32)l_tcp->prg, 1); /* SGcod (A) */
2628
10.9k
    ++l_current_data;
2629
2630
10.9k
    opj_write_bytes(l_current_data, l_tcp->numlayers, 2);     /* SGcod (B) */
2631
10.9k
    l_current_data += 2;
2632
2633
10.9k
    opj_write_bytes(l_current_data, l_tcp->mct, 1);           /* SGcod (C) */
2634
10.9k
    ++l_current_data;
2635
2636
10.9k
    l_remaining_size -= 9;
2637
2638
10.9k
    if (! opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
2639
10.9k
                                    l_current_data, &l_remaining_size, p_manager)) {
2640
0
        opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
2641
0
        return OPJ_FALSE;
2642
0
    }
2643
2644
10.9k
    if (l_remaining_size != 0) {
2645
0
        opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
2646
0
        return OPJ_FALSE;
2647
0
    }
2648
2649
10.9k
    if (opj_stream_write_data(p_stream,
2650
10.9k
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size,
2651
10.9k
                              p_manager) != l_code_size) {
2652
0
        return OPJ_FALSE;
2653
0
    }
2654
2655
10.9k
    return OPJ_TRUE;
2656
10.9k
}
2657
2658
/**
2659
 * Reads a COD marker (Coding style defaults)
2660
 * @param       p_header_data   the data contained in the COD box.
2661
 * @param       p_j2k                   the jpeg2000 codec.
2662
 * @param       p_header_size   the size of the data contained in the COD marker.
2663
 * @param       p_manager               the user event manager.
2664
*/
2665
static OPJ_BOOL opj_j2k_read_cod(opj_j2k_t *p_j2k,
2666
                                 OPJ_BYTE * p_header_data,
2667
                                 OPJ_UINT32 p_header_size,
2668
                                 opj_event_mgr_t * p_manager
2669
                                )
2670
50.2k
{
2671
    /* loop */
2672
50.2k
    OPJ_UINT32 i;
2673
50.2k
    OPJ_UINT32 l_tmp;
2674
50.2k
    opj_cp_t *l_cp = 00;
2675
50.2k
    opj_tcp_t *l_tcp = 00;
2676
50.2k
    opj_image_t *l_image = 00;
2677
2678
    /* preconditions */
2679
50.2k
    assert(p_header_data != 00);
2680
50.2k
    assert(p_j2k != 00);
2681
50.2k
    assert(p_manager != 00);
2682
2683
50.2k
    l_image = p_j2k->m_private_image;
2684
50.2k
    l_cp = &(p_j2k->m_cp);
2685
2686
    /* If we are in the first tile-part header of the current tile */
2687
50.2k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
2688
275
            &l_cp->tcps[p_j2k->m_current_tile_number] :
2689
50.2k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
2690
2691
#if 0
2692
    /* This check was added per https://github.com/uclouvain/openjpeg/commit/daed8cc9195555e101ab708a501af2dfe6d5e001 */
2693
    /* but this is no longer necessary to handle issue476.jp2 */
2694
    /* and this actually cause issues on legit files. See https://github.com/uclouvain/openjpeg/issues/1043 */
2695
    /* Only one COD per tile */
2696
    if (l_tcp->cod) {
2697
        opj_event_msg(p_manager, EVT_ERROR,
2698
                      "COD marker already read. No more than one COD marker per tile.\n");
2699
        return OPJ_FALSE;
2700
    }
2701
#endif
2702
50.2k
    l_tcp->cod = 1;
2703
2704
    /* Make sure room is sufficient */
2705
50.2k
    if (p_header_size < 5) {
2706
31
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2707
31
        return OPJ_FALSE;
2708
31
    }
2709
2710
50.2k
    opj_read_bytes(p_header_data, &l_tcp->csty, 1);         /* Scod */
2711
50.2k
    ++p_header_data;
2712
    /* Make sure we know how to decode this */
2713
50.2k
    if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP |
2714
50.2k
                                     J2K_CP_CSTY_EPH)) != 0U) {
2715
36
        opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n");
2716
36
        return OPJ_FALSE;
2717
36
    }
2718
50.1k
    opj_read_bytes(p_header_data, &l_tmp, 1);                       /* SGcod (A) */
2719
50.1k
    ++p_header_data;
2720
50.1k
    l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
2721
    /* Make sure progression order is valid */
2722
50.1k
    if (l_tcp->prg > OPJ_CPRL) {
2723
3.16k
        opj_event_msg(p_manager, EVT_ERROR,
2724
3.16k
                      "Unknown progression order in COD marker\n");
2725
3.16k
        l_tcp->prg = OPJ_PROG_UNKNOWN;
2726
3.16k
    }
2727
50.1k
    opj_read_bytes(p_header_data, &l_tcp->numlayers, 2);    /* SGcod (B) */
2728
50.1k
    p_header_data += 2;
2729
2730
50.1k
    if ((l_tcp->numlayers < 1U) || (l_tcp->numlayers > 65535U)) {
2731
22
        opj_event_msg(p_manager, EVT_ERROR,
2732
22
                      "Invalid number of layers in COD marker : %d not in range [1-65535]\n",
2733
22
                      l_tcp->numlayers);
2734
22
        return OPJ_FALSE;
2735
22
    }
2736
2737
    /* If user didn't set a number layer to decode take the max specify in the codestream. */
2738
50.1k
    if (l_cp->m_specific_param.m_dec.m_layer) {
2739
0
        l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
2740
50.1k
    } else {
2741
50.1k
        l_tcp->num_layers_to_decode = l_tcp->numlayers;
2742
50.1k
    }
2743
2744
50.1k
    opj_read_bytes(p_header_data, &l_tcp->mct, 1);          /* SGcod (C) */
2745
50.1k
    ++p_header_data;
2746
2747
50.1k
    if (l_tcp->mct > 1) {
2748
62
        opj_event_msg(p_manager, EVT_ERROR,
2749
62
                      "Invalid multiple component transformation\n");
2750
62
        return OPJ_FALSE;
2751
62
    }
2752
2753
50.0k
    p_header_size -= 5;
2754
342k
    for (i = 0; i < l_image->numcomps; ++i) {
2755
292k
        l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
2756
292k
    }
2757
2758
50.0k
    if (! opj_j2k_read_SPCod_SPCoc(p_j2k, 0, p_header_data, &p_header_size,
2759
50.0k
                                   p_manager)) {
2760
269
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2761
269
        return OPJ_FALSE;
2762
269
    }
2763
2764
49.8k
    if (p_header_size != 0) {
2765
32
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2766
32
        return OPJ_FALSE;
2767
32
    }
2768
2769
    /* Apply the coding style to other components of the current tile or the m_default_tcp*/
2770
49.7k
    opj_j2k_copy_tile_component_parameters(p_j2k);
2771
2772
    /* Index */
2773
#ifdef WIP_REMOVE_MSD
2774
    if (p_j2k->cstr_info) {
2775
        /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/
2776
        p_j2k->cstr_info->prog = l_tcp->prg;
2777
        p_j2k->cstr_info->numlayers = l_tcp->numlayers;
2778
        p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(
2779
                                            l_image->numcomps * sizeof(OPJ_UINT32));
2780
        if (!p_j2k->cstr_info->numdecompos) {
2781
            return OPJ_FALSE;
2782
        }
2783
        for (i = 0; i < l_image->numcomps; ++i) {
2784
            p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
2785
        }
2786
    }
2787
#endif
2788
2789
49.7k
    return OPJ_TRUE;
2790
49.8k
}
2791
2792
static OPJ_BOOL opj_j2k_write_coc(opj_j2k_t *p_j2k,
2793
                                  OPJ_UINT32 p_comp_no,
2794
                                  opj_stream_private_t *p_stream,
2795
                                  opj_event_mgr_t * p_manager)
2796
0
{
2797
0
    OPJ_UINT32 l_coc_size, l_remaining_size;
2798
0
    OPJ_UINT32 l_comp_room;
2799
2800
    /* preconditions */
2801
0
    assert(p_j2k != 00);
2802
0
    assert(p_manager != 00);
2803
0
    assert(p_stream != 00);
2804
2805
0
    l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;
2806
2807
0
    l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2808
0
                 p_j2k->m_current_tile_number, p_comp_no);
2809
2810
0
    if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2811
0
        OPJ_BYTE *new_header_tile_data;
2812
        /*p_j2k->m_specific_param.m_encoder.m_header_tile_data
2813
                = (OPJ_BYTE*)opj_realloc(
2814
                        p_j2k->m_specific_param.m_encoder.m_header_tile_data,
2815
                        l_coc_size);*/
2816
2817
0
        new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2818
0
                                   p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);
2819
0
        if (! new_header_tile_data) {
2820
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2821
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2822
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2823
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n");
2824
0
            return OPJ_FALSE;
2825
0
        }
2826
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2827
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
2828
0
    }
2829
2830
0
    opj_j2k_write_coc_in_memory(p_j2k, p_comp_no,
2831
0
                                p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_remaining_size,
2832
0
                                p_manager);
2833
2834
0
    if (opj_stream_write_data(p_stream,
2835
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size,
2836
0
                              p_manager) != l_coc_size) {
2837
0
        return OPJ_FALSE;
2838
0
    }
2839
2840
0
    return OPJ_TRUE;
2841
0
}
2842
2843
static OPJ_BOOL opj_j2k_compare_coc(opj_j2k_t *p_j2k,
2844
                                    OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
2845
1.51k
{
2846
1.51k
    opj_cp_t *l_cp = NULL;
2847
1.51k
    opj_tcp_t *l_tcp = NULL;
2848
2849
    /* preconditions */
2850
1.51k
    assert(p_j2k != 00);
2851
2852
1.51k
    l_cp = &(p_j2k->m_cp);
2853
1.51k
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2854
2855
1.51k
    if (l_tcp->tccps[p_first_comp_no].csty != l_tcp->tccps[p_second_comp_no].csty) {
2856
0
        return OPJ_FALSE;
2857
0
    }
2858
2859
2860
1.51k
    return opj_j2k_compare_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number,
2861
1.51k
                                       p_first_comp_no, p_second_comp_no);
2862
1.51k
}
2863
2864
static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
2865
                                        OPJ_UINT32 p_comp_no,
2866
                                        OPJ_BYTE * p_data,
2867
                                        OPJ_UINT32 * p_data_written,
2868
                                        opj_event_mgr_t * p_manager
2869
                                       )
2870
0
{
2871
0
    opj_cp_t *l_cp = 00;
2872
0
    opj_tcp_t *l_tcp = 00;
2873
0
    OPJ_UINT32 l_coc_size, l_remaining_size;
2874
0
    OPJ_BYTE * l_current_data = 00;
2875
0
    opj_image_t *l_image = 00;
2876
0
    OPJ_UINT32 l_comp_room;
2877
2878
    /* preconditions */
2879
0
    assert(p_j2k != 00);
2880
0
    assert(p_manager != 00);
2881
2882
0
    l_cp = &(p_j2k->m_cp);
2883
0
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2884
0
    l_image = p_j2k->m_private_image;
2885
0
    l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
2886
2887
0
    l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2888
0
                 p_j2k->m_current_tile_number, p_comp_no);
2889
0
    l_remaining_size = l_coc_size;
2890
2891
0
    l_current_data = p_data;
2892
2893
0
    opj_write_bytes(l_current_data, J2K_MS_COC,
2894
0
                    2);                         /* COC */
2895
0
    l_current_data += 2;
2896
2897
0
    opj_write_bytes(l_current_data, l_coc_size - 2,
2898
0
                    2);                     /* L_COC */
2899
0
    l_current_data += 2;
2900
2901
0
    opj_write_bytes(l_current_data, p_comp_no, l_comp_room);        /* Ccoc */
2902
0
    l_current_data += l_comp_room;
2903
2904
0
    opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty,
2905
0
                    1);               /* Scoc */
2906
0
    ++l_current_data;
2907
2908
0
    l_remaining_size -= (5 + l_comp_room);
2909
0
    opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
2910
0
                              l_current_data, &l_remaining_size, p_manager);
2911
0
    * p_data_written = l_coc_size;
2912
0
}
2913
2914
static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k)
2915
21.9k
{
2916
21.9k
    OPJ_UINT32 i, j;
2917
21.9k
    OPJ_UINT32 l_nb_comp;
2918
21.9k
    OPJ_UINT32 l_nb_tiles;
2919
21.9k
    OPJ_UINT32 l_max = 0;
2920
2921
    /* preconditions */
2922
2923
21.9k
    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
2924
21.9k
    l_nb_comp = p_j2k->m_private_image->numcomps;
2925
2926
43.9k
    for (i = 0; i < l_nb_tiles; ++i) {
2927
47.0k
        for (j = 0; j < l_nb_comp; ++j) {
2928
25.0k
            l_max = opj_uint_max(l_max, opj_j2k_get_SPCod_SPCoc_size(p_j2k, i, j));
2929
25.0k
        }
2930
21.9k
    }
2931
2932
21.9k
    return 6 + l_max;
2933
21.9k
}
2934
2935
/**
2936
 * Reads a COC marker (Coding Style Component)
2937
 * @param       p_header_data   the data contained in the COC box.
2938
 * @param       p_j2k                   the jpeg2000 codec.
2939
 * @param       p_header_size   the size of the data contained in the COC marker.
2940
 * @param       p_manager               the user event manager.
2941
*/
2942
static OPJ_BOOL opj_j2k_read_coc(opj_j2k_t *p_j2k,
2943
                                 OPJ_BYTE * p_header_data,
2944
                                 OPJ_UINT32 p_header_size,
2945
                                 opj_event_mgr_t * p_manager
2946
                                )
2947
2.46k
{
2948
2.46k
    opj_cp_t *l_cp = NULL;
2949
2.46k
    opj_tcp_t *l_tcp = NULL;
2950
2.46k
    opj_image_t *l_image = NULL;
2951
2.46k
    OPJ_UINT32 l_comp_room;
2952
2.46k
    OPJ_UINT32 l_comp_no;
2953
2954
    /* preconditions */
2955
2.46k
    assert(p_header_data != 00);
2956
2.46k
    assert(p_j2k != 00);
2957
2.46k
    assert(p_manager != 00);
2958
2959
2.46k
    l_cp = &(p_j2k->m_cp);
2960
2.46k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
2961
2.46k
            ?
2962
463
            &l_cp->tcps[p_j2k->m_current_tile_number] :
2963
2.46k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
2964
2.46k
    l_image = p_j2k->m_private_image;
2965
2966
2.46k
    l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
2967
2968
    /* make sure room is sufficient*/
2969
2.46k
    if (p_header_size < l_comp_room + 1) {
2970
7
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2971
7
        return OPJ_FALSE;
2972
7
    }
2973
2.45k
    p_header_size -= l_comp_room + 1;
2974
2975
2.45k
    opj_read_bytes(p_header_data, &l_comp_no,
2976
2.45k
                   l_comp_room);                 /* Ccoc */
2977
2.45k
    p_header_data += l_comp_room;
2978
2.45k
    if (l_comp_no >= l_image->numcomps) {
2979
19
        opj_event_msg(p_manager, EVT_ERROR,
2980
19
                      "Error reading COC marker (bad number of components)\n");
2981
19
        return OPJ_FALSE;
2982
19
    }
2983
2984
2.43k
    opj_read_bytes(p_header_data, &l_tcp->tccps[l_comp_no].csty,
2985
2.43k
                   1);                  /* Scoc */
2986
2.43k
    ++p_header_data ;
2987
2988
2.43k
    if (! opj_j2k_read_SPCod_SPCoc(p_j2k, l_comp_no, p_header_data, &p_header_size,
2989
2.43k
                                   p_manager)) {
2990
87
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2991
87
        return OPJ_FALSE;
2992
87
    }
2993
2994
2.35k
    if (p_header_size != 0) {
2995
21
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2996
21
        return OPJ_FALSE;
2997
21
    }
2998
2.33k
    return OPJ_TRUE;
2999
2.35k
}
3000
3001
static OPJ_BOOL opj_j2k_write_qcd(opj_j2k_t *p_j2k,
3002
                                  opj_stream_private_t *p_stream,
3003
                                  opj_event_mgr_t * p_manager
3004
                                 )
3005
10.9k
{
3006
10.9k
    OPJ_UINT32 l_qcd_size, l_remaining_size;
3007
10.9k
    OPJ_BYTE * l_current_data = 00;
3008
3009
    /* preconditions */
3010
10.9k
    assert(p_j2k != 00);
3011
10.9k
    assert(p_manager != 00);
3012
10.9k
    assert(p_stream != 00);
3013
3014
10.9k
    l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3015
10.9k
                 0);
3016
10.9k
    l_remaining_size = l_qcd_size;
3017
3018
10.9k
    if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3019
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
3020
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);
3021
0
        if (! new_header_tile_data) {
3022
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3023
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3024
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3025
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n");
3026
0
            return OPJ_FALSE;
3027
0
        }
3028
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3029
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
3030
0
    }
3031
3032
10.9k
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
3033
3034
10.9k
    opj_write_bytes(l_current_data, J2K_MS_QCD, 2);         /* QCD */
3035
10.9k
    l_current_data += 2;
3036
3037
10.9k
    opj_write_bytes(l_current_data, l_qcd_size - 2, 2);     /* L_QCD */
3038
10.9k
    l_current_data += 2;
3039
3040
10.9k
    l_remaining_size -= 4;
3041
3042
10.9k
    if (! opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, 0,
3043
10.9k
                                  l_current_data, &l_remaining_size, p_manager)) {
3044
0
        opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
3045
0
        return OPJ_FALSE;
3046
0
    }
3047
3048
10.9k
    if (l_remaining_size != 0) {
3049
0
        opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
3050
0
        return OPJ_FALSE;
3051
0
    }
3052
3053
10.9k
    if (opj_stream_write_data(p_stream,
3054
10.9k
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size,
3055
10.9k
                              p_manager) != l_qcd_size) {
3056
0
        return OPJ_FALSE;
3057
0
    }
3058
3059
10.9k
    return OPJ_TRUE;
3060
10.9k
}
3061
3062
/**
3063
 * Reads a QCD marker (Quantization defaults)
3064
 * @param       p_header_data   the data contained in the QCD box.
3065
 * @param       p_j2k                   the jpeg2000 codec.
3066
 * @param       p_header_size   the size of the data contained in the QCD marker.
3067
 * @param       p_manager               the user event manager.
3068
*/
3069
static OPJ_BOOL opj_j2k_read_qcd(opj_j2k_t *p_j2k,
3070
                                 OPJ_BYTE * p_header_data,
3071
                                 OPJ_UINT32 p_header_size,
3072
                                 opj_event_mgr_t * p_manager
3073
                                )
3074
62.2k
{
3075
    /* preconditions */
3076
62.2k
    assert(p_header_data != 00);
3077
62.2k
    assert(p_j2k != 00);
3078
62.2k
    assert(p_manager != 00);
3079
3080
62.2k
    if (! opj_j2k_read_SQcd_SQcc(p_j2k, 0, p_header_data, &p_header_size,
3081
62.2k
                                 p_manager)) {
3082
14
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3083
14
        return OPJ_FALSE;
3084
14
    }
3085
3086
62.2k
    if (p_header_size != 0) {
3087
70
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3088
70
        return OPJ_FALSE;
3089
70
    }
3090
3091
    /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
3092
62.1k
    opj_j2k_copy_tile_quantization_parameters(p_j2k);
3093
3094
62.1k
    return OPJ_TRUE;
3095
62.2k
}
3096
3097
static OPJ_BOOL opj_j2k_write_qcc(opj_j2k_t *p_j2k,
3098
                                  OPJ_UINT32 p_comp_no,
3099
                                  opj_stream_private_t *p_stream,
3100
                                  opj_event_mgr_t * p_manager
3101
                                 )
3102
0
{
3103
0
    OPJ_UINT32 l_qcc_size, l_remaining_size;
3104
3105
    /* preconditions */
3106
0
    assert(p_j2k != 00);
3107
0
    assert(p_manager != 00);
3108
0
    assert(p_stream != 00);
3109
3110
0
    l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3111
0
                 p_comp_no);
3112
0
    l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0 : 1;
3113
0
    l_remaining_size = l_qcc_size;
3114
3115
0
    if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3116
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
3117
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);
3118
0
        if (! new_header_tile_data) {
3119
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3120
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3121
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3122
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n");
3123
0
            return OPJ_FALSE;
3124
0
        }
3125
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3126
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
3127
0
    }
3128
3129
0
    opj_j2k_write_qcc_in_memory(p_j2k, p_comp_no,
3130
0
                                p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_remaining_size,
3131
0
                                p_manager);
3132
3133
0
    if (opj_stream_write_data(p_stream,
3134
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size,
3135
0
                              p_manager) != l_qcc_size) {
3136
0
        return OPJ_FALSE;
3137
0
    }
3138
3139
0
    return OPJ_TRUE;
3140
0
}
3141
3142
static OPJ_BOOL opj_j2k_compare_qcc(opj_j2k_t *p_j2k,
3143
                                    OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
3144
1.51k
{
3145
1.51k
    return opj_j2k_compare_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number,
3146
1.51k
                                     p_first_comp_no, p_second_comp_no);
3147
1.51k
}
3148
3149
static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
3150
                                        OPJ_UINT32 p_comp_no,
3151
                                        OPJ_BYTE * p_data,
3152
                                        OPJ_UINT32 * p_data_written,
3153
                                        opj_event_mgr_t * p_manager
3154
                                       )
3155
0
{
3156
0
    OPJ_UINT32 l_qcc_size, l_remaining_size;
3157
0
    OPJ_BYTE * l_current_data = 00;
3158
3159
    /* preconditions */
3160
0
    assert(p_j2k != 00);
3161
0
    assert(p_manager != 00);
3162
3163
0
    l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3164
0
                 p_comp_no);
3165
0
    l_remaining_size = l_qcc_size;
3166
3167
0
    l_current_data = p_data;
3168
3169
0
    opj_write_bytes(l_current_data, J2K_MS_QCC, 2);         /* QCC */
3170
0
    l_current_data += 2;
3171
3172
0
    if (p_j2k->m_private_image->numcomps <= 256) {
3173
0
        --l_qcc_size;
3174
3175
0
        opj_write_bytes(l_current_data, l_qcc_size - 2, 2);     /* L_QCC */
3176
0
        l_current_data += 2;
3177
3178
0
        opj_write_bytes(l_current_data, p_comp_no, 1);  /* Cqcc */
3179
0
        ++l_current_data;
3180
3181
        /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */
3182
0
        l_remaining_size -= 6;
3183
0
    } else {
3184
0
        opj_write_bytes(l_current_data, l_qcc_size - 2, 2);     /* L_QCC */
3185
0
        l_current_data += 2;
3186
3187
0
        opj_write_bytes(l_current_data, p_comp_no, 2);  /* Cqcc */
3188
0
        l_current_data += 2;
3189
3190
0
        l_remaining_size -= 6;
3191
0
    }
3192
3193
0
    opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, p_comp_no,
3194
0
                            l_current_data, &l_remaining_size, p_manager);
3195
3196
0
    *p_data_written = l_qcc_size;
3197
0
}
3198
3199
static OPJ_UINT32 opj_j2k_get_max_qcc_size(opj_j2k_t *p_j2k)
3200
10.9k
{
3201
10.9k
    return opj_j2k_get_max_coc_size(p_j2k);
3202
10.9k
}
3203
3204
/**
3205
 * Reads a QCC marker (Quantization component)
3206
 * @param       p_header_data   the data contained in the QCC box.
3207
 * @param       p_j2k                   the jpeg2000 codec.
3208
 * @param       p_header_size   the size of the data contained in the QCC marker.
3209
 * @param       p_manager               the user event manager.
3210
*/
3211
static OPJ_BOOL opj_j2k_read_qcc(opj_j2k_t *p_j2k,
3212
                                 OPJ_BYTE * p_header_data,
3213
                                 OPJ_UINT32 p_header_size,
3214
                                 opj_event_mgr_t * p_manager
3215
                                )
3216
3.32k
{
3217
3.32k
    OPJ_UINT32 l_num_comp, l_comp_no;
3218
3219
    /* preconditions */
3220
3.32k
    assert(p_header_data != 00);
3221
3.32k
    assert(p_j2k != 00);
3222
3.32k
    assert(p_manager != 00);
3223
3224
3.32k
    l_num_comp = p_j2k->m_private_image->numcomps;
3225
3226
3.32k
    if (l_num_comp <= 256) {
3227
1.89k
        if (p_header_size < 1) {
3228
7
            opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3229
7
            return OPJ_FALSE;
3230
7
        }
3231
1.88k
        opj_read_bytes(p_header_data, &l_comp_no, 1);
3232
1.88k
        ++p_header_data;
3233
1.88k
        --p_header_size;
3234
1.88k
    } else {
3235
1.43k
        if (p_header_size < 2) {
3236
6
            opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3237
6
            return OPJ_FALSE;
3238
6
        }
3239
1.42k
        opj_read_bytes(p_header_data, &l_comp_no, 2);
3240
1.42k
        p_header_data += 2;
3241
1.42k
        p_header_size -= 2;
3242
1.42k
    }
3243
3244
#ifdef USE_JPWL
3245
    if (p_j2k->m_cp.correct) {
3246
3247
        static OPJ_UINT32 backup_compno = 0;
3248
3249
        /* compno is negative or larger than the number of components!!! */
3250
        if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {
3251
            opj_event_msg(p_manager, EVT_ERROR,
3252
                          "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
3253
                          l_comp_no, l_num_comp);
3254
            if (!JPWL_ASSUME) {
3255
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
3256
                return OPJ_FALSE;
3257
            }
3258
            /* we try to correct */
3259
            l_comp_no = backup_compno % l_num_comp;
3260
            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
3261
                          "- setting component number to %d\n",
3262
                          l_comp_no);
3263
        }
3264
3265
        /* keep your private count of tiles */
3266
        backup_compno++;
3267
    };
3268
#endif /* USE_JPWL */
3269
3270
3.31k
    if (l_comp_no >= p_j2k->m_private_image->numcomps) {
3271
47
        opj_event_msg(p_manager, EVT_ERROR,
3272
47
                      "Invalid component number: %d, regarding the number of components %d\n",
3273
47
                      l_comp_no, p_j2k->m_private_image->numcomps);
3274
47
        return OPJ_FALSE;
3275
47
    }
3276
3277
3.26k
    if (! opj_j2k_read_SQcd_SQcc(p_j2k, l_comp_no, p_header_data, &p_header_size,
3278
3.26k
                                 p_manager)) {
3279
9
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3280
9
        return OPJ_FALSE;
3281
9
    }
3282
3283
3.25k
    if (p_header_size != 0) {
3284
13
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3285
13
        return OPJ_FALSE;
3286
13
    }
3287
3288
3.24k
    return OPJ_TRUE;
3289
3.25k
}
3290
3291
static OPJ_BOOL opj_j2k_write_poc(opj_j2k_t *p_j2k,
3292
                                  opj_stream_private_t *p_stream,
3293
                                  opj_event_mgr_t * p_manager
3294
                                 )
3295
0
{
3296
0
    OPJ_UINT32 l_nb_comp;
3297
0
    OPJ_UINT32 l_nb_poc;
3298
0
    OPJ_UINT32 l_poc_size;
3299
0
    OPJ_UINT32 l_written_size = 0;
3300
0
    opj_tcp_t *l_tcp = 00;
3301
0
    OPJ_UINT32 l_poc_room;
3302
3303
    /* preconditions */
3304
0
    assert(p_j2k != 00);
3305
0
    assert(p_manager != 00);
3306
0
    assert(p_stream != 00);
3307
3308
0
    l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
3309
0
    l_nb_comp = p_j2k->m_private_image->numcomps;
3310
0
    l_nb_poc = 1 + l_tcp->numpocs;
3311
3312
0
    if (l_nb_comp <= 256) {
3313
0
        l_poc_room = 1;
3314
0
    } else {
3315
0
        l_poc_room = 2;
3316
0
    }
3317
0
    l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
3318
3319
0
    if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3320
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
3321
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);
3322
0
        if (! new_header_tile_data) {
3323
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3324
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3325
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3326
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n");
3327
0
            return OPJ_FALSE;
3328
0
        }
3329
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3330
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
3331
0
    }
3332
3333
0
    opj_j2k_write_poc_in_memory(p_j2k,
3334
0
                                p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_written_size,
3335
0
                                p_manager);
3336
3337
0
    if (opj_stream_write_data(p_stream,
3338
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size,
3339
0
                              p_manager) != l_poc_size) {
3340
0
        return OPJ_FALSE;
3341
0
    }
3342
3343
0
    return OPJ_TRUE;
3344
0
}
3345
3346
static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
3347
                                        OPJ_BYTE * p_data,
3348
                                        OPJ_UINT32 * p_data_written,
3349
                                        opj_event_mgr_t * p_manager
3350
                                       )
3351
0
{
3352
0
    OPJ_UINT32 i;
3353
0
    OPJ_BYTE * l_current_data = 00;
3354
0
    OPJ_UINT32 l_nb_comp;
3355
0
    OPJ_UINT32 l_nb_poc;
3356
0
    OPJ_UINT32 l_poc_size;
3357
0
    opj_image_t *l_image = 00;
3358
0
    opj_tcp_t *l_tcp = 00;
3359
0
    opj_tccp_t *l_tccp = 00;
3360
0
    opj_poc_t *l_current_poc = 00;
3361
0
    OPJ_UINT32 l_poc_room;
3362
3363
    /* preconditions */
3364
0
    assert(p_j2k != 00);
3365
0
    assert(p_manager != 00);
3366
3367
0
    OPJ_UNUSED(p_manager);
3368
3369
0
    l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
3370
0
    l_tccp = &l_tcp->tccps[0];
3371
0
    l_image = p_j2k->m_private_image;
3372
0
    l_nb_comp = l_image->numcomps;
3373
0
    l_nb_poc = 1 + l_tcp->numpocs;
3374
3375
0
    if (l_nb_comp <= 256) {
3376
0
        l_poc_room = 1;
3377
0
    } else {
3378
0
        l_poc_room = 2;
3379
0
    }
3380
3381
0
    l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
3382
3383
0
    l_current_data = p_data;
3384
3385
0
    opj_write_bytes(l_current_data, J2K_MS_POC,
3386
0
                    2);                                   /* POC  */
3387
0
    l_current_data += 2;
3388
3389
0
    opj_write_bytes(l_current_data, l_poc_size - 2,
3390
0
                    2);                                 /* Lpoc */
3391
0
    l_current_data += 2;
3392
3393
0
    l_current_poc =  l_tcp->pocs;
3394
0
    for (i = 0; i < l_nb_poc; ++i) {
3395
0
        opj_write_bytes(l_current_data, l_current_poc->resno0,
3396
0
                        1);                                /* RSpoc_i */
3397
0
        ++l_current_data;
3398
3399
0
        opj_write_bytes(l_current_data, l_current_poc->compno0,
3400
0
                        l_poc_room);              /* CSpoc_i */
3401
0
        l_current_data += l_poc_room;
3402
3403
0
        opj_write_bytes(l_current_data, l_current_poc->layno1,
3404
0
                        2);                                /* LYEpoc_i */
3405
0
        l_current_data += 2;
3406
3407
0
        opj_write_bytes(l_current_data, l_current_poc->resno1,
3408
0
                        1);                                /* REpoc_i */
3409
0
        ++l_current_data;
3410
3411
0
        opj_write_bytes(l_current_data, l_current_poc->compno1,
3412
0
                        l_poc_room);              /* CEpoc_i */
3413
0
        l_current_data += l_poc_room;
3414
3415
0
        opj_write_bytes(l_current_data, (OPJ_UINT32)l_current_poc->prg,
3416
0
                        1);   /* Ppoc_i */
3417
0
        ++l_current_data;
3418
3419
        /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
3420
0
        l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3421
0
                                l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);
3422
0
        l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3423
0
                                l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);
3424
0
        l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3425
0
                                 l_current_poc->compno1, (OPJ_INT32)l_nb_comp);
3426
3427
0
        ++l_current_poc;
3428
0
    }
3429
3430
0
    *p_data_written = l_poc_size;
3431
0
}
3432
3433
static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k)
3434
10.9k
{
3435
10.9k
    opj_tcp_t * l_tcp = 00;
3436
10.9k
    OPJ_UINT32 l_nb_tiles = 0;
3437
10.9k
    OPJ_UINT32 l_max_poc = 0;
3438
10.9k
    OPJ_UINT32 i;
3439
3440
10.9k
    l_tcp = p_j2k->m_cp.tcps;
3441
10.9k
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
3442
3443
21.9k
    for (i = 0; i < l_nb_tiles; ++i) {
3444
10.9k
        l_max_poc = opj_uint_max(l_max_poc, l_tcp->numpocs);
3445
10.9k
        ++l_tcp;
3446
10.9k
    }
3447
3448
10.9k
    ++l_max_poc;
3449
3450
10.9k
    return 4 + 9 * l_max_poc;
3451
10.9k
}
3452
3453
static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k)
3454
10.9k
{
3455
10.9k
    OPJ_UINT32 i;
3456
10.9k
    OPJ_UINT32 l_nb_tiles;
3457
10.9k
    OPJ_UINT32 l_max = 0;
3458
10.9k
    opj_tcp_t * l_tcp = 00;
3459
3460
10.9k
    l_tcp = p_j2k->m_cp.tcps;
3461
10.9k
    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
3462
3463
21.9k
    for (i = 0; i < l_nb_tiles; ++i) {
3464
10.9k
        l_max = opj_uint_max(l_max, l_tcp->m_nb_tile_parts);
3465
3466
10.9k
        ++l_tcp;
3467
10.9k
    }
3468
3469
10.9k
    return 12 * l_max;
3470
10.9k
}
3471
3472
static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
3473
10.9k
{
3474
10.9k
    OPJ_UINT32 l_nb_bytes = 0;
3475
10.9k
    OPJ_UINT32 l_nb_comps;
3476
10.9k
    OPJ_UINT32 l_coc_bytes, l_qcc_bytes;
3477
3478
10.9k
    l_nb_comps = p_j2k->m_private_image->numcomps - 1;
3479
10.9k
    l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
3480
3481
10.9k
    if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) {
3482
10.9k
        l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
3483
10.9k
        l_nb_bytes += l_nb_comps * l_coc_bytes;
3484
3485
10.9k
        l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
3486
10.9k
        l_nb_bytes += l_nb_comps * l_qcc_bytes;
3487
10.9k
    }
3488
3489
10.9k
    l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
3490
3491
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_PLT) {
3492
        /* Reserve space for PLT markers */
3493
3494
0
        OPJ_UINT32 i;
3495
0
        const opj_cp_t * l_cp = &(p_j2k->m_cp);
3496
0
        OPJ_UINT32 l_max_packet_count = 0;
3497
0
        for (i = 0; i < l_cp->th * l_cp->tw; ++i) {
3498
0
            l_max_packet_count = opj_uint_max(l_max_packet_count,
3499
0
                                              opj_get_encoding_packet_count(p_j2k->m_private_image, l_cp, i));
3500
0
        }
3501
        /* Minimum 6 bytes per PLT marker, and at a minimum (taking a pessimistic */
3502
        /* estimate of 4 bytes for a packet size), one can write */
3503
        /* (65536-6) / 4 = 16382 paquet sizes per PLT marker */
3504
0
        p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT =
3505
0
            6 * opj_uint_ceildiv(l_max_packet_count, 16382);
3506
        /* Maximum 5 bytes per packet to encode a full UINT32 */
3507
0
        p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT +=
3508
0
            l_nb_bytes += 5 * l_max_packet_count;
3509
0
        p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT += 1;
3510
0
        l_nb_bytes += p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT;
3511
0
    }
3512
3513
    /*** DEVELOPER CORNER, Add room for your headers ***/
3514
3515
10.9k
    return l_nb_bytes;
3516
10.9k
}
3517
3518
/**
3519
 * Reads a POC marker (Progression Order Change)
3520
 *
3521
 * @param       p_header_data   the data contained in the POC box.
3522
 * @param       p_j2k                   the jpeg2000 codec.
3523
 * @param       p_header_size   the size of the data contained in the POC marker.
3524
 * @param       p_manager               the user event manager.
3525
*/
3526
static OPJ_BOOL opj_j2k_read_poc(opj_j2k_t *p_j2k,
3527
                                 OPJ_BYTE * p_header_data,
3528
                                 OPJ_UINT32 p_header_size,
3529
                                 opj_event_mgr_t * p_manager
3530
                                )
3531
3.64k
{
3532
3.64k
    OPJ_UINT32 i, l_nb_comp, l_tmp;
3533
3.64k
    opj_image_t * l_image = 00;
3534
3.64k
    OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
3535
3.64k
    OPJ_UINT32 l_chunk_size, l_comp_room;
3536
3537
3.64k
    opj_cp_t *l_cp = 00;
3538
3.64k
    opj_tcp_t *l_tcp = 00;
3539
3.64k
    opj_poc_t *l_current_poc = 00;
3540
3541
    /* preconditions */
3542
3.64k
    assert(p_header_data != 00);
3543
3.64k
    assert(p_j2k != 00);
3544
3.64k
    assert(p_manager != 00);
3545
3546
3.64k
    l_image = p_j2k->m_private_image;
3547
3.64k
    l_nb_comp = l_image->numcomps;
3548
3.64k
    if (l_nb_comp <= 256) {
3549
3.40k
        l_comp_room = 1;
3550
3.40k
    } else {
3551
241
        l_comp_room = 2;
3552
241
    }
3553
3.64k
    l_chunk_size = 5 + 2 * l_comp_room;
3554
3.64k
    l_current_poc_nb = p_header_size / l_chunk_size;
3555
3.64k
    l_current_poc_remaining = p_header_size % l_chunk_size;
3556
3557
3.64k
    if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
3558
29
        opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
3559
29
        return OPJ_FALSE;
3560
29
    }
3561
3562
3.62k
    l_cp = &(p_j2k->m_cp);
3563
3.62k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
3564
199
            &l_cp->tcps[p_j2k->m_current_tile_number] :
3565
3.62k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
3566
3.62k
    l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
3567
3.62k
    l_current_poc_nb += l_old_poc_nb;
3568
3569
3.62k
    if (l_current_poc_nb >= J2K_MAX_POCS) {
3570
15
        opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
3571
15
        return OPJ_FALSE;
3572
15
    }
3573
3574
    /* now poc is in use.*/
3575
3.60k
    l_tcp->POC = 1;
3576
3577
3.60k
    l_current_poc = &l_tcp->pocs[l_old_poc_nb];
3578
14.4k
    for (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
3579
10.8k
        opj_read_bytes(p_header_data, &(l_current_poc->resno0),
3580
10.8k
                       1);                               /* RSpoc_i */
3581
10.8k
        ++p_header_data;
3582
10.8k
        opj_read_bytes(p_header_data, &(l_current_poc->compno0),
3583
10.8k
                       l_comp_room);  /* CSpoc_i */
3584
10.8k
        p_header_data += l_comp_room;
3585
10.8k
        opj_read_bytes(p_header_data, &(l_current_poc->layno1),
3586
10.8k
                       2);                               /* LYEpoc_i */
3587
        /* make sure layer end is in acceptable bounds */
3588
10.8k
        l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
3589
10.8k
        p_header_data += 2;
3590
10.8k
        opj_read_bytes(p_header_data, &(l_current_poc->resno1),
3591
10.8k
                       1);                               /* REpoc_i */
3592
10.8k
        ++p_header_data;
3593
10.8k
        opj_read_bytes(p_header_data, &(l_current_poc->compno1),
3594
10.8k
                       l_comp_room);  /* CEpoc_i */
3595
10.8k
        p_header_data += l_comp_room;
3596
10.8k
        opj_read_bytes(p_header_data, &l_tmp,
3597
10.8k
                       1);                                                                 /* Ppoc_i */
3598
10.8k
        ++p_header_data;
3599
10.8k
        l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
3600
        /* make sure comp is in acceptable bounds */
3601
10.8k
        l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
3602
10.8k
        ++l_current_poc;
3603
10.8k
    }
3604
3605
3.60k
    l_tcp->numpocs = l_current_poc_nb - 1;
3606
3.60k
    return OPJ_TRUE;
3607
3.62k
}
3608
3609
/**
3610
 * Reads a CRG marker (Component registration)
3611
 *
3612
 * @param       p_header_data   the data contained in the TLM box.
3613
 * @param       p_j2k                   the jpeg2000 codec.
3614
 * @param       p_header_size   the size of the data contained in the TLM marker.
3615
 * @param       p_manager               the user event manager.
3616
*/
3617
static OPJ_BOOL opj_j2k_read_crg(opj_j2k_t *p_j2k,
3618
                                 OPJ_BYTE * p_header_data,
3619
                                 OPJ_UINT32 p_header_size,
3620
                                 opj_event_mgr_t * p_manager
3621
                                )
3622
476
{
3623
476
    OPJ_UINT32 l_nb_comp;
3624
    /* preconditions */
3625
476
    assert(p_header_data != 00);
3626
476
    assert(p_j2k != 00);
3627
476
    assert(p_manager != 00);
3628
3629
476
    OPJ_UNUSED(p_header_data);
3630
3631
476
    l_nb_comp = p_j2k->m_private_image->numcomps;
3632
3633
476
    if (p_header_size != l_nb_comp * 4) {
3634
8
        opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
3635
8
        return OPJ_FALSE;
3636
8
    }
3637
    /* Do not care of this at the moment since only local variables are set here */
3638
    /*
3639
    for
3640
            (i = 0; i < l_nb_comp; ++i)
3641
    {
3642
            opj_read_bytes(p_header_data,&l_Xcrg_i,2);                              // Xcrg_i
3643
            p_header_data+=2;
3644
            opj_read_bytes(p_header_data,&l_Ycrg_i,2);                              // Xcrg_i
3645
            p_header_data+=2;
3646
    }
3647
    */
3648
468
    return OPJ_TRUE;
3649
476
}
3650
3651
/**
3652
 * Reads a TLM marker (Tile Length Marker)
3653
 *
3654
 * @param       p_header_data   the data contained in the TLM box.
3655
 * @param       p_j2k                   the jpeg2000 codec.
3656
 * @param       p_header_size   the size of the data contained in the TLM marker.
3657
 * @param       p_manager               the user event manager.
3658
*/
3659
static OPJ_BOOL opj_j2k_read_tlm(opj_j2k_t *p_j2k,
3660
                                 OPJ_BYTE * p_header_data,
3661
                                 OPJ_UINT32 p_header_size,
3662
                                 opj_event_mgr_t * p_manager
3663
                                )
3664
11.7k
{
3665
11.7k
    OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP,
3666
11.7k
               l_Ptlm_size, l_entry_size, l_num_tileparts;
3667
11.7k
    OPJ_UINT32 i;
3668
11.7k
    opj_j2k_tlm_tile_part_info_t* l_tile_part_infos;
3669
11.7k
    opj_j2k_tlm_info_t* l_tlm;
3670
3671
    /* preconditions */
3672
11.7k
    assert(p_header_data != 00);
3673
11.7k
    assert(p_j2k != 00);
3674
11.7k
    assert(p_manager != 00);
3675
3676
11.7k
    l_tlm = &(p_j2k->m_specific_param.m_decoder.m_tlm);
3677
3678
11.7k
    if (p_header_size < 2) {
3679
6
        opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker.\n");
3680
6
        return OPJ_FALSE;
3681
6
    }
3682
11.7k
    p_header_size -= 2;
3683
3684
11.7k
    if (l_tlm->m_is_invalid) {
3685
1.51k
        return OPJ_TRUE;
3686
1.51k
    }
3687
3688
10.2k
    opj_read_bytes(p_header_data, &l_Ztlm,
3689
10.2k
                   1);                              /* Ztlm */
3690
10.2k
    ++p_header_data;
3691
10.2k
    opj_read_bytes(p_header_data, &l_Stlm,
3692
10.2k
                   1);                              /* Stlm */
3693
10.2k
    ++p_header_data;
3694
3695
10.2k
    l_ST = ((l_Stlm >> 4) & 0x3);
3696
10.2k
    if (l_ST == 3) {
3697
52
        l_tlm->m_is_invalid = OPJ_TRUE;
3698
52
        opj_event_msg(p_manager, EVT_WARNING,
3699
52
                      "opj_j2k_read_tlm(): ST = 3 is invalid.\n");
3700
52
        return OPJ_TRUE;
3701
52
    }
3702
10.1k
    l_SP = (l_Stlm >> 6) & 0x1;
3703
3704
10.1k
    l_Ptlm_size = (l_SP + 1) * 2;
3705
10.1k
    l_entry_size = l_Ptlm_size + l_ST;
3706
3707
10.1k
    if ((p_header_size % l_entry_size) != 0) {
3708
24
        l_tlm->m_is_invalid = OPJ_TRUE;
3709
24
        opj_event_msg(p_manager, EVT_WARNING,
3710
24
                      "opj_j2k_read_tlm(): TLM marker not of expected size.\n");
3711
24
        return OPJ_TRUE;
3712
24
    }
3713
3714
10.1k
    l_num_tileparts = p_header_size / l_entry_size;
3715
10.1k
    if (l_num_tileparts == 0) {
3716
        /* not totally sure if this is valid... */
3717
1.48k
        return OPJ_TRUE;
3718
1.48k
    }
3719
3720
    /* Highly unlikely, unless there are gazillions of TLM markers */
3721
8.66k
    if (l_tlm->m_entries_count > UINT32_MAX - l_num_tileparts ||
3722
8.66k
            l_tlm->m_entries_count + l_num_tileparts > UINT32_MAX / sizeof(
3723
8.66k
                opj_j2k_tlm_tile_part_info_t)) {
3724
0
        l_tlm->m_is_invalid = OPJ_TRUE;
3725
0
        opj_event_msg(p_manager, EVT_WARNING,
3726
0
                      "opj_j2k_read_tlm(): too many TLM markers.\n");
3727
0
        return OPJ_TRUE;
3728
0
    }
3729
3730
8.66k
    l_tile_part_infos = (opj_j2k_tlm_tile_part_info_t*)opj_realloc(
3731
8.66k
                            l_tlm->m_tile_part_infos,
3732
8.66k
                            (l_tlm->m_entries_count + l_num_tileparts) * sizeof(
3733
8.66k
                                opj_j2k_tlm_tile_part_info_t));
3734
8.66k
    if (!l_tile_part_infos) {
3735
0
        l_tlm->m_is_invalid = OPJ_TRUE;
3736
0
        opj_event_msg(p_manager, EVT_WARNING,
3737
0
                      "opj_j2k_read_tlm(): cannot allocate m_tile_part_infos.\n");
3738
0
        return OPJ_TRUE;
3739
0
    }
3740
3741
8.66k
    l_tlm->m_tile_part_infos = l_tile_part_infos;
3742
3743
52.7k
    for (i = 0; i < l_num_tileparts; ++ i) {
3744
44.3k
        OPJ_UINT32 l_tile_index;
3745
44.3k
        OPJ_UINT32 l_length;
3746
3747
        /* Read Ttlm_i */
3748
44.3k
        if (l_ST == 0) {
3749
31.8k
            l_tile_index = l_tlm->m_entries_count;
3750
31.8k
        } else {
3751
12.4k
            opj_read_bytes(p_header_data, &l_tile_index, l_ST);
3752
12.4k
            p_header_data += l_ST;
3753
12.4k
        }
3754
3755
44.3k
        if (l_tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) {
3756
179
            l_tlm->m_is_invalid = OPJ_TRUE;
3757
179
            opj_event_msg(p_manager, EVT_WARNING,
3758
179
                          "opj_j2k_read_tlm(): invalid tile number %d\n",
3759
179
                          l_tile_index);
3760
179
            return OPJ_TRUE;
3761
179
        }
3762
3763
        /* Read Ptlm_i */
3764
44.1k
        opj_read_bytes(p_header_data, &l_length, l_Ptlm_size);
3765
44.1k
        p_header_data += l_Ptlm_size;
3766
3767
44.1k
        l_tile_part_infos[l_tlm->m_entries_count].m_tile_index =
3768
44.1k
            (OPJ_UINT16)l_tile_index;
3769
44.1k
        l_tile_part_infos[l_tlm->m_entries_count].m_length = l_length;
3770
44.1k
        ++l_tlm->m_entries_count;
3771
44.1k
    }
3772
3773
8.48k
    return OPJ_TRUE;
3774
8.66k
}
3775
3776
/**
3777
 * Reads a PLM marker (Packet length, main header marker)
3778
 *
3779
 * @param       p_header_data   the data contained in the TLM box.
3780
 * @param       p_j2k                   the jpeg2000 codec.
3781
 * @param       p_header_size   the size of the data contained in the TLM marker.
3782
 * @param       p_manager               the user event manager.
3783
*/
3784
static OPJ_BOOL opj_j2k_read_plm(opj_j2k_t *p_j2k,
3785
                                 OPJ_BYTE * p_header_data,
3786
                                 OPJ_UINT32 p_header_size,
3787
                                 opj_event_mgr_t * p_manager
3788
                                )
3789
1.14k
{
3790
    /* preconditions */
3791
1.14k
    assert(p_header_data != 00);
3792
1.14k
    assert(p_j2k != 00);
3793
1.14k
    assert(p_manager != 00);
3794
3795
1.14k
    OPJ_UNUSED(p_j2k);
3796
1.14k
    OPJ_UNUSED(p_header_data);
3797
3798
1.14k
    if (p_header_size < 1) {
3799
7
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3800
7
        return OPJ_FALSE;
3801
7
    }
3802
    /* Do not care of this at the moment since only local variables are set here */
3803
    /*
3804
    opj_read_bytes(p_header_data,&l_Zplm,1);                                        // Zplm
3805
    ++p_header_data;
3806
    --p_header_size;
3807
3808
    while
3809
            (p_header_size > 0)
3810
    {
3811
            opj_read_bytes(p_header_data,&l_Nplm,1);                                // Nplm
3812
            ++p_header_data;
3813
            p_header_size -= (1+l_Nplm);
3814
            if
3815
                    (p_header_size < 0)
3816
            {
3817
                    opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3818
                    return false;
3819
            }
3820
            for
3821
                    (i = 0; i < l_Nplm; ++i)
3822
            {
3823
                    opj_read_bytes(p_header_data,&l_tmp,1);                         // Iplm_ij
3824
                    ++p_header_data;
3825
                    // take only the last seven bytes
3826
                    l_packet_len |= (l_tmp & 0x7f);
3827
                    if
3828
                            (l_tmp & 0x80)
3829
                    {
3830
                            l_packet_len <<= 7;
3831
                    }
3832
                    else
3833
                    {
3834
            // store packet length and proceed to next packet
3835
                            l_packet_len = 0;
3836
                    }
3837
            }
3838
            if
3839
                    (l_packet_len != 0)
3840
            {
3841
                    opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3842
                    return false;
3843
            }
3844
    }
3845
    */
3846
1.13k
    return OPJ_TRUE;
3847
1.14k
}
3848
3849
/**
3850
 * Reads a PLT marker (Packet length, tile-part header)
3851
 *
3852
 * @param       p_header_data   the data contained in the PLT box.
3853
 * @param       p_j2k                   the jpeg2000 codec.
3854
 * @param       p_header_size   the size of the data contained in the PLT marker.
3855
 * @param       p_manager               the user event manager.
3856
*/
3857
static OPJ_BOOL opj_j2k_read_plt(opj_j2k_t *p_j2k,
3858
                                 OPJ_BYTE * p_header_data,
3859
                                 OPJ_UINT32 p_header_size,
3860
                                 opj_event_mgr_t * p_manager
3861
                                )
3862
2.55k
{
3863
2.55k
    OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
3864
3865
    /* preconditions */
3866
2.55k
    assert(p_header_data != 00);
3867
2.55k
    assert(p_j2k != 00);
3868
2.55k
    assert(p_manager != 00);
3869
3870
2.55k
    OPJ_UNUSED(p_j2k);
3871
3872
2.55k
    if (p_header_size < 1) {
3873
5
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3874
5
        return OPJ_FALSE;
3875
5
    }
3876
3877
2.55k
    opj_read_bytes(p_header_data, &l_Zplt, 1);              /* Zplt */
3878
2.55k
    ++p_header_data;
3879
2.55k
    --p_header_size;
3880
3881
16.5k
    for (i = 0; i < p_header_size; ++i) {
3882
13.9k
        opj_read_bytes(p_header_data, &l_tmp, 1);       /* Iplt_ij */
3883
13.9k
        ++p_header_data;
3884
        /* take only the last seven bytes */
3885
13.9k
        l_packet_len |= (l_tmp & 0x7f);
3886
13.9k
        if (l_tmp & 0x80) {
3887
5.08k
            l_packet_len <<= 7;
3888
8.91k
        } else {
3889
            /* store packet length and proceed to next packet */
3890
8.91k
            l_packet_len = 0;
3891
8.91k
        }
3892
13.9k
    }
3893
3894
2.55k
    if (l_packet_len != 0) {
3895
84
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3896
84
        return OPJ_FALSE;
3897
84
    }
3898
3899
2.46k
    return OPJ_TRUE;
3900
2.55k
}
3901
3902
/**
3903
 * Reads a PPM marker (Packed packet headers, main header)
3904
 *
3905
 * @param       p_header_data   the data contained in the POC box.
3906
 * @param       p_j2k                   the jpeg2000 codec.
3907
 * @param       p_header_size   the size of the data contained in the POC marker.
3908
 * @param       p_manager               the user event manager.
3909
 */
3910
3911
static OPJ_BOOL opj_j2k_read_ppm(
3912
    opj_j2k_t *p_j2k,
3913
    OPJ_BYTE * p_header_data,
3914
    OPJ_UINT32 p_header_size,
3915
    opj_event_mgr_t * p_manager)
3916
1.49k
{
3917
1.49k
    opj_cp_t *l_cp = 00;
3918
1.49k
    OPJ_UINT32 l_Z_ppm;
3919
3920
    /* preconditions */
3921
1.49k
    assert(p_header_data != 00);
3922
1.49k
    assert(p_j2k != 00);
3923
1.49k
    assert(p_manager != 00);
3924
3925
    /* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */
3926
1.49k
    if (p_header_size < 2) {
3927
11
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3928
11
        return OPJ_FALSE;
3929
11
    }
3930
3931
1.48k
    l_cp = &(p_j2k->m_cp);
3932
1.48k
    l_cp->ppm = 1;
3933
3934
1.48k
    opj_read_bytes(p_header_data, &l_Z_ppm, 1);             /* Z_ppm */
3935
1.48k
    ++p_header_data;
3936
1.48k
    --p_header_size;
3937
3938
    /* check allocation needed */
3939
1.48k
    if (l_cp->ppm_markers == NULL) { /* first PPM marker */
3940
610
        OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3941
610
        assert(l_cp->ppm_markers_count == 0U);
3942
3943
610
        l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
3944
610
        if (l_cp->ppm_markers == NULL) {
3945
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3946
0
            return OPJ_FALSE;
3947
0
        }
3948
610
        l_cp->ppm_markers_count = l_newCount;
3949
876
    } else if (l_cp->ppm_markers_count <= l_Z_ppm) {
3950
415
        OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3951
415
        opj_ppx *new_ppm_markers;
3952
415
        new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers,
3953
415
                          l_newCount * sizeof(opj_ppx));
3954
415
        if (new_ppm_markers == NULL) {
3955
            /* clean up to be done on l_cp destruction */
3956
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3957
0
            return OPJ_FALSE;
3958
0
        }
3959
415
        l_cp->ppm_markers = new_ppm_markers;
3960
415
        memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0,
3961
415
               (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx));
3962
415
        l_cp->ppm_markers_count = l_newCount;
3963
415
    }
3964
3965
1.48k
    if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) {
3966
        /* clean up to be done on l_cp destruction */
3967
13
        opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm);
3968
13
        return OPJ_FALSE;
3969
13
    }
3970
3971
1.47k
    l_cp->ppm_markers[l_Z_ppm].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
3972
1.47k
    if (l_cp->ppm_markers[l_Z_ppm].m_data == NULL) {
3973
        /* clean up to be done on l_cp destruction */
3974
0
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3975
0
        return OPJ_FALSE;
3976
0
    }
3977
1.47k
    l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size;
3978
1.47k
    memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size);
3979
3980
1.47k
    return OPJ_TRUE;
3981
1.47k
}
3982
3983
/**
3984
 * Merges all PPM markers read (Packed headers, main header)
3985
 *
3986
 * @param       p_cp      main coding parameters.
3987
 * @param       p_manager the user event manager.
3988
 */
3989
static OPJ_BOOL opj_j2k_merge_ppm(opj_cp_t *p_cp, opj_event_mgr_t * p_manager)
3990
42.2k
{
3991
42.2k
    OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining;
3992
3993
    /* preconditions */
3994
42.2k
    assert(p_cp != 00);
3995
42.2k
    assert(p_manager != 00);
3996
42.2k
    assert(p_cp->ppm_buffer == NULL);
3997
3998
42.2k
    if (p_cp->ppm == 0U) {
3999
41.7k
        return OPJ_TRUE;
4000
41.7k
    }
4001
4002
448
    l_ppm_data_size = 0U;
4003
448
    l_N_ppm_remaining = 0U;
4004
44.0k
    for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
4005
43.6k
        if (p_cp->ppm_markers[i].m_data !=
4006
43.6k
                NULL) { /* standard doesn't seem to require contiguous Zppm */
4007
1.00k
            OPJ_UINT32 l_N_ppm;
4008
1.00k
            OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
4009
1.00k
            const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
4010
4011
1.00k
            if (l_N_ppm_remaining >= l_data_size) {
4012
384
                l_N_ppm_remaining -= l_data_size;
4013
384
                l_data_size = 0U;
4014
619
            } else {
4015
619
                l_data += l_N_ppm_remaining;
4016
619
                l_data_size -= l_N_ppm_remaining;
4017
619
                l_N_ppm_remaining = 0U;
4018
619
            }
4019
4020
1.00k
            if (l_data_size > 0U) {
4021
1.38k
                do {
4022
                    /* read Nppm */
4023
1.38k
                    if (l_data_size < 4U) {
4024
                        /* clean up to be done on l_cp destruction */
4025
12
                        opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
4026
12
                        return OPJ_FALSE;
4027
12
                    }
4028
1.37k
                    opj_read_bytes(l_data, &l_N_ppm, 4);
4029
1.37k
                    l_data += 4;
4030
1.37k
                    l_data_size -= 4;
4031
4032
1.37k
                    if (l_ppm_data_size > UINT_MAX - l_N_ppm) {
4033
7
                        opj_event_msg(p_manager, EVT_ERROR, "Too large value for Nppm\n");
4034
7
                        return OPJ_FALSE;
4035
7
                    }
4036
1.36k
                    l_ppm_data_size += l_N_ppm;
4037
1.36k
                    if (l_data_size >= l_N_ppm) {
4038
1.01k
                        l_data_size -= l_N_ppm;
4039
1.01k
                        l_data += l_N_ppm;
4040
1.01k
                    } else {
4041
359
                        l_N_ppm_remaining = l_N_ppm - l_data_size;
4042
359
                        l_data_size = 0U;
4043
359
                    }
4044
1.36k
                } while (l_data_size > 0U);
4045
619
            }
4046
1.00k
        }
4047
43.6k
    }
4048
4049
429
    if (l_N_ppm_remaining != 0U) {
4050
        /* clean up to be done on l_cp destruction */
4051
289
        opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n");
4052
289
        return OPJ_FALSE;
4053
289
    }
4054
4055
140
    p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size);
4056
140
    if (p_cp->ppm_buffer == 00) {
4057
4
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
4058
4
        return OPJ_FALSE;
4059
4
    }
4060
136
    p_cp->ppm_len = l_ppm_data_size;
4061
136
    l_ppm_data_size = 0U;
4062
136
    l_N_ppm_remaining = 0U;
4063
10.4k
    for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
4064
10.2k
        if (p_cp->ppm_markers[i].m_data !=
4065
10.2k
                NULL) { /* standard doesn't seem to require contiguous Zppm */
4066
310
            OPJ_UINT32 l_N_ppm;
4067
310
            OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
4068
310
            const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
4069
4070
310
            if (l_N_ppm_remaining >= l_data_size) {
4071
51
                memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
4072
51
                l_ppm_data_size += l_data_size;
4073
51
                l_N_ppm_remaining -= l_data_size;
4074
51
                l_data_size = 0U;
4075
259
            } else {
4076
259
                memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining);
4077
259
                l_ppm_data_size += l_N_ppm_remaining;
4078
259
                l_data += l_N_ppm_remaining;
4079
259
                l_data_size -= l_N_ppm_remaining;
4080
259
                l_N_ppm_remaining = 0U;
4081
259
            }
4082
4083
310
            if (l_data_size > 0U) {
4084
667
                do {
4085
                    /* read Nppm */
4086
667
                    if (l_data_size < 4U) {
4087
                        /* clean up to be done on l_cp destruction */
4088
0
                        opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
4089
0
                        return OPJ_FALSE;
4090
0
                    }
4091
667
                    opj_read_bytes(l_data, &l_N_ppm, 4);
4092
667
                    l_data += 4;
4093
667
                    l_data_size -= 4;
4094
4095
667
                    if (l_data_size >= l_N_ppm) {
4096
629
                        memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm);
4097
629
                        l_ppm_data_size += l_N_ppm;
4098
629
                        l_data_size -= l_N_ppm;
4099
629
                        l_data += l_N_ppm;
4100
629
                    } else {
4101
38
                        memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
4102
38
                        l_ppm_data_size += l_data_size;
4103
38
                        l_N_ppm_remaining = l_N_ppm - l_data_size;
4104
38
                        l_data_size = 0U;
4105
38
                    }
4106
667
                } while (l_data_size > 0U);
4107
259
            }
4108
310
            opj_free(p_cp->ppm_markers[i].m_data);
4109
310
            p_cp->ppm_markers[i].m_data = NULL;
4110
310
            p_cp->ppm_markers[i].m_data_size = 0U;
4111
310
        }
4112
10.2k
    }
4113
4114
136
    p_cp->ppm_data = p_cp->ppm_buffer;
4115
136
    p_cp->ppm_data_size = p_cp->ppm_len;
4116
4117
136
    p_cp->ppm_markers_count = 0U;
4118
136
    opj_free(p_cp->ppm_markers);
4119
136
    p_cp->ppm_markers = NULL;
4120
4121
136
    return OPJ_TRUE;
4122
136
}
4123
4124
/**
4125
 * Reads a PPT marker (Packed packet headers, tile-part header)
4126
 *
4127
 * @param       p_header_data   the data contained in the PPT box.
4128
 * @param       p_j2k                   the jpeg2000 codec.
4129
 * @param       p_header_size   the size of the data contained in the PPT marker.
4130
 * @param       p_manager               the user event manager.
4131
*/
4132
static OPJ_BOOL opj_j2k_read_ppt(opj_j2k_t *p_j2k,
4133
                                 OPJ_BYTE * p_header_data,
4134
                                 OPJ_UINT32 p_header_size,
4135
                                 opj_event_mgr_t * p_manager
4136
                                )
4137
669
{
4138
669
    opj_cp_t *l_cp = 00;
4139
669
    opj_tcp_t *l_tcp = 00;
4140
669
    OPJ_UINT32 l_Z_ppt;
4141
4142
    /* preconditions */
4143
669
    assert(p_header_data != 00);
4144
669
    assert(p_j2k != 00);
4145
669
    assert(p_manager != 00);
4146
4147
    /* We need to have the Z_ppt element + 1 byte of Ippt at minimum */
4148
669
    if (p_header_size < 2) {
4149
7
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
4150
7
        return OPJ_FALSE;
4151
7
    }
4152
4153
662
    l_cp = &(p_j2k->m_cp);
4154
662
    if (l_cp->ppm) {
4155
4
        opj_event_msg(p_manager, EVT_ERROR,
4156
4
                      "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
4157
4
        return OPJ_FALSE;
4158
4
    }
4159
4160
658
    l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
4161
658
    l_tcp->ppt = 1;
4162
4163
658
    opj_read_bytes(p_header_data, &l_Z_ppt, 1);             /* Z_ppt */
4164
658
    ++p_header_data;
4165
658
    --p_header_size;
4166
4167
    /* check allocation needed */
4168
658
    if (l_tcp->ppt_markers == NULL) { /* first PPT marker */
4169
564
        OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4170
564
        assert(l_tcp->ppt_markers_count == 0U);
4171
4172
564
        l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
4173
564
        if (l_tcp->ppt_markers == NULL) {
4174
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4175
0
            return OPJ_FALSE;
4176
0
        }
4177
564
        l_tcp->ppt_markers_count = l_newCount;
4178
564
    } else if (l_tcp->ppt_markers_count <= l_Z_ppt) {
4179
46
        OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4180
46
        opj_ppx *new_ppt_markers;
4181
46
        new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers,
4182
46
                          l_newCount * sizeof(opj_ppx));
4183
46
        if (new_ppt_markers == NULL) {
4184
            /* clean up to be done on l_tcp destruction */
4185
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4186
0
            return OPJ_FALSE;
4187
0
        }
4188
46
        l_tcp->ppt_markers = new_ppt_markers;
4189
46
        memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0,
4190
46
               (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx));
4191
46
        l_tcp->ppt_markers_count = l_newCount;
4192
46
    }
4193
4194
658
    if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) {
4195
        /* clean up to be done on l_tcp destruction */
4196
7
        opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt);
4197
7
        return OPJ_FALSE;
4198
7
    }
4199
4200
651
    l_tcp->ppt_markers[l_Z_ppt].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
4201
651
    if (l_tcp->ppt_markers[l_Z_ppt].m_data == NULL) {
4202
        /* clean up to be done on l_tcp destruction */
4203
0
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4204
0
        return OPJ_FALSE;
4205
0
    }
4206
651
    l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size;
4207
651
    memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size);
4208
651
    return OPJ_TRUE;
4209
651
}
4210
4211
/**
4212
 * Merges all PPT markers read (Packed packet headers, tile-part header)
4213
 *
4214
 * @param       p_tcp   the tile.
4215
 * @param       p_manager               the user event manager.
4216
 */
4217
static OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp, opj_event_mgr_t * p_manager)
4218
46.8k
{
4219
46.8k
    OPJ_UINT32 i, l_ppt_data_size;
4220
    /* preconditions */
4221
46.8k
    assert(p_tcp != 00);
4222
46.8k
    assert(p_manager != 00);
4223
4224
46.8k
    if (p_tcp->ppt_buffer != NULL) {
4225
4
        opj_event_msg(p_manager, EVT_ERROR,
4226
4
                      "opj_j2k_merge_ppt() has already been called\n");
4227
4
        return OPJ_FALSE;
4228
4
    }
4229
4230
46.8k
    if (p_tcp->ppt == 0U) {
4231
46.4k
        return OPJ_TRUE;
4232
46.4k
    }
4233
4234
425
    l_ppt_data_size = 0U;
4235
9.59k
    for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4236
9.16k
        l_ppt_data_size +=
4237
9.16k
            p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4238
9.16k
    }
4239
4240
425
    p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size);
4241
425
    if (p_tcp->ppt_buffer == 00) {
4242
0
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4243
0
        return OPJ_FALSE;
4244
0
    }
4245
425
    p_tcp->ppt_len = l_ppt_data_size;
4246
425
    l_ppt_data_size = 0U;
4247
9.59k
    for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4248
9.16k
        if (p_tcp->ppt_markers[i].m_data !=
4249
9.16k
                NULL) { /* standard doesn't seem to require contiguous Zppt */
4250
453
            memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data,
4251
453
                   p_tcp->ppt_markers[i].m_data_size);
4252
453
            l_ppt_data_size +=
4253
453
                p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4254
4255
453
            opj_free(p_tcp->ppt_markers[i].m_data);
4256
453
            p_tcp->ppt_markers[i].m_data = NULL;
4257
453
            p_tcp->ppt_markers[i].m_data_size = 0U;
4258
453
        }
4259
9.16k
    }
4260
4261
425
    p_tcp->ppt_markers_count = 0U;
4262
425
    opj_free(p_tcp->ppt_markers);
4263
425
    p_tcp->ppt_markers = NULL;
4264
4265
425
    p_tcp->ppt_data = p_tcp->ppt_buffer;
4266
425
    p_tcp->ppt_data_size = p_tcp->ppt_len;
4267
425
    return OPJ_TRUE;
4268
425
}
4269
4270
static OPJ_BOOL opj_j2k_write_tlm(opj_j2k_t *p_j2k,
4271
                                  opj_stream_private_t *p_stream,
4272
                                  opj_event_mgr_t * p_manager
4273
                                 )
4274
1.05k
{
4275
1.05k
    OPJ_BYTE * l_current_data = 00;
4276
1.05k
    OPJ_UINT32 l_tlm_size;
4277
1.05k
    OPJ_UINT32 size_per_tile_part;
4278
4279
    /* preconditions */
4280
1.05k
    assert(p_j2k != 00);
4281
1.05k
    assert(p_manager != 00);
4282
1.05k
    assert(p_stream != 00);
4283
4284
    /* 10921 = (65535 - header_size) / size_per_tile_part where */
4285
    /* header_size = 4 and size_per_tile_part = 6 */
4286
1.05k
    if (p_j2k->m_specific_param.m_encoder.m_total_tile_parts > 10921) {
4287
        /* We could do more but it would require writing several TLM markers */
4288
0
        opj_event_msg(p_manager, EVT_ERROR,
4289
0
                      "A maximum of 10921 tile-parts are supported currently "
4290
0
                      "when writing TLM marker\n");
4291
0
        return OPJ_FALSE;
4292
0
    }
4293
4294
1.05k
    if (p_j2k->m_specific_param.m_encoder.m_total_tile_parts <= 255) {
4295
1.05k
        size_per_tile_part = 5;
4296
1.05k
        p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte = OPJ_TRUE;
4297
1.05k
    } else {
4298
0
        size_per_tile_part = 6;
4299
0
        p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte = OPJ_FALSE;
4300
0
    }
4301
4302
1.05k
    l_tlm_size = 2 + 4 + (size_per_tile_part *
4303
1.05k
                          p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
4304
4305
1.05k
    if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
4306
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
4307
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);
4308
0
        if (! new_header_tile_data) {
4309
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
4310
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
4311
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
4312
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n");
4313
0
            return OPJ_FALSE;
4314
0
        }
4315
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
4316
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
4317
0
    }
4318
1.05k
    memset(p_j2k->m_specific_param.m_encoder.m_header_tile_data, 0, l_tlm_size);
4319
4320
1.05k
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
4321
4322
    /* change the way data is written to avoid seeking if possible */
4323
    /* TODO */
4324
1.05k
    p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
4325
4326
1.05k
    opj_write_bytes(l_current_data, J2K_MS_TLM,
4327
1.05k
                    2);                                   /* TLM */
4328
1.05k
    l_current_data += 2;
4329
4330
1.05k
    opj_write_bytes(l_current_data, l_tlm_size - 2,
4331
1.05k
                    2);                                 /* Lpoc */
4332
1.05k
    l_current_data += 2;
4333
4334
1.05k
    opj_write_bytes(l_current_data, 0,
4335
1.05k
                    1);                                                    /* Ztlm=0*/
4336
1.05k
    ++l_current_data;
4337
4338
    /* Stlm 0x50= ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
4339
    /* Stlm 0x60= ST=2(16bits-65535 tiles max),SP=1(Ptlm=32bits) */
4340
1.05k
    opj_write_bytes(l_current_data,
4341
1.05k
                    size_per_tile_part == 5 ? 0x50 : 0x60,
4342
1.05k
                    1);
4343
1.05k
    ++l_current_data;
4344
4345
    /* do nothing on the size_per_tile_part * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
4346
1.05k
    if (opj_stream_write_data(p_stream,
4347
1.05k
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size,
4348
1.05k
                              p_manager) != l_tlm_size) {
4349
0
        return OPJ_FALSE;
4350
0
    }
4351
4352
1.05k
    return OPJ_TRUE;
4353
1.05k
}
4354
4355
static OPJ_BOOL opj_j2k_write_sot(opj_j2k_t *p_j2k,
4356
                                  OPJ_BYTE * p_data,
4357
                                  OPJ_UINT32 total_data_size,
4358
                                  OPJ_UINT32 * p_data_written,
4359
                                  const opj_stream_private_t *p_stream,
4360
                                  opj_event_mgr_t * p_manager
4361
                                 )
4362
10.9k
{
4363
    /* preconditions */
4364
10.9k
    assert(p_j2k != 00);
4365
10.9k
    assert(p_manager != 00);
4366
10.9k
    assert(p_stream != 00);
4367
4368
10.9k
    OPJ_UNUSED(p_stream);
4369
4370
10.9k
    if (total_data_size < 12) {
4371
0
        opj_event_msg(p_manager, EVT_ERROR,
4372
0
                      "Not enough bytes in output buffer to write SOT marker\n");
4373
0
        return OPJ_FALSE;
4374
0
    }
4375
4376
10.9k
    opj_write_bytes(p_data, J2K_MS_SOT,
4377
10.9k
                    2);                                 /* SOT */
4378
10.9k
    p_data += 2;
4379
4380
10.9k
    opj_write_bytes(p_data, 10,
4381
10.9k
                    2);                                                   /* Lsot */
4382
10.9k
    p_data += 2;
4383
4384
10.9k
    opj_write_bytes(p_data, p_j2k->m_current_tile_number,
4385
10.9k
                    2);                        /* Isot */
4386
10.9k
    p_data += 2;
4387
4388
    /* Psot  */
4389
10.9k
    p_data += 4;
4390
4391
10.9k
    opj_write_bytes(p_data,
4392
10.9k
                    p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,
4393
10.9k
                    1);                        /* TPsot */
4394
10.9k
    ++p_data;
4395
4396
10.9k
    opj_write_bytes(p_data,
4397
10.9k
                    p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,
4398
10.9k
                    1);                      /* TNsot */
4399
10.9k
    ++p_data;
4400
4401
    /* UniPG>> */
4402
#ifdef USE_JPWL
4403
    /* update markers struct */
4404
    /*
4405
            OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
4406
    */
4407
    assert(0 && "TODO");
4408
#endif /* USE_JPWL */
4409
4410
10.9k
    * p_data_written = 12;
4411
4412
10.9k
    return OPJ_TRUE;
4413
10.9k
}
4414
4415
static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE *  p_header_data,
4416
                                       OPJ_UINT32  p_header_size,
4417
                                       OPJ_UINT32* p_tile_no,
4418
                                       OPJ_UINT32* p_tot_len,
4419
                                       OPJ_UINT32* p_current_part,
4420
                                       OPJ_UINT32* p_num_parts,
4421
                                       opj_event_mgr_t * p_manager)
4422
52.6k
{
4423
    /* preconditions */
4424
52.6k
    assert(p_header_data != 00);
4425
52.6k
    assert(p_manager != 00);
4426
4427
    /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
4428
52.6k
    if (p_header_size != 8) {
4429
51
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4430
51
        return OPJ_FALSE;
4431
51
    }
4432
4433
52.5k
    opj_read_bytes(p_header_data, p_tile_no, 2);    /* Isot */
4434
52.5k
    p_header_data += 2;
4435
52.5k
    opj_read_bytes(p_header_data, p_tot_len, 4);    /* Psot */
4436
52.5k
    p_header_data += 4;
4437
52.5k
    opj_read_bytes(p_header_data, p_current_part, 1); /* TPsot */
4438
52.5k
    ++p_header_data;
4439
52.5k
    opj_read_bytes(p_header_data, p_num_parts, 1);  /* TNsot */
4440
52.5k
    ++p_header_data;
4441
52.5k
    return OPJ_TRUE;
4442
52.6k
}
4443
4444
static OPJ_BOOL opj_j2k_read_sot(opj_j2k_t *p_j2k,
4445
                                 OPJ_BYTE * p_header_data,
4446
                                 OPJ_UINT32 p_header_size,
4447
                                 opj_event_mgr_t * p_manager)
4448
52.1k
{
4449
52.1k
    opj_cp_t *l_cp = 00;
4450
52.1k
    opj_tcp_t *l_tcp = 00;
4451
52.1k
    OPJ_UINT32 l_tot_len, l_num_parts = 0;
4452
52.1k
    OPJ_UINT32 l_current_part;
4453
52.1k
    OPJ_UINT32 l_tile_x, l_tile_y;
4454
4455
    /* preconditions */
4456
4457
52.1k
    assert(p_j2k != 00);
4458
52.1k
    assert(p_manager != 00);
4459
4460
52.1k
    if (! opj_j2k_get_sot_values(p_header_data, p_header_size,
4461
52.1k
                                 &(p_j2k->m_current_tile_number), &l_tot_len, &l_current_part, &l_num_parts,
4462
52.1k
                                 p_manager)) {
4463
51
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4464
51
        return OPJ_FALSE;
4465
51
    }
4466
#ifdef DEBUG_VERBOSE
4467
    fprintf(stderr, "SOT %d %d %d %d\n",
4468
            p_j2k->m_current_tile_number, l_tot_len, l_current_part, l_num_parts);
4469
#endif
4470
4471
52.0k
    l_cp = &(p_j2k->m_cp);
4472
4473
    /* testcase 2.pdf.SIGFPE.706.1112 */
4474
52.0k
    if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
4475
130
        opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n",
4476
130
                      p_j2k->m_current_tile_number);
4477
130
        return OPJ_FALSE;
4478
130
    }
4479
4480
51.9k
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
4481
51.9k
    l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
4482
51.9k
    l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
4483
4484
51.9k
    if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec < 0 ||
4485
0
            p_j2k->m_current_tile_number == (OPJ_UINT32)
4486
51.9k
            p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec) {
4487
        /* Do only this check if we decode all tile part headers, or if */
4488
        /* we decode one precise tile. Otherwise the m_current_tile_part_number */
4489
        /* might not be valid */
4490
        /* Fixes issue with id_000020,sig_06,src_001958,op_flip4,pos_149 */
4491
        /* of https://github.com/uclouvain/openjpeg/issues/939 */
4492
        /* We must avoid reading twice the same tile part number for a given tile */
4493
        /* so as to avoid various issues, like opj_j2k_merge_ppt being called */
4494
        /* several times. */
4495
        /* ISO 15444-1 A.4.2 Start of tile-part (SOT) mandates that tile parts */
4496
        /* should appear in increasing order. */
4497
51.9k
        if (l_tcp->m_current_tile_part_number + 1 != (OPJ_INT32)l_current_part) {
4498
214
            opj_event_msg(p_manager, EVT_ERROR,
4499
214
                          "Invalid tile part index for tile number %d. "
4500
214
                          "Got %d, expected %d\n",
4501
214
                          p_j2k->m_current_tile_number,
4502
214
                          l_current_part,
4503
214
                          l_tcp->m_current_tile_part_number + 1);
4504
214
            return OPJ_FALSE;
4505
214
        }
4506
51.9k
    }
4507
4508
51.7k
    l_tcp->m_current_tile_part_number = (OPJ_INT32) l_current_part;
4509
4510
#ifdef USE_JPWL
4511
    if (l_cp->correct) {
4512
4513
        OPJ_UINT32 tileno = p_j2k->m_current_tile_number;
4514
        static OPJ_UINT32 backup_tileno = 0;
4515
4516
        /* tileno is negative or larger than the number of tiles!!! */
4517
        if (tileno > (l_cp->tw * l_cp->th)) {
4518
            opj_event_msg(p_manager, EVT_ERROR,
4519
                          "JPWL: bad tile number (%d out of a maximum of %d)\n",
4520
                          tileno, (l_cp->tw * l_cp->th));
4521
            if (!JPWL_ASSUME) {
4522
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4523
                return OPJ_FALSE;
4524
            }
4525
            /* we try to correct */
4526
            tileno = backup_tileno;
4527
            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
4528
                          "- setting tile number to %d\n",
4529
                          tileno);
4530
        }
4531
4532
        /* keep your private count of tiles */
4533
        backup_tileno++;
4534
    };
4535
#endif /* USE_JPWL */
4536
4537
    /* look for the tile in the list of already processed tile (in parts). */
4538
    /* Optimization possible here with a more complex data structure and with the removing of tiles */
4539
    /* since the time taken by this function can only grow at the time */
4540
4541
    /* PSot should be equal to zero or >=14 or <= 2^32-1 */
4542
51.7k
    if ((l_tot_len != 0) && (l_tot_len < 14)) {
4543
70
        if (l_tot_len ==
4544
70
                12) { /* MSD: Special case for the PHR data which are read by kakadu*/
4545
56
            opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n",
4546
56
                          l_tot_len);
4547
56
        } else {
4548
14
            opj_event_msg(p_manager, EVT_ERROR,
4549
14
                          "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
4550
14
            return OPJ_FALSE;
4551
14
        }
4552
70
    }
4553
4554
#ifdef USE_JPWL
4555
    if (l_cp->correct) {
4556
4557
        /* totlen is negative or larger than the bytes left!!! */
4558
        if (/*(l_tot_len < 0) ||*/ (l_tot_len >
4559
                                    p_header_size)) {   /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */
4560
            opj_event_msg(p_manager, EVT_ERROR,
4561
                          "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
4562
                          l_tot_len,
4563
                          p_header_size);  /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */
4564
            if (!JPWL_ASSUME) {
4565
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4566
                return OPJ_FALSE;
4567
            }
4568
            /* we try to correct */
4569
            l_tot_len = 0;
4570
            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
4571
                          "- setting Psot to %d => assuming it is the last tile\n",
4572
                          l_tot_len);
4573
        }
4574
    };
4575
#endif /* USE_JPWL */
4576
4577
    /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/
4578
51.7k
    if (!l_tot_len) {
4579
35.3k
        opj_event_msg(p_manager, EVT_INFO,
4580
35.3k
                      "Psot value of the current tile-part is equal to zero, "
4581
35.3k
                      "we assuming it is the last tile-part of the codestream.\n");
4582
35.3k
        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4583
35.3k
    }
4584
4585
51.7k
    if (l_tcp->m_nb_tile_parts != 0 && l_current_part >= l_tcp->m_nb_tile_parts) {
4586
        /* Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2851 */
4587
6
        opj_event_msg(p_manager, EVT_ERROR,
4588
6
                      "In SOT marker, TPSot (%d) is not valid regards to the previous "
4589
6
                      "number of tile-part (%d), giving up\n", l_current_part,
4590
6
                      l_tcp->m_nb_tile_parts);
4591
6
        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4592
6
        return OPJ_FALSE;
4593
6
    }
4594
4595
51.7k
    if (l_num_parts !=
4596
51.7k
            0) { /* Number of tile-part header is provided by this tile-part header */
4597
50.9k
        l_num_parts += p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction;
4598
        /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of
4599
         * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */
4600
50.9k
        if (l_tcp->m_nb_tile_parts) {
4601
844
            if (l_current_part >= l_tcp->m_nb_tile_parts) {
4602
0
                opj_event_msg(p_manager, EVT_ERROR,
4603
0
                              "In SOT marker, TPSot (%d) is not valid regards to the current "
4604
0
                              "number of tile-part (%d), giving up\n", l_current_part,
4605
0
                              l_tcp->m_nb_tile_parts);
4606
0
                p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4607
0
                return OPJ_FALSE;
4608
0
            }
4609
844
        }
4610
50.9k
        if (l_current_part >= l_num_parts) {
4611
            /* testcase 451.pdf.SIGSEGV.ce9.3723 */
4612
5
            opj_event_msg(p_manager, EVT_ERROR,
4613
5
                          "In SOT marker, TPSot (%d) is not valid regards to the current "
4614
5
                          "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts);
4615
5
            p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4616
5
            return OPJ_FALSE;
4617
5
        }
4618
50.9k
        l_tcp->m_nb_tile_parts = l_num_parts;
4619
50.9k
    }
4620
4621
    /* If know the number of tile part header we will check if we didn't read the last*/
4622
51.7k
    if (l_tcp->m_nb_tile_parts) {
4623
50.9k
        if (l_tcp->m_nb_tile_parts == (l_current_part + 1)) {
4624
13.4k
            p_j2k->m_specific_param.m_decoder.m_can_decode =
4625
13.4k
                1; /* Process the last tile-part header*/
4626
13.4k
        }
4627
50.9k
    }
4628
4629
51.7k
    if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4630
        /* Keep the size of data to skip after this marker */
4631
16.3k
        p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len -
4632
16.3k
                12; /* SOT_marker_size = 12 */
4633
35.3k
    } else {
4634
        /* FIXME: need to be computed from the number of bytes remaining in the codestream */
4635
35.3k
        p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
4636
35.3k
    }
4637
4638
51.7k
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;
4639
4640
    /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/
4641
51.7k
    if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
4642
51.7k
        p_j2k->m_specific_param.m_decoder.m_skip_data =
4643
51.7k
            (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
4644
51.7k
            || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
4645
50.4k
            || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
4646
50.4k
            || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
4647
51.7k
    } else {
4648
0
        assert(p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0);
4649
0
        p_j2k->m_specific_param.m_decoder.m_skip_data =
4650
0
            (p_j2k->m_current_tile_number != (OPJ_UINT32)
4651
0
             p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);
4652
0
    }
4653
4654
    /* Index */
4655
51.7k
    {
4656
51.7k
        assert(p_j2k->cstr_index->tile_index != 00);
4657
51.7k
        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno =
4658
51.7k
            p_j2k->m_current_tile_number;
4659
51.7k
        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno =
4660
51.7k
            l_current_part;
4661
4662
51.7k
        if (!p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid &&
4663
493
                l_num_parts >
4664
493
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps) {
4665
226
            opj_event_msg(p_manager, EVT_WARNING,
4666
226
                          "SOT marker for tile %u declares more tile-parts than found in TLM marker.",
4667
226
                          p_j2k->m_current_tile_number);
4668
226
            p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid = OPJ_TRUE;
4669
226
        }
4670
4671
51.7k
        if (!p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid) {
4672
            /* do nothing */
4673
51.4k
        } else if (l_num_parts != 0) {
4674
4675
50.7k
            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps =
4676
50.7k
                l_num_parts;
4677
50.7k
            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
4678
50.7k
                l_num_parts;
4679
4680
50.7k
            if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4681
49.5k
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4682
49.5k
                    (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
4683
49.5k
                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4684
0
                    opj_event_msg(p_manager, EVT_ERROR,
4685
0
                                  "Not enough memory to read SOT marker. Tile index allocation failed\n");
4686
0
                    return OPJ_FALSE;
4687
0
                }
4688
49.5k
            } else {
4689
1.14k
                opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
4690
1.14k
                                                   p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4691
1.14k
                                                   l_num_parts * sizeof(opj_tp_index_t));
4692
1.14k
                if (! new_tp_index) {
4693
0
                    opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
4694
0
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
4695
0
                    opj_event_msg(p_manager, EVT_ERROR,
4696
0
                                  "Not enough memory to read SOT marker. Tile index allocation failed\n");
4697
0
                    return OPJ_FALSE;
4698
0
                }
4699
1.14k
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4700
1.14k
                    new_tp_index;
4701
1.14k
            }
4702
50.7k
        } else {
4703
734
            /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
4704
4705
734
                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4706
696
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
4707
696
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4708
696
                        (opj_tp_index_t*)opj_calloc(
4709
696
                            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
4710
696
                            sizeof(opj_tp_index_t));
4711
696
                    if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4712
0
                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
4713
0
                        opj_event_msg(p_manager, EVT_ERROR,
4714
0
                                      "Not enough memory to read SOT marker. Tile index allocation failed\n");
4715
0
                        return OPJ_FALSE;
4716
0
                    }
4717
696
                }
4718
4719
734
                if (l_current_part >=
4720
734
                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps) {
4721
0
                    opj_tp_index_t *new_tp_index;
4722
0
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
4723
0
                        l_current_part + 1;
4724
0
                    new_tp_index = (opj_tp_index_t *) opj_realloc(
4725
0
                                       p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4726
0
                                       p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps *
4727
0
                                       sizeof(opj_tp_index_t));
4728
0
                    if (! new_tp_index) {
4729
0
                        opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
4730
0
                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
4731
0
                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
4732
0
                        opj_event_msg(p_manager, EVT_ERROR,
4733
0
                                      "Not enough memory to read SOT marker. Tile index allocation failed\n");
4734
0
                        return OPJ_FALSE;
4735
0
                    }
4736
0
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4737
0
                        new_tp_index;
4738
0
                }
4739
734
            }
4740
4741
734
        }
4742
4743
51.7k
    }
4744
4745
51.7k
    return OPJ_TRUE;
4746
51.7k
}
4747
4748
/**
4749
 * Write one or more PLT markers in the provided buffer
4750
 */
4751
static OPJ_BOOL opj_j2k_write_plt_in_memory(opj_j2k_t *p_j2k,
4752
        opj_tcd_marker_info_t* marker_info,
4753
        OPJ_BYTE * p_data,
4754
        OPJ_UINT32 * p_data_written,
4755
        opj_event_mgr_t * p_manager)
4756
0
{
4757
0
    OPJ_BYTE Zplt = 0;
4758
0
    OPJ_UINT16 Lplt;
4759
0
    OPJ_BYTE* p_data_start = p_data;
4760
0
    OPJ_BYTE* p_data_Lplt = p_data + 2;
4761
0
    OPJ_UINT32 i;
4762
4763
0
    OPJ_UNUSED(p_j2k);
4764
4765
0
    opj_write_bytes(p_data, J2K_MS_PLT, 2);
4766
0
    p_data += 2;
4767
4768
    /* Reserve space for Lplt */
4769
0
    p_data += 2;
4770
4771
0
    opj_write_bytes(p_data, Zplt, 1);
4772
0
    p_data += 1;
4773
4774
0
    Lplt = 3;
4775
4776
0
    for (i = 0; i < marker_info->packet_count; i++) {
4777
0
        OPJ_BYTE var_bytes[5];
4778
0
        OPJ_UINT8 var_bytes_size = 0;
4779
0
        OPJ_UINT32 packet_size = marker_info->p_packet_size[i];
4780
4781
        /* Packet size written in variable-length way, starting with LSB */
4782
0
        var_bytes[var_bytes_size] = (OPJ_BYTE)(packet_size & 0x7f);
4783
0
        var_bytes_size ++;
4784
0
        packet_size >>= 7;
4785
0
        while (packet_size > 0) {
4786
0
            var_bytes[var_bytes_size] = (OPJ_BYTE)((packet_size & 0x7f) | 0x80);
4787
0
            var_bytes_size ++;
4788
0
            packet_size >>= 7;
4789
0
        }
4790
4791
        /* Check if that can fit in the current PLT marker. If not, finish */
4792
        /* current one, and start a new one */
4793
0
        if (Lplt + var_bytes_size > 65535) {
4794
0
            if (Zplt == 255) {
4795
0
                opj_event_msg(p_manager, EVT_ERROR,
4796
0
                              "More than 255 PLT markers would be needed for current tile-part !\n");
4797
0
                return OPJ_FALSE;
4798
0
            }
4799
4800
            /* Patch Lplt */
4801
0
            opj_write_bytes(p_data_Lplt, Lplt, 2);
4802
4803
            /* Start new segment */
4804
0
            opj_write_bytes(p_data, J2K_MS_PLT, 2);
4805
0
            p_data += 2;
4806
4807
            /* Reserve space for Lplt */
4808
0
            p_data_Lplt = p_data;
4809
0
            p_data += 2;
4810
4811
0
            Zplt ++;
4812
0
            opj_write_bytes(p_data, Zplt, 1);
4813
0
            p_data += 1;
4814
4815
0
            Lplt = 3;
4816
0
        }
4817
4818
0
        Lplt = (OPJ_UINT16)(Lplt + var_bytes_size);
4819
4820
        /* Serialize variable-length packet size, starting with MSB */
4821
0
        for (; var_bytes_size > 0; --var_bytes_size) {
4822
0
            opj_write_bytes(p_data, var_bytes[var_bytes_size - 1], 1);
4823
0
            p_data += 1;
4824
0
        }
4825
0
    }
4826
4827
0
    *p_data_written = (OPJ_UINT32)(p_data - p_data_start);
4828
4829
    /* Patch Lplt */
4830
0
    opj_write_bytes(p_data_Lplt, Lplt, 2);
4831
4832
0
    return OPJ_TRUE;
4833
0
}
4834
4835
static OPJ_BOOL opj_j2k_write_sod(opj_j2k_t *p_j2k,
4836
                                  opj_tcd_t * p_tile_coder,
4837
                                  OPJ_BYTE * p_data,
4838
                                  OPJ_UINT32 * p_data_written,
4839
                                  OPJ_UINT32 total_data_size,
4840
                                  const opj_stream_private_t *p_stream,
4841
                                  opj_event_mgr_t * p_manager
4842
                                 )
4843
10.9k
{
4844
10.9k
    opj_codestream_info_t *l_cstr_info = 00;
4845
10.9k
    OPJ_UINT32 l_remaining_data;
4846
10.9k
    opj_tcd_marker_info_t* marker_info = NULL;
4847
4848
    /* preconditions */
4849
10.9k
    assert(p_j2k != 00);
4850
10.9k
    assert(p_manager != 00);
4851
10.9k
    assert(p_stream != 00);
4852
4853
10.9k
    OPJ_UNUSED(p_stream);
4854
4855
10.9k
    if (total_data_size < 4) {
4856
0
        opj_event_msg(p_manager, EVT_ERROR,
4857
0
                      "Not enough bytes in output buffer to write SOD marker\n");
4858
0
        return OPJ_FALSE;
4859
0
    }
4860
4861
10.9k
    opj_write_bytes(p_data, J2K_MS_SOD,
4862
10.9k
                    2);                                 /* SOD */
4863
4864
    /* make room for the EOF marker */
4865
10.9k
    l_remaining_data =  total_data_size - 4;
4866
4867
    /* update tile coder */
4868
10.9k
    p_tile_coder->tp_num =
4869
10.9k
        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
4870
10.9k
    p_tile_coder->cur_tp_num =
4871
10.9k
        p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
4872
4873
    /* INDEX >> */
4874
    /* TODO mergeV2: check this part which use cstr_info */
4875
    /*l_cstr_info = p_j2k->cstr_info;
4876
    if (l_cstr_info) {
4877
            if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {
4878
                    //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
4879
                    l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
4880
            }
4881
            else {*/
4882
    /*
4883
    TODO
4884
    if
4885
            (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
4886
    {
4887
            cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
4888
    }*/
4889
    /*}*/
4890
    /* UniPG>> */
4891
#ifdef USE_JPWL
4892
    /* update markers struct */
4893
    /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
4894
    */
4895
    assert(0 && "TODO");
4896
#endif /* USE_JPWL */
4897
    /* <<UniPG */
4898
    /*}*/
4899
    /* << INDEX */
4900
4901
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
4902
10.9k
        p_tile_coder->tcd_image->tiles->packno = 0;
4903
#ifdef deadcode
4904
        if (l_cstr_info) {
4905
            l_cstr_info->packno = 0;
4906
        }
4907
#endif
4908
10.9k
    }
4909
4910
10.9k
    *p_data_written = 0;
4911
4912
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_PLT) {
4913
0
        marker_info = opj_tcd_marker_info_create(
4914
0
                          p_j2k->m_specific_param.m_encoder.m_PLT);
4915
0
        if (marker_info == NULL) {
4916
0
            opj_event_msg(p_manager, EVT_ERROR,
4917
0
                          "Cannot encode tile: opj_tcd_marker_info_create() failed\n");
4918
0
            return OPJ_FALSE;
4919
0
        }
4920
0
    }
4921
4922
10.9k
    if (l_remaining_data <
4923
10.9k
            p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT) {
4924
0
        opj_event_msg(p_manager, EVT_ERROR,
4925
0
                      "Not enough bytes in output buffer to write SOD marker\n");
4926
0
        opj_tcd_marker_info_destroy(marker_info);
4927
0
        return OPJ_FALSE;
4928
0
    }
4929
10.9k
    l_remaining_data -= p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT;
4930
4931
10.9k
    if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number,
4932
10.9k
                              p_data + 2,
4933
10.9k
                              p_data_written, l_remaining_data, l_cstr_info,
4934
10.9k
                              marker_info,
4935
10.9k
                              p_manager)) {
4936
67
        opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
4937
67
        opj_tcd_marker_info_destroy(marker_info);
4938
67
        return OPJ_FALSE;
4939
67
    }
4940
4941
    /* For SOD */
4942
10.9k
    *p_data_written += 2;
4943
4944
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_PLT) {
4945
0
        OPJ_UINT32 l_data_written_PLT = 0;
4946
0
        OPJ_BYTE* p_PLT_buffer = (OPJ_BYTE*)opj_malloc(
4947
0
                                     p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT);
4948
0
        if (!p_PLT_buffer) {
4949
0
            opj_event_msg(p_manager, EVT_ERROR, "Cannot allocate memory\n");
4950
0
            opj_tcd_marker_info_destroy(marker_info);
4951
0
            return OPJ_FALSE;
4952
0
        }
4953
0
        if (!opj_j2k_write_plt_in_memory(p_j2k,
4954
0
                                         marker_info,
4955
0
                                         p_PLT_buffer,
4956
0
                                         &l_data_written_PLT,
4957
0
                                         p_manager)) {
4958
0
            opj_tcd_marker_info_destroy(marker_info);
4959
0
            opj_free(p_PLT_buffer);
4960
0
            return OPJ_FALSE;
4961
0
        }
4962
4963
0
        assert(l_data_written_PLT <=
4964
0
               p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT);
4965
4966
        /* Move PLT marker(s) before SOD */
4967
0
        memmove(p_data + l_data_written_PLT, p_data, *p_data_written);
4968
0
        memcpy(p_data, p_PLT_buffer, l_data_written_PLT);
4969
0
        opj_free(p_PLT_buffer);
4970
0
        *p_data_written += l_data_written_PLT;
4971
0
    }
4972
4973
10.9k
    opj_tcd_marker_info_destroy(marker_info);
4974
4975
10.9k
    return OPJ_TRUE;
4976
10.9k
}
4977
4978
static OPJ_BOOL opj_j2k_read_sod(opj_j2k_t *p_j2k,
4979
                                 opj_stream_private_t *p_stream,
4980
                                 opj_event_mgr_t * p_manager
4981
                                )
4982
64.1k
{
4983
64.1k
    OPJ_SIZE_T l_current_read_size;
4984
64.1k
    opj_codestream_index_t * l_cstr_index = 00;
4985
64.1k
    OPJ_BYTE ** l_current_data = 00;
4986
64.1k
    opj_tcp_t * l_tcp = 00;
4987
64.1k
    OPJ_UINT32 * l_tile_len = 00;
4988
64.1k
    OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
4989
4990
    /* preconditions */
4991
64.1k
    assert(p_j2k != 00);
4992
64.1k
    assert(p_manager != 00);
4993
64.1k
    assert(p_stream != 00);
4994
4995
64.1k
    l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4996
4997
64.1k
    if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4998
        /* opj_stream_get_number_byte_left returns OPJ_OFF_T
4999
        // but we are in the last tile part,
5000
        // so its result will fit on OPJ_UINT32 unless we find
5001
        // a file with a single tile part of more than 4 GB...*/
5002
34.7k
        p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(
5003
34.7k
                    opj_stream_get_number_byte_left(p_stream) - 2);
5004
34.7k
    } else {
5005
        /* Check to avoid pass the limit of OPJ_UINT32 */
5006
29.3k
        if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2) {
5007
14.0k
            p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
5008
15.3k
        } else {
5009
            /* MSD: case commented to support empty SOT marker (PHR data) */
5010
15.3k
        }
5011
29.3k
    }
5012
5013
64.1k
    l_current_data = &(l_tcp->m_data);
5014
64.1k
    l_tile_len = &l_tcp->m_data_size;
5015
5016
    /* Patch to support new PHR data */
5017
64.1k
    if (p_j2k->m_specific_param.m_decoder.m_sot_length) {
5018
        /* If we are here, we'll try to read the data after allocation */
5019
        /* Check enough bytes left in stream before allocation */
5020
48.7k
        if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length >
5021
48.7k
                opj_stream_get_number_byte_left(p_stream)) {
5022
312
            if (p_j2k->m_cp.strict) {
5023
312
                opj_event_msg(p_manager, EVT_ERROR,
5024
312
                              "Tile part length size inconsistent with stream length\n");
5025
312
                return OPJ_FALSE;
5026
312
            } else {
5027
0
                opj_event_msg(p_manager, EVT_WARNING,
5028
0
                              "Tile part length size inconsistent with stream length\n");
5029
0
            }
5030
312
        }
5031
48.4k
        if (p_j2k->m_specific_param.m_decoder.m_sot_length >
5032
48.4k
                UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA) {
5033
0
            opj_event_msg(p_manager, EVT_ERROR,
5034
0
                          "p_j2k->m_specific_param.m_decoder.m_sot_length > "
5035
0
                          "UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA");
5036
0
            return OPJ_FALSE;
5037
0
        }
5038
        /* Add a margin of OPJ_COMMON_CBLK_DATA_EXTRA to the allocation we */
5039
        /* do so that opj_mqc_init_dec_common() can safely add a synthetic */
5040
        /* 0xFFFF marker. */
5041
48.4k
        if (! *l_current_data) {
5042
            /* LH: oddly enough, in this path, l_tile_len!=0.
5043
             * TODO: If this was consistent, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).
5044
             */
5045
47.3k
            *l_current_data = (OPJ_BYTE*) opj_malloc(
5046
47.3k
                                  p_j2k->m_specific_param.m_decoder.m_sot_length + OPJ_COMMON_CBLK_DATA_EXTRA);
5047
47.3k
        } else {
5048
1.05k
            OPJ_BYTE *l_new_current_data;
5049
1.05k
            if (*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA -
5050
1.05k
                    p_j2k->m_specific_param.m_decoder.m_sot_length) {
5051
0
                opj_event_msg(p_manager, EVT_ERROR,
5052
0
                              "*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA - "
5053
0
                              "p_j2k->m_specific_param.m_decoder.m_sot_length");
5054
0
                return OPJ_FALSE;
5055
0
            }
5056
5057
1.05k
            l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data,
5058
1.05k
                                 *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length +
5059
1.05k
                                 OPJ_COMMON_CBLK_DATA_EXTRA);
5060
1.05k
            if (! l_new_current_data) {
5061
0
                opj_free(*l_current_data);
5062
                /*nothing more is done as l_current_data will be set to null, and just
5063
                  afterward we enter in the error path
5064
                  and the actual tile_len is updated (committed) at the end of the
5065
                  function. */
5066
0
            }
5067
1.05k
            *l_current_data = l_new_current_data;
5068
1.05k
        }
5069
5070
48.4k
        if (*l_current_data == 00) {
5071
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n");
5072
0
            return OPJ_FALSE;
5073
0
        }
5074
48.4k
    } else {
5075
15.3k
        l_sot_length_pb_detected = OPJ_TRUE;
5076
15.3k
    }
5077
5078
    /* Index */
5079
63.8k
    l_cstr_index = p_j2k->cstr_index;
5080
63.8k
    {
5081
63.8k
        OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
5082
5083
63.8k
        OPJ_UINT32 l_current_tile_part =
5084
63.8k
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
5085
63.8k
        if (l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index &&
5086
63.8k
                l_current_tile_part <
5087
63.8k
                l_cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps) {
5088
63.0k
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header
5089
63.0k
                = l_current_pos;
5090
63.0k
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos
5091
63.0k
                = l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
5092
63.0k
        }
5093
5094
63.8k
        if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
5095
63.8k
                                              l_cstr_index,
5096
63.8k
                                              J2K_MS_SOD,
5097
63.8k
                                              l_current_pos,
5098
63.8k
                                              p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {
5099
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
5100
0
            return OPJ_FALSE;
5101
0
        }
5102
5103
        /*l_cstr_index->packno = 0;*/
5104
63.8k
    }
5105
5106
    /* Patch to support new PHR data */
5107
63.8k
    if (!l_sot_length_pb_detected) {
5108
48.4k
        l_current_read_size = opj_stream_read_data(
5109
48.4k
                                  p_stream,
5110
48.4k
                                  *l_current_data + *l_tile_len,
5111
48.4k
                                  p_j2k->m_specific_param.m_decoder.m_sot_length,
5112
48.4k
                                  p_manager);
5113
48.4k
    } else {
5114
15.3k
        l_current_read_size = 0;
5115
15.3k
    }
5116
5117
63.8k
    if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {
5118
0
        if (l_current_read_size == (OPJ_SIZE_T)(-1)) {
5119
            /* Avoid issue of https://github.com/uclouvain/openjpeg/issues/1533 */
5120
0
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
5121
0
            return OPJ_FALSE;
5122
0
        }
5123
0
        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
5124
63.8k
    } else {
5125
63.8k
        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
5126
63.8k
    }
5127
5128
63.8k
    *l_tile_len += (OPJ_UINT32)l_current_read_size;
5129
5130
63.8k
    return OPJ_TRUE;
5131
63.8k
}
5132
5133
static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
5134
                                  OPJ_UINT32 p_tile_no,
5135
                                  OPJ_UINT32 p_comp_no,
5136
                                  OPJ_UINT32 nb_comps,
5137
                                  opj_stream_private_t *p_stream,
5138
                                  opj_event_mgr_t * p_manager
5139
                                 )
5140
0
{
5141
0
    OPJ_BYTE * l_current_data = 00;
5142
0
    OPJ_UINT32 l_rgn_size;
5143
0
    opj_cp_t *l_cp = 00;
5144
0
    opj_tcp_t *l_tcp = 00;
5145
0
    opj_tccp_t *l_tccp = 00;
5146
0
    OPJ_UINT32 l_comp_room;
5147
5148
    /* preconditions */
5149
0
    assert(p_j2k != 00);
5150
0
    assert(p_manager != 00);
5151
0
    assert(p_stream != 00);
5152
5153
0
    l_cp = &(p_j2k->m_cp);
5154
0
    l_tcp = &l_cp->tcps[p_tile_no];
5155
0
    l_tccp = &l_tcp->tccps[p_comp_no];
5156
5157
0
    if (nb_comps <= 256) {
5158
0
        l_comp_room = 1;
5159
0
    } else {
5160
0
        l_comp_room = 2;
5161
0
    }
5162
5163
0
    l_rgn_size = 6 + l_comp_room;
5164
5165
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5166
5167
0
    opj_write_bytes(l_current_data, J2K_MS_RGN,
5168
0
                    2);                                   /* RGN  */
5169
0
    l_current_data += 2;
5170
5171
0
    opj_write_bytes(l_current_data, l_rgn_size - 2,
5172
0
                    2);                                 /* Lrgn */
5173
0
    l_current_data += 2;
5174
5175
0
    opj_write_bytes(l_current_data, p_comp_no,
5176
0
                    l_comp_room);                          /* Crgn */
5177
0
    l_current_data += l_comp_room;
5178
5179
0
    opj_write_bytes(l_current_data, 0,
5180
0
                    1);                                           /* Srgn */
5181
0
    ++l_current_data;
5182
5183
0
    opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,
5184
0
                    1);                            /* SPrgn */
5185
0
    ++l_current_data;
5186
5187
0
    if (opj_stream_write_data(p_stream,
5188
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_rgn_size,
5189
0
                              p_manager) != l_rgn_size) {
5190
0
        return OPJ_FALSE;
5191
0
    }
5192
5193
0
    return OPJ_TRUE;
5194
0
}
5195
5196
static OPJ_BOOL opj_j2k_write_eoc(opj_j2k_t *p_j2k,
5197
                                  opj_stream_private_t *p_stream,
5198
                                  opj_event_mgr_t * p_manager
5199
                                 )
5200
10.9k
{
5201
    /* preconditions */
5202
10.9k
    assert(p_j2k != 00);
5203
10.9k
    assert(p_manager != 00);
5204
10.9k
    assert(p_stream != 00);
5205
5206
10.9k
    opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,
5207
10.9k
                    J2K_MS_EOC, 2);                                    /* EOC */
5208
5209
    /* UniPG>> */
5210
#ifdef USE_JPWL
5211
    /* update markers struct */
5212
    /*
5213
    OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
5214
    */
5215
#endif /* USE_JPWL */
5216
5217
10.9k
    if (opj_stream_write_data(p_stream,
5218
10.9k
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, 2, p_manager) != 2) {
5219
0
        return OPJ_FALSE;
5220
0
    }
5221
5222
10.9k
    if (! opj_stream_flush(p_stream, p_manager)) {
5223
0
        return OPJ_FALSE;
5224
0
    }
5225
5226
10.9k
    return OPJ_TRUE;
5227
10.9k
}
5228
5229
/**
5230
 * Reads a RGN marker (Region Of Interest)
5231
 *
5232
 * @param       p_header_data   the data contained in the POC box.
5233
 * @param       p_j2k                   the jpeg2000 codec.
5234
 * @param       p_header_size   the size of the data contained in the POC marker.
5235
 * @param       p_manager               the user event manager.
5236
*/
5237
static OPJ_BOOL opj_j2k_read_rgn(opj_j2k_t *p_j2k,
5238
                                 OPJ_BYTE * p_header_data,
5239
                                 OPJ_UINT32 p_header_size,
5240
                                 opj_event_mgr_t * p_manager
5241
                                )
5242
3.17k
{
5243
3.17k
    OPJ_UINT32 l_nb_comp;
5244
3.17k
    opj_image_t * l_image = 00;
5245
5246
3.17k
    opj_cp_t *l_cp = 00;
5247
3.17k
    opj_tcp_t *l_tcp = 00;
5248
3.17k
    OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
5249
5250
    /* preconditions*/
5251
3.17k
    assert(p_header_data != 00);
5252
3.17k
    assert(p_j2k != 00);
5253
3.17k
    assert(p_manager != 00);
5254
5255
3.17k
    l_image = p_j2k->m_private_image;
5256
3.17k
    l_nb_comp = l_image->numcomps;
5257
5258
3.17k
    if (l_nb_comp <= 256) {
5259
1.51k
        l_comp_room = 1;
5260
1.65k
    } else {
5261
1.65k
        l_comp_room = 2;
5262
1.65k
    }
5263
5264
3.17k
    if (p_header_size != 2 + l_comp_room) {
5265
13
        opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
5266
13
        return OPJ_FALSE;
5267
13
    }
5268
5269
3.15k
    l_cp = &(p_j2k->m_cp);
5270
3.15k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
5271
212
            &l_cp->tcps[p_j2k->m_current_tile_number] :
5272
3.15k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
5273
5274
3.15k
    opj_read_bytes(p_header_data, &l_comp_no, l_comp_room);         /* Crgn */
5275
3.15k
    p_header_data += l_comp_room;
5276
3.15k
    opj_read_bytes(p_header_data, &l_roi_sty,
5277
3.15k
                   1);                                     /* Srgn */
5278
3.15k
    ++p_header_data;
5279
5280
#ifdef USE_JPWL
5281
    if (l_cp->correct) {
5282
        /* totlen is negative or larger than the bytes left!!! */
5283
        if (l_comp_room >= l_nb_comp) {
5284
            opj_event_msg(p_manager, EVT_ERROR,
5285
                          "JPWL: bad component number in RGN (%d when there are only %d)\n",
5286
                          l_comp_room, l_nb_comp);
5287
            if (!JPWL_ASSUME) {
5288
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
5289
                return OPJ_FALSE;
5290
            }
5291
        }
5292
    };
5293
#endif /* USE_JPWL */
5294
5295
    /* testcase 3635.pdf.asan.77.2930 */
5296
3.15k
    if (l_comp_no >= l_nb_comp) {
5297
30
        opj_event_msg(p_manager, EVT_ERROR,
5298
30
                      "bad component number in RGN (%d when there are only %d)\n",
5299
30
                      l_comp_no, l_nb_comp);
5300
30
        return OPJ_FALSE;
5301
30
    }
5302
5303
3.12k
    opj_read_bytes(p_header_data,
5304
3.12k
                   (OPJ_UINT32 *)(&(l_tcp->tccps[l_comp_no].roishift)), 1);  /* SPrgn */
5305
3.12k
    ++p_header_data;
5306
5307
3.12k
    return OPJ_TRUE;
5308
5309
3.15k
}
5310
5311
static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp)
5312
1.05k
{
5313
1.05k
    return (OPJ_FLOAT32)((p_tcp->m_nb_tile_parts - 1) * 14);
5314
1.05k
}
5315
5316
static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp)
5317
9.94k
{
5318
9.94k
    (void)p_tcp;
5319
9.94k
    return 0;
5320
9.94k
}
5321
5322
static OPJ_BOOL opj_j2k_update_rates(opj_j2k_t *p_j2k,
5323
                                     opj_stream_private_t *p_stream,
5324
                                     opj_event_mgr_t * p_manager)
5325
10.9k
{
5326
10.9k
    opj_cp_t * l_cp = 00;
5327
10.9k
    opj_image_t * l_image = 00;
5328
10.9k
    opj_tcp_t * l_tcp = 00;
5329
10.9k
    opj_image_comp_t * l_img_comp = 00;
5330
5331
10.9k
    OPJ_UINT32 i, j, k;
5332
10.9k
    OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
5333
10.9k
    OPJ_FLOAT32 * l_rates = 0;
5334
10.9k
    OPJ_FLOAT32 l_sot_remove;
5335
10.9k
    OPJ_UINT32 l_bits_empty, l_size_pixel;
5336
10.9k
    OPJ_UINT64 l_tile_size = 0;
5337
10.9k
    OPJ_UINT32 l_last_res;
5338
10.9k
    OPJ_FLOAT32(* l_tp_stride_func)(opj_tcp_t *) = 00;
5339
5340
    /* preconditions */
5341
10.9k
    assert(p_j2k != 00);
5342
10.9k
    assert(p_manager != 00);
5343
10.9k
    assert(p_stream != 00);
5344
5345
10.9k
    OPJ_UNUSED(p_manager);
5346
5347
10.9k
    l_cp = &(p_j2k->m_cp);
5348
10.9k
    l_image = p_j2k->m_private_image;
5349
10.9k
    l_tcp = l_cp->tcps;
5350
5351
10.9k
    l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
5352
10.9k
    l_size_pixel = l_image->numcomps * l_image->comps->prec;
5353
10.9k
    l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(
5354
10.9k
                       l_cp->th * l_cp->tw);
5355
5356
10.9k
    if (l_cp->m_specific_param.m_enc.m_tp_on) {
5357
1.05k
        l_tp_stride_func = opj_j2k_get_tp_stride;
5358
9.94k
    } else {
5359
9.94k
        l_tp_stride_func = opj_j2k_get_default_stride;
5360
9.94k
    }
5361
5362
21.9k
    for (i = 0; i < l_cp->th; ++i) {
5363
21.9k
        for (j = 0; j < l_cp->tw; ++j) {
5364
10.9k
            OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) /
5365
10.9k
                                   (OPJ_FLOAT32)l_tcp->numlayers;
5366
5367
            /* 4 borders of the tile rescale on the image if necessary */
5368
10.9k
            l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx),
5369
10.9k
                               (OPJ_INT32)l_image->x0);
5370
10.9k
            l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy),
5371
10.9k
                               (OPJ_INT32)l_image->y0);
5372
10.9k
            l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx),
5373
10.9k
                               (OPJ_INT32)l_image->x1);
5374
10.9k
            l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy),
5375
10.9k
                               (OPJ_INT32)l_image->y1);
5376
5377
10.9k
            l_rates = l_tcp->rates;
5378
5379
            /* Modification of the RATE >> */
5380
21.9k
            for (k = 0; k < l_tcp->numlayers; ++k) {
5381
10.9k
                if (*l_rates > 0.0f) {
5382
831
                    *l_rates = (OPJ_FLOAT32)(((OPJ_FLOAT64)l_size_pixel * (OPJ_UINT32)(
5383
831
                                                  l_x1 - l_x0) *
5384
831
                                              (OPJ_UINT32)(l_y1 - l_y0))
5385
831
                                             / ((*l_rates) * (OPJ_FLOAT32)l_bits_empty))
5386
831
                               -
5387
831
                               l_offset;
5388
831
                }
5389
5390
10.9k
                ++l_rates;
5391
10.9k
            }
5392
5393
10.9k
            ++l_tcp;
5394
5395
10.9k
        }
5396
10.9k
    }
5397
5398
10.9k
    l_tcp = l_cp->tcps;
5399
5400
21.9k
    for (i = 0; i < l_cp->th; ++i) {
5401
21.9k
        for (j = 0; j < l_cp->tw; ++j) {
5402
10.9k
            l_rates = l_tcp->rates;
5403
5404
10.9k
            if (*l_rates > 0.0f) {
5405
831
                *l_rates -= l_sot_remove;
5406
5407
831
                if (*l_rates < 30.0f) {
5408
0
                    *l_rates = 30.0f;
5409
0
                }
5410
831
            }
5411
5412
10.9k
            ++l_rates;
5413
5414
10.9k
            l_last_res = l_tcp->numlayers - 1;
5415
5416
10.9k
            for (k = 1; k < l_last_res; ++k) {
5417
5418
0
                if (*l_rates > 0.0f) {
5419
0
                    *l_rates -= l_sot_remove;
5420
5421
0
                    if (*l_rates < * (l_rates - 1) + 10.0f) {
5422
0
                        *l_rates  = (*(l_rates - 1)) + 20.0f;
5423
0
                    }
5424
0
                }
5425
5426
0
                ++l_rates;
5427
0
            }
5428
5429
10.9k
            if (*l_rates > 0.0f) {
5430
0
                *l_rates -= (l_sot_remove + 2.f);
5431
5432
0
                if (*l_rates < * (l_rates - 1) + 10.0f) {
5433
0
                    *l_rates  = (*(l_rates - 1)) + 20.0f;
5434
0
                }
5435
0
            }
5436
5437
10.9k
            ++l_tcp;
5438
10.9k
        }
5439
10.9k
    }
5440
5441
10.9k
    l_img_comp = l_image->comps;
5442
10.9k
    l_tile_size = 0;
5443
5444
23.5k
    for (i = 0; i < l_image->numcomps; ++i) {
5445
12.5k
        l_tile_size += (OPJ_UINT64)opj_uint_ceildiv(l_cp->tdx, l_img_comp->dx)
5446
12.5k
                       *
5447
12.5k
                       opj_uint_ceildiv(l_cp->tdy, l_img_comp->dy)
5448
12.5k
                       *
5449
12.5k
                       l_img_comp->prec;
5450
5451
12.5k
        ++l_img_comp;
5452
12.5k
    }
5453
5454
    /* TODO: where does this magic value come from ? */
5455
    /* This used to be 1.3 / 8, but with random data and very small code */
5456
    /* block sizes, this is not enough. For example with */
5457
    /* bin/test_tile_encoder 1 256 256 32 32 8 0 reversible_with_precinct.j2k 4 4 3 0 0 1 16 16 */
5458
    /* TODO revise this to take into account the overhead linked to the */
5459
    /* number of packets and number of code blocks in packets */
5460
10.9k
    l_tile_size = (OPJ_UINT64)((double)l_tile_size * 1.4 / 8);
5461
5462
    /* Arbitrary amount to make the following work: */
5463
    /* bin/test_tile_encoder 1 256 256 17 16 8 0 reversible_no_precinct.j2k 4 4 3 0 0 1 */
5464
10.9k
    l_tile_size += 500;
5465
5466
10.9k
    l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
5467
5468
10.9k
    if (l_tile_size > UINT_MAX) {
5469
0
        l_tile_size = UINT_MAX;
5470
0
    }
5471
5472
10.9k
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = (OPJ_UINT32)l_tile_size;
5473
10.9k
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
5474
10.9k
        (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
5475
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {
5476
0
        opj_event_msg(p_manager, EVT_ERROR,
5477
0
                      "Not enough memory to allocate m_encoded_tile_data. %u MB required\n",
5478
0
                      (OPJ_UINT32)(l_tile_size / 1024 / 1024));
5479
0
        return OPJ_FALSE;
5480
0
    }
5481
5482
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
5483
1.05k
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
5484
1.05k
            (OPJ_BYTE *) opj_malloc(6 *
5485
1.05k
                                    p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
5486
1.05k
        if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
5487
0
            return OPJ_FALSE;
5488
0
        }
5489
5490
1.05k
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
5491
1.05k
            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
5492
1.05k
    }
5493
5494
10.9k
    return OPJ_TRUE;
5495
10.9k
}
5496
5497
#if 0
5498
static OPJ_BOOL opj_j2k_read_eoc(opj_j2k_t *p_j2k,
5499
                                 opj_stream_private_t *p_stream,
5500
                                 opj_event_mgr_t * p_manager)
5501
{
5502
    OPJ_UINT32 i;
5503
    opj_tcd_t * l_tcd = 00;
5504
    OPJ_UINT32 l_nb_tiles;
5505
    opj_tcp_t * l_tcp = 00;
5506
    OPJ_BOOL l_success;
5507
5508
    /* preconditions */
5509
    assert(p_j2k != 00);
5510
    assert(p_manager != 00);
5511
    assert(p_stream != 00);
5512
5513
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
5514
    l_tcp = p_j2k->m_cp.tcps;
5515
5516
    l_tcd = opj_tcd_create(OPJ_TRUE);
5517
    if (l_tcd == 00) {
5518
        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
5519
        return OPJ_FALSE;
5520
    }
5521
5522
    for (i = 0; i < l_nb_tiles; ++i) {
5523
        if (l_tcp->m_data) {
5524
            if (! opj_tcd_init_decode_tile(l_tcd, i)) {
5525
                opj_tcd_destroy(l_tcd);
5526
                opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
5527
                return OPJ_FALSE;
5528
            }
5529
5530
            l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i,
5531
                                            p_j2k->cstr_index);
5532
            /* cleanup */
5533
5534
            if (! l_success) {
5535
                p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
5536
                break;
5537
            }
5538
        }
5539
5540
        opj_j2k_tcp_destroy(l_tcp);
5541
        ++l_tcp;
5542
    }
5543
5544
    opj_tcd_destroy(l_tcd);
5545
    return OPJ_TRUE;
5546
}
5547
#endif
5548
5549
static OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
5550
                                       struct opj_stream_private *p_stream,
5551
                                       struct opj_event_mgr * p_manager)
5552
0
{
5553
    /* preconditions */
5554
0
    assert(p_j2k != 00);
5555
0
    assert(p_manager != 00);
5556
0
    assert(p_stream != 00);
5557
5558
0
    OPJ_UNUSED(p_manager);
5559
5560
0
    p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
5561
5562
0
    return OPJ_TRUE;
5563
0
}
5564
5565
static OPJ_BOOL opj_j2k_write_mct_data_group(opj_j2k_t *p_j2k,
5566
        struct opj_stream_private *p_stream,
5567
        struct opj_event_mgr * p_manager)
5568
0
{
5569
0
    OPJ_UINT32 i;
5570
0
    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
5571
0
    opj_mct_data_t * l_mct_record;
5572
0
    opj_tcp_t * l_tcp;
5573
5574
    /* preconditions */
5575
0
    assert(p_j2k != 00);
5576
0
    assert(p_stream != 00);
5577
0
    assert(p_manager != 00);
5578
5579
0
    if (! opj_j2k_write_cbd(p_j2k, p_stream, p_manager)) {
5580
0
        return OPJ_FALSE;
5581
0
    }
5582
5583
0
    l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
5584
0
    l_mct_record = l_tcp->m_mct_records;
5585
5586
0
    for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
5587
5588
0
        if (! opj_j2k_write_mct_record(p_j2k, l_mct_record, p_stream, p_manager)) {
5589
0
            return OPJ_FALSE;
5590
0
        }
5591
5592
0
        ++l_mct_record;
5593
0
    }
5594
5595
0
    l_mcc_record = l_tcp->m_mcc_records;
5596
5597
0
    for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
5598
5599
0
        if (! opj_j2k_write_mcc_record(p_j2k, l_mcc_record, p_stream, p_manager)) {
5600
0
            return OPJ_FALSE;
5601
0
        }
5602
5603
0
        ++l_mcc_record;
5604
0
    }
5605
5606
0
    if (! opj_j2k_write_mco(p_j2k, p_stream, p_manager)) {
5607
0
        return OPJ_FALSE;
5608
0
    }
5609
5610
0
    return OPJ_TRUE;
5611
0
}
5612
5613
static OPJ_BOOL opj_j2k_write_all_coc(
5614
    opj_j2k_t *p_j2k,
5615
    struct opj_stream_private *p_stream,
5616
    struct opj_event_mgr * p_manager)
5617
10.9k
{
5618
10.9k
    OPJ_UINT32 compno;
5619
5620
    /* preconditions */
5621
10.9k
    assert(p_j2k != 00);
5622
10.9k
    assert(p_manager != 00);
5623
10.9k
    assert(p_stream != 00);
5624
5625
12.5k
    for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5626
        /* cod is first component of first tile */
5627
1.51k
        if (! opj_j2k_compare_coc(p_j2k, 0, compno)) {
5628
0
            if (! opj_j2k_write_coc(p_j2k, compno, p_stream, p_manager)) {
5629
0
                return OPJ_FALSE;
5630
0
            }
5631
0
        }
5632
1.51k
    }
5633
5634
10.9k
    return OPJ_TRUE;
5635
10.9k
}
5636
5637
static OPJ_BOOL opj_j2k_write_all_qcc(
5638
    opj_j2k_t *p_j2k,
5639
    struct opj_stream_private *p_stream,
5640
    struct opj_event_mgr * p_manager)
5641
10.9k
{
5642
10.9k
    OPJ_UINT32 compno;
5643
5644
    /* preconditions */
5645
10.9k
    assert(p_j2k != 00);
5646
10.9k
    assert(p_manager != 00);
5647
10.9k
    assert(p_stream != 00);
5648
5649
12.5k
    for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5650
        /* qcd is first component of first tile */
5651
1.51k
        if (! opj_j2k_compare_qcc(p_j2k, 0, compno)) {
5652
0
            if (! opj_j2k_write_qcc(p_j2k, compno, p_stream, p_manager)) {
5653
0
                return OPJ_FALSE;
5654
0
            }
5655
0
        }
5656
1.51k
    }
5657
10.9k
    return OPJ_TRUE;
5658
10.9k
}
5659
5660
static OPJ_BOOL opj_j2k_write_regions(opj_j2k_t *p_j2k,
5661
                                      struct opj_stream_private *p_stream,
5662
                                      struct opj_event_mgr * p_manager)
5663
10.9k
{
5664
10.9k
    OPJ_UINT32 compno;
5665
10.9k
    const opj_tccp_t *l_tccp = 00;
5666
5667
    /* preconditions */
5668
10.9k
    assert(p_j2k != 00);
5669
10.9k
    assert(p_manager != 00);
5670
10.9k
    assert(p_stream != 00);
5671
5672
10.9k
    l_tccp = p_j2k->m_cp.tcps->tccps;
5673
5674
23.5k
    for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {
5675
12.5k
        if (l_tccp->roishift) {
5676
5677
0
            if (! opj_j2k_write_rgn(p_j2k, 0, compno, p_j2k->m_private_image->numcomps,
5678
0
                                    p_stream, p_manager)) {
5679
0
                return OPJ_FALSE;
5680
0
            }
5681
0
        }
5682
5683
12.5k
        ++l_tccp;
5684
12.5k
    }
5685
5686
10.9k
    return OPJ_TRUE;
5687
10.9k
}
5688
5689
static OPJ_BOOL opj_j2k_write_epc(opj_j2k_t *p_j2k,
5690
                                  struct opj_stream_private *p_stream,
5691
                                  struct opj_event_mgr * p_manager)
5692
10.9k
{
5693
10.9k
    opj_codestream_index_t * l_cstr_index = 00;
5694
5695
    /* preconditions */
5696
10.9k
    assert(p_j2k != 00);
5697
10.9k
    assert(p_manager != 00);
5698
10.9k
    assert(p_stream != 00);
5699
5700
10.9k
    OPJ_UNUSED(p_manager);
5701
5702
10.9k
    l_cstr_index = p_j2k->cstr_index;
5703
10.9k
    if (l_cstr_index) {
5704
0
        l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
5705
        /* UniPG>> */
5706
        /* The following adjustment is done to adjust the codestream size */
5707
        /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
5708
        /* the first bunch of bytes is not in the codestream              */
5709
0
        l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;
5710
        /* <<UniPG */
5711
0
    }
5712
5713
#ifdef USE_JPWL
5714
    /* preparation of JPWL marker segments */
5715
#if 0
5716
    if (cp->epc_on) {
5717
5718
        /* encode according to JPWL */
5719
        jpwl_encode(p_j2k, p_stream, image);
5720
5721
    }
5722
#endif
5723
    assert(0 && "TODO");
5724
#endif /* USE_JPWL */
5725
5726
10.9k
    return OPJ_TRUE;
5727
10.9k
}
5728
5729
static OPJ_BOOL opj_j2k_read_unk(opj_j2k_t *p_j2k,
5730
                                 opj_stream_private_t *p_stream,
5731
                                 OPJ_UINT32 *output_marker,
5732
                                 opj_event_mgr_t * p_manager
5733
                                )
5734
89.3k
{
5735
89.3k
    OPJ_UINT32 l_unknown_marker;
5736
89.3k
    const opj_dec_memory_marker_handler_t * l_marker_handler;
5737
89.3k
    OPJ_UINT32 l_size_unk = 2;
5738
5739
    /* preconditions*/
5740
89.3k
    assert(p_j2k != 00);
5741
89.3k
    assert(p_manager != 00);
5742
89.3k
    assert(p_stream != 00);
5743
5744
89.3k
    opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
5745
5746
763k
    for (;;) {
5747
        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
5748
763k
        if (opj_stream_read_data(p_stream,
5749
763k
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
5750
874
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
5751
874
            return OPJ_FALSE;
5752
874
        }
5753
5754
        /* read 2 bytes as the new marker ID*/
5755
762k
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
5756
762k
                       &l_unknown_marker, 2);
5757
5758
762k
        if (!(l_unknown_marker < 0xff00)) {
5759
5760
            /* Get the marker handler from the marker ID*/
5761
204k
            l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
5762
5763
204k
            if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
5764
36
                opj_event_msg(p_manager, EVT_ERROR,
5765
36
                              "Marker is not compliant with its position\n");
5766
36
                return OPJ_FALSE;
5767
204k
            } else {
5768
204k
                if (l_marker_handler->id != J2K_MS_UNK) {
5769
                    /* Add the marker to the codestream index*/
5770
88.4k
                    if (l_marker_handler->id != J2K_MS_SOT) {
5771
79.6k
                        OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
5772
79.6k
                                                            (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
5773
79.6k
                                                            l_size_unk);
5774
79.6k
                        if (res == OPJ_FALSE) {
5775
0
                            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
5776
0
                            return OPJ_FALSE;
5777
0
                        }
5778
79.6k
                    }
5779
88.4k
                    break; /* next marker is known and well located */
5780
116k
                } else {
5781
116k
                    l_size_unk += 2;
5782
116k
                }
5783
204k
            }
5784
204k
        }
5785
762k
    }
5786
5787
88.4k
    *output_marker = l_marker_handler->id ;
5788
5789
88.4k
    return OPJ_TRUE;
5790
89.3k
}
5791
5792
static OPJ_BOOL opj_j2k_write_mct_record(opj_j2k_t *p_j2k,
5793
        opj_mct_data_t * p_mct_record,
5794
        struct opj_stream_private *p_stream,
5795
        struct opj_event_mgr * p_manager)
5796
0
{
5797
0
    OPJ_UINT32 l_mct_size;
5798
0
    OPJ_BYTE * l_current_data = 00;
5799
0
    OPJ_UINT32 l_tmp;
5800
5801
    /* preconditions */
5802
0
    assert(p_j2k != 00);
5803
0
    assert(p_manager != 00);
5804
0
    assert(p_stream != 00);
5805
5806
0
    l_mct_size = 10 + p_mct_record->m_data_size;
5807
5808
0
    if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
5809
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
5810
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);
5811
0
        if (! new_header_tile_data) {
5812
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5813
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5814
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5815
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n");
5816
0
            return OPJ_FALSE;
5817
0
        }
5818
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5819
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
5820
0
    }
5821
5822
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5823
5824
0
    opj_write_bytes(l_current_data, J2K_MS_MCT,
5825
0
                    2);                                   /* MCT */
5826
0
    l_current_data += 2;
5827
5828
0
    opj_write_bytes(l_current_data, l_mct_size - 2,
5829
0
                    2);                                 /* Lmct */
5830
0
    l_current_data += 2;
5831
5832
0
    opj_write_bytes(l_current_data, 0,
5833
0
                    2);                                                    /* Zmct */
5834
0
    l_current_data += 2;
5835
5836
    /* only one marker atm */
5837
0
    l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) |
5838
0
            (p_mct_record->m_element_type << 10);
5839
5840
0
    opj_write_bytes(l_current_data, l_tmp, 2);
5841
0
    l_current_data += 2;
5842
5843
0
    opj_write_bytes(l_current_data, 0,
5844
0
                    2);                                                    /* Ymct */
5845
0
    l_current_data += 2;
5846
5847
0
    memcpy(l_current_data, p_mct_record->m_data, p_mct_record->m_data_size);
5848
5849
0
    if (opj_stream_write_data(p_stream,
5850
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size,
5851
0
                              p_manager) != l_mct_size) {
5852
0
        return OPJ_FALSE;
5853
0
    }
5854
5855
0
    return OPJ_TRUE;
5856
0
}
5857
5858
/**
5859
 * Reads a MCT marker (Multiple Component Transform)
5860
 *
5861
 * @param       p_header_data   the data contained in the MCT box.
5862
 * @param       p_j2k                   the jpeg2000 codec.
5863
 * @param       p_header_size   the size of the data contained in the MCT marker.
5864
 * @param       p_manager               the user event manager.
5865
*/
5866
static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
5867
                                 OPJ_BYTE * p_header_data,
5868
                                 OPJ_UINT32 p_header_size,
5869
                                 opj_event_mgr_t * p_manager
5870
                                )
5871
10.7k
{
5872
10.7k
    OPJ_UINT32 i;
5873
10.7k
    opj_tcp_t *l_tcp = 00;
5874
10.7k
    OPJ_UINT32 l_tmp;
5875
10.7k
    OPJ_UINT32 l_indix;
5876
10.7k
    opj_mct_data_t * l_mct_data;
5877
5878
    /* preconditions */
5879
10.7k
    assert(p_header_data != 00);
5880
10.7k
    assert(p_j2k != 00);
5881
5882
10.7k
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5883
1.38k
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5884
10.7k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
5885
5886
10.7k
    if (p_header_size < 2) {
5887
15
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5888
15
        return OPJ_FALSE;
5889
15
    }
5890
5891
    /* first marker */
5892
10.6k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmct */
5893
10.6k
    p_header_data += 2;
5894
10.6k
    if (l_tmp != 0) {
5895
3.15k
        opj_event_msg(p_manager, EVT_WARNING,
5896
3.15k
                      "Cannot take in charge mct data within multiple MCT records\n");
5897
3.15k
        return OPJ_TRUE;
5898
3.15k
    }
5899
5900
7.53k
    if (p_header_size <= 6) {
5901
9
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5902
9
        return OPJ_FALSE;
5903
9
    }
5904
5905
    /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
5906
7.52k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Imct */
5907
7.52k
    p_header_data += 2;
5908
5909
7.52k
    l_indix = l_tmp & 0xff;
5910
7.52k
    l_mct_data = l_tcp->m_mct_records;
5911
5912
46.5k
    for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
5913
42.4k
        if (l_mct_data->m_index == l_indix) {
5914
3.36k
            break;
5915
3.36k
        }
5916
39.0k
        ++l_mct_data;
5917
39.0k
    }
5918
5919
    /* NOT FOUND */
5920
7.52k
    if (i == l_tcp->m_nb_mct_records) {
5921
4.15k
        if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
5922
229
            opj_mct_data_t *new_mct_records;
5923
229
            l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
5924
5925
229
            new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records,
5926
229
                              l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
5927
229
            if (! new_mct_records) {
5928
0
                opj_free(l_tcp->m_mct_records);
5929
0
                l_tcp->m_mct_records = NULL;
5930
0
                l_tcp->m_nb_max_mct_records = 0;
5931
0
                l_tcp->m_nb_mct_records = 0;
5932
0
                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n");
5933
0
                return OPJ_FALSE;
5934
0
            }
5935
5936
            /* Update m_mcc_records[].m_offset_array and m_decorrelation_array
5937
             * to point to the new addresses */
5938
229
            if (new_mct_records != l_tcp->m_mct_records) {
5939
642
                for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
5940
455
                    opj_simple_mcc_decorrelation_data_t* l_mcc_record =
5941
455
                        &(l_tcp->m_mcc_records[i]);
5942
455
                    if (l_mcc_record->m_decorrelation_array) {
5943
128
                        l_mcc_record->m_decorrelation_array =
5944
128
                            new_mct_records +
5945
128
                            (l_mcc_record->m_decorrelation_array -
5946
128
                             l_tcp->m_mct_records);
5947
128
                    }
5948
455
                    if (l_mcc_record->m_offset_array) {
5949
84
                        l_mcc_record->m_offset_array =
5950
84
                            new_mct_records +
5951
84
                            (l_mcc_record->m_offset_array -
5952
84
                             l_tcp->m_mct_records);
5953
84
                    }
5954
455
                }
5955
187
            }
5956
5957
229
            l_tcp->m_mct_records = new_mct_records;
5958
229
            l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5959
229
            memset(l_mct_data, 0, (l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) *
5960
229
                   sizeof(opj_mct_data_t));
5961
229
        }
5962
5963
4.15k
        l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5964
4.15k
        ++l_tcp->m_nb_mct_records;
5965
4.15k
    }
5966
5967
7.52k
    if (l_mct_data->m_data) {
5968
1.82k
        opj_free(l_mct_data->m_data);
5969
1.82k
        l_mct_data->m_data = 00;
5970
1.82k
        l_mct_data->m_data_size = 0;
5971
1.82k
    }
5972
5973
7.52k
    l_mct_data->m_index = l_indix;
5974
7.52k
    l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
5975
7.52k
    l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
5976
5977
7.52k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymct */
5978
7.52k
    p_header_data += 2;
5979
7.52k
    if (l_tmp != 0) {
5980
4.37k
        opj_event_msg(p_manager, EVT_WARNING,
5981
4.37k
                      "Cannot take in charge multiple MCT markers\n");
5982
4.37k
        return OPJ_TRUE;
5983
4.37k
    }
5984
5985
3.14k
    p_header_size -= 6;
5986
5987
3.14k
    l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
5988
3.14k
    if (! l_mct_data->m_data) {
5989
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5990
0
        return OPJ_FALSE;
5991
0
    }
5992
3.14k
    memcpy(l_mct_data->m_data, p_header_data, p_header_size);
5993
5994
3.14k
    l_mct_data->m_data_size = p_header_size;
5995
5996
3.14k
    return OPJ_TRUE;
5997
3.14k
}
5998
5999
static OPJ_BOOL opj_j2k_write_mcc_record(opj_j2k_t *p_j2k,
6000
        struct opj_simple_mcc_decorrelation_data * p_mcc_record,
6001
        struct opj_stream_private *p_stream,
6002
        struct opj_event_mgr * p_manager)
6003
0
{
6004
0
    OPJ_UINT32 i;
6005
0
    OPJ_UINT32 l_mcc_size;
6006
0
    OPJ_BYTE * l_current_data = 00;
6007
0
    OPJ_UINT32 l_nb_bytes_for_comp;
6008
0
    OPJ_UINT32 l_mask;
6009
0
    OPJ_UINT32 l_tmcc;
6010
6011
    /* preconditions */
6012
0
    assert(p_j2k != 00);
6013
0
    assert(p_manager != 00);
6014
0
    assert(p_stream != 00);
6015
6016
0
    if (p_mcc_record->m_nb_comps > 255) {
6017
0
        l_nb_bytes_for_comp = 2;
6018
0
        l_mask = 0x8000;
6019
0
    } else {
6020
0
        l_nb_bytes_for_comp = 1;
6021
0
        l_mask = 0;
6022
0
    }
6023
6024
0
    l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
6025
0
    if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
6026
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
6027
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);
6028
0
        if (! new_header_tile_data) {
6029
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
6030
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
6031
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
6032
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n");
6033
0
            return OPJ_FALSE;
6034
0
        }
6035
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
6036
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
6037
0
    }
6038
6039
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
6040
6041
0
    opj_write_bytes(l_current_data, J2K_MS_MCC,
6042
0
                    2);                                   /* MCC */
6043
0
    l_current_data += 2;
6044
6045
0
    opj_write_bytes(l_current_data, l_mcc_size - 2,
6046
0
                    2);                                 /* Lmcc */
6047
0
    l_current_data += 2;
6048
6049
    /* first marker */
6050
0
    opj_write_bytes(l_current_data, 0,
6051
0
                    2);                                  /* Zmcc */
6052
0
    l_current_data += 2;
6053
6054
0
    opj_write_bytes(l_current_data, p_mcc_record->m_index,
6055
0
                    1);                                        /* Imcc -> no need for other values, take the first */
6056
0
    ++l_current_data;
6057
6058
    /* only one marker atm */
6059
0
    opj_write_bytes(l_current_data, 0,
6060
0
                    2);                                  /* Ymcc */
6061
0
    l_current_data += 2;
6062
6063
0
    opj_write_bytes(l_current_data, 1,
6064
0
                    2);                                  /* Qmcc -> number of collections -> 1 */
6065
0
    l_current_data += 2;
6066
6067
0
    opj_write_bytes(l_current_data, 0x1,
6068
0
                    1);                                /* Xmcci type of component transformation -> array based decorrelation */
6069
0
    ++l_current_data;
6070
6071
0
    opj_write_bytes(l_current_data, p_mcc_record->m_nb_comps | l_mask,
6072
0
                    2);  /* Nmcci number of input components involved and size for each component offset = 8 bits */
6073
0
    l_current_data += 2;
6074
6075
0
    for (i = 0; i < p_mcc_record->m_nb_comps; ++i) {
6076
0
        opj_write_bytes(l_current_data, i,
6077
0
                        l_nb_bytes_for_comp);                          /* Cmccij Component offset*/
6078
0
        l_current_data += l_nb_bytes_for_comp;
6079
0
    }
6080
6081
0
    opj_write_bytes(l_current_data, p_mcc_record->m_nb_comps | l_mask,
6082
0
                    2);  /* Mmcci number of output components involved and size for each component offset = 8 bits */
6083
0
    l_current_data += 2;
6084
6085
0
    for (i = 0; i < p_mcc_record->m_nb_comps; ++i) {
6086
0
        opj_write_bytes(l_current_data, i,
6087
0
                        l_nb_bytes_for_comp);                          /* Wmccij Component offset*/
6088
0
        l_current_data += l_nb_bytes_for_comp;
6089
0
    }
6090
6091
0
    l_tmcc = ((!p_mcc_record->m_is_irreversible) & 1U) << 16;
6092
6093
0
    if (p_mcc_record->m_decorrelation_array) {
6094
0
        l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
6095
0
    }
6096
6097
0
    if (p_mcc_record->m_offset_array) {
6098
0
        l_tmcc |= ((p_mcc_record->m_offset_array->m_index) << 8);
6099
0
    }
6100
6101
0
    opj_write_bytes(l_current_data, l_tmcc,
6102
0
                    3);     /* Tmcci : use MCT defined as number 1 and irreversible array based. */
6103
0
    l_current_data += 3;
6104
6105
0
    if (opj_stream_write_data(p_stream,
6106
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size,
6107
0
                              p_manager) != l_mcc_size) {
6108
0
        return OPJ_FALSE;
6109
0
    }
6110
6111
0
    return OPJ_TRUE;
6112
0
}
6113
6114
static OPJ_BOOL opj_j2k_read_mcc(opj_j2k_t *p_j2k,
6115
                                 OPJ_BYTE * p_header_data,
6116
                                 OPJ_UINT32 p_header_size,
6117
                                 opj_event_mgr_t * p_manager)
6118
18.4k
{
6119
18.4k
    OPJ_UINT32 i, j;
6120
18.4k
    OPJ_UINT32 l_tmp;
6121
18.4k
    OPJ_UINT32 l_indix;
6122
18.4k
    opj_tcp_t * l_tcp;
6123
18.4k
    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6124
18.4k
    opj_mct_data_t * l_mct_data;
6125
18.4k
    OPJ_UINT32 l_nb_collections;
6126
18.4k
    OPJ_UINT32 l_nb_comps;
6127
18.4k
    OPJ_UINT32 l_nb_bytes_by_comp;
6128
18.4k
    OPJ_BOOL l_new_mcc = OPJ_FALSE;
6129
6130
    /* preconditions */
6131
18.4k
    assert(p_header_data != 00);
6132
18.4k
    assert(p_j2k != 00);
6133
18.4k
    assert(p_manager != 00);
6134
6135
18.4k
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6136
400
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6137
18.4k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
6138
6139
18.4k
    if (p_header_size < 2) {
6140
9
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6141
9
        return OPJ_FALSE;
6142
9
    }
6143
6144
    /* first marker */
6145
18.4k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmcc */
6146
18.4k
    p_header_data += 2;
6147
18.4k
    if (l_tmp != 0) {
6148
1.60k
        opj_event_msg(p_manager, EVT_WARNING,
6149
1.60k
                      "Cannot take in charge multiple data spanning\n");
6150
1.60k
        return OPJ_TRUE;
6151
1.60k
    }
6152
6153
16.8k
    if (p_header_size < 7) {
6154
15
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6155
15
        return OPJ_FALSE;
6156
15
    }
6157
6158
16.8k
    opj_read_bytes(p_header_data, &l_indix,
6159
16.8k
                   1); /* Imcc -> no need for other values, take the first */
6160
16.8k
    ++p_header_data;
6161
6162
16.8k
    l_mcc_record = l_tcp->m_mcc_records;
6163
6164
27.3k
    for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
6165
18.8k
        if (l_mcc_record->m_index == l_indix) {
6166
8.29k
            break;
6167
8.29k
        }
6168
10.5k
        ++l_mcc_record;
6169
10.5k
    }
6170
6171
    /** NOT FOUND */
6172
16.8k
    if (i == l_tcp->m_nb_mcc_records) {
6173
8.50k
        if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
6174
23
            opj_simple_mcc_decorrelation_data_t *new_mcc_records;
6175
23
            l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
6176
6177
23
            new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
6178
23
                                  l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(
6179
23
                                      opj_simple_mcc_decorrelation_data_t));
6180
23
            if (! new_mcc_records) {
6181
0
                opj_free(l_tcp->m_mcc_records);
6182
0
                l_tcp->m_mcc_records = NULL;
6183
0
                l_tcp->m_nb_max_mcc_records = 0;
6184
0
                l_tcp->m_nb_mcc_records = 0;
6185
0
                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n");
6186
0
                return OPJ_FALSE;
6187
0
            }
6188
23
            l_tcp->m_mcc_records = new_mcc_records;
6189
23
            l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
6190
23
            memset(l_mcc_record, 0, (l_tcp->m_nb_max_mcc_records - l_tcp->m_nb_mcc_records)
6191
23
                   * sizeof(opj_simple_mcc_decorrelation_data_t));
6192
23
        }
6193
8.50k
        l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
6194
8.50k
        l_new_mcc = OPJ_TRUE;
6195
8.50k
    }
6196
16.8k
    l_mcc_record->m_index = l_indix;
6197
6198
    /* only one marker atm */
6199
16.8k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymcc */
6200
16.8k
    p_header_data += 2;
6201
16.8k
    if (l_tmp != 0) {
6202
2.10k
        opj_event_msg(p_manager, EVT_WARNING,
6203
2.10k
                      "Cannot take in charge multiple data spanning\n");
6204
2.10k
        return OPJ_TRUE;
6205
2.10k
    }
6206
6207
14.6k
    opj_read_bytes(p_header_data, &l_nb_collections,
6208
14.6k
                   2);                              /* Qmcc -> number of collections -> 1 */
6209
14.6k
    p_header_data += 2;
6210
6211
14.6k
    if (l_nb_collections > 1) {
6212
2.10k
        opj_event_msg(p_manager, EVT_WARNING,
6213
2.10k
                      "Cannot take in charge multiple collections\n");
6214
2.10k
        return OPJ_TRUE;
6215
2.10k
    }
6216
6217
12.5k
    p_header_size -= 7;
6218
6219
17.1k
    for (i = 0; i < l_nb_collections; ++i) {
6220
9.44k
        if (p_header_size < 3) {
6221
5
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6222
5
            return OPJ_FALSE;
6223
5
        }
6224
6225
9.43k
        opj_read_bytes(p_header_data, &l_tmp,
6226
9.43k
                       1); /* Xmcci type of component transformation -> array based decorrelation */
6227
9.43k
        ++p_header_data;
6228
6229
9.43k
        if (l_tmp != 1) {
6230
784
            opj_event_msg(p_manager, EVT_WARNING,
6231
784
                          "Cannot take in charge collections other than array decorrelation\n");
6232
784
            return OPJ_TRUE;
6233
784
        }
6234
6235
8.65k
        opj_read_bytes(p_header_data, &l_nb_comps, 2);
6236
6237
8.65k
        p_header_data += 2;
6238
8.65k
        p_header_size -= 3;
6239
6240
8.65k
        l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
6241
8.65k
        l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
6242
6243
8.65k
        if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
6244
30
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6245
30
            return OPJ_FALSE;
6246
30
        }
6247
6248
8.62k
        p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
6249
6250
16.9k
        for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
6251
10.4k
            opj_read_bytes(p_header_data, &l_tmp,
6252
10.4k
                           l_nb_bytes_by_comp);      /* Cmccij Component offset*/
6253
10.4k
            p_header_data += l_nb_bytes_by_comp;
6254
6255
10.4k
            if (l_tmp != j) {
6256
2.14k
                opj_event_msg(p_manager, EVT_WARNING,
6257
2.14k
                              "Cannot take in charge collections with indix shuffle\n");
6258
2.14k
                return OPJ_TRUE;
6259
2.14k
            }
6260
10.4k
        }
6261
6262
6.48k
        opj_read_bytes(p_header_data, &l_nb_comps, 2);
6263
6.48k
        p_header_data += 2;
6264
6265
6.48k
        l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
6266
6.48k
        l_nb_comps &= 0x7fff;
6267
6268
6.48k
        if (l_nb_comps != l_mcc_record->m_nb_comps) {
6269
1.04k
            opj_event_msg(p_manager, EVT_WARNING,
6270
1.04k
                          "Cannot take in charge collections without same number of indixes\n");
6271
1.04k
            return OPJ_TRUE;
6272
1.04k
        }
6273
6274
5.43k
        if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
6275
8
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6276
8
            return OPJ_FALSE;
6277
8
        }
6278
6279
5.42k
        p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
6280
6281
8.46k
        for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
6282
3.82k
            opj_read_bytes(p_header_data, &l_tmp,
6283
3.82k
                           l_nb_bytes_by_comp);      /* Wmccij Component offset*/
6284
3.82k
            p_header_data += l_nb_bytes_by_comp;
6285
6286
3.82k
            if (l_tmp != j) {
6287
782
                opj_event_msg(p_manager, EVT_WARNING,
6288
782
                              "Cannot take in charge collections with indix shuffle\n");
6289
782
                return OPJ_TRUE;
6290
782
            }
6291
3.82k
        }
6292
6293
4.64k
        opj_read_bytes(p_header_data, &l_tmp, 3); /* Wmccij Component offset*/
6294
4.64k
        p_header_data += 3;
6295
6296
4.64k
        l_mcc_record->m_is_irreversible = !((l_tmp >> 16) & 1);
6297
4.64k
        l_mcc_record->m_decorrelation_array = 00;
6298
4.64k
        l_mcc_record->m_offset_array = 00;
6299
6300
4.64k
        l_indix = l_tmp & 0xff;
6301
4.64k
        if (l_indix != 0) {
6302
3.59k
            l_mct_data = l_tcp->m_mct_records;
6303
5.87k
            for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6304
5.81k
                if (l_mct_data->m_index == l_indix) {
6305
3.54k
                    l_mcc_record->m_decorrelation_array = l_mct_data;
6306
3.54k
                    break;
6307
3.54k
                }
6308
2.27k
                ++l_mct_data;
6309
2.27k
            }
6310
6311
3.59k
            if (l_mcc_record->m_decorrelation_array == 00) {
6312
52
                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6313
52
                return OPJ_FALSE;
6314
52
            }
6315
3.59k
        }
6316
6317
4.59k
        l_indix = (l_tmp >> 8) & 0xff;
6318
4.59k
        if (l_indix != 0) {
6319
3.15k
            l_mct_data = l_tcp->m_mct_records;
6320
5.21k
            for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6321
5.17k
                if (l_mct_data->m_index == l_indix) {
6322
3.11k
                    l_mcc_record->m_offset_array = l_mct_data;
6323
3.11k
                    break;
6324
3.11k
                }
6325
2.06k
                ++l_mct_data;
6326
2.06k
            }
6327
6328
3.15k
            if (l_mcc_record->m_offset_array == 00) {
6329
39
                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6330
39
                return OPJ_FALSE;
6331
39
            }
6332
3.15k
        }
6333
4.59k
    }
6334
6335
7.70k
    if (p_header_size != 0) {
6336
29
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6337
29
        return OPJ_FALSE;
6338
29
    }
6339
6340
7.67k
    if (l_new_mcc) {
6341
1.94k
        ++l_tcp->m_nb_mcc_records;
6342
1.94k
    }
6343
6344
7.67k
    return OPJ_TRUE;
6345
7.70k
}
6346
6347
static OPJ_BOOL opj_j2k_write_mco(opj_j2k_t *p_j2k,
6348
                                  struct opj_stream_private *p_stream,
6349
                                  struct opj_event_mgr * p_manager
6350
                                 )
6351
0
{
6352
0
    OPJ_BYTE * l_current_data = 00;
6353
0
    OPJ_UINT32 l_mco_size;
6354
0
    opj_tcp_t * l_tcp = 00;
6355
0
    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6356
0
    OPJ_UINT32 i;
6357
6358
    /* preconditions */
6359
0
    assert(p_j2k != 00);
6360
0
    assert(p_manager != 00);
6361
0
    assert(p_stream != 00);
6362
6363
0
    l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
6364
6365
0
    l_mco_size = 5 + l_tcp->m_nb_mcc_records;
6366
0
    if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
6367
6368
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
6369
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);
6370
0
        if (! new_header_tile_data) {
6371
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
6372
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
6373
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
6374
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n");
6375
0
            return OPJ_FALSE;
6376
0
        }
6377
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
6378
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
6379
0
    }
6380
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
6381
6382
6383
0
    opj_write_bytes(l_current_data, J2K_MS_MCO, 2);                 /* MCO */
6384
0
    l_current_data += 2;
6385
6386
0
    opj_write_bytes(l_current_data, l_mco_size - 2, 2);             /* Lmco */
6387
0
    l_current_data += 2;
6388
6389
0
    opj_write_bytes(l_current_data, l_tcp->m_nb_mcc_records,
6390
0
                    1);    /* Nmco : only one transform stage*/
6391
0
    ++l_current_data;
6392
6393
0
    l_mcc_record = l_tcp->m_mcc_records;
6394
0
    for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
6395
0
        opj_write_bytes(l_current_data, l_mcc_record->m_index,
6396
0
                        1); /* Imco -> use the mcc indicated by 1*/
6397
0
        ++l_current_data;
6398
0
        ++l_mcc_record;
6399
0
    }
6400
6401
0
    if (opj_stream_write_data(p_stream,
6402
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size,
6403
0
                              p_manager) != l_mco_size) {
6404
0
        return OPJ_FALSE;
6405
0
    }
6406
6407
0
    return OPJ_TRUE;
6408
0
}
6409
6410
/**
6411
 * Reads a MCO marker (Multiple Component Transform Ordering)
6412
 *
6413
 * @param       p_header_data   the data contained in the MCO box.
6414
 * @param       p_j2k                   the jpeg2000 codec.
6415
 * @param       p_header_size   the size of the data contained in the MCO marker.
6416
 * @param       p_manager               the user event manager.
6417
*/
6418
static OPJ_BOOL opj_j2k_read_mco(opj_j2k_t *p_j2k,
6419
                                 OPJ_BYTE * p_header_data,
6420
                                 OPJ_UINT32 p_header_size,
6421
                                 opj_event_mgr_t * p_manager
6422
                                )
6423
26.3k
{
6424
26.3k
    OPJ_UINT32 l_tmp, i;
6425
26.3k
    OPJ_UINT32 l_nb_stages;
6426
26.3k
    opj_tcp_t * l_tcp;
6427
26.3k
    opj_tccp_t * l_tccp;
6428
26.3k
    opj_image_t * l_image;
6429
6430
    /* preconditions */
6431
26.3k
    assert(p_header_data != 00);
6432
26.3k
    assert(p_j2k != 00);
6433
26.3k
    assert(p_manager != 00);
6434
6435
26.3k
    l_image = p_j2k->m_private_image;
6436
26.3k
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6437
2.00k
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6438
26.3k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
6439
6440
26.3k
    if (p_header_size < 1) {
6441
15
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
6442
15
        return OPJ_FALSE;
6443
15
    }
6444
6445
26.3k
    opj_read_bytes(p_header_data, &l_nb_stages,
6446
26.3k
                   1);                         /* Nmco : only one transform stage*/
6447
26.3k
    ++p_header_data;
6448
6449
26.3k
    if (l_nb_stages > 1) {
6450
4.84k
        opj_event_msg(p_manager, EVT_WARNING,
6451
4.84k
                      "Cannot take in charge multiple transformation stages.\n");
6452
4.84k
        return OPJ_TRUE;
6453
4.84k
    }
6454
6455
21.4k
    if (p_header_size != l_nb_stages + 1) {
6456
27
        opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
6457
27
        return OPJ_FALSE;
6458
27
    }
6459
6460
21.4k
    l_tccp = l_tcp->tccps;
6461
6462
84.3k
    for (i = 0; i < l_image->numcomps; ++i) {
6463
62.9k
        l_tccp->m_dc_level_shift = 0;
6464
62.9k
        ++l_tccp;
6465
62.9k
    }
6466
6467
21.4k
    if (l_tcp->m_mct_decoding_matrix) {
6468
10.2k
        opj_free(l_tcp->m_mct_decoding_matrix);
6469
10.2k
        l_tcp->m_mct_decoding_matrix = 00;
6470
10.2k
    }
6471
6472
41.7k
    for (i = 0; i < l_nb_stages; ++i) {
6473
20.3k
        opj_read_bytes(p_header_data, &l_tmp, 1);
6474
20.3k
        ++p_header_data;
6475
6476
20.3k
        if (! opj_j2k_add_mct(l_tcp, p_j2k->m_private_image, l_tmp)) {
6477
12
            return OPJ_FALSE;
6478
12
        }
6479
20.3k
    }
6480
6481
21.4k
    return OPJ_TRUE;
6482
21.4k
}
6483
6484
static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
6485
                                OPJ_UINT32 p_index)
6486
20.3k
{
6487
20.3k
    OPJ_UINT32 i;
6488
20.3k
    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6489
20.3k
    opj_mct_data_t * l_deco_array, * l_offset_array;
6490
20.3k
    OPJ_UINT32 l_data_size, l_mct_size, l_offset_size;
6491
20.3k
    OPJ_UINT32 l_nb_elem;
6492
20.3k
    OPJ_UINT32 * l_offset_data, * l_current_offset_data;
6493
20.3k
    opj_tccp_t * l_tccp;
6494
6495
    /* preconditions */
6496
20.3k
    assert(p_tcp != 00);
6497
6498
20.3k
    l_mcc_record = p_tcp->m_mcc_records;
6499
6500
22.1k
    for (i = 0; i < p_tcp->m_nb_mcc_records; ++i) {
6501
16.8k
        if (l_mcc_record->m_index == p_index) {
6502
14.9k
            break;
6503
14.9k
        }
6504
16.8k
    }
6505
6506
20.3k
    if (i == p_tcp->m_nb_mcc_records) {
6507
        /** element discarded **/
6508
5.35k
        return OPJ_TRUE;
6509
5.35k
    }
6510
6511
14.9k
    if (l_mcc_record->m_nb_comps != p_image->numcomps) {
6512
        /** do not support number of comps != image */
6513
1.25k
        return OPJ_TRUE;
6514
1.25k
    }
6515
6516
13.7k
    l_deco_array = l_mcc_record->m_decorrelation_array;
6517
6518
13.7k
    if (l_deco_array) {
6519
10.5k
        l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps
6520
10.5k
                      * p_image->numcomps;
6521
10.5k
        if (l_deco_array->m_data_size != l_data_size) {
6522
5
            return OPJ_FALSE;
6523
5
        }
6524
6525
10.5k
        l_nb_elem = p_image->numcomps * p_image->numcomps;
6526
10.5k
        l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
6527
10.5k
        p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
6528
6529
10.5k
        if (! p_tcp->m_mct_decoding_matrix) {
6530
0
            return OPJ_FALSE;
6531
0
        }
6532
6533
10.5k
        j2k_mct_read_functions_to_float[l_deco_array->m_element_type](
6534
10.5k
            l_deco_array->m_data, p_tcp->m_mct_decoding_matrix, l_nb_elem);
6535
10.5k
    }
6536
6537
13.7k
    l_offset_array = l_mcc_record->m_offset_array;
6538
6539
13.7k
    if (l_offset_array) {
6540
4.15k
        l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] *
6541
4.15k
                      p_image->numcomps;
6542
4.15k
        if (l_offset_array->m_data_size != l_data_size) {
6543
7
            return OPJ_FALSE;
6544
7
        }
6545
6546
4.14k
        l_nb_elem = p_image->numcomps;
6547
4.14k
        l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
6548
4.14k
        l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
6549
6550
4.14k
        if (! l_offset_data) {
6551
0
            return OPJ_FALSE;
6552
0
        }
6553
6554
4.14k
        j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](
6555
4.14k
            l_offset_array->m_data, l_offset_data, l_nb_elem);
6556
6557
4.14k
        l_tccp = p_tcp->tccps;
6558
4.14k
        l_current_offset_data = l_offset_data;
6559
6560
11.2k
        for (i = 0; i < p_image->numcomps; ++i) {
6561
7.06k
            l_tccp->m_dc_level_shift = (OPJ_INT32) * (l_current_offset_data++);
6562
7.06k
            ++l_tccp;
6563
7.06k
        }
6564
6565
4.14k
        opj_free(l_offset_data);
6566
4.14k
    }
6567
6568
13.7k
    return OPJ_TRUE;
6569
13.7k
}
6570
6571
static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
6572
                                  struct opj_stream_private *p_stream,
6573
                                  struct opj_event_mgr * p_manager)
6574
0
{
6575
0
    OPJ_UINT32 i;
6576
0
    OPJ_UINT32 l_cbd_size;
6577
0
    OPJ_BYTE * l_current_data = 00;
6578
0
    opj_image_t *l_image = 00;
6579
0
    opj_image_comp_t * l_comp = 00;
6580
6581
    /* preconditions */
6582
0
    assert(p_j2k != 00);
6583
0
    assert(p_manager != 00);
6584
0
    assert(p_stream != 00);
6585
6586
0
    l_image = p_j2k->m_private_image;
6587
0
    l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
6588
6589
0
    if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
6590
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
6591
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
6592
0
        if (! new_header_tile_data) {
6593
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
6594
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
6595
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
6596
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
6597
0
            return OPJ_FALSE;
6598
0
        }
6599
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
6600
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
6601
0
    }
6602
6603
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
6604
6605
0
    opj_write_bytes(l_current_data, J2K_MS_CBD, 2);                 /* CBD */
6606
0
    l_current_data += 2;
6607
6608
0
    opj_write_bytes(l_current_data, l_cbd_size - 2, 2);             /* L_CBD */
6609
0
    l_current_data += 2;
6610
6611
0
    opj_write_bytes(l_current_data, l_image->numcomps, 2);          /* Ncbd */
6612
0
    l_current_data += 2;
6613
6614
0
    l_comp = l_image->comps;
6615
6616
0
    for (i = 0; i < l_image->numcomps; ++i) {
6617
0
        opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1),
6618
0
                        1);           /* Component bit depth */
6619
0
        ++l_current_data;
6620
6621
0
        ++l_comp;
6622
0
    }
6623
6624
0
    if (opj_stream_write_data(p_stream,
6625
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size,
6626
0
                              p_manager) != l_cbd_size) {
6627
0
        return OPJ_FALSE;
6628
0
    }
6629
6630
0
    return OPJ_TRUE;
6631
0
}
6632
6633
/**
6634
 * Reads a CBD marker (Component bit depth definition)
6635
 * @param       p_header_data   the data contained in the CBD box.
6636
 * @param       p_j2k                   the jpeg2000 codec.
6637
 * @param       p_header_size   the size of the data contained in the CBD marker.
6638
 * @param       p_manager               the user event manager.
6639
*/
6640
static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
6641
                                 OPJ_BYTE * p_header_data,
6642
                                 OPJ_UINT32 p_header_size,
6643
                                 opj_event_mgr_t * p_manager
6644
                                )
6645
1.30k
{
6646
1.30k
    OPJ_UINT32 l_nb_comp, l_num_comp;
6647
1.30k
    OPJ_UINT32 l_comp_def;
6648
1.30k
    OPJ_UINT32 i;
6649
1.30k
    opj_image_comp_t * l_comp = 00;
6650
6651
    /* preconditions */
6652
1.30k
    assert(p_header_data != 00);
6653
1.30k
    assert(p_j2k != 00);
6654
1.30k
    assert(p_manager != 00);
6655
6656
1.30k
    l_num_comp = p_j2k->m_private_image->numcomps;
6657
6658
1.30k
    if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
6659
11
        opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6660
11
        return OPJ_FALSE;
6661
11
    }
6662
6663
1.29k
    opj_read_bytes(p_header_data, &l_nb_comp,
6664
1.29k
                   2);                           /* Ncbd */
6665
1.29k
    p_header_data += 2;
6666
6667
1.29k
    if (l_nb_comp != l_num_comp) {
6668
67
        opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6669
67
        return OPJ_FALSE;
6670
67
    }
6671
6672
1.22k
    l_comp = p_j2k->m_private_image->comps;
6673
4.23k
    for (i = 0; i < l_num_comp; ++i) {
6674
3.03k
        opj_read_bytes(p_header_data, &l_comp_def,
6675
3.03k
                       1);                  /* Component bit depth */
6676
3.03k
        ++p_header_data;
6677
3.03k
        l_comp->sgnd = (l_comp_def >> 7) & 1;
6678
3.03k
        l_comp->prec = (l_comp_def & 0x7f) + 1;
6679
6680
3.03k
        if (l_comp->prec > 31) {
6681
23
            opj_event_msg(p_manager, EVT_ERROR,
6682
23
                          "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm. OpenJpeg only supports up to 31)\n",
6683
23
                          i, l_comp->prec);
6684
23
            return OPJ_FALSE;
6685
23
        }
6686
3.01k
        ++l_comp;
6687
3.01k
    }
6688
6689
1.20k
    return OPJ_TRUE;
6690
1.22k
}
6691
6692
/**
6693
 * Reads a CAP marker (extended capabilities definition). Empty implementation.
6694
 * Found in HTJ2K files.
6695
 *
6696
 * @param       p_header_data   the data contained in the CAP box.
6697
 * @param       p_j2k                   the jpeg2000 codec.
6698
 * @param       p_header_size   the size of the data contained in the CAP marker.
6699
 * @param       p_manager               the user event manager.
6700
*/
6701
static OPJ_BOOL opj_j2k_read_cap(opj_j2k_t *p_j2k,
6702
                                 OPJ_BYTE * p_header_data,
6703
                                 OPJ_UINT32 p_header_size,
6704
                                 opj_event_mgr_t * p_manager
6705
                                )
6706
1.01k
{
6707
    /* preconditions */
6708
1.01k
    assert(p_header_data != 00);
6709
1.01k
    assert(p_j2k != 00);
6710
1.01k
    assert(p_manager != 00);
6711
6712
1.01k
    (void)p_j2k;
6713
1.01k
    (void)p_header_data;
6714
1.01k
    (void)p_header_size;
6715
1.01k
    (void)p_manager;
6716
6717
1.01k
    return OPJ_TRUE;
6718
1.01k
}
6719
6720
/**
6721
 * Reads a CPF marker (corresponding profile). Empty implementation. Found in HTJ2K files
6722
 * @param       p_header_data   the data contained in the CPF box.
6723
 * @param       p_j2k                   the jpeg2000 codec.
6724
 * @param       p_header_size   the size of the data contained in the CPF marker.
6725
 * @param       p_manager               the user event manager.
6726
*/
6727
static OPJ_BOOL opj_j2k_read_cpf(opj_j2k_t *p_j2k,
6728
                                 OPJ_BYTE * p_header_data,
6729
                                 OPJ_UINT32 p_header_size,
6730
                                 opj_event_mgr_t * p_manager
6731
                                )
6732
809
{
6733
    /* preconditions */
6734
809
    assert(p_header_data != 00);
6735
809
    assert(p_j2k != 00);
6736
809
    assert(p_manager != 00);
6737
6738
809
    (void)p_j2k;
6739
809
    (void)p_header_data;
6740
809
    (void)p_header_size;
6741
809
    (void)p_manager;
6742
6743
809
    return OPJ_TRUE;
6744
809
}
6745
6746
/* ----------------------------------------------------------------------- */
6747
/* J2K / JPT decoder interface                                             */
6748
/* ----------------------------------------------------------------------- */
6749
6750
void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
6751
54.4k
{
6752
54.4k
    if (j2k && parameters) {
6753
54.4k
        j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
6754
54.4k
        j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
6755
6756
54.4k
        j2k->dump_state = (parameters->flags & OPJ_DPARAMETERS_DUMP_FLAG);
6757
#ifdef USE_JPWL
6758
        j2k->m_cp.correct = parameters->jpwl_correct;
6759
        j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
6760
        j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
6761
#endif /* USE_JPWL */
6762
54.4k
    }
6763
54.4k
}
6764
6765
void opj_j2k_decoder_set_strict_mode(opj_j2k_t *j2k, OPJ_BOOL strict)
6766
0
{
6767
0
    if (j2k) {
6768
0
        j2k->m_cp.strict = strict;
6769
0
        if (strict) {
6770
0
            j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
6771
0
        }
6772
0
    }
6773
0
}
6774
6775
OPJ_BOOL opj_j2k_set_threads(opj_j2k_t *j2k, OPJ_UINT32 num_threads)
6776
0
{
6777
    /* Currently we pass the thread-pool to the tcd, so we cannot re-set it */
6778
    /* afterwards */
6779
0
    if (opj_has_thread_support() && j2k->m_tcd == NULL) {
6780
0
        opj_thread_pool_destroy(j2k->m_tp);
6781
0
        j2k->m_tp = NULL;
6782
0
        if (num_threads <= (OPJ_UINT32)INT_MAX) {
6783
0
            j2k->m_tp = opj_thread_pool_create((int)num_threads);
6784
0
        }
6785
0
        if (j2k->m_tp == NULL) {
6786
0
            j2k->m_tp = opj_thread_pool_create(0);
6787
0
            return OPJ_FALSE;
6788
0
        }
6789
0
        return OPJ_TRUE;
6790
0
    }
6791
0
    return OPJ_FALSE;
6792
0
}
6793
6794
static int opj_j2k_get_default_thread_count(void)
6795
65.4k
{
6796
65.4k
    const char* num_threads_str = getenv("OPJ_NUM_THREADS");
6797
65.4k
    int num_cpus;
6798
65.4k
    int num_threads;
6799
6800
65.4k
    if (num_threads_str == NULL || !opj_has_thread_support()) {
6801
65.4k
        return 0;
6802
65.4k
    }
6803
0
    num_cpus = opj_get_num_cpus();
6804
0
    if (strcmp(num_threads_str, "ALL_CPUS") == 0) {
6805
0
        return num_cpus;
6806
0
    }
6807
0
    if (num_cpus == 0) {
6808
0
        num_cpus = 32;
6809
0
    }
6810
0
    num_threads = atoi(num_threads_str);
6811
0
    if (num_threads < 0) {
6812
0
        num_threads = 0;
6813
0
    } else if (num_threads > 2 * num_cpus) {
6814
0
        num_threads = 2 * num_cpus;
6815
0
    }
6816
0
    return num_threads;
6817
0
}
6818
6819
/* ----------------------------------------------------------------------- */
6820
/* J2K encoder interface                                                       */
6821
/* ----------------------------------------------------------------------- */
6822
6823
opj_j2k_t* opj_j2k_create_compress(void)
6824
11.0k
{
6825
11.0k
    opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
6826
11.0k
    if (!l_j2k) {
6827
0
        return NULL;
6828
0
    }
6829
6830
6831
11.0k
    l_j2k->m_is_decoder = 0;
6832
11.0k
    l_j2k->m_cp.m_is_decoder = 0;
6833
6834
11.0k
    l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(
6835
11.0k
                OPJ_J2K_DEFAULT_HEADER_SIZE);
6836
11.0k
    if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
6837
0
        opj_j2k_destroy(l_j2k);
6838
0
        return NULL;
6839
0
    }
6840
6841
11.0k
    l_j2k->m_specific_param.m_encoder.m_header_tile_data_size =
6842
11.0k
        OPJ_J2K_DEFAULT_HEADER_SIZE;
6843
6844
    /* validation list creation*/
6845
11.0k
    l_j2k->m_validation_list = opj_procedure_list_create();
6846
11.0k
    if (! l_j2k->m_validation_list) {
6847
0
        opj_j2k_destroy(l_j2k);
6848
0
        return NULL;
6849
0
    }
6850
6851
    /* execution list creation*/
6852
11.0k
    l_j2k->m_procedure_list = opj_procedure_list_create();
6853
11.0k
    if (! l_j2k->m_procedure_list) {
6854
0
        opj_j2k_destroy(l_j2k);
6855
0
        return NULL;
6856
0
    }
6857
6858
11.0k
    l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
6859
11.0k
    if (!l_j2k->m_tp) {
6860
0
        l_j2k->m_tp = opj_thread_pool_create(0);
6861
0
    }
6862
11.0k
    if (!l_j2k->m_tp) {
6863
0
        opj_j2k_destroy(l_j2k);
6864
0
        return NULL;
6865
0
    }
6866
6867
11.0k
    return l_j2k;
6868
11.0k
}
6869
6870
static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres)
6871
0
{
6872
0
    POC[0].tile  = 1;
6873
0
    POC[0].resno0  = 0;
6874
0
    POC[0].compno0 = 0;
6875
0
    POC[0].layno1  = 1;
6876
0
    POC[0].resno1  = (OPJ_UINT32)(numres - 1);
6877
0
    POC[0].compno1 = 3;
6878
0
    POC[0].prg1 = OPJ_CPRL;
6879
0
    POC[1].tile  = 1;
6880
0
    POC[1].resno0  = (OPJ_UINT32)(numres - 1);
6881
0
    POC[1].compno0 = 0;
6882
0
    POC[1].layno1  = 1;
6883
0
    POC[1].resno1  = (OPJ_UINT32)numres;
6884
0
    POC[1].compno1 = 3;
6885
0
    POC[1].prg1 = OPJ_CPRL;
6886
0
    return 2;
6887
0
}
6888
6889
static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
6890
        opj_image_t *image, opj_event_mgr_t *p_manager)
6891
1.05k
{
6892
    /* Configure cinema parameters */
6893
1.05k
    int i;
6894
6895
    /* No tiling */
6896
1.05k
    parameters->tile_size_on = OPJ_FALSE;
6897
1.05k
    parameters->cp_tdx = 1;
6898
1.05k
    parameters->cp_tdy = 1;
6899
6900
    /* One tile part for each component */
6901
1.05k
    parameters->tp_flag = 'C';
6902
1.05k
    parameters->tp_on = 1;
6903
6904
    /* Tile and Image shall be at (0,0) */
6905
1.05k
    parameters->cp_tx0 = 0;
6906
1.05k
    parameters->cp_ty0 = 0;
6907
1.05k
    parameters->image_offset_x0 = 0;
6908
1.05k
    parameters->image_offset_y0 = 0;
6909
6910
    /* Codeblock size= 32*32 */
6911
1.05k
    parameters->cblockw_init = 32;
6912
1.05k
    parameters->cblockh_init = 32;
6913
6914
    /* Codeblock style: no mode switch enabled */
6915
1.05k
    parameters->mode = 0;
6916
6917
    /* No ROI */
6918
1.05k
    parameters->roi_compno = -1;
6919
6920
    /* No subsampling */
6921
1.05k
    parameters->subsampling_dx = 1;
6922
1.05k
    parameters->subsampling_dy = 1;
6923
6924
    /* 9-7 transform */
6925
1.05k
    parameters->irreversible = 1;
6926
6927
    /* Number of layers */
6928
1.05k
    if (parameters->tcp_numlayers > 1) {
6929
0
        opj_event_msg(p_manager, EVT_WARNING,
6930
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6931
0
                      "1 single quality layer"
6932
0
                      "-> Number of layers forced to 1 (rather than %d)\n"
6933
0
                      "-> Rate of the last layer (%3.1f) will be used",
6934
0
                      parameters->tcp_numlayers,
6935
0
                      parameters->tcp_rates[parameters->tcp_numlayers - 1]);
6936
0
        parameters->tcp_rates[0] = parameters->tcp_rates[parameters->tcp_numlayers - 1];
6937
0
        parameters->tcp_numlayers = 1;
6938
0
    }
6939
6940
    /* Resolution levels */
6941
1.05k
    switch (parameters->rsiz) {
6942
1.05k
    case OPJ_PROFILE_CINEMA_2K:
6943
1.05k
        if (parameters->numresolution > 6) {
6944
0
            opj_event_msg(p_manager, EVT_WARNING,
6945
0
                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6946
0
                          "Number of decomposition levels <= 5\n"
6947
0
                          "-> Number of decomposition levels forced to 5 (rather than %d)\n",
6948
0
                          parameters->numresolution + 1);
6949
0
            parameters->numresolution = 6;
6950
0
        }
6951
1.05k
        break;
6952
0
    case OPJ_PROFILE_CINEMA_4K:
6953
0
        if (parameters->numresolution < 2) {
6954
0
            opj_event_msg(p_manager, EVT_WARNING,
6955
0
                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6956
0
                          "Number of decomposition levels >= 1 && <= 6\n"
6957
0
                          "-> Number of decomposition levels forced to 1 (rather than %d)\n",
6958
0
                          parameters->numresolution + 1);
6959
0
            parameters->numresolution = 1;
6960
0
        } else if (parameters->numresolution > 7) {
6961
0
            opj_event_msg(p_manager, EVT_WARNING,
6962
0
                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6963
0
                          "Number of decomposition levels >= 1 && <= 6\n"
6964
0
                          "-> Number of decomposition levels forced to 6 (rather than %d)\n",
6965
0
                          parameters->numresolution + 1);
6966
0
            parameters->numresolution = 7;
6967
0
        }
6968
0
        break;
6969
0
    default :
6970
0
        break;
6971
1.05k
    }
6972
6973
    /* Precincts */
6974
1.05k
    parameters->csty |= J2K_CP_CSTY_PRT;
6975
1.05k
    if (parameters->numresolution == 1) {
6976
19
        parameters->res_spec = 1;
6977
19
        parameters->prcw_init[0] = 128;
6978
19
        parameters->prch_init[0] = 128;
6979
1.03k
    } else {
6980
1.03k
        parameters->res_spec = parameters->numresolution - 1;
6981
6.00k
        for (i = 0; i < parameters->res_spec; i++) {
6982
4.97k
            parameters->prcw_init[i] = 256;
6983
4.97k
            parameters->prch_init[i] = 256;
6984
4.97k
        }
6985
1.03k
    }
6986
6987
    /* The progression order shall be CPRL */
6988
1.05k
    parameters->prog_order = OPJ_CPRL;
6989
6990
    /* Progression order changes for 4K, disallowed for 2K */
6991
1.05k
    if (parameters->rsiz == OPJ_PROFILE_CINEMA_4K) {
6992
0
        parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,
6993
0
                              parameters->numresolution);
6994
1.05k
    } else {
6995
1.05k
        parameters->numpocs = 0;
6996
1.05k
    }
6997
6998
    /* Limited bit-rate */
6999
1.05k
    parameters->cp_disto_alloc = 1;
7000
1.05k
    if (parameters->max_cs_size <= 0) {
7001
        /* No rate has been introduced, 24 fps is assumed */
7002
0
        parameters->max_cs_size = OPJ_CINEMA_24_CS;
7003
0
        opj_event_msg(p_manager, EVT_WARNING,
7004
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
7005
0
                      "Maximum 1302083 compressed bytes @ 24fps\n"
7006
0
                      "As no rate has been given, this limit will be used.\n");
7007
1.05k
    } else if (parameters->max_cs_size > OPJ_CINEMA_24_CS) {
7008
0
        opj_event_msg(p_manager, EVT_WARNING,
7009
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
7010
0
                      "Maximum 1302083 compressed bytes @ 24fps\n"
7011
0
                      "-> Specified rate exceeds this limit. Rate will be forced to 1302083 bytes.\n");
7012
0
        parameters->max_cs_size = OPJ_CINEMA_24_CS;
7013
0
    }
7014
7015
1.05k
    if (parameters->max_comp_size <= 0) {
7016
        /* No rate has been introduced, 24 fps is assumed */
7017
0
        parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7018
0
        opj_event_msg(p_manager, EVT_WARNING,
7019
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
7020
0
                      "Maximum 1041666 compressed bytes @ 24fps\n"
7021
0
                      "As no rate has been given, this limit will be used.\n");
7022
1.05k
    } else if (parameters->max_comp_size > OPJ_CINEMA_24_COMP) {
7023
0
        opj_event_msg(p_manager, EVT_WARNING,
7024
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
7025
0
                      "Maximum 1041666 compressed bytes @ 24fps\n"
7026
0
                      "-> Specified rate exceeds this limit. Rate will be forced to 1041666 bytes.\n");
7027
0
        parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7028
0
    }
7029
7030
1.05k
    parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
7031
1.05k
                               image->comps[0].h * image->comps[0].prec) /
7032
1.05k
                               (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
7033
1.05k
                                       image->comps[0].dy);
7034
7035
1.05k
}
7036
7037
static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
7038
        opj_event_mgr_t *p_manager)
7039
1.05k
{
7040
1.05k
    OPJ_UINT32 i;
7041
7042
    /* Number of components */
7043
1.05k
    if (image->numcomps != 3) {
7044
1.05k
        opj_event_msg(p_manager, EVT_WARNING,
7045
1.05k
                      "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
7046
1.05k
                      "3 components"
7047
1.05k
                      "-> Number of components of input image (%d) is not compliant\n"
7048
1.05k
                      "-> Non-profile-3 codestream will be generated\n",
7049
1.05k
                      image->numcomps);
7050
1.05k
        return OPJ_FALSE;
7051
1.05k
    }
7052
7053
    /* Bitdepth */
7054
0
    for (i = 0; i < image->numcomps; i++) {
7055
0
        if ((image->comps[i].prec != 12) | (image->comps[i].sgnd)) {
7056
0
            char signed_str[] = "signed";
7057
0
            char unsigned_str[] = "unsigned";
7058
0
            char *tmp_str = image->comps[i].sgnd ? signed_str : unsigned_str;
7059
0
            opj_event_msg(p_manager, EVT_WARNING,
7060
0
                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
7061
0
                          "Precision of each component shall be 12 bits unsigned"
7062
0
                          "-> At least component %d of input image (%d bits, %s) is not compliant\n"
7063
0
                          "-> Non-profile-3 codestream will be generated\n",
7064
0
                          i, image->comps[i].prec, tmp_str);
7065
0
            return OPJ_FALSE;
7066
0
        }
7067
0
    }
7068
7069
    /* Image size */
7070
0
    switch (rsiz) {
7071
0
    case OPJ_PROFILE_CINEMA_2K:
7072
0
        if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))) {
7073
0
            opj_event_msg(p_manager, EVT_WARNING,
7074
0
                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
7075
0
                          "width <= 2048 and height <= 1080\n"
7076
0
                          "-> Input image size %d x %d is not compliant\n"
7077
0
                          "-> Non-profile-3 codestream will be generated\n",
7078
0
                          image->comps[0].w, image->comps[0].h);
7079
0
            return OPJ_FALSE;
7080
0
        }
7081
0
        break;
7082
0
    case OPJ_PROFILE_CINEMA_4K:
7083
0
        if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))) {
7084
0
            opj_event_msg(p_manager, EVT_WARNING,
7085
0
                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
7086
0
                          "width <= 4096 and height <= 2160\n"
7087
0
                          "-> Image size %d x %d is not compliant\n"
7088
0
                          "-> Non-profile-4 codestream will be generated\n",
7089
0
                          image->comps[0].w, image->comps[0].h);
7090
0
            return OPJ_FALSE;
7091
0
        }
7092
0
        break;
7093
0
    default :
7094
0
        break;
7095
0
    }
7096
7097
0
    return OPJ_TRUE;
7098
0
}
7099
7100
static int opj_j2k_get_imf_max_NL(opj_cparameters_t *parameters,
7101
                                  opj_image_t *image)
7102
0
{
7103
    /* Decomposition levels */
7104
0
    const OPJ_UINT16 rsiz = parameters->rsiz;
7105
0
    const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7106
0
    const OPJ_UINT32 XTsiz = parameters->tile_size_on ? (OPJ_UINT32)
7107
0
                             parameters->cp_tdx : image->x1;
7108
0
    switch (profile) {
7109
0
    case OPJ_PROFILE_IMF_2K:
7110
0
        return 5;
7111
0
    case OPJ_PROFILE_IMF_4K:
7112
0
        return 6;
7113
0
    case OPJ_PROFILE_IMF_8K:
7114
0
        return 7;
7115
0
    case OPJ_PROFILE_IMF_2K_R: {
7116
0
        if (XTsiz >= 2048) {
7117
0
            return 5;
7118
0
        } else if (XTsiz >= 1024) {
7119
0
            return 4;
7120
0
        }
7121
0
        break;
7122
0
    }
7123
0
    case OPJ_PROFILE_IMF_4K_R: {
7124
0
        if (XTsiz >= 4096) {
7125
0
            return 6;
7126
0
        } else if (XTsiz >= 2048) {
7127
0
            return 5;
7128
0
        } else if (XTsiz >= 1024) {
7129
0
            return 4;
7130
0
        }
7131
0
        break;
7132
0
    }
7133
0
    case OPJ_PROFILE_IMF_8K_R: {
7134
0
        if (XTsiz >= 8192) {
7135
0
            return 7;
7136
0
        } else if (XTsiz >= 4096) {
7137
0
            return 6;
7138
0
        } else if (XTsiz >= 2048) {
7139
0
            return 5;
7140
0
        } else if (XTsiz >= 1024) {
7141
0
            return 4;
7142
0
        }
7143
0
        break;
7144
0
    }
7145
0
    default:
7146
0
        break;
7147
0
    }
7148
0
    return -1;
7149
0
}
7150
7151
static void opj_j2k_set_imf_parameters(opj_cparameters_t *parameters,
7152
                                       opj_image_t *image, opj_event_mgr_t *p_manager)
7153
0
{
7154
0
    const OPJ_UINT16 rsiz = parameters->rsiz;
7155
0
    const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7156
7157
0
    OPJ_UNUSED(p_manager);
7158
7159
    /* Override defaults set by opj_set_default_encoder_parameters */
7160
0
    if (parameters->cblockw_init == OPJ_COMP_PARAM_DEFAULT_CBLOCKW &&
7161
0
            parameters->cblockh_init == OPJ_COMP_PARAM_DEFAULT_CBLOCKH) {
7162
0
        parameters->cblockw_init = 32;
7163
0
        parameters->cblockh_init = 32;
7164
0
    }
7165
7166
    /* One tile part for each component */
7167
0
    parameters->tp_flag = 'C';
7168
0
    parameters->tp_on = 1;
7169
7170
0
    if (parameters->prog_order == OPJ_COMP_PARAM_DEFAULT_PROG_ORDER) {
7171
0
        parameters->prog_order = OPJ_CPRL;
7172
0
    }
7173
7174
0
    if (profile == OPJ_PROFILE_IMF_2K ||
7175
0
            profile == OPJ_PROFILE_IMF_4K ||
7176
0
            profile == OPJ_PROFILE_IMF_8K) {
7177
        /* 9-7 transform */
7178
0
        parameters->irreversible = 1;
7179
0
    }
7180
7181
    /* Adjust the number of resolutions if set to its defaults */
7182
0
    if (parameters->numresolution == OPJ_COMP_PARAM_DEFAULT_NUMRESOLUTION &&
7183
0
            image->x0 == 0 &&
7184
0
            image->y0 == 0) {
7185
0
        const int max_NL = opj_j2k_get_imf_max_NL(parameters, image);
7186
0
        if (max_NL >= 0 && parameters->numresolution > max_NL) {
7187
0
            parameters->numresolution = max_NL + 1;
7188
0
        }
7189
7190
        /* Note: below is generic logic */
7191
0
        if (!parameters->tile_size_on) {
7192
0
            while (parameters->numresolution > 0) {
7193
0
                if (image->x1 < (1U << ((OPJ_UINT32)parameters->numresolution - 1U))) {
7194
0
                    parameters->numresolution --;
7195
0
                    continue;
7196
0
                }
7197
0
                if (image->y1 < (1U << ((OPJ_UINT32)parameters->numresolution - 1U))) {
7198
0
                    parameters->numresolution --;
7199
0
                    continue;
7200
0
                }
7201
0
                break;
7202
0
            }
7203
0
        }
7204
0
    }
7205
7206
    /* Set defaults precincts */
7207
0
    if (parameters->csty == 0) {
7208
0
        parameters->csty |= J2K_CP_CSTY_PRT;
7209
0
        if (parameters->numresolution == 1) {
7210
0
            parameters->res_spec = 1;
7211
0
            parameters->prcw_init[0] = 128;
7212
0
            parameters->prch_init[0] = 128;
7213
0
        } else {
7214
0
            int i;
7215
0
            parameters->res_spec = parameters->numresolution - 1;
7216
0
            for (i = 0; i < parameters->res_spec; i++) {
7217
0
                parameters->prcw_init[i] = 256;
7218
0
                parameters->prch_init[i] = 256;
7219
0
            }
7220
0
        }
7221
0
    }
7222
0
}
7223
7224
/* Table A.53 from JPEG2000 standard */
7225
static const OPJ_UINT16 tabMaxSubLevelFromMainLevel[] = {
7226
    15, /* unspecified */
7227
    1,
7228
    1,
7229
    1,
7230
    2,
7231
    3,
7232
    4,
7233
    5,
7234
    6,
7235
    7,
7236
    8,
7237
    9
7238
};
7239
7240
static OPJ_BOOL opj_j2k_is_imf_compliant(opj_cparameters_t *parameters,
7241
        opj_image_t *image,
7242
        opj_event_mgr_t *p_manager)
7243
0
{
7244
0
    OPJ_UINT32 i;
7245
0
    const OPJ_UINT16 rsiz = parameters->rsiz;
7246
0
    const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7247
0
    const OPJ_UINT16 mainlevel = OPJ_GET_IMF_MAINLEVEL(rsiz);
7248
0
    const OPJ_UINT16 sublevel = OPJ_GET_IMF_SUBLEVEL(rsiz);
7249
0
    const int NL = parameters->numresolution - 1;
7250
0
    const OPJ_UINT32 XTsiz = parameters->tile_size_on ? (OPJ_UINT32)
7251
0
                             parameters->cp_tdx : image->x1;
7252
0
    OPJ_BOOL ret = OPJ_TRUE;
7253
7254
    /* Validate mainlevel */
7255
0
    if (mainlevel > OPJ_IMF_MAINLEVEL_MAX) {
7256
0
        opj_event_msg(p_manager, EVT_WARNING,
7257
0
                      "IMF profile require mainlevel <= 11.\n"
7258
0
                      "-> %d is thus not compliant\n"
7259
0
                      "-> Non-IMF codestream will be generated\n",
7260
0
                      mainlevel);
7261
0
        ret = OPJ_FALSE;
7262
0
    } else {
7263
        /* Validate sublevel */
7264
0
        assert(sizeof(tabMaxSubLevelFromMainLevel) ==
7265
0
               (OPJ_IMF_MAINLEVEL_MAX + 1) * sizeof(tabMaxSubLevelFromMainLevel[0]));
7266
0
        if (sublevel > tabMaxSubLevelFromMainLevel[mainlevel]) {
7267
0
            opj_event_msg(p_manager, EVT_WARNING,
7268
0
                          "IMF profile require sublevel <= %d for mainlevel = %d.\n"
7269
0
                          "-> %d is thus not compliant\n"
7270
0
                          "-> Non-IMF codestream will be generated\n",
7271
0
                          tabMaxSubLevelFromMainLevel[mainlevel],
7272
0
                          mainlevel,
7273
0
                          sublevel);
7274
0
            ret = OPJ_FALSE;
7275
0
        }
7276
0
    }
7277
7278
    /* Number of components */
7279
0
    if (image->numcomps > 3) {
7280
0
        opj_event_msg(p_manager, EVT_WARNING,
7281
0
                      "IMF profiles require at most 3 components.\n"
7282
0
                      "-> Number of components of input image (%d) is not compliant\n"
7283
0
                      "-> Non-IMF codestream will be generated\n",
7284
0
                      image->numcomps);
7285
0
        ret = OPJ_FALSE;
7286
0
    }
7287
7288
0
    if (image->x0 != 0 || image->y0 != 0) {
7289
0
        opj_event_msg(p_manager, EVT_WARNING,
7290
0
                      "IMF profiles require image origin to be at 0,0.\n"
7291
0
                      "-> %d,%d is not compliant\n"
7292
0
                      "-> Non-IMF codestream will be generated\n",
7293
0
                      image->x0, image->y0 != 0);
7294
0
        ret = OPJ_FALSE;
7295
0
    }
7296
7297
0
    if (parameters->cp_tx0 != 0 || parameters->cp_ty0 != 0) {
7298
0
        opj_event_msg(p_manager, EVT_WARNING,
7299
0
                      "IMF profiles require tile origin to be at 0,0.\n"
7300
0
                      "-> %d,%d is not compliant\n"
7301
0
                      "-> Non-IMF codestream will be generated\n",
7302
0
                      parameters->cp_tx0, parameters->cp_ty0);
7303
0
        ret = OPJ_FALSE;
7304
0
    }
7305
7306
0
    if (parameters->tile_size_on) {
7307
0
        if (profile == OPJ_PROFILE_IMF_2K ||
7308
0
                profile == OPJ_PROFILE_IMF_4K ||
7309
0
                profile == OPJ_PROFILE_IMF_8K) {
7310
0
            if ((OPJ_UINT32)parameters->cp_tdx < image->x1 ||
7311
0
                    (OPJ_UINT32)parameters->cp_tdy < image->y1) {
7312
0
                opj_event_msg(p_manager, EVT_WARNING,
7313
0
                              "IMF 2K/4K/8K single tile profiles require tile to be greater or equal to image size.\n"
7314
0
                              "-> %d,%d is lesser than %d,%d\n"
7315
0
                              "-> Non-IMF codestream will be generated\n",
7316
0
                              parameters->cp_tdx,
7317
0
                              parameters->cp_tdy,
7318
0
                              image->x1,
7319
0
                              image->y1);
7320
0
                ret = OPJ_FALSE;
7321
0
            }
7322
0
        } else {
7323
0
            if ((OPJ_UINT32)parameters->cp_tdx >= image->x1 &&
7324
0
                    (OPJ_UINT32)parameters->cp_tdy >= image->y1) {
7325
                /* ok */
7326
0
            } else if (parameters->cp_tdx == 1024 &&
7327
0
                       parameters->cp_tdy == 1024) {
7328
                /* ok */
7329
0
            } else if (parameters->cp_tdx == 2048 &&
7330
0
                       parameters->cp_tdy == 2048 &&
7331
0
                       (profile == OPJ_PROFILE_IMF_4K ||
7332
0
                        profile == OPJ_PROFILE_IMF_8K)) {
7333
                /* ok */
7334
0
            } else if (parameters->cp_tdx == 4096 &&
7335
0
                       parameters->cp_tdy == 4096 &&
7336
0
                       profile == OPJ_PROFILE_IMF_8K) {
7337
                /* ok */
7338
0
            } else {
7339
0
                opj_event_msg(p_manager, EVT_WARNING,
7340
0
                              "IMF 2K_R/4K_R/8K_R single/multiple tile profiles "
7341
0
                              "require tile to be greater or equal to image size,\n"
7342
0
                              "or to be (1024,1024), or (2048,2048) for 4K_R/8K_R "
7343
0
                              "or (4096,4096) for 8K_R.\n"
7344
0
                              "-> %d,%d is non conformant\n"
7345
0
                              "-> Non-IMF codestream will be generated\n",
7346
0
                              parameters->cp_tdx,
7347
0
                              parameters->cp_tdy);
7348
0
                ret = OPJ_FALSE;
7349
0
            }
7350
0
        }
7351
0
    }
7352
7353
    /* Bitdepth */
7354
0
    for (i = 0; i < image->numcomps; i++) {
7355
0
        if (!(image->comps[i].prec >= 8 && image->comps[i].prec <= 16) ||
7356
0
                (image->comps[i].sgnd)) {
7357
0
            char signed_str[] = "signed";
7358
0
            char unsigned_str[] = "unsigned";
7359
0
            char *tmp_str = image->comps[i].sgnd ? signed_str : unsigned_str;
7360
0
            opj_event_msg(p_manager, EVT_WARNING,
7361
0
                          "IMF profiles require precision of each component to b in [8-16] bits unsigned"
7362
0
                          "-> At least component %d of input image (%d bits, %s) is not compliant\n"
7363
0
                          "-> Non-IMF codestream will be generated\n",
7364
0
                          i, image->comps[i].prec, tmp_str);
7365
0
            ret = OPJ_FALSE;
7366
0
        }
7367
0
    }
7368
7369
    /* Sub-sampling */
7370
0
    for (i = 0; i < image->numcomps; i++) {
7371
0
        if (i == 0 && image->comps[i].dx != 1) {
7372
0
            opj_event_msg(p_manager, EVT_WARNING,
7373
0
                          "IMF profiles require XRSiz1 == 1. Here it is set to %d.\n"
7374
0
                          "-> Non-IMF codestream will be generated\n",
7375
0
                          image->comps[i].dx);
7376
0
            ret = OPJ_FALSE;
7377
0
        }
7378
0
        if (i == 1 && image->comps[i].dx != 1 && image->comps[i].dx != 2) {
7379
0
            opj_event_msg(p_manager, EVT_WARNING,
7380
0
                          "IMF profiles require XRSiz2 == 1 or 2. Here it is set to %d.\n"
7381
0
                          "-> Non-IMF codestream will be generated\n",
7382
0
                          image->comps[i].dx);
7383
0
            ret = OPJ_FALSE;
7384
0
        }
7385
0
        if (i > 1 && image->comps[i].dx != image->comps[i - 1].dx) {
7386
0
            opj_event_msg(p_manager, EVT_WARNING,
7387
0
                          "IMF profiles require XRSiz%d to be the same as XRSiz2. "
7388
0
                          "Here it is set to %d instead of %d.\n"
7389
0
                          "-> Non-IMF codestream will be generated\n",
7390
0
                          i + 1, image->comps[i].dx, image->comps[i - 1].dx);
7391
0
            ret = OPJ_FALSE;
7392
0
        }
7393
0
        if (image->comps[i].dy != 1) {
7394
0
            opj_event_msg(p_manager, EVT_WARNING,
7395
0
                          "IMF profiles require YRsiz == 1. "
7396
0
                          "Here it is set to %d for component %d.\n"
7397
0
                          "-> Non-IMF codestream will be generated\n",
7398
0
                          image->comps[i].dy, i);
7399
0
            ret = OPJ_FALSE;
7400
0
        }
7401
0
    }
7402
7403
    /* Image size */
7404
0
    switch (profile) {
7405
0
    case OPJ_PROFILE_IMF_2K:
7406
0
    case OPJ_PROFILE_IMF_2K_R:
7407
0
        if (((image->comps[0].w > 2048) | (image->comps[0].h > 1556))) {
7408
0
            opj_event_msg(p_manager, EVT_WARNING,
7409
0
                          "IMF 2K/2K_R profile require:\n"
7410
0
                          "width <= 2048 and height <= 1556\n"
7411
0
                          "-> Input image size %d x %d is not compliant\n"
7412
0
                          "-> Non-IMF codestream will be generated\n",
7413
0
                          image->comps[0].w, image->comps[0].h);
7414
0
            ret = OPJ_FALSE;
7415
0
        }
7416
0
        break;
7417
0
    case OPJ_PROFILE_IMF_4K:
7418
0
    case OPJ_PROFILE_IMF_4K_R:
7419
0
        if (((image->comps[0].w > 4096) | (image->comps[0].h > 3112))) {
7420
0
            opj_event_msg(p_manager, EVT_WARNING,
7421
0
                          "IMF 4K/4K_R profile require:\n"
7422
0
                          "width <= 4096 and height <= 3112\n"
7423
0
                          "-> Input image size %d x %d is not compliant\n"
7424
0
                          "-> Non-IMF codestream will be generated\n",
7425
0
                          image->comps[0].w, image->comps[0].h);
7426
0
            ret = OPJ_FALSE;
7427
0
        }
7428
0
        break;
7429
0
    case OPJ_PROFILE_IMF_8K:
7430
0
    case OPJ_PROFILE_IMF_8K_R:
7431
0
        if (((image->comps[0].w > 8192) | (image->comps[0].h > 6224))) {
7432
0
            opj_event_msg(p_manager, EVT_WARNING,
7433
0
                          "IMF 8K/8K_R profile require:\n"
7434
0
                          "width <= 8192 and height <= 6224\n"
7435
0
                          "-> Input image size %d x %d is not compliant\n"
7436
0
                          "-> Non-IMF codestream will be generated\n",
7437
0
                          image->comps[0].w, image->comps[0].h);
7438
0
            ret = OPJ_FALSE;
7439
0
        }
7440
0
        break;
7441
0
    default :
7442
0
        assert(0);
7443
0
        return OPJ_FALSE;
7444
0
    }
7445
7446
0
    if (parameters->roi_compno != -1) {
7447
0
        opj_event_msg(p_manager, EVT_WARNING,
7448
0
                      "IMF profile forbid RGN / region of interest marker.\n"
7449
0
                      "-> Compression parameters specify a ROI\n"
7450
0
                      "-> Non-IMF codestream will be generated\n");
7451
0
        ret = OPJ_FALSE;
7452
0
    }
7453
7454
0
    if (parameters->cblockw_init != 32 || parameters->cblockh_init != 32) {
7455
0
        opj_event_msg(p_manager, EVT_WARNING,
7456
0
                      "IMF profile require code block size to be 32x32.\n"
7457
0
                      "-> Compression parameters set it to %dx%d.\n"
7458
0
                      "-> Non-IMF codestream will be generated\n",
7459
0
                      parameters->cblockw_init,
7460
0
                      parameters->cblockh_init);
7461
0
        ret = OPJ_FALSE;
7462
0
    }
7463
7464
0
    if (parameters->prog_order != OPJ_CPRL) {
7465
0
        opj_event_msg(p_manager, EVT_WARNING,
7466
0
                      "IMF profile require progression order to be CPRL.\n"
7467
0
                      "-> Compression parameters set it to %d.\n"
7468
0
                      "-> Non-IMF codestream will be generated\n",
7469
0
                      parameters->prog_order);
7470
0
        ret = OPJ_FALSE;
7471
0
    }
7472
7473
0
    if (parameters->numpocs != 0) {
7474
0
        opj_event_msg(p_manager, EVT_WARNING,
7475
0
                      "IMF profile forbid POC markers.\n"
7476
0
                      "-> Compression parameters set %d POC.\n"
7477
0
                      "-> Non-IMF codestream will be generated\n",
7478
0
                      parameters->numpocs);
7479
0
        ret = OPJ_FALSE;
7480
0
    }
7481
7482
    /* Codeblock style: no mode switch enabled */
7483
0
    if (parameters->mode != 0) {
7484
0
        opj_event_msg(p_manager, EVT_WARNING,
7485
0
                      "IMF profile forbid mode switch in code block style.\n"
7486
0
                      "-> Compression parameters set code block style to %d.\n"
7487
0
                      "-> Non-IMF codestream will be generated\n",
7488
0
                      parameters->mode);
7489
0
        ret = OPJ_FALSE;
7490
0
    }
7491
7492
0
    if (profile == OPJ_PROFILE_IMF_2K ||
7493
0
            profile == OPJ_PROFILE_IMF_4K ||
7494
0
            profile == OPJ_PROFILE_IMF_8K) {
7495
        /* Expect 9-7 transform */
7496
0
        if (parameters->irreversible != 1) {
7497
0
            opj_event_msg(p_manager, EVT_WARNING,
7498
0
                          "IMF 2K/4K/8K profiles require 9-7 Irreversible Transform.\n"
7499
0
                          "-> Compression parameters set it to reversible.\n"
7500
0
                          "-> Non-IMF codestream will be generated\n");
7501
0
            ret = OPJ_FALSE;
7502
0
        }
7503
0
    } else {
7504
        /* Expect 5-3 transform */
7505
0
        if (parameters->irreversible != 0) {
7506
0
            opj_event_msg(p_manager, EVT_WARNING,
7507
0
                          "IMF 2K/4K/8K profiles require 5-3 reversible Transform.\n"
7508
0
                          "-> Compression parameters set it to irreversible.\n"
7509
0
                          "-> Non-IMF codestream will be generated\n");
7510
0
            ret = OPJ_FALSE;
7511
0
        }
7512
0
    }
7513
7514
    /* Number of layers */
7515
0
    if (parameters->tcp_numlayers != 1) {
7516
0
        opj_event_msg(p_manager, EVT_WARNING,
7517
0
                      "IMF 2K/4K/8K profiles require 1 single quality layer.\n"
7518
0
                      "-> Number of layers is %d.\n"
7519
0
                      "-> Non-IMF codestream will be generated\n",
7520
0
                      parameters->tcp_numlayers);
7521
0
        ret = OPJ_FALSE;
7522
0
    }
7523
7524
    /* Decomposition levels */
7525
0
    switch (profile) {
7526
0
    case OPJ_PROFILE_IMF_2K:
7527
0
        if (!(NL >= 1 && NL <= 5)) {
7528
0
            opj_event_msg(p_manager, EVT_WARNING,
7529
0
                          "IMF 2K profile requires 1 <= NL <= 5:\n"
7530
0
                          "-> Number of decomposition levels is %d.\n"
7531
0
                          "-> Non-IMF codestream will be generated\n",
7532
0
                          NL);
7533
0
            ret = OPJ_FALSE;
7534
0
        }
7535
0
        break;
7536
0
    case OPJ_PROFILE_IMF_4K:
7537
0
        if (!(NL >= 1 && NL <= 6)) {
7538
0
            opj_event_msg(p_manager, EVT_WARNING,
7539
0
                          "IMF 4K profile requires 1 <= NL <= 6:\n"
7540
0
                          "-> Number of decomposition levels is %d.\n"
7541
0
                          "-> Non-IMF codestream will be generated\n",
7542
0
                          NL);
7543
0
            ret = OPJ_FALSE;
7544
0
        }
7545
0
        break;
7546
0
    case OPJ_PROFILE_IMF_8K:
7547
0
        if (!(NL >= 1 && NL <= 7)) {
7548
0
            opj_event_msg(p_manager, EVT_WARNING,
7549
0
                          "IMF 8K profile requires 1 <= NL <= 7:\n"
7550
0
                          "-> Number of decomposition levels is %d.\n"
7551
0
                          "-> Non-IMF codestream will be generated\n",
7552
0
                          NL);
7553
0
            ret = OPJ_FALSE;
7554
0
        }
7555
0
        break;
7556
0
    case OPJ_PROFILE_IMF_2K_R: {
7557
0
        if (XTsiz >= 2048) {
7558
0
            if (!(NL >= 1 && NL <= 5)) {
7559
0
                opj_event_msg(p_manager, EVT_WARNING,
7560
0
                              "IMF 2K_R profile requires 1 <= NL <= 5 for XTsiz >= 2048:\n"
7561
0
                              "-> Number of decomposition levels is %d.\n"
7562
0
                              "-> Non-IMF codestream will be generated\n",
7563
0
                              NL);
7564
0
                ret = OPJ_FALSE;
7565
0
            }
7566
0
        } else if (XTsiz >= 1024) {
7567
0
            if (!(NL >= 1 && NL <= 4)) {
7568
0
                opj_event_msg(p_manager, EVT_WARNING,
7569
0
                              "IMF 2K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7570
0
                              "-> Number of decomposition levels is %d.\n"
7571
0
                              "-> Non-IMF codestream will be generated\n",
7572
0
                              NL);
7573
0
                ret = OPJ_FALSE;
7574
0
            }
7575
0
        }
7576
0
        break;
7577
0
    }
7578
0
    case OPJ_PROFILE_IMF_4K_R: {
7579
0
        if (XTsiz >= 4096) {
7580
0
            if (!(NL >= 1 && NL <= 6)) {
7581
0
                opj_event_msg(p_manager, EVT_WARNING,
7582
0
                              "IMF 4K_R profile requires 1 <= NL <= 6 for XTsiz >= 4096:\n"
7583
0
                              "-> Number of decomposition levels is %d.\n"
7584
0
                              "-> Non-IMF codestream will be generated\n",
7585
0
                              NL);
7586
0
                ret = OPJ_FALSE;
7587
0
            }
7588
0
        } else if (XTsiz >= 2048) {
7589
0
            if (!(NL >= 1 && NL <= 5)) {
7590
0
                opj_event_msg(p_manager, EVT_WARNING,
7591
0
                              "IMF 4K_R profile requires 1 <= NL <= 5 for XTsiz in [2048,4096[:\n"
7592
0
                              "-> Number of decomposition levels is %d.\n"
7593
0
                              "-> Non-IMF codestream will be generated\n",
7594
0
                              NL);
7595
0
                ret = OPJ_FALSE;
7596
0
            }
7597
0
        } else if (XTsiz >= 1024) {
7598
0
            if (!(NL >= 1 && NL <= 4)) {
7599
0
                opj_event_msg(p_manager, EVT_WARNING,
7600
0
                              "IMF 4K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7601
0
                              "-> Number of decomposition levels is %d.\n"
7602
0
                              "-> Non-IMF codestream will be generated\n",
7603
0
                              NL);
7604
0
                ret = OPJ_FALSE;
7605
0
            }
7606
0
        }
7607
0
        break;
7608
0
    }
7609
0
    case OPJ_PROFILE_IMF_8K_R: {
7610
0
        if (XTsiz >= 8192) {
7611
0
            if (!(NL >= 1 && NL <= 7)) {
7612
0
                opj_event_msg(p_manager, EVT_WARNING,
7613
0
                              "IMF 4K_R profile requires 1 <= NL <= 7 for XTsiz >= 8192:\n"
7614
0
                              "-> Number of decomposition levels is %d.\n"
7615
0
                              "-> Non-IMF codestream will be generated\n",
7616
0
                              NL);
7617
0
                ret = OPJ_FALSE;
7618
0
            }
7619
0
        } else if (XTsiz >= 4096) {
7620
0
            if (!(NL >= 1 && NL <= 6)) {
7621
0
                opj_event_msg(p_manager, EVT_WARNING,
7622
0
                              "IMF 4K_R profile requires 1 <= NL <= 6 for XTsiz in [4096,8192[:\n"
7623
0
                              "-> Number of decomposition levels is %d.\n"
7624
0
                              "-> Non-IMF codestream will be generated\n",
7625
0
                              NL);
7626
0
                ret = OPJ_FALSE;
7627
0
            }
7628
0
        } else if (XTsiz >= 2048) {
7629
0
            if (!(NL >= 1 && NL <= 5)) {
7630
0
                opj_event_msg(p_manager, EVT_WARNING,
7631
0
                              "IMF 4K_R profile requires 1 <= NL <= 5 for XTsiz in [2048,4096[:\n"
7632
0
                              "-> Number of decomposition levels is %d.\n"
7633
0
                              "-> Non-IMF codestream will be generated\n",
7634
0
                              NL);
7635
0
                ret = OPJ_FALSE;
7636
0
            }
7637
0
        } else if (XTsiz >= 1024) {
7638
0
            if (!(NL >= 1 && NL <= 4)) {
7639
0
                opj_event_msg(p_manager, EVT_WARNING,
7640
0
                              "IMF 4K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7641
0
                              "-> Number of decomposition levels is %d.\n"
7642
0
                              "-> Non-IMF codestream will be generated\n",
7643
0
                              NL);
7644
0
                ret = OPJ_FALSE;
7645
0
            }
7646
0
        }
7647
0
        break;
7648
0
    }
7649
0
    default:
7650
0
        break;
7651
0
    }
7652
7653
0
    if (parameters->numresolution == 1) {
7654
0
        if (parameters->res_spec != 1 ||
7655
0
                parameters->prcw_init[0] != 128 ||
7656
0
                parameters->prch_init[0] != 128) {
7657
0
            opj_event_msg(p_manager, EVT_WARNING,
7658
0
                          "IMF profiles require PPx = PPy = 7 for NLLL band, else 8.\n"
7659
0
                          "-> Supplied values are different from that.\n"
7660
0
                          "-> Non-IMF codestream will be generated\n");
7661
0
            ret = OPJ_FALSE;
7662
0
        }
7663
0
    } else {
7664
0
        int i;
7665
0
        for (i = 0; i < parameters->res_spec; i++) {
7666
0
            if (parameters->prcw_init[i] != 256 ||
7667
0
                    parameters->prch_init[i] != 256) {
7668
0
                opj_event_msg(p_manager, EVT_WARNING,
7669
0
                              "IMF profiles require PPx = PPy = 7 for NLLL band, else 8.\n"
7670
0
                              "-> Supplied values are different from that.\n"
7671
0
                              "-> Non-IMF codestream will be generated\n");
7672
0
                ret = OPJ_FALSE;
7673
0
            }
7674
0
        }
7675
0
    }
7676
7677
0
    return ret;
7678
0
}
7679
7680
7681
OPJ_BOOL opj_j2k_setup_encoder(opj_j2k_t *p_j2k,
7682
                               opj_cparameters_t *parameters,
7683
                               opj_image_t *image,
7684
                               opj_event_mgr_t * p_manager)
7685
11.0k
{
7686
11.0k
    OPJ_UINT32 i, j, tileno, numpocs_tile;
7687
11.0k
    opj_cp_t *cp = 00;
7688
11.0k
    OPJ_UINT32 cblkw, cblkh;
7689
7690
11.0k
    if (!p_j2k || !parameters || ! image) {
7691
0
        return OPJ_FALSE;
7692
0
    }
7693
7694
11.0k
    if ((parameters->numresolution <= 0) ||
7695
11.0k
            (parameters->numresolution > OPJ_J2K_MAXRLVLS)) {
7696
0
        opj_event_msg(p_manager, EVT_ERROR,
7697
0
                      "Invalid number of resolutions : %d not in range [1,%d]\n",
7698
0
                      parameters->numresolution, OPJ_J2K_MAXRLVLS);
7699
0
        return OPJ_FALSE;
7700
0
    }
7701
7702
11.0k
    if (parameters->cblockw_init < 4 || parameters->cblockw_init > 1024) {
7703
0
        opj_event_msg(p_manager, EVT_ERROR,
7704
0
                      "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7705
0
                      parameters->cblockw_init);
7706
0
        return OPJ_FALSE;
7707
0
    }
7708
11.0k
    if (parameters->cblockh_init < 4 || parameters->cblockh_init > 1024) {
7709
0
        opj_event_msg(p_manager, EVT_ERROR,
7710
0
                      "Invalid value for cblockh_init: %d not a power of 2 not in range [4,1024]\n",
7711
0
                      parameters->cblockh_init);
7712
0
        return OPJ_FALSE;
7713
0
    }
7714
11.0k
    if (parameters->cblockw_init * parameters->cblockh_init > 4096) {
7715
0
        opj_event_msg(p_manager, EVT_ERROR,
7716
0
                      "Invalid value for cblockw_init * cblockh_init: should be <= 4096\n");
7717
0
        return OPJ_FALSE;
7718
0
    }
7719
11.0k
    cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
7720
11.0k
    cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
7721
11.0k
    if (parameters->cblockw_init != (1 << cblkw)) {
7722
0
        opj_event_msg(p_manager, EVT_ERROR,
7723
0
                      "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7724
0
                      parameters->cblockw_init);
7725
0
        return OPJ_FALSE;
7726
0
    }
7727
11.0k
    if (parameters->cblockh_init != (1 << cblkh)) {
7728
0
        opj_event_msg(p_manager, EVT_ERROR,
7729
0
                      "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7730
0
                      parameters->cblockh_init);
7731
0
        return OPJ_FALSE;
7732
0
    }
7733
7734
11.0k
    if (parameters->cp_fixed_alloc) {
7735
0
        if (parameters->cp_matrice == NULL) {
7736
0
            opj_event_msg(p_manager, EVT_ERROR,
7737
0
                          "cp_fixed_alloc set, but cp_matrice missing\n");
7738
0
            return OPJ_FALSE;
7739
0
        }
7740
7741
0
        if (parameters->tcp_numlayers > J2K_TCD_MATRIX_MAX_LAYER_COUNT) {
7742
0
            opj_event_msg(p_manager, EVT_ERROR,
7743
0
                          "tcp_numlayers when cp_fixed_alloc set should not exceed %d\n",
7744
0
                          J2K_TCD_MATRIX_MAX_LAYER_COUNT);
7745
0
            return OPJ_FALSE;
7746
0
        }
7747
0
        if (parameters->numresolution > J2K_TCD_MATRIX_MAX_RESOLUTION_COUNT) {
7748
0
            opj_event_msg(p_manager, EVT_ERROR,
7749
0
                          "numresolution when cp_fixed_alloc set should not exceed %d\n",
7750
0
                          J2K_TCD_MATRIX_MAX_RESOLUTION_COUNT);
7751
0
            return OPJ_FALSE;
7752
0
        }
7753
0
    }
7754
7755
11.0k
    p_j2k->m_specific_param.m_encoder.m_nb_comps = image->numcomps;
7756
7757
    /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
7758
11.0k
    cp = &(p_j2k->m_cp);
7759
7760
    /* set default values for cp */
7761
11.0k
    cp->tw = 1;
7762
11.0k
    cp->th = 1;
7763
7764
    /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */
7765
11.0k
    if (parameters->rsiz ==
7766
11.0k
            OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */
7767
9.95k
        OPJ_BOOL deprecated_used = OPJ_FALSE;
7768
9.95k
        switch (parameters->cp_cinema) {
7769
0
        case OPJ_CINEMA2K_24:
7770
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7771
0
            parameters->max_cs_size = OPJ_CINEMA_24_CS;
7772
0
            parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7773
0
            deprecated_used = OPJ_TRUE;
7774
0
            break;
7775
0
        case OPJ_CINEMA2K_48:
7776
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7777
0
            parameters->max_cs_size = OPJ_CINEMA_48_CS;
7778
0
            parameters->max_comp_size = OPJ_CINEMA_48_COMP;
7779
0
            deprecated_used = OPJ_TRUE;
7780
0
            break;
7781
0
        case OPJ_CINEMA4K_24:
7782
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
7783
0
            parameters->max_cs_size = OPJ_CINEMA_24_CS;
7784
0
            parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7785
0
            deprecated_used = OPJ_TRUE;
7786
0
            break;
7787
9.95k
        case OPJ_OFF:
7788
9.95k
        default:
7789
9.95k
            break;
7790
9.95k
        }
7791
9.95k
        switch (parameters->cp_rsiz) {
7792
0
        case OPJ_CINEMA2K:
7793
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7794
0
            deprecated_used = OPJ_TRUE;
7795
0
            break;
7796
0
        case OPJ_CINEMA4K:
7797
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
7798
0
            deprecated_used = OPJ_TRUE;
7799
0
            break;
7800
0
        case OPJ_MCT:
7801
0
            parameters->rsiz = OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT;
7802
0
            deprecated_used = OPJ_TRUE;
7803
9.95k
        case OPJ_STD_RSIZ:
7804
9.95k
        default:
7805
9.95k
            break;
7806
9.95k
        }
7807
9.95k
        if (deprecated_used) {
7808
0
            opj_event_msg(p_manager, EVT_WARNING,
7809
0
                          "Deprecated fields cp_cinema or cp_rsiz are used\n"
7810
0
                          "Please consider using only the rsiz field\n"
7811
0
                          "See openjpeg.h documentation for more details\n");
7812
0
        }
7813
9.95k
    }
7814
7815
    /* If no explicit layers are provided, use lossless settings */
7816
11.0k
    if (parameters->tcp_numlayers == 0) {
7817
0
        parameters->tcp_numlayers = 1;
7818
0
        parameters->cp_disto_alloc = 1;
7819
0
        parameters->tcp_rates[0] = 0;
7820
0
    }
7821
7822
11.0k
    if (parameters->cp_disto_alloc) {
7823
        /* Emit warnings if tcp_rates are not decreasing */
7824
11.0k
        for (i = 1; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7825
0
            OPJ_FLOAT32 rate_i_corr = parameters->tcp_rates[i];
7826
0
            OPJ_FLOAT32 rate_i_m_1_corr = parameters->tcp_rates[i - 1];
7827
0
            if (rate_i_corr <= 1.0) {
7828
0
                rate_i_corr = 1.0;
7829
0
            }
7830
0
            if (rate_i_m_1_corr <= 1.0) {
7831
0
                rate_i_m_1_corr = 1.0;
7832
0
            }
7833
0
            if (rate_i_corr >= rate_i_m_1_corr) {
7834
0
                if (rate_i_corr != parameters->tcp_rates[i] &&
7835
0
                        rate_i_m_1_corr != parameters->tcp_rates[i - 1]) {
7836
0
                    opj_event_msg(p_manager, EVT_WARNING,
7837
0
                                  "tcp_rates[%d]=%f (corrected as %f) should be strictly lesser "
7838
0
                                  "than tcp_rates[%d]=%f (corrected as %f)\n",
7839
0
                                  i, parameters->tcp_rates[i], rate_i_corr,
7840
0
                                  i - 1, parameters->tcp_rates[i - 1], rate_i_m_1_corr);
7841
0
                } else if (rate_i_corr != parameters->tcp_rates[i]) {
7842
0
                    opj_event_msg(p_manager, EVT_WARNING,
7843
0
                                  "tcp_rates[%d]=%f (corrected as %f) should be strictly lesser "
7844
0
                                  "than tcp_rates[%d]=%f\n",
7845
0
                                  i, parameters->tcp_rates[i], rate_i_corr,
7846
0
                                  i - 1, parameters->tcp_rates[i - 1]);
7847
0
                } else if (rate_i_m_1_corr != parameters->tcp_rates[i - 1]) {
7848
0
                    opj_event_msg(p_manager, EVT_WARNING,
7849
0
                                  "tcp_rates[%d]=%f should be strictly lesser "
7850
0
                                  "than tcp_rates[%d]=%f (corrected as %f)\n",
7851
0
                                  i, parameters->tcp_rates[i],
7852
0
                                  i - 1, parameters->tcp_rates[i - 1], rate_i_m_1_corr);
7853
0
                } else {
7854
0
                    opj_event_msg(p_manager, EVT_WARNING,
7855
0
                                  "tcp_rates[%d]=%f should be strictly lesser "
7856
0
                                  "than tcp_rates[%d]=%f\n",
7857
0
                                  i, parameters->tcp_rates[i],
7858
0
                                  i - 1, parameters->tcp_rates[i - 1]);
7859
0
                }
7860
0
            }
7861
0
        }
7862
11.0k
    } else if (parameters->cp_fixed_quality) {
7863
        /* Emit warnings if tcp_distoratio are not increasing */
7864
0
        for (i = 1; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7865
0
            if (parameters->tcp_distoratio[i] < parameters->tcp_distoratio[i - 1] &&
7866
0
                    !(i == (OPJ_UINT32)parameters->tcp_numlayers - 1 &&
7867
0
                      parameters->tcp_distoratio[i] == 0)) {
7868
0
                opj_event_msg(p_manager, EVT_WARNING,
7869
0
                              "tcp_distoratio[%d]=%f should be strictly greater "
7870
0
                              "than tcp_distoratio[%d]=%f\n",
7871
0
                              i, parameters->tcp_distoratio[i], i - 1,
7872
0
                              parameters->tcp_distoratio[i - 1]);
7873
0
            }
7874
0
        }
7875
0
    }
7876
7877
    /* see if max_codestream_size does limit input rate */
7878
11.0k
    if (parameters->max_cs_size <= 0) {
7879
9.95k
        if (parameters->tcp_rates[parameters->tcp_numlayers - 1] > 0) {
7880
0
            OPJ_FLOAT32 temp_size;
7881
0
            temp_size = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
7882
0
                                       image->comps[0].h * image->comps[0].prec) /
7883
0
                                      ((double)parameters->tcp_rates[parameters->tcp_numlayers - 1] * 8 *
7884
0
                                       image->comps[0].dx * image->comps[0].dy));
7885
0
            if (temp_size > (OPJ_FLOAT32)INT_MAX) {
7886
0
                parameters->max_cs_size = INT_MAX;
7887
0
            } else {
7888
0
                parameters->max_cs_size = (int) floor(temp_size);
7889
0
            }
7890
9.95k
        } else {
7891
9.95k
            parameters->max_cs_size = 0;
7892
9.95k
        }
7893
9.95k
    } else {
7894
1.05k
        OPJ_FLOAT32 temp_rate;
7895
1.05k
        OPJ_BOOL cap = OPJ_FALSE;
7896
7897
1.05k
        if (OPJ_IS_IMF(parameters->rsiz) && parameters->max_cs_size > 0 &&
7898
0
                parameters->tcp_numlayers == 1 && parameters->tcp_rates[0] == 0) {
7899
0
            parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
7900
0
                                       image->comps[0].h * image->comps[0].prec) /
7901
0
                                       (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
7902
0
                                               image->comps[0].dy);
7903
0
        }
7904
7905
1.05k
        temp_rate = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
7906
1.05k
                                   image->comps[0].h * image->comps[0].prec) /
7907
1.05k
                                  (((double)parameters->max_cs_size) * 8 * image->comps[0].dx *
7908
1.05k
                                   image->comps[0].dy));
7909
2.10k
        for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7910
1.05k
            if (parameters->tcp_rates[i] < temp_rate) {
7911
0
                parameters->tcp_rates[i] = temp_rate;
7912
0
                cap = OPJ_TRUE;
7913
0
            }
7914
1.05k
        }
7915
1.05k
        if (cap) {
7916
0
            opj_event_msg(p_manager, EVT_WARNING,
7917
0
                          "The desired maximum codestream size has limited\n"
7918
0
                          "at least one of the desired quality layers\n");
7919
0
        }
7920
1.05k
    }
7921
7922
11.0k
    if (OPJ_IS_CINEMA(parameters->rsiz) || OPJ_IS_IMF(parameters->rsiz)) {
7923
1.05k
        p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_TRUE;
7924
1.05k
    }
7925
7926
    /* Manage profiles and applications and set RSIZ */
7927
    /* set cinema parameters if required */
7928
11.0k
    if (OPJ_IS_CINEMA(parameters->rsiz)) {
7929
1.05k
        if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K)
7930
1.05k
                || (parameters->rsiz == OPJ_PROFILE_CINEMA_S4K)) {
7931
0
            opj_event_msg(p_manager, EVT_WARNING,
7932
0
                          "JPEG 2000 Scalable Digital Cinema profiles not yet supported\n");
7933
0
            parameters->rsiz = OPJ_PROFILE_NONE;
7934
1.05k
        } else {
7935
1.05k
            opj_j2k_set_cinema_parameters(parameters, image, p_manager);
7936
1.05k
            if (!opj_j2k_is_cinema_compliant(image, parameters->rsiz, p_manager)) {
7937
1.05k
                parameters->rsiz = OPJ_PROFILE_NONE;
7938
1.05k
            }
7939
1.05k
        }
7940
9.95k
    } else if (OPJ_IS_STORAGE(parameters->rsiz)) {
7941
0
        opj_event_msg(p_manager, EVT_WARNING,
7942
0
                      "JPEG 2000 Long Term Storage profile not yet supported\n");
7943
0
        parameters->rsiz = OPJ_PROFILE_NONE;
7944
9.95k
    } else if (OPJ_IS_BROADCAST(parameters->rsiz)) {
7945
0
        opj_event_msg(p_manager, EVT_WARNING,
7946
0
                      "JPEG 2000 Broadcast profiles not yet supported\n");
7947
0
        parameters->rsiz = OPJ_PROFILE_NONE;
7948
9.95k
    } else if (OPJ_IS_IMF(parameters->rsiz)) {
7949
0
        opj_j2k_set_imf_parameters(parameters, image, p_manager);
7950
0
        if (!opj_j2k_is_imf_compliant(parameters, image, p_manager)) {
7951
0
            parameters->rsiz = OPJ_PROFILE_NONE;
7952
0
        }
7953
9.95k
    } else if (OPJ_IS_PART2(parameters->rsiz)) {
7954
0
        if (parameters->rsiz == ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_NONE))) {
7955
0
            opj_event_msg(p_manager, EVT_WARNING,
7956
0
                          "JPEG 2000 Part-2 profile defined\n"
7957
0
                          "but no Part-2 extension enabled.\n"
7958
0
                          "Profile set to NONE.\n");
7959
0
            parameters->rsiz = OPJ_PROFILE_NONE;
7960
0
        } else if (parameters->rsiz != ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT))) {
7961
0
            opj_event_msg(p_manager, EVT_WARNING,
7962
0
                          "Unsupported Part-2 extension enabled\n"
7963
0
                          "Profile set to NONE.\n");
7964
0
            parameters->rsiz = OPJ_PROFILE_NONE;
7965
0
        }
7966
0
    }
7967
7968
    /*
7969
    copy user encoding parameters
7970
    */
7971
11.0k
    cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)
7972
11.0k
            parameters->max_comp_size;
7973
11.0k
    cp->rsiz = parameters->rsiz;
7974
11.0k
    if (parameters->cp_fixed_alloc) {
7975
0
        cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy = FIXED_LAYER;
7976
11.0k
    } else if (parameters->cp_fixed_quality) {
7977
0
        cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy =
7978
0
            FIXED_DISTORTION_RATIO;
7979
11.0k
    } else {
7980
11.0k
        cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy =
7981
11.0k
            RATE_DISTORTION_RATIO;
7982
11.0k
    }
7983
7984
11.0k
    if (parameters->cp_fixed_alloc) {
7985
0
        size_t array_size = (size_t)parameters->tcp_numlayers *
7986
0
                            (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
7987
0
        cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
7988
0
        if (!cp->m_specific_param.m_enc.m_matrice) {
7989
0
            opj_event_msg(p_manager, EVT_ERROR,
7990
0
                          "Not enough memory to allocate copy of user encoding parameters matrix \n");
7991
0
            return OPJ_FALSE;
7992
0
        }
7993
0
        memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice,
7994
0
               array_size);
7995
0
    }
7996
7997
    /* tiles */
7998
11.0k
    cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
7999
11.0k
    cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
8000
8001
    /* tile offset */
8002
11.0k
    cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
8003
11.0k
    cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
8004
8005
    /* comment string */
8006
11.0k
    if (parameters->cp_comment) {
8007
0
        cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1U);
8008
0
        if (!cp->comment) {
8009
0
            opj_event_msg(p_manager, EVT_ERROR,
8010
0
                          "Not enough memory to allocate copy of comment string\n");
8011
0
            return OPJ_FALSE;
8012
0
        }
8013
0
        strcpy(cp->comment, parameters->cp_comment);
8014
11.0k
    } else {
8015
        /* Create default comment for codestream */
8016
11.0k
        const char comment[] = "Created by OpenJPEG version ";
8017
11.0k
        const size_t clen = strlen(comment);
8018
11.0k
        const char *version = opj_version();
8019
8020
        /* UniPG>> */
8021
#ifdef USE_JPWL
8022
        const size_t cp_comment_buf_size = clen + strlen(version) + 11;
8023
        cp->comment = (char*)opj_malloc(cp_comment_buf_size);
8024
        if (!cp->comment) {
8025
            opj_event_msg(p_manager, EVT_ERROR,
8026
                          "Not enough memory to allocate comment string\n");
8027
            return OPJ_FALSE;
8028
        }
8029
        snprintf(cp->comment, cp_comment_buf_size, "%s%s with JPWL",
8030
                 comment, version);
8031
#else
8032
11.0k
        const size_t cp_comment_buf_size = clen + strlen(version) + 1;
8033
11.0k
        cp->comment = (char*)opj_malloc(cp_comment_buf_size);
8034
11.0k
        if (!cp->comment) {
8035
0
            opj_event_msg(p_manager, EVT_ERROR,
8036
0
                          "Not enough memory to allocate comment string\n");
8037
0
            return OPJ_FALSE;
8038
0
        }
8039
11.0k
        snprintf(cp->comment, cp_comment_buf_size, "%s%s", comment, version);
8040
11.0k
#endif
8041
        /* <<UniPG */
8042
11.0k
    }
8043
8044
    /*
8045
    calculate other encoding parameters
8046
    */
8047
8048
11.0k
    if (parameters->tile_size_on) {
8049
0
        if (cp->tdx == 0) {
8050
0
            opj_event_msg(p_manager, EVT_ERROR, "Invalid tile width\n");
8051
0
            return OPJ_FALSE;
8052
0
        }
8053
0
        if (cp->tdy == 0) {
8054
0
            opj_event_msg(p_manager, EVT_ERROR, "Invalid tile height\n");
8055
0
            return OPJ_FALSE;
8056
0
        }
8057
0
        cp->tw = opj_uint_ceildiv(image->x1 - cp->tx0, cp->tdx);
8058
0
        cp->th = opj_uint_ceildiv(image->y1 - cp->ty0, cp->tdy);
8059
        /* Check that the number of tiles is valid */
8060
0
        if (cp->tw > 65535 / cp->th) {
8061
0
            opj_event_msg(p_manager, EVT_ERROR,
8062
0
                          "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
8063
0
                          cp->tw, cp->th);
8064
0
            return OPJ_FALSE;
8065
0
        }
8066
11.0k
    } else {
8067
11.0k
        cp->tdx = image->x1 - cp->tx0;
8068
11.0k
        cp->tdy = image->y1 - cp->ty0;
8069
11.0k
    }
8070
8071
11.0k
    if (parameters->tp_on) {
8072
1.05k
        cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
8073
1.05k
        cp->m_specific_param.m_enc.m_tp_on = 1;
8074
1.05k
    }
8075
8076
#ifdef USE_JPWL
8077
    /*
8078
    calculate JPWL encoding parameters
8079
    */
8080
8081
    if (parameters->jpwl_epc_on) {
8082
        OPJ_INT32 i;
8083
8084
        /* set JPWL on */
8085
        cp->epc_on = OPJ_TRUE;
8086
        cp->info_on = OPJ_FALSE; /* no informative technique */
8087
8088
        /* set EPB on */
8089
        if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
8090
            cp->epb_on = OPJ_TRUE;
8091
8092
            cp->hprot_MH = parameters->jpwl_hprot_MH;
8093
            for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
8094
                cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
8095
                cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
8096
            }
8097
            /* if tile specs are not specified, copy MH specs */
8098
            if (cp->hprot_TPH[0] == -1) {
8099
                cp->hprot_TPH_tileno[0] = 0;
8100
                cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
8101
            }
8102
            for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
8103
                cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
8104
                cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
8105
                cp->pprot[i] = parameters->jpwl_pprot[i];
8106
            }
8107
        }
8108
8109
        /* set ESD writing */
8110
        if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
8111
            cp->esd_on = OPJ_TRUE;
8112
8113
            cp->sens_size = parameters->jpwl_sens_size;
8114
            cp->sens_addr = parameters->jpwl_sens_addr;
8115
            cp->sens_range = parameters->jpwl_sens_range;
8116
8117
            cp->sens_MH = parameters->jpwl_sens_MH;
8118
            for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
8119
                cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
8120
                cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
8121
            }
8122
        }
8123
8124
        /* always set RED writing to false: we are at the encoder */
8125
        cp->red_on = OPJ_FALSE;
8126
8127
    } else {
8128
        cp->epc_on = OPJ_FALSE;
8129
    }
8130
#endif /* USE_JPWL */
8131
8132
    /* initialize the multiple tiles */
8133
    /* ---------------------------- */
8134
11.0k
    cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
8135
11.0k
    if (!cp->tcps) {
8136
0
        opj_event_msg(p_manager, EVT_ERROR,
8137
0
                      "Not enough memory to allocate tile coding parameters\n");
8138
0
        return OPJ_FALSE;
8139
0
    }
8140
8141
22.0k
    for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
8142
11.0k
        opj_tcp_t *tcp = &cp->tcps[tileno];
8143
11.0k
        const OPJ_BOOL fixed_distoratio =
8144
11.0k
            cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy ==
8145
11.0k
            FIXED_DISTORTION_RATIO;
8146
11.0k
        tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
8147
8148
22.0k
        for (j = 0; j < tcp->numlayers; j++) {
8149
11.0k
            if (OPJ_IS_CINEMA(cp->rsiz) || OPJ_IS_IMF(cp->rsiz)) {
8150
0
                if (fixed_distoratio) {
8151
0
                    tcp->distoratio[j] = parameters->tcp_distoratio[j];
8152
0
                }
8153
0
                tcp->rates[j] = parameters->tcp_rates[j];
8154
11.0k
            } else {
8155
11.0k
                if (fixed_distoratio) {
8156
0
                    tcp->distoratio[j] = parameters->tcp_distoratio[j];
8157
11.0k
                } else {
8158
11.0k
                    tcp->rates[j] = parameters->tcp_rates[j];
8159
11.0k
                }
8160
11.0k
            }
8161
11.0k
            if (!fixed_distoratio &&
8162
11.0k
                    tcp->rates[j] <= 1.0) {
8163
10.1k
                tcp->rates[j] = 0.0;    /* force lossless */
8164
10.1k
            }
8165
11.0k
        }
8166
8167
11.0k
        tcp->csty = (OPJ_UINT32)parameters->csty;
8168
11.0k
        tcp->prg = parameters->prog_order;
8169
11.0k
        tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
8170
8171
11.0k
        numpocs_tile = 0;
8172
11.0k
        tcp->POC = 0;
8173
8174
11.0k
        if (parameters->numpocs) {
8175
            /* initialisation of POC */
8176
0
            for (i = 0; i < parameters->numpocs; i++) {
8177
0
                if (tileno + 1 == parameters->POC[i].tile)  {
8178
0
                    opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
8179
8180
0
                    if (parameters->POC[numpocs_tile].compno0 >= image->numcomps) {
8181
0
                        opj_event_msg(p_manager, EVT_ERROR,
8182
0
                                      "Invalid compno0 for POC %d\n", i);
8183
0
                        return OPJ_FALSE;
8184
0
                    }
8185
8186
0
                    tcp_poc->resno0         = parameters->POC[numpocs_tile].resno0;
8187
0
                    tcp_poc->compno0        = parameters->POC[numpocs_tile].compno0;
8188
0
                    tcp_poc->layno1         = parameters->POC[numpocs_tile].layno1;
8189
0
                    tcp_poc->resno1         = parameters->POC[numpocs_tile].resno1;
8190
0
                    tcp_poc->compno1        = opj_uint_min(parameters->POC[numpocs_tile].compno1,
8191
0
                                                           image->numcomps);
8192
0
                    tcp_poc->prg1           = parameters->POC[numpocs_tile].prg1;
8193
0
                    tcp_poc->tile           = parameters->POC[numpocs_tile].tile;
8194
8195
0
                    numpocs_tile++;
8196
0
                }
8197
0
            }
8198
8199
0
            if (numpocs_tile) {
8200
8201
                /* TODO MSD use the return value*/
8202
0
                opj_j2k_check_poc_val(parameters->POC, tileno, parameters->numpocs,
8203
0
                                      (OPJ_UINT32)parameters->numresolution, image->numcomps,
8204
0
                                      (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
8205
8206
0
                tcp->POC = 1;
8207
0
                tcp->numpocs = numpocs_tile - 1 ;
8208
0
            }
8209
11.0k
        } else {
8210
11.0k
            tcp->numpocs = 0;
8211
11.0k
        }
8212
8213
11.0k
        tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
8214
11.0k
        if (!tcp->tccps) {
8215
0
            opj_event_msg(p_manager, EVT_ERROR,
8216
0
                          "Not enough memory to allocate tile component coding parameters\n");
8217
0
            return OPJ_FALSE;
8218
0
        }
8219
11.0k
        if (parameters->mct_data) {
8220
8221
0
            OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(
8222
0
                                      OPJ_FLOAT32);
8223
0
            OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8224
0
            OPJ_INT32 * l_dc_shift = (OPJ_INT32 *)((OPJ_BYTE *) parameters->mct_data +
8225
0
                                                   lMctSize);
8226
8227
0
            if (!lTmpBuf) {
8228
0
                opj_event_msg(p_manager, EVT_ERROR,
8229
0
                              "Not enough memory to allocate temp buffer\n");
8230
0
                return OPJ_FALSE;
8231
0
            }
8232
8233
0
            tcp->mct = 2;
8234
0
            tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8235
0
            if (! tcp->m_mct_coding_matrix) {
8236
0
                opj_free(lTmpBuf);
8237
0
                lTmpBuf = NULL;
8238
0
                opj_event_msg(p_manager, EVT_ERROR,
8239
0
                              "Not enough memory to allocate encoder MCT coding matrix \n");
8240
0
                return OPJ_FALSE;
8241
0
            }
8242
0
            memcpy(tcp->m_mct_coding_matrix, parameters->mct_data, lMctSize);
8243
0
            memcpy(lTmpBuf, parameters->mct_data, lMctSize);
8244
8245
0
            tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8246
0
            if (! tcp->m_mct_decoding_matrix) {
8247
0
                opj_free(lTmpBuf);
8248
0
                lTmpBuf = NULL;
8249
0
                opj_event_msg(p_manager, EVT_ERROR,
8250
0
                              "Not enough memory to allocate encoder MCT decoding matrix \n");
8251
0
                return OPJ_FALSE;
8252
0
            }
8253
0
            if (opj_matrix_inversion_f(lTmpBuf, (tcp->m_mct_decoding_matrix),
8254
0
                                       image->numcomps) == OPJ_FALSE) {
8255
0
                opj_free(lTmpBuf);
8256
0
                lTmpBuf = NULL;
8257
0
                opj_event_msg(p_manager, EVT_ERROR,
8258
0
                              "Failed to inverse encoder MCT decoding matrix \n");
8259
0
                return OPJ_FALSE;
8260
0
            }
8261
8262
0
            tcp->mct_norms = (OPJ_FLOAT64*)
8263
0
                             opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
8264
0
            if (! tcp->mct_norms) {
8265
0
                opj_free(lTmpBuf);
8266
0
                lTmpBuf = NULL;
8267
0
                opj_event_msg(p_manager, EVT_ERROR,
8268
0
                              "Not enough memory to allocate encoder MCT norms \n");
8269
0
                return OPJ_FALSE;
8270
0
            }
8271
0
            opj_calculate_norms(tcp->mct_norms, image->numcomps,
8272
0
                                tcp->m_mct_decoding_matrix);
8273
0
            opj_free(lTmpBuf);
8274
8275
0
            for (i = 0; i < image->numcomps; i++) {
8276
0
                opj_tccp_t *tccp = &tcp->tccps[i];
8277
0
                tccp->m_dc_level_shift = l_dc_shift[i];
8278
0
            }
8279
8280
0
            if (opj_j2k_setup_mct_encoding(tcp, image) == OPJ_FALSE) {
8281
                /* free will be handled by opj_j2k_destroy */
8282
0
                opj_event_msg(p_manager, EVT_ERROR, "Failed to setup j2k mct encoding\n");
8283
0
                return OPJ_FALSE;
8284
0
            }
8285
11.0k
        } else {
8286
11.0k
            if (tcp->mct == 1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
8287
643
                if ((image->comps[0].dx != image->comps[1].dx) ||
8288
643
                        (image->comps[0].dx != image->comps[2].dx) ||
8289
643
                        (image->comps[0].dy != image->comps[1].dy) ||
8290
643
                        (image->comps[0].dy != image->comps[2].dy)) {
8291
0
                    opj_event_msg(p_manager, EVT_WARNING,
8292
0
                                  "Cannot perform MCT on components with different sizes. Disabling MCT.\n");
8293
0
                    tcp->mct = 0;
8294
0
                }
8295
643
            }
8296
23.5k
            for (i = 0; i < image->numcomps; i++) {
8297
12.5k
                opj_tccp_t *tccp = &tcp->tccps[i];
8298
12.5k
                opj_image_comp_t * l_comp = &(image->comps[i]);
8299
8300
12.5k
                if (! l_comp->sgnd) {
8301
12.5k
                    tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
8302
12.5k
                }
8303
12.5k
            }
8304
11.0k
        }
8305
8306
23.5k
        for (i = 0; i < image->numcomps; i++) {
8307
12.5k
            opj_tccp_t *tccp = &tcp->tccps[i];
8308
8309
12.5k
            tccp->csty = parameters->csty &
8310
12.5k
                         0x01;   /* 0 => one precinct || 1 => custom precinct  */
8311
12.5k
            tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
8312
12.5k
            tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
8313
12.5k
            tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
8314
12.5k
            tccp->cblksty = (OPJ_UINT32)parameters->mode;
8315
12.5k
            tccp->qmfbid = parameters->irreversible ? 0 : 1;
8316
12.5k
            tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT :
8317
12.5k
                           J2K_CCP_QNTSTY_NOQNT;
8318
8319
12.5k
            if (OPJ_IS_CINEMA(parameters->rsiz) &&
8320
0
                    parameters->rsiz == OPJ_PROFILE_CINEMA_2K) {
8321
                /* From https://github.com/uclouvain/openjpeg/issues/1340 */
8322
0
                tccp->numgbits = 1;
8323
12.5k
            } else {
8324
12.5k
                tccp->numgbits = 2;
8325
12.5k
            }
8326
8327
12.5k
            if ((OPJ_INT32)i == parameters->roi_compno) {
8328
0
                tccp->roishift = parameters->roi_shift;
8329
12.5k
            } else {
8330
12.5k
                tccp->roishift = 0;
8331
12.5k
            }
8332
8333
12.5k
            if (parameters->csty & J2K_CCP_CSTY_PRT) {
8334
1.05k
                OPJ_INT32 p = 0, it_res;
8335
1.05k
                assert(tccp->numresolutions > 0);
8336
7.07k
                for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
8337
6.02k
                    if (p < parameters->res_spec) {
8338
8339
4.99k
                        if (parameters->prcw_init[p] < 1) {
8340
0
                            tccp->prcw[it_res] = 1;
8341
4.99k
                        } else {
8342
4.99k
                            tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
8343
4.99k
                        }
8344
8345
4.99k
                        if (parameters->prch_init[p] < 1) {
8346
0
                            tccp->prch[it_res] = 1;
8347
4.99k
                        } else {
8348
4.99k
                            tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
8349
4.99k
                        }
8350
8351
4.99k
                    } else {
8352
1.03k
                        OPJ_INT32 res_spec = parameters->res_spec;
8353
1.03k
                        OPJ_INT32 size_prcw = 0;
8354
1.03k
                        OPJ_INT32 size_prch = 0;
8355
8356
1.03k
                        assert(res_spec > 0); /* issue 189 */
8357
1.03k
                        size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
8358
1.03k
                        size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
8359
8360
8361
1.03k
                        if (size_prcw < 1) {
8362
0
                            tccp->prcw[it_res] = 1;
8363
1.03k
                        } else {
8364
1.03k
                            tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
8365
1.03k
                        }
8366
8367
1.03k
                        if (size_prch < 1) {
8368
0
                            tccp->prch[it_res] = 1;
8369
1.03k
                        } else {
8370
1.03k
                            tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
8371
1.03k
                        }
8372
1.03k
                    }
8373
6.02k
                    p++;
8374
                    /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
8375
6.02k
                }       /*end for*/
8376
11.4k
            } else {
8377
63.5k
                for (j = 0; j < tccp->numresolutions; j++) {
8378
52.0k
                    tccp->prcw[j] = 15;
8379
52.0k
                    tccp->prch[j] = 15;
8380
52.0k
                }
8381
11.4k
            }
8382
8383
12.5k
            opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
8384
12.5k
        }
8385
11.0k
    }
8386
8387
11.0k
    if (parameters->mct_data) {
8388
0
        opj_free(parameters->mct_data);
8389
0
        parameters->mct_data = 00;
8390
0
    }
8391
11.0k
    return OPJ_TRUE;
8392
11.0k
}
8393
8394
static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
8395
                                     OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
8396
375k
{
8397
375k
    assert(cstr_index != 00);
8398
8399
    /* expand the list? */
8400
375k
    if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
8401
967
        opj_marker_info_t *new_marker;
8402
967
        cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32)
8403
967
                                              cstr_index->maxmarknum);
8404
967
        new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker,
8405
967
                     cstr_index->maxmarknum * sizeof(opj_marker_info_t));
8406
967
        if (! new_marker) {
8407
0
            opj_free(cstr_index->marker);
8408
0
            cstr_index->marker = NULL;
8409
0
            cstr_index->maxmarknum = 0;
8410
0
            cstr_index->marknum = 0;
8411
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
8412
0
            return OPJ_FALSE;
8413
0
        }
8414
967
        cstr_index->marker = new_marker;
8415
967
    }
8416
8417
    /* add the marker */
8418
375k
    cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
8419
375k
    cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
8420
375k
    cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
8421
375k
    cstr_index->marknum++;
8422
375k
    return OPJ_TRUE;
8423
375k
}
8424
8425
static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
8426
                                     opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
8427
                                     OPJ_UINT32 len)
8428
134k
{
8429
134k
    assert(cstr_index != 00);
8430
134k
    assert(cstr_index->tile_index != 00);
8431
8432
    /* expand the list? */
8433
134k
    if ((cstr_index->tile_index[tileno].marknum + 1) >
8434
134k
            cstr_index->tile_index[tileno].maxmarknum) {
8435
268
        opj_marker_info_t *new_marker;
8436
268
        cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 +
8437
268
                (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
8438
268
        new_marker = (opj_marker_info_t *) opj_realloc(
8439
268
                         cstr_index->tile_index[tileno].marker,
8440
268
                         cstr_index->tile_index[tileno].maxmarknum * sizeof(opj_marker_info_t));
8441
268
        if (! new_marker) {
8442
0
            opj_free(cstr_index->tile_index[tileno].marker);
8443
0
            cstr_index->tile_index[tileno].marker = NULL;
8444
0
            cstr_index->tile_index[tileno].maxmarknum = 0;
8445
0
            cstr_index->tile_index[tileno].marknum = 0;
8446
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
8447
0
            return OPJ_FALSE;
8448
0
        }
8449
268
        cstr_index->tile_index[tileno].marker = new_marker;
8450
268
    }
8451
8452
    /* add the marker */
8453
134k
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type
8454
134k
        = (OPJ_UINT16)type;
8455
134k
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos
8456
134k
        = (OPJ_INT32)pos;
8457
134k
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len
8458
134k
        = (OPJ_INT32)len;
8459
134k
    cstr_index->tile_index[tileno].marknum++;
8460
8461
134k
    if (type == J2K_MS_SOT) {
8462
51.7k
        OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
8463
8464
51.7k
        if (cstr_index->tile_index[tileno].tp_index &&
8465
51.7k
                l_current_tile_part < cstr_index->tile_index[tileno].nb_tps) {
8466
51.0k
            cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
8467
51.0k
        }
8468
8469
51.7k
    }
8470
134k
    return OPJ_TRUE;
8471
134k
}
8472
8473
/*
8474
 * -----------------------------------------------------------------------
8475
 * -----------------------------------------------------------------------
8476
 * -----------------------------------------------------------------------
8477
 */
8478
8479
OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k,
8480
                                opj_stream_private_t *p_stream,
8481
                                opj_event_mgr_t * p_manager
8482
                               )
8483
28.9k
{
8484
28.9k
    (void)p_j2k;
8485
28.9k
    (void)p_stream;
8486
28.9k
    (void)p_manager;
8487
28.9k
    return OPJ_TRUE;
8488
28.9k
}
8489
8490
OPJ_BOOL opj_j2k_read_header(opj_stream_private_t *p_stream,
8491
                             opj_j2k_t* p_j2k,
8492
                             opj_image_t** p_image,
8493
                             opj_event_mgr_t* p_manager)
8494
50.1k
{
8495
    /* preconditions */
8496
50.1k
    assert(p_j2k != 00);
8497
50.1k
    assert(p_stream != 00);
8498
50.1k
    assert(p_manager != 00);
8499
8500
    /* create an empty image header */
8501
50.1k
    p_j2k->m_private_image = opj_image_create0();
8502
50.1k
    if (! p_j2k->m_private_image) {
8503
0
        return OPJ_FALSE;
8504
0
    }
8505
8506
    /* customization of the validation */
8507
50.1k
    if (! opj_j2k_setup_decoding_validation(p_j2k, p_manager)) {
8508
0
        opj_image_destroy(p_j2k->m_private_image);
8509
0
        p_j2k->m_private_image = NULL;
8510
0
        return OPJ_FALSE;
8511
0
    }
8512
8513
    /* validation of the parameters codec */
8514
50.1k
    if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
8515
0
        opj_image_destroy(p_j2k->m_private_image);
8516
0
        p_j2k->m_private_image = NULL;
8517
0
        return OPJ_FALSE;
8518
0
    }
8519
8520
    /* customization of the encoding */
8521
50.1k
    if (! opj_j2k_setup_header_reading(p_j2k, p_manager)) {
8522
0
        opj_image_destroy(p_j2k->m_private_image);
8523
0
        p_j2k->m_private_image = NULL;
8524
0
        return OPJ_FALSE;
8525
0
    }
8526
8527
    /* read header */
8528
50.1k
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
8529
8.21k
        opj_image_destroy(p_j2k->m_private_image);
8530
8.21k
        p_j2k->m_private_image = NULL;
8531
8.21k
        return OPJ_FALSE;
8532
8.21k
    }
8533
8534
41.9k
    *p_image = opj_image_create0();
8535
41.9k
    if (!(*p_image)) {
8536
0
        return OPJ_FALSE;
8537
0
    }
8538
8539
    /* Copy codestream image information to the output image */
8540
41.9k
    opj_copy_image_header(p_j2k->m_private_image, *p_image);
8541
8542
41.9k
    return OPJ_TRUE;
8543
41.9k
}
8544
8545
static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
8546
        opj_event_mgr_t * p_manager)
8547
50.1k
{
8548
    /* preconditions*/
8549
50.1k
    assert(p_j2k != 00);
8550
50.1k
    assert(p_manager != 00);
8551
8552
50.1k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
8553
50.1k
                                           (opj_procedure)opj_j2k_read_header_procedure, p_manager)) {
8554
0
        return OPJ_FALSE;
8555
0
    }
8556
8557
    /* DEVELOPER CORNER, add your custom procedures */
8558
50.1k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
8559
50.1k
                                           (opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager))  {
8560
0
        return OPJ_FALSE;
8561
0
    }
8562
8563
50.1k
    return OPJ_TRUE;
8564
50.1k
}
8565
8566
static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
8567
        opj_event_mgr_t * p_manager)
8568
50.1k
{
8569
    /* preconditions*/
8570
50.1k
    assert(p_j2k != 00);
8571
50.1k
    assert(p_manager != 00);
8572
8573
50.1k
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
8574
50.1k
                                           (opj_procedure)opj_j2k_build_decoder, p_manager)) {
8575
0
        return OPJ_FALSE;
8576
0
    }
8577
50.1k
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
8578
50.1k
                                           (opj_procedure)opj_j2k_decoding_validation, p_manager)) {
8579
0
        return OPJ_FALSE;
8580
0
    }
8581
8582
    /* DEVELOPER CORNER, add your custom validation procedure */
8583
50.1k
    return OPJ_TRUE;
8584
50.1k
}
8585
8586
static OPJ_BOOL opj_j2k_mct_validation(opj_j2k_t * p_j2k,
8587
                                       opj_stream_private_t *p_stream,
8588
                                       opj_event_mgr_t * p_manager)
8589
10.9k
{
8590
10.9k
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8591
10.9k
    OPJ_UINT32 i, j;
8592
8593
    /* preconditions */
8594
10.9k
    assert(p_j2k != 00);
8595
10.9k
    assert(p_stream != 00);
8596
10.9k
    assert(p_manager != 00);
8597
8598
10.9k
    OPJ_UNUSED(p_stream);
8599
10.9k
    OPJ_UNUSED(p_manager);
8600
8601
10.9k
    if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
8602
0
        OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
8603
0
        opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
8604
8605
0
        for (i = 0; i < l_nb_tiles; ++i) {
8606
0
            if (l_tcp->mct == 2) {
8607
0
                opj_tccp_t * l_tccp = l_tcp->tccps;
8608
0
                l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
8609
8610
0
                for (j = 0; j < p_j2k->m_private_image->numcomps; ++j) {
8611
0
                    l_is_valid &= !(l_tccp->qmfbid & 1);
8612
0
                    ++l_tccp;
8613
0
                }
8614
0
            }
8615
0
            ++l_tcp;
8616
0
        }
8617
0
    }
8618
8619
10.9k
    return l_is_valid;
8620
10.9k
}
8621
8622
OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)
8623
0
{
8624
0
    OPJ_UINT32 i;
8625
0
    OPJ_UINT32 l_indix = 1;
8626
0
    opj_mct_data_t * l_mct_deco_data = 00, * l_mct_offset_data = 00;
8627
0
    opj_simple_mcc_decorrelation_data_t * l_mcc_data;
8628
0
    OPJ_UINT32 l_mct_size, l_nb_elem;
8629
0
    OPJ_FLOAT32 * l_data, * l_current_data;
8630
0
    opj_tccp_t * l_tccp;
8631
8632
    /* preconditions */
8633
0
    assert(p_tcp != 00);
8634
8635
0
    if (p_tcp->mct != 2) {
8636
0
        return OPJ_TRUE;
8637
0
    }
8638
8639
0
    if (p_tcp->m_mct_decoding_matrix) {
8640
0
        if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
8641
0
            opj_mct_data_t *new_mct_records;
8642
0
            p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8643
8644
0
            new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
8645
0
                              p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
8646
0
            if (! new_mct_records) {
8647
0
                opj_free(p_tcp->m_mct_records);
8648
0
                p_tcp->m_mct_records = NULL;
8649
0
                p_tcp->m_nb_max_mct_records = 0;
8650
0
                p_tcp->m_nb_mct_records = 0;
8651
                /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8652
0
                return OPJ_FALSE;
8653
0
            }
8654
0
            p_tcp->m_mct_records = new_mct_records;
8655
0
            l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8656
8657
0
            memset(l_mct_deco_data, 0,
8658
0
                   (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
8659
0
                       opj_mct_data_t));
8660
0
        }
8661
0
        l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8662
8663
0
        if (l_mct_deco_data->m_data) {
8664
0
            opj_free(l_mct_deco_data->m_data);
8665
0
            l_mct_deco_data->m_data = 00;
8666
0
        }
8667
8668
0
        l_mct_deco_data->m_index = l_indix++;
8669
0
        l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
8670
0
        l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
8671
0
        l_nb_elem = p_image->numcomps * p_image->numcomps;
8672
0
        l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
8673
0
        l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
8674
8675
0
        if (! l_mct_deco_data->m_data) {
8676
0
            return OPJ_FALSE;
8677
0
        }
8678
8679
0
        j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](
8680
0
            p_tcp->m_mct_decoding_matrix, l_mct_deco_data->m_data, l_nb_elem);
8681
8682
0
        l_mct_deco_data->m_data_size = l_mct_size;
8683
0
        ++p_tcp->m_nb_mct_records;
8684
0
    }
8685
8686
0
    if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
8687
0
        opj_mct_data_t *new_mct_records;
8688
0
        p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8689
0
        new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
8690
0
                          p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
8691
0
        if (! new_mct_records) {
8692
0
            opj_free(p_tcp->m_mct_records);
8693
0
            p_tcp->m_mct_records = NULL;
8694
0
            p_tcp->m_nb_max_mct_records = 0;
8695
0
            p_tcp->m_nb_mct_records = 0;
8696
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8697
0
            return OPJ_FALSE;
8698
0
        }
8699
0
        p_tcp->m_mct_records = new_mct_records;
8700
0
        l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8701
8702
0
        memset(l_mct_offset_data, 0,
8703
0
               (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
8704
0
                   opj_mct_data_t));
8705
8706
0
        if (l_mct_deco_data) {
8707
0
            l_mct_deco_data = l_mct_offset_data - 1;
8708
0
        }
8709
0
    }
8710
8711
0
    l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8712
8713
0
    if (l_mct_offset_data->m_data) {
8714
0
        opj_free(l_mct_offset_data->m_data);
8715
0
        l_mct_offset_data->m_data = 00;
8716
0
    }
8717
8718
0
    l_mct_offset_data->m_index = l_indix++;
8719
0
    l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
8720
0
    l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
8721
0
    l_nb_elem = p_image->numcomps;
8722
0
    l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
8723
0
    l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
8724
8725
0
    if (! l_mct_offset_data->m_data) {
8726
0
        return OPJ_FALSE;
8727
0
    }
8728
8729
0
    l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
8730
0
    if (! l_data) {
8731
0
        opj_free(l_mct_offset_data->m_data);
8732
0
        l_mct_offset_data->m_data = 00;
8733
0
        return OPJ_FALSE;
8734
0
    }
8735
8736
0
    l_tccp = p_tcp->tccps;
8737
0
    l_current_data = l_data;
8738
8739
0
    for (i = 0; i < l_nb_elem; ++i) {
8740
0
        *(l_current_data++) = (OPJ_FLOAT32)(l_tccp->m_dc_level_shift);
8741
0
        ++l_tccp;
8742
0
    }
8743
8744
0
    j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,
8745
0
            l_mct_offset_data->m_data, l_nb_elem);
8746
8747
0
    opj_free(l_data);
8748
8749
0
    l_mct_offset_data->m_data_size = l_mct_size;
8750
8751
0
    ++p_tcp->m_nb_mct_records;
8752
8753
0
    if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
8754
0
        opj_simple_mcc_decorrelation_data_t *new_mcc_records;
8755
0
        p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8756
0
        new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
8757
0
                              p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(
8758
0
                                  opj_simple_mcc_decorrelation_data_t));
8759
0
        if (! new_mcc_records) {
8760
0
            opj_free(p_tcp->m_mcc_records);
8761
0
            p_tcp->m_mcc_records = NULL;
8762
0
            p_tcp->m_nb_max_mcc_records = 0;
8763
0
            p_tcp->m_nb_mcc_records = 0;
8764
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8765
0
            return OPJ_FALSE;
8766
0
        }
8767
0
        p_tcp->m_mcc_records = new_mcc_records;
8768
0
        l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
8769
0
        memset(l_mcc_data, 0, (p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) *
8770
0
               sizeof(opj_simple_mcc_decorrelation_data_t));
8771
8772
0
    }
8773
8774
0
    l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
8775
0
    l_mcc_data->m_decorrelation_array = l_mct_deco_data;
8776
0
    l_mcc_data->m_is_irreversible = 1;
8777
0
    l_mcc_data->m_nb_comps = p_image->numcomps;
8778
0
    l_mcc_data->m_index = l_indix++;
8779
0
    l_mcc_data->m_offset_array = l_mct_offset_data;
8780
0
    ++p_tcp->m_nb_mcc_records;
8781
8782
0
    return OPJ_TRUE;
8783
0
}
8784
8785
static OPJ_BOOL opj_j2k_build_decoder(opj_j2k_t * p_j2k,
8786
                                      opj_stream_private_t *p_stream,
8787
                                      opj_event_mgr_t * p_manager)
8788
50.1k
{
8789
    /* add here initialization of cp
8790
       copy paste of setup_decoder */
8791
50.1k
    (void)p_j2k;
8792
50.1k
    (void)p_stream;
8793
50.1k
    (void)p_manager;
8794
50.1k
    return OPJ_TRUE;
8795
50.1k
}
8796
8797
static OPJ_BOOL opj_j2k_build_encoder(opj_j2k_t * p_j2k,
8798
                                      opj_stream_private_t *p_stream,
8799
                                      opj_event_mgr_t * p_manager)
8800
10.9k
{
8801
    /* add here initialization of cp
8802
       copy paste of setup_encoder */
8803
10.9k
    (void)p_j2k;
8804
10.9k
    (void)p_stream;
8805
10.9k
    (void)p_manager;
8806
10.9k
    return OPJ_TRUE;
8807
10.9k
}
8808
8809
static OPJ_BOOL opj_j2k_encoding_validation(opj_j2k_t * p_j2k,
8810
        opj_stream_private_t *p_stream,
8811
        opj_event_mgr_t * p_manager)
8812
10.9k
{
8813
10.9k
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8814
8815
    /* preconditions */
8816
10.9k
    assert(p_j2k != 00);
8817
10.9k
    assert(p_stream != 00);
8818
10.9k
    assert(p_manager != 00);
8819
8820
10.9k
    OPJ_UNUSED(p_stream);
8821
8822
    /* STATE checking */
8823
    /* make sure the state is at 0 */
8824
10.9k
    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
8825
8826
    /* POINTER validation */
8827
    /* make sure a p_j2k codec is present */
8828
10.9k
    l_is_valid &= (p_j2k->m_procedure_list != 00);
8829
    /* make sure a validation list is present */
8830
10.9k
    l_is_valid &= (p_j2k->m_validation_list != 00);
8831
8832
    /* ISO 15444-1:2004 states between 1 & 33 (0 -> 32) */
8833
    /* 33 (32) would always fail the check below (if a cast to 64bits was done) */
8834
    /* FIXME Shall we change OPJ_J2K_MAXRLVLS to 32 ? */
8835
10.9k
    if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) ||
8836
10.9k
            (p_j2k->m_cp.tcps->tccps->numresolutions > 32)) {
8837
0
        opj_event_msg(p_manager, EVT_ERROR,
8838
0
                      "Number of resolutions is too high in comparison to the size of tiles\n");
8839
0
        return OPJ_FALSE;
8840
0
    }
8841
8842
10.9k
    if ((p_j2k->m_cp.tdx) < (OPJ_UINT32)(1 <<
8843
10.9k
                                         (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
8844
0
        opj_event_msg(p_manager, EVT_ERROR,
8845
0
                      "Number of resolutions is too high in comparison to the size of tiles\n");
8846
0
        return OPJ_FALSE;
8847
0
    }
8848
8849
10.9k
    if ((p_j2k->m_cp.tdy) < (OPJ_UINT32)(1 <<
8850
10.9k
                                         (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
8851
0
        opj_event_msg(p_manager, EVT_ERROR,
8852
0
                      "Number of resolutions is too high in comparison to the size of tiles\n");
8853
0
        return OPJ_FALSE;
8854
0
    }
8855
8856
    /* PARAMETER VALIDATION */
8857
10.9k
    return l_is_valid;
8858
10.9k
}
8859
8860
static OPJ_BOOL opj_j2k_decoding_validation(opj_j2k_t *p_j2k,
8861
        opj_stream_private_t *p_stream,
8862
        opj_event_mgr_t * p_manager
8863
                                           )
8864
50.1k
{
8865
50.1k
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8866
8867
    /* preconditions*/
8868
50.1k
    assert(p_j2k != 00);
8869
50.1k
    assert(p_stream != 00);
8870
50.1k
    assert(p_manager != 00);
8871
8872
50.1k
    OPJ_UNUSED(p_stream);
8873
50.1k
    OPJ_UNUSED(p_manager);
8874
8875
    /* STATE checking */
8876
    /* make sure the state is at 0 */
8877
#ifdef TODO_MSD
8878
    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
8879
#endif
8880
50.1k
    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
8881
8882
    /* POINTER validation */
8883
    /* make sure a p_j2k codec is present */
8884
    /* make sure a procedure list is present */
8885
50.1k
    l_is_valid &= (p_j2k->m_procedure_list != 00);
8886
    /* make sure a validation list is present */
8887
50.1k
    l_is_valid &= (p_j2k->m_validation_list != 00);
8888
8889
    /* PARAMETER VALIDATION */
8890
50.1k
    return l_is_valid;
8891
50.1k
}
8892
8893
/** Fill p_j2k->cstr_index->tp_index[].start_pos/end_pos fields from TLM marker segments */
8894
static void opj_j2k_build_tp_index_from_tlm(opj_j2k_t* p_j2k,
8895
        opj_event_mgr_t * p_manager)
8896
41.9k
{
8897
41.9k
    opj_j2k_tlm_info_t* l_tlm;
8898
41.9k
    OPJ_UINT32 i;
8899
41.9k
    OPJ_OFF_T l_cur_offset;
8900
8901
41.9k
    assert(p_j2k->cstr_index->main_head_end > 0);
8902
41.9k
    assert(p_j2k->cstr_index->nb_of_tiles > 0);
8903
41.9k
    assert(p_j2k->cstr_index->tile_index != NULL);
8904
8905
41.9k
    l_tlm = &(p_j2k->m_specific_param.m_decoder.m_tlm);
8906
8907
41.9k
    if (l_tlm->m_entries_count == 0) {
8908
41.0k
        l_tlm->m_is_invalid = OPJ_TRUE;
8909
41.0k
        return;
8910
41.0k
    }
8911
8912
840
    if (l_tlm->m_is_invalid) {
8913
61
        return;
8914
61
    }
8915
8916
    /* Initial pass to count the number of tile-parts per tile */
8917
33.2k
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8918
32.4k
        OPJ_UINT32 l_tile_index_no = l_tlm->m_tile_part_infos[i].m_tile_index;
8919
32.4k
        assert(l_tile_index_no < p_j2k->cstr_index->nb_of_tiles);
8920
32.4k
        p_j2k->cstr_index->tile_index[l_tile_index_no].tileno = l_tile_index_no;
8921
32.4k
        ++p_j2k->cstr_index->tile_index[l_tile_index_no].current_nb_tps;
8922
32.4k
    }
8923
8924
    /* Now check that all tiles have at least one tile-part */
8925
24.5k
    for (i = 0; i < p_j2k->cstr_index->nb_of_tiles; ++i) {
8926
23.7k
        if (p_j2k->cstr_index->tile_index[i].current_nb_tps == 0) {
8927
59
            opj_event_msg(p_manager, EVT_ERROR,
8928
59
                          "opj_j2k_build_tp_index_from_tlm(): tile %d has no "
8929
59
                          "registered tile-part in TLM marker segments.\n", i);
8930
59
            goto error;
8931
59
        }
8932
23.7k
    }
8933
8934
    /* Final pass to fill p_j2k->cstr_index */
8935
720
    l_cur_offset = p_j2k->cstr_index->main_head_end;
8936
30.0k
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8937
29.3k
        OPJ_UINT32 l_tile_index_no = l_tlm->m_tile_part_infos[i].m_tile_index;
8938
29.3k
        opj_tile_index_t* l_tile_index = &
8939
29.3k
                                         (p_j2k->cstr_index->tile_index[l_tile_index_no]);
8940
29.3k
        if (!l_tile_index->tp_index) {
8941
21.0k
            l_tile_index->tp_index = (opj_tp_index_t *) opj_calloc(
8942
21.0k
                                         l_tile_index->current_nb_tps, sizeof(opj_tp_index_t));
8943
21.0k
            if (! l_tile_index->tp_index) {
8944
0
                opj_event_msg(p_manager, EVT_ERROR,
8945
0
                              "opj_j2k_build_tp_index_from_tlm(): tile index allocation failed\n");
8946
0
                goto error;
8947
0
            }
8948
21.0k
        }
8949
8950
29.3k
        assert(l_tile_index->nb_tps < l_tile_index->current_nb_tps);
8951
29.3k
        l_tile_index->tp_index[l_tile_index->nb_tps].start_pos = l_cur_offset;
8952
        /* We don't know how to set the tp_index[].end_header field, but this is not really needed */
8953
        /* If there would be no markers between SOT and SOD, that would be : */
8954
        /* l_tile_index->tp_index[l_tile_index->nb_tps].end_header = l_cur_offset + 12; */
8955
29.3k
        l_tile_index->tp_index[l_tile_index->nb_tps].end_pos = l_cur_offset +
8956
29.3k
                l_tlm->m_tile_part_infos[i].m_length;
8957
29.3k
        ++l_tile_index->nb_tps;
8958
8959
29.3k
        l_cur_offset += l_tlm->m_tile_part_infos[i].m_length;
8960
29.3k
    }
8961
8962
720
    return;
8963
8964
720
error:
8965
59
    l_tlm->m_is_invalid = OPJ_TRUE;
8966
3.16k
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8967
3.10k
        OPJ_UINT32 l_tile_index = l_tlm->m_tile_part_infos[i].m_tile_index;
8968
3.10k
        p_j2k->cstr_index->tile_index[l_tile_index].current_nb_tps = 0;
8969
3.10k
        opj_free(p_j2k->cstr_index->tile_index[l_tile_index].tp_index);
8970
3.10k
        p_j2k->cstr_index->tile_index[l_tile_index].tp_index = NULL;
8971
3.10k
    }
8972
59
}
8973
8974
static OPJ_BOOL opj_j2k_read_header_procedure(opj_j2k_t *p_j2k,
8975
        opj_stream_private_t *p_stream,
8976
        opj_event_mgr_t * p_manager)
8977
50.1k
{
8978
50.1k
    OPJ_UINT32 l_current_marker;
8979
50.1k
    OPJ_UINT32 l_marker_size;
8980
50.1k
    const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
8981
50.1k
    OPJ_BOOL l_has_siz = 0;
8982
50.1k
    OPJ_BOOL l_has_cod = 0;
8983
50.1k
    OPJ_BOOL l_has_qcd = 0;
8984
8985
    /* preconditions */
8986
50.1k
    assert(p_stream != 00);
8987
50.1k
    assert(p_j2k != 00);
8988
50.1k
    assert(p_manager != 00);
8989
8990
    /*  We enter in the main header */
8991
50.1k
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
8992
8993
    /* Try to read the SOC marker, the codestream must begin with SOC marker */
8994
50.1k
    if (! opj_j2k_read_soc(p_j2k, p_stream, p_manager)) {
8995
123
        opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
8996
123
        return OPJ_FALSE;
8997
123
    }
8998
8999
    /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9000
50.0k
    if (opj_stream_read_data(p_stream,
9001
50.0k
                             p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9002
6
        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9003
6
        return OPJ_FALSE;
9004
6
    }
9005
9006
    /* Read 2 bytes as the new marker ID */
9007
50.0k
    opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9008
50.0k
                   &l_current_marker, 2);
9009
9010
    /* Try to read until the SOT is detected */
9011
294k
    while (l_current_marker != J2K_MS_SOT) {
9012
9013
        /* Check if the current marker ID is valid */
9014
260k
        if (l_current_marker < 0xff00) {
9015
1.06k
            opj_event_msg(p_manager, EVT_ERROR,
9016
1.06k
                          "A marker ID was expected (0xff--) instead of %.8x\n", l_current_marker);
9017
1.06k
            return OPJ_FALSE;
9018
1.06k
        }
9019
9020
        /* Get the marker handler from the marker ID */
9021
259k
        l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9022
9023
        /* Manage case where marker is unknown */
9024
259k
        if (l_marker_handler->id == J2K_MS_UNK) {
9025
89.3k
            if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)) {
9026
910
                opj_event_msg(p_manager, EVT_ERROR,
9027
910
                              "Unknown marker has been detected and generated error.\n");
9028
910
                return OPJ_FALSE;
9029
910
            }
9030
9031
88.4k
            if (l_current_marker == J2K_MS_SOT) {
9032
8.81k
                break;    /* SOT marker is detected main header is completely read */
9033
79.6k
            } else { /* Get the marker handler from the marker ID */
9034
79.6k
                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9035
79.6k
            }
9036
88.4k
        }
9037
9038
249k
        if (l_marker_handler->id == J2K_MS_SIZ) {
9039
            /* Mark required SIZ marker as found */
9040
50.0k
            l_has_siz = 1;
9041
50.0k
        }
9042
249k
        if (l_marker_handler->id == J2K_MS_COD) {
9043
            /* Mark required COD marker as found */
9044
50.0k
            l_has_cod = 1;
9045
50.0k
        }
9046
249k
        if (l_marker_handler->id == J2K_MS_QCD) {
9047
            /* Mark required QCD marker as found */
9048
51.8k
            l_has_qcd = 1;
9049
51.8k
        }
9050
9051
        /* Check if the marker is known and if it is the right place to find it */
9052
249k
        if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
9053
40
            opj_event_msg(p_manager, EVT_ERROR,
9054
40
                          "Marker is not compliant with its position\n");
9055
40
            return OPJ_FALSE;
9056
40
        }
9057
9058
        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9059
249k
        if (opj_stream_read_data(p_stream,
9060
249k
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9061
298
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9062
298
            return OPJ_FALSE;
9063
298
        }
9064
9065
        /* read 2 bytes as the marker size */
9066
249k
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
9067
249k
                       2);
9068
249k
        if (l_marker_size < 2) {
9069
68
            opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
9070
68
            return OPJ_FALSE;
9071
68
        }
9072
249k
        l_marker_size -= 2; /* Subtract the size of the marker ID already read */
9073
9074
        /* Check if the marker size is compatible with the header data size */
9075
249k
        if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
9076
451
            OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(
9077
451
                                            p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
9078
451
            if (! new_header_data) {
9079
0
                opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9080
0
                p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
9081
0
                p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9082
0
                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
9083
0
                return OPJ_FALSE;
9084
0
            }
9085
451
            p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
9086
451
            p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
9087
451
        }
9088
9089
        /* Try to read the rest of the marker segment from stream and copy them into the buffer */
9090
249k
        if (opj_stream_read_data(p_stream,
9091
249k
                                 p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
9092
249k
                                 p_manager) != l_marker_size) {
9093
763
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9094
763
            return OPJ_FALSE;
9095
763
        }
9096
9097
        /* Read the marker segment with the correct marker handler */
9098
248k
        if (!(*(l_marker_handler->handler))(p_j2k,
9099
248k
                                            p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
9100
2.91k
            opj_event_msg(p_manager, EVT_ERROR,
9101
2.91k
                          "Marker handler function failed to read the marker segment\n");
9102
2.91k
            return OPJ_FALSE;
9103
2.91k
        }
9104
9105
        /* Add the marker to the codestream index*/
9106
245k
        if (OPJ_FALSE == opj_j2k_add_mhmarker(
9107
245k
                    p_j2k->cstr_index,
9108
245k
                    l_marker_handler->id,
9109
245k
                    (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
9110
245k
                    l_marker_size + 4)) {
9111
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
9112
0
            return OPJ_FALSE;
9113
0
        }
9114
9115
        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9116
245k
        if (opj_stream_read_data(p_stream,
9117
245k
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9118
1.65k
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9119
1.65k
            return OPJ_FALSE;
9120
1.65k
        }
9121
9122
        /* read 2 bytes as the new marker ID */
9123
244k
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9124
244k
                       &l_current_marker, 2);
9125
244k
    }
9126
9127
42.2k
    if (l_has_siz == 0) {
9128
4
        opj_event_msg(p_manager, EVT_ERROR,
9129
4
                      "required SIZ marker not found in main header\n");
9130
4
        return OPJ_FALSE;
9131
4
    }
9132
42.2k
    if (l_has_cod == 0) {
9133
36
        opj_event_msg(p_manager, EVT_ERROR,
9134
36
                      "required COD marker not found in main header\n");
9135
36
        return OPJ_FALSE;
9136
36
    }
9137
42.2k
    if (l_has_qcd == 0) {
9138
20
        opj_event_msg(p_manager, EVT_ERROR,
9139
20
                      "required QCD marker not found in main header\n");
9140
20
        return OPJ_FALSE;
9141
20
    }
9142
9143
42.2k
    if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) {
9144
312
        opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n");
9145
312
        return OPJ_FALSE;
9146
312
    }
9147
9148
41.9k
    opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
9149
9150
    /* Position of the last element if the main header */
9151
41.9k
    p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
9152
9153
    /* Build tile-part index from TLM information */
9154
41.9k
    opj_j2k_build_tp_index_from_tlm(p_j2k, p_manager);
9155
9156
    /* Next step: read a tile-part header */
9157
41.9k
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
9158
9159
41.9k
    return OPJ_TRUE;
9160
42.2k
}
9161
9162
static OPJ_BOOL opj_j2k_exec(opj_j2k_t * p_j2k,
9163
                             opj_procedure_list_t * p_procedure_list,
9164
                             opj_stream_private_t *p_stream,
9165
                             opj_event_mgr_t * p_manager)
9166
174k
{
9167
174k
    OPJ_BOOL(** l_procedure)(opj_j2k_t *, opj_stream_private_t *,
9168
174k
                             opj_event_mgr_t *) = 00;
9169
174k
    OPJ_BOOL l_result = OPJ_TRUE;
9170
174k
    OPJ_UINT32 l_nb_proc, i;
9171
9172
    /* preconditions*/
9173
174k
    assert(p_procedure_list != 00);
9174
174k
    assert(p_j2k != 00);
9175
174k
    assert(p_stream != 00);
9176
174k
    assert(p_manager != 00);
9177
9178
174k
    l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
9179
174k
    l_procedure = (OPJ_BOOL(**)(opj_j2k_t *, opj_stream_private_t *,
9180
174k
                                opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
9181
9182
615k
    for (i = 0; i < l_nb_proc; ++i) {
9183
441k
        l_result = l_result && ((*l_procedure)(p_j2k, p_stream, p_manager));
9184
441k
        ++l_procedure;
9185
441k
    }
9186
9187
    /* and clear the procedure list at the end.*/
9188
174k
    opj_procedure_list_clear(p_procedure_list);
9189
174k
    return l_result;
9190
174k
}
9191
9192
/* FIXME DOC*/
9193
static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,
9194
        opj_stream_private_t *p_stream,
9195
        opj_event_mgr_t * p_manager
9196
                                                       )
9197
41.9k
{
9198
41.9k
    opj_tcp_t * l_tcp = 00;
9199
41.9k
    opj_tcp_t * l_default_tcp = 00;
9200
41.9k
    OPJ_UINT32 l_nb_tiles;
9201
41.9k
    OPJ_UINT32 i, j;
9202
41.9k
    opj_tccp_t *l_current_tccp = 00;
9203
41.9k
    OPJ_UINT32 l_tccp_size;
9204
41.9k
    OPJ_UINT32 l_mct_size;
9205
41.9k
    opj_image_t * l_image;
9206
41.9k
    OPJ_UINT32 l_mcc_records_size, l_mct_records_size;
9207
41.9k
    opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
9208
41.9k
    opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
9209
41.9k
    OPJ_UINT32 l_offset;
9210
9211
    /* preconditions */
9212
41.9k
    assert(p_j2k != 00);
9213
41.9k
    assert(p_stream != 00);
9214
41.9k
    assert(p_manager != 00);
9215
9216
41.9k
    OPJ_UNUSED(p_stream);
9217
9218
41.9k
    l_image = p_j2k->m_private_image;
9219
41.9k
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
9220
41.9k
    l_tcp = p_j2k->m_cp.tcps;
9221
41.9k
    l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
9222
41.9k
    l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
9223
41.9k
    l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(
9224
41.9k
                     OPJ_FLOAT32);
9225
9226
    /* For each tile */
9227
4.09M
    for (i = 0; i < l_nb_tiles; ++i) {
9228
        /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
9229
4.05M
        l_current_tccp = l_tcp->tccps;
9230
        /*Copy default coding parameters into the current tile coding parameters*/
9231
4.05M
        memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
9232
        /* Initialize some values of the current tile coding parameters*/
9233
4.05M
        l_tcp->cod = 0;
9234
4.05M
        l_tcp->ppt = 0;
9235
4.05M
        l_tcp->ppt_data = 00;
9236
4.05M
        l_tcp->m_current_tile_part_number = -1;
9237
        /* Remove memory not owned by this tile in case of early error return. */
9238
4.05M
        l_tcp->m_mct_decoding_matrix = 00;
9239
4.05M
        l_tcp->m_nb_max_mct_records = 0;
9240
4.05M
        l_tcp->m_mct_records = 00;
9241
4.05M
        l_tcp->m_nb_max_mcc_records = 0;
9242
4.05M
        l_tcp->m_mcc_records = 00;
9243
        /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
9244
4.05M
        l_tcp->tccps = l_current_tccp;
9245
9246
        /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
9247
4.05M
        if (l_default_tcp->m_mct_decoding_matrix) {
9248
1.81k
            l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
9249
1.81k
            if (! l_tcp->m_mct_decoding_matrix) {
9250
0
                return OPJ_FALSE;
9251
0
            }
9252
1.81k
            memcpy(l_tcp->m_mct_decoding_matrix, l_default_tcp->m_mct_decoding_matrix,
9253
1.81k
                   l_mct_size);
9254
1.81k
        }
9255
9256
        /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
9257
4.05M
        l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(
9258
4.05M
                                 opj_mct_data_t);
9259
4.05M
        l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
9260
4.05M
        if (! l_tcp->m_mct_records) {
9261
0
            return OPJ_FALSE;
9262
0
        }
9263
4.05M
        memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records, l_mct_records_size);
9264
9265
        /* Copy the mct record data from dflt_tile_cp to the current tile*/
9266
4.05M
        l_src_mct_rec = l_default_tcp->m_mct_records;
9267
4.05M
        l_dest_mct_rec = l_tcp->m_mct_records;
9268
9269
4.22M
        for (j = 0; j < l_default_tcp->m_nb_mct_records; ++j) {
9270
9271
173k
            if (l_src_mct_rec->m_data) {
9272
9273
4.67k
                l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
9274
4.67k
                if (! l_dest_mct_rec->m_data) {
9275
0
                    return OPJ_FALSE;
9276
0
                }
9277
4.67k
                memcpy(l_dest_mct_rec->m_data, l_src_mct_rec->m_data,
9278
4.67k
                       l_src_mct_rec->m_data_size);
9279
4.67k
            }
9280
9281
173k
            ++l_src_mct_rec;
9282
173k
            ++l_dest_mct_rec;
9283
            /* Update with each pass to free exactly what has been allocated on early return. */
9284
173k
            l_tcp->m_nb_max_mct_records += 1;
9285
173k
        }
9286
9287
        /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
9288
4.05M
        l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(
9289
4.05M
                                 opj_simple_mcc_decorrelation_data_t);
9290
4.05M
        l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(
9291
4.05M
                                   l_mcc_records_size);
9292
4.05M
        if (! l_tcp->m_mcc_records) {
9293
0
            return OPJ_FALSE;
9294
0
        }
9295
4.05M
        memcpy(l_tcp->m_mcc_records, l_default_tcp->m_mcc_records, l_mcc_records_size);
9296
4.05M
        l_tcp->m_nb_max_mcc_records = l_default_tcp->m_nb_max_mcc_records;
9297
9298
        /* Copy the mcc record data from dflt_tile_cp to the current tile*/
9299
4.05M
        l_src_mcc_rec = l_default_tcp->m_mcc_records;
9300
4.05M
        l_dest_mcc_rec = l_tcp->m_mcc_records;
9301
9302
44.5M
        for (j = 0; j < l_default_tcp->m_nb_max_mcc_records; ++j) {
9303
9304
40.5M
            if (l_src_mcc_rec->m_decorrelation_array) {
9305
3.34k
                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array -
9306
3.34k
                                        l_default_tcp->m_mct_records);
9307
3.34k
                l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
9308
3.34k
            }
9309
9310
40.5M
            if (l_src_mcc_rec->m_offset_array) {
9311
3.72k
                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array -
9312
3.72k
                                        l_default_tcp->m_mct_records);
9313
3.72k
                l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
9314
3.72k
            }
9315
9316
40.5M
            ++l_src_mcc_rec;
9317
40.5M
            ++l_dest_mcc_rec;
9318
40.5M
        }
9319
9320
        /* Copy all the dflt_tile_compo_cp to the current tile cp */
9321
4.05M
        memcpy(l_current_tccp, l_default_tcp->tccps, l_tccp_size);
9322
9323
        /* Move to next tile cp*/
9324
4.05M
        ++l_tcp;
9325
4.05M
    }
9326
9327
    /* Create the current tile decoder*/
9328
41.9k
    p_j2k->m_tcd = opj_tcd_create(OPJ_TRUE);
9329
41.9k
    if (! p_j2k->m_tcd) {
9330
0
        return OPJ_FALSE;
9331
0
    }
9332
9333
41.9k
    if (!opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp), p_j2k->m_tp)) {
9334
0
        opj_tcd_destroy(p_j2k->m_tcd);
9335
0
        p_j2k->m_tcd = 00;
9336
0
        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
9337
0
        return OPJ_FALSE;
9338
0
    }
9339
9340
41.9k
    return OPJ_TRUE;
9341
41.9k
}
9342
9343
static const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler(
9344
    OPJ_UINT32 p_id)
9345
616k
{
9346
616k
    const opj_dec_memory_marker_handler_t *e;
9347
8.34M
    for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
9348
8.14M
        if (e->id == p_id) {
9349
409k
            break; /* we find a handler corresponding to the marker ID*/
9350
409k
        }
9351
8.14M
    }
9352
616k
    return e;
9353
616k
}
9354
9355
void opj_j2k_destroy(opj_j2k_t *p_j2k)
9356
65.4k
{
9357
65.4k
    if (p_j2k == 00) {
9358
0
        return;
9359
0
    }
9360
9361
65.4k
    if (p_j2k->m_is_decoder) {
9362
9363
54.4k
        if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
9364
54.4k
            opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
9365
54.4k
            opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
9366
54.4k
            p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
9367
54.4k
        }
9368
9369
54.4k
        if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
9370
54.4k
            opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9371
54.4k
            p_j2k->m_specific_param.m_decoder.m_header_data = 00;
9372
54.4k
            p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9373
54.4k
        }
9374
9375
54.4k
        opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
9376
54.4k
        p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = 00;
9377
54.4k
        p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
9378
9379
54.4k
        opj_free(p_j2k->m_specific_param.m_decoder.m_tlm.m_tile_part_infos);
9380
54.4k
        p_j2k->m_specific_param.m_decoder.m_tlm.m_tile_part_infos = NULL;
9381
9382
54.4k
        opj_free(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset);
9383
54.4k
        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset = NULL;
9384
9385
54.4k
    } else {
9386
9387
11.0k
        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
9388
67
            opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
9389
67
            p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
9390
67
        }
9391
9392
11.0k
        if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
9393
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
9394
0
            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
9395
0
            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
9396
0
        }
9397
9398
11.0k
        if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
9399
69
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
9400
69
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
9401
69
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
9402
69
        }
9403
11.0k
    }
9404
9405
65.4k
    opj_tcd_destroy(p_j2k->m_tcd);
9406
9407
65.4k
    opj_j2k_cp_destroy(&(p_j2k->m_cp));
9408
65.4k
    memset(&(p_j2k->m_cp), 0, sizeof(opj_cp_t));
9409
9410
65.4k
    opj_procedure_list_destroy(p_j2k->m_procedure_list);
9411
65.4k
    p_j2k->m_procedure_list = 00;
9412
9413
65.4k
    opj_procedure_list_destroy(p_j2k->m_validation_list);
9414
65.4k
    p_j2k->m_procedure_list = 00;
9415
9416
65.4k
    j2k_destroy_cstr_index(p_j2k->cstr_index);
9417
65.4k
    p_j2k->cstr_index = NULL;
9418
9419
65.4k
    opj_image_destroy(p_j2k->m_private_image);
9420
65.4k
    p_j2k->m_private_image = NULL;
9421
9422
65.4k
    opj_image_destroy(p_j2k->m_output_image);
9423
65.4k
    p_j2k->m_output_image = NULL;
9424
9425
65.4k
    opj_thread_pool_destroy(p_j2k->m_tp);
9426
65.4k
    p_j2k->m_tp = NULL;
9427
9428
65.4k
    opj_free(p_j2k);
9429
65.4k
}
9430
9431
void j2k_destroy_cstr_index(opj_codestream_index_t *p_cstr_ind)
9432
65.4k
{
9433
65.4k
    if (p_cstr_ind) {
9434
9435
54.4k
        if (p_cstr_ind->marker) {
9436
54.4k
            opj_free(p_cstr_ind->marker);
9437
54.4k
            p_cstr_ind->marker = NULL;
9438
54.4k
        }
9439
9440
54.4k
        if (p_cstr_ind->tile_index) {
9441
48.0k
            OPJ_UINT32 it_tile = 0;
9442
9443
10.2M
            for (it_tile = 0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
9444
9445
10.2M
                if (p_cstr_ind->tile_index[it_tile].packet_index) {
9446
0
                    opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
9447
0
                    p_cstr_ind->tile_index[it_tile].packet_index = NULL;
9448
0
                }
9449
9450
10.2M
                if (p_cstr_ind->tile_index[it_tile].tp_index) {
9451
71.3k
                    opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
9452
71.3k
                    p_cstr_ind->tile_index[it_tile].tp_index = NULL;
9453
71.3k
                }
9454
9455
10.2M
                if (p_cstr_ind->tile_index[it_tile].marker) {
9456
10.2M
                    opj_free(p_cstr_ind->tile_index[it_tile].marker);
9457
10.2M
                    p_cstr_ind->tile_index[it_tile].marker = NULL;
9458
9459
10.2M
                }
9460
10.2M
            }
9461
9462
48.0k
            opj_free(p_cstr_ind->tile_index);
9463
48.0k
            p_cstr_ind->tile_index = NULL;
9464
48.0k
        }
9465
9466
54.4k
        opj_free(p_cstr_ind);
9467
54.4k
    }
9468
65.4k
}
9469
9470
static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp)
9471
10.2M
{
9472
10.2M
    if (p_tcp == 00) {
9473
0
        return;
9474
0
    }
9475
9476
10.2M
    if (p_tcp->ppt_markers != 00) {
9477
139
        OPJ_UINT32 i;
9478
6.81k
        for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
9479
6.67k
            if (p_tcp->ppt_markers[i].m_data != NULL) {
9480
198
                opj_free(p_tcp->ppt_markers[i].m_data);
9481
198
            }
9482
6.67k
        }
9483
139
        p_tcp->ppt_markers_count = 0U;
9484
139
        opj_free(p_tcp->ppt_markers);
9485
139
        p_tcp->ppt_markers = NULL;
9486
139
    }
9487
9488
10.2M
    if (p_tcp->ppt_buffer != 00) {
9489
425
        opj_free(p_tcp->ppt_buffer);
9490
425
        p_tcp->ppt_buffer = 00;
9491
425
    }
9492
9493
10.2M
    if (p_tcp->tccps != 00) {
9494
10.2M
        opj_free(p_tcp->tccps);
9495
10.2M
        p_tcp->tccps = 00;
9496
10.2M
    }
9497
9498
10.2M
    if (p_tcp->m_mct_coding_matrix != 00) {
9499
0
        opj_free(p_tcp->m_mct_coding_matrix);
9500
0
        p_tcp->m_mct_coding_matrix = 00;
9501
0
    }
9502
9503
10.2M
    if (p_tcp->m_mct_decoding_matrix != 00) {
9504
2.12k
        opj_free(p_tcp->m_mct_decoding_matrix);
9505
2.12k
        p_tcp->m_mct_decoding_matrix = 00;
9506
2.12k
    }
9507
9508
10.2M
    if (p_tcp->m_mcc_records) {
9509
4.09M
        opj_free(p_tcp->m_mcc_records);
9510
4.09M
        p_tcp->m_mcc_records = 00;
9511
4.09M
        p_tcp->m_nb_max_mcc_records = 0;
9512
4.09M
        p_tcp->m_nb_mcc_records = 0;
9513
4.09M
    }
9514
9515
10.2M
    if (p_tcp->m_mct_records) {
9516
4.09M
        opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
9517
4.09M
        OPJ_UINT32 i;
9518
9519
4.27M
        for (i = 0; i < p_tcp->m_nb_mct_records; ++i) {
9520
177k
            if (l_mct_data->m_data) {
9521
5.99k
                opj_free(l_mct_data->m_data);
9522
5.99k
                l_mct_data->m_data = 00;
9523
5.99k
            }
9524
9525
177k
            ++l_mct_data;
9526
177k
        }
9527
9528
4.09M
        opj_free(p_tcp->m_mct_records);
9529
4.09M
        p_tcp->m_mct_records = 00;
9530
4.09M
    }
9531
9532
10.2M
    if (p_tcp->mct_norms != 00) {
9533
0
        opj_free(p_tcp->mct_norms);
9534
0
        p_tcp->mct_norms = 00;
9535
0
    }
9536
9537
10.2M
    opj_j2k_tcp_data_destroy(p_tcp);
9538
9539
10.2M
}
9540
9541
static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp)
9542
10.3M
{
9543
10.3M
    if (p_tcp->m_data) {
9544
47.3k
        opj_free(p_tcp->m_data);
9545
47.3k
        p_tcp->m_data = NULL;
9546
47.3k
        p_tcp->m_data_size = 0;
9547
47.3k
    }
9548
10.3M
}
9549
9550
static void opj_j2k_cp_destroy(opj_cp_t *p_cp)
9551
65.4k
{
9552
65.4k
    OPJ_UINT32 l_nb_tiles;
9553
65.4k
    opj_tcp_t * l_current_tile = 00;
9554
9555
65.4k
    if (p_cp == 00) {
9556
0
        return;
9557
0
    }
9558
65.4k
    if (p_cp->tcps != 00) {
9559
59.0k
        OPJ_UINT32 i;
9560
59.0k
        l_current_tile = p_cp->tcps;
9561
59.0k
        l_nb_tiles = p_cp->th * p_cp->tw;
9562
9563
10.2M
        for (i = 0U; i < l_nb_tiles; ++i) {
9564
10.2M
            opj_j2k_tcp_destroy(l_current_tile);
9565
10.2M
            ++l_current_tile;
9566
10.2M
        }
9567
59.0k
        opj_free(p_cp->tcps);
9568
59.0k
        p_cp->tcps = 00;
9569
59.0k
    }
9570
65.4k
    if (p_cp->ppm_markers != 00) {
9571
474
        OPJ_UINT32 i;
9572
50.1k
        for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
9573
49.6k
            if (p_cp->ppm_markers[i].m_data != NULL) {
9574
1.16k
                opj_free(p_cp->ppm_markers[i].m_data);
9575
1.16k
            }
9576
49.6k
        }
9577
474
        p_cp->ppm_markers_count = 0U;
9578
474
        opj_free(p_cp->ppm_markers);
9579
474
        p_cp->ppm_markers = NULL;
9580
474
    }
9581
65.4k
    opj_free(p_cp->ppm_buffer);
9582
65.4k
    p_cp->ppm_buffer = 00;
9583
65.4k
    p_cp->ppm_data =
9584
65.4k
        NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
9585
65.4k
    opj_free(p_cp->comment);
9586
65.4k
    p_cp->comment = 00;
9587
65.4k
    if (! p_cp->m_is_decoder) {
9588
11.0k
        opj_free(p_cp->m_specific_param.m_enc.m_matrice);
9589
11.0k
        p_cp->m_specific_param.m_enc.m_matrice = 00;
9590
11.0k
    }
9591
65.4k
}
9592
9593
static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t
9594
        *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
9595
        opj_event_mgr_t * p_manager)
9596
254
{
9597
254
    OPJ_BYTE   l_header_data[10];
9598
254
    OPJ_OFF_T  l_stream_pos_backup;
9599
254
    OPJ_UINT32 l_current_marker;
9600
254
    OPJ_UINT32 l_marker_size;
9601
254
    OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts;
9602
9603
    /* initialize to no correction needed */
9604
254
    *p_correction_needed = OPJ_FALSE;
9605
9606
254
    if (!opj_stream_has_seek(p_stream)) {
9607
        /* We can't do much in this case, seek is needed */
9608
0
        return OPJ_TRUE;
9609
0
    }
9610
9611
254
    l_stream_pos_backup = opj_stream_tell(p_stream);
9612
254
    if (l_stream_pos_backup == -1) {
9613
        /* let's do nothing */
9614
0
        return OPJ_TRUE;
9615
0
    }
9616
9617
594
    for (;;) {
9618
        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9619
594
        if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
9620
            /* assume all is OK */
9621
25
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9622
0
                return OPJ_FALSE;
9623
0
            }
9624
25
            return OPJ_TRUE;
9625
25
        }
9626
9627
        /* Read 2 bytes from buffer as the new marker ID */
9628
569
        opj_read_bytes(l_header_data, &l_current_marker, 2);
9629
9630
569
        if (l_current_marker != J2K_MS_SOT) {
9631
            /* assume all is OK */
9632
65
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9633
0
                return OPJ_FALSE;
9634
0
            }
9635
65
            return OPJ_TRUE;
9636
65
        }
9637
9638
        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9639
504
        if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
9640
6
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9641
6
            return OPJ_FALSE;
9642
6
        }
9643
9644
        /* Read 2 bytes from the buffer as the marker size */
9645
498
        opj_read_bytes(l_header_data, &l_marker_size, 2);
9646
9647
        /* Check marker size for SOT Marker */
9648
498
        if (l_marker_size != 10) {
9649
4
            opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
9650
4
            return OPJ_FALSE;
9651
4
        }
9652
494
        l_marker_size -= 2;
9653
9654
494
        if (opj_stream_read_data(p_stream, l_header_data, l_marker_size,
9655
494
                                 p_manager) != l_marker_size) {
9656
8
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9657
8
            return OPJ_FALSE;
9658
8
        }
9659
9660
486
        if (! opj_j2k_get_sot_values(l_header_data, l_marker_size, &l_tile_no,
9661
486
                                     &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
9662
0
            return OPJ_FALSE;
9663
0
        }
9664
9665
486
        if (l_tile_no == tile_no) {
9666
            /* we found what we were looking for */
9667
57
            break;
9668
57
        }
9669
9670
429
        if (l_tot_len < 14U) {
9671
            /* last SOT until EOC or invalid Psot value */
9672
            /* assume all is OK */
9673
4
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9674
0
                return OPJ_FALSE;
9675
0
            }
9676
4
            return OPJ_TRUE;
9677
4
        }
9678
425
        l_tot_len -= 12U;
9679
        /* look for next SOT marker */
9680
425
        if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len),
9681
425
                            p_manager) != (OPJ_OFF_T)(l_tot_len)) {
9682
            /* assume all is OK */
9683
85
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9684
0
                return OPJ_FALSE;
9685
0
            }
9686
85
            return OPJ_TRUE;
9687
85
        }
9688
425
    }
9689
9690
    /* check for correction */
9691
57
    if (l_current_part == l_num_parts) {
9692
52
        *p_correction_needed = OPJ_TRUE;
9693
52
    }
9694
9695
57
    if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9696
0
        return OPJ_FALSE;
9697
0
    }
9698
57
    return OPJ_TRUE;
9699
57
}
9700
9701
OPJ_BOOL opj_j2k_read_tile_header(opj_j2k_t * p_j2k,
9702
                                  OPJ_UINT32 * p_tile_index,
9703
                                  OPJ_UINT32 * p_data_size,
9704
                                  OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
9705
                                  OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
9706
                                  OPJ_UINT32 * p_nb_comps,
9707
                                  OPJ_BOOL * p_go_on,
9708
                                  opj_stream_private_t *p_stream,
9709
                                  opj_event_mgr_t * p_manager)
9710
50.6k
{
9711
50.6k
    OPJ_UINT32 l_current_marker = J2K_MS_SOT;
9712
50.6k
    OPJ_UINT32 l_marker_size;
9713
50.6k
    const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
9714
50.6k
    opj_tcp_t * l_tcp = NULL;
9715
50.6k
    const OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
9716
9717
    /* preconditions */
9718
50.6k
    assert(p_stream != 00);
9719
50.6k
    assert(p_j2k != 00);
9720
50.6k
    assert(p_manager != 00);
9721
9722
    /* Reach the End Of Codestream ?*/
9723
50.6k
    if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
9724
637
        l_current_marker = J2K_MS_EOC;
9725
637
    }
9726
    /* We need to encounter a SOT marker (a new tile-part header) */
9727
50.0k
    else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
9728
0
        return OPJ_FALSE;
9729
0
    }
9730
9731
    /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
9732
115k
    while ((!p_j2k->m_specific_param.m_decoder.m_can_decode) &&
9733
104k
            (l_current_marker != J2K_MS_EOC)) {
9734
9735
103k
        if (p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts > 0 &&
9736
1.34k
                p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts <
9737
1.34k
                p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts) {
9738
965
            OPJ_OFF_T next_tp_sot_pos;
9739
9740
965
            next_tp_sot_pos =
9741
965
                p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset[p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts];
9742
965
            ++p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts;
9743
965
            if (!(opj_stream_read_seek(p_stream,
9744
965
                                       next_tp_sot_pos,
9745
965
                                       p_manager))) {
9746
0
                opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
9747
0
                return OPJ_FALSE;
9748
0
            }
9749
9750
            /* Try to read 2 bytes (the marker ID) from stream and copy them into the buffer */
9751
965
            if (opj_stream_read_data(p_stream,
9752
965
                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9753
188
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9754
188
                return OPJ_FALSE;
9755
188
            }
9756
9757
            /* Read 2 bytes from the buffer as the marker ID */
9758
777
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9759
777
                           &l_current_marker,
9760
777
                           2);
9761
9762
777
            if (l_current_marker != J2K_MS_SOT) {
9763
16
                opj_event_msg(p_manager, EVT_ERROR, "Did not get expected SOT marker\n");
9764
16
                return OPJ_FALSE;
9765
16
            }
9766
777
        }
9767
9768
        /* Try to read until the Start Of Data is detected */
9769
172k
        while (l_current_marker != J2K_MS_SOD) {
9770
9771
107k
            if (opj_stream_get_number_byte_left(p_stream) == 0) {
9772
34.7k
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9773
34.7k
                break;
9774
34.7k
            }
9775
9776
            /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9777
72.6k
            if (opj_stream_read_data(p_stream,
9778
72.6k
                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9779
139
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9780
139
                return OPJ_FALSE;
9781
139
            }
9782
9783
            /* Read 2 bytes from the buffer as the marker size */
9784
72.5k
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
9785
72.5k
                           2);
9786
9787
            /* Check marker size (does not include marker ID but includes marker size) */
9788
72.5k
            if (l_marker_size < 2) {
9789
161
                opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
9790
161
                return OPJ_FALSE;
9791
161
            }
9792
9793
            /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
9794
72.3k
            if (l_current_marker == 0x8080 &&
9795
12
                    opj_stream_get_number_byte_left(p_stream) == 0) {
9796
7
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9797
7
                break;
9798
7
            }
9799
9800
            /* Why this condition? FIXME */
9801
72.3k
            if ((p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH) &&
9802
19.6k
                    p_j2k->m_specific_param.m_decoder.m_sot_length != 0) {
9803
13.4k
                if (p_j2k->m_specific_param.m_decoder.m_sot_length < l_marker_size + 2) {
9804
103
                    opj_event_msg(p_manager, EVT_ERROR,
9805
103
                                  "Sot length is less than marker size + marker ID\n");
9806
103
                    return OPJ_FALSE;
9807
103
                }
9808
13.3k
                p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
9809
13.3k
            }
9810
72.2k
            l_marker_size -= 2; /* Subtract the size of the marker ID already read */
9811
9812
            /* Get the marker handler from the marker ID */
9813
72.2k
            l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9814
9815
            /* Check if the marker is known and if it is the right place to find it */
9816
72.2k
            if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
9817
119
                opj_event_msg(p_manager, EVT_ERROR,
9818
119
                              "Marker is not compliant with its position\n");
9819
119
                return OPJ_FALSE;
9820
119
            }
9821
            /* FIXME manage case of unknown marker as in the main header ? */
9822
9823
            /* Check if the marker size is compatible with the header data size */
9824
72.1k
            if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
9825
604
                OPJ_BYTE *new_header_data = NULL;
9826
                /* If we are here, this means we consider this marker as known & we will read it */
9827
                /* Check enough bytes left in stream before allocation */
9828
604
                if ((OPJ_OFF_T)l_marker_size >  opj_stream_get_number_byte_left(p_stream)) {
9829
585
                    opj_event_msg(p_manager, EVT_ERROR,
9830
585
                                  "Marker size inconsistent with stream length\n");
9831
585
                    return OPJ_FALSE;
9832
585
                }
9833
19
                new_header_data = (OPJ_BYTE *) opj_realloc(
9834
19
                                      p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
9835
19
                if (! new_header_data) {
9836
0
                    opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9837
0
                    p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
9838
0
                    p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9839
0
                    opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
9840
0
                    return OPJ_FALSE;
9841
0
                }
9842
19
                p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
9843
19
                p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
9844
19
            }
9845
9846
            /* Try to read the rest of the marker segment from stream and copy them into the buffer */
9847
71.5k
            if (opj_stream_read_data(p_stream,
9848
71.5k
                                     p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
9849
71.5k
                                     p_manager) != l_marker_size) {
9850
613
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9851
613
                return OPJ_FALSE;
9852
613
            }
9853
9854
70.9k
            if (!l_marker_handler->handler) {
9855
                /* See issue #175 */
9856
51
                opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
9857
51
                return OPJ_FALSE;
9858
51
            }
9859
            /* Read the marker segment with the correct marker handler */
9860
70.9k
            if (!(*(l_marker_handler->handler))(p_j2k,
9861
70.9k
                                                p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
9862
579
                opj_event_msg(p_manager, EVT_ERROR,
9863
579
                              "Fail to read the current marker segment (%#x)\n", l_current_marker);
9864
579
                return OPJ_FALSE;
9865
579
            }
9866
9867
            /* Add the marker to the codestream index*/
9868
70.3k
            if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
9869
70.3k
                                                  p_j2k->cstr_index,
9870
70.3k
                                                  l_marker_handler->id,
9871
70.3k
                                                  (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
9872
70.3k
                                                  l_marker_size + 4)) {
9873
0
                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
9874
0
                return OPJ_FALSE;
9875
0
            }
9876
9877
            /* Keep the position of the last SOT marker read */
9878
70.3k
            if (l_marker_handler->id == J2K_MS_SOT) {
9879
51.7k
                OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4
9880
51.7k
                                     ;
9881
51.7k
                if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos) {
9882
51.7k
                    p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
9883
51.7k
                }
9884
51.7k
            }
9885
9886
70.3k
            if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
9887
                /* Skip the rest of the tile part header*/
9888
1.61k
                if (opj_stream_skip(p_stream, p_j2k->m_specific_param.m_decoder.m_sot_length,
9889
1.61k
                                    p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
9890
185
                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9891
185
                    return OPJ_FALSE;
9892
185
                }
9893
1.42k
                l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
9894
68.7k
            } else {
9895
                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
9896
68.7k
                if (opj_stream_read_data(p_stream,
9897
68.7k
                                         p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9898
239
                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9899
239
                    return OPJ_FALSE;
9900
239
                }
9901
                /* Read 2 bytes from the buffer as the new marker ID */
9902
68.4k
                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9903
68.4k
                               &l_current_marker, 2);
9904
68.4k
            }
9905
70.3k
        }
9906
100k
        if (opj_stream_get_number_byte_left(p_stream) == 0
9907
34.8k
                && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
9908
34.7k
            break;
9909
34.7k
        }
9910
9911
        /* If we didn't skip data before, we need to read the SOD marker*/
9912
65.5k
        if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
9913
            /* Try to read the SOD marker and skip data ? FIXME */
9914
64.1k
            if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
9915
312
                return OPJ_FALSE;
9916
312
            }
9917
9918
            /* Check if we can use the TLM index to access the next tile-part */
9919
63.8k
            if (!p_j2k->m_specific_param.m_decoder.m_can_decode &&
9920
52.0k
                    p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0 &&
9921
0
                    p_j2k->m_current_tile_number == (OPJ_UINT32)
9922
0
                    p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec &&
9923
0
                    !p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid &&
9924
0
                    opj_stream_has_seek(p_stream)) {
9925
0
                l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
9926
0
                if (l_tcp->m_nb_tile_parts ==
9927
0
                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps &&
9928
0
                        (OPJ_UINT32)l_tcp->m_current_tile_part_number + 1 < l_tcp->m_nb_tile_parts) {
9929
0
                    const OPJ_OFF_T next_tp_sot_pos = p_j2k->cstr_index->tile_index[
9930
0
                                                          p_j2k->m_current_tile_number].tp_index[l_tcp->m_current_tile_part_number +
9931
0
                                                                  1].start_pos;
9932
9933
0
                    if (next_tp_sot_pos != opj_stream_tell(p_stream)) {
9934
#if 0
9935
                        opj_event_msg(p_manager, EVT_INFO,
9936
                                      "opj_j2k_read_tile_header(tile=%u): seek to tile part %u at %" PRId64 "\n",
9937
                                      p_j2k->m_current_tile_number,
9938
                                      l_tcp->m_current_tile_part_number + 1,
9939
                                      next_tp_sot_pos);
9940
#endif
9941
9942
0
                        if (!(opj_stream_read_seek(p_stream,
9943
0
                                                   next_tp_sot_pos,
9944
0
                                                   p_manager))) {
9945
0
                            opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
9946
0
                            return OPJ_FALSE;
9947
0
                        }
9948
0
                    }
9949
9950
                    /* Try to read 2 bytes (the marker ID) from stream and copy them into the buffer */
9951
0
                    if (opj_stream_read_data(p_stream,
9952
0
                                             p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9953
0
                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9954
0
                        return OPJ_FALSE;
9955
0
                    }
9956
9957
                    /* Read 2 bytes from the buffer as the marker ID */
9958
0
                    opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9959
0
                                   &l_current_marker,
9960
0
                                   2);
9961
9962
0
                    if (l_current_marker != J2K_MS_SOT) {
9963
0
                        opj_event_msg(p_manager, EVT_ERROR, "Did not get expected SOT marker\n");
9964
0
                        return OPJ_FALSE;
9965
0
                    }
9966
9967
0
                    continue;
9968
0
                }
9969
0
            }
9970
9971
63.8k
            if (p_j2k->m_specific_param.m_decoder.m_can_decode &&
9972
11.7k
                    !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) {
9973
                /* Issue 254 */
9974
3.26k
                OPJ_BOOL l_correction_needed = OPJ_FALSE;
9975
9976
3.26k
                p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
9977
3.26k
                if (p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts == 1) {
9978
                    /* Skip opj_j2k_need_nb_tile_parts_correction() if there is
9979
                     * only a single tile part declared. The
9980
                     * opj_j2k_need_nb_tile_parts_correction() hack was needed
9981
                     * for files with 5 declared tileparts (where they were
9982
                     * actually 6).
9983
                     * Doing it systematically hurts performance when reading
9984
                     * Sentinel2 L1C JPEG2000 files as explained in
9985
                     * https://lists.osgeo.org/pipermail/gdal-dev/2024-November/059805.html
9986
                     */
9987
3.01k
                } else if (!opj_j2k_need_nb_tile_parts_correction(p_stream,
9988
254
                           p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
9989
18
                    opj_event_msg(p_manager, EVT_ERROR,
9990
18
                                  "opj_j2k_apply_nb_tile_parts_correction error\n");
9991
18
                    return OPJ_FALSE;
9992
18
                }
9993
3.25k
                if (l_correction_needed) {
9994
52
                    OPJ_UINT32 l_tile_no;
9995
9996
52
                    p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
9997
52
                    p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1;
9998
                    /* correct tiles */
9999
7.29k
                    for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
10000
7.24k
                        if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) {
10001
57
                            p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts += 1;
10002
57
                        }
10003
7.24k
                    }
10004
52
                    opj_event_msg(p_manager, EVT_WARNING,
10005
52
                                  "Non conformant codestream TPsot==TNsot.\n");
10006
52
                }
10007
3.25k
            }
10008
63.8k
        } else {
10009
            /* Indicate we will try to read a new tile-part header*/
10010
1.42k
            p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
10011
1.42k
            p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
10012
1.42k
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
10013
1.42k
        }
10014
10015
65.2k
        if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
10016
            /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
10017
53.5k
            if (opj_stream_read_data(p_stream,
10018
53.5k
                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
10019
10020
                /* Deal with likely non conformant SPOT6 files, where the last */
10021
                /* row of tiles have TPsot == 0 and TNsot == 0, and missing EOC, */
10022
                /* but no other tile-parts were found. */
10023
130
                if (p_j2k->m_current_tile_number + 1 == l_nb_tiles) {
10024
89
                    OPJ_UINT32 l_tile_no;
10025
1.17k
                    for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
10026
1.11k
                        if (p_j2k->m_cp.tcps[l_tile_no].m_current_tile_part_number == 0 &&
10027
179
                                p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts == 0) {
10028
30
                            break;
10029
30
                        }
10030
1.11k
                    }
10031
89
                    if (l_tile_no < l_nb_tiles) {
10032
30
                        opj_event_msg(p_manager, EVT_INFO,
10033
30
                                      "Tile %u has TPsot == 0 and TNsot == 0, "
10034
30
                                      "but no other tile-parts were found. "
10035
30
                                      "EOC is also missing.\n",
10036
30
                                      l_tile_no);
10037
30
                        p_j2k->m_current_tile_number = l_tile_no;
10038
30
                        l_current_marker = J2K_MS_EOC;
10039
30
                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10040
30
                        break;
10041
30
                    }
10042
89
                }
10043
10044
100
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
10045
100
                return OPJ_FALSE;
10046
130
            }
10047
10048
            /* Read 2 bytes from buffer as the new marker ID */
10049
53.4k
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
10050
53.4k
                           &l_current_marker, 2);
10051
53.4k
        }
10052
65.2k
    }
10053
10054
    /* Current marker is the EOC marker ?*/
10055
47.2k
    if (l_current_marker == J2K_MS_EOC) {
10056
836
        if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
10057
169
            p_j2k->m_current_tile_number = 0;
10058
169
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10059
169
        }
10060
836
    }
10061
10062
    /* Deal with tiles that have a single tile-part with TPsot == 0 and TNsot == 0 */
10063
47.2k
    if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
10064
35.3k
        l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
10065
10066
76.5k
        while ((p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00)) {
10067
41.2k
            ++p_j2k->m_current_tile_number;
10068
41.2k
            ++l_tcp;
10069
41.2k
        }
10070
10071
35.3k
        if (p_j2k->m_current_tile_number == l_nb_tiles) {
10072
419
            *p_go_on = OPJ_FALSE;
10073
419
            return OPJ_TRUE;
10074
419
        }
10075
35.3k
    }
10076
10077
46.8k
    if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number,
10078
46.8k
                            p_manager)) {
10079
4
        opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n");
10080
4
        return OPJ_FALSE;
10081
4
    }
10082
    /*FIXME ???*/
10083
46.8k
    if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
10084
46.8k
                                   p_manager)) {
10085
0
        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
10086
0
        return OPJ_FALSE;
10087
0
    }
10088
10089
46.8k
    opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
10090
46.8k
                  p_j2k->m_current_tile_number + 1, (p_j2k->m_cp.th * p_j2k->m_cp.tw));
10091
10092
46.8k
    *p_tile_index = p_j2k->m_current_tile_number;
10093
46.8k
    *p_go_on = OPJ_TRUE;
10094
46.8k
    if (p_data_size) {
10095
        /* For internal use in j2k.c, we don't need this */
10096
        /* This is just needed for folks using the opj_read_tile_header() / opj_decode_tile_data() combo */
10097
0
        *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd, OPJ_FALSE);
10098
0
        if (*p_data_size == UINT_MAX) {
10099
0
            return OPJ_FALSE;
10100
0
        }
10101
0
    }
10102
46.8k
    *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
10103
46.8k
    *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
10104
46.8k
    *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
10105
46.8k
    *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
10106
46.8k
    *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
10107
10108
46.8k
    p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
10109
10110
46.8k
    return OPJ_TRUE;
10111
46.8k
}
10112
10113
OPJ_BOOL opj_j2k_decode_tile(opj_j2k_t * p_j2k,
10114
                             OPJ_UINT32 p_tile_index,
10115
                             OPJ_BYTE * p_data,
10116
                             OPJ_UINT32 p_data_size,
10117
                             opj_stream_private_t *p_stream,
10118
                             opj_event_mgr_t * p_manager)
10119
46.8k
{
10120
46.8k
    OPJ_UINT32 l_current_marker;
10121
46.8k
    OPJ_BYTE l_data [2];
10122
46.8k
    opj_tcp_t * l_tcp;
10123
46.8k
    opj_image_t* l_image_for_bounds;
10124
10125
    /* preconditions */
10126
46.8k
    assert(p_stream != 00);
10127
46.8k
    assert(p_j2k != 00);
10128
46.8k
    assert(p_manager != 00);
10129
10130
46.8k
    if (!(p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_DATA)
10131
46.8k
            || (p_tile_index != p_j2k->m_current_tile_number)) {
10132
0
        return OPJ_FALSE;
10133
0
    }
10134
10135
46.8k
    l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
10136
46.8k
    if (! l_tcp->m_data) {
10137
243
        opj_j2k_tcp_destroy(l_tcp);
10138
243
        return OPJ_FALSE;
10139
243
    }
10140
10141
    /* When using the opj_read_tile_header / opj_decode_tile_data API */
10142
    /* such as in test_tile_decoder, m_output_image is NULL, so fall back */
10143
    /* to the full image dimension. This is a bit surprising that */
10144
    /* opj_set_decode_area() is only used to determine intersecting tiles, */
10145
    /* but full tile decoding is done */
10146
46.5k
    l_image_for_bounds = p_j2k->m_output_image ? p_j2k->m_output_image :
10147
46.5k
                         p_j2k->m_private_image;
10148
46.5k
    if (! opj_tcd_decode_tile(p_j2k->m_tcd,
10149
46.5k
                              l_image_for_bounds->x0,
10150
46.5k
                              l_image_for_bounds->y0,
10151
46.5k
                              l_image_for_bounds->x1,
10152
46.5k
                              l_image_for_bounds->y1,
10153
46.5k
                              p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode,
10154
46.5k
                              p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
10155
46.5k
                              l_tcp->m_data,
10156
46.5k
                              l_tcp->m_data_size,
10157
46.5k
                              p_tile_index,
10158
46.5k
                              p_j2k->cstr_index, p_manager)) {
10159
4.79k
        opj_j2k_tcp_destroy(l_tcp);
10160
4.79k
        p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
10161
4.79k
        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
10162
4.79k
        return OPJ_FALSE;
10163
4.79k
    }
10164
10165
    /* p_data can be set to NULL when the call will take care of using */
10166
    /* itself the TCD data. This is typically the case for whole single */
10167
    /* tile decoding optimization. */
10168
41.8k
    if (p_data != NULL) {
10169
0
        if (! opj_tcd_update_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
10170
0
            return OPJ_FALSE;
10171
0
        }
10172
10173
        /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
10174
        * we destroy just the data which will be re-read in read_tile_header*/
10175
        /*opj_j2k_tcp_destroy(l_tcp);
10176
        p_j2k->m_tcd->tcp = 0;*/
10177
0
        opj_j2k_tcp_data_destroy(l_tcp);
10178
0
    }
10179
10180
41.8k
    p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
10181
41.8k
    p_j2k->m_specific_param.m_decoder.m_state &= (~(OPJ_UINT32)J2K_STATE_DATA);
10182
10183
41.8k
    if (opj_stream_get_number_byte_left(p_stream) == 0
10184
30.8k
            && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
10185
30.1k
        return OPJ_TRUE;
10186
30.1k
    }
10187
10188
11.6k
    if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
10189
10.9k
        if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
10190
608
            opj_event_msg(p_manager, p_j2k->m_cp.strict ? EVT_ERROR : EVT_WARNING,
10191
608
                          "Stream too short\n");
10192
608
            return p_j2k->m_cp.strict ? OPJ_FALSE : OPJ_TRUE;
10193
608
        }
10194
10.3k
        opj_read_bytes(l_data, &l_current_marker, 2);
10195
10196
10.3k
        if (l_current_marker == J2K_MS_EOC) {
10197
151
            p_j2k->m_current_tile_number = 0;
10198
151
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10199
10.2k
        } else if (l_current_marker != J2K_MS_SOT) {
10200
971
            if (opj_stream_get_number_byte_left(p_stream) == 0) {
10201
489
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
10202
489
                opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n");
10203
489
                return OPJ_TRUE;
10204
489
            }
10205
482
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
10206
482
            return OPJ_FALSE;
10207
971
        }
10208
10.3k
    }
10209
10210
10.0k
    return OPJ_TRUE;
10211
11.6k
}
10212
10213
static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd,
10214
        opj_image_t* p_output_image)
10215
40.4k
{
10216
40.4k
    OPJ_UINT32 i, j;
10217
40.4k
    OPJ_UINT32 l_width_src, l_height_src;
10218
40.4k
    OPJ_UINT32 l_width_dest, l_height_dest;
10219
40.4k
    OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
10220
40.4k
    OPJ_SIZE_T l_start_offset_src;
10221
40.4k
    OPJ_UINT32 l_start_x_dest, l_start_y_dest;
10222
40.4k
    OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
10223
40.4k
    OPJ_SIZE_T l_start_offset_dest;
10224
10225
40.4k
    opj_image_comp_t * l_img_comp_src = 00;
10226
40.4k
    opj_image_comp_t * l_img_comp_dest = 00;
10227
10228
40.4k
    opj_tcd_tilecomp_t * l_tilec = 00;
10229
40.4k
    opj_image_t * l_image_src = 00;
10230
40.4k
    OPJ_INT32 * l_dest_ptr;
10231
10232
40.4k
    l_tilec = p_tcd->tcd_image->tiles->comps;
10233
40.4k
    l_image_src = p_tcd->image;
10234
40.4k
    l_img_comp_src = l_image_src->comps;
10235
10236
40.4k
    l_img_comp_dest = p_output_image->comps;
10237
10238
202k
    for (i = 0; i < l_image_src->numcomps;
10239
162k
            i++, ++l_img_comp_dest, ++l_img_comp_src,  ++l_tilec) {
10240
162k
        OPJ_INT32 res_x0, res_x1, res_y0, res_y1;
10241
162k
        OPJ_UINT32 src_data_stride;
10242
162k
        const OPJ_INT32* p_src_data;
10243
10244
        /* Copy info from decoded comp image to output image */
10245
162k
        l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
10246
10247
162k
        if (p_tcd->whole_tile_decoding) {
10248
79.7k
            opj_tcd_resolution_t* l_res = l_tilec->resolutions +
10249
79.7k
                                          l_img_comp_src->resno_decoded;
10250
79.7k
            res_x0 = l_res->x0;
10251
79.7k
            res_y0 = l_res->y0;
10252
79.7k
            res_x1 = l_res->x1;
10253
79.7k
            res_y1 = l_res->y1;
10254
79.7k
            src_data_stride = (OPJ_UINT32)(
10255
79.7k
                                  l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x1 -
10256
79.7k
                                  l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x0);
10257
79.7k
            p_src_data = l_tilec->data;
10258
82.6k
        } else {
10259
82.6k
            opj_tcd_resolution_t* l_res = l_tilec->resolutions +
10260
82.6k
                                          l_img_comp_src->resno_decoded;
10261
82.6k
            res_x0 = (OPJ_INT32)l_res->win_x0;
10262
82.6k
            res_y0 = (OPJ_INT32)l_res->win_y0;
10263
82.6k
            res_x1 = (OPJ_INT32)l_res->win_x1;
10264
82.6k
            res_y1 = (OPJ_INT32)l_res->win_y1;
10265
82.6k
            src_data_stride = l_res->win_x1 - l_res->win_x0;
10266
82.6k
            p_src_data = l_tilec->data_win;
10267
82.6k
        }
10268
10269
162k
        if (p_src_data == NULL) {
10270
            /* Happens for partial component decoding */
10271
30.7k
            continue;
10272
30.7k
        }
10273
10274
131k
        l_width_src = (OPJ_UINT32)(res_x1 - res_x0);
10275
131k
        l_height_src = (OPJ_UINT32)(res_y1 - res_y0);
10276
10277
10278
        /* Current tile component size*/
10279
        /*if (i == 0) {
10280
        fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
10281
                        res_x0, res_x1, res_y0, res_y1);
10282
        }*/
10283
10284
10285
        /* Border of the current output component*/
10286
131k
        l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor);
10287
131k
        l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor);
10288
131k
        l_x1_dest = l_x0_dest +
10289
131k
                    l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */
10290
131k
        l_y1_dest = l_y0_dest + l_img_comp_dest->h;
10291
10292
        /*if (i == 0) {
10293
        fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
10294
                        l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
10295
        }*/
10296
10297
        /*-----*/
10298
        /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
10299
         * of the input buffer (decoded tile component) which will be move
10300
         * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
10301
         * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified
10302
         * by this input area.
10303
         * */
10304
131k
        assert(res_x0 >= 0);
10305
131k
        assert(res_x1 >= 0);
10306
131k
        if (l_x0_dest < (OPJ_UINT32)res_x0) {
10307
25.7k
            l_start_x_dest = (OPJ_UINT32)res_x0 - l_x0_dest;
10308
25.7k
            l_offset_x0_src = 0;
10309
10310
25.7k
            if (l_x1_dest >= (OPJ_UINT32)res_x1) {
10311
25.7k
                l_width_dest = l_width_src;
10312
25.7k
                l_offset_x1_src = 0;
10313
25.7k
            } else {
10314
0
                l_width_dest = l_x1_dest - (OPJ_UINT32)res_x0 ;
10315
0
                l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
10316
0
            }
10317
105k
        } else {
10318
105k
            l_start_x_dest = 0U;
10319
105k
            l_offset_x0_src = (OPJ_INT32)l_x0_dest - res_x0;
10320
10321
105k
            if (l_x1_dest >= (OPJ_UINT32)res_x1) {
10322
105k
                l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
10323
105k
                l_offset_x1_src = 0;
10324
105k
            } else {
10325
0
                l_width_dest = l_img_comp_dest->w ;
10326
0
                l_offset_x1_src = res_x1 - (OPJ_INT32)l_x1_dest;
10327
0
            }
10328
105k
        }
10329
10330
131k
        if (l_y0_dest < (OPJ_UINT32)res_y0) {
10331
28.4k
            l_start_y_dest = (OPJ_UINT32)res_y0 - l_y0_dest;
10332
28.4k
            l_offset_y0_src = 0;
10333
10334
28.4k
            if (l_y1_dest >= (OPJ_UINT32)res_y1) {
10335
28.4k
                l_height_dest = l_height_src;
10336
28.4k
                l_offset_y1_src = 0;
10337
28.4k
            } else {
10338
0
                l_height_dest = l_y1_dest - (OPJ_UINT32)res_y0 ;
10339
0
                l_offset_y1_src = (OPJ_INT32)(l_height_src - l_height_dest);
10340
0
            }
10341
103k
        } else {
10342
103k
            l_start_y_dest = 0U;
10343
103k
            l_offset_y0_src = (OPJ_INT32)l_y0_dest - res_y0;
10344
10345
103k
            if (l_y1_dest >= (OPJ_UINT32)res_y1) {
10346
103k
                l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
10347
103k
                l_offset_y1_src = 0;
10348
103k
            } else {
10349
0
                l_height_dest = l_img_comp_dest->h ;
10350
0
                l_offset_y1_src = res_y1 - (OPJ_INT32)l_y1_dest;
10351
0
            }
10352
103k
        }
10353
10354
131k
        if ((l_offset_x0_src < 0) || (l_offset_y0_src < 0) || (l_offset_x1_src < 0) ||
10355
131k
                (l_offset_y1_src < 0)) {
10356
0
            return OPJ_FALSE;
10357
0
        }
10358
        /* testcase 2977.pdf.asan.67.2198 */
10359
131k
        if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
10360
55
            return OPJ_FALSE;
10361
55
        }
10362
        /*-----*/
10363
10364
        /* Compute the input buffer offset */
10365
131k
        l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src
10366
131k
                             * (OPJ_SIZE_T)src_data_stride;
10367
10368
        /* Compute the output buffer offset */
10369
131k
        l_start_offset_dest = (OPJ_SIZE_T)l_start_x_dest + (OPJ_SIZE_T)l_start_y_dest
10370
131k
                              * (OPJ_SIZE_T)l_img_comp_dest->w;
10371
10372
        /* Allocate output component buffer if necessary */
10373
131k
        if (l_img_comp_dest->data == NULL &&
10374
91.9k
                l_start_offset_src == 0 && l_start_offset_dest == 0 &&
10375
77.7k
                src_data_stride == l_img_comp_dest->w &&
10376
68.9k
                l_width_dest == l_img_comp_dest->w &&
10377
67.7k
                l_height_dest == l_img_comp_dest->h) {
10378
            /* If the final image matches the tile buffer, then borrow it */
10379
            /* directly to save a copy */
10380
53.0k
            if (p_tcd->whole_tile_decoding) {
10381
13.5k
                l_img_comp_dest->data = l_tilec->data;
10382
13.5k
                l_tilec->data = NULL;
10383
39.4k
            } else {
10384
39.4k
                l_img_comp_dest->data = l_tilec->data_win;
10385
39.4k
                l_tilec->data_win = NULL;
10386
39.4k
            }
10387
53.0k
            continue;
10388
78.5k
        } else if (l_img_comp_dest->data == NULL) {
10389
38.8k
            OPJ_SIZE_T l_width = l_img_comp_dest->w;
10390
38.8k
            OPJ_SIZE_T l_height = l_img_comp_dest->h;
10391
10392
38.8k
            if ((l_height == 0U) || (l_width > (SIZE_MAX / l_height)) ||
10393
38.8k
                    l_width * l_height > SIZE_MAX / sizeof(OPJ_INT32)) {
10394
                /* would overflow */
10395
0
                return OPJ_FALSE;
10396
0
            }
10397
38.8k
            l_img_comp_dest->data = (OPJ_INT32*) opj_image_data_alloc(l_width * l_height *
10398
38.8k
                                    sizeof(OPJ_INT32));
10399
38.8k
            if (! l_img_comp_dest->data) {
10400
0
                return OPJ_FALSE;
10401
0
            }
10402
10403
38.8k
            if (l_img_comp_dest->w != l_width_dest ||
10404
38.8k
                    l_img_comp_dest->h != l_height_dest) {
10405
38.8k
                memset(l_img_comp_dest->data, 0,
10406
38.8k
                       (OPJ_SIZE_T)l_img_comp_dest->w * l_img_comp_dest->h * sizeof(OPJ_INT32));
10407
38.8k
            }
10408
38.8k
        }
10409
10410
        /* Move the output buffer to the first place where we will write*/
10411
78.5k
        l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
10412
10413
78.5k
        {
10414
78.5k
            const OPJ_INT32 * l_src_ptr = p_src_data;
10415
78.5k
            l_src_ptr += l_start_offset_src;
10416
10417
6.11M
            for (j = 0; j < l_height_dest; ++j) {
10418
6.03M
                memcpy(l_dest_ptr, l_src_ptr, l_width_dest * sizeof(OPJ_INT32));
10419
6.03M
                l_dest_ptr += l_img_comp_dest->w;
10420
6.03M
                l_src_ptr += src_data_stride;
10421
6.03M
            }
10422
78.5k
        }
10423
10424
10425
78.5k
    }
10426
10427
40.4k
    return OPJ_TRUE;
10428
40.4k
}
10429
10430
static OPJ_BOOL opj_j2k_update_image_dimensions(opj_image_t* p_image,
10431
        opj_event_mgr_t * p_manager)
10432
40.8k
{
10433
40.8k
    OPJ_UINT32 it_comp;
10434
40.8k
    OPJ_INT32 l_comp_x1, l_comp_y1;
10435
40.8k
    opj_image_comp_t* l_img_comp = NULL;
10436
10437
40.8k
    l_img_comp = p_image->comps;
10438
217k
    for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
10439
177k
        OPJ_INT32 l_h, l_w;
10440
177k
        if (p_image->x0 > (OPJ_UINT32)INT_MAX ||
10441
177k
                p_image->y0 > (OPJ_UINT32)INT_MAX ||
10442
177k
                p_image->x1 > (OPJ_UINT32)INT_MAX ||
10443
177k
                p_image->y1 > (OPJ_UINT32)INT_MAX) {
10444
0
            opj_event_msg(p_manager, EVT_ERROR,
10445
0
                          "Image coordinates above INT_MAX are not supported\n");
10446
0
            return OPJ_FALSE;
10447
0
        }
10448
10449
177k
        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
10450
177k
        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
10451
177k
        l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
10452
177k
        l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
10453
10454
177k
        l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
10455
177k
              - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
10456
177k
        if (l_w < 0) {
10457
0
            opj_event_msg(p_manager, EVT_ERROR,
10458
0
                          "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
10459
0
                          it_comp, l_w);
10460
0
            return OPJ_FALSE;
10461
0
        }
10462
177k
        l_img_comp->w = (OPJ_UINT32)l_w;
10463
10464
177k
        l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
10465
177k
              - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
10466
177k
        if (l_h < 0) {
10467
0
            opj_event_msg(p_manager, EVT_ERROR,
10468
0
                          "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
10469
0
                          it_comp, l_h);
10470
0
            return OPJ_FALSE;
10471
0
        }
10472
177k
        l_img_comp->h = (OPJ_UINT32)l_h;
10473
10474
177k
        l_img_comp++;
10475
177k
    }
10476
10477
40.8k
    return OPJ_TRUE;
10478
40.8k
}
10479
10480
OPJ_BOOL opj_j2k_set_decoded_components(opj_j2k_t *p_j2k,
10481
                                        OPJ_UINT32 numcomps,
10482
                                        const OPJ_UINT32* comps_indices,
10483
                                        opj_event_mgr_t * p_manager)
10484
0
{
10485
0
    OPJ_UINT32 i;
10486
0
    OPJ_BOOL* already_mapped;
10487
10488
0
    if (p_j2k->m_private_image == NULL) {
10489
0
        opj_event_msg(p_manager, EVT_ERROR,
10490
0
                      "opj_read_header() should be called before "
10491
0
                      "opj_set_decoded_components().\n");
10492
0
        return OPJ_FALSE;
10493
0
    }
10494
10495
0
    already_mapped = (OPJ_BOOL*) opj_calloc(sizeof(OPJ_BOOL),
10496
0
                                            p_j2k->m_private_image->numcomps);
10497
0
    if (already_mapped == NULL) {
10498
0
        return OPJ_FALSE;
10499
0
    }
10500
10501
0
    for (i = 0; i < numcomps; i++) {
10502
0
        if (comps_indices[i] >= p_j2k->m_private_image->numcomps) {
10503
0
            opj_event_msg(p_manager, EVT_ERROR,
10504
0
                          "Invalid component index: %u\n",
10505
0
                          comps_indices[i]);
10506
0
            opj_free(already_mapped);
10507
0
            return OPJ_FALSE;
10508
0
        }
10509
0
        if (already_mapped[comps_indices[i]]) {
10510
0
            opj_event_msg(p_manager, EVT_ERROR,
10511
0
                          "Component index %u used several times\n",
10512
0
                          comps_indices[i]);
10513
0
            opj_free(already_mapped);
10514
0
            return OPJ_FALSE;
10515
0
        }
10516
0
        already_mapped[comps_indices[i]] = OPJ_TRUE;
10517
0
    }
10518
0
    opj_free(already_mapped);
10519
10520
0
    opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
10521
0
    if (numcomps) {
10522
0
        p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode =
10523
0
            (OPJ_UINT32*) opj_malloc(numcomps * sizeof(OPJ_UINT32));
10524
0
        if (p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode == NULL) {
10525
0
            p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
10526
0
            return OPJ_FALSE;
10527
0
        }
10528
0
        memcpy(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
10529
0
               comps_indices,
10530
0
               numcomps * sizeof(OPJ_UINT32));
10531
0
    } else {
10532
0
        p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = NULL;
10533
0
    }
10534
0
    p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = numcomps;
10535
10536
0
    return OPJ_TRUE;
10537
0
}
10538
10539
10540
OPJ_BOOL opj_j2k_set_decode_area(opj_j2k_t *p_j2k,
10541
                                 opj_image_t* p_image,
10542
                                 OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
10543
                                 OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
10544
                                 opj_event_mgr_t * p_manager)
10545
40.9k
{
10546
40.9k
    opj_cp_t * l_cp = &(p_j2k->m_cp);
10547
40.9k
    opj_image_t * l_image = p_j2k->m_private_image;
10548
40.9k
    OPJ_BOOL ret;
10549
40.9k
    OPJ_UINT32 it_comp;
10550
10551
40.9k
    if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
10552
30.0k
            p_j2k->m_cp.tcps[0].m_data != NULL) {
10553
        /* In the case of a single-tiled image whose codestream we have already */
10554
        /* ingested, go on */
10555
0
    }
10556
    /* Check if we are read the main header */
10557
40.9k
    else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
10558
0
        opj_event_msg(p_manager, EVT_ERROR,
10559
0
                      "Need to decode the main header before begin to decode the remaining codestream.\n");
10560
0
        return OPJ_FALSE;
10561
0
    }
10562
10563
    /* Update the comps[].factor member of the output image with the one */
10564
    /* of m_reduce */
10565
218k
    for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
10566
177k
        p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
10567
177k
    }
10568
10569
40.9k
    if (!p_start_x && !p_start_y && !p_end_x && !p_end_y) {
10570
144
        opj_event_msg(p_manager, EVT_INFO,
10571
144
                      "No decoded area parameters, set the decoded area to the whole image\n");
10572
10573
144
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
10574
144
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
10575
144
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
10576
144
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
10577
10578
144
        p_image->x0 = l_image->x0;
10579
144
        p_image->y0 = l_image->y0;
10580
144
        p_image->x1 = l_image->x1;
10581
144
        p_image->y1 = l_image->y1;
10582
10583
144
        return opj_j2k_update_image_dimensions(p_image, p_manager);
10584
144
    }
10585
10586
    /* ----- */
10587
    /* Check if the positions provided by the user are correct */
10588
10589
    /* Left */
10590
40.7k
    if (p_start_x < 0) {
10591
0
        opj_event_msg(p_manager, EVT_ERROR,
10592
0
                      "Left position of the decoded area (region_x0=%d) should be >= 0.\n",
10593
0
                      p_start_x);
10594
0
        return OPJ_FALSE;
10595
40.7k
    } else if ((OPJ_UINT32)p_start_x > l_image->x1) {
10596
0
        opj_event_msg(p_manager, EVT_ERROR,
10597
0
                      "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
10598
0
                      p_start_x, l_image->x1);
10599
0
        return OPJ_FALSE;
10600
40.7k
    } else if ((OPJ_UINT32)p_start_x < l_image->x0) {
10601
13.6k
        opj_event_msg(p_manager, EVT_WARNING,
10602
13.6k
                      "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
10603
13.6k
                      p_start_x, l_image->x0);
10604
13.6k
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
10605
13.6k
        p_image->x0 = l_image->x0;
10606
27.1k
    } else {
10607
27.1k
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x -
10608
27.1k
                l_cp->tx0) / l_cp->tdx;
10609
27.1k
        p_image->x0 = (OPJ_UINT32)p_start_x;
10610
27.1k
    }
10611
10612
    /* Up */
10613
40.7k
    if (p_start_y < 0) {
10614
0
        opj_event_msg(p_manager, EVT_ERROR,
10615
0
                      "Up position of the decoded area (region_y0=%d) should be >= 0.\n",
10616
0
                      p_start_y);
10617
0
        return OPJ_FALSE;
10618
40.7k
    } else if ((OPJ_UINT32)p_start_y > l_image->y1) {
10619
0
        opj_event_msg(p_manager, EVT_ERROR,
10620
0
                      "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
10621
0
                      p_start_y, l_image->y1);
10622
0
        return OPJ_FALSE;
10623
40.7k
    } else if ((OPJ_UINT32)p_start_y < l_image->y0) {
10624
15.6k
        opj_event_msg(p_manager, EVT_WARNING,
10625
15.6k
                      "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
10626
15.6k
                      p_start_y, l_image->y0);
10627
15.6k
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
10628
15.6k
        p_image->y0 = l_image->y0;
10629
25.1k
    } else {
10630
25.1k
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y -
10631
25.1k
                l_cp->ty0) / l_cp->tdy;
10632
25.1k
        p_image->y0 = (OPJ_UINT32)p_start_y;
10633
25.1k
    }
10634
10635
    /* Right */
10636
40.7k
    if (p_end_x <= 0) {
10637
5
        opj_event_msg(p_manager, EVT_ERROR,
10638
5
                      "Right position of the decoded area (region_x1=%d) should be > 0.\n",
10639
5
                      p_end_x);
10640
5
        return OPJ_FALSE;
10641
40.7k
    } else if ((OPJ_UINT32)p_end_x < l_image->x0) {
10642
18
        opj_event_msg(p_manager, EVT_ERROR,
10643
18
                      "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
10644
18
                      p_end_x, l_image->x0);
10645
18
        return OPJ_FALSE;
10646
40.7k
    } else if ((OPJ_UINT32)p_end_x > l_image->x1) {
10647
0
        opj_event_msg(p_manager, EVT_WARNING,
10648
0
                      "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
10649
0
                      p_end_x, l_image->x1);
10650
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
10651
0
        p_image->x1 = l_image->x1;
10652
40.7k
    } else {
10653
40.7k
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv((
10654
40.7k
                    OPJ_UINT32)p_end_x - l_cp->tx0, l_cp->tdx);
10655
40.7k
        p_image->x1 = (OPJ_UINT32)p_end_x;
10656
40.7k
    }
10657
10658
    /* Bottom */
10659
40.7k
    if (p_end_y <= 0) {
10660
5
        opj_event_msg(p_manager, EVT_ERROR,
10661
5
                      "Bottom position of the decoded area (region_y1=%d) should be > 0.\n",
10662
5
                      p_end_y);
10663
5
        return OPJ_FALSE;
10664
40.7k
    } else if ((OPJ_UINT32)p_end_y < l_image->y0) {
10665
18
        opj_event_msg(p_manager, EVT_ERROR,
10666
18
                      "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
10667
18
                      p_end_y, l_image->y0);
10668
18
        return OPJ_FALSE;
10669
18
    }
10670
40.7k
    if ((OPJ_UINT32)p_end_y > l_image->y1) {
10671
0
        opj_event_msg(p_manager, EVT_WARNING,
10672
0
                      "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
10673
0
                      p_end_y, l_image->y1);
10674
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
10675
0
        p_image->y1 = l_image->y1;
10676
40.7k
    } else {
10677
40.7k
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv((
10678
40.7k
                    OPJ_UINT32)p_end_y - l_cp->ty0, l_cp->tdy);
10679
40.7k
        p_image->y1 = (OPJ_UINT32)p_end_y;
10680
40.7k
    }
10681
    /* ----- */
10682
10683
40.7k
    p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
10684
10685
40.7k
    ret = opj_j2k_update_image_dimensions(p_image, p_manager);
10686
10687
40.7k
    if (ret) {
10688
40.7k
        opj_event_msg(p_manager, EVT_INFO, "Setting decoding area to %d,%d,%d,%d\n",
10689
40.7k
                      p_image->x0, p_image->y0, p_image->x1, p_image->y1);
10690
40.7k
    }
10691
10692
40.7k
    return ret;
10693
40.7k
}
10694
10695
opj_j2k_t* opj_j2k_create_decompress(void)
10696
54.4k
{
10697
54.4k
    opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
10698
54.4k
    if (!l_j2k) {
10699
0
        return 00;
10700
0
    }
10701
10702
54.4k
    l_j2k->m_is_decoder = 1;
10703
54.4k
    l_j2k->m_cp.m_is_decoder = 1;
10704
    /* in the absence of JP2 boxes, consider different bit depth / sign */
10705
    /* per component is allowed */
10706
54.4k
    l_j2k->m_cp.allow_different_bit_depth_sign = 1;
10707
10708
    /* Default to using strict mode. */
10709
54.4k
    l_j2k->m_cp.strict = OPJ_TRUE;
10710
10711
#ifdef OPJ_DISABLE_TPSOT_FIX
10712
    l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
10713
#endif
10714
10715
54.4k
    l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,
10716
54.4k
            sizeof(opj_tcp_t));
10717
54.4k
    if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
10718
0
        opj_j2k_destroy(l_j2k);
10719
0
        return 00;
10720
0
    }
10721
10722
54.4k
    l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,
10723
54.4k
            OPJ_J2K_DEFAULT_HEADER_SIZE);
10724
54.4k
    if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
10725
0
        opj_j2k_destroy(l_j2k);
10726
0
        return 00;
10727
0
    }
10728
10729
54.4k
    l_j2k->m_specific_param.m_decoder.m_header_data_size =
10730
54.4k
        OPJ_J2K_DEFAULT_HEADER_SIZE;
10731
10732
54.4k
    l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
10733
10734
54.4k
    l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
10735
10736
    /* codestream index creation */
10737
54.4k
    l_j2k->cstr_index = opj_j2k_create_cstr_index();
10738
54.4k
    if (!l_j2k->cstr_index) {
10739
0
        opj_j2k_destroy(l_j2k);
10740
0
        return 00;
10741
0
    }
10742
10743
    /* validation list creation */
10744
54.4k
    l_j2k->m_validation_list = opj_procedure_list_create();
10745
54.4k
    if (! l_j2k->m_validation_list) {
10746
0
        opj_j2k_destroy(l_j2k);
10747
0
        return 00;
10748
0
    }
10749
10750
    /* execution list creation */
10751
54.4k
    l_j2k->m_procedure_list = opj_procedure_list_create();
10752
54.4k
    if (! l_j2k->m_procedure_list) {
10753
0
        opj_j2k_destroy(l_j2k);
10754
0
        return 00;
10755
0
    }
10756
10757
54.4k
    l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
10758
54.4k
    if (!l_j2k->m_tp) {
10759
0
        l_j2k->m_tp = opj_thread_pool_create(0);
10760
0
    }
10761
54.4k
    if (!l_j2k->m_tp) {
10762
0
        opj_j2k_destroy(l_j2k);
10763
0
        return NULL;
10764
0
    }
10765
10766
54.4k
    return l_j2k;
10767
54.4k
}
10768
10769
static opj_codestream_index_t* opj_j2k_create_cstr_index(void)
10770
54.4k
{
10771
54.4k
    opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
10772
54.4k
                                         opj_calloc(1, sizeof(opj_codestream_index_t));
10773
54.4k
    if (!cstr_index) {
10774
0
        return NULL;
10775
0
    }
10776
10777
54.4k
    cstr_index->maxmarknum = 100;
10778
54.4k
    cstr_index->marknum = 0;
10779
54.4k
    cstr_index->marker = (opj_marker_info_t*)
10780
54.4k
                         opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
10781
54.4k
    if (!cstr_index-> marker) {
10782
0
        opj_free(cstr_index);
10783
0
        return NULL;
10784
0
    }
10785
10786
54.4k
    cstr_index->tile_index = NULL;
10787
10788
54.4k
    return cstr_index;
10789
54.4k
}
10790
10791
static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t *p_j2k,
10792
        OPJ_UINT32 p_tile_no,
10793
        OPJ_UINT32 p_comp_no)
10794
36.0k
{
10795
36.0k
    opj_cp_t *l_cp = 00;
10796
36.0k
    opj_tcp_t *l_tcp = 00;
10797
36.0k
    opj_tccp_t *l_tccp = 00;
10798
10799
    /* preconditions */
10800
36.0k
    assert(p_j2k != 00);
10801
10802
36.0k
    l_cp = &(p_j2k->m_cp);
10803
36.0k
    l_tcp = &l_cp->tcps[p_tile_no];
10804
36.0k
    l_tccp = &l_tcp->tccps[p_comp_no];
10805
10806
    /* preconditions again */
10807
36.0k
    assert(p_tile_no < (l_cp->tw * l_cp->th));
10808
36.0k
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
10809
10810
36.0k
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10811
3.15k
        return 5 + l_tccp->numresolutions;
10812
32.8k
    } else {
10813
32.8k
        return 5;
10814
32.8k
    }
10815
36.0k
}
10816
10817
static OPJ_BOOL opj_j2k_compare_SPCod_SPCoc(opj_j2k_t *p_j2k,
10818
        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
10819
1.51k
{
10820
1.51k
    OPJ_UINT32 i;
10821
1.51k
    opj_cp_t *l_cp = NULL;
10822
1.51k
    opj_tcp_t *l_tcp = NULL;
10823
1.51k
    opj_tccp_t *l_tccp0 = NULL;
10824
1.51k
    opj_tccp_t *l_tccp1 = NULL;
10825
10826
    /* preconditions */
10827
1.51k
    assert(p_j2k != 00);
10828
10829
1.51k
    l_cp = &(p_j2k->m_cp);
10830
1.51k
    l_tcp = &l_cp->tcps[p_tile_no];
10831
1.51k
    l_tccp0 = &l_tcp->tccps[p_first_comp_no];
10832
1.51k
    l_tccp1 = &l_tcp->tccps[p_second_comp_no];
10833
10834
1.51k
    if (l_tccp0->numresolutions != l_tccp1->numresolutions) {
10835
0
        return OPJ_FALSE;
10836
0
    }
10837
1.51k
    if (l_tccp0->cblkw != l_tccp1->cblkw) {
10838
0
        return OPJ_FALSE;
10839
0
    }
10840
1.51k
    if (l_tccp0->cblkh != l_tccp1->cblkh) {
10841
0
        return OPJ_FALSE;
10842
0
    }
10843
1.51k
    if (l_tccp0->cblksty != l_tccp1->cblksty) {
10844
0
        return OPJ_FALSE;
10845
0
    }
10846
1.51k
    if (l_tccp0->qmfbid != l_tccp1->qmfbid) {
10847
0
        return OPJ_FALSE;
10848
0
    }
10849
1.51k
    if ((l_tccp0->csty & J2K_CCP_CSTY_PRT) != (l_tccp1->csty & J2K_CCP_CSTY_PRT)) {
10850
0
        return OPJ_FALSE;
10851
0
    }
10852
10853
5.96k
    for (i = 0U; i < l_tccp0->numresolutions; ++i) {
10854
4.45k
        if (l_tccp0->prcw[i] != l_tccp1->prcw[i]) {
10855
0
            return OPJ_FALSE;
10856
0
        }
10857
4.45k
        if (l_tccp0->prch[i] != l_tccp1->prch[i]) {
10858
0
            return OPJ_FALSE;
10859
0
        }
10860
4.45k
    }
10861
1.51k
    return OPJ_TRUE;
10862
1.51k
}
10863
10864
static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(opj_j2k_t *p_j2k,
10865
        OPJ_UINT32 p_tile_no,
10866
        OPJ_UINT32 p_comp_no,
10867
        OPJ_BYTE * p_data,
10868
        OPJ_UINT32 * p_header_size,
10869
        struct opj_event_mgr * p_manager)
10870
10.9k
{
10871
10.9k
    OPJ_UINT32 i;
10872
10.9k
    opj_cp_t *l_cp = 00;
10873
10.9k
    opj_tcp_t *l_tcp = 00;
10874
10.9k
    opj_tccp_t *l_tccp = 00;
10875
10876
    /* preconditions */
10877
10.9k
    assert(p_j2k != 00);
10878
10.9k
    assert(p_header_size != 00);
10879
10.9k
    assert(p_manager != 00);
10880
10.9k
    assert(p_data != 00);
10881
10882
10.9k
    l_cp = &(p_j2k->m_cp);
10883
10.9k
    l_tcp = &l_cp->tcps[p_tile_no];
10884
10.9k
    l_tccp = &l_tcp->tccps[p_comp_no];
10885
10886
    /* preconditions again */
10887
10.9k
    assert(p_tile_no < (l_cp->tw * l_cp->th));
10888
10.9k
    assert(p_comp_no < (p_j2k->m_private_image->numcomps));
10889
10890
10.9k
    if (*p_header_size < 5) {
10891
0
        opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
10892
0
        return OPJ_FALSE;
10893
0
    }
10894
10895
10.9k
    opj_write_bytes(p_data, l_tccp->numresolutions - 1, 1); /* SPcoc (D) */
10896
10.9k
    ++p_data;
10897
10898
10.9k
    opj_write_bytes(p_data, l_tccp->cblkw - 2, 1);                  /* SPcoc (E) */
10899
10.9k
    ++p_data;
10900
10901
10.9k
    opj_write_bytes(p_data, l_tccp->cblkh - 2, 1);                  /* SPcoc (F) */
10902
10.9k
    ++p_data;
10903
10904
10.9k
    opj_write_bytes(p_data, l_tccp->cblksty,
10905
10.9k
                    1);                            /* SPcoc (G) */
10906
10.9k
    ++p_data;
10907
10908
10.9k
    opj_write_bytes(p_data, l_tccp->qmfbid,
10909
10.9k
                    1);                             /* SPcoc (H) */
10910
10.9k
    ++p_data;
10911
10912
10.9k
    *p_header_size = *p_header_size - 5;
10913
10914
10.9k
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10915
10916
1.05k
        if (*p_header_size < l_tccp->numresolutions) {
10917
0
            opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
10918
0
            return OPJ_FALSE;
10919
0
        }
10920
10921
7.07k
        for (i = 0; i < l_tccp->numresolutions; ++i) {
10922
6.02k
            opj_write_bytes(p_data, l_tccp->prcw[i] + (l_tccp->prch[i] << 4),
10923
6.02k
                            1);   /* SPcoc (I_i) */
10924
6.02k
            ++p_data;
10925
6.02k
        }
10926
10927
1.05k
        *p_header_size = *p_header_size - l_tccp->numresolutions;
10928
1.05k
    }
10929
10930
10.9k
    return OPJ_TRUE;
10931
10.9k
}
10932
10933
static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
10934
        OPJ_UINT32 compno,
10935
        OPJ_BYTE * p_header_data,
10936
        OPJ_UINT32 * p_header_size,
10937
        opj_event_mgr_t * p_manager)
10938
52.5k
{
10939
52.5k
    OPJ_UINT32 i, l_tmp;
10940
52.5k
    opj_cp_t *l_cp = NULL;
10941
52.5k
    opj_tcp_t *l_tcp = NULL;
10942
52.5k
    opj_tccp_t *l_tccp = NULL;
10943
52.5k
    OPJ_BYTE * l_current_ptr = NULL;
10944
10945
    /* preconditions */
10946
52.5k
    assert(p_j2k != 00);
10947
52.5k
    assert(p_manager != 00);
10948
52.5k
    assert(p_header_data != 00);
10949
10950
52.5k
    l_cp = &(p_j2k->m_cp);
10951
52.5k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
10952
727
            &l_cp->tcps[p_j2k->m_current_tile_number] :
10953
52.5k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
10954
10955
    /* precondition again */
10956
52.5k
    assert(compno < p_j2k->m_private_image->numcomps);
10957
10958
52.5k
    l_tccp = &l_tcp->tccps[compno];
10959
52.5k
    l_current_ptr = p_header_data;
10960
10961
    /* make sure room is sufficient */
10962
52.5k
    if (*p_header_size < 5) {
10963
45
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
10964
45
        return OPJ_FALSE;
10965
45
    }
10966
10967
    /* SPcod (D) / SPcoc (A) */
10968
52.4k
    opj_read_bytes(l_current_ptr, &l_tccp->numresolutions, 1);
10969
52.4k
    ++l_tccp->numresolutions;  /* tccp->numresolutions = read() + 1 */
10970
52.4k
    if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
10971
51
        opj_event_msg(p_manager, EVT_ERROR,
10972
51
                      "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
10973
51
                      l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
10974
51
        return OPJ_FALSE;
10975
51
    }
10976
52.4k
    ++l_current_ptr;
10977
10978
    /* If user wants to remove more resolutions than the codestream contains, return error */
10979
52.4k
    if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
10980
0
        opj_event_msg(p_manager, EVT_ERROR,
10981
0
                      "Error decoding component %d.\nThe number of resolutions "
10982
0
                      "to remove (%d) is greater or equal than the number "
10983
0
                      "of resolutions of this component (%d)\nModify the cp_reduce parameter.\n\n",
10984
0
                      compno, l_cp->m_specific_param.m_dec.m_reduce, l_tccp->numresolutions);
10985
0
        p_j2k->m_specific_param.m_decoder.m_state |=
10986
0
            0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
10987
0
        return OPJ_FALSE;
10988
0
    }
10989
10990
    /* SPcod (E) / SPcoc (B) */
10991
52.4k
    opj_read_bytes(l_current_ptr, &l_tccp->cblkw, 1);
10992
52.4k
    ++l_current_ptr;
10993
52.4k
    l_tccp->cblkw += 2;
10994
10995
    /* SPcod (F) / SPcoc (C) */
10996
52.4k
    opj_read_bytes(l_current_ptr, &l_tccp->cblkh, 1);
10997
52.4k
    ++l_current_ptr;
10998
52.4k
    l_tccp->cblkh += 2;
10999
11000
52.4k
    if ((l_tccp->cblkw > 10) || (l_tccp->cblkh > 10) ||
11001
52.3k
            ((l_tccp->cblkw + l_tccp->cblkh) > 12)) {
11002
112
        opj_event_msg(p_manager, EVT_ERROR,
11003
112
                      "Error reading SPCod SPCoc element, Invalid cblkw/cblkh combination\n");
11004
112
        return OPJ_FALSE;
11005
112
    }
11006
11007
    /* SPcod (G) / SPcoc (D) */
11008
52.3k
    opj_read_bytes(l_current_ptr, &l_tccp->cblksty, 1);
11009
52.3k
    ++l_current_ptr;
11010
52.3k
    if ((l_tccp->cblksty & J2K_CCP_CBLKSTY_HTMIXED) != 0) {
11011
        /* We do not support HT mixed mode yet.  For conformance, it should be supported.*/
11012
25
        opj_event_msg(p_manager, EVT_ERROR,
11013
25
                      "Error reading SPCod SPCoc element. Unsupported Mixed HT code-block style found\n");
11014
25
        return OPJ_FALSE;
11015
25
    }
11016
11017
    /* SPcod (H) / SPcoc (E) */
11018
52.2k
    opj_read_bytes(l_current_ptr, &l_tccp->qmfbid, 1);
11019
52.2k
    ++l_current_ptr;
11020
11021
52.2k
    if (l_tccp->qmfbid > 1) {
11022
55
        opj_event_msg(p_manager, EVT_ERROR,
11023
55
                      "Error reading SPCod SPCoc element, Invalid transformation found\n");
11024
55
        return OPJ_FALSE;
11025
55
    }
11026
11027
52.2k
    *p_header_size = *p_header_size - 5;
11028
11029
    /* use custom precinct size ? */
11030
52.2k
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
11031
27.8k
        if (*p_header_size < l_tccp->numresolutions) {
11032
25
            opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
11033
25
            return OPJ_FALSE;
11034
25
        }
11035
11036
        /* SPcod (I_i) / SPcoc (F_i) */
11037
75.5k
        for (i = 0; i < l_tccp->numresolutions; ++i) {
11038
47.8k
            opj_read_bytes(l_current_ptr, &l_tmp, 1);
11039
47.8k
            ++l_current_ptr;
11040
            /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */
11041
47.8k
            if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) {
11042
43
                opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n");
11043
43
                return OPJ_FALSE;
11044
43
            }
11045
47.7k
            l_tccp->prcw[i] = l_tmp & 0xf;
11046
47.7k
            l_tccp->prch[i] = l_tmp >> 4;
11047
47.7k
        }
11048
11049
27.7k
        *p_header_size = *p_header_size - l_tccp->numresolutions;
11050
27.7k
    } else {
11051
        /* set default size for the precinct width and height */
11052
193k
        for (i = 0; i < l_tccp->numresolutions; ++i) {
11053
169k
            l_tccp->prcw[i] = 15;
11054
169k
            l_tccp->prch[i] = 15;
11055
169k
        }
11056
24.3k
    }
11057
11058
#ifdef WIP_REMOVE_MSD
11059
    /* INDEX >> */
11060
    if (p_j2k->cstr_info && compno == 0) {
11061
        OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
11062
11063
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh =
11064
            l_tccp->cblkh;
11065
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw =
11066
            l_tccp->cblkw;
11067
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions
11068
            = l_tccp->numresolutions;
11069
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty =
11070
            l_tccp->cblksty;
11071
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid =
11072
            l_tccp->qmfbid;
11073
11074
        memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx, l_tccp->prcw,
11075
               l_data_size);
11076
        memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy, l_tccp->prch,
11077
               l_data_size);
11078
    }
11079
    /* << INDEX */
11080
#endif
11081
11082
52.1k
    return OPJ_TRUE;
11083
52.2k
}
11084
11085
static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k)
11086
49.7k
{
11087
    /* loop */
11088
49.7k
    OPJ_UINT32 i;
11089
49.7k
    opj_cp_t *l_cp = NULL;
11090
49.7k
    opj_tcp_t *l_tcp = NULL;
11091
49.7k
    opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
11092
49.7k
    OPJ_UINT32 l_prc_size;
11093
11094
    /* preconditions */
11095
49.7k
    assert(p_j2k != 00);
11096
11097
49.7k
    l_cp = &(p_j2k->m_cp);
11098
49.7k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
11099
49.7k
            ?
11100
261
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11101
49.7k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11102
11103
49.7k
    l_ref_tccp = &l_tcp->tccps[0];
11104
49.7k
    l_copied_tccp = l_ref_tccp + 1;
11105
49.7k
    l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
11106
11107
291k
    for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
11108
241k
        l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
11109
241k
        l_copied_tccp->cblkw = l_ref_tccp->cblkw;
11110
241k
        l_copied_tccp->cblkh = l_ref_tccp->cblkh;
11111
241k
        l_copied_tccp->cblksty = l_ref_tccp->cblksty;
11112
241k
        l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
11113
241k
        memcpy(l_copied_tccp->prcw, l_ref_tccp->prcw, l_prc_size);
11114
241k
        memcpy(l_copied_tccp->prch, l_ref_tccp->prch, l_prc_size);
11115
241k
        ++l_copied_tccp;
11116
241k
    }
11117
49.7k
}
11118
11119
static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size(opj_j2k_t *p_j2k,
11120
        OPJ_UINT32 p_tile_no,
11121
        OPJ_UINT32 p_comp_no)
11122
10.9k
{
11123
10.9k
    OPJ_UINT32 l_num_bands;
11124
11125
10.9k
    opj_cp_t *l_cp = 00;
11126
10.9k
    opj_tcp_t *l_tcp = 00;
11127
10.9k
    opj_tccp_t *l_tccp = 00;
11128
11129
    /* preconditions */
11130
10.9k
    assert(p_j2k != 00);
11131
11132
10.9k
    l_cp = &(p_j2k->m_cp);
11133
10.9k
    l_tcp = &l_cp->tcps[p_tile_no];
11134
10.9k
    l_tccp = &l_tcp->tccps[p_comp_no];
11135
11136
    /* preconditions again */
11137
10.9k
    assert(p_tile_no < l_cp->tw * l_cp->th);
11138
10.9k
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
11139
11140
10.9k
    l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11141
10.9k
                  (l_tccp->numresolutions * 3 - 2);
11142
11143
10.9k
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
11144
9.94k
        return 1 + l_num_bands;
11145
9.94k
    } else {
11146
1.05k
        return 1 + 2 * l_num_bands;
11147
1.05k
    }
11148
10.9k
}
11149
11150
static OPJ_BOOL opj_j2k_compare_SQcd_SQcc(opj_j2k_t *p_j2k,
11151
        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
11152
1.51k
{
11153
1.51k
    opj_cp_t *l_cp = NULL;
11154
1.51k
    opj_tcp_t *l_tcp = NULL;
11155
1.51k
    opj_tccp_t *l_tccp0 = NULL;
11156
1.51k
    opj_tccp_t *l_tccp1 = NULL;
11157
1.51k
    OPJ_UINT32 l_band_no, l_num_bands;
11158
11159
    /* preconditions */
11160
1.51k
    assert(p_j2k != 00);
11161
11162
1.51k
    l_cp = &(p_j2k->m_cp);
11163
1.51k
    l_tcp = &l_cp->tcps[p_tile_no];
11164
1.51k
    l_tccp0 = &l_tcp->tccps[p_first_comp_no];
11165
1.51k
    l_tccp1 = &l_tcp->tccps[p_second_comp_no];
11166
11167
1.51k
    if (l_tccp0->qntsty != l_tccp1->qntsty) {
11168
0
        return OPJ_FALSE;
11169
0
    }
11170
1.51k
    if (l_tccp0->numgbits != l_tccp1->numgbits) {
11171
0
        return OPJ_FALSE;
11172
0
    }
11173
1.51k
    if (l_tccp0->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11174
0
        l_num_bands = 1U;
11175
1.51k
    } else {
11176
1.51k
        l_num_bands = l_tccp0->numresolutions * 3U - 2U;
11177
1.51k
        if (l_num_bands != (l_tccp1->numresolutions * 3U - 2U)) {
11178
0
            return OPJ_FALSE;
11179
0
        }
11180
1.51k
    }
11181
11182
11.8k
    for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11183
10.3k
        if (l_tccp0->stepsizes[l_band_no].expn != l_tccp1->stepsizes[l_band_no].expn) {
11184
0
            return OPJ_FALSE;
11185
0
        }
11186
10.3k
    }
11187
1.51k
    if (l_tccp0->qntsty != J2K_CCP_QNTSTY_NOQNT) {
11188
0
        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11189
0
            if (l_tccp0->stepsizes[l_band_no].mant != l_tccp1->stepsizes[l_band_no].mant) {
11190
0
                return OPJ_FALSE;
11191
0
            }
11192
0
        }
11193
0
    }
11194
1.51k
    return OPJ_TRUE;
11195
1.51k
}
11196
11197
11198
static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
11199
                                        OPJ_UINT32 p_tile_no,
11200
                                        OPJ_UINT32 p_comp_no,
11201
                                        OPJ_BYTE * p_data,
11202
                                        OPJ_UINT32 * p_header_size,
11203
                                        struct opj_event_mgr * p_manager)
11204
10.9k
{
11205
10.9k
    OPJ_UINT32 l_header_size;
11206
10.9k
    OPJ_UINT32 l_band_no, l_num_bands;
11207
10.9k
    OPJ_UINT32 l_expn, l_mant;
11208
11209
10.9k
    opj_cp_t *l_cp = 00;
11210
10.9k
    opj_tcp_t *l_tcp = 00;
11211
10.9k
    opj_tccp_t *l_tccp = 00;
11212
11213
    /* preconditions */
11214
10.9k
    assert(p_j2k != 00);
11215
10.9k
    assert(p_header_size != 00);
11216
10.9k
    assert(p_manager != 00);
11217
10.9k
    assert(p_data != 00);
11218
11219
10.9k
    l_cp = &(p_j2k->m_cp);
11220
10.9k
    l_tcp = &l_cp->tcps[p_tile_no];
11221
10.9k
    l_tccp = &l_tcp->tccps[p_comp_no];
11222
11223
    /* preconditions again */
11224
10.9k
    assert(p_tile_no < l_cp->tw * l_cp->th);
11225
10.9k
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
11226
11227
10.9k
    l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11228
10.9k
                  (l_tccp->numresolutions * 3 - 2);
11229
11230
10.9k
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
11231
9.94k
        l_header_size = 1 + l_num_bands;
11232
11233
9.94k
        if (*p_header_size < l_header_size) {
11234
0
            opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
11235
0
            return OPJ_FALSE;
11236
0
        }
11237
11238
9.94k
        opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
11239
9.94k
                        1);   /* Sqcx */
11240
9.94k
        ++p_data;
11241
11242
132k
        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11243
122k
            l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
11244
122k
            opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */
11245
122k
            ++p_data;
11246
122k
        }
11247
9.94k
    } else {
11248
1.05k
        l_header_size = 1 + 2 * l_num_bands;
11249
11250
1.05k
        if (*p_header_size < l_header_size) {
11251
0
            opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
11252
0
            return OPJ_FALSE;
11253
0
        }
11254
11255
1.05k
        opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
11256
1.05k
                        1);   /* Sqcx */
11257
1.05k
        ++p_data;
11258
11259
17.0k
        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11260
15.9k
            l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
11261
15.9k
            l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
11262
11263
15.9k
            opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */
11264
15.9k
            p_data += 2;
11265
15.9k
        }
11266
1.05k
    }
11267
11268
10.9k
    *p_header_size = *p_header_size - l_header_size;
11269
11270
10.9k
    return OPJ_TRUE;
11271
10.9k
}
11272
11273
static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
11274
                                       OPJ_UINT32 p_comp_no,
11275
                                       OPJ_BYTE* p_header_data,
11276
                                       OPJ_UINT32 * p_header_size,
11277
                                       opj_event_mgr_t * p_manager
11278
                                      )
11279
65.4k
{
11280
    /* loop*/
11281
65.4k
    OPJ_UINT32 l_band_no;
11282
65.4k
    opj_cp_t *l_cp = 00;
11283
65.4k
    opj_tcp_t *l_tcp = 00;
11284
65.4k
    opj_tccp_t *l_tccp = 00;
11285
65.4k
    OPJ_BYTE * l_current_ptr = 00;
11286
65.4k
    OPJ_UINT32 l_tmp, l_num_band;
11287
11288
    /* preconditions*/
11289
65.4k
    assert(p_j2k != 00);
11290
65.4k
    assert(p_manager != 00);
11291
65.4k
    assert(p_header_data != 00);
11292
11293
65.4k
    l_cp = &(p_j2k->m_cp);
11294
    /* come from tile part header or main header ?*/
11295
65.4k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
11296
65.4k
            ?
11297
10.4k
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11298
65.4k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11299
11300
    /* precondition again*/
11301
65.4k
    assert(p_comp_no <  p_j2k->m_private_image->numcomps);
11302
11303
65.4k
    l_tccp = &l_tcp->tccps[p_comp_no];
11304
65.4k
    l_current_ptr = p_header_data;
11305
11306
65.4k
    if (*p_header_size < 1) {
11307
13
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
11308
13
        return OPJ_FALSE;
11309
13
    }
11310
65.4k
    *p_header_size -= 1;
11311
11312
65.4k
    opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* Sqcx */
11313
65.4k
    ++l_current_ptr;
11314
11315
65.4k
    l_tccp->qntsty = l_tmp & 0x1f;
11316
65.4k
    l_tccp->numgbits = l_tmp >> 5;
11317
65.4k
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11318
6.02k
        l_num_band = 1;
11319
59.4k
    } else {
11320
59.4k
        l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
11321
35.2k
                     (*p_header_size) :
11322
59.4k
                     (*p_header_size) / 2;
11323
11324
59.4k
        if (l_num_band > OPJ_J2K_MAXBANDS) {
11325
431
            opj_event_msg(p_manager, EVT_WARNING,
11326
431
                          "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
11327
431
                          "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
11328
431
                          "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS,
11329
431
                          OPJ_J2K_MAXBANDS);
11330
            /*return OPJ_FALSE;*/
11331
431
        }
11332
59.4k
    }
11333
11334
#ifdef USE_JPWL
11335
    if (l_cp->correct) {
11336
11337
        /* if JPWL is on, we check whether there are too many subbands */
11338
        if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
11339
            opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
11340
                          "JPWL: bad number of subbands in Sqcx (%d)\n",
11341
                          l_num_band);
11342
            if (!JPWL_ASSUME) {
11343
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
11344
                return OPJ_FALSE;
11345
            }
11346
            /* we try to correct */
11347
            l_num_band = 1;
11348
            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
11349
                          "- setting number of bands to %d => HYPOTHESIS!!!\n",
11350
                          l_num_band);
11351
        };
11352
11353
    };
11354
#endif /* USE_JPWL */
11355
11356
65.4k
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
11357
193k
        for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
11358
158k
            opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* SPqcx_i */
11359
158k
            ++l_current_ptr;
11360
158k
            if (l_band_no < OPJ_J2K_MAXBANDS) {
11361
144k
                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
11362
144k
                l_tccp->stepsizes[l_band_no].mant = 0;
11363
144k
            }
11364
158k
        }
11365
11366
35.2k
        if (*p_header_size < l_num_band) {
11367
0
            return OPJ_FALSE;
11368
0
        }
11369
35.2k
        *p_header_size = *p_header_size - l_num_band;
11370
35.2k
    } else {
11371
118k
        for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
11372
88.1k
            opj_read_bytes(l_current_ptr, &l_tmp, 2);                       /* SPqcx_i */
11373
88.1k
            l_current_ptr += 2;
11374
88.1k
            if (l_band_no < OPJ_J2K_MAXBANDS) {
11375
83.9k
                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
11376
83.9k
                l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
11377
83.9k
            }
11378
88.1k
        }
11379
11380
30.2k
        if (*p_header_size < 2 * l_num_band) {
11381
10
            return OPJ_FALSE;
11382
10
        }
11383
30.2k
        *p_header_size = *p_header_size - 2 * l_num_band;
11384
30.2k
    }
11385
11386
    /* Add Antonin : if scalar_derived -> compute other stepsizes */
11387
65.4k
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11388
583k
        for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
11389
577k
            l_tccp->stepsizes[l_band_no].expn =
11390
577k
                ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0)
11391
577k
                ?
11392
432k
                (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
11393
577k
            l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
11394
577k
        }
11395
6.01k
    }
11396
11397
65.4k
    return OPJ_TRUE;
11398
65.4k
}
11399
11400
static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k)
11401
62.1k
{
11402
62.1k
    OPJ_UINT32 i;
11403
62.1k
    opj_cp_t *l_cp = NULL;
11404
62.1k
    opj_tcp_t *l_tcp = NULL;
11405
62.1k
    opj_tccp_t *l_ref_tccp = NULL;
11406
62.1k
    opj_tccp_t *l_copied_tccp = NULL;
11407
62.1k
    OPJ_UINT32 l_size;
11408
11409
    /* preconditions */
11410
62.1k
    assert(p_j2k != 00);
11411
11412
62.1k
    l_cp = &(p_j2k->m_cp);
11413
62.1k
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
11414
10.4k
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11415
62.1k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11416
11417
62.1k
    l_ref_tccp = &l_tcp->tccps[0];
11418
62.1k
    l_copied_tccp = l_ref_tccp + 1;
11419
62.1k
    l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
11420
11421
319k
    for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
11422
257k
        l_copied_tccp->qntsty = l_ref_tccp->qntsty;
11423
257k
        l_copied_tccp->numgbits = l_ref_tccp->numgbits;
11424
257k
        memcpy(l_copied_tccp->stepsizes, l_ref_tccp->stepsizes, l_size);
11425
257k
        ++l_copied_tccp;
11426
257k
    }
11427
62.1k
}
11428
11429
static void opj_j2k_dump_tile_info(opj_tcp_t * l_default_tile,
11430
                                   OPJ_INT32 numcomps, FILE* out_stream)
11431
0
{
11432
0
    if (l_default_tile) {
11433
0
        OPJ_INT32 compno;
11434
11435
0
        fprintf(out_stream, "\t default tile {\n");
11436
0
        fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
11437
0
        fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
11438
0
        fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
11439
0
        fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
11440
11441
0
        for (compno = 0; compno < numcomps; compno++) {
11442
0
            opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
11443
0
            OPJ_UINT32 resno;
11444
0
            OPJ_INT32 bandno, numbands;
11445
11446
            /* coding style*/
11447
0
            fprintf(out_stream, "\t\t comp %d {\n", compno);
11448
0
            fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
11449
0
            fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
11450
0
            fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
11451
0
            fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
11452
0
            fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
11453
0
            fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
11454
11455
0
            fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
11456
0
            for (resno = 0; resno < l_tccp->numresolutions; resno++) {
11457
0
                fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
11458
0
            }
11459
0
            fprintf(out_stream, "\n");
11460
11461
            /* quantization style*/
11462
0
            fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
11463
0
            fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
11464
0
            fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
11465
0
            numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11466
0
                       (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
11467
0
            for (bandno = 0; bandno < numbands; bandno++) {
11468
0
                fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
11469
0
                        l_tccp->stepsizes[bandno].expn);
11470
0
            }
11471
0
            fprintf(out_stream, "\n");
11472
11473
            /* RGN value*/
11474
0
            fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
11475
11476
0
            fprintf(out_stream, "\t\t }\n");
11477
0
        } /*end of component of default tile*/
11478
0
        fprintf(out_stream, "\t }\n"); /*end of default tile*/
11479
0
    }
11480
0
}
11481
11482
void j2k_dump(opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)
11483
0
{
11484
    /* Check if the flag is compatible with j2k file*/
11485
0
    if ((flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)) {
11486
0
        fprintf(out_stream, "Wrong flag\n");
11487
0
        return;
11488
0
    }
11489
11490
    /* Dump the image_header */
11491
0
    if (flag & OPJ_IMG_INFO) {
11492
0
        if (p_j2k->m_private_image) {
11493
0
            j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
11494
0
        }
11495
0
    }
11496
11497
    /* Dump the codestream info from main header */
11498
0
    if (flag & OPJ_J2K_MH_INFO) {
11499
0
        if (p_j2k->m_private_image) {
11500
0
            opj_j2k_dump_MH_info(p_j2k, out_stream);
11501
0
        }
11502
0
    }
11503
    /* Dump all tile/codestream info */
11504
0
    if (flag & OPJ_J2K_TCH_INFO) {
11505
0
        OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
11506
0
        OPJ_UINT32 i;
11507
0
        opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
11508
0
        if (p_j2k->m_private_image) {
11509
0
            for (i = 0; i < l_nb_tiles; ++i) {
11510
0
                opj_j2k_dump_tile_info(l_tcp, (OPJ_INT32)p_j2k->m_private_image->numcomps,
11511
0
                                       out_stream);
11512
0
                ++l_tcp;
11513
0
            }
11514
0
        }
11515
0
    }
11516
11517
    /* Dump the codestream info of the current tile */
11518
0
    if (flag & OPJ_J2K_TH_INFO) {
11519
11520
0
    }
11521
11522
    /* Dump the codestream index from main header */
11523
0
    if (flag & OPJ_J2K_MH_IND) {
11524
0
        opj_j2k_dump_MH_index(p_j2k, out_stream);
11525
0
    }
11526
11527
    /* Dump the codestream index of the current tile */
11528
0
    if (flag & OPJ_J2K_TH_IND) {
11529
11530
0
    }
11531
11532
0
}
11533
11534
static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)
11535
0
{
11536
0
    opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
11537
0
    OPJ_UINT32 it_marker, it_tile, it_tile_part;
11538
11539
0
    fprintf(out_stream, "Codestream index from main header: {\n");
11540
11541
0
    fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
11542
0
            "\t Main header end position=%" PRIi64 "\n",
11543
0
            cstr_index->main_head_start, cstr_index->main_head_end);
11544
11545
0
    fprintf(out_stream, "\t Marker list: {\n");
11546
11547
0
    if (cstr_index->marker) {
11548
0
        for (it_marker = 0; it_marker < cstr_index->marknum ; it_marker++) {
11549
0
            fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
11550
0
                    cstr_index->marker[it_marker].type,
11551
0
                    cstr_index->marker[it_marker].pos,
11552
0
                    cstr_index->marker[it_marker].len);
11553
0
        }
11554
0
    }
11555
11556
0
    fprintf(out_stream, "\t }\n");
11557
11558
0
    if (cstr_index->tile_index) {
11559
11560
        /* Simple test to avoid to write empty information*/
11561
0
        OPJ_UINT32 l_acc_nb_of_tile_part = 0;
11562
0
        for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
11563
0
            l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
11564
11565
            /* To avoid regenerating expected opj_dump results from the test */
11566
            /* suite when there is a TLM marker present */
11567
0
            if (cstr_index->tile_index[it_tile].nb_tps &&
11568
0
                    cstr_index->tile_index[it_tile].tp_index &&
11569
0
                    cstr_index->tile_index[it_tile].tp_index[0].start_pos > 0 &&
11570
0
                    cstr_index->tile_index[it_tile].tp_index[0].end_header == 0 &&
11571
0
                    getenv("OJP_DO_NOT_DISPLAY_TILE_INDEX_IF_TLM") != NULL) {
11572
0
                l_acc_nb_of_tile_part = 0;
11573
0
                break;
11574
0
            }
11575
0
        }
11576
11577
0
        if (l_acc_nb_of_tile_part) {
11578
0
            fprintf(out_stream, "\t Tile index: {\n");
11579
11580
0
            for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
11581
0
                OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
11582
11583
0
                fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile,
11584
0
                        nb_of_tile_part);
11585
11586
0
                if (cstr_index->tile_index[it_tile].tp_index) {
11587
0
                    for (it_tile_part = 0; it_tile_part < nb_of_tile_part; it_tile_part++) {
11588
0
                        fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%"
11589
0
                                PRIi64 ", end_pos=%" PRIi64 ".\n",
11590
0
                                it_tile_part,
11591
0
                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
11592
0
                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
11593
0
                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
11594
0
                    }
11595
0
                }
11596
11597
0
                if (cstr_index->tile_index[it_tile].marker) {
11598
0
                    for (it_marker = 0; it_marker < cstr_index->tile_index[it_tile].marknum ;
11599
0
                            it_marker++) {
11600
0
                        fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
11601
0
                                cstr_index->tile_index[it_tile].marker[it_marker].type,
11602
0
                                cstr_index->tile_index[it_tile].marker[it_marker].pos,
11603
0
                                cstr_index->tile_index[it_tile].marker[it_marker].len);
11604
0
                    }
11605
0
                }
11606
0
            }
11607
0
            fprintf(out_stream, "\t }\n");
11608
0
        }
11609
0
    }
11610
11611
0
    fprintf(out_stream, "}\n");
11612
11613
0
}
11614
11615
11616
static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)
11617
0
{
11618
11619
0
    fprintf(out_stream, "Codestream info from main header: {\n");
11620
11621
0
    fprintf(out_stream, "\t tx0=%" PRIu32 ", ty0=%" PRIu32 "\n", p_j2k->m_cp.tx0,
11622
0
            p_j2k->m_cp.ty0);
11623
0
    fprintf(out_stream, "\t tdx=%" PRIu32 ", tdy=%" PRIu32 "\n", p_j2k->m_cp.tdx,
11624
0
            p_j2k->m_cp.tdy);
11625
0
    fprintf(out_stream, "\t tw=%" PRIu32 ", th=%" PRIu32 "\n", p_j2k->m_cp.tw,
11626
0
            p_j2k->m_cp.th);
11627
0
    opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,
11628
0
                           (OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
11629
0
    fprintf(out_stream, "}\n");
11630
0
}
11631
11632
void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag,
11633
                           FILE* out_stream)
11634
0
{
11635
0
    char tab[2];
11636
11637
0
    if (dev_dump_flag) {
11638
0
        fprintf(stdout, "[DEV] Dump an image_header struct {\n");
11639
0
        tab[0] = '\0';
11640
0
    } else {
11641
0
        fprintf(out_stream, "Image info {\n");
11642
0
        tab[0] = '\t';
11643
0
        tab[1] = '\0';
11644
0
    }
11645
11646
0
    fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
11647
0
    fprintf(out_stream,     "%s x1=%d, y1=%d\n", tab, img_header->x1,
11648
0
            img_header->y1);
11649
0
    fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
11650
11651
0
    if (img_header->comps) {
11652
0
        OPJ_UINT32 compno;
11653
0
        for (compno = 0; compno < img_header->numcomps; compno++) {
11654
0
            fprintf(out_stream, "%s\t component %d {\n", tab, compno);
11655
0
            j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag,
11656
0
                                       out_stream);
11657
0
            fprintf(out_stream, "%s}\n", tab);
11658
0
        }
11659
0
    }
11660
11661
0
    fprintf(out_stream, "}\n");
11662
0
}
11663
11664
void j2k_dump_image_comp_header(opj_image_comp_t* comp_header,
11665
                                OPJ_BOOL dev_dump_flag, FILE* out_stream)
11666
0
{
11667
0
    char tab[3];
11668
11669
0
    if (dev_dump_flag) {
11670
0
        fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
11671
0
        tab[0] = '\0';
11672
0
    }       else {
11673
0
        tab[0] = '\t';
11674
0
        tab[1] = '\t';
11675
0
        tab[2] = '\0';
11676
0
    }
11677
11678
0
    fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
11679
0
    fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
11680
0
    fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
11681
11682
0
    if (dev_dump_flag) {
11683
0
        fprintf(out_stream, "}\n");
11684
0
    }
11685
0
}
11686
11687
opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k)
11688
41.9k
{
11689
41.9k
    OPJ_UINT32 compno;
11690
41.9k
    OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
11691
41.9k
    opj_tcp_t *l_default_tile;
11692
41.9k
    opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,
11693
41.9k
                                          sizeof(opj_codestream_info_v2_t));
11694
41.9k
    if (!cstr_info) {
11695
0
        return NULL;
11696
0
    }
11697
11698
41.9k
    cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
11699
11700
41.9k
    cstr_info->tx0 = p_j2k->m_cp.tx0;
11701
41.9k
    cstr_info->ty0 = p_j2k->m_cp.ty0;
11702
41.9k
    cstr_info->tdx = p_j2k->m_cp.tdx;
11703
41.9k
    cstr_info->tdy = p_j2k->m_cp.tdy;
11704
41.9k
    cstr_info->tw = p_j2k->m_cp.tw;
11705
41.9k
    cstr_info->th = p_j2k->m_cp.th;
11706
11707
41.9k
    cstr_info->tile_info = NULL; /* Not fill from the main header*/
11708
11709
41.9k
    l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
11710
11711
41.9k
    cstr_info->m_default_tile_info.csty = l_default_tile->csty;
11712
41.9k
    cstr_info->m_default_tile_info.prg = l_default_tile->prg;
11713
41.9k
    cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
11714
41.9k
    cstr_info->m_default_tile_info.mct = l_default_tile->mct;
11715
11716
41.9k
    cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(
11717
41.9k
                cstr_info->nbcomps, sizeof(opj_tccp_info_t));
11718
41.9k
    if (!cstr_info->m_default_tile_info.tccp_info) {
11719
0
        opj_destroy_cstr_info(&cstr_info);
11720
0
        return NULL;
11721
0
    }
11722
11723
223k
    for (compno = 0; compno < numcomps; compno++) {
11724
181k
        opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
11725
181k
        opj_tccp_info_t *l_tccp_info = &
11726
181k
                                       (cstr_info->m_default_tile_info.tccp_info[compno]);
11727
181k
        OPJ_INT32 bandno, numbands;
11728
11729
        /* coding style*/
11730
181k
        l_tccp_info->csty = l_tccp->csty;
11731
181k
        l_tccp_info->numresolutions = l_tccp->numresolutions;
11732
181k
        l_tccp_info->cblkw = l_tccp->cblkw;
11733
181k
        l_tccp_info->cblkh = l_tccp->cblkh;
11734
181k
        l_tccp_info->cblksty = l_tccp->cblksty;
11735
181k
        l_tccp_info->qmfbid = l_tccp->qmfbid;
11736
181k
        if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS) {
11737
170k
            memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
11738
170k
            memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
11739
170k
        }
11740
11741
        /* quantization style*/
11742
181k
        l_tccp_info->qntsty = l_tccp->qntsty;
11743
181k
        l_tccp_info->numgbits = l_tccp->numgbits;
11744
11745
181k
        numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11746
181k
                   (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
11747
181k
        if (numbands < OPJ_J2K_MAXBANDS) {
11748
2.69M
            for (bandno = 0; bandno < numbands; bandno++) {
11749
2.52M
                l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)
11750
2.52M
                                                      l_tccp->stepsizes[bandno].mant;
11751
2.52M
                l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)
11752
2.52M
                                                      l_tccp->stepsizes[bandno].expn;
11753
2.52M
            }
11754
171k
        }
11755
11756
        /* RGN value*/
11757
181k
        l_tccp_info->roishift = l_tccp->roishift;
11758
181k
    }
11759
11760
41.9k
    return cstr_info;
11761
41.9k
}
11762
11763
opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k)
11764
0
{
11765
0
    opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
11766
0
                                           opj_calloc(1, sizeof(opj_codestream_index_t));
11767
0
    if (!l_cstr_index) {
11768
0
        return NULL;
11769
0
    }
11770
11771
0
    l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
11772
0
    l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
11773
0
    l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
11774
11775
0
    l_cstr_index->marknum = p_j2k->cstr_index->marknum;
11776
0
    l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum *
11777
0
                           sizeof(opj_marker_info_t));
11778
0
    if (!l_cstr_index->marker) {
11779
0
        opj_free(l_cstr_index);
11780
0
        return NULL;
11781
0
    }
11782
11783
0
    if (p_j2k->cstr_index->marker) {
11784
0
        memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker,
11785
0
               l_cstr_index->marknum * sizeof(opj_marker_info_t));
11786
0
    } else {
11787
0
        opj_free(l_cstr_index->marker);
11788
0
        l_cstr_index->marker = NULL;
11789
0
    }
11790
11791
0
    l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
11792
0
    l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
11793
0
                                   l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
11794
0
    if (!l_cstr_index->tile_index) {
11795
0
        opj_free(l_cstr_index->marker);
11796
0
        opj_free(l_cstr_index);
11797
0
        return NULL;
11798
0
    }
11799
11800
0
    if (!p_j2k->cstr_index->tile_index) {
11801
0
        opj_free(l_cstr_index->tile_index);
11802
0
        l_cstr_index->tile_index = NULL;
11803
0
    } else {
11804
0
        OPJ_UINT32 it_tile = 0;
11805
0
        for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++) {
11806
11807
            /* Tile Marker*/
11808
0
            l_cstr_index->tile_index[it_tile].marknum =
11809
0
                p_j2k->cstr_index->tile_index[it_tile].marknum;
11810
11811
0
            l_cstr_index->tile_index[it_tile].marker =
11812
0
                (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum *
11813
0
                                               sizeof(opj_marker_info_t));
11814
11815
0
            if (!l_cstr_index->tile_index[it_tile].marker) {
11816
0
                OPJ_UINT32 it_tile_free;
11817
11818
0
                for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
11819
0
                    opj_free(l_cstr_index->tile_index[it_tile_free].marker);
11820
0
                }
11821
11822
0
                opj_free(l_cstr_index->tile_index);
11823
0
                opj_free(l_cstr_index->marker);
11824
0
                opj_free(l_cstr_index);
11825
0
                return NULL;
11826
0
            }
11827
11828
0
            if (p_j2k->cstr_index->tile_index[it_tile].marker)
11829
0
                memcpy(l_cstr_index->tile_index[it_tile].marker,
11830
0
                       p_j2k->cstr_index->tile_index[it_tile].marker,
11831
0
                       l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t));
11832
0
            else {
11833
0
                opj_free(l_cstr_index->tile_index[it_tile].marker);
11834
0
                l_cstr_index->tile_index[it_tile].marker = NULL;
11835
0
            }
11836
11837
            /* Tile part index*/
11838
0
            l_cstr_index->tile_index[it_tile].nb_tps =
11839
0
                p_j2k->cstr_index->tile_index[it_tile].nb_tps;
11840
11841
0
            l_cstr_index->tile_index[it_tile].tp_index =
11842
0
                (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps * sizeof(
11843
0
                                                opj_tp_index_t));
11844
11845
0
            if (!l_cstr_index->tile_index[it_tile].tp_index) {
11846
0
                OPJ_UINT32 it_tile_free;
11847
11848
0
                for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
11849
0
                    opj_free(l_cstr_index->tile_index[it_tile_free].marker);
11850
0
                    opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
11851
0
                }
11852
11853
0
                opj_free(l_cstr_index->tile_index);
11854
0
                opj_free(l_cstr_index->marker);
11855
0
                opj_free(l_cstr_index);
11856
0
                return NULL;
11857
0
            }
11858
11859
0
            if (p_j2k->cstr_index->tile_index[it_tile].tp_index) {
11860
0
                memcpy(l_cstr_index->tile_index[it_tile].tp_index,
11861
0
                       p_j2k->cstr_index->tile_index[it_tile].tp_index,
11862
0
                       l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t));
11863
0
            } else {
11864
0
                opj_free(l_cstr_index->tile_index[it_tile].tp_index);
11865
0
                l_cstr_index->tile_index[it_tile].tp_index = NULL;
11866
0
            }
11867
11868
            /* Packet index (NOT USED)*/
11869
0
            l_cstr_index->tile_index[it_tile].nb_packet = 0;
11870
0
            l_cstr_index->tile_index[it_tile].packet_index = NULL;
11871
11872
0
        }
11873
0
    }
11874
11875
0
    return l_cstr_index;
11876
0
}
11877
11878
static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
11879
48.0k
{
11880
48.0k
    OPJ_UINT32 it_tile = 0;
11881
11882
48.0k
    p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
11883
48.0k
    p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
11884
48.0k
                                        p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
11885
48.0k
    if (!p_j2k->cstr_index->tile_index) {
11886
0
        return OPJ_FALSE;
11887
0
    }
11888
11889
10.2M
    for (it_tile = 0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++) {
11890
10.2M
        p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
11891
10.2M
        p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
11892
10.2M
        p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
11893
10.2M
                opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum,
11894
10.2M
                           sizeof(opj_marker_info_t));
11895
10.2M
        if (!p_j2k->cstr_index->tile_index[it_tile].marker) {
11896
0
            return OPJ_FALSE;
11897
0
        }
11898
10.2M
    }
11899
11900
48.0k
    return OPJ_TRUE;
11901
48.0k
}
11902
11903
static OPJ_BOOL opj_j2k_are_all_used_components_decoded(opj_j2k_t *p_j2k,
11904
        opj_event_mgr_t * p_manager)
11905
31.0k
{
11906
31.0k
    OPJ_UINT32 compno;
11907
31.0k
    OPJ_BOOL decoded_all_used_components = OPJ_TRUE;
11908
11909
31.0k
    if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode) {
11910
0
        for (compno = 0;
11911
0
                compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
11912
0
            OPJ_UINT32 dec_compno =
11913
0
                p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
11914
0
            if (p_j2k->m_output_image->comps[dec_compno].data == NULL) {
11915
0
                opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
11916
0
                              dec_compno);
11917
0
                decoded_all_used_components = OPJ_FALSE;
11918
0
            }
11919
0
        }
11920
31.0k
    } else {
11921
110k
        for (compno = 0; compno < p_j2k->m_output_image->numcomps; compno++) {
11922
79.4k
            if (p_j2k->m_output_image->comps[compno].data == NULL) {
11923
10.2k
                opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
11924
10.2k
                              compno);
11925
10.2k
                decoded_all_used_components = OPJ_FALSE;
11926
10.2k
            }
11927
79.4k
        }
11928
31.0k
    }
11929
11930
31.0k
    if (decoded_all_used_components == OPJ_FALSE) {
11931
2.18k
        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode all used components\n");
11932
2.18k
        return OPJ_FALSE;
11933
2.18k
    }
11934
11935
28.8k
    return OPJ_TRUE;
11936
31.0k
}
11937
11938
static int CompareOffT(const void* a, const void* b)
11939
30.8k
{
11940
30.8k
    const OPJ_OFF_T offA = *(const OPJ_OFF_T*)a;
11941
30.8k
    const OPJ_OFF_T offB = *(const OPJ_OFF_T*)b;
11942
30.8k
    if (offA < offB) {
11943
24.9k
        return -1;
11944
24.9k
    }
11945
5.88k
    if (offA == offB) {
11946
2.07k
        return 0;
11947
2.07k
    }
11948
3.81k
    return 1;
11949
5.88k
}
11950
11951
static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
11952
                                     opj_stream_private_t *p_stream,
11953
                                     opj_event_mgr_t * p_manager)
11954
40.8k
{
11955
40.8k
    OPJ_BOOL l_go_on = OPJ_TRUE;
11956
40.8k
    OPJ_UINT32 l_current_tile_no;
11957
40.8k
    OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
11958
40.8k
    OPJ_UINT32 l_nb_comps;
11959
40.8k
    OPJ_UINT32 nr_tiles = 0;
11960
40.8k
    OPJ_OFF_T end_pos = 0;
11961
11962
    /* Particular case for whole single tile decoding */
11963
    /* We can avoid allocating intermediate tile buffers */
11964
40.8k
    if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
11965
30.0k
            p_j2k->m_cp.tx0 == 0 && p_j2k->m_cp.ty0 == 0 &&
11966
27.5k
            p_j2k->m_output_image->x0 == 0 &&
11967
20.0k
            p_j2k->m_output_image->y0 == 0 &&
11968
14.8k
            p_j2k->m_output_image->x1 == p_j2k->m_cp.tdx &&
11969
423
            p_j2k->m_output_image->y1 == p_j2k->m_cp.tdy) {
11970
266
        OPJ_UINT32 i;
11971
266
        if (! opj_j2k_read_tile_header(p_j2k,
11972
266
                                       &l_current_tile_no,
11973
266
                                       NULL,
11974
266
                                       &l_tile_x0, &l_tile_y0,
11975
266
                                       &l_tile_x1, &l_tile_y1,
11976
266
                                       &l_nb_comps,
11977
266
                                       &l_go_on,
11978
266
                                       p_stream,
11979
266
                                       p_manager)) {
11980
12
            return OPJ_FALSE;
11981
12
        }
11982
11983
254
        if (!l_go_on ||
11984
248
                ! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
11985
248
                                      p_stream, p_manager)) {
11986
18
            opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile 1/1\n");
11987
18
            return OPJ_FALSE;
11988
18
        }
11989
11990
        /* Transfer TCD data to output image data */
11991
1.03k
        for (i = 0; i < p_j2k->m_output_image->numcomps; i++) {
11992
797
            opj_image_data_free(p_j2k->m_output_image->comps[i].data);
11993
797
            p_j2k->m_output_image->comps[i].data =
11994
797
                p_j2k->m_tcd->tcd_image->tiles->comps[i].data;
11995
797
            p_j2k->m_output_image->comps[i].resno_decoded =
11996
797
                p_j2k->m_tcd->image->comps[i].resno_decoded;
11997
797
            p_j2k->m_tcd->tcd_image->tiles->comps[i].data = NULL;
11998
797
        }
11999
12000
236
        return OPJ_TRUE;
12001
254
    }
12002
12003
40.5k
    p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts = 0;
12004
40.5k
    p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts = 0;
12005
40.5k
    opj_free(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset);
12006
40.5k
    p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset = NULL;
12007
12008
    /* If the area to decode only intersects a subset of tiles, and we have
12009
     * valid TLM information, then use it to plan the tilepart offsets to
12010
     * seek to.
12011
     */
12012
40.5k
    if (!(p_j2k->m_specific_param.m_decoder.m_start_tile_x == 0 &&
12013
40.5k
            p_j2k->m_specific_param.m_decoder.m_start_tile_y == 0 &&
12014
40.5k
            p_j2k->m_specific_param.m_decoder.m_end_tile_x == p_j2k->m_cp.tw &&
12015
38.3k
            p_j2k->m_specific_param.m_decoder.m_end_tile_y == p_j2k->m_cp.th) &&
12016
6.19k
            !p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid &&
12017
684
            opj_stream_has_seek(p_stream)) {
12018
684
        OPJ_UINT32 m_num_intersecting_tile_parts = 0;
12019
12020
684
        OPJ_UINT32 j;
12021
20.5k
        for (j = 0; j < p_j2k->m_cp.tw * p_j2k->m_cp.th; ++j) {
12022
19.9k
            if (p_j2k->cstr_index->tile_index[j].nb_tps > 0 &&
12023
19.9k
                    p_j2k->cstr_index->tile_index[j].tp_index[
12024
19.9k
                        p_j2k->cstr_index->tile_index[j].nb_tps - 1].end_pos > end_pos) {
12025
14.0k
                end_pos = p_j2k->cstr_index->tile_index[j].tp_index[
12026
14.0k
                              p_j2k->cstr_index->tile_index[j].nb_tps - 1].end_pos;
12027
14.0k
            }
12028
19.9k
        }
12029
12030
684
        for (j = p_j2k->m_specific_param.m_decoder.m_start_tile_y;
12031
3.05k
                j < p_j2k->m_specific_param.m_decoder.m_end_tile_y; ++j) {
12032
2.36k
            OPJ_UINT32 i;
12033
2.36k
            for (i = p_j2k->m_specific_param.m_decoder.m_start_tile_x;
12034
5.74k
                    i < p_j2k->m_specific_param.m_decoder.m_end_tile_x; ++i) {
12035
3.37k
                const OPJ_UINT32 tile_number = j * p_j2k->m_cp.tw + i;
12036
3.37k
                m_num_intersecting_tile_parts +=
12037
3.37k
                    p_j2k->cstr_index->tile_index[tile_number].nb_tps;
12038
3.37k
            }
12039
2.36k
        }
12040
12041
684
        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset =
12042
684
            (OPJ_OFF_T*)
12043
684
            opj_malloc(m_num_intersecting_tile_parts * sizeof(OPJ_OFF_T));
12044
684
        if (m_num_intersecting_tile_parts > 0 &&
12045
672
                p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset) {
12046
672
            OPJ_UINT32 idx = 0;
12047
672
            for (j = p_j2k->m_specific_param.m_decoder.m_start_tile_y;
12048
3.02k
                    j < p_j2k->m_specific_param.m_decoder.m_end_tile_y; ++j) {
12049
2.35k
                OPJ_UINT32 i;
12050
2.35k
                for (i = p_j2k->m_specific_param.m_decoder.m_start_tile_x;
12051
5.73k
                        i < p_j2k->m_specific_param.m_decoder.m_end_tile_x; ++i) {
12052
3.37k
                    const OPJ_UINT32 tile_number = j * p_j2k->m_cp.tw + i;
12053
3.37k
                    OPJ_UINT32 k;
12054
13.5k
                    for (k = 0; k < p_j2k->cstr_index->tile_index[tile_number].nb_tps; ++k) {
12055
10.2k
                        const OPJ_OFF_T next_tp_sot_pos =
12056
10.2k
                            p_j2k->cstr_index->tile_index[tile_number].tp_index[k].start_pos;
12057
10.2k
                        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset[idx] =
12058
10.2k
                            next_tp_sot_pos;
12059
10.2k
                        ++idx;
12060
10.2k
                    }
12061
3.37k
                }
12062
2.35k
            }
12063
12064
672
            p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts = idx;
12065
12066
            /* Sort by increasing offset */
12067
672
            qsort(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset,
12068
672
                  p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts,
12069
672
                  sizeof(OPJ_OFF_T),
12070
672
                  CompareOffT);
12071
672
        }
12072
684
    }
12073
12074
50.4k
    for (;;) {
12075
50.4k
        if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
12076
29.7k
                p_j2k->m_cp.tcps[0].m_data != NULL) {
12077
0
            l_current_tile_no = 0;
12078
0
            p_j2k->m_current_tile_number = 0;
12079
0
            p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
12080
50.4k
        } else {
12081
50.4k
            if (! opj_j2k_read_tile_header(p_j2k,
12082
50.4k
                                           &l_current_tile_no,
12083
50.4k
                                           NULL,
12084
50.4k
                                           &l_tile_x0, &l_tile_y0,
12085
50.4k
                                           &l_tile_x1, &l_tile_y1,
12086
50.4k
                                           &l_nb_comps,
12087
50.4k
                                           &l_go_on,
12088
50.4k
                                           p_stream,
12089
50.4k
                                           p_manager)) {
12090
3.40k
                return OPJ_FALSE;
12091
3.40k
            }
12092
12093
47.0k
            if (! l_go_on) {
12094
413
                break;
12095
413
            }
12096
47.0k
        }
12097
12098
46.5k
        if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
12099
46.5k
                                  p_stream, p_manager)) {
12100
6.11k
            opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n",
12101
6.11k
                          l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
12102
6.11k
            return OPJ_FALSE;
12103
6.11k
        }
12104
12105
40.4k
        opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
12106
40.4k
                      l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
12107
12108
40.4k
        if (! opj_j2k_update_image_data(p_j2k->m_tcd,
12109
40.4k
                                        p_j2k->m_output_image)) {
12110
55
            return OPJ_FALSE;
12111
55
        }
12112
12113
40.4k
        if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
12114
24.6k
                !(p_j2k->m_output_image->x0 == p_j2k->m_private_image->x0 &&
12115
24.6k
                  p_j2k->m_output_image->y0 == p_j2k->m_private_image->y0 &&
12116
24.6k
                  p_j2k->m_output_image->x1 == p_j2k->m_private_image->x1 &&
12117
18.2k
                  p_j2k->m_output_image->y1 == p_j2k->m_private_image->y1)) {
12118
            /* Keep current tcp data */
12119
22.1k
        } else {
12120
22.1k
            opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
12121
22.1k
        }
12122
12123
40.4k
        opj_event_msg(p_manager, EVT_INFO,
12124
40.4k
                      "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
12125
12126
40.4k
        if (opj_stream_get_number_byte_left(p_stream) == 0
12127
30.7k
                && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
12128
30.4k
            break;
12129
30.4k
        }
12130
10.0k
        if (++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) {
12131
171
            break;
12132
171
        }
12133
9.84k
        if (p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts > 0 &&
12134
140
                p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts ==
12135
140
                p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts) {
12136
32
            opj_stream_seek(p_stream, end_pos + 2, p_manager);
12137
32
            break;
12138
32
        }
12139
9.84k
    }
12140
12141
31.0k
    if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
12142
2.18k
        return OPJ_FALSE;
12143
2.18k
    }
12144
12145
28.8k
    return OPJ_TRUE;
12146
31.0k
}
12147
12148
/**
12149
 * Sets up the procedures to do on decoding data. Developers wanting to extend the library can add their own reading procedures.
12150
 */
12151
static OPJ_BOOL opj_j2k_setup_decoding(opj_j2k_t *p_j2k,
12152
                                       opj_event_mgr_t * p_manager)
12153
40.8k
{
12154
    /* preconditions*/
12155
40.8k
    assert(p_j2k != 00);
12156
40.8k
    assert(p_manager != 00);
12157
12158
40.8k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12159
40.8k
                                           (opj_procedure)opj_j2k_decode_tiles, p_manager)) {
12160
0
        return OPJ_FALSE;
12161
0
    }
12162
    /* DEVELOPER CORNER, add your custom procedures */
12163
12164
40.8k
    return OPJ_TRUE;
12165
40.8k
}
12166
12167
/*
12168
 * Read and decode one tile.
12169
 */
12170
static OPJ_BOOL opj_j2k_decode_one_tile(opj_j2k_t *p_j2k,
12171
                                        opj_stream_private_t *p_stream,
12172
                                        opj_event_mgr_t * p_manager)
12173
0
{
12174
0
    OPJ_BOOL l_go_on = OPJ_TRUE;
12175
0
    OPJ_UINT32 l_current_tile_no;
12176
0
    OPJ_UINT32 l_tile_no_to_dec;
12177
0
    OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
12178
0
    OPJ_UINT32 l_nb_comps;
12179
0
    OPJ_UINT32 l_nb_tiles;
12180
0
    OPJ_UINT32 i;
12181
12182
    /* Move into the codestream to the first SOT used to decode the desired tile */
12183
0
    l_tile_no_to_dec = (OPJ_UINT32)
12184
0
                       p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
12185
0
    if (p_j2k->cstr_index->tile_index)
12186
0
        if (p_j2k->cstr_index->tile_index->tp_index) {
12187
0
            if (! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
12188
                /* the index for this tile has not been built,
12189
                 *  so move to the last SOT read */
12190
0
                if (!(opj_stream_read_seek(p_stream,
12191
0
                                           p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos + 2, p_manager))) {
12192
0
                    opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
12193
0
                    return OPJ_FALSE;
12194
0
                }
12195
0
            } else {
12196
0
                OPJ_OFF_T sot_pos =
12197
0
                    p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos;
12198
0
                OPJ_UINT32 l_marker;
12199
12200
#if 0
12201
                opj_event_msg(p_manager, EVT_INFO,
12202
                              "opj_j2k_decode_one_tile(%u): seek to %" PRId64 "\n",
12203
                              l_tile_no_to_dec,
12204
                              sot_pos);
12205
#endif
12206
0
                if (!(opj_stream_read_seek(p_stream,
12207
0
                                           sot_pos,
12208
0
                                           p_manager))) {
12209
0
                    opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
12210
0
                    return OPJ_FALSE;
12211
0
                }
12212
12213
                /* Try to read 2 bytes (the marker ID) from stream and copy them into the buffer */
12214
0
                if (opj_stream_read_data(p_stream,
12215
0
                                         p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
12216
0
                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
12217
0
                    return OPJ_FALSE;
12218
0
                }
12219
12220
                /* Read 2 bytes from the buffer as the marker ID */
12221
0
                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker,
12222
0
                               2);
12223
12224
0
                if (l_marker != J2K_MS_SOT) {
12225
0
                    opj_event_msg(p_manager, EVT_ERROR, "Did not get expected SOT marker\n");
12226
0
                    return OPJ_FALSE;
12227
0
                }
12228
0
            }
12229
            /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
12230
0
            if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
12231
0
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
12232
0
            }
12233
0
        }
12234
12235
    /* Reset current tile part number for all tiles, and not only the one */
12236
    /* of interest. */
12237
    /* Not completely sure this is always correct but required for */
12238
    /* ./build/bin/j2k_random_tile_access ./build/tests/tte1.j2k */
12239
0
    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
12240
0
    for (i = 0; i < l_nb_tiles; ++i) {
12241
0
        p_j2k->m_cp.tcps[i].m_current_tile_part_number = -1;
12242
0
    }
12243
12244
0
    for (;;) {
12245
0
        if (! opj_j2k_read_tile_header(p_j2k,
12246
0
                                       &l_current_tile_no,
12247
0
                                       NULL,
12248
0
                                       &l_tile_x0, &l_tile_y0,
12249
0
                                       &l_tile_x1, &l_tile_y1,
12250
0
                                       &l_nb_comps,
12251
0
                                       &l_go_on,
12252
0
                                       p_stream,
12253
0
                                       p_manager)) {
12254
0
            return OPJ_FALSE;
12255
0
        }
12256
12257
0
        if (! l_go_on) {
12258
0
            break;
12259
0
        }
12260
12261
0
        if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
12262
0
                                  p_stream, p_manager)) {
12263
0
            return OPJ_FALSE;
12264
0
        }
12265
0
        opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
12266
0
                      l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
12267
12268
0
        if (! opj_j2k_update_image_data(p_j2k->m_tcd,
12269
0
                                        p_j2k->m_output_image)) {
12270
0
            return OPJ_FALSE;
12271
0
        }
12272
0
        opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
12273
12274
0
        opj_event_msg(p_manager, EVT_INFO,
12275
0
                      "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
12276
12277
0
        if (l_current_tile_no == l_tile_no_to_dec) {
12278
            /* move into the codestream to the first SOT (FIXME or not move?)*/
12279
0
            if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2,
12280
0
                                       p_manager))) {
12281
0
                opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
12282
0
                return OPJ_FALSE;
12283
0
            }
12284
0
            break;
12285
0
        } else {
12286
0
            opj_event_msg(p_manager, EVT_WARNING,
12287
0
                          "Tile read, decoded and updated is not the desired one (%d vs %d).\n",
12288
0
                          l_current_tile_no + 1, l_tile_no_to_dec + 1);
12289
0
        }
12290
12291
0
    }
12292
12293
0
    if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
12294
0
        return OPJ_FALSE;
12295
0
    }
12296
12297
0
    return OPJ_TRUE;
12298
0
}
12299
12300
/**
12301
 * Sets up the procedures to do on decoding one tile. Developers wanting to extend the library can add their own reading procedures.
12302
 */
12303
static OPJ_BOOL opj_j2k_setup_decoding_tile(opj_j2k_t *p_j2k,
12304
        opj_event_mgr_t * p_manager)
12305
0
{
12306
    /* preconditions*/
12307
0
    assert(p_j2k != 00);
12308
0
    assert(p_manager != 00);
12309
12310
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12311
0
                                           (opj_procedure)opj_j2k_decode_one_tile, p_manager)) {
12312
0
        return OPJ_FALSE;
12313
0
    }
12314
    /* DEVELOPER CORNER, add your custom procedures */
12315
12316
0
    return OPJ_TRUE;
12317
0
}
12318
12319
static OPJ_BOOL opj_j2k_move_data_from_codec_to_output_image(opj_j2k_t * p_j2k,
12320
        opj_image_t * p_image)
12321
29.0k
{
12322
29.0k
    OPJ_UINT32 compno;
12323
12324
    /* Move data and copy one information from codec to output image*/
12325
29.0k
    if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode > 0) {
12326
0
        opj_image_comp_t* newcomps =
12327
0
            (opj_image_comp_t*) opj_malloc(
12328
0
                p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode *
12329
0
                sizeof(opj_image_comp_t));
12330
0
        if (newcomps == NULL) {
12331
0
            opj_image_destroy(p_j2k->m_private_image);
12332
0
            p_j2k->m_private_image = NULL;
12333
0
            return OPJ_FALSE;
12334
0
        }
12335
0
        for (compno = 0; compno < p_image->numcomps; compno++) {
12336
0
            opj_image_data_free(p_image->comps[compno].data);
12337
0
            p_image->comps[compno].data = NULL;
12338
0
        }
12339
0
        for (compno = 0;
12340
0
                compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
12341
0
            OPJ_UINT32 src_compno =
12342
0
                p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
12343
0
            memcpy(&(newcomps[compno]),
12344
0
                   &(p_j2k->m_output_image->comps[src_compno]),
12345
0
                   sizeof(opj_image_comp_t));
12346
0
            newcomps[compno].resno_decoded =
12347
0
                p_j2k->m_output_image->comps[src_compno].resno_decoded;
12348
0
            newcomps[compno].data = p_j2k->m_output_image->comps[src_compno].data;
12349
0
            p_j2k->m_output_image->comps[src_compno].data = NULL;
12350
0
        }
12351
0
        for (compno = 0; compno < p_image->numcomps; compno++) {
12352
0
            assert(p_j2k->m_output_image->comps[compno].data == NULL);
12353
0
            opj_image_data_free(p_j2k->m_output_image->comps[compno].data);
12354
0
            p_j2k->m_output_image->comps[compno].data = NULL;
12355
0
        }
12356
0
        p_image->numcomps = p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode;
12357
0
        opj_free(p_image->comps);
12358
0
        p_image->comps = newcomps;
12359
29.0k
    } else {
12360
86.8k
        for (compno = 0; compno < p_image->numcomps; compno++) {
12361
57.7k
            p_image->comps[compno].resno_decoded =
12362
57.7k
                p_j2k->m_output_image->comps[compno].resno_decoded;
12363
57.7k
            opj_image_data_free(p_image->comps[compno].data);
12364
57.7k
            p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
12365
#if 0
12366
            char fn[256];
12367
            snprintf(fn, sizeof fn, "/tmp/%d.raw", compno);
12368
            FILE *debug = fopen(fn, "wb");
12369
            fwrite(p_image->comps[compno].data, sizeof(OPJ_INT32),
12370
                   p_image->comps[compno].w * p_image->comps[compno].h, debug);
12371
            fclose(debug);
12372
#endif
12373
57.7k
            p_j2k->m_output_image->comps[compno].data = NULL;
12374
57.7k
        }
12375
29.0k
    }
12376
29.0k
    return OPJ_TRUE;
12377
29.0k
}
12378
12379
OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k,
12380
                        opj_stream_private_t * p_stream,
12381
                        opj_image_t * p_image,
12382
                        opj_event_mgr_t * p_manager)
12383
40.8k
{
12384
40.8k
    if (!p_image) {
12385
0
        return OPJ_FALSE;
12386
0
    }
12387
12388
    /* Heuristics to detect sequence opj_read_header(), opj_set_decoded_resolution_factor() */
12389
    /* and finally opj_decode_image() without manual setting of comps[].factor */
12390
    /* We could potentially always execute it, if we don't allow people to do */
12391
    /* opj_read_header(), modify x0,y0,x1,y1 of returned image an call opj_decode_image() */
12392
40.8k
    if (p_j2k->m_cp.m_specific_param.m_dec.m_reduce > 0 &&
12393
0
            p_j2k->m_private_image != NULL &&
12394
0
            p_j2k->m_private_image->numcomps > 0 &&
12395
0
            p_j2k->m_private_image->comps[0].factor ==
12396
0
            p_j2k->m_cp.m_specific_param.m_dec.m_reduce &&
12397
0
            p_image->numcomps > 0 &&
12398
0
            p_image->comps[0].factor == 0 &&
12399
            /* Don't mess with image dimension if the user has allocated it */
12400
0
            p_image->comps[0].data == NULL) {
12401
0
        OPJ_UINT32 it_comp;
12402
12403
        /* Update the comps[].factor member of the output image with the one */
12404
        /* of m_reduce */
12405
0
        for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
12406
0
            p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
12407
0
        }
12408
0
        if (!opj_j2k_update_image_dimensions(p_image, p_manager)) {
12409
0
            return OPJ_FALSE;
12410
0
        }
12411
0
    }
12412
12413
40.8k
    if (p_j2k->m_output_image == NULL) {
12414
40.8k
        p_j2k->m_output_image = opj_image_create0();
12415
40.8k
        if (!(p_j2k->m_output_image)) {
12416
0
            return OPJ_FALSE;
12417
0
        }
12418
40.8k
    }
12419
40.8k
    opj_copy_image_header(p_image, p_j2k->m_output_image);
12420
12421
    /* customization of the decoding */
12422
40.8k
    if (!opj_j2k_setup_decoding(p_j2k, p_manager)) {
12423
0
        return OPJ_FALSE;
12424
0
    }
12425
12426
    /* Decode the codestream */
12427
40.8k
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12428
11.7k
        opj_image_destroy(p_j2k->m_private_image);
12429
11.7k
        p_j2k->m_private_image = NULL;
12430
11.7k
        return OPJ_FALSE;
12431
11.7k
    }
12432
12433
    /* Move data and copy one information from codec to output image*/
12434
29.0k
    return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
12435
40.8k
}
12436
12437
OPJ_BOOL opj_j2k_get_tile(opj_j2k_t *p_j2k,
12438
                          opj_stream_private_t *p_stream,
12439
                          opj_image_t* p_image,
12440
                          opj_event_mgr_t * p_manager,
12441
                          OPJ_UINT32 tile_index)
12442
0
{
12443
0
    OPJ_UINT32 compno;
12444
0
    OPJ_UINT32 l_tile_x, l_tile_y;
12445
0
    opj_image_comp_t* l_img_comp;
12446
12447
0
    if (!p_image) {
12448
0
        opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
12449
0
        return OPJ_FALSE;
12450
0
    }
12451
12452
0
    if (p_image->numcomps < p_j2k->m_private_image->numcomps) {
12453
0
        opj_event_msg(p_manager, EVT_ERROR,
12454
0
                      "Image has less components than codestream.\n");
12455
0
        return OPJ_FALSE;
12456
0
    }
12457
12458
0
    if (/*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th)) {
12459
0
        opj_event_msg(p_manager, EVT_ERROR,
12460
0
                      "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index,
12461
0
                      (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
12462
0
        return OPJ_FALSE;
12463
0
    }
12464
12465
    /* Compute the dimension of the desired tile*/
12466
0
    l_tile_x = tile_index % p_j2k->m_cp.tw;
12467
0
    l_tile_y = tile_index / p_j2k->m_cp.tw;
12468
12469
0
    p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
12470
0
    if (p_image->x0 < p_j2k->m_private_image->x0) {
12471
0
        p_image->x0 = p_j2k->m_private_image->x0;
12472
0
    }
12473
0
    p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
12474
0
    if (p_image->x1 > p_j2k->m_private_image->x1) {
12475
0
        p_image->x1 = p_j2k->m_private_image->x1;
12476
0
    }
12477
12478
0
    p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
12479
0
    if (p_image->y0 < p_j2k->m_private_image->y0) {
12480
0
        p_image->y0 = p_j2k->m_private_image->y0;
12481
0
    }
12482
0
    p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
12483
0
    if (p_image->y1 > p_j2k->m_private_image->y1) {
12484
0
        p_image->y1 = p_j2k->m_private_image->y1;
12485
0
    }
12486
12487
0
    l_img_comp = p_image->comps;
12488
0
    for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) {
12489
0
        OPJ_INT32 l_comp_x1, l_comp_y1;
12490
12491
0
        l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
12492
12493
0
        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
12494
0
        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
12495
0
        l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
12496
0
        l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
12497
12498
0
        l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1,
12499
0
                                     (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0,
12500
0
                                             (OPJ_INT32)l_img_comp->factor));
12501
0
        l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1,
12502
0
                                     (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0,
12503
0
                                             (OPJ_INT32)l_img_comp->factor));
12504
12505
0
        l_img_comp++;
12506
0
    }
12507
12508
0
    if (p_image->numcomps > p_j2k->m_private_image->numcomps) {
12509
        /* Can happen when calling repeatdly opj_get_decoded_tile() on an
12510
         * image with a color palette, where color palette expansion is done
12511
         * later in jp2.c */
12512
0
        for (compno = p_j2k->m_private_image->numcomps; compno < p_image->numcomps;
12513
0
                ++compno) {
12514
0
            opj_image_data_free(p_image->comps[compno].data);
12515
0
            p_image->comps[compno].data = NULL;
12516
0
        }
12517
0
        p_image->numcomps = p_j2k->m_private_image->numcomps;
12518
0
    }
12519
12520
    /* Destroy the previous output image*/
12521
0
    if (p_j2k->m_output_image) {
12522
0
        opj_image_destroy(p_j2k->m_output_image);
12523
0
    }
12524
12525
    /* Create the output image from the information previously computed*/
12526
0
    p_j2k->m_output_image = opj_image_create0();
12527
0
    if (!(p_j2k->m_output_image)) {
12528
0
        return OPJ_FALSE;
12529
0
    }
12530
0
    opj_copy_image_header(p_image, p_j2k->m_output_image);
12531
12532
0
    p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
12533
12534
    /* customization of the decoding */
12535
0
    if (!opj_j2k_setup_decoding_tile(p_j2k, p_manager)) {
12536
0
        return OPJ_FALSE;
12537
0
    }
12538
12539
    /* Decode the codestream */
12540
0
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12541
0
        opj_image_destroy(p_j2k->m_private_image);
12542
0
        p_j2k->m_private_image = NULL;
12543
0
        return OPJ_FALSE;
12544
0
    }
12545
12546
    /* Move data and copy one information from codec to output image*/
12547
0
    return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
12548
0
}
12549
12550
OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
12551
        OPJ_UINT32 res_factor,
12552
        opj_event_mgr_t * p_manager)
12553
0
{
12554
0
    OPJ_UINT32 it_comp;
12555
12556
0
    p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
12557
12558
0
    if (p_j2k->m_private_image) {
12559
0
        if (p_j2k->m_private_image->comps) {
12560
0
            if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
12561
0
                if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
12562
0
                    for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
12563
0
                        OPJ_UINT32 max_res =
12564
0
                            p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
12565
0
                        if (res_factor >= max_res) {
12566
0
                            opj_event_msg(p_manager, EVT_ERROR,
12567
0
                                          "Resolution factor is greater than the maximum resolution in the component.\n");
12568
0
                            return OPJ_FALSE;
12569
0
                        }
12570
0
                        p_j2k->m_private_image->comps[it_comp].factor = res_factor;
12571
0
                    }
12572
0
                    return OPJ_TRUE;
12573
0
                }
12574
0
            }
12575
0
        }
12576
0
    }
12577
12578
0
    return OPJ_FALSE;
12579
0
}
12580
12581
/* ----------------------------------------------------------------------- */
12582
12583
OPJ_BOOL opj_j2k_encoder_set_extra_options(
12584
    opj_j2k_t *p_j2k,
12585
    const char* const* p_options,
12586
    opj_event_mgr_t * p_manager)
12587
0
{
12588
0
    const char* const* p_option_iter;
12589
12590
0
    if (p_options == NULL) {
12591
0
        return OPJ_TRUE;
12592
0
    }
12593
12594
0
    for (p_option_iter = p_options; *p_option_iter != NULL; ++p_option_iter) {
12595
0
        if (strncmp(*p_option_iter, "PLT=", 4) == 0) {
12596
0
            if (strcmp(*p_option_iter, "PLT=YES") == 0) {
12597
0
                p_j2k->m_specific_param.m_encoder.m_PLT = OPJ_TRUE;
12598
0
            } else if (strcmp(*p_option_iter, "PLT=NO") == 0) {
12599
0
                p_j2k->m_specific_param.m_encoder.m_PLT = OPJ_FALSE;
12600
0
            } else {
12601
0
                opj_event_msg(p_manager, EVT_ERROR,
12602
0
                              "Invalid value for option: %s.\n", *p_option_iter);
12603
0
                return OPJ_FALSE;
12604
0
            }
12605
0
        } else if (strncmp(*p_option_iter, "TLM=", 4) == 0) {
12606
0
            if (strcmp(*p_option_iter, "TLM=YES") == 0) {
12607
0
                p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_TRUE;
12608
0
            } else if (strcmp(*p_option_iter, "TLM=NO") == 0) {
12609
0
                p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_FALSE;
12610
0
            } else {
12611
0
                opj_event_msg(p_manager, EVT_ERROR,
12612
0
                              "Invalid value for option: %s.\n", *p_option_iter);
12613
0
                return OPJ_FALSE;
12614
0
            }
12615
0
        } else if (strncmp(*p_option_iter, "GUARD_BITS=", strlen("GUARD_BITS=")) == 0) {
12616
0
            OPJ_UINT32 tileno;
12617
0
            opj_cp_t *cp = cp = &(p_j2k->m_cp);
12618
12619
0
            int numgbits = atoi(*p_option_iter + strlen("GUARD_BITS="));
12620
0
            if (numgbits < 0 || numgbits > 7) {
12621
0
                opj_event_msg(p_manager, EVT_ERROR,
12622
0
                              "Invalid value for option: %s. Should be in [0,7]\n", *p_option_iter);
12623
0
                return OPJ_FALSE;
12624
0
            }
12625
12626
0
            for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
12627
0
                OPJ_UINT32 i;
12628
0
                opj_tcp_t *tcp = &cp->tcps[tileno];
12629
0
                for (i = 0; i < p_j2k->m_specific_param.m_encoder.m_nb_comps; i++) {
12630
0
                    opj_tccp_t *tccp = &tcp->tccps[i];
12631
0
                    tccp->numgbits = (OPJ_UINT32)numgbits;
12632
0
                }
12633
0
            }
12634
0
        } else {
12635
0
            opj_event_msg(p_manager, EVT_ERROR,
12636
0
                          "Invalid option: %s.\n", *p_option_iter);
12637
0
            return OPJ_FALSE;
12638
0
        }
12639
0
    }
12640
12641
0
    return OPJ_TRUE;
12642
0
}
12643
12644
/* ----------------------------------------------------------------------- */
12645
12646
OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,
12647
                        opj_stream_private_t *p_stream,
12648
                        opj_event_mgr_t * p_manager)
12649
10.9k
{
12650
10.9k
    OPJ_UINT32 i, j;
12651
10.9k
    OPJ_UINT32 l_nb_tiles;
12652
10.9k
    OPJ_SIZE_T l_max_tile_size = 0, l_current_tile_size;
12653
10.9k
    OPJ_BYTE * l_current_data = 00;
12654
10.9k
    OPJ_BOOL l_reuse_data = OPJ_FALSE;
12655
10.9k
    opj_tcd_t* p_tcd = 00;
12656
12657
    /* preconditions */
12658
10.9k
    assert(p_j2k != 00);
12659
10.9k
    assert(p_stream != 00);
12660
10.9k
    assert(p_manager != 00);
12661
12662
10.9k
    p_tcd = p_j2k->m_tcd;
12663
12664
10.9k
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
12665
10.9k
    if (l_nb_tiles == 1) {
12666
10.9k
        l_reuse_data = OPJ_TRUE;
12667
10.9k
#ifdef __SSE__
12668
23.5k
        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12669
12.5k
            opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
12670
12.5k
            if (((size_t)l_img_comp->data & 0xFU) !=
12671
12.5k
                    0U) { /* tile data shall be aligned on 16 bytes */
12672
0
                l_reuse_data = OPJ_FALSE;
12673
0
            }
12674
12.5k
        }
12675
10.9k
#endif
12676
10.9k
    }
12677
21.9k
    for (i = 0; i < l_nb_tiles; ++i) {
12678
10.9k
        if (! opj_j2k_pre_write_tile(p_j2k, i, p_stream, p_manager)) {
12679
0
            if (l_current_data) {
12680
0
                opj_free(l_current_data);
12681
0
            }
12682
0
            return OPJ_FALSE;
12683
0
        }
12684
12685
        /* if we only have one tile, then simply set tile component data equal to image component data */
12686
        /* otherwise, allocate the data */
12687
23.5k
        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12688
12.5k
            opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j;
12689
12.5k
            if (l_reuse_data) {
12690
12.5k
                opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
12691
12.5k
                l_tilec->data  =  l_img_comp->data;
12692
12.5k
                l_tilec->ownsData = OPJ_FALSE;
12693
12.5k
            } else {
12694
0
                if (! opj_alloc_tile_component_data(l_tilec)) {
12695
0
                    opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
12696
0
                    if (l_current_data) {
12697
0
                        opj_free(l_current_data);
12698
0
                    }
12699
0
                    return OPJ_FALSE;
12700
0
                }
12701
0
            }
12702
12.5k
        }
12703
10.9k
        l_current_tile_size = opj_tcd_get_encoder_input_buffer_size(p_j2k->m_tcd);
12704
10.9k
        if (!l_reuse_data) {
12705
0
            if (l_current_tile_size > l_max_tile_size) {
12706
0
                OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data,
12707
0
                                               l_current_tile_size);
12708
0
                if (! l_new_current_data) {
12709
0
                    if (l_current_data) {
12710
0
                        opj_free(l_current_data);
12711
0
                    }
12712
0
                    opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
12713
0
                    return OPJ_FALSE;
12714
0
                }
12715
0
                l_current_data = l_new_current_data;
12716
0
                l_max_tile_size = l_current_tile_size;
12717
0
            }
12718
0
            if (l_current_data == NULL) {
12719
                /* Should not happen in practice, but will avoid Coverity to */
12720
                /* complain about a null pointer dereference */
12721
0
                assert(0);
12722
0
                return OPJ_FALSE;
12723
0
            }
12724
12725
            /* copy image data (32 bit) to l_current_data as contiguous, all-component, zero offset buffer */
12726
            /* 32 bit components @ 8 bit precision get converted to 8 bit */
12727
            /* 32 bit components @ 16 bit precision get converted to 16 bit */
12728
0
            opj_j2k_get_tile_data(p_j2k->m_tcd, l_current_data);
12729
12730
            /* now copy this data into the tile component */
12731
0
            if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, l_current_data,
12732
0
                                         l_current_tile_size)) {
12733
0
                opj_event_msg(p_manager, EVT_ERROR,
12734
0
                              "Size mismatch between tile data and sent data.");
12735
0
                opj_free(l_current_data);
12736
0
                return OPJ_FALSE;
12737
0
            }
12738
0
        }
12739
12740
10.9k
        if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
12741
67
            if (l_current_data) {
12742
0
                opj_free(l_current_data);
12743
0
            }
12744
67
            return OPJ_FALSE;
12745
67
        }
12746
10.9k
    }
12747
12748
10.9k
    if (l_current_data) {
12749
0
        opj_free(l_current_data);
12750
0
    }
12751
10.9k
    return OPJ_TRUE;
12752
10.9k
}
12753
12754
OPJ_BOOL opj_j2k_end_compress(opj_j2k_t *p_j2k,
12755
                              opj_stream_private_t *p_stream,
12756
                              opj_event_mgr_t * p_manager)
12757
10.9k
{
12758
    /* customization of the encoding */
12759
10.9k
    if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) {
12760
0
        return OPJ_FALSE;
12761
0
    }
12762
12763
10.9k
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12764
0
        return OPJ_FALSE;
12765
0
    }
12766
12767
10.9k
    return OPJ_TRUE;
12768
10.9k
}
12769
12770
OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
12771
                                opj_stream_private_t *p_stream,
12772
                                opj_image_t * p_image,
12773
                                opj_event_mgr_t * p_manager)
12774
10.9k
{
12775
    /* preconditions */
12776
10.9k
    assert(p_j2k != 00);
12777
10.9k
    assert(p_stream != 00);
12778
10.9k
    assert(p_manager != 00);
12779
12780
10.9k
    p_j2k->m_private_image = opj_image_create0();
12781
10.9k
    if (! p_j2k->m_private_image) {
12782
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header.");
12783
0
        return OPJ_FALSE;
12784
0
    }
12785
10.9k
    opj_copy_image_header(p_image, p_j2k->m_private_image);
12786
12787
    /* TODO_MSD: Find a better way */
12788
10.9k
    if (p_image->comps) {
12789
10.9k
        OPJ_UINT32 it_comp;
12790
23.5k
        for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
12791
12.5k
            if (p_image->comps[it_comp].data) {
12792
12.5k
                p_j2k->m_private_image->comps[it_comp].data = p_image->comps[it_comp].data;
12793
12.5k
                p_image->comps[it_comp].data = NULL;
12794
12795
12.5k
            }
12796
12.5k
        }
12797
10.9k
    }
12798
12799
    /* customization of the validation */
12800
10.9k
    if (! opj_j2k_setup_encoding_validation(p_j2k, p_manager)) {
12801
0
        return OPJ_FALSE;
12802
0
    }
12803
12804
    /* validation of the parameters codec */
12805
10.9k
    if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
12806
0
        return OPJ_FALSE;
12807
0
    }
12808
12809
    /* customization of the encoding */
12810
10.9k
    if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) {
12811
0
        return OPJ_FALSE;
12812
0
    }
12813
12814
    /* write header */
12815
10.9k
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12816
0
        return OPJ_FALSE;
12817
0
    }
12818
12819
10.9k
    return OPJ_TRUE;
12820
10.9k
}
12821
12822
static OPJ_BOOL opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,
12823
                                       OPJ_UINT32 p_tile_index,
12824
                                       opj_stream_private_t *p_stream,
12825
                                       opj_event_mgr_t * p_manager)
12826
10.9k
{
12827
10.9k
    (void)p_stream;
12828
10.9k
    if (p_tile_index != p_j2k->m_current_tile_number) {
12829
0
        opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match.");
12830
0
        return OPJ_FALSE;
12831
0
    }
12832
12833
10.9k
    opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n",
12834
10.9k
                  p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
12835
12836
10.9k
    p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
12837
10.9k
    p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
12838
10.9k
    p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
12839
12840
    /* initialisation before tile encoding  */
12841
10.9k
    if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
12842
10.9k
                                   p_manager)) {
12843
0
        return OPJ_FALSE;
12844
0
    }
12845
12846
10.9k
    return OPJ_TRUE;
12847
10.9k
}
12848
12849
static void opj_get_tile_dimensions(opj_image_t * l_image,
12850
                                    opj_tcd_tilecomp_t * l_tilec,
12851
                                    opj_image_comp_t * l_img_comp,
12852
                                    OPJ_UINT32* l_size_comp,
12853
                                    OPJ_UINT32* l_width,
12854
                                    OPJ_UINT32* l_height,
12855
                                    OPJ_UINT32* l_offset_x,
12856
                                    OPJ_UINT32* l_offset_y,
12857
                                    OPJ_UINT32* l_image_width,
12858
                                    OPJ_UINT32* l_stride,
12859
                                    OPJ_UINT32* l_tile_offset)
12860
0
{
12861
0
    OPJ_UINT32 l_remaining;
12862
0
    *l_size_comp = l_img_comp->prec >> 3; /* (/8) */
12863
0
    l_remaining = l_img_comp->prec & 7;  /* (%8) */
12864
0
    if (l_remaining) {
12865
0
        *l_size_comp += 1;
12866
0
    }
12867
12868
0
    if (*l_size_comp == 3) {
12869
0
        *l_size_comp = 4;
12870
0
    }
12871
12872
0
    *l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
12873
0
    *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
12874
0
    *l_offset_x = opj_uint_ceildiv(l_image->x0, l_img_comp->dx);
12875
0
    *l_offset_y = opj_uint_ceildiv(l_image->y0, l_img_comp->dy);
12876
0
    *l_image_width = opj_uint_ceildiv(l_image->x1 - l_image->x0, l_img_comp->dx);
12877
0
    *l_stride = *l_image_width - *l_width;
12878
0
    *l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((
12879
0
                         OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width;
12880
0
}
12881
12882
static void opj_j2k_get_tile_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
12883
0
{
12884
0
    OPJ_UINT32 i, j, k = 0;
12885
12886
0
    for (i = 0; i < p_tcd->image->numcomps; ++i) {
12887
0
        opj_image_t * l_image =  p_tcd->image;
12888
0
        OPJ_INT32 * l_src_ptr;
12889
0
        opj_tcd_tilecomp_t * l_tilec = p_tcd->tcd_image->tiles->comps + i;
12890
0
        opj_image_comp_t * l_img_comp = l_image->comps + i;
12891
0
        OPJ_UINT32 l_size_comp, l_width, l_height, l_offset_x, l_offset_y,
12892
0
                   l_image_width, l_stride, l_tile_offset;
12893
12894
0
        opj_get_tile_dimensions(l_image,
12895
0
                                l_tilec,
12896
0
                                l_img_comp,
12897
0
                                &l_size_comp,
12898
0
                                &l_width,
12899
0
                                &l_height,
12900
0
                                &l_offset_x,
12901
0
                                &l_offset_y,
12902
0
                                &l_image_width,
12903
0
                                &l_stride,
12904
0
                                &l_tile_offset);
12905
12906
0
        l_src_ptr = l_img_comp->data + l_tile_offset;
12907
12908
0
        switch (l_size_comp) {
12909
0
        case 1: {
12910
0
            OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
12911
0
            if (l_img_comp->sgnd) {
12912
0
                for (j = 0; j < l_height; ++j) {
12913
0
                    for (k = 0; k < l_width; ++k) {
12914
0
                        *(l_dest_ptr) = (OPJ_CHAR)(*l_src_ptr);
12915
0
                        ++l_dest_ptr;
12916
0
                        ++l_src_ptr;
12917
0
                    }
12918
0
                    l_src_ptr += l_stride;
12919
0
                }
12920
0
            } else {
12921
0
                for (j = 0; j < l_height; ++j) {
12922
0
                    for (k = 0; k < l_width; ++k) {
12923
0
                        *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr) & 0xff);
12924
0
                        ++l_dest_ptr;
12925
0
                        ++l_src_ptr;
12926
0
                    }
12927
0
                    l_src_ptr += l_stride;
12928
0
                }
12929
0
            }
12930
12931
0
            p_data = (OPJ_BYTE*) l_dest_ptr;
12932
0
        }
12933
0
        break;
12934
0
        case 2: {
12935
0
            OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
12936
0
            if (l_img_comp->sgnd) {
12937
0
                for (j = 0; j < l_height; ++j) {
12938
0
                    for (k = 0; k < l_width; ++k) {
12939
0
                        *(l_dest_ptr++) = (OPJ_INT16)(*(l_src_ptr++));
12940
0
                    }
12941
0
                    l_src_ptr += l_stride;
12942
0
                }
12943
0
            } else {
12944
0
                for (j = 0; j < l_height; ++j) {
12945
0
                    for (k = 0; k < l_width; ++k) {
12946
0
                        *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
12947
0
                    }
12948
0
                    l_src_ptr += l_stride;
12949
0
                }
12950
0
            }
12951
12952
0
            p_data = (OPJ_BYTE*) l_dest_ptr;
12953
0
        }
12954
0
        break;
12955
0
        case 4: {
12956
0
            OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
12957
0
            for (j = 0; j < l_height; ++j) {
12958
0
                for (k = 0; k < l_width; ++k) {
12959
0
                    *(l_dest_ptr++) = *(l_src_ptr++);
12960
0
                }
12961
0
                l_src_ptr += l_stride;
12962
0
            }
12963
12964
0
            p_data = (OPJ_BYTE*) l_dest_ptr;
12965
0
        }
12966
0
        break;
12967
0
        }
12968
0
    }
12969
0
}
12970
12971
static OPJ_BOOL opj_j2k_post_write_tile(opj_j2k_t * p_j2k,
12972
                                        opj_stream_private_t *p_stream,
12973
                                        opj_event_mgr_t * p_manager)
12974
10.9k
{
12975
10.9k
    OPJ_UINT32 l_nb_bytes_written;
12976
10.9k
    OPJ_BYTE * l_current_data = 00;
12977
10.9k
    OPJ_UINT32 l_tile_size = 0;
12978
10.9k
    OPJ_UINT32 l_available_data;
12979
12980
    /* preconditions */
12981
10.9k
    assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
12982
12983
10.9k
    l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
12984
10.9k
    l_available_data = l_tile_size;
12985
10.9k
    l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
12986
12987
10.9k
    l_nb_bytes_written = 0;
12988
10.9k
    if (! opj_j2k_write_first_tile_part(p_j2k, l_current_data, &l_nb_bytes_written,
12989
10.9k
                                        l_available_data, p_stream, p_manager)) {
12990
67
        return OPJ_FALSE;
12991
67
    }
12992
10.9k
    l_current_data += l_nb_bytes_written;
12993
10.9k
    l_available_data -= l_nb_bytes_written;
12994
12995
10.9k
    l_nb_bytes_written = 0;
12996
10.9k
    if (! opj_j2k_write_all_tile_parts(p_j2k, l_current_data, &l_nb_bytes_written,
12997
10.9k
                                       l_available_data, p_stream, p_manager)) {
12998
0
        return OPJ_FALSE;
12999
0
    }
13000
13001
10.9k
    l_available_data -= l_nb_bytes_written;
13002
10.9k
    l_nb_bytes_written = l_tile_size - l_available_data;
13003
13004
10.9k
    if (opj_stream_write_data(p_stream,
13005
10.9k
                              p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
13006
10.9k
                              l_nb_bytes_written, p_manager) != l_nb_bytes_written) {
13007
0
        return OPJ_FALSE;
13008
0
    }
13009
13010
10.9k
    ++p_j2k->m_current_tile_number;
13011
13012
10.9k
    return OPJ_TRUE;
13013
10.9k
}
13014
13015
static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
13016
        opj_event_mgr_t * p_manager)
13017
10.9k
{
13018
    /* preconditions */
13019
10.9k
    assert(p_j2k != 00);
13020
10.9k
    assert(p_manager != 00);
13021
13022
    /* DEVELOPER CORNER, insert your custom procedures */
13023
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13024
10.9k
                                           (opj_procedure)opj_j2k_write_eoc, p_manager)) {
13025
0
        return OPJ_FALSE;
13026
0
    }
13027
13028
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13029
1.05k
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13030
1.05k
                                               (opj_procedure)opj_j2k_write_updated_tlm, p_manager)) {
13031
0
            return OPJ_FALSE;
13032
0
        }
13033
1.05k
    }
13034
13035
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13036
10.9k
                                           (opj_procedure)opj_j2k_write_epc, p_manager)) {
13037
0
        return OPJ_FALSE;
13038
0
    }
13039
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13040
10.9k
                                           (opj_procedure)opj_j2k_end_encoding, p_manager)) {
13041
0
        return OPJ_FALSE;
13042
0
    }
13043
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13044
10.9k
                                           (opj_procedure)opj_j2k_destroy_header_memory, p_manager)) {
13045
0
        return OPJ_FALSE;
13046
0
    }
13047
10.9k
    return OPJ_TRUE;
13048
10.9k
}
13049
13050
static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
13051
        opj_event_mgr_t * p_manager)
13052
10.9k
{
13053
    /* preconditions */
13054
10.9k
    assert(p_j2k != 00);
13055
10.9k
    assert(p_manager != 00);
13056
13057
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13058
10.9k
                                           (opj_procedure)opj_j2k_build_encoder, p_manager)) {
13059
0
        return OPJ_FALSE;
13060
0
    }
13061
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13062
10.9k
                                           (opj_procedure)opj_j2k_encoding_validation, p_manager)) {
13063
0
        return OPJ_FALSE;
13064
0
    }
13065
13066
    /* DEVELOPER CORNER, add your custom validation procedure */
13067
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13068
10.9k
                                           (opj_procedure)opj_j2k_mct_validation, p_manager)) {
13069
0
        return OPJ_FALSE;
13070
0
    }
13071
13072
10.9k
    return OPJ_TRUE;
13073
10.9k
}
13074
13075
static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
13076
        opj_event_mgr_t * p_manager)
13077
10.9k
{
13078
    /* preconditions */
13079
10.9k
    assert(p_j2k != 00);
13080
10.9k
    assert(p_manager != 00);
13081
13082
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13083
10.9k
                                           (opj_procedure)opj_j2k_init_info, p_manager)) {
13084
0
        return OPJ_FALSE;
13085
0
    }
13086
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13087
10.9k
                                           (opj_procedure)opj_j2k_write_soc, p_manager)) {
13088
0
        return OPJ_FALSE;
13089
0
    }
13090
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13091
10.9k
                                           (opj_procedure)opj_j2k_write_siz, p_manager)) {
13092
0
        return OPJ_FALSE;
13093
0
    }
13094
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13095
10.9k
                                           (opj_procedure)opj_j2k_write_cod, p_manager)) {
13096
0
        return OPJ_FALSE;
13097
0
    }
13098
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13099
10.9k
                                           (opj_procedure)opj_j2k_write_qcd, p_manager)) {
13100
0
        return OPJ_FALSE;
13101
0
    }
13102
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13103
10.9k
                                           (opj_procedure)opj_j2k_write_all_coc, p_manager)) {
13104
0
        return OPJ_FALSE;
13105
0
    }
13106
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13107
10.9k
                                           (opj_procedure)opj_j2k_write_all_qcc, p_manager)) {
13108
0
        return OPJ_FALSE;
13109
0
    }
13110
13111
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13112
1.05k
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13113
1.05k
                                               (opj_procedure)opj_j2k_write_tlm, p_manager)) {
13114
0
            return OPJ_FALSE;
13115
0
        }
13116
13117
1.05k
        if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) {
13118
0
            if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13119
0
                                                   (opj_procedure)opj_j2k_write_poc, p_manager)) {
13120
0
                return OPJ_FALSE;
13121
0
            }
13122
0
        }
13123
1.05k
    }
13124
13125
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13126
10.9k
                                           (opj_procedure)opj_j2k_write_regions, p_manager)) {
13127
0
        return OPJ_FALSE;
13128
0
    }
13129
13130
10.9k
    if (p_j2k->m_cp.comment != 00)  {
13131
10.9k
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13132
10.9k
                                               (opj_procedure)opj_j2k_write_com, p_manager)) {
13133
0
            return OPJ_FALSE;
13134
0
        }
13135
10.9k
    }
13136
13137
    /* DEVELOPER CORNER, insert your custom procedures */
13138
10.9k
    if ((p_j2k->m_cp.rsiz & (OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT)) ==
13139
10.9k
            (OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT)) {
13140
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13141
0
                                               (opj_procedure)opj_j2k_write_mct_data_group, p_manager)) {
13142
0
            return OPJ_FALSE;
13143
0
        }
13144
0
    }
13145
    /* End of Developer Corner */
13146
13147
10.9k
    if (p_j2k->cstr_index) {
13148
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13149
0
                                               (opj_procedure)opj_j2k_get_end_header, p_manager)) {
13150
0
            return OPJ_FALSE;
13151
0
        }
13152
0
    }
13153
13154
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13155
10.9k
                                           (opj_procedure)opj_j2k_create_tcd, p_manager)) {
13156
0
        return OPJ_FALSE;
13157
0
    }
13158
10.9k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13159
10.9k
                                           (opj_procedure)opj_j2k_update_rates, p_manager)) {
13160
0
        return OPJ_FALSE;
13161
0
    }
13162
13163
10.9k
    return OPJ_TRUE;
13164
10.9k
}
13165
13166
static OPJ_BOOL opj_j2k_write_first_tile_part(opj_j2k_t *p_j2k,
13167
        OPJ_BYTE * p_data,
13168
        OPJ_UINT32 * p_data_written,
13169
        OPJ_UINT32 total_data_size,
13170
        opj_stream_private_t *p_stream,
13171
        struct opj_event_mgr * p_manager)
13172
10.9k
{
13173
10.9k
    OPJ_UINT32 l_nb_bytes_written = 0;
13174
10.9k
    OPJ_UINT32 l_current_nb_bytes_written;
13175
10.9k
    OPJ_BYTE * l_begin_data = 00;
13176
13177
10.9k
    opj_tcd_t * l_tcd = 00;
13178
10.9k
    opj_cp_t * l_cp = 00;
13179
13180
10.9k
    l_tcd = p_j2k->m_tcd;
13181
10.9k
    l_cp = &(p_j2k->m_cp);
13182
13183
10.9k
    l_tcd->cur_pino = 0;
13184
13185
    /*Get number of tile parts*/
13186
10.9k
    p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
13187
13188
    /* INDEX >> */
13189
    /* << INDEX */
13190
13191
10.9k
    l_current_nb_bytes_written = 0;
13192
10.9k
    l_begin_data = p_data;
13193
10.9k
    if (! opj_j2k_write_sot(p_j2k, p_data, total_data_size,
13194
10.9k
                            &l_current_nb_bytes_written, p_stream,
13195
10.9k
                            p_manager)) {
13196
0
        return OPJ_FALSE;
13197
0
    }
13198
13199
10.9k
    l_nb_bytes_written += l_current_nb_bytes_written;
13200
10.9k
    p_data += l_current_nb_bytes_written;
13201
10.9k
    total_data_size -= l_current_nb_bytes_written;
13202
13203
10.9k
    if (!OPJ_IS_CINEMA(l_cp->rsiz)) {
13204
#if 0
13205
        for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
13206
            l_current_nb_bytes_written = 0;
13207
            opj_j2k_write_coc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
13208
                                        p_manager);
13209
            l_nb_bytes_written += l_current_nb_bytes_written;
13210
            p_data += l_current_nb_bytes_written;
13211
            total_data_size -= l_current_nb_bytes_written;
13212
13213
            l_current_nb_bytes_written = 0;
13214
            opj_j2k_write_qcc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
13215
                                        p_manager);
13216
            l_nb_bytes_written += l_current_nb_bytes_written;
13217
            p_data += l_current_nb_bytes_written;
13218
            total_data_size -= l_current_nb_bytes_written;
13219
        }
13220
#endif
13221
10.9k
        if (l_cp->tcps[p_j2k->m_current_tile_number].POC) {
13222
0
            l_current_nb_bytes_written = 0;
13223
0
            opj_j2k_write_poc_in_memory(p_j2k, p_data, &l_current_nb_bytes_written,
13224
0
                                        p_manager);
13225
0
            l_nb_bytes_written += l_current_nb_bytes_written;
13226
0
            p_data += l_current_nb_bytes_written;
13227
0
            total_data_size -= l_current_nb_bytes_written;
13228
0
        }
13229
10.9k
    }
13230
13231
10.9k
    l_current_nb_bytes_written = 0;
13232
10.9k
    if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
13233
10.9k
                            total_data_size, p_stream, p_manager)) {
13234
67
        return OPJ_FALSE;
13235
67
    }
13236
13237
10.9k
    l_nb_bytes_written += l_current_nb_bytes_written;
13238
10.9k
    * p_data_written = l_nb_bytes_written;
13239
13240
    /* Writing Psot in SOT marker */
13241
10.9k
    opj_write_bytes(l_begin_data + 6, l_nb_bytes_written,
13242
10.9k
                    4);                                 /* PSOT */
13243
13244
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13245
1.05k
        opj_j2k_update_tlm(p_j2k, l_nb_bytes_written);
13246
1.05k
    }
13247
13248
10.9k
    return OPJ_TRUE;
13249
10.9k
}
13250
13251
static OPJ_BOOL opj_j2k_write_all_tile_parts(opj_j2k_t *p_j2k,
13252
        OPJ_BYTE * p_data,
13253
        OPJ_UINT32 * p_data_written,
13254
        OPJ_UINT32 total_data_size,
13255
        opj_stream_private_t *p_stream,
13256
        struct opj_event_mgr * p_manager
13257
                                            )
13258
10.9k
{
13259
10.9k
    OPJ_UINT32 tilepartno = 0;
13260
10.9k
    OPJ_UINT32 l_nb_bytes_written = 0;
13261
10.9k
    OPJ_UINT32 l_current_nb_bytes_written;
13262
10.9k
    OPJ_UINT32 l_part_tile_size;
13263
10.9k
    OPJ_UINT32 tot_num_tp;
13264
10.9k
    OPJ_UINT32 pino;
13265
13266
10.9k
    OPJ_BYTE * l_begin_data;
13267
10.9k
    opj_tcp_t *l_tcp = 00;
13268
10.9k
    opj_tcd_t * l_tcd = 00;
13269
10.9k
    opj_cp_t * l_cp = 00;
13270
13271
10.9k
    l_tcd = p_j2k->m_tcd;
13272
10.9k
    l_cp = &(p_j2k->m_cp);
13273
10.9k
    l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
13274
13275
    /*Get number of tile parts*/
13276
10.9k
    tot_num_tp = opj_j2k_get_num_tp(l_cp, 0, p_j2k->m_current_tile_number);
13277
13278
    /* start writing remaining tile parts */
13279
10.9k
    ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
13280
10.9k
    for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
13281
0
        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
13282
0
        l_current_nb_bytes_written = 0;
13283
0
        l_part_tile_size = 0;
13284
0
        l_begin_data = p_data;
13285
13286
0
        if (! opj_j2k_write_sot(p_j2k, p_data,
13287
0
                                total_data_size,
13288
0
                                &l_current_nb_bytes_written,
13289
0
                                p_stream,
13290
0
                                p_manager)) {
13291
0
            return OPJ_FALSE;
13292
0
        }
13293
13294
0
        l_nb_bytes_written += l_current_nb_bytes_written;
13295
0
        p_data += l_current_nb_bytes_written;
13296
0
        total_data_size -= l_current_nb_bytes_written;
13297
0
        l_part_tile_size += l_current_nb_bytes_written;
13298
13299
0
        l_current_nb_bytes_written = 0;
13300
0
        if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
13301
0
                                total_data_size, p_stream, p_manager)) {
13302
0
            return OPJ_FALSE;
13303
0
        }
13304
13305
0
        p_data += l_current_nb_bytes_written;
13306
0
        l_nb_bytes_written += l_current_nb_bytes_written;
13307
0
        total_data_size -= l_current_nb_bytes_written;
13308
0
        l_part_tile_size += l_current_nb_bytes_written;
13309
13310
        /* Writing Psot in SOT marker */
13311
0
        opj_write_bytes(l_begin_data + 6, l_part_tile_size,
13312
0
                        4);                                   /* PSOT */
13313
13314
0
        if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13315
0
            opj_j2k_update_tlm(p_j2k, l_part_tile_size);
13316
0
        }
13317
13318
0
        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
13319
0
    }
13320
13321
10.9k
    for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
13322
0
        l_tcd->cur_pino = pino;
13323
13324
        /*Get number of tile parts*/
13325
0
        tot_num_tp = opj_j2k_get_num_tp(l_cp, pino, p_j2k->m_current_tile_number);
13326
0
        for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
13327
0
            p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
13328
0
            l_current_nb_bytes_written = 0;
13329
0
            l_part_tile_size = 0;
13330
0
            l_begin_data = p_data;
13331
13332
0
            if (! opj_j2k_write_sot(p_j2k, p_data,
13333
0
                                    total_data_size,
13334
0
                                    &l_current_nb_bytes_written, p_stream,
13335
0
                                    p_manager)) {
13336
0
                return OPJ_FALSE;
13337
0
            }
13338
13339
0
            l_nb_bytes_written += l_current_nb_bytes_written;
13340
0
            p_data += l_current_nb_bytes_written;
13341
0
            total_data_size -= l_current_nb_bytes_written;
13342
0
            l_part_tile_size += l_current_nb_bytes_written;
13343
13344
0
            l_current_nb_bytes_written = 0;
13345
13346
0
            if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
13347
0
                                    total_data_size, p_stream, p_manager)) {
13348
0
                return OPJ_FALSE;
13349
0
            }
13350
13351
0
            l_nb_bytes_written += l_current_nb_bytes_written;
13352
0
            p_data += l_current_nb_bytes_written;
13353
0
            total_data_size -= l_current_nb_bytes_written;
13354
0
            l_part_tile_size += l_current_nb_bytes_written;
13355
13356
            /* Writing Psot in SOT marker */
13357
0
            opj_write_bytes(l_begin_data + 6, l_part_tile_size,
13358
0
                            4);                                   /* PSOT */
13359
13360
0
            if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13361
0
                opj_j2k_update_tlm(p_j2k, l_part_tile_size);
13362
0
            }
13363
13364
0
            ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
13365
0
        }
13366
0
    }
13367
13368
10.9k
    *p_data_written = l_nb_bytes_written;
13369
13370
10.9k
    return OPJ_TRUE;
13371
10.9k
}
13372
13373
static OPJ_BOOL opj_j2k_write_updated_tlm(opj_j2k_t *p_j2k,
13374
        struct opj_stream_private *p_stream,
13375
        struct opj_event_mgr * p_manager)
13376
1.05k
{
13377
1.05k
    OPJ_UINT32 l_tlm_size;
13378
1.05k
    OPJ_OFF_T l_tlm_position, l_current_position;
13379
1.05k
    OPJ_UINT32 size_per_tile_part;
13380
13381
    /* preconditions */
13382
1.05k
    assert(p_j2k != 00);
13383
1.05k
    assert(p_manager != 00);
13384
1.05k
    assert(p_stream != 00);
13385
13386
1.05k
    size_per_tile_part = p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte ? 5 : 6;
13387
1.05k
    l_tlm_size = size_per_tile_part *
13388
1.05k
                 p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
13389
1.05k
    l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
13390
1.05k
    l_current_position = opj_stream_tell(p_stream);
13391
13392
1.05k
    if (! opj_stream_seek(p_stream, l_tlm_position, p_manager)) {
13393
0
        return OPJ_FALSE;
13394
0
    }
13395
13396
1.05k
    if (opj_stream_write_data(p_stream,
13397
1.05k
                              p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer, l_tlm_size,
13398
1.05k
                              p_manager) != l_tlm_size) {
13399
0
        return OPJ_FALSE;
13400
0
    }
13401
13402
1.05k
    if (! opj_stream_seek(p_stream, l_current_position, p_manager)) {
13403
0
        return OPJ_FALSE;
13404
0
    }
13405
13406
1.05k
    return OPJ_TRUE;
13407
1.05k
}
13408
13409
static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
13410
                                     struct opj_stream_private *p_stream,
13411
                                     struct opj_event_mgr * p_manager)
13412
10.9k
{
13413
    /* preconditions */
13414
10.9k
    assert(p_j2k != 00);
13415
10.9k
    assert(p_manager != 00);
13416
10.9k
    assert(p_stream != 00);
13417
13418
10.9k
    OPJ_UNUSED(p_stream);
13419
10.9k
    OPJ_UNUSED(p_manager);
13420
13421
10.9k
    opj_tcd_destroy(p_j2k->m_tcd);
13422
10.9k
    p_j2k->m_tcd = 00;
13423
13424
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
13425
1.05k
        opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
13426
1.05k
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
13427
1.05k
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
13428
1.05k
    }
13429
13430
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
13431
10.9k
        opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
13432
10.9k
        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
13433
10.9k
    }
13434
13435
10.9k
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
13436
13437
10.9k
    return OPJ_TRUE;
13438
10.9k
}
13439
13440
/**
13441
 * Destroys the memory associated with the decoding of headers.
13442
 */
13443
static OPJ_BOOL opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,
13444
        opj_stream_private_t *p_stream,
13445
        opj_event_mgr_t * p_manager
13446
                                             )
13447
10.9k
{
13448
    /* preconditions */
13449
10.9k
    assert(p_j2k != 00);
13450
10.9k
    assert(p_stream != 00);
13451
10.9k
    assert(p_manager != 00);
13452
13453
10.9k
    OPJ_UNUSED(p_stream);
13454
10.9k
    OPJ_UNUSED(p_manager);
13455
13456
10.9k
    if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
13457
10.9k
        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
13458
10.9k
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
13459
10.9k
    }
13460
13461
10.9k
    p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
13462
13463
10.9k
    return OPJ_TRUE;
13464
10.9k
}
13465
13466
static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
13467
                                  struct opj_stream_private *p_stream,
13468
                                  struct opj_event_mgr * p_manager)
13469
10.9k
{
13470
10.9k
    opj_codestream_info_t * l_cstr_info = 00;
13471
13472
    /* preconditions */
13473
10.9k
    assert(p_j2k != 00);
13474
10.9k
    assert(p_manager != 00);
13475
10.9k
    assert(p_stream != 00);
13476
10.9k
    (void)l_cstr_info;
13477
13478
10.9k
    OPJ_UNUSED(p_stream);
13479
13480
    /* TODO mergeV2: check this part which use cstr_info */
13481
    /*l_cstr_info = p_j2k->cstr_info;
13482
13483
    if (l_cstr_info)  {
13484
            OPJ_UINT32 compno;
13485
            l_cstr_info->tile = (opj_tile_info_t *) opj_malloc(p_j2k->m_cp.tw * p_j2k->m_cp.th * sizeof(opj_tile_info_t));
13486
13487
            l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
13488
            l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
13489
13490
            l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
13491
13492
            l_cstr_info->tw = p_j2k->m_cp.tw;
13493
            l_cstr_info->th = p_j2k->m_cp.th;
13494
13495
            l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/        /* new version parser */
13496
    /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/      /* new version parser */
13497
    /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/     /* new version parser */
13498
    /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/     /* new version parser */
13499
13500
    /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
13501
13502
    l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
13503
13504
    l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
13505
13506
    for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
13507
            l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
13508
    }
13509
13510
    l_cstr_info->D_max = 0.0;       */      /* ADD Marcela */
13511
13512
    /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
13513
13514
    /*l_cstr_info->maxmarknum = 100;
13515
    l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
13516
    l_cstr_info->marknum = 0;
13517
    }*/
13518
13519
10.9k
    return opj_j2k_calculate_tp(p_j2k, &(p_j2k->m_cp),
13520
10.9k
                                &p_j2k->m_specific_param.m_encoder.m_total_tile_parts, p_j2k->m_private_image,
13521
10.9k
                                p_manager);
13522
10.9k
}
13523
13524
/**
13525
 * Creates a tile-coder encoder.
13526
 *
13527
 * @param       p_stream                the stream to write data to.
13528
 * @param       p_j2k                   J2K codec.
13529
 * @param       p_manager               the user event manager.
13530
*/
13531
static OPJ_BOOL opj_j2k_create_tcd(opj_j2k_t *p_j2k,
13532
                                   opj_stream_private_t *p_stream,
13533
                                   opj_event_mgr_t * p_manager
13534
                                  )
13535
10.9k
{
13536
    /* preconditions */
13537
10.9k
    assert(p_j2k != 00);
13538
10.9k
    assert(p_manager != 00);
13539
10.9k
    assert(p_stream != 00);
13540
13541
10.9k
    OPJ_UNUSED(p_stream);
13542
13543
10.9k
    p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
13544
13545
10.9k
    if (! p_j2k->m_tcd) {
13546
0
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
13547
0
        return OPJ_FALSE;
13548
0
    }
13549
13550
10.9k
    if (!opj_tcd_init(p_j2k->m_tcd, p_j2k->m_private_image, &p_j2k->m_cp,
13551
10.9k
                      p_j2k->m_tp)) {
13552
0
        opj_tcd_destroy(p_j2k->m_tcd);
13553
0
        p_j2k->m_tcd = 00;
13554
0
        return OPJ_FALSE;
13555
0
    }
13556
13557
10.9k
    return OPJ_TRUE;
13558
10.9k
}
13559
13560
OPJ_BOOL opj_j2k_write_tile(opj_j2k_t * p_j2k,
13561
                            OPJ_UINT32 p_tile_index,
13562
                            OPJ_BYTE * p_data,
13563
                            OPJ_UINT32 p_data_size,
13564
                            opj_stream_private_t *p_stream,
13565
                            opj_event_mgr_t * p_manager)
13566
0
{
13567
0
    if (! opj_j2k_pre_write_tile(p_j2k, p_tile_index, p_stream, p_manager)) {
13568
0
        opj_event_msg(p_manager, EVT_ERROR,
13569
0
                      "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
13570
0
        return OPJ_FALSE;
13571
0
    } else {
13572
0
        OPJ_UINT32 j;
13573
        /* Allocate data */
13574
0
        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
13575
0
            opj_tcd_tilecomp_t* l_tilec = p_j2k->m_tcd->tcd_image->tiles->comps + j;
13576
13577
0
            if (! opj_alloc_tile_component_data(l_tilec)) {
13578
0
                opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
13579
0
                return OPJ_FALSE;
13580
0
            }
13581
0
        }
13582
13583
        /* now copy data into the tile component */
13584
0
        if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
13585
0
            opj_event_msg(p_manager, EVT_ERROR,
13586
0
                          "Size mismatch between tile data and sent data.");
13587
0
            return OPJ_FALSE;
13588
0
        }
13589
0
        if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
13590
0
            opj_event_msg(p_manager, EVT_ERROR,
13591
0
                          "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
13592
0
            return OPJ_FALSE;
13593
0
        }
13594
0
    }
13595
13596
0
    return OPJ_TRUE;
13597
0
}