Coverage Report

Created: 2026-05-16 07:21

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
0
{
913
0
    if (p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte) {
914
0
        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
915
0
                        p_j2k->m_current_tile_number, 1);
916
0
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 1;
917
0
    } 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
0
    opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
924
0
                    p_tile_part_size, 4);                                       /* PSOT */
925
0
    p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
926
0
}
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
0
{
1450
0
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1451
0
    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1452
0
    OPJ_UINT32 i;
1453
0
    OPJ_UINT32 l_temp;
1454
1455
0
    for (i = 0; i < p_nb_elem; ++i) {
1456
0
        opj_read_bytes(l_src_data, &l_temp, 2);
1457
1458
0
        l_src_data += sizeof(OPJ_INT16);
1459
1460
0
        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1461
0
    }
1462
0
}
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
0
{
1467
0
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1468
0
    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1469
0
    OPJ_UINT32 i;
1470
0
    OPJ_UINT32 l_temp;
1471
1472
0
    for (i = 0; i < p_nb_elem; ++i) {
1473
0
        opj_read_bytes(l_src_data, &l_temp, 4);
1474
1475
0
        l_src_data += sizeof(OPJ_INT32);
1476
1477
0
        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1478
0
    }
1479
0
}
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
0
{
1484
0
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1485
0
    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1486
0
    OPJ_UINT32 i;
1487
0
    OPJ_FLOAT32 l_temp;
1488
1489
0
    for (i = 0; i < p_nb_elem; ++i) {
1490
0
        opj_read_float(l_src_data, &l_temp);
1491
1492
0
        l_src_data += sizeof(OPJ_FLOAT32);
1493
1494
0
        *(l_dest_data++) = l_temp;
1495
0
    }
1496
0
}
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
0
{
1501
0
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1502
0
    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1503
0
    OPJ_UINT32 i;
1504
0
    OPJ_FLOAT64 l_temp;
1505
1506
0
    for (i = 0; i < p_nb_elem; ++i) {
1507
0
        opj_read_double(l_src_data, &l_temp);
1508
1509
0
        l_src_data += sizeof(OPJ_FLOAT64);
1510
1511
0
        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1512
0
    }
1513
0
}
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
0
{
1518
0
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1519
0
    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1520
0
    OPJ_UINT32 i;
1521
0
    OPJ_UINT32 l_temp;
1522
1523
0
    for (i = 0; i < p_nb_elem; ++i) {
1524
0
        opj_read_bytes(l_src_data, &l_temp, 2);
1525
1526
0
        l_src_data += sizeof(OPJ_INT16);
1527
1528
0
        *(l_dest_data++) = (OPJ_INT32) l_temp;
1529
0
    }
1530
0
}
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
0
{
1535
0
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1536
0
    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1537
0
    OPJ_UINT32 i;
1538
0
    OPJ_UINT32 l_temp;
1539
1540
0
    for (i = 0; i < p_nb_elem; ++i) {
1541
0
        opj_read_bytes(l_src_data, &l_temp, 4);
1542
1543
0
        l_src_data += sizeof(OPJ_INT32);
1544
1545
0
        *(l_dest_data++) = (OPJ_INT32) l_temp;
1546
0
    }
1547
0
}
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
0
{
1552
0
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1553
0
    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1554
0
    OPJ_UINT32 i;
1555
0
    OPJ_FLOAT32 l_temp;
1556
1557
0
    for (i = 0; i < p_nb_elem; ++i) {
1558
0
        opj_read_float(l_src_data, &l_temp);
1559
1560
0
        l_src_data += sizeof(OPJ_FLOAT32);
1561
1562
0
        *(l_dest_data++) = (OPJ_INT32) l_temp;
1563
0
    }
1564
0
}
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
0
{
1569
0
    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1570
0
    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1571
0
    OPJ_UINT32 i;
1572
0
    OPJ_FLOAT64 l_temp;
1573
1574
0
    for (i = 0; i < p_nb_elem; ++i) {
1575
0
        opj_read_double(l_src_data, &l_temp);
1576
1577
0
        l_src_data += sizeof(OPJ_FLOAT64);
1578
1579
0
        *(l_dest_data++) = (OPJ_INT32) l_temp;
1580
0
    }
1581
0
}
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
0
{
1653
0
    const j2k_prog_order_t *po;
1654
0
    for (po = j2k_prog_order_list; po->enum_prog != -1; po++) {
1655
0
        if (po->enum_prog == prg_order) {
1656
0
            return po->str_prog;
1657
0
        }
1658
0
    }
1659
0
    return po->str_prog;
1660
0
}
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
0
{
1752
0
    const OPJ_CHAR *prog = 00;
1753
0
    OPJ_INT32 i;
1754
0
    OPJ_UINT32 tpnum = 1;
1755
0
    opj_tcp_t *tcp = 00;
1756
0
    opj_poc_t * l_current_poc = 00;
1757
1758
    /*  preconditions */
1759
0
    assert(tileno < (cp->tw * cp->th));
1760
0
    assert(pino < (cp->tcps[tileno].numpocs + 1));
1761
1762
    /* get the given tile coding parameter */
1763
0
    tcp = &cp->tcps[tileno];
1764
0
    assert(tcp != 00);
1765
1766
0
    l_current_poc = &(tcp->pocs[pino]);
1767
0
    assert(l_current_poc != 0);
1768
1769
    /* get the progression order as a character string */
1770
0
    prog = opj_j2k_convert_progression_order(tcp->prg);
1771
0
    assert(strlen(prog) > 0);
1772
1773
0
    if (cp->m_specific_param.m_enc.m_tp_on == 1) {
1774
0
        for (i = 0; i < 4; ++i) {
1775
0
            switch (prog[i]) {
1776
            /* component wise */
1777
0
            case 'C':
1778
0
                tpnum *= l_current_poc->compE;
1779
0
                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
0
            }
1793
            /* would we split here ? */
1794
0
            if (cp->m_specific_param.m_enc.m_tp_flag == prog[i]) {
1795
0
                cp->m_specific_param.m_enc.m_tp_pos = i;
1796
0
                break;
1797
0
            }
1798
0
        }
1799
0
    } else {
1800
0
        tpnum = 1;
1801
0
    }
1802
1803
0
    return tpnum;
1804
0
}
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
0
{
1813
0
    OPJ_UINT32 pino, tileno;
1814
0
    OPJ_UINT32 l_nb_tiles;
1815
0
    opj_tcp_t *tcp;
1816
1817
    /* preconditions */
1818
0
    assert(p_nb_tiles != 00);
1819
0
    assert(cp != 00);
1820
0
    assert(image != 00);
1821
0
    assert(p_j2k != 00);
1822
0
    assert(p_manager != 00);
1823
1824
0
    OPJ_UNUSED(p_j2k);
1825
0
    OPJ_UNUSED(p_manager);
1826
1827
0
    l_nb_tiles = cp->tw * cp->th;
1828
0
    * p_nb_tiles = 0;
1829
0
    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
0
        for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1867
0
            OPJ_UINT32 cur_totnum_tp = 0;
1868
1869
0
            opj_pi_update_encoding_parameters(image, cp, tileno);
1870
1871
0
            for (pino = 0; pino <= tcp->numpocs; ++pino) {
1872
0
                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp, pino, tileno);
1873
1874
0
                *p_nb_tiles = *p_nb_tiles + tp_num;
1875
1876
0
                cur_totnum_tp += tp_num;
1877
0
            }
1878
0
            tcp->m_nb_tile_parts = cur_totnum_tp;
1879
1880
0
            ++tcp;
1881
0
        }
1882
0
    }
1883
1884
0
    return OPJ_TRUE;
1885
0
}
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
0
{
1891
    /* 2 bytes will be written */
1892
0
    OPJ_BYTE * l_start_stream = 00;
1893
1894
    /* preconditions */
1895
0
    assert(p_stream != 00);
1896
0
    assert(p_j2k != 00);
1897
0
    assert(p_manager != 00);
1898
1899
0
    l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1900
1901
    /* write SOC identifier */
1902
0
    opj_write_bytes(l_start_stream, J2K_MS_SOC, 2);
1903
1904
0
    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
0
    return OPJ_TRUE;
1919
0
}
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
318k
{
1932
318k
    OPJ_BYTE l_data [2];
1933
318k
    OPJ_UINT32 l_marker;
1934
1935
    /* preconditions */
1936
318k
    assert(p_j2k != 00);
1937
318k
    assert(p_manager != 00);
1938
318k
    assert(p_stream != 00);
1939
1940
318k
    if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
1941
3.35k
        return OPJ_FALSE;
1942
3.35k
    }
1943
1944
314k
    opj_read_bytes(l_data, &l_marker, 2);
1945
314k
    if (l_marker != J2K_MS_SOC) {
1946
88.2k
        return OPJ_FALSE;
1947
88.2k
    }
1948
1949
    /* Next marker should be a SIZ marker in the main header */
1950
226k
    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
226k
    p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
1954
1955
226k
    opj_event_msg(p_manager, EVT_INFO,
1956
226k
                  "Start to read j2k main header (%" PRId64 ").\n",
1957
226k
                  p_j2k->cstr_index->main_head_start);
1958
1959
    /* Add the marker to the codestream index*/
1960
226k
    if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC,
1961
226k
                                          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
226k
    return OPJ_TRUE;
1966
226k
}
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
0
{
1972
0
    OPJ_UINT32 i;
1973
0
    OPJ_UINT32 l_size_len;
1974
0
    OPJ_BYTE * l_current_ptr;
1975
0
    opj_image_t * l_image = 00;
1976
0
    opj_cp_t *cp = 00;
1977
0
    opj_image_comp_t * l_img_comp = 00;
1978
1979
    /* preconditions */
1980
0
    assert(p_stream != 00);
1981
0
    assert(p_j2k != 00);
1982
0
    assert(p_manager != 00);
1983
1984
0
    l_image = p_j2k->m_private_image;
1985
0
    cp = &(p_j2k->m_cp);
1986
0
    l_size_len = 40 + 3 * l_image->numcomps;
1987
0
    l_img_comp = l_image->comps;
1988
1989
0
    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
0
    l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2005
2006
    /* write SOC identifier */
2007
0
    opj_write_bytes(l_current_ptr, J2K_MS_SIZ, 2);  /* SIZ */
2008
0
    l_current_ptr += 2;
2009
2010
0
    opj_write_bytes(l_current_ptr, l_size_len - 2, 2); /* L_SIZ */
2011
0
    l_current_ptr += 2;
2012
2013
0
    opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */
2014
0
    l_current_ptr += 2;
2015
2016
0
    opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
2017
0
    l_current_ptr += 4;
2018
2019
0
    opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
2020
0
    l_current_ptr += 4;
2021
2022
0
    opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
2023
0
    l_current_ptr += 4;
2024
2025
0
    opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
2026
0
    l_current_ptr += 4;
2027
2028
0
    opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */
2029
0
    l_current_ptr += 4;
2030
2031
0
    opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */
2032
0
    l_current_ptr += 4;
2033
2034
0
    opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */
2035
0
    l_current_ptr += 4;
2036
2037
0
    opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */
2038
0
    l_current_ptr += 4;
2039
2040
0
    opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */
2041
0
    l_current_ptr += 2;
2042
2043
0
    for (i = 0; i < l_image->numcomps; ++i) {
2044
        /* TODO here with MCT ? */
2045
0
        opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7),
2046
0
                        1);      /* Ssiz_i */
2047
0
        ++l_current_ptr;
2048
2049
0
        opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */
2050
0
        ++l_current_ptr;
2051
2052
0
        opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */
2053
0
        ++l_current_ptr;
2054
2055
0
        ++l_img_comp;
2056
0
    }
2057
2058
0
    if (opj_stream_write_data(p_stream,
2059
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len,
2060
0
                              p_manager) != l_size_len) {
2061
0
        return OPJ_FALSE;
2062
0
    }
2063
2064
0
    return OPJ_TRUE;
2065
0
}
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
225k
{
2080
225k
    OPJ_UINT32 i;
2081
225k
    OPJ_UINT32 l_nb_comp;
2082
225k
    OPJ_UINT32 l_nb_comp_remain;
2083
225k
    OPJ_UINT32 l_remaining_size;
2084
225k
    OPJ_UINT32 l_nb_tiles;
2085
225k
    OPJ_UINT32 l_tmp, l_tx1, l_ty1;
2086
225k
    OPJ_UINT32 l_prec0, l_sgnd0;
2087
225k
    opj_image_t *l_image = 00;
2088
225k
    opj_cp_t *l_cp = 00;
2089
225k
    opj_image_comp_t * l_img_comp = 00;
2090
225k
    opj_tcp_t * l_current_tile_param = 00;
2091
2092
    /* preconditions */
2093
225k
    assert(p_j2k != 00);
2094
225k
    assert(p_manager != 00);
2095
225k
    assert(p_header_data != 00);
2096
2097
225k
    l_image = p_j2k->m_private_image;
2098
225k
    l_cp = &(p_j2k->m_cp);
2099
2100
    /* minimum size == 39 - 3 (= minimum component parameter) */
2101
225k
    if (p_header_size < 36) {
2102
337
        opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2103
337
        return OPJ_FALSE;
2104
337
    }
2105
2106
225k
    l_remaining_size = p_header_size - 36;
2107
225k
    l_nb_comp = l_remaining_size / 3;
2108
225k
    l_nb_comp_remain = l_remaining_size % 3;
2109
225k
    if (l_nb_comp_remain != 0) {
2110
727
        opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2111
727
        return OPJ_FALSE;
2112
727
    }
2113
2114
224k
    opj_read_bytes(p_header_data, &l_tmp,
2115
224k
                   2);                                                /* Rsiz (capabilities) */
2116
224k
    p_header_data += 2;
2117
224k
    l_cp->rsiz = (OPJ_UINT16) l_tmp;
2118
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */
2119
224k
    p_header_data += 4;
2120
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */
2121
224k
    p_header_data += 4;
2122
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */
2123
224k
    p_header_data += 4;
2124
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */
2125
224k
    p_header_data += 4;
2126
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx,
2127
224k
                   4);             /* XTsiz */
2128
224k
    p_header_data += 4;
2129
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy,
2130
224k
                   4);             /* YTsiz */
2131
224k
    p_header_data += 4;
2132
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0,
2133
224k
                   4);             /* XT0siz */
2134
224k
    p_header_data += 4;
2135
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0,
2136
224k
                   4);             /* YT0siz */
2137
224k
    p_header_data += 4;
2138
224k
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp,
2139
224k
                   2);                 /* Csiz */
2140
224k
    p_header_data += 2;
2141
224k
    if (l_tmp < 16385) {
2142
223k
        l_image->numcomps = (OPJ_UINT16) l_tmp;
2143
223k
    } else {
2144
941
        opj_event_msg(p_manager, EVT_ERROR,
2145
941
                      "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
2146
941
        return OPJ_FALSE;
2147
941
    }
2148
2149
223k
    if (l_image->numcomps != l_nb_comp) {
2150
1.13k
        opj_event_msg(p_manager, EVT_ERROR,
2151
1.13k
                      "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n",
2152
1.13k
                      l_image->numcomps, l_nb_comp);
2153
1.13k
        return OPJ_FALSE;
2154
1.13k
    }
2155
2156
    /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
2157
    /* testcase issue427-null-image-size.jp2 */
2158
222k
    if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) {
2159
1.93k
        opj_event_msg(p_manager, EVT_ERROR,
2160
1.93k
                      "Error with SIZ marker: negative or zero image size (%" PRId64 " x %" PRId64
2161
1.93k
                      ")\n", (OPJ_INT64)l_image->x1 - l_image->x0,
2162
1.93k
                      (OPJ_INT64)l_image->y1 - l_image->y0);
2163
1.93k
        return OPJ_FALSE;
2164
1.93k
    }
2165
    /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
2166
220k
    if ((l_cp->tdx == 0U) || (l_cp->tdy == 0U)) {
2167
630
        opj_event_msg(p_manager, EVT_ERROR,
2168
630
                      "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx,
2169
630
                      l_cp->tdy);
2170
630
        return OPJ_FALSE;
2171
630
    }
2172
2173
    /* testcase issue427-illegal-tile-offset.jp2 */
2174
219k
    l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */
2175
219k
    l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */
2176
219k
    if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) ||
2177
218k
            (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0)) {
2178
2.12k
        opj_event_msg(p_manager, EVT_ERROR,
2179
2.12k
                      "Error with SIZ marker: illegal tile offset\n");
2180
2.12k
        return OPJ_FALSE;
2181
2.12k
    }
2182
217k
    if (!p_j2k->dump_state) {
2183
217k
        OPJ_UINT32 siz_w, siz_h;
2184
2185
217k
        siz_w = l_image->x1 - l_image->x0;
2186
217k
        siz_h = l_image->y1 - l_image->y0;
2187
2188
217k
        if (p_j2k->ihdr_w > 0 && p_j2k->ihdr_h > 0
2189
194k
                && (p_j2k->ihdr_w != siz_w || p_j2k->ihdr_h != siz_h)) {
2190
1.34k
            opj_event_msg(p_manager, EVT_ERROR,
2191
1.34k
                          "Error with SIZ marker: IHDR w(%u) h(%u) vs. SIZ w(%u) h(%u)\n", p_j2k->ihdr_w,
2192
1.34k
                          p_j2k->ihdr_h, siz_w, siz_h);
2193
1.34k
            return OPJ_FALSE;
2194
1.34k
        }
2195
217k
    }
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
216k
    l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps,
2240
216k
                     sizeof(opj_image_comp_t));
2241
216k
    if (l_image->comps == 00) {
2242
0
        l_image->numcomps = 0;
2243
0
        opj_event_msg(p_manager, EVT_ERROR,
2244
0
                      "Not enough memory to take in charge SIZ marker\n");
2245
0
        return OPJ_FALSE;
2246
0
    }
2247
2248
216k
    l_img_comp = l_image->comps;
2249
2250
216k
    l_prec0 = 0;
2251
216k
    l_sgnd0 = 0;
2252
    /* Read the component information */
2253
835k
    for (i = 0; i < l_image->numcomps; ++i) {
2254
621k
        OPJ_UINT32 tmp;
2255
621k
        opj_read_bytes(p_header_data, &tmp, 1); /* Ssiz_i */
2256
621k
        ++p_header_data;
2257
621k
        l_img_comp->prec = (tmp & 0x7f) + 1;
2258
621k
        l_img_comp->sgnd = tmp >> 7;
2259
2260
621k
        if (p_j2k->dump_state == 0) {
2261
621k
            if (i == 0) {
2262
216k
                l_prec0 = l_img_comp->prec;
2263
216k
                l_sgnd0 = l_img_comp->sgnd;
2264
404k
            } else if (!l_cp->allow_different_bit_depth_sign
2265
358k
                       && (l_img_comp->prec != l_prec0 || l_img_comp->sgnd != l_sgnd0)) {
2266
19.8k
                opj_event_msg(p_manager, EVT_WARNING,
2267
19.8k
                              "Despite JP2 BPC!=255, precision and/or sgnd values for comp[%d] is different than comp[0]:\n"
2268
19.8k
                              "        [0] prec(%d) sgnd(%d) [%d] prec(%d) sgnd(%d)\n", i, l_prec0, l_sgnd0,
2269
19.8k
                              i, l_img_comp->prec, l_img_comp->sgnd);
2270
19.8k
            }
2271
            /* TODO: we should perhaps also check against JP2 BPCC values */
2272
621k
        }
2273
621k
        opj_read_bytes(p_header_data, &tmp, 1); /* XRsiz_i */
2274
621k
        ++p_header_data;
2275
621k
        l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2276
621k
        opj_read_bytes(p_header_data, &tmp, 1); /* YRsiz_i */
2277
621k
        ++p_header_data;
2278
621k
        l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2279
621k
        if (l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
2280
620k
                l_img_comp->dy < 1 || l_img_comp->dy > 255) {
2281
995
            opj_event_msg(p_manager, EVT_ERROR,
2282
995
                          "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n",
2283
995
                          i, l_img_comp->dx, l_img_comp->dy);
2284
995
            return OPJ_FALSE;
2285
995
        }
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
620k
        if (l_img_comp->prec > 31) {
2290
721
            opj_event_msg(p_manager, EVT_ERROR,
2291
721
                          "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
721
                          i, l_img_comp->prec);
2293
721
            return OPJ_FALSE;
2294
721
        }
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
619k
        l_img_comp->resno_decoded =
2325
619k
            0;                                                          /* number of resolution decoded */
2326
619k
        l_img_comp->factor =
2327
619k
            l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
2328
619k
        ++l_img_comp;
2329
619k
    }
2330
2331
214k
    if (l_cp->tdx == 0 || l_cp->tdy == 0) {
2332
0
        return OPJ_FALSE;
2333
0
    }
2334
2335
    /* Compute the number of tiles */
2336
214k
    l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
2337
214k
    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
214k
    if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
2341
306
        opj_event_msg(p_manager, EVT_ERROR,
2342
306
                      "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
2343
306
                      l_cp->tw, l_cp->th);
2344
306
        return OPJ_FALSE;
2345
306
    }
2346
214k
    l_nb_tiles = l_cp->tw * l_cp->th;
2347
2348
    /* Define the tiles which will be decoded */
2349
214k
    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
214k
    } else {
2361
214k
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
2362
214k
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
2363
214k
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
2364
214k
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
2365
214k
    }
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
214k
    l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
2414
214k
    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
214k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
2434
214k
        (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
2435
214k
    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
214k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
2442
214k
        (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS,
2443
214k
                                    sizeof(opj_mct_data_t));
2444
2445
214k
    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
214k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records =
2451
214k
        OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
2452
2453
214k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
2454
214k
        (opj_simple_mcc_decorrelation_data_t*)
2455
214k
        opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS,
2456
214k
                   sizeof(opj_simple_mcc_decorrelation_data_t));
2457
2458
214k
    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
214k
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records =
2464
214k
        OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
2465
2466
    /* set up default dc level shift */
2467
831k
    for (i = 0; i < l_image->numcomps; ++i) {
2468
616k
        if (! l_image->comps[i].sgnd) {
2469
612k
            p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
2470
612k
                    << (l_image->comps[i].prec - 1);
2471
612k
        }
2472
616k
    }
2473
2474
214k
    l_current_tile_param = l_cp->tcps;
2475
5.07M
    for (i = 0; i < l_nb_tiles; ++i) {
2476
4.85M
        l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps,
2477
4.85M
                                      sizeof(opj_tccp_t));
2478
4.85M
        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
4.85M
        ++l_current_tile_param;
2485
4.85M
    }
2486
2487
    /*Allocate and initialize some elements of codestrem index*/
2488
214k
    if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
2489
0
        return OPJ_FALSE;
2490
0
    }
2491
2492
214k
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MH;
2493
214k
    opj_image_comp_header_update(l_image, l_cp);
2494
2495
214k
    return OPJ_TRUE;
2496
214k
}
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
0
{
2503
0
    OPJ_UINT32 l_comment_size;
2504
0
    OPJ_UINT32 l_total_com_size;
2505
0
    const OPJ_CHAR *l_comment;
2506
0
    OPJ_BYTE * l_current_ptr = 00;
2507
2508
    /* preconditions */
2509
0
    assert(p_j2k != 00);
2510
0
    assert(p_stream != 00);
2511
0
    assert(p_manager != 00);
2512
2513
0
    l_comment = p_j2k->m_cp.comment;
2514
0
    l_comment_size = (OPJ_UINT32)strlen(l_comment);
2515
0
    l_total_com_size = l_comment_size + 6;
2516
2517
0
    if (l_total_com_size >
2518
0
            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
0
    l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2534
2535
0
    opj_write_bytes(l_current_ptr, J2K_MS_COM, 2);  /* COM */
2536
0
    l_current_ptr += 2;
2537
2538
0
    opj_write_bytes(l_current_ptr, l_total_com_size - 2, 2);        /* L_COM */
2539
0
    l_current_ptr += 2;
2540
2541
0
    opj_write_bytes(l_current_ptr, 1,
2542
0
                    2);   /* General use (IS 8859-15:1999 (Latin) values) */
2543
0
    l_current_ptr += 2;
2544
2545
0
    memcpy(l_current_ptr, l_comment, l_comment_size);
2546
2547
0
    if (opj_stream_write_data(p_stream,
2548
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size,
2549
0
                              p_manager) != l_total_com_size) {
2550
0
        return OPJ_FALSE;
2551
0
    }
2552
2553
0
    return OPJ_TRUE;
2554
0
}
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
49.4k
{
2569
    /* preconditions */
2570
49.4k
    assert(p_j2k != 00);
2571
49.4k
    assert(p_manager != 00);
2572
49.4k
    assert(p_header_data != 00);
2573
2574
49.4k
    OPJ_UNUSED(p_j2k);
2575
49.4k
    OPJ_UNUSED(p_header_data);
2576
49.4k
    OPJ_UNUSED(p_header_size);
2577
49.4k
    OPJ_UNUSED(p_manager);
2578
2579
49.4k
    return OPJ_TRUE;
2580
49.4k
}
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
0
{
2586
0
    opj_cp_t *l_cp = 00;
2587
0
    opj_tcp_t *l_tcp = 00;
2588
0
    OPJ_UINT32 l_code_size, l_remaining_size;
2589
0
    OPJ_BYTE * l_current_data = 00;
2590
2591
    /* preconditions */
2592
0
    assert(p_j2k != 00);
2593
0
    assert(p_manager != 00);
2594
0
    assert(p_stream != 00);
2595
2596
0
    l_cp = &(p_j2k->m_cp);
2597
0
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2598
0
    l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2599
0
                  p_j2k->m_current_tile_number, 0);
2600
0
    l_remaining_size = l_code_size;
2601
2602
0
    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
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2617
2618
0
    opj_write_bytes(l_current_data, J2K_MS_COD, 2);           /* COD */
2619
0
    l_current_data += 2;
2620
2621
0
    opj_write_bytes(l_current_data, l_code_size - 2, 2);      /* L_COD */
2622
0
    l_current_data += 2;
2623
2624
0
    opj_write_bytes(l_current_data, l_tcp->csty, 1);          /* Scod */
2625
0
    ++l_current_data;
2626
2627
0
    opj_write_bytes(l_current_data, (OPJ_UINT32)l_tcp->prg, 1); /* SGcod (A) */
2628
0
    ++l_current_data;
2629
2630
0
    opj_write_bytes(l_current_data, l_tcp->numlayers, 2);     /* SGcod (B) */
2631
0
    l_current_data += 2;
2632
2633
0
    opj_write_bytes(l_current_data, l_tcp->mct, 1);           /* SGcod (C) */
2634
0
    ++l_current_data;
2635
2636
0
    l_remaining_size -= 9;
2637
2638
0
    if (! opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
2639
0
                                    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
0
    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
0
    if (opj_stream_write_data(p_stream,
2650
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size,
2651
0
                              p_manager) != l_code_size) {
2652
0
        return OPJ_FALSE;
2653
0
    }
2654
2655
0
    return OPJ_TRUE;
2656
0
}
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
249k
{
2671
    /* loop */
2672
249k
    OPJ_UINT32 i;
2673
249k
    OPJ_UINT32 l_tmp;
2674
249k
    opj_cp_t *l_cp = 00;
2675
249k
    opj_tcp_t *l_tcp = 00;
2676
249k
    opj_image_t *l_image = 00;
2677
2678
    /* preconditions */
2679
249k
    assert(p_header_data != 00);
2680
249k
    assert(p_j2k != 00);
2681
249k
    assert(p_manager != 00);
2682
2683
249k
    l_image = p_j2k->m_private_image;
2684
249k
    l_cp = &(p_j2k->m_cp);
2685
2686
    /* If we are in the first tile-part header of the current tile */
2687
249k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
2688
49
            &l_cp->tcps[p_j2k->m_current_tile_number] :
2689
249k
            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
249k
    l_tcp->cod = 1;
2703
2704
    /* Make sure room is sufficient */
2705
249k
    if (p_header_size < 5) {
2706
346
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2707
346
        return OPJ_FALSE;
2708
346
    }
2709
2710
248k
    opj_read_bytes(p_header_data, &l_tcp->csty, 1);         /* Scod */
2711
248k
    ++p_header_data;
2712
    /* Make sure we know how to decode this */
2713
248k
    if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP |
2714
248k
                                     J2K_CP_CSTY_EPH)) != 0U) {
2715
836
        opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n");
2716
836
        return OPJ_FALSE;
2717
836
    }
2718
247k
    opj_read_bytes(p_header_data, &l_tmp, 1);                       /* SGcod (A) */
2719
247k
    ++p_header_data;
2720
247k
    l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
2721
    /* Make sure progression order is valid */
2722
247k
    if (l_tcp->prg > OPJ_CPRL) {
2723
5.28k
        opj_event_msg(p_manager, EVT_ERROR,
2724
5.28k
                      "Unknown progression order in COD marker\n");
2725
5.28k
        l_tcp->prg = OPJ_PROG_UNKNOWN;
2726
5.28k
    }
2727
247k
    opj_read_bytes(p_header_data, &l_tcp->numlayers, 2);    /* SGcod (B) */
2728
247k
    p_header_data += 2;
2729
2730
247k
    if ((l_tcp->numlayers < 1U) || (l_tcp->numlayers > 65535U)) {
2731
1.01k
        opj_event_msg(p_manager, EVT_ERROR,
2732
1.01k
                      "Invalid number of layers in COD marker : %d not in range [1-65535]\n",
2733
1.01k
                      l_tcp->numlayers);
2734
1.01k
        return OPJ_FALSE;
2735
1.01k
    }
2736
2737
    /* If user didn't set a number layer to decode take the max specify in the codestream. */
2738
246k
    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
246k
    } else {
2741
246k
        l_tcp->num_layers_to_decode = l_tcp->numlayers;
2742
246k
    }
2743
2744
246k
    opj_read_bytes(p_header_data, &l_tcp->mct, 1);          /* SGcod (C) */
2745
246k
    ++p_header_data;
2746
2747
246k
    if (l_tcp->mct > 1) {
2748
856
        opj_event_msg(p_manager, EVT_ERROR,
2749
856
                      "Invalid multiple component transformation\n");
2750
856
        return OPJ_FALSE;
2751
856
    }
2752
2753
245k
    p_header_size -= 5;
2754
957k
    for (i = 0; i < l_image->numcomps; ++i) {
2755
711k
        l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
2756
711k
    }
2757
2758
245k
    if (! opj_j2k_read_SPCod_SPCoc(p_j2k, 0, p_header_data, &p_header_size,
2759
245k
                                   p_manager)) {
2760
4.21k
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2761
4.21k
        return OPJ_FALSE;
2762
4.21k
    }
2763
2764
241k
    if (p_header_size != 0) {
2765
445
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2766
445
        return OPJ_FALSE;
2767
445
    }
2768
2769
    /* Apply the coding style to other components of the current tile or the m_default_tcp*/
2770
241k
    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
241k
    return OPJ_TRUE;
2790
241k
}
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
0
{
2846
0
    opj_cp_t *l_cp = NULL;
2847
0
    opj_tcp_t *l_tcp = NULL;
2848
2849
    /* preconditions */
2850
0
    assert(p_j2k != 00);
2851
2852
0
    l_cp = &(p_j2k->m_cp);
2853
0
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2854
2855
0
    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
0
    return opj_j2k_compare_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number,
2861
0
                                       p_first_comp_no, p_second_comp_no);
2862
0
}
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
0
{
2916
0
    OPJ_UINT32 i, j;
2917
0
    OPJ_UINT32 l_nb_comp;
2918
0
    OPJ_UINT32 l_nb_tiles;
2919
0
    OPJ_UINT32 l_max = 0;
2920
2921
    /* preconditions */
2922
2923
0
    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
2924
0
    l_nb_comp = p_j2k->m_private_image->numcomps;
2925
2926
0
    for (i = 0; i < l_nb_tiles; ++i) {
2927
0
        for (j = 0; j < l_nb_comp; ++j) {
2928
0
            l_max = opj_uint_max(l_max, opj_j2k_get_SPCod_SPCoc_size(p_j2k, i, j));
2929
0
        }
2930
0
    }
2931
2932
0
    return 6 + l_max;
2933
0
}
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
986
{
2948
986
    opj_cp_t *l_cp = NULL;
2949
986
    opj_tcp_t *l_tcp = NULL;
2950
986
    opj_image_t *l_image = NULL;
2951
986
    OPJ_UINT32 l_comp_room;
2952
986
    OPJ_UINT32 l_comp_no;
2953
2954
    /* preconditions */
2955
986
    assert(p_header_data != 00);
2956
986
    assert(p_j2k != 00);
2957
986
    assert(p_manager != 00);
2958
2959
986
    l_cp = &(p_j2k->m_cp);
2960
986
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
2961
986
            ?
2962
117
            &l_cp->tcps[p_j2k->m_current_tile_number] :
2963
986
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
2964
986
    l_image = p_j2k->m_private_image;
2965
2966
986
    l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
2967
2968
    /* make sure room is sufficient*/
2969
986
    if (p_header_size < l_comp_room + 1) {
2970
21
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2971
21
        return OPJ_FALSE;
2972
21
    }
2973
965
    p_header_size -= l_comp_room + 1;
2974
2975
965
    opj_read_bytes(p_header_data, &l_comp_no,
2976
965
                   l_comp_room);                 /* Ccoc */
2977
965
    p_header_data += l_comp_room;
2978
965
    if (l_comp_no >= l_image->numcomps) {
2979
438
        opj_event_msg(p_manager, EVT_ERROR,
2980
438
                      "Error reading COC marker (bad number of components)\n");
2981
438
        return OPJ_FALSE;
2982
438
    }
2983
2984
527
    opj_read_bytes(p_header_data, &l_tcp->tccps[l_comp_no].csty,
2985
527
                   1);                  /* Scoc */
2986
527
    ++p_header_data ;
2987
2988
527
    if (! opj_j2k_read_SPCod_SPCoc(p_j2k, l_comp_no, p_header_data, &p_header_size,
2989
527
                                   p_manager)) {
2990
433
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2991
433
        return OPJ_FALSE;
2992
433
    }
2993
2994
94
    if (p_header_size != 0) {
2995
25
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2996
25
        return OPJ_FALSE;
2997
25
    }
2998
69
    return OPJ_TRUE;
2999
94
}
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
0
{
3006
0
    OPJ_UINT32 l_qcd_size, l_remaining_size;
3007
0
    OPJ_BYTE * l_current_data = 00;
3008
3009
    /* preconditions */
3010
0
    assert(p_j2k != 00);
3011
0
    assert(p_manager != 00);
3012
0
    assert(p_stream != 00);
3013
3014
0
    l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3015
0
                 0);
3016
0
    l_remaining_size = l_qcd_size;
3017
3018
0
    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
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
3033
3034
0
    opj_write_bytes(l_current_data, J2K_MS_QCD, 2);         /* QCD */
3035
0
    l_current_data += 2;
3036
3037
0
    opj_write_bytes(l_current_data, l_qcd_size - 2, 2);     /* L_QCD */
3038
0
    l_current_data += 2;
3039
3040
0
    l_remaining_size -= 4;
3041
3042
0
    if (! opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, 0,
3043
0
                                  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
0
    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
0
    if (opj_stream_write_data(p_stream,
3054
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size,
3055
0
                              p_manager) != l_qcd_size) {
3056
0
        return OPJ_FALSE;
3057
0
    }
3058
3059
0
    return OPJ_TRUE;
3060
0
}
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
228k
{
3075
    /* preconditions */
3076
228k
    assert(p_header_data != 00);
3077
228k
    assert(p_j2k != 00);
3078
228k
    assert(p_manager != 00);
3079
3080
228k
    if (! opj_j2k_read_SQcd_SQcc(p_j2k, 0, p_header_data, &p_header_size,
3081
228k
                                 p_manager)) {
3082
286
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3083
286
        return OPJ_FALSE;
3084
286
    }
3085
3086
227k
    if (p_header_size != 0) {
3087
947
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3088
947
        return OPJ_FALSE;
3089
947
    }
3090
3091
    /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
3092
226k
    opj_j2k_copy_tile_quantization_parameters(p_j2k);
3093
3094
226k
    return OPJ_TRUE;
3095
227k
}
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
0
{
3145
0
    return opj_j2k_compare_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number,
3146
0
                                     p_first_comp_no, p_second_comp_no);
3147
0
}
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
0
{
3201
0
    return opj_j2k_get_max_coc_size(p_j2k);
3202
0
}
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
865
{
3217
865
    OPJ_UINT32 l_num_comp, l_comp_no;
3218
3219
    /* preconditions */
3220
865
    assert(p_header_data != 00);
3221
865
    assert(p_j2k != 00);
3222
865
    assert(p_manager != 00);
3223
3224
865
    l_num_comp = p_j2k->m_private_image->numcomps;
3225
3226
865
    if (l_num_comp <= 256) {
3227
865
        if (p_header_size < 1) {
3228
80
            opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3229
80
            return OPJ_FALSE;
3230
80
        }
3231
785
        opj_read_bytes(p_header_data, &l_comp_no, 1);
3232
785
        ++p_header_data;
3233
785
        --p_header_size;
3234
785
    } else {
3235
0
        if (p_header_size < 2) {
3236
0
            opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3237
0
            return OPJ_FALSE;
3238
0
        }
3239
0
        opj_read_bytes(p_header_data, &l_comp_no, 2);
3240
0
        p_header_data += 2;
3241
0
        p_header_size -= 2;
3242
0
    }
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
785
    if (l_comp_no >= p_j2k->m_private_image->numcomps) {
3271
148
        opj_event_msg(p_manager, EVT_ERROR,
3272
148
                      "Invalid component number: %d, regarding the number of components %d\n",
3273
148
                      l_comp_no, p_j2k->m_private_image->numcomps);
3274
148
        return OPJ_FALSE;
3275
148
    }
3276
3277
637
    if (! opj_j2k_read_SQcd_SQcc(p_j2k, l_comp_no, p_header_data, &p_header_size,
3278
637
                                 p_manager)) {
3279
15
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3280
15
        return OPJ_FALSE;
3281
15
    }
3282
3283
622
    if (p_header_size != 0) {
3284
103
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3285
103
        return OPJ_FALSE;
3286
103
    }
3287
3288
519
    return OPJ_TRUE;
3289
622
}
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
0
{
3435
0
    opj_tcp_t * l_tcp = 00;
3436
0
    OPJ_UINT32 l_nb_tiles = 0;
3437
0
    OPJ_UINT32 l_max_poc = 0;
3438
0
    OPJ_UINT32 i;
3439
3440
0
    l_tcp = p_j2k->m_cp.tcps;
3441
0
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
3442
3443
0
    for (i = 0; i < l_nb_tiles; ++i) {
3444
0
        l_max_poc = opj_uint_max(l_max_poc, l_tcp->numpocs);
3445
0
        ++l_tcp;
3446
0
    }
3447
3448
0
    ++l_max_poc;
3449
3450
0
    return 4 + 9 * l_max_poc;
3451
0
}
3452
3453
static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k)
3454
0
{
3455
0
    OPJ_UINT32 i;
3456
0
    OPJ_UINT32 l_nb_tiles;
3457
0
    OPJ_UINT32 l_max = 0;
3458
0
    opj_tcp_t * l_tcp = 00;
3459
3460
0
    l_tcp = p_j2k->m_cp.tcps;
3461
0
    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
3462
3463
0
    for (i = 0; i < l_nb_tiles; ++i) {
3464
0
        l_max = opj_uint_max(l_max, l_tcp->m_nb_tile_parts);
3465
3466
0
        ++l_tcp;
3467
0
    }
3468
3469
0
    return 12 * l_max;
3470
0
}
3471
3472
static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
3473
0
{
3474
0
    OPJ_UINT32 l_nb_bytes = 0;
3475
0
    OPJ_UINT32 l_nb_comps;
3476
0
    OPJ_UINT32 l_coc_bytes, l_qcc_bytes;
3477
3478
0
    l_nb_comps = p_j2k->m_private_image->numcomps - 1;
3479
0
    l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
3480
3481
0
    if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) {
3482
0
        l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
3483
0
        l_nb_bytes += l_nb_comps * l_coc_bytes;
3484
3485
0
        l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
3486
0
        l_nb_bytes += l_nb_comps * l_qcc_bytes;
3487
0
    }
3488
3489
0
    l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
3490
3491
0
    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
0
    return l_nb_bytes;
3516
0
}
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.86k
{
3532
3.86k
    OPJ_UINT32 i, l_nb_comp, l_tmp;
3533
3.86k
    opj_image_t * l_image = 00;
3534
3.86k
    OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
3535
3.86k
    OPJ_UINT32 l_chunk_size, l_comp_room;
3536
3537
3.86k
    opj_cp_t *l_cp = 00;
3538
3.86k
    opj_tcp_t *l_tcp = 00;
3539
3.86k
    opj_poc_t *l_current_poc = 00;
3540
3541
    /* preconditions */
3542
3.86k
    assert(p_header_data != 00);
3543
3.86k
    assert(p_j2k != 00);
3544
3.86k
    assert(p_manager != 00);
3545
3546
3.86k
    l_image = p_j2k->m_private_image;
3547
3.86k
    l_nb_comp = l_image->numcomps;
3548
3.86k
    if (l_nb_comp <= 256) {
3549
3.86k
        l_comp_room = 1;
3550
3.86k
    } else {
3551
0
        l_comp_room = 2;
3552
0
    }
3553
3.86k
    l_chunk_size = 5 + 2 * l_comp_room;
3554
3.86k
    l_current_poc_nb = p_header_size / l_chunk_size;
3555
3.86k
    l_current_poc_remaining = p_header_size % l_chunk_size;
3556
3557
3.86k
    if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
3558
532
        opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
3559
532
        return OPJ_FALSE;
3560
532
    }
3561
3562
3.32k
    l_cp = &(p_j2k->m_cp);
3563
3.32k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
3564
13
            &l_cp->tcps[p_j2k->m_current_tile_number] :
3565
3.32k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
3566
3.32k
    l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
3567
3.32k
    l_current_poc_nb += l_old_poc_nb;
3568
3569
3.32k
    if (l_current_poc_nb >= J2K_MAX_POCS) {
3570
149
        opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
3571
149
        return OPJ_FALSE;
3572
149
    }
3573
3574
    /* now poc is in use.*/
3575
3.18k
    l_tcp->POC = 1;
3576
3577
3.18k
    l_current_poc = &l_tcp->pocs[l_old_poc_nb];
3578
35.3k
    for (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
3579
32.1k
        opj_read_bytes(p_header_data, &(l_current_poc->resno0),
3580
32.1k
                       1);                               /* RSpoc_i */
3581
32.1k
        ++p_header_data;
3582
32.1k
        opj_read_bytes(p_header_data, &(l_current_poc->compno0),
3583
32.1k
                       l_comp_room);  /* CSpoc_i */
3584
32.1k
        p_header_data += l_comp_room;
3585
32.1k
        opj_read_bytes(p_header_data, &(l_current_poc->layno1),
3586
32.1k
                       2);                               /* LYEpoc_i */
3587
        /* make sure layer end is in acceptable bounds */
3588
32.1k
        l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
3589
32.1k
        p_header_data += 2;
3590
32.1k
        opj_read_bytes(p_header_data, &(l_current_poc->resno1),
3591
32.1k
                       1);                               /* REpoc_i */
3592
32.1k
        ++p_header_data;
3593
32.1k
        opj_read_bytes(p_header_data, &(l_current_poc->compno1),
3594
32.1k
                       l_comp_room);  /* CEpoc_i */
3595
32.1k
        p_header_data += l_comp_room;
3596
32.1k
        opj_read_bytes(p_header_data, &l_tmp,
3597
32.1k
                       1);                                                                 /* Ppoc_i */
3598
32.1k
        ++p_header_data;
3599
32.1k
        l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
3600
        /* make sure comp is in acceptable bounds */
3601
32.1k
        l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
3602
32.1k
        ++l_current_poc;
3603
32.1k
    }
3604
3605
3.18k
    l_tcp->numpocs = l_current_poc_nb - 1;
3606
3.18k
    return OPJ_TRUE;
3607
3.32k
}
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
531
{
3623
531
    OPJ_UINT32 l_nb_comp;
3624
    /* preconditions */
3625
531
    assert(p_header_data != 00);
3626
531
    assert(p_j2k != 00);
3627
531
    assert(p_manager != 00);
3628
3629
531
    OPJ_UNUSED(p_header_data);
3630
3631
531
    l_nb_comp = p_j2k->m_private_image->numcomps;
3632
3633
531
    if (p_header_size != l_nb_comp * 4) {
3634
422
        opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
3635
422
        return OPJ_FALSE;
3636
422
    }
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
109
    return OPJ_TRUE;
3649
531
}
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
3.08k
{
3665
3.08k
    OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP,
3666
3.08k
               l_Ptlm_size, l_entry_size, l_num_tileparts;
3667
3.08k
    OPJ_UINT32 i;
3668
3.08k
    opj_j2k_tlm_tile_part_info_t* l_tile_part_infos;
3669
3.08k
    opj_j2k_tlm_info_t* l_tlm;
3670
3671
    /* preconditions */
3672
3.08k
    assert(p_header_data != 00);
3673
3.08k
    assert(p_j2k != 00);
3674
3.08k
    assert(p_manager != 00);
3675
3676
3.08k
    l_tlm = &(p_j2k->m_specific_param.m_decoder.m_tlm);
3677
3678
3.08k
    if (p_header_size < 2) {
3679
193
        opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker.\n");
3680
193
        return OPJ_FALSE;
3681
193
    }
3682
2.89k
    p_header_size -= 2;
3683
3684
2.89k
    if (l_tlm->m_is_invalid) {
3685
121
        return OPJ_TRUE;
3686
121
    }
3687
3688
2.77k
    opj_read_bytes(p_header_data, &l_Ztlm,
3689
2.77k
                   1);                              /* Ztlm */
3690
2.77k
    ++p_header_data;
3691
2.77k
    opj_read_bytes(p_header_data, &l_Stlm,
3692
2.77k
                   1);                              /* Stlm */
3693
2.77k
    ++p_header_data;
3694
3695
2.77k
    l_ST = ((l_Stlm >> 4) & 0x3);
3696
2.77k
    if (l_ST == 3) {
3697
284
        l_tlm->m_is_invalid = OPJ_TRUE;
3698
284
        opj_event_msg(p_manager, EVT_WARNING,
3699
284
                      "opj_j2k_read_tlm(): ST = 3 is invalid.\n");
3700
284
        return OPJ_TRUE;
3701
284
    }
3702
2.48k
    l_SP = (l_Stlm >> 6) & 0x1;
3703
3704
2.48k
    l_Ptlm_size = (l_SP + 1) * 2;
3705
2.48k
    l_entry_size = l_Ptlm_size + l_ST;
3706
3707
2.48k
    if ((p_header_size % l_entry_size) != 0) {
3708
178
        l_tlm->m_is_invalid = OPJ_TRUE;
3709
178
        opj_event_msg(p_manager, EVT_WARNING,
3710
178
                      "opj_j2k_read_tlm(): TLM marker not of expected size.\n");
3711
178
        return OPJ_TRUE;
3712
178
    }
3713
3714
2.31k
    l_num_tileparts = p_header_size / l_entry_size;
3715
2.31k
    if (l_num_tileparts == 0) {
3716
        /* not totally sure if this is valid... */
3717
39
        return OPJ_TRUE;
3718
39
    }
3719
3720
    /* Highly unlikely, unless there are gazillions of TLM markers */
3721
2.27k
    if (l_tlm->m_entries_count > UINT32_MAX - l_num_tileparts ||
3722
2.27k
            l_tlm->m_entries_count + l_num_tileparts > UINT32_MAX / sizeof(
3723
2.27k
                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
2.27k
    l_tile_part_infos = (opj_j2k_tlm_tile_part_info_t*)opj_realloc(
3731
2.27k
                            l_tlm->m_tile_part_infos,
3732
2.27k
                            (l_tlm->m_entries_count + l_num_tileparts) * sizeof(
3733
2.27k
                                opj_j2k_tlm_tile_part_info_t));
3734
2.27k
    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
2.27k
    l_tlm->m_tile_part_infos = l_tile_part_infos;
3742
3743
10.0k
    for (i = 0; i < l_num_tileparts; ++ i) {
3744
8.96k
        OPJ_UINT32 l_tile_index;
3745
8.96k
        OPJ_UINT32 l_length;
3746
3747
        /* Read Ttlm_i */
3748
8.96k
        if (l_ST == 0) {
3749
8.33k
            l_tile_index = l_tlm->m_entries_count;
3750
8.33k
        } else {
3751
633
            opj_read_bytes(p_header_data, &l_tile_index, l_ST);
3752
633
            p_header_data += l_ST;
3753
633
        }
3754
3755
8.96k
        if (l_tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) {
3756
1.16k
            l_tlm->m_is_invalid = OPJ_TRUE;
3757
1.16k
            opj_event_msg(p_manager, EVT_WARNING,
3758
1.16k
                          "opj_j2k_read_tlm(): invalid tile number %d\n",
3759
1.16k
                          l_tile_index);
3760
1.16k
            return OPJ_TRUE;
3761
1.16k
        }
3762
3763
        /* Read Ptlm_i */
3764
7.80k
        opj_read_bytes(p_header_data, &l_length, l_Ptlm_size);
3765
7.80k
        p_header_data += l_Ptlm_size;
3766
3767
7.80k
        l_tile_part_infos[l_tlm->m_entries_count].m_tile_index =
3768
7.80k
            (OPJ_UINT16)l_tile_index;
3769
7.80k
        l_tile_part_infos[l_tlm->m_entries_count].m_length = l_length;
3770
7.80k
        ++l_tlm->m_entries_count;
3771
7.80k
    }
3772
3773
1.10k
    return OPJ_TRUE;
3774
2.27k
}
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
146
{
3790
    /* preconditions */
3791
146
    assert(p_header_data != 00);
3792
146
    assert(p_j2k != 00);
3793
146
    assert(p_manager != 00);
3794
3795
146
    OPJ_UNUSED(p_j2k);
3796
146
    OPJ_UNUSED(p_header_data);
3797
3798
146
    if (p_header_size < 1) {
3799
6
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3800
6
        return OPJ_FALSE;
3801
6
    }
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
140
    return OPJ_TRUE;
3847
146
}
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
9.60k
{
3863
9.60k
    OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
3864
3865
    /* preconditions */
3866
9.60k
    assert(p_header_data != 00);
3867
9.60k
    assert(p_j2k != 00);
3868
9.60k
    assert(p_manager != 00);
3869
3870
9.60k
    OPJ_UNUSED(p_j2k);
3871
3872
9.60k
    if (p_header_size < 1) {
3873
26
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3874
26
        return OPJ_FALSE;
3875
26
    }
3876
3877
9.58k
    opj_read_bytes(p_header_data, &l_Zplt, 1);              /* Zplt */
3878
9.58k
    ++p_header_data;
3879
9.58k
    --p_header_size;
3880
3881
462k
    for (i = 0; i < p_header_size; ++i) {
3882
452k
        opj_read_bytes(p_header_data, &l_tmp, 1);       /* Iplt_ij */
3883
452k
        ++p_header_data;
3884
        /* take only the last seven bytes */
3885
452k
        l_packet_len |= (l_tmp & 0x7f);
3886
452k
        if (l_tmp & 0x80) {
3887
263k
            l_packet_len <<= 7;
3888
263k
        } else {
3889
            /* store packet length and proceed to next packet */
3890
189k
            l_packet_len = 0;
3891
189k
        }
3892
452k
    }
3893
3894
9.58k
    if (l_packet_len != 0) {
3895
133
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3896
133
        return OPJ_FALSE;
3897
133
    }
3898
3899
9.45k
    return OPJ_TRUE;
3900
9.58k
}
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
5.24k
{
3917
5.24k
    opj_cp_t *l_cp = 00;
3918
5.24k
    OPJ_UINT32 l_Z_ppm;
3919
3920
    /* preconditions */
3921
5.24k
    assert(p_header_data != 00);
3922
5.24k
    assert(p_j2k != 00);
3923
5.24k
    assert(p_manager != 00);
3924
3925
    /* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */
3926
5.24k
    if (p_header_size < 2) {
3927
287
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3928
287
        return OPJ_FALSE;
3929
287
    }
3930
3931
4.95k
    l_cp = &(p_j2k->m_cp);
3932
4.95k
    l_cp->ppm = 1;
3933
3934
4.95k
    opj_read_bytes(p_header_data, &l_Z_ppm, 1);             /* Z_ppm */
3935
4.95k
    ++p_header_data;
3936
4.95k
    --p_header_size;
3937
3938
    /* check allocation needed */
3939
4.95k
    if (l_cp->ppm_markers == NULL) { /* first PPM marker */
3940
2.42k
        OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3941
2.42k
        assert(l_cp->ppm_markers_count == 0U);
3942
3943
2.42k
        l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
3944
2.42k
        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
2.42k
        l_cp->ppm_markers_count = l_newCount;
3949
2.53k
    } else if (l_cp->ppm_markers_count <= l_Z_ppm) {
3950
1.99k
        OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3951
1.99k
        opj_ppx *new_ppm_markers;
3952
1.99k
        new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers,
3953
1.99k
                          l_newCount * sizeof(opj_ppx));
3954
1.99k
        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
1.99k
        l_cp->ppm_markers = new_ppm_markers;
3960
1.99k
        memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0,
3961
1.99k
               (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx));
3962
1.99k
        l_cp->ppm_markers_count = l_newCount;
3963
1.99k
    }
3964
3965
4.95k
    if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) {
3966
        /* clean up to be done on l_cp destruction */
3967
325
        opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm);
3968
325
        return OPJ_FALSE;
3969
325
    }
3970
3971
4.62k
    l_cp->ppm_markers[l_Z_ppm].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
3972
4.62k
    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
4.62k
    l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size;
3978
4.62k
    memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size);
3979
3980
4.62k
    return OPJ_TRUE;
3981
4.62k
}
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
192k
{
3991
192k
    OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining;
3992
3993
    /* preconditions */
3994
192k
    assert(p_cp != 00);
3995
192k
    assert(p_manager != 00);
3996
192k
    assert(p_cp->ppm_buffer == NULL);
3997
3998
192k
    if (p_cp->ppm == 0U) {
3999
190k
        return OPJ_TRUE;
4000
190k
    }
4001
4002
1.72k
    l_ppm_data_size = 0U;
4003
1.72k
    l_N_ppm_remaining = 0U;
4004
80.0k
    for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
4005
78.4k
        if (p_cp->ppm_markers[i].m_data !=
4006
78.4k
                NULL) { /* standard doesn't seem to require contiguous Zppm */
4007
3.14k
            OPJ_UINT32 l_N_ppm;
4008
3.14k
            OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
4009
3.14k
            const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
4010
4011
3.14k
            if (l_N_ppm_remaining >= l_data_size) {
4012
1.41k
                l_N_ppm_remaining -= l_data_size;
4013
1.41k
                l_data_size = 0U;
4014
1.72k
            } else {
4015
1.72k
                l_data += l_N_ppm_remaining;
4016
1.72k
                l_data_size -= l_N_ppm_remaining;
4017
1.72k
                l_N_ppm_remaining = 0U;
4018
1.72k
            }
4019
4020
3.14k
            if (l_data_size > 0U) {
4021
1.92k
                do {
4022
                    /* read Nppm */
4023
1.92k
                    if (l_data_size < 4U) {
4024
                        /* clean up to be done on l_cp destruction */
4025
134
                        opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
4026
134
                        return OPJ_FALSE;
4027
134
                    }
4028
1.79k
                    opj_read_bytes(l_data, &l_N_ppm, 4);
4029
1.79k
                    l_data += 4;
4030
1.79k
                    l_data_size -= 4;
4031
4032
1.79k
                    if (l_ppm_data_size > UINT_MAX - l_N_ppm) {
4033
12
                        opj_event_msg(p_manager, EVT_ERROR, "Too large value for Nppm\n");
4034
12
                        return OPJ_FALSE;
4035
12
                    }
4036
1.78k
                    l_ppm_data_size += l_N_ppm;
4037
1.78k
                    if (l_data_size >= l_N_ppm) {
4038
257
                        l_data_size -= l_N_ppm;
4039
257
                        l_data += l_N_ppm;
4040
1.52k
                    } else {
4041
1.52k
                        l_N_ppm_remaining = l_N_ppm - l_data_size;
4042
1.52k
                        l_data_size = 0U;
4043
1.52k
                    }
4044
1.78k
                } while (l_data_size > 0U);
4045
1.72k
            }
4046
3.14k
        }
4047
78.4k
    }
4048
4049
1.57k
    if (l_N_ppm_remaining != 0U) {
4050
        /* clean up to be done on l_cp destruction */
4051
283
        opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n");
4052
283
        return OPJ_FALSE;
4053
283
    }
4054
4055
1.29k
    p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size);
4056
1.29k
    if (p_cp->ppm_buffer == 00) {
4057
6
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
4058
6
        return OPJ_FALSE;
4059
6
    }
4060
1.28k
    p_cp->ppm_len = l_ppm_data_size;
4061
1.28k
    l_ppm_data_size = 0U;
4062
1.28k
    l_N_ppm_remaining = 0U;
4063
63.9k
    for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
4064
62.6k
        if (p_cp->ppm_markers[i].m_data !=
4065
62.6k
                NULL) { /* standard doesn't seem to require contiguous Zppm */
4066
2.52k
            OPJ_UINT32 l_N_ppm;
4067
2.52k
            OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
4068
2.52k
            const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
4069
4070
2.52k
            if (l_N_ppm_remaining >= l_data_size) {
4071
1.24k
                memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
4072
1.24k
                l_ppm_data_size += l_data_size;
4073
1.24k
                l_N_ppm_remaining -= l_data_size;
4074
1.24k
                l_data_size = 0U;
4075
1.28k
            } else {
4076
1.28k
                memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining);
4077
1.28k
                l_ppm_data_size += l_N_ppm_remaining;
4078
1.28k
                l_data += l_N_ppm_remaining;
4079
1.28k
                l_data_size -= l_N_ppm_remaining;
4080
1.28k
                l_N_ppm_remaining = 0U;
4081
1.28k
            }
4082
4083
2.52k
            if (l_data_size > 0U) {
4084
1.29k
                do {
4085
                    /* read Nppm */
4086
1.29k
                    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
1.29k
                    opj_read_bytes(l_data, &l_N_ppm, 4);
4092
1.29k
                    l_data += 4;
4093
1.29k
                    l_data_size -= 4;
4094
4095
1.29k
                    if (l_data_size >= l_N_ppm) {
4096
58
                        memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm);
4097
58
                        l_ppm_data_size += l_N_ppm;
4098
58
                        l_data_size -= l_N_ppm;
4099
58
                        l_data += l_N_ppm;
4100
1.24k
                    } else {
4101
1.24k
                        memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
4102
1.24k
                        l_ppm_data_size += l_data_size;
4103
1.24k
                        l_N_ppm_remaining = l_N_ppm - l_data_size;
4104
1.24k
                        l_data_size = 0U;
4105
1.24k
                    }
4106
1.29k
                } while (l_data_size > 0U);
4107
1.28k
            }
4108
2.52k
            opj_free(p_cp->ppm_markers[i].m_data);
4109
2.52k
            p_cp->ppm_markers[i].m_data = NULL;
4110
2.52k
            p_cp->ppm_markers[i].m_data_size = 0U;
4111
2.52k
        }
4112
62.6k
    }
4113
4114
1.28k
    p_cp->ppm_data = p_cp->ppm_buffer;
4115
1.28k
    p_cp->ppm_data_size = p_cp->ppm_len;
4116
4117
1.28k
    p_cp->ppm_markers_count = 0U;
4118
1.28k
    opj_free(p_cp->ppm_markers);
4119
1.28k
    p_cp->ppm_markers = NULL;
4120
4121
1.28k
    return OPJ_TRUE;
4122
1.28k
}
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
232
{
4138
232
    opj_cp_t *l_cp = 00;
4139
232
    opj_tcp_t *l_tcp = 00;
4140
232
    OPJ_UINT32 l_Z_ppt;
4141
4142
    /* preconditions */
4143
232
    assert(p_header_data != 00);
4144
232
    assert(p_j2k != 00);
4145
232
    assert(p_manager != 00);
4146
4147
    /* We need to have the Z_ppt element + 1 byte of Ippt at minimum */
4148
232
    if (p_header_size < 2) {
4149
10
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
4150
10
        return OPJ_FALSE;
4151
10
    }
4152
4153
222
    l_cp = &(p_j2k->m_cp);
4154
222
    if (l_cp->ppm) {
4155
0
        opj_event_msg(p_manager, EVT_ERROR,
4156
0
                      "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
4157
0
        return OPJ_FALSE;
4158
0
    }
4159
4160
222
    l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
4161
222
    l_tcp->ppt = 1;
4162
4163
222
    opj_read_bytes(p_header_data, &l_Z_ppt, 1);             /* Z_ppt */
4164
222
    ++p_header_data;
4165
222
    --p_header_size;
4166
4167
    /* check allocation needed */
4168
222
    if (l_tcp->ppt_markers == NULL) { /* first PPT marker */
4169
215
        OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4170
215
        assert(l_tcp->ppt_markers_count == 0U);
4171
4172
215
        l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
4173
215
        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
215
        l_tcp->ppt_markers_count = l_newCount;
4178
215
    } else if (l_tcp->ppt_markers_count <= l_Z_ppt) {
4179
4
        OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4180
4
        opj_ppx *new_ppt_markers;
4181
4
        new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers,
4182
4
                          l_newCount * sizeof(opj_ppx));
4183
4
        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
4
        l_tcp->ppt_markers = new_ppt_markers;
4189
4
        memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0,
4190
4
               (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx));
4191
4
        l_tcp->ppt_markers_count = l_newCount;
4192
4
    }
4193
4194
222
    if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) {
4195
        /* clean up to be done on l_tcp destruction */
4196
3
        opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt);
4197
3
        return OPJ_FALSE;
4198
3
    }
4199
4200
219
    l_tcp->ppt_markers[l_Z_ppt].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
4201
219
    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
219
    l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size;
4207
219
    memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size);
4208
219
    return OPJ_TRUE;
4209
219
}
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
181k
{
4219
181k
    OPJ_UINT32 i, l_ppt_data_size;
4220
    /* preconditions */
4221
181k
    assert(p_tcp != 00);
4222
181k
    assert(p_manager != 00);
4223
4224
181k
    if (p_tcp->ppt_buffer != NULL) {
4225
0
        opj_event_msg(p_manager, EVT_ERROR,
4226
0
                      "opj_j2k_merge_ppt() has already been called\n");
4227
0
        return OPJ_FALSE;
4228
0
    }
4229
4230
181k
    if (p_tcp->ppt == 0U) {
4231
181k
        return OPJ_TRUE;
4232
181k
    }
4233
4234
140
    l_ppt_data_size = 0U;
4235
5.34k
    for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4236
5.20k
        l_ppt_data_size +=
4237
5.20k
            p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4238
5.20k
    }
4239
4240
140
    p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size);
4241
140
    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
140
    p_tcp->ppt_len = l_ppt_data_size;
4246
140
    l_ppt_data_size = 0U;
4247
5.34k
    for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4248
5.20k
        if (p_tcp->ppt_markers[i].m_data !=
4249
5.20k
                NULL) { /* standard doesn't seem to require contiguous Zppt */
4250
140
            memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data,
4251
140
                   p_tcp->ppt_markers[i].m_data_size);
4252
140
            l_ppt_data_size +=
4253
140
                p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4254
4255
140
            opj_free(p_tcp->ppt_markers[i].m_data);
4256
140
            p_tcp->ppt_markers[i].m_data = NULL;
4257
140
            p_tcp->ppt_markers[i].m_data_size = 0U;
4258
140
        }
4259
5.20k
    }
4260
4261
140
    p_tcp->ppt_markers_count = 0U;
4262
140
    opj_free(p_tcp->ppt_markers);
4263
140
    p_tcp->ppt_markers = NULL;
4264
4265
140
    p_tcp->ppt_data = p_tcp->ppt_buffer;
4266
140
    p_tcp->ppt_data_size = p_tcp->ppt_len;
4267
140
    return OPJ_TRUE;
4268
140
}
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
0
{
4275
0
    OPJ_BYTE * l_current_data = 00;
4276
0
    OPJ_UINT32 l_tlm_size;
4277
0
    OPJ_UINT32 size_per_tile_part;
4278
4279
    /* preconditions */
4280
0
    assert(p_j2k != 00);
4281
0
    assert(p_manager != 00);
4282
0
    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
0
    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
0
    if (p_j2k->m_specific_param.m_encoder.m_total_tile_parts <= 255) {
4295
0
        size_per_tile_part = 5;
4296
0
        p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte = OPJ_TRUE;
4297
0
    } 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
0
    l_tlm_size = 2 + 4 + (size_per_tile_part *
4303
0
                          p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
4304
4305
0
    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
0
    memset(p_j2k->m_specific_param.m_encoder.m_header_tile_data, 0, l_tlm_size);
4319
4320
0
    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
0
    p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
4325
4326
0
    opj_write_bytes(l_current_data, J2K_MS_TLM,
4327
0
                    2);                                   /* TLM */
4328
0
    l_current_data += 2;
4329
4330
0
    opj_write_bytes(l_current_data, l_tlm_size - 2,
4331
0
                    2);                                 /* Lpoc */
4332
0
    l_current_data += 2;
4333
4334
0
    opj_write_bytes(l_current_data, 0,
4335
0
                    1);                                                    /* Ztlm=0*/
4336
0
    ++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
0
    opj_write_bytes(l_current_data,
4341
0
                    size_per_tile_part == 5 ? 0x50 : 0x60,
4342
0
                    1);
4343
0
    ++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
0
    if (opj_stream_write_data(p_stream,
4347
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size,
4348
0
                              p_manager) != l_tlm_size) {
4349
0
        return OPJ_FALSE;
4350
0
    }
4351
4352
0
    return OPJ_TRUE;
4353
0
}
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
0
{
4363
    /* preconditions */
4364
0
    assert(p_j2k != 00);
4365
0
    assert(p_manager != 00);
4366
0
    assert(p_stream != 00);
4367
4368
0
    OPJ_UNUSED(p_stream);
4369
4370
0
    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
0
    opj_write_bytes(p_data, J2K_MS_SOT,
4377
0
                    2);                                 /* SOT */
4378
0
    p_data += 2;
4379
4380
0
    opj_write_bytes(p_data, 10,
4381
0
                    2);                                                   /* Lsot */
4382
0
    p_data += 2;
4383
4384
0
    opj_write_bytes(p_data, p_j2k->m_current_tile_number,
4385
0
                    2);                        /* Isot */
4386
0
    p_data += 2;
4387
4388
    /* Psot  */
4389
0
    p_data += 4;
4390
4391
0
    opj_write_bytes(p_data,
4392
0
                    p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,
4393
0
                    1);                        /* TPsot */
4394
0
    ++p_data;
4395
4396
0
    opj_write_bytes(p_data,
4397
0
                    p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,
4398
0
                    1);                      /* TNsot */
4399
0
    ++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
0
    * p_data_written = 12;
4411
4412
0
    return OPJ_TRUE;
4413
0
}
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
352k
{
4423
    /* preconditions */
4424
352k
    assert(p_header_data != 00);
4425
352k
    assert(p_manager != 00);
4426
4427
    /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
4428
352k
    if (p_header_size != 8) {
4429
446
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4430
446
        return OPJ_FALSE;
4431
446
    }
4432
4433
352k
    opj_read_bytes(p_header_data, p_tile_no, 2);    /* Isot */
4434
352k
    p_header_data += 2;
4435
352k
    opj_read_bytes(p_header_data, p_tot_len, 4);    /* Psot */
4436
352k
    p_header_data += 4;
4437
352k
    opj_read_bytes(p_header_data, p_current_part, 1); /* TPsot */
4438
352k
    ++p_header_data;
4439
352k
    opj_read_bytes(p_header_data, p_num_parts, 1);  /* TNsot */
4440
352k
    ++p_header_data;
4441
352k
    return OPJ_TRUE;
4442
352k
}
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
349k
{
4449
349k
    opj_cp_t *l_cp = 00;
4450
349k
    opj_tcp_t *l_tcp = 00;
4451
349k
    OPJ_UINT32 l_tot_len, l_num_parts = 0;
4452
349k
    OPJ_UINT32 l_current_part;
4453
349k
    OPJ_UINT32 l_tile_x, l_tile_y;
4454
4455
    /* preconditions */
4456
4457
349k
    assert(p_j2k != 00);
4458
349k
    assert(p_manager != 00);
4459
4460
349k
    if (! opj_j2k_get_sot_values(p_header_data, p_header_size,
4461
349k
                                 &(p_j2k->m_current_tile_number), &l_tot_len, &l_current_part, &l_num_parts,
4462
349k
                                 p_manager)) {
4463
446
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4464
446
        return OPJ_FALSE;
4465
446
    }
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
349k
    l_cp = &(p_j2k->m_cp);
4472
4473
    /* testcase 2.pdf.SIGFPE.706.1112 */
4474
349k
    if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
4475
2.22k
        opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n",
4476
2.22k
                      p_j2k->m_current_tile_number);
4477
2.22k
        return OPJ_FALSE;
4478
2.22k
    }
4479
4480
347k
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
4481
347k
    l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
4482
347k
    l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
4483
4484
347k
    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
347k
            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
347k
        if (l_tcp->m_current_tile_part_number + 1 != (OPJ_INT32)l_current_part) {
4498
793
            opj_event_msg(p_manager, EVT_ERROR,
4499
793
                          "Invalid tile part index for tile number %d. "
4500
793
                          "Got %d, expected %d\n",
4501
793
                          p_j2k->m_current_tile_number,
4502
793
                          l_current_part,
4503
793
                          l_tcp->m_current_tile_part_number + 1);
4504
793
            return OPJ_FALSE;
4505
793
        }
4506
347k
    }
4507
4508
346k
    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
346k
    if ((l_tot_len != 0) && (l_tot_len < 14)) {
4543
703
        if (l_tot_len ==
4544
703
                12) { /* MSD: Special case for the PHR data which are read by kakadu*/
4545
271
            opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n",
4546
271
                          l_tot_len);
4547
432
        } else {
4548
432
            opj_event_msg(p_manager, EVT_ERROR,
4549
432
                          "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
4550
432
            return OPJ_FALSE;
4551
432
        }
4552
703
    }
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
346k
    if (!l_tot_len) {
4579
168k
        opj_event_msg(p_manager, EVT_INFO,
4580
168k
                      "Psot value of the current tile-part is equal to zero, "
4581
168k
                      "we assuming it is the last tile-part of the codestream.\n");
4582
168k
        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4583
168k
    }
4584
4585
346k
    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
77
        opj_event_msg(p_manager, EVT_ERROR,
4588
77
                      "In SOT marker, TPSot (%d) is not valid regards to the previous "
4589
77
                      "number of tile-part (%d), giving up\n", l_current_part,
4590
77
                      l_tcp->m_nb_tile_parts);
4591
77
        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4592
77
        return OPJ_FALSE;
4593
77
    }
4594
4595
345k
    if (l_num_parts !=
4596
345k
            0) { /* Number of tile-part header is provided by this tile-part header */
4597
344k
        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
344k
        if (l_tcp->m_nb_tile_parts) {
4601
22.9k
            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
22.9k
        }
4610
344k
        if (l_current_part >= l_num_parts) {
4611
            /* testcase 451.pdf.SIGSEGV.ce9.3723 */
4612
33
            opj_event_msg(p_manager, EVT_ERROR,
4613
33
                          "In SOT marker, TPSot (%d) is not valid regards to the current "
4614
33
                          "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts);
4615
33
            p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4616
33
            return OPJ_FALSE;
4617
33
        }
4618
344k
        l_tcp->m_nb_tile_parts = l_num_parts;
4619
344k
    }
4620
4621
    /* If know the number of tile part header we will check if we didn't read the last*/
4622
345k
    if (l_tcp->m_nb_tile_parts) {
4623
344k
        if (l_tcp->m_nb_tile_parts == (l_current_part + 1)) {
4624
32.0k
            p_j2k->m_specific_param.m_decoder.m_can_decode =
4625
32.0k
                1; /* Process the last tile-part header*/
4626
32.0k
        }
4627
344k
    }
4628
4629
345k
    if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4630
        /* Keep the size of data to skip after this marker */
4631
177k
        p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len -
4632
177k
                12; /* SOT_marker_size = 12 */
4633
177k
    } else {
4634
        /* FIXME: need to be computed from the number of bytes remaining in the codestream */
4635
168k
        p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
4636
168k
    }
4637
4638
345k
    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
345k
    if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
4642
345k
        p_j2k->m_specific_param.m_decoder.m_skip_data =
4643
345k
            (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
4644
345k
            || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
4645
345k
            || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
4646
345k
            || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
4647
345k
    } 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
345k
    {
4656
345k
        assert(p_j2k->cstr_index->tile_index != 00);
4657
345k
        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno =
4658
345k
            p_j2k->m_current_tile_number;
4659
345k
        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno =
4660
345k
            l_current_part;
4661
4662
345k
        if (!p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid &&
4663
702
                l_num_parts >
4664
702
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps) {
4665
219
            opj_event_msg(p_manager, EVT_WARNING,
4666
219
                          "SOT marker for tile %u declares more tile-parts than found in TLM marker.",
4667
219
                          p_j2k->m_current_tile_number);
4668
219
            p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid = OPJ_TRUE;
4669
219
        }
4670
4671
345k
        if (!p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid) {
4672
            /* do nothing */
4673
345k
        } else if (l_num_parts != 0) {
4674
4675
344k
            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps =
4676
344k
                l_num_parts;
4677
344k
            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
4678
344k
                l_num_parts;
4679
4680
344k
            if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4681
321k
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4682
321k
                    (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
4683
321k
                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
321k
            } else {
4689
23.1k
                opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
4690
23.1k
                                                   p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4691
23.1k
                                                   l_num_parts * sizeof(opj_tp_index_t));
4692
23.1k
                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
23.1k
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4700
23.1k
                    new_tp_index;
4701
23.1k
            }
4702
344k
        } else {
4703
967
            /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
4704
4705
967
                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4706
934
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
4707
934
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4708
934
                        (opj_tp_index_t*)opj_calloc(
4709
934
                            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
4710
934
                            sizeof(opj_tp_index_t));
4711
934
                    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
934
                }
4718
4719
967
                if (l_current_part >=
4720
967
                        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
967
            }
4740
4741
967
        }
4742
4743
345k
    }
4744
4745
345k
    return OPJ_TRUE;
4746
345k
}
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
0
{
4844
0
    opj_codestream_info_t *l_cstr_info = 00;
4845
0
    OPJ_UINT32 l_remaining_data;
4846
0
    opj_tcd_marker_info_t* marker_info = NULL;
4847
4848
    /* preconditions */
4849
0
    assert(p_j2k != 00);
4850
0
    assert(p_manager != 00);
4851
0
    assert(p_stream != 00);
4852
4853
0
    OPJ_UNUSED(p_stream);
4854
4855
0
    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
0
    opj_write_bytes(p_data, J2K_MS_SOD,
4862
0
                    2);                                 /* SOD */
4863
4864
    /* make room for the EOF marker */
4865
0
    l_remaining_data =  total_data_size - 4;
4866
4867
    /* update tile coder */
4868
0
    p_tile_coder->tp_num =
4869
0
        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
4870
0
    p_tile_coder->cur_tp_num =
4871
0
        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
0
    if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
4902
0
        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
0
    }
4909
4910
0
    *p_data_written = 0;
4911
4912
0
    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
0
    if (l_remaining_data <
4923
0
            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
0
    l_remaining_data -= p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT;
4930
4931
0
    if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number,
4932
0
                              p_data + 2,
4933
0
                              p_data_written, l_remaining_data, l_cstr_info,
4934
0
                              marker_info,
4935
0
                              p_manager)) {
4936
0
        opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
4937
0
        opj_tcd_marker_info_destroy(marker_info);
4938
0
        return OPJ_FALSE;
4939
0
    }
4940
4941
    /* For SOD */
4942
0
    *p_data_written += 2;
4943
4944
0
    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
0
    opj_tcd_marker_info_destroy(marker_info);
4974
4975
0
    return OPJ_TRUE;
4976
0
}
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
341k
{
4983
341k
    OPJ_SIZE_T l_current_read_size;
4984
341k
    opj_codestream_index_t * l_cstr_index = 00;
4985
341k
    OPJ_BYTE ** l_current_data = 00;
4986
341k
    opj_tcp_t * l_tcp = 00;
4987
341k
    OPJ_UINT32 * l_tile_len = 00;
4988
341k
    OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
4989
4990
    /* preconditions */
4991
341k
    assert(p_j2k != 00);
4992
341k
    assert(p_manager != 00);
4993
341k
    assert(p_stream != 00);
4994
4995
341k
    l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4996
4997
341k
    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
166k
        p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(
5003
166k
                    opj_stream_get_number_byte_left(p_stream) - 2);
5004
174k
    } else {
5005
        /* Check to avoid pass the limit of OPJ_UINT32 */
5006
174k
        if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2) {
5007
174k
            p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
5008
174k
        } else {
5009
            /* MSD: case commented to support empty SOT marker (PHR data) */
5010
256
        }
5011
174k
    }
5012
5013
341k
    l_current_data = &(l_tcp->m_data);
5014
341k
    l_tile_len = &l_tcp->m_data_size;
5015
5016
    /* Patch to support new PHR data */
5017
341k
    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
341k
        if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length >
5021
341k
                opj_stream_get_number_byte_left(p_stream)) {
5022
1.01k
            if (p_j2k->m_cp.strict) {
5023
1.01k
                opj_event_msg(p_manager, EVT_ERROR,
5024
1.01k
                              "Tile part length size inconsistent with stream length\n");
5025
1.01k
                return OPJ_FALSE;
5026
1.01k
            } else {
5027
0
                opj_event_msg(p_manager, EVT_WARNING,
5028
0
                              "Tile part length size inconsistent with stream length\n");
5029
0
            }
5030
1.01k
        }
5031
339k
        if (p_j2k->m_specific_param.m_decoder.m_sot_length >
5032
339k
                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
339k
        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
316k
            *l_current_data = (OPJ_BYTE*) opj_malloc(
5046
316k
                                  p_j2k->m_specific_param.m_decoder.m_sot_length + OPJ_COMMON_CBLK_DATA_EXTRA);
5047
316k
        } else {
5048
23.0k
            OPJ_BYTE *l_new_current_data;
5049
23.0k
            if (*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA -
5050
23.0k
                    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
23.0k
            l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data,
5058
23.0k
                                 *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length +
5059
23.0k
                                 OPJ_COMMON_CBLK_DATA_EXTRA);
5060
23.0k
            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
23.0k
            *l_current_data = l_new_current_data;
5068
23.0k
        }
5069
5070
339k
        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
339k
    } else {
5075
282
        l_sot_length_pb_detected = OPJ_TRUE;
5076
282
    }
5077
5078
    /* Index */
5079
340k
    l_cstr_index = p_j2k->cstr_index;
5080
340k
    {
5081
340k
        OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
5082
5083
340k
        OPJ_UINT32 l_current_tile_part =
5084
340k
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
5085
340k
        if (l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index &&
5086
340k
                l_current_tile_part <
5087
340k
                l_cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps) {
5088
339k
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header
5089
339k
                = l_current_pos;
5090
339k
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos
5091
339k
                = l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
5092
339k
        }
5093
5094
340k
        if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
5095
340k
                                              l_cstr_index,
5096
340k
                                              J2K_MS_SOD,
5097
340k
                                              l_current_pos,
5098
340k
                                              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
340k
    }
5105
5106
    /* Patch to support new PHR data */
5107
340k
    if (!l_sot_length_pb_detected) {
5108
339k
        l_current_read_size = opj_stream_read_data(
5109
339k
                                  p_stream,
5110
339k
                                  *l_current_data + *l_tile_len,
5111
339k
                                  p_j2k->m_specific_param.m_decoder.m_sot_length,
5112
339k
                                  p_manager);
5113
339k
    } else {
5114
282
        l_current_read_size = 0;
5115
282
    }
5116
5117
340k
    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
340k
    } else {
5125
340k
        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
5126
340k
    }
5127
5128
340k
    *l_tile_len += (OPJ_UINT32)l_current_read_size;
5129
5130
340k
    return OPJ_TRUE;
5131
340k
}
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
0
{
5201
    /* preconditions */
5202
0
    assert(p_j2k != 00);
5203
0
    assert(p_manager != 00);
5204
0
    assert(p_stream != 00);
5205
5206
0
    opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,
5207
0
                    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
0
    if (opj_stream_write_data(p_stream,
5218
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, 2, p_manager) != 2) {
5219
0
        return OPJ_FALSE;
5220
0
    }
5221
5222
0
    if (! opj_stream_flush(p_stream, p_manager)) {
5223
0
        return OPJ_FALSE;
5224
0
    }
5225
5226
0
    return OPJ_TRUE;
5227
0
}
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
570
{
5243
570
    OPJ_UINT32 l_nb_comp;
5244
570
    opj_image_t * l_image = 00;
5245
5246
570
    opj_cp_t *l_cp = 00;
5247
570
    opj_tcp_t *l_tcp = 00;
5248
570
    OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
5249
5250
    /* preconditions*/
5251
570
    assert(p_header_data != 00);
5252
570
    assert(p_j2k != 00);
5253
570
    assert(p_manager != 00);
5254
5255
570
    l_image = p_j2k->m_private_image;
5256
570
    l_nb_comp = l_image->numcomps;
5257
5258
570
    if (l_nb_comp <= 256) {
5259
570
        l_comp_room = 1;
5260
570
    } else {
5261
0
        l_comp_room = 2;
5262
0
    }
5263
5264
570
    if (p_header_size != 2 + l_comp_room) {
5265
556
        opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
5266
556
        return OPJ_FALSE;
5267
556
    }
5268
5269
14
    l_cp = &(p_j2k->m_cp);
5270
14
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
5271
0
            &l_cp->tcps[p_j2k->m_current_tile_number] :
5272
14
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
5273
5274
14
    opj_read_bytes(p_header_data, &l_comp_no, l_comp_room);         /* Crgn */
5275
14
    p_header_data += l_comp_room;
5276
14
    opj_read_bytes(p_header_data, &l_roi_sty,
5277
14
                   1);                                     /* Srgn */
5278
14
    ++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
14
    if (l_comp_no >= l_nb_comp) {
5297
7
        opj_event_msg(p_manager, EVT_ERROR,
5298
7
                      "bad component number in RGN (%d when there are only %d)\n",
5299
7
                      l_comp_no, l_nb_comp);
5300
7
        return OPJ_FALSE;
5301
7
    }
5302
5303
7
    opj_read_bytes(p_header_data,
5304
7
                   (OPJ_UINT32 *)(&(l_tcp->tccps[l_comp_no].roishift)), 1);  /* SPrgn */
5305
7
    ++p_header_data;
5306
5307
7
    return OPJ_TRUE;
5308
5309
14
}
5310
5311
static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp)
5312
0
{
5313
0
    return (OPJ_FLOAT32)((p_tcp->m_nb_tile_parts - 1) * 14);
5314
0
}
5315
5316
static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp)
5317
0
{
5318
0
    (void)p_tcp;
5319
0
    return 0;
5320
0
}
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
0
{
5326
0
    opj_cp_t * l_cp = 00;
5327
0
    opj_image_t * l_image = 00;
5328
0
    opj_tcp_t * l_tcp = 00;
5329
0
    opj_image_comp_t * l_img_comp = 00;
5330
5331
0
    OPJ_UINT32 i, j, k;
5332
0
    OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
5333
0
    OPJ_FLOAT32 * l_rates = 0;
5334
0
    OPJ_FLOAT32 l_sot_remove;
5335
0
    OPJ_UINT32 l_bits_empty, l_size_pixel;
5336
0
    OPJ_UINT64 l_tile_size = 0;
5337
0
    OPJ_UINT32 l_last_res;
5338
0
    OPJ_FLOAT32(* l_tp_stride_func)(opj_tcp_t *) = 00;
5339
5340
    /* preconditions */
5341
0
    assert(p_j2k != 00);
5342
0
    assert(p_manager != 00);
5343
0
    assert(p_stream != 00);
5344
5345
0
    OPJ_UNUSED(p_manager);
5346
5347
0
    l_cp = &(p_j2k->m_cp);
5348
0
    l_image = p_j2k->m_private_image;
5349
0
    l_tcp = l_cp->tcps;
5350
5351
0
    l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
5352
0
    l_size_pixel = l_image->numcomps * l_image->comps->prec;
5353
0
    l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(
5354
0
                       l_cp->th * l_cp->tw);
5355
5356
0
    if (l_cp->m_specific_param.m_enc.m_tp_on) {
5357
0
        l_tp_stride_func = opj_j2k_get_tp_stride;
5358
0
    } else {
5359
0
        l_tp_stride_func = opj_j2k_get_default_stride;
5360
0
    }
5361
5362
0
    for (i = 0; i < l_cp->th; ++i) {
5363
0
        for (j = 0; j < l_cp->tw; ++j) {
5364
0
            OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) /
5365
0
                                   (OPJ_FLOAT32)l_tcp->numlayers;
5366
5367
            /* 4 borders of the tile rescale on the image if necessary */
5368
0
            l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx),
5369
0
                               (OPJ_INT32)l_image->x0);
5370
0
            l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy),
5371
0
                               (OPJ_INT32)l_image->y0);
5372
0
            l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx),
5373
0
                               (OPJ_INT32)l_image->x1);
5374
0
            l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy),
5375
0
                               (OPJ_INT32)l_image->y1);
5376
5377
0
            l_rates = l_tcp->rates;
5378
5379
            /* Modification of the RATE >> */
5380
0
            for (k = 0; k < l_tcp->numlayers; ++k) {
5381
0
                if (*l_rates > 0.0f) {
5382
0
                    *l_rates = (OPJ_FLOAT32)(((OPJ_FLOAT64)l_size_pixel * (OPJ_UINT32)(
5383
0
                                                  l_x1 - l_x0) *
5384
0
                                              (OPJ_UINT32)(l_y1 - l_y0))
5385
0
                                             / ((*l_rates) * (OPJ_FLOAT32)l_bits_empty))
5386
0
                               -
5387
0
                               l_offset;
5388
0
                }
5389
5390
0
                ++l_rates;
5391
0
            }
5392
5393
0
            ++l_tcp;
5394
5395
0
        }
5396
0
    }
5397
5398
0
    l_tcp = l_cp->tcps;
5399
5400
0
    for (i = 0; i < l_cp->th; ++i) {
5401
0
        for (j = 0; j < l_cp->tw; ++j) {
5402
0
            l_rates = l_tcp->rates;
5403
5404
0
            if (*l_rates > 0.0f) {
5405
0
                *l_rates -= l_sot_remove;
5406
5407
0
                if (*l_rates < 30.0f) {
5408
0
                    *l_rates = 30.0f;
5409
0
                }
5410
0
            }
5411
5412
0
            ++l_rates;
5413
5414
0
            l_last_res = l_tcp->numlayers - 1;
5415
5416
0
            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
0
            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
0
            ++l_tcp;
5438
0
        }
5439
0
    }
5440
5441
0
    l_img_comp = l_image->comps;
5442
0
    l_tile_size = 0;
5443
5444
0
    for (i = 0; i < l_image->numcomps; ++i) {
5445
0
        l_tile_size += (OPJ_UINT64)opj_uint_ceildiv(l_cp->tdx, l_img_comp->dx)
5446
0
                       *
5447
0
                       opj_uint_ceildiv(l_cp->tdy, l_img_comp->dy)
5448
0
                       *
5449
0
                       l_img_comp->prec;
5450
5451
0
        ++l_img_comp;
5452
0
    }
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
0
    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
0
    l_tile_size += 500;
5465
5466
0
    l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
5467
5468
0
    if (l_tile_size > UINT_MAX) {
5469
0
        l_tile_size = UINT_MAX;
5470
0
    }
5471
5472
0
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = (OPJ_UINT32)l_tile_size;
5473
0
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
5474
0
        (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
5475
0
    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
0
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
5483
0
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
5484
0
            (OPJ_BYTE *) opj_malloc(6 *
5485
0
                                    p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
5486
0
        if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
5487
0
            return OPJ_FALSE;
5488
0
        }
5489
5490
0
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
5491
0
            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
5492
0
    }
5493
5494
0
    return OPJ_TRUE;
5495
0
}
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
0
{
5618
0
    OPJ_UINT32 compno;
5619
5620
    /* preconditions */
5621
0
    assert(p_j2k != 00);
5622
0
    assert(p_manager != 00);
5623
0
    assert(p_stream != 00);
5624
5625
0
    for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5626
        /* cod is first component of first tile */
5627
0
        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
0
    }
5633
5634
0
    return OPJ_TRUE;
5635
0
}
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
0
{
5642
0
    OPJ_UINT32 compno;
5643
5644
    /* preconditions */
5645
0
    assert(p_j2k != 00);
5646
0
    assert(p_manager != 00);
5647
0
    assert(p_stream != 00);
5648
5649
0
    for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5650
        /* qcd is first component of first tile */
5651
0
        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
0
    }
5657
0
    return OPJ_TRUE;
5658
0
}
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
0
{
5664
0
    OPJ_UINT32 compno;
5665
0
    const opj_tccp_t *l_tccp = 00;
5666
5667
    /* preconditions */
5668
0
    assert(p_j2k != 00);
5669
0
    assert(p_manager != 00);
5670
0
    assert(p_stream != 00);
5671
5672
0
    l_tccp = p_j2k->m_cp.tcps->tccps;
5673
5674
0
    for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {
5675
0
        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
0
        ++l_tccp;
5684
0
    }
5685
5686
0
    return OPJ_TRUE;
5687
0
}
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
0
{
5693
0
    opj_codestream_index_t * l_cstr_index = 00;
5694
5695
    /* preconditions */
5696
0
    assert(p_j2k != 00);
5697
0
    assert(p_manager != 00);
5698
0
    assert(p_stream != 00);
5699
5700
0
    OPJ_UNUSED(p_manager);
5701
5702
0
    l_cstr_index = p_j2k->cstr_index;
5703
0
    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
0
    return OPJ_TRUE;
5727
0
}
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
96.3k
{
5735
96.3k
    OPJ_UINT32 l_unknown_marker;
5736
96.3k
    const opj_dec_memory_marker_handler_t * l_marker_handler;
5737
96.3k
    OPJ_UINT32 l_size_unk = 2;
5738
5739
    /* preconditions*/
5740
96.3k
    assert(p_j2k != 00);
5741
96.3k
    assert(p_manager != 00);
5742
96.3k
    assert(p_stream != 00);
5743
5744
96.3k
    opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
5745
5746
73.0M
    for (;;) {
5747
        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
5748
73.0M
        if (opj_stream_read_data(p_stream,
5749
73.0M
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
5750
1.26k
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
5751
1.26k
            return OPJ_FALSE;
5752
1.26k
        }
5753
5754
        /* read 2 bytes as the new marker ID*/
5755
73.0M
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
5756
73.0M
                       &l_unknown_marker, 2);
5757
5758
73.0M
        if (!(l_unknown_marker < 0xff00)) {
5759
5760
            /* Get the marker handler from the marker ID*/
5761
2.56M
            l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
5762
5763
2.56M
            if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
5764
920
                opj_event_msg(p_manager, EVT_ERROR,
5765
920
                              "Marker is not compliant with its position\n");
5766
920
                return OPJ_FALSE;
5767
2.55M
            } else {
5768
2.55M
                if (l_marker_handler->id != J2K_MS_UNK) {
5769
                    /* Add the marker to the codestream index*/
5770
94.1k
                    if (l_marker_handler->id != J2K_MS_SOT) {
5771
58.8k
                        OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
5772
58.8k
                                                            (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
5773
58.8k
                                                            l_size_unk);
5774
58.8k
                        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
58.8k
                    }
5779
94.1k
                    break; /* next marker is known and well located */
5780
2.46M
                } else {
5781
2.46M
                    l_size_unk += 2;
5782
2.46M
                }
5783
2.55M
            }
5784
2.56M
        }
5785
73.0M
    }
5786
5787
94.1k
    *output_marker = l_marker_handler->id ;
5788
5789
94.1k
    return OPJ_TRUE;
5790
96.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
9.33k
{
5872
9.33k
    OPJ_UINT32 i;
5873
9.33k
    opj_tcp_t *l_tcp = 00;
5874
9.33k
    OPJ_UINT32 l_tmp;
5875
9.33k
    OPJ_UINT32 l_indix;
5876
9.33k
    opj_mct_data_t * l_mct_data;
5877
5878
    /* preconditions */
5879
9.33k
    assert(p_header_data != 00);
5880
9.33k
    assert(p_j2k != 00);
5881
5882
9.33k
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5883
276
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5884
9.33k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
5885
5886
9.33k
    if (p_header_size < 2) {
5887
27
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5888
27
        return OPJ_FALSE;
5889
27
    }
5890
5891
    /* first marker */
5892
9.31k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmct */
5893
9.31k
    p_header_data += 2;
5894
9.31k
    if (l_tmp != 0) {
5895
868
        opj_event_msg(p_manager, EVT_WARNING,
5896
868
                      "Cannot take in charge mct data within multiple MCT records\n");
5897
868
        return OPJ_TRUE;
5898
868
    }
5899
5900
8.44k
    if (p_header_size <= 6) {
5901
103
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5902
103
        return OPJ_FALSE;
5903
103
    }
5904
5905
    /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
5906
8.34k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Imct */
5907
8.34k
    p_header_data += 2;
5908
5909
8.34k
    l_indix = l_tmp & 0xff;
5910
8.34k
    l_mct_data = l_tcp->m_mct_records;
5911
5912
9.17k
    for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
5913
3.25k
        if (l_mct_data->m_index == l_indix) {
5914
2.42k
            break;
5915
2.42k
        }
5916
831
        ++l_mct_data;
5917
831
    }
5918
5919
    /* NOT FOUND */
5920
8.34k
    if (i == l_tcp->m_nb_mct_records) {
5921
5.91k
        if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
5922
238
            opj_mct_data_t *new_mct_records;
5923
238
            l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
5924
5925
238
            new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records,
5926
238
                              l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
5927
238
            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
238
            if (new_mct_records != l_tcp->m_mct_records) {
5939
0
                for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
5940
0
                    opj_simple_mcc_decorrelation_data_t* l_mcc_record =
5941
0
                        &(l_tcp->m_mcc_records[i]);
5942
0
                    if (l_mcc_record->m_decorrelation_array) {
5943
0
                        l_mcc_record->m_decorrelation_array =
5944
0
                            new_mct_records +
5945
0
                            (l_mcc_record->m_decorrelation_array -
5946
0
                             l_tcp->m_mct_records);
5947
0
                    }
5948
0
                    if (l_mcc_record->m_offset_array) {
5949
0
                        l_mcc_record->m_offset_array =
5950
0
                            new_mct_records +
5951
0
                            (l_mcc_record->m_offset_array -
5952
0
                             l_tcp->m_mct_records);
5953
0
                    }
5954
0
                }
5955
0
            }
5956
5957
238
            l_tcp->m_mct_records = new_mct_records;
5958
238
            l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5959
238
            memset(l_mct_data, 0, (l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) *
5960
238
                   sizeof(opj_mct_data_t));
5961
238
        }
5962
5963
5.91k
        l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5964
5.91k
        ++l_tcp->m_nb_mct_records;
5965
5.91k
    }
5966
5967
8.34k
    if (l_mct_data->m_data) {
5968
1.69k
        opj_free(l_mct_data->m_data);
5969
1.69k
        l_mct_data->m_data = 00;
5970
1.69k
        l_mct_data->m_data_size = 0;
5971
1.69k
    }
5972
5973
8.34k
    l_mct_data->m_index = l_indix;
5974
8.34k
    l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
5975
8.34k
    l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
5976
5977
8.34k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymct */
5978
8.34k
    p_header_data += 2;
5979
8.34k
    if (l_tmp != 0) {
5980
4.76k
        opj_event_msg(p_manager, EVT_WARNING,
5981
4.76k
                      "Cannot take in charge multiple MCT markers\n");
5982
4.76k
        return OPJ_TRUE;
5983
4.76k
    }
5984
5985
3.58k
    p_header_size -= 6;
5986
5987
3.58k
    l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
5988
3.58k
    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.58k
    memcpy(l_mct_data->m_data, p_header_data, p_header_size);
5993
5994
3.58k
    l_mct_data->m_data_size = p_header_size;
5995
5996
3.58k
    return OPJ_TRUE;
5997
3.58k
}
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
3.98k
{
6119
3.98k
    OPJ_UINT32 i, j;
6120
3.98k
    OPJ_UINT32 l_tmp;
6121
3.98k
    OPJ_UINT32 l_indix;
6122
3.98k
    opj_tcp_t * l_tcp;
6123
3.98k
    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6124
3.98k
    opj_mct_data_t * l_mct_data;
6125
3.98k
    OPJ_UINT32 l_nb_collections;
6126
3.98k
    OPJ_UINT32 l_nb_comps;
6127
3.98k
    OPJ_UINT32 l_nb_bytes_by_comp;
6128
3.98k
    OPJ_BOOL l_new_mcc = OPJ_FALSE;
6129
6130
    /* preconditions */
6131
3.98k
    assert(p_header_data != 00);
6132
3.98k
    assert(p_j2k != 00);
6133
3.98k
    assert(p_manager != 00);
6134
6135
3.98k
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6136
54
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6137
3.98k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
6138
6139
3.98k
    if (p_header_size < 2) {
6140
207
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6141
207
        return OPJ_FALSE;
6142
207
    }
6143
6144
    /* first marker */
6145
3.77k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmcc */
6146
3.77k
    p_header_data += 2;
6147
3.77k
    if (l_tmp != 0) {
6148
1.29k
        opj_event_msg(p_manager, EVT_WARNING,
6149
1.29k
                      "Cannot take in charge multiple data spanning\n");
6150
1.29k
        return OPJ_TRUE;
6151
1.29k
    }
6152
6153
2.47k
    if (p_header_size < 7) {
6154
28
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6155
28
        return OPJ_FALSE;
6156
28
    }
6157
6158
2.44k
    opj_read_bytes(p_header_data, &l_indix,
6159
2.44k
                   1); /* Imcc -> no need for other values, take the first */
6160
2.44k
    ++p_header_data;
6161
6162
2.44k
    l_mcc_record = l_tcp->m_mcc_records;
6163
6164
2.44k
    for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
6165
0
        if (l_mcc_record->m_index == l_indix) {
6166
0
            break;
6167
0
        }
6168
0
        ++l_mcc_record;
6169
0
    }
6170
6171
    /** NOT FOUND */
6172
2.44k
    if (i == l_tcp->m_nb_mcc_records) {
6173
2.44k
        if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
6174
0
            opj_simple_mcc_decorrelation_data_t *new_mcc_records;
6175
0
            l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
6176
6177
0
            new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
6178
0
                                  l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(
6179
0
                                      opj_simple_mcc_decorrelation_data_t));
6180
0
            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
0
            l_tcp->m_mcc_records = new_mcc_records;
6189
0
            l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
6190
0
            memset(l_mcc_record, 0, (l_tcp->m_nb_max_mcc_records - l_tcp->m_nb_mcc_records)
6191
0
                   * sizeof(opj_simple_mcc_decorrelation_data_t));
6192
0
        }
6193
2.44k
        l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
6194
2.44k
        l_new_mcc = OPJ_TRUE;
6195
2.44k
    }
6196
2.44k
    l_mcc_record->m_index = l_indix;
6197
6198
    /* only one marker atm */
6199
2.44k
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymcc */
6200
2.44k
    p_header_data += 2;
6201
2.44k
    if (l_tmp != 0) {
6202
153
        opj_event_msg(p_manager, EVT_WARNING,
6203
153
                      "Cannot take in charge multiple data spanning\n");
6204
153
        return OPJ_TRUE;
6205
153
    }
6206
6207
2.29k
    opj_read_bytes(p_header_data, &l_nb_collections,
6208
2.29k
                   2);                              /* Qmcc -> number of collections -> 1 */
6209
2.29k
    p_header_data += 2;
6210
6211
2.29k
    if (l_nb_collections > 1) {
6212
929
        opj_event_msg(p_manager, EVT_WARNING,
6213
929
                      "Cannot take in charge multiple collections\n");
6214
929
        return OPJ_TRUE;
6215
929
    }
6216
6217
1.36k
    p_header_size -= 7;
6218
6219
1.51k
    for (i = 0; i < l_nb_collections; ++i) {
6220
1.10k
        if (p_header_size < 3) {
6221
12
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6222
12
            return OPJ_FALSE;
6223
12
        }
6224
6225
1.09k
        opj_read_bytes(p_header_data, &l_tmp,
6226
1.09k
                       1); /* Xmcci type of component transformation -> array based decorrelation */
6227
1.09k
        ++p_header_data;
6228
6229
1.09k
        if (l_tmp != 1) {
6230
83
            opj_event_msg(p_manager, EVT_WARNING,
6231
83
                          "Cannot take in charge collections other than array decorrelation\n");
6232
83
            return OPJ_TRUE;
6233
83
        }
6234
6235
1.01k
        opj_read_bytes(p_header_data, &l_nb_comps, 2);
6236
6237
1.01k
        p_header_data += 2;
6238
1.01k
        p_header_size -= 3;
6239
6240
1.01k
        l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
6241
1.01k
        l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
6242
6243
1.01k
        if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
6244
38
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6245
38
            return OPJ_FALSE;
6246
38
        }
6247
6248
973
        p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
6249
6250
1.36k
        for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
6251
529
            opj_read_bytes(p_header_data, &l_tmp,
6252
529
                           l_nb_bytes_by_comp);      /* Cmccij Component offset*/
6253
529
            p_header_data += l_nb_bytes_by_comp;
6254
6255
529
            if (l_tmp != j) {
6256
133
                opj_event_msg(p_manager, EVT_WARNING,
6257
133
                              "Cannot take in charge collections with indix shuffle\n");
6258
133
                return OPJ_TRUE;
6259
133
            }
6260
529
        }
6261
6262
840
        opj_read_bytes(p_header_data, &l_nb_comps, 2);
6263
840
        p_header_data += 2;
6264
6265
840
        l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
6266
840
        l_nb_comps &= 0x7fff;
6267
6268
840
        if (l_nb_comps != l_mcc_record->m_nb_comps) {
6269
247
            opj_event_msg(p_manager, EVT_WARNING,
6270
247
                          "Cannot take in charge collections without same number of indixes\n");
6271
247
            return OPJ_TRUE;
6272
247
        }
6273
6274
593
        if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
6275
7
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6276
7
            return OPJ_FALSE;
6277
7
        }
6278
6279
586
        p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
6280
6281
605
        for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
6282
24
            opj_read_bytes(p_header_data, &l_tmp,
6283
24
                           l_nb_bytes_by_comp);      /* Wmccij Component offset*/
6284
24
            p_header_data += l_nb_bytes_by_comp;
6285
6286
24
            if (l_tmp != j) {
6287
5
                opj_event_msg(p_manager, EVT_WARNING,
6288
5
                              "Cannot take in charge collections with indix shuffle\n");
6289
5
                return OPJ_TRUE;
6290
5
            }
6291
24
        }
6292
6293
581
        opj_read_bytes(p_header_data, &l_tmp, 3); /* Wmccij Component offset*/
6294
581
        p_header_data += 3;
6295
6296
581
        l_mcc_record->m_is_irreversible = !((l_tmp >> 16) & 1);
6297
581
        l_mcc_record->m_decorrelation_array = 00;
6298
581
        l_mcc_record->m_offset_array = 00;
6299
6300
581
        l_indix = l_tmp & 0xff;
6301
581
        if (l_indix != 0) {
6302
182
            l_mct_data = l_tcp->m_mct_records;
6303
192
            for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6304
28
                if (l_mct_data->m_index == l_indix) {
6305
18
                    l_mcc_record->m_decorrelation_array = l_mct_data;
6306
18
                    break;
6307
18
                }
6308
10
                ++l_mct_data;
6309
10
            }
6310
6311
182
            if (l_mcc_record->m_decorrelation_array == 00) {
6312
164
                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6313
164
                return OPJ_FALSE;
6314
164
            }
6315
182
        }
6316
6317
417
        l_indix = (l_tmp >> 8) & 0xff;
6318
417
        if (l_indix != 0) {
6319
275
            l_mct_data = l_tcp->m_mct_records;
6320
293
            for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6321
27
                if (l_mct_data->m_index == l_indix) {
6322
9
                    l_mcc_record->m_offset_array = l_mct_data;
6323
9
                    break;
6324
9
                }
6325
18
                ++l_mct_data;
6326
18
            }
6327
6328
275
            if (l_mcc_record->m_offset_array == 00) {
6329
266
                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6330
266
                return OPJ_FALSE;
6331
266
            }
6332
275
        }
6333
417
    }
6334
6335
410
    if (p_header_size != 0) {
6336
408
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6337
408
        return OPJ_FALSE;
6338
408
    }
6339
6340
2
    if (l_new_mcc) {
6341
2
        ++l_tcp->m_nb_mcc_records;
6342
2
    }
6343
6344
2
    return OPJ_TRUE;
6345
410
}
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
398
{
6424
398
    OPJ_UINT32 l_tmp, i;
6425
398
    OPJ_UINT32 l_nb_stages;
6426
398
    opj_tcp_t * l_tcp;
6427
398
    opj_tccp_t * l_tccp;
6428
398
    opj_image_t * l_image;
6429
6430
    /* preconditions */
6431
398
    assert(p_header_data != 00);
6432
398
    assert(p_j2k != 00);
6433
398
    assert(p_manager != 00);
6434
6435
398
    l_image = p_j2k->m_private_image;
6436
398
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6437
72
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6438
398
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
6439
6440
398
    if (p_header_size < 1) {
6441
17
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
6442
17
        return OPJ_FALSE;
6443
17
    }
6444
6445
381
    opj_read_bytes(p_header_data, &l_nb_stages,
6446
381
                   1);                         /* Nmco : only one transform stage*/
6447
381
    ++p_header_data;
6448
6449
381
    if (l_nb_stages > 1) {
6450
245
        opj_event_msg(p_manager, EVT_WARNING,
6451
245
                      "Cannot take in charge multiple transformation stages.\n");
6452
245
        return OPJ_TRUE;
6453
245
    }
6454
6455
136
    if (p_header_size != l_nb_stages + 1) {
6456
103
        opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
6457
103
        return OPJ_FALSE;
6458
103
    }
6459
6460
33
    l_tccp = l_tcp->tccps;
6461
6462
132
    for (i = 0; i < l_image->numcomps; ++i) {
6463
99
        l_tccp->m_dc_level_shift = 0;
6464
99
        ++l_tccp;
6465
99
    }
6466
6467
33
    if (l_tcp->m_mct_decoding_matrix) {
6468
0
        opj_free(l_tcp->m_mct_decoding_matrix);
6469
0
        l_tcp->m_mct_decoding_matrix = 00;
6470
0
    }
6471
6472
33
    for (i = 0; i < l_nb_stages; ++i) {
6473
0
        opj_read_bytes(p_header_data, &l_tmp, 1);
6474
0
        ++p_header_data;
6475
6476
0
        if (! opj_j2k_add_mct(l_tcp, p_j2k->m_private_image, l_tmp)) {
6477
0
            return OPJ_FALSE;
6478
0
        }
6479
0
    }
6480
6481
33
    return OPJ_TRUE;
6482
33
}
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
0
{
6487
0
    OPJ_UINT32 i;
6488
0
    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6489
0
    opj_mct_data_t * l_deco_array, * l_offset_array;
6490
0
    OPJ_UINT32 l_data_size, l_mct_size, l_offset_size;
6491
0
    OPJ_UINT32 l_nb_elem;
6492
0
    OPJ_UINT32 * l_offset_data, * l_current_offset_data;
6493
0
    opj_tccp_t * l_tccp;
6494
6495
    /* preconditions */
6496
0
    assert(p_tcp != 00);
6497
6498
0
    l_mcc_record = p_tcp->m_mcc_records;
6499
6500
0
    for (i = 0; i < p_tcp->m_nb_mcc_records; ++i) {
6501
0
        if (l_mcc_record->m_index == p_index) {
6502
0
            break;
6503
0
        }
6504
0
    }
6505
6506
0
    if (i == p_tcp->m_nb_mcc_records) {
6507
        /** element discarded **/
6508
0
        return OPJ_TRUE;
6509
0
    }
6510
6511
0
    if (l_mcc_record->m_nb_comps != p_image->numcomps) {
6512
        /** do not support number of comps != image */
6513
0
        return OPJ_TRUE;
6514
0
    }
6515
6516
0
    l_deco_array = l_mcc_record->m_decorrelation_array;
6517
6518
0
    if (l_deco_array) {
6519
0
        l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps
6520
0
                      * p_image->numcomps;
6521
0
        if (l_deco_array->m_data_size != l_data_size) {
6522
0
            return OPJ_FALSE;
6523
0
        }
6524
6525
0
        l_nb_elem = p_image->numcomps * p_image->numcomps;
6526
0
        l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
6527
0
        p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
6528
6529
0
        if (! p_tcp->m_mct_decoding_matrix) {
6530
0
            return OPJ_FALSE;
6531
0
        }
6532
6533
0
        j2k_mct_read_functions_to_float[l_deco_array->m_element_type](
6534
0
            l_deco_array->m_data, p_tcp->m_mct_decoding_matrix, l_nb_elem);
6535
0
    }
6536
6537
0
    l_offset_array = l_mcc_record->m_offset_array;
6538
6539
0
    if (l_offset_array) {
6540
0
        l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] *
6541
0
                      p_image->numcomps;
6542
0
        if (l_offset_array->m_data_size != l_data_size) {
6543
0
            return OPJ_FALSE;
6544
0
        }
6545
6546
0
        l_nb_elem = p_image->numcomps;
6547
0
        l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
6548
0
        l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
6549
6550
0
        if (! l_offset_data) {
6551
0
            return OPJ_FALSE;
6552
0
        }
6553
6554
0
        j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](
6555
0
            l_offset_array->m_data, l_offset_data, l_nb_elem);
6556
6557
0
        l_tccp = p_tcp->tccps;
6558
0
        l_current_offset_data = l_offset_data;
6559
6560
0
        for (i = 0; i < p_image->numcomps; ++i) {
6561
0
            l_tccp->m_dc_level_shift = (OPJ_INT32) * (l_current_offset_data++);
6562
0
            ++l_tccp;
6563
0
        }
6564
6565
0
        opj_free(l_offset_data);
6566
0
    }
6567
6568
0
    return OPJ_TRUE;
6569
0
}
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
180
{
6646
180
    OPJ_UINT32 l_nb_comp, l_num_comp;
6647
180
    OPJ_UINT32 l_comp_def;
6648
180
    OPJ_UINT32 i;
6649
180
    opj_image_comp_t * l_comp = 00;
6650
6651
    /* preconditions */
6652
180
    assert(p_header_data != 00);
6653
180
    assert(p_j2k != 00);
6654
180
    assert(p_manager != 00);
6655
6656
180
    l_num_comp = p_j2k->m_private_image->numcomps;
6657
6658
180
    if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
6659
174
        opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6660
174
        return OPJ_FALSE;
6661
174
    }
6662
6663
6
    opj_read_bytes(p_header_data, &l_nb_comp,
6664
6
                   2);                           /* Ncbd */
6665
6
    p_header_data += 2;
6666
6667
6
    if (l_nb_comp != l_num_comp) {
6668
6
        opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6669
6
        return OPJ_FALSE;
6670
6
    }
6671
6672
0
    l_comp = p_j2k->m_private_image->comps;
6673
0
    for (i = 0; i < l_num_comp; ++i) {
6674
0
        opj_read_bytes(p_header_data, &l_comp_def,
6675
0
                       1);                  /* Component bit depth */
6676
0
        ++p_header_data;
6677
0
        l_comp->sgnd = (l_comp_def >> 7) & 1;
6678
0
        l_comp->prec = (l_comp_def & 0x7f) + 1;
6679
6680
0
        if (l_comp->prec > 31) {
6681
0
            opj_event_msg(p_manager, EVT_ERROR,
6682
0
                          "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
0
                          i, l_comp->prec);
6684
0
            return OPJ_FALSE;
6685
0
        }
6686
0
        ++l_comp;
6687
0
    }
6688
6689
0
    return OPJ_TRUE;
6690
0
}
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
4.90k
{
6707
    /* preconditions */
6708
4.90k
    assert(p_header_data != 00);
6709
4.90k
    assert(p_j2k != 00);
6710
4.90k
    assert(p_manager != 00);
6711
6712
4.90k
    (void)p_j2k;
6713
4.90k
    (void)p_header_data;
6714
4.90k
    (void)p_header_size;
6715
4.90k
    (void)p_manager;
6716
6717
4.90k
    return OPJ_TRUE;
6718
4.90k
}
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
306
{
6733
    /* preconditions */
6734
306
    assert(p_header_data != 00);
6735
306
    assert(p_j2k != 00);
6736
306
    assert(p_manager != 00);
6737
6738
306
    (void)p_j2k;
6739
306
    (void)p_header_data;
6740
306
    (void)p_header_size;
6741
306
    (void)p_manager;
6742
6743
306
    return OPJ_TRUE;
6744
306
}
6745
6746
/* ----------------------------------------------------------------------- */
6747
/* J2K / JPT decoder interface                                             */
6748
/* ----------------------------------------------------------------------- */
6749
6750
void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
6751
365k
{
6752
365k
    if (j2k && parameters) {
6753
365k
        j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
6754
365k
        j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
6755
6756
365k
        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
365k
    }
6763
365k
}
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
365k
{
6796
365k
    const char* num_threads_str = getenv("OPJ_NUM_THREADS");
6797
365k
    int num_cpus;
6798
365k
    int num_threads;
6799
6800
365k
    if (num_threads_str == NULL || !opj_has_thread_support()) {
6801
365k
        return 0;
6802
365k
    }
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
0
{
6825
0
    opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
6826
0
    if (!l_j2k) {
6827
0
        return NULL;
6828
0
    }
6829
6830
6831
0
    l_j2k->m_is_decoder = 0;
6832
0
    l_j2k->m_cp.m_is_decoder = 0;
6833
6834
0
    l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(
6835
0
                OPJ_J2K_DEFAULT_HEADER_SIZE);
6836
0
    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
0
    l_j2k->m_specific_param.m_encoder.m_header_tile_data_size =
6842
0
        OPJ_J2K_DEFAULT_HEADER_SIZE;
6843
6844
    /* validation list creation*/
6845
0
    l_j2k->m_validation_list = opj_procedure_list_create();
6846
0
    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
0
    l_j2k->m_procedure_list = opj_procedure_list_create();
6853
0
    if (! l_j2k->m_procedure_list) {
6854
0
        opj_j2k_destroy(l_j2k);
6855
0
        return NULL;
6856
0
    }
6857
6858
0
    l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
6859
0
    if (!l_j2k->m_tp) {
6860
0
        l_j2k->m_tp = opj_thread_pool_create(0);
6861
0
    }
6862
0
    if (!l_j2k->m_tp) {
6863
0
        opj_j2k_destroy(l_j2k);
6864
0
        return NULL;
6865
0
    }
6866
6867
0
    return l_j2k;
6868
0
}
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
0
{
6892
    /* Configure cinema parameters */
6893
0
    int i;
6894
6895
    /* No tiling */
6896
0
    parameters->tile_size_on = OPJ_FALSE;
6897
0
    parameters->cp_tdx = 1;
6898
0
    parameters->cp_tdy = 1;
6899
6900
    /* One tile part for each component */
6901
0
    parameters->tp_flag = 'C';
6902
0
    parameters->tp_on = 1;
6903
6904
    /* Tile and Image shall be at (0,0) */
6905
0
    parameters->cp_tx0 = 0;
6906
0
    parameters->cp_ty0 = 0;
6907
0
    parameters->image_offset_x0 = 0;
6908
0
    parameters->image_offset_y0 = 0;
6909
6910
    /* Codeblock size= 32*32 */
6911
0
    parameters->cblockw_init = 32;
6912
0
    parameters->cblockh_init = 32;
6913
6914
    /* Codeblock style: no mode switch enabled */
6915
0
    parameters->mode = 0;
6916
6917
    /* No ROI */
6918
0
    parameters->roi_compno = -1;
6919
6920
    /* No subsampling */
6921
0
    parameters->subsampling_dx = 1;
6922
0
    parameters->subsampling_dy = 1;
6923
6924
    /* 9-7 transform */
6925
0
    parameters->irreversible = 1;
6926
6927
    /* Number of layers */
6928
0
    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
0
    switch (parameters->rsiz) {
6942
0
    case OPJ_PROFILE_CINEMA_2K:
6943
0
        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
0
        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
0
    }
6972
6973
    /* Precincts */
6974
0
    parameters->csty |= J2K_CP_CSTY_PRT;
6975
0
    if (parameters->numresolution == 1) {
6976
0
        parameters->res_spec = 1;
6977
0
        parameters->prcw_init[0] = 128;
6978
0
        parameters->prch_init[0] = 128;
6979
0
    } else {
6980
0
        parameters->res_spec = parameters->numresolution - 1;
6981
0
        for (i = 0; i < parameters->res_spec; i++) {
6982
0
            parameters->prcw_init[i] = 256;
6983
0
            parameters->prch_init[i] = 256;
6984
0
        }
6985
0
    }
6986
6987
    /* The progression order shall be CPRL */
6988
0
    parameters->prog_order = OPJ_CPRL;
6989
6990
    /* Progression order changes for 4K, disallowed for 2K */
6991
0
    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
0
    } else {
6995
0
        parameters->numpocs = 0;
6996
0
    }
6997
6998
    /* Limited bit-rate */
6999
0
    parameters->cp_disto_alloc = 1;
7000
0
    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
0
    } 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
0
    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
0
    } 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
0
    parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
7031
0
                               image->comps[0].h * image->comps[0].prec) /
7032
0
                               (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
7033
0
                                       image->comps[0].dy);
7034
7035
0
}
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
0
{
7040
0
    OPJ_UINT32 i;
7041
7042
    /* Number of components */
7043
0
    if (image->numcomps != 3) {
7044
0
        opj_event_msg(p_manager, EVT_WARNING,
7045
0
                      "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
7046
0
                      "3 components"
7047
0
                      "-> Number of components of input image (%d) is not compliant\n"
7048
0
                      "-> Non-profile-3 codestream will be generated\n",
7049
0
                      image->numcomps);
7050
0
        return OPJ_FALSE;
7051
0
    }
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
0
{
7686
0
    OPJ_UINT32 i, j, tileno, numpocs_tile;
7687
0
    opj_cp_t *cp = 00;
7688
0
    OPJ_UINT32 cblkw, cblkh;
7689
7690
0
    if (!p_j2k || !parameters || ! image) {
7691
0
        return OPJ_FALSE;
7692
0
    }
7693
7694
0
    if ((parameters->numresolution <= 0) ||
7695
0
            (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
0
    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
0
    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
0
    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
0
    cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
7720
0
    cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
7721
0
    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
0
    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
0
    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
0
    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
0
    cp = &(p_j2k->m_cp);
7759
7760
    /* set default values for cp */
7761
0
    cp->tw = 1;
7762
0
    cp->th = 1;
7763
7764
    /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */
7765
0
    if (parameters->rsiz ==
7766
0
            OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */
7767
0
        OPJ_BOOL deprecated_used = OPJ_FALSE;
7768
0
        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
0
        case OPJ_OFF:
7788
0
        default:
7789
0
            break;
7790
0
        }
7791
0
        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
0
        case OPJ_STD_RSIZ:
7804
0
        default:
7805
0
            break;
7806
0
        }
7807
0
        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
0
    }
7814
7815
    /* If no explicit layers are provided, use lossless settings */
7816
0
    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
0
    if (parameters->cp_disto_alloc) {
7823
        /* Emit warnings if tcp_rates are not decreasing */
7824
0
        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
0
    } 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
0
    if (parameters->max_cs_size <= 0) {
7879
0
        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
0
        } else {
7891
0
            parameters->max_cs_size = 0;
7892
0
        }
7893
0
    } else {
7894
0
        OPJ_FLOAT32 temp_rate;
7895
0
        OPJ_BOOL cap = OPJ_FALSE;
7896
7897
0
        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
0
        temp_rate = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
7906
0
                                   image->comps[0].h * image->comps[0].prec) /
7907
0
                                  (((double)parameters->max_cs_size) * 8 * image->comps[0].dx *
7908
0
                                   image->comps[0].dy));
7909
0
        for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7910
0
            if (parameters->tcp_rates[i] < temp_rate) {
7911
0
                parameters->tcp_rates[i] = temp_rate;
7912
0
                cap = OPJ_TRUE;
7913
0
            }
7914
0
        }
7915
0
        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
0
    }
7921
7922
0
    if (OPJ_IS_CINEMA(parameters->rsiz) || OPJ_IS_IMF(parameters->rsiz)) {
7923
0
        p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_TRUE;
7924
0
    }
7925
7926
    /* Manage profiles and applications and set RSIZ */
7927
    /* set cinema parameters if required */
7928
0
    if (OPJ_IS_CINEMA(parameters->rsiz)) {
7929
0
        if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K)
7930
0
                || (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
0
        } else {
7935
0
            opj_j2k_set_cinema_parameters(parameters, image, p_manager);
7936
0
            if (!opj_j2k_is_cinema_compliant(image, parameters->rsiz, p_manager)) {
7937
0
                parameters->rsiz = OPJ_PROFILE_NONE;
7938
0
            }
7939
0
        }
7940
0
    } 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
0
    } 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
0
    } 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
0
    } 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
0
    cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)
7972
0
            parameters->max_comp_size;
7973
0
    cp->rsiz = parameters->rsiz;
7974
0
    if (parameters->cp_fixed_alloc) {
7975
0
        cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy = FIXED_LAYER;
7976
0
    } 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
0
    } else {
7980
0
        cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy =
7981
0
            RATE_DISTORTION_RATIO;
7982
0
    }
7983
7984
0
    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
0
    cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
7999
0
    cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
8000
8001
    /* tile offset */
8002
0
    cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
8003
0
    cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
8004
8005
    /* comment string */
8006
0
    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
0
    } else {
8015
        /* Create default comment for codestream */
8016
0
        const char comment[] = "Created by OpenJPEG version ";
8017
0
        const size_t clen = strlen(comment);
8018
0
        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
0
        const size_t cp_comment_buf_size = clen + strlen(version) + 1;
8033
0
        cp->comment = (char*)opj_malloc(cp_comment_buf_size);
8034
0
        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
0
        snprintf(cp->comment, cp_comment_buf_size, "%s%s", comment, version);
8040
0
#endif
8041
        /* <<UniPG */
8042
0
    }
8043
8044
    /*
8045
    calculate other encoding parameters
8046
    */
8047
8048
0
    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
0
    } else {
8067
0
        cp->tdx = image->x1 - cp->tx0;
8068
0
        cp->tdy = image->y1 - cp->ty0;
8069
0
    }
8070
8071
0
    if (parameters->tp_on) {
8072
0
        cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
8073
0
        cp->m_specific_param.m_enc.m_tp_on = 1;
8074
0
    }
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
0
    cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
8135
0
    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
0
    for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
8142
0
        opj_tcp_t *tcp = &cp->tcps[tileno];
8143
0
        const OPJ_BOOL fixed_distoratio =
8144
0
            cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy ==
8145
0
            FIXED_DISTORTION_RATIO;
8146
0
        tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
8147
8148
0
        for (j = 0; j < tcp->numlayers; j++) {
8149
0
            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
0
            } else {
8155
0
                if (fixed_distoratio) {
8156
0
                    tcp->distoratio[j] = parameters->tcp_distoratio[j];
8157
0
                } else {
8158
0
                    tcp->rates[j] = parameters->tcp_rates[j];
8159
0
                }
8160
0
            }
8161
0
            if (!fixed_distoratio &&
8162
0
                    tcp->rates[j] <= 1.0) {
8163
0
                tcp->rates[j] = 0.0;    /* force lossless */
8164
0
            }
8165
0
        }
8166
8167
0
        tcp->csty = (OPJ_UINT32)parameters->csty;
8168
0
        tcp->prg = parameters->prog_order;
8169
0
        tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
8170
8171
0
        numpocs_tile = 0;
8172
0
        tcp->POC = 0;
8173
8174
0
        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
0
        } else {
8210
0
            tcp->numpocs = 0;
8211
0
        }
8212
8213
0
        tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
8214
0
        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
0
        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
0
        } else {
8286
0
            if (tcp->mct == 1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
8287
0
                if ((image->comps[0].dx != image->comps[1].dx) ||
8288
0
                        (image->comps[0].dx != image->comps[2].dx) ||
8289
0
                        (image->comps[0].dy != image->comps[1].dy) ||
8290
0
                        (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
0
            }
8296
0
            for (i = 0; i < image->numcomps; i++) {
8297
0
                opj_tccp_t *tccp = &tcp->tccps[i];
8298
0
                opj_image_comp_t * l_comp = &(image->comps[i]);
8299
8300
0
                if (! l_comp->sgnd) {
8301
0
                    tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
8302
0
                }
8303
0
            }
8304
0
        }
8305
8306
0
        for (i = 0; i < image->numcomps; i++) {
8307
0
            opj_tccp_t *tccp = &tcp->tccps[i];
8308
8309
0
            tccp->csty = parameters->csty &
8310
0
                         0x01;   /* 0 => one precinct || 1 => custom precinct  */
8311
0
            tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
8312
0
            tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
8313
0
            tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
8314
0
            tccp->cblksty = (OPJ_UINT32)parameters->mode;
8315
0
            tccp->qmfbid = parameters->irreversible ? 0 : 1;
8316
0
            tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT :
8317
0
                           J2K_CCP_QNTSTY_NOQNT;
8318
8319
0
            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
0
            } else {
8324
0
                tccp->numgbits = 2;
8325
0
            }
8326
8327
0
            if ((OPJ_INT32)i == parameters->roi_compno) {
8328
0
                tccp->roishift = parameters->roi_shift;
8329
0
            } else {
8330
0
                tccp->roishift = 0;
8331
0
            }
8332
8333
0
            if (parameters->csty & J2K_CCP_CSTY_PRT) {
8334
0
                OPJ_INT32 p = 0, it_res;
8335
0
                assert(tccp->numresolutions > 0);
8336
0
                for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
8337
0
                    if (p < parameters->res_spec) {
8338
8339
0
                        if (parameters->prcw_init[p] < 1) {
8340
0
                            tccp->prcw[it_res] = 1;
8341
0
                        } else {
8342
0
                            tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
8343
0
                        }
8344
8345
0
                        if (parameters->prch_init[p] < 1) {
8346
0
                            tccp->prch[it_res] = 1;
8347
0
                        } else {
8348
0
                            tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
8349
0
                        }
8350
8351
0
                    } else {
8352
0
                        OPJ_INT32 res_spec = parameters->res_spec;
8353
0
                        OPJ_INT32 size_prcw = 0;
8354
0
                        OPJ_INT32 size_prch = 0;
8355
8356
0
                        assert(res_spec > 0); /* issue 189 */
8357
0
                        size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
8358
0
                        size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
8359
8360
8361
0
                        if (size_prcw < 1) {
8362
0
                            tccp->prcw[it_res] = 1;
8363
0
                        } else {
8364
0
                            tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
8365
0
                        }
8366
8367
0
                        if (size_prch < 1) {
8368
0
                            tccp->prch[it_res] = 1;
8369
0
                        } else {
8370
0
                            tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
8371
0
                        }
8372
0
                    }
8373
0
                    p++;
8374
                    /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
8375
0
                }       /*end for*/
8376
0
            } else {
8377
0
                for (j = 0; j < tccp->numresolutions; j++) {
8378
0
                    tccp->prcw[j] = 15;
8379
0
                    tccp->prch[j] = 15;
8380
0
                }
8381
0
            }
8382
8383
0
            opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
8384
0
        }
8385
0
    }
8386
8387
0
    if (parameters->mct_data) {
8388
0
        opj_free(parameters->mct_data);
8389
0
        parameters->mct_data = 00;
8390
0
    }
8391
0
    return OPJ_TRUE;
8392
0
}
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
1.04M
{
8397
1.04M
    assert(cstr_index != 00);
8398
8399
    /* expand the list? */
8400
1.04M
    if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
8401
84
        opj_marker_info_t *new_marker;
8402
84
        cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32)
8403
84
                                              cstr_index->maxmarknum);
8404
84
        new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker,
8405
84
                     cstr_index->maxmarknum * sizeof(opj_marker_info_t));
8406
84
        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
84
        cstr_index->marker = new_marker;
8415
84
    }
8416
8417
    /* add the marker */
8418
1.04M
    cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
8419
1.04M
    cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
8420
1.04M
    cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
8421
1.04M
    cstr_index->marknum++;
8422
1.04M
    return OPJ_TRUE;
8423
1.04M
}
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
696k
{
8429
696k
    assert(cstr_index != 00);
8430
696k
    assert(cstr_index->tile_index != 00);
8431
8432
    /* expand the list? */
8433
696k
    if ((cstr_index->tile_index[tileno].marknum + 1) >
8434
696k
            cstr_index->tile_index[tileno].maxmarknum) {
8435
0
        opj_marker_info_t *new_marker;
8436
0
        cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 +
8437
0
                (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
8438
0
        new_marker = (opj_marker_info_t *) opj_realloc(
8439
0
                         cstr_index->tile_index[tileno].marker,
8440
0
                         cstr_index->tile_index[tileno].maxmarknum * sizeof(opj_marker_info_t));
8441
0
        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
0
        cstr_index->tile_index[tileno].marker = new_marker;
8450
0
    }
8451
8452
    /* add the marker */
8453
696k
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type
8454
696k
        = (OPJ_UINT16)type;
8455
696k
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos
8456
696k
        = (OPJ_INT32)pos;
8457
696k
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len
8458
696k
        = (OPJ_INT32)len;
8459
696k
    cstr_index->tile_index[tileno].marknum++;
8460
8461
696k
    if (type == J2K_MS_SOT) {
8462
345k
        OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
8463
8464
345k
        if (cstr_index->tile_index[tileno].tp_index &&
8465
345k
                l_current_tile_part < cstr_index->tile_index[tileno].nb_tps) {
8466
344k
            cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
8467
344k
        }
8468
8469
345k
    }
8470
696k
    return OPJ_TRUE;
8471
696k
}
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
137k
{
8484
137k
    (void)p_j2k;
8485
137k
    (void)p_stream;
8486
137k
    (void)p_manager;
8487
137k
    return OPJ_TRUE;
8488
137k
}
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
318k
{
8495
    /* preconditions */
8496
318k
    assert(p_j2k != 00);
8497
318k
    assert(p_stream != 00);
8498
318k
    assert(p_manager != 00);
8499
8500
    /* create an empty image header */
8501
318k
    p_j2k->m_private_image = opj_image_create0();
8502
318k
    if (! p_j2k->m_private_image) {
8503
0
        return OPJ_FALSE;
8504
0
    }
8505
8506
    /* customization of the validation */
8507
318k
    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
318k
    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
318k
    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
318k
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
8529
125k
        opj_image_destroy(p_j2k->m_private_image);
8530
125k
        p_j2k->m_private_image = NULL;
8531
125k
        return OPJ_FALSE;
8532
125k
    }
8533
8534
192k
    *p_image = opj_image_create0();
8535
192k
    if (!(*p_image)) {
8536
0
        return OPJ_FALSE;
8537
0
    }
8538
8539
    /* Copy codestream image information to the output image */
8540
192k
    opj_copy_image_header(p_j2k->m_private_image, *p_image);
8541
8542
192k
    return OPJ_TRUE;
8543
192k
}
8544
8545
static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
8546
        opj_event_mgr_t * p_manager)
8547
318k
{
8548
    /* preconditions*/
8549
318k
    assert(p_j2k != 00);
8550
318k
    assert(p_manager != 00);
8551
8552
318k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
8553
318k
                                           (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
318k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
8559
318k
                                           (opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager))  {
8560
0
        return OPJ_FALSE;
8561
0
    }
8562
8563
318k
    return OPJ_TRUE;
8564
318k
}
8565
8566
static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
8567
        opj_event_mgr_t * p_manager)
8568
318k
{
8569
    /* preconditions*/
8570
318k
    assert(p_j2k != 00);
8571
318k
    assert(p_manager != 00);
8572
8573
318k
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
8574
318k
                                           (opj_procedure)opj_j2k_build_decoder, p_manager)) {
8575
0
        return OPJ_FALSE;
8576
0
    }
8577
318k
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
8578
318k
                                           (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
318k
    return OPJ_TRUE;
8584
318k
}
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
0
{
8590
0
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8591
0
    OPJ_UINT32 i, j;
8592
8593
    /* preconditions */
8594
0
    assert(p_j2k != 00);
8595
0
    assert(p_stream != 00);
8596
0
    assert(p_manager != 00);
8597
8598
0
    OPJ_UNUSED(p_stream);
8599
0
    OPJ_UNUSED(p_manager);
8600
8601
0
    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
0
    return l_is_valid;
8620
0
}
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
318k
{
8789
    /* add here initialization of cp
8790
       copy paste of setup_decoder */
8791
318k
    (void)p_j2k;
8792
318k
    (void)p_stream;
8793
318k
    (void)p_manager;
8794
318k
    return OPJ_TRUE;
8795
318k
}
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
0
{
8801
    /* add here initialization of cp
8802
       copy paste of setup_encoder */
8803
0
    (void)p_j2k;
8804
0
    (void)p_stream;
8805
0
    (void)p_manager;
8806
0
    return OPJ_TRUE;
8807
0
}
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
0
{
8813
0
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8814
8815
    /* preconditions */
8816
0
    assert(p_j2k != 00);
8817
0
    assert(p_stream != 00);
8818
0
    assert(p_manager != 00);
8819
8820
0
    OPJ_UNUSED(p_stream);
8821
8822
    /* STATE checking */
8823
    /* make sure the state is at 0 */
8824
0
    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
0
    l_is_valid &= (p_j2k->m_procedure_list != 00);
8829
    /* make sure a validation list is present */
8830
0
    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
0
    if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) ||
8836
0
            (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
0
    if ((p_j2k->m_cp.tdx) < (OPJ_UINT32)(1 <<
8843
0
                                         (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
0
    if ((p_j2k->m_cp.tdy) < (OPJ_UINT32)(1 <<
8850
0
                                         (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
0
    return l_is_valid;
8858
0
}
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
318k
{
8865
318k
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8866
8867
    /* preconditions*/
8868
318k
    assert(p_j2k != 00);
8869
318k
    assert(p_stream != 00);
8870
318k
    assert(p_manager != 00);
8871
8872
318k
    OPJ_UNUSED(p_stream);
8873
318k
    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
318k
    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
318k
    l_is_valid &= (p_j2k->m_procedure_list != 00);
8886
    /* make sure a validation list is present */
8887
318k
    l_is_valid &= (p_j2k->m_validation_list != 00);
8888
8889
    /* PARAMETER VALIDATION */
8890
318k
    return l_is_valid;
8891
318k
}
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
192k
{
8897
192k
    opj_j2k_tlm_info_t* l_tlm;
8898
192k
    OPJ_UINT32 i;
8899
192k
    OPJ_OFF_T l_cur_offset;
8900
8901
192k
    assert(p_j2k->cstr_index->main_head_end > 0);
8902
192k
    assert(p_j2k->cstr_index->nb_of_tiles > 0);
8903
192k
    assert(p_j2k->cstr_index->tile_index != NULL);
8904
8905
192k
    l_tlm = &(p_j2k->m_specific_param.m_decoder.m_tlm);
8906
8907
192k
    if (l_tlm->m_entries_count == 0) {
8908
191k
        l_tlm->m_is_invalid = OPJ_TRUE;
8909
191k
        return;
8910
191k
    }
8911
8912
1.23k
    if (l_tlm->m_is_invalid) {
8913
515
        return;
8914
515
    }
8915
8916
    /* Initial pass to count the number of tile-parts per tile */
8917
4.28k
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8918
3.56k
        OPJ_UINT32 l_tile_index_no = l_tlm->m_tile_part_infos[i].m_tile_index;
8919
3.56k
        assert(l_tile_index_no < p_j2k->cstr_index->nb_of_tiles);
8920
3.56k
        p_j2k->cstr_index->tile_index[l_tile_index_no].tileno = l_tile_index_no;
8921
3.56k
        ++p_j2k->cstr_index->tile_index[l_tile_index_no].current_nb_tps;
8922
3.56k
    }
8923
8924
    /* Now check that all tiles have at least one tile-part */
8925
4.28k
    for (i = 0; i < p_j2k->cstr_index->nb_of_tiles; ++i) {
8926
3.60k
        if (p_j2k->cstr_index->tile_index[i].current_nb_tps == 0) {
8927
41
            opj_event_msg(p_manager, EVT_ERROR,
8928
41
                          "opj_j2k_build_tp_index_from_tlm(): tile %d has no "
8929
41
                          "registered tile-part in TLM marker segments.\n", i);
8930
41
            goto error;
8931
41
        }
8932
3.60k
    }
8933
8934
    /* Final pass to fill p_j2k->cstr_index */
8935
683
    l_cur_offset = p_j2k->cstr_index->main_head_end;
8936
3.43k
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8937
2.75k
        OPJ_UINT32 l_tile_index_no = l_tlm->m_tile_part_infos[i].m_tile_index;
8938
2.75k
        opj_tile_index_t* l_tile_index = &
8939
2.75k
                                         (p_j2k->cstr_index->tile_index[l_tile_index_no]);
8940
2.75k
        if (!l_tile_index->tp_index) {
8941
2.75k
            l_tile_index->tp_index = (opj_tp_index_t *) opj_calloc(
8942
2.75k
                                         l_tile_index->current_nb_tps, sizeof(opj_tp_index_t));
8943
2.75k
            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
2.75k
        }
8949
8950
2.75k
        assert(l_tile_index->nb_tps < l_tile_index->current_nb_tps);
8951
2.75k
        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
2.75k
        l_tile_index->tp_index[l_tile_index->nb_tps].end_pos = l_cur_offset +
8956
2.75k
                l_tlm->m_tile_part_infos[i].m_length;
8957
2.75k
        ++l_tile_index->nb_tps;
8958
8959
2.75k
        l_cur_offset += l_tlm->m_tile_part_infos[i].m_length;
8960
2.75k
    }
8961
8962
683
    return;
8963
8964
683
error:
8965
41
    l_tlm->m_is_invalid = OPJ_TRUE;
8966
850
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8967
809
        OPJ_UINT32 l_tile_index = l_tlm->m_tile_part_infos[i].m_tile_index;
8968
809
        p_j2k->cstr_index->tile_index[l_tile_index].current_nb_tps = 0;
8969
809
        opj_free(p_j2k->cstr_index->tile_index[l_tile_index].tp_index);
8970
809
        p_j2k->cstr_index->tile_index[l_tile_index].tp_index = NULL;
8971
809
    }
8972
41
}
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
318k
{
8978
318k
    OPJ_UINT32 l_current_marker;
8979
318k
    OPJ_UINT32 l_marker_size;
8980
318k
    const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
8981
318k
    OPJ_BOOL l_has_siz = 0;
8982
318k
    OPJ_BOOL l_has_cod = 0;
8983
318k
    OPJ_BOOL l_has_qcd = 0;
8984
8985
    /* preconditions */
8986
318k
    assert(p_stream != 00);
8987
318k
    assert(p_j2k != 00);
8988
318k
    assert(p_manager != 00);
8989
8990
    /*  We enter in the main header */
8991
318k
    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
318k
    if (! opj_j2k_read_soc(p_j2k, p_stream, p_manager)) {
8995
91.5k
        opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
8996
91.5k
        return OPJ_FALSE;
8997
91.5k
    }
8998
8999
    /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9000
226k
    if (opj_stream_read_data(p_stream,
9001
226k
                             p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9002
12
        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9003
12
        return OPJ_FALSE;
9004
12
    }
9005
9006
    /* Read 2 bytes as the new marker ID */
9007
226k
    opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9008
226k
                   &l_current_marker, 2);
9009
9010
    /* Try to read until the SOT is detected */
9011
987k
    while (l_current_marker != J2K_MS_SOT) {
9012
9013
        /* Check if the current marker ID is valid */
9014
828k
        if (l_current_marker < 0xff00) {
9015
2.79k
            opj_event_msg(p_manager, EVT_ERROR,
9016
2.79k
                          "A marker ID was expected (0xff--) instead of %.8x\n", l_current_marker);
9017
2.79k
            return OPJ_FALSE;
9018
2.79k
        }
9019
9020
        /* Get the marker handler from the marker ID */
9021
825k
        l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9022
9023
        /* Manage case where marker is unknown */
9024
825k
        if (l_marker_handler->id == J2K_MS_UNK) {
9025
96.3k
            if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)) {
9026
2.18k
                opj_event_msg(p_manager, EVT_ERROR,
9027
2.18k
                              "Unknown marker has been detected and generated error.\n");
9028
2.18k
                return OPJ_FALSE;
9029
2.18k
            }
9030
9031
94.1k
            if (l_current_marker == J2K_MS_SOT) {
9032
35.3k
                break;    /* SOT marker is detected main header is completely read */
9033
58.8k
            } else { /* Get the marker handler from the marker ID */
9034
58.8k
                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9035
58.8k
            }
9036
94.1k
        }
9037
9038
788k
        if (l_marker_handler->id == J2K_MS_SIZ) {
9039
            /* Mark required SIZ marker as found */
9040
226k
            l_has_siz = 1;
9041
226k
        }
9042
788k
        if (l_marker_handler->id == J2K_MS_COD) {
9043
            /* Mark required COD marker as found */
9044
249k
            l_has_cod = 1;
9045
249k
        }
9046
788k
        if (l_marker_handler->id == J2K_MS_QCD) {
9047
            /* Mark required QCD marker as found */
9048
228k
            l_has_qcd = 1;
9049
228k
        }
9050
9051
        /* Check if the marker is known and if it is the right place to find it */
9052
788k
        if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
9053
607
            opj_event_msg(p_manager, EVT_ERROR,
9054
607
                          "Marker is not compliant with its position\n");
9055
607
            return OPJ_FALSE;
9056
607
        }
9057
9058
        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9059
787k
        if (opj_stream_read_data(p_stream,
9060
787k
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9061
276
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9062
276
            return OPJ_FALSE;
9063
276
        }
9064
9065
        /* read 2 bytes as the marker size */
9066
787k
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
9067
787k
                       2);
9068
787k
        if (l_marker_size < 2) {
9069
394
            opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
9070
394
            return OPJ_FALSE;
9071
394
        }
9072
786k
        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
786k
        if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
9076
2.71k
            OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(
9077
2.71k
                                            p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
9078
2.71k
            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
2.71k
            p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
9086
2.71k
            p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
9087
2.71k
        }
9088
9089
        /* Try to read the rest of the marker segment from stream and copy them into the buffer */
9090
786k
        if (opj_stream_read_data(p_stream,
9091
786k
                                 p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
9092
786k
                                 p_manager) != l_marker_size) {
9093
917
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9094
917
            return OPJ_FALSE;
9095
917
        }
9096
9097
        /* Read the marker segment with the correct marker handler */
9098
785k
        if (!(*(l_marker_handler->handler))(p_j2k,
9099
785k
                                            p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
9100
25.1k
            opj_event_msg(p_manager, EVT_ERROR,
9101
25.1k
                          "Marker handler function failed to read the marker segment\n");
9102
25.1k
            return OPJ_FALSE;
9103
25.1k
        }
9104
9105
        /* Add the marker to the codestream index*/
9106
760k
        if (OPJ_FALSE == opj_j2k_add_mhmarker(
9107
760k
                    p_j2k->cstr_index,
9108
760k
                    l_marker_handler->id,
9109
760k
                    (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
9110
760k
                    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
760k
        if (opj_stream_read_data(p_stream,
9117
760k
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9118
253
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9119
253
            return OPJ_FALSE;
9120
253
        }
9121
9122
        /* read 2 bytes as the new marker ID */
9123
760k
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9124
760k
                       &l_current_marker, 2);
9125
760k
    }
9126
9127
193k
    if (l_has_siz == 0) {
9128
33
        opj_event_msg(p_manager, EVT_ERROR,
9129
33
                      "required SIZ marker not found in main header\n");
9130
33
        return OPJ_FALSE;
9131
33
    }
9132
193k
    if (l_has_cod == 0) {
9133
499
        opj_event_msg(p_manager, EVT_ERROR,
9134
499
                      "required COD marker not found in main header\n");
9135
499
        return OPJ_FALSE;
9136
499
    }
9137
193k
    if (l_has_qcd == 0) {
9138
742
        opj_event_msg(p_manager, EVT_ERROR,
9139
742
                      "required QCD marker not found in main header\n");
9140
742
        return OPJ_FALSE;
9141
742
    }
9142
9143
192k
    if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) {
9144
435
        opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n");
9145
435
        return OPJ_FALSE;
9146
435
    }
9147
9148
192k
    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
192k
    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
192k
    opj_j2k_build_tp_index_from_tlm(p_j2k, p_manager);
9155
9156
    /* Next step: read a tile-part header */
9157
192k
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
9158
9159
192k
    return OPJ_TRUE;
9160
192k
}
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
828k
{
9167
828k
    OPJ_BOOL(** l_procedure)(opj_j2k_t *, opj_stream_private_t *,
9168
828k
                             opj_event_mgr_t *) = 00;
9169
828k
    OPJ_BOOL l_result = OPJ_TRUE;
9170
828k
    OPJ_UINT32 l_nb_proc, i;
9171
9172
    /* preconditions*/
9173
828k
    assert(p_procedure_list != 00);
9174
828k
    assert(p_j2k != 00);
9175
828k
    assert(p_stream != 00);
9176
828k
    assert(p_manager != 00);
9177
9178
828k
    l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
9179
828k
    l_procedure = (OPJ_BOOL(**)(opj_j2k_t *, opj_stream_private_t *,
9180
828k
                                opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
9181
9182
2.29M
    for (i = 0; i < l_nb_proc; ++i) {
9183
1.46M
        l_result = l_result && ((*l_procedure)(p_j2k, p_stream, p_manager));
9184
1.46M
        ++l_procedure;
9185
1.46M
    }
9186
9187
    /* and clear the procedure list at the end.*/
9188
828k
    opj_procedure_list_clear(p_procedure_list);
9189
828k
    return l_result;
9190
828k
}
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
192k
{
9198
192k
    opj_tcp_t * l_tcp = 00;
9199
192k
    opj_tcp_t * l_default_tcp = 00;
9200
192k
    OPJ_UINT32 l_nb_tiles;
9201
192k
    OPJ_UINT32 i, j;
9202
192k
    opj_tccp_t *l_current_tccp = 00;
9203
192k
    OPJ_UINT32 l_tccp_size;
9204
192k
    OPJ_UINT32 l_mct_size;
9205
192k
    opj_image_t * l_image;
9206
192k
    OPJ_UINT32 l_mcc_records_size, l_mct_records_size;
9207
192k
    opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
9208
192k
    opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
9209
192k
    OPJ_UINT32 l_offset;
9210
9211
    /* preconditions */
9212
192k
    assert(p_j2k != 00);
9213
192k
    assert(p_stream != 00);
9214
192k
    assert(p_manager != 00);
9215
9216
192k
    OPJ_UNUSED(p_stream);
9217
9218
192k
    l_image = p_j2k->m_private_image;
9219
192k
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
9220
192k
    l_tcp = p_j2k->m_cp.tcps;
9221
192k
    l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
9222
192k
    l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
9223
192k
    l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(
9224
192k
                     OPJ_FLOAT32);
9225
9226
    /* For each tile */
9227
4.10M
    for (i = 0; i < l_nb_tiles; ++i) {
9228
        /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
9229
3.90M
        l_current_tccp = l_tcp->tccps;
9230
        /*Copy default coding parameters into the current tile coding parameters*/
9231
3.90M
        memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
9232
        /* Initialize some values of the current tile coding parameters*/
9233
3.90M
        l_tcp->cod = 0;
9234
3.90M
        l_tcp->ppt = 0;
9235
3.90M
        l_tcp->ppt_data = 00;
9236
3.90M
        l_tcp->m_current_tile_part_number = -1;
9237
        /* Remove memory not owned by this tile in case of early error return. */
9238
3.90M
        l_tcp->m_mct_decoding_matrix = 00;
9239
3.90M
        l_tcp->m_nb_max_mct_records = 0;
9240
3.90M
        l_tcp->m_mct_records = 00;
9241
3.90M
        l_tcp->m_nb_max_mcc_records = 0;
9242
3.90M
        l_tcp->m_mcc_records = 00;
9243
        /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
9244
3.90M
        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
3.90M
        if (l_default_tcp->m_mct_decoding_matrix) {
9248
0
            l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
9249
0
            if (! l_tcp->m_mct_decoding_matrix) {
9250
0
                return OPJ_FALSE;
9251
0
            }
9252
0
            memcpy(l_tcp->m_mct_decoding_matrix, l_default_tcp->m_mct_decoding_matrix,
9253
0
                   l_mct_size);
9254
0
        }
9255
9256
        /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
9257
3.90M
        l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(
9258
3.90M
                                 opj_mct_data_t);
9259
3.90M
        l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
9260
3.90M
        if (! l_tcp->m_mct_records) {
9261
0
            return OPJ_FALSE;
9262
0
        }
9263
3.90M
        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
3.90M
        l_src_mct_rec = l_default_tcp->m_mct_records;
9267
3.90M
        l_dest_mct_rec = l_tcp->m_mct_records;
9268
9269
4.85M
        for (j = 0; j < l_default_tcp->m_nb_mct_records; ++j) {
9270
9271
944k
            if (l_src_mct_rec->m_data) {
9272
9273
465k
                l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
9274
465k
                if (! l_dest_mct_rec->m_data) {
9275
0
                    return OPJ_FALSE;
9276
0
                }
9277
465k
                memcpy(l_dest_mct_rec->m_data, l_src_mct_rec->m_data,
9278
465k
                       l_src_mct_rec->m_data_size);
9279
465k
            }
9280
9281
944k
            ++l_src_mct_rec;
9282
944k
            ++l_dest_mct_rec;
9283
            /* Update with each pass to free exactly what has been allocated on early return. */
9284
944k
            l_tcp->m_nb_max_mct_records += 1;
9285
944k
        }
9286
9287
        /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
9288
3.90M
        l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(
9289
3.90M
                                 opj_simple_mcc_decorrelation_data_t);
9290
3.90M
        l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(
9291
3.90M
                                   l_mcc_records_size);
9292
3.90M
        if (! l_tcp->m_mcc_records) {
9293
0
            return OPJ_FALSE;
9294
0
        }
9295
3.90M
        memcpy(l_tcp->m_mcc_records, l_default_tcp->m_mcc_records, l_mcc_records_size);
9296
3.90M
        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
3.90M
        l_src_mcc_rec = l_default_tcp->m_mcc_records;
9300
3.90M
        l_dest_mcc_rec = l_tcp->m_mcc_records;
9301
9302
43.0M
        for (j = 0; j < l_default_tcp->m_nb_max_mcc_records; ++j) {
9303
9304
39.0M
            if (l_src_mcc_rec->m_decorrelation_array) {
9305
0
                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array -
9306
0
                                        l_default_tcp->m_mct_records);
9307
0
                l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
9308
0
            }
9309
9310
39.0M
            if (l_src_mcc_rec->m_offset_array) {
9311
0
                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array -
9312
0
                                        l_default_tcp->m_mct_records);
9313
0
                l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
9314
0
            }
9315
9316
39.0M
            ++l_src_mcc_rec;
9317
39.0M
            ++l_dest_mcc_rec;
9318
39.0M
        }
9319
9320
        /* Copy all the dflt_tile_compo_cp to the current tile cp */
9321
3.90M
        memcpy(l_current_tccp, l_default_tcp->tccps, l_tccp_size);
9322
9323
        /* Move to next tile cp*/
9324
3.90M
        ++l_tcp;
9325
3.90M
    }
9326
9327
    /* Create the current tile decoder*/
9328
192k
    p_j2k->m_tcd = opj_tcd_create(OPJ_TRUE);
9329
192k
    if (! p_j2k->m_tcd) {
9330
0
        return OPJ_FALSE;
9331
0
    }
9332
9333
192k
    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
192k
    return OPJ_TRUE;
9341
192k
}
9342
9343
static const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler(
9344
    OPJ_UINT32 p_id)
9345
3.80M
{
9346
3.80M
    const opj_dec_memory_marker_handler_t *e;
9347
64.5M
    for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
9348
61.9M
        if (e->id == p_id) {
9349
1.24M
            break; /* we find a handler corresponding to the marker ID*/
9350
1.24M
        }
9351
61.9M
    }
9352
3.80M
    return e;
9353
3.80M
}
9354
9355
void opj_j2k_destroy(opj_j2k_t *p_j2k)
9356
365k
{
9357
365k
    if (p_j2k == 00) {
9358
0
        return;
9359
0
    }
9360
9361
365k
    if (p_j2k->m_is_decoder) {
9362
9363
365k
        if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
9364
365k
            opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
9365
365k
            opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
9366
365k
            p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
9367
365k
        }
9368
9369
365k
        if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
9370
365k
            opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9371
365k
            p_j2k->m_specific_param.m_decoder.m_header_data = 00;
9372
365k
            p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9373
365k
        }
9374
9375
365k
        opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
9376
365k
        p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = 00;
9377
365k
        p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
9378
9379
365k
        opj_free(p_j2k->m_specific_param.m_decoder.m_tlm.m_tile_part_infos);
9380
365k
        p_j2k->m_specific_param.m_decoder.m_tlm.m_tile_part_infos = NULL;
9381
9382
365k
        opj_free(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset);
9383
365k
        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset = NULL;
9384
9385
365k
    } else {
9386
9387
0
        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
9388
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
9389
0
            p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
9390
0
        }
9391
9392
0
        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
0
        if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
9399
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
9400
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
9401
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
9402
0
        }
9403
0
    }
9404
9405
365k
    opj_tcd_destroy(p_j2k->m_tcd);
9406
9407
365k
    opj_j2k_cp_destroy(&(p_j2k->m_cp));
9408
365k
    memset(&(p_j2k->m_cp), 0, sizeof(opj_cp_t));
9409
9410
365k
    opj_procedure_list_destroy(p_j2k->m_procedure_list);
9411
365k
    p_j2k->m_procedure_list = 00;
9412
9413
365k
    opj_procedure_list_destroy(p_j2k->m_validation_list);
9414
365k
    p_j2k->m_procedure_list = 00;
9415
9416
365k
    j2k_destroy_cstr_index(p_j2k->cstr_index);
9417
365k
    p_j2k->cstr_index = NULL;
9418
9419
365k
    opj_image_destroy(p_j2k->m_private_image);
9420
365k
    p_j2k->m_private_image = NULL;
9421
9422
365k
    opj_image_destroy(p_j2k->m_output_image);
9423
365k
    p_j2k->m_output_image = NULL;
9424
9425
365k
    opj_thread_pool_destroy(p_j2k->m_tp);
9426
365k
    p_j2k->m_tp = NULL;
9427
9428
365k
    opj_free(p_j2k);
9429
365k
}
9430
9431
void j2k_destroy_cstr_index(opj_codestream_index_t *p_cstr_ind)
9432
365k
{
9433
365k
    if (p_cstr_ind) {
9434
9435
365k
        if (p_cstr_ind->marker) {
9436
365k
            opj_free(p_cstr_ind->marker);
9437
365k
            p_cstr_ind->marker = NULL;
9438
365k
        }
9439
9440
365k
        if (p_cstr_ind->tile_index) {
9441
214k
            OPJ_UINT32 it_tile = 0;
9442
9443
5.07M
            for (it_tile = 0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
9444
9445
4.85M
                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
4.85M
                if (p_cstr_ind->tile_index[it_tile].tp_index) {
9451
325k
                    opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
9452
325k
                    p_cstr_ind->tile_index[it_tile].tp_index = NULL;
9453
325k
                }
9454
9455
4.85M
                if (p_cstr_ind->tile_index[it_tile].marker) {
9456
4.85M
                    opj_free(p_cstr_ind->tile_index[it_tile].marker);
9457
4.85M
                    p_cstr_ind->tile_index[it_tile].marker = NULL;
9458
9459
4.85M
                }
9460
4.85M
            }
9461
9462
214k
            opj_free(p_cstr_ind->tile_index);
9463
214k
            p_cstr_ind->tile_index = NULL;
9464
214k
        }
9465
9466
365k
        opj_free(p_cstr_ind);
9467
365k
    }
9468
365k
}
9469
9470
static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp)
9471
5.25M
{
9472
5.25M
    if (p_tcp == 00) {
9473
0
        return;
9474
0
    }
9475
9476
5.25M
    if (p_tcp->ppt_markers != 00) {
9477
75
        OPJ_UINT32 i;
9478
3.76k
        for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
9479
3.68k
            if (p_tcp->ppt_markers[i].m_data != NULL) {
9480
79
                opj_free(p_tcp->ppt_markers[i].m_data);
9481
79
            }
9482
3.68k
        }
9483
75
        p_tcp->ppt_markers_count = 0U;
9484
75
        opj_free(p_tcp->ppt_markers);
9485
75
        p_tcp->ppt_markers = NULL;
9486
75
    }
9487
9488
5.25M
    if (p_tcp->ppt_buffer != 00) {
9489
140
        opj_free(p_tcp->ppt_buffer);
9490
140
        p_tcp->ppt_buffer = 00;
9491
140
    }
9492
9493
5.25M
    if (p_tcp->tccps != 00) {
9494
5.07M
        opj_free(p_tcp->tccps);
9495
5.07M
        p_tcp->tccps = 00;
9496
5.07M
    }
9497
9498
5.25M
    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
5.25M
    if (p_tcp->m_mct_decoding_matrix != 00) {
9504
0
        opj_free(p_tcp->m_mct_decoding_matrix);
9505
0
        p_tcp->m_mct_decoding_matrix = 00;
9506
0
    }
9507
9508
5.25M
    if (p_tcp->m_mcc_records) {
9509
4.12M
        opj_free(p_tcp->m_mcc_records);
9510
4.12M
        p_tcp->m_mcc_records = 00;
9511
4.12M
        p_tcp->m_nb_max_mcc_records = 0;
9512
4.12M
        p_tcp->m_nb_mcc_records = 0;
9513
4.12M
    }
9514
9515
5.25M
    if (p_tcp->m_mct_records) {
9516
4.12M
        opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
9517
4.12M
        OPJ_UINT32 i;
9518
9519
5.07M
        for (i = 0; i < p_tcp->m_nb_mct_records; ++i) {
9520
950k
            if (l_mct_data->m_data) {
9521
467k
                opj_free(l_mct_data->m_data);
9522
467k
                l_mct_data->m_data = 00;
9523
467k
            }
9524
9525
950k
            ++l_mct_data;
9526
950k
        }
9527
9528
4.12M
        opj_free(p_tcp->m_mct_records);
9529
4.12M
        p_tcp->m_mct_records = 00;
9530
4.12M
    }
9531
9532
5.25M
    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
5.25M
    opj_j2k_tcp_data_destroy(p_tcp);
9538
9539
5.25M
}
9540
9541
static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp)
9542
5.39M
{
9543
5.39M
    if (p_tcp->m_data) {
9544
316k
        opj_free(p_tcp->m_data);
9545
316k
        p_tcp->m_data = NULL;
9546
316k
        p_tcp->m_data_size = 0;
9547
316k
    }
9548
5.39M
}
9549
9550
static void opj_j2k_cp_destroy(opj_cp_t *p_cp)
9551
365k
{
9552
365k
    OPJ_UINT32 l_nb_tiles;
9553
365k
    opj_tcp_t * l_current_tile = 00;
9554
9555
365k
    if (p_cp == 00) {
9556
0
        return;
9557
0
    }
9558
365k
    if (p_cp->tcps != 00) {
9559
214k
        OPJ_UINT32 i;
9560
214k
        l_current_tile = p_cp->tcps;
9561
214k
        l_nb_tiles = p_cp->th * p_cp->tw;
9562
9563
5.07M
        for (i = 0U; i < l_nb_tiles; ++i) {
9564
4.85M
            opj_j2k_tcp_destroy(l_current_tile);
9565
4.85M
            ++l_current_tile;
9566
4.85M
        }
9567
214k
        opj_free(p_cp->tcps);
9568
214k
        p_cp->tcps = 00;
9569
214k
    }
9570
365k
    if (p_cp->ppm_markers != 00) {
9571
1.13k
        OPJ_UINT32 i;
9572
68.6k
        for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
9573
67.4k
            if (p_cp->ppm_markers[i].m_data != NULL) {
9574
2.10k
                opj_free(p_cp->ppm_markers[i].m_data);
9575
2.10k
            }
9576
67.4k
        }
9577
1.13k
        p_cp->ppm_markers_count = 0U;
9578
1.13k
        opj_free(p_cp->ppm_markers);
9579
1.13k
        p_cp->ppm_markers = NULL;
9580
1.13k
    }
9581
365k
    opj_free(p_cp->ppm_buffer);
9582
365k
    p_cp->ppm_buffer = 00;
9583
365k
    p_cp->ppm_data =
9584
365k
        NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
9585
365k
    opj_free(p_cp->comment);
9586
365k
    p_cp->comment = 00;
9587
365k
    if (! p_cp->m_is_decoder) {
9588
0
        opj_free(p_cp->m_specific_param.m_enc.m_matrice);
9589
0
        p_cp->m_specific_param.m_enc.m_matrice = 00;
9590
0
    }
9591
365k
}
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
1.10k
{
9597
1.10k
    OPJ_BYTE   l_header_data[10];
9598
1.10k
    OPJ_OFF_T  l_stream_pos_backup;
9599
1.10k
    OPJ_UINT32 l_current_marker;
9600
1.10k
    OPJ_UINT32 l_marker_size;
9601
1.10k
    OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts;
9602
9603
    /* initialize to no correction needed */
9604
1.10k
    *p_correction_needed = OPJ_FALSE;
9605
9606
1.10k
    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
1.10k
    l_stream_pos_backup = opj_stream_tell(p_stream);
9612
1.10k
    if (l_stream_pos_backup == -1) {
9613
        /* let's do nothing */
9614
0
        return OPJ_TRUE;
9615
0
    }
9616
9617
3.62k
    for (;;) {
9618
        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9619
3.62k
        if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
9620
            /* assume all is OK */
9621
2
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9622
0
                return OPJ_FALSE;
9623
0
            }
9624
2
            return OPJ_TRUE;
9625
2
        }
9626
9627
        /* Read 2 bytes from buffer as the new marker ID */
9628
3.62k
        opj_read_bytes(l_header_data, &l_current_marker, 2);
9629
9630
3.62k
        if (l_current_marker != J2K_MS_SOT) {
9631
            /* assume all is OK */
9632
925
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9633
0
                return OPJ_FALSE;
9634
0
            }
9635
925
            return OPJ_TRUE;
9636
925
        }
9637
9638
        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9639
2.69k
        if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
9640
1
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9641
1
            return OPJ_FALSE;
9642
1
        }
9643
9644
        /* Read 2 bytes from the buffer as the marker size */
9645
2.69k
        opj_read_bytes(l_header_data, &l_marker_size, 2);
9646
9647
        /* Check marker size for SOT Marker */
9648
2.69k
        if (l_marker_size != 10) {
9649
44
            opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
9650
44
            return OPJ_FALSE;
9651
44
        }
9652
2.65k
        l_marker_size -= 2;
9653
9654
2.65k
        if (opj_stream_read_data(p_stream, l_header_data, l_marker_size,
9655
2.65k
                                 p_manager) != l_marker_size) {
9656
4
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9657
4
            return OPJ_FALSE;
9658
4
        }
9659
9660
2.64k
        if (! opj_j2k_get_sot_values(l_header_data, l_marker_size, &l_tile_no,
9661
2.64k
                                     &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
9662
0
            return OPJ_FALSE;
9663
0
        }
9664
9665
2.64k
        if (l_tile_no == tile_no) {
9666
            /* we found what we were looking for */
9667
33
            break;
9668
33
        }
9669
9670
2.61k
        if (l_tot_len < 14U) {
9671
            /* last SOT until EOC or invalid Psot value */
9672
            /* assume all is OK */
9673
24
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9674
0
                return OPJ_FALSE;
9675
0
            }
9676
24
            return OPJ_TRUE;
9677
24
        }
9678
2.58k
        l_tot_len -= 12U;
9679
        /* look for next SOT marker */
9680
2.58k
        if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len),
9681
2.58k
                            p_manager) != (OPJ_OFF_T)(l_tot_len)) {
9682
            /* assume all is OK */
9683
67
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9684
0
                return OPJ_FALSE;
9685
0
            }
9686
67
            return OPJ_TRUE;
9687
67
        }
9688
2.58k
    }
9689
9690
    /* check for correction */
9691
33
    if (l_current_part == l_num_parts) {
9692
6
        *p_correction_needed = OPJ_TRUE;
9693
6
    }
9694
9695
33
    if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9696
0
        return OPJ_FALSE;
9697
0
    }
9698
33
    return OPJ_TRUE;
9699
33
}
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
196k
{
9711
196k
    OPJ_UINT32 l_current_marker = J2K_MS_SOT;
9712
196k
    OPJ_UINT32 l_marker_size;
9713
196k
    const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
9714
196k
    opj_tcp_t * l_tcp = NULL;
9715
196k
    const OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
9716
9717
    /* preconditions */
9718
196k
    assert(p_stream != 00);
9719
196k
    assert(p_j2k != 00);
9720
196k
    assert(p_manager != 00);
9721
9722
    /* Reach the End Of Codestream ?*/
9723
196k
    if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
9724
1.18k
        l_current_marker = J2K_MS_EOC;
9725
1.18k
    }
9726
    /* We need to encounter a SOT marker (a new tile-part header) */
9727
194k
    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
535k
    while ((!p_j2k->m_specific_param.m_decoder.m_can_decode) &&
9733
507k
            (l_current_marker != J2K_MS_EOC)) {
9734
9735
505k
        if (p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts > 0 &&
9736
0
                p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts <
9737
0
                p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts) {
9738
0
            OPJ_OFF_T next_tp_sot_pos;
9739
9740
0
            next_tp_sot_pos =
9741
0
                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
0
            ++p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts;
9743
0
            if (!(opj_stream_read_seek(p_stream,
9744
0
                                       next_tp_sot_pos,
9745
0
                                       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
0
            if (opj_stream_read_data(p_stream,
9752
0
                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9753
0
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9754
0
                return OPJ_FALSE;
9755
0
            }
9756
9757
            /* Read 2 bytes from the buffer as the marker ID */
9758
0
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9759
0
                           &l_current_marker,
9760
0
                           2);
9761
9762
0
            if (l_current_marker != J2K_MS_SOT) {
9763
0
                opj_event_msg(p_manager, EVT_ERROR, "Did not get expected SOT marker\n");
9764
0
                return OPJ_FALSE;
9765
0
            }
9766
0
        }
9767
9768
        /* Try to read until the Start Of Data is detected */
9769
861k
        while (l_current_marker != J2K_MS_SOD) {
9770
9771
520k
            if (opj_stream_get_number_byte_left(p_stream) == 0) {
9772
152k
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9773
152k
                break;
9774
152k
            }
9775
9776
            /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9777
367k
            if (opj_stream_read_data(p_stream,
9778
367k
                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9779
298
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9780
298
                return OPJ_FALSE;
9781
298
            }
9782
9783
            /* Read 2 bytes from the buffer as the marker size */
9784
367k
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
9785
367k
                           2);
9786
9787
            /* Check marker size (does not include marker ID but includes marker size) */
9788
367k
            if (l_marker_size < 2) {
9789
2.52k
                opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
9790
2.52k
                return OPJ_FALSE;
9791
2.52k
            }
9792
9793
            /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
9794
365k
            if (l_current_marker == 0x8080 &&
9795
506
                    opj_stream_get_number_byte_left(p_stream) == 0) {
9796
13
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9797
13
                break;
9798
13
            }
9799
9800
            /* Why this condition? FIXME */
9801
365k
            if ((p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH) &&
9802
12.5k
                    p_j2k->m_specific_param.m_decoder.m_sot_length != 0) {
9803
11.1k
                if (p_j2k->m_specific_param.m_decoder.m_sot_length < l_marker_size + 2) {
9804
548
                    opj_event_msg(p_manager, EVT_ERROR,
9805
548
                                  "Sot length is less than marker size + marker ID\n");
9806
548
                    return OPJ_FALSE;
9807
548
                }
9808
10.6k
                p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
9809
10.6k
            }
9810
364k
            l_marker_size -= 2; /* Subtract the size of the marker ID already read */
9811
9812
            /* Get the marker handler from the marker ID */
9813
364k
            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
364k
            if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
9817
1.78k
                opj_event_msg(p_manager, EVT_ERROR,
9818
1.78k
                              "Marker is not compliant with its position\n");
9819
1.78k
                return OPJ_FALSE;
9820
1.78k
            }
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
362k
            if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
9825
1.81k
                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
1.81k
                if ((OPJ_OFF_T)l_marker_size >  opj_stream_get_number_byte_left(p_stream)) {
9829
1.62k
                    opj_event_msg(p_manager, EVT_ERROR,
9830
1.62k
                                  "Marker size inconsistent with stream length\n");
9831
1.62k
                    return OPJ_FALSE;
9832
1.62k
                }
9833
195
                new_header_data = (OPJ_BYTE *) opj_realloc(
9834
195
                                      p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
9835
195
                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
195
                p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
9843
195
                p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
9844
195
            }
9845
9846
            /* Try to read the rest of the marker segment from stream and copy them into the buffer */
9847
361k
            if (opj_stream_read_data(p_stream,
9848
361k
                                     p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
9849
361k
                                     p_manager) != l_marker_size) {
9850
330
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9851
330
                return OPJ_FALSE;
9852
330
            }
9853
9854
360k
            if (!l_marker_handler->handler) {
9855
                /* See issue #175 */
9856
340
                opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
9857
340
                return OPJ_FALSE;
9858
340
            }
9859
            /* Read the marker segment with the correct marker handler */
9860
360k
            if (!(*(l_marker_handler->handler))(p_j2k,
9861
360k
                                                p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
9862
4.47k
                opj_event_msg(p_manager, EVT_ERROR,
9863
4.47k
                              "Fail to read the current marker segment (%#x)\n", l_current_marker);
9864
4.47k
                return OPJ_FALSE;
9865
4.47k
            }
9866
9867
            /* Add the marker to the codestream index*/
9868
355k
            if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
9869
355k
                                                  p_j2k->cstr_index,
9870
355k
                                                  l_marker_handler->id,
9871
355k
                                                  (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
9872
355k
                                                  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
355k
            if (l_marker_handler->id == J2K_MS_SOT) {
9879
345k
                OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4
9880
345k
                                     ;
9881
345k
                if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos) {
9882
345k
                    p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
9883
345k
                }
9884
345k
            }
9885
9886
355k
            if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
9887
                /* Skip the rest of the tile part header*/
9888
0
                if (opj_stream_skip(p_stream, p_j2k->m_specific_param.m_decoder.m_sot_length,
9889
0
                                    p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
9890
0
                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9891
0
                    return OPJ_FALSE;
9892
0
                }
9893
0
                l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
9894
355k
            } else {
9895
                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
9896
355k
                if (opj_stream_read_data(p_stream,
9897
355k
                                         p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9898
17
                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9899
17
                    return OPJ_FALSE;
9900
17
                }
9901
                /* Read 2 bytes from the buffer as the new marker ID */
9902
355k
                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9903
355k
                               &l_current_marker, 2);
9904
355k
            }
9905
355k
        }
9906
493k
        if (opj_stream_get_number_byte_left(p_stream) == 0
9907
152k
                && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
9908
152k
            break;
9909
152k
        }
9910
9911
        /* If we didn't skip data before, we need to read the SOD marker*/
9912
341k
        if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
9913
            /* Try to read the SOD marker and skip data ? FIXME */
9914
341k
            if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
9915
1.01k
                return OPJ_FALSE;
9916
1.01k
            }
9917
9918
            /* Check if we can use the TLM index to access the next tile-part */
9919
340k
            if (!p_j2k->m_specific_param.m_decoder.m_can_decode &&
9920
311k
                    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
340k
            if (p_j2k->m_specific_param.m_decoder.m_can_decode &&
9972
28.7k
                    !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) {
9973
                /* Issue 254 */
9974
26.5k
                OPJ_BOOL l_correction_needed = OPJ_FALSE;
9975
9976
26.5k
                p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
9977
26.5k
                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
25.4k
                } else if (!opj_j2k_need_nb_tile_parts_correction(p_stream,
9988
1.10k
                           p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
9989
49
                    opj_event_msg(p_manager, EVT_ERROR,
9990
49
                                  "opj_j2k_apply_nb_tile_parts_correction error\n");
9991
49
                    return OPJ_FALSE;
9992
49
                }
9993
26.4k
                if (l_correction_needed) {
9994
6
                    OPJ_UINT32 l_tile_no;
9995
9996
6
                    p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
9997
6
                    p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1;
9998
                    /* correct tiles */
9999
278
                    for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
10000
272
                        if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) {
10001
24
                            p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts += 1;
10002
24
                        }
10003
272
                    }
10004
6
                    opj_event_msg(p_manager, EVT_WARNING,
10005
6
                                  "Non conformant codestream TPsot==TNsot.\n");
10006
6
                }
10007
26.4k
            }
10008
340k
        } else {
10009
            /* Indicate we will try to read a new tile-part header*/
10010
0
            p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
10011
0
            p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
10012
0
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
10013
0
        }
10014
10015
340k
        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
311k
            if (opj_stream_read_data(p_stream,
10018
311k
                                     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
515
                if (p_j2k->m_current_tile_number + 1 == l_nb_tiles) {
10024
219
                    OPJ_UINT32 l_tile_no;
10025
500
                    for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
10026
292
                        if (p_j2k->m_cp.tcps[l_tile_no].m_current_tile_part_number == 0 &&
10027
224
                                p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts == 0) {
10028
11
                            break;
10029
11
                        }
10030
292
                    }
10031
219
                    if (l_tile_no < l_nb_tiles) {
10032
11
                        opj_event_msg(p_manager, EVT_INFO,
10033
11
                                      "Tile %u has TPsot == 0 and TNsot == 0, "
10034
11
                                      "but no other tile-parts were found. "
10035
11
                                      "EOC is also missing.\n",
10036
11
                                      l_tile_no);
10037
11
                        p_j2k->m_current_tile_number = l_tile_no;
10038
11
                        l_current_marker = J2K_MS_EOC;
10039
11
                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10040
11
                        break;
10041
11
                    }
10042
219
                }
10043
10044
504
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
10045
504
                return OPJ_FALSE;
10046
515
            }
10047
10048
            /* Read 2 bytes from buffer as the new marker ID */
10049
310k
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
10050
310k
                           &l_current_marker, 2);
10051
310k
        }
10052
340k
    }
10053
10054
    /* Current marker is the EOC marker ?*/
10055
182k
    if (l_current_marker == J2K_MS_EOC) {
10056
1.40k
        if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
10057
200
            p_j2k->m_current_tile_number = 0;
10058
200
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10059
200
        }
10060
1.40k
    }
10061
10062
    /* Deal with tiles that have a single tile-part with TPsot == 0 and TNsot == 0 */
10063
182k
    if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
10064
153k
        l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
10065
10066
319k
        while ((p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00)) {
10067
165k
            ++p_j2k->m_current_tile_number;
10068
165k
            ++l_tcp;
10069
165k
        }
10070
10071
153k
        if (p_j2k->m_current_tile_number == l_nb_tiles) {
10072
968
            *p_go_on = OPJ_FALSE;
10073
968
            return OPJ_TRUE;
10074
968
        }
10075
153k
    }
10076
10077
181k
    if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number,
10078
181k
                            p_manager)) {
10079
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n");
10080
0
        return OPJ_FALSE;
10081
0
    }
10082
    /*FIXME ???*/
10083
181k
    if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
10084
181k
                                   p_manager)) {
10085
18
        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
10086
18
        return OPJ_FALSE;
10087
18
    }
10088
10089
181k
    opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
10090
181k
                  p_j2k->m_current_tile_number + 1, (p_j2k->m_cp.th * p_j2k->m_cp.tw));
10091
10092
181k
    *p_tile_index = p_j2k->m_current_tile_number;
10093
181k
    *p_go_on = OPJ_TRUE;
10094
181k
    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
181k
    *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
10103
181k
    *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
10104
181k
    *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
10105
181k
    *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
10106
181k
    *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
10107
10108
181k
    p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
10109
10110
181k
    return OPJ_TRUE;
10111
181k
}
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
181k
{
10120
181k
    OPJ_UINT32 l_current_marker;
10121
181k
    OPJ_BYTE l_data [2];
10122
181k
    opj_tcp_t * l_tcp;
10123
181k
    opj_image_t* l_image_for_bounds;
10124
10125
    /* preconditions */
10126
181k
    assert(p_stream != 00);
10127
181k
    assert(p_j2k != 00);
10128
181k
    assert(p_manager != 00);
10129
10130
181k
    if (!(p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_DATA)
10131
181k
            || (p_tile_index != p_j2k->m_current_tile_number)) {
10132
0
        return OPJ_FALSE;
10133
0
    }
10134
10135
181k
    l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
10136
181k
    if (! l_tcp->m_data) {
10137
35
        opj_j2k_tcp_destroy(l_tcp);
10138
35
        return OPJ_FALSE;
10139
35
    }
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
181k
    l_image_for_bounds = p_j2k->m_output_image ? p_j2k->m_output_image :
10147
181k
                         p_j2k->m_private_image;
10148
181k
    if (! opj_tcd_decode_tile(p_j2k->m_tcd,
10149
181k
                              l_image_for_bounds->x0,
10150
181k
                              l_image_for_bounds->y0,
10151
181k
                              l_image_for_bounds->x1,
10152
181k
                              l_image_for_bounds->y1,
10153
181k
                              p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode,
10154
181k
                              p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
10155
181k
                              l_tcp->m_data,
10156
181k
                              l_tcp->m_data_size,
10157
181k
                              p_tile_index,
10158
181k
                              p_j2k->cstr_index, p_manager)) {
10159
33.1k
        opj_j2k_tcp_destroy(l_tcp);
10160
33.1k
        p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
10161
33.1k
        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
10162
33.1k
        return OPJ_FALSE;
10163
33.1k
    }
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
148k
    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
148k
    p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
10181
148k
    p_j2k->m_specific_param.m_decoder.m_state &= (~(OPJ_UINT32)J2K_STATE_DATA);
10182
10183
148k
    if (opj_stream_get_number_byte_left(p_stream) == 0
10184
124k
            && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
10185
124k
        return OPJ_TRUE;
10186
124k
    }
10187
10188
23.9k
    if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
10189
23.6k
        if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
10190
170
            opj_event_msg(p_manager, p_j2k->m_cp.strict ? EVT_ERROR : EVT_WARNING,
10191
170
                          "Stream too short\n");
10192
170
            return p_j2k->m_cp.strict ? OPJ_FALSE : OPJ_TRUE;
10193
170
        }
10194
23.5k
        opj_read_bytes(l_data, &l_current_marker, 2);
10195
10196
23.5k
        if (l_current_marker == J2K_MS_EOC) {
10197
1.99k
            p_j2k->m_current_tile_number = 0;
10198
1.99k
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10199
21.5k
        } else if (l_current_marker != J2K_MS_SOT) {
10200
18.6k
            if (opj_stream_get_number_byte_left(p_stream) == 0) {
10201
12.7k
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
10202
12.7k
                opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n");
10203
12.7k
                return OPJ_TRUE;
10204
12.7k
            }
10205
5.86k
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
10206
5.86k
            return OPJ_FALSE;
10207
18.6k
        }
10208
23.5k
    }
10209
10210
5.17k
    return OPJ_TRUE;
10211
23.9k
}
10212
10213
static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd,
10214
        opj_image_t* p_output_image)
10215
141k
{
10216
141k
    OPJ_UINT32 i, j;
10217
141k
    OPJ_UINT32 l_width_src, l_height_src;
10218
141k
    OPJ_UINT32 l_width_dest, l_height_dest;
10219
141k
    OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
10220
141k
    OPJ_SIZE_T l_start_offset_src;
10221
141k
    OPJ_UINT32 l_start_x_dest, l_start_y_dest;
10222
141k
    OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
10223
141k
    OPJ_SIZE_T l_start_offset_dest;
10224
10225
141k
    opj_image_comp_t * l_img_comp_src = 00;
10226
141k
    opj_image_comp_t * l_img_comp_dest = 00;
10227
10228
141k
    opj_tcd_tilecomp_t * l_tilec = 00;
10229
141k
    opj_image_t * l_image_src = 00;
10230
141k
    OPJ_INT32 * l_dest_ptr;
10231
10232
141k
    l_tilec = p_tcd->tcd_image->tiles->comps;
10233
141k
    l_image_src = p_tcd->image;
10234
141k
    l_img_comp_src = l_image_src->comps;
10235
10236
141k
    l_img_comp_dest = p_output_image->comps;
10237
10238
544k
    for (i = 0; i < l_image_src->numcomps;
10239
402k
            i++, ++l_img_comp_dest, ++l_img_comp_src,  ++l_tilec) {
10240
402k
        OPJ_INT32 res_x0, res_x1, res_y0, res_y1;
10241
402k
        OPJ_UINT32 src_data_stride;
10242
402k
        const OPJ_INT32* p_src_data;
10243
10244
        /* Copy info from decoded comp image to output image */
10245
402k
        l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
10246
10247
402k
        if (p_tcd->whole_tile_decoding) {
10248
402k
            opj_tcd_resolution_t* l_res = l_tilec->resolutions +
10249
402k
                                          l_img_comp_src->resno_decoded;
10250
402k
            res_x0 = l_res->x0;
10251
402k
            res_y0 = l_res->y0;
10252
402k
            res_x1 = l_res->x1;
10253
402k
            res_y1 = l_res->y1;
10254
402k
            src_data_stride = (OPJ_UINT32)(
10255
402k
                                  l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x1 -
10256
402k
                                  l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x0);
10257
402k
            p_src_data = l_tilec->data;
10258
402k
        } else {
10259
0
            opj_tcd_resolution_t* l_res = l_tilec->resolutions +
10260
0
                                          l_img_comp_src->resno_decoded;
10261
0
            res_x0 = (OPJ_INT32)l_res->win_x0;
10262
0
            res_y0 = (OPJ_INT32)l_res->win_y0;
10263
0
            res_x1 = (OPJ_INT32)l_res->win_x1;
10264
0
            res_y1 = (OPJ_INT32)l_res->win_y1;
10265
0
            src_data_stride = l_res->win_x1 - l_res->win_x0;
10266
0
            p_src_data = l_tilec->data_win;
10267
0
        }
10268
10269
402k
        if (p_src_data == NULL) {
10270
            /* Happens for partial component decoding */
10271
2.36k
            continue;
10272
2.36k
        }
10273
10274
400k
        l_width_src = (OPJ_UINT32)(res_x1 - res_x0);
10275
400k
        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
400k
        l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor);
10287
400k
        l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor);
10288
400k
        l_x1_dest = l_x0_dest +
10289
400k
                    l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */
10290
400k
        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
400k
        assert(res_x0 >= 0);
10305
400k
        assert(res_x1 >= 0);
10306
400k
        if (l_x0_dest < (OPJ_UINT32)res_x0) {
10307
324k
            l_start_x_dest = (OPJ_UINT32)res_x0 - l_x0_dest;
10308
324k
            l_offset_x0_src = 0;
10309
10310
324k
            if (l_x1_dest >= (OPJ_UINT32)res_x1) {
10311
324k
                l_width_dest = l_width_src;
10312
324k
                l_offset_x1_src = 0;
10313
324k
            } 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
324k
        } else {
10318
75.5k
            l_start_x_dest = 0U;
10319
75.5k
            l_offset_x0_src = (OPJ_INT32)l_x0_dest - res_x0;
10320
10321
75.5k
            if (l_x1_dest >= (OPJ_UINT32)res_x1) {
10322
75.5k
                l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
10323
75.5k
                l_offset_x1_src = 0;
10324
75.5k
            } 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
75.5k
        }
10329
10330
400k
        if (l_y0_dest < (OPJ_UINT32)res_y0) {
10331
61.5k
            l_start_y_dest = (OPJ_UINT32)res_y0 - l_y0_dest;
10332
61.5k
            l_offset_y0_src = 0;
10333
10334
61.5k
            if (l_y1_dest >= (OPJ_UINT32)res_y1) {
10335
61.5k
                l_height_dest = l_height_src;
10336
61.5k
                l_offset_y1_src = 0;
10337
61.5k
            } 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
338k
        } else {
10342
338k
            l_start_y_dest = 0U;
10343
338k
            l_offset_y0_src = (OPJ_INT32)l_y0_dest - res_y0;
10344
10345
338k
            if (l_y1_dest >= (OPJ_UINT32)res_y1) {
10346
338k
                l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
10347
338k
                l_offset_y1_src = 0;
10348
338k
            } 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
338k
        }
10353
10354
400k
        if ((l_offset_x0_src < 0) || (l_offset_y0_src < 0) || (l_offset_x1_src < 0) ||
10355
400k
                (l_offset_y1_src < 0)) {
10356
0
            return OPJ_FALSE;
10357
0
        }
10358
        /* testcase 2977.pdf.asan.67.2198 */
10359
400k
        if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
10360
0
            return OPJ_FALSE;
10361
0
        }
10362
        /*-----*/
10363
10364
        /* Compute the input buffer offset */
10365
400k
        l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src
10366
400k
                             * (OPJ_SIZE_T)src_data_stride;
10367
10368
        /* Compute the output buffer offset */
10369
400k
        l_start_offset_dest = (OPJ_SIZE_T)l_start_x_dest + (OPJ_SIZE_T)l_start_y_dest
10370
400k
                              * (OPJ_SIZE_T)l_img_comp_dest->w;
10371
10372
        /* Allocate output component buffer if necessary */
10373
400k
        if (l_img_comp_dest->data == NULL &&
10374
393k
                l_start_offset_src == 0 && l_start_offset_dest == 0 &&
10375
16.3k
                src_data_stride == l_img_comp_dest->w &&
10376
11.2k
                l_width_dest == l_img_comp_dest->w &&
10377
11.2k
                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
10.4k
            if (p_tcd->whole_tile_decoding) {
10381
10.4k
                l_img_comp_dest->data = l_tilec->data;
10382
10.4k
                l_tilec->data = NULL;
10383
10.4k
            } else {
10384
0
                l_img_comp_dest->data = l_tilec->data_win;
10385
0
                l_tilec->data_win = NULL;
10386
0
            }
10387
10.4k
            continue;
10388
389k
        } else if (l_img_comp_dest->data == NULL) {
10389
383k
            OPJ_SIZE_T l_width = l_img_comp_dest->w;
10390
383k
            OPJ_SIZE_T l_height = l_img_comp_dest->h;
10391
10392
383k
            if ((l_height == 0U) || (l_width > (SIZE_MAX / l_height)) ||
10393
383k
                    l_width * l_height > SIZE_MAX / sizeof(OPJ_INT32)) {
10394
                /* would overflow */
10395
0
                return OPJ_FALSE;
10396
0
            }
10397
383k
            l_img_comp_dest->data = (OPJ_INT32*) opj_image_data_alloc(l_width * l_height *
10398
383k
                                    sizeof(OPJ_INT32));
10399
383k
            if (! l_img_comp_dest->data) {
10400
0
                return OPJ_FALSE;
10401
0
            }
10402
10403
383k
            if (l_img_comp_dest->w != l_width_dest ||
10404
383k
                    l_img_comp_dest->h != l_height_dest) {
10405
383k
                memset(l_img_comp_dest->data, 0,
10406
383k
                       (OPJ_SIZE_T)l_img_comp_dest->w * l_img_comp_dest->h * sizeof(OPJ_INT32));
10407
383k
            }
10408
383k
        }
10409
10410
        /* Move the output buffer to the first place where we will write*/
10411
389k
        l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
10412
10413
389k
        {
10414
389k
            const OPJ_INT32 * l_src_ptr = p_src_data;
10415
389k
            l_src_ptr += l_start_offset_src;
10416
10417
133M
            for (j = 0; j < l_height_dest; ++j) {
10418
132M
                memcpy(l_dest_ptr, l_src_ptr, l_width_dest * sizeof(OPJ_INT32));
10419
132M
                l_dest_ptr += l_img_comp_dest->w;
10420
132M
                l_src_ptr += src_data_stride;
10421
132M
            }
10422
389k
        }
10423
10424
10425
389k
    }
10426
10427
141k
    return OPJ_TRUE;
10428
141k
}
10429
10430
static OPJ_BOOL opj_j2k_update_image_dimensions(opj_image_t* p_image,
10431
        opj_event_mgr_t * p_manager)
10432
192k
{
10433
192k
    OPJ_UINT32 it_comp;
10434
192k
    OPJ_INT32 l_comp_x1, l_comp_y1;
10435
192k
    opj_image_comp_t* l_img_comp = NULL;
10436
10437
192k
    l_img_comp = p_image->comps;
10438
743k
    for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
10439
551k
        OPJ_INT32 l_h, l_w;
10440
551k
        if (p_image->x0 > (OPJ_UINT32)INT_MAX ||
10441
551k
                p_image->y0 > (OPJ_UINT32)INT_MAX ||
10442
551k
                p_image->x1 > (OPJ_UINT32)INT_MAX ||
10443
551k
                p_image->y1 > (OPJ_UINT32)INT_MAX) {
10444
117
            opj_event_msg(p_manager, EVT_ERROR,
10445
117
                          "Image coordinates above INT_MAX are not supported\n");
10446
117
            return OPJ_FALSE;
10447
117
        }
10448
10449
551k
        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
10450
551k
        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
10451
551k
        l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
10452
551k
        l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
10453
10454
551k
        l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
10455
551k
              - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
10456
551k
        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
551k
        l_img_comp->w = (OPJ_UINT32)l_w;
10463
10464
551k
        l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
10465
551k
              - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
10466
551k
        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
551k
        l_img_comp->h = (OPJ_UINT32)l_h;
10473
10474
551k
        l_img_comp++;
10475
551k
    }
10476
10477
192k
    return OPJ_TRUE;
10478
192k
}
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
192k
{
10546
192k
    opj_cp_t * l_cp = &(p_j2k->m_cp);
10547
192k
    opj_image_t * l_image = p_j2k->m_private_image;
10548
192k
    OPJ_BOOL ret;
10549
192k
    OPJ_UINT32 it_comp;
10550
10551
192k
    if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
10552
24.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
192k
    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
744k
    for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
10566
551k
        p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
10567
551k
    }
10568
10569
192k
    if (!p_start_x && !p_start_y && !p_end_x && !p_end_y) {
10570
192k
        opj_event_msg(p_manager, EVT_INFO,
10571
192k
                      "No decoded area parameters, set the decoded area to the whole image\n");
10572
10573
192k
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
10574
192k
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
10575
192k
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
10576
192k
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
10577
10578
192k
        p_image->x0 = l_image->x0;
10579
192k
        p_image->y0 = l_image->y0;
10580
192k
        p_image->x1 = l_image->x1;
10581
192k
        p_image->y1 = l_image->y1;
10582
10583
192k
        return opj_j2k_update_image_dimensions(p_image, p_manager);
10584
192k
    }
10585
10586
    /* ----- */
10587
    /* Check if the positions provided by the user are correct */
10588
10589
    /* Left */
10590
0
    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
0
    } 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
0
    } else if ((OPJ_UINT32)p_start_x < l_image->x0) {
10601
0
        opj_event_msg(p_manager, EVT_WARNING,
10602
0
                      "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
10603
0
                      p_start_x, l_image->x0);
10604
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
10605
0
        p_image->x0 = l_image->x0;
10606
0
    } else {
10607
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x -
10608
0
                l_cp->tx0) / l_cp->tdx;
10609
0
        p_image->x0 = (OPJ_UINT32)p_start_x;
10610
0
    }
10611
10612
    /* Up */
10613
0
    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
0
    } 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
0
    } else if ((OPJ_UINT32)p_start_y < l_image->y0) {
10624
0
        opj_event_msg(p_manager, EVT_WARNING,
10625
0
                      "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
10626
0
                      p_start_y, l_image->y0);
10627
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
10628
0
        p_image->y0 = l_image->y0;
10629
0
    } else {
10630
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y -
10631
0
                l_cp->ty0) / l_cp->tdy;
10632
0
        p_image->y0 = (OPJ_UINT32)p_start_y;
10633
0
    }
10634
10635
    /* Right */
10636
0
    if (p_end_x <= 0) {
10637
0
        opj_event_msg(p_manager, EVT_ERROR,
10638
0
                      "Right position of the decoded area (region_x1=%d) should be > 0.\n",
10639
0
                      p_end_x);
10640
0
        return OPJ_FALSE;
10641
0
    } else if ((OPJ_UINT32)p_end_x < l_image->x0) {
10642
0
        opj_event_msg(p_manager, EVT_ERROR,
10643
0
                      "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
10644
0
                      p_end_x, l_image->x0);
10645
0
        return OPJ_FALSE;
10646
0
    } 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
0
    } else {
10653
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv((
10654
0
                    OPJ_UINT32)p_end_x - l_cp->tx0, l_cp->tdx);
10655
0
        p_image->x1 = (OPJ_UINT32)p_end_x;
10656
0
    }
10657
10658
    /* Bottom */
10659
0
    if (p_end_y <= 0) {
10660
0
        opj_event_msg(p_manager, EVT_ERROR,
10661
0
                      "Bottom position of the decoded area (region_y1=%d) should be > 0.\n",
10662
0
                      p_end_y);
10663
0
        return OPJ_FALSE;
10664
0
    } else if ((OPJ_UINT32)p_end_y < l_image->y0) {
10665
0
        opj_event_msg(p_manager, EVT_ERROR,
10666
0
                      "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
10667
0
                      p_end_y, l_image->y0);
10668
0
        return OPJ_FALSE;
10669
0
    }
10670
0
    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
0
    } else {
10677
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv((
10678
0
                    OPJ_UINT32)p_end_y - l_cp->ty0, l_cp->tdy);
10679
0
        p_image->y1 = (OPJ_UINT32)p_end_y;
10680
0
    }
10681
    /* ----- */
10682
10683
0
    p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
10684
10685
0
    ret = opj_j2k_update_image_dimensions(p_image, p_manager);
10686
10687
0
    if (ret) {
10688
0
        opj_event_msg(p_manager, EVT_INFO, "Setting decoding area to %d,%d,%d,%d\n",
10689
0
                      p_image->x0, p_image->y0, p_image->x1, p_image->y1);
10690
0
    }
10691
10692
0
    return ret;
10693
0
}
10694
10695
opj_j2k_t* opj_j2k_create_decompress(void)
10696
365k
{
10697
365k
    opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
10698
365k
    if (!l_j2k) {
10699
0
        return 00;
10700
0
    }
10701
10702
365k
    l_j2k->m_is_decoder = 1;
10703
365k
    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
365k
    l_j2k->m_cp.allow_different_bit_depth_sign = 1;
10707
10708
    /* Default to using strict mode. */
10709
365k
    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
365k
    l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,
10716
365k
            sizeof(opj_tcp_t));
10717
365k
    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
365k
    l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,
10723
365k
            OPJ_J2K_DEFAULT_HEADER_SIZE);
10724
365k
    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
365k
    l_j2k->m_specific_param.m_decoder.m_header_data_size =
10730
365k
        OPJ_J2K_DEFAULT_HEADER_SIZE;
10731
10732
365k
    l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
10733
10734
365k
    l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
10735
10736
    /* codestream index creation */
10737
365k
    l_j2k->cstr_index = opj_j2k_create_cstr_index();
10738
365k
    if (!l_j2k->cstr_index) {
10739
0
        opj_j2k_destroy(l_j2k);
10740
0
        return 00;
10741
0
    }
10742
10743
    /* validation list creation */
10744
365k
    l_j2k->m_validation_list = opj_procedure_list_create();
10745
365k
    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
365k
    l_j2k->m_procedure_list = opj_procedure_list_create();
10752
365k
    if (! l_j2k->m_procedure_list) {
10753
0
        opj_j2k_destroy(l_j2k);
10754
0
        return 00;
10755
0
    }
10756
10757
365k
    l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
10758
365k
    if (!l_j2k->m_tp) {
10759
0
        l_j2k->m_tp = opj_thread_pool_create(0);
10760
0
    }
10761
365k
    if (!l_j2k->m_tp) {
10762
0
        opj_j2k_destroy(l_j2k);
10763
0
        return NULL;
10764
0
    }
10765
10766
365k
    return l_j2k;
10767
365k
}
10768
10769
static opj_codestream_index_t* opj_j2k_create_cstr_index(void)
10770
365k
{
10771
365k
    opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
10772
365k
                                         opj_calloc(1, sizeof(opj_codestream_index_t));
10773
365k
    if (!cstr_index) {
10774
0
        return NULL;
10775
0
    }
10776
10777
365k
    cstr_index->maxmarknum = 100;
10778
365k
    cstr_index->marknum = 0;
10779
365k
    cstr_index->marker = (opj_marker_info_t*)
10780
365k
                         opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
10781
365k
    if (!cstr_index-> marker) {
10782
0
        opj_free(cstr_index);
10783
0
        return NULL;
10784
0
    }
10785
10786
365k
    cstr_index->tile_index = NULL;
10787
10788
365k
    return cstr_index;
10789
365k
}
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
0
{
10795
0
    opj_cp_t *l_cp = 00;
10796
0
    opj_tcp_t *l_tcp = 00;
10797
0
    opj_tccp_t *l_tccp = 00;
10798
10799
    /* preconditions */
10800
0
    assert(p_j2k != 00);
10801
10802
0
    l_cp = &(p_j2k->m_cp);
10803
0
    l_tcp = &l_cp->tcps[p_tile_no];
10804
0
    l_tccp = &l_tcp->tccps[p_comp_no];
10805
10806
    /* preconditions again */
10807
0
    assert(p_tile_no < (l_cp->tw * l_cp->th));
10808
0
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
10809
10810
0
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10811
0
        return 5 + l_tccp->numresolutions;
10812
0
    } else {
10813
0
        return 5;
10814
0
    }
10815
0
}
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
0
{
10820
0
    OPJ_UINT32 i;
10821
0
    opj_cp_t *l_cp = NULL;
10822
0
    opj_tcp_t *l_tcp = NULL;
10823
0
    opj_tccp_t *l_tccp0 = NULL;
10824
0
    opj_tccp_t *l_tccp1 = NULL;
10825
10826
    /* preconditions */
10827
0
    assert(p_j2k != 00);
10828
10829
0
    l_cp = &(p_j2k->m_cp);
10830
0
    l_tcp = &l_cp->tcps[p_tile_no];
10831
0
    l_tccp0 = &l_tcp->tccps[p_first_comp_no];
10832
0
    l_tccp1 = &l_tcp->tccps[p_second_comp_no];
10833
10834
0
    if (l_tccp0->numresolutions != l_tccp1->numresolutions) {
10835
0
        return OPJ_FALSE;
10836
0
    }
10837
0
    if (l_tccp0->cblkw != l_tccp1->cblkw) {
10838
0
        return OPJ_FALSE;
10839
0
    }
10840
0
    if (l_tccp0->cblkh != l_tccp1->cblkh) {
10841
0
        return OPJ_FALSE;
10842
0
    }
10843
0
    if (l_tccp0->cblksty != l_tccp1->cblksty) {
10844
0
        return OPJ_FALSE;
10845
0
    }
10846
0
    if (l_tccp0->qmfbid != l_tccp1->qmfbid) {
10847
0
        return OPJ_FALSE;
10848
0
    }
10849
0
    if ((l_tccp0->csty & J2K_CCP_CSTY_PRT) != (l_tccp1->csty & J2K_CCP_CSTY_PRT)) {
10850
0
        return OPJ_FALSE;
10851
0
    }
10852
10853
0
    for (i = 0U; i < l_tccp0->numresolutions; ++i) {
10854
0
        if (l_tccp0->prcw[i] != l_tccp1->prcw[i]) {
10855
0
            return OPJ_FALSE;
10856
0
        }
10857
0
        if (l_tccp0->prch[i] != l_tccp1->prch[i]) {
10858
0
            return OPJ_FALSE;
10859
0
        }
10860
0
    }
10861
0
    return OPJ_TRUE;
10862
0
}
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
0
{
10871
0
    OPJ_UINT32 i;
10872
0
    opj_cp_t *l_cp = 00;
10873
0
    opj_tcp_t *l_tcp = 00;
10874
0
    opj_tccp_t *l_tccp = 00;
10875
10876
    /* preconditions */
10877
0
    assert(p_j2k != 00);
10878
0
    assert(p_header_size != 00);
10879
0
    assert(p_manager != 00);
10880
0
    assert(p_data != 00);
10881
10882
0
    l_cp = &(p_j2k->m_cp);
10883
0
    l_tcp = &l_cp->tcps[p_tile_no];
10884
0
    l_tccp = &l_tcp->tccps[p_comp_no];
10885
10886
    /* preconditions again */
10887
0
    assert(p_tile_no < (l_cp->tw * l_cp->th));
10888
0
    assert(p_comp_no < (p_j2k->m_private_image->numcomps));
10889
10890
0
    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
0
    opj_write_bytes(p_data, l_tccp->numresolutions - 1, 1); /* SPcoc (D) */
10896
0
    ++p_data;
10897
10898
0
    opj_write_bytes(p_data, l_tccp->cblkw - 2, 1);                  /* SPcoc (E) */
10899
0
    ++p_data;
10900
10901
0
    opj_write_bytes(p_data, l_tccp->cblkh - 2, 1);                  /* SPcoc (F) */
10902
0
    ++p_data;
10903
10904
0
    opj_write_bytes(p_data, l_tccp->cblksty,
10905
0
                    1);                            /* SPcoc (G) */
10906
0
    ++p_data;
10907
10908
0
    opj_write_bytes(p_data, l_tccp->qmfbid,
10909
0
                    1);                             /* SPcoc (H) */
10910
0
    ++p_data;
10911
10912
0
    *p_header_size = *p_header_size - 5;
10913
10914
0
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10915
10916
0
        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
0
        for (i = 0; i < l_tccp->numresolutions; ++i) {
10922
0
            opj_write_bytes(p_data, l_tccp->prcw[i] + (l_tccp->prch[i] << 4),
10923
0
                            1);   /* SPcoc (I_i) */
10924
0
            ++p_data;
10925
0
        }
10926
10927
0
        *p_header_size = *p_header_size - l_tccp->numresolutions;
10928
0
    }
10929
10930
0
    return OPJ_TRUE;
10931
0
}
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
246k
{
10939
246k
    OPJ_UINT32 i, l_tmp;
10940
246k
    opj_cp_t *l_cp = NULL;
10941
246k
    opj_tcp_t *l_tcp = NULL;
10942
246k
    opj_tccp_t *l_tccp = NULL;
10943
246k
    OPJ_BYTE * l_current_ptr = NULL;
10944
10945
    /* preconditions */
10946
246k
    assert(p_j2k != 00);
10947
246k
    assert(p_manager != 00);
10948
246k
    assert(p_header_data != 00);
10949
10950
246k
    l_cp = &(p_j2k->m_cp);
10951
246k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
10952
155
            &l_cp->tcps[p_j2k->m_current_tile_number] :
10953
246k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
10954
10955
    /* precondition again */
10956
246k
    assert(compno < p_j2k->m_private_image->numcomps);
10957
10958
246k
    l_tccp = &l_tcp->tccps[compno];
10959
246k
    l_current_ptr = p_header_data;
10960
10961
    /* make sure room is sufficient */
10962
246k
    if (*p_header_size < 5) {
10963
247
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
10964
247
        return OPJ_FALSE;
10965
247
    }
10966
10967
    /* SPcod (D) / SPcoc (A) */
10968
246k
    opj_read_bytes(l_current_ptr, &l_tccp->numresolutions, 1);
10969
246k
    ++l_tccp->numresolutions;  /* tccp->numresolutions = read() + 1 */
10970
246k
    if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
10971
671
        opj_event_msg(p_manager, EVT_ERROR,
10972
671
                      "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
10973
671
                      l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
10974
671
        return OPJ_FALSE;
10975
671
    }
10976
245k
    ++l_current_ptr;
10977
10978
    /* If user wants to remove more resolutions than the codestream contains, return error */
10979
245k
    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
245k
    opj_read_bytes(l_current_ptr, &l_tccp->cblkw, 1);
10992
245k
    ++l_current_ptr;
10993
245k
    l_tccp->cblkw += 2;
10994
10995
    /* SPcod (F) / SPcoc (C) */
10996
245k
    opj_read_bytes(l_current_ptr, &l_tccp->cblkh, 1);
10997
245k
    ++l_current_ptr;
10998
245k
    l_tccp->cblkh += 2;
10999
11000
245k
    if ((l_tccp->cblkw > 10) || (l_tccp->cblkh > 10) ||
11001
244k
            ((l_tccp->cblkw + l_tccp->cblkh) > 12)) {
11002
1.31k
        opj_event_msg(p_manager, EVT_ERROR,
11003
1.31k
                      "Error reading SPCod SPCoc element, Invalid cblkw/cblkh combination\n");
11004
1.31k
        return OPJ_FALSE;
11005
1.31k
    }
11006
11007
    /* SPcod (G) / SPcoc (D) */
11008
244k
    opj_read_bytes(l_current_ptr, &l_tccp->cblksty, 1);
11009
244k
    ++l_current_ptr;
11010
244k
    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
679
        opj_event_msg(p_manager, EVT_ERROR,
11013
679
                      "Error reading SPCod SPCoc element. Unsupported Mixed HT code-block style found\n");
11014
679
        return OPJ_FALSE;
11015
679
    }
11016
11017
    /* SPcod (H) / SPcoc (E) */
11018
243k
    opj_read_bytes(l_current_ptr, &l_tccp->qmfbid, 1);
11019
243k
    ++l_current_ptr;
11020
11021
243k
    if (l_tccp->qmfbid > 1) {
11022
955
        opj_event_msg(p_manager, EVT_ERROR,
11023
955
                      "Error reading SPCod SPCoc element, Invalid transformation found\n");
11024
955
        return OPJ_FALSE;
11025
955
    }
11026
11027
242k
    *p_header_size = *p_header_size - 5;
11028
11029
    /* use custom precinct size ? */
11030
242k
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
11031
18.0k
        if (*p_header_size < l_tccp->numresolutions) {
11032
332
            opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
11033
332
            return OPJ_FALSE;
11034
332
        }
11035
11036
        /* SPcod (I_i) / SPcoc (F_i) */
11037
72.7k
        for (i = 0; i < l_tccp->numresolutions; ++i) {
11038
55.4k
            opj_read_bytes(l_current_ptr, &l_tmp, 1);
11039
55.4k
            ++l_current_ptr;
11040
            /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */
11041
55.4k
            if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) {
11042
444
                opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n");
11043
444
                return OPJ_FALSE;
11044
444
            }
11045
54.9k
            l_tccp->prcw[i] = l_tmp & 0xf;
11046
54.9k
            l_tccp->prch[i] = l_tmp >> 4;
11047
54.9k
        }
11048
11049
17.2k
        *p_header_size = *p_header_size - l_tccp->numresolutions;
11050
224k
    } else {
11051
        /* set default size for the precinct width and height */
11052
1.47M
        for (i = 0; i < l_tccp->numresolutions; ++i) {
11053
1.24M
            l_tccp->prcw[i] = 15;
11054
1.24M
            l_tccp->prch[i] = 15;
11055
1.24M
        }
11056
224k
    }
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
241k
    return OPJ_TRUE;
11083
242k
}
11084
11085
static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k)
11086
241k
{
11087
    /* loop */
11088
241k
    OPJ_UINT32 i;
11089
241k
    opj_cp_t *l_cp = NULL;
11090
241k
    opj_tcp_t *l_tcp = NULL;
11091
241k
    opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
11092
241k
    OPJ_UINT32 l_prc_size;
11093
11094
    /* preconditions */
11095
241k
    assert(p_j2k != 00);
11096
11097
241k
    l_cp = &(p_j2k->m_cp);
11098
241k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
11099
241k
            ?
11100
15
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11101
241k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11102
11103
241k
    l_ref_tccp = &l_tcp->tccps[0];
11104
241k
    l_copied_tccp = l_ref_tccp + 1;
11105
241k
    l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
11106
11107
697k
    for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
11108
456k
        l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
11109
456k
        l_copied_tccp->cblkw = l_ref_tccp->cblkw;
11110
456k
        l_copied_tccp->cblkh = l_ref_tccp->cblkh;
11111
456k
        l_copied_tccp->cblksty = l_ref_tccp->cblksty;
11112
456k
        l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
11113
456k
        memcpy(l_copied_tccp->prcw, l_ref_tccp->prcw, l_prc_size);
11114
456k
        memcpy(l_copied_tccp->prch, l_ref_tccp->prch, l_prc_size);
11115
456k
        ++l_copied_tccp;
11116
456k
    }
11117
241k
}
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
0
{
11123
0
    OPJ_UINT32 l_num_bands;
11124
11125
0
    opj_cp_t *l_cp = 00;
11126
0
    opj_tcp_t *l_tcp = 00;
11127
0
    opj_tccp_t *l_tccp = 00;
11128
11129
    /* preconditions */
11130
0
    assert(p_j2k != 00);
11131
11132
0
    l_cp = &(p_j2k->m_cp);
11133
0
    l_tcp = &l_cp->tcps[p_tile_no];
11134
0
    l_tccp = &l_tcp->tccps[p_comp_no];
11135
11136
    /* preconditions again */
11137
0
    assert(p_tile_no < l_cp->tw * l_cp->th);
11138
0
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
11139
11140
0
    l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11141
0
                  (l_tccp->numresolutions * 3 - 2);
11142
11143
0
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
11144
0
        return 1 + l_num_bands;
11145
0
    } else {
11146
0
        return 1 + 2 * l_num_bands;
11147
0
    }
11148
0
}
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
0
{
11153
0
    opj_cp_t *l_cp = NULL;
11154
0
    opj_tcp_t *l_tcp = NULL;
11155
0
    opj_tccp_t *l_tccp0 = NULL;
11156
0
    opj_tccp_t *l_tccp1 = NULL;
11157
0
    OPJ_UINT32 l_band_no, l_num_bands;
11158
11159
    /* preconditions */
11160
0
    assert(p_j2k != 00);
11161
11162
0
    l_cp = &(p_j2k->m_cp);
11163
0
    l_tcp = &l_cp->tcps[p_tile_no];
11164
0
    l_tccp0 = &l_tcp->tccps[p_first_comp_no];
11165
0
    l_tccp1 = &l_tcp->tccps[p_second_comp_no];
11166
11167
0
    if (l_tccp0->qntsty != l_tccp1->qntsty) {
11168
0
        return OPJ_FALSE;
11169
0
    }
11170
0
    if (l_tccp0->numgbits != l_tccp1->numgbits) {
11171
0
        return OPJ_FALSE;
11172
0
    }
11173
0
    if (l_tccp0->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11174
0
        l_num_bands = 1U;
11175
0
    } else {
11176
0
        l_num_bands = l_tccp0->numresolutions * 3U - 2U;
11177
0
        if (l_num_bands != (l_tccp1->numresolutions * 3U - 2U)) {
11178
0
            return OPJ_FALSE;
11179
0
        }
11180
0
    }
11181
11182
0
    for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11183
0
        if (l_tccp0->stepsizes[l_band_no].expn != l_tccp1->stepsizes[l_band_no].expn) {
11184
0
            return OPJ_FALSE;
11185
0
        }
11186
0
    }
11187
0
    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
0
    return OPJ_TRUE;
11195
0
}
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
0
{
11205
0
    OPJ_UINT32 l_header_size;
11206
0
    OPJ_UINT32 l_band_no, l_num_bands;
11207
0
    OPJ_UINT32 l_expn, l_mant;
11208
11209
0
    opj_cp_t *l_cp = 00;
11210
0
    opj_tcp_t *l_tcp = 00;
11211
0
    opj_tccp_t *l_tccp = 00;
11212
11213
    /* preconditions */
11214
0
    assert(p_j2k != 00);
11215
0
    assert(p_header_size != 00);
11216
0
    assert(p_manager != 00);
11217
0
    assert(p_data != 00);
11218
11219
0
    l_cp = &(p_j2k->m_cp);
11220
0
    l_tcp = &l_cp->tcps[p_tile_no];
11221
0
    l_tccp = &l_tcp->tccps[p_comp_no];
11222
11223
    /* preconditions again */
11224
0
    assert(p_tile_no < l_cp->tw * l_cp->th);
11225
0
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
11226
11227
0
    l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11228
0
                  (l_tccp->numresolutions * 3 - 2);
11229
11230
0
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
11231
0
        l_header_size = 1 + l_num_bands;
11232
11233
0
        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
0
        opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
11239
0
                        1);   /* Sqcx */
11240
0
        ++p_data;
11241
11242
0
        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11243
0
            l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
11244
0
            opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */
11245
0
            ++p_data;
11246
0
        }
11247
0
    } else {
11248
0
        l_header_size = 1 + 2 * l_num_bands;
11249
11250
0
        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
0
        opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
11256
0
                        1);   /* Sqcx */
11257
0
        ++p_data;
11258
11259
0
        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11260
0
            l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
11261
0
            l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
11262
11263
0
            opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */
11264
0
            p_data += 2;
11265
0
        }
11266
0
    }
11267
11268
0
    *p_header_size = *p_header_size - l_header_size;
11269
11270
0
    return OPJ_TRUE;
11271
0
}
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
228k
{
11280
    /* loop*/
11281
228k
    OPJ_UINT32 l_band_no;
11282
228k
    opj_cp_t *l_cp = 00;
11283
228k
    opj_tcp_t *l_tcp = 00;
11284
228k
    opj_tccp_t *l_tccp = 00;
11285
228k
    OPJ_BYTE * l_current_ptr = 00;
11286
228k
    OPJ_UINT32 l_tmp, l_num_band;
11287
11288
    /* preconditions*/
11289
228k
    assert(p_j2k != 00);
11290
228k
    assert(p_manager != 00);
11291
228k
    assert(p_header_data != 00);
11292
11293
228k
    l_cp = &(p_j2k->m_cp);
11294
    /* come from tile part header or main header ?*/
11295
228k
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
11296
228k
            ?
11297
29
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11298
228k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11299
11300
    /* precondition again*/
11301
228k
    assert(p_comp_no <  p_j2k->m_private_image->numcomps);
11302
11303
228k
    l_tccp = &l_tcp->tccps[p_comp_no];
11304
228k
    l_current_ptr = p_header_data;
11305
11306
228k
    if (*p_header_size < 1) {
11307
284
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
11308
284
        return OPJ_FALSE;
11309
284
    }
11310
228k
    *p_header_size -= 1;
11311
11312
228k
    opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* Sqcx */
11313
228k
    ++l_current_ptr;
11314
11315
228k
    l_tccp->qntsty = l_tmp & 0x1f;
11316
228k
    l_tccp->numgbits = l_tmp >> 5;
11317
228k
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11318
615
        l_num_band = 1;
11319
227k
    } else {
11320
227k
        l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
11321
13.2k
                     (*p_header_size) :
11322
227k
                     (*p_header_size) / 2;
11323
11324
227k
        if (l_num_band > OPJ_J2K_MAXBANDS) {
11325
621
            opj_event_msg(p_manager, EVT_WARNING,
11326
621
                          "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
11327
621
                          "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
11328
621
                          "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS,
11329
621
                          OPJ_J2K_MAXBANDS);
11330
            /*return OPJ_FALSE;*/
11331
621
        }
11332
227k
    }
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
228k
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
11357
246k
        for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
11358
232k
            opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* SPqcx_i */
11359
232k
            ++l_current_ptr;
11360
232k
            if (l_band_no < OPJ_J2K_MAXBANDS) {
11361
228k
                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
11362
228k
                l_tccp->stepsizes[l_band_no].mant = 0;
11363
228k
            }
11364
232k
        }
11365
11366
13.2k
        if (*p_header_size < l_num_band) {
11367
0
            return OPJ_FALSE;
11368
0
        }
11369
13.2k
        *p_header_size = *p_header_size - l_num_band;
11370
215k
    } else {
11371
4.18M
        for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
11372
3.96M
            opj_read_bytes(l_current_ptr, &l_tmp, 2);                       /* SPqcx_i */
11373
3.96M
            l_current_ptr += 2;
11374
3.96M
            if (l_band_no < OPJ_J2K_MAXBANDS) {
11375
3.35M
                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
11376
3.35M
                l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
11377
3.35M
            }
11378
3.96M
        }
11379
11380
215k
        if (*p_header_size < 2 * l_num_band) {
11381
17
            return OPJ_FALSE;
11382
17
        }
11383
215k
        *p_header_size = *p_header_size - 2 * l_num_band;
11384
215k
    }
11385
11386
    /* Add Antonin : if scalar_derived -> compute other stepsizes */
11387
228k
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11388
58.0k
        for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
11389
57.4k
            l_tccp->stepsizes[l_band_no].expn =
11390
57.4k
                ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0)
11391
57.4k
                ?
11392
35.3k
                (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
11393
57.4k
            l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
11394
57.4k
        }
11395
598
    }
11396
11397
228k
    return OPJ_TRUE;
11398
228k
}
11399
11400
static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k)
11401
226k
{
11402
226k
    OPJ_UINT32 i;
11403
226k
    opj_cp_t *l_cp = NULL;
11404
226k
    opj_tcp_t *l_tcp = NULL;
11405
226k
    opj_tccp_t *l_ref_tccp = NULL;
11406
226k
    opj_tccp_t *l_copied_tccp = NULL;
11407
226k
    OPJ_UINT32 l_size;
11408
11409
    /* preconditions */
11410
226k
    assert(p_j2k != 00);
11411
11412
226k
    l_cp = &(p_j2k->m_cp);
11413
226k
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
11414
16
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11415
226k
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11416
11417
226k
    l_ref_tccp = &l_tcp->tccps[0];
11418
226k
    l_copied_tccp = l_ref_tccp + 1;
11419
226k
    l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
11420
11421
655k
    for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
11422
428k
        l_copied_tccp->qntsty = l_ref_tccp->qntsty;
11423
428k
        l_copied_tccp->numgbits = l_ref_tccp->numgbits;
11424
428k
        memcpy(l_copied_tccp->stepsizes, l_ref_tccp->stepsizes, l_size);
11425
428k
        ++l_copied_tccp;
11426
428k
    }
11427
226k
}
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
0
{
11689
0
    OPJ_UINT32 compno;
11690
0
    OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
11691
0
    opj_tcp_t *l_default_tile;
11692
0
    opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,
11693
0
                                          sizeof(opj_codestream_info_v2_t));
11694
0
    if (!cstr_info) {
11695
0
        return NULL;
11696
0
    }
11697
11698
0
    cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
11699
11700
0
    cstr_info->tx0 = p_j2k->m_cp.tx0;
11701
0
    cstr_info->ty0 = p_j2k->m_cp.ty0;
11702
0
    cstr_info->tdx = p_j2k->m_cp.tdx;
11703
0
    cstr_info->tdy = p_j2k->m_cp.tdy;
11704
0
    cstr_info->tw = p_j2k->m_cp.tw;
11705
0
    cstr_info->th = p_j2k->m_cp.th;
11706
11707
0
    cstr_info->tile_info = NULL; /* Not fill from the main header*/
11708
11709
0
    l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
11710
11711
0
    cstr_info->m_default_tile_info.csty = l_default_tile->csty;
11712
0
    cstr_info->m_default_tile_info.prg = l_default_tile->prg;
11713
0
    cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
11714
0
    cstr_info->m_default_tile_info.mct = l_default_tile->mct;
11715
11716
0
    cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(
11717
0
                cstr_info->nbcomps, sizeof(opj_tccp_info_t));
11718
0
    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
0
    for (compno = 0; compno < numcomps; compno++) {
11724
0
        opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
11725
0
        opj_tccp_info_t *l_tccp_info = &
11726
0
                                       (cstr_info->m_default_tile_info.tccp_info[compno]);
11727
0
        OPJ_INT32 bandno, numbands;
11728
11729
        /* coding style*/
11730
0
        l_tccp_info->csty = l_tccp->csty;
11731
0
        l_tccp_info->numresolutions = l_tccp->numresolutions;
11732
0
        l_tccp_info->cblkw = l_tccp->cblkw;
11733
0
        l_tccp_info->cblkh = l_tccp->cblkh;
11734
0
        l_tccp_info->cblksty = l_tccp->cblksty;
11735
0
        l_tccp_info->qmfbid = l_tccp->qmfbid;
11736
0
        if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS) {
11737
0
            memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
11738
0
            memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
11739
0
        }
11740
11741
        /* quantization style*/
11742
0
        l_tccp_info->qntsty = l_tccp->qntsty;
11743
0
        l_tccp_info->numgbits = l_tccp->numgbits;
11744
11745
0
        numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11746
0
                   (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
11747
0
        if (numbands < OPJ_J2K_MAXBANDS) {
11748
0
            for (bandno = 0; bandno < numbands; bandno++) {
11749
0
                l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)
11750
0
                                                      l_tccp->stepsizes[bandno].mant;
11751
0
                l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)
11752
0
                                                      l_tccp->stepsizes[bandno].expn;
11753
0
            }
11754
0
        }
11755
11756
        /* RGN value*/
11757
0
        l_tccp_info->roishift = l_tccp->roishift;
11758
0
    }
11759
11760
0
    return cstr_info;
11761
0
}
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
214k
{
11880
214k
    OPJ_UINT32 it_tile = 0;
11881
11882
214k
    p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
11883
214k
    p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
11884
214k
                                        p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
11885
214k
    if (!p_j2k->cstr_index->tile_index) {
11886
0
        return OPJ_FALSE;
11887
0
    }
11888
11889
5.07M
    for (it_tile = 0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++) {
11890
4.85M
        p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
11891
4.85M
        p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
11892
4.85M
        p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
11893
4.85M
                opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum,
11894
4.85M
                           sizeof(opj_marker_info_t));
11895
4.85M
        if (!p_j2k->cstr_index->tile_index[it_tile].marker) {
11896
0
            return OPJ_FALSE;
11897
0
        }
11898
4.85M
    }
11899
11900
214k
    return OPJ_TRUE;
11901
214k
}
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
138k
{
11906
138k
    OPJ_UINT32 compno;
11907
138k
    OPJ_BOOL decoded_all_used_components = OPJ_TRUE;
11908
11909
138k
    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
138k
    } else {
11921
533k
        for (compno = 0; compno < p_j2k->m_output_image->numcomps; compno++) {
11922
394k
            if (p_j2k->m_output_image->comps[compno].data == NULL) {
11923
2.12k
                opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
11924
2.12k
                              compno);
11925
2.12k
                decoded_all_used_components = OPJ_FALSE;
11926
2.12k
            }
11927
394k
        }
11928
138k
    }
11929
11930
138k
    if (decoded_all_used_components == OPJ_FALSE) {
11931
1.75k
        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode all used components\n");
11932
1.75k
        return OPJ_FALSE;
11933
1.75k
    }
11934
11935
136k
    return OPJ_TRUE;
11936
138k
}
11937
11938
static int CompareOffT(const void* a, const void* b)
11939
0
{
11940
0
    const OPJ_OFF_T offA = *(const OPJ_OFF_T*)a;
11941
0
    const OPJ_OFF_T offB = *(const OPJ_OFF_T*)b;
11942
0
    if (offA < offB) {
11943
0
        return -1;
11944
0
    }
11945
0
    if (offA == offB) {
11946
0
        return 0;
11947
0
    }
11948
0
    return 1;
11949
0
}
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
192k
{
11955
192k
    OPJ_BOOL l_go_on = OPJ_TRUE;
11956
192k
    OPJ_UINT32 l_current_tile_no;
11957
192k
    OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
11958
192k
    OPJ_UINT32 l_nb_comps;
11959
192k
    OPJ_UINT32 nr_tiles = 0;
11960
192k
    OPJ_OFF_T end_pos = 0;
11961
11962
    /* Particular case for whole single tile decoding */
11963
    /* We can avoid allocating intermediate tile buffers */
11964
192k
    if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
11965
23.9k
            p_j2k->m_cp.tx0 == 0 && p_j2k->m_cp.ty0 == 0 &&
11966
23.5k
            p_j2k->m_output_image->x0 == 0 &&
11967
21.4k
            p_j2k->m_output_image->y0 == 0 &&
11968
20.6k
            p_j2k->m_output_image->x1 == p_j2k->m_cp.tdx &&
11969
8.89k
            p_j2k->m_output_image->y1 == p_j2k->m_cp.tdy) {
11970
8.38k
        OPJ_UINT32 i;
11971
8.38k
        if (! opj_j2k_read_tile_header(p_j2k,
11972
8.38k
                                       &l_current_tile_no,
11973
8.38k
                                       NULL,
11974
8.38k
                                       &l_tile_x0, &l_tile_y0,
11975
8.38k
                                       &l_tile_x1, &l_tile_y1,
11976
8.38k
                                       &l_nb_comps,
11977
8.38k
                                       &l_go_on,
11978
8.38k
                                       p_stream,
11979
8.38k
                                       p_manager)) {
11980
2.33k
            return OPJ_FALSE;
11981
2.33k
        }
11982
11983
6.05k
        if (!l_go_on ||
11984
6.04k
                ! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
11985
6.04k
                                      p_stream, p_manager)) {
11986
5.19k
            opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile 1/1\n");
11987
5.19k
            return OPJ_FALSE;
11988
5.19k
        }
11989
11990
        /* Transfer TCD data to output image data */
11991
2.18k
        for (i = 0; i < p_j2k->m_output_image->numcomps; i++) {
11992
1.32k
            opj_image_data_free(p_j2k->m_output_image->comps[i].data);
11993
1.32k
            p_j2k->m_output_image->comps[i].data =
11994
1.32k
                p_j2k->m_tcd->tcd_image->tiles->comps[i].data;
11995
1.32k
            p_j2k->m_output_image->comps[i].resno_decoded =
11996
1.32k
                p_j2k->m_tcd->image->comps[i].resno_decoded;
11997
1.32k
            p_j2k->m_tcd->tcd_image->tiles->comps[i].data = NULL;
11998
1.32k
        }
11999
12000
860
        return OPJ_TRUE;
12001
6.05k
    }
12002
12003
183k
    p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts = 0;
12004
183k
    p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts = 0;
12005
183k
    opj_free(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset);
12006
183k
    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
183k
    if (!(p_j2k->m_specific_param.m_decoder.m_start_tile_x == 0 &&
12013
183k
            p_j2k->m_specific_param.m_decoder.m_start_tile_y == 0 &&
12014
183k
            p_j2k->m_specific_param.m_decoder.m_end_tile_x == p_j2k->m_cp.tw &&
12015
183k
            p_j2k->m_specific_param.m_decoder.m_end_tile_y == p_j2k->m_cp.th) &&
12016
0
            !p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid &&
12017
0
            opj_stream_has_seek(p_stream)) {
12018
0
        OPJ_UINT32 m_num_intersecting_tile_parts = 0;
12019
12020
0
        OPJ_UINT32 j;
12021
0
        for (j = 0; j < p_j2k->m_cp.tw * p_j2k->m_cp.th; ++j) {
12022
0
            if (p_j2k->cstr_index->tile_index[j].nb_tps > 0 &&
12023
0
                    p_j2k->cstr_index->tile_index[j].tp_index[
12024
0
                        p_j2k->cstr_index->tile_index[j].nb_tps - 1].end_pos > end_pos) {
12025
0
                end_pos = p_j2k->cstr_index->tile_index[j].tp_index[
12026
0
                              p_j2k->cstr_index->tile_index[j].nb_tps - 1].end_pos;
12027
0
            }
12028
0
        }
12029
12030
0
        for (j = p_j2k->m_specific_param.m_decoder.m_start_tile_y;
12031
0
                j < p_j2k->m_specific_param.m_decoder.m_end_tile_y; ++j) {
12032
0
            OPJ_UINT32 i;
12033
0
            for (i = p_j2k->m_specific_param.m_decoder.m_start_tile_x;
12034
0
                    i < p_j2k->m_specific_param.m_decoder.m_end_tile_x; ++i) {
12035
0
                const OPJ_UINT32 tile_number = j * p_j2k->m_cp.tw + i;
12036
0
                m_num_intersecting_tile_parts +=
12037
0
                    p_j2k->cstr_index->tile_index[tile_number].nb_tps;
12038
0
            }
12039
0
        }
12040
12041
0
        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset =
12042
0
            (OPJ_OFF_T*)
12043
0
            opj_malloc(m_num_intersecting_tile_parts * sizeof(OPJ_OFF_T));
12044
0
        if (m_num_intersecting_tile_parts > 0 &&
12045
0
                p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset) {
12046
0
            OPJ_UINT32 idx = 0;
12047
0
            for (j = p_j2k->m_specific_param.m_decoder.m_start_tile_y;
12048
0
                    j < p_j2k->m_specific_param.m_decoder.m_end_tile_y; ++j) {
12049
0
                OPJ_UINT32 i;
12050
0
                for (i = p_j2k->m_specific_param.m_decoder.m_start_tile_x;
12051
0
                        i < p_j2k->m_specific_param.m_decoder.m_end_tile_x; ++i) {
12052
0
                    const OPJ_UINT32 tile_number = j * p_j2k->m_cp.tw + i;
12053
0
                    OPJ_UINT32 k;
12054
0
                    for (k = 0; k < p_j2k->cstr_index->tile_index[tile_number].nb_tps; ++k) {
12055
0
                        const OPJ_OFF_T next_tp_sot_pos =
12056
0
                            p_j2k->cstr_index->tile_index[tile_number].tp_index[k].start_pos;
12057
0
                        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset[idx] =
12058
0
                            next_tp_sot_pos;
12059
0
                        ++idx;
12060
0
                    }
12061
0
                }
12062
0
            }
12063
12064
0
            p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts = idx;
12065
12066
            /* Sort by increasing offset */
12067
0
            qsort(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset,
12068
0
                  p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts,
12069
0
                  sizeof(OPJ_OFF_T),
12070
0
                  CompareOffT);
12071
0
        }
12072
0
    }
12073
12074
187k
    for (;;) {
12075
187k
        if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
12076
15.5k
                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
187k
        } else {
12081
187k
            if (! opj_j2k_read_tile_header(p_j2k,
12082
187k
                                           &l_current_tile_no,
12083
187k
                                           NULL,
12084
187k
                                           &l_tile_x0, &l_tile_y0,
12085
187k
                                           &l_tile_x1, &l_tile_y1,
12086
187k
                                           &l_nb_comps,
12087
187k
                                           &l_go_on,
12088
187k
                                           p_stream,
12089
187k
                                           p_manager)) {
12090
11.2k
                return OPJ_FALSE;
12091
11.2k
            }
12092
12093
176k
            if (! l_go_on) {
12094
951
                break;
12095
951
            }
12096
176k
        }
12097
12098
175k
        if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
12099
175k
                                  p_stream, p_manager)) {
12100
34.0k
            opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n",
12101
34.0k
                          l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
12102
34.0k
            return OPJ_FALSE;
12103
34.0k
        }
12104
12105
141k
        opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
12106
141k
                      l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
12107
12108
141k
        if (! opj_j2k_update_image_data(p_j2k->m_tcd,
12109
141k
                                        p_j2k->m_output_image)) {
12110
0
            return OPJ_FALSE;
12111
0
        }
12112
12113
141k
        if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
12114
10.0k
                !(p_j2k->m_output_image->x0 == p_j2k->m_private_image->x0 &&
12115
10.0k
                  p_j2k->m_output_image->y0 == p_j2k->m_private_image->y0 &&
12116
10.0k
                  p_j2k->m_output_image->x1 == p_j2k->m_private_image->x1 &&
12117
10.0k
                  p_j2k->m_output_image->y1 == p_j2k->m_private_image->y1)) {
12118
            /* Keep current tcp data */
12119
141k
        } else {
12120
141k
            opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
12121
141k
        }
12122
12123
141k
        opj_event_msg(p_manager, EVT_INFO,
12124
141k
                      "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
12125
12126
141k
        if (opj_stream_get_number_byte_left(p_stream) == 0
12127
138k
                && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
12128
136k
            break;
12129
136k
        }
12130
4.74k
        if (++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) {
12131
724
            break;
12132
724
        }
12133
4.02k
        if (p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts > 0 &&
12134
0
                p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts ==
12135
0
                p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts) {
12136
0
            opj_stream_seek(p_stream, end_pos + 2, p_manager);
12137
0
            break;
12138
0
        }
12139
4.02k
    }
12140
12141
138k
    if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
12142
1.75k
        return OPJ_FALSE;
12143
1.75k
    }
12144
12145
136k
    return OPJ_TRUE;
12146
138k
}
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
192k
{
12154
    /* preconditions*/
12155
192k
    assert(p_j2k != 00);
12156
192k
    assert(p_manager != 00);
12157
12158
192k
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12159
192k
                                           (opj_procedure)opj_j2k_decode_tiles, p_manager)) {
12160
0
        return OPJ_FALSE;
12161
0
    }
12162
    /* DEVELOPER CORNER, add your custom procedures */
12163
12164
192k
    return OPJ_TRUE;
12165
192k
}
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
137k
{
12322
137k
    OPJ_UINT32 compno;
12323
12324
    /* Move data and copy one information from codec to output image*/
12325
137k
    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
137k
    } else {
12360
528k
        for (compno = 0; compno < p_image->numcomps; compno++) {
12361
390k
            p_image->comps[compno].resno_decoded =
12362
390k
                p_j2k->m_output_image->comps[compno].resno_decoded;
12363
390k
            opj_image_data_free(p_image->comps[compno].data);
12364
390k
            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
390k
            p_j2k->m_output_image->comps[compno].data = NULL;
12374
390k
        }
12375
137k
    }
12376
137k
    return OPJ_TRUE;
12377
137k
}
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
192k
{
12384
192k
    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
192k
    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
192k
    if (p_j2k->m_output_image == NULL) {
12414
192k
        p_j2k->m_output_image = opj_image_create0();
12415
192k
        if (!(p_j2k->m_output_image)) {
12416
0
            return OPJ_FALSE;
12417
0
        }
12418
192k
    }
12419
192k
    opj_copy_image_header(p_image, p_j2k->m_output_image);
12420
12421
    /* customization of the decoding */
12422
192k
    if (!opj_j2k_setup_decoding(p_j2k, p_manager)) {
12423
0
        return OPJ_FALSE;
12424
0
    }
12425
12426
    /* Decode the codestream */
12427
192k
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12428
54.5k
        opj_image_destroy(p_j2k->m_private_image);
12429
54.5k
        p_j2k->m_private_image = NULL;
12430
54.5k
        return OPJ_FALSE;
12431
54.5k
    }
12432
12433
    /* Move data and copy one information from codec to output image*/
12434
137k
    return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
12435
192k
}
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
0
{
12650
0
    OPJ_UINT32 i, j;
12651
0
    OPJ_UINT32 l_nb_tiles;
12652
0
    OPJ_SIZE_T l_max_tile_size = 0, l_current_tile_size;
12653
0
    OPJ_BYTE * l_current_data = 00;
12654
0
    OPJ_BOOL l_reuse_data = OPJ_FALSE;
12655
0
    opj_tcd_t* p_tcd = 00;
12656
12657
    /* preconditions */
12658
0
    assert(p_j2k != 00);
12659
0
    assert(p_stream != 00);
12660
0
    assert(p_manager != 00);
12661
12662
0
    p_tcd = p_j2k->m_tcd;
12663
12664
0
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
12665
0
    if (l_nb_tiles == 1) {
12666
0
        l_reuse_data = OPJ_TRUE;
12667
0
#ifdef __SSE__
12668
0
        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12669
0
            opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
12670
0
            if (((size_t)l_img_comp->data & 0xFU) !=
12671
0
                    0U) { /* tile data shall be aligned on 16 bytes */
12672
0
                l_reuse_data = OPJ_FALSE;
12673
0
            }
12674
0
        }
12675
0
#endif
12676
0
    }
12677
0
    for (i = 0; i < l_nb_tiles; ++i) {
12678
0
        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
0
        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12688
0
            opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j;
12689
0
            if (l_reuse_data) {
12690
0
                opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
12691
0
                l_tilec->data  =  l_img_comp->data;
12692
0
                l_tilec->ownsData = OPJ_FALSE;
12693
0
            } 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
0
        }
12703
0
        l_current_tile_size = opj_tcd_get_encoder_input_buffer_size(p_j2k->m_tcd);
12704
0
        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
0
        if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
12741
0
            if (l_current_data) {
12742
0
                opj_free(l_current_data);
12743
0
            }
12744
0
            return OPJ_FALSE;
12745
0
        }
12746
0
    }
12747
12748
0
    if (l_current_data) {
12749
0
        opj_free(l_current_data);
12750
0
    }
12751
0
    return OPJ_TRUE;
12752
0
}
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
0
{
12758
    /* customization of the encoding */
12759
0
    if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) {
12760
0
        return OPJ_FALSE;
12761
0
    }
12762
12763
0
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12764
0
        return OPJ_FALSE;
12765
0
    }
12766
12767
0
    return OPJ_TRUE;
12768
0
}
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
0
{
12775
    /* preconditions */
12776
0
    assert(p_j2k != 00);
12777
0
    assert(p_stream != 00);
12778
0
    assert(p_manager != 00);
12779
12780
0
    p_j2k->m_private_image = opj_image_create0();
12781
0
    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
0
    opj_copy_image_header(p_image, p_j2k->m_private_image);
12786
12787
    /* TODO_MSD: Find a better way */
12788
0
    if (p_image->comps) {
12789
0
        OPJ_UINT32 it_comp;
12790
0
        for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
12791
0
            if (p_image->comps[it_comp].data) {
12792
0
                p_j2k->m_private_image->comps[it_comp].data = p_image->comps[it_comp].data;
12793
0
                p_image->comps[it_comp].data = NULL;
12794
12795
0
            }
12796
0
        }
12797
0
    }
12798
12799
    /* customization of the validation */
12800
0
    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
0
    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
0
    if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) {
12811
0
        return OPJ_FALSE;
12812
0
    }
12813
12814
    /* write header */
12815
0
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12816
0
        return OPJ_FALSE;
12817
0
    }
12818
12819
0
    return OPJ_TRUE;
12820
0
}
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
0
{
12827
0
    (void)p_stream;
12828
0
    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
0
    opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n",
12834
0
                  p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
12835
12836
0
    p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
12837
0
    p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
12838
0
    p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
12839
12840
    /* initialisation before tile encoding  */
12841
0
    if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
12842
0
                                   p_manager)) {
12843
0
        return OPJ_FALSE;
12844
0
    }
12845
12846
0
    return OPJ_TRUE;
12847
0
}
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
0
{
12975
0
    OPJ_UINT32 l_nb_bytes_written;
12976
0
    OPJ_BYTE * l_current_data = 00;
12977
0
    OPJ_UINT32 l_tile_size = 0;
12978
0
    OPJ_UINT32 l_available_data;
12979
12980
    /* preconditions */
12981
0
    assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
12982
12983
0
    l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
12984
0
    l_available_data = l_tile_size;
12985
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
12986
12987
0
    l_nb_bytes_written = 0;
12988
0
    if (! opj_j2k_write_first_tile_part(p_j2k, l_current_data, &l_nb_bytes_written,
12989
0
                                        l_available_data, p_stream, p_manager)) {
12990
0
        return OPJ_FALSE;
12991
0
    }
12992
0
    l_current_data += l_nb_bytes_written;
12993
0
    l_available_data -= l_nb_bytes_written;
12994
12995
0
    l_nb_bytes_written = 0;
12996
0
    if (! opj_j2k_write_all_tile_parts(p_j2k, l_current_data, &l_nb_bytes_written,
12997
0
                                       l_available_data, p_stream, p_manager)) {
12998
0
        return OPJ_FALSE;
12999
0
    }
13000
13001
0
    l_available_data -= l_nb_bytes_written;
13002
0
    l_nb_bytes_written = l_tile_size - l_available_data;
13003
13004
0
    if (opj_stream_write_data(p_stream,
13005
0
                              p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
13006
0
                              l_nb_bytes_written, p_manager) != l_nb_bytes_written) {
13007
0
        return OPJ_FALSE;
13008
0
    }
13009
13010
0
    ++p_j2k->m_current_tile_number;
13011
13012
0
    return OPJ_TRUE;
13013
0
}
13014
13015
static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
13016
        opj_event_mgr_t * p_manager)
13017
0
{
13018
    /* preconditions */
13019
0
    assert(p_j2k != 00);
13020
0
    assert(p_manager != 00);
13021
13022
    /* DEVELOPER CORNER, insert your custom procedures */
13023
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13024
0
                                           (opj_procedure)opj_j2k_write_eoc, p_manager)) {
13025
0
        return OPJ_FALSE;
13026
0
    }
13027
13028
0
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13029
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13030
0
                                               (opj_procedure)opj_j2k_write_updated_tlm, p_manager)) {
13031
0
            return OPJ_FALSE;
13032
0
        }
13033
0
    }
13034
13035
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13036
0
                                           (opj_procedure)opj_j2k_write_epc, p_manager)) {
13037
0
        return OPJ_FALSE;
13038
0
    }
13039
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13040
0
                                           (opj_procedure)opj_j2k_end_encoding, p_manager)) {
13041
0
        return OPJ_FALSE;
13042
0
    }
13043
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13044
0
                                           (opj_procedure)opj_j2k_destroy_header_memory, p_manager)) {
13045
0
        return OPJ_FALSE;
13046
0
    }
13047
0
    return OPJ_TRUE;
13048
0
}
13049
13050
static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
13051
        opj_event_mgr_t * p_manager)
13052
0
{
13053
    /* preconditions */
13054
0
    assert(p_j2k != 00);
13055
0
    assert(p_manager != 00);
13056
13057
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13058
0
                                           (opj_procedure)opj_j2k_build_encoder, p_manager)) {
13059
0
        return OPJ_FALSE;
13060
0
    }
13061
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13062
0
                                           (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
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13068
0
                                           (opj_procedure)opj_j2k_mct_validation, p_manager)) {
13069
0
        return OPJ_FALSE;
13070
0
    }
13071
13072
0
    return OPJ_TRUE;
13073
0
}
13074
13075
static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
13076
        opj_event_mgr_t * p_manager)
13077
0
{
13078
    /* preconditions */
13079
0
    assert(p_j2k != 00);
13080
0
    assert(p_manager != 00);
13081
13082
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13083
0
                                           (opj_procedure)opj_j2k_init_info, p_manager)) {
13084
0
        return OPJ_FALSE;
13085
0
    }
13086
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13087
0
                                           (opj_procedure)opj_j2k_write_soc, p_manager)) {
13088
0
        return OPJ_FALSE;
13089
0
    }
13090
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13091
0
                                           (opj_procedure)opj_j2k_write_siz, p_manager)) {
13092
0
        return OPJ_FALSE;
13093
0
    }
13094
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13095
0
                                           (opj_procedure)opj_j2k_write_cod, p_manager)) {
13096
0
        return OPJ_FALSE;
13097
0
    }
13098
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13099
0
                                           (opj_procedure)opj_j2k_write_qcd, p_manager)) {
13100
0
        return OPJ_FALSE;
13101
0
    }
13102
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13103
0
                                           (opj_procedure)opj_j2k_write_all_coc, p_manager)) {
13104
0
        return OPJ_FALSE;
13105
0
    }
13106
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13107
0
                                           (opj_procedure)opj_j2k_write_all_qcc, p_manager)) {
13108
0
        return OPJ_FALSE;
13109
0
    }
13110
13111
0
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13112
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13113
0
                                               (opj_procedure)opj_j2k_write_tlm, p_manager)) {
13114
0
            return OPJ_FALSE;
13115
0
        }
13116
13117
0
        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
0
    }
13124
13125
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13126
0
                                           (opj_procedure)opj_j2k_write_regions, p_manager)) {
13127
0
        return OPJ_FALSE;
13128
0
    }
13129
13130
0
    if (p_j2k->m_cp.comment != 00)  {
13131
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13132
0
                                               (opj_procedure)opj_j2k_write_com, p_manager)) {
13133
0
            return OPJ_FALSE;
13134
0
        }
13135
0
    }
13136
13137
    /* DEVELOPER CORNER, insert your custom procedures */
13138
0
    if ((p_j2k->m_cp.rsiz & (OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT)) ==
13139
0
            (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
0
    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
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13155
0
                                           (opj_procedure)opj_j2k_create_tcd, p_manager)) {
13156
0
        return OPJ_FALSE;
13157
0
    }
13158
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13159
0
                                           (opj_procedure)opj_j2k_update_rates, p_manager)) {
13160
0
        return OPJ_FALSE;
13161
0
    }
13162
13163
0
    return OPJ_TRUE;
13164
0
}
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
0
{
13173
0
    OPJ_UINT32 l_nb_bytes_written = 0;
13174
0
    OPJ_UINT32 l_current_nb_bytes_written;
13175
0
    OPJ_BYTE * l_begin_data = 00;
13176
13177
0
    opj_tcd_t * l_tcd = 00;
13178
0
    opj_cp_t * l_cp = 00;
13179
13180
0
    l_tcd = p_j2k->m_tcd;
13181
0
    l_cp = &(p_j2k->m_cp);
13182
13183
0
    l_tcd->cur_pino = 0;
13184
13185
    /*Get number of tile parts*/
13186
0
    p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
13187
13188
    /* INDEX >> */
13189
    /* << INDEX */
13190
13191
0
    l_current_nb_bytes_written = 0;
13192
0
    l_begin_data = p_data;
13193
0
    if (! opj_j2k_write_sot(p_j2k, p_data, total_data_size,
13194
0
                            &l_current_nb_bytes_written, p_stream,
13195
0
                            p_manager)) {
13196
0
        return OPJ_FALSE;
13197
0
    }
13198
13199
0
    l_nb_bytes_written += l_current_nb_bytes_written;
13200
0
    p_data += l_current_nb_bytes_written;
13201
0
    total_data_size -= l_current_nb_bytes_written;
13202
13203
0
    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
0
        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
0
    }
13230
13231
0
    l_current_nb_bytes_written = 0;
13232
0
    if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
13233
0
                            total_data_size, p_stream, p_manager)) {
13234
0
        return OPJ_FALSE;
13235
0
    }
13236
13237
0
    l_nb_bytes_written += l_current_nb_bytes_written;
13238
0
    * p_data_written = l_nb_bytes_written;
13239
13240
    /* Writing Psot in SOT marker */
13241
0
    opj_write_bytes(l_begin_data + 6, l_nb_bytes_written,
13242
0
                    4);                                 /* PSOT */
13243
13244
0
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13245
0
        opj_j2k_update_tlm(p_j2k, l_nb_bytes_written);
13246
0
    }
13247
13248
0
    return OPJ_TRUE;
13249
0
}
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
0
{
13259
0
    OPJ_UINT32 tilepartno = 0;
13260
0
    OPJ_UINT32 l_nb_bytes_written = 0;
13261
0
    OPJ_UINT32 l_current_nb_bytes_written;
13262
0
    OPJ_UINT32 l_part_tile_size;
13263
0
    OPJ_UINT32 tot_num_tp;
13264
0
    OPJ_UINT32 pino;
13265
13266
0
    OPJ_BYTE * l_begin_data;
13267
0
    opj_tcp_t *l_tcp = 00;
13268
0
    opj_tcd_t * l_tcd = 00;
13269
0
    opj_cp_t * l_cp = 00;
13270
13271
0
    l_tcd = p_j2k->m_tcd;
13272
0
    l_cp = &(p_j2k->m_cp);
13273
0
    l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
13274
13275
    /*Get number of tile parts*/
13276
0
    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
0
    ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
13280
0
    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
0
    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
0
    *p_data_written = l_nb_bytes_written;
13369
13370
0
    return OPJ_TRUE;
13371
0
}
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
0
{
13377
0
    OPJ_UINT32 l_tlm_size;
13378
0
    OPJ_OFF_T l_tlm_position, l_current_position;
13379
0
    OPJ_UINT32 size_per_tile_part;
13380
13381
    /* preconditions */
13382
0
    assert(p_j2k != 00);
13383
0
    assert(p_manager != 00);
13384
0
    assert(p_stream != 00);
13385
13386
0
    size_per_tile_part = p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte ? 5 : 6;
13387
0
    l_tlm_size = size_per_tile_part *
13388
0
                 p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
13389
0
    l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
13390
0
    l_current_position = opj_stream_tell(p_stream);
13391
13392
0
    if (! opj_stream_seek(p_stream, l_tlm_position, p_manager)) {
13393
0
        return OPJ_FALSE;
13394
0
    }
13395
13396
0
    if (opj_stream_write_data(p_stream,
13397
0
                              p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer, l_tlm_size,
13398
0
                              p_manager) != l_tlm_size) {
13399
0
        return OPJ_FALSE;
13400
0
    }
13401
13402
0
    if (! opj_stream_seek(p_stream, l_current_position, p_manager)) {
13403
0
        return OPJ_FALSE;
13404
0
    }
13405
13406
0
    return OPJ_TRUE;
13407
0
}
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
0
{
13413
    /* preconditions */
13414
0
    assert(p_j2k != 00);
13415
0
    assert(p_manager != 00);
13416
0
    assert(p_stream != 00);
13417
13418
0
    OPJ_UNUSED(p_stream);
13419
0
    OPJ_UNUSED(p_manager);
13420
13421
0
    opj_tcd_destroy(p_j2k->m_tcd);
13422
0
    p_j2k->m_tcd = 00;
13423
13424
0
    if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
13425
0
        opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
13426
0
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
13427
0
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
13428
0
    }
13429
13430
0
    if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
13431
0
        opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
13432
0
        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
13433
0
    }
13434
13435
0
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
13436
13437
0
    return OPJ_TRUE;
13438
0
}
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
0
{
13448
    /* preconditions */
13449
0
    assert(p_j2k != 00);
13450
0
    assert(p_stream != 00);
13451
0
    assert(p_manager != 00);
13452
13453
0
    OPJ_UNUSED(p_stream);
13454
0
    OPJ_UNUSED(p_manager);
13455
13456
0
    if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
13457
0
        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
13458
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
13459
0
    }
13460
13461
0
    p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
13462
13463
0
    return OPJ_TRUE;
13464
0
}
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
0
{
13470
0
    opj_codestream_info_t * l_cstr_info = 00;
13471
13472
    /* preconditions */
13473
0
    assert(p_j2k != 00);
13474
0
    assert(p_manager != 00);
13475
0
    assert(p_stream != 00);
13476
0
    (void)l_cstr_info;
13477
13478
0
    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
0
    return opj_j2k_calculate_tp(p_j2k, &(p_j2k->m_cp),
13520
0
                                &p_j2k->m_specific_param.m_encoder.m_total_tile_parts, p_j2k->m_private_image,
13521
0
                                p_manager);
13522
0
}
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
0
{
13536
    /* preconditions */
13537
0
    assert(p_j2k != 00);
13538
0
    assert(p_manager != 00);
13539
0
    assert(p_stream != 00);
13540
13541
0
    OPJ_UNUSED(p_stream);
13542
13543
0
    p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
13544
13545
0
    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
0
    if (!opj_tcd_init(p_j2k->m_tcd, p_j2k->m_private_image, &p_j2k->m_cp,
13551
0
                      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
0
    return OPJ_TRUE;
13558
0
}
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
}