Coverage Report

Created: 2026-09-14 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/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
1.72k
{
1653
1.72k
    const j2k_prog_order_t *po;
1654
3.45k
    for (po = j2k_prog_order_list; po->enum_prog != -1; po++) {
1655
3.45k
        if (po->enum_prog == prg_order) {
1656
1.72k
            return po->str_prog;
1657
1.72k
        }
1658
3.45k
    }
1659
0
    return po->str_prog;
1660
1.72k
}
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
510
{
1752
510
    const OPJ_CHAR *prog = 00;
1753
510
    OPJ_INT32 i;
1754
510
    OPJ_UINT32 tpnum = 1;
1755
510
    opj_tcp_t *tcp = 00;
1756
510
    opj_poc_t * l_current_poc = 00;
1757
1758
    /*  preconditions */
1759
510
    assert(tileno < (cp->tw * cp->th));
1760
510
    assert(pino < (cp->tcps[tileno].numpocs + 1));
1761
1762
    /* get the given tile coding parameter */
1763
510
    tcp = &cp->tcps[tileno];
1764
510
    assert(tcp != 00);
1765
1766
510
    l_current_poc = &(tcp->pocs[pino]);
1767
510
    assert(l_current_poc != 0);
1768
1769
    /* get the progression order as a character string */
1770
510
    prog = opj_j2k_convert_progression_order(tcp->prg);
1771
510
    assert(strlen(prog) > 0);
1772
1773
510
    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
510
    } else {
1800
510
        tpnum = 1;
1801
510
    }
1802
1803
510
    return tpnum;
1804
510
}
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
255
{
1813
255
    OPJ_UINT32 pino, tileno;
1814
255
    OPJ_UINT32 l_nb_tiles;
1815
255
    opj_tcp_t *tcp;
1816
1817
    /* preconditions */
1818
255
    assert(p_nb_tiles != 00);
1819
255
    assert(cp != 00);
1820
255
    assert(image != 00);
1821
255
    assert(p_j2k != 00);
1822
255
    assert(p_manager != 00);
1823
1824
255
    OPJ_UNUSED(p_j2k);
1825
255
    OPJ_UNUSED(p_manager);
1826
1827
255
    l_nb_tiles = cp->tw * cp->th;
1828
255
    * p_nb_tiles = 0;
1829
255
    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
510
        for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1867
255
            OPJ_UINT32 cur_totnum_tp = 0;
1868
1869
255
            opj_pi_update_encoding_parameters(image, cp, tileno);
1870
1871
510
            for (pino = 0; pino <= tcp->numpocs; ++pino) {
1872
255
                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp, pino, tileno);
1873
1874
255
                *p_nb_tiles = *p_nb_tiles + tp_num;
1875
1876
255
                cur_totnum_tp += tp_num;
1877
255
            }
1878
255
            tcp->m_nb_tile_parts = cur_totnum_tp;
1879
1880
255
            ++tcp;
1881
255
        }
1882
255
    }
1883
1884
255
    return OPJ_TRUE;
1885
255
}
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
255
{
1891
    /* 2 bytes will be written */
1892
255
    OPJ_BYTE * l_start_stream = 00;
1893
1894
    /* preconditions */
1895
255
    assert(p_stream != 00);
1896
255
    assert(p_j2k != 00);
1897
255
    assert(p_manager != 00);
1898
1899
255
    l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1900
1901
    /* write SOC identifier */
1902
255
    opj_write_bytes(l_start_stream, J2K_MS_SOC, 2);
1903
1904
255
    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
255
    return OPJ_TRUE;
1919
255
}
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
11
{
1932
11
    OPJ_BYTE l_data [2];
1933
11
    OPJ_UINT32 l_marker;
1934
1935
    /* preconditions */
1936
11
    assert(p_j2k != 00);
1937
11
    assert(p_manager != 00);
1938
11
    assert(p_stream != 00);
1939
1940
11
    if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
1941
3
        return OPJ_FALSE;
1942
3
    }
1943
1944
8
    opj_read_bytes(l_data, &l_marker, 2);
1945
8
    if (l_marker != J2K_MS_SOC) {
1946
8
        return OPJ_FALSE;
1947
8
    }
1948
1949
    /* Next marker should be a SIZ marker in the main header */
1950
0
    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
0
    p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
1954
1955
0
    opj_event_msg(p_manager, EVT_INFO,
1956
0
                  "Start to read j2k main header (%" PRId64 ").\n",
1957
0
                  p_j2k->cstr_index->main_head_start);
1958
1959
    /* Add the marker to the codestream index*/
1960
0
    if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC,
1961
0
                                          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
0
    return OPJ_TRUE;
1966
0
}
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
255
{
1972
255
    OPJ_UINT32 i;
1973
255
    OPJ_UINT32 l_size_len;
1974
255
    OPJ_BYTE * l_current_ptr;
1975
255
    opj_image_t * l_image = 00;
1976
255
    opj_cp_t *cp = 00;
1977
255
    opj_image_comp_t * l_img_comp = 00;
1978
1979
    /* preconditions */
1980
255
    assert(p_stream != 00);
1981
255
    assert(p_j2k != 00);
1982
255
    assert(p_manager != 00);
1983
1984
255
    l_image = p_j2k->m_private_image;
1985
255
    cp = &(p_j2k->m_cp);
1986
255
    l_size_len = 40 + 3 * l_image->numcomps;
1987
255
    l_img_comp = l_image->comps;
1988
1989
255
    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
255
    l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2005
2006
    /* write SOC identifier */
2007
255
    opj_write_bytes(l_current_ptr, J2K_MS_SIZ, 2);  /* SIZ */
2008
255
    l_current_ptr += 2;
2009
2010
255
    opj_write_bytes(l_current_ptr, l_size_len - 2, 2); /* L_SIZ */
2011
255
    l_current_ptr += 2;
2012
2013
255
    opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */
2014
255
    l_current_ptr += 2;
2015
2016
255
    opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
2017
255
    l_current_ptr += 4;
2018
2019
255
    opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
2020
255
    l_current_ptr += 4;
2021
2022
255
    opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
2023
255
    l_current_ptr += 4;
2024
2025
255
    opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
2026
255
    l_current_ptr += 4;
2027
2028
255
    opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */
2029
255
    l_current_ptr += 4;
2030
2031
255
    opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */
2032
255
    l_current_ptr += 4;
2033
2034
255
    opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */
2035
255
    l_current_ptr += 4;
2036
2037
255
    opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */
2038
255
    l_current_ptr += 4;
2039
2040
255
    opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */
2041
255
    l_current_ptr += 2;
2042
2043
1.02k
    for (i = 0; i < l_image->numcomps; ++i) {
2044
        /* TODO here with MCT ? */
2045
765
        opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7),
2046
765
                        1);      /* Ssiz_i */
2047
765
        ++l_current_ptr;
2048
2049
765
        opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */
2050
765
        ++l_current_ptr;
2051
2052
765
        opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */
2053
765
        ++l_current_ptr;
2054
2055
765
        ++l_img_comp;
2056
765
    }
2057
2058
255
    if (opj_stream_write_data(p_stream,
2059
255
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len,
2060
255
                              p_manager) != l_size_len) {
2061
0
        return OPJ_FALSE;
2062
0
    }
2063
2064
255
    return OPJ_TRUE;
2065
255
}
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
0
{
2080
0
    OPJ_UINT32 i;
2081
0
    OPJ_UINT32 l_nb_comp;
2082
0
    OPJ_UINT32 l_nb_comp_remain;
2083
0
    OPJ_UINT32 l_remaining_size;
2084
0
    OPJ_UINT32 l_nb_tiles;
2085
0
    OPJ_UINT32 l_tmp, l_tx1, l_ty1;
2086
0
    OPJ_UINT32 l_prec0, l_sgnd0;
2087
0
    opj_image_t *l_image = 00;
2088
0
    opj_cp_t *l_cp = 00;
2089
0
    opj_image_comp_t * l_img_comp = 00;
2090
0
    opj_tcp_t * l_current_tile_param = 00;
2091
2092
    /* preconditions */
2093
0
    assert(p_j2k != 00);
2094
0
    assert(p_manager != 00);
2095
0
    assert(p_header_data != 00);
2096
2097
0
    l_image = p_j2k->m_private_image;
2098
0
    l_cp = &(p_j2k->m_cp);
2099
2100
    /* minimum size == 39 - 3 (= minimum component parameter) */
2101
0
    if (p_header_size < 36) {
2102
0
        opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2103
0
        return OPJ_FALSE;
2104
0
    }
2105
2106
0
    l_remaining_size = p_header_size - 36;
2107
0
    l_nb_comp = l_remaining_size / 3;
2108
0
    l_nb_comp_remain = l_remaining_size % 3;
2109
0
    if (l_nb_comp_remain != 0) {
2110
0
        opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2111
0
        return OPJ_FALSE;
2112
0
    }
2113
2114
0
    opj_read_bytes(p_header_data, &l_tmp,
2115
0
                   2);                                                /* Rsiz (capabilities) */
2116
0
    p_header_data += 2;
2117
0
    l_cp->rsiz = (OPJ_UINT16) l_tmp;
2118
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */
2119
0
    p_header_data += 4;
2120
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */
2121
0
    p_header_data += 4;
2122
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */
2123
0
    p_header_data += 4;
2124
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */
2125
0
    p_header_data += 4;
2126
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx,
2127
0
                   4);             /* XTsiz */
2128
0
    p_header_data += 4;
2129
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy,
2130
0
                   4);             /* YTsiz */
2131
0
    p_header_data += 4;
2132
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0,
2133
0
                   4);             /* XT0siz */
2134
0
    p_header_data += 4;
2135
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0,
2136
0
                   4);             /* YT0siz */
2137
0
    p_header_data += 4;
2138
0
    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp,
2139
0
                   2);                 /* Csiz */
2140
0
    p_header_data += 2;
2141
0
    if (l_tmp < 16385) {
2142
0
        l_image->numcomps = (OPJ_UINT16) l_tmp;
2143
0
    } else {
2144
0
        opj_event_msg(p_manager, EVT_ERROR,
2145
0
                      "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
2146
0
        return OPJ_FALSE;
2147
0
    }
2148
2149
0
    if (l_image->numcomps != l_nb_comp) {
2150
0
        opj_event_msg(p_manager, EVT_ERROR,
2151
0
                      "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n",
2152
0
                      l_image->numcomps, l_nb_comp);
2153
0
        return OPJ_FALSE;
2154
0
    }
2155
2156
    /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
2157
    /* testcase issue427-null-image-size.jp2 */
2158
0
    if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) {
2159
0
        opj_event_msg(p_manager, EVT_ERROR,
2160
0
                      "Error with SIZ marker: negative or zero image size (%" PRId64 " x %" PRId64
2161
0
                      ")\n", (OPJ_INT64)l_image->x1 - l_image->x0,
2162
0
                      (OPJ_INT64)l_image->y1 - l_image->y0);
2163
0
        return OPJ_FALSE;
2164
0
    }
2165
    /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
2166
0
    if ((l_cp->tdx == 0U) || (l_cp->tdy == 0U)) {
2167
0
        opj_event_msg(p_manager, EVT_ERROR,
2168
0
                      "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx,
2169
0
                      l_cp->tdy);
2170
0
        return OPJ_FALSE;
2171
0
    }
2172
2173
    /* testcase issue427-illegal-tile-offset.jp2 */
2174
0
    l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */
2175
0
    l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */
2176
0
    if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) ||
2177
0
            (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0)) {
2178
0
        opj_event_msg(p_manager, EVT_ERROR,
2179
0
                      "Error with SIZ marker: illegal tile offset\n");
2180
0
        return OPJ_FALSE;
2181
0
    }
2182
0
    if (!p_j2k->dump_state) {
2183
0
        OPJ_UINT32 siz_w, siz_h;
2184
2185
0
        siz_w = l_image->x1 - l_image->x0;
2186
0
        siz_h = l_image->y1 - l_image->y0;
2187
2188
0
        if (p_j2k->ihdr_w > 0 && p_j2k->ihdr_h > 0
2189
0
                && (p_j2k->ihdr_w != siz_w || p_j2k->ihdr_h != siz_h)) {
2190
0
            opj_event_msg(p_manager, EVT_ERROR,
2191
0
                          "Error with SIZ marker: IHDR w(%u) h(%u) vs. SIZ w(%u) h(%u)\n", p_j2k->ihdr_w,
2192
0
                          p_j2k->ihdr_h, siz_w, siz_h);
2193
0
            return OPJ_FALSE;
2194
0
        }
2195
0
    }
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
0
    l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps,
2240
0
                     sizeof(opj_image_comp_t));
2241
0
    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
0
    l_img_comp = l_image->comps;
2249
2250
0
    l_prec0 = 0;
2251
0
    l_sgnd0 = 0;
2252
    /* Read the component information */
2253
0
    for (i = 0; i < l_image->numcomps; ++i) {
2254
0
        OPJ_UINT32 tmp;
2255
0
        opj_read_bytes(p_header_data, &tmp, 1); /* Ssiz_i */
2256
0
        ++p_header_data;
2257
0
        l_img_comp->prec = (tmp & 0x7f) + 1;
2258
0
        l_img_comp->sgnd = tmp >> 7;
2259
2260
0
        if (p_j2k->dump_state == 0) {
2261
0
            if (i == 0) {
2262
0
                l_prec0 = l_img_comp->prec;
2263
0
                l_sgnd0 = l_img_comp->sgnd;
2264
0
            } else if (!l_cp->allow_different_bit_depth_sign
2265
0
                       && (l_img_comp->prec != l_prec0 || l_img_comp->sgnd != l_sgnd0)) {
2266
0
                opj_event_msg(p_manager, EVT_WARNING,
2267
0
                              "Despite JP2 BPC!=255, precision and/or sgnd values for comp[%d] is different than comp[0]:\n"
2268
0
                              "        [0] prec(%d) sgnd(%d) [%d] prec(%d) sgnd(%d)\n", i, l_prec0, l_sgnd0,
2269
0
                              i, l_img_comp->prec, l_img_comp->sgnd);
2270
0
            }
2271
            /* TODO: we should perhaps also check against JP2 BPCC values */
2272
0
        }
2273
0
        opj_read_bytes(p_header_data, &tmp, 1); /* XRsiz_i */
2274
0
        ++p_header_data;
2275
0
        l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2276
0
        opj_read_bytes(p_header_data, &tmp, 1); /* YRsiz_i */
2277
0
        ++p_header_data;
2278
0
        l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2279
0
        if (l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
2280
0
                l_img_comp->dy < 1 || l_img_comp->dy > 255) {
2281
0
            opj_event_msg(p_manager, EVT_ERROR,
2282
0
                          "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n",
2283
0
                          i, l_img_comp->dx, l_img_comp->dy);
2284
0
            return OPJ_FALSE;
2285
0
        }
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
0
        if (l_img_comp->prec > 31) {
2290
0
            opj_event_msg(p_manager, EVT_ERROR,
2291
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",
2292
0
                          i, l_img_comp->prec);
2293
0
            return OPJ_FALSE;
2294
0
        }
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
0
        l_img_comp->resno_decoded =
2325
0
            0;                                                          /* number of resolution decoded */
2326
0
        l_img_comp->factor =
2327
0
            l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
2328
0
        ++l_img_comp;
2329
0
    }
2330
2331
0
    if (l_cp->tdx == 0 || l_cp->tdy == 0) {
2332
0
        return OPJ_FALSE;
2333
0
    }
2334
2335
    /* Compute the number of tiles */
2336
0
    l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
2337
0
    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
0
    if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
2341
0
        opj_event_msg(p_manager, EVT_ERROR,
2342
0
                      "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
2343
0
                      l_cp->tw, l_cp->th);
2344
0
        return OPJ_FALSE;
2345
0
    }
2346
0
    l_nb_tiles = l_cp->tw * l_cp->th;
2347
2348
    /* Define the tiles which will be decoded */
2349
0
    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
0
    } else {
2361
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
2362
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
2363
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
2364
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
2365
0
    }
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
0
    l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
2414
0
    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
0
    p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
2434
0
        (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
2435
0
    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
0
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
2442
0
        (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS,
2443
0
                                    sizeof(opj_mct_data_t));
2444
2445
0
    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
0
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records =
2451
0
        OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
2452
2453
0
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
2454
0
        (opj_simple_mcc_decorrelation_data_t*)
2455
0
        opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS,
2456
0
                   sizeof(opj_simple_mcc_decorrelation_data_t));
2457
2458
0
    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
0
    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records =
2464
0
        OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
2465
2466
    /* set up default dc level shift */
2467
0
    for (i = 0; i < l_image->numcomps; ++i) {
2468
0
        if (! l_image->comps[i].sgnd) {
2469
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
2470
0
                    << (l_image->comps[i].prec - 1);
2471
0
        }
2472
0
    }
2473
2474
0
    l_current_tile_param = l_cp->tcps;
2475
0
    for (i = 0; i < l_nb_tiles; ++i) {
2476
0
        l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps,
2477
0
                                      sizeof(opj_tccp_t));
2478
0
        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
0
        ++l_current_tile_param;
2485
0
    }
2486
2487
    /*Allocate and initialize some elements of codestrem index*/
2488
0
    if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
2489
0
        return OPJ_FALSE;
2490
0
    }
2491
2492
0
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MH;
2493
0
    opj_image_comp_header_update(l_image, l_cp);
2494
2495
0
    return OPJ_TRUE;
2496
0
}
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
255
{
2503
255
    OPJ_UINT32 l_comment_size;
2504
255
    OPJ_UINT32 l_total_com_size;
2505
255
    const OPJ_CHAR *l_comment;
2506
255
    OPJ_BYTE * l_current_ptr = 00;
2507
2508
    /* preconditions */
2509
255
    assert(p_j2k != 00);
2510
255
    assert(p_stream != 00);
2511
255
    assert(p_manager != 00);
2512
2513
255
    l_comment = p_j2k->m_cp.comment;
2514
255
    l_comment_size = (OPJ_UINT32)strlen(l_comment);
2515
255
    l_total_com_size = l_comment_size + 6;
2516
2517
255
    if (l_total_com_size >
2518
255
            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
255
    l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2534
2535
255
    opj_write_bytes(l_current_ptr, J2K_MS_COM, 2);  /* COM */
2536
255
    l_current_ptr += 2;
2537
2538
255
    opj_write_bytes(l_current_ptr, l_total_com_size - 2, 2);        /* L_COM */
2539
255
    l_current_ptr += 2;
2540
2541
255
    opj_write_bytes(l_current_ptr, 1,
2542
255
                    2);   /* General use (IS 8859-15:1999 (Latin) values) */
2543
255
    l_current_ptr += 2;
2544
2545
255
    memcpy(l_current_ptr, l_comment, l_comment_size);
2546
2547
255
    if (opj_stream_write_data(p_stream,
2548
255
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size,
2549
255
                              p_manager) != l_total_com_size) {
2550
0
        return OPJ_FALSE;
2551
0
    }
2552
2553
255
    return OPJ_TRUE;
2554
255
}
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
0
{
2569
    /* preconditions */
2570
0
    assert(p_j2k != 00);
2571
0
    assert(p_manager != 00);
2572
0
    assert(p_header_data != 00);
2573
2574
0
    OPJ_UNUSED(p_j2k);
2575
0
    OPJ_UNUSED(p_header_data);
2576
0
    OPJ_UNUSED(p_header_size);
2577
0
    OPJ_UNUSED(p_manager);
2578
2579
0
    return OPJ_TRUE;
2580
0
}
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
255
{
2586
255
    opj_cp_t *l_cp = 00;
2587
255
    opj_tcp_t *l_tcp = 00;
2588
255
    OPJ_UINT32 l_code_size, l_remaining_size;
2589
255
    OPJ_BYTE * l_current_data = 00;
2590
2591
    /* preconditions */
2592
255
    assert(p_j2k != 00);
2593
255
    assert(p_manager != 00);
2594
255
    assert(p_stream != 00);
2595
2596
255
    l_cp = &(p_j2k->m_cp);
2597
255
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2598
255
    l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2599
255
                  p_j2k->m_current_tile_number, 0);
2600
255
    l_remaining_size = l_code_size;
2601
2602
255
    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
255
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2617
2618
255
    opj_write_bytes(l_current_data, J2K_MS_COD, 2);           /* COD */
2619
255
    l_current_data += 2;
2620
2621
255
    opj_write_bytes(l_current_data, l_code_size - 2, 2);      /* L_COD */
2622
255
    l_current_data += 2;
2623
2624
255
    opj_write_bytes(l_current_data, l_tcp->csty, 1);          /* Scod */
2625
255
    ++l_current_data;
2626
2627
255
    opj_write_bytes(l_current_data, (OPJ_UINT32)l_tcp->prg, 1); /* SGcod (A) */
2628
255
    ++l_current_data;
2629
2630
255
    opj_write_bytes(l_current_data, l_tcp->numlayers, 2);     /* SGcod (B) */
2631
255
    l_current_data += 2;
2632
2633
255
    opj_write_bytes(l_current_data, l_tcp->mct, 1);           /* SGcod (C) */
2634
255
    ++l_current_data;
2635
2636
255
    l_remaining_size -= 9;
2637
2638
255
    if (! opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
2639
255
                                    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
255
    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
255
    if (opj_stream_write_data(p_stream,
2650
255
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size,
2651
255
                              p_manager) != l_code_size) {
2652
0
        return OPJ_FALSE;
2653
0
    }
2654
2655
255
    return OPJ_TRUE;
2656
255
}
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
0
{
2671
    /* loop */
2672
0
    OPJ_UINT32 i;
2673
0
    OPJ_UINT32 l_tmp;
2674
0
    opj_cp_t *l_cp = 00;
2675
0
    opj_tcp_t *l_tcp = 00;
2676
0
    opj_image_t *l_image = 00;
2677
2678
    /* preconditions */
2679
0
    assert(p_header_data != 00);
2680
0
    assert(p_j2k != 00);
2681
0
    assert(p_manager != 00);
2682
2683
0
    l_image = p_j2k->m_private_image;
2684
0
    l_cp = &(p_j2k->m_cp);
2685
2686
    /* If we are in the first tile-part header of the current tile */
2687
0
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
2688
0
            &l_cp->tcps[p_j2k->m_current_tile_number] :
2689
0
            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
0
    l_tcp->cod = 1;
2703
2704
    /* Make sure room is sufficient */
2705
0
    if (p_header_size < 5) {
2706
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2707
0
        return OPJ_FALSE;
2708
0
    }
2709
2710
0
    opj_read_bytes(p_header_data, &l_tcp->csty, 1);         /* Scod */
2711
0
    ++p_header_data;
2712
    /* Make sure we know how to decode this */
2713
0
    if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP |
2714
0
                                     J2K_CP_CSTY_EPH)) != 0U) {
2715
0
        opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n");
2716
0
        return OPJ_FALSE;
2717
0
    }
2718
0
    opj_read_bytes(p_header_data, &l_tmp, 1);                       /* SGcod (A) */
2719
0
    ++p_header_data;
2720
0
    l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
2721
    /* Make sure progression order is valid */
2722
0
    if (l_tcp->prg > OPJ_CPRL) {
2723
0
        opj_event_msg(p_manager, EVT_ERROR,
2724
0
                      "Unknown progression order in COD marker\n");
2725
0
        l_tcp->prg = OPJ_PROG_UNKNOWN;
2726
0
    }
2727
0
    opj_read_bytes(p_header_data, &l_tcp->numlayers, 2);    /* SGcod (B) */
2728
0
    p_header_data += 2;
2729
2730
0
    if ((l_tcp->numlayers < 1U) || (l_tcp->numlayers > 65535U)) {
2731
0
        opj_event_msg(p_manager, EVT_ERROR,
2732
0
                      "Invalid number of layers in COD marker : %d not in range [1-65535]\n",
2733
0
                      l_tcp->numlayers);
2734
0
        return OPJ_FALSE;
2735
0
    }
2736
2737
    /* If user didn't set a number layer to decode take the max specify in the codestream. */
2738
0
    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
0
    } else {
2741
0
        l_tcp->num_layers_to_decode = l_tcp->numlayers;
2742
0
    }
2743
2744
0
    opj_read_bytes(p_header_data, &l_tcp->mct, 1);          /* SGcod (C) */
2745
0
    ++p_header_data;
2746
2747
0
    if (l_tcp->mct > 1) {
2748
0
        opj_event_msg(p_manager, EVT_ERROR,
2749
0
                      "Invalid multiple component transformation\n");
2750
0
        return OPJ_FALSE;
2751
0
    }
2752
2753
0
    p_header_size -= 5;
2754
0
    for (i = 0; i < l_image->numcomps; ++i) {
2755
0
        l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
2756
0
    }
2757
2758
0
    if (! opj_j2k_read_SPCod_SPCoc(p_j2k, 0, p_header_data, &p_header_size,
2759
0
                                   p_manager)) {
2760
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2761
0
        return OPJ_FALSE;
2762
0
    }
2763
2764
0
    if (p_header_size != 0) {
2765
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2766
0
        return OPJ_FALSE;
2767
0
    }
2768
2769
    /* Apply the coding style to other components of the current tile or the m_default_tcp*/
2770
0
    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
0
    return OPJ_TRUE;
2790
0
}
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
510
{
2846
510
    opj_cp_t *l_cp = NULL;
2847
510
    opj_tcp_t *l_tcp = NULL;
2848
2849
    /* preconditions */
2850
510
    assert(p_j2k != 00);
2851
2852
510
    l_cp = &(p_j2k->m_cp);
2853
510
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2854
2855
510
    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
510
    return opj_j2k_compare_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number,
2861
510
                                       p_first_comp_no, p_second_comp_no);
2862
510
}
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
510
{
2916
510
    OPJ_UINT32 i, j;
2917
510
    OPJ_UINT32 l_nb_comp;
2918
510
    OPJ_UINT32 l_nb_tiles;
2919
510
    OPJ_UINT32 l_max = 0;
2920
2921
    /* preconditions */
2922
2923
510
    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
2924
510
    l_nb_comp = p_j2k->m_private_image->numcomps;
2925
2926
1.02k
    for (i = 0; i < l_nb_tiles; ++i) {
2927
2.04k
        for (j = 0; j < l_nb_comp; ++j) {
2928
1.53k
            l_max = opj_uint_max(l_max, opj_j2k_get_SPCod_SPCoc_size(p_j2k, i, j));
2929
1.53k
        }
2930
510
    }
2931
2932
510
    return 6 + l_max;
2933
510
}
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
0
{
2948
0
    opj_cp_t *l_cp = NULL;
2949
0
    opj_tcp_t *l_tcp = NULL;
2950
0
    opj_image_t *l_image = NULL;
2951
0
    OPJ_UINT32 l_comp_room;
2952
0
    OPJ_UINT32 l_comp_no;
2953
2954
    /* preconditions */
2955
0
    assert(p_header_data != 00);
2956
0
    assert(p_j2k != 00);
2957
0
    assert(p_manager != 00);
2958
2959
0
    l_cp = &(p_j2k->m_cp);
2960
0
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
2961
0
            ?
2962
0
            &l_cp->tcps[p_j2k->m_current_tile_number] :
2963
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
2964
0
    l_image = p_j2k->m_private_image;
2965
2966
0
    l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
2967
2968
    /* make sure room is sufficient*/
2969
0
    if (p_header_size < l_comp_room + 1) {
2970
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2971
0
        return OPJ_FALSE;
2972
0
    }
2973
0
    p_header_size -= l_comp_room + 1;
2974
2975
0
    opj_read_bytes(p_header_data, &l_comp_no,
2976
0
                   l_comp_room);                 /* Ccoc */
2977
0
    p_header_data += l_comp_room;
2978
0
    if (l_comp_no >= l_image->numcomps) {
2979
0
        opj_event_msg(p_manager, EVT_ERROR,
2980
0
                      "Error reading COC marker (bad number of components)\n");
2981
0
        return OPJ_FALSE;
2982
0
    }
2983
2984
0
    opj_read_bytes(p_header_data, &l_tcp->tccps[l_comp_no].csty,
2985
0
                   1);                  /* Scoc */
2986
0
    ++p_header_data ;
2987
2988
0
    if (! opj_j2k_read_SPCod_SPCoc(p_j2k, l_comp_no, p_header_data, &p_header_size,
2989
0
                                   p_manager)) {
2990
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2991
0
        return OPJ_FALSE;
2992
0
    }
2993
2994
0
    if (p_header_size != 0) {
2995
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2996
0
        return OPJ_FALSE;
2997
0
    }
2998
0
    return OPJ_TRUE;
2999
0
}
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
255
{
3006
255
    OPJ_UINT32 l_qcd_size, l_remaining_size;
3007
255
    OPJ_BYTE * l_current_data = 00;
3008
3009
    /* preconditions */
3010
255
    assert(p_j2k != 00);
3011
255
    assert(p_manager != 00);
3012
255
    assert(p_stream != 00);
3013
3014
255
    l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3015
255
                 0);
3016
255
    l_remaining_size = l_qcd_size;
3017
3018
255
    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
255
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
3033
3034
255
    opj_write_bytes(l_current_data, J2K_MS_QCD, 2);         /* QCD */
3035
255
    l_current_data += 2;
3036
3037
255
    opj_write_bytes(l_current_data, l_qcd_size - 2, 2);     /* L_QCD */
3038
255
    l_current_data += 2;
3039
3040
255
    l_remaining_size -= 4;
3041
3042
255
    if (! opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, 0,
3043
255
                                  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
255
    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
255
    if (opj_stream_write_data(p_stream,
3054
255
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size,
3055
255
                              p_manager) != l_qcd_size) {
3056
0
        return OPJ_FALSE;
3057
0
    }
3058
3059
255
    return OPJ_TRUE;
3060
255
}
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
0
{
3075
    /* preconditions */
3076
0
    assert(p_header_data != 00);
3077
0
    assert(p_j2k != 00);
3078
0
    assert(p_manager != 00);
3079
3080
0
    if (! opj_j2k_read_SQcd_SQcc(p_j2k, 0, p_header_data, &p_header_size,
3081
0
                                 p_manager)) {
3082
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3083
0
        return OPJ_FALSE;
3084
0
    }
3085
3086
0
    if (p_header_size != 0) {
3087
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3088
0
        return OPJ_FALSE;
3089
0
    }
3090
3091
    /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
3092
0
    opj_j2k_copy_tile_quantization_parameters(p_j2k);
3093
3094
0
    return OPJ_TRUE;
3095
0
}
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
510
{
3145
510
    return opj_j2k_compare_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number,
3146
510
                                     p_first_comp_no, p_second_comp_no);
3147
510
}
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
255
{
3201
255
    return opj_j2k_get_max_coc_size(p_j2k);
3202
255
}
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
0
{
3217
0
    OPJ_UINT32 l_num_comp, l_comp_no;
3218
3219
    /* preconditions */
3220
0
    assert(p_header_data != 00);
3221
0
    assert(p_j2k != 00);
3222
0
    assert(p_manager != 00);
3223
3224
0
    l_num_comp = p_j2k->m_private_image->numcomps;
3225
3226
0
    if (l_num_comp <= 256) {
3227
0
        if (p_header_size < 1) {
3228
0
            opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3229
0
            return OPJ_FALSE;
3230
0
        }
3231
0
        opj_read_bytes(p_header_data, &l_comp_no, 1);
3232
0
        ++p_header_data;
3233
0
        --p_header_size;
3234
0
    } 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
0
    if (l_comp_no >= p_j2k->m_private_image->numcomps) {
3271
0
        opj_event_msg(p_manager, EVT_ERROR,
3272
0
                      "Invalid component number: %d, regarding the number of components %d\n",
3273
0
                      l_comp_no, p_j2k->m_private_image->numcomps);
3274
0
        return OPJ_FALSE;
3275
0
    }
3276
3277
0
    if (! opj_j2k_read_SQcd_SQcc(p_j2k, l_comp_no, p_header_data, &p_header_size,
3278
0
                                 p_manager)) {
3279
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3280
0
        return OPJ_FALSE;
3281
0
    }
3282
3283
0
    if (p_header_size != 0) {
3284
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3285
0
        return OPJ_FALSE;
3286
0
    }
3287
3288
0
    return OPJ_TRUE;
3289
0
}
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
255
{
3435
255
    opj_tcp_t * l_tcp = 00;
3436
255
    OPJ_UINT32 l_nb_tiles = 0;
3437
255
    OPJ_UINT32 l_max_poc = 0;
3438
255
    OPJ_UINT32 i;
3439
3440
255
    l_tcp = p_j2k->m_cp.tcps;
3441
255
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
3442
3443
510
    for (i = 0; i < l_nb_tiles; ++i) {
3444
255
        l_max_poc = opj_uint_max(l_max_poc, l_tcp->numpocs);
3445
255
        ++l_tcp;
3446
255
    }
3447
3448
255
    ++l_max_poc;
3449
3450
255
    return 4 + 9 * l_max_poc;
3451
255
}
3452
3453
static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k)
3454
255
{
3455
255
    OPJ_UINT32 i;
3456
255
    OPJ_UINT32 l_nb_tiles;
3457
255
    OPJ_UINT32 l_max = 0;
3458
255
    opj_tcp_t * l_tcp = 00;
3459
3460
255
    l_tcp = p_j2k->m_cp.tcps;
3461
255
    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
3462
3463
510
    for (i = 0; i < l_nb_tiles; ++i) {
3464
255
        l_max = opj_uint_max(l_max, l_tcp->m_nb_tile_parts);
3465
3466
255
        ++l_tcp;
3467
255
    }
3468
3469
255
    return 12 * l_max;
3470
255
}
3471
3472
static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
3473
255
{
3474
255
    OPJ_UINT32 l_nb_bytes = 0;
3475
255
    OPJ_UINT32 l_nb_comps;
3476
255
    OPJ_UINT32 l_coc_bytes, l_qcc_bytes;
3477
3478
255
    l_nb_comps = p_j2k->m_private_image->numcomps - 1;
3479
255
    l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
3480
3481
255
    if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) {
3482
255
        l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
3483
255
        l_nb_bytes += l_nb_comps * l_coc_bytes;
3484
3485
255
        l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
3486
255
        l_nb_bytes += l_nb_comps * l_qcc_bytes;
3487
255
    }
3488
3489
255
    l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
3490
3491
255
    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
255
    return l_nb_bytes;
3516
255
}
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
0
{
3532
0
    OPJ_UINT32 i, l_nb_comp, l_tmp;
3533
0
    opj_image_t * l_image = 00;
3534
0
    OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
3535
0
    OPJ_UINT32 l_chunk_size, l_comp_room;
3536
3537
0
    opj_cp_t *l_cp = 00;
3538
0
    opj_tcp_t *l_tcp = 00;
3539
0
    opj_poc_t *l_current_poc = 00;
3540
3541
    /* preconditions */
3542
0
    assert(p_header_data != 00);
3543
0
    assert(p_j2k != 00);
3544
0
    assert(p_manager != 00);
3545
3546
0
    l_image = p_j2k->m_private_image;
3547
0
    l_nb_comp = l_image->numcomps;
3548
0
    if (l_nb_comp <= 256) {
3549
0
        l_comp_room = 1;
3550
0
    } else {
3551
0
        l_comp_room = 2;
3552
0
    }
3553
0
    l_chunk_size = 5 + 2 * l_comp_room;
3554
0
    l_current_poc_nb = p_header_size / l_chunk_size;
3555
0
    l_current_poc_remaining = p_header_size % l_chunk_size;
3556
3557
0
    if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
3558
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
3559
0
        return OPJ_FALSE;
3560
0
    }
3561
3562
0
    l_cp = &(p_j2k->m_cp);
3563
0
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
3564
0
            &l_cp->tcps[p_j2k->m_current_tile_number] :
3565
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
3566
0
    l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
3567
0
    l_current_poc_nb += l_old_poc_nb;
3568
3569
0
    if (l_current_poc_nb >= J2K_MAX_POCS) {
3570
0
        opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
3571
0
        return OPJ_FALSE;
3572
0
    }
3573
3574
    /* now poc is in use.*/
3575
0
    l_tcp->POC = 1;
3576
3577
0
    l_current_poc = &l_tcp->pocs[l_old_poc_nb];
3578
0
    for (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
3579
0
        opj_read_bytes(p_header_data, &(l_current_poc->resno0),
3580
0
                       1);                               /* RSpoc_i */
3581
0
        ++p_header_data;
3582
0
        opj_read_bytes(p_header_data, &(l_current_poc->compno0),
3583
0
                       l_comp_room);  /* CSpoc_i */
3584
0
        p_header_data += l_comp_room;
3585
0
        opj_read_bytes(p_header_data, &(l_current_poc->layno1),
3586
0
                       2);                               /* LYEpoc_i */
3587
        /* make sure layer end is in acceptable bounds */
3588
0
        l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
3589
0
        p_header_data += 2;
3590
0
        opj_read_bytes(p_header_data, &(l_current_poc->resno1),
3591
0
                       1);                               /* REpoc_i */
3592
0
        ++p_header_data;
3593
0
        opj_read_bytes(p_header_data, &(l_current_poc->compno1),
3594
0
                       l_comp_room);  /* CEpoc_i */
3595
0
        p_header_data += l_comp_room;
3596
0
        opj_read_bytes(p_header_data, &l_tmp,
3597
0
                       1);                                                                 /* Ppoc_i */
3598
0
        ++p_header_data;
3599
0
        l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
3600
        /* make sure comp is in acceptable bounds */
3601
0
        l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
3602
0
        ++l_current_poc;
3603
0
    }
3604
3605
0
    l_tcp->numpocs = l_current_poc_nb - 1;
3606
0
    return OPJ_TRUE;
3607
0
}
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
0
{
3623
0
    OPJ_UINT32 l_nb_comp;
3624
    /* preconditions */
3625
0
    assert(p_header_data != 00);
3626
0
    assert(p_j2k != 00);
3627
0
    assert(p_manager != 00);
3628
3629
0
    OPJ_UNUSED(p_header_data);
3630
3631
0
    l_nb_comp = p_j2k->m_private_image->numcomps;
3632
3633
0
    if (p_header_size != l_nb_comp * 4) {
3634
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
3635
0
        return OPJ_FALSE;
3636
0
    }
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
0
    return OPJ_TRUE;
3649
0
}
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
0
{
3665
0
    OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP,
3666
0
               l_Ptlm_size, l_entry_size, l_num_tileparts;
3667
0
    OPJ_UINT32 i;
3668
0
    opj_j2k_tlm_tile_part_info_t* l_tile_part_infos;
3669
0
    opj_j2k_tlm_info_t* l_tlm;
3670
3671
    /* preconditions */
3672
0
    assert(p_header_data != 00);
3673
0
    assert(p_j2k != 00);
3674
0
    assert(p_manager != 00);
3675
3676
0
    l_tlm = &(p_j2k->m_specific_param.m_decoder.m_tlm);
3677
3678
0
    if (p_header_size < 2) {
3679
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker.\n");
3680
0
        return OPJ_FALSE;
3681
0
    }
3682
0
    p_header_size -= 2;
3683
3684
0
    if (l_tlm->m_is_invalid) {
3685
0
        return OPJ_TRUE;
3686
0
    }
3687
3688
0
    opj_read_bytes(p_header_data, &l_Ztlm,
3689
0
                   1);                              /* Ztlm */
3690
0
    ++p_header_data;
3691
0
    opj_read_bytes(p_header_data, &l_Stlm,
3692
0
                   1);                              /* Stlm */
3693
0
    ++p_header_data;
3694
3695
0
    l_ST = ((l_Stlm >> 4) & 0x3);
3696
0
    if (l_ST == 3) {
3697
0
        l_tlm->m_is_invalid = OPJ_TRUE;
3698
0
        opj_event_msg(p_manager, EVT_WARNING,
3699
0
                      "opj_j2k_read_tlm(): ST = 3 is invalid.\n");
3700
0
        return OPJ_TRUE;
3701
0
    }
3702
0
    l_SP = (l_Stlm >> 6) & 0x1;
3703
3704
0
    l_Ptlm_size = (l_SP + 1) * 2;
3705
0
    l_entry_size = l_Ptlm_size + l_ST;
3706
3707
0
    if ((p_header_size % l_entry_size) != 0) {
3708
0
        l_tlm->m_is_invalid = OPJ_TRUE;
3709
0
        opj_event_msg(p_manager, EVT_WARNING,
3710
0
                      "opj_j2k_read_tlm(): TLM marker not of expected size.\n");
3711
0
        return OPJ_TRUE;
3712
0
    }
3713
3714
0
    l_num_tileparts = p_header_size / l_entry_size;
3715
0
    if (l_num_tileparts == 0) {
3716
        /* not totally sure if this is valid... */
3717
0
        return OPJ_TRUE;
3718
0
    }
3719
3720
    /* Highly unlikely, unless there are gazillions of TLM markers */
3721
0
    if (l_tlm->m_entries_count > UINT32_MAX - l_num_tileparts ||
3722
0
            l_tlm->m_entries_count + l_num_tileparts > UINT32_MAX / sizeof(
3723
0
                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
0
    l_tile_part_infos = (opj_j2k_tlm_tile_part_info_t*)opj_realloc(
3731
0
                            l_tlm->m_tile_part_infos,
3732
0
                            (l_tlm->m_entries_count + l_num_tileparts) * sizeof(
3733
0
                                opj_j2k_tlm_tile_part_info_t));
3734
0
    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
0
    l_tlm->m_tile_part_infos = l_tile_part_infos;
3742
3743
0
    for (i = 0; i < l_num_tileparts; ++ i) {
3744
0
        OPJ_UINT32 l_tile_index;
3745
0
        OPJ_UINT32 l_length;
3746
3747
        /* Read Ttlm_i */
3748
0
        if (l_ST == 0) {
3749
0
            l_tile_index = l_tlm->m_entries_count;
3750
0
        } else {
3751
0
            opj_read_bytes(p_header_data, &l_tile_index, l_ST);
3752
0
            p_header_data += l_ST;
3753
0
        }
3754
3755
0
        if (l_tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) {
3756
0
            l_tlm->m_is_invalid = OPJ_TRUE;
3757
0
            opj_event_msg(p_manager, EVT_WARNING,
3758
0
                          "opj_j2k_read_tlm(): invalid tile number %d\n",
3759
0
                          l_tile_index);
3760
0
            return OPJ_TRUE;
3761
0
        }
3762
3763
        /* Read Ptlm_i */
3764
0
        opj_read_bytes(p_header_data, &l_length, l_Ptlm_size);
3765
0
        p_header_data += l_Ptlm_size;
3766
3767
0
        l_tile_part_infos[l_tlm->m_entries_count].m_tile_index =
3768
0
            (OPJ_UINT16)l_tile_index;
3769
0
        l_tile_part_infos[l_tlm->m_entries_count].m_length = l_length;
3770
0
        ++l_tlm->m_entries_count;
3771
0
    }
3772
3773
0
    return OPJ_TRUE;
3774
0
}
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
0
{
3790
    /* preconditions */
3791
0
    assert(p_header_data != 00);
3792
0
    assert(p_j2k != 00);
3793
0
    assert(p_manager != 00);
3794
3795
0
    OPJ_UNUSED(p_j2k);
3796
0
    OPJ_UNUSED(p_header_data);
3797
3798
0
    if (p_header_size < 1) {
3799
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3800
0
        return OPJ_FALSE;
3801
0
    }
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
0
    return OPJ_TRUE;
3847
0
}
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
0
{
3863
0
    OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
3864
3865
    /* preconditions */
3866
0
    assert(p_header_data != 00);
3867
0
    assert(p_j2k != 00);
3868
0
    assert(p_manager != 00);
3869
3870
0
    OPJ_UNUSED(p_j2k);
3871
3872
0
    if (p_header_size < 1) {
3873
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3874
0
        return OPJ_FALSE;
3875
0
    }
3876
3877
0
    opj_read_bytes(p_header_data, &l_Zplt, 1);              /* Zplt */
3878
0
    ++p_header_data;
3879
0
    --p_header_size;
3880
3881
0
    for (i = 0; i < p_header_size; ++i) {
3882
0
        opj_read_bytes(p_header_data, &l_tmp, 1);       /* Iplt_ij */
3883
0
        ++p_header_data;
3884
        /* take only the last seven bytes */
3885
0
        l_packet_len |= (l_tmp & 0x7f);
3886
0
        if (l_tmp & 0x80) {
3887
0
            l_packet_len <<= 7;
3888
0
        } else {
3889
            /* store packet length and proceed to next packet */
3890
0
            l_packet_len = 0;
3891
0
        }
3892
0
    }
3893
3894
0
    if (l_packet_len != 0) {
3895
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3896
0
        return OPJ_FALSE;
3897
0
    }
3898
3899
0
    return OPJ_TRUE;
3900
0
}
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
0
{
3917
0
    opj_cp_t *l_cp = 00;
3918
0
    OPJ_UINT32 l_Z_ppm;
3919
3920
    /* preconditions */
3921
0
    assert(p_header_data != 00);
3922
0
    assert(p_j2k != 00);
3923
0
    assert(p_manager != 00);
3924
3925
    /* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */
3926
0
    if (p_header_size < 2) {
3927
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3928
0
        return OPJ_FALSE;
3929
0
    }
3930
3931
0
    l_cp = &(p_j2k->m_cp);
3932
0
    l_cp->ppm = 1;
3933
3934
0
    opj_read_bytes(p_header_data, &l_Z_ppm, 1);             /* Z_ppm */
3935
0
    ++p_header_data;
3936
0
    --p_header_size;
3937
3938
    /* check allocation needed */
3939
0
    if (l_cp->ppm_markers == NULL) { /* first PPM marker */
3940
0
        OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3941
0
        assert(l_cp->ppm_markers_count == 0U);
3942
3943
0
        l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
3944
0
        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
0
        l_cp->ppm_markers_count = l_newCount;
3949
0
    } else if (l_cp->ppm_markers_count <= l_Z_ppm) {
3950
0
        OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3951
0
        opj_ppx *new_ppm_markers;
3952
0
        new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers,
3953
0
                          l_newCount * sizeof(opj_ppx));
3954
0
        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
0
        l_cp->ppm_markers = new_ppm_markers;
3960
0
        memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0,
3961
0
               (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx));
3962
0
        l_cp->ppm_markers_count = l_newCount;
3963
0
    }
3964
3965
0
    if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) {
3966
        /* clean up to be done on l_cp destruction */
3967
0
        opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm);
3968
0
        return OPJ_FALSE;
3969
0
    }
3970
3971
0
    l_cp->ppm_markers[l_Z_ppm].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
3972
0
    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
0
    l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size;
3978
0
    memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size);
3979
3980
0
    return OPJ_TRUE;
3981
0
}
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
0
{
3991
0
    OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining;
3992
3993
    /* preconditions */
3994
0
    assert(p_cp != 00);
3995
0
    assert(p_manager != 00);
3996
0
    assert(p_cp->ppm_buffer == NULL);
3997
3998
0
    if (p_cp->ppm == 0U) {
3999
0
        return OPJ_TRUE;
4000
0
    }
4001
4002
0
    l_ppm_data_size = 0U;
4003
0
    l_N_ppm_remaining = 0U;
4004
0
    for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
4005
0
        if (p_cp->ppm_markers[i].m_data !=
4006
0
                NULL) { /* standard doesn't seem to require contiguous Zppm */
4007
0
            OPJ_UINT32 l_N_ppm;
4008
0
            OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
4009
0
            const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
4010
4011
0
            if (l_N_ppm_remaining >= l_data_size) {
4012
0
                l_N_ppm_remaining -= l_data_size;
4013
0
                l_data_size = 0U;
4014
0
            } else {
4015
0
                l_data += l_N_ppm_remaining;
4016
0
                l_data_size -= l_N_ppm_remaining;
4017
0
                l_N_ppm_remaining = 0U;
4018
0
            }
4019
4020
0
            if (l_data_size > 0U) {
4021
0
                do {
4022
                    /* read Nppm */
4023
0
                    if (l_data_size < 4U) {
4024
                        /* clean up to be done on l_cp destruction */
4025
0
                        opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
4026
0
                        return OPJ_FALSE;
4027
0
                    }
4028
0
                    opj_read_bytes(l_data, &l_N_ppm, 4);
4029
0
                    l_data += 4;
4030
0
                    l_data_size -= 4;
4031
4032
0
                    if (l_ppm_data_size > UINT_MAX - l_N_ppm) {
4033
0
                        opj_event_msg(p_manager, EVT_ERROR, "Too large value for Nppm\n");
4034
0
                        return OPJ_FALSE;
4035
0
                    }
4036
0
                    l_ppm_data_size += l_N_ppm;
4037
0
                    if (l_data_size >= l_N_ppm) {
4038
0
                        l_data_size -= l_N_ppm;
4039
0
                        l_data += l_N_ppm;
4040
0
                    } else {
4041
0
                        l_N_ppm_remaining = l_N_ppm - l_data_size;
4042
0
                        l_data_size = 0U;
4043
0
                    }
4044
0
                } while (l_data_size > 0U);
4045
0
            }
4046
0
        }
4047
0
    }
4048
4049
0
    if (l_N_ppm_remaining != 0U) {
4050
        /* clean up to be done on l_cp destruction */
4051
0
        opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n");
4052
0
        return OPJ_FALSE;
4053
0
    }
4054
4055
0
    p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size);
4056
0
    if (p_cp->ppm_buffer == 00) {
4057
0
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
4058
0
        return OPJ_FALSE;
4059
0
    }
4060
0
    p_cp->ppm_len = l_ppm_data_size;
4061
0
    l_ppm_data_size = 0U;
4062
0
    l_N_ppm_remaining = 0U;
4063
0
    for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
4064
0
        if (p_cp->ppm_markers[i].m_data !=
4065
0
                NULL) { /* standard doesn't seem to require contiguous Zppm */
4066
0
            OPJ_UINT32 l_N_ppm;
4067
0
            OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
4068
0
            const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
4069
4070
0
            if (l_N_ppm_remaining >= l_data_size) {
4071
0
                memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
4072
0
                l_ppm_data_size += l_data_size;
4073
0
                l_N_ppm_remaining -= l_data_size;
4074
0
                l_data_size = 0U;
4075
0
            } else {
4076
0
                memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining);
4077
0
                l_ppm_data_size += l_N_ppm_remaining;
4078
0
                l_data += l_N_ppm_remaining;
4079
0
                l_data_size -= l_N_ppm_remaining;
4080
0
                l_N_ppm_remaining = 0U;
4081
0
            }
4082
4083
0
            if (l_data_size > 0U) {
4084
0
                do {
4085
                    /* read Nppm */
4086
0
                    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
0
                    opj_read_bytes(l_data, &l_N_ppm, 4);
4092
0
                    l_data += 4;
4093
0
                    l_data_size -= 4;
4094
4095
0
                    if (l_data_size >= l_N_ppm) {
4096
0
                        memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm);
4097
0
                        l_ppm_data_size += l_N_ppm;
4098
0
                        l_data_size -= l_N_ppm;
4099
0
                        l_data += l_N_ppm;
4100
0
                    } else {
4101
0
                        memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
4102
0
                        l_ppm_data_size += l_data_size;
4103
0
                        l_N_ppm_remaining = l_N_ppm - l_data_size;
4104
0
                        l_data_size = 0U;
4105
0
                    }
4106
0
                } while (l_data_size > 0U);
4107
0
            }
4108
0
            opj_free(p_cp->ppm_markers[i].m_data);
4109
0
            p_cp->ppm_markers[i].m_data = NULL;
4110
0
            p_cp->ppm_markers[i].m_data_size = 0U;
4111
0
        }
4112
0
    }
4113
4114
0
    p_cp->ppm_data = p_cp->ppm_buffer;
4115
0
    p_cp->ppm_data_size = p_cp->ppm_len;
4116
4117
0
    p_cp->ppm_markers_count = 0U;
4118
0
    opj_free(p_cp->ppm_markers);
4119
0
    p_cp->ppm_markers = NULL;
4120
4121
0
    return OPJ_TRUE;
4122
0
}
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
0
{
4138
0
    opj_cp_t *l_cp = 00;
4139
0
    opj_tcp_t *l_tcp = 00;
4140
0
    OPJ_UINT32 l_Z_ppt;
4141
4142
    /* preconditions */
4143
0
    assert(p_header_data != 00);
4144
0
    assert(p_j2k != 00);
4145
0
    assert(p_manager != 00);
4146
4147
    /* We need to have the Z_ppt element + 1 byte of Ippt at minimum */
4148
0
    if (p_header_size < 2) {
4149
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
4150
0
        return OPJ_FALSE;
4151
0
    }
4152
4153
0
    l_cp = &(p_j2k->m_cp);
4154
0
    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
0
    l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
4161
0
    l_tcp->ppt = 1;
4162
4163
0
    opj_read_bytes(p_header_data, &l_Z_ppt, 1);             /* Z_ppt */
4164
0
    ++p_header_data;
4165
0
    --p_header_size;
4166
4167
    /* check allocation needed */
4168
0
    if (l_tcp->ppt_markers == NULL) { /* first PPT marker */
4169
0
        OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4170
0
        assert(l_tcp->ppt_markers_count == 0U);
4171
4172
0
        l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
4173
0
        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
0
        l_tcp->ppt_markers_count = l_newCount;
4178
0
    } else if (l_tcp->ppt_markers_count <= l_Z_ppt) {
4179
0
        OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4180
0
        opj_ppx *new_ppt_markers;
4181
0
        new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers,
4182
0
                          l_newCount * sizeof(opj_ppx));
4183
0
        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
0
        l_tcp->ppt_markers = new_ppt_markers;
4189
0
        memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0,
4190
0
               (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx));
4191
0
        l_tcp->ppt_markers_count = l_newCount;
4192
0
    }
4193
4194
0
    if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) {
4195
        /* clean up to be done on l_tcp destruction */
4196
0
        opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt);
4197
0
        return OPJ_FALSE;
4198
0
    }
4199
4200
0
    l_tcp->ppt_markers[l_Z_ppt].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
4201
0
    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
0
    l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size;
4207
0
    memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size);
4208
0
    return OPJ_TRUE;
4209
0
}
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
0
{
4219
0
    OPJ_UINT32 i, l_ppt_data_size;
4220
    /* preconditions */
4221
0
    assert(p_tcp != 00);
4222
0
    assert(p_manager != 00);
4223
4224
0
    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
0
    if (p_tcp->ppt == 0U) {
4231
0
        return OPJ_TRUE;
4232
0
    }
4233
4234
0
    l_ppt_data_size = 0U;
4235
0
    for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4236
0
        l_ppt_data_size +=
4237
0
            p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4238
0
    }
4239
4240
0
    p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size);
4241
0
    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
0
    p_tcp->ppt_len = l_ppt_data_size;
4246
0
    l_ppt_data_size = 0U;
4247
0
    for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4248
0
        if (p_tcp->ppt_markers[i].m_data !=
4249
0
                NULL) { /* standard doesn't seem to require contiguous Zppt */
4250
0
            memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data,
4251
0
                   p_tcp->ppt_markers[i].m_data_size);
4252
0
            l_ppt_data_size +=
4253
0
                p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4254
4255
0
            opj_free(p_tcp->ppt_markers[i].m_data);
4256
0
            p_tcp->ppt_markers[i].m_data = NULL;
4257
0
            p_tcp->ppt_markers[i].m_data_size = 0U;
4258
0
        }
4259
0
    }
4260
4261
0
    p_tcp->ppt_markers_count = 0U;
4262
0
    opj_free(p_tcp->ppt_markers);
4263
0
    p_tcp->ppt_markers = NULL;
4264
4265
0
    p_tcp->ppt_data = p_tcp->ppt_buffer;
4266
0
    p_tcp->ppt_data_size = p_tcp->ppt_len;
4267
0
    return OPJ_TRUE;
4268
0
}
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
255
{
4363
    /* preconditions */
4364
255
    assert(p_j2k != 00);
4365
255
    assert(p_manager != 00);
4366
255
    assert(p_stream != 00);
4367
4368
255
    OPJ_UNUSED(p_stream);
4369
4370
255
    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
255
    opj_write_bytes(p_data, J2K_MS_SOT,
4377
255
                    2);                                 /* SOT */
4378
255
    p_data += 2;
4379
4380
255
    opj_write_bytes(p_data, 10,
4381
255
                    2);                                                   /* Lsot */
4382
255
    p_data += 2;
4383
4384
255
    opj_write_bytes(p_data, p_j2k->m_current_tile_number,
4385
255
                    2);                        /* Isot */
4386
255
    p_data += 2;
4387
4388
    /* Psot  */
4389
255
    p_data += 4;
4390
4391
255
    opj_write_bytes(p_data,
4392
255
                    p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,
4393
255
                    1);                        /* TPsot */
4394
255
    ++p_data;
4395
4396
255
    opj_write_bytes(p_data,
4397
255
                    p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,
4398
255
                    1);                      /* TNsot */
4399
255
    ++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
255
    * p_data_written = 12;
4411
4412
255
    return OPJ_TRUE;
4413
255
}
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
0
{
4423
    /* preconditions */
4424
0
    assert(p_header_data != 00);
4425
0
    assert(p_manager != 00);
4426
4427
    /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
4428
0
    if (p_header_size != 8) {
4429
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4430
0
        return OPJ_FALSE;
4431
0
    }
4432
4433
0
    opj_read_bytes(p_header_data, p_tile_no, 2);    /* Isot */
4434
0
    p_header_data += 2;
4435
0
    opj_read_bytes(p_header_data, p_tot_len, 4);    /* Psot */
4436
0
    p_header_data += 4;
4437
0
    opj_read_bytes(p_header_data, p_current_part, 1); /* TPsot */
4438
0
    ++p_header_data;
4439
0
    opj_read_bytes(p_header_data, p_num_parts, 1);  /* TNsot */
4440
0
    ++p_header_data;
4441
0
    return OPJ_TRUE;
4442
0
}
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
0
{
4449
0
    opj_cp_t *l_cp = 00;
4450
0
    opj_tcp_t *l_tcp = 00;
4451
0
    OPJ_UINT32 l_tot_len, l_num_parts = 0;
4452
0
    OPJ_UINT32 l_current_part;
4453
0
    OPJ_UINT32 l_tile_x, l_tile_y;
4454
4455
    /* preconditions */
4456
4457
0
    assert(p_j2k != 00);
4458
0
    assert(p_manager != 00);
4459
4460
0
    if (! opj_j2k_get_sot_values(p_header_data, p_header_size,
4461
0
                                 &(p_j2k->m_current_tile_number), &l_tot_len, &l_current_part, &l_num_parts,
4462
0
                                 p_manager)) {
4463
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4464
0
        return OPJ_FALSE;
4465
0
    }
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
0
    l_cp = &(p_j2k->m_cp);
4472
4473
    /* testcase 2.pdf.SIGFPE.706.1112 */
4474
0
    if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
4475
0
        opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n",
4476
0
                      p_j2k->m_current_tile_number);
4477
0
        return OPJ_FALSE;
4478
0
    }
4479
4480
0
    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
4481
0
    l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
4482
0
    l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
4483
4484
0
    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
0
            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
0
        if (l_tcp->m_current_tile_part_number + 1 != (OPJ_INT32)l_current_part) {
4498
0
            opj_event_msg(p_manager, EVT_ERROR,
4499
0
                          "Invalid tile part index for tile number %d. "
4500
0
                          "Got %d, expected %d\n",
4501
0
                          p_j2k->m_current_tile_number,
4502
0
                          l_current_part,
4503
0
                          l_tcp->m_current_tile_part_number + 1);
4504
0
            return OPJ_FALSE;
4505
0
        }
4506
0
    }
4507
4508
0
    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
0
    if ((l_tot_len != 0) && (l_tot_len < 14)) {
4543
0
        if (l_tot_len ==
4544
0
                12) { /* MSD: Special case for the PHR data which are read by kakadu*/
4545
0
            opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n",
4546
0
                          l_tot_len);
4547
0
        } else {
4548
0
            opj_event_msg(p_manager, EVT_ERROR,
4549
0
                          "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
4550
0
            return OPJ_FALSE;
4551
0
        }
4552
0
    }
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
0
    if (!l_tot_len) {
4579
0
        opj_event_msg(p_manager, EVT_INFO,
4580
0
                      "Psot value of the current tile-part is equal to zero, "
4581
0
                      "we assuming it is the last tile-part of the codestream.\n");
4582
0
        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4583
0
    }
4584
4585
0
    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
0
        opj_event_msg(p_manager, EVT_ERROR,
4588
0
                      "In SOT marker, TPSot (%d) is not valid regards to the previous "
4589
0
                      "number of tile-part (%d), giving up\n", l_current_part,
4590
0
                      l_tcp->m_nb_tile_parts);
4591
0
        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4592
0
        return OPJ_FALSE;
4593
0
    }
4594
4595
0
    if (l_num_parts !=
4596
0
            0) { /* Number of tile-part header is provided by this tile-part header */
4597
0
        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
0
        if (l_tcp->m_nb_tile_parts) {
4601
0
            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
0
        }
4610
0
        if (l_current_part >= l_num_parts) {
4611
            /* testcase 451.pdf.SIGSEGV.ce9.3723 */
4612
0
            opj_event_msg(p_manager, EVT_ERROR,
4613
0
                          "In SOT marker, TPSot (%d) is not valid regards to the current "
4614
0
                          "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts);
4615
0
            p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4616
0
            return OPJ_FALSE;
4617
0
        }
4618
0
        l_tcp->m_nb_tile_parts = l_num_parts;
4619
0
    }
4620
4621
    /* If know the number of tile part header we will check if we didn't read the last*/
4622
0
    if (l_tcp->m_nb_tile_parts) {
4623
0
        if (l_tcp->m_nb_tile_parts == (l_current_part + 1)) {
4624
0
            p_j2k->m_specific_param.m_decoder.m_can_decode =
4625
0
                1; /* Process the last tile-part header*/
4626
0
        }
4627
0
    }
4628
4629
0
    if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4630
        /* Keep the size of data to skip after this marker */
4631
0
        p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len -
4632
0
                12; /* SOT_marker_size = 12 */
4633
0
    } else {
4634
        /* FIXME: need to be computed from the number of bytes remaining in the codestream */
4635
0
        p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
4636
0
    }
4637
4638
0
    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
0
    if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
4642
0
        p_j2k->m_specific_param.m_decoder.m_skip_data =
4643
0
            (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
4644
0
            || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
4645
0
            || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
4646
0
            || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
4647
0
    } 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
0
    {
4656
0
        assert(p_j2k->cstr_index->tile_index != 00);
4657
0
        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno =
4658
0
            p_j2k->m_current_tile_number;
4659
0
        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno =
4660
0
            l_current_part;
4661
4662
0
        if (!p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid &&
4663
0
                l_num_parts >
4664
0
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps) {
4665
0
            opj_event_msg(p_manager, EVT_WARNING,
4666
0
                          "SOT marker for tile %u declares more tile-parts than found in TLM marker.",
4667
0
                          p_j2k->m_current_tile_number);
4668
0
            p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid = OPJ_TRUE;
4669
0
        }
4670
4671
0
        if (!p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid) {
4672
            /* do nothing */
4673
0
        } else if (l_num_parts != 0) {
4674
4675
0
            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps =
4676
0
                l_num_parts;
4677
0
            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
4678
0
                l_num_parts;
4679
4680
0
            if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4681
0
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4682
0
                    (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
4683
0
                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
0
            } else {
4689
0
                opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
4690
0
                                                   p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4691
0
                                                   l_num_parts * sizeof(opj_tp_index_t));
4692
0
                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
0
                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4700
0
                    new_tp_index;
4701
0
            }
4702
0
        } else {
4703
0
            /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
4704
4705
0
                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4706
0
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
4707
0
                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4708
0
                        (opj_tp_index_t*)opj_calloc(
4709
0
                            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
4710
0
                            sizeof(opj_tp_index_t));
4711
0
                    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
0
                }
4718
4719
0
                if (l_current_part >=
4720
0
                        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
0
            }
4740
4741
0
        }
4742
4743
0
    }
4744
4745
0
    return OPJ_TRUE;
4746
0
}
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
255
{
4844
255
    opj_codestream_info_t *l_cstr_info = 00;
4845
255
    OPJ_UINT32 l_remaining_data;
4846
255
    opj_tcd_marker_info_t* marker_info = NULL;
4847
4848
    /* preconditions */
4849
255
    assert(p_j2k != 00);
4850
255
    assert(p_manager != 00);
4851
255
    assert(p_stream != 00);
4852
4853
255
    OPJ_UNUSED(p_stream);
4854
4855
255
    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
255
    opj_write_bytes(p_data, J2K_MS_SOD,
4862
255
                    2);                                 /* SOD */
4863
4864
    /* make room for the EOF marker */
4865
255
    l_remaining_data =  total_data_size - 4;
4866
4867
    /* update tile coder */
4868
255
    p_tile_coder->tp_num =
4869
255
        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
4870
255
    p_tile_coder->cur_tp_num =
4871
255
        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
255
    if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
4902
255
        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
255
    }
4909
4910
255
    *p_data_written = 0;
4911
4912
255
    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
255
    if (l_remaining_data <
4923
255
            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
255
    l_remaining_data -= p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT;
4930
4931
255
    if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number,
4932
255
                              p_data + 2,
4933
255
                              p_data_written, l_remaining_data, l_cstr_info,
4934
255
                              marker_info,
4935
255
                              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
255
    *p_data_written += 2;
4943
4944
255
    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
255
    opj_tcd_marker_info_destroy(marker_info);
4974
4975
255
    return OPJ_TRUE;
4976
255
}
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
0
{
4983
0
    OPJ_SIZE_T l_current_read_size;
4984
0
    opj_codestream_index_t * l_cstr_index = 00;
4985
0
    OPJ_BYTE ** l_current_data = 00;
4986
0
    opj_tcp_t * l_tcp = 00;
4987
0
    OPJ_UINT32 * l_tile_len = 00;
4988
0
    OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
4989
4990
    /* preconditions */
4991
0
    assert(p_j2k != 00);
4992
0
    assert(p_manager != 00);
4993
0
    assert(p_stream != 00);
4994
4995
0
    l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4996
4997
0
    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
0
        p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(
5003
0
                    opj_stream_get_number_byte_left(p_stream) - 2);
5004
0
    } else {
5005
        /* Check to avoid pass the limit of OPJ_UINT32 */
5006
0
        if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2) {
5007
0
            p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
5008
0
        } else {
5009
            /* MSD: case commented to support empty SOT marker (PHR data) */
5010
0
        }
5011
0
    }
5012
5013
0
    l_current_data = &(l_tcp->m_data);
5014
0
    l_tile_len = &l_tcp->m_data_size;
5015
5016
    /* Patch to support new PHR data */
5017
0
    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
0
        if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length >
5021
0
                opj_stream_get_number_byte_left(p_stream)) {
5022
0
            if (p_j2k->m_cp.strict) {
5023
0
                opj_event_msg(p_manager, EVT_ERROR,
5024
0
                              "Tile part length size inconsistent with stream length\n");
5025
0
                return OPJ_FALSE;
5026
0
            } else {
5027
0
                opj_event_msg(p_manager, EVT_WARNING,
5028
0
                              "Tile part length size inconsistent with stream length\n");
5029
0
            }
5030
0
        }
5031
0
        if (p_j2k->m_specific_param.m_decoder.m_sot_length >
5032
0
                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
0
        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
0
            *l_current_data = (OPJ_BYTE*) opj_malloc(
5046
0
                                  p_j2k->m_specific_param.m_decoder.m_sot_length + OPJ_COMMON_CBLK_DATA_EXTRA);
5047
0
        } else {
5048
0
            OPJ_BYTE *l_new_current_data;
5049
0
            if (*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA -
5050
0
                    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
0
            l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data,
5058
0
                                 *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length +
5059
0
                                 OPJ_COMMON_CBLK_DATA_EXTRA);
5060
0
            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
0
            *l_current_data = l_new_current_data;
5068
0
        }
5069
5070
0
        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
0
    } else {
5075
0
        l_sot_length_pb_detected = OPJ_TRUE;
5076
0
    }
5077
5078
    /* Index */
5079
0
    l_cstr_index = p_j2k->cstr_index;
5080
0
    {
5081
0
        OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
5082
5083
0
        OPJ_UINT32 l_current_tile_part =
5084
0
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
5085
0
        if (l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index &&
5086
0
                l_current_tile_part <
5087
0
                l_cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps) {
5088
0
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header
5089
0
                = l_current_pos;
5090
0
            l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos
5091
0
                = l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
5092
0
        }
5093
5094
0
        if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
5095
0
                                              l_cstr_index,
5096
0
                                              J2K_MS_SOD,
5097
0
                                              l_current_pos,
5098
0
                                              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
0
    }
5105
5106
    /* Patch to support new PHR data */
5107
0
    if (!l_sot_length_pb_detected) {
5108
0
        l_current_read_size = opj_stream_read_data(
5109
0
                                  p_stream,
5110
0
                                  *l_current_data + *l_tile_len,
5111
0
                                  p_j2k->m_specific_param.m_decoder.m_sot_length,
5112
0
                                  p_manager);
5113
0
    } else {
5114
0
        l_current_read_size = 0;
5115
0
    }
5116
5117
0
    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
0
    } else {
5125
0
        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
5126
0
    }
5127
5128
0
    *l_tile_len += (OPJ_UINT32)l_current_read_size;
5129
5130
0
    return OPJ_TRUE;
5131
0
}
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
255
{
5201
    /* preconditions */
5202
255
    assert(p_j2k != 00);
5203
255
    assert(p_manager != 00);
5204
255
    assert(p_stream != 00);
5205
5206
255
    opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,
5207
255
                    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
255
    if (opj_stream_write_data(p_stream,
5218
255
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, 2, p_manager) != 2) {
5219
0
        return OPJ_FALSE;
5220
0
    }
5221
5222
255
    if (! opj_stream_flush(p_stream, p_manager)) {
5223
0
        return OPJ_FALSE;
5224
0
    }
5225
5226
255
    return OPJ_TRUE;
5227
255
}
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
0
{
5243
0
    OPJ_UINT32 l_nb_comp;
5244
0
    opj_image_t * l_image = 00;
5245
5246
0
    opj_cp_t *l_cp = 00;
5247
0
    opj_tcp_t *l_tcp = 00;
5248
0
    OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
5249
5250
    /* preconditions*/
5251
0
    assert(p_header_data != 00);
5252
0
    assert(p_j2k != 00);
5253
0
    assert(p_manager != 00);
5254
5255
0
    l_image = p_j2k->m_private_image;
5256
0
    l_nb_comp = l_image->numcomps;
5257
5258
0
    if (l_nb_comp <= 256) {
5259
0
        l_comp_room = 1;
5260
0
    } else {
5261
0
        l_comp_room = 2;
5262
0
    }
5263
5264
0
    if (p_header_size != 2 + l_comp_room) {
5265
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
5266
0
        return OPJ_FALSE;
5267
0
    }
5268
5269
0
    l_cp = &(p_j2k->m_cp);
5270
0
    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
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
5273
5274
0
    opj_read_bytes(p_header_data, &l_comp_no, l_comp_room);         /* Crgn */
5275
0
    p_header_data += l_comp_room;
5276
0
    opj_read_bytes(p_header_data, &l_roi_sty,
5277
0
                   1);                                     /* Srgn */
5278
0
    ++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
0
    if (l_comp_no >= l_nb_comp) {
5297
0
        opj_event_msg(p_manager, EVT_ERROR,
5298
0
                      "bad component number in RGN (%d when there are only %d)\n",
5299
0
                      l_comp_no, l_nb_comp);
5300
0
        return OPJ_FALSE;
5301
0
    }
5302
5303
0
    opj_read_bytes(p_header_data,
5304
0
                   (OPJ_UINT32 *)(&(l_tcp->tccps[l_comp_no].roishift)), 1);  /* SPrgn */
5305
0
    ++p_header_data;
5306
5307
0
    return OPJ_TRUE;
5308
5309
0
}
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
255
{
5318
255
    (void)p_tcp;
5319
255
    return 0;
5320
255
}
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
255
{
5326
255
    opj_cp_t * l_cp = 00;
5327
255
    opj_image_t * l_image = 00;
5328
255
    opj_tcp_t * l_tcp = 00;
5329
255
    opj_image_comp_t * l_img_comp = 00;
5330
5331
255
    OPJ_UINT32 i, j, k;
5332
255
    OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
5333
255
    OPJ_FLOAT32 * l_rates = 0;
5334
255
    OPJ_FLOAT32 l_sot_remove;
5335
255
    OPJ_UINT32 l_bits_empty, l_size_pixel;
5336
255
    OPJ_UINT64 l_tile_size = 0;
5337
255
    OPJ_UINT32 l_last_res;
5338
255
    OPJ_FLOAT32(* l_tp_stride_func)(opj_tcp_t *) = 00;
5339
5340
    /* preconditions */
5341
255
    assert(p_j2k != 00);
5342
255
    assert(p_manager != 00);
5343
255
    assert(p_stream != 00);
5344
5345
255
    OPJ_UNUSED(p_manager);
5346
5347
255
    l_cp = &(p_j2k->m_cp);
5348
255
    l_image = p_j2k->m_private_image;
5349
255
    l_tcp = l_cp->tcps;
5350
5351
255
    l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
5352
255
    l_size_pixel = l_image->numcomps * l_image->comps->prec;
5353
255
    l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(
5354
255
                       l_cp->th * l_cp->tw);
5355
5356
255
    if (l_cp->m_specific_param.m_enc.m_tp_on) {
5357
0
        l_tp_stride_func = opj_j2k_get_tp_stride;
5358
255
    } else {
5359
255
        l_tp_stride_func = opj_j2k_get_default_stride;
5360
255
    }
5361
5362
510
    for (i = 0; i < l_cp->th; ++i) {
5363
510
        for (j = 0; j < l_cp->tw; ++j) {
5364
255
            OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) /
5365
255
                                   (OPJ_FLOAT32)l_tcp->numlayers;
5366
5367
            /* 4 borders of the tile rescale on the image if necessary */
5368
255
            l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx),
5369
255
                               (OPJ_INT32)l_image->x0);
5370
255
            l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy),
5371
255
                               (OPJ_INT32)l_image->y0);
5372
255
            l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx),
5373
255
                               (OPJ_INT32)l_image->x1);
5374
255
            l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy),
5375
255
                               (OPJ_INT32)l_image->y1);
5376
5377
255
            l_rates = l_tcp->rates;
5378
5379
            /* Modification of the RATE >> */
5380
510
            for (k = 0; k < l_tcp->numlayers; ++k) {
5381
255
                if (*l_rates > 0.0f) {
5382
143
                    *l_rates = (OPJ_FLOAT32)(((OPJ_FLOAT64)l_size_pixel * (OPJ_UINT32)(
5383
143
                                                  l_x1 - l_x0) *
5384
143
                                              (OPJ_UINT32)(l_y1 - l_y0))
5385
143
                                             / ((*l_rates) * (OPJ_FLOAT32)l_bits_empty))
5386
143
                               -
5387
143
                               l_offset;
5388
143
                }
5389
5390
255
                ++l_rates;
5391
255
            }
5392
5393
255
            ++l_tcp;
5394
5395
255
        }
5396
255
    }
5397
5398
255
    l_tcp = l_cp->tcps;
5399
5400
510
    for (i = 0; i < l_cp->th; ++i) {
5401
510
        for (j = 0; j < l_cp->tw; ++j) {
5402
255
            l_rates = l_tcp->rates;
5403
5404
255
            if (*l_rates > 0.0f) {
5405
143
                *l_rates -= l_sot_remove;
5406
5407
143
                if (*l_rates < 30.0f) {
5408
5
                    *l_rates = 30.0f;
5409
5
                }
5410
143
            }
5411
5412
255
            ++l_rates;
5413
5414
255
            l_last_res = l_tcp->numlayers - 1;
5415
5416
255
            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
255
            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
255
            ++l_tcp;
5438
255
        }
5439
255
    }
5440
5441
255
    l_img_comp = l_image->comps;
5442
255
    l_tile_size = 0;
5443
5444
1.02k
    for (i = 0; i < l_image->numcomps; ++i) {
5445
765
        l_tile_size += (OPJ_UINT64)opj_uint_ceildiv(l_cp->tdx, l_img_comp->dx)
5446
765
                       *
5447
765
                       opj_uint_ceildiv(l_cp->tdy, l_img_comp->dy)
5448
765
                       *
5449
765
                       l_img_comp->prec;
5450
5451
765
        ++l_img_comp;
5452
765
    }
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
255
    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
255
    l_tile_size += 500;
5465
5466
255
    l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
5467
5468
255
    if (l_tile_size > UINT_MAX) {
5469
0
        l_tile_size = UINT_MAX;
5470
0
    }
5471
5472
255
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = (OPJ_UINT32)l_tile_size;
5473
255
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
5474
255
        (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
5475
255
    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
255
    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
255
    return OPJ_TRUE;
5495
255
}
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
255
{
5618
255
    OPJ_UINT32 compno;
5619
5620
    /* preconditions */
5621
255
    assert(p_j2k != 00);
5622
255
    assert(p_manager != 00);
5623
255
    assert(p_stream != 00);
5624
5625
765
    for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5626
        /* cod is first component of first tile */
5627
510
        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
510
    }
5633
5634
255
    return OPJ_TRUE;
5635
255
}
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
255
{
5642
255
    OPJ_UINT32 compno;
5643
5644
    /* preconditions */
5645
255
    assert(p_j2k != 00);
5646
255
    assert(p_manager != 00);
5647
255
    assert(p_stream != 00);
5648
5649
765
    for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5650
        /* qcd is first component of first tile */
5651
510
        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
510
    }
5657
255
    return OPJ_TRUE;
5658
255
}
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
255
{
5664
255
    OPJ_UINT32 compno;
5665
255
    const opj_tccp_t *l_tccp = 00;
5666
5667
    /* preconditions */
5668
255
    assert(p_j2k != 00);
5669
255
    assert(p_manager != 00);
5670
255
    assert(p_stream != 00);
5671
5672
255
    l_tccp = p_j2k->m_cp.tcps->tccps;
5673
5674
1.02k
    for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {
5675
765
        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
765
        ++l_tccp;
5684
765
    }
5685
5686
255
    return OPJ_TRUE;
5687
255
}
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
255
{
5693
255
    opj_codestream_index_t * l_cstr_index = 00;
5694
5695
    /* preconditions */
5696
255
    assert(p_j2k != 00);
5697
255
    assert(p_manager != 00);
5698
255
    assert(p_stream != 00);
5699
5700
255
    OPJ_UNUSED(p_manager);
5701
5702
255
    l_cstr_index = p_j2k->cstr_index;
5703
255
    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
255
    return OPJ_TRUE;
5727
255
}
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
0
{
5735
0
    OPJ_UINT32 l_unknown_marker;
5736
0
    const opj_dec_memory_marker_handler_t * l_marker_handler;
5737
0
    OPJ_UINT32 l_size_unk = 2;
5738
5739
    /* preconditions*/
5740
0
    assert(p_j2k != 00);
5741
0
    assert(p_manager != 00);
5742
0
    assert(p_stream != 00);
5743
5744
0
    opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
5745
5746
0
    for (;;) {
5747
        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
5748
0
        if (opj_stream_read_data(p_stream,
5749
0
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
5750
0
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
5751
0
            return OPJ_FALSE;
5752
0
        }
5753
5754
        /* read 2 bytes as the new marker ID*/
5755
0
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
5756
0
                       &l_unknown_marker, 2);
5757
5758
0
        if (!(l_unknown_marker < 0xff00)) {
5759
5760
            /* Get the marker handler from the marker ID*/
5761
0
            l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
5762
5763
0
            if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
5764
0
                opj_event_msg(p_manager, EVT_ERROR,
5765
0
                              "Marker is not compliant with its position\n");
5766
0
                return OPJ_FALSE;
5767
0
            } else {
5768
0
                if (l_marker_handler->id != J2K_MS_UNK) {
5769
                    /* Add the marker to the codestream index*/
5770
0
                    if (l_marker_handler->id != J2K_MS_SOT) {
5771
0
                        OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
5772
0
                                                            (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
5773
0
                                                            l_size_unk);
5774
0
                        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
0
                    }
5779
0
                    break; /* next marker is known and well located */
5780
0
                } else {
5781
0
                    l_size_unk += 2;
5782
0
                }
5783
0
            }
5784
0
        }
5785
0
    }
5786
5787
0
    *output_marker = l_marker_handler->id ;
5788
5789
0
    return OPJ_TRUE;
5790
0
}
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
0
{
5872
0
    OPJ_UINT32 i;
5873
0
    opj_tcp_t *l_tcp = 00;
5874
0
    OPJ_UINT32 l_tmp;
5875
0
    OPJ_UINT32 l_indix;
5876
0
    opj_mct_data_t * l_mct_data;
5877
5878
    /* preconditions */
5879
0
    assert(p_header_data != 00);
5880
0
    assert(p_j2k != 00);
5881
5882
0
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5883
0
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5884
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
5885
5886
0
    if (p_header_size < 2) {
5887
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5888
0
        return OPJ_FALSE;
5889
0
    }
5890
5891
    /* first marker */
5892
0
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmct */
5893
0
    p_header_data += 2;
5894
0
    if (l_tmp != 0) {
5895
0
        opj_event_msg(p_manager, EVT_WARNING,
5896
0
                      "Cannot take in charge mct data within multiple MCT records\n");
5897
0
        return OPJ_TRUE;
5898
0
    }
5899
5900
0
    if (p_header_size <= 6) {
5901
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5902
0
        return OPJ_FALSE;
5903
0
    }
5904
5905
    /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
5906
0
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Imct */
5907
0
    p_header_data += 2;
5908
5909
0
    l_indix = l_tmp & 0xff;
5910
0
    l_mct_data = l_tcp->m_mct_records;
5911
5912
0
    for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
5913
0
        if (l_mct_data->m_index == l_indix) {
5914
0
            break;
5915
0
        }
5916
0
        ++l_mct_data;
5917
0
    }
5918
5919
    /* NOT FOUND */
5920
0
    if (i == l_tcp->m_nb_mct_records) {
5921
0
        if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
5922
0
            opj_mct_data_t *new_mct_records;
5923
0
            l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
5924
5925
0
            new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records,
5926
0
                              l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
5927
0
            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
0
            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
0
            l_tcp->m_mct_records = new_mct_records;
5958
0
            l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5959
0
            memset(l_mct_data, 0, (l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) *
5960
0
                   sizeof(opj_mct_data_t));
5961
0
        }
5962
5963
0
        l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5964
0
        ++l_tcp->m_nb_mct_records;
5965
0
    }
5966
5967
0
    if (l_mct_data->m_data) {
5968
0
        opj_free(l_mct_data->m_data);
5969
0
        l_mct_data->m_data = 00;
5970
0
        l_mct_data->m_data_size = 0;
5971
0
    }
5972
5973
0
    l_mct_data->m_index = l_indix;
5974
0
    l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
5975
0
    l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
5976
5977
0
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymct */
5978
0
    p_header_data += 2;
5979
0
    if (l_tmp != 0) {
5980
0
        opj_event_msg(p_manager, EVT_WARNING,
5981
0
                      "Cannot take in charge multiple MCT markers\n");
5982
0
        return OPJ_TRUE;
5983
0
    }
5984
5985
0
    p_header_size -= 6;
5986
5987
0
    l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
5988
0
    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
0
    memcpy(l_mct_data->m_data, p_header_data, p_header_size);
5993
5994
0
    l_mct_data->m_data_size = p_header_size;
5995
5996
0
    return OPJ_TRUE;
5997
0
}
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
0
{
6119
0
    OPJ_UINT32 i, j;
6120
0
    OPJ_UINT32 l_tmp;
6121
0
    OPJ_UINT32 l_indix;
6122
0
    opj_tcp_t * l_tcp;
6123
0
    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6124
0
    opj_mct_data_t * l_mct_data;
6125
0
    OPJ_UINT32 l_nb_collections;
6126
0
    OPJ_UINT32 l_nb_comps;
6127
0
    OPJ_UINT32 l_nb_bytes_by_comp;
6128
0
    OPJ_BOOL l_new_mcc = OPJ_FALSE;
6129
6130
    /* preconditions */
6131
0
    assert(p_header_data != 00);
6132
0
    assert(p_j2k != 00);
6133
0
    assert(p_manager != 00);
6134
6135
0
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6136
0
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6137
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
6138
6139
0
    if (p_header_size < 2) {
6140
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6141
0
        return OPJ_FALSE;
6142
0
    }
6143
6144
    /* first marker */
6145
0
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmcc */
6146
0
    p_header_data += 2;
6147
0
    if (l_tmp != 0) {
6148
0
        opj_event_msg(p_manager, EVT_WARNING,
6149
0
                      "Cannot take in charge multiple data spanning\n");
6150
0
        return OPJ_TRUE;
6151
0
    }
6152
6153
0
    if (p_header_size < 7) {
6154
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6155
0
        return OPJ_FALSE;
6156
0
    }
6157
6158
0
    opj_read_bytes(p_header_data, &l_indix,
6159
0
                   1); /* Imcc -> no need for other values, take the first */
6160
0
    ++p_header_data;
6161
6162
0
    l_mcc_record = l_tcp->m_mcc_records;
6163
6164
0
    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
0
    if (i == l_tcp->m_nb_mcc_records) {
6173
0
        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
0
        l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
6194
0
        l_new_mcc = OPJ_TRUE;
6195
0
    }
6196
0
    l_mcc_record->m_index = l_indix;
6197
6198
    /* only one marker atm */
6199
0
    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymcc */
6200
0
    p_header_data += 2;
6201
0
    if (l_tmp != 0) {
6202
0
        opj_event_msg(p_manager, EVT_WARNING,
6203
0
                      "Cannot take in charge multiple data spanning\n");
6204
0
        return OPJ_TRUE;
6205
0
    }
6206
6207
0
    opj_read_bytes(p_header_data, &l_nb_collections,
6208
0
                   2);                              /* Qmcc -> number of collections -> 1 */
6209
0
    p_header_data += 2;
6210
6211
0
    if (l_nb_collections > 1) {
6212
0
        opj_event_msg(p_manager, EVT_WARNING,
6213
0
                      "Cannot take in charge multiple collections\n");
6214
0
        return OPJ_TRUE;
6215
0
    }
6216
6217
0
    p_header_size -= 7;
6218
6219
0
    for (i = 0; i < l_nb_collections; ++i) {
6220
0
        if (p_header_size < 3) {
6221
0
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6222
0
            return OPJ_FALSE;
6223
0
        }
6224
6225
0
        opj_read_bytes(p_header_data, &l_tmp,
6226
0
                       1); /* Xmcci type of component transformation -> array based decorrelation */
6227
0
        ++p_header_data;
6228
6229
0
        if (l_tmp != 1) {
6230
0
            opj_event_msg(p_manager, EVT_WARNING,
6231
0
                          "Cannot take in charge collections other than array decorrelation\n");
6232
0
            return OPJ_TRUE;
6233
0
        }
6234
6235
0
        opj_read_bytes(p_header_data, &l_nb_comps, 2);
6236
6237
0
        p_header_data += 2;
6238
0
        p_header_size -= 3;
6239
6240
0
        l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
6241
0
        l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
6242
6243
0
        if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
6244
0
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6245
0
            return OPJ_FALSE;
6246
0
        }
6247
6248
0
        p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
6249
6250
0
        for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
6251
0
            opj_read_bytes(p_header_data, &l_tmp,
6252
0
                           l_nb_bytes_by_comp);      /* Cmccij Component offset*/
6253
0
            p_header_data += l_nb_bytes_by_comp;
6254
6255
0
            if (l_tmp != j) {
6256
0
                opj_event_msg(p_manager, EVT_WARNING,
6257
0
                              "Cannot take in charge collections with indix shuffle\n");
6258
0
                return OPJ_TRUE;
6259
0
            }
6260
0
        }
6261
6262
0
        opj_read_bytes(p_header_data, &l_nb_comps, 2);
6263
0
        p_header_data += 2;
6264
6265
0
        l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
6266
0
        l_nb_comps &= 0x7fff;
6267
6268
0
        if (l_nb_comps != l_mcc_record->m_nb_comps) {
6269
0
            opj_event_msg(p_manager, EVT_WARNING,
6270
0
                          "Cannot take in charge collections without same number of indixes\n");
6271
0
            return OPJ_TRUE;
6272
0
        }
6273
6274
0
        if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
6275
0
            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6276
0
            return OPJ_FALSE;
6277
0
        }
6278
6279
0
        p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
6280
6281
0
        for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
6282
0
            opj_read_bytes(p_header_data, &l_tmp,
6283
0
                           l_nb_bytes_by_comp);      /* Wmccij Component offset*/
6284
0
            p_header_data += l_nb_bytes_by_comp;
6285
6286
0
            if (l_tmp != j) {
6287
0
                opj_event_msg(p_manager, EVT_WARNING,
6288
0
                              "Cannot take in charge collections with indix shuffle\n");
6289
0
                return OPJ_TRUE;
6290
0
            }
6291
0
        }
6292
6293
0
        opj_read_bytes(p_header_data, &l_tmp, 3); /* Wmccij Component offset*/
6294
0
        p_header_data += 3;
6295
6296
0
        l_mcc_record->m_is_irreversible = !((l_tmp >> 16) & 1);
6297
0
        l_mcc_record->m_decorrelation_array = 00;
6298
0
        l_mcc_record->m_offset_array = 00;
6299
6300
0
        l_indix = l_tmp & 0xff;
6301
0
        if (l_indix != 0) {
6302
0
            l_mct_data = l_tcp->m_mct_records;
6303
0
            for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6304
0
                if (l_mct_data->m_index == l_indix) {
6305
0
                    l_mcc_record->m_decorrelation_array = l_mct_data;
6306
0
                    break;
6307
0
                }
6308
0
                ++l_mct_data;
6309
0
            }
6310
6311
0
            if (l_mcc_record->m_decorrelation_array == 00) {
6312
0
                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6313
0
                return OPJ_FALSE;
6314
0
            }
6315
0
        }
6316
6317
0
        l_indix = (l_tmp >> 8) & 0xff;
6318
0
        if (l_indix != 0) {
6319
0
            l_mct_data = l_tcp->m_mct_records;
6320
0
            for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6321
0
                if (l_mct_data->m_index == l_indix) {
6322
0
                    l_mcc_record->m_offset_array = l_mct_data;
6323
0
                    break;
6324
0
                }
6325
0
                ++l_mct_data;
6326
0
            }
6327
6328
0
            if (l_mcc_record->m_offset_array == 00) {
6329
0
                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6330
0
                return OPJ_FALSE;
6331
0
            }
6332
0
        }
6333
0
    }
6334
6335
0
    if (p_header_size != 0) {
6336
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6337
0
        return OPJ_FALSE;
6338
0
    }
6339
6340
0
    if (l_new_mcc) {
6341
0
        ++l_tcp->m_nb_mcc_records;
6342
0
    }
6343
6344
0
    return OPJ_TRUE;
6345
0
}
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
0
{
6424
0
    OPJ_UINT32 l_tmp, i;
6425
0
    OPJ_UINT32 l_nb_stages;
6426
0
    opj_tcp_t * l_tcp;
6427
0
    opj_tccp_t * l_tccp;
6428
0
    opj_image_t * l_image;
6429
6430
    /* preconditions */
6431
0
    assert(p_header_data != 00);
6432
0
    assert(p_j2k != 00);
6433
0
    assert(p_manager != 00);
6434
6435
0
    l_image = p_j2k->m_private_image;
6436
0
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6437
0
            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6438
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
6439
6440
0
    if (p_header_size < 1) {
6441
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
6442
0
        return OPJ_FALSE;
6443
0
    }
6444
6445
0
    opj_read_bytes(p_header_data, &l_nb_stages,
6446
0
                   1);                         /* Nmco : only one transform stage*/
6447
0
    ++p_header_data;
6448
6449
0
    if (l_nb_stages > 1) {
6450
0
        opj_event_msg(p_manager, EVT_WARNING,
6451
0
                      "Cannot take in charge multiple transformation stages.\n");
6452
0
        return OPJ_TRUE;
6453
0
    }
6454
6455
0
    if (p_header_size != l_nb_stages + 1) {
6456
0
        opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
6457
0
        return OPJ_FALSE;
6458
0
    }
6459
6460
0
    l_tccp = l_tcp->tccps;
6461
6462
0
    if (l_nb_stages > 0) {
6463
0
        for (i = 0; i < l_image->numcomps; ++i) {
6464
0
            l_tccp->m_dc_level_shift = 0;
6465
0
            ++l_tccp;
6466
0
        }
6467
0
    }
6468
6469
0
    if (l_tcp->m_mct_decoding_matrix) {
6470
0
        opj_free(l_tcp->m_mct_decoding_matrix);
6471
0
        l_tcp->m_mct_decoding_matrix = 00;
6472
0
    }
6473
6474
0
    for (i = 0; i < l_nb_stages; ++i) {
6475
0
        opj_read_bytes(p_header_data, &l_tmp, 1);
6476
0
        ++p_header_data;
6477
6478
0
        if (! opj_j2k_add_mct(l_tcp, p_j2k->m_private_image, l_tmp)) {
6479
0
            return OPJ_FALSE;
6480
0
        }
6481
0
    }
6482
6483
0
    return OPJ_TRUE;
6484
0
}
6485
6486
static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
6487
                                OPJ_UINT32 p_index)
6488
0
{
6489
0
    OPJ_UINT32 i;
6490
0
    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6491
0
    opj_mct_data_t * l_deco_array, * l_offset_array;
6492
0
    OPJ_UINT32 l_data_size, l_mct_size, l_offset_size;
6493
0
    OPJ_UINT32 l_nb_elem;
6494
0
    OPJ_UINT32 * l_offset_data, * l_current_offset_data;
6495
0
    opj_tccp_t * l_tccp;
6496
6497
    /* preconditions */
6498
0
    assert(p_tcp != 00);
6499
6500
0
    l_mcc_record = p_tcp->m_mcc_records;
6501
6502
0
    for (i = 0; i < p_tcp->m_nb_mcc_records; ++i) {
6503
0
        if (l_mcc_record->m_index == p_index) {
6504
0
            break;
6505
0
        }
6506
0
    }
6507
6508
0
    if (i == p_tcp->m_nb_mcc_records) {
6509
        /** element discarded **/
6510
0
        return OPJ_TRUE;
6511
0
    }
6512
6513
0
    if (l_mcc_record->m_nb_comps != p_image->numcomps) {
6514
        /** do not support number of comps != image */
6515
0
        return OPJ_TRUE;
6516
0
    }
6517
6518
0
    l_deco_array = l_mcc_record->m_decorrelation_array;
6519
6520
0
    if (l_deco_array) {
6521
0
        l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps
6522
0
                      * p_image->numcomps;
6523
0
        if (l_deco_array->m_data_size != l_data_size) {
6524
0
            return OPJ_FALSE;
6525
0
        }
6526
6527
0
        l_nb_elem = p_image->numcomps * p_image->numcomps;
6528
0
        l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
6529
0
        p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
6530
6531
0
        if (! p_tcp->m_mct_decoding_matrix) {
6532
0
            return OPJ_FALSE;
6533
0
        }
6534
6535
0
        j2k_mct_read_functions_to_float[l_deco_array->m_element_type](
6536
0
            l_deco_array->m_data, p_tcp->m_mct_decoding_matrix, l_nb_elem);
6537
0
    }
6538
6539
0
    l_offset_array = l_mcc_record->m_offset_array;
6540
6541
0
    if (l_offset_array) {
6542
0
        l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] *
6543
0
                      p_image->numcomps;
6544
0
        if (l_offset_array->m_data_size != l_data_size) {
6545
0
            return OPJ_FALSE;
6546
0
        }
6547
6548
0
        l_nb_elem = p_image->numcomps;
6549
0
        l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
6550
0
        l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
6551
6552
0
        if (! l_offset_data) {
6553
0
            return OPJ_FALSE;
6554
0
        }
6555
6556
0
        j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](
6557
0
            l_offset_array->m_data, l_offset_data, l_nb_elem);
6558
6559
0
        l_tccp = p_tcp->tccps;
6560
0
        l_current_offset_data = l_offset_data;
6561
6562
0
        for (i = 0; i < p_image->numcomps; ++i) {
6563
0
            l_tccp->m_dc_level_shift = (OPJ_INT32) * (l_current_offset_data++);
6564
0
            ++l_tccp;
6565
0
        }
6566
6567
0
        opj_free(l_offset_data);
6568
0
    }
6569
6570
0
    return OPJ_TRUE;
6571
0
}
6572
6573
static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
6574
                                  struct opj_stream_private *p_stream,
6575
                                  struct opj_event_mgr * p_manager)
6576
0
{
6577
0
    OPJ_UINT32 i;
6578
0
    OPJ_UINT32 l_cbd_size;
6579
0
    OPJ_BYTE * l_current_data = 00;
6580
0
    opj_image_t *l_image = 00;
6581
0
    opj_image_comp_t * l_comp = 00;
6582
6583
    /* preconditions */
6584
0
    assert(p_j2k != 00);
6585
0
    assert(p_manager != 00);
6586
0
    assert(p_stream != 00);
6587
6588
0
    l_image = p_j2k->m_private_image;
6589
0
    l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
6590
6591
0
    if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
6592
0
        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
6593
0
                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
6594
0
        if (! new_header_tile_data) {
6595
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
6596
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
6597
0
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
6598
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
6599
0
            return OPJ_FALSE;
6600
0
        }
6601
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
6602
0
        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
6603
0
    }
6604
6605
0
    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
6606
6607
0
    opj_write_bytes(l_current_data, J2K_MS_CBD, 2);                 /* CBD */
6608
0
    l_current_data += 2;
6609
6610
0
    opj_write_bytes(l_current_data, l_cbd_size - 2, 2);             /* L_CBD */
6611
0
    l_current_data += 2;
6612
6613
0
    opj_write_bytes(l_current_data, l_image->numcomps, 2);          /* Ncbd */
6614
0
    l_current_data += 2;
6615
6616
0
    l_comp = l_image->comps;
6617
6618
0
    for (i = 0; i < l_image->numcomps; ++i) {
6619
0
        opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1),
6620
0
                        1);           /* Component bit depth */
6621
0
        ++l_current_data;
6622
6623
0
        ++l_comp;
6624
0
    }
6625
6626
0
    if (opj_stream_write_data(p_stream,
6627
0
                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size,
6628
0
                              p_manager) != l_cbd_size) {
6629
0
        return OPJ_FALSE;
6630
0
    }
6631
6632
0
    return OPJ_TRUE;
6633
0
}
6634
6635
/**
6636
 * Reads a CBD marker (Component bit depth definition)
6637
 * @param       p_header_data   the data contained in the CBD box.
6638
 * @param       p_j2k                   the jpeg2000 codec.
6639
 * @param       p_header_size   the size of the data contained in the CBD marker.
6640
 * @param       p_manager               the user event manager.
6641
*/
6642
static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
6643
                                 OPJ_BYTE * p_header_data,
6644
                                 OPJ_UINT32 p_header_size,
6645
                                 opj_event_mgr_t * p_manager
6646
                                )
6647
0
{
6648
0
    OPJ_UINT32 l_nb_comp, l_num_comp;
6649
0
    OPJ_UINT32 l_comp_def;
6650
0
    OPJ_UINT32 i;
6651
0
    opj_image_comp_t * l_comp = 00;
6652
6653
    /* preconditions */
6654
0
    assert(p_header_data != 00);
6655
0
    assert(p_j2k != 00);
6656
0
    assert(p_manager != 00);
6657
6658
0
    l_num_comp = p_j2k->m_private_image->numcomps;
6659
6660
0
    if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
6661
0
        opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6662
0
        return OPJ_FALSE;
6663
0
    }
6664
6665
0
    opj_read_bytes(p_header_data, &l_nb_comp,
6666
0
                   2);                           /* Ncbd */
6667
0
    p_header_data += 2;
6668
6669
0
    if (l_nb_comp != l_num_comp) {
6670
0
        opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6671
0
        return OPJ_FALSE;
6672
0
    }
6673
6674
0
    l_comp = p_j2k->m_private_image->comps;
6675
0
    for (i = 0; i < l_num_comp; ++i) {
6676
0
        opj_read_bytes(p_header_data, &l_comp_def,
6677
0
                       1);                  /* Component bit depth */
6678
0
        ++p_header_data;
6679
0
        l_comp->sgnd = (l_comp_def >> 7) & 1;
6680
0
        l_comp->prec = (l_comp_def & 0x7f) + 1;
6681
6682
0
        if (l_comp->prec > 31) {
6683
0
            opj_event_msg(p_manager, EVT_ERROR,
6684
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",
6685
0
                          i, l_comp->prec);
6686
0
            return OPJ_FALSE;
6687
0
        }
6688
0
        ++l_comp;
6689
0
    }
6690
6691
0
    return OPJ_TRUE;
6692
0
}
6693
6694
/**
6695
 * Reads a CAP marker (extended capabilities definition). Empty implementation.
6696
 * Found in HTJ2K files.
6697
 *
6698
 * @param       p_header_data   the data contained in the CAP box.
6699
 * @param       p_j2k                   the jpeg2000 codec.
6700
 * @param       p_header_size   the size of the data contained in the CAP marker.
6701
 * @param       p_manager               the user event manager.
6702
*/
6703
static OPJ_BOOL opj_j2k_read_cap(opj_j2k_t *p_j2k,
6704
                                 OPJ_BYTE * p_header_data,
6705
                                 OPJ_UINT32 p_header_size,
6706
                                 opj_event_mgr_t * p_manager
6707
                                )
6708
0
{
6709
    /* preconditions */
6710
0
    assert(p_header_data != 00);
6711
0
    assert(p_j2k != 00);
6712
0
    assert(p_manager != 00);
6713
6714
0
    (void)p_j2k;
6715
0
    (void)p_header_data;
6716
0
    (void)p_header_size;
6717
0
    (void)p_manager;
6718
6719
0
    return OPJ_TRUE;
6720
0
}
6721
6722
/**
6723
 * Reads a CPF marker (corresponding profile). Empty implementation. Found in HTJ2K files
6724
 * @param       p_header_data   the data contained in the CPF box.
6725
 * @param       p_j2k                   the jpeg2000 codec.
6726
 * @param       p_header_size   the size of the data contained in the CPF marker.
6727
 * @param       p_manager               the user event manager.
6728
*/
6729
static OPJ_BOOL opj_j2k_read_cpf(opj_j2k_t *p_j2k,
6730
                                 OPJ_BYTE * p_header_data,
6731
                                 OPJ_UINT32 p_header_size,
6732
                                 opj_event_mgr_t * p_manager
6733
                                )
6734
0
{
6735
    /* preconditions */
6736
0
    assert(p_header_data != 00);
6737
0
    assert(p_j2k != 00);
6738
0
    assert(p_manager != 00);
6739
6740
0
    (void)p_j2k;
6741
0
    (void)p_header_data;
6742
0
    (void)p_header_size;
6743
0
    (void)p_manager;
6744
6745
0
    return OPJ_TRUE;
6746
0
}
6747
6748
/* ----------------------------------------------------------------------- */
6749
/* J2K / JPT decoder interface                                             */
6750
/* ----------------------------------------------------------------------- */
6751
6752
void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
6753
11
{
6754
11
    if (j2k && parameters) {
6755
11
        j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
6756
11
        j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
6757
6758
11
        j2k->dump_state = (parameters->flags & OPJ_DPARAMETERS_DUMP_FLAG);
6759
#ifdef USE_JPWL
6760
        j2k->m_cp.correct = parameters->jpwl_correct;
6761
        j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
6762
        j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
6763
#endif /* USE_JPWL */
6764
11
    }
6765
11
}
6766
6767
void opj_j2k_decoder_set_strict_mode(opj_j2k_t *j2k, OPJ_BOOL strict)
6768
0
{
6769
0
    if (j2k) {
6770
0
        j2k->m_cp.strict = strict;
6771
0
        if (strict) {
6772
0
            j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
6773
0
        }
6774
0
    }
6775
0
}
6776
6777
OPJ_BOOL opj_j2k_set_threads(opj_j2k_t *j2k, OPJ_UINT32 num_threads)
6778
0
{
6779
    /* Currently we pass the thread-pool to the tcd, so we cannot re-set it */
6780
    /* afterwards */
6781
0
    if (opj_has_thread_support() && j2k->m_tcd == NULL) {
6782
0
        opj_thread_pool_destroy(j2k->m_tp);
6783
0
        j2k->m_tp = NULL;
6784
0
        if (num_threads <= (OPJ_UINT32)INT_MAX) {
6785
0
            j2k->m_tp = opj_thread_pool_create((int)num_threads);
6786
0
        }
6787
0
        if (j2k->m_tp == NULL) {
6788
0
            j2k->m_tp = opj_thread_pool_create(0);
6789
0
            return OPJ_FALSE;
6790
0
        }
6791
0
        return OPJ_TRUE;
6792
0
    }
6793
0
    return OPJ_FALSE;
6794
0
}
6795
6796
static int opj_j2k_get_default_thread_count(void)
6797
269
{
6798
269
    const char* num_threads_str = getenv("OPJ_NUM_THREADS");
6799
269
    int num_cpus;
6800
269
    int num_threads;
6801
6802
269
    if (num_threads_str == NULL || !opj_has_thread_support()) {
6803
269
        return 0;
6804
269
    }
6805
0
    num_cpus = opj_get_num_cpus();
6806
0
    if (strcmp(num_threads_str, "ALL_CPUS") == 0) {
6807
0
        return num_cpus;
6808
0
    }
6809
0
    if (num_cpus == 0) {
6810
0
        num_cpus = 32;
6811
0
    }
6812
0
    num_threads = atoi(num_threads_str);
6813
0
    if (num_threads < 0) {
6814
0
        num_threads = 0;
6815
0
    } else if (num_threads > 2 * num_cpus) {
6816
0
        num_threads = 2 * num_cpus;
6817
0
    }
6818
0
    return num_threads;
6819
0
}
6820
6821
/* ----------------------------------------------------------------------- */
6822
/* J2K encoder interface                                                       */
6823
/* ----------------------------------------------------------------------- */
6824
6825
opj_j2k_t* opj_j2k_create_compress(void)
6826
258
{
6827
258
    opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
6828
258
    if (!l_j2k) {
6829
0
        return NULL;
6830
0
    }
6831
6832
6833
258
    l_j2k->m_is_decoder = 0;
6834
258
    l_j2k->m_cp.m_is_decoder = 0;
6835
6836
258
    l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(
6837
258
                OPJ_J2K_DEFAULT_HEADER_SIZE);
6838
258
    if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
6839
0
        opj_j2k_destroy(l_j2k);
6840
0
        return NULL;
6841
0
    }
6842
6843
258
    l_j2k->m_specific_param.m_encoder.m_header_tile_data_size =
6844
258
        OPJ_J2K_DEFAULT_HEADER_SIZE;
6845
6846
    /* validation list creation*/
6847
258
    l_j2k->m_validation_list = opj_procedure_list_create();
6848
258
    if (! l_j2k->m_validation_list) {
6849
0
        opj_j2k_destroy(l_j2k);
6850
0
        return NULL;
6851
0
    }
6852
6853
    /* execution list creation*/
6854
258
    l_j2k->m_procedure_list = opj_procedure_list_create();
6855
258
    if (! l_j2k->m_procedure_list) {
6856
0
        opj_j2k_destroy(l_j2k);
6857
0
        return NULL;
6858
0
    }
6859
6860
258
    l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
6861
258
    if (!l_j2k->m_tp) {
6862
0
        l_j2k->m_tp = opj_thread_pool_create(0);
6863
0
    }
6864
258
    if (!l_j2k->m_tp) {
6865
0
        opj_j2k_destroy(l_j2k);
6866
0
        return NULL;
6867
0
    }
6868
6869
258
    return l_j2k;
6870
258
}
6871
6872
static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres)
6873
0
{
6874
0
    POC[0].tile  = 1;
6875
0
    POC[0].resno0  = 0;
6876
0
    POC[0].compno0 = 0;
6877
0
    POC[0].layno1  = 1;
6878
0
    POC[0].resno1  = (OPJ_UINT32)(numres - 1);
6879
0
    POC[0].compno1 = 3;
6880
0
    POC[0].prg1 = OPJ_CPRL;
6881
0
    POC[1].tile  = 1;
6882
0
    POC[1].resno0  = (OPJ_UINT32)(numres - 1);
6883
0
    POC[1].compno0 = 0;
6884
0
    POC[1].layno1  = 1;
6885
0
    POC[1].resno1  = (OPJ_UINT32)numres;
6886
0
    POC[1].compno1 = 3;
6887
0
    POC[1].prg1 = OPJ_CPRL;
6888
0
    return 2;
6889
0
}
6890
6891
static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
6892
        opj_image_t *image, opj_event_mgr_t *p_manager)
6893
0
{
6894
    /* Configure cinema parameters */
6895
0
    int i;
6896
6897
    /* No tiling */
6898
0
    parameters->tile_size_on = OPJ_FALSE;
6899
0
    parameters->cp_tdx = 1;
6900
0
    parameters->cp_tdy = 1;
6901
6902
    /* One tile part for each component */
6903
0
    parameters->tp_flag = 'C';
6904
0
    parameters->tp_on = 1;
6905
6906
    /* Tile and Image shall be at (0,0) */
6907
0
    parameters->cp_tx0 = 0;
6908
0
    parameters->cp_ty0 = 0;
6909
0
    parameters->image_offset_x0 = 0;
6910
0
    parameters->image_offset_y0 = 0;
6911
6912
    /* Codeblock size= 32*32 */
6913
0
    parameters->cblockw_init = 32;
6914
0
    parameters->cblockh_init = 32;
6915
6916
    /* Codeblock style: no mode switch enabled */
6917
0
    parameters->mode = 0;
6918
6919
    /* No ROI */
6920
0
    parameters->roi_compno = -1;
6921
6922
    /* No subsampling */
6923
0
    parameters->subsampling_dx = 1;
6924
0
    parameters->subsampling_dy = 1;
6925
6926
    /* 9-7 transform */
6927
0
    parameters->irreversible = 1;
6928
6929
    /* Number of layers */
6930
0
    if (parameters->tcp_numlayers > 1) {
6931
0
        opj_event_msg(p_manager, EVT_WARNING,
6932
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6933
0
                      "1 single quality layer"
6934
0
                      "-> Number of layers forced to 1 (rather than %d)\n"
6935
0
                      "-> Rate of the last layer (%3.1f) will be used",
6936
0
                      parameters->tcp_numlayers,
6937
0
                      parameters->tcp_rates[parameters->tcp_numlayers - 1]);
6938
0
        parameters->tcp_rates[0] = parameters->tcp_rates[parameters->tcp_numlayers - 1];
6939
0
        parameters->tcp_numlayers = 1;
6940
0
    }
6941
6942
    /* Resolution levels */
6943
0
    switch (parameters->rsiz) {
6944
0
    case OPJ_PROFILE_CINEMA_2K:
6945
0
        if (parameters->numresolution > 6) {
6946
0
            opj_event_msg(p_manager, EVT_WARNING,
6947
0
                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6948
0
                          "Number of decomposition levels <= 5\n"
6949
0
                          "-> Number of decomposition levels forced to 5 (rather than %d)\n",
6950
0
                          parameters->numresolution + 1);
6951
0
            parameters->numresolution = 6;
6952
0
        }
6953
0
        break;
6954
0
    case OPJ_PROFILE_CINEMA_4K:
6955
0
        if (parameters->numresolution < 2) {
6956
0
            opj_event_msg(p_manager, EVT_WARNING,
6957
0
                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6958
0
                          "Number of decomposition levels >= 1 && <= 6\n"
6959
0
                          "-> Number of decomposition levels forced to 1 (rather than %d)\n",
6960
0
                          parameters->numresolution + 1);
6961
0
            parameters->numresolution = 1;
6962
0
        } else if (parameters->numresolution > 7) {
6963
0
            opj_event_msg(p_manager, EVT_WARNING,
6964
0
                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6965
0
                          "Number of decomposition levels >= 1 && <= 6\n"
6966
0
                          "-> Number of decomposition levels forced to 6 (rather than %d)\n",
6967
0
                          parameters->numresolution + 1);
6968
0
            parameters->numresolution = 7;
6969
0
        }
6970
0
        break;
6971
0
    default :
6972
0
        break;
6973
0
    }
6974
6975
    /* Precincts */
6976
0
    parameters->csty |= J2K_CP_CSTY_PRT;
6977
0
    if (parameters->numresolution == 1) {
6978
0
        parameters->res_spec = 1;
6979
0
        parameters->prcw_init[0] = 128;
6980
0
        parameters->prch_init[0] = 128;
6981
0
    } else {
6982
0
        parameters->res_spec = parameters->numresolution - 1;
6983
0
        for (i = 0; i < parameters->res_spec; i++) {
6984
0
            parameters->prcw_init[i] = 256;
6985
0
            parameters->prch_init[i] = 256;
6986
0
        }
6987
0
    }
6988
6989
    /* The progression order shall be CPRL */
6990
0
    parameters->prog_order = OPJ_CPRL;
6991
6992
    /* Progression order changes for 4K, disallowed for 2K */
6993
0
    if (parameters->rsiz == OPJ_PROFILE_CINEMA_4K) {
6994
0
        parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,
6995
0
                              parameters->numresolution);
6996
0
    } else {
6997
0
        parameters->numpocs = 0;
6998
0
    }
6999
7000
    /* Limited bit-rate */
7001
0
    parameters->cp_disto_alloc = 1;
7002
0
    if (parameters->max_cs_size <= 0) {
7003
        /* No rate has been introduced, 24 fps is assumed */
7004
0
        parameters->max_cs_size = OPJ_CINEMA_24_CS;
7005
0
        opj_event_msg(p_manager, EVT_WARNING,
7006
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
7007
0
                      "Maximum 1302083 compressed bytes @ 24fps\n"
7008
0
                      "As no rate has been given, this limit will be used.\n");
7009
0
    } else if (parameters->max_cs_size > OPJ_CINEMA_24_CS) {
7010
0
        opj_event_msg(p_manager, EVT_WARNING,
7011
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
7012
0
                      "Maximum 1302083 compressed bytes @ 24fps\n"
7013
0
                      "-> Specified rate exceeds this limit. Rate will be forced to 1302083 bytes.\n");
7014
0
        parameters->max_cs_size = OPJ_CINEMA_24_CS;
7015
0
    }
7016
7017
0
    if (parameters->max_comp_size <= 0) {
7018
        /* No rate has been introduced, 24 fps is assumed */
7019
0
        parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7020
0
        opj_event_msg(p_manager, EVT_WARNING,
7021
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
7022
0
                      "Maximum 1041666 compressed bytes @ 24fps\n"
7023
0
                      "As no rate has been given, this limit will be used.\n");
7024
0
    } else if (parameters->max_comp_size > OPJ_CINEMA_24_COMP) {
7025
0
        opj_event_msg(p_manager, EVT_WARNING,
7026
0
                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
7027
0
                      "Maximum 1041666 compressed bytes @ 24fps\n"
7028
0
                      "-> Specified rate exceeds this limit. Rate will be forced to 1041666 bytes.\n");
7029
0
        parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7030
0
    }
7031
7032
0
    parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
7033
0
                               image->comps[0].h * image->comps[0].prec) /
7034
0
                               (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
7035
0
                                       image->comps[0].dy);
7036
7037
0
}
7038
7039
static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
7040
        opj_event_mgr_t *p_manager)
7041
0
{
7042
0
    OPJ_UINT32 i;
7043
7044
    /* Number of components */
7045
0
    if (image->numcomps != 3) {
7046
0
        opj_event_msg(p_manager, EVT_WARNING,
7047
0
                      "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
7048
0
                      "3 components"
7049
0
                      "-> Number of components of input image (%d) is not compliant\n"
7050
0
                      "-> Non-profile-3 codestream will be generated\n",
7051
0
                      image->numcomps);
7052
0
        return OPJ_FALSE;
7053
0
    }
7054
7055
    /* Bitdepth */
7056
0
    for (i = 0; i < image->numcomps; i++) {
7057
0
        if ((image->comps[i].prec != 12) | (image->comps[i].sgnd)) {
7058
0
            char signed_str[] = "signed";
7059
0
            char unsigned_str[] = "unsigned";
7060
0
            char *tmp_str = image->comps[i].sgnd ? signed_str : unsigned_str;
7061
0
            opj_event_msg(p_manager, EVT_WARNING,
7062
0
                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
7063
0
                          "Precision of each component shall be 12 bits unsigned"
7064
0
                          "-> At least component %d of input image (%d bits, %s) is not compliant\n"
7065
0
                          "-> Non-profile-3 codestream will be generated\n",
7066
0
                          i, image->comps[i].prec, tmp_str);
7067
0
            return OPJ_FALSE;
7068
0
        }
7069
0
    }
7070
7071
    /* Image size */
7072
0
    switch (rsiz) {
7073
0
    case OPJ_PROFILE_CINEMA_2K:
7074
0
        if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))) {
7075
0
            opj_event_msg(p_manager, EVT_WARNING,
7076
0
                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
7077
0
                          "width <= 2048 and height <= 1080\n"
7078
0
                          "-> Input image size %d x %d is not compliant\n"
7079
0
                          "-> Non-profile-3 codestream will be generated\n",
7080
0
                          image->comps[0].w, image->comps[0].h);
7081
0
            return OPJ_FALSE;
7082
0
        }
7083
0
        break;
7084
0
    case OPJ_PROFILE_CINEMA_4K:
7085
0
        if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))) {
7086
0
            opj_event_msg(p_manager, EVT_WARNING,
7087
0
                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
7088
0
                          "width <= 4096 and height <= 2160\n"
7089
0
                          "-> Image size %d x %d is not compliant\n"
7090
0
                          "-> Non-profile-4 codestream will be generated\n",
7091
0
                          image->comps[0].w, image->comps[0].h);
7092
0
            return OPJ_FALSE;
7093
0
        }
7094
0
        break;
7095
0
    default :
7096
0
        break;
7097
0
    }
7098
7099
0
    return OPJ_TRUE;
7100
0
}
7101
7102
static int opj_j2k_get_imf_max_NL(opj_cparameters_t *parameters,
7103
                                  opj_image_t *image)
7104
0
{
7105
    /* Decomposition levels */
7106
0
    const OPJ_UINT16 rsiz = parameters->rsiz;
7107
0
    const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7108
0
    const OPJ_UINT32 XTsiz = parameters->tile_size_on ? (OPJ_UINT32)
7109
0
                             parameters->cp_tdx : image->x1;
7110
0
    switch (profile) {
7111
0
    case OPJ_PROFILE_IMF_2K:
7112
0
        return 5;
7113
0
    case OPJ_PROFILE_IMF_4K:
7114
0
        return 6;
7115
0
    case OPJ_PROFILE_IMF_8K:
7116
0
        return 7;
7117
0
    case OPJ_PROFILE_IMF_2K_R: {
7118
0
        if (XTsiz >= 2048) {
7119
0
            return 5;
7120
0
        } else if (XTsiz >= 1024) {
7121
0
            return 4;
7122
0
        }
7123
0
        break;
7124
0
    }
7125
0
    case OPJ_PROFILE_IMF_4K_R: {
7126
0
        if (XTsiz >= 4096) {
7127
0
            return 6;
7128
0
        } else if (XTsiz >= 2048) {
7129
0
            return 5;
7130
0
        } else if (XTsiz >= 1024) {
7131
0
            return 4;
7132
0
        }
7133
0
        break;
7134
0
    }
7135
0
    case OPJ_PROFILE_IMF_8K_R: {
7136
0
        if (XTsiz >= 8192) {
7137
0
            return 7;
7138
0
        } else if (XTsiz >= 4096) {
7139
0
            return 6;
7140
0
        } else if (XTsiz >= 2048) {
7141
0
            return 5;
7142
0
        } else if (XTsiz >= 1024) {
7143
0
            return 4;
7144
0
        }
7145
0
        break;
7146
0
    }
7147
0
    default:
7148
0
        break;
7149
0
    }
7150
0
    return -1;
7151
0
}
7152
7153
static void opj_j2k_set_imf_parameters(opj_cparameters_t *parameters,
7154
                                       opj_image_t *image, opj_event_mgr_t *p_manager)
7155
0
{
7156
0
    const OPJ_UINT16 rsiz = parameters->rsiz;
7157
0
    const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7158
7159
0
    OPJ_UNUSED(p_manager);
7160
7161
    /* Override defaults set by opj_set_default_encoder_parameters */
7162
0
    if (parameters->cblockw_init == OPJ_COMP_PARAM_DEFAULT_CBLOCKW &&
7163
0
            parameters->cblockh_init == OPJ_COMP_PARAM_DEFAULT_CBLOCKH) {
7164
0
        parameters->cblockw_init = 32;
7165
0
        parameters->cblockh_init = 32;
7166
0
    }
7167
7168
    /* One tile part for each component */
7169
0
    parameters->tp_flag = 'C';
7170
0
    parameters->tp_on = 1;
7171
7172
0
    if (parameters->prog_order == OPJ_COMP_PARAM_DEFAULT_PROG_ORDER) {
7173
0
        parameters->prog_order = OPJ_CPRL;
7174
0
    }
7175
7176
0
    if (profile == OPJ_PROFILE_IMF_2K ||
7177
0
            profile == OPJ_PROFILE_IMF_4K ||
7178
0
            profile == OPJ_PROFILE_IMF_8K) {
7179
        /* 9-7 transform */
7180
0
        parameters->irreversible = 1;
7181
0
    }
7182
7183
    /* Adjust the number of resolutions if set to its defaults */
7184
0
    if (parameters->numresolution == OPJ_COMP_PARAM_DEFAULT_NUMRESOLUTION &&
7185
0
            image->x0 == 0 &&
7186
0
            image->y0 == 0) {
7187
0
        const int max_NL = opj_j2k_get_imf_max_NL(parameters, image);
7188
0
        if (max_NL >= 0 && parameters->numresolution > max_NL) {
7189
0
            parameters->numresolution = max_NL + 1;
7190
0
        }
7191
7192
        /* Note: below is generic logic */
7193
0
        if (!parameters->tile_size_on) {
7194
0
            while (parameters->numresolution > 0) {
7195
0
                if (image->x1 < (1U << ((OPJ_UINT32)parameters->numresolution - 1U))) {
7196
0
                    parameters->numresolution --;
7197
0
                    continue;
7198
0
                }
7199
0
                if (image->y1 < (1U << ((OPJ_UINT32)parameters->numresolution - 1U))) {
7200
0
                    parameters->numresolution --;
7201
0
                    continue;
7202
0
                }
7203
0
                break;
7204
0
            }
7205
0
        }
7206
0
    }
7207
7208
    /* Set defaults precincts */
7209
0
    if (parameters->csty == 0) {
7210
0
        parameters->csty |= J2K_CP_CSTY_PRT;
7211
0
        if (parameters->numresolution == 1) {
7212
0
            parameters->res_spec = 1;
7213
0
            parameters->prcw_init[0] = 128;
7214
0
            parameters->prch_init[0] = 128;
7215
0
        } else {
7216
0
            int i;
7217
0
            parameters->res_spec = parameters->numresolution - 1;
7218
0
            for (i = 0; i < parameters->res_spec; i++) {
7219
0
                parameters->prcw_init[i] = 256;
7220
0
                parameters->prch_init[i] = 256;
7221
0
            }
7222
0
        }
7223
0
    }
7224
0
}
7225
7226
/* Table A.53 from JPEG2000 standard */
7227
static const OPJ_UINT16 tabMaxSubLevelFromMainLevel[] = {
7228
    15, /* unspecified */
7229
    1,
7230
    1,
7231
    1,
7232
    2,
7233
    3,
7234
    4,
7235
    5,
7236
    6,
7237
    7,
7238
    8,
7239
    9
7240
};
7241
7242
static OPJ_BOOL opj_j2k_is_imf_compliant(opj_cparameters_t *parameters,
7243
        opj_image_t *image,
7244
        opj_event_mgr_t *p_manager)
7245
0
{
7246
0
    OPJ_UINT32 i;
7247
0
    const OPJ_UINT16 rsiz = parameters->rsiz;
7248
0
    const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7249
0
    const OPJ_UINT16 mainlevel = OPJ_GET_IMF_MAINLEVEL(rsiz);
7250
0
    const OPJ_UINT16 sublevel = OPJ_GET_IMF_SUBLEVEL(rsiz);
7251
0
    const int NL = parameters->numresolution - 1;
7252
0
    const OPJ_UINT32 XTsiz = parameters->tile_size_on ? (OPJ_UINT32)
7253
0
                             parameters->cp_tdx : image->x1;
7254
0
    OPJ_BOOL ret = OPJ_TRUE;
7255
7256
    /* Validate mainlevel */
7257
0
    if (mainlevel > OPJ_IMF_MAINLEVEL_MAX) {
7258
0
        opj_event_msg(p_manager, EVT_WARNING,
7259
0
                      "IMF profile require mainlevel <= 11.\n"
7260
0
                      "-> %d is thus not compliant\n"
7261
0
                      "-> Non-IMF codestream will be generated\n",
7262
0
                      mainlevel);
7263
0
        ret = OPJ_FALSE;
7264
0
    } else {
7265
        /* Validate sublevel */
7266
0
        assert(sizeof(tabMaxSubLevelFromMainLevel) ==
7267
0
               (OPJ_IMF_MAINLEVEL_MAX + 1) * sizeof(tabMaxSubLevelFromMainLevel[0]));
7268
0
        if (sublevel > tabMaxSubLevelFromMainLevel[mainlevel]) {
7269
0
            opj_event_msg(p_manager, EVT_WARNING,
7270
0
                          "IMF profile require sublevel <= %d for mainlevel = %d.\n"
7271
0
                          "-> %d is thus not compliant\n"
7272
0
                          "-> Non-IMF codestream will be generated\n",
7273
0
                          tabMaxSubLevelFromMainLevel[mainlevel],
7274
0
                          mainlevel,
7275
0
                          sublevel);
7276
0
            ret = OPJ_FALSE;
7277
0
        }
7278
0
    }
7279
7280
    /* Number of components */
7281
0
    if (image->numcomps > 3) {
7282
0
        opj_event_msg(p_manager, EVT_WARNING,
7283
0
                      "IMF profiles require at most 3 components.\n"
7284
0
                      "-> Number of components of input image (%d) is not compliant\n"
7285
0
                      "-> Non-IMF codestream will be generated\n",
7286
0
                      image->numcomps);
7287
0
        ret = OPJ_FALSE;
7288
0
    }
7289
7290
0
    if (image->x0 != 0 || image->y0 != 0) {
7291
0
        opj_event_msg(p_manager, EVT_WARNING,
7292
0
                      "IMF profiles require image origin to be at 0,0.\n"
7293
0
                      "-> %d,%d is not compliant\n"
7294
0
                      "-> Non-IMF codestream will be generated\n",
7295
0
                      image->x0, image->y0 != 0);
7296
0
        ret = OPJ_FALSE;
7297
0
    }
7298
7299
0
    if (parameters->cp_tx0 != 0 || parameters->cp_ty0 != 0) {
7300
0
        opj_event_msg(p_manager, EVT_WARNING,
7301
0
                      "IMF profiles require tile origin to be at 0,0.\n"
7302
0
                      "-> %d,%d is not compliant\n"
7303
0
                      "-> Non-IMF codestream will be generated\n",
7304
0
                      parameters->cp_tx0, parameters->cp_ty0);
7305
0
        ret = OPJ_FALSE;
7306
0
    }
7307
7308
0
    if (parameters->tile_size_on) {
7309
0
        if (profile == OPJ_PROFILE_IMF_2K ||
7310
0
                profile == OPJ_PROFILE_IMF_4K ||
7311
0
                profile == OPJ_PROFILE_IMF_8K) {
7312
0
            if ((OPJ_UINT32)parameters->cp_tdx < image->x1 ||
7313
0
                    (OPJ_UINT32)parameters->cp_tdy < image->y1) {
7314
0
                opj_event_msg(p_manager, EVT_WARNING,
7315
0
                              "IMF 2K/4K/8K single tile profiles require tile to be greater or equal to image size.\n"
7316
0
                              "-> %d,%d is lesser than %d,%d\n"
7317
0
                              "-> Non-IMF codestream will be generated\n",
7318
0
                              parameters->cp_tdx,
7319
0
                              parameters->cp_tdy,
7320
0
                              image->x1,
7321
0
                              image->y1);
7322
0
                ret = OPJ_FALSE;
7323
0
            }
7324
0
        } else {
7325
0
            if ((OPJ_UINT32)parameters->cp_tdx >= image->x1 &&
7326
0
                    (OPJ_UINT32)parameters->cp_tdy >= image->y1) {
7327
                /* ok */
7328
0
            } else if (parameters->cp_tdx == 1024 &&
7329
0
                       parameters->cp_tdy == 1024) {
7330
                /* ok */
7331
0
            } else if (parameters->cp_tdx == 2048 &&
7332
0
                       parameters->cp_tdy == 2048 &&
7333
0
                       (profile == OPJ_PROFILE_IMF_4K ||
7334
0
                        profile == OPJ_PROFILE_IMF_8K)) {
7335
                /* ok */
7336
0
            } else if (parameters->cp_tdx == 4096 &&
7337
0
                       parameters->cp_tdy == 4096 &&
7338
0
                       profile == OPJ_PROFILE_IMF_8K) {
7339
                /* ok */
7340
0
            } else {
7341
0
                opj_event_msg(p_manager, EVT_WARNING,
7342
0
                              "IMF 2K_R/4K_R/8K_R single/multiple tile profiles "
7343
0
                              "require tile to be greater or equal to image size,\n"
7344
0
                              "or to be (1024,1024), or (2048,2048) for 4K_R/8K_R "
7345
0
                              "or (4096,4096) for 8K_R.\n"
7346
0
                              "-> %d,%d is non conformant\n"
7347
0
                              "-> Non-IMF codestream will be generated\n",
7348
0
                              parameters->cp_tdx,
7349
0
                              parameters->cp_tdy);
7350
0
                ret = OPJ_FALSE;
7351
0
            }
7352
0
        }
7353
0
    }
7354
7355
    /* Bitdepth */
7356
0
    for (i = 0; i < image->numcomps; i++) {
7357
0
        if (!(image->comps[i].prec >= 8 && image->comps[i].prec <= 16) ||
7358
0
                (image->comps[i].sgnd)) {
7359
0
            char signed_str[] = "signed";
7360
0
            char unsigned_str[] = "unsigned";
7361
0
            char *tmp_str = image->comps[i].sgnd ? signed_str : unsigned_str;
7362
0
            opj_event_msg(p_manager, EVT_WARNING,
7363
0
                          "IMF profiles require precision of each component to b in [8-16] bits unsigned"
7364
0
                          "-> At least component %d of input image (%d bits, %s) is not compliant\n"
7365
0
                          "-> Non-IMF codestream will be generated\n",
7366
0
                          i, image->comps[i].prec, tmp_str);
7367
0
            ret = OPJ_FALSE;
7368
0
        }
7369
0
    }
7370
7371
    /* Sub-sampling */
7372
0
    for (i = 0; i < image->numcomps; i++) {
7373
0
        if (i == 0 && image->comps[i].dx != 1) {
7374
0
            opj_event_msg(p_manager, EVT_WARNING,
7375
0
                          "IMF profiles require XRSiz1 == 1. Here it is set to %d.\n"
7376
0
                          "-> Non-IMF codestream will be generated\n",
7377
0
                          image->comps[i].dx);
7378
0
            ret = OPJ_FALSE;
7379
0
        }
7380
0
        if (i == 1 && image->comps[i].dx != 1 && image->comps[i].dx != 2) {
7381
0
            opj_event_msg(p_manager, EVT_WARNING,
7382
0
                          "IMF profiles require XRSiz2 == 1 or 2. Here it is set to %d.\n"
7383
0
                          "-> Non-IMF codestream will be generated\n",
7384
0
                          image->comps[i].dx);
7385
0
            ret = OPJ_FALSE;
7386
0
        }
7387
0
        if (i > 1 && image->comps[i].dx != image->comps[i - 1].dx) {
7388
0
            opj_event_msg(p_manager, EVT_WARNING,
7389
0
                          "IMF profiles require XRSiz%d to be the same as XRSiz2. "
7390
0
                          "Here it is set to %d instead of %d.\n"
7391
0
                          "-> Non-IMF codestream will be generated\n",
7392
0
                          i + 1, image->comps[i].dx, image->comps[i - 1].dx);
7393
0
            ret = OPJ_FALSE;
7394
0
        }
7395
0
        if (image->comps[i].dy != 1) {
7396
0
            opj_event_msg(p_manager, EVT_WARNING,
7397
0
                          "IMF profiles require YRsiz == 1. "
7398
0
                          "Here it is set to %d for component %d.\n"
7399
0
                          "-> Non-IMF codestream will be generated\n",
7400
0
                          image->comps[i].dy, i);
7401
0
            ret = OPJ_FALSE;
7402
0
        }
7403
0
    }
7404
7405
    /* Image size */
7406
0
    switch (profile) {
7407
0
    case OPJ_PROFILE_IMF_2K:
7408
0
    case OPJ_PROFILE_IMF_2K_R:
7409
0
        if (((image->comps[0].w > 2048) | (image->comps[0].h > 1556))) {
7410
0
            opj_event_msg(p_manager, EVT_WARNING,
7411
0
                          "IMF 2K/2K_R profile require:\n"
7412
0
                          "width <= 2048 and height <= 1556\n"
7413
0
                          "-> Input image size %d x %d is not compliant\n"
7414
0
                          "-> Non-IMF codestream will be generated\n",
7415
0
                          image->comps[0].w, image->comps[0].h);
7416
0
            ret = OPJ_FALSE;
7417
0
        }
7418
0
        break;
7419
0
    case OPJ_PROFILE_IMF_4K:
7420
0
    case OPJ_PROFILE_IMF_4K_R:
7421
0
        if (((image->comps[0].w > 4096) | (image->comps[0].h > 3112))) {
7422
0
            opj_event_msg(p_manager, EVT_WARNING,
7423
0
                          "IMF 4K/4K_R profile require:\n"
7424
0
                          "width <= 4096 and height <= 3112\n"
7425
0
                          "-> Input image size %d x %d is not compliant\n"
7426
0
                          "-> Non-IMF codestream will be generated\n",
7427
0
                          image->comps[0].w, image->comps[0].h);
7428
0
            ret = OPJ_FALSE;
7429
0
        }
7430
0
        break;
7431
0
    case OPJ_PROFILE_IMF_8K:
7432
0
    case OPJ_PROFILE_IMF_8K_R:
7433
0
        if (((image->comps[0].w > 8192) | (image->comps[0].h > 6224))) {
7434
0
            opj_event_msg(p_manager, EVT_WARNING,
7435
0
                          "IMF 8K/8K_R profile require:\n"
7436
0
                          "width <= 8192 and height <= 6224\n"
7437
0
                          "-> Input image size %d x %d is not compliant\n"
7438
0
                          "-> Non-IMF codestream will be generated\n",
7439
0
                          image->comps[0].w, image->comps[0].h);
7440
0
            ret = OPJ_FALSE;
7441
0
        }
7442
0
        break;
7443
0
    default :
7444
0
        assert(0);
7445
0
        return OPJ_FALSE;
7446
0
    }
7447
7448
0
    if (parameters->roi_compno != -1) {
7449
0
        opj_event_msg(p_manager, EVT_WARNING,
7450
0
                      "IMF profile forbid RGN / region of interest marker.\n"
7451
0
                      "-> Compression parameters specify a ROI\n"
7452
0
                      "-> Non-IMF codestream will be generated\n");
7453
0
        ret = OPJ_FALSE;
7454
0
    }
7455
7456
0
    if (parameters->cblockw_init != 32 || parameters->cblockh_init != 32) {
7457
0
        opj_event_msg(p_manager, EVT_WARNING,
7458
0
                      "IMF profile require code block size to be 32x32.\n"
7459
0
                      "-> Compression parameters set it to %dx%d.\n"
7460
0
                      "-> Non-IMF codestream will be generated\n",
7461
0
                      parameters->cblockw_init,
7462
0
                      parameters->cblockh_init);
7463
0
        ret = OPJ_FALSE;
7464
0
    }
7465
7466
0
    if (parameters->prog_order != OPJ_CPRL) {
7467
0
        opj_event_msg(p_manager, EVT_WARNING,
7468
0
                      "IMF profile require progression order to be CPRL.\n"
7469
0
                      "-> Compression parameters set it to %d.\n"
7470
0
                      "-> Non-IMF codestream will be generated\n",
7471
0
                      parameters->prog_order);
7472
0
        ret = OPJ_FALSE;
7473
0
    }
7474
7475
0
    if (parameters->numpocs != 0) {
7476
0
        opj_event_msg(p_manager, EVT_WARNING,
7477
0
                      "IMF profile forbid POC markers.\n"
7478
0
                      "-> Compression parameters set %d POC.\n"
7479
0
                      "-> Non-IMF codestream will be generated\n",
7480
0
                      parameters->numpocs);
7481
0
        ret = OPJ_FALSE;
7482
0
    }
7483
7484
    /* Codeblock style: no mode switch enabled */
7485
0
    if (parameters->mode != 0) {
7486
0
        opj_event_msg(p_manager, EVT_WARNING,
7487
0
                      "IMF profile forbid mode switch in code block style.\n"
7488
0
                      "-> Compression parameters set code block style to %d.\n"
7489
0
                      "-> Non-IMF codestream will be generated\n",
7490
0
                      parameters->mode);
7491
0
        ret = OPJ_FALSE;
7492
0
    }
7493
7494
0
    if (profile == OPJ_PROFILE_IMF_2K ||
7495
0
            profile == OPJ_PROFILE_IMF_4K ||
7496
0
            profile == OPJ_PROFILE_IMF_8K) {
7497
        /* Expect 9-7 transform */
7498
0
        if (parameters->irreversible != 1) {
7499
0
            opj_event_msg(p_manager, EVT_WARNING,
7500
0
                          "IMF 2K/4K/8K profiles require 9-7 Irreversible Transform.\n"
7501
0
                          "-> Compression parameters set it to reversible.\n"
7502
0
                          "-> Non-IMF codestream will be generated\n");
7503
0
            ret = OPJ_FALSE;
7504
0
        }
7505
0
    } else {
7506
        /* Expect 5-3 transform */
7507
0
        if (parameters->irreversible != 0) {
7508
0
            opj_event_msg(p_manager, EVT_WARNING,
7509
0
                          "IMF 2K/4K/8K profiles require 5-3 reversible Transform.\n"
7510
0
                          "-> Compression parameters set it to irreversible.\n"
7511
0
                          "-> Non-IMF codestream will be generated\n");
7512
0
            ret = OPJ_FALSE;
7513
0
        }
7514
0
    }
7515
7516
    /* Number of layers */
7517
0
    if (parameters->tcp_numlayers != 1) {
7518
0
        opj_event_msg(p_manager, EVT_WARNING,
7519
0
                      "IMF 2K/4K/8K profiles require 1 single quality layer.\n"
7520
0
                      "-> Number of layers is %d.\n"
7521
0
                      "-> Non-IMF codestream will be generated\n",
7522
0
                      parameters->tcp_numlayers);
7523
0
        ret = OPJ_FALSE;
7524
0
    }
7525
7526
    /* Decomposition levels */
7527
0
    switch (profile) {
7528
0
    case OPJ_PROFILE_IMF_2K:
7529
0
        if (!(NL >= 1 && NL <= 5)) {
7530
0
            opj_event_msg(p_manager, EVT_WARNING,
7531
0
                          "IMF 2K profile requires 1 <= NL <= 5:\n"
7532
0
                          "-> Number of decomposition levels is %d.\n"
7533
0
                          "-> Non-IMF codestream will be generated\n",
7534
0
                          NL);
7535
0
            ret = OPJ_FALSE;
7536
0
        }
7537
0
        break;
7538
0
    case OPJ_PROFILE_IMF_4K:
7539
0
        if (!(NL >= 1 && NL <= 6)) {
7540
0
            opj_event_msg(p_manager, EVT_WARNING,
7541
0
                          "IMF 4K profile requires 1 <= NL <= 6:\n"
7542
0
                          "-> Number of decomposition levels is %d.\n"
7543
0
                          "-> Non-IMF codestream will be generated\n",
7544
0
                          NL);
7545
0
            ret = OPJ_FALSE;
7546
0
        }
7547
0
        break;
7548
0
    case OPJ_PROFILE_IMF_8K:
7549
0
        if (!(NL >= 1 && NL <= 7)) {
7550
0
            opj_event_msg(p_manager, EVT_WARNING,
7551
0
                          "IMF 8K profile requires 1 <= NL <= 7:\n"
7552
0
                          "-> Number of decomposition levels is %d.\n"
7553
0
                          "-> Non-IMF codestream will be generated\n",
7554
0
                          NL);
7555
0
            ret = OPJ_FALSE;
7556
0
        }
7557
0
        break;
7558
0
    case OPJ_PROFILE_IMF_2K_R: {
7559
0
        if (XTsiz >= 2048) {
7560
0
            if (!(NL >= 1 && NL <= 5)) {
7561
0
                opj_event_msg(p_manager, EVT_WARNING,
7562
0
                              "IMF 2K_R profile requires 1 <= NL <= 5 for XTsiz >= 2048:\n"
7563
0
                              "-> Number of decomposition levels is %d.\n"
7564
0
                              "-> Non-IMF codestream will be generated\n",
7565
0
                              NL);
7566
0
                ret = OPJ_FALSE;
7567
0
            }
7568
0
        } else if (XTsiz >= 1024) {
7569
0
            if (!(NL >= 1 && NL <= 4)) {
7570
0
                opj_event_msg(p_manager, EVT_WARNING,
7571
0
                              "IMF 2K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7572
0
                              "-> Number of decomposition levels is %d.\n"
7573
0
                              "-> Non-IMF codestream will be generated\n",
7574
0
                              NL);
7575
0
                ret = OPJ_FALSE;
7576
0
            }
7577
0
        }
7578
0
        break;
7579
0
    }
7580
0
    case OPJ_PROFILE_IMF_4K_R: {
7581
0
        if (XTsiz >= 4096) {
7582
0
            if (!(NL >= 1 && NL <= 6)) {
7583
0
                opj_event_msg(p_manager, EVT_WARNING,
7584
0
                              "IMF 4K_R profile requires 1 <= NL <= 6 for XTsiz >= 4096:\n"
7585
0
                              "-> Number of decomposition levels is %d.\n"
7586
0
                              "-> Non-IMF codestream will be generated\n",
7587
0
                              NL);
7588
0
                ret = OPJ_FALSE;
7589
0
            }
7590
0
        } else if (XTsiz >= 2048) {
7591
0
            if (!(NL >= 1 && NL <= 5)) {
7592
0
                opj_event_msg(p_manager, EVT_WARNING,
7593
0
                              "IMF 4K_R profile requires 1 <= NL <= 5 for XTsiz in [2048,4096[:\n"
7594
0
                              "-> Number of decomposition levels is %d.\n"
7595
0
                              "-> Non-IMF codestream will be generated\n",
7596
0
                              NL);
7597
0
                ret = OPJ_FALSE;
7598
0
            }
7599
0
        } else if (XTsiz >= 1024) {
7600
0
            if (!(NL >= 1 && NL <= 4)) {
7601
0
                opj_event_msg(p_manager, EVT_WARNING,
7602
0
                              "IMF 4K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7603
0
                              "-> Number of decomposition levels is %d.\n"
7604
0
                              "-> Non-IMF codestream will be generated\n",
7605
0
                              NL);
7606
0
                ret = OPJ_FALSE;
7607
0
            }
7608
0
        }
7609
0
        break;
7610
0
    }
7611
0
    case OPJ_PROFILE_IMF_8K_R: {
7612
0
        if (XTsiz >= 8192) {
7613
0
            if (!(NL >= 1 && NL <= 7)) {
7614
0
                opj_event_msg(p_manager, EVT_WARNING,
7615
0
                              "IMF 4K_R profile requires 1 <= NL <= 7 for XTsiz >= 8192:\n"
7616
0
                              "-> Number of decomposition levels is %d.\n"
7617
0
                              "-> Non-IMF codestream will be generated\n",
7618
0
                              NL);
7619
0
                ret = OPJ_FALSE;
7620
0
            }
7621
0
        } else if (XTsiz >= 4096) {
7622
0
            if (!(NL >= 1 && NL <= 6)) {
7623
0
                opj_event_msg(p_manager, EVT_WARNING,
7624
0
                              "IMF 4K_R profile requires 1 <= NL <= 6 for XTsiz in [4096,8192[:\n"
7625
0
                              "-> Number of decomposition levels is %d.\n"
7626
0
                              "-> Non-IMF codestream will be generated\n",
7627
0
                              NL);
7628
0
                ret = OPJ_FALSE;
7629
0
            }
7630
0
        } else if (XTsiz >= 2048) {
7631
0
            if (!(NL >= 1 && NL <= 5)) {
7632
0
                opj_event_msg(p_manager, EVT_WARNING,
7633
0
                              "IMF 4K_R profile requires 1 <= NL <= 5 for XTsiz in [2048,4096[:\n"
7634
0
                              "-> Number of decomposition levels is %d.\n"
7635
0
                              "-> Non-IMF codestream will be generated\n",
7636
0
                              NL);
7637
0
                ret = OPJ_FALSE;
7638
0
            }
7639
0
        } else if (XTsiz >= 1024) {
7640
0
            if (!(NL >= 1 && NL <= 4)) {
7641
0
                opj_event_msg(p_manager, EVT_WARNING,
7642
0
                              "IMF 4K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7643
0
                              "-> Number of decomposition levels is %d.\n"
7644
0
                              "-> Non-IMF codestream will be generated\n",
7645
0
                              NL);
7646
0
                ret = OPJ_FALSE;
7647
0
            }
7648
0
        }
7649
0
        break;
7650
0
    }
7651
0
    default:
7652
0
        break;
7653
0
    }
7654
7655
0
    if (parameters->numresolution == 1) {
7656
0
        if (parameters->res_spec != 1 ||
7657
0
                parameters->prcw_init[0] != 128 ||
7658
0
                parameters->prch_init[0] != 128) {
7659
0
            opj_event_msg(p_manager, EVT_WARNING,
7660
0
                          "IMF profiles require PPx = PPy = 7 for NLLL band, else 8.\n"
7661
0
                          "-> Supplied values are different from that.\n"
7662
0
                          "-> Non-IMF codestream will be generated\n");
7663
0
            ret = OPJ_FALSE;
7664
0
        }
7665
0
    } else {
7666
0
        int i;
7667
0
        for (i = 0; i < parameters->res_spec; i++) {
7668
0
            if (parameters->prcw_init[i] != 256 ||
7669
0
                    parameters->prch_init[i] != 256) {
7670
0
                opj_event_msg(p_manager, EVT_WARNING,
7671
0
                              "IMF profiles require PPx = PPy = 7 for NLLL band, else 8.\n"
7672
0
                              "-> Supplied values are different from that.\n"
7673
0
                              "-> Non-IMF codestream will be generated\n");
7674
0
                ret = OPJ_FALSE;
7675
0
            }
7676
0
        }
7677
0
    }
7678
7679
0
    return ret;
7680
0
}
7681
7682
7683
OPJ_BOOL opj_j2k_setup_encoder(opj_j2k_t *p_j2k,
7684
                               opj_cparameters_t *parameters,
7685
                               opj_image_t *image,
7686
                               opj_event_mgr_t * p_manager)
7687
258
{
7688
258
    OPJ_UINT32 i, j, tileno, numpocs_tile;
7689
258
    opj_cp_t *cp = 00;
7690
258
    OPJ_UINT32 cblkw, cblkh;
7691
7692
258
    if (!p_j2k || !parameters || ! image) {
7693
0
        return OPJ_FALSE;
7694
0
    }
7695
7696
258
    if ((parameters->numresolution <= 0) ||
7697
258
            (parameters->numresolution > OPJ_J2K_MAXRLVLS)) {
7698
0
        opj_event_msg(p_manager, EVT_ERROR,
7699
0
                      "Invalid number of resolutions : %d not in range [1,%d]\n",
7700
0
                      parameters->numresolution, OPJ_J2K_MAXRLVLS);
7701
0
        return OPJ_FALSE;
7702
0
    }
7703
7704
258
    if (parameters->cblockw_init < 4 || parameters->cblockw_init > 1024) {
7705
0
        opj_event_msg(p_manager, EVT_ERROR,
7706
0
                      "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7707
0
                      parameters->cblockw_init);
7708
0
        return OPJ_FALSE;
7709
0
    }
7710
258
    if (parameters->cblockh_init < 4 || parameters->cblockh_init > 1024) {
7711
0
        opj_event_msg(p_manager, EVT_ERROR,
7712
0
                      "Invalid value for cblockh_init: %d not a power of 2 not in range [4,1024]\n",
7713
0
                      parameters->cblockh_init);
7714
0
        return OPJ_FALSE;
7715
0
    }
7716
258
    if (parameters->cblockw_init * parameters->cblockh_init > 4096) {
7717
0
        opj_event_msg(p_manager, EVT_ERROR,
7718
0
                      "Invalid value for cblockw_init * cblockh_init: should be <= 4096\n");
7719
0
        return OPJ_FALSE;
7720
0
    }
7721
258
    cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
7722
258
    cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
7723
258
    if (parameters->cblockw_init != (1 << cblkw)) {
7724
0
        opj_event_msg(p_manager, EVT_ERROR,
7725
0
                      "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7726
0
                      parameters->cblockw_init);
7727
0
        return OPJ_FALSE;
7728
0
    }
7729
258
    if (parameters->cblockh_init != (1 << cblkh)) {
7730
0
        opj_event_msg(p_manager, EVT_ERROR,
7731
0
                      "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7732
0
                      parameters->cblockh_init);
7733
0
        return OPJ_FALSE;
7734
0
    }
7735
7736
258
    if (parameters->cp_fixed_alloc) {
7737
0
        if (parameters->cp_matrice == NULL) {
7738
0
            opj_event_msg(p_manager, EVT_ERROR,
7739
0
                          "cp_fixed_alloc set, but cp_matrice missing\n");
7740
0
            return OPJ_FALSE;
7741
0
        }
7742
7743
0
        if (parameters->tcp_numlayers > J2K_TCD_MATRIX_MAX_LAYER_COUNT) {
7744
0
            opj_event_msg(p_manager, EVT_ERROR,
7745
0
                          "tcp_numlayers when cp_fixed_alloc set should not exceed %d\n",
7746
0
                          J2K_TCD_MATRIX_MAX_LAYER_COUNT);
7747
0
            return OPJ_FALSE;
7748
0
        }
7749
0
        if (parameters->numresolution > J2K_TCD_MATRIX_MAX_RESOLUTION_COUNT) {
7750
0
            opj_event_msg(p_manager, EVT_ERROR,
7751
0
                          "numresolution when cp_fixed_alloc set should not exceed %d\n",
7752
0
                          J2K_TCD_MATRIX_MAX_RESOLUTION_COUNT);
7753
0
            return OPJ_FALSE;
7754
0
        }
7755
0
    }
7756
7757
258
    p_j2k->m_specific_param.m_encoder.m_nb_comps = image->numcomps;
7758
7759
    /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
7760
258
    cp = &(p_j2k->m_cp);
7761
7762
    /* set default values for cp */
7763
258
    cp->tw = 1;
7764
258
    cp->th = 1;
7765
7766
    /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */
7767
258
    if (parameters->rsiz ==
7768
258
            OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */
7769
258
        OPJ_BOOL deprecated_used = OPJ_FALSE;
7770
258
        switch (parameters->cp_cinema) {
7771
0
        case OPJ_CINEMA2K_24:
7772
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7773
0
            parameters->max_cs_size = OPJ_CINEMA_24_CS;
7774
0
            parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7775
0
            deprecated_used = OPJ_TRUE;
7776
0
            break;
7777
0
        case OPJ_CINEMA2K_48:
7778
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7779
0
            parameters->max_cs_size = OPJ_CINEMA_48_CS;
7780
0
            parameters->max_comp_size = OPJ_CINEMA_48_COMP;
7781
0
            deprecated_used = OPJ_TRUE;
7782
0
            break;
7783
0
        case OPJ_CINEMA4K_24:
7784
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
7785
0
            parameters->max_cs_size = OPJ_CINEMA_24_CS;
7786
0
            parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7787
0
            deprecated_used = OPJ_TRUE;
7788
0
            break;
7789
258
        case OPJ_OFF:
7790
258
        default:
7791
258
            break;
7792
258
        }
7793
258
        switch (parameters->cp_rsiz) {
7794
0
        case OPJ_CINEMA2K:
7795
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7796
0
            deprecated_used = OPJ_TRUE;
7797
0
            break;
7798
0
        case OPJ_CINEMA4K:
7799
0
            parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
7800
0
            deprecated_used = OPJ_TRUE;
7801
0
            break;
7802
0
        case OPJ_MCT:
7803
0
            parameters->rsiz = OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT;
7804
0
            deprecated_used = OPJ_TRUE;
7805
258
        case OPJ_STD_RSIZ:
7806
258
        default:
7807
258
            break;
7808
258
        }
7809
258
        if (deprecated_used) {
7810
0
            opj_event_msg(p_manager, EVT_WARNING,
7811
0
                          "Deprecated fields cp_cinema or cp_rsiz are used\n"
7812
0
                          "Please consider using only the rsiz field\n"
7813
0
                          "See openjpeg.h documentation for more details\n");
7814
0
        }
7815
258
    }
7816
7817
    /* If no explicit layers are provided, use lossless settings */
7818
258
    if (parameters->tcp_numlayers == 0) {
7819
0
        parameters->tcp_numlayers = 1;
7820
0
        parameters->cp_disto_alloc = 1;
7821
0
        parameters->tcp_rates[0] = 0;
7822
0
    }
7823
7824
258
    if (parameters->cp_disto_alloc) {
7825
        /* Emit warnings if tcp_rates are not decreasing */
7826
258
        for (i = 1; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7827
0
            OPJ_FLOAT32 rate_i_corr = parameters->tcp_rates[i];
7828
0
            OPJ_FLOAT32 rate_i_m_1_corr = parameters->tcp_rates[i - 1];
7829
0
            if (rate_i_corr <= 1.0) {
7830
0
                rate_i_corr = 1.0;
7831
0
            }
7832
0
            if (rate_i_m_1_corr <= 1.0) {
7833
0
                rate_i_m_1_corr = 1.0;
7834
0
            }
7835
0
            if (rate_i_corr >= rate_i_m_1_corr) {
7836
0
                if (rate_i_corr != parameters->tcp_rates[i] &&
7837
0
                        rate_i_m_1_corr != parameters->tcp_rates[i - 1]) {
7838
0
                    opj_event_msg(p_manager, EVT_WARNING,
7839
0
                                  "tcp_rates[%d]=%f (corrected as %f) should be strictly lesser "
7840
0
                                  "than tcp_rates[%d]=%f (corrected as %f)\n",
7841
0
                                  i, parameters->tcp_rates[i], rate_i_corr,
7842
0
                                  i - 1, parameters->tcp_rates[i - 1], rate_i_m_1_corr);
7843
0
                } else if (rate_i_corr != parameters->tcp_rates[i]) {
7844
0
                    opj_event_msg(p_manager, EVT_WARNING,
7845
0
                                  "tcp_rates[%d]=%f (corrected as %f) should be strictly lesser "
7846
0
                                  "than tcp_rates[%d]=%f\n",
7847
0
                                  i, parameters->tcp_rates[i], rate_i_corr,
7848
0
                                  i - 1, parameters->tcp_rates[i - 1]);
7849
0
                } else if (rate_i_m_1_corr != parameters->tcp_rates[i - 1]) {
7850
0
                    opj_event_msg(p_manager, EVT_WARNING,
7851
0
                                  "tcp_rates[%d]=%f should be strictly lesser "
7852
0
                                  "than tcp_rates[%d]=%f (corrected as %f)\n",
7853
0
                                  i, parameters->tcp_rates[i],
7854
0
                                  i - 1, parameters->tcp_rates[i - 1], rate_i_m_1_corr);
7855
0
                } else {
7856
0
                    opj_event_msg(p_manager, EVT_WARNING,
7857
0
                                  "tcp_rates[%d]=%f should be strictly lesser "
7858
0
                                  "than tcp_rates[%d]=%f\n",
7859
0
                                  i, parameters->tcp_rates[i],
7860
0
                                  i - 1, parameters->tcp_rates[i - 1]);
7861
0
                }
7862
0
            }
7863
0
        }
7864
258
    } else if (parameters->cp_fixed_quality) {
7865
        /* Emit warnings if tcp_distoratio are not increasing */
7866
0
        for (i = 1; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7867
0
            if (parameters->tcp_distoratio[i] < parameters->tcp_distoratio[i - 1] &&
7868
0
                    !(i == (OPJ_UINT32)parameters->tcp_numlayers - 1 &&
7869
0
                      parameters->tcp_distoratio[i] == 0)) {
7870
0
                opj_event_msg(p_manager, EVT_WARNING,
7871
0
                              "tcp_distoratio[%d]=%f should be strictly greater "
7872
0
                              "than tcp_distoratio[%d]=%f\n",
7873
0
                              i, parameters->tcp_distoratio[i], i - 1,
7874
0
                              parameters->tcp_distoratio[i - 1]);
7875
0
            }
7876
0
        }
7877
0
    }
7878
7879
    /* see if max_codestream_size does limit input rate */
7880
258
    if (parameters->max_cs_size <= 0) {
7881
258
        if (parameters->tcp_rates[parameters->tcp_numlayers - 1] > 0) {
7882
157
            OPJ_FLOAT32 temp_size;
7883
157
            temp_size = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
7884
157
                                       image->comps[0].h * image->comps[0].prec) /
7885
157
                                      ((double)parameters->tcp_rates[parameters->tcp_numlayers - 1] * 8 *
7886
157
                                       image->comps[0].dx * image->comps[0].dy));
7887
157
            if (temp_size > (OPJ_FLOAT32)INT_MAX) {
7888
0
                parameters->max_cs_size = INT_MAX;
7889
157
            } else {
7890
157
                parameters->max_cs_size = (int) floor(temp_size);
7891
157
            }
7892
157
        } else {
7893
101
            parameters->max_cs_size = 0;
7894
101
        }
7895
258
    } else {
7896
0
        OPJ_FLOAT32 temp_rate;
7897
0
        OPJ_BOOL cap = OPJ_FALSE;
7898
7899
0
        if (OPJ_IS_IMF(parameters->rsiz) && parameters->max_cs_size > 0 &&
7900
0
                parameters->tcp_numlayers == 1 && parameters->tcp_rates[0] == 0) {
7901
0
            parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
7902
0
                                       image->comps[0].h * image->comps[0].prec) /
7903
0
                                       (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
7904
0
                                               image->comps[0].dy);
7905
0
        }
7906
7907
0
        temp_rate = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
7908
0
                                   image->comps[0].h * image->comps[0].prec) /
7909
0
                                  (((double)parameters->max_cs_size) * 8 * image->comps[0].dx *
7910
0
                                   image->comps[0].dy));
7911
0
        for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7912
0
            if (parameters->tcp_rates[i] < temp_rate) {
7913
0
                parameters->tcp_rates[i] = temp_rate;
7914
0
                cap = OPJ_TRUE;
7915
0
            }
7916
0
        }
7917
0
        if (cap) {
7918
0
            opj_event_msg(p_manager, EVT_WARNING,
7919
0
                          "The desired maximum codestream size has limited\n"
7920
0
                          "at least one of the desired quality layers\n");
7921
0
        }
7922
0
    }
7923
7924
258
    if (OPJ_IS_CINEMA(parameters->rsiz) || OPJ_IS_IMF(parameters->rsiz)) {
7925
0
        p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_TRUE;
7926
0
    }
7927
7928
    /* Manage profiles and applications and set RSIZ */
7929
    /* set cinema parameters if required */
7930
258
    if (OPJ_IS_CINEMA(parameters->rsiz)) {
7931
0
        if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K)
7932
0
                || (parameters->rsiz == OPJ_PROFILE_CINEMA_S4K)) {
7933
0
            opj_event_msg(p_manager, EVT_WARNING,
7934
0
                          "JPEG 2000 Scalable Digital Cinema profiles not yet supported\n");
7935
0
            parameters->rsiz = OPJ_PROFILE_NONE;
7936
0
        } else {
7937
0
            opj_j2k_set_cinema_parameters(parameters, image, p_manager);
7938
0
            if (!opj_j2k_is_cinema_compliant(image, parameters->rsiz, p_manager)) {
7939
0
                parameters->rsiz = OPJ_PROFILE_NONE;
7940
0
            }
7941
0
        }
7942
258
    } else if (OPJ_IS_STORAGE(parameters->rsiz)) {
7943
0
        opj_event_msg(p_manager, EVT_WARNING,
7944
0
                      "JPEG 2000 Long Term Storage profile not yet supported\n");
7945
0
        parameters->rsiz = OPJ_PROFILE_NONE;
7946
258
    } else if (OPJ_IS_BROADCAST(parameters->rsiz)) {
7947
0
        opj_event_msg(p_manager, EVT_WARNING,
7948
0
                      "JPEG 2000 Broadcast profiles not yet supported\n");
7949
0
        parameters->rsiz = OPJ_PROFILE_NONE;
7950
258
    } else if (OPJ_IS_IMF(parameters->rsiz)) {
7951
0
        opj_j2k_set_imf_parameters(parameters, image, p_manager);
7952
0
        if (!opj_j2k_is_imf_compliant(parameters, image, p_manager)) {
7953
0
            parameters->rsiz = OPJ_PROFILE_NONE;
7954
0
        }
7955
258
    } else if (OPJ_IS_PART2(parameters->rsiz)) {
7956
0
        if (parameters->rsiz == ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_NONE))) {
7957
0
            opj_event_msg(p_manager, EVT_WARNING,
7958
0
                          "JPEG 2000 Part-2 profile defined\n"
7959
0
                          "but no Part-2 extension enabled.\n"
7960
0
                          "Profile set to NONE.\n");
7961
0
            parameters->rsiz = OPJ_PROFILE_NONE;
7962
0
        } else if (parameters->rsiz != ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT))) {
7963
0
            opj_event_msg(p_manager, EVT_WARNING,
7964
0
                          "Unsupported Part-2 extension enabled\n"
7965
0
                          "Profile set to NONE.\n");
7966
0
            parameters->rsiz = OPJ_PROFILE_NONE;
7967
0
        }
7968
0
    }
7969
7970
    /*
7971
    copy user encoding parameters
7972
    */
7973
258
    cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)
7974
258
            parameters->max_comp_size;
7975
258
    cp->rsiz = parameters->rsiz;
7976
258
    if (parameters->cp_fixed_alloc) {
7977
0
        cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy = FIXED_LAYER;
7978
258
    } else if (parameters->cp_fixed_quality) {
7979
0
        cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy =
7980
0
            FIXED_DISTORTION_RATIO;
7981
258
    } else {
7982
258
        cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy =
7983
258
            RATE_DISTORTION_RATIO;
7984
258
    }
7985
7986
258
    if (parameters->cp_fixed_alloc) {
7987
0
        size_t array_size = (size_t)parameters->tcp_numlayers *
7988
0
                            (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
7989
0
        cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
7990
0
        if (!cp->m_specific_param.m_enc.m_matrice) {
7991
0
            opj_event_msg(p_manager, EVT_ERROR,
7992
0
                          "Not enough memory to allocate copy of user encoding parameters matrix \n");
7993
0
            return OPJ_FALSE;
7994
0
        }
7995
0
        memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice,
7996
0
               array_size);
7997
0
    }
7998
7999
    /* tiles */
8000
258
    cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
8001
258
    cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
8002
8003
    /* tile offset */
8004
258
    cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
8005
258
    cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
8006
8007
    /* comment string */
8008
258
    if (parameters->cp_comment) {
8009
0
        cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1U);
8010
0
        if (!cp->comment) {
8011
0
            opj_event_msg(p_manager, EVT_ERROR,
8012
0
                          "Not enough memory to allocate copy of comment string\n");
8013
0
            return OPJ_FALSE;
8014
0
        }
8015
0
        strcpy(cp->comment, parameters->cp_comment);
8016
258
    } else {
8017
        /* Create default comment for codestream */
8018
258
        const char comment[] = "Created by OpenJPEG version ";
8019
258
        const size_t clen = strlen(comment);
8020
258
        const char *version = opj_version();
8021
8022
        /* UniPG>> */
8023
#ifdef USE_JPWL
8024
        const size_t cp_comment_buf_size = clen + strlen(version) + 11;
8025
        cp->comment = (char*)opj_malloc(cp_comment_buf_size);
8026
        if (!cp->comment) {
8027
            opj_event_msg(p_manager, EVT_ERROR,
8028
                          "Not enough memory to allocate comment string\n");
8029
            return OPJ_FALSE;
8030
        }
8031
        snprintf(cp->comment, cp_comment_buf_size, "%s%s with JPWL",
8032
                 comment, version);
8033
#else
8034
258
        const size_t cp_comment_buf_size = clen + strlen(version) + 1;
8035
258
        cp->comment = (char*)opj_malloc(cp_comment_buf_size);
8036
258
        if (!cp->comment) {
8037
0
            opj_event_msg(p_manager, EVT_ERROR,
8038
0
                          "Not enough memory to allocate comment string\n");
8039
0
            return OPJ_FALSE;
8040
0
        }
8041
258
        snprintf(cp->comment, cp_comment_buf_size, "%s%s", comment, version);
8042
258
#endif
8043
        /* <<UniPG */
8044
258
    }
8045
8046
    /*
8047
    calculate other encoding parameters
8048
    */
8049
8050
258
    if (parameters->tile_size_on) {
8051
0
        if (cp->tdx == 0) {
8052
0
            opj_event_msg(p_manager, EVT_ERROR, "Invalid tile width\n");
8053
0
            return OPJ_FALSE;
8054
0
        }
8055
0
        if (cp->tdy == 0) {
8056
0
            opj_event_msg(p_manager, EVT_ERROR, "Invalid tile height\n");
8057
0
            return OPJ_FALSE;
8058
0
        }
8059
0
        cp->tw = opj_uint_ceildiv(image->x1 - cp->tx0, cp->tdx);
8060
0
        cp->th = opj_uint_ceildiv(image->y1 - cp->ty0, cp->tdy);
8061
        /* Check that the number of tiles is valid */
8062
0
        if (cp->tw > 65535 / cp->th) {
8063
0
            opj_event_msg(p_manager, EVT_ERROR,
8064
0
                          "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
8065
0
                          cp->tw, cp->th);
8066
0
            return OPJ_FALSE;
8067
0
        }
8068
258
    } else {
8069
258
        cp->tdx = image->x1 - cp->tx0;
8070
258
        cp->tdy = image->y1 - cp->ty0;
8071
258
    }
8072
8073
258
    if (parameters->tp_on) {
8074
0
        cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
8075
0
        cp->m_specific_param.m_enc.m_tp_on = 1;
8076
0
    }
8077
8078
#ifdef USE_JPWL
8079
    /*
8080
    calculate JPWL encoding parameters
8081
    */
8082
8083
    if (parameters->jpwl_epc_on) {
8084
        OPJ_INT32 i;
8085
8086
        /* set JPWL on */
8087
        cp->epc_on = OPJ_TRUE;
8088
        cp->info_on = OPJ_FALSE; /* no informative technique */
8089
8090
        /* set EPB on */
8091
        if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
8092
            cp->epb_on = OPJ_TRUE;
8093
8094
            cp->hprot_MH = parameters->jpwl_hprot_MH;
8095
            for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
8096
                cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
8097
                cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
8098
            }
8099
            /* if tile specs are not specified, copy MH specs */
8100
            if (cp->hprot_TPH[0] == -1) {
8101
                cp->hprot_TPH_tileno[0] = 0;
8102
                cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
8103
            }
8104
            for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
8105
                cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
8106
                cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
8107
                cp->pprot[i] = parameters->jpwl_pprot[i];
8108
            }
8109
        }
8110
8111
        /* set ESD writing */
8112
        if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
8113
            cp->esd_on = OPJ_TRUE;
8114
8115
            cp->sens_size = parameters->jpwl_sens_size;
8116
            cp->sens_addr = parameters->jpwl_sens_addr;
8117
            cp->sens_range = parameters->jpwl_sens_range;
8118
8119
            cp->sens_MH = parameters->jpwl_sens_MH;
8120
            for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
8121
                cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
8122
                cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
8123
            }
8124
        }
8125
8126
        /* always set RED writing to false: we are at the encoder */
8127
        cp->red_on = OPJ_FALSE;
8128
8129
    } else {
8130
        cp->epc_on = OPJ_FALSE;
8131
    }
8132
#endif /* USE_JPWL */
8133
8134
    /* initialize the multiple tiles */
8135
    /* ---------------------------- */
8136
258
    cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
8137
258
    if (!cp->tcps) {
8138
0
        opj_event_msg(p_manager, EVT_ERROR,
8139
0
                      "Not enough memory to allocate tile coding parameters\n");
8140
0
        return OPJ_FALSE;
8141
0
    }
8142
8143
516
    for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
8144
258
        opj_tcp_t *tcp = &cp->tcps[tileno];
8145
258
        const OPJ_BOOL fixed_distoratio =
8146
258
            cp->m_specific_param.m_enc.m_quality_layer_alloc_strategy ==
8147
258
            FIXED_DISTORTION_RATIO;
8148
258
        tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
8149
8150
516
        for (j = 0; j < tcp->numlayers; j++) {
8151
258
            if (OPJ_IS_CINEMA(cp->rsiz) || OPJ_IS_IMF(cp->rsiz)) {
8152
0
                if (fixed_distoratio) {
8153
0
                    tcp->distoratio[j] = parameters->tcp_distoratio[j];
8154
0
                }
8155
0
                tcp->rates[j] = parameters->tcp_rates[j];
8156
258
            } else {
8157
258
                if (fixed_distoratio) {
8158
0
                    tcp->distoratio[j] = parameters->tcp_distoratio[j];
8159
258
                } else {
8160
258
                    tcp->rates[j] = parameters->tcp_rates[j];
8161
258
                }
8162
258
            }
8163
258
            if (!fixed_distoratio &&
8164
258
                    tcp->rates[j] <= 1.0) {
8165
113
                tcp->rates[j] = 0.0;    /* force lossless */
8166
113
            }
8167
258
        }
8168
8169
258
        tcp->csty = (OPJ_UINT32)parameters->csty;
8170
258
        tcp->prg = parameters->prog_order;
8171
258
        tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
8172
8173
258
        numpocs_tile = 0;
8174
258
        tcp->POC = 0;
8175
8176
258
        if (parameters->numpocs) {
8177
            /* initialisation of POC */
8178
0
            for (i = 0; i < parameters->numpocs; i++) {
8179
0
                if (tileno + 1 == parameters->POC[i].tile)  {
8180
0
                    opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
8181
8182
0
                    if (parameters->POC[numpocs_tile].compno0 >= image->numcomps) {
8183
0
                        opj_event_msg(p_manager, EVT_ERROR,
8184
0
                                      "Invalid compno0 for POC %d\n", i);
8185
0
                        return OPJ_FALSE;
8186
0
                    }
8187
8188
0
                    tcp_poc->resno0         = parameters->POC[numpocs_tile].resno0;
8189
0
                    tcp_poc->compno0        = parameters->POC[numpocs_tile].compno0;
8190
0
                    tcp_poc->layno1         = parameters->POC[numpocs_tile].layno1;
8191
0
                    tcp_poc->resno1         = parameters->POC[numpocs_tile].resno1;
8192
0
                    tcp_poc->compno1        = opj_uint_min(parameters->POC[numpocs_tile].compno1,
8193
0
                                                           image->numcomps);
8194
0
                    tcp_poc->prg1           = parameters->POC[numpocs_tile].prg1;
8195
0
                    tcp_poc->tile           = parameters->POC[numpocs_tile].tile;
8196
8197
0
                    numpocs_tile++;
8198
0
                }
8199
0
            }
8200
8201
0
            if (numpocs_tile) {
8202
8203
                /* TODO MSD use the return value*/
8204
0
                opj_j2k_check_poc_val(parameters->POC, tileno, parameters->numpocs,
8205
0
                                      (OPJ_UINT32)parameters->numresolution, image->numcomps,
8206
0
                                      (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
8207
8208
0
                tcp->POC = 1;
8209
0
                tcp->numpocs = numpocs_tile - 1 ;
8210
0
            }
8211
258
        } else {
8212
258
            tcp->numpocs = 0;
8213
258
        }
8214
8215
258
        tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
8216
258
        if (!tcp->tccps) {
8217
0
            opj_event_msg(p_manager, EVT_ERROR,
8218
0
                          "Not enough memory to allocate tile component coding parameters\n");
8219
0
            return OPJ_FALSE;
8220
0
        }
8221
258
        if (parameters->mct_data) {
8222
8223
0
            OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(
8224
0
                                      OPJ_FLOAT32);
8225
0
            OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8226
0
            OPJ_INT32 * l_dc_shift = (OPJ_INT32 *)((OPJ_BYTE *) parameters->mct_data +
8227
0
                                                   lMctSize);
8228
8229
0
            if (!lTmpBuf) {
8230
0
                opj_event_msg(p_manager, EVT_ERROR,
8231
0
                              "Not enough memory to allocate temp buffer\n");
8232
0
                return OPJ_FALSE;
8233
0
            }
8234
8235
0
            tcp->mct = 2;
8236
0
            tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8237
0
            if (! tcp->m_mct_coding_matrix) {
8238
0
                opj_free(lTmpBuf);
8239
0
                lTmpBuf = NULL;
8240
0
                opj_event_msg(p_manager, EVT_ERROR,
8241
0
                              "Not enough memory to allocate encoder MCT coding matrix \n");
8242
0
                return OPJ_FALSE;
8243
0
            }
8244
0
            memcpy(tcp->m_mct_coding_matrix, parameters->mct_data, lMctSize);
8245
0
            memcpy(lTmpBuf, parameters->mct_data, lMctSize);
8246
8247
0
            tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8248
0
            if (! tcp->m_mct_decoding_matrix) {
8249
0
                opj_free(lTmpBuf);
8250
0
                lTmpBuf = NULL;
8251
0
                opj_event_msg(p_manager, EVT_ERROR,
8252
0
                              "Not enough memory to allocate encoder MCT decoding matrix \n");
8253
0
                return OPJ_FALSE;
8254
0
            }
8255
0
            if (opj_matrix_inversion_f(lTmpBuf, (tcp->m_mct_decoding_matrix),
8256
0
                                       image->numcomps) == OPJ_FALSE) {
8257
0
                opj_free(lTmpBuf);
8258
0
                lTmpBuf = NULL;
8259
0
                opj_event_msg(p_manager, EVT_ERROR,
8260
0
                              "Failed to inverse encoder MCT decoding matrix \n");
8261
0
                return OPJ_FALSE;
8262
0
            }
8263
8264
0
            tcp->mct_norms = (OPJ_FLOAT64*)
8265
0
                             opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
8266
0
            if (! tcp->mct_norms) {
8267
0
                opj_free(lTmpBuf);
8268
0
                lTmpBuf = NULL;
8269
0
                opj_event_msg(p_manager, EVT_ERROR,
8270
0
                              "Not enough memory to allocate encoder MCT norms \n");
8271
0
                return OPJ_FALSE;
8272
0
            }
8273
0
            opj_calculate_norms(tcp->mct_norms, image->numcomps,
8274
0
                                tcp->m_mct_decoding_matrix);
8275
0
            opj_free(lTmpBuf);
8276
8277
0
            for (i = 0; i < image->numcomps; i++) {
8278
0
                opj_tccp_t *tccp = &tcp->tccps[i];
8279
0
                tccp->m_dc_level_shift = l_dc_shift[i];
8280
0
            }
8281
8282
0
            if (opj_j2k_setup_mct_encoding(tcp, image) == OPJ_FALSE) {
8283
                /* free will be handled by opj_j2k_destroy */
8284
0
                opj_event_msg(p_manager, EVT_ERROR, "Failed to setup j2k mct encoding\n");
8285
0
                return OPJ_FALSE;
8286
0
            }
8287
258
        } else {
8288
258
            if (tcp->mct == 1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
8289
0
                if ((image->comps[0].dx != image->comps[1].dx) ||
8290
0
                        (image->comps[0].dx != image->comps[2].dx) ||
8291
0
                        (image->comps[0].dy != image->comps[1].dy) ||
8292
0
                        (image->comps[0].dy != image->comps[2].dy)) {
8293
0
                    opj_event_msg(p_manager, EVT_WARNING,
8294
0
                                  "Cannot perform MCT on components with different sizes. Disabling MCT.\n");
8295
0
                    tcp->mct = 0;
8296
0
                }
8297
0
            }
8298
1.03k
            for (i = 0; i < image->numcomps; i++) {
8299
774
                opj_tccp_t *tccp = &tcp->tccps[i];
8300
774
                opj_image_comp_t * l_comp = &(image->comps[i]);
8301
8302
774
                if (! l_comp->sgnd) {
8303
774
                    tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
8304
774
                }
8305
774
            }
8306
258
        }
8307
8308
1.03k
        for (i = 0; i < image->numcomps; i++) {
8309
774
            opj_tccp_t *tccp = &tcp->tccps[i];
8310
8311
774
            tccp->csty = parameters->csty &
8312
774
                         0x01;   /* 0 => one precinct || 1 => custom precinct  */
8313
774
            tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
8314
774
            tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
8315
774
            tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
8316
774
            tccp->cblksty = (OPJ_UINT32)parameters->mode;
8317
774
            tccp->qmfbid = parameters->irreversible ? 0 : 1;
8318
774
            tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT :
8319
774
                           J2K_CCP_QNTSTY_NOQNT;
8320
8321
774
            if (OPJ_IS_CINEMA(parameters->rsiz) &&
8322
0
                    parameters->rsiz == OPJ_PROFILE_CINEMA_2K) {
8323
                /* From https://github.com/uclouvain/openjpeg/issues/1340 */
8324
0
                tccp->numgbits = 1;
8325
774
            } else {
8326
774
                tccp->numgbits = 2;
8327
774
            }
8328
8329
774
            if ((OPJ_INT32)i == parameters->roi_compno) {
8330
0
                tccp->roishift = parameters->roi_shift;
8331
774
            } else {
8332
774
                tccp->roishift = 0;
8333
774
            }
8334
8335
774
            if (parameters->csty & J2K_CCP_CSTY_PRT) {
8336
0
                OPJ_INT32 p = 0, it_res;
8337
0
                assert(tccp->numresolutions > 0);
8338
0
                for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
8339
0
                    if (p < parameters->res_spec) {
8340
8341
0
                        if (parameters->prcw_init[p] < 1) {
8342
0
                            tccp->prcw[it_res] = 1;
8343
0
                        } else {
8344
0
                            tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
8345
0
                        }
8346
8347
0
                        if (parameters->prch_init[p] < 1) {
8348
0
                            tccp->prch[it_res] = 1;
8349
0
                        } else {
8350
0
                            tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
8351
0
                        }
8352
8353
0
                    } else {
8354
0
                        OPJ_INT32 res_spec = parameters->res_spec;
8355
0
                        OPJ_INT32 size_prcw = 0;
8356
0
                        OPJ_INT32 size_prch = 0;
8357
8358
0
                        assert(res_spec > 0); /* issue 189 */
8359
0
                        size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
8360
0
                        size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
8361
8362
8363
0
                        if (size_prcw < 1) {
8364
0
                            tccp->prcw[it_res] = 1;
8365
0
                        } else {
8366
0
                            tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
8367
0
                        }
8368
8369
0
                        if (size_prch < 1) {
8370
0
                            tccp->prch[it_res] = 1;
8371
0
                        } else {
8372
0
                            tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
8373
0
                        }
8374
0
                    }
8375
0
                    p++;
8376
                    /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
8377
0
                }       /*end for*/
8378
774
            } else {
8379
5.41k
                for (j = 0; j < tccp->numresolutions; j++) {
8380
4.64k
                    tccp->prcw[j] = 15;
8381
4.64k
                    tccp->prch[j] = 15;
8382
4.64k
                }
8383
774
            }
8384
8385
774
            opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
8386
774
        }
8387
258
    }
8388
8389
258
    if (parameters->mct_data) {
8390
0
        opj_free(parameters->mct_data);
8391
0
        parameters->mct_data = 00;
8392
0
    }
8393
258
    return OPJ_TRUE;
8394
258
}
8395
8396
static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
8397
                                     OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
8398
0
{
8399
0
    assert(cstr_index != 00);
8400
8401
    /* expand the list? */
8402
0
    if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
8403
0
        opj_marker_info_t *new_marker;
8404
0
        cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32)
8405
0
                                              cstr_index->maxmarknum);
8406
0
        new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker,
8407
0
                     cstr_index->maxmarknum * sizeof(opj_marker_info_t));
8408
0
        if (! new_marker) {
8409
0
            opj_free(cstr_index->marker);
8410
0
            cstr_index->marker = NULL;
8411
0
            cstr_index->maxmarknum = 0;
8412
0
            cstr_index->marknum = 0;
8413
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
8414
0
            return OPJ_FALSE;
8415
0
        }
8416
0
        cstr_index->marker = new_marker;
8417
0
    }
8418
8419
    /* add the marker */
8420
0
    cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
8421
0
    cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
8422
0
    cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
8423
0
    cstr_index->marknum++;
8424
0
    return OPJ_TRUE;
8425
0
}
8426
8427
static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
8428
                                     opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
8429
                                     OPJ_UINT32 len)
8430
0
{
8431
0
    assert(cstr_index != 00);
8432
0
    assert(cstr_index->tile_index != 00);
8433
8434
    /* expand the list? */
8435
0
    if ((cstr_index->tile_index[tileno].marknum + 1) >
8436
0
            cstr_index->tile_index[tileno].maxmarknum) {
8437
0
        opj_marker_info_t *new_marker;
8438
0
        cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 +
8439
0
                (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
8440
0
        new_marker = (opj_marker_info_t *) opj_realloc(
8441
0
                         cstr_index->tile_index[tileno].marker,
8442
0
                         cstr_index->tile_index[tileno].maxmarknum * sizeof(opj_marker_info_t));
8443
0
        if (! new_marker) {
8444
0
            opj_free(cstr_index->tile_index[tileno].marker);
8445
0
            cstr_index->tile_index[tileno].marker = NULL;
8446
0
            cstr_index->tile_index[tileno].maxmarknum = 0;
8447
0
            cstr_index->tile_index[tileno].marknum = 0;
8448
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
8449
0
            return OPJ_FALSE;
8450
0
        }
8451
0
        cstr_index->tile_index[tileno].marker = new_marker;
8452
0
    }
8453
8454
    /* add the marker */
8455
0
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type
8456
0
        = (OPJ_UINT16)type;
8457
0
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos
8458
0
        = (OPJ_INT32)pos;
8459
0
    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len
8460
0
        = (OPJ_INT32)len;
8461
0
    cstr_index->tile_index[tileno].marknum++;
8462
8463
0
    if (type == J2K_MS_SOT) {
8464
0
        OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
8465
8466
0
        if (cstr_index->tile_index[tileno].tp_index &&
8467
0
                l_current_tile_part < cstr_index->tile_index[tileno].nb_tps) {
8468
0
            cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
8469
0
        }
8470
8471
0
    }
8472
0
    return OPJ_TRUE;
8473
0
}
8474
8475
/*
8476
 * -----------------------------------------------------------------------
8477
 * -----------------------------------------------------------------------
8478
 * -----------------------------------------------------------------------
8479
 */
8480
8481
OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k,
8482
                                opj_stream_private_t *p_stream,
8483
                                opj_event_mgr_t * p_manager
8484
                               )
8485
0
{
8486
0
    (void)p_j2k;
8487
0
    (void)p_stream;
8488
0
    (void)p_manager;
8489
0
    return OPJ_TRUE;
8490
0
}
8491
8492
OPJ_BOOL opj_j2k_read_header(opj_stream_private_t *p_stream,
8493
                             opj_j2k_t* p_j2k,
8494
                             opj_image_t** p_image,
8495
                             opj_event_mgr_t* p_manager)
8496
11
{
8497
    /* preconditions */
8498
11
    assert(p_j2k != 00);
8499
11
    assert(p_stream != 00);
8500
11
    assert(p_manager != 00);
8501
8502
    /* create an empty image header */
8503
11
    p_j2k->m_private_image = opj_image_create0();
8504
11
    if (! p_j2k->m_private_image) {
8505
0
        return OPJ_FALSE;
8506
0
    }
8507
8508
    /* customization of the validation */
8509
11
    if (! opj_j2k_setup_decoding_validation(p_j2k, p_manager)) {
8510
0
        opj_image_destroy(p_j2k->m_private_image);
8511
0
        p_j2k->m_private_image = NULL;
8512
0
        return OPJ_FALSE;
8513
0
    }
8514
8515
    /* validation of the parameters codec */
8516
11
    if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
8517
0
        opj_image_destroy(p_j2k->m_private_image);
8518
0
        p_j2k->m_private_image = NULL;
8519
0
        return OPJ_FALSE;
8520
0
    }
8521
8522
    /* customization of the encoding */
8523
11
    if (! opj_j2k_setup_header_reading(p_j2k, p_manager)) {
8524
0
        opj_image_destroy(p_j2k->m_private_image);
8525
0
        p_j2k->m_private_image = NULL;
8526
0
        return OPJ_FALSE;
8527
0
    }
8528
8529
    /* read header */
8530
11
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
8531
11
        opj_image_destroy(p_j2k->m_private_image);
8532
11
        p_j2k->m_private_image = NULL;
8533
11
        return OPJ_FALSE;
8534
11
    }
8535
8536
0
    *p_image = opj_image_create0();
8537
0
    if (!(*p_image)) {
8538
0
        return OPJ_FALSE;
8539
0
    }
8540
8541
    /* Copy codestream image information to the output image */
8542
0
    opj_copy_image_header(p_j2k->m_private_image, *p_image);
8543
8544
0
    return OPJ_TRUE;
8545
0
}
8546
8547
static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
8548
        opj_event_mgr_t * p_manager)
8549
11
{
8550
    /* preconditions*/
8551
11
    assert(p_j2k != 00);
8552
11
    assert(p_manager != 00);
8553
8554
11
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
8555
11
                                           (opj_procedure)opj_j2k_read_header_procedure, p_manager)) {
8556
0
        return OPJ_FALSE;
8557
0
    }
8558
8559
    /* DEVELOPER CORNER, add your custom procedures */
8560
11
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
8561
11
                                           (opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager))  {
8562
0
        return OPJ_FALSE;
8563
0
    }
8564
8565
11
    return OPJ_TRUE;
8566
11
}
8567
8568
static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
8569
        opj_event_mgr_t * p_manager)
8570
11
{
8571
    /* preconditions*/
8572
11
    assert(p_j2k != 00);
8573
11
    assert(p_manager != 00);
8574
8575
11
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
8576
11
                                           (opj_procedure)opj_j2k_build_decoder, p_manager)) {
8577
0
        return OPJ_FALSE;
8578
0
    }
8579
11
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
8580
11
                                           (opj_procedure)opj_j2k_decoding_validation, p_manager)) {
8581
0
        return OPJ_FALSE;
8582
0
    }
8583
8584
    /* DEVELOPER CORNER, add your custom validation procedure */
8585
11
    return OPJ_TRUE;
8586
11
}
8587
8588
static OPJ_BOOL opj_j2k_mct_validation(opj_j2k_t * p_j2k,
8589
                                       opj_stream_private_t *p_stream,
8590
                                       opj_event_mgr_t * p_manager)
8591
255
{
8592
255
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8593
255
    OPJ_UINT32 i, j;
8594
8595
    /* preconditions */
8596
255
    assert(p_j2k != 00);
8597
255
    assert(p_stream != 00);
8598
255
    assert(p_manager != 00);
8599
8600
255
    OPJ_UNUSED(p_stream);
8601
255
    OPJ_UNUSED(p_manager);
8602
8603
255
    if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
8604
0
        OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
8605
0
        opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
8606
8607
0
        for (i = 0; i < l_nb_tiles; ++i) {
8608
0
            if (l_tcp->mct == 2) {
8609
0
                opj_tccp_t * l_tccp = l_tcp->tccps;
8610
0
                l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
8611
8612
0
                for (j = 0; j < p_j2k->m_private_image->numcomps; ++j) {
8613
0
                    l_is_valid &= !(l_tccp->qmfbid & 1);
8614
0
                    ++l_tccp;
8615
0
                }
8616
0
            }
8617
0
            ++l_tcp;
8618
0
        }
8619
0
    }
8620
8621
255
    return l_is_valid;
8622
255
}
8623
8624
OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)
8625
0
{
8626
0
    OPJ_UINT32 i;
8627
0
    OPJ_UINT32 l_indix = 1;
8628
0
    opj_mct_data_t * l_mct_deco_data = 00, * l_mct_offset_data = 00;
8629
0
    opj_simple_mcc_decorrelation_data_t * l_mcc_data;
8630
0
    OPJ_UINT32 l_mct_size, l_nb_elem;
8631
0
    OPJ_FLOAT32 * l_data, * l_current_data;
8632
0
    opj_tccp_t * l_tccp;
8633
8634
    /* preconditions */
8635
0
    assert(p_tcp != 00);
8636
8637
0
    if (p_tcp->mct != 2) {
8638
0
        return OPJ_TRUE;
8639
0
    }
8640
8641
0
    if (p_tcp->m_mct_decoding_matrix) {
8642
0
        if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
8643
0
            opj_mct_data_t *new_mct_records;
8644
0
            p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8645
8646
0
            new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
8647
0
                              p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
8648
0
            if (! new_mct_records) {
8649
0
                opj_free(p_tcp->m_mct_records);
8650
0
                p_tcp->m_mct_records = NULL;
8651
0
                p_tcp->m_nb_max_mct_records = 0;
8652
0
                p_tcp->m_nb_mct_records = 0;
8653
                /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8654
0
                return OPJ_FALSE;
8655
0
            }
8656
0
            p_tcp->m_mct_records = new_mct_records;
8657
0
            l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8658
8659
0
            memset(l_mct_deco_data, 0,
8660
0
                   (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
8661
0
                       opj_mct_data_t));
8662
0
        }
8663
0
        l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8664
8665
0
        if (l_mct_deco_data->m_data) {
8666
0
            opj_free(l_mct_deco_data->m_data);
8667
0
            l_mct_deco_data->m_data = 00;
8668
0
        }
8669
8670
0
        l_mct_deco_data->m_index = l_indix++;
8671
0
        l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
8672
0
        l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
8673
0
        l_nb_elem = p_image->numcomps * p_image->numcomps;
8674
0
        l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
8675
0
        l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
8676
8677
0
        if (! l_mct_deco_data->m_data) {
8678
0
            return OPJ_FALSE;
8679
0
        }
8680
8681
0
        j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](
8682
0
            p_tcp->m_mct_decoding_matrix, l_mct_deco_data->m_data, l_nb_elem);
8683
8684
0
        l_mct_deco_data->m_data_size = l_mct_size;
8685
0
        ++p_tcp->m_nb_mct_records;
8686
0
    }
8687
8688
0
    if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
8689
0
        opj_mct_data_t *new_mct_records;
8690
0
        p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8691
0
        new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
8692
0
                          p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
8693
0
        if (! new_mct_records) {
8694
0
            opj_free(p_tcp->m_mct_records);
8695
0
            p_tcp->m_mct_records = NULL;
8696
0
            p_tcp->m_nb_max_mct_records = 0;
8697
0
            p_tcp->m_nb_mct_records = 0;
8698
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8699
0
            return OPJ_FALSE;
8700
0
        }
8701
0
        p_tcp->m_mct_records = new_mct_records;
8702
0
        l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8703
8704
0
        memset(l_mct_offset_data, 0,
8705
0
               (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
8706
0
                   opj_mct_data_t));
8707
8708
0
        if (l_mct_deco_data) {
8709
0
            l_mct_deco_data = l_mct_offset_data - 1;
8710
0
        }
8711
0
    }
8712
8713
0
    l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8714
8715
0
    if (l_mct_offset_data->m_data) {
8716
0
        opj_free(l_mct_offset_data->m_data);
8717
0
        l_mct_offset_data->m_data = 00;
8718
0
    }
8719
8720
0
    l_mct_offset_data->m_index = l_indix++;
8721
0
    l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
8722
0
    l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
8723
0
    l_nb_elem = p_image->numcomps;
8724
0
    l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
8725
0
    l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
8726
8727
0
    if (! l_mct_offset_data->m_data) {
8728
0
        return OPJ_FALSE;
8729
0
    }
8730
8731
0
    l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
8732
0
    if (! l_data) {
8733
0
        opj_free(l_mct_offset_data->m_data);
8734
0
        l_mct_offset_data->m_data = 00;
8735
0
        return OPJ_FALSE;
8736
0
    }
8737
8738
0
    l_tccp = p_tcp->tccps;
8739
0
    l_current_data = l_data;
8740
8741
0
    for (i = 0; i < l_nb_elem; ++i) {
8742
0
        *(l_current_data++) = (OPJ_FLOAT32)(l_tccp->m_dc_level_shift);
8743
0
        ++l_tccp;
8744
0
    }
8745
8746
0
    j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,
8747
0
            l_mct_offset_data->m_data, l_nb_elem);
8748
8749
0
    opj_free(l_data);
8750
8751
0
    l_mct_offset_data->m_data_size = l_mct_size;
8752
8753
0
    ++p_tcp->m_nb_mct_records;
8754
8755
0
    if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
8756
0
        opj_simple_mcc_decorrelation_data_t *new_mcc_records;
8757
0
        p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8758
0
        new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
8759
0
                              p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(
8760
0
                                  opj_simple_mcc_decorrelation_data_t));
8761
0
        if (! new_mcc_records) {
8762
0
            opj_free(p_tcp->m_mcc_records);
8763
0
            p_tcp->m_mcc_records = NULL;
8764
0
            p_tcp->m_nb_max_mcc_records = 0;
8765
0
            p_tcp->m_nb_mcc_records = 0;
8766
            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8767
0
            return OPJ_FALSE;
8768
0
        }
8769
0
        p_tcp->m_mcc_records = new_mcc_records;
8770
0
        l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
8771
0
        memset(l_mcc_data, 0, (p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) *
8772
0
               sizeof(opj_simple_mcc_decorrelation_data_t));
8773
8774
0
    }
8775
8776
0
    l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
8777
0
    l_mcc_data->m_decorrelation_array = l_mct_deco_data;
8778
0
    l_mcc_data->m_is_irreversible = 1;
8779
0
    l_mcc_data->m_nb_comps = p_image->numcomps;
8780
0
    l_mcc_data->m_index = l_indix++;
8781
0
    l_mcc_data->m_offset_array = l_mct_offset_data;
8782
0
    ++p_tcp->m_nb_mcc_records;
8783
8784
0
    return OPJ_TRUE;
8785
0
}
8786
8787
static OPJ_BOOL opj_j2k_build_decoder(opj_j2k_t * p_j2k,
8788
                                      opj_stream_private_t *p_stream,
8789
                                      opj_event_mgr_t * p_manager)
8790
11
{
8791
    /* add here initialization of cp
8792
       copy paste of setup_decoder */
8793
11
    (void)p_j2k;
8794
11
    (void)p_stream;
8795
11
    (void)p_manager;
8796
11
    return OPJ_TRUE;
8797
11
}
8798
8799
static OPJ_BOOL opj_j2k_build_encoder(opj_j2k_t * p_j2k,
8800
                                      opj_stream_private_t *p_stream,
8801
                                      opj_event_mgr_t * p_manager)
8802
258
{
8803
    /* add here initialization of cp
8804
       copy paste of setup_encoder */
8805
258
    (void)p_j2k;
8806
258
    (void)p_stream;
8807
258
    (void)p_manager;
8808
258
    return OPJ_TRUE;
8809
258
}
8810
8811
static OPJ_BOOL opj_j2k_encoding_validation(opj_j2k_t * p_j2k,
8812
        opj_stream_private_t *p_stream,
8813
        opj_event_mgr_t * p_manager)
8814
258
{
8815
258
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8816
8817
    /* preconditions */
8818
258
    assert(p_j2k != 00);
8819
258
    assert(p_stream != 00);
8820
258
    assert(p_manager != 00);
8821
8822
258
    OPJ_UNUSED(p_stream);
8823
8824
    /* STATE checking */
8825
    /* make sure the state is at 0 */
8826
258
    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
8827
8828
    /* POINTER validation */
8829
    /* make sure a p_j2k codec is present */
8830
258
    l_is_valid &= (p_j2k->m_procedure_list != 00);
8831
    /* make sure a validation list is present */
8832
258
    l_is_valid &= (p_j2k->m_validation_list != 00);
8833
8834
    /* ISO 15444-1:2004 states between 1 & 33 (0 -> 32) */
8835
    /* 33 (32) would always fail the check below (if a cast to 64bits was done) */
8836
    /* FIXME Shall we change OPJ_J2K_MAXRLVLS to 32 ? */
8837
258
    if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) ||
8838
258
            (p_j2k->m_cp.tcps->tccps->numresolutions > 32)) {
8839
0
        opj_event_msg(p_manager, EVT_ERROR,
8840
0
                      "Number of resolutions is too high in comparison to the size of tiles\n");
8841
0
        return OPJ_FALSE;
8842
0
    }
8843
8844
258
    if ((p_j2k->m_cp.tdx) < (OPJ_UINT32)(1 <<
8845
258
                                         (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
8846
1
        opj_event_msg(p_manager, EVT_ERROR,
8847
1
                      "Number of resolutions is too high in comparison to the size of tiles\n");
8848
1
        return OPJ_FALSE;
8849
1
    }
8850
8851
257
    if ((p_j2k->m_cp.tdy) < (OPJ_UINT32)(1 <<
8852
257
                                         (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
8853
2
        opj_event_msg(p_manager, EVT_ERROR,
8854
2
                      "Number of resolutions is too high in comparison to the size of tiles\n");
8855
2
        return OPJ_FALSE;
8856
2
    }
8857
8858
    /* PARAMETER VALIDATION */
8859
255
    return l_is_valid;
8860
257
}
8861
8862
static OPJ_BOOL opj_j2k_decoding_validation(opj_j2k_t *p_j2k,
8863
        opj_stream_private_t *p_stream,
8864
        opj_event_mgr_t * p_manager
8865
                                           )
8866
11
{
8867
11
    OPJ_BOOL l_is_valid = OPJ_TRUE;
8868
8869
    /* preconditions*/
8870
11
    assert(p_j2k != 00);
8871
11
    assert(p_stream != 00);
8872
11
    assert(p_manager != 00);
8873
8874
11
    OPJ_UNUSED(p_stream);
8875
11
    OPJ_UNUSED(p_manager);
8876
8877
    /* STATE checking */
8878
    /* make sure the state is at 0 */
8879
#ifdef TODO_MSD
8880
    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
8881
#endif
8882
11
    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
8883
8884
    /* POINTER validation */
8885
    /* make sure a p_j2k codec is present */
8886
    /* make sure a procedure list is present */
8887
11
    l_is_valid &= (p_j2k->m_procedure_list != 00);
8888
    /* make sure a validation list is present */
8889
11
    l_is_valid &= (p_j2k->m_validation_list != 00);
8890
8891
    /* PARAMETER VALIDATION */
8892
11
    return l_is_valid;
8893
11
}
8894
8895
/** Fill p_j2k->cstr_index->tp_index[].start_pos/end_pos fields from TLM marker segments */
8896
static void opj_j2k_build_tp_index_from_tlm(opj_j2k_t* p_j2k,
8897
        opj_event_mgr_t * p_manager)
8898
0
{
8899
0
    opj_j2k_tlm_info_t* l_tlm;
8900
0
    OPJ_UINT32 i;
8901
0
    OPJ_OFF_T l_cur_offset;
8902
8903
0
    assert(p_j2k->cstr_index->main_head_end > 0);
8904
0
    assert(p_j2k->cstr_index->nb_of_tiles > 0);
8905
0
    assert(p_j2k->cstr_index->tile_index != NULL);
8906
8907
0
    l_tlm = &(p_j2k->m_specific_param.m_decoder.m_tlm);
8908
8909
0
    if (l_tlm->m_entries_count == 0) {
8910
0
        l_tlm->m_is_invalid = OPJ_TRUE;
8911
0
        return;
8912
0
    }
8913
8914
0
    if (l_tlm->m_is_invalid) {
8915
0
        return;
8916
0
    }
8917
8918
    /* Initial pass to count the number of tile-parts per tile */
8919
0
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8920
0
        OPJ_UINT32 l_tile_index_no = l_tlm->m_tile_part_infos[i].m_tile_index;
8921
0
        assert(l_tile_index_no < p_j2k->cstr_index->nb_of_tiles);
8922
0
        p_j2k->cstr_index->tile_index[l_tile_index_no].tileno = l_tile_index_no;
8923
0
        ++p_j2k->cstr_index->tile_index[l_tile_index_no].current_nb_tps;
8924
0
    }
8925
8926
    /* Now check that all tiles have at least one tile-part */
8927
0
    for (i = 0; i < p_j2k->cstr_index->nb_of_tiles; ++i) {
8928
0
        if (p_j2k->cstr_index->tile_index[i].current_nb_tps == 0) {
8929
0
            opj_event_msg(p_manager, EVT_ERROR,
8930
0
                          "opj_j2k_build_tp_index_from_tlm(): tile %d has no "
8931
0
                          "registered tile-part in TLM marker segments.\n", i);
8932
0
            goto error;
8933
0
        }
8934
0
    }
8935
8936
    /* Final pass to fill p_j2k->cstr_index */
8937
0
    l_cur_offset = p_j2k->cstr_index->main_head_end;
8938
0
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8939
0
        OPJ_UINT32 l_tile_index_no = l_tlm->m_tile_part_infos[i].m_tile_index;
8940
0
        opj_tile_index_t* l_tile_index = &
8941
0
                                         (p_j2k->cstr_index->tile_index[l_tile_index_no]);
8942
0
        if (!l_tile_index->tp_index) {
8943
0
            l_tile_index->tp_index = (opj_tp_index_t *) opj_calloc(
8944
0
                                         l_tile_index->current_nb_tps, sizeof(opj_tp_index_t));
8945
0
            if (! l_tile_index->tp_index) {
8946
0
                opj_event_msg(p_manager, EVT_ERROR,
8947
0
                              "opj_j2k_build_tp_index_from_tlm(): tile index allocation failed\n");
8948
0
                goto error;
8949
0
            }
8950
0
        }
8951
8952
0
        assert(l_tile_index->nb_tps < l_tile_index->current_nb_tps);
8953
0
        l_tile_index->tp_index[l_tile_index->nb_tps].start_pos = l_cur_offset;
8954
        /* We don't know how to set the tp_index[].end_header field, but this is not really needed */
8955
        /* If there would be no markers between SOT and SOD, that would be : */
8956
        /* l_tile_index->tp_index[l_tile_index->nb_tps].end_header = l_cur_offset + 12; */
8957
0
        l_tile_index->tp_index[l_tile_index->nb_tps].end_pos = l_cur_offset +
8958
0
                l_tlm->m_tile_part_infos[i].m_length;
8959
0
        ++l_tile_index->nb_tps;
8960
8961
0
        l_cur_offset += l_tlm->m_tile_part_infos[i].m_length;
8962
0
    }
8963
8964
0
    return;
8965
8966
0
error:
8967
0
    l_tlm->m_is_invalid = OPJ_TRUE;
8968
0
    for (i = 0; i < l_tlm->m_entries_count; ++i) {
8969
0
        OPJ_UINT32 l_tile_index = l_tlm->m_tile_part_infos[i].m_tile_index;
8970
0
        p_j2k->cstr_index->tile_index[l_tile_index].current_nb_tps = 0;
8971
0
        opj_free(p_j2k->cstr_index->tile_index[l_tile_index].tp_index);
8972
0
        p_j2k->cstr_index->tile_index[l_tile_index].tp_index = NULL;
8973
0
    }
8974
0
}
8975
8976
static OPJ_BOOL opj_j2k_read_header_procedure(opj_j2k_t *p_j2k,
8977
        opj_stream_private_t *p_stream,
8978
        opj_event_mgr_t * p_manager)
8979
11
{
8980
11
    OPJ_UINT32 l_current_marker;
8981
11
    OPJ_UINT32 l_marker_size;
8982
11
    const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
8983
11
    OPJ_BOOL l_has_siz = 0;
8984
11
    OPJ_BOOL l_has_cod = 0;
8985
11
    OPJ_BOOL l_has_qcd = 0;
8986
8987
    /* preconditions */
8988
11
    assert(p_stream != 00);
8989
11
    assert(p_j2k != 00);
8990
11
    assert(p_manager != 00);
8991
8992
    /*  We enter in the main header */
8993
11
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
8994
8995
    /* Try to read the SOC marker, the codestream must begin with SOC marker */
8996
11
    if (! opj_j2k_read_soc(p_j2k, p_stream, p_manager)) {
8997
11
        opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
8998
11
        return OPJ_FALSE;
8999
11
    }
9000
9001
    /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9002
0
    if (opj_stream_read_data(p_stream,
9003
0
                             p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9004
0
        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9005
0
        return OPJ_FALSE;
9006
0
    }
9007
9008
    /* Read 2 bytes as the new marker ID */
9009
0
    opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9010
0
                   &l_current_marker, 2);
9011
9012
    /* Try to read until the SOT is detected */
9013
0
    while (l_current_marker != J2K_MS_SOT) {
9014
9015
        /* Check if the current marker ID is valid */
9016
0
        if (l_current_marker < 0xff00) {
9017
0
            opj_event_msg(p_manager, EVT_ERROR,
9018
0
                          "A marker ID was expected (0xff--) instead of %.8x\n", l_current_marker);
9019
0
            return OPJ_FALSE;
9020
0
        }
9021
9022
        /* Get the marker handler from the marker ID */
9023
0
        l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9024
9025
        /* Manage case where marker is unknown */
9026
0
        if (l_marker_handler->id == J2K_MS_UNK) {
9027
0
            if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)) {
9028
0
                opj_event_msg(p_manager, EVT_ERROR,
9029
0
                              "Unknown marker has been detected and generated error.\n");
9030
0
                return OPJ_FALSE;
9031
0
            }
9032
9033
0
            if (l_current_marker == J2K_MS_SOT) {
9034
0
                break;    /* SOT marker is detected main header is completely read */
9035
0
            } else { /* Get the marker handler from the marker ID */
9036
0
                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9037
0
            }
9038
0
        }
9039
9040
0
        if (l_marker_handler->id == J2K_MS_SIZ) {
9041
            /* Mark required SIZ marker as found */
9042
0
            l_has_siz = 1;
9043
0
        }
9044
0
        if (l_marker_handler->id == J2K_MS_COD) {
9045
            /* Mark required COD marker as found */
9046
0
            l_has_cod = 1;
9047
0
        }
9048
0
        if (l_marker_handler->id == J2K_MS_QCD) {
9049
            /* Mark required QCD marker as found */
9050
0
            l_has_qcd = 1;
9051
0
        }
9052
9053
        /* Check if the marker is known and if it is the right place to find it */
9054
0
        if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
9055
0
            opj_event_msg(p_manager, EVT_ERROR,
9056
0
                          "Marker is not compliant with its position\n");
9057
0
            return OPJ_FALSE;
9058
0
        }
9059
9060
        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9061
0
        if (opj_stream_read_data(p_stream,
9062
0
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9063
0
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9064
0
            return OPJ_FALSE;
9065
0
        }
9066
9067
        /* read 2 bytes as the marker size */
9068
0
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
9069
0
                       2);
9070
0
        if (l_marker_size < 2) {
9071
0
            opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
9072
0
            return OPJ_FALSE;
9073
0
        }
9074
0
        l_marker_size -= 2; /* Subtract the size of the marker ID already read */
9075
9076
        /* Check if the marker size is compatible with the header data size */
9077
0
        if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
9078
0
            OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(
9079
0
                                            p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
9080
0
            if (! new_header_data) {
9081
0
                opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9082
0
                p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
9083
0
                p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9084
0
                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
9085
0
                return OPJ_FALSE;
9086
0
            }
9087
0
            p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
9088
0
            p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
9089
0
        }
9090
9091
        /* Try to read the rest of the marker segment from stream and copy them into the buffer */
9092
0
        if (opj_stream_read_data(p_stream,
9093
0
                                 p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
9094
0
                                 p_manager) != l_marker_size) {
9095
0
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9096
0
            return OPJ_FALSE;
9097
0
        }
9098
9099
        /* Read the marker segment with the correct marker handler */
9100
0
        if (!(*(l_marker_handler->handler))(p_j2k,
9101
0
                                            p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
9102
0
            opj_event_msg(p_manager, EVT_ERROR,
9103
0
                          "Marker handler function failed to read the marker segment\n");
9104
0
            return OPJ_FALSE;
9105
0
        }
9106
9107
        /* Add the marker to the codestream index*/
9108
0
        if (OPJ_FALSE == opj_j2k_add_mhmarker(
9109
0
                    p_j2k->cstr_index,
9110
0
                    l_marker_handler->id,
9111
0
                    (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
9112
0
                    l_marker_size + 4)) {
9113
0
            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
9114
0
            return OPJ_FALSE;
9115
0
        }
9116
9117
        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9118
0
        if (opj_stream_read_data(p_stream,
9119
0
                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9120
0
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9121
0
            return OPJ_FALSE;
9122
0
        }
9123
9124
        /* read 2 bytes as the new marker ID */
9125
0
        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9126
0
                       &l_current_marker, 2);
9127
0
    }
9128
9129
0
    if (l_has_siz == 0) {
9130
0
        opj_event_msg(p_manager, EVT_ERROR,
9131
0
                      "required SIZ marker not found in main header\n");
9132
0
        return OPJ_FALSE;
9133
0
    }
9134
0
    if (l_has_cod == 0) {
9135
0
        opj_event_msg(p_manager, EVT_ERROR,
9136
0
                      "required COD marker not found in main header\n");
9137
0
        return OPJ_FALSE;
9138
0
    }
9139
0
    if (l_has_qcd == 0) {
9140
0
        opj_event_msg(p_manager, EVT_ERROR,
9141
0
                      "required QCD marker not found in main header\n");
9142
0
        return OPJ_FALSE;
9143
0
    }
9144
9145
0
    if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) {
9146
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n");
9147
0
        return OPJ_FALSE;
9148
0
    }
9149
9150
0
    opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
9151
9152
    /* Position of the last element if the main header */
9153
0
    p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
9154
9155
    /* Build tile-part index from TLM information */
9156
0
    opj_j2k_build_tp_index_from_tlm(p_j2k, p_manager);
9157
9158
    /* Next step: read a tile-part header */
9159
0
    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
9160
9161
0
    return OPJ_TRUE;
9162
0
}
9163
9164
static OPJ_BOOL opj_j2k_exec(opj_j2k_t * p_j2k,
9165
                             opj_procedure_list_t * p_procedure_list,
9166
                             opj_stream_private_t *p_stream,
9167
                             opj_event_mgr_t * p_manager)
9168
790
{
9169
790
    OPJ_BOOL(** l_procedure)(opj_j2k_t *, opj_stream_private_t *,
9170
790
                             opj_event_mgr_t *) = 00;
9171
790
    OPJ_BOOL l_result = OPJ_TRUE;
9172
790
    OPJ_UINT32 l_nb_proc, i;
9173
9174
    /* preconditions*/
9175
790
    assert(p_procedure_list != 00);
9176
790
    assert(p_j2k != 00);
9177
790
    assert(p_stream != 00);
9178
790
    assert(p_manager != 00);
9179
9180
790
    l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
9181
790
    l_procedure = (OPJ_BOOL(**)(opj_j2k_t *, opj_stream_private_t *,
9182
790
                                opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
9183
9184
5.43k
    for (i = 0; i < l_nb_proc; ++i) {
9185
4.64k
        l_result = l_result && ((*l_procedure)(p_j2k, p_stream, p_manager));
9186
4.64k
        ++l_procedure;
9187
4.64k
    }
9188
9189
    /* and clear the procedure list at the end.*/
9190
790
    opj_procedure_list_clear(p_procedure_list);
9191
790
    return l_result;
9192
790
}
9193
9194
/* FIXME DOC*/
9195
static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,
9196
        opj_stream_private_t *p_stream,
9197
        opj_event_mgr_t * p_manager
9198
                                                       )
9199
0
{
9200
0
    opj_tcp_t * l_tcp = 00;
9201
0
    opj_tcp_t * l_default_tcp = 00;
9202
0
    OPJ_UINT32 l_nb_tiles;
9203
0
    OPJ_UINT32 i, j;
9204
0
    opj_tccp_t *l_current_tccp = 00;
9205
0
    OPJ_UINT32 l_tccp_size;
9206
0
    OPJ_UINT32 l_mct_size;
9207
0
    opj_image_t * l_image;
9208
0
    OPJ_UINT32 l_mcc_records_size, l_mct_records_size;
9209
0
    opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
9210
0
    opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
9211
0
    OPJ_UINT32 l_offset;
9212
9213
    /* preconditions */
9214
0
    assert(p_j2k != 00);
9215
0
    assert(p_stream != 00);
9216
0
    assert(p_manager != 00);
9217
9218
0
    OPJ_UNUSED(p_stream);
9219
9220
0
    l_image = p_j2k->m_private_image;
9221
0
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
9222
0
    l_tcp = p_j2k->m_cp.tcps;
9223
0
    l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
9224
0
    l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
9225
0
    l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(
9226
0
                     OPJ_FLOAT32);
9227
9228
    /* For each tile */
9229
0
    for (i = 0; i < l_nb_tiles; ++i) {
9230
        /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
9231
0
        l_current_tccp = l_tcp->tccps;
9232
        /*Copy default coding parameters into the current tile coding parameters*/
9233
0
        memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
9234
        /* Initialize some values of the current tile coding parameters*/
9235
0
        l_tcp->cod = 0;
9236
0
        l_tcp->ppt = 0;
9237
0
        l_tcp->ppt_data = 00;
9238
0
        l_tcp->m_current_tile_part_number = -1;
9239
        /* Remove memory not owned by this tile in case of early error return. */
9240
0
        l_tcp->m_mct_decoding_matrix = 00;
9241
0
        l_tcp->m_nb_max_mct_records = 0;
9242
0
        l_tcp->m_mct_records = 00;
9243
0
        l_tcp->m_nb_max_mcc_records = 0;
9244
0
        l_tcp->m_mcc_records = 00;
9245
        /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
9246
0
        l_tcp->tccps = l_current_tccp;
9247
9248
        /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
9249
0
        if (l_default_tcp->m_mct_decoding_matrix) {
9250
0
            l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
9251
0
            if (! l_tcp->m_mct_decoding_matrix) {
9252
0
                return OPJ_FALSE;
9253
0
            }
9254
0
            memcpy(l_tcp->m_mct_decoding_matrix, l_default_tcp->m_mct_decoding_matrix,
9255
0
                   l_mct_size);
9256
0
        }
9257
9258
        /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
9259
0
        l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(
9260
0
                                 opj_mct_data_t);
9261
0
        l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
9262
0
        if (! l_tcp->m_mct_records) {
9263
0
            return OPJ_FALSE;
9264
0
        }
9265
0
        memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records, l_mct_records_size);
9266
9267
        /* Copy the mct record data from dflt_tile_cp to the current tile*/
9268
0
        l_src_mct_rec = l_default_tcp->m_mct_records;
9269
0
        l_dest_mct_rec = l_tcp->m_mct_records;
9270
9271
0
        for (j = 0; j < l_default_tcp->m_nb_mct_records; ++j) {
9272
9273
0
            if (l_src_mct_rec->m_data) {
9274
9275
0
                l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
9276
0
                if (! l_dest_mct_rec->m_data) {
9277
0
                    return OPJ_FALSE;
9278
0
                }
9279
0
                memcpy(l_dest_mct_rec->m_data, l_src_mct_rec->m_data,
9280
0
                       l_src_mct_rec->m_data_size);
9281
0
            }
9282
9283
0
            ++l_src_mct_rec;
9284
0
            ++l_dest_mct_rec;
9285
            /* Update with each pass to free exactly what has been allocated on early return. */
9286
0
            l_tcp->m_nb_max_mct_records += 1;
9287
0
        }
9288
9289
        /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
9290
0
        l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(
9291
0
                                 opj_simple_mcc_decorrelation_data_t);
9292
0
        l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(
9293
0
                                   l_mcc_records_size);
9294
0
        if (! l_tcp->m_mcc_records) {
9295
0
            return OPJ_FALSE;
9296
0
        }
9297
0
        memcpy(l_tcp->m_mcc_records, l_default_tcp->m_mcc_records, l_mcc_records_size);
9298
0
        l_tcp->m_nb_max_mcc_records = l_default_tcp->m_nb_max_mcc_records;
9299
9300
        /* Copy the mcc record data from dflt_tile_cp to the current tile*/
9301
0
        l_src_mcc_rec = l_default_tcp->m_mcc_records;
9302
0
        l_dest_mcc_rec = l_tcp->m_mcc_records;
9303
9304
0
        for (j = 0; j < l_default_tcp->m_nb_max_mcc_records; ++j) {
9305
9306
0
            if (l_src_mcc_rec->m_decorrelation_array) {
9307
0
                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array -
9308
0
                                        l_default_tcp->m_mct_records);
9309
0
                l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
9310
0
            }
9311
9312
0
            if (l_src_mcc_rec->m_offset_array) {
9313
0
                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array -
9314
0
                                        l_default_tcp->m_mct_records);
9315
0
                l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
9316
0
            }
9317
9318
0
            ++l_src_mcc_rec;
9319
0
            ++l_dest_mcc_rec;
9320
0
        }
9321
9322
        /* Copy all the dflt_tile_compo_cp to the current tile cp */
9323
0
        memcpy(l_current_tccp, l_default_tcp->tccps, l_tccp_size);
9324
9325
        /* Move to next tile cp*/
9326
0
        ++l_tcp;
9327
0
    }
9328
9329
    /* Create the current tile decoder*/
9330
0
    p_j2k->m_tcd = opj_tcd_create(OPJ_TRUE);
9331
0
    if (! p_j2k->m_tcd) {
9332
0
        return OPJ_FALSE;
9333
0
    }
9334
9335
0
    if (!opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp), p_j2k->m_tp)) {
9336
0
        opj_tcd_destroy(p_j2k->m_tcd);
9337
0
        p_j2k->m_tcd = 00;
9338
0
        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
9339
0
        return OPJ_FALSE;
9340
0
    }
9341
9342
0
    return OPJ_TRUE;
9343
0
}
9344
9345
static const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler(
9346
    OPJ_UINT32 p_id)
9347
0
{
9348
0
    const opj_dec_memory_marker_handler_t *e;
9349
0
    for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
9350
0
        if (e->id == p_id) {
9351
0
            break; /* we find a handler corresponding to the marker ID*/
9352
0
        }
9353
0
    }
9354
0
    return e;
9355
0
}
9356
9357
void opj_j2k_destroy(opj_j2k_t *p_j2k)
9358
269
{
9359
269
    if (p_j2k == 00) {
9360
0
        return;
9361
0
    }
9362
9363
269
    if (p_j2k->m_is_decoder) {
9364
9365
11
        if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
9366
11
            opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
9367
11
            opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
9368
11
            p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
9369
11
        }
9370
9371
11
        if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
9372
11
            opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9373
11
            p_j2k->m_specific_param.m_decoder.m_header_data = 00;
9374
11
            p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9375
11
        }
9376
9377
11
        opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
9378
11
        p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = 00;
9379
11
        p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
9380
9381
11
        opj_free(p_j2k->m_specific_param.m_decoder.m_tlm.m_tile_part_infos);
9382
11
        p_j2k->m_specific_param.m_decoder.m_tlm.m_tile_part_infos = NULL;
9383
9384
11
        opj_free(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset);
9385
11
        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset = NULL;
9386
9387
258
    } else {
9388
9389
258
        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
9390
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
9391
0
            p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
9392
0
        }
9393
9394
258
        if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
9395
0
            opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
9396
0
            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
9397
0
            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
9398
0
        }
9399
9400
258
        if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
9401
3
            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
9402
3
            p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
9403
3
            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
9404
3
        }
9405
258
    }
9406
9407
269
    opj_tcd_destroy(p_j2k->m_tcd);
9408
9409
269
    opj_j2k_cp_destroy(&(p_j2k->m_cp));
9410
269
    memset(&(p_j2k->m_cp), 0, sizeof(opj_cp_t));
9411
9412
269
    opj_procedure_list_destroy(p_j2k->m_procedure_list);
9413
269
    p_j2k->m_procedure_list = 00;
9414
9415
269
    opj_procedure_list_destroy(p_j2k->m_validation_list);
9416
269
    p_j2k->m_procedure_list = 00;
9417
9418
269
    j2k_destroy_cstr_index(p_j2k->cstr_index);
9419
269
    p_j2k->cstr_index = NULL;
9420
9421
269
    opj_image_destroy(p_j2k->m_private_image);
9422
269
    p_j2k->m_private_image = NULL;
9423
9424
269
    opj_image_destroy(p_j2k->m_output_image);
9425
269
    p_j2k->m_output_image = NULL;
9426
9427
269
    opj_thread_pool_destroy(p_j2k->m_tp);
9428
269
    p_j2k->m_tp = NULL;
9429
9430
269
    opj_free(p_j2k);
9431
269
}
9432
9433
void j2k_destroy_cstr_index(opj_codestream_index_t *p_cstr_ind)
9434
269
{
9435
269
    if (p_cstr_ind) {
9436
9437
11
        if (p_cstr_ind->marker) {
9438
11
            opj_free(p_cstr_ind->marker);
9439
11
            p_cstr_ind->marker = NULL;
9440
11
        }
9441
9442
11
        if (p_cstr_ind->tile_index) {
9443
0
            OPJ_UINT32 it_tile = 0;
9444
9445
0
            for (it_tile = 0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
9446
9447
0
                if (p_cstr_ind->tile_index[it_tile].packet_index) {
9448
0
                    opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
9449
0
                    p_cstr_ind->tile_index[it_tile].packet_index = NULL;
9450
0
                }
9451
9452
0
                if (p_cstr_ind->tile_index[it_tile].tp_index) {
9453
0
                    opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
9454
0
                    p_cstr_ind->tile_index[it_tile].tp_index = NULL;
9455
0
                }
9456
9457
0
                if (p_cstr_ind->tile_index[it_tile].marker) {
9458
0
                    opj_free(p_cstr_ind->tile_index[it_tile].marker);
9459
0
                    p_cstr_ind->tile_index[it_tile].marker = NULL;
9460
9461
0
                }
9462
0
            }
9463
9464
0
            opj_free(p_cstr_ind->tile_index);
9465
0
            p_cstr_ind->tile_index = NULL;
9466
0
        }
9467
9468
11
        opj_free(p_cstr_ind);
9469
11
    }
9470
269
}
9471
9472
static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp)
9473
269
{
9474
269
    if (p_tcp == 00) {
9475
0
        return;
9476
0
    }
9477
9478
269
    if (p_tcp->ppt_markers != 00) {
9479
0
        OPJ_UINT32 i;
9480
0
        for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
9481
0
            if (p_tcp->ppt_markers[i].m_data != NULL) {
9482
0
                opj_free(p_tcp->ppt_markers[i].m_data);
9483
0
            }
9484
0
        }
9485
0
        p_tcp->ppt_markers_count = 0U;
9486
0
        opj_free(p_tcp->ppt_markers);
9487
0
        p_tcp->ppt_markers = NULL;
9488
0
    }
9489
9490
269
    if (p_tcp->ppt_buffer != 00) {
9491
0
        opj_free(p_tcp->ppt_buffer);
9492
0
        p_tcp->ppt_buffer = 00;
9493
0
    }
9494
9495
269
    if (p_tcp->tccps != 00) {
9496
258
        opj_free(p_tcp->tccps);
9497
258
        p_tcp->tccps = 00;
9498
258
    }
9499
9500
269
    if (p_tcp->m_mct_coding_matrix != 00) {
9501
0
        opj_free(p_tcp->m_mct_coding_matrix);
9502
0
        p_tcp->m_mct_coding_matrix = 00;
9503
0
    }
9504
9505
269
    if (p_tcp->m_mct_decoding_matrix != 00) {
9506
0
        opj_free(p_tcp->m_mct_decoding_matrix);
9507
0
        p_tcp->m_mct_decoding_matrix = 00;
9508
0
    }
9509
9510
269
    if (p_tcp->m_mcc_records) {
9511
0
        opj_free(p_tcp->m_mcc_records);
9512
0
        p_tcp->m_mcc_records = 00;
9513
0
        p_tcp->m_nb_max_mcc_records = 0;
9514
0
        p_tcp->m_nb_mcc_records = 0;
9515
0
    }
9516
9517
269
    if (p_tcp->m_mct_records) {
9518
0
        opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
9519
0
        OPJ_UINT32 i;
9520
9521
0
        for (i = 0; i < p_tcp->m_nb_mct_records; ++i) {
9522
0
            if (l_mct_data->m_data) {
9523
0
                opj_free(l_mct_data->m_data);
9524
0
                l_mct_data->m_data = 00;
9525
0
            }
9526
9527
0
            ++l_mct_data;
9528
0
        }
9529
9530
0
        opj_free(p_tcp->m_mct_records);
9531
0
        p_tcp->m_mct_records = 00;
9532
0
    }
9533
9534
269
    if (p_tcp->mct_norms != 00) {
9535
0
        opj_free(p_tcp->mct_norms);
9536
0
        p_tcp->mct_norms = 00;
9537
0
    }
9538
9539
269
    opj_j2k_tcp_data_destroy(p_tcp);
9540
9541
269
}
9542
9543
static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp)
9544
269
{
9545
269
    if (p_tcp->m_data) {
9546
0
        opj_free(p_tcp->m_data);
9547
0
        p_tcp->m_data = NULL;
9548
0
        p_tcp->m_data_size = 0;
9549
0
    }
9550
269
}
9551
9552
static void opj_j2k_cp_destroy(opj_cp_t *p_cp)
9553
269
{
9554
269
    OPJ_UINT32 l_nb_tiles;
9555
269
    opj_tcp_t * l_current_tile = 00;
9556
9557
269
    if (p_cp == 00) {
9558
0
        return;
9559
0
    }
9560
269
    if (p_cp->tcps != 00) {
9561
258
        OPJ_UINT32 i;
9562
258
        l_current_tile = p_cp->tcps;
9563
258
        l_nb_tiles = p_cp->th * p_cp->tw;
9564
9565
516
        for (i = 0U; i < l_nb_tiles; ++i) {
9566
258
            opj_j2k_tcp_destroy(l_current_tile);
9567
258
            ++l_current_tile;
9568
258
        }
9569
258
        opj_free(p_cp->tcps);
9570
258
        p_cp->tcps = 00;
9571
258
    }
9572
269
    if (p_cp->ppm_markers != 00) {
9573
0
        OPJ_UINT32 i;
9574
0
        for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
9575
0
            if (p_cp->ppm_markers[i].m_data != NULL) {
9576
0
                opj_free(p_cp->ppm_markers[i].m_data);
9577
0
            }
9578
0
        }
9579
0
        p_cp->ppm_markers_count = 0U;
9580
0
        opj_free(p_cp->ppm_markers);
9581
0
        p_cp->ppm_markers = NULL;
9582
0
    }
9583
269
    opj_free(p_cp->ppm_buffer);
9584
269
    p_cp->ppm_buffer = 00;
9585
269
    p_cp->ppm_data =
9586
269
        NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
9587
269
    opj_free(p_cp->comment);
9588
269
    p_cp->comment = 00;
9589
269
    if (! p_cp->m_is_decoder) {
9590
258
        opj_free(p_cp->m_specific_param.m_enc.m_matrice);
9591
258
        p_cp->m_specific_param.m_enc.m_matrice = 00;
9592
258
    }
9593
269
}
9594
9595
static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t
9596
        *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
9597
        opj_event_mgr_t * p_manager)
9598
0
{
9599
0
    OPJ_BYTE   l_header_data[10];
9600
0
    OPJ_OFF_T  l_stream_pos_backup;
9601
0
    OPJ_UINT32 l_current_marker;
9602
0
    OPJ_UINT32 l_marker_size;
9603
0
    OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts;
9604
9605
    /* initialize to no correction needed */
9606
0
    *p_correction_needed = OPJ_FALSE;
9607
9608
0
    if (!opj_stream_has_seek(p_stream)) {
9609
        /* We can't do much in this case, seek is needed */
9610
0
        return OPJ_TRUE;
9611
0
    }
9612
9613
0
    l_stream_pos_backup = opj_stream_tell(p_stream);
9614
0
    if (l_stream_pos_backup == -1) {
9615
        /* let's do nothing */
9616
0
        return OPJ_TRUE;
9617
0
    }
9618
9619
0
    for (;;) {
9620
        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9621
0
        if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
9622
            /* assume all is OK */
9623
0
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9624
0
                return OPJ_FALSE;
9625
0
            }
9626
0
            return OPJ_TRUE;
9627
0
        }
9628
9629
        /* Read 2 bytes from buffer as the new marker ID */
9630
0
        opj_read_bytes(l_header_data, &l_current_marker, 2);
9631
9632
0
        if (l_current_marker != J2K_MS_SOT) {
9633
            /* assume all is OK */
9634
0
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9635
0
                return OPJ_FALSE;
9636
0
            }
9637
0
            return OPJ_TRUE;
9638
0
        }
9639
9640
        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9641
0
        if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
9642
0
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9643
0
            return OPJ_FALSE;
9644
0
        }
9645
9646
        /* Read 2 bytes from the buffer as the marker size */
9647
0
        opj_read_bytes(l_header_data, &l_marker_size, 2);
9648
9649
        /* Check marker size for SOT Marker */
9650
0
        if (l_marker_size != 10) {
9651
0
            opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
9652
0
            return OPJ_FALSE;
9653
0
        }
9654
0
        l_marker_size -= 2;
9655
9656
0
        if (opj_stream_read_data(p_stream, l_header_data, l_marker_size,
9657
0
                                 p_manager) != l_marker_size) {
9658
0
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9659
0
            return OPJ_FALSE;
9660
0
        }
9661
9662
0
        if (! opj_j2k_get_sot_values(l_header_data, l_marker_size, &l_tile_no,
9663
0
                                     &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
9664
0
            return OPJ_FALSE;
9665
0
        }
9666
9667
0
        if (l_tile_no == tile_no) {
9668
            /* we found what we were looking for */
9669
0
            break;
9670
0
        }
9671
9672
0
        if (l_tot_len < 14U) {
9673
            /* last SOT until EOC or invalid Psot value */
9674
            /* assume all is OK */
9675
0
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9676
0
                return OPJ_FALSE;
9677
0
            }
9678
0
            return OPJ_TRUE;
9679
0
        }
9680
0
        l_tot_len -= 12U;
9681
        /* look for next SOT marker */
9682
0
        if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len),
9683
0
                            p_manager) != (OPJ_OFF_T)(l_tot_len)) {
9684
            /* assume all is OK */
9685
0
            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9686
0
                return OPJ_FALSE;
9687
0
            }
9688
0
            return OPJ_TRUE;
9689
0
        }
9690
0
    }
9691
9692
    /* check for correction */
9693
0
    if (l_current_part == l_num_parts) {
9694
0
        *p_correction_needed = OPJ_TRUE;
9695
0
    }
9696
9697
0
    if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9698
0
        return OPJ_FALSE;
9699
0
    }
9700
0
    return OPJ_TRUE;
9701
0
}
9702
9703
OPJ_BOOL opj_j2k_read_tile_header(opj_j2k_t * p_j2k,
9704
                                  OPJ_UINT32 * p_tile_index,
9705
                                  OPJ_UINT32 * p_data_size,
9706
                                  OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
9707
                                  OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
9708
                                  OPJ_UINT32 * p_nb_comps,
9709
                                  OPJ_BOOL * p_go_on,
9710
                                  opj_stream_private_t *p_stream,
9711
                                  opj_event_mgr_t * p_manager)
9712
0
{
9713
0
    OPJ_UINT32 l_current_marker = J2K_MS_SOT;
9714
0
    OPJ_UINT32 l_marker_size;
9715
0
    const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
9716
0
    opj_tcp_t * l_tcp = NULL;
9717
0
    const OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
9718
9719
    /* preconditions */
9720
0
    assert(p_stream != 00);
9721
0
    assert(p_j2k != 00);
9722
0
    assert(p_manager != 00);
9723
9724
    /* Reach the End Of Codestream ?*/
9725
0
    if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
9726
0
        l_current_marker = J2K_MS_EOC;
9727
0
    }
9728
    /* We need to encounter a SOT marker (a new tile-part header) */
9729
0
    else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
9730
0
        return OPJ_FALSE;
9731
0
    }
9732
9733
    /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
9734
0
    while ((!p_j2k->m_specific_param.m_decoder.m_can_decode) &&
9735
0
            (l_current_marker != J2K_MS_EOC)) {
9736
9737
0
        if (p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts > 0 &&
9738
0
                p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts <
9739
0
                p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts) {
9740
0
            OPJ_OFF_T next_tp_sot_pos;
9741
9742
0
            next_tp_sot_pos =
9743
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];
9744
0
            ++p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts;
9745
0
            if (!(opj_stream_read_seek(p_stream,
9746
0
                                       next_tp_sot_pos,
9747
0
                                       p_manager))) {
9748
0
                opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
9749
0
                return OPJ_FALSE;
9750
0
            }
9751
9752
            /* Try to read 2 bytes (the marker ID) from stream and copy them into the buffer */
9753
0
            if (opj_stream_read_data(p_stream,
9754
0
                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9755
0
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9756
0
                return OPJ_FALSE;
9757
0
            }
9758
9759
            /* Read 2 bytes from the buffer as the marker ID */
9760
0
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9761
0
                           &l_current_marker,
9762
0
                           2);
9763
9764
0
            if (l_current_marker != J2K_MS_SOT) {
9765
0
                opj_event_msg(p_manager, EVT_ERROR, "Did not get expected SOT marker\n");
9766
0
                return OPJ_FALSE;
9767
0
            }
9768
0
        }
9769
9770
        /* Try to read until the Start Of Data is detected */
9771
0
        while (l_current_marker != J2K_MS_SOD) {
9772
9773
0
            if (opj_stream_get_number_byte_left(p_stream) == 0) {
9774
0
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9775
0
                break;
9776
0
            }
9777
9778
            /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9779
0
            if (opj_stream_read_data(p_stream,
9780
0
                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9781
0
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9782
0
                return OPJ_FALSE;
9783
0
            }
9784
9785
            /* Read 2 bytes from the buffer as the marker size */
9786
0
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
9787
0
                           2);
9788
9789
            /* Check marker size (does not include marker ID but includes marker size) */
9790
0
            if (l_marker_size < 2) {
9791
0
                opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
9792
0
                return OPJ_FALSE;
9793
0
            }
9794
9795
            /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
9796
0
            if (l_current_marker == 0x8080 &&
9797
0
                    opj_stream_get_number_byte_left(p_stream) == 0) {
9798
0
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9799
0
                break;
9800
0
            }
9801
9802
            /* Why this condition? FIXME */
9803
0
            if ((p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH) &&
9804
0
                    p_j2k->m_specific_param.m_decoder.m_sot_length != 0) {
9805
0
                if (p_j2k->m_specific_param.m_decoder.m_sot_length < l_marker_size + 2) {
9806
0
                    opj_event_msg(p_manager, EVT_ERROR,
9807
0
                                  "Sot length is less than marker size + marker ID\n");
9808
0
                    return OPJ_FALSE;
9809
0
                }
9810
0
                p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
9811
0
            }
9812
0
            l_marker_size -= 2; /* Subtract the size of the marker ID already read */
9813
9814
            /* Get the marker handler from the marker ID */
9815
0
            l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9816
9817
            /* Check if the marker is known and if it is the right place to find it */
9818
0
            if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
9819
0
                opj_event_msg(p_manager, EVT_ERROR,
9820
0
                              "Marker is not compliant with its position\n");
9821
0
                return OPJ_FALSE;
9822
0
            }
9823
            /* FIXME manage case of unknown marker as in the main header ? */
9824
9825
            /* Check if the marker size is compatible with the header data size */
9826
0
            if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
9827
0
                OPJ_BYTE *new_header_data = NULL;
9828
                /* If we are here, this means we consider this marker as known & we will read it */
9829
                /* Check enough bytes left in stream before allocation */
9830
0
                if ((OPJ_OFF_T)l_marker_size >  opj_stream_get_number_byte_left(p_stream)) {
9831
0
                    opj_event_msg(p_manager, EVT_ERROR,
9832
0
                                  "Marker size inconsistent with stream length\n");
9833
0
                    return OPJ_FALSE;
9834
0
                }
9835
0
                new_header_data = (OPJ_BYTE *) opj_realloc(
9836
0
                                      p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
9837
0
                if (! new_header_data) {
9838
0
                    opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9839
0
                    p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
9840
0
                    p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9841
0
                    opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
9842
0
                    return OPJ_FALSE;
9843
0
                }
9844
0
                p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
9845
0
                p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
9846
0
            }
9847
9848
            /* Try to read the rest of the marker segment from stream and copy them into the buffer */
9849
0
            if (opj_stream_read_data(p_stream,
9850
0
                                     p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
9851
0
                                     p_manager) != l_marker_size) {
9852
0
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9853
0
                return OPJ_FALSE;
9854
0
            }
9855
9856
0
            if (!l_marker_handler->handler) {
9857
                /* See issue #175 */
9858
0
                opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
9859
0
                return OPJ_FALSE;
9860
0
            }
9861
            /* Read the marker segment with the correct marker handler */
9862
0
            if (!(*(l_marker_handler->handler))(p_j2k,
9863
0
                                                p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
9864
0
                opj_event_msg(p_manager, EVT_ERROR,
9865
0
                              "Fail to read the current marker segment (%#x)\n", l_current_marker);
9866
0
                return OPJ_FALSE;
9867
0
            }
9868
9869
            /* Add the marker to the codestream index*/
9870
0
            if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
9871
0
                                                  p_j2k->cstr_index,
9872
0
                                                  l_marker_handler->id,
9873
0
                                                  (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
9874
0
                                                  l_marker_size + 4)) {
9875
0
                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
9876
0
                return OPJ_FALSE;
9877
0
            }
9878
9879
            /* Keep the position of the last SOT marker read */
9880
0
            if (l_marker_handler->id == J2K_MS_SOT) {
9881
0
                OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4
9882
0
                                     ;
9883
0
                if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos) {
9884
0
                    p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
9885
0
                }
9886
0
            }
9887
9888
0
            if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
9889
                /* Skip the rest of the tile part header*/
9890
0
                if (opj_stream_skip(p_stream, p_j2k->m_specific_param.m_decoder.m_sot_length,
9891
0
                                    p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
9892
0
                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9893
0
                    return OPJ_FALSE;
9894
0
                }
9895
0
                l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
9896
0
            } else {
9897
                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
9898
0
                if (opj_stream_read_data(p_stream,
9899
0
                                         p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9900
0
                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9901
0
                    return OPJ_FALSE;
9902
0
                }
9903
                /* Read 2 bytes from the buffer as the new marker ID */
9904
0
                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9905
0
                               &l_current_marker, 2);
9906
0
            }
9907
0
        }
9908
0
        if (opj_stream_get_number_byte_left(p_stream) == 0
9909
0
                && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
9910
0
            break;
9911
0
        }
9912
9913
        /* If we didn't skip data before, we need to read the SOD marker*/
9914
0
        if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
9915
            /* Try to read the SOD marker and skip data ? FIXME */
9916
0
            if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
9917
0
                return OPJ_FALSE;
9918
0
            }
9919
9920
            /* Check if we can use the TLM index to access the next tile-part */
9921
0
            if (!p_j2k->m_specific_param.m_decoder.m_can_decode &&
9922
0
                    p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0 &&
9923
0
                    p_j2k->m_current_tile_number == (OPJ_UINT32)
9924
0
                    p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec &&
9925
0
                    !p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid &&
9926
0
                    opj_stream_has_seek(p_stream)) {
9927
0
                l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
9928
0
                if (l_tcp->m_nb_tile_parts ==
9929
0
                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps &&
9930
0
                        (OPJ_UINT32)l_tcp->m_current_tile_part_number + 1 < l_tcp->m_nb_tile_parts) {
9931
0
                    const OPJ_OFF_T next_tp_sot_pos = p_j2k->cstr_index->tile_index[
9932
0
                                                          p_j2k->m_current_tile_number].tp_index[l_tcp->m_current_tile_part_number +
9933
0
                                                                  1].start_pos;
9934
9935
0
                    if (next_tp_sot_pos != opj_stream_tell(p_stream)) {
9936
#if 0
9937
                        opj_event_msg(p_manager, EVT_INFO,
9938
                                      "opj_j2k_read_tile_header(tile=%u): seek to tile part %u at %" PRId64 "\n",
9939
                                      p_j2k->m_current_tile_number,
9940
                                      l_tcp->m_current_tile_part_number + 1,
9941
                                      next_tp_sot_pos);
9942
#endif
9943
9944
0
                        if (!(opj_stream_read_seek(p_stream,
9945
0
                                                   next_tp_sot_pos,
9946
0
                                                   p_manager))) {
9947
0
                            opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
9948
0
                            return OPJ_FALSE;
9949
0
                        }
9950
0
                    }
9951
9952
                    /* Try to read 2 bytes (the marker ID) from stream and copy them into the buffer */
9953
0
                    if (opj_stream_read_data(p_stream,
9954
0
                                             p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9955
0
                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9956
0
                        return OPJ_FALSE;
9957
0
                    }
9958
9959
                    /* Read 2 bytes from the buffer as the marker ID */
9960
0
                    opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9961
0
                                   &l_current_marker,
9962
0
                                   2);
9963
9964
0
                    if (l_current_marker != J2K_MS_SOT) {
9965
0
                        opj_event_msg(p_manager, EVT_ERROR, "Did not get expected SOT marker\n");
9966
0
                        return OPJ_FALSE;
9967
0
                    }
9968
9969
0
                    continue;
9970
0
                }
9971
0
            }
9972
9973
0
            if (p_j2k->m_specific_param.m_decoder.m_can_decode &&
9974
0
                    !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) {
9975
                /* Issue 254 */
9976
0
                OPJ_BOOL l_correction_needed = OPJ_FALSE;
9977
9978
0
                p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
9979
0
                if (p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts == 1) {
9980
                    /* Skip opj_j2k_need_nb_tile_parts_correction() if there is
9981
                     * only a single tile part declared. The
9982
                     * opj_j2k_need_nb_tile_parts_correction() hack was needed
9983
                     * for files with 5 declared tileparts (where they were
9984
                     * actually 6).
9985
                     * Doing it systematically hurts performance when reading
9986
                     * Sentinel2 L1C JPEG2000 files as explained in
9987
                     * https://lists.osgeo.org/pipermail/gdal-dev/2024-November/059805.html
9988
                     */
9989
0
                } else if (!opj_j2k_need_nb_tile_parts_correction(p_stream,
9990
0
                           p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
9991
0
                    opj_event_msg(p_manager, EVT_ERROR,
9992
0
                                  "opj_j2k_apply_nb_tile_parts_correction error\n");
9993
0
                    return OPJ_FALSE;
9994
0
                }
9995
0
                if (l_correction_needed) {
9996
0
                    OPJ_UINT32 l_tile_no;
9997
9998
0
                    p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
9999
0
                    p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1;
10000
                    /* correct tiles */
10001
0
                    for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
10002
0
                        if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) {
10003
0
                            p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts += 1;
10004
0
                        }
10005
0
                    }
10006
0
                    opj_event_msg(p_manager, EVT_WARNING,
10007
0
                                  "Non conformant codestream TPsot==TNsot.\n");
10008
0
                }
10009
0
            }
10010
0
        } else {
10011
            /* Indicate we will try to read a new tile-part header*/
10012
0
            p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
10013
0
            p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
10014
0
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
10015
0
        }
10016
10017
0
        if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
10018
            /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
10019
0
            if (opj_stream_read_data(p_stream,
10020
0
                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
10021
10022
                /* Deal with likely non conformant SPOT6 files, where the last */
10023
                /* row of tiles have TPsot == 0 and TNsot == 0, and missing EOC, */
10024
                /* but no other tile-parts were found. */
10025
0
                if (p_j2k->m_current_tile_number + 1 == l_nb_tiles) {
10026
0
                    OPJ_UINT32 l_tile_no;
10027
0
                    for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
10028
0
                        if (p_j2k->m_cp.tcps[l_tile_no].m_current_tile_part_number == 0 &&
10029
0
                                p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts == 0) {
10030
0
                            break;
10031
0
                        }
10032
0
                    }
10033
0
                    if (l_tile_no < l_nb_tiles) {
10034
0
                        opj_event_msg(p_manager, EVT_INFO,
10035
0
                                      "Tile %u has TPsot == 0 and TNsot == 0, "
10036
0
                                      "but no other tile-parts were found. "
10037
0
                                      "EOC is also missing.\n",
10038
0
                                      l_tile_no);
10039
0
                        p_j2k->m_current_tile_number = l_tile_no;
10040
0
                        l_current_marker = J2K_MS_EOC;
10041
0
                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10042
0
                        break;
10043
0
                    }
10044
0
                }
10045
10046
0
                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
10047
0
                return OPJ_FALSE;
10048
0
            }
10049
10050
            /* Read 2 bytes from buffer as the new marker ID */
10051
0
            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
10052
0
                           &l_current_marker, 2);
10053
0
        }
10054
0
    }
10055
10056
    /* Current marker is the EOC marker ?*/
10057
0
    if (l_current_marker == J2K_MS_EOC) {
10058
0
        if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
10059
0
            p_j2k->m_current_tile_number = 0;
10060
0
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10061
0
        }
10062
0
    }
10063
10064
    /* Deal with tiles that have a single tile-part with TPsot == 0 and TNsot == 0 */
10065
0
    if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
10066
0
        l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
10067
10068
0
        while ((p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00)) {
10069
0
            ++p_j2k->m_current_tile_number;
10070
0
            ++l_tcp;
10071
0
        }
10072
10073
0
        if (p_j2k->m_current_tile_number == l_nb_tiles) {
10074
0
            *p_go_on = OPJ_FALSE;
10075
0
            return OPJ_TRUE;
10076
0
        }
10077
0
    }
10078
10079
0
    if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number,
10080
0
                            p_manager)) {
10081
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n");
10082
0
        return OPJ_FALSE;
10083
0
    }
10084
    /*FIXME ???*/
10085
0
    if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
10086
0
                                   p_manager)) {
10087
0
        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
10088
0
        return OPJ_FALSE;
10089
0
    }
10090
10091
0
    opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
10092
0
                  p_j2k->m_current_tile_number + 1, (p_j2k->m_cp.th * p_j2k->m_cp.tw));
10093
10094
0
    *p_tile_index = p_j2k->m_current_tile_number;
10095
0
    *p_go_on = OPJ_TRUE;
10096
0
    if (p_data_size) {
10097
        /* For internal use in j2k.c, we don't need this */
10098
        /* This is just needed for folks using the opj_read_tile_header() / opj_decode_tile_data() combo */
10099
0
        *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd, OPJ_FALSE);
10100
0
        if (*p_data_size == UINT_MAX) {
10101
0
            return OPJ_FALSE;
10102
0
        }
10103
0
    }
10104
0
    *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
10105
0
    *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
10106
0
    *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
10107
0
    *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
10108
0
    *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
10109
10110
0
    p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
10111
10112
0
    return OPJ_TRUE;
10113
0
}
10114
10115
OPJ_BOOL opj_j2k_decode_tile(opj_j2k_t * p_j2k,
10116
                             OPJ_UINT32 p_tile_index,
10117
                             OPJ_BYTE * p_data,
10118
                             OPJ_UINT32 p_data_size,
10119
                             opj_stream_private_t *p_stream,
10120
                             opj_event_mgr_t * p_manager)
10121
0
{
10122
0
    OPJ_UINT32 l_current_marker;
10123
0
    OPJ_BYTE l_data [2];
10124
0
    opj_tcp_t * l_tcp;
10125
0
    opj_image_t* l_image_for_bounds;
10126
10127
    /* preconditions */
10128
0
    assert(p_stream != 00);
10129
0
    assert(p_j2k != 00);
10130
0
    assert(p_manager != 00);
10131
10132
0
    if (!(p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_DATA)
10133
0
            || (p_tile_index != p_j2k->m_current_tile_number)) {
10134
0
        return OPJ_FALSE;
10135
0
    }
10136
10137
0
    l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
10138
0
    if (! l_tcp->m_data) {
10139
0
        opj_j2k_tcp_destroy(l_tcp);
10140
0
        return OPJ_FALSE;
10141
0
    }
10142
10143
    /* When using the opj_read_tile_header / opj_decode_tile_data API */
10144
    /* such as in test_tile_decoder, m_output_image is NULL, so fall back */
10145
    /* to the full image dimension. This is a bit surprising that */
10146
    /* opj_set_decode_area() is only used to determine intersecting tiles, */
10147
    /* but full tile decoding is done */
10148
0
    l_image_for_bounds = p_j2k->m_output_image ? p_j2k->m_output_image :
10149
0
                         p_j2k->m_private_image;
10150
0
    if (! opj_tcd_decode_tile(p_j2k->m_tcd,
10151
0
                              l_image_for_bounds->x0,
10152
0
                              l_image_for_bounds->y0,
10153
0
                              l_image_for_bounds->x1,
10154
0
                              l_image_for_bounds->y1,
10155
0
                              p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode,
10156
0
                              p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
10157
0
                              l_tcp->m_data,
10158
0
                              l_tcp->m_data_size,
10159
0
                              p_tile_index,
10160
0
                              p_j2k->cstr_index, p_manager)) {
10161
0
        opj_j2k_tcp_destroy(l_tcp);
10162
0
        p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
10163
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
10164
0
        return OPJ_FALSE;
10165
0
    }
10166
10167
    /* p_data can be set to NULL when the call will take care of using */
10168
    /* itself the TCD data. This is typically the case for whole single */
10169
    /* tile decoding optimization. */
10170
0
    if (p_data != NULL) {
10171
0
        if (! opj_tcd_update_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
10172
0
            return OPJ_FALSE;
10173
0
        }
10174
10175
        /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
10176
        * we destroy just the data which will be re-read in read_tile_header*/
10177
        /*opj_j2k_tcp_destroy(l_tcp);
10178
        p_j2k->m_tcd->tcp = 0;*/
10179
0
        opj_j2k_tcp_data_destroy(l_tcp);
10180
0
    }
10181
10182
0
    p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
10183
0
    p_j2k->m_specific_param.m_decoder.m_state &= (~(OPJ_UINT32)J2K_STATE_DATA);
10184
10185
0
    if (opj_stream_get_number_byte_left(p_stream) == 0
10186
0
            && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
10187
0
        return OPJ_TRUE;
10188
0
    }
10189
10190
0
    if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
10191
0
        if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
10192
0
            opj_event_msg(p_manager, p_j2k->m_cp.strict ? EVT_ERROR : EVT_WARNING,
10193
0
                          "Stream too short\n");
10194
0
            return p_j2k->m_cp.strict ? OPJ_FALSE : OPJ_TRUE;
10195
0
        }
10196
0
        opj_read_bytes(l_data, &l_current_marker, 2);
10197
10198
0
        if (l_current_marker == J2K_MS_EOC) {
10199
0
            p_j2k->m_current_tile_number = 0;
10200
0
            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
10201
0
        } else if (l_current_marker != J2K_MS_SOT) {
10202
0
            if (opj_stream_get_number_byte_left(p_stream) == 0) {
10203
0
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
10204
0
                opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n");
10205
0
                return OPJ_TRUE;
10206
0
            }
10207
0
            opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
10208
0
            return OPJ_FALSE;
10209
0
        }
10210
0
    }
10211
10212
0
    return OPJ_TRUE;
10213
0
}
10214
10215
static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd,
10216
        opj_image_t* p_output_image)
10217
0
{
10218
0
    OPJ_UINT32 i, j;
10219
0
    OPJ_UINT32 l_width_src, l_height_src;
10220
0
    OPJ_UINT32 l_width_dest, l_height_dest;
10221
0
    OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
10222
0
    OPJ_SIZE_T l_start_offset_src;
10223
0
    OPJ_UINT32 l_start_x_dest, l_start_y_dest;
10224
0
    OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
10225
0
    OPJ_SIZE_T l_start_offset_dest;
10226
10227
0
    opj_image_comp_t * l_img_comp_src = 00;
10228
0
    opj_image_comp_t * l_img_comp_dest = 00;
10229
10230
0
    opj_tcd_tilecomp_t * l_tilec = 00;
10231
0
    opj_image_t * l_image_src = 00;
10232
0
    OPJ_INT32 * l_dest_ptr;
10233
10234
0
    l_tilec = p_tcd->tcd_image->tiles->comps;
10235
0
    l_image_src = p_tcd->image;
10236
0
    l_img_comp_src = l_image_src->comps;
10237
10238
0
    l_img_comp_dest = p_output_image->comps;
10239
10240
0
    for (i = 0; i < l_image_src->numcomps;
10241
0
            i++, ++l_img_comp_dest, ++l_img_comp_src,  ++l_tilec) {
10242
0
        OPJ_INT32 res_x0, res_x1, res_y0, res_y1;
10243
0
        OPJ_UINT32 src_data_stride;
10244
0
        const OPJ_INT32* p_src_data;
10245
10246
        /* Copy info from decoded comp image to output image */
10247
0
        l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
10248
10249
0
        if (p_tcd->whole_tile_decoding) {
10250
0
            opj_tcd_resolution_t* l_res = l_tilec->resolutions +
10251
0
                                          l_img_comp_src->resno_decoded;
10252
0
            res_x0 = l_res->x0;
10253
0
            res_y0 = l_res->y0;
10254
0
            res_x1 = l_res->x1;
10255
0
            res_y1 = l_res->y1;
10256
0
            src_data_stride = (OPJ_UINT32)(
10257
0
                                  l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x1 -
10258
0
                                  l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x0);
10259
0
            p_src_data = l_tilec->data;
10260
0
        } else {
10261
0
            opj_tcd_resolution_t* l_res = l_tilec->resolutions +
10262
0
                                          l_img_comp_src->resno_decoded;
10263
0
            res_x0 = (OPJ_INT32)l_res->win_x0;
10264
0
            res_y0 = (OPJ_INT32)l_res->win_y0;
10265
0
            res_x1 = (OPJ_INT32)l_res->win_x1;
10266
0
            res_y1 = (OPJ_INT32)l_res->win_y1;
10267
0
            src_data_stride = l_res->win_x1 - l_res->win_x0;
10268
0
            p_src_data = l_tilec->data_win;
10269
0
        }
10270
10271
0
        if (p_src_data == NULL) {
10272
            /* Happens for partial component decoding */
10273
0
            continue;
10274
0
        }
10275
10276
0
        l_width_src = (OPJ_UINT32)(res_x1 - res_x0);
10277
0
        l_height_src = (OPJ_UINT32)(res_y1 - res_y0);
10278
10279
10280
        /* Current tile component size*/
10281
        /*if (i == 0) {
10282
        fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
10283
                        res_x0, res_x1, res_y0, res_y1);
10284
        }*/
10285
10286
10287
        /* Border of the current output component*/
10288
0
        l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor);
10289
0
        l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor);
10290
0
        l_x1_dest = l_x0_dest +
10291
0
                    l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */
10292
0
        l_y1_dest = l_y0_dest + l_img_comp_dest->h;
10293
10294
        /*if (i == 0) {
10295
        fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
10296
                        l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
10297
        }*/
10298
10299
        /*-----*/
10300
        /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
10301
         * of the input buffer (decoded tile component) which will be move
10302
         * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
10303
         * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified
10304
         * by this input area.
10305
         * */
10306
0
        assert(res_x0 >= 0);
10307
0
        assert(res_x1 >= 0);
10308
0
        if (l_x0_dest < (OPJ_UINT32)res_x0) {
10309
0
            l_start_x_dest = (OPJ_UINT32)res_x0 - l_x0_dest;
10310
0
            l_offset_x0_src = 0;
10311
10312
0
            if (l_x1_dest >= (OPJ_UINT32)res_x1) {
10313
0
                l_width_dest = l_width_src;
10314
0
                l_offset_x1_src = 0;
10315
0
            } else {
10316
0
                l_width_dest = l_x1_dest - (OPJ_UINT32)res_x0 ;
10317
0
                l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
10318
0
            }
10319
0
        } else {
10320
0
            l_start_x_dest = 0U;
10321
0
            l_offset_x0_src = (OPJ_INT32)l_x0_dest - res_x0;
10322
10323
0
            if (l_x1_dest >= (OPJ_UINT32)res_x1) {
10324
0
                l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
10325
0
                l_offset_x1_src = 0;
10326
0
            } else {
10327
0
                l_width_dest = l_img_comp_dest->w ;
10328
0
                l_offset_x1_src = res_x1 - (OPJ_INT32)l_x1_dest;
10329
0
            }
10330
0
        }
10331
10332
0
        if (l_y0_dest < (OPJ_UINT32)res_y0) {
10333
0
            l_start_y_dest = (OPJ_UINT32)res_y0 - l_y0_dest;
10334
0
            l_offset_y0_src = 0;
10335
10336
0
            if (l_y1_dest >= (OPJ_UINT32)res_y1) {
10337
0
                l_height_dest = l_height_src;
10338
0
                l_offset_y1_src = 0;
10339
0
            } else {
10340
0
                l_height_dest = l_y1_dest - (OPJ_UINT32)res_y0 ;
10341
0
                l_offset_y1_src = (OPJ_INT32)(l_height_src - l_height_dest);
10342
0
            }
10343
0
        } else {
10344
0
            l_start_y_dest = 0U;
10345
0
            l_offset_y0_src = (OPJ_INT32)l_y0_dest - res_y0;
10346
10347
0
            if (l_y1_dest >= (OPJ_UINT32)res_y1) {
10348
0
                l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
10349
0
                l_offset_y1_src = 0;
10350
0
            } else {
10351
0
                l_height_dest = l_img_comp_dest->h ;
10352
0
                l_offset_y1_src = res_y1 - (OPJ_INT32)l_y1_dest;
10353
0
            }
10354
0
        }
10355
10356
0
        if ((l_offset_x0_src < 0) || (l_offset_y0_src < 0) || (l_offset_x1_src < 0) ||
10357
0
                (l_offset_y1_src < 0)) {
10358
0
            return OPJ_FALSE;
10359
0
        }
10360
        /* testcase 2977.pdf.asan.67.2198 */
10361
0
        if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
10362
0
            return OPJ_FALSE;
10363
0
        }
10364
        /*-----*/
10365
10366
        /* Compute the input buffer offset */
10367
0
        l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src
10368
0
                             * (OPJ_SIZE_T)src_data_stride;
10369
10370
        /* Compute the output buffer offset */
10371
0
        l_start_offset_dest = (OPJ_SIZE_T)l_start_x_dest + (OPJ_SIZE_T)l_start_y_dest
10372
0
                              * (OPJ_SIZE_T)l_img_comp_dest->w;
10373
10374
        /* Allocate output component buffer if necessary */
10375
0
        if (l_img_comp_dest->data == NULL &&
10376
0
                l_start_offset_src == 0 && l_start_offset_dest == 0 &&
10377
0
                src_data_stride == l_img_comp_dest->w &&
10378
0
                l_width_dest == l_img_comp_dest->w &&
10379
0
                l_height_dest == l_img_comp_dest->h) {
10380
            /* If the final image matches the tile buffer, then borrow it */
10381
            /* directly to save a copy */
10382
0
            if (p_tcd->whole_tile_decoding) {
10383
0
                l_img_comp_dest->data = l_tilec->data;
10384
0
                l_tilec->data = NULL;
10385
0
            } else {
10386
0
                l_img_comp_dest->data = l_tilec->data_win;
10387
0
                l_tilec->data_win = NULL;
10388
0
            }
10389
0
            continue;
10390
0
        } else if (l_img_comp_dest->data == NULL) {
10391
0
            OPJ_SIZE_T l_width = l_img_comp_dest->w;
10392
0
            OPJ_SIZE_T l_height = l_img_comp_dest->h;
10393
10394
0
            if ((l_height == 0U) || (l_width > (SIZE_MAX / l_height)) ||
10395
0
                    l_width * l_height > SIZE_MAX / sizeof(OPJ_INT32)) {
10396
                /* would overflow */
10397
0
                return OPJ_FALSE;
10398
0
            }
10399
0
            l_img_comp_dest->data = (OPJ_INT32*) opj_image_data_alloc(l_width * l_height *
10400
0
                                    sizeof(OPJ_INT32));
10401
0
            if (! l_img_comp_dest->data) {
10402
0
                return OPJ_FALSE;
10403
0
            }
10404
10405
0
            if (l_img_comp_dest->w != l_width_dest ||
10406
0
                    l_img_comp_dest->h != l_height_dest) {
10407
0
                memset(l_img_comp_dest->data, 0,
10408
0
                       (OPJ_SIZE_T)l_img_comp_dest->w * l_img_comp_dest->h * sizeof(OPJ_INT32));
10409
0
            }
10410
0
        }
10411
10412
        /* Move the output buffer to the first place where we will write*/
10413
0
        l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
10414
10415
0
        {
10416
0
            const OPJ_INT32 * l_src_ptr = p_src_data;
10417
0
            l_src_ptr += l_start_offset_src;
10418
10419
0
            for (j = 0; j < l_height_dest; ++j) {
10420
0
                memcpy(l_dest_ptr, l_src_ptr, l_width_dest * sizeof(OPJ_INT32));
10421
0
                l_dest_ptr += l_img_comp_dest->w;
10422
0
                l_src_ptr += src_data_stride;
10423
0
            }
10424
0
        }
10425
10426
10427
0
    }
10428
10429
0
    return OPJ_TRUE;
10430
0
}
10431
10432
static OPJ_BOOL opj_j2k_update_image_dimensions(opj_image_t* p_image,
10433
        opj_event_mgr_t * p_manager)
10434
0
{
10435
0
    OPJ_UINT32 it_comp;
10436
0
    OPJ_INT32 l_comp_x1, l_comp_y1;
10437
0
    opj_image_comp_t* l_img_comp = NULL;
10438
10439
0
    l_img_comp = p_image->comps;
10440
0
    for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
10441
0
        OPJ_INT32 l_h, l_w;
10442
0
        if (p_image->x0 > (OPJ_UINT32)INT_MAX ||
10443
0
                p_image->y0 > (OPJ_UINT32)INT_MAX ||
10444
0
                p_image->x1 > (OPJ_UINT32)INT_MAX ||
10445
0
                p_image->y1 > (OPJ_UINT32)INT_MAX) {
10446
0
            opj_event_msg(p_manager, EVT_ERROR,
10447
0
                          "Image coordinates above INT_MAX are not supported\n");
10448
0
            return OPJ_FALSE;
10449
0
        }
10450
10451
0
        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
10452
0
        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
10453
0
        l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
10454
0
        l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
10455
10456
0
        l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
10457
0
              - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
10458
0
        if (l_w < 0) {
10459
0
            opj_event_msg(p_manager, EVT_ERROR,
10460
0
                          "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
10461
0
                          it_comp, l_w);
10462
0
            return OPJ_FALSE;
10463
0
        }
10464
0
        l_img_comp->w = (OPJ_UINT32)l_w;
10465
10466
0
        l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
10467
0
              - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
10468
0
        if (l_h < 0) {
10469
0
            opj_event_msg(p_manager, EVT_ERROR,
10470
0
                          "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
10471
0
                          it_comp, l_h);
10472
0
            return OPJ_FALSE;
10473
0
        }
10474
0
        l_img_comp->h = (OPJ_UINT32)l_h;
10475
10476
0
        l_img_comp++;
10477
0
    }
10478
10479
0
    return OPJ_TRUE;
10480
0
}
10481
10482
OPJ_BOOL opj_j2k_set_decoded_components(opj_j2k_t *p_j2k,
10483
                                        OPJ_UINT32 numcomps,
10484
                                        const OPJ_UINT32* comps_indices,
10485
                                        opj_event_mgr_t * p_manager)
10486
0
{
10487
0
    OPJ_UINT32 i;
10488
0
    OPJ_BOOL* already_mapped;
10489
10490
0
    if (p_j2k->m_private_image == NULL) {
10491
0
        opj_event_msg(p_manager, EVT_ERROR,
10492
0
                      "opj_read_header() should be called before "
10493
0
                      "opj_set_decoded_components().\n");
10494
0
        return OPJ_FALSE;
10495
0
    }
10496
10497
0
    already_mapped = (OPJ_BOOL*) opj_calloc(sizeof(OPJ_BOOL),
10498
0
                                            p_j2k->m_private_image->numcomps);
10499
0
    if (already_mapped == NULL) {
10500
0
        return OPJ_FALSE;
10501
0
    }
10502
10503
0
    for (i = 0; i < numcomps; i++) {
10504
0
        if (comps_indices[i] >= p_j2k->m_private_image->numcomps) {
10505
0
            opj_event_msg(p_manager, EVT_ERROR,
10506
0
                          "Invalid component index: %u\n",
10507
0
                          comps_indices[i]);
10508
0
            opj_free(already_mapped);
10509
0
            return OPJ_FALSE;
10510
0
        }
10511
0
        if (already_mapped[comps_indices[i]]) {
10512
0
            opj_event_msg(p_manager, EVT_ERROR,
10513
0
                          "Component index %u used several times\n",
10514
0
                          comps_indices[i]);
10515
0
            opj_free(already_mapped);
10516
0
            return OPJ_FALSE;
10517
0
        }
10518
0
        already_mapped[comps_indices[i]] = OPJ_TRUE;
10519
0
    }
10520
0
    opj_free(already_mapped);
10521
10522
0
    opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
10523
0
    if (numcomps) {
10524
0
        p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode =
10525
0
            (OPJ_UINT32*) opj_malloc(numcomps * sizeof(OPJ_UINT32));
10526
0
        if (p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode == NULL) {
10527
0
            p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
10528
0
            return OPJ_FALSE;
10529
0
        }
10530
0
        memcpy(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
10531
0
               comps_indices,
10532
0
               numcomps * sizeof(OPJ_UINT32));
10533
0
    } else {
10534
0
        p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = NULL;
10535
0
    }
10536
0
    p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = numcomps;
10537
10538
0
    return OPJ_TRUE;
10539
0
}
10540
10541
10542
OPJ_BOOL opj_j2k_set_decode_area(opj_j2k_t *p_j2k,
10543
                                 opj_image_t* p_image,
10544
                                 OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
10545
                                 OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
10546
                                 opj_event_mgr_t * p_manager)
10547
0
{
10548
0
    opj_cp_t * l_cp = &(p_j2k->m_cp);
10549
0
    opj_image_t * l_image = p_j2k->m_private_image;
10550
0
    OPJ_BOOL ret;
10551
0
    OPJ_UINT32 it_comp;
10552
10553
0
    if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
10554
0
            p_j2k->m_cp.tcps[0].m_data != NULL) {
10555
        /* In the case of a single-tiled image whose codestream we have already */
10556
        /* ingested, go on */
10557
0
    }
10558
    /* Check if we are read the main header */
10559
0
    else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
10560
0
        opj_event_msg(p_manager, EVT_ERROR,
10561
0
                      "Need to decode the main header before begin to decode the remaining codestream.\n");
10562
0
        return OPJ_FALSE;
10563
0
    }
10564
10565
    /* Update the comps[].factor member of the output image with the one */
10566
    /* of m_reduce */
10567
0
    for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
10568
0
        p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
10569
0
    }
10570
10571
0
    if (!p_start_x && !p_start_y && !p_end_x && !p_end_y) {
10572
0
        opj_event_msg(p_manager, EVT_INFO,
10573
0
                      "No decoded area parameters, set the decoded area to the whole image\n");
10574
10575
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
10576
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
10577
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
10578
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
10579
10580
0
        p_image->x0 = l_image->x0;
10581
0
        p_image->y0 = l_image->y0;
10582
0
        p_image->x1 = l_image->x1;
10583
0
        p_image->y1 = l_image->y1;
10584
10585
0
        return opj_j2k_update_image_dimensions(p_image, p_manager);
10586
0
    }
10587
10588
    /* ----- */
10589
    /* Check if the positions provided by the user are correct */
10590
10591
    /* Left */
10592
0
    if (p_start_x < 0) {
10593
0
        opj_event_msg(p_manager, EVT_ERROR,
10594
0
                      "Left position of the decoded area (region_x0=%d) should be >= 0.\n",
10595
0
                      p_start_x);
10596
0
        return OPJ_FALSE;
10597
0
    } else if ((OPJ_UINT32)p_start_x > l_image->x1) {
10598
0
        opj_event_msg(p_manager, EVT_ERROR,
10599
0
                      "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
10600
0
                      p_start_x, l_image->x1);
10601
0
        return OPJ_FALSE;
10602
0
    } else if ((OPJ_UINT32)p_start_x < l_image->x0) {
10603
0
        opj_event_msg(p_manager, EVT_WARNING,
10604
0
                      "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
10605
0
                      p_start_x, l_image->x0);
10606
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
10607
0
        p_image->x0 = l_image->x0;
10608
0
    } else {
10609
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x -
10610
0
                l_cp->tx0) / l_cp->tdx;
10611
0
        p_image->x0 = (OPJ_UINT32)p_start_x;
10612
0
    }
10613
10614
    /* Up */
10615
0
    if (p_start_y < 0) {
10616
0
        opj_event_msg(p_manager, EVT_ERROR,
10617
0
                      "Up position of the decoded area (region_y0=%d) should be >= 0.\n",
10618
0
                      p_start_y);
10619
0
        return OPJ_FALSE;
10620
0
    } else if ((OPJ_UINT32)p_start_y > l_image->y1) {
10621
0
        opj_event_msg(p_manager, EVT_ERROR,
10622
0
                      "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
10623
0
                      p_start_y, l_image->y1);
10624
0
        return OPJ_FALSE;
10625
0
    } else if ((OPJ_UINT32)p_start_y < l_image->y0) {
10626
0
        opj_event_msg(p_manager, EVT_WARNING,
10627
0
                      "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
10628
0
                      p_start_y, l_image->y0);
10629
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
10630
0
        p_image->y0 = l_image->y0;
10631
0
    } else {
10632
0
        p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y -
10633
0
                l_cp->ty0) / l_cp->tdy;
10634
0
        p_image->y0 = (OPJ_UINT32)p_start_y;
10635
0
    }
10636
10637
    /* Right */
10638
0
    if (p_end_x <= 0) {
10639
0
        opj_event_msg(p_manager, EVT_ERROR,
10640
0
                      "Right position of the decoded area (region_x1=%d) should be > 0.\n",
10641
0
                      p_end_x);
10642
0
        return OPJ_FALSE;
10643
0
    } else if ((OPJ_UINT32)p_end_x < l_image->x0) {
10644
0
        opj_event_msg(p_manager, EVT_ERROR,
10645
0
                      "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
10646
0
                      p_end_x, l_image->x0);
10647
0
        return OPJ_FALSE;
10648
0
    } else if ((OPJ_UINT32)p_end_x > l_image->x1) {
10649
0
        opj_event_msg(p_manager, EVT_WARNING,
10650
0
                      "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
10651
0
                      p_end_x, l_image->x1);
10652
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
10653
0
        p_image->x1 = l_image->x1;
10654
0
    } else {
10655
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv((
10656
0
                    OPJ_UINT32)p_end_x - l_cp->tx0, l_cp->tdx);
10657
0
        p_image->x1 = (OPJ_UINT32)p_end_x;
10658
0
    }
10659
10660
    /* Bottom */
10661
0
    if (p_end_y <= 0) {
10662
0
        opj_event_msg(p_manager, EVT_ERROR,
10663
0
                      "Bottom position of the decoded area (region_y1=%d) should be > 0.\n",
10664
0
                      p_end_y);
10665
0
        return OPJ_FALSE;
10666
0
    } else if ((OPJ_UINT32)p_end_y < l_image->y0) {
10667
0
        opj_event_msg(p_manager, EVT_ERROR,
10668
0
                      "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
10669
0
                      p_end_y, l_image->y0);
10670
0
        return OPJ_FALSE;
10671
0
    }
10672
0
    if ((OPJ_UINT32)p_end_y > l_image->y1) {
10673
0
        opj_event_msg(p_manager, EVT_WARNING,
10674
0
                      "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
10675
0
                      p_end_y, l_image->y1);
10676
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
10677
0
        p_image->y1 = l_image->y1;
10678
0
    } else {
10679
0
        p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv((
10680
0
                    OPJ_UINT32)p_end_y - l_cp->ty0, l_cp->tdy);
10681
0
        p_image->y1 = (OPJ_UINT32)p_end_y;
10682
0
    }
10683
    /* ----- */
10684
10685
0
    p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
10686
10687
0
    ret = opj_j2k_update_image_dimensions(p_image, p_manager);
10688
10689
0
    if (ret) {
10690
0
        opj_event_msg(p_manager, EVT_INFO, "Setting decoding area to %d,%d,%d,%d\n",
10691
0
                      p_image->x0, p_image->y0, p_image->x1, p_image->y1);
10692
0
    }
10693
10694
0
    return ret;
10695
0
}
10696
10697
opj_j2k_t* opj_j2k_create_decompress(void)
10698
11
{
10699
11
    opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
10700
11
    if (!l_j2k) {
10701
0
        return 00;
10702
0
    }
10703
10704
11
    l_j2k->m_is_decoder = 1;
10705
11
    l_j2k->m_cp.m_is_decoder = 1;
10706
    /* in the absence of JP2 boxes, consider different bit depth / sign */
10707
    /* per component is allowed */
10708
11
    l_j2k->m_cp.allow_different_bit_depth_sign = 1;
10709
10710
    /* Default to using strict mode. */
10711
11
    l_j2k->m_cp.strict = OPJ_TRUE;
10712
10713
#ifdef OPJ_DISABLE_TPSOT_FIX
10714
    l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
10715
#endif
10716
10717
11
    l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,
10718
11
            sizeof(opj_tcp_t));
10719
11
    if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
10720
0
        opj_j2k_destroy(l_j2k);
10721
0
        return 00;
10722
0
    }
10723
10724
11
    l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,
10725
11
            OPJ_J2K_DEFAULT_HEADER_SIZE);
10726
11
    if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
10727
0
        opj_j2k_destroy(l_j2k);
10728
0
        return 00;
10729
0
    }
10730
10731
11
    l_j2k->m_specific_param.m_decoder.m_header_data_size =
10732
11
        OPJ_J2K_DEFAULT_HEADER_SIZE;
10733
10734
11
    l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
10735
10736
11
    l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
10737
10738
    /* codestream index creation */
10739
11
    l_j2k->cstr_index = opj_j2k_create_cstr_index();
10740
11
    if (!l_j2k->cstr_index) {
10741
0
        opj_j2k_destroy(l_j2k);
10742
0
        return 00;
10743
0
    }
10744
10745
    /* validation list creation */
10746
11
    l_j2k->m_validation_list = opj_procedure_list_create();
10747
11
    if (! l_j2k->m_validation_list) {
10748
0
        opj_j2k_destroy(l_j2k);
10749
0
        return 00;
10750
0
    }
10751
10752
    /* execution list creation */
10753
11
    l_j2k->m_procedure_list = opj_procedure_list_create();
10754
11
    if (! l_j2k->m_procedure_list) {
10755
0
        opj_j2k_destroy(l_j2k);
10756
0
        return 00;
10757
0
    }
10758
10759
11
    l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
10760
11
    if (!l_j2k->m_tp) {
10761
0
        l_j2k->m_tp = opj_thread_pool_create(0);
10762
0
    }
10763
11
    if (!l_j2k->m_tp) {
10764
0
        opj_j2k_destroy(l_j2k);
10765
0
        return NULL;
10766
0
    }
10767
10768
11
    return l_j2k;
10769
11
}
10770
10771
static opj_codestream_index_t* opj_j2k_create_cstr_index(void)
10772
11
{
10773
11
    opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
10774
11
                                         opj_calloc(1, sizeof(opj_codestream_index_t));
10775
11
    if (!cstr_index) {
10776
0
        return NULL;
10777
0
    }
10778
10779
11
    cstr_index->maxmarknum = 100;
10780
11
    cstr_index->marknum = 0;
10781
11
    cstr_index->marker = (opj_marker_info_t*)
10782
11
                         opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
10783
11
    if (!cstr_index-> marker) {
10784
0
        opj_free(cstr_index);
10785
0
        return NULL;
10786
0
    }
10787
10788
11
    cstr_index->tile_index = NULL;
10789
10790
11
    return cstr_index;
10791
11
}
10792
10793
static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t *p_j2k,
10794
        OPJ_UINT32 p_tile_no,
10795
        OPJ_UINT32 p_comp_no)
10796
1.78k
{
10797
1.78k
    opj_cp_t *l_cp = 00;
10798
1.78k
    opj_tcp_t *l_tcp = 00;
10799
1.78k
    opj_tccp_t *l_tccp = 00;
10800
10801
    /* preconditions */
10802
1.78k
    assert(p_j2k != 00);
10803
10804
1.78k
    l_cp = &(p_j2k->m_cp);
10805
1.78k
    l_tcp = &l_cp->tcps[p_tile_no];
10806
1.78k
    l_tccp = &l_tcp->tccps[p_comp_no];
10807
10808
    /* preconditions again */
10809
1.78k
    assert(p_tile_no < (l_cp->tw * l_cp->th));
10810
1.78k
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
10811
10812
1.78k
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10813
0
        return 5 + l_tccp->numresolutions;
10814
1.78k
    } else {
10815
1.78k
        return 5;
10816
1.78k
    }
10817
1.78k
}
10818
10819
static OPJ_BOOL opj_j2k_compare_SPCod_SPCoc(opj_j2k_t *p_j2k,
10820
        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
10821
510
{
10822
510
    OPJ_UINT32 i;
10823
510
    opj_cp_t *l_cp = NULL;
10824
510
    opj_tcp_t *l_tcp = NULL;
10825
510
    opj_tccp_t *l_tccp0 = NULL;
10826
510
    opj_tccp_t *l_tccp1 = NULL;
10827
10828
    /* preconditions */
10829
510
    assert(p_j2k != 00);
10830
10831
510
    l_cp = &(p_j2k->m_cp);
10832
510
    l_tcp = &l_cp->tcps[p_tile_no];
10833
510
    l_tccp0 = &l_tcp->tccps[p_first_comp_no];
10834
510
    l_tccp1 = &l_tcp->tccps[p_second_comp_no];
10835
10836
510
    if (l_tccp0->numresolutions != l_tccp1->numresolutions) {
10837
0
        return OPJ_FALSE;
10838
0
    }
10839
510
    if (l_tccp0->cblkw != l_tccp1->cblkw) {
10840
0
        return OPJ_FALSE;
10841
0
    }
10842
510
    if (l_tccp0->cblkh != l_tccp1->cblkh) {
10843
0
        return OPJ_FALSE;
10844
0
    }
10845
510
    if (l_tccp0->cblksty != l_tccp1->cblksty) {
10846
0
        return OPJ_FALSE;
10847
0
    }
10848
510
    if (l_tccp0->qmfbid != l_tccp1->qmfbid) {
10849
0
        return OPJ_FALSE;
10850
0
    }
10851
510
    if ((l_tccp0->csty & J2K_CCP_CSTY_PRT) != (l_tccp1->csty & J2K_CCP_CSTY_PRT)) {
10852
0
        return OPJ_FALSE;
10853
0
    }
10854
10855
3.57k
    for (i = 0U; i < l_tccp0->numresolutions; ++i) {
10856
3.06k
        if (l_tccp0->prcw[i] != l_tccp1->prcw[i]) {
10857
0
            return OPJ_FALSE;
10858
0
        }
10859
3.06k
        if (l_tccp0->prch[i] != l_tccp1->prch[i]) {
10860
0
            return OPJ_FALSE;
10861
0
        }
10862
3.06k
    }
10863
510
    return OPJ_TRUE;
10864
510
}
10865
10866
static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(opj_j2k_t *p_j2k,
10867
        OPJ_UINT32 p_tile_no,
10868
        OPJ_UINT32 p_comp_no,
10869
        OPJ_BYTE * p_data,
10870
        OPJ_UINT32 * p_header_size,
10871
        struct opj_event_mgr * p_manager)
10872
255
{
10873
255
    OPJ_UINT32 i;
10874
255
    opj_cp_t *l_cp = 00;
10875
255
    opj_tcp_t *l_tcp = 00;
10876
255
    opj_tccp_t *l_tccp = 00;
10877
10878
    /* preconditions */
10879
255
    assert(p_j2k != 00);
10880
255
    assert(p_header_size != 00);
10881
255
    assert(p_manager != 00);
10882
255
    assert(p_data != 00);
10883
10884
255
    l_cp = &(p_j2k->m_cp);
10885
255
    l_tcp = &l_cp->tcps[p_tile_no];
10886
255
    l_tccp = &l_tcp->tccps[p_comp_no];
10887
10888
    /* preconditions again */
10889
255
    assert(p_tile_no < (l_cp->tw * l_cp->th));
10890
255
    assert(p_comp_no < (p_j2k->m_private_image->numcomps));
10891
10892
255
    if (*p_header_size < 5) {
10893
0
        opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
10894
0
        return OPJ_FALSE;
10895
0
    }
10896
10897
255
    opj_write_bytes(p_data, l_tccp->numresolutions - 1, 1); /* SPcoc (D) */
10898
255
    ++p_data;
10899
10900
255
    opj_write_bytes(p_data, l_tccp->cblkw - 2, 1);                  /* SPcoc (E) */
10901
255
    ++p_data;
10902
10903
255
    opj_write_bytes(p_data, l_tccp->cblkh - 2, 1);                  /* SPcoc (F) */
10904
255
    ++p_data;
10905
10906
255
    opj_write_bytes(p_data, l_tccp->cblksty,
10907
255
                    1);                            /* SPcoc (G) */
10908
255
    ++p_data;
10909
10910
255
    opj_write_bytes(p_data, l_tccp->qmfbid,
10911
255
                    1);                             /* SPcoc (H) */
10912
255
    ++p_data;
10913
10914
255
    *p_header_size = *p_header_size - 5;
10915
10916
255
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10917
10918
0
        if (*p_header_size < l_tccp->numresolutions) {
10919
0
            opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
10920
0
            return OPJ_FALSE;
10921
0
        }
10922
10923
0
        for (i = 0; i < l_tccp->numresolutions; ++i) {
10924
0
            opj_write_bytes(p_data, l_tccp->prcw[i] + (l_tccp->prch[i] << 4),
10925
0
                            1);   /* SPcoc (I_i) */
10926
0
            ++p_data;
10927
0
        }
10928
10929
0
        *p_header_size = *p_header_size - l_tccp->numresolutions;
10930
0
    }
10931
10932
255
    return OPJ_TRUE;
10933
255
}
10934
10935
static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
10936
        OPJ_UINT32 compno,
10937
        OPJ_BYTE * p_header_data,
10938
        OPJ_UINT32 * p_header_size,
10939
        opj_event_mgr_t * p_manager)
10940
0
{
10941
0
    OPJ_UINT32 i, l_tmp;
10942
0
    opj_cp_t *l_cp = NULL;
10943
0
    opj_tcp_t *l_tcp = NULL;
10944
0
    opj_tccp_t *l_tccp = NULL;
10945
0
    OPJ_BYTE * l_current_ptr = NULL;
10946
10947
    /* preconditions */
10948
0
    assert(p_j2k != 00);
10949
0
    assert(p_manager != 00);
10950
0
    assert(p_header_data != 00);
10951
10952
0
    l_cp = &(p_j2k->m_cp);
10953
0
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
10954
0
            &l_cp->tcps[p_j2k->m_current_tile_number] :
10955
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
10956
10957
    /* precondition again */
10958
0
    assert(compno < p_j2k->m_private_image->numcomps);
10959
10960
0
    l_tccp = &l_tcp->tccps[compno];
10961
0
    l_current_ptr = p_header_data;
10962
10963
    /* make sure room is sufficient */
10964
0
    if (*p_header_size < 5) {
10965
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
10966
0
        return OPJ_FALSE;
10967
0
    }
10968
10969
    /* SPcod (D) / SPcoc (A) */
10970
0
    opj_read_bytes(l_current_ptr, &l_tccp->numresolutions, 1);
10971
0
    ++l_tccp->numresolutions;  /* tccp->numresolutions = read() + 1 */
10972
0
    if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
10973
0
        opj_event_msg(p_manager, EVT_ERROR,
10974
0
                      "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
10975
0
                      l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
10976
0
        return OPJ_FALSE;
10977
0
    }
10978
0
    ++l_current_ptr;
10979
10980
    /* If user wants to remove more resolutions than the codestream contains, return error */
10981
0
    if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
10982
0
        opj_event_msg(p_manager, EVT_ERROR,
10983
0
                      "Error decoding component %d.\nThe number of resolutions "
10984
0
                      "to remove (%d) is greater or equal than the number "
10985
0
                      "of resolutions of this component (%d)\nModify the cp_reduce parameter.\n\n",
10986
0
                      compno, l_cp->m_specific_param.m_dec.m_reduce, l_tccp->numresolutions);
10987
0
        p_j2k->m_specific_param.m_decoder.m_state |=
10988
0
            0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
10989
0
        return OPJ_FALSE;
10990
0
    }
10991
10992
    /* SPcod (E) / SPcoc (B) */
10993
0
    opj_read_bytes(l_current_ptr, &l_tccp->cblkw, 1);
10994
0
    ++l_current_ptr;
10995
0
    l_tccp->cblkw += 2;
10996
10997
    /* SPcod (F) / SPcoc (C) */
10998
0
    opj_read_bytes(l_current_ptr, &l_tccp->cblkh, 1);
10999
0
    ++l_current_ptr;
11000
0
    l_tccp->cblkh += 2;
11001
11002
0
    if ((l_tccp->cblkw > 10) || (l_tccp->cblkh > 10) ||
11003
0
            ((l_tccp->cblkw + l_tccp->cblkh) > 12)) {
11004
0
        opj_event_msg(p_manager, EVT_ERROR,
11005
0
                      "Error reading SPCod SPCoc element, Invalid cblkw/cblkh combination\n");
11006
0
        return OPJ_FALSE;
11007
0
    }
11008
11009
    /* SPcod (G) / SPcoc (D) */
11010
0
    opj_read_bytes(l_current_ptr, &l_tccp->cblksty, 1);
11011
0
    ++l_current_ptr;
11012
0
    if ((l_tccp->cblksty & J2K_CCP_CBLKSTY_HTMIXED) != 0) {
11013
        /* We do not support HT mixed mode yet.  For conformance, it should be supported.*/
11014
0
        opj_event_msg(p_manager, EVT_ERROR,
11015
0
                      "Error reading SPCod SPCoc element. Unsupported Mixed HT code-block style found\n");
11016
0
        return OPJ_FALSE;
11017
0
    }
11018
11019
    /* SPcod (H) / SPcoc (E) */
11020
0
    opj_read_bytes(l_current_ptr, &l_tccp->qmfbid, 1);
11021
0
    ++l_current_ptr;
11022
11023
0
    if (l_tccp->qmfbid > 1) {
11024
0
        opj_event_msg(p_manager, EVT_ERROR,
11025
0
                      "Error reading SPCod SPCoc element, Invalid transformation found\n");
11026
0
        return OPJ_FALSE;
11027
0
    }
11028
11029
0
    *p_header_size = *p_header_size - 5;
11030
11031
    /* use custom precinct size ? */
11032
0
    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
11033
0
        if (*p_header_size < l_tccp->numresolutions) {
11034
0
            opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
11035
0
            return OPJ_FALSE;
11036
0
        }
11037
11038
        /* SPcod (I_i) / SPcoc (F_i) */
11039
0
        for (i = 0; i < l_tccp->numresolutions; ++i) {
11040
0
            opj_read_bytes(l_current_ptr, &l_tmp, 1);
11041
0
            ++l_current_ptr;
11042
            /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */
11043
0
            if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) {
11044
0
                opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n");
11045
0
                return OPJ_FALSE;
11046
0
            }
11047
0
            l_tccp->prcw[i] = l_tmp & 0xf;
11048
0
            l_tccp->prch[i] = l_tmp >> 4;
11049
0
        }
11050
11051
0
        *p_header_size = *p_header_size - l_tccp->numresolutions;
11052
0
    } else {
11053
        /* set default size for the precinct width and height */
11054
0
        for (i = 0; i < l_tccp->numresolutions; ++i) {
11055
0
            l_tccp->prcw[i] = 15;
11056
0
            l_tccp->prch[i] = 15;
11057
0
        }
11058
0
    }
11059
11060
#ifdef WIP_REMOVE_MSD
11061
    /* INDEX >> */
11062
    if (p_j2k->cstr_info && compno == 0) {
11063
        OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
11064
11065
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh =
11066
            l_tccp->cblkh;
11067
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw =
11068
            l_tccp->cblkw;
11069
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions
11070
            = l_tccp->numresolutions;
11071
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty =
11072
            l_tccp->cblksty;
11073
        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid =
11074
            l_tccp->qmfbid;
11075
11076
        memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx, l_tccp->prcw,
11077
               l_data_size);
11078
        memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy, l_tccp->prch,
11079
               l_data_size);
11080
    }
11081
    /* << INDEX */
11082
#endif
11083
11084
0
    return OPJ_TRUE;
11085
0
}
11086
11087
static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k)
11088
0
{
11089
    /* loop */
11090
0
    OPJ_UINT32 i;
11091
0
    opj_cp_t *l_cp = NULL;
11092
0
    opj_tcp_t *l_tcp = NULL;
11093
0
    opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
11094
0
    OPJ_UINT32 l_prc_size;
11095
11096
    /* preconditions */
11097
0
    assert(p_j2k != 00);
11098
11099
0
    l_cp = &(p_j2k->m_cp);
11100
0
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
11101
0
            ?
11102
0
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11103
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11104
11105
0
    l_ref_tccp = &l_tcp->tccps[0];
11106
0
    l_copied_tccp = l_ref_tccp + 1;
11107
0
    l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
11108
11109
0
    for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
11110
0
        l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
11111
0
        l_copied_tccp->cblkw = l_ref_tccp->cblkw;
11112
0
        l_copied_tccp->cblkh = l_ref_tccp->cblkh;
11113
0
        l_copied_tccp->cblksty = l_ref_tccp->cblksty;
11114
0
        l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
11115
0
        memcpy(l_copied_tccp->prcw, l_ref_tccp->prcw, l_prc_size);
11116
0
        memcpy(l_copied_tccp->prch, l_ref_tccp->prch, l_prc_size);
11117
0
        ++l_copied_tccp;
11118
0
    }
11119
0
}
11120
11121
static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size(opj_j2k_t *p_j2k,
11122
        OPJ_UINT32 p_tile_no,
11123
        OPJ_UINT32 p_comp_no)
11124
255
{
11125
255
    OPJ_UINT32 l_num_bands;
11126
11127
255
    opj_cp_t *l_cp = 00;
11128
255
    opj_tcp_t *l_tcp = 00;
11129
255
    opj_tccp_t *l_tccp = 00;
11130
11131
    /* preconditions */
11132
255
    assert(p_j2k != 00);
11133
11134
255
    l_cp = &(p_j2k->m_cp);
11135
255
    l_tcp = &l_cp->tcps[p_tile_no];
11136
255
    l_tccp = &l_tcp->tccps[p_comp_no];
11137
11138
    /* preconditions again */
11139
255
    assert(p_tile_no < l_cp->tw * l_cp->th);
11140
255
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
11141
11142
255
    l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11143
255
                  (l_tccp->numresolutions * 3 - 2);
11144
11145
255
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
11146
100
        return 1 + l_num_bands;
11147
155
    } else {
11148
155
        return 1 + 2 * l_num_bands;
11149
155
    }
11150
255
}
11151
11152
static OPJ_BOOL opj_j2k_compare_SQcd_SQcc(opj_j2k_t *p_j2k,
11153
        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
11154
510
{
11155
510
    opj_cp_t *l_cp = NULL;
11156
510
    opj_tcp_t *l_tcp = NULL;
11157
510
    opj_tccp_t *l_tccp0 = NULL;
11158
510
    opj_tccp_t *l_tccp1 = NULL;
11159
510
    OPJ_UINT32 l_band_no, l_num_bands;
11160
11161
    /* preconditions */
11162
510
    assert(p_j2k != 00);
11163
11164
510
    l_cp = &(p_j2k->m_cp);
11165
510
    l_tcp = &l_cp->tcps[p_tile_no];
11166
510
    l_tccp0 = &l_tcp->tccps[p_first_comp_no];
11167
510
    l_tccp1 = &l_tcp->tccps[p_second_comp_no];
11168
11169
510
    if (l_tccp0->qntsty != l_tccp1->qntsty) {
11170
0
        return OPJ_FALSE;
11171
0
    }
11172
510
    if (l_tccp0->numgbits != l_tccp1->numgbits) {
11173
0
        return OPJ_FALSE;
11174
0
    }
11175
510
    if (l_tccp0->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11176
0
        l_num_bands = 1U;
11177
510
    } else {
11178
510
        l_num_bands = l_tccp0->numresolutions * 3U - 2U;
11179
510
        if (l_num_bands != (l_tccp1->numresolutions * 3U - 2U)) {
11180
0
            return OPJ_FALSE;
11181
0
        }
11182
510
    }
11183
11184
8.67k
    for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11185
8.16k
        if (l_tccp0->stepsizes[l_band_no].expn != l_tccp1->stepsizes[l_band_no].expn) {
11186
0
            return OPJ_FALSE;
11187
0
        }
11188
8.16k
    }
11189
510
    if (l_tccp0->qntsty != J2K_CCP_QNTSTY_NOQNT) {
11190
5.27k
        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11191
4.96k
            if (l_tccp0->stepsizes[l_band_no].mant != l_tccp1->stepsizes[l_band_no].mant) {
11192
0
                return OPJ_FALSE;
11193
0
            }
11194
4.96k
        }
11195
310
    }
11196
510
    return OPJ_TRUE;
11197
510
}
11198
11199
11200
static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
11201
                                        OPJ_UINT32 p_tile_no,
11202
                                        OPJ_UINT32 p_comp_no,
11203
                                        OPJ_BYTE * p_data,
11204
                                        OPJ_UINT32 * p_header_size,
11205
                                        struct opj_event_mgr * p_manager)
11206
255
{
11207
255
    OPJ_UINT32 l_header_size;
11208
255
    OPJ_UINT32 l_band_no, l_num_bands;
11209
255
    OPJ_UINT32 l_expn, l_mant;
11210
11211
255
    opj_cp_t *l_cp = 00;
11212
255
    opj_tcp_t *l_tcp = 00;
11213
255
    opj_tccp_t *l_tccp = 00;
11214
11215
    /* preconditions */
11216
255
    assert(p_j2k != 00);
11217
255
    assert(p_header_size != 00);
11218
255
    assert(p_manager != 00);
11219
255
    assert(p_data != 00);
11220
11221
255
    l_cp = &(p_j2k->m_cp);
11222
255
    l_tcp = &l_cp->tcps[p_tile_no];
11223
255
    l_tccp = &l_tcp->tccps[p_comp_no];
11224
11225
    /* preconditions again */
11226
255
    assert(p_tile_no < l_cp->tw * l_cp->th);
11227
255
    assert(p_comp_no < p_j2k->m_private_image->numcomps);
11228
11229
255
    l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11230
255
                  (l_tccp->numresolutions * 3 - 2);
11231
11232
255
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
11233
100
        l_header_size = 1 + l_num_bands;
11234
11235
100
        if (*p_header_size < l_header_size) {
11236
0
            opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
11237
0
            return OPJ_FALSE;
11238
0
        }
11239
11240
100
        opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
11241
100
                        1);   /* Sqcx */
11242
100
        ++p_data;
11243
11244
1.70k
        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11245
1.60k
            l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
11246
1.60k
            opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */
11247
1.60k
            ++p_data;
11248
1.60k
        }
11249
155
    } else {
11250
155
        l_header_size = 1 + 2 * l_num_bands;
11251
11252
155
        if (*p_header_size < l_header_size) {
11253
0
            opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
11254
0
            return OPJ_FALSE;
11255
0
        }
11256
11257
155
        opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
11258
155
                        1);   /* Sqcx */
11259
155
        ++p_data;
11260
11261
2.63k
        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
11262
2.48k
            l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
11263
2.48k
            l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
11264
11265
2.48k
            opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */
11266
2.48k
            p_data += 2;
11267
2.48k
        }
11268
155
    }
11269
11270
255
    *p_header_size = *p_header_size - l_header_size;
11271
11272
255
    return OPJ_TRUE;
11273
255
}
11274
11275
static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
11276
                                       OPJ_UINT32 p_comp_no,
11277
                                       OPJ_BYTE* p_header_data,
11278
                                       OPJ_UINT32 * p_header_size,
11279
                                       opj_event_mgr_t * p_manager
11280
                                      )
11281
0
{
11282
    /* loop*/
11283
0
    OPJ_UINT32 l_band_no;
11284
0
    opj_cp_t *l_cp = 00;
11285
0
    opj_tcp_t *l_tcp = 00;
11286
0
    opj_tccp_t *l_tccp = 00;
11287
0
    OPJ_BYTE * l_current_ptr = 00;
11288
0
    OPJ_UINT32 l_tmp, l_num_band;
11289
11290
    /* preconditions*/
11291
0
    assert(p_j2k != 00);
11292
0
    assert(p_manager != 00);
11293
0
    assert(p_header_data != 00);
11294
11295
0
    l_cp = &(p_j2k->m_cp);
11296
    /* come from tile part header or main header ?*/
11297
0
    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
11298
0
            ?
11299
0
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11300
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11301
11302
    /* precondition again*/
11303
0
    assert(p_comp_no <  p_j2k->m_private_image->numcomps);
11304
11305
0
    l_tccp = &l_tcp->tccps[p_comp_no];
11306
0
    l_current_ptr = p_header_data;
11307
11308
0
    if (*p_header_size < 1) {
11309
0
        opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
11310
0
        return OPJ_FALSE;
11311
0
    }
11312
0
    *p_header_size -= 1;
11313
11314
0
    opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* Sqcx */
11315
0
    ++l_current_ptr;
11316
11317
0
    l_tccp->qntsty = l_tmp & 0x1f;
11318
0
    l_tccp->numgbits = l_tmp >> 5;
11319
0
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11320
0
        l_num_band = 1;
11321
0
    } else {
11322
0
        l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
11323
0
                     (*p_header_size) :
11324
0
                     (*p_header_size) / 2;
11325
11326
0
        if (l_num_band > OPJ_J2K_MAXBANDS) {
11327
0
            opj_event_msg(p_manager, EVT_WARNING,
11328
0
                          "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
11329
0
                          "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
11330
0
                          "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS,
11331
0
                          OPJ_J2K_MAXBANDS);
11332
            /*return OPJ_FALSE;*/
11333
0
        }
11334
0
    }
11335
11336
#ifdef USE_JPWL
11337
    if (l_cp->correct) {
11338
11339
        /* if JPWL is on, we check whether there are too many subbands */
11340
        if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
11341
            opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
11342
                          "JPWL: bad number of subbands in Sqcx (%d)\n",
11343
                          l_num_band);
11344
            if (!JPWL_ASSUME) {
11345
                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
11346
                return OPJ_FALSE;
11347
            }
11348
            /* we try to correct */
11349
            l_num_band = 1;
11350
            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
11351
                          "- setting number of bands to %d => HYPOTHESIS!!!\n",
11352
                          l_num_band);
11353
        };
11354
11355
    };
11356
#endif /* USE_JPWL */
11357
11358
0
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
11359
0
        for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
11360
0
            opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* SPqcx_i */
11361
0
            ++l_current_ptr;
11362
0
            if (l_band_no < OPJ_J2K_MAXBANDS) {
11363
0
                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
11364
0
                l_tccp->stepsizes[l_band_no].mant = 0;
11365
0
            }
11366
0
        }
11367
11368
0
        if (*p_header_size < l_num_band) {
11369
0
            return OPJ_FALSE;
11370
0
        }
11371
0
        *p_header_size = *p_header_size - l_num_band;
11372
0
    } else {
11373
0
        for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
11374
0
            opj_read_bytes(l_current_ptr, &l_tmp, 2);                       /* SPqcx_i */
11375
0
            l_current_ptr += 2;
11376
0
            if (l_band_no < OPJ_J2K_MAXBANDS) {
11377
0
                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
11378
0
                l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
11379
0
            }
11380
0
        }
11381
11382
0
        if (*p_header_size < 2 * l_num_band) {
11383
0
            return OPJ_FALSE;
11384
0
        }
11385
0
        *p_header_size = *p_header_size - 2 * l_num_band;
11386
0
    }
11387
11388
    /* Add Antonin : if scalar_derived -> compute other stepsizes */
11389
0
    if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11390
0
        for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
11391
0
            l_tccp->stepsizes[l_band_no].expn =
11392
0
                ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0)
11393
0
                ?
11394
0
                (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
11395
0
            l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
11396
0
        }
11397
0
    }
11398
11399
0
    return OPJ_TRUE;
11400
0
}
11401
11402
static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k)
11403
0
{
11404
0
    OPJ_UINT32 i;
11405
0
    opj_cp_t *l_cp = NULL;
11406
0
    opj_tcp_t *l_tcp = NULL;
11407
0
    opj_tccp_t *l_ref_tccp = NULL;
11408
0
    opj_tccp_t *l_copied_tccp = NULL;
11409
0
    OPJ_UINT32 l_size;
11410
11411
    /* preconditions */
11412
0
    assert(p_j2k != 00);
11413
11414
0
    l_cp = &(p_j2k->m_cp);
11415
0
    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
11416
0
            &l_cp->tcps[p_j2k->m_current_tile_number] :
11417
0
            p_j2k->m_specific_param.m_decoder.m_default_tcp;
11418
11419
0
    l_ref_tccp = &l_tcp->tccps[0];
11420
0
    l_copied_tccp = l_ref_tccp + 1;
11421
0
    l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
11422
11423
0
    for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
11424
0
        l_copied_tccp->qntsty = l_ref_tccp->qntsty;
11425
0
        l_copied_tccp->numgbits = l_ref_tccp->numgbits;
11426
0
        memcpy(l_copied_tccp->stepsizes, l_ref_tccp->stepsizes, l_size);
11427
0
        ++l_copied_tccp;
11428
0
    }
11429
0
}
11430
11431
static void opj_j2k_dump_tile_info(opj_tcp_t * l_default_tile,
11432
                                   OPJ_INT32 numcomps, FILE* out_stream)
11433
0
{
11434
0
    if (l_default_tile) {
11435
0
        OPJ_INT32 compno;
11436
11437
0
        fprintf(out_stream, "\t default tile {\n");
11438
0
        fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
11439
0
        fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
11440
0
        fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
11441
0
        fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
11442
11443
0
        for (compno = 0; compno < numcomps; compno++) {
11444
0
            opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
11445
0
            OPJ_UINT32 resno;
11446
0
            OPJ_INT32 bandno, numbands;
11447
11448
            /* coding style*/
11449
0
            fprintf(out_stream, "\t\t comp %d {\n", compno);
11450
0
            fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
11451
0
            fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
11452
0
            fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
11453
0
            fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
11454
0
            fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
11455
0
            fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
11456
11457
0
            fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
11458
0
            for (resno = 0; resno < l_tccp->numresolutions; resno++) {
11459
0
                fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
11460
0
            }
11461
0
            fprintf(out_stream, "\n");
11462
11463
            /* quantization style*/
11464
0
            fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
11465
0
            fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
11466
0
            fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
11467
0
            numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11468
0
                       (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
11469
0
            for (bandno = 0; bandno < numbands; bandno++) {
11470
0
                fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
11471
0
                        l_tccp->stepsizes[bandno].expn);
11472
0
            }
11473
0
            fprintf(out_stream, "\n");
11474
11475
            /* RGN value*/
11476
0
            fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
11477
11478
0
            fprintf(out_stream, "\t\t }\n");
11479
0
        } /*end of component of default tile*/
11480
0
        fprintf(out_stream, "\t }\n"); /*end of default tile*/
11481
0
    }
11482
0
}
11483
11484
void j2k_dump(opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)
11485
0
{
11486
    /* Check if the flag is compatible with j2k file*/
11487
0
    if ((flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)) {
11488
0
        fprintf(out_stream, "Wrong flag\n");
11489
0
        return;
11490
0
    }
11491
11492
    /* Dump the image_header */
11493
0
    if (flag & OPJ_IMG_INFO) {
11494
0
        if (p_j2k->m_private_image) {
11495
0
            j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
11496
0
        }
11497
0
    }
11498
11499
    /* Dump the codestream info from main header */
11500
0
    if (flag & OPJ_J2K_MH_INFO) {
11501
0
        if (p_j2k->m_private_image) {
11502
0
            opj_j2k_dump_MH_info(p_j2k, out_stream);
11503
0
        }
11504
0
    }
11505
    /* Dump all tile/codestream info */
11506
0
    if (flag & OPJ_J2K_TCH_INFO) {
11507
0
        OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
11508
0
        OPJ_UINT32 i;
11509
0
        opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
11510
0
        if (p_j2k->m_private_image) {
11511
0
            for (i = 0; i < l_nb_tiles; ++i) {
11512
0
                opj_j2k_dump_tile_info(l_tcp, (OPJ_INT32)p_j2k->m_private_image->numcomps,
11513
0
                                       out_stream);
11514
0
                ++l_tcp;
11515
0
            }
11516
0
        }
11517
0
    }
11518
11519
    /* Dump the codestream info of the current tile */
11520
0
    if (flag & OPJ_J2K_TH_INFO) {
11521
11522
0
    }
11523
11524
    /* Dump the codestream index from main header */
11525
0
    if (flag & OPJ_J2K_MH_IND) {
11526
0
        opj_j2k_dump_MH_index(p_j2k, out_stream);
11527
0
    }
11528
11529
    /* Dump the codestream index of the current tile */
11530
0
    if (flag & OPJ_J2K_TH_IND) {
11531
11532
0
    }
11533
11534
0
}
11535
11536
static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)
11537
0
{
11538
0
    opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
11539
0
    OPJ_UINT32 it_marker, it_tile, it_tile_part;
11540
11541
0
    fprintf(out_stream, "Codestream index from main header: {\n");
11542
11543
0
    fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
11544
0
            "\t Main header end position=%" PRIi64 "\n",
11545
0
            cstr_index->main_head_start, cstr_index->main_head_end);
11546
11547
0
    fprintf(out_stream, "\t Marker list: {\n");
11548
11549
0
    if (cstr_index->marker) {
11550
0
        for (it_marker = 0; it_marker < cstr_index->marknum ; it_marker++) {
11551
0
            fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
11552
0
                    cstr_index->marker[it_marker].type,
11553
0
                    cstr_index->marker[it_marker].pos,
11554
0
                    cstr_index->marker[it_marker].len);
11555
0
        }
11556
0
    }
11557
11558
0
    fprintf(out_stream, "\t }\n");
11559
11560
0
    if (cstr_index->tile_index) {
11561
11562
        /* Simple test to avoid to write empty information*/
11563
0
        OPJ_UINT32 l_acc_nb_of_tile_part = 0;
11564
0
        for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
11565
0
            l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
11566
11567
            /* To avoid regenerating expected opj_dump results from the test */
11568
            /* suite when there is a TLM marker present */
11569
0
            if (cstr_index->tile_index[it_tile].nb_tps &&
11570
0
                    cstr_index->tile_index[it_tile].tp_index &&
11571
0
                    cstr_index->tile_index[it_tile].tp_index[0].start_pos > 0 &&
11572
0
                    cstr_index->tile_index[it_tile].tp_index[0].end_header == 0 &&
11573
0
                    getenv("OJP_DO_NOT_DISPLAY_TILE_INDEX_IF_TLM") != NULL) {
11574
0
                l_acc_nb_of_tile_part = 0;
11575
0
                break;
11576
0
            }
11577
0
        }
11578
11579
0
        if (l_acc_nb_of_tile_part) {
11580
0
            fprintf(out_stream, "\t Tile index: {\n");
11581
11582
0
            for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
11583
0
                OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
11584
11585
0
                fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile,
11586
0
                        nb_of_tile_part);
11587
11588
0
                if (cstr_index->tile_index[it_tile].tp_index) {
11589
0
                    for (it_tile_part = 0; it_tile_part < nb_of_tile_part; it_tile_part++) {
11590
0
                        fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%"
11591
0
                                PRIi64 ", end_pos=%" PRIi64 ".\n",
11592
0
                                it_tile_part,
11593
0
                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
11594
0
                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
11595
0
                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
11596
0
                    }
11597
0
                }
11598
11599
0
                if (cstr_index->tile_index[it_tile].marker) {
11600
0
                    for (it_marker = 0; it_marker < cstr_index->tile_index[it_tile].marknum ;
11601
0
                            it_marker++) {
11602
0
                        fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
11603
0
                                cstr_index->tile_index[it_tile].marker[it_marker].type,
11604
0
                                cstr_index->tile_index[it_tile].marker[it_marker].pos,
11605
0
                                cstr_index->tile_index[it_tile].marker[it_marker].len);
11606
0
                    }
11607
0
                }
11608
0
            }
11609
0
            fprintf(out_stream, "\t }\n");
11610
0
        }
11611
0
    }
11612
11613
0
    fprintf(out_stream, "}\n");
11614
11615
0
}
11616
11617
11618
static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)
11619
0
{
11620
11621
0
    fprintf(out_stream, "Codestream info from main header: {\n");
11622
11623
0
    fprintf(out_stream, "\t tx0=%" PRIu32 ", ty0=%" PRIu32 "\n", p_j2k->m_cp.tx0,
11624
0
            p_j2k->m_cp.ty0);
11625
0
    fprintf(out_stream, "\t tdx=%" PRIu32 ", tdy=%" PRIu32 "\n", p_j2k->m_cp.tdx,
11626
0
            p_j2k->m_cp.tdy);
11627
0
    fprintf(out_stream, "\t tw=%" PRIu32 ", th=%" PRIu32 "\n", p_j2k->m_cp.tw,
11628
0
            p_j2k->m_cp.th);
11629
0
    opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,
11630
0
                           (OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
11631
0
    fprintf(out_stream, "}\n");
11632
0
}
11633
11634
void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag,
11635
                           FILE* out_stream)
11636
0
{
11637
0
    char tab[2];
11638
11639
0
    if (dev_dump_flag) {
11640
0
        fprintf(stdout, "[DEV] Dump an image_header struct {\n");
11641
0
        tab[0] = '\0';
11642
0
    } else {
11643
0
        fprintf(out_stream, "Image info {\n");
11644
0
        tab[0] = '\t';
11645
0
        tab[1] = '\0';
11646
0
    }
11647
11648
0
    fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
11649
0
    fprintf(out_stream,     "%s x1=%d, y1=%d\n", tab, img_header->x1,
11650
0
            img_header->y1);
11651
0
    fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
11652
11653
0
    if (img_header->comps) {
11654
0
        OPJ_UINT32 compno;
11655
0
        for (compno = 0; compno < img_header->numcomps; compno++) {
11656
0
            fprintf(out_stream, "%s\t component %d {\n", tab, compno);
11657
0
            j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag,
11658
0
                                       out_stream);
11659
0
            fprintf(out_stream, "%s}\n", tab);
11660
0
        }
11661
0
    }
11662
11663
0
    fprintf(out_stream, "}\n");
11664
0
}
11665
11666
void j2k_dump_image_comp_header(opj_image_comp_t* comp_header,
11667
                                OPJ_BOOL dev_dump_flag, FILE* out_stream)
11668
0
{
11669
0
    char tab[3];
11670
11671
0
    if (dev_dump_flag) {
11672
0
        fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
11673
0
        tab[0] = '\0';
11674
0
    }       else {
11675
0
        tab[0] = '\t';
11676
0
        tab[1] = '\t';
11677
0
        tab[2] = '\0';
11678
0
    }
11679
11680
0
    fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
11681
0
    fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
11682
0
    fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
11683
11684
0
    if (dev_dump_flag) {
11685
0
        fprintf(out_stream, "}\n");
11686
0
    }
11687
0
}
11688
11689
opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k)
11690
0
{
11691
0
    OPJ_UINT32 compno;
11692
0
    OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
11693
0
    opj_tcp_t *l_default_tile;
11694
0
    opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,
11695
0
                                          sizeof(opj_codestream_info_v2_t));
11696
0
    if (!cstr_info) {
11697
0
        return NULL;
11698
0
    }
11699
11700
0
    cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
11701
11702
0
    cstr_info->tx0 = p_j2k->m_cp.tx0;
11703
0
    cstr_info->ty0 = p_j2k->m_cp.ty0;
11704
0
    cstr_info->tdx = p_j2k->m_cp.tdx;
11705
0
    cstr_info->tdy = p_j2k->m_cp.tdy;
11706
0
    cstr_info->tw = p_j2k->m_cp.tw;
11707
0
    cstr_info->th = p_j2k->m_cp.th;
11708
11709
0
    cstr_info->tile_info = NULL; /* Not fill from the main header*/
11710
11711
0
    l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
11712
11713
0
    cstr_info->m_default_tile_info.csty = l_default_tile->csty;
11714
0
    cstr_info->m_default_tile_info.prg = l_default_tile->prg;
11715
0
    cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
11716
0
    cstr_info->m_default_tile_info.mct = l_default_tile->mct;
11717
11718
0
    cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(
11719
0
                cstr_info->nbcomps, sizeof(opj_tccp_info_t));
11720
0
    if (!cstr_info->m_default_tile_info.tccp_info) {
11721
0
        opj_destroy_cstr_info(&cstr_info);
11722
0
        return NULL;
11723
0
    }
11724
11725
0
    for (compno = 0; compno < numcomps; compno++) {
11726
0
        opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
11727
0
        opj_tccp_info_t *l_tccp_info = &
11728
0
                                       (cstr_info->m_default_tile_info.tccp_info[compno]);
11729
0
        OPJ_INT32 bandno, numbands;
11730
11731
        /* coding style*/
11732
0
        l_tccp_info->csty = l_tccp->csty;
11733
0
        l_tccp_info->numresolutions = l_tccp->numresolutions;
11734
0
        l_tccp_info->cblkw = l_tccp->cblkw;
11735
0
        l_tccp_info->cblkh = l_tccp->cblkh;
11736
0
        l_tccp_info->cblksty = l_tccp->cblksty;
11737
0
        l_tccp_info->qmfbid = l_tccp->qmfbid;
11738
0
        if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS) {
11739
0
            memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
11740
0
            memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
11741
0
        }
11742
11743
        /* quantization style*/
11744
0
        l_tccp_info->qntsty = l_tccp->qntsty;
11745
0
        l_tccp_info->numgbits = l_tccp->numgbits;
11746
11747
0
        numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11748
0
                   (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
11749
0
        if (numbands < OPJ_J2K_MAXBANDS) {
11750
0
            for (bandno = 0; bandno < numbands; bandno++) {
11751
0
                l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)
11752
0
                                                      l_tccp->stepsizes[bandno].mant;
11753
0
                l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)
11754
0
                                                      l_tccp->stepsizes[bandno].expn;
11755
0
            }
11756
0
        }
11757
11758
        /* RGN value*/
11759
0
        l_tccp_info->roishift = l_tccp->roishift;
11760
0
    }
11761
11762
0
    return cstr_info;
11763
0
}
11764
11765
opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k)
11766
0
{
11767
0
    opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
11768
0
                                           opj_calloc(1, sizeof(opj_codestream_index_t));
11769
0
    if (!l_cstr_index) {
11770
0
        return NULL;
11771
0
    }
11772
11773
0
    l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
11774
0
    l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
11775
0
    l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
11776
11777
0
    l_cstr_index->marknum = p_j2k->cstr_index->marknum;
11778
0
    l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum *
11779
0
                           sizeof(opj_marker_info_t));
11780
0
    if (!l_cstr_index->marker) {
11781
0
        opj_free(l_cstr_index);
11782
0
        return NULL;
11783
0
    }
11784
11785
0
    if (p_j2k->cstr_index->marker) {
11786
0
        memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker,
11787
0
               l_cstr_index->marknum * sizeof(opj_marker_info_t));
11788
0
    } else {
11789
0
        opj_free(l_cstr_index->marker);
11790
0
        l_cstr_index->marker = NULL;
11791
0
    }
11792
11793
0
    l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
11794
0
    l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
11795
0
                                   l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
11796
0
    if (!l_cstr_index->tile_index) {
11797
0
        opj_free(l_cstr_index->marker);
11798
0
        opj_free(l_cstr_index);
11799
0
        return NULL;
11800
0
    }
11801
11802
0
    if (!p_j2k->cstr_index->tile_index) {
11803
0
        opj_free(l_cstr_index->tile_index);
11804
0
        l_cstr_index->tile_index = NULL;
11805
0
    } else {
11806
0
        OPJ_UINT32 it_tile = 0;
11807
0
        for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++) {
11808
11809
            /* Tile Marker*/
11810
0
            l_cstr_index->tile_index[it_tile].marknum =
11811
0
                p_j2k->cstr_index->tile_index[it_tile].marknum;
11812
11813
0
            l_cstr_index->tile_index[it_tile].marker =
11814
0
                (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum *
11815
0
                                               sizeof(opj_marker_info_t));
11816
11817
0
            if (!l_cstr_index->tile_index[it_tile].marker) {
11818
0
                OPJ_UINT32 it_tile_free;
11819
11820
0
                for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
11821
0
                    opj_free(l_cstr_index->tile_index[it_tile_free].marker);
11822
0
                }
11823
11824
0
                opj_free(l_cstr_index->tile_index);
11825
0
                opj_free(l_cstr_index->marker);
11826
0
                opj_free(l_cstr_index);
11827
0
                return NULL;
11828
0
            }
11829
11830
0
            if (p_j2k->cstr_index->tile_index[it_tile].marker)
11831
0
                memcpy(l_cstr_index->tile_index[it_tile].marker,
11832
0
                       p_j2k->cstr_index->tile_index[it_tile].marker,
11833
0
                       l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t));
11834
0
            else {
11835
0
                opj_free(l_cstr_index->tile_index[it_tile].marker);
11836
0
                l_cstr_index->tile_index[it_tile].marker = NULL;
11837
0
            }
11838
11839
            /* Tile part index*/
11840
0
            l_cstr_index->tile_index[it_tile].nb_tps =
11841
0
                p_j2k->cstr_index->tile_index[it_tile].nb_tps;
11842
11843
0
            l_cstr_index->tile_index[it_tile].tp_index =
11844
0
                (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps * sizeof(
11845
0
                                                opj_tp_index_t));
11846
11847
0
            if (!l_cstr_index->tile_index[it_tile].tp_index) {
11848
0
                OPJ_UINT32 it_tile_free;
11849
11850
0
                for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
11851
0
                    opj_free(l_cstr_index->tile_index[it_tile_free].marker);
11852
0
                    opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
11853
0
                }
11854
11855
0
                opj_free(l_cstr_index->tile_index);
11856
0
                opj_free(l_cstr_index->marker);
11857
0
                opj_free(l_cstr_index);
11858
0
                return NULL;
11859
0
            }
11860
11861
0
            if (p_j2k->cstr_index->tile_index[it_tile].tp_index) {
11862
0
                memcpy(l_cstr_index->tile_index[it_tile].tp_index,
11863
0
                       p_j2k->cstr_index->tile_index[it_tile].tp_index,
11864
0
                       l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t));
11865
0
            } else {
11866
0
                opj_free(l_cstr_index->tile_index[it_tile].tp_index);
11867
0
                l_cstr_index->tile_index[it_tile].tp_index = NULL;
11868
0
            }
11869
11870
            /* Packet index (NOT USED)*/
11871
0
            l_cstr_index->tile_index[it_tile].nb_packet = 0;
11872
0
            l_cstr_index->tile_index[it_tile].packet_index = NULL;
11873
11874
0
        }
11875
0
    }
11876
11877
0
    return l_cstr_index;
11878
0
}
11879
11880
static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
11881
0
{
11882
0
    OPJ_UINT32 it_tile = 0;
11883
11884
0
    p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
11885
0
    p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
11886
0
                                        p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
11887
0
    if (!p_j2k->cstr_index->tile_index) {
11888
0
        return OPJ_FALSE;
11889
0
    }
11890
11891
0
    for (it_tile = 0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++) {
11892
0
        p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
11893
0
        p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
11894
0
        p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
11895
0
                opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum,
11896
0
                           sizeof(opj_marker_info_t));
11897
0
        if (!p_j2k->cstr_index->tile_index[it_tile].marker) {
11898
0
            return OPJ_FALSE;
11899
0
        }
11900
0
    }
11901
11902
0
    return OPJ_TRUE;
11903
0
}
11904
11905
static OPJ_BOOL opj_j2k_are_all_used_components_decoded(opj_j2k_t *p_j2k,
11906
        opj_event_mgr_t * p_manager)
11907
0
{
11908
0
    OPJ_UINT32 compno;
11909
0
    OPJ_BOOL decoded_all_used_components = OPJ_TRUE;
11910
11911
0
    if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode) {
11912
0
        for (compno = 0;
11913
0
                compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
11914
0
            OPJ_UINT32 dec_compno =
11915
0
                p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
11916
0
            if (p_j2k->m_output_image->comps[dec_compno].data == NULL) {
11917
0
                opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
11918
0
                              dec_compno);
11919
0
                decoded_all_used_components = OPJ_FALSE;
11920
0
            }
11921
0
        }
11922
0
    } else {
11923
0
        for (compno = 0; compno < p_j2k->m_output_image->numcomps; compno++) {
11924
0
            if (p_j2k->m_output_image->comps[compno].data == NULL) {
11925
0
                opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
11926
0
                              compno);
11927
0
                decoded_all_used_components = OPJ_FALSE;
11928
0
            }
11929
0
        }
11930
0
    }
11931
11932
0
    if (decoded_all_used_components == OPJ_FALSE) {
11933
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode all used components\n");
11934
0
        return OPJ_FALSE;
11935
0
    }
11936
11937
0
    return OPJ_TRUE;
11938
0
}
11939
11940
static int CompareOffT(const void* a, const void* b)
11941
0
{
11942
0
    const OPJ_OFF_T offA = *(const OPJ_OFF_T*)a;
11943
0
    const OPJ_OFF_T offB = *(const OPJ_OFF_T*)b;
11944
0
    if (offA < offB) {
11945
0
        return -1;
11946
0
    }
11947
0
    if (offA == offB) {
11948
0
        return 0;
11949
0
    }
11950
0
    return 1;
11951
0
}
11952
11953
static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
11954
                                     opj_stream_private_t *p_stream,
11955
                                     opj_event_mgr_t * p_manager)
11956
0
{
11957
0
    OPJ_BOOL l_go_on = OPJ_TRUE;
11958
0
    OPJ_UINT32 l_current_tile_no;
11959
0
    OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
11960
0
    OPJ_UINT32 l_nb_comps;
11961
0
    OPJ_UINT32 nr_tiles = 0;
11962
0
    OPJ_OFF_T end_pos = 0;
11963
11964
    /* Particular case for whole single tile decoding */
11965
    /* We can avoid allocating intermediate tile buffers */
11966
0
    if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
11967
0
            p_j2k->m_cp.tx0 == 0 && p_j2k->m_cp.ty0 == 0 &&
11968
0
            p_j2k->m_output_image->x0 == 0 &&
11969
0
            p_j2k->m_output_image->y0 == 0 &&
11970
0
            p_j2k->m_output_image->x1 == p_j2k->m_cp.tdx &&
11971
0
            p_j2k->m_output_image->y1 == p_j2k->m_cp.tdy) {
11972
0
        OPJ_UINT32 i;
11973
0
        if (! opj_j2k_read_tile_header(p_j2k,
11974
0
                                       &l_current_tile_no,
11975
0
                                       NULL,
11976
0
                                       &l_tile_x0, &l_tile_y0,
11977
0
                                       &l_tile_x1, &l_tile_y1,
11978
0
                                       &l_nb_comps,
11979
0
                                       &l_go_on,
11980
0
                                       p_stream,
11981
0
                                       p_manager)) {
11982
0
            return OPJ_FALSE;
11983
0
        }
11984
11985
0
        if (!l_go_on ||
11986
0
                ! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
11987
0
                                      p_stream, p_manager)) {
11988
0
            opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile 1/1\n");
11989
0
            return OPJ_FALSE;
11990
0
        }
11991
11992
        /* Transfer TCD data to output image data */
11993
0
        for (i = 0; i < p_j2k->m_output_image->numcomps; i++) {
11994
0
            opj_image_data_free(p_j2k->m_output_image->comps[i].data);
11995
0
            p_j2k->m_output_image->comps[i].data =
11996
0
                p_j2k->m_tcd->tcd_image->tiles->comps[i].data;
11997
0
            p_j2k->m_output_image->comps[i].resno_decoded =
11998
0
                p_j2k->m_tcd->image->comps[i].resno_decoded;
11999
0
            p_j2k->m_tcd->tcd_image->tiles->comps[i].data = NULL;
12000
0
        }
12001
12002
0
        return OPJ_TRUE;
12003
0
    }
12004
12005
0
    p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts = 0;
12006
0
    p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts = 0;
12007
0
    opj_free(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset);
12008
0
    p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset = NULL;
12009
12010
    /* If the area to decode only intersects a subset of tiles, and we have
12011
     * valid TLM information, then use it to plan the tilepart offsets to
12012
     * seek to.
12013
     */
12014
0
    if (!(p_j2k->m_specific_param.m_decoder.m_start_tile_x == 0 &&
12015
0
            p_j2k->m_specific_param.m_decoder.m_start_tile_y == 0 &&
12016
0
            p_j2k->m_specific_param.m_decoder.m_end_tile_x == p_j2k->m_cp.tw &&
12017
0
            p_j2k->m_specific_param.m_decoder.m_end_tile_y == p_j2k->m_cp.th) &&
12018
0
            !p_j2k->m_specific_param.m_decoder.m_tlm.m_is_invalid &&
12019
0
            opj_stream_has_seek(p_stream)) {
12020
0
        OPJ_UINT32 m_num_intersecting_tile_parts = 0;
12021
12022
0
        OPJ_UINT32 j;
12023
0
        for (j = 0; j < p_j2k->m_cp.tw * p_j2k->m_cp.th; ++j) {
12024
0
            if (p_j2k->cstr_index->tile_index[j].nb_tps > 0 &&
12025
0
                    p_j2k->cstr_index->tile_index[j].tp_index[
12026
0
                        p_j2k->cstr_index->tile_index[j].nb_tps - 1].end_pos > end_pos) {
12027
0
                end_pos = p_j2k->cstr_index->tile_index[j].tp_index[
12028
0
                              p_j2k->cstr_index->tile_index[j].nb_tps - 1].end_pos;
12029
0
            }
12030
0
        }
12031
12032
0
        for (j = p_j2k->m_specific_param.m_decoder.m_start_tile_y;
12033
0
                j < p_j2k->m_specific_param.m_decoder.m_end_tile_y; ++j) {
12034
0
            OPJ_UINT32 i;
12035
0
            for (i = p_j2k->m_specific_param.m_decoder.m_start_tile_x;
12036
0
                    i < p_j2k->m_specific_param.m_decoder.m_end_tile_x; ++i) {
12037
0
                const OPJ_UINT32 tile_number = j * p_j2k->m_cp.tw + i;
12038
0
                m_num_intersecting_tile_parts +=
12039
0
                    p_j2k->cstr_index->tile_index[tile_number].nb_tps;
12040
0
            }
12041
0
        }
12042
12043
0
        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset =
12044
0
            (OPJ_OFF_T*)
12045
0
            opj_malloc(m_num_intersecting_tile_parts * sizeof(OPJ_OFF_T));
12046
0
        if (m_num_intersecting_tile_parts > 0 &&
12047
0
                p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset) {
12048
0
            OPJ_UINT32 idx = 0;
12049
0
            for (j = p_j2k->m_specific_param.m_decoder.m_start_tile_y;
12050
0
                    j < p_j2k->m_specific_param.m_decoder.m_end_tile_y; ++j) {
12051
0
                OPJ_UINT32 i;
12052
0
                for (i = p_j2k->m_specific_param.m_decoder.m_start_tile_x;
12053
0
                        i < p_j2k->m_specific_param.m_decoder.m_end_tile_x; ++i) {
12054
0
                    const OPJ_UINT32 tile_number = j * p_j2k->m_cp.tw + i;
12055
0
                    OPJ_UINT32 k;
12056
0
                    for (k = 0; k < p_j2k->cstr_index->tile_index[tile_number].nb_tps; ++k) {
12057
0
                        const OPJ_OFF_T next_tp_sot_pos =
12058
0
                            p_j2k->cstr_index->tile_index[tile_number].tp_index[k].start_pos;
12059
0
                        p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset[idx] =
12060
0
                            next_tp_sot_pos;
12061
0
                        ++idx;
12062
0
                    }
12063
0
                }
12064
0
            }
12065
12066
0
            p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts = idx;
12067
12068
            /* Sort by increasing offset */
12069
0
            qsort(p_j2k->m_specific_param.m_decoder.m_intersecting_tile_parts_offset,
12070
0
                  p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts,
12071
0
                  sizeof(OPJ_OFF_T),
12072
0
                  CompareOffT);
12073
0
        }
12074
0
    }
12075
12076
0
    for (;;) {
12077
0
        if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
12078
0
                p_j2k->m_cp.tcps[0].m_data != NULL) {
12079
0
            l_current_tile_no = 0;
12080
0
            p_j2k->m_current_tile_number = 0;
12081
0
            p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
12082
0
        } else {
12083
0
            if (! opj_j2k_read_tile_header(p_j2k,
12084
0
                                           &l_current_tile_no,
12085
0
                                           NULL,
12086
0
                                           &l_tile_x0, &l_tile_y0,
12087
0
                                           &l_tile_x1, &l_tile_y1,
12088
0
                                           &l_nb_comps,
12089
0
                                           &l_go_on,
12090
0
                                           p_stream,
12091
0
                                           p_manager)) {
12092
0
                return OPJ_FALSE;
12093
0
            }
12094
12095
0
            if (! l_go_on) {
12096
0
                break;
12097
0
            }
12098
0
        }
12099
12100
0
        if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
12101
0
                                  p_stream, p_manager)) {
12102
0
            opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n",
12103
0
                          l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
12104
0
            return OPJ_FALSE;
12105
0
        }
12106
12107
0
        opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
12108
0
                      l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
12109
12110
0
        if (! opj_j2k_update_image_data(p_j2k->m_tcd,
12111
0
                                        p_j2k->m_output_image)) {
12112
0
            return OPJ_FALSE;
12113
0
        }
12114
12115
0
        if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
12116
0
                !(p_j2k->m_output_image->x0 == p_j2k->m_private_image->x0 &&
12117
0
                  p_j2k->m_output_image->y0 == p_j2k->m_private_image->y0 &&
12118
0
                  p_j2k->m_output_image->x1 == p_j2k->m_private_image->x1 &&
12119
0
                  p_j2k->m_output_image->y1 == p_j2k->m_private_image->y1)) {
12120
            /* Keep current tcp data */
12121
0
        } else {
12122
0
            opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
12123
0
        }
12124
12125
0
        opj_event_msg(p_manager, EVT_INFO,
12126
0
                      "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
12127
12128
0
        if (opj_stream_get_number_byte_left(p_stream) == 0
12129
0
                && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
12130
0
            break;
12131
0
        }
12132
0
        if (++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) {
12133
0
            break;
12134
0
        }
12135
0
        if (p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts > 0 &&
12136
0
                p_j2k->m_specific_param.m_decoder.m_idx_intersecting_tile_parts ==
12137
0
                p_j2k->m_specific_param.m_decoder.m_num_intersecting_tile_parts) {
12138
0
            opj_stream_seek(p_stream, end_pos + 2, p_manager);
12139
0
            break;
12140
0
        }
12141
0
    }
12142
12143
0
    if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
12144
0
        return OPJ_FALSE;
12145
0
    }
12146
12147
0
    return OPJ_TRUE;
12148
0
}
12149
12150
/**
12151
 * Sets up the procedures to do on decoding data. Developers wanting to extend the library can add their own reading procedures.
12152
 */
12153
static OPJ_BOOL opj_j2k_setup_decoding(opj_j2k_t *p_j2k,
12154
                                       opj_event_mgr_t * p_manager)
12155
0
{
12156
    /* preconditions*/
12157
0
    assert(p_j2k != 00);
12158
0
    assert(p_manager != 00);
12159
12160
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12161
0
                                           (opj_procedure)opj_j2k_decode_tiles, p_manager)) {
12162
0
        return OPJ_FALSE;
12163
0
    }
12164
    /* DEVELOPER CORNER, add your custom procedures */
12165
12166
0
    return OPJ_TRUE;
12167
0
}
12168
12169
/*
12170
 * Read and decode one tile.
12171
 */
12172
static OPJ_BOOL opj_j2k_decode_one_tile(opj_j2k_t *p_j2k,
12173
                                        opj_stream_private_t *p_stream,
12174
                                        opj_event_mgr_t * p_manager)
12175
0
{
12176
0
    OPJ_BOOL l_go_on = OPJ_TRUE;
12177
0
    OPJ_UINT32 l_current_tile_no;
12178
0
    OPJ_UINT32 l_tile_no_to_dec;
12179
0
    OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
12180
0
    OPJ_UINT32 l_nb_comps;
12181
0
    OPJ_UINT32 l_nb_tiles;
12182
0
    OPJ_UINT32 i;
12183
12184
    /* Move into the codestream to the first SOT used to decode the desired tile */
12185
0
    l_tile_no_to_dec = (OPJ_UINT32)
12186
0
                       p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
12187
0
    if (p_j2k->cstr_index->tile_index)
12188
0
        if (p_j2k->cstr_index->tile_index->tp_index) {
12189
0
            if (! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
12190
                /* The index for this tile has not been built. This happens */
12191
                /* when the tile's tile-parts are interleaved with other */
12192
                /* tiles' tile-parts and the number of tile-parts (TNsot) was */
12193
                /* only declared in a tile-part not reached while decoding a */
12194
                /* previous tile. In that case we cannot rely on the recorded */
12195
                /* SOT positions, nor on m_last_sot_read_pos (which may point */
12196
                /* past the first tile-part of the requested tile), so seek */
12197
                /* back to the start of the codestream and read the tile-part */
12198
                /* headers in order. See issue #1558. */
12199
0
                if (!(opj_stream_read_seek(p_stream,
12200
0
                                           p_j2k->cstr_index->main_head_end + 2, p_manager))) {
12201
0
                    opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
12202
0
                    return OPJ_FALSE;
12203
0
                }
12204
0
            } else {
12205
0
                OPJ_OFF_T sot_pos =
12206
0
                    p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos;
12207
0
                OPJ_UINT32 l_marker;
12208
12209
#if 0
12210
                opj_event_msg(p_manager, EVT_INFO,
12211
                              "opj_j2k_decode_one_tile(%u): seek to %" PRId64 "\n",
12212
                              l_tile_no_to_dec,
12213
                              sot_pos);
12214
#endif
12215
0
                if (!(opj_stream_read_seek(p_stream,
12216
0
                                           sot_pos,
12217
0
                                           p_manager))) {
12218
0
                    opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
12219
0
                    return OPJ_FALSE;
12220
0
                }
12221
12222
                /* Try to read 2 bytes (the marker ID) from stream and copy them into the buffer */
12223
0
                if (opj_stream_read_data(p_stream,
12224
0
                                         p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
12225
0
                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
12226
0
                    return OPJ_FALSE;
12227
0
                }
12228
12229
                /* Read 2 bytes from the buffer as the marker ID */
12230
0
                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker,
12231
0
                               2);
12232
12233
0
                if (l_marker != J2K_MS_SOT) {
12234
0
                    opj_event_msg(p_manager, EVT_ERROR, "Did not get expected SOT marker\n");
12235
0
                    return OPJ_FALSE;
12236
0
                }
12237
0
            }
12238
            /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
12239
0
            if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
12240
0
                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
12241
0
            }
12242
0
        }
12243
12244
    /* Reset current tile part number for all tiles, and not only the one */
12245
    /* of interest. */
12246
    /* Not completely sure this is always correct but required for */
12247
    /* ./build/bin/j2k_random_tile_access ./build/tests/tte1.j2k */
12248
0
    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
12249
0
    for (i = 0; i < l_nb_tiles; ++i) {
12250
0
        p_j2k->m_cp.tcps[i].m_current_tile_part_number = -1;
12251
0
    }
12252
12253
0
    for (;;) {
12254
0
        if (! opj_j2k_read_tile_header(p_j2k,
12255
0
                                       &l_current_tile_no,
12256
0
                                       NULL,
12257
0
                                       &l_tile_x0, &l_tile_y0,
12258
0
                                       &l_tile_x1, &l_tile_y1,
12259
0
                                       &l_nb_comps,
12260
0
                                       &l_go_on,
12261
0
                                       p_stream,
12262
0
                                       p_manager)) {
12263
0
            return OPJ_FALSE;
12264
0
        }
12265
12266
0
        if (! l_go_on) {
12267
0
            break;
12268
0
        }
12269
12270
0
        if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
12271
0
                                  p_stream, p_manager)) {
12272
0
            return OPJ_FALSE;
12273
0
        }
12274
0
        opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
12275
0
                      l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
12276
12277
0
        if (! opj_j2k_update_image_data(p_j2k->m_tcd,
12278
0
                                        p_j2k->m_output_image)) {
12279
0
            return OPJ_FALSE;
12280
0
        }
12281
0
        opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
12282
12283
0
        opj_event_msg(p_manager, EVT_INFO,
12284
0
                      "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
12285
12286
0
        if (l_current_tile_no == l_tile_no_to_dec) {
12287
            /* move into the codestream to the first SOT (FIXME or not move?)*/
12288
0
            if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2,
12289
0
                                       p_manager))) {
12290
0
                opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
12291
0
                return OPJ_FALSE;
12292
0
            }
12293
0
            break;
12294
0
        } else {
12295
0
            opj_event_msg(p_manager, EVT_WARNING,
12296
0
                          "Tile read, decoded and updated is not the desired one (%d vs %d).\n",
12297
0
                          l_current_tile_no + 1, l_tile_no_to_dec + 1);
12298
0
        }
12299
12300
0
    }
12301
12302
0
    if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
12303
0
        return OPJ_FALSE;
12304
0
    }
12305
12306
0
    return OPJ_TRUE;
12307
0
}
12308
12309
/**
12310
 * Sets up the procedures to do on decoding one tile. Developers wanting to extend the library can add their own reading procedures.
12311
 */
12312
static OPJ_BOOL opj_j2k_setup_decoding_tile(opj_j2k_t *p_j2k,
12313
        opj_event_mgr_t * p_manager)
12314
0
{
12315
    /* preconditions*/
12316
0
    assert(p_j2k != 00);
12317
0
    assert(p_manager != 00);
12318
12319
0
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12320
0
                                           (opj_procedure)opj_j2k_decode_one_tile, p_manager)) {
12321
0
        return OPJ_FALSE;
12322
0
    }
12323
    /* DEVELOPER CORNER, add your custom procedures */
12324
12325
0
    return OPJ_TRUE;
12326
0
}
12327
12328
static OPJ_BOOL opj_j2k_move_data_from_codec_to_output_image(opj_j2k_t * p_j2k,
12329
        opj_image_t * p_image)
12330
0
{
12331
0
    OPJ_UINT32 compno;
12332
12333
    /* Move data and copy one information from codec to output image*/
12334
0
    if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode > 0) {
12335
0
        opj_image_comp_t* newcomps =
12336
0
            (opj_image_comp_t*) opj_malloc(
12337
0
                p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode *
12338
0
                sizeof(opj_image_comp_t));
12339
0
        if (newcomps == NULL) {
12340
0
            opj_image_destroy(p_j2k->m_private_image);
12341
0
            p_j2k->m_private_image = NULL;
12342
0
            return OPJ_FALSE;
12343
0
        }
12344
0
        for (compno = 0; compno < p_image->numcomps; compno++) {
12345
0
            opj_image_data_free(p_image->comps[compno].data);
12346
0
            p_image->comps[compno].data = NULL;
12347
0
        }
12348
0
        for (compno = 0;
12349
0
                compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
12350
0
            OPJ_UINT32 src_compno =
12351
0
                p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
12352
0
            memcpy(&(newcomps[compno]),
12353
0
                   &(p_j2k->m_output_image->comps[src_compno]),
12354
0
                   sizeof(opj_image_comp_t));
12355
0
            newcomps[compno].resno_decoded =
12356
0
                p_j2k->m_output_image->comps[src_compno].resno_decoded;
12357
0
            newcomps[compno].data = p_j2k->m_output_image->comps[src_compno].data;
12358
0
            p_j2k->m_output_image->comps[src_compno].data = NULL;
12359
0
        }
12360
0
        for (compno = 0; compno < p_image->numcomps; compno++) {
12361
0
            assert(p_j2k->m_output_image->comps[compno].data == NULL);
12362
0
            opj_image_data_free(p_j2k->m_output_image->comps[compno].data);
12363
0
            p_j2k->m_output_image->comps[compno].data = NULL;
12364
0
        }
12365
0
        p_image->numcomps = p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode;
12366
0
        opj_free(p_image->comps);
12367
0
        p_image->comps = newcomps;
12368
0
    } else {
12369
0
        for (compno = 0; compno < p_image->numcomps; compno++) {
12370
0
            p_image->comps[compno].resno_decoded =
12371
0
                p_j2k->m_output_image->comps[compno].resno_decoded;
12372
0
            opj_image_data_free(p_image->comps[compno].data);
12373
0
            p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
12374
#if 0
12375
            char fn[256];
12376
            snprintf(fn, sizeof fn, "/tmp/%d.raw", compno);
12377
            FILE *debug = fopen(fn, "wb");
12378
            fwrite(p_image->comps[compno].data, sizeof(OPJ_INT32),
12379
                   p_image->comps[compno].w * p_image->comps[compno].h, debug);
12380
            fclose(debug);
12381
#endif
12382
0
            p_j2k->m_output_image->comps[compno].data = NULL;
12383
0
        }
12384
0
    }
12385
0
    return OPJ_TRUE;
12386
0
}
12387
12388
OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k,
12389
                        opj_stream_private_t * p_stream,
12390
                        opj_image_t * p_image,
12391
                        opj_event_mgr_t * p_manager)
12392
0
{
12393
0
    if (!p_image) {
12394
0
        return OPJ_FALSE;
12395
0
    }
12396
12397
    /* Heuristics to detect sequence opj_read_header(), opj_set_decoded_resolution_factor() */
12398
    /* and finally opj_decode_image() without manual setting of comps[].factor */
12399
    /* We could potentially always execute it, if we don't allow people to do */
12400
    /* opj_read_header(), modify x0,y0,x1,y1 of returned image an call opj_decode_image() */
12401
0
    if (p_j2k->m_cp.m_specific_param.m_dec.m_reduce > 0 &&
12402
0
            p_j2k->m_private_image != NULL &&
12403
0
            p_j2k->m_private_image->numcomps > 0 &&
12404
0
            p_j2k->m_private_image->comps[0].factor ==
12405
0
            p_j2k->m_cp.m_specific_param.m_dec.m_reduce &&
12406
0
            p_image->numcomps > 0 &&
12407
0
            p_image->comps[0].factor == 0 &&
12408
            /* Don't mess with image dimension if the user has allocated it */
12409
0
            p_image->comps[0].data == NULL) {
12410
0
        OPJ_UINT32 it_comp;
12411
12412
        /* Update the comps[].factor member of the output image with the one */
12413
        /* of m_reduce */
12414
0
        for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
12415
0
            p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
12416
0
        }
12417
0
        if (!opj_j2k_update_image_dimensions(p_image, p_manager)) {
12418
0
            return OPJ_FALSE;
12419
0
        }
12420
0
    }
12421
12422
0
    if (p_j2k->m_output_image == NULL) {
12423
0
        p_j2k->m_output_image = opj_image_create0();
12424
0
        if (!(p_j2k->m_output_image)) {
12425
0
            return OPJ_FALSE;
12426
0
        }
12427
0
    }
12428
0
    opj_copy_image_header(p_image, p_j2k->m_output_image);
12429
12430
    /* customization of the decoding */
12431
0
    if (!opj_j2k_setup_decoding(p_j2k, p_manager)) {
12432
0
        return OPJ_FALSE;
12433
0
    }
12434
12435
    /* Decode the codestream */
12436
0
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12437
0
        opj_image_destroy(p_j2k->m_private_image);
12438
0
        p_j2k->m_private_image = NULL;
12439
0
        return OPJ_FALSE;
12440
0
    }
12441
12442
    /* Move data and copy one information from codec to output image*/
12443
0
    return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
12444
0
}
12445
12446
OPJ_BOOL opj_j2k_get_tile(opj_j2k_t *p_j2k,
12447
                          opj_stream_private_t *p_stream,
12448
                          opj_image_t* p_image,
12449
                          opj_event_mgr_t * p_manager,
12450
                          OPJ_UINT32 tile_index)
12451
0
{
12452
0
    OPJ_UINT32 compno;
12453
0
    OPJ_UINT32 l_tile_x, l_tile_y;
12454
0
    opj_image_comp_t* l_img_comp;
12455
12456
0
    if (!p_image) {
12457
0
        opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
12458
0
        return OPJ_FALSE;
12459
0
    }
12460
12461
0
    if (p_image->numcomps < p_j2k->m_private_image->numcomps) {
12462
0
        opj_event_msg(p_manager, EVT_ERROR,
12463
0
                      "Image has less components than codestream.\n");
12464
0
        return OPJ_FALSE;
12465
0
    }
12466
12467
0
    if (/*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th)) {
12468
0
        opj_event_msg(p_manager, EVT_ERROR,
12469
0
                      "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index,
12470
0
                      (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
12471
0
        return OPJ_FALSE;
12472
0
    }
12473
12474
    /* Compute the dimension of the desired tile*/
12475
0
    l_tile_x = tile_index % p_j2k->m_cp.tw;
12476
0
    l_tile_y = tile_index / p_j2k->m_cp.tw;
12477
12478
0
    p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
12479
0
    if (p_image->x0 < p_j2k->m_private_image->x0) {
12480
0
        p_image->x0 = p_j2k->m_private_image->x0;
12481
0
    }
12482
0
    p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
12483
0
    if (p_image->x1 > p_j2k->m_private_image->x1) {
12484
0
        p_image->x1 = p_j2k->m_private_image->x1;
12485
0
    }
12486
12487
0
    p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
12488
0
    if (p_image->y0 < p_j2k->m_private_image->y0) {
12489
0
        p_image->y0 = p_j2k->m_private_image->y0;
12490
0
    }
12491
0
    p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
12492
0
    if (p_image->y1 > p_j2k->m_private_image->y1) {
12493
0
        p_image->y1 = p_j2k->m_private_image->y1;
12494
0
    }
12495
12496
0
    l_img_comp = p_image->comps;
12497
0
    for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) {
12498
0
        OPJ_INT32 l_comp_x1, l_comp_y1;
12499
12500
0
        l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
12501
12502
0
        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
12503
0
        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
12504
0
        l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
12505
0
        l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
12506
12507
0
        l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1,
12508
0
                                     (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0,
12509
0
                                             (OPJ_INT32)l_img_comp->factor));
12510
0
        l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1,
12511
0
                                     (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0,
12512
0
                                             (OPJ_INT32)l_img_comp->factor));
12513
12514
0
        l_img_comp++;
12515
0
    }
12516
12517
0
    if (p_image->numcomps > p_j2k->m_private_image->numcomps) {
12518
        /* Can happen when calling repeatdly opj_get_decoded_tile() on an
12519
         * image with a color palette, where color palette expansion is done
12520
         * later in jp2.c */
12521
0
        for (compno = p_j2k->m_private_image->numcomps; compno < p_image->numcomps;
12522
0
                ++compno) {
12523
0
            opj_image_data_free(p_image->comps[compno].data);
12524
0
            p_image->comps[compno].data = NULL;
12525
0
        }
12526
0
        p_image->numcomps = p_j2k->m_private_image->numcomps;
12527
0
    }
12528
12529
    /* Destroy the previous output image*/
12530
0
    if (p_j2k->m_output_image) {
12531
0
        opj_image_destroy(p_j2k->m_output_image);
12532
0
    }
12533
12534
    /* Create the output image from the information previously computed*/
12535
0
    p_j2k->m_output_image = opj_image_create0();
12536
0
    if (!(p_j2k->m_output_image)) {
12537
0
        return OPJ_FALSE;
12538
0
    }
12539
0
    opj_copy_image_header(p_image, p_j2k->m_output_image);
12540
12541
0
    p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
12542
12543
    /* customization of the decoding */
12544
0
    if (!opj_j2k_setup_decoding_tile(p_j2k, p_manager)) {
12545
0
        return OPJ_FALSE;
12546
0
    }
12547
12548
    /* Decode the codestream */
12549
0
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12550
0
        opj_image_destroy(p_j2k->m_private_image);
12551
0
        p_j2k->m_private_image = NULL;
12552
0
        return OPJ_FALSE;
12553
0
    }
12554
12555
    /* Move data and copy one information from codec to output image*/
12556
0
    return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
12557
0
}
12558
12559
OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
12560
        OPJ_UINT32 res_factor,
12561
        opj_event_mgr_t * p_manager)
12562
0
{
12563
0
    OPJ_UINT32 it_comp;
12564
12565
0
    p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
12566
12567
0
    if (p_j2k->m_private_image) {
12568
0
        if (p_j2k->m_private_image->comps) {
12569
0
            if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
12570
0
                if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
12571
0
                    for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
12572
0
                        OPJ_UINT32 max_res =
12573
0
                            p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
12574
0
                        if (res_factor >= max_res) {
12575
0
                            opj_event_msg(p_manager, EVT_ERROR,
12576
0
                                          "Resolution factor is greater than the maximum resolution in the component.\n");
12577
0
                            return OPJ_FALSE;
12578
0
                        }
12579
0
                        p_j2k->m_private_image->comps[it_comp].factor = res_factor;
12580
0
                    }
12581
0
                    return OPJ_TRUE;
12582
0
                }
12583
0
            }
12584
0
        }
12585
0
    }
12586
12587
0
    return OPJ_FALSE;
12588
0
}
12589
12590
/* ----------------------------------------------------------------------- */
12591
12592
OPJ_BOOL opj_j2k_encoder_set_extra_options(
12593
    opj_j2k_t *p_j2k,
12594
    const char* const* p_options,
12595
    opj_event_mgr_t * p_manager)
12596
0
{
12597
0
    const char* const* p_option_iter;
12598
12599
0
    if (p_options == NULL) {
12600
0
        return OPJ_TRUE;
12601
0
    }
12602
12603
0
    for (p_option_iter = p_options; *p_option_iter != NULL; ++p_option_iter) {
12604
0
        if (strncmp(*p_option_iter, "PLT=", 4) == 0) {
12605
0
            if (strcmp(*p_option_iter, "PLT=YES") == 0) {
12606
0
                p_j2k->m_specific_param.m_encoder.m_PLT = OPJ_TRUE;
12607
0
            } else if (strcmp(*p_option_iter, "PLT=NO") == 0) {
12608
0
                p_j2k->m_specific_param.m_encoder.m_PLT = OPJ_FALSE;
12609
0
            } else {
12610
0
                opj_event_msg(p_manager, EVT_ERROR,
12611
0
                              "Invalid value for option: %s.\n", *p_option_iter);
12612
0
                return OPJ_FALSE;
12613
0
            }
12614
0
        } else if (strncmp(*p_option_iter, "TLM=", 4) == 0) {
12615
0
            if (strcmp(*p_option_iter, "TLM=YES") == 0) {
12616
0
                p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_TRUE;
12617
0
            } else if (strcmp(*p_option_iter, "TLM=NO") == 0) {
12618
0
                p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_FALSE;
12619
0
            } else {
12620
0
                opj_event_msg(p_manager, EVT_ERROR,
12621
0
                              "Invalid value for option: %s.\n", *p_option_iter);
12622
0
                return OPJ_FALSE;
12623
0
            }
12624
0
        } else if (strncmp(*p_option_iter, "GUARD_BITS=", strlen("GUARD_BITS=")) == 0) {
12625
0
            OPJ_UINT32 tileno;
12626
0
            opj_cp_t *cp = cp = &(p_j2k->m_cp);
12627
12628
0
            int numgbits = atoi(*p_option_iter + strlen("GUARD_BITS="));
12629
0
            if (numgbits < 0 || numgbits > 7) {
12630
0
                opj_event_msg(p_manager, EVT_ERROR,
12631
0
                              "Invalid value for option: %s. Should be in [0,7]\n", *p_option_iter);
12632
0
                return OPJ_FALSE;
12633
0
            }
12634
12635
0
            for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
12636
0
                OPJ_UINT32 i;
12637
0
                opj_tcp_t *tcp = &cp->tcps[tileno];
12638
0
                for (i = 0; i < p_j2k->m_specific_param.m_encoder.m_nb_comps; i++) {
12639
0
                    opj_tccp_t *tccp = &tcp->tccps[i];
12640
0
                    tccp->numgbits = (OPJ_UINT32)numgbits;
12641
0
                }
12642
0
            }
12643
0
        } else {
12644
0
            opj_event_msg(p_manager, EVT_ERROR,
12645
0
                          "Invalid option: %s.\n", *p_option_iter);
12646
0
            return OPJ_FALSE;
12647
0
        }
12648
0
    }
12649
12650
0
    return OPJ_TRUE;
12651
0
}
12652
12653
/* ----------------------------------------------------------------------- */
12654
12655
OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,
12656
                        opj_stream_private_t *p_stream,
12657
                        opj_event_mgr_t * p_manager)
12658
255
{
12659
255
    OPJ_UINT32 i, j;
12660
255
    OPJ_UINT32 l_nb_tiles;
12661
255
    OPJ_SIZE_T l_max_tile_size = 0, l_current_tile_size;
12662
255
    OPJ_BYTE * l_current_data = 00;
12663
255
    OPJ_BOOL l_reuse_data = OPJ_FALSE;
12664
255
    opj_tcd_t* p_tcd = 00;
12665
12666
    /* preconditions */
12667
255
    assert(p_j2k != 00);
12668
255
    assert(p_stream != 00);
12669
255
    assert(p_manager != 00);
12670
12671
255
    p_tcd = p_j2k->m_tcd;
12672
12673
255
    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
12674
255
    if (l_nb_tiles == 1) {
12675
255
        l_reuse_data = OPJ_TRUE;
12676
255
#ifdef __SSE__
12677
1.02k
        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12678
765
            opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
12679
765
            if (((size_t)l_img_comp->data & 0xFU) !=
12680
765
                    0U) { /* tile data shall be aligned on 16 bytes */
12681
0
                l_reuse_data = OPJ_FALSE;
12682
0
            }
12683
765
        }
12684
255
#endif
12685
255
    }
12686
510
    for (i = 0; i < l_nb_tiles; ++i) {
12687
255
        if (! opj_j2k_pre_write_tile(p_j2k, i, p_stream, p_manager)) {
12688
0
            if (l_current_data) {
12689
0
                opj_free(l_current_data);
12690
0
            }
12691
0
            return OPJ_FALSE;
12692
0
        }
12693
12694
        /* if we only have one tile, then simply set tile component data equal to image component data */
12695
        /* otherwise, allocate the data */
12696
1.02k
        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12697
765
            opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j;
12698
765
            if (l_reuse_data) {
12699
765
                opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
12700
765
                l_tilec->data  =  l_img_comp->data;
12701
765
                l_tilec->ownsData = OPJ_FALSE;
12702
765
            } else {
12703
0
                if (! opj_alloc_tile_component_data(l_tilec)) {
12704
0
                    opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
12705
0
                    if (l_current_data) {
12706
0
                        opj_free(l_current_data);
12707
0
                    }
12708
0
                    return OPJ_FALSE;
12709
0
                }
12710
0
            }
12711
765
        }
12712
255
        l_current_tile_size = opj_tcd_get_encoder_input_buffer_size(p_j2k->m_tcd);
12713
255
        if (!l_reuse_data) {
12714
0
            if (l_current_tile_size > l_max_tile_size) {
12715
0
                OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data,
12716
0
                                               l_current_tile_size);
12717
0
                if (! l_new_current_data) {
12718
0
                    if (l_current_data) {
12719
0
                        opj_free(l_current_data);
12720
0
                    }
12721
0
                    opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
12722
0
                    return OPJ_FALSE;
12723
0
                }
12724
0
                l_current_data = l_new_current_data;
12725
0
                l_max_tile_size = l_current_tile_size;
12726
0
            }
12727
0
            if (l_current_data == NULL) {
12728
                /* Should not happen in practice, but will avoid Coverity to */
12729
                /* complain about a null pointer dereference */
12730
0
                assert(0);
12731
0
                return OPJ_FALSE;
12732
0
            }
12733
12734
            /* copy image data (32 bit) to l_current_data as contiguous, all-component, zero offset buffer */
12735
            /* 32 bit components @ 8 bit precision get converted to 8 bit */
12736
            /* 32 bit components @ 16 bit precision get converted to 16 bit */
12737
0
            opj_j2k_get_tile_data(p_j2k->m_tcd, l_current_data);
12738
12739
            /* now copy this data into the tile component */
12740
0
            if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, l_current_data,
12741
0
                                         l_current_tile_size)) {
12742
0
                opj_event_msg(p_manager, EVT_ERROR,
12743
0
                              "Size mismatch between tile data and sent data.");
12744
0
                opj_free(l_current_data);
12745
0
                return OPJ_FALSE;
12746
0
            }
12747
0
        }
12748
12749
255
        if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
12750
0
            if (l_current_data) {
12751
0
                opj_free(l_current_data);
12752
0
            }
12753
0
            return OPJ_FALSE;
12754
0
        }
12755
255
    }
12756
12757
255
    if (l_current_data) {
12758
0
        opj_free(l_current_data);
12759
0
    }
12760
255
    return OPJ_TRUE;
12761
255
}
12762
12763
OPJ_BOOL opj_j2k_end_compress(opj_j2k_t *p_j2k,
12764
                              opj_stream_private_t *p_stream,
12765
                              opj_event_mgr_t * p_manager)
12766
255
{
12767
    /* customization of the encoding */
12768
255
    if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) {
12769
0
        return OPJ_FALSE;
12770
0
    }
12771
12772
255
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12773
0
        return OPJ_FALSE;
12774
0
    }
12775
12776
255
    return OPJ_TRUE;
12777
255
}
12778
12779
OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
12780
                                opj_stream_private_t *p_stream,
12781
                                opj_image_t * p_image,
12782
                                opj_event_mgr_t * p_manager)
12783
258
{
12784
    /* preconditions */
12785
258
    assert(p_j2k != 00);
12786
258
    assert(p_stream != 00);
12787
258
    assert(p_manager != 00);
12788
12789
258
    p_j2k->m_private_image = opj_image_create0();
12790
258
    if (! p_j2k->m_private_image) {
12791
0
        opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header.");
12792
0
        return OPJ_FALSE;
12793
0
    }
12794
258
    opj_copy_image_header(p_image, p_j2k->m_private_image);
12795
12796
    /* TODO_MSD: Find a better way */
12797
258
    if (p_image->comps) {
12798
258
        OPJ_UINT32 it_comp;
12799
1.03k
        for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
12800
774
            if (p_image->comps[it_comp].data) {
12801
774
                p_j2k->m_private_image->comps[it_comp].data = p_image->comps[it_comp].data;
12802
774
                p_image->comps[it_comp].data = NULL;
12803
12804
774
            }
12805
774
        }
12806
258
    }
12807
12808
    /* customization of the validation */
12809
258
    if (! opj_j2k_setup_encoding_validation(p_j2k, p_manager)) {
12810
0
        return OPJ_FALSE;
12811
0
    }
12812
12813
    /* validation of the parameters codec */
12814
258
    if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
12815
3
        return OPJ_FALSE;
12816
3
    }
12817
12818
    /* customization of the encoding */
12819
255
    if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) {
12820
0
        return OPJ_FALSE;
12821
0
    }
12822
12823
    /* write header */
12824
255
    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12825
0
        return OPJ_FALSE;
12826
0
    }
12827
12828
255
    return OPJ_TRUE;
12829
255
}
12830
12831
static OPJ_BOOL opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,
12832
                                       OPJ_UINT32 p_tile_index,
12833
                                       opj_stream_private_t *p_stream,
12834
                                       opj_event_mgr_t * p_manager)
12835
255
{
12836
255
    (void)p_stream;
12837
255
    if (p_tile_index != p_j2k->m_current_tile_number) {
12838
0
        opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match.");
12839
0
        return OPJ_FALSE;
12840
0
    }
12841
12842
255
    opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n",
12843
255
                  p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
12844
12845
255
    p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
12846
255
    p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
12847
255
    p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
12848
12849
    /* initialisation before tile encoding  */
12850
255
    if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
12851
255
                                   p_manager)) {
12852
0
        return OPJ_FALSE;
12853
0
    }
12854
12855
255
    return OPJ_TRUE;
12856
255
}
12857
12858
static void opj_get_tile_dimensions(opj_image_t * l_image,
12859
                                    opj_tcd_tilecomp_t * l_tilec,
12860
                                    opj_image_comp_t * l_img_comp,
12861
                                    OPJ_UINT32* l_size_comp,
12862
                                    OPJ_UINT32* l_width,
12863
                                    OPJ_UINT32* l_height,
12864
                                    OPJ_UINT32* l_offset_x,
12865
                                    OPJ_UINT32* l_offset_y,
12866
                                    OPJ_UINT32* l_image_width,
12867
                                    OPJ_UINT32* l_stride,
12868
                                    OPJ_UINT32* l_tile_offset)
12869
0
{
12870
0
    OPJ_UINT32 l_remaining;
12871
0
    *l_size_comp = l_img_comp->prec >> 3; /* (/8) */
12872
0
    l_remaining = l_img_comp->prec & 7;  /* (%8) */
12873
0
    if (l_remaining) {
12874
0
        *l_size_comp += 1;
12875
0
    }
12876
12877
0
    if (*l_size_comp == 3) {
12878
0
        *l_size_comp = 4;
12879
0
    }
12880
12881
0
    *l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
12882
0
    *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
12883
0
    *l_offset_x = opj_uint_ceildiv(l_image->x0, l_img_comp->dx);
12884
0
    *l_offset_y = opj_uint_ceildiv(l_image->y0, l_img_comp->dy);
12885
0
    *l_image_width = opj_uint_ceildiv(l_image->x1 - l_image->x0, l_img_comp->dx);
12886
0
    *l_stride = *l_image_width - *l_width;
12887
0
    *l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((
12888
0
                         OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width;
12889
0
}
12890
12891
static void opj_j2k_get_tile_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
12892
0
{
12893
0
    OPJ_UINT32 i, j, k = 0;
12894
12895
0
    for (i = 0; i < p_tcd->image->numcomps; ++i) {
12896
0
        opj_image_t * l_image =  p_tcd->image;
12897
0
        OPJ_INT32 * l_src_ptr;
12898
0
        opj_tcd_tilecomp_t * l_tilec = p_tcd->tcd_image->tiles->comps + i;
12899
0
        opj_image_comp_t * l_img_comp = l_image->comps + i;
12900
0
        OPJ_UINT32 l_size_comp, l_width, l_height, l_offset_x, l_offset_y,
12901
0
                   l_image_width, l_stride, l_tile_offset;
12902
12903
0
        opj_get_tile_dimensions(l_image,
12904
0
                                l_tilec,
12905
0
                                l_img_comp,
12906
0
                                &l_size_comp,
12907
0
                                &l_width,
12908
0
                                &l_height,
12909
0
                                &l_offset_x,
12910
0
                                &l_offset_y,
12911
0
                                &l_image_width,
12912
0
                                &l_stride,
12913
0
                                &l_tile_offset);
12914
12915
0
        l_src_ptr = l_img_comp->data + l_tile_offset;
12916
12917
0
        switch (l_size_comp) {
12918
0
        case 1: {
12919
0
            OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
12920
0
            if (l_img_comp->sgnd) {
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);
12924
0
                        ++l_dest_ptr;
12925
0
                        ++l_src_ptr;
12926
0
                    }
12927
0
                    l_src_ptr += l_stride;
12928
0
                }
12929
0
            } else {
12930
0
                for (j = 0; j < l_height; ++j) {
12931
0
                    for (k = 0; k < l_width; ++k) {
12932
0
                        *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr) & 0xff);
12933
0
                        ++l_dest_ptr;
12934
0
                        ++l_src_ptr;
12935
0
                    }
12936
0
                    l_src_ptr += l_stride;
12937
0
                }
12938
0
            }
12939
12940
0
            p_data = (OPJ_BYTE*) l_dest_ptr;
12941
0
        }
12942
0
        break;
12943
0
        case 2: {
12944
0
            OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
12945
0
            if (l_img_comp->sgnd) {
12946
0
                for (j = 0; j < l_height; ++j) {
12947
0
                    for (k = 0; k < l_width; ++k) {
12948
0
                        *(l_dest_ptr++) = (OPJ_INT16)(*(l_src_ptr++));
12949
0
                    }
12950
0
                    l_src_ptr += l_stride;
12951
0
                }
12952
0
            } else {
12953
0
                for (j = 0; j < l_height; ++j) {
12954
0
                    for (k = 0; k < l_width; ++k) {
12955
0
                        *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
12956
0
                    }
12957
0
                    l_src_ptr += l_stride;
12958
0
                }
12959
0
            }
12960
12961
0
            p_data = (OPJ_BYTE*) l_dest_ptr;
12962
0
        }
12963
0
        break;
12964
0
        case 4: {
12965
0
            OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
12966
0
            for (j = 0; j < l_height; ++j) {
12967
0
                for (k = 0; k < l_width; ++k) {
12968
0
                    *(l_dest_ptr++) = *(l_src_ptr++);
12969
0
                }
12970
0
                l_src_ptr += l_stride;
12971
0
            }
12972
12973
0
            p_data = (OPJ_BYTE*) l_dest_ptr;
12974
0
        }
12975
0
        break;
12976
0
        }
12977
0
    }
12978
0
}
12979
12980
static OPJ_BOOL opj_j2k_post_write_tile(opj_j2k_t * p_j2k,
12981
                                        opj_stream_private_t *p_stream,
12982
                                        opj_event_mgr_t * p_manager)
12983
255
{
12984
255
    OPJ_UINT32 l_nb_bytes_written;
12985
255
    OPJ_BYTE * l_current_data = 00;
12986
255
    OPJ_UINT32 l_tile_size = 0;
12987
255
    OPJ_UINT32 l_available_data;
12988
12989
    /* preconditions */
12990
255
    assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
12991
12992
255
    l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
12993
255
    l_available_data = l_tile_size;
12994
255
    l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
12995
12996
255
    l_nb_bytes_written = 0;
12997
255
    if (! opj_j2k_write_first_tile_part(p_j2k, l_current_data, &l_nb_bytes_written,
12998
255
                                        l_available_data, p_stream, p_manager)) {
12999
0
        return OPJ_FALSE;
13000
0
    }
13001
255
    l_current_data += l_nb_bytes_written;
13002
255
    l_available_data -= l_nb_bytes_written;
13003
13004
255
    l_nb_bytes_written = 0;
13005
255
    if (! opj_j2k_write_all_tile_parts(p_j2k, l_current_data, &l_nb_bytes_written,
13006
255
                                       l_available_data, p_stream, p_manager)) {
13007
0
        return OPJ_FALSE;
13008
0
    }
13009
13010
255
    l_available_data -= l_nb_bytes_written;
13011
255
    l_nb_bytes_written = l_tile_size - l_available_data;
13012
13013
255
    if (opj_stream_write_data(p_stream,
13014
255
                              p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
13015
255
                              l_nb_bytes_written, p_manager) != l_nb_bytes_written) {
13016
0
        return OPJ_FALSE;
13017
0
    }
13018
13019
255
    ++p_j2k->m_current_tile_number;
13020
13021
255
    return OPJ_TRUE;
13022
255
}
13023
13024
static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
13025
        opj_event_mgr_t * p_manager)
13026
255
{
13027
    /* preconditions */
13028
255
    assert(p_j2k != 00);
13029
255
    assert(p_manager != 00);
13030
13031
    /* DEVELOPER CORNER, insert your custom procedures */
13032
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13033
255
                                           (opj_procedure)opj_j2k_write_eoc, p_manager)) {
13034
0
        return OPJ_FALSE;
13035
0
    }
13036
13037
255
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13038
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13039
0
                                               (opj_procedure)opj_j2k_write_updated_tlm, p_manager)) {
13040
0
            return OPJ_FALSE;
13041
0
        }
13042
0
    }
13043
13044
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13045
255
                                           (opj_procedure)opj_j2k_write_epc, p_manager)) {
13046
0
        return OPJ_FALSE;
13047
0
    }
13048
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13049
255
                                           (opj_procedure)opj_j2k_end_encoding, p_manager)) {
13050
0
        return OPJ_FALSE;
13051
0
    }
13052
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13053
255
                                           (opj_procedure)opj_j2k_destroy_header_memory, p_manager)) {
13054
0
        return OPJ_FALSE;
13055
0
    }
13056
255
    return OPJ_TRUE;
13057
255
}
13058
13059
static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
13060
        opj_event_mgr_t * p_manager)
13061
258
{
13062
    /* preconditions */
13063
258
    assert(p_j2k != 00);
13064
258
    assert(p_manager != 00);
13065
13066
258
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13067
258
                                           (opj_procedure)opj_j2k_build_encoder, p_manager)) {
13068
0
        return OPJ_FALSE;
13069
0
    }
13070
258
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13071
258
                                           (opj_procedure)opj_j2k_encoding_validation, p_manager)) {
13072
0
        return OPJ_FALSE;
13073
0
    }
13074
13075
    /* DEVELOPER CORNER, add your custom validation procedure */
13076
258
    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
13077
258
                                           (opj_procedure)opj_j2k_mct_validation, p_manager)) {
13078
0
        return OPJ_FALSE;
13079
0
    }
13080
13081
258
    return OPJ_TRUE;
13082
258
}
13083
13084
static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
13085
        opj_event_mgr_t * p_manager)
13086
255
{
13087
    /* preconditions */
13088
255
    assert(p_j2k != 00);
13089
255
    assert(p_manager != 00);
13090
13091
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13092
255
                                           (opj_procedure)opj_j2k_init_info, p_manager)) {
13093
0
        return OPJ_FALSE;
13094
0
    }
13095
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13096
255
                                           (opj_procedure)opj_j2k_write_soc, p_manager)) {
13097
0
        return OPJ_FALSE;
13098
0
    }
13099
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13100
255
                                           (opj_procedure)opj_j2k_write_siz, p_manager)) {
13101
0
        return OPJ_FALSE;
13102
0
    }
13103
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13104
255
                                           (opj_procedure)opj_j2k_write_cod, p_manager)) {
13105
0
        return OPJ_FALSE;
13106
0
    }
13107
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13108
255
                                           (opj_procedure)opj_j2k_write_qcd, p_manager)) {
13109
0
        return OPJ_FALSE;
13110
0
    }
13111
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13112
255
                                           (opj_procedure)opj_j2k_write_all_coc, p_manager)) {
13113
0
        return OPJ_FALSE;
13114
0
    }
13115
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13116
255
                                           (opj_procedure)opj_j2k_write_all_qcc, p_manager)) {
13117
0
        return OPJ_FALSE;
13118
0
    }
13119
13120
255
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13121
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13122
0
                                               (opj_procedure)opj_j2k_write_tlm, p_manager)) {
13123
0
            return OPJ_FALSE;
13124
0
        }
13125
13126
0
        if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) {
13127
0
            if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13128
0
                                                   (opj_procedure)opj_j2k_write_poc, p_manager)) {
13129
0
                return OPJ_FALSE;
13130
0
            }
13131
0
        }
13132
0
    }
13133
13134
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13135
255
                                           (opj_procedure)opj_j2k_write_regions, p_manager)) {
13136
0
        return OPJ_FALSE;
13137
0
    }
13138
13139
255
    if (p_j2k->m_cp.comment != 00)  {
13140
255
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13141
255
                                               (opj_procedure)opj_j2k_write_com, p_manager)) {
13142
0
            return OPJ_FALSE;
13143
0
        }
13144
255
    }
13145
13146
    /* DEVELOPER CORNER, insert your custom procedures */
13147
255
    if ((p_j2k->m_cp.rsiz & (OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT)) ==
13148
255
            (OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT)) {
13149
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13150
0
                                               (opj_procedure)opj_j2k_write_mct_data_group, p_manager)) {
13151
0
            return OPJ_FALSE;
13152
0
        }
13153
0
    }
13154
    /* End of Developer Corner */
13155
13156
255
    if (p_j2k->cstr_index) {
13157
0
        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13158
0
                                               (opj_procedure)opj_j2k_get_end_header, p_manager)) {
13159
0
            return OPJ_FALSE;
13160
0
        }
13161
0
    }
13162
13163
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13164
255
                                           (opj_procedure)opj_j2k_create_tcd, p_manager)) {
13165
0
        return OPJ_FALSE;
13166
0
    }
13167
255
    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
13168
255
                                           (opj_procedure)opj_j2k_update_rates, p_manager)) {
13169
0
        return OPJ_FALSE;
13170
0
    }
13171
13172
255
    return OPJ_TRUE;
13173
255
}
13174
13175
static OPJ_BOOL opj_j2k_write_first_tile_part(opj_j2k_t *p_j2k,
13176
        OPJ_BYTE * p_data,
13177
        OPJ_UINT32 * p_data_written,
13178
        OPJ_UINT32 total_data_size,
13179
        opj_stream_private_t *p_stream,
13180
        struct opj_event_mgr * p_manager)
13181
255
{
13182
255
    OPJ_UINT32 l_nb_bytes_written = 0;
13183
255
    OPJ_UINT32 l_current_nb_bytes_written;
13184
255
    OPJ_BYTE * l_begin_data = 00;
13185
13186
255
    opj_tcd_t * l_tcd = 00;
13187
255
    opj_cp_t * l_cp = 00;
13188
13189
255
    l_tcd = p_j2k->m_tcd;
13190
255
    l_cp = &(p_j2k->m_cp);
13191
13192
255
    l_tcd->cur_pino = 0;
13193
13194
    /*Get number of tile parts*/
13195
255
    p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
13196
13197
    /* INDEX >> */
13198
    /* << INDEX */
13199
13200
255
    l_current_nb_bytes_written = 0;
13201
255
    l_begin_data = p_data;
13202
255
    if (! opj_j2k_write_sot(p_j2k, p_data, total_data_size,
13203
255
                            &l_current_nb_bytes_written, p_stream,
13204
255
                            p_manager)) {
13205
0
        return OPJ_FALSE;
13206
0
    }
13207
13208
255
    l_nb_bytes_written += l_current_nb_bytes_written;
13209
255
    p_data += l_current_nb_bytes_written;
13210
255
    total_data_size -= l_current_nb_bytes_written;
13211
13212
255
    if (!OPJ_IS_CINEMA(l_cp->rsiz)) {
13213
#if 0
13214
        for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
13215
            l_current_nb_bytes_written = 0;
13216
            opj_j2k_write_coc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
13217
                                        p_manager);
13218
            l_nb_bytes_written += l_current_nb_bytes_written;
13219
            p_data += l_current_nb_bytes_written;
13220
            total_data_size -= l_current_nb_bytes_written;
13221
13222
            l_current_nb_bytes_written = 0;
13223
            opj_j2k_write_qcc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
13224
                                        p_manager);
13225
            l_nb_bytes_written += l_current_nb_bytes_written;
13226
            p_data += l_current_nb_bytes_written;
13227
            total_data_size -= l_current_nb_bytes_written;
13228
        }
13229
#endif
13230
255
        if (l_cp->tcps[p_j2k->m_current_tile_number].POC) {
13231
0
            l_current_nb_bytes_written = 0;
13232
0
            opj_j2k_write_poc_in_memory(p_j2k, p_data, &l_current_nb_bytes_written,
13233
0
                                        p_manager);
13234
0
            l_nb_bytes_written += l_current_nb_bytes_written;
13235
0
            p_data += l_current_nb_bytes_written;
13236
0
            total_data_size -= l_current_nb_bytes_written;
13237
0
        }
13238
255
    }
13239
13240
255
    l_current_nb_bytes_written = 0;
13241
255
    if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
13242
255
                            total_data_size, p_stream, p_manager)) {
13243
0
        return OPJ_FALSE;
13244
0
    }
13245
13246
255
    l_nb_bytes_written += l_current_nb_bytes_written;
13247
255
    * p_data_written = l_nb_bytes_written;
13248
13249
    /* Writing Psot in SOT marker */
13250
255
    opj_write_bytes(l_begin_data + 6, l_nb_bytes_written,
13251
255
                    4);                                 /* PSOT */
13252
13253
255
    if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13254
0
        opj_j2k_update_tlm(p_j2k, l_nb_bytes_written);
13255
0
    }
13256
13257
255
    return OPJ_TRUE;
13258
255
}
13259
13260
static OPJ_BOOL opj_j2k_write_all_tile_parts(opj_j2k_t *p_j2k,
13261
        OPJ_BYTE * p_data,
13262
        OPJ_UINT32 * p_data_written,
13263
        OPJ_UINT32 total_data_size,
13264
        opj_stream_private_t *p_stream,
13265
        struct opj_event_mgr * p_manager
13266
                                            )
13267
255
{
13268
255
    OPJ_UINT32 tilepartno = 0;
13269
255
    OPJ_UINT32 l_nb_bytes_written = 0;
13270
255
    OPJ_UINT32 l_current_nb_bytes_written;
13271
255
    OPJ_UINT32 l_part_tile_size;
13272
255
    OPJ_UINT32 tot_num_tp;
13273
255
    OPJ_UINT32 pino;
13274
13275
255
    OPJ_BYTE * l_begin_data;
13276
255
    opj_tcp_t *l_tcp = 00;
13277
255
    opj_tcd_t * l_tcd = 00;
13278
255
    opj_cp_t * l_cp = 00;
13279
13280
255
    l_tcd = p_j2k->m_tcd;
13281
255
    l_cp = &(p_j2k->m_cp);
13282
255
    l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
13283
13284
    /*Get number of tile parts*/
13285
255
    tot_num_tp = opj_j2k_get_num_tp(l_cp, 0, p_j2k->m_current_tile_number);
13286
13287
    /* start writing remaining tile parts */
13288
255
    ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
13289
255
    for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
13290
0
        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
13291
0
        l_current_nb_bytes_written = 0;
13292
0
        l_part_tile_size = 0;
13293
0
        l_begin_data = p_data;
13294
13295
0
        if (! opj_j2k_write_sot(p_j2k, p_data,
13296
0
                                total_data_size,
13297
0
                                &l_current_nb_bytes_written,
13298
0
                                p_stream,
13299
0
                                p_manager)) {
13300
0
            return OPJ_FALSE;
13301
0
        }
13302
13303
0
        l_nb_bytes_written += l_current_nb_bytes_written;
13304
0
        p_data += l_current_nb_bytes_written;
13305
0
        total_data_size -= l_current_nb_bytes_written;
13306
0
        l_part_tile_size += l_current_nb_bytes_written;
13307
13308
0
        l_current_nb_bytes_written = 0;
13309
0
        if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
13310
0
                                total_data_size, p_stream, p_manager)) {
13311
0
            return OPJ_FALSE;
13312
0
        }
13313
13314
0
        p_data += l_current_nb_bytes_written;
13315
0
        l_nb_bytes_written += l_current_nb_bytes_written;
13316
0
        total_data_size -= l_current_nb_bytes_written;
13317
0
        l_part_tile_size += l_current_nb_bytes_written;
13318
13319
        /* Writing Psot in SOT marker */
13320
0
        opj_write_bytes(l_begin_data + 6, l_part_tile_size,
13321
0
                        4);                                   /* PSOT */
13322
13323
0
        if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13324
0
            opj_j2k_update_tlm(p_j2k, l_part_tile_size);
13325
0
        }
13326
13327
0
        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
13328
0
    }
13329
13330
255
    for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
13331
0
        l_tcd->cur_pino = pino;
13332
13333
        /*Get number of tile parts*/
13334
0
        tot_num_tp = opj_j2k_get_num_tp(l_cp, pino, p_j2k->m_current_tile_number);
13335
0
        for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
13336
0
            p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
13337
0
            l_current_nb_bytes_written = 0;
13338
0
            l_part_tile_size = 0;
13339
0
            l_begin_data = p_data;
13340
13341
0
            if (! opj_j2k_write_sot(p_j2k, p_data,
13342
0
                                    total_data_size,
13343
0
                                    &l_current_nb_bytes_written, p_stream,
13344
0
                                    p_manager)) {
13345
0
                return OPJ_FALSE;
13346
0
            }
13347
13348
0
            l_nb_bytes_written += l_current_nb_bytes_written;
13349
0
            p_data += l_current_nb_bytes_written;
13350
0
            total_data_size -= l_current_nb_bytes_written;
13351
0
            l_part_tile_size += l_current_nb_bytes_written;
13352
13353
0
            l_current_nb_bytes_written = 0;
13354
13355
0
            if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
13356
0
                                    total_data_size, p_stream, p_manager)) {
13357
0
                return OPJ_FALSE;
13358
0
            }
13359
13360
0
            l_nb_bytes_written += l_current_nb_bytes_written;
13361
0
            p_data += l_current_nb_bytes_written;
13362
0
            total_data_size -= l_current_nb_bytes_written;
13363
0
            l_part_tile_size += l_current_nb_bytes_written;
13364
13365
            /* Writing Psot in SOT marker */
13366
0
            opj_write_bytes(l_begin_data + 6, l_part_tile_size,
13367
0
                            4);                                   /* PSOT */
13368
13369
0
            if (p_j2k->m_specific_param.m_encoder.m_TLM) {
13370
0
                opj_j2k_update_tlm(p_j2k, l_part_tile_size);
13371
0
            }
13372
13373
0
            ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
13374
0
        }
13375
0
    }
13376
13377
255
    *p_data_written = l_nb_bytes_written;
13378
13379
255
    return OPJ_TRUE;
13380
255
}
13381
13382
static OPJ_BOOL opj_j2k_write_updated_tlm(opj_j2k_t *p_j2k,
13383
        struct opj_stream_private *p_stream,
13384
        struct opj_event_mgr * p_manager)
13385
0
{
13386
0
    OPJ_UINT32 l_tlm_size;
13387
0
    OPJ_OFF_T l_tlm_position, l_current_position;
13388
0
    OPJ_UINT32 size_per_tile_part;
13389
13390
    /* preconditions */
13391
0
    assert(p_j2k != 00);
13392
0
    assert(p_manager != 00);
13393
0
    assert(p_stream != 00);
13394
13395
0
    size_per_tile_part = p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte ? 5 : 6;
13396
0
    l_tlm_size = size_per_tile_part *
13397
0
                 p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
13398
0
    l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
13399
0
    l_current_position = opj_stream_tell(p_stream);
13400
13401
0
    if (! opj_stream_seek(p_stream, l_tlm_position, p_manager)) {
13402
0
        return OPJ_FALSE;
13403
0
    }
13404
13405
0
    if (opj_stream_write_data(p_stream,
13406
0
                              p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer, l_tlm_size,
13407
0
                              p_manager) != l_tlm_size) {
13408
0
        return OPJ_FALSE;
13409
0
    }
13410
13411
0
    if (! opj_stream_seek(p_stream, l_current_position, p_manager)) {
13412
0
        return OPJ_FALSE;
13413
0
    }
13414
13415
0
    return OPJ_TRUE;
13416
0
}
13417
13418
static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
13419
                                     struct opj_stream_private *p_stream,
13420
                                     struct opj_event_mgr * p_manager)
13421
255
{
13422
    /* preconditions */
13423
255
    assert(p_j2k != 00);
13424
255
    assert(p_manager != 00);
13425
255
    assert(p_stream != 00);
13426
13427
255
    OPJ_UNUSED(p_stream);
13428
255
    OPJ_UNUSED(p_manager);
13429
13430
255
    opj_tcd_destroy(p_j2k->m_tcd);
13431
255
    p_j2k->m_tcd = 00;
13432
13433
255
    if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
13434
0
        opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
13435
0
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
13436
0
        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
13437
0
    }
13438
13439
255
    if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
13440
255
        opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
13441
255
        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
13442
255
    }
13443
13444
255
    p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
13445
13446
255
    return OPJ_TRUE;
13447
255
}
13448
13449
/**
13450
 * Destroys the memory associated with the decoding of headers.
13451
 */
13452
static OPJ_BOOL opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,
13453
        opj_stream_private_t *p_stream,
13454
        opj_event_mgr_t * p_manager
13455
                                             )
13456
255
{
13457
    /* preconditions */
13458
255
    assert(p_j2k != 00);
13459
255
    assert(p_stream != 00);
13460
255
    assert(p_manager != 00);
13461
13462
255
    OPJ_UNUSED(p_stream);
13463
255
    OPJ_UNUSED(p_manager);
13464
13465
255
    if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
13466
255
        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
13467
255
        p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
13468
255
    }
13469
13470
255
    p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
13471
13472
255
    return OPJ_TRUE;
13473
255
}
13474
13475
static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
13476
                                  struct opj_stream_private *p_stream,
13477
                                  struct opj_event_mgr * p_manager)
13478
255
{
13479
255
    opj_codestream_info_t * l_cstr_info = 00;
13480
13481
    /* preconditions */
13482
255
    assert(p_j2k != 00);
13483
255
    assert(p_manager != 00);
13484
255
    assert(p_stream != 00);
13485
255
    (void)l_cstr_info;
13486
13487
255
    OPJ_UNUSED(p_stream);
13488
13489
    /* TODO mergeV2: check this part which use cstr_info */
13490
    /*l_cstr_info = p_j2k->cstr_info;
13491
13492
    if (l_cstr_info)  {
13493
            OPJ_UINT32 compno;
13494
            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));
13495
13496
            l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
13497
            l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
13498
13499
            l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
13500
13501
            l_cstr_info->tw = p_j2k->m_cp.tw;
13502
            l_cstr_info->th = p_j2k->m_cp.th;
13503
13504
            l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/        /* new version parser */
13505
    /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/      /* new version parser */
13506
    /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/     /* new version parser */
13507
    /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/     /* new version parser */
13508
13509
    /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
13510
13511
    l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
13512
13513
    l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
13514
13515
    for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
13516
            l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
13517
    }
13518
13519
    l_cstr_info->D_max = 0.0;       */      /* ADD Marcela */
13520
13521
    /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
13522
13523
    /*l_cstr_info->maxmarknum = 100;
13524
    l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
13525
    l_cstr_info->marknum = 0;
13526
    }*/
13527
13528
255
    return opj_j2k_calculate_tp(p_j2k, &(p_j2k->m_cp),
13529
255
                                &p_j2k->m_specific_param.m_encoder.m_total_tile_parts, p_j2k->m_private_image,
13530
255
                                p_manager);
13531
255
}
13532
13533
/**
13534
 * Creates a tile-coder encoder.
13535
 *
13536
 * @param       p_stream                the stream to write data to.
13537
 * @param       p_j2k                   J2K codec.
13538
 * @param       p_manager               the user event manager.
13539
*/
13540
static OPJ_BOOL opj_j2k_create_tcd(opj_j2k_t *p_j2k,
13541
                                   opj_stream_private_t *p_stream,
13542
                                   opj_event_mgr_t * p_manager
13543
                                  )
13544
255
{
13545
    /* preconditions */
13546
255
    assert(p_j2k != 00);
13547
255
    assert(p_manager != 00);
13548
255
    assert(p_stream != 00);
13549
13550
255
    OPJ_UNUSED(p_stream);
13551
13552
255
    p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
13553
13554
255
    if (! p_j2k->m_tcd) {
13555
0
        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
13556
0
        return OPJ_FALSE;
13557
0
    }
13558
13559
255
    if (!opj_tcd_init(p_j2k->m_tcd, p_j2k->m_private_image, &p_j2k->m_cp,
13560
255
                      p_j2k->m_tp)) {
13561
0
        opj_tcd_destroy(p_j2k->m_tcd);
13562
0
        p_j2k->m_tcd = 00;
13563
0
        return OPJ_FALSE;
13564
0
    }
13565
13566
255
    return OPJ_TRUE;
13567
255
}
13568
13569
OPJ_BOOL opj_j2k_write_tile(opj_j2k_t * p_j2k,
13570
                            OPJ_UINT32 p_tile_index,
13571
                            OPJ_BYTE * p_data,
13572
                            OPJ_UINT32 p_data_size,
13573
                            opj_stream_private_t *p_stream,
13574
                            opj_event_mgr_t * p_manager)
13575
0
{
13576
0
    if (! opj_j2k_pre_write_tile(p_j2k, p_tile_index, p_stream, p_manager)) {
13577
0
        opj_event_msg(p_manager, EVT_ERROR,
13578
0
                      "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
13579
0
        return OPJ_FALSE;
13580
0
    } else {
13581
0
        OPJ_UINT32 j;
13582
        /* Allocate data */
13583
0
        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
13584
0
            opj_tcd_tilecomp_t* l_tilec = p_j2k->m_tcd->tcd_image->tiles->comps + j;
13585
13586
0
            if (! opj_alloc_tile_component_data(l_tilec)) {
13587
0
                opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
13588
0
                return OPJ_FALSE;
13589
0
            }
13590
0
        }
13591
13592
        /* now copy data into the tile component */
13593
0
        if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
13594
0
            opj_event_msg(p_manager, EVT_ERROR,
13595
0
                          "Size mismatch between tile data and sent data.");
13596
0
            return OPJ_FALSE;
13597
0
        }
13598
0
        if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
13599
0
            opj_event_msg(p_manager, EVT_ERROR,
13600
0
                          "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
13601
0
            return OPJ_FALSE;
13602
0
        }
13603
0
    }
13604
13605
0
    return OPJ_TRUE;
13606
0
}