14f6ff41a4c1a14fa6cdb76135ae1b155617c81c
[openjpeg.git] / src / lib / openjp2 / j2k.c
1 /*
2  * The copyright in this software is being made available under the 2-clauses
3  * BSD License, included below. This software may be subject to other third
4  * party and contributor rights, including patent rights, and no such rights
5  * are granted under this license.
6  *
7  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8  * Copyright (c) 2002-2014, Professor Benoit Macq
9  * Copyright (c) 2001-2003, David Janssens
10  * Copyright (c) 2002-2003, Yannick Verschueren
11  * Copyright (c) 2003-2007, Francois-Olivier Devaux
12  * Copyright (c) 2003-2014, Antonin Descampe
13  * Copyright (c) 2005, Herve Drolon, FreeImage Team
14  * Copyright (c) 2008, 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. Developpers 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 lauch to make sure the codec parameters
93  * are valid. Developpers 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 lauch to make sure the codec parameters
100  * are valid. Developpers 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 lauch to make sure the codec parameters
107  * are valid. Developpers 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  * Excutes 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  * @param       p_j2k               J2K codec.
883  * @param       p_tile_coder        FIXME DOC
884  * @param       p_data              FIXME DOC
885  * @param       p_data_written      FIXME DOC
886  * @param       total_data_size   FIXME DOC
887  * @param       p_stream            the stream to write data to.
888  * @param       p_manager           the user event manager.
889 */
890 static OPJ_BOOL opj_j2k_write_sod(opj_j2k_t *p_j2k,
891                                   opj_tcd_t * p_tile_coder,
892                                   OPJ_BYTE * p_data,
893                                   OPJ_UINT32 * p_data_written,
894                                   OPJ_UINT32 total_data_size,
895                                   const opj_stream_private_t *p_stream,
896                                   opj_event_mgr_t * p_manager);
897
898 /**
899  * Reads a SOD marker (Start Of Data)
900  *
901  * @param       p_j2k                   the jpeg2000 codec.
902  * @param       p_stream                FIXME DOC
903  * @param       p_manager               the user event manager.
904 */
905 static OPJ_BOOL opj_j2k_read_sod(opj_j2k_t *p_j2k,
906                                  opj_stream_private_t *p_stream,
907                                  opj_event_mgr_t * p_manager);
908
909 static void opj_j2k_update_tlm(opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size)
910 {
911     opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
912                     p_j2k->m_current_tile_number, 1);           /* PSOT */
913     ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current;
914
915     opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
916                     p_tile_part_size, 4);                                       /* PSOT */
917     p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
918 }
919
920 /**
921  * Writes the RGN marker (Region Of Interest)
922  *
923  * @param       p_tile_no               the tile to output
924  * @param       p_comp_no               the component to output
925  * @param       nb_comps                the number of components
926  * @param       p_stream                the stream to write data to.
927  * @param       p_j2k                   J2K codec.
928  * @param       p_manager               the user event manager.
929 */
930 static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
931                                   OPJ_UINT32 p_tile_no,
932                                   OPJ_UINT32 p_comp_no,
933                                   OPJ_UINT32 nb_comps,
934                                   opj_stream_private_t *p_stream,
935                                   opj_event_mgr_t * p_manager);
936
937 /**
938  * Reads a RGN marker (Region Of Interest)
939  *
940  * @param       p_header_data   the data contained in the POC box.
941  * @param       p_j2k                   the jpeg2000 codec.
942  * @param       p_header_size   the size of the data contained in the POC marker.
943  * @param       p_manager               the user event manager.
944 */
945 static OPJ_BOOL opj_j2k_read_rgn(opj_j2k_t *p_j2k,
946                                  OPJ_BYTE * p_header_data,
947                                  OPJ_UINT32 p_header_size,
948                                  opj_event_mgr_t * p_manager);
949
950 /**
951  * Writes the EOC marker (End of Codestream)
952  *
953  * @param       p_stream                the stream to write data to.
954  * @param       p_j2k                   J2K codec.
955  * @param       p_manager               the user event manager.
956 */
957 static OPJ_BOOL opj_j2k_write_eoc(opj_j2k_t *p_j2k,
958                                   opj_stream_private_t *p_stream,
959                                   opj_event_mgr_t * p_manager);
960
961 #if 0
962 /**
963  * Reads a EOC marker (End Of Codestream)
964  *
965  * @param       p_j2k                   the jpeg2000 codec.
966  * @param       p_stream                FIXME DOC
967  * @param       p_manager               the user event manager.
968 */
969 static OPJ_BOOL opj_j2k_read_eoc(opj_j2k_t *p_j2k,
970                                  opj_stream_private_t *p_stream,
971                                  opj_event_mgr_t * p_manager);
972 #endif
973
974 /**
975  * Writes the CBD-MCT-MCC-MCO markers (Multi components transform)
976  *
977  * @param       p_stream                        the stream to write data to.
978  * @param       p_j2k                   J2K codec.
979  * @param       p_manager       the user event manager.
980 */
981 static OPJ_BOOL opj_j2k_write_mct_data_group(opj_j2k_t *p_j2k,
982         opj_stream_private_t *p_stream,
983         opj_event_mgr_t * p_manager);
984
985 /**
986  * Inits the Info
987  *
988  * @param       p_stream                the stream to write data to.
989  * @param       p_j2k                   J2K codec.
990  * @param       p_manager               the user event manager.
991 */
992 static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
993                                   opj_stream_private_t *p_stream,
994                                   opj_event_mgr_t * p_manager);
995
996 /**
997 Add main header marker information
998 @param cstr_index    Codestream information structure
999 @param type         marker type
1000 @param pos          byte offset of marker segment
1001 @param len          length of marker segment
1002  */
1003 static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
1004                                      OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;
1005 /**
1006 Add tile header marker information
1007 @param tileno       tile index number
1008 @param cstr_index   Codestream information structure
1009 @param type         marker type
1010 @param pos          byte offset of marker segment
1011 @param len          length of marker segment
1012  */
1013 static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
1014                                      opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
1015                                      OPJ_UINT32 len);
1016
1017 /**
1018  * Reads an unknown marker
1019  *
1020  * @param       p_j2k                   the jpeg2000 codec.
1021  * @param       p_stream                the stream object to read from.
1022  * @param       output_marker           FIXME DOC
1023  * @param       p_manager               the user event manager.
1024  *
1025  * @return      true                    if the marker could be deduced.
1026 */
1027 static OPJ_BOOL opj_j2k_read_unk(opj_j2k_t *p_j2k,
1028                                  opj_stream_private_t *p_stream,
1029                                  OPJ_UINT32 *output_marker,
1030                                  opj_event_mgr_t * p_manager);
1031
1032 /**
1033  * Writes the MCT marker (Multiple Component Transform)
1034  *
1035  * @param       p_j2k           J2K codec.
1036  * @param       p_mct_record    FIXME DOC
1037  * @param       p_stream        the stream to write data to.
1038  * @param       p_manager       the user event manager.
1039 */
1040 static OPJ_BOOL opj_j2k_write_mct_record(opj_j2k_t *p_j2k,
1041         opj_mct_data_t * p_mct_record,
1042         opj_stream_private_t *p_stream,
1043         opj_event_mgr_t * p_manager);
1044
1045 /**
1046  * Reads a MCT marker (Multiple Component Transform)
1047  *
1048  * @param       p_header_data   the data contained in the MCT box.
1049  * @param       p_j2k                   the jpeg2000 codec.
1050  * @param       p_header_size   the size of the data contained in the MCT marker.
1051  * @param       p_manager               the user event manager.
1052 */
1053 static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
1054                                  OPJ_BYTE * p_header_data,
1055                                  OPJ_UINT32 p_header_size,
1056                                  opj_event_mgr_t * p_manager);
1057
1058 /**
1059  * Writes the MCC marker (Multiple Component Collection)
1060  *
1061  * @param       p_j2k                   J2K codec.
1062  * @param       p_mcc_record            FIXME DOC
1063  * @param       p_stream                the stream to write data to.
1064  * @param       p_manager               the user event manager.
1065 */
1066 static OPJ_BOOL opj_j2k_write_mcc_record(opj_j2k_t *p_j2k,
1067         opj_simple_mcc_decorrelation_data_t * p_mcc_record,
1068         opj_stream_private_t *p_stream,
1069         opj_event_mgr_t * p_manager);
1070
1071 /**
1072  * Reads a MCC marker (Multiple Component Collection)
1073  *
1074  * @param       p_header_data   the data contained in the MCC box.
1075  * @param       p_j2k                   the jpeg2000 codec.
1076  * @param       p_header_size   the size of the data contained in the MCC marker.
1077  * @param       p_manager               the user event manager.
1078 */
1079 static OPJ_BOOL opj_j2k_read_mcc(opj_j2k_t *p_j2k,
1080                                  OPJ_BYTE * p_header_data,
1081                                  OPJ_UINT32 p_header_size,
1082                                  opj_event_mgr_t * p_manager);
1083
1084 /**
1085  * Writes the MCO marker (Multiple component transformation ordering)
1086  *
1087  * @param       p_stream                                the stream to write data to.
1088  * @param       p_j2k                           J2K codec.
1089  * @param       p_manager               the user event manager.
1090 */
1091 static OPJ_BOOL opj_j2k_write_mco(opj_j2k_t *p_j2k,
1092                                   opj_stream_private_t *p_stream,
1093                                   opj_event_mgr_t * p_manager);
1094
1095 /**
1096  * Reads a MCO marker (Multiple Component Transform Ordering)
1097  *
1098  * @param       p_header_data   the data contained in the MCO box.
1099  * @param       p_j2k                   the jpeg2000 codec.
1100  * @param       p_header_size   the size of the data contained in the MCO marker.
1101  * @param       p_manager               the user event manager.
1102 */
1103 static OPJ_BOOL opj_j2k_read_mco(opj_j2k_t *p_j2k,
1104                                  OPJ_BYTE * p_header_data,
1105                                  OPJ_UINT32 p_header_size,
1106                                  opj_event_mgr_t * p_manager);
1107
1108 static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
1109                                 OPJ_UINT32 p_index);
1110
1111 static void  opj_j2k_read_int16_to_float(const void * p_src_data,
1112         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1113 static void  opj_j2k_read_int32_to_float(const void * p_src_data,
1114         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1115 static void  opj_j2k_read_float32_to_float(const void * p_src_data,
1116         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1117 static void  opj_j2k_read_float64_to_float(const void * p_src_data,
1118         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1119
1120 static void  opj_j2k_read_int16_to_int32(const void * p_src_data,
1121         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1122 static void  opj_j2k_read_int32_to_int32(const void * p_src_data,
1123         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1124 static void  opj_j2k_read_float32_to_int32(const void * p_src_data,
1125         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1126 static void  opj_j2k_read_float64_to_int32(const void * p_src_data,
1127         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1128
1129 static void  opj_j2k_write_float_to_int16(const void * p_src_data,
1130         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1131 static void  opj_j2k_write_float_to_int32(const void * p_src_data,
1132         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1133 static void  opj_j2k_write_float_to_float(const void * p_src_data,
1134         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1135 static void  opj_j2k_write_float_to_float64(const void * p_src_data,
1136         void * p_dest_data, OPJ_UINT32 p_nb_elem);
1137
1138 /**
1139  * Ends the encoding, i.e. frees memory.
1140  *
1141  * @param       p_stream                the stream to write data to.
1142  * @param       p_j2k                   J2K codec.
1143  * @param       p_manager               the user event manager.
1144 */
1145 static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
1146                                      opj_stream_private_t *p_stream,
1147                                      opj_event_mgr_t * p_manager);
1148
1149 /**
1150  * Writes the CBD marker (Component bit depth definition)
1151  *
1152  * @param       p_stream                                the stream to write data to.
1153  * @param       p_j2k                           J2K codec.
1154  * @param       p_manager               the user event manager.
1155 */
1156 static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
1157                                   opj_stream_private_t *p_stream,
1158                                   opj_event_mgr_t * p_manager);
1159
1160 /**
1161  * Reads a CBD marker (Component bit depth definition)
1162  * @param       p_header_data   the data contained in the CBD box.
1163  * @param       p_j2k                   the jpeg2000 codec.
1164  * @param       p_header_size   the size of the data contained in the CBD marker.
1165  * @param       p_manager               the user event manager.
1166 */
1167 static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
1168                                  OPJ_BYTE * p_header_data,
1169                                  OPJ_UINT32 p_header_size,
1170                                  opj_event_mgr_t * p_manager);
1171
1172
1173 /**
1174  * Writes COC marker for each component.
1175  *
1176  * @param       p_stream                the stream to write data to.
1177  * @param       p_j2k                   J2K codec.
1178  * @param       p_manager               the user event manager.
1179 */
1180 static OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,
1181                                       opj_stream_private_t *p_stream,
1182                                       opj_event_mgr_t * p_manager);
1183
1184 /**
1185  * Writes QCC marker for each component.
1186  *
1187  * @param       p_stream                the stream to write data to.
1188  * @param       p_j2k                   J2K codec.
1189  * @param       p_manager               the user event manager.
1190 */
1191 static OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,
1192                                       opj_stream_private_t *p_stream,
1193                                       opj_event_mgr_t * p_manager);
1194
1195 /**
1196  * Writes regions of interests.
1197  *
1198  * @param       p_stream                the stream to write data to.
1199  * @param       p_j2k                   J2K codec.
1200  * @param       p_manager               the user event manager.
1201 */
1202 static OPJ_BOOL opj_j2k_write_regions(opj_j2k_t *p_j2k,
1203                                       opj_stream_private_t *p_stream,
1204                                       opj_event_mgr_t * p_manager);
1205
1206 /**
1207  * Writes EPC ????
1208  *
1209  * @param       p_stream                the stream to write data to.
1210  * @param       p_j2k                   J2K codec.
1211  * @param       p_manager               the user event manager.
1212 */
1213 static OPJ_BOOL opj_j2k_write_epc(opj_j2k_t *p_j2k,
1214                                   opj_stream_private_t *p_stream,
1215                                   opj_event_mgr_t * p_manager);
1216
1217 /**
1218  * Checks the progression order changes values. Tells of the poc given as input are valid.
1219  * A nice message is outputted at errors.
1220  *
1221  * @param       p_pocs                  the progression order changes.
1222  * @param       tileno                  the tile number of interest
1223  * @param       p_nb_pocs               the number of progression order changes.
1224  * @param       p_nb_resolutions        the number of resolutions.
1225  * @param       numcomps                the number of components
1226  * @param       numlayers               the number of layers.
1227  * @param       p_manager               the user event manager.
1228  *
1229  * @return      true if the pocs are valid.
1230  */
1231 static OPJ_BOOL opj_j2k_check_poc_val(const opj_poc_t *p_pocs,
1232                                       OPJ_UINT32 tileno,
1233                                       OPJ_UINT32 p_nb_pocs,
1234                                       OPJ_UINT32 p_nb_resolutions,
1235                                       OPJ_UINT32 numcomps,
1236                                       OPJ_UINT32 numlayers,
1237                                       opj_event_mgr_t * p_manager);
1238
1239 /**
1240  * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
1241  *
1242  * @param               cp                      the coding parameters.
1243  * @param               pino            the offset of the given poc (i.e. its position in the coding parameter).
1244  * @param               tileno          the given tile.
1245  *
1246  * @return              the number of tile parts.
1247  */
1248 static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino,
1249                                      OPJ_UINT32 tileno);
1250
1251 /**
1252  * Calculates the total number of tile parts needed by the encoder to
1253  * encode such an image. If not enough memory is available, then the function return false.
1254  *
1255  * @param       p_nb_tiles      pointer that will hold the number of tile parts.
1256  * @param       cp                      the coding parameters for the image.
1257  * @param       image           the image to encode.
1258  * @param       p_j2k                   the p_j2k encoder.
1259  * @param       p_manager       the user event manager.
1260  *
1261  * @return true if the function was successful, false else.
1262  */
1263 static OPJ_BOOL opj_j2k_calculate_tp(opj_j2k_t *p_j2k,
1264                                      opj_cp_t *cp,
1265                                      OPJ_UINT32 * p_nb_tiles,
1266                                      opj_image_t *image,
1267                                      opj_event_mgr_t * p_manager);
1268
1269 static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream);
1270
1271 static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream);
1272
1273 static opj_codestream_index_t* opj_j2k_create_cstr_index(void);
1274
1275 static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp);
1276
1277 static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp);
1278
1279 static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres);
1280
1281 static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
1282         opj_image_t *image, opj_event_mgr_t *p_manager);
1283
1284 static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
1285         opj_event_mgr_t *p_manager);
1286
1287 /**
1288  * Checks for invalid number of tile-parts in SOT marker (TPsot==TNsot). See issue 254.
1289  *
1290  * @param       p_stream            the stream to read data from.
1291  * @param       tile_no             tile number we're looking for.
1292  * @param       p_correction_needed output value. if true, non conformant codestream needs TNsot correction.
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_need_nb_tile_parts_correction(opj_stream_private_t
1298         *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
1299         opj_event_mgr_t * p_manager);
1300
1301 /*@}*/
1302
1303 /*@}*/
1304
1305 /* ----------------------------------------------------------------------- */
1306 typedef struct j2k_prog_order {
1307     OPJ_PROG_ORDER enum_prog;
1308     char str_prog[5];
1309 } j2k_prog_order_t;
1310
1311 static const j2k_prog_order_t j2k_prog_order_list[] = {
1312     {OPJ_CPRL, "CPRL"},
1313     {OPJ_LRCP, "LRCP"},
1314     {OPJ_PCRL, "PCRL"},
1315     {OPJ_RLCP, "RLCP"},
1316     {OPJ_RPCL, "RPCL"},
1317     {(OPJ_PROG_ORDER) - 1, ""}
1318 };
1319
1320 /**
1321  * FIXME DOC
1322  */
1323 static const OPJ_UINT32 MCT_ELEMENT_SIZE [] = {
1324     2,
1325     4,
1326     4,
1327     8
1328 };
1329
1330 typedef void (* opj_j2k_mct_function)(const void * p_src_data,
1331                                       void * p_dest_data, OPJ_UINT32 p_nb_elem);
1332
1333 static const opj_j2k_mct_function j2k_mct_read_functions_to_float [] = {
1334     opj_j2k_read_int16_to_float,
1335     opj_j2k_read_int32_to_float,
1336     opj_j2k_read_float32_to_float,
1337     opj_j2k_read_float64_to_float
1338 };
1339
1340 static const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] = {
1341     opj_j2k_read_int16_to_int32,
1342     opj_j2k_read_int32_to_int32,
1343     opj_j2k_read_float32_to_int32,
1344     opj_j2k_read_float64_to_int32
1345 };
1346
1347 static const opj_j2k_mct_function j2k_mct_write_functions_from_float [] = {
1348     opj_j2k_write_float_to_int16,
1349     opj_j2k_write_float_to_int32,
1350     opj_j2k_write_float_to_float,
1351     opj_j2k_write_float_to_float64
1352 };
1353
1354 typedef struct opj_dec_memory_marker_handler {
1355     /** marker value */
1356     OPJ_UINT32 id;
1357     /** value of the state when the marker can appear */
1358     OPJ_UINT32 states;
1359     /** action linked to the marker */
1360     OPJ_BOOL(*handler)(opj_j2k_t *p_j2k,
1361                        OPJ_BYTE * p_header_data,
1362                        OPJ_UINT32 p_header_size,
1363                        opj_event_mgr_t * p_manager);
1364 }
1365 opj_dec_memory_marker_handler_t;
1366
1367 static const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
1368 {
1369     {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},
1370     {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},
1371     {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},
1372     {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},
1373     {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},
1374     {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},
1375     {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},
1376     {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},
1377     {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},
1378     {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},
1379     {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},
1380     {J2K_MS_PPM, J2K_STATE_MH, opj_j2k_read_ppm},
1381     {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},
1382     {J2K_MS_SOP, 0, 0},
1383     {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},
1384     {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},
1385     {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},
1386     {J2K_MS_CBD, J2K_STATE_MH, opj_j2k_read_cbd},
1387     {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},
1388     {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},
1389 #ifdef USE_JPWL
1390 #ifdef TODO_MS /* remove these functions which are not commpatible with the v2 API */
1391     {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
1392     {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
1393     {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
1394     {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
1395 #endif
1396 #endif /* USE_JPWL */
1397 #ifdef USE_JPSEC
1398     {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
1399     {J2K_MS_INSEC, 0, j2k_read_insec}
1400 #endif /* USE_JPSEC */
1401     {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/
1402 };
1403
1404 static void  opj_j2k_read_int16_to_float(const void * p_src_data,
1405         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1406 {
1407     OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1408     OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1409     OPJ_UINT32 i;
1410     OPJ_UINT32 l_temp;
1411
1412     for (i = 0; i < p_nb_elem; ++i) {
1413         opj_read_bytes(l_src_data, &l_temp, 2);
1414
1415         l_src_data += sizeof(OPJ_INT16);
1416
1417         *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1418     }
1419 }
1420
1421 static void  opj_j2k_read_int32_to_float(const void * p_src_data,
1422         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1423 {
1424     OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1425     OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1426     OPJ_UINT32 i;
1427     OPJ_UINT32 l_temp;
1428
1429     for (i = 0; i < p_nb_elem; ++i) {
1430         opj_read_bytes(l_src_data, &l_temp, 4);
1431
1432         l_src_data += sizeof(OPJ_INT32);
1433
1434         *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1435     }
1436 }
1437
1438 static void  opj_j2k_read_float32_to_float(const void * p_src_data,
1439         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1440 {
1441     OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1442     OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1443     OPJ_UINT32 i;
1444     OPJ_FLOAT32 l_temp;
1445
1446     for (i = 0; i < p_nb_elem; ++i) {
1447         opj_read_float(l_src_data, &l_temp);
1448
1449         l_src_data += sizeof(OPJ_FLOAT32);
1450
1451         *(l_dest_data++) = l_temp;
1452     }
1453 }
1454
1455 static void  opj_j2k_read_float64_to_float(const void * p_src_data,
1456         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1457 {
1458     OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1459     OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1460     OPJ_UINT32 i;
1461     OPJ_FLOAT64 l_temp;
1462
1463     for (i = 0; i < p_nb_elem; ++i) {
1464         opj_read_double(l_src_data, &l_temp);
1465
1466         l_src_data += sizeof(OPJ_FLOAT64);
1467
1468         *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1469     }
1470 }
1471
1472 static void  opj_j2k_read_int16_to_int32(const void * p_src_data,
1473         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1474 {
1475     OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1476     OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1477     OPJ_UINT32 i;
1478     OPJ_UINT32 l_temp;
1479
1480     for (i = 0; i < p_nb_elem; ++i) {
1481         opj_read_bytes(l_src_data, &l_temp, 2);
1482
1483         l_src_data += sizeof(OPJ_INT16);
1484
1485         *(l_dest_data++) = (OPJ_INT32) l_temp;
1486     }
1487 }
1488
1489 static void  opj_j2k_read_int32_to_int32(const void * p_src_data,
1490         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1491 {
1492     OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1493     OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1494     OPJ_UINT32 i;
1495     OPJ_UINT32 l_temp;
1496
1497     for (i = 0; i < p_nb_elem; ++i) {
1498         opj_read_bytes(l_src_data, &l_temp, 4);
1499
1500         l_src_data += sizeof(OPJ_INT32);
1501
1502         *(l_dest_data++) = (OPJ_INT32) l_temp;
1503     }
1504 }
1505
1506 static void  opj_j2k_read_float32_to_int32(const void * p_src_data,
1507         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1508 {
1509     OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1510     OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1511     OPJ_UINT32 i;
1512     OPJ_FLOAT32 l_temp;
1513
1514     for (i = 0; i < p_nb_elem; ++i) {
1515         opj_read_float(l_src_data, &l_temp);
1516
1517         l_src_data += sizeof(OPJ_FLOAT32);
1518
1519         *(l_dest_data++) = (OPJ_INT32) l_temp;
1520     }
1521 }
1522
1523 static void  opj_j2k_read_float64_to_int32(const void * p_src_data,
1524         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1525 {
1526     OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1527     OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1528     OPJ_UINT32 i;
1529     OPJ_FLOAT64 l_temp;
1530
1531     for (i = 0; i < p_nb_elem; ++i) {
1532         opj_read_double(l_src_data, &l_temp);
1533
1534         l_src_data += sizeof(OPJ_FLOAT64);
1535
1536         *(l_dest_data++) = (OPJ_INT32) l_temp;
1537     }
1538 }
1539
1540 static void  opj_j2k_write_float_to_int16(const void * p_src_data,
1541         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1542 {
1543     OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1544     OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1545     OPJ_UINT32 i;
1546     OPJ_UINT32 l_temp;
1547
1548     for (i = 0; i < p_nb_elem; ++i) {
1549         l_temp = (OPJ_UINT32) * (l_src_data++);
1550
1551         opj_write_bytes(l_dest_data, l_temp, sizeof(OPJ_INT16));
1552
1553         l_dest_data += sizeof(OPJ_INT16);
1554     }
1555 }
1556
1557 static void opj_j2k_write_float_to_int32(const void * p_src_data,
1558         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1559 {
1560     OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1561     OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1562     OPJ_UINT32 i;
1563     OPJ_UINT32 l_temp;
1564
1565     for (i = 0; i < p_nb_elem; ++i) {
1566         l_temp = (OPJ_UINT32) * (l_src_data++);
1567
1568         opj_write_bytes(l_dest_data, l_temp, sizeof(OPJ_INT32));
1569
1570         l_dest_data += sizeof(OPJ_INT32);
1571     }
1572 }
1573
1574 static void  opj_j2k_write_float_to_float(const void * p_src_data,
1575         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1576 {
1577     OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1578     OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1579     OPJ_UINT32 i;
1580     OPJ_FLOAT32 l_temp;
1581
1582     for (i = 0; i < p_nb_elem; ++i) {
1583         l_temp = (OPJ_FLOAT32) * (l_src_data++);
1584
1585         opj_write_float(l_dest_data, l_temp);
1586
1587         l_dest_data += sizeof(OPJ_FLOAT32);
1588     }
1589 }
1590
1591 static void  opj_j2k_write_float_to_float64(const void * p_src_data,
1592         void * p_dest_data, OPJ_UINT32 p_nb_elem)
1593 {
1594     OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1595     OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1596     OPJ_UINT32 i;
1597     OPJ_FLOAT64 l_temp;
1598
1599     for (i = 0; i < p_nb_elem; ++i) {
1600         l_temp = (OPJ_FLOAT64) * (l_src_data++);
1601
1602         opj_write_double(l_dest_data, l_temp);
1603
1604         l_dest_data += sizeof(OPJ_FLOAT64);
1605     }
1606 }
1607
1608 const char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order)
1609 {
1610     const j2k_prog_order_t *po;
1611     for (po = j2k_prog_order_list; po->enum_prog != -1; po++) {
1612         if (po->enum_prog == prg_order) {
1613             return po->str_prog;
1614         }
1615     }
1616     return po->str_prog;
1617 }
1618
1619 static OPJ_BOOL opj_j2k_check_poc_val(const opj_poc_t *p_pocs,
1620                                       OPJ_UINT32 tileno,
1621                                       OPJ_UINT32 p_nb_pocs,
1622                                       OPJ_UINT32 p_nb_resolutions,
1623                                       OPJ_UINT32 p_num_comps,
1624                                       OPJ_UINT32 p_num_layers,
1625                                       opj_event_mgr_t * p_manager)
1626 {
1627     OPJ_UINT32* packet_array;
1628     OPJ_UINT32 index, resno, compno, layno;
1629     OPJ_UINT32 i;
1630     OPJ_UINT32 step_c = 1;
1631     OPJ_UINT32 step_r = p_num_comps * step_c;
1632     OPJ_UINT32 step_l = p_nb_resolutions * step_r;
1633     OPJ_BOOL loss = OPJ_FALSE;
1634
1635     assert(p_nb_pocs > 0);
1636
1637     packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers,
1638                                             sizeof(OPJ_UINT32));
1639     if (packet_array == 00) {
1640         opj_event_msg(p_manager, EVT_ERROR,
1641                       "Not enough memory for checking the poc values.\n");
1642         return OPJ_FALSE;
1643     }
1644
1645     /* iterate through all the pocs that match our tile of interest. */
1646     for (i = 0; i < p_nb_pocs; ++i) {
1647         const opj_poc_t *poc = &p_pocs[i];
1648         if (tileno + 1 == poc->tile) {
1649             index = step_r * poc->resno0;
1650
1651             /* take each resolution for each poc */
1652             for (resno = poc->resno0 ;
1653                     resno < opj_uint_min(poc->resno1, p_nb_resolutions); ++resno) {
1654                 OPJ_UINT32 res_index = index + poc->compno0 * step_c;
1655
1656                 /* take each comp of each resolution for each poc */
1657                 for (compno = poc->compno0 ;
1658                         compno < opj_uint_min(poc->compno1, p_num_comps); ++compno) {
1659                     /* The layer index always starts at zero for every progression. */
1660                     const OPJ_UINT32 layno0 = 0;
1661                     OPJ_UINT32 comp_index = res_index + layno0 * step_l;
1662
1663                     /* and finally take each layer of each res of ... */
1664                     for (layno = layno0; layno < opj_uint_min(poc->layno1, p_num_layers);
1665                             ++layno) {
1666                         packet_array[comp_index] = 1;
1667                         comp_index += step_l;
1668                     }
1669
1670                     res_index += step_c;
1671                 }
1672
1673                 index += step_r;
1674             }
1675         }
1676     }
1677
1678     index = 0;
1679     for (layno = 0; layno < p_num_layers ; ++layno) {
1680         for (resno = 0; resno < p_nb_resolutions; ++resno) {
1681             for (compno = 0; compno < p_num_comps; ++compno) {
1682                 loss |= (packet_array[index] != 1);
1683 #ifdef DEBUG_VERBOSE
1684                 if (packet_array[index] != 1) {
1685                     fprintf(stderr,
1686                             "Missing packet in POC: layno=%d resno=%d compno=%d\n",
1687                             layno, resno, compno);
1688                 }
1689 #endif
1690                 index += step_c;
1691             }
1692         }
1693     }
1694
1695     if (loss) {
1696         opj_event_msg(p_manager, EVT_ERROR, "Missing packets possible loss of data\n");
1697     }
1698
1699     opj_free(packet_array);
1700
1701     return !loss;
1702 }
1703
1704 /* ----------------------------------------------------------------------- */
1705
1706 static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino,
1707                                      OPJ_UINT32 tileno)
1708 {
1709     const OPJ_CHAR *prog = 00;
1710     OPJ_INT32 i;
1711     OPJ_UINT32 tpnum = 1;
1712     opj_tcp_t *tcp = 00;
1713     opj_poc_t * l_current_poc = 00;
1714
1715     /*  preconditions */
1716     assert(tileno < (cp->tw * cp->th));
1717     assert(pino < (cp->tcps[tileno].numpocs + 1));
1718
1719     /* get the given tile coding parameter */
1720     tcp = &cp->tcps[tileno];
1721     assert(tcp != 00);
1722
1723     l_current_poc = &(tcp->pocs[pino]);
1724     assert(l_current_poc != 0);
1725
1726     /* get the progression order as a character string */
1727     prog = opj_j2k_convert_progression_order(tcp->prg);
1728     assert(strlen(prog) > 0);
1729
1730     if (cp->m_specific_param.m_enc.m_tp_on == 1) {
1731         for (i = 0; i < 4; ++i) {
1732             switch (prog[i]) {
1733             /* component wise */
1734             case 'C':
1735                 tpnum *= l_current_poc->compE;
1736                 break;
1737             /* resolution wise */
1738             case 'R':
1739                 tpnum *= l_current_poc->resE;
1740                 break;
1741             /* precinct wise */
1742             case 'P':
1743                 tpnum *= l_current_poc->prcE;
1744                 break;
1745             /* layer wise */
1746             case 'L':
1747                 tpnum *= l_current_poc->layE;
1748                 break;
1749             }
1750             /* whould we split here ? */
1751             if (cp->m_specific_param.m_enc.m_tp_flag == prog[i]) {
1752                 cp->m_specific_param.m_enc.m_tp_pos = i;
1753                 break;
1754             }
1755         }
1756     } else {
1757         tpnum = 1;
1758     }
1759
1760     return tpnum;
1761 }
1762
1763 static OPJ_BOOL opj_j2k_calculate_tp(opj_j2k_t *p_j2k,
1764                                      opj_cp_t *cp,
1765                                      OPJ_UINT32 * p_nb_tiles,
1766                                      opj_image_t *image,
1767                                      opj_event_mgr_t * p_manager
1768                                     )
1769 {
1770     OPJ_UINT32 pino, tileno;
1771     OPJ_UINT32 l_nb_tiles;
1772     opj_tcp_t *tcp;
1773
1774     /* preconditions */
1775     assert(p_nb_tiles != 00);
1776     assert(cp != 00);
1777     assert(image != 00);
1778     assert(p_j2k != 00);
1779     assert(p_manager != 00);
1780
1781     OPJ_UNUSED(p_j2k);
1782     OPJ_UNUSED(p_manager);
1783
1784     l_nb_tiles = cp->tw * cp->th;
1785     * p_nb_tiles = 0;
1786     tcp = cp->tcps;
1787
1788     /* INDEX >> */
1789     /* TODO mergeV2: check this part which use cstr_info */
1790     /*if (p_j2k->cstr_info) {
1791             opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
1792
1793             for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1794                     OPJ_UINT32 cur_totnum_tp = 0;
1795
1796                     opj_pi_update_encoding_parameters(image,cp,tileno);
1797
1798                     for (pino = 0; pino <= tcp->numpocs; ++pino)
1799                     {
1800                             OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
1801
1802                             *p_nb_tiles = *p_nb_tiles + tp_num;
1803
1804                             cur_totnum_tp += tp_num;
1805                     }
1806
1807                     tcp->m_nb_tile_parts = cur_totnum_tp;
1808
1809                     l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
1810                     if (l_info_tile_ptr->tp == 00) {
1811                             return OPJ_FALSE;
1812                     }
1813
1814                     memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
1815
1816                     l_info_tile_ptr->num_tps = cur_totnum_tp;
1817
1818                     ++l_info_tile_ptr;
1819                     ++tcp;
1820             }
1821     }
1822     else */{
1823         for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1824             OPJ_UINT32 cur_totnum_tp = 0;
1825
1826             opj_pi_update_encoding_parameters(image, cp, tileno);
1827
1828             for (pino = 0; pino <= tcp->numpocs; ++pino) {
1829                 OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp, pino, tileno);
1830
1831                 *p_nb_tiles = *p_nb_tiles + tp_num;
1832
1833                 cur_totnum_tp += tp_num;
1834             }
1835             tcp->m_nb_tile_parts = cur_totnum_tp;
1836
1837             ++tcp;
1838         }
1839     }
1840
1841     return OPJ_TRUE;
1842 }
1843
1844 static OPJ_BOOL opj_j2k_write_soc(opj_j2k_t *p_j2k,
1845                                   opj_stream_private_t *p_stream,
1846                                   opj_event_mgr_t * p_manager)
1847 {
1848     /* 2 bytes will be written */
1849     OPJ_BYTE * l_start_stream = 00;
1850
1851     /* preconditions */
1852     assert(p_stream != 00);
1853     assert(p_j2k != 00);
1854     assert(p_manager != 00);
1855
1856     l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1857
1858     /* write SOC identifier */
1859     opj_write_bytes(l_start_stream, J2K_MS_SOC, 2);
1860
1861     if (opj_stream_write_data(p_stream, l_start_stream, 2, p_manager) != 2) {
1862         return OPJ_FALSE;
1863     }
1864
1865     /* UniPG>> */
1866 #ifdef USE_JPWL
1867     /* update markers struct */
1868     /*
1869             OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
1870     */
1871     assert(0 && "TODO");
1872 #endif /* USE_JPWL */
1873     /* <<UniPG */
1874
1875     return OPJ_TRUE;
1876 }
1877
1878 /**
1879  * Reads a SOC marker (Start of Codestream)
1880  * @param       p_j2k           the jpeg2000 file codec.
1881  * @param       p_stream        FIXME DOC
1882  * @param       p_manager       the user event manager.
1883 */
1884 static OPJ_BOOL opj_j2k_read_soc(opj_j2k_t *p_j2k,
1885                                  opj_stream_private_t *p_stream,
1886                                  opj_event_mgr_t * p_manager
1887                                 )
1888 {
1889     OPJ_BYTE l_data [2];
1890     OPJ_UINT32 l_marker;
1891
1892     /* preconditions */
1893     assert(p_j2k != 00);
1894     assert(p_manager != 00);
1895     assert(p_stream != 00);
1896
1897     if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
1898         return OPJ_FALSE;
1899     }
1900
1901     opj_read_bytes(l_data, &l_marker, 2);
1902     if (l_marker != J2K_MS_SOC) {
1903         return OPJ_FALSE;
1904     }
1905
1906     /* Next marker should be a SIZ marker in the main header */
1907     p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;
1908
1909     /* FIXME move it in a index structure included in p_j2k*/
1910     p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
1911
1912     opj_event_msg(p_manager, EVT_INFO,
1913                   "Start to read j2k main header (%" PRId64 ").\n",
1914                   p_j2k->cstr_index->main_head_start);
1915
1916     /* Add the marker to the codestream index*/
1917     if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC,
1918                                           p_j2k->cstr_index->main_head_start, 2)) {
1919         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
1920         return OPJ_FALSE;
1921     }
1922     return OPJ_TRUE;
1923 }
1924
1925 static OPJ_BOOL opj_j2k_write_siz(opj_j2k_t *p_j2k,
1926                                   opj_stream_private_t *p_stream,
1927                                   opj_event_mgr_t * p_manager)
1928 {
1929     OPJ_UINT32 i;
1930     OPJ_UINT32 l_size_len;
1931     OPJ_BYTE * l_current_ptr;
1932     opj_image_t * l_image = 00;
1933     opj_cp_t *cp = 00;
1934     opj_image_comp_t * l_img_comp = 00;
1935
1936     /* preconditions */
1937     assert(p_stream != 00);
1938     assert(p_j2k != 00);
1939     assert(p_manager != 00);
1940
1941     l_image = p_j2k->m_private_image;
1942     cp = &(p_j2k->m_cp);
1943     l_size_len = 40 + 3 * l_image->numcomps;
1944     l_img_comp = l_image->comps;
1945
1946     if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
1947
1948         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
1949                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);
1950         if (! new_header_tile_data) {
1951             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
1952             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
1953             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
1954             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n");
1955             return OPJ_FALSE;
1956         }
1957         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
1958         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
1959     }
1960
1961     l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1962
1963     /* write SOC identifier */
1964     opj_write_bytes(l_current_ptr, J2K_MS_SIZ, 2);  /* SIZ */
1965     l_current_ptr += 2;
1966
1967     opj_write_bytes(l_current_ptr, l_size_len - 2, 2); /* L_SIZ */
1968     l_current_ptr += 2;
1969
1970     opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */
1971     l_current_ptr += 2;
1972
1973     opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
1974     l_current_ptr += 4;
1975
1976     opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
1977     l_current_ptr += 4;
1978
1979     opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
1980     l_current_ptr += 4;
1981
1982     opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
1983     l_current_ptr += 4;
1984
1985     opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */
1986     l_current_ptr += 4;
1987
1988     opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */
1989     l_current_ptr += 4;
1990
1991     opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */
1992     l_current_ptr += 4;
1993
1994     opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */
1995     l_current_ptr += 4;
1996
1997     opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */
1998     l_current_ptr += 2;
1999
2000     for (i = 0; i < l_image->numcomps; ++i) {
2001         /* TODO here with MCT ? */
2002         opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7),
2003                         1);      /* Ssiz_i */
2004         ++l_current_ptr;
2005
2006         opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */
2007         ++l_current_ptr;
2008
2009         opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */
2010         ++l_current_ptr;
2011
2012         ++l_img_comp;
2013     }
2014
2015     if (opj_stream_write_data(p_stream,
2016                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len,
2017                               p_manager) != l_size_len) {
2018         return OPJ_FALSE;
2019     }
2020
2021     return OPJ_TRUE;
2022 }
2023
2024 /**
2025  * Reads a SIZ marker (image and tile size)
2026  * @param       p_j2k           the jpeg2000 file codec.
2027  * @param       p_header_data   the data contained in the SIZ box.
2028  * @param       p_header_size   the size of the data contained in the SIZ marker.
2029  * @param       p_manager       the user event manager.
2030 */
2031 static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
2032                                  OPJ_BYTE * p_header_data,
2033                                  OPJ_UINT32 p_header_size,
2034                                  opj_event_mgr_t * p_manager
2035                                 )
2036 {
2037     OPJ_UINT32 i;
2038     OPJ_UINT32 l_nb_comp;
2039     OPJ_UINT32 l_nb_comp_remain;
2040     OPJ_UINT32 l_remaining_size;
2041     OPJ_UINT32 l_nb_tiles;
2042     OPJ_UINT32 l_tmp, l_tx1, l_ty1;
2043     OPJ_UINT32 l_prec0, l_sgnd0;
2044     opj_image_t *l_image = 00;
2045     opj_cp_t *l_cp = 00;
2046     opj_image_comp_t * l_img_comp = 00;
2047     opj_tcp_t * l_current_tile_param = 00;
2048
2049     /* preconditions */
2050     assert(p_j2k != 00);
2051     assert(p_manager != 00);
2052     assert(p_header_data != 00);
2053
2054     l_image = p_j2k->m_private_image;
2055     l_cp = &(p_j2k->m_cp);
2056
2057     /* minimum size == 39 - 3 (= minimum component parameter) */
2058     if (p_header_size < 36) {
2059         opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2060         return OPJ_FALSE;
2061     }
2062
2063     l_remaining_size = p_header_size - 36;
2064     l_nb_comp = l_remaining_size / 3;
2065     l_nb_comp_remain = l_remaining_size % 3;
2066     if (l_nb_comp_remain != 0) {
2067         opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2068         return OPJ_FALSE;
2069     }
2070
2071     opj_read_bytes(p_header_data, &l_tmp,
2072                    2);                                                /* Rsiz (capabilities) */
2073     p_header_data += 2;
2074     l_cp->rsiz = (OPJ_UINT16) l_tmp;
2075     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */
2076     p_header_data += 4;
2077     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */
2078     p_header_data += 4;
2079     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */
2080     p_header_data += 4;
2081     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */
2082     p_header_data += 4;
2083     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx,
2084                    4);             /* XTsiz */
2085     p_header_data += 4;
2086     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy,
2087                    4);             /* YTsiz */
2088     p_header_data += 4;
2089     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0,
2090                    4);             /* XT0siz */
2091     p_header_data += 4;
2092     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0,
2093                    4);             /* YT0siz */
2094     p_header_data += 4;
2095     opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp,
2096                    2);                 /* Csiz */
2097     p_header_data += 2;
2098     if (l_tmp < 16385) {
2099         l_image->numcomps = (OPJ_UINT16) l_tmp;
2100     } else {
2101         opj_event_msg(p_manager, EVT_ERROR,
2102                       "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
2103         return OPJ_FALSE;
2104     }
2105
2106     if (l_image->numcomps != l_nb_comp) {
2107         opj_event_msg(p_manager, EVT_ERROR,
2108                       "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n",
2109                       l_image->numcomps, l_nb_comp);
2110         return OPJ_FALSE;
2111     }
2112
2113     /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
2114     /* testcase issue427-null-image-size.jp2 */
2115     if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) {
2116         opj_event_msg(p_manager, EVT_ERROR,
2117                       "Error with SIZ marker: negative or zero image size (%" PRId64 " x %" PRId64
2118                       ")\n", (OPJ_INT64)l_image->x1 - l_image->x0,
2119                       (OPJ_INT64)l_image->y1 - l_image->y0);
2120         return OPJ_FALSE;
2121     }
2122     /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
2123     if ((l_cp->tdx == 0U) || (l_cp->tdy == 0U)) {
2124         opj_event_msg(p_manager, EVT_ERROR,
2125                       "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx,
2126                       l_cp->tdy);
2127         return OPJ_FALSE;
2128     }
2129
2130     /* testcase issue427-illegal-tile-offset.jp2 */
2131     l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */
2132     l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */
2133     if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) ||
2134             (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0)) {
2135         opj_event_msg(p_manager, EVT_ERROR,
2136                       "Error with SIZ marker: illegal tile offset\n");
2137         return OPJ_FALSE;
2138     }
2139     if (!p_j2k->dump_state) {
2140         OPJ_UINT32 siz_w, siz_h;
2141
2142         siz_w = l_image->x1 - l_image->x0;
2143         siz_h = l_image->y1 - l_image->y0;
2144
2145         if (p_j2k->ihdr_w > 0 && p_j2k->ihdr_h > 0
2146                 && (p_j2k->ihdr_w != siz_w || p_j2k->ihdr_h != siz_h)) {
2147             opj_event_msg(p_manager, EVT_ERROR,
2148                           "Error with SIZ marker: IHDR w(%u) h(%u) vs. SIZ w(%u) h(%u)\n", p_j2k->ihdr_w,
2149                           p_j2k->ihdr_h, siz_w, siz_h);
2150             return OPJ_FALSE;
2151         }
2152     }
2153 #ifdef USE_JPWL
2154     if (l_cp->correct) {
2155         /* if JPWL is on, we check whether TX errors have damaged
2156           too much the SIZ parameters */
2157         if (!(l_image->x1 * l_image->y1)) {
2158             opj_event_msg(p_manager, EVT_ERROR,
2159                           "JPWL: bad image size (%d x %d)\n",
2160                           l_image->x1, l_image->y1);
2161             if (!JPWL_ASSUME) {
2162                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2163                 return OPJ_FALSE;
2164             }
2165         }
2166
2167         /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ?
2168                 if (l_image->numcomps != ((len - 38) / 3)) {
2169                         opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2170                                 "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
2171                                 l_image->numcomps, ((len - 38) / 3));
2172                         if (!JPWL_ASSUME) {
2173                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2174                                 return OPJ_FALSE;
2175                         }
2176         */              /* we try to correct */
2177         /*              opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n");
2178                         if (l_image->numcomps < ((len - 38) / 3)) {
2179                                 len = 38 + 3 * l_image->numcomps;
2180                                 opj_event_msg(p_manager, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
2181                                         len);
2182                         } else {
2183                                 l_image->numcomps = ((len - 38) / 3);
2184                                 opj_event_msg(p_manager, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
2185                                         l_image->numcomps);
2186                         }
2187                 }
2188         */
2189
2190         /* update components number in the jpwl_exp_comps filed */
2191         l_cp->exp_comps = l_image->numcomps;
2192     }
2193 #endif /* USE_JPWL */
2194
2195     /* Allocate the resulting image components */
2196     l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps,
2197                      sizeof(opj_image_comp_t));
2198     if (l_image->comps == 00) {
2199         l_image->numcomps = 0;
2200         opj_event_msg(p_manager, EVT_ERROR,
2201                       "Not enough memory to take in charge SIZ marker\n");
2202         return OPJ_FALSE;
2203     }
2204
2205     l_img_comp = l_image->comps;
2206
2207     l_prec0 = 0;
2208     l_sgnd0 = 0;
2209     /* Read the component information */
2210     for (i = 0; i < l_image->numcomps; ++i) {
2211         OPJ_UINT32 tmp;
2212         opj_read_bytes(p_header_data, &tmp, 1); /* Ssiz_i */
2213         ++p_header_data;
2214         l_img_comp->prec = (tmp & 0x7f) + 1;
2215         l_img_comp->sgnd = tmp >> 7;
2216
2217         if (p_j2k->dump_state == 0) {
2218             if (i == 0) {
2219                 l_prec0 = l_img_comp->prec;
2220                 l_sgnd0 = l_img_comp->sgnd;
2221             } else if (!l_cp->allow_different_bit_depth_sign
2222                        && (l_img_comp->prec != l_prec0 || l_img_comp->sgnd != l_sgnd0)) {
2223                 opj_event_msg(p_manager, EVT_WARNING,
2224                               "Despite JP2 BPC!=255, precision and/or sgnd values for comp[%d] is different than comp[0]:\n"
2225                               "        [0] prec(%d) sgnd(%d) [%d] prec(%d) sgnd(%d)\n", i, l_prec0, l_sgnd0,
2226                               i, l_img_comp->prec, l_img_comp->sgnd);
2227             }
2228             /* TODO: we should perhaps also check against JP2 BPCC values */
2229         }
2230         opj_read_bytes(p_header_data, &tmp, 1); /* XRsiz_i */
2231         ++p_header_data;
2232         l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2233         opj_read_bytes(p_header_data, &tmp, 1); /* YRsiz_i */
2234         ++p_header_data;
2235         l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2236         if (l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
2237                 l_img_comp->dy < 1 || l_img_comp->dy > 255) {
2238             opj_event_msg(p_manager, EVT_ERROR,
2239                           "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n",
2240                           i, l_img_comp->dx, l_img_comp->dy);
2241             return OPJ_FALSE;
2242         }
2243         /* Avoids later undefined shift in computation of */
2244         /* p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
2245                     << (l_image->comps[i].prec - 1); */
2246         if (l_img_comp->prec > 31) {
2247             opj_event_msg(p_manager, EVT_ERROR,
2248                           "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",
2249                           i, l_img_comp->prec);
2250             return OPJ_FALSE;
2251         }
2252 #ifdef USE_JPWL
2253         if (l_cp->correct) {
2254             /* if JPWL is on, we check whether TX errors have damaged
2255                     too much the SIZ parameters, again */
2256             if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {
2257                 opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2258                               "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
2259                               i, i, l_image->comps[i].dx, l_image->comps[i].dy);
2260                 if (!JPWL_ASSUME) {
2261                     opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2262                     return OPJ_FALSE;
2263                 }
2264                 /* we try to correct */
2265                 opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
2266                 if (!l_image->comps[i].dx) {
2267                     l_image->comps[i].dx = 1;
2268                     opj_event_msg(p_manager, EVT_WARNING,
2269                                   "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
2270                                   i, l_image->comps[i].dx);
2271                 }
2272                 if (!l_image->comps[i].dy) {
2273                     l_image->comps[i].dy = 1;
2274                     opj_event_msg(p_manager, EVT_WARNING,
2275                                   "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
2276                                   i, l_image->comps[i].dy);
2277                 }
2278             }
2279         }
2280 #endif /* USE_JPWL */
2281         l_img_comp->resno_decoded =
2282             0;                                                          /* number of resolution decoded */
2283         l_img_comp->factor =
2284             l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
2285         ++l_img_comp;
2286     }
2287
2288     if (l_cp->tdx == 0 || l_cp->tdy == 0) {
2289         return OPJ_FALSE;
2290     }
2291
2292     /* Compute the number of tiles */
2293     l_cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->x1 - l_cp->tx0),
2294                                            (OPJ_INT32)l_cp->tdx);
2295     l_cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->y1 - l_cp->ty0),
2296                                            (OPJ_INT32)l_cp->tdy);
2297
2298     /* Check that the number of tiles is valid */
2299     if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
2300         opj_event_msg(p_manager, EVT_ERROR,
2301                       "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
2302                       l_cp->tw, l_cp->th);
2303         return OPJ_FALSE;
2304     }
2305     l_nb_tiles = l_cp->tw * l_cp->th;
2306
2307     /* Define the tiles which will be decoded */
2308     if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
2309         p_j2k->m_specific_param.m_decoder.m_start_tile_x =
2310             (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
2311         p_j2k->m_specific_param.m_decoder.m_start_tile_y =
2312             (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
2313         p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv((
2314                     OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0),
2315                 (OPJ_INT32)l_cp->tdx);
2316         p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv((
2317                     OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0),
2318                 (OPJ_INT32)l_cp->tdy);
2319     } else {
2320         p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
2321         p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
2322         p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
2323         p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
2324     }
2325
2326 #ifdef USE_JPWL
2327     if (l_cp->correct) {
2328         /* if JPWL is on, we check whether TX errors have damaged
2329           too much the SIZ parameters */
2330         if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) ||
2331                 (l_cp->th > l_cp->max_tiles)) {
2332             opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2333                           "JPWL: bad number of tiles (%d x %d)\n",
2334                           l_cp->tw, l_cp->th);
2335             if (!JPWL_ASSUME) {
2336                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2337                 return OPJ_FALSE;
2338             }
2339             /* we try to correct */
2340             opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
2341             if (l_cp->tw < 1) {
2342                 l_cp->tw = 1;
2343                 opj_event_msg(p_manager, EVT_WARNING,
2344                               "- setting %d tiles in x => HYPOTHESIS!!!\n",
2345                               l_cp->tw);
2346             }
2347             if (l_cp->tw > l_cp->max_tiles) {
2348                 l_cp->tw = 1;
2349                 opj_event_msg(p_manager, EVT_WARNING,
2350                               "- too large x, increase expectance of %d\n"
2351                               "- setting %d tiles in x => HYPOTHESIS!!!\n",
2352                               l_cp->max_tiles, l_cp->tw);
2353             }
2354             if (l_cp->th < 1) {
2355                 l_cp->th = 1;
2356                 opj_event_msg(p_manager, EVT_WARNING,
2357                               "- setting %d tiles in y => HYPOTHESIS!!!\n",
2358                               l_cp->th);
2359             }
2360             if (l_cp->th > l_cp->max_tiles) {
2361                 l_cp->th = 1;
2362                 opj_event_msg(p_manager, EVT_WARNING,
2363                               "- too large y, increase expectance of %d to continue\n",
2364                               "- setting %d tiles in y => HYPOTHESIS!!!\n",
2365                               l_cp->max_tiles, l_cp->th);
2366             }
2367         }
2368     }
2369 #endif /* USE_JPWL */
2370
2371     /* memory allocations */
2372     l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
2373     if (l_cp->tcps == 00) {
2374         opj_event_msg(p_manager, EVT_ERROR,
2375                       "Not enough memory to take in charge SIZ marker\n");
2376         return OPJ_FALSE;
2377     }
2378
2379 #ifdef USE_JPWL
2380     if (l_cp->correct) {
2381         if (!l_cp->tcps) {
2382             opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2383                           "JPWL: could not alloc tcps field of cp\n");
2384             if (!JPWL_ASSUME) {
2385                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2386                 return OPJ_FALSE;
2387             }
2388         }
2389     }
2390 #endif /* USE_JPWL */
2391
2392     p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
2393         (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
2394     if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps  == 00) {
2395         opj_event_msg(p_manager, EVT_ERROR,
2396                       "Not enough memory to take in charge SIZ marker\n");
2397         return OPJ_FALSE;
2398     }
2399
2400     p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
2401         (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS,
2402                                     sizeof(opj_mct_data_t));
2403
2404     if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {
2405         opj_event_msg(p_manager, EVT_ERROR,
2406                       "Not enough memory to take in charge SIZ marker\n");
2407         return OPJ_FALSE;
2408     }
2409     p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records =
2410         OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
2411
2412     p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
2413         (opj_simple_mcc_decorrelation_data_t*)
2414         opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS,
2415                    sizeof(opj_simple_mcc_decorrelation_data_t));
2416
2417     if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {
2418         opj_event_msg(p_manager, EVT_ERROR,
2419                       "Not enough memory to take in charge SIZ marker\n");
2420         return OPJ_FALSE;
2421     }
2422     p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records =
2423         OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
2424
2425     /* set up default dc level shift */
2426     for (i = 0; i < l_image->numcomps; ++i) {
2427         if (! l_image->comps[i].sgnd) {
2428             p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
2429                     << (l_image->comps[i].prec - 1);
2430         }
2431     }
2432
2433     l_current_tile_param = l_cp->tcps;
2434     for (i = 0; i < l_nb_tiles; ++i) {
2435         l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps,
2436                                       sizeof(opj_tccp_t));
2437         if (l_current_tile_param->tccps == 00) {
2438             opj_event_msg(p_manager, EVT_ERROR,
2439                           "Not enough memory to take in charge SIZ marker\n");
2440             return OPJ_FALSE;
2441         }
2442
2443         ++l_current_tile_param;
2444     }
2445
2446     p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MH;
2447     opj_image_comp_header_update(l_image, l_cp);
2448
2449     return OPJ_TRUE;
2450 }
2451
2452 static OPJ_BOOL opj_j2k_write_com(opj_j2k_t *p_j2k,
2453                                   opj_stream_private_t *p_stream,
2454                                   opj_event_mgr_t * p_manager
2455                                  )
2456 {
2457     OPJ_UINT32 l_comment_size;
2458     OPJ_UINT32 l_total_com_size;
2459     const OPJ_CHAR *l_comment;
2460     OPJ_BYTE * l_current_ptr = 00;
2461
2462     /* preconditions */
2463     assert(p_j2k != 00);
2464     assert(p_stream != 00);
2465     assert(p_manager != 00);
2466
2467     l_comment = p_j2k->m_cp.comment;
2468     l_comment_size = (OPJ_UINT32)strlen(l_comment);
2469     l_total_com_size = l_comment_size + 6;
2470
2471     if (l_total_com_size >
2472             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2473         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2474                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);
2475         if (! new_header_tile_data) {
2476             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2477             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2478             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2479             opj_event_msg(p_manager, EVT_ERROR,
2480                           "Not enough memory to write the COM marker\n");
2481             return OPJ_FALSE;
2482         }
2483         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2484         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
2485     }
2486
2487     l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2488
2489     opj_write_bytes(l_current_ptr, J2K_MS_COM, 2);  /* COM */
2490     l_current_ptr += 2;
2491
2492     opj_write_bytes(l_current_ptr, l_total_com_size - 2, 2);        /* L_COM */
2493     l_current_ptr += 2;
2494
2495     opj_write_bytes(l_current_ptr, 1,
2496                     2);   /* General use (IS 8859-15:1999 (Latin) values) */
2497     l_current_ptr += 2;
2498
2499     memcpy(l_current_ptr, l_comment, l_comment_size);
2500
2501     if (opj_stream_write_data(p_stream,
2502                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size,
2503                               p_manager) != l_total_com_size) {
2504         return OPJ_FALSE;
2505     }
2506
2507     return OPJ_TRUE;
2508 }
2509
2510 /**
2511  * Reads a COM marker (comments)
2512  * @param       p_j2k           the jpeg2000 file codec.
2513  * @param       p_header_data   the data contained in the COM box.
2514  * @param       p_header_size   the size of the data contained in the COM marker.
2515  * @param       p_manager               the user event manager.
2516 */
2517 static OPJ_BOOL opj_j2k_read_com(opj_j2k_t *p_j2k,
2518                                  OPJ_BYTE * p_header_data,
2519                                  OPJ_UINT32 p_header_size,
2520                                  opj_event_mgr_t * p_manager
2521                                 )
2522 {
2523     /* preconditions */
2524     assert(p_j2k != 00);
2525     assert(p_manager != 00);
2526     assert(p_header_data != 00);
2527
2528     OPJ_UNUSED(p_j2k);
2529     OPJ_UNUSED(p_header_data);
2530     OPJ_UNUSED(p_header_size);
2531     OPJ_UNUSED(p_manager);
2532
2533     return OPJ_TRUE;
2534 }
2535
2536 static OPJ_BOOL opj_j2k_write_cod(opj_j2k_t *p_j2k,
2537                                   opj_stream_private_t *p_stream,
2538                                   opj_event_mgr_t * p_manager)
2539 {
2540     opj_cp_t *l_cp = 00;
2541     opj_tcp_t *l_tcp = 00;
2542     OPJ_UINT32 l_code_size, l_remaining_size;
2543     OPJ_BYTE * l_current_data = 00;
2544
2545     /* preconditions */
2546     assert(p_j2k != 00);
2547     assert(p_manager != 00);
2548     assert(p_stream != 00);
2549
2550     l_cp = &(p_j2k->m_cp);
2551     l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2552     l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2553                   p_j2k->m_current_tile_number, 0);
2554     l_remaining_size = l_code_size;
2555
2556     if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2557         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2558                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);
2559         if (! new_header_tile_data) {
2560             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2561             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2562             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2563             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n");
2564             return OPJ_FALSE;
2565         }
2566         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2567         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
2568     }
2569
2570     l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2571
2572     opj_write_bytes(l_current_data, J2K_MS_COD, 2);           /* COD */
2573     l_current_data += 2;
2574
2575     opj_write_bytes(l_current_data, l_code_size - 2, 2);      /* L_COD */
2576     l_current_data += 2;
2577
2578     opj_write_bytes(l_current_data, l_tcp->csty, 1);          /* Scod */
2579     ++l_current_data;
2580
2581     opj_write_bytes(l_current_data, (OPJ_UINT32)l_tcp->prg, 1); /* SGcod (A) */
2582     ++l_current_data;
2583
2584     opj_write_bytes(l_current_data, l_tcp->numlayers, 2);     /* SGcod (B) */
2585     l_current_data += 2;
2586
2587     opj_write_bytes(l_current_data, l_tcp->mct, 1);           /* SGcod (C) */
2588     ++l_current_data;
2589
2590     l_remaining_size -= 9;
2591
2592     if (! opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
2593                                     l_current_data, &l_remaining_size, p_manager)) {
2594         opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
2595         return OPJ_FALSE;
2596     }
2597
2598     if (l_remaining_size != 0) {
2599         opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
2600         return OPJ_FALSE;
2601     }
2602
2603     if (opj_stream_write_data(p_stream,
2604                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size,
2605                               p_manager) != l_code_size) {
2606         return OPJ_FALSE;
2607     }
2608
2609     return OPJ_TRUE;
2610 }
2611
2612 /**
2613  * Reads a COD marker (Coding style defaults)
2614  * @param       p_header_data   the data contained in the COD box.
2615  * @param       p_j2k                   the jpeg2000 codec.
2616  * @param       p_header_size   the size of the data contained in the COD marker.
2617  * @param       p_manager               the user event manager.
2618 */
2619 static OPJ_BOOL opj_j2k_read_cod(opj_j2k_t *p_j2k,
2620                                  OPJ_BYTE * p_header_data,
2621                                  OPJ_UINT32 p_header_size,
2622                                  opj_event_mgr_t * p_manager
2623                                 )
2624 {
2625     /* loop */
2626     OPJ_UINT32 i;
2627     OPJ_UINT32 l_tmp;
2628     opj_cp_t *l_cp = 00;
2629     opj_tcp_t *l_tcp = 00;
2630     opj_image_t *l_image = 00;
2631
2632     /* preconditions */
2633     assert(p_header_data != 00);
2634     assert(p_j2k != 00);
2635     assert(p_manager != 00);
2636
2637     l_image = p_j2k->m_private_image;
2638     l_cp = &(p_j2k->m_cp);
2639
2640     /* If we are in the first tile-part header of the current tile */
2641     l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
2642             &l_cp->tcps[p_j2k->m_current_tile_number] :
2643             p_j2k->m_specific_param.m_decoder.m_default_tcp;
2644
2645 #if 0
2646     /* This check was added per https://github.com/uclouvain/openjpeg/commit/daed8cc9195555e101ab708a501af2dfe6d5e001 */
2647     /* but this is no longer necessary to handle issue476.jp2 */
2648     /* and this actually cause issues on legit files. See https://github.com/uclouvain/openjpeg/issues/1043 */
2649     /* Only one COD per tile */
2650     if (l_tcp->cod) {
2651         opj_event_msg(p_manager, EVT_ERROR,
2652                       "COD marker already read. No more than one COD marker per tile.\n");
2653         return OPJ_FALSE;
2654     }
2655 #endif
2656     l_tcp->cod = 1;
2657
2658     /* Make sure room is sufficient */
2659     if (p_header_size < 5) {
2660         opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2661         return OPJ_FALSE;
2662     }
2663
2664     opj_read_bytes(p_header_data, &l_tcp->csty, 1);         /* Scod */
2665     ++p_header_data;
2666     /* Make sure we know how to decode this */
2667     if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP |
2668                                      J2K_CP_CSTY_EPH)) != 0U) {
2669         opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n");
2670         return OPJ_FALSE;
2671     }
2672     opj_read_bytes(p_header_data, &l_tmp, 1);                       /* SGcod (A) */
2673     ++p_header_data;
2674     l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
2675     /* Make sure progression order is valid */
2676     if (l_tcp->prg > OPJ_CPRL) {
2677         opj_event_msg(p_manager, EVT_ERROR,
2678                       "Unknown progression order in COD marker\n");
2679         l_tcp->prg = OPJ_PROG_UNKNOWN;
2680     }
2681     opj_read_bytes(p_header_data, &l_tcp->numlayers, 2);    /* SGcod (B) */
2682     p_header_data += 2;
2683
2684     if ((l_tcp->numlayers < 1U) || (l_tcp->numlayers > 65535U)) {
2685         opj_event_msg(p_manager, EVT_ERROR,
2686                       "Invalid number of layers in COD marker : %d not in range [1-65535]\n",
2687                       l_tcp->numlayers);
2688         return OPJ_FALSE;
2689     }
2690
2691     /* If user didn't set a number layer to decode take the max specify in the codestream. */
2692     if (l_cp->m_specific_param.m_dec.m_layer) {
2693         l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
2694     } else {
2695         l_tcp->num_layers_to_decode = l_tcp->numlayers;
2696     }
2697
2698     opj_read_bytes(p_header_data, &l_tcp->mct, 1);          /* SGcod (C) */
2699     ++p_header_data;
2700
2701     p_header_size -= 5;
2702     for (i = 0; i < l_image->numcomps; ++i) {
2703         l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
2704     }
2705
2706     if (! opj_j2k_read_SPCod_SPCoc(p_j2k, 0, p_header_data, &p_header_size,
2707                                    p_manager)) {
2708         opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2709         return OPJ_FALSE;
2710     }
2711
2712     if (p_header_size != 0) {
2713         opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2714         return OPJ_FALSE;
2715     }
2716
2717     /* Apply the coding style to other components of the current tile or the m_default_tcp*/
2718     opj_j2k_copy_tile_component_parameters(p_j2k);
2719
2720     /* Index */
2721 #ifdef WIP_REMOVE_MSD
2722     if (p_j2k->cstr_info) {
2723         /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/
2724         p_j2k->cstr_info->prog = l_tcp->prg;
2725         p_j2k->cstr_info->numlayers = l_tcp->numlayers;
2726         p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(
2727                                             l_image->numcomps * sizeof(OPJ_UINT32));
2728         if (!p_j2k->cstr_info->numdecompos) {
2729             return OPJ_FALSE;
2730         }
2731         for (i = 0; i < l_image->numcomps; ++i) {
2732             p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
2733         }
2734     }
2735 #endif
2736
2737     return OPJ_TRUE;
2738 }
2739
2740 static OPJ_BOOL opj_j2k_write_coc(opj_j2k_t *p_j2k,
2741                                   OPJ_UINT32 p_comp_no,
2742                                   opj_stream_private_t *p_stream,
2743                                   opj_event_mgr_t * p_manager)
2744 {
2745     OPJ_UINT32 l_coc_size, l_remaining_size;
2746     OPJ_UINT32 l_comp_room;
2747
2748     /* preconditions */
2749     assert(p_j2k != 00);
2750     assert(p_manager != 00);
2751     assert(p_stream != 00);
2752
2753     l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;
2754
2755     l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2756                  p_j2k->m_current_tile_number, p_comp_no);
2757
2758     if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2759         OPJ_BYTE *new_header_tile_data;
2760         /*p_j2k->m_specific_param.m_encoder.m_header_tile_data
2761                 = (OPJ_BYTE*)opj_realloc(
2762                         p_j2k->m_specific_param.m_encoder.m_header_tile_data,
2763                         l_coc_size);*/
2764
2765         new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2766                                    p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);
2767         if (! new_header_tile_data) {
2768             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2769             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2770             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2771             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n");
2772             return OPJ_FALSE;
2773         }
2774         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2775         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
2776     }
2777
2778     opj_j2k_write_coc_in_memory(p_j2k, p_comp_no,
2779                                 p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_remaining_size,
2780                                 p_manager);
2781
2782     if (opj_stream_write_data(p_stream,
2783                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size,
2784                               p_manager) != l_coc_size) {
2785         return OPJ_FALSE;
2786     }
2787
2788     return OPJ_TRUE;
2789 }
2790
2791 static OPJ_BOOL opj_j2k_compare_coc(opj_j2k_t *p_j2k,
2792                                     OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
2793 {
2794     opj_cp_t *l_cp = NULL;
2795     opj_tcp_t *l_tcp = NULL;
2796
2797     /* preconditions */
2798     assert(p_j2k != 00);
2799
2800     l_cp = &(p_j2k->m_cp);
2801     l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2802
2803     if (l_tcp->tccps[p_first_comp_no].csty != l_tcp->tccps[p_second_comp_no].csty) {
2804         return OPJ_FALSE;
2805     }
2806
2807
2808     return opj_j2k_compare_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number,
2809                                        p_first_comp_no, p_second_comp_no);
2810 }
2811
2812 static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
2813                                         OPJ_UINT32 p_comp_no,
2814                                         OPJ_BYTE * p_data,
2815                                         OPJ_UINT32 * p_data_written,
2816                                         opj_event_mgr_t * p_manager
2817                                        )
2818 {
2819     opj_cp_t *l_cp = 00;
2820     opj_tcp_t *l_tcp = 00;
2821     OPJ_UINT32 l_coc_size, l_remaining_size;
2822     OPJ_BYTE * l_current_data = 00;
2823     opj_image_t *l_image = 00;
2824     OPJ_UINT32 l_comp_room;
2825
2826     /* preconditions */
2827     assert(p_j2k != 00);
2828     assert(p_manager != 00);
2829
2830     l_cp = &(p_j2k->m_cp);
2831     l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2832     l_image = p_j2k->m_private_image;
2833     l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
2834
2835     l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2836                  p_j2k->m_current_tile_number, p_comp_no);
2837     l_remaining_size = l_coc_size;
2838
2839     l_current_data = p_data;
2840
2841     opj_write_bytes(l_current_data, J2K_MS_COC,
2842                     2);                         /* COC */
2843     l_current_data += 2;
2844
2845     opj_write_bytes(l_current_data, l_coc_size - 2,
2846                     2);                     /* L_COC */
2847     l_current_data += 2;
2848
2849     opj_write_bytes(l_current_data, p_comp_no, l_comp_room);        /* Ccoc */
2850     l_current_data += l_comp_room;
2851
2852     opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty,
2853                     1);               /* Scoc */
2854     ++l_current_data;
2855
2856     l_remaining_size -= (5 + l_comp_room);
2857     opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
2858                               l_current_data, &l_remaining_size, p_manager);
2859     * p_data_written = l_coc_size;
2860 }
2861
2862 static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k)
2863 {
2864     OPJ_UINT32 i, j;
2865     OPJ_UINT32 l_nb_comp;
2866     OPJ_UINT32 l_nb_tiles;
2867     OPJ_UINT32 l_max = 0;
2868
2869     /* preconditions */
2870
2871     l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
2872     l_nb_comp = p_j2k->m_private_image->numcomps;
2873
2874     for (i = 0; i < l_nb_tiles; ++i) {
2875         for (j = 0; j < l_nb_comp; ++j) {
2876             l_max = opj_uint_max(l_max, opj_j2k_get_SPCod_SPCoc_size(p_j2k, i, j));
2877         }
2878     }
2879
2880     return 6 + l_max;
2881 }
2882
2883 /**
2884  * Reads a COC marker (Coding Style Component)
2885  * @param       p_header_data   the data contained in the COC box.
2886  * @param       p_j2k                   the jpeg2000 codec.
2887  * @param       p_header_size   the size of the data contained in the COC marker.
2888  * @param       p_manager               the user event manager.
2889 */
2890 static OPJ_BOOL opj_j2k_read_coc(opj_j2k_t *p_j2k,
2891                                  OPJ_BYTE * p_header_data,
2892                                  OPJ_UINT32 p_header_size,
2893                                  opj_event_mgr_t * p_manager
2894                                 )
2895 {
2896     opj_cp_t *l_cp = NULL;
2897     opj_tcp_t *l_tcp = NULL;
2898     opj_image_t *l_image = NULL;
2899     OPJ_UINT32 l_comp_room;
2900     OPJ_UINT32 l_comp_no;
2901
2902     /* preconditions */
2903     assert(p_header_data != 00);
2904     assert(p_j2k != 00);
2905     assert(p_manager != 00);
2906
2907     l_cp = &(p_j2k->m_cp);
2908     l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
2909             ?
2910             &l_cp->tcps[p_j2k->m_current_tile_number] :
2911             p_j2k->m_specific_param.m_decoder.m_default_tcp;
2912     l_image = p_j2k->m_private_image;
2913
2914     l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
2915
2916     /* make sure room is sufficient*/
2917     if (p_header_size < l_comp_room + 1) {
2918         opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2919         return OPJ_FALSE;
2920     }
2921     p_header_size -= l_comp_room + 1;
2922
2923     opj_read_bytes(p_header_data, &l_comp_no,
2924                    l_comp_room);                 /* Ccoc */
2925     p_header_data += l_comp_room;
2926     if (l_comp_no >= l_image->numcomps) {
2927         opj_event_msg(p_manager, EVT_ERROR,
2928                       "Error reading COC marker (bad number of components)\n");
2929         return OPJ_FALSE;
2930     }
2931
2932     opj_read_bytes(p_header_data, &l_tcp->tccps[l_comp_no].csty,
2933                    1);                  /* Scoc */
2934     ++p_header_data ;
2935
2936     if (! opj_j2k_read_SPCod_SPCoc(p_j2k, l_comp_no, p_header_data, &p_header_size,
2937                                    p_manager)) {
2938         opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2939         return OPJ_FALSE;
2940     }
2941
2942     if (p_header_size != 0) {
2943         opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2944         return OPJ_FALSE;
2945     }
2946     return OPJ_TRUE;
2947 }
2948
2949 static OPJ_BOOL opj_j2k_write_qcd(opj_j2k_t *p_j2k,
2950                                   opj_stream_private_t *p_stream,
2951                                   opj_event_mgr_t * p_manager
2952                                  )
2953 {
2954     OPJ_UINT32 l_qcd_size, l_remaining_size;
2955     OPJ_BYTE * l_current_data = 00;
2956
2957     /* preconditions */
2958     assert(p_j2k != 00);
2959     assert(p_manager != 00);
2960     assert(p_stream != 00);
2961
2962     l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
2963                  0);
2964     l_remaining_size = l_qcd_size;
2965
2966     if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2967         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2968                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);
2969         if (! new_header_tile_data) {
2970             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2971             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2972             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2973             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n");
2974             return OPJ_FALSE;
2975         }
2976         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2977         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
2978     }
2979
2980     l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2981
2982     opj_write_bytes(l_current_data, J2K_MS_QCD, 2);         /* QCD */
2983     l_current_data += 2;
2984
2985     opj_write_bytes(l_current_data, l_qcd_size - 2, 2);     /* L_QCD */
2986     l_current_data += 2;
2987
2988     l_remaining_size -= 4;
2989
2990     if (! opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, 0,
2991                                   l_current_data, &l_remaining_size, p_manager)) {
2992         opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
2993         return OPJ_FALSE;
2994     }
2995
2996     if (l_remaining_size != 0) {
2997         opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
2998         return OPJ_FALSE;
2999     }
3000
3001     if (opj_stream_write_data(p_stream,
3002                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size,
3003                               p_manager) != l_qcd_size) {
3004         return OPJ_FALSE;
3005     }
3006
3007     return OPJ_TRUE;
3008 }
3009
3010 /**
3011  * Reads a QCD marker (Quantization defaults)
3012  * @param       p_header_data   the data contained in the QCD box.
3013  * @param       p_j2k                   the jpeg2000 codec.
3014  * @param       p_header_size   the size of the data contained in the QCD marker.
3015  * @param       p_manager               the user event manager.
3016 */
3017 static OPJ_BOOL opj_j2k_read_qcd(opj_j2k_t *p_j2k,
3018                                  OPJ_BYTE * p_header_data,
3019                                  OPJ_UINT32 p_header_size,
3020                                  opj_event_mgr_t * p_manager
3021                                 )
3022 {
3023     /* preconditions */
3024     assert(p_header_data != 00);
3025     assert(p_j2k != 00);
3026     assert(p_manager != 00);
3027
3028     if (! opj_j2k_read_SQcd_SQcc(p_j2k, 0, p_header_data, &p_header_size,
3029                                  p_manager)) {
3030         opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3031         return OPJ_FALSE;
3032     }
3033
3034     if (p_header_size != 0) {
3035         opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3036         return OPJ_FALSE;
3037     }
3038
3039     /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
3040     opj_j2k_copy_tile_quantization_parameters(p_j2k);
3041
3042     return OPJ_TRUE;
3043 }
3044
3045 static OPJ_BOOL opj_j2k_write_qcc(opj_j2k_t *p_j2k,
3046                                   OPJ_UINT32 p_comp_no,
3047                                   opj_stream_private_t *p_stream,
3048                                   opj_event_mgr_t * p_manager
3049                                  )
3050 {
3051     OPJ_UINT32 l_qcc_size, l_remaining_size;
3052
3053     /* preconditions */
3054     assert(p_j2k != 00);
3055     assert(p_manager != 00);
3056     assert(p_stream != 00);
3057
3058     l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3059                  p_comp_no);
3060     l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0 : 1;
3061     l_remaining_size = l_qcc_size;
3062
3063     if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3064         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
3065                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);
3066         if (! new_header_tile_data) {
3067             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3068             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3069             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3070             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n");
3071             return OPJ_FALSE;
3072         }
3073         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3074         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
3075     }
3076
3077     opj_j2k_write_qcc_in_memory(p_j2k, p_comp_no,
3078                                 p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_remaining_size,
3079                                 p_manager);
3080
3081     if (opj_stream_write_data(p_stream,
3082                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size,
3083                               p_manager) != l_qcc_size) {
3084         return OPJ_FALSE;
3085     }
3086
3087     return OPJ_TRUE;
3088 }
3089
3090 static OPJ_BOOL opj_j2k_compare_qcc(opj_j2k_t *p_j2k,
3091                                     OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
3092 {
3093     return opj_j2k_compare_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number,
3094                                      p_first_comp_no, p_second_comp_no);
3095 }
3096
3097 static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
3098                                         OPJ_UINT32 p_comp_no,
3099                                         OPJ_BYTE * p_data,
3100                                         OPJ_UINT32 * p_data_written,
3101                                         opj_event_mgr_t * p_manager
3102                                        )
3103 {
3104     OPJ_UINT32 l_qcc_size, l_remaining_size;
3105     OPJ_BYTE * l_current_data = 00;
3106
3107     /* preconditions */
3108     assert(p_j2k != 00);
3109     assert(p_manager != 00);
3110
3111     l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3112                  p_comp_no);
3113     l_remaining_size = l_qcc_size;
3114
3115     l_current_data = p_data;
3116
3117     opj_write_bytes(l_current_data, J2K_MS_QCC, 2);         /* QCC */
3118     l_current_data += 2;
3119
3120     if (p_j2k->m_private_image->numcomps <= 256) {
3121         --l_qcc_size;
3122
3123         opj_write_bytes(l_current_data, l_qcc_size - 2, 2);     /* L_QCC */
3124         l_current_data += 2;
3125
3126         opj_write_bytes(l_current_data, p_comp_no, 1);  /* Cqcc */
3127         ++l_current_data;
3128
3129         /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */
3130         l_remaining_size -= 6;
3131     } else {
3132         opj_write_bytes(l_current_data, l_qcc_size - 2, 2);     /* L_QCC */
3133         l_current_data += 2;
3134
3135         opj_write_bytes(l_current_data, p_comp_no, 2);  /* Cqcc */
3136         l_current_data += 2;
3137
3138         l_remaining_size -= 6;
3139     }
3140
3141     opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, p_comp_no,
3142                             l_current_data, &l_remaining_size, p_manager);
3143
3144     *p_data_written = l_qcc_size;
3145 }
3146
3147 static OPJ_UINT32 opj_j2k_get_max_qcc_size(opj_j2k_t *p_j2k)
3148 {
3149     return opj_j2k_get_max_coc_size(p_j2k);
3150 }
3151
3152 /**
3153  * Reads a QCC marker (Quantization component)
3154  * @param       p_header_data   the data contained in the QCC box.
3155  * @param       p_j2k                   the jpeg2000 codec.
3156  * @param       p_header_size   the size of the data contained in the QCC marker.
3157  * @param       p_manager               the user event manager.
3158 */
3159 static OPJ_BOOL opj_j2k_read_qcc(opj_j2k_t *p_j2k,
3160                                  OPJ_BYTE * p_header_data,
3161                                  OPJ_UINT32 p_header_size,
3162                                  opj_event_mgr_t * p_manager
3163                                 )
3164 {
3165     OPJ_UINT32 l_num_comp, l_comp_no;
3166
3167     /* preconditions */
3168     assert(p_header_data != 00);
3169     assert(p_j2k != 00);
3170     assert(p_manager != 00);
3171
3172     l_num_comp = p_j2k->m_private_image->numcomps;
3173
3174     if (l_num_comp <= 256) {
3175         if (p_header_size < 1) {
3176             opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3177             return OPJ_FALSE;
3178         }
3179         opj_read_bytes(p_header_data, &l_comp_no, 1);
3180         ++p_header_data;
3181         --p_header_size;
3182     } else {
3183         if (p_header_size < 2) {
3184             opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3185             return OPJ_FALSE;
3186         }
3187         opj_read_bytes(p_header_data, &l_comp_no, 2);
3188         p_header_data += 2;
3189         p_header_size -= 2;
3190     }
3191
3192 #ifdef USE_JPWL
3193     if (p_j2k->m_cp.correct) {
3194
3195         static OPJ_UINT32 backup_compno = 0;
3196
3197         /* compno is negative or larger than the number of components!!! */
3198         if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {
3199             opj_event_msg(p_manager, EVT_ERROR,
3200                           "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
3201                           l_comp_no, l_num_comp);
3202             if (!JPWL_ASSUME) {
3203                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
3204                 return OPJ_FALSE;
3205             }
3206             /* we try to correct */
3207             l_comp_no = backup_compno % l_num_comp;
3208             opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
3209                           "- setting component number to %d\n",
3210                           l_comp_no);
3211         }
3212
3213         /* keep your private count of tiles */
3214         backup_compno++;
3215     };
3216 #endif /* USE_JPWL */
3217
3218     if (l_comp_no >= p_j2k->m_private_image->numcomps) {
3219         opj_event_msg(p_manager, EVT_ERROR,
3220                       "Invalid component number: %d, regarding the number of components %d\n",
3221                       l_comp_no, p_j2k->m_private_image->numcomps);
3222         return OPJ_FALSE;
3223     }
3224
3225     if (! opj_j2k_read_SQcd_SQcc(p_j2k, l_comp_no, p_header_data, &p_header_size,
3226                                  p_manager)) {
3227         opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3228         return OPJ_FALSE;
3229     }
3230
3231     if (p_header_size != 0) {
3232         opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3233         return OPJ_FALSE;
3234     }
3235
3236     return OPJ_TRUE;
3237 }
3238
3239 static OPJ_BOOL opj_j2k_write_poc(opj_j2k_t *p_j2k,
3240                                   opj_stream_private_t *p_stream,
3241                                   opj_event_mgr_t * p_manager
3242                                  )
3243 {
3244     OPJ_UINT32 l_nb_comp;
3245     OPJ_UINT32 l_nb_poc;
3246     OPJ_UINT32 l_poc_size;
3247     OPJ_UINT32 l_written_size = 0;
3248     opj_tcp_t *l_tcp = 00;
3249     OPJ_UINT32 l_poc_room;
3250
3251     /* preconditions */
3252     assert(p_j2k != 00);
3253     assert(p_manager != 00);
3254     assert(p_stream != 00);
3255
3256     l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
3257     l_nb_comp = p_j2k->m_private_image->numcomps;
3258     l_nb_poc = 1 + l_tcp->numpocs;
3259
3260     if (l_nb_comp <= 256) {
3261         l_poc_room = 1;
3262     } else {
3263         l_poc_room = 2;
3264     }
3265     l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
3266
3267     if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3268         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
3269                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);
3270         if (! new_header_tile_data) {
3271             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3272             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3273             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3274             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n");
3275             return OPJ_FALSE;
3276         }
3277         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3278         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
3279     }
3280
3281     opj_j2k_write_poc_in_memory(p_j2k,
3282                                 p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_written_size,
3283                                 p_manager);
3284
3285     if (opj_stream_write_data(p_stream,
3286                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size,
3287                               p_manager) != l_poc_size) {
3288         return OPJ_FALSE;
3289     }
3290
3291     return OPJ_TRUE;
3292 }
3293
3294 static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
3295                                         OPJ_BYTE * p_data,
3296                                         OPJ_UINT32 * p_data_written,
3297                                         opj_event_mgr_t * p_manager
3298                                        )
3299 {
3300     OPJ_UINT32 i;
3301     OPJ_BYTE * l_current_data = 00;
3302     OPJ_UINT32 l_nb_comp;
3303     OPJ_UINT32 l_nb_poc;
3304     OPJ_UINT32 l_poc_size;
3305     opj_image_t *l_image = 00;
3306     opj_tcp_t *l_tcp = 00;
3307     opj_tccp_t *l_tccp = 00;
3308     opj_poc_t *l_current_poc = 00;
3309     OPJ_UINT32 l_poc_room;
3310
3311     /* preconditions */
3312     assert(p_j2k != 00);
3313     assert(p_manager != 00);
3314
3315     OPJ_UNUSED(p_manager);
3316
3317     l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
3318     l_tccp = &l_tcp->tccps[0];
3319     l_image = p_j2k->m_private_image;
3320     l_nb_comp = l_image->numcomps;
3321     l_nb_poc = 1 + l_tcp->numpocs;
3322
3323     if (l_nb_comp <= 256) {
3324         l_poc_room = 1;
3325     } else {
3326         l_poc_room = 2;
3327     }
3328
3329     l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
3330
3331     l_current_data = p_data;
3332
3333     opj_write_bytes(l_current_data, J2K_MS_POC,
3334                     2);                                   /* POC  */
3335     l_current_data += 2;
3336
3337     opj_write_bytes(l_current_data, l_poc_size - 2,
3338                     2);                                 /* Lpoc */
3339     l_current_data += 2;
3340
3341     l_current_poc =  l_tcp->pocs;
3342     for (i = 0; i < l_nb_poc; ++i) {
3343         opj_write_bytes(l_current_data, l_current_poc->resno0,
3344                         1);                                /* RSpoc_i */
3345         ++l_current_data;
3346
3347         opj_write_bytes(l_current_data, l_current_poc->compno0,
3348                         l_poc_room);              /* CSpoc_i */
3349         l_current_data += l_poc_room;
3350
3351         opj_write_bytes(l_current_data, l_current_poc->layno1,
3352                         2);                                /* LYEpoc_i */
3353         l_current_data += 2;
3354
3355         opj_write_bytes(l_current_data, l_current_poc->resno1,
3356                         1);                                /* REpoc_i */
3357         ++l_current_data;
3358
3359         opj_write_bytes(l_current_data, l_current_poc->compno1,
3360                         l_poc_room);              /* CEpoc_i */
3361         l_current_data += l_poc_room;
3362
3363         opj_write_bytes(l_current_data, (OPJ_UINT32)l_current_poc->prg,
3364                         1);   /* Ppoc_i */
3365         ++l_current_data;
3366
3367         /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
3368         l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3369                                 l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);
3370         l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3371                                 l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);
3372         l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3373                                  l_current_poc->compno1, (OPJ_INT32)l_nb_comp);
3374
3375         ++l_current_poc;
3376     }
3377
3378     *p_data_written = l_poc_size;
3379 }
3380
3381 static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k)
3382 {
3383     opj_tcp_t * l_tcp = 00;
3384     OPJ_UINT32 l_nb_tiles = 0;
3385     OPJ_UINT32 l_max_poc = 0;
3386     OPJ_UINT32 i;
3387
3388     l_tcp = p_j2k->m_cp.tcps;
3389     l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
3390
3391     for (i = 0; i < l_nb_tiles; ++i) {
3392         l_max_poc = opj_uint_max(l_max_poc, l_tcp->numpocs);
3393         ++l_tcp;
3394     }
3395
3396     ++l_max_poc;
3397
3398     return 4 + 9 * l_max_poc;
3399 }
3400
3401 static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k)
3402 {
3403     OPJ_UINT32 i;
3404     OPJ_UINT32 l_nb_tiles;
3405     OPJ_UINT32 l_max = 0;
3406     opj_tcp_t * l_tcp = 00;
3407
3408     l_tcp = p_j2k->m_cp.tcps;
3409     l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
3410
3411     for (i = 0; i < l_nb_tiles; ++i) {
3412         l_max = opj_uint_max(l_max, l_tcp->m_nb_tile_parts);
3413
3414         ++l_tcp;
3415     }
3416
3417     return 12 * l_max;
3418 }
3419
3420 static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
3421 {
3422     OPJ_UINT32 l_nb_bytes = 0;
3423     OPJ_UINT32 l_nb_comps;
3424     OPJ_UINT32 l_coc_bytes, l_qcc_bytes;
3425
3426     l_nb_comps = p_j2k->m_private_image->numcomps - 1;
3427     l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
3428
3429     if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) {
3430         l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
3431         l_nb_bytes += l_nb_comps * l_coc_bytes;
3432
3433         l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
3434         l_nb_bytes += l_nb_comps * l_qcc_bytes;
3435     }
3436
3437     l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
3438
3439     /*** DEVELOPER CORNER, Add room for your headers ***/
3440
3441     return l_nb_bytes;
3442 }
3443
3444 /**
3445  * Reads a POC marker (Progression Order Change)
3446  *
3447  * @param       p_header_data   the data contained in the POC box.
3448  * @param       p_j2k                   the jpeg2000 codec.
3449  * @param       p_header_size   the size of the data contained in the POC marker.
3450  * @param       p_manager               the user event manager.
3451 */
3452 static OPJ_BOOL opj_j2k_read_poc(opj_j2k_t *p_j2k,
3453                                  OPJ_BYTE * p_header_data,
3454                                  OPJ_UINT32 p_header_size,
3455                                  opj_event_mgr_t * p_manager
3456                                 )
3457 {
3458     OPJ_UINT32 i, l_nb_comp, l_tmp;
3459     opj_image_t * l_image = 00;
3460     OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
3461     OPJ_UINT32 l_chunk_size, l_comp_room;
3462
3463     opj_cp_t *l_cp = 00;
3464     opj_tcp_t *l_tcp = 00;
3465     opj_poc_t *l_current_poc = 00;
3466
3467     /* preconditions */
3468     assert(p_header_data != 00);
3469     assert(p_j2k != 00);
3470     assert(p_manager != 00);
3471
3472     l_image = p_j2k->m_private_image;
3473     l_nb_comp = l_image->numcomps;
3474     if (l_nb_comp <= 256) {
3475         l_comp_room = 1;
3476     } else {
3477         l_comp_room = 2;
3478     }
3479     l_chunk_size = 5 + 2 * l_comp_room;
3480     l_current_poc_nb = p_header_size / l_chunk_size;
3481     l_current_poc_remaining = p_header_size % l_chunk_size;
3482
3483     if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
3484         opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
3485         return OPJ_FALSE;
3486     }
3487
3488     l_cp = &(p_j2k->m_cp);
3489     l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
3490             &l_cp->tcps[p_j2k->m_current_tile_number] :
3491             p_j2k->m_specific_param.m_decoder.m_default_tcp;
3492     l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
3493     l_current_poc_nb += l_old_poc_nb;
3494
3495     if (l_current_poc_nb >= J2K_MAX_POCS) {
3496         opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
3497         return OPJ_FALSE;
3498     }
3499
3500     /* now poc is in use.*/
3501     l_tcp->POC = 1;
3502
3503     l_current_poc = &l_tcp->pocs[l_old_poc_nb];
3504     for (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
3505         opj_read_bytes(p_header_data, &(l_current_poc->resno0),
3506                        1);                               /* RSpoc_i */
3507         ++p_header_data;
3508         opj_read_bytes(p_header_data, &(l_current_poc->compno0),
3509                        l_comp_room);  /* CSpoc_i */
3510         p_header_data += l_comp_room;
3511         opj_read_bytes(p_header_data, &(l_current_poc->layno1),
3512                        2);                               /* LYEpoc_i */
3513         /* make sure layer end is in acceptable bounds */
3514         l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
3515         p_header_data += 2;
3516         opj_read_bytes(p_header_data, &(l_current_poc->resno1),
3517                        1);                               /* REpoc_i */
3518         ++p_header_data;
3519         opj_read_bytes(p_header_data, &(l_current_poc->compno1),
3520                        l_comp_room);  /* CEpoc_i */
3521         p_header_data += l_comp_room;
3522         opj_read_bytes(p_header_data, &l_tmp,
3523                        1);                                                                 /* Ppoc_i */
3524         ++p_header_data;
3525         l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
3526         /* make sure comp is in acceptable bounds */
3527         l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
3528         ++l_current_poc;
3529     }
3530
3531     l_tcp->numpocs = l_current_poc_nb - 1;
3532     return OPJ_TRUE;
3533 }
3534
3535 /**
3536  * Reads a CRG marker (Component registration)
3537  *
3538  * @param       p_header_data   the data contained in the TLM box.
3539  * @param       p_j2k                   the jpeg2000 codec.
3540  * @param       p_header_size   the size of the data contained in the TLM marker.
3541  * @param       p_manager               the user event manager.
3542 */
3543 static OPJ_BOOL opj_j2k_read_crg(opj_j2k_t *p_j2k,
3544                                  OPJ_BYTE * p_header_data,
3545                                  OPJ_UINT32 p_header_size,
3546                                  opj_event_mgr_t * p_manager
3547                                 )
3548 {
3549     OPJ_UINT32 l_nb_comp;
3550     /* preconditions */
3551     assert(p_header_data != 00);
3552     assert(p_j2k != 00);
3553     assert(p_manager != 00);
3554
3555     OPJ_UNUSED(p_header_data);
3556
3557     l_nb_comp = p_j2k->m_private_image->numcomps;
3558
3559     if (p_header_size != l_nb_comp * 4) {
3560         opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
3561         return OPJ_FALSE;
3562     }
3563     /* Do not care of this at the moment since only local variables are set here */
3564     /*
3565     for
3566             (i = 0; i < l_nb_comp; ++i)
3567     {
3568             opj_read_bytes(p_header_data,&l_Xcrg_i,2);                              // Xcrg_i
3569             p_header_data+=2;
3570             opj_read_bytes(p_header_data,&l_Ycrg_i,2);                              // Xcrg_i
3571             p_header_data+=2;
3572     }
3573     */
3574     return OPJ_TRUE;
3575 }
3576
3577 /**
3578  * Reads a TLM marker (Tile Length Marker)
3579  *
3580  * @param       p_header_data   the data contained in the TLM box.
3581  * @param       p_j2k                   the jpeg2000 codec.
3582  * @param       p_header_size   the size of the data contained in the TLM marker.
3583  * @param       p_manager               the user event manager.
3584 */
3585 static OPJ_BOOL opj_j2k_read_tlm(opj_j2k_t *p_j2k,
3586                                  OPJ_BYTE * p_header_data,
3587                                  OPJ_UINT32 p_header_size,
3588                                  opj_event_mgr_t * p_manager
3589                                 )
3590 {
3591     OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient,
3592                l_Ptlm_size;
3593     /* preconditions */
3594     assert(p_header_data != 00);
3595     assert(p_j2k != 00);
3596     assert(p_manager != 00);
3597
3598     OPJ_UNUSED(p_j2k);
3599
3600     if (p_header_size < 2) {
3601         opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
3602         return OPJ_FALSE;
3603     }
3604     p_header_size -= 2;
3605
3606     opj_read_bytes(p_header_data, &l_Ztlm,
3607                    1);                              /* Ztlm */
3608     ++p_header_data;
3609     opj_read_bytes(p_header_data, &l_Stlm,
3610                    1);                              /* Stlm */
3611     ++p_header_data;
3612
3613     l_ST = ((l_Stlm >> 4) & 0x3);
3614     l_SP = (l_Stlm >> 6) & 0x1;
3615
3616     l_Ptlm_size = (l_SP + 1) * 2;
3617     l_quotient = l_Ptlm_size + l_ST;
3618
3619     l_tot_num_tp_remaining = p_header_size % l_quotient;
3620
3621     if (l_tot_num_tp_remaining != 0) {
3622         opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
3623         return OPJ_FALSE;
3624     }
3625     /* FIXME Do not care of this at the moment since only local variables are set here */
3626     /*
3627     for
3628             (i = 0; i < l_tot_num_tp; ++i)
3629     {
3630             opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST);                           // Ttlm_i
3631             p_header_data += l_ST;
3632             opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size);            // Ptlm_i
3633             p_header_data += l_Ptlm_size;
3634     }*/
3635     return OPJ_TRUE;
3636 }
3637
3638 /**
3639  * Reads a PLM marker (Packet length, main header marker)
3640  *
3641  * @param       p_header_data   the data contained in the TLM box.
3642  * @param       p_j2k                   the jpeg2000 codec.
3643  * @param       p_header_size   the size of the data contained in the TLM marker.
3644  * @param       p_manager               the user event manager.
3645 */
3646 static OPJ_BOOL opj_j2k_read_plm(opj_j2k_t *p_j2k,
3647                                  OPJ_BYTE * p_header_data,
3648                                  OPJ_UINT32 p_header_size,
3649                                  opj_event_mgr_t * p_manager
3650                                 )
3651 {
3652     /* preconditions */
3653     assert(p_header_data != 00);
3654     assert(p_j2k != 00);
3655     assert(p_manager != 00);
3656
3657     OPJ_UNUSED(p_j2k);
3658     OPJ_UNUSED(p_header_data);
3659
3660     if (p_header_size < 1) {
3661         opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3662         return OPJ_FALSE;
3663     }
3664     /* Do not care of this at the moment since only local variables are set here */
3665     /*
3666     opj_read_bytes(p_header_data,&l_Zplm,1);                                        // Zplm
3667     ++p_header_data;
3668     --p_header_size;
3669
3670     while
3671             (p_header_size > 0)
3672     {
3673             opj_read_bytes(p_header_data,&l_Nplm,1);                                // Nplm
3674             ++p_header_data;
3675             p_header_size -= (1+l_Nplm);
3676             if
3677                     (p_header_size < 0)
3678             {
3679                     opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3680                     return false;
3681             }
3682             for
3683                     (i = 0; i < l_Nplm; ++i)
3684             {
3685                     opj_read_bytes(p_header_data,&l_tmp,1);                         // Iplm_ij
3686                     ++p_header_data;
3687                     // take only the last seven bytes
3688                     l_packet_len |= (l_tmp & 0x7f);
3689                     if
3690                             (l_tmp & 0x80)
3691                     {
3692                             l_packet_len <<= 7;
3693                     }
3694                     else
3695                     {
3696             // store packet length and proceed to next packet
3697                             l_packet_len = 0;
3698                     }
3699             }
3700             if
3701                     (l_packet_len != 0)
3702             {
3703                     opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3704                     return false;
3705             }
3706     }
3707     */
3708     return OPJ_TRUE;
3709 }
3710
3711 /**
3712  * Reads a PLT marker (Packet length, tile-part header)
3713  *
3714  * @param       p_header_data   the data contained in the PLT box.
3715  * @param       p_j2k                   the jpeg2000 codec.
3716  * @param       p_header_size   the size of the data contained in the PLT marker.
3717  * @param       p_manager               the user event manager.
3718 */
3719 static OPJ_BOOL opj_j2k_read_plt(opj_j2k_t *p_j2k,
3720                                  OPJ_BYTE * p_header_data,
3721                                  OPJ_UINT32 p_header_size,
3722                                  opj_event_mgr_t * p_manager
3723                                 )
3724 {
3725     OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
3726
3727     /* preconditions */
3728     assert(p_header_data != 00);
3729     assert(p_j2k != 00);
3730     assert(p_manager != 00);
3731
3732     OPJ_UNUSED(p_j2k);
3733
3734     if (p_header_size < 1) {
3735         opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3736         return OPJ_FALSE;
3737     }
3738
3739     opj_read_bytes(p_header_data, &l_Zplt, 1);              /* Zplt */
3740     ++p_header_data;
3741     --p_header_size;
3742
3743     for (i = 0; i < p_header_size; ++i) {
3744         opj_read_bytes(p_header_data, &l_tmp, 1);       /* Iplt_ij */
3745         ++p_header_data;
3746         /* take only the last seven bytes */
3747         l_packet_len |= (l_tmp & 0x7f);
3748         if (l_tmp & 0x80) {
3749             l_packet_len <<= 7;
3750         } else {
3751             /* store packet length and proceed to next packet */
3752             l_packet_len = 0;
3753         }
3754     }
3755
3756     if (l_packet_len != 0) {
3757         opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3758         return OPJ_FALSE;
3759     }
3760
3761     return OPJ_TRUE;
3762 }
3763
3764 /**
3765  * Reads a PPM marker (Packed packet headers, main header)
3766  *
3767  * @param       p_header_data   the data contained in the POC box.
3768  * @param       p_j2k                   the jpeg2000 codec.
3769  * @param       p_header_size   the size of the data contained in the POC marker.
3770  * @param       p_manager               the user event manager.
3771  */
3772
3773 static OPJ_BOOL opj_j2k_read_ppm(
3774     opj_j2k_t *p_j2k,
3775     OPJ_BYTE * p_header_data,
3776     OPJ_UINT32 p_header_size,
3777     opj_event_mgr_t * p_manager)
3778 {
3779     opj_cp_t *l_cp = 00;
3780     OPJ_UINT32 l_Z_ppm;
3781
3782     /* preconditions */
3783     assert(p_header_data != 00);
3784     assert(p_j2k != 00);
3785     assert(p_manager != 00);
3786
3787     /* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */
3788     if (p_header_size < 2) {
3789         opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3790         return OPJ_FALSE;
3791     }
3792
3793     l_cp = &(p_j2k->m_cp);
3794     l_cp->ppm = 1;
3795
3796     opj_read_bytes(p_header_data, &l_Z_ppm, 1);             /* Z_ppm */
3797     ++p_header_data;
3798     --p_header_size;
3799
3800     /* check allocation needed */
3801     if (l_cp->ppm_markers == NULL) { /* first PPM marker */
3802         OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3803         assert(l_cp->ppm_markers_count == 0U);
3804
3805         l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
3806         if (l_cp->ppm_markers == NULL) {
3807             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3808             return OPJ_FALSE;
3809         }
3810         l_cp->ppm_markers_count = l_newCount;
3811     } else if (l_cp->ppm_markers_count <= l_Z_ppm) {
3812         OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3813         opj_ppx *new_ppm_markers;
3814         new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers,
3815                           l_newCount * sizeof(opj_ppx));
3816         if (new_ppm_markers == NULL) {
3817             /* clean up to be done on l_cp destruction */
3818             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3819             return OPJ_FALSE;
3820         }
3821         l_cp->ppm_markers = new_ppm_markers;
3822         memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0,
3823                (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx));
3824         l_cp->ppm_markers_count = l_newCount;
3825     }
3826
3827     if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) {
3828         /* clean up to be done on l_cp destruction */
3829         opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm);
3830         return OPJ_FALSE;
3831     }
3832
3833     l_cp->ppm_markers[l_Z_ppm].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
3834     if (l_cp->ppm_markers[l_Z_ppm].m_data == NULL) {
3835         /* clean up to be done on l_cp destruction */
3836         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3837         return OPJ_FALSE;
3838     }
3839     l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size;
3840     memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size);
3841
3842     return OPJ_TRUE;
3843 }
3844
3845 /**
3846  * Merges all PPM markers read (Packed headers, main header)
3847  *
3848  * @param       p_cp      main coding parameters.
3849  * @param       p_manager the user event manager.
3850  */
3851 static OPJ_BOOL opj_j2k_merge_ppm(opj_cp_t *p_cp, opj_event_mgr_t * p_manager)
3852 {
3853     OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining;
3854
3855     /* preconditions */
3856     assert(p_cp != 00);
3857     assert(p_manager != 00);
3858     assert(p_cp->ppm_buffer == NULL);
3859
3860     if (p_cp->ppm == 0U) {
3861         return OPJ_TRUE;
3862     }
3863
3864     l_ppm_data_size = 0U;
3865     l_N_ppm_remaining = 0U;
3866     for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
3867         if (p_cp->ppm_markers[i].m_data !=
3868                 NULL) { /* standard doesn't seem to require contiguous Zppm */
3869             OPJ_UINT32 l_N_ppm;
3870             OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
3871             const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
3872
3873             if (l_N_ppm_remaining >= l_data_size) {
3874                 l_N_ppm_remaining -= l_data_size;
3875                 l_data_size = 0U;
3876             } else {
3877                 l_data += l_N_ppm_remaining;
3878                 l_data_size -= l_N_ppm_remaining;
3879                 l_N_ppm_remaining = 0U;
3880             }
3881
3882             if (l_data_size > 0U) {
3883                 do {
3884                     /* read Nppm */
3885                     if (l_data_size < 4U) {
3886                         /* clean up to be done on l_cp destruction */
3887                         opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
3888                         return OPJ_FALSE;
3889                     }
3890                     opj_read_bytes(l_data, &l_N_ppm, 4);
3891                     l_data += 4;
3892                     l_data_size -= 4;
3893                     l_ppm_data_size +=
3894                         l_N_ppm; /* can't overflow, max 256 markers of max 65536 bytes, that is when PPM markers are not corrupted which is checked elsewhere */
3895
3896                     if (l_data_size >= l_N_ppm) {
3897                         l_data_size -= l_N_ppm;
3898                         l_data += l_N_ppm;
3899                     } else {
3900                         l_N_ppm_remaining = l_N_ppm - l_data_size;
3901                         l_data_size = 0U;
3902                     }
3903                 } while (l_data_size > 0U);
3904             }
3905         }
3906     }
3907
3908     if (l_N_ppm_remaining != 0U) {
3909         /* clean up to be done on l_cp destruction */
3910         opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n");
3911         return OPJ_FALSE;
3912     }
3913
3914     p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size);
3915     if (p_cp->ppm_buffer == 00) {
3916         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3917         return OPJ_FALSE;
3918     }
3919     p_cp->ppm_len = l_ppm_data_size;
3920     l_ppm_data_size = 0U;
3921     l_N_ppm_remaining = 0U;
3922     for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
3923         if (p_cp->ppm_markers[i].m_data !=
3924                 NULL) { /* standard doesn't seem to require contiguous Zppm */
3925             OPJ_UINT32 l_N_ppm;
3926             OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
3927             const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
3928
3929             if (l_N_ppm_remaining >= l_data_size) {
3930                 memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
3931                 l_ppm_data_size += l_data_size;
3932                 l_N_ppm_remaining -= l_data_size;
3933                 l_data_size = 0U;
3934             } else {
3935                 memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining);
3936                 l_ppm_data_size += l_N_ppm_remaining;
3937                 l_data += l_N_ppm_remaining;
3938                 l_data_size -= l_N_ppm_remaining;
3939                 l_N_ppm_remaining = 0U;
3940             }
3941
3942             if (l_data_size > 0U) {
3943                 do {
3944                     /* read Nppm */
3945                     if (l_data_size < 4U) {
3946                         /* clean up to be done on l_cp destruction */
3947                         opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
3948                         return OPJ_FALSE;
3949                     }
3950                     opj_read_bytes(l_data, &l_N_ppm, 4);
3951                     l_data += 4;
3952                     l_data_size -= 4;
3953
3954                     if (l_data_size >= l_N_ppm) {
3955                         memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm);
3956                         l_ppm_data_size += l_N_ppm;
3957                         l_data_size -= l_N_ppm;
3958                         l_data += l_N_ppm;
3959                     } else {
3960                         memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
3961                         l_ppm_data_size += l_data_size;
3962                         l_N_ppm_remaining = l_N_ppm - l_data_size;
3963                         l_data_size = 0U;
3964                     }
3965                 } while (l_data_size > 0U);
3966             }
3967             opj_free(p_cp->ppm_markers[i].m_data);
3968             p_cp->ppm_markers[i].m_data = NULL;
3969             p_cp->ppm_markers[i].m_data_size = 0U;
3970         }
3971     }
3972
3973     p_cp->ppm_data = p_cp->ppm_buffer;
3974     p_cp->ppm_data_size = p_cp->ppm_len;
3975
3976     p_cp->ppm_markers_count = 0U;
3977     opj_free(p_cp->ppm_markers);
3978     p_cp->ppm_markers = NULL;
3979
3980     return OPJ_TRUE;
3981 }
3982
3983 /**
3984  * Reads a PPT marker (Packed packet headers, tile-part header)
3985  *
3986  * @param       p_header_data   the data contained in the PPT box.
3987  * @param       p_j2k                   the jpeg2000 codec.
3988  * @param       p_header_size   the size of the data contained in the PPT marker.
3989  * @param       p_manager               the user event manager.
3990 */
3991 static OPJ_BOOL opj_j2k_read_ppt(opj_j2k_t *p_j2k,
3992                                  OPJ_BYTE * p_header_data,
3993                                  OPJ_UINT32 p_header_size,
3994                                  opj_event_mgr_t * p_manager
3995                                 )
3996 {
3997     opj_cp_t *l_cp = 00;
3998     opj_tcp_t *l_tcp = 00;
3999     OPJ_UINT32 l_Z_ppt;
4000
4001     /* preconditions */
4002     assert(p_header_data != 00);
4003     assert(p_j2k != 00);
4004     assert(p_manager != 00);
4005
4006     /* We need to have the Z_ppt element + 1 byte of Ippt at minimum */
4007     if (p_header_size < 2) {
4008         opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
4009         return OPJ_FALSE;
4010     }
4011
4012     l_cp = &(p_j2k->m_cp);
4013     if (l_cp->ppm) {
4014         opj_event_msg(p_manager, EVT_ERROR,
4015                       "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
4016         return OPJ_FALSE;
4017     }
4018
4019     l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
4020     l_tcp->ppt = 1;
4021
4022     opj_read_bytes(p_header_data, &l_Z_ppt, 1);             /* Z_ppt */
4023     ++p_header_data;
4024     --p_header_size;
4025
4026     /* check allocation needed */
4027     if (l_tcp->ppt_markers == NULL) { /* first PPT marker */
4028         OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4029         assert(l_tcp->ppt_markers_count == 0U);
4030
4031         l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
4032         if (l_tcp->ppt_markers == NULL) {
4033             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4034             return OPJ_FALSE;
4035         }
4036         l_tcp->ppt_markers_count = l_newCount;
4037     } else if (l_tcp->ppt_markers_count <= l_Z_ppt) {
4038         OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4039         opj_ppx *new_ppt_markers;
4040         new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers,
4041                           l_newCount * sizeof(opj_ppx));
4042         if (new_ppt_markers == NULL) {
4043             /* clean up to be done on l_tcp destruction */
4044             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4045             return OPJ_FALSE;
4046         }
4047         l_tcp->ppt_markers = new_ppt_markers;
4048         memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0,
4049                (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx));
4050         l_tcp->ppt_markers_count = l_newCount;
4051     }
4052
4053     if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) {
4054         /* clean up to be done on l_tcp destruction */
4055         opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt);
4056         return OPJ_FALSE;
4057     }
4058
4059     l_tcp->ppt_markers[l_Z_ppt].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
4060     if (l_tcp->ppt_markers[l_Z_ppt].m_data == NULL) {
4061         /* clean up to be done on l_tcp destruction */
4062         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4063         return OPJ_FALSE;
4064     }
4065     l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size;
4066     memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size);
4067     return OPJ_TRUE;
4068 }
4069
4070 /**
4071  * Merges all PPT markers read (Packed packet headers, tile-part header)
4072  *
4073  * @param       p_tcp   the tile.
4074  * @param       p_manager               the user event manager.
4075  */
4076 static OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp, opj_event_mgr_t * p_manager)
4077 {
4078     OPJ_UINT32 i, l_ppt_data_size;
4079     /* preconditions */
4080     assert(p_tcp != 00);
4081     assert(p_manager != 00);
4082
4083     if (p_tcp->ppt_buffer != NULL) {
4084         opj_event_msg(p_manager, EVT_ERROR,
4085                       "opj_j2k_merge_ppt() has already been called\n");
4086         return OPJ_FALSE;
4087     }
4088
4089     if (p_tcp->ppt == 0U) {
4090         return OPJ_TRUE;
4091     }
4092
4093     l_ppt_data_size = 0U;
4094     for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4095         l_ppt_data_size +=
4096             p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4097     }
4098
4099     p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size);
4100     if (p_tcp->ppt_buffer == 00) {
4101         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4102         return OPJ_FALSE;
4103     }
4104     p_tcp->ppt_len = l_ppt_data_size;
4105     l_ppt_data_size = 0U;
4106     for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4107         if (p_tcp->ppt_markers[i].m_data !=
4108                 NULL) { /* standard doesn't seem to require contiguous Zppt */
4109             memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data,
4110                    p_tcp->ppt_markers[i].m_data_size);
4111             l_ppt_data_size +=
4112                 p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4113
4114             opj_free(p_tcp->ppt_markers[i].m_data);
4115             p_tcp->ppt_markers[i].m_data = NULL;
4116             p_tcp->ppt_markers[i].m_data_size = 0U;
4117         }
4118     }
4119
4120     p_tcp->ppt_markers_count = 0U;
4121     opj_free(p_tcp->ppt_markers);
4122     p_tcp->ppt_markers = NULL;
4123
4124     p_tcp->ppt_data = p_tcp->ppt_buffer;
4125     p_tcp->ppt_data_size = p_tcp->ppt_len;
4126     return OPJ_TRUE;
4127 }
4128
4129 static OPJ_BOOL opj_j2k_write_tlm(opj_j2k_t *p_j2k,
4130                                   opj_stream_private_t *p_stream,
4131                                   opj_event_mgr_t * p_manager
4132                                  )
4133 {
4134     OPJ_BYTE * l_current_data = 00;
4135     OPJ_UINT32 l_tlm_size;
4136
4137     /* preconditions */
4138     assert(p_j2k != 00);
4139     assert(p_manager != 00);
4140     assert(p_stream != 00);
4141
4142     l_tlm_size = 6 + (5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
4143
4144     if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
4145         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
4146                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);
4147         if (! new_header_tile_data) {
4148             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
4149             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
4150             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
4151             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n");
4152             return OPJ_FALSE;
4153         }
4154         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
4155         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
4156     }
4157
4158     l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
4159
4160     /* change the way data is written to avoid seeking if possible */
4161     /* TODO */
4162     p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
4163
4164     opj_write_bytes(l_current_data, J2K_MS_TLM,
4165                     2);                                   /* TLM */
4166     l_current_data += 2;
4167
4168     opj_write_bytes(l_current_data, l_tlm_size - 2,
4169                     2);                                 /* Lpoc */
4170     l_current_data += 2;
4171
4172     opj_write_bytes(l_current_data, 0,
4173                     1);                                                    /* Ztlm=0*/
4174     ++l_current_data;
4175
4176     opj_write_bytes(l_current_data, 0x50,
4177                     1);                                                 /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
4178     ++l_current_data;
4179
4180     /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
4181     if (opj_stream_write_data(p_stream,
4182                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size,
4183                               p_manager) != l_tlm_size) {
4184         return OPJ_FALSE;
4185     }
4186
4187     return OPJ_TRUE;
4188 }
4189
4190 static OPJ_BOOL opj_j2k_write_sot(opj_j2k_t *p_j2k,
4191                                   OPJ_BYTE * p_data,
4192                                   OPJ_UINT32 total_data_size,
4193                                   OPJ_UINT32 * p_data_written,
4194                                   const opj_stream_private_t *p_stream,
4195                                   opj_event_mgr_t * p_manager
4196                                  )
4197 {
4198     /* preconditions */
4199     assert(p_j2k != 00);
4200     assert(p_manager != 00);
4201     assert(p_stream != 00);
4202
4203     OPJ_UNUSED(p_stream);
4204
4205     if (total_data_size < 12) {
4206         opj_event_msg(p_manager, EVT_ERROR,
4207                       "Not enough bytes in output buffer to write SOT marker\n");
4208         return OPJ_FALSE;
4209     }
4210
4211     opj_write_bytes(p_data, J2K_MS_SOT,
4212                     2);                                 /* SOT */
4213     p_data += 2;
4214
4215     opj_write_bytes(p_data, 10,
4216                     2);                                                   /* Lsot */
4217     p_data += 2;
4218
4219     opj_write_bytes(p_data, p_j2k->m_current_tile_number,
4220                     2);                        /* Isot */
4221     p_data += 2;
4222
4223     /* Psot  */
4224     p_data += 4;
4225
4226     opj_write_bytes(p_data,
4227                     p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,
4228                     1);                        /* TPsot */
4229     ++p_data;
4230
4231     opj_write_bytes(p_data,
4232                     p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,
4233                     1);                      /* TNsot */
4234     ++p_data;
4235
4236     /* UniPG>> */
4237 #ifdef USE_JPWL
4238     /* update markers struct */
4239     /*
4240             OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
4241     */
4242     assert(0 && "TODO");
4243 #endif /* USE_JPWL */
4244
4245     * p_data_written = 12;
4246
4247     return OPJ_TRUE;
4248 }
4249
4250 static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE *  p_header_data,
4251                                        OPJ_UINT32  p_header_size,
4252                                        OPJ_UINT32* p_tile_no,
4253                                        OPJ_UINT32* p_tot_len,
4254                                        OPJ_UINT32* p_current_part,
4255                                        OPJ_UINT32* p_num_parts,
4256                                        opj_event_mgr_t * p_manager)
4257 {
4258     /* preconditions */
4259     assert(p_header_data != 00);
4260     assert(p_manager != 00);
4261
4262     /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
4263     if (p_header_size != 8) {
4264         opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4265         return OPJ_FALSE;
4266     }
4267
4268     opj_read_bytes(p_header_data, p_tile_no, 2);    /* Isot */
4269     p_header_data += 2;
4270     opj_read_bytes(p_header_data, p_tot_len, 4);    /* Psot */
4271     p_header_data += 4;
4272     opj_read_bytes(p_header_data, p_current_part, 1); /* TPsot */
4273     ++p_header_data;
4274     opj_read_bytes(p_header_data, p_num_parts, 1);  /* TNsot */
4275     ++p_header_data;
4276     return OPJ_TRUE;
4277 }
4278
4279 static OPJ_BOOL opj_j2k_read_sot(opj_j2k_t *p_j2k,
4280                                  OPJ_BYTE * p_header_data,
4281                                  OPJ_UINT32 p_header_size,
4282                                  opj_event_mgr_t * p_manager)
4283 {
4284     opj_cp_t *l_cp = 00;
4285     opj_tcp_t *l_tcp = 00;
4286     OPJ_UINT32 l_tot_len, l_num_parts = 0;
4287     OPJ_UINT32 l_current_part;
4288     OPJ_UINT32 l_tile_x, l_tile_y;
4289
4290     /* preconditions */
4291
4292     assert(p_j2k != 00);
4293     assert(p_manager != 00);
4294
4295     if (! opj_j2k_get_sot_values(p_header_data, p_header_size,
4296                                  &(p_j2k->m_current_tile_number), &l_tot_len, &l_current_part, &l_num_parts,
4297                                  p_manager)) {
4298         opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4299         return OPJ_FALSE;
4300     }
4301 #ifdef DEBUG_VERBOSE
4302     fprintf(stderr, "SOT %d %d %d %d\n",
4303             p_j2k->m_current_tile_number, l_tot_len, l_current_part, l_num_parts);
4304 #endif
4305
4306     l_cp = &(p_j2k->m_cp);
4307
4308     /* testcase 2.pdf.SIGFPE.706.1112 */
4309     if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
4310         opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n",
4311                       p_j2k->m_current_tile_number);
4312         return OPJ_FALSE;
4313     }
4314
4315     l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
4316     l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
4317     l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
4318
4319     if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec < 0 ||
4320             p_j2k->m_current_tile_number == (OPJ_UINT32)
4321             p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec) {
4322         /* Do only this check if we decode all tile part headers, or if */
4323         /* we decode one precise tile. Otherwise the m_current_tile_part_number */
4324         /* might not be valid */
4325         /* Fixes issue with id_000020,sig_06,src_001958,op_flip4,pos_149 */
4326         /* of https://github.com/uclouvain/openjpeg/issues/939 */
4327         /* We must avoid reading twice the same tile part number for a given tile */
4328         /* so as to avoid various issues, like opj_j2k_merge_ppt being called */
4329         /* several times. */
4330         /* ISO 15444-1 A.4.2 Start of tile-part (SOT) mandates that tile parts */
4331         /* should appear in increasing order. */
4332         if (l_tcp->m_current_tile_part_number + 1 != (OPJ_INT32)l_current_part) {
4333             opj_event_msg(p_manager, EVT_ERROR,
4334                           "Invalid tile part index for tile number %d. "
4335                           "Got %d, expected %d\n",
4336                           p_j2k->m_current_tile_number,
4337                           l_current_part,
4338                           l_tcp->m_current_tile_part_number + 1);
4339             return OPJ_FALSE;
4340         }
4341     }
4342
4343     l_tcp->m_current_tile_part_number = (OPJ_INT32) l_current_part;
4344
4345 #ifdef USE_JPWL
4346     if (l_cp->correct) {
4347
4348         OPJ_UINT32 tileno = p_j2k->m_current_tile_number;
4349         static OPJ_UINT32 backup_tileno = 0;
4350
4351         /* tileno is negative or larger than the number of tiles!!! */
4352         if (tileno > (l_cp->tw * l_cp->th)) {
4353             opj_event_msg(p_manager, EVT_ERROR,
4354                           "JPWL: bad tile number (%d out of a maximum of %d)\n",
4355                           tileno, (l_cp->tw * l_cp->th));
4356             if (!JPWL_ASSUME) {
4357                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4358                 return OPJ_FALSE;
4359             }
4360             /* we try to correct */
4361             tileno = backup_tileno;
4362             opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
4363                           "- setting tile number to %d\n",
4364                           tileno);
4365         }
4366
4367         /* keep your private count of tiles */
4368         backup_tileno++;
4369     };
4370 #endif /* USE_JPWL */
4371
4372     /* look for the tile in the list of already processed tile (in parts). */
4373     /* Optimization possible here with a more complex data structure and with the removing of tiles */
4374     /* since the time taken by this function can only grow at the time */
4375
4376     /* PSot should be equal to zero or >=14 or <= 2^32-1 */
4377     if ((l_tot_len != 0) && (l_tot_len < 14)) {
4378         if (l_tot_len ==
4379                 12) { /* MSD: Special case for the PHR data which are read by kakadu*/
4380             opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n",
4381                           l_tot_len);
4382         } else {
4383             opj_event_msg(p_manager, EVT_ERROR,
4384                           "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
4385             return OPJ_FALSE;
4386         }
4387     }
4388
4389 #ifdef USE_JPWL
4390     if (l_cp->correct) {
4391
4392         /* totlen is negative or larger than the bytes left!!! */
4393         if (/*(l_tot_len < 0) ||*/ (l_tot_len >
4394                                     p_header_size)) {   /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */
4395             opj_event_msg(p_manager, EVT_ERROR,
4396                           "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
4397                           l_tot_len,
4398                           p_header_size);  /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */
4399             if (!JPWL_ASSUME) {
4400                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4401                 return OPJ_FALSE;
4402             }
4403             /* we try to correct */
4404             l_tot_len = 0;
4405             opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
4406                           "- setting Psot to %d => assuming it is the last tile\n",
4407                           l_tot_len);
4408         }
4409     };
4410 #endif /* USE_JPWL */
4411
4412     /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/
4413     if (!l_tot_len) {
4414         opj_event_msg(p_manager, EVT_INFO,
4415                       "Psot value of the current tile-part is equal to zero, "
4416                       "we assuming it is the last tile-part of the codestream.\n");
4417         p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4418     }
4419
4420     if (l_tcp->m_nb_tile_parts != 0 && l_current_part >= l_tcp->m_nb_tile_parts) {
4421         /* Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2851 */
4422         opj_event_msg(p_manager, EVT_ERROR,
4423                       "In SOT marker, TPSot (%d) is not valid regards to the previous "
4424                       "number of tile-part (%d), giving up\n", l_current_part,
4425                       l_tcp->m_nb_tile_parts);
4426         p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4427         return OPJ_FALSE;
4428     }
4429
4430     if (l_num_parts !=
4431             0) { /* Number of tile-part header is provided by this tile-part header */
4432         l_num_parts += p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction;
4433         /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of
4434          * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */
4435         if (l_tcp->m_nb_tile_parts) {
4436             if (l_current_part >= l_tcp->m_nb_tile_parts) {
4437                 opj_event_msg(p_manager, EVT_ERROR,
4438                               "In SOT marker, TPSot (%d) is not valid regards to the current "
4439                               "number of tile-part (%d), giving up\n", l_current_part,
4440                               l_tcp->m_nb_tile_parts);
4441                 p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4442                 return OPJ_FALSE;
4443             }
4444         }
4445         if (l_current_part >= l_num_parts) {
4446             /* testcase 451.pdf.SIGSEGV.ce9.3723 */
4447             opj_event_msg(p_manager, EVT_ERROR,
4448                           "In SOT marker, TPSot (%d) is not valid regards to the current "
4449                           "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts);
4450             p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4451             return OPJ_FALSE;
4452         }
4453         l_tcp->m_nb_tile_parts = l_num_parts;
4454     }
4455
4456     /* If know the number of tile part header we will check if we didn't read the last*/
4457     if (l_tcp->m_nb_tile_parts) {
4458         if (l_tcp->m_nb_tile_parts == (l_current_part + 1)) {
4459             p_j2k->m_specific_param.m_decoder.m_can_decode =
4460                 1; /* Process the last tile-part header*/
4461         }
4462     }
4463
4464     if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4465         /* Keep the size of data to skip after this marker */
4466         p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len -
4467                 12; /* SOT_marker_size = 12 */
4468     } else {
4469         /* FIXME: need to be computed from the number of bytes remaining in the codestream */
4470         p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
4471     }
4472
4473     p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;
4474
4475     /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/
4476     if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
4477         p_j2k->m_specific_param.m_decoder.m_skip_data =
4478             (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
4479             || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
4480             || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
4481             || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
4482     } else {
4483         assert(p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0);
4484         p_j2k->m_specific_param.m_decoder.m_skip_data =
4485             (p_j2k->m_current_tile_number != (OPJ_UINT32)
4486              p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);
4487     }
4488
4489     /* Index */
4490     if (p_j2k->cstr_index) {
4491         assert(p_j2k->cstr_index->tile_index != 00);
4492         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno =
4493             p_j2k->m_current_tile_number;
4494         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno =
4495             l_current_part;
4496
4497         if (l_num_parts != 0) {
4498             p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps =
4499                 l_num_parts;
4500             p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
4501                 l_num_parts;
4502
4503             if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4504                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4505                     (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
4506                 if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4507                     opj_event_msg(p_manager, EVT_ERROR,
4508                                   "Not enough memory to read SOT marker. Tile index allocation failed\n");
4509                     return OPJ_FALSE;
4510                 }
4511             } else {
4512                 opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
4513                                                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4514                                                    l_num_parts * sizeof(opj_tp_index_t));
4515                 if (! new_tp_index) {
4516                     opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
4517                     p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
4518                     opj_event_msg(p_manager, EVT_ERROR,
4519                                   "Not enough memory to read SOT marker. Tile index allocation failed\n");
4520                     return OPJ_FALSE;
4521                 }
4522                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4523                     new_tp_index;
4524             }
4525         } else {
4526             /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
4527
4528                 if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4529                     p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
4530                     p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4531                         (opj_tp_index_t*)opj_calloc(
4532                             p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
4533                             sizeof(opj_tp_index_t));
4534                     if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4535                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
4536                         opj_event_msg(p_manager, EVT_ERROR,
4537                                       "Not enough memory to read SOT marker. Tile index allocation failed\n");
4538                         return OPJ_FALSE;
4539                     }
4540                 }
4541
4542                 if (l_current_part >=
4543                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps) {
4544                     opj_tp_index_t *new_tp_index;
4545                     p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
4546                         l_current_part + 1;
4547                     new_tp_index = (opj_tp_index_t *) opj_realloc(
4548                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4549                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps *
4550                                        sizeof(opj_tp_index_t));
4551                     if (! new_tp_index) {
4552                         opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
4553                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
4554                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
4555                         opj_event_msg(p_manager, EVT_ERROR,
4556                                       "Not enough memory to read SOT marker. Tile index allocation failed\n");
4557                         return OPJ_FALSE;
4558                     }
4559                     p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4560                         new_tp_index;
4561                 }
4562             }
4563
4564         }
4565
4566     }
4567
4568     /* FIXME move this onto a separate method to call before reading any SOT, remove part about main_end header, use a index struct inside p_j2k */
4569     /* if (p_j2k->cstr_info) {
4570        if (l_tcp->first) {
4571        if (tileno == 0) {
4572        p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;
4573        }
4574
4575        p_j2k->cstr_info->tile[tileno].tileno = tileno;
4576        p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;
4577        p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
4578        p_j2k->cstr_info->tile[tileno].num_tps = numparts;
4579
4580        if (numparts) {
4581        p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
4582        }
4583        else {
4584        p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
4585        }
4586        }
4587        else {
4588        p_j2k->cstr_info->tile[tileno].end_pos += totlen;
4589        }
4590
4591        p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;
4592        p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
4593        p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
4594        }*/
4595     return OPJ_TRUE;
4596 }
4597
4598 static OPJ_BOOL opj_j2k_write_sod(opj_j2k_t *p_j2k,
4599                                   opj_tcd_t * p_tile_coder,
4600                                   OPJ_BYTE * p_data,
4601                                   OPJ_UINT32 * p_data_written,
4602                                   OPJ_UINT32 total_data_size,
4603                                   const opj_stream_private_t *p_stream,
4604                                   opj_event_mgr_t * p_manager
4605                                  )
4606 {
4607     opj_codestream_info_t *l_cstr_info = 00;
4608     OPJ_UINT32 l_remaining_data;
4609
4610     /* preconditions */
4611     assert(p_j2k != 00);
4612     assert(p_manager != 00);
4613     assert(p_stream != 00);
4614
4615     OPJ_UNUSED(p_stream);
4616
4617     if (total_data_size < 4) {
4618         opj_event_msg(p_manager, EVT_ERROR,
4619                       "Not enough bytes in output buffer to write SOD marker\n");
4620         return OPJ_FALSE;
4621     }
4622
4623     opj_write_bytes(p_data, J2K_MS_SOD,
4624                     2);                                 /* SOD */
4625     p_data += 2;
4626
4627     /* make room for the EOF marker */
4628     l_remaining_data =  total_data_size - 4;
4629
4630     /* update tile coder */
4631     p_tile_coder->tp_num =
4632         p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
4633     p_tile_coder->cur_tp_num =
4634         p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
4635
4636     /* INDEX >> */
4637     /* TODO mergeV2: check this part which use cstr_info */
4638     /*l_cstr_info = p_j2k->cstr_info;
4639     if (l_cstr_info) {
4640             if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {
4641                     //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
4642                     l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
4643             }
4644             else {*/
4645     /*
4646     TODO
4647     if
4648             (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
4649     {
4650             cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
4651     }*/
4652     /*}*/
4653     /* UniPG>> */
4654 #ifdef USE_JPWL
4655     /* update markers struct */
4656     /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
4657     */
4658     assert(0 && "TODO");
4659 #endif /* USE_JPWL */
4660     /* <<UniPG */
4661     /*}*/
4662     /* << INDEX */
4663
4664     if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
4665         p_tile_coder->tcd_image->tiles->packno = 0;
4666 #ifdef deadcode
4667         if (l_cstr_info) {
4668             l_cstr_info->packno = 0;
4669         }
4670 #endif
4671     }
4672
4673     *p_data_written = 0;
4674
4675     if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number, p_data,
4676                               p_data_written, l_remaining_data, l_cstr_info,
4677                               p_manager)) {
4678         opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
4679         return OPJ_FALSE;
4680     }
4681
4682     *p_data_written += 2;
4683
4684     return OPJ_TRUE;
4685 }
4686
4687 static OPJ_BOOL opj_j2k_read_sod(opj_j2k_t *p_j2k,
4688                                  opj_stream_private_t *p_stream,
4689                                  opj_event_mgr_t * p_manager
4690                                 )
4691 {
4692     OPJ_SIZE_T l_current_read_size;
4693     opj_codestream_index_t * l_cstr_index = 00;
4694     OPJ_BYTE ** l_current_data = 00;
4695     opj_tcp_t * l_tcp = 00;
4696     OPJ_UINT32 * l_tile_len = 00;
4697     OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
4698
4699     /* preconditions */
4700     assert(p_j2k != 00);
4701     assert(p_manager != 00);
4702     assert(p_stream != 00);
4703
4704     l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4705
4706     if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4707         /* opj_stream_get_number_byte_left returns OPJ_OFF_T
4708         // but we are in the last tile part,
4709         // so its result will fit on OPJ_UINT32 unless we find
4710         // a file with a single tile part of more than 4 GB...*/
4711         p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(
4712                     opj_stream_get_number_byte_left(p_stream) - 2);
4713     } else {
4714         /* Check to avoid pass the limit of OPJ_UINT32 */
4715         if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2) {
4716             p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
4717         } else {
4718             /* MSD: case commented to support empty SOT marker (PHR data) */
4719         }
4720     }
4721
4722     l_current_data = &(l_tcp->m_data);
4723     l_tile_len = &l_tcp->m_data_size;
4724
4725     /* Patch to support new PHR data */
4726     if (p_j2k->m_specific_param.m_decoder.m_sot_length) {
4727         /* If we are here, we'll try to read the data after allocation */
4728         /* Check enough bytes left in stream before allocation */
4729         if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length >
4730                 opj_stream_get_number_byte_left(p_stream)) {
4731             opj_event_msg(p_manager, EVT_ERROR,
4732                           "Tile part length size inconsistent with stream length\n");
4733             return OPJ_FALSE;
4734         }
4735         if (p_j2k->m_specific_param.m_decoder.m_sot_length >
4736                 UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA) {
4737             opj_event_msg(p_manager, EVT_ERROR,
4738                           "p_j2k->m_specific_param.m_decoder.m_sot_length > "
4739                           "UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA");
4740             return OPJ_FALSE;
4741         }
4742         /* Add a margin of OPJ_COMMON_CBLK_DATA_EXTRA to the allocation we */
4743         /* do so that opj_mqc_init_dec_common() can safely add a synthetic */
4744         /* 0xFFFF marker. */
4745         if (! *l_current_data) {
4746             /* LH: oddly enough, in this path, l_tile_len!=0.
4747              * TODO: If this was consistent, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).
4748              */
4749             *l_current_data = (OPJ_BYTE*) opj_malloc(
4750                                   p_j2k->m_specific_param.m_decoder.m_sot_length + OPJ_COMMON_CBLK_DATA_EXTRA);
4751         } else {
4752             OPJ_BYTE *l_new_current_data;
4753             if (*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA -
4754                     p_j2k->m_specific_param.m_decoder.m_sot_length) {
4755                 opj_event_msg(p_manager, EVT_ERROR,
4756                               "*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA - "
4757                               "p_j2k->m_specific_param.m_decoder.m_sot_length");
4758                 return OPJ_FALSE;
4759             }
4760
4761             l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data,
4762                                  *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length +
4763                                  OPJ_COMMON_CBLK_DATA_EXTRA);
4764             if (! l_new_current_data) {
4765                 opj_free(*l_current_data);
4766                 /*nothing more is done as l_current_data will be set to null, and just
4767                   afterward we enter in the error path
4768                   and the actual tile_len is updated (committed) at the end of the
4769                   function. */
4770             }
4771             *l_current_data = l_new_current_data;
4772         }
4773
4774         if (*l_current_data == 00) {
4775             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n");
4776             return OPJ_FALSE;
4777         }
4778     } else {
4779         l_sot_length_pb_detected = OPJ_TRUE;
4780     }
4781
4782     /* Index */
4783     l_cstr_index = p_j2k->cstr_index;
4784     if (l_cstr_index) {
4785         OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
4786
4787         OPJ_UINT32 l_current_tile_part =
4788             l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
4789         l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header
4790             =
4791                 l_current_pos;
4792         l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos
4793             =
4794                 l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
4795
4796         if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
4797                                               l_cstr_index,
4798                                               J2K_MS_SOD,
4799                                               l_current_pos,
4800                                               p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {
4801             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
4802             return OPJ_FALSE;
4803         }
4804
4805         /*l_cstr_index->packno = 0;*/
4806     }
4807
4808     /* Patch to support new PHR data */
4809     if (!l_sot_length_pb_detected) {
4810         l_current_read_size = opj_stream_read_data(
4811                                   p_stream,
4812                                   *l_current_data + *l_tile_len,
4813                                   p_j2k->m_specific_param.m_decoder.m_sot_length,
4814                                   p_manager);
4815     } else {
4816         l_current_read_size = 0;
4817     }
4818
4819     if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {
4820         p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
4821     } else {
4822         p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
4823     }
4824
4825     *l_tile_len += (OPJ_UINT32)l_current_read_size;
4826
4827     return OPJ_TRUE;
4828 }
4829
4830 static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
4831                                   OPJ_UINT32 p_tile_no,
4832                                   OPJ_UINT32 p_comp_no,
4833                                   OPJ_UINT32 nb_comps,
4834                                   opj_stream_private_t *p_stream,
4835                                   opj_event_mgr_t * p_manager
4836                                  )
4837 {
4838     OPJ_BYTE * l_current_data = 00;
4839     OPJ_UINT32 l_rgn_size;
4840     opj_cp_t *l_cp = 00;
4841     opj_tcp_t *l_tcp = 00;
4842     opj_tccp_t *l_tccp = 00;
4843     OPJ_UINT32 l_comp_room;
4844
4845     /* preconditions */
4846     assert(p_j2k != 00);
4847     assert(p_manager != 00);
4848     assert(p_stream != 00);
4849
4850     l_cp = &(p_j2k->m_cp);
4851     l_tcp = &l_cp->tcps[p_tile_no];
4852     l_tccp = &l_tcp->tccps[p_comp_no];
4853
4854     if (nb_comps <= 256) {
4855         l_comp_room = 1;
4856     } else {
4857         l_comp_room = 2;
4858     }
4859
4860     l_rgn_size = 6 + l_comp_room;
4861
4862     l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
4863
4864     opj_write_bytes(l_current_data, J2K_MS_RGN,
4865                     2);                                   /* RGN  */
4866     l_current_data += 2;
4867
4868     opj_write_bytes(l_current_data, l_rgn_size - 2,
4869                     2);                                 /* Lrgn */
4870     l_current_data += 2;
4871
4872     opj_write_bytes(l_current_data, p_comp_no,
4873                     l_comp_room);                          /* Crgn */
4874     l_current_data += l_comp_room;
4875
4876     opj_write_bytes(l_current_data, 0,
4877                     1);                                           /* Srgn */
4878     ++l_current_data;
4879
4880     opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,
4881                     1);                            /* SPrgn */
4882     ++l_current_data;
4883
4884     if (opj_stream_write_data(p_stream,
4885                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_rgn_size,
4886                               p_manager) != l_rgn_size) {
4887         return OPJ_FALSE;
4888     }
4889
4890     return OPJ_TRUE;
4891 }
4892
4893 static OPJ_BOOL opj_j2k_write_eoc(opj_j2k_t *p_j2k,
4894                                   opj_stream_private_t *p_stream,
4895                                   opj_event_mgr_t * p_manager
4896                                  )
4897 {
4898     /* preconditions */
4899     assert(p_j2k != 00);
4900     assert(p_manager != 00);
4901     assert(p_stream != 00);
4902
4903     opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,
4904                     J2K_MS_EOC, 2);                                    /* EOC */
4905
4906     /* UniPG>> */
4907 #ifdef USE_JPWL
4908     /* update markers struct */
4909     /*
4910     OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
4911     */
4912 #endif /* USE_JPWL */
4913
4914     if (opj_stream_write_data(p_stream,
4915                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, 2, p_manager) != 2) {
4916         return OPJ_FALSE;
4917     }
4918
4919     if (! opj_stream_flush(p_stream, p_manager)) {
4920         return OPJ_FALSE;
4921     }
4922
4923     return OPJ_TRUE;
4924 }
4925
4926 /**
4927  * Reads a RGN marker (Region Of Interest)
4928  *
4929  * @param       p_header_data   the data contained in the POC box.
4930  * @param       p_j2k                   the jpeg2000 codec.
4931  * @param       p_header_size   the size of the data contained in the POC marker.
4932  * @param       p_manager               the user event manager.
4933 */
4934 static OPJ_BOOL opj_j2k_read_rgn(opj_j2k_t *p_j2k,
4935                                  OPJ_BYTE * p_header_data,
4936                                  OPJ_UINT32 p_header_size,
4937                                  opj_event_mgr_t * p_manager
4938                                 )
4939 {
4940     OPJ_UINT32 l_nb_comp;
4941     opj_image_t * l_image = 00;
4942
4943     opj_cp_t *l_cp = 00;
4944     opj_tcp_t *l_tcp = 00;
4945     OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
4946
4947     /* preconditions*/
4948     assert(p_header_data != 00);
4949     assert(p_j2k != 00);
4950     assert(p_manager != 00);
4951
4952     l_image = p_j2k->m_private_image;
4953     l_nb_comp = l_image->numcomps;
4954
4955     if (l_nb_comp <= 256) {
4956         l_comp_room = 1;
4957     } else {
4958         l_comp_room = 2;
4959     }
4960
4961     if (p_header_size != 2 + l_comp_room) {
4962         opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
4963         return OPJ_FALSE;
4964     }
4965
4966     l_cp = &(p_j2k->m_cp);
4967     l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
4968             &l_cp->tcps[p_j2k->m_current_tile_number] :
4969             p_j2k->m_specific_param.m_decoder.m_default_tcp;
4970
4971     opj_read_bytes(p_header_data, &l_comp_no, l_comp_room);         /* Crgn */
4972     p_header_data += l_comp_room;
4973     opj_read_bytes(p_header_data, &l_roi_sty,
4974                    1);                                     /* Srgn */
4975     ++p_header_data;
4976
4977 #ifdef USE_JPWL
4978     if (l_cp->correct) {
4979         /* totlen is negative or larger than the bytes left!!! */
4980         if (l_comp_room >= l_nb_comp) {
4981             opj_event_msg(p_manager, EVT_ERROR,
4982                           "JPWL: bad component number in RGN (%d when there are only %d)\n",
4983                           l_comp_room, l_nb_comp);
4984             if (!JPWL_ASSUME) {
4985                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4986                 return OPJ_FALSE;
4987             }
4988         }
4989     };
4990 #endif /* USE_JPWL */
4991
4992     /* testcase 3635.pdf.asan.77.2930 */
4993     if (l_comp_no >= l_nb_comp) {
4994         opj_event_msg(p_manager, EVT_ERROR,
4995                       "bad component number in RGN (%d when there are only %d)\n",
4996                       l_comp_no, l_nb_comp);
4997         return OPJ_FALSE;
4998     }
4999
5000     opj_read_bytes(p_header_data,
5001                    (OPJ_UINT32 *)(&(l_tcp->tccps[l_comp_no].roishift)), 1);  /* SPrgn */
5002     ++p_header_data;
5003
5004     return OPJ_TRUE;
5005
5006 }
5007
5008 static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp)
5009 {
5010     return (OPJ_FLOAT32)((p_tcp->m_nb_tile_parts - 1) * 14);
5011 }
5012
5013 static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp)
5014 {
5015     (void)p_tcp;
5016     return 0;
5017 }
5018
5019 static OPJ_BOOL opj_j2k_update_rates(opj_j2k_t *p_j2k,
5020                                      opj_stream_private_t *p_stream,
5021                                      opj_event_mgr_t * p_manager)
5022 {
5023     opj_cp_t * l_cp = 00;
5024     opj_image_t * l_image = 00;
5025     opj_tcp_t * l_tcp = 00;
5026     opj_image_comp_t * l_img_comp = 00;
5027
5028     OPJ_UINT32 i, j, k;
5029     OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
5030     OPJ_FLOAT32 * l_rates = 0;
5031     OPJ_FLOAT32 l_sot_remove;
5032     OPJ_UINT32 l_bits_empty, l_size_pixel;
5033     OPJ_UINT32 l_tile_size = 0;
5034     OPJ_UINT32 l_last_res;
5035     OPJ_FLOAT32(* l_tp_stride_func)(opj_tcp_t *) = 00;
5036
5037     /* preconditions */
5038     assert(p_j2k != 00);
5039     assert(p_manager != 00);
5040     assert(p_stream != 00);
5041
5042     OPJ_UNUSED(p_manager);
5043
5044     l_cp = &(p_j2k->m_cp);
5045     l_image = p_j2k->m_private_image;
5046     l_tcp = l_cp->tcps;
5047
5048     l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
5049     l_size_pixel = l_image->numcomps * l_image->comps->prec;
5050     l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(
5051                        l_cp->th * l_cp->tw);
5052
5053     if (l_cp->m_specific_param.m_enc.m_tp_on) {
5054         l_tp_stride_func = opj_j2k_get_tp_stride;
5055     } else {
5056         l_tp_stride_func = opj_j2k_get_default_stride;
5057     }
5058
5059     for (i = 0; i < l_cp->th; ++i) {
5060         for (j = 0; j < l_cp->tw; ++j) {
5061             OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) /
5062                                    (OPJ_FLOAT32)l_tcp->numlayers;
5063
5064             /* 4 borders of the tile rescale on the image if necessary */
5065             l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx),
5066                                (OPJ_INT32)l_image->x0);
5067             l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy),
5068                                (OPJ_INT32)l_image->y0);
5069             l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx),
5070                                (OPJ_INT32)l_image->x1);
5071             l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy),
5072                                (OPJ_INT32)l_image->y1);
5073
5074             l_rates = l_tcp->rates;
5075
5076             /* Modification of the RATE >> */
5077             if (*l_rates > 0.0f) {
5078                 *l_rates = (((OPJ_FLOAT32)(l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) *
5079                                            (OPJ_UINT32)(l_y1 - l_y0)))
5080                             /
5081                             ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
5082                            )
5083                            -
5084                            l_offset;
5085             }
5086
5087             ++l_rates;
5088
5089             for (k = 1; k < l_tcp->numlayers; ++k) {
5090                 if (*l_rates > 0.0f) {
5091                     *l_rates = (((OPJ_FLOAT32)(l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) *
5092                                                (OPJ_UINT32)(l_y1 - l_y0)))
5093                                 /
5094                                 ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
5095                                )
5096                                -
5097                                l_offset;
5098                 }
5099
5100                 ++l_rates;
5101             }
5102
5103             ++l_tcp;
5104
5105         }
5106     }
5107
5108     l_tcp = l_cp->tcps;
5109
5110     for (i = 0; i < l_cp->th; ++i) {
5111         for (j = 0; j < l_cp->tw; ++j) {
5112             l_rates = l_tcp->rates;
5113
5114             if (*l_rates > 0.0f) {
5115                 *l_rates -= l_sot_remove;
5116
5117                 if (*l_rates < 30.0f) {
5118                     *l_rates = 30.0f;
5119                 }
5120             }
5121
5122             ++l_rates;
5123
5124             l_last_res = l_tcp->numlayers - 1;
5125
5126             for (k = 1; k < l_last_res; ++k) {
5127
5128                 if (*l_rates > 0.0f) {
5129                     *l_rates -= l_sot_remove;
5130
5131                     if (*l_rates < * (l_rates - 1) + 10.0f) {
5132                         *l_rates  = (*(l_rates - 1)) + 20.0f;
5133                     }
5134                 }
5135
5136                 ++l_rates;
5137             }
5138
5139             if (*l_rates > 0.0f) {
5140                 *l_rates -= (l_sot_remove + 2.f);
5141
5142                 if (*l_rates < * (l_rates - 1) + 10.0f) {
5143                     *l_rates  = (*(l_rates - 1)) + 20.0f;
5144                 }
5145             }
5146
5147             ++l_tcp;
5148         }
5149     }
5150
5151     l_img_comp = l_image->comps;
5152     l_tile_size = 0;
5153
5154     for (i = 0; i < l_image->numcomps; ++i) {
5155         l_tile_size += (opj_uint_ceildiv(l_cp->tdx, l_img_comp->dx)
5156                         *
5157                         opj_uint_ceildiv(l_cp->tdy, l_img_comp->dy)
5158                         *
5159                         l_img_comp->prec
5160                        );
5161
5162         ++l_img_comp;
5163     }
5164
5165     /* TODO: where does this magic value come from ? */
5166     /* This used to be 1.3 / 8, but with random data and very small code */
5167     /* block sizes, this is not enough. For example with */
5168     /* bin/test_tile_encoder 1 256 256 32 32 8 0 reversible_with_precinct.j2k 4 4 3 0 0 1 16 16 */
5169     /* TODO revise this to take into account the overhead linked to the */
5170     /* number of packets and number of code blocks in packets */
5171     l_tile_size = (OPJ_UINT32)(l_tile_size * 1.4 / 8);
5172
5173     /* Arbitrary amount to make the following work: */
5174     /* bin/test_tile_encoder 1 256 256 17 16 8 0 reversible_no_precinct.j2k 4 4 3 0 0 1 */
5175     l_tile_size += 500;
5176
5177     l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
5178
5179     p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size;
5180     p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
5181         (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
5182     if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {
5183         return OPJ_FALSE;
5184     }
5185
5186     if (OPJ_IS_CINEMA(l_cp->rsiz)) {
5187         p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
5188             (OPJ_BYTE *) opj_malloc(5 *
5189                                     p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
5190         if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
5191             return OPJ_FALSE;
5192         }
5193
5194         p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
5195             p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
5196     }
5197
5198     return OPJ_TRUE;
5199 }
5200
5201 #if 0
5202 static OPJ_BOOL opj_j2k_read_eoc(opj_j2k_t *p_j2k,
5203                                  opj_stream_private_t *p_stream,
5204                                  opj_event_mgr_t * p_manager)
5205 {
5206     OPJ_UINT32 i;
5207     opj_tcd_t * l_tcd = 00;
5208     OPJ_UINT32 l_nb_tiles;
5209     opj_tcp_t * l_tcp = 00;
5210     OPJ_BOOL l_success;
5211
5212     /* preconditions */
5213     assert(p_j2k != 00);
5214     assert(p_manager != 00);
5215     assert(p_stream != 00);
5216
5217     l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
5218     l_tcp = p_j2k->m_cp.tcps;
5219
5220     l_tcd = opj_tcd_create(OPJ_TRUE);
5221     if (l_tcd == 00) {
5222         opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
5223         return OPJ_FALSE;
5224     }
5225
5226     for (i = 0; i < l_nb_tiles; ++i) {
5227         if (l_tcp->m_data) {
5228             if (! opj_tcd_init_decode_tile(l_tcd, i)) {
5229                 opj_tcd_destroy(l_tcd);
5230                 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
5231                 return OPJ_FALSE;
5232             }
5233
5234             l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i,
5235                                             p_j2k->cstr_index);
5236             /* cleanup */
5237
5238             if (! l_success) {
5239                 p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
5240                 break;
5241             }
5242         }
5243
5244         opj_j2k_tcp_destroy(l_tcp);
5245         ++l_tcp;
5246     }
5247
5248     opj_tcd_destroy(l_tcd);
5249     return OPJ_TRUE;
5250 }
5251 #endif
5252
5253 static OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
5254                                        struct opj_stream_private *p_stream,
5255                                        struct opj_event_mgr * p_manager)
5256 {
5257     /* preconditions */
5258     assert(p_j2k != 00);
5259     assert(p_manager != 00);
5260     assert(p_stream != 00);
5261
5262     OPJ_UNUSED(p_manager);
5263
5264     p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
5265
5266     return OPJ_TRUE;
5267 }
5268
5269 static OPJ_BOOL opj_j2k_write_mct_data_group(opj_j2k_t *p_j2k,
5270         struct opj_stream_private *p_stream,
5271         struct opj_event_mgr * p_manager)
5272 {
5273     OPJ_UINT32 i;
5274     opj_simple_mcc_decorrelation_data_t * l_mcc_record;
5275     opj_mct_data_t * l_mct_record;
5276     opj_tcp_t * l_tcp;
5277
5278     /* preconditions */
5279     assert(p_j2k != 00);
5280     assert(p_stream != 00);
5281     assert(p_manager != 00);
5282
5283     if (! opj_j2k_write_cbd(p_j2k, p_stream, p_manager)) {
5284         return OPJ_FALSE;
5285     }
5286
5287     l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
5288     l_mct_record = l_tcp->m_mct_records;
5289
5290     for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
5291
5292         if (! opj_j2k_write_mct_record(p_j2k, l_mct_record, p_stream, p_manager)) {
5293             return OPJ_FALSE;
5294         }
5295
5296         ++l_mct_record;
5297     }
5298
5299     l_mcc_record = l_tcp->m_mcc_records;
5300
5301     for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
5302
5303         if (! opj_j2k_write_mcc_record(p_j2k, l_mcc_record, p_stream, p_manager)) {
5304             return OPJ_FALSE;
5305         }
5306
5307         ++l_mcc_record;
5308     }
5309
5310     if (! opj_j2k_write_mco(p_j2k, p_stream, p_manager)) {
5311         return OPJ_FALSE;
5312     }
5313
5314     return OPJ_TRUE;
5315 }
5316
5317 static OPJ_BOOL opj_j2k_write_all_coc(
5318     opj_j2k_t *p_j2k,
5319     struct opj_stream_private *p_stream,
5320     struct opj_event_mgr * p_manager)
5321 {
5322     OPJ_UINT32 compno;
5323
5324     /* preconditions */
5325     assert(p_j2k != 00);
5326     assert(p_manager != 00);
5327     assert(p_stream != 00);
5328
5329     for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5330         /* cod is first component of first tile */
5331         if (! opj_j2k_compare_coc(p_j2k, 0, compno)) {
5332             if (! opj_j2k_write_coc(p_j2k, compno, p_stream, p_manager)) {
5333                 return OPJ_FALSE;
5334             }
5335         }
5336     }
5337
5338     return OPJ_TRUE;
5339 }
5340
5341 static OPJ_BOOL opj_j2k_write_all_qcc(
5342     opj_j2k_t *p_j2k,
5343     struct opj_stream_private *p_stream,
5344     struct opj_event_mgr * p_manager)
5345 {
5346     OPJ_UINT32 compno;
5347
5348     /* preconditions */
5349     assert(p_j2k != 00);
5350     assert(p_manager != 00);
5351     assert(p_stream != 00);
5352
5353     for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5354         /* qcd is first component of first tile */
5355         if (! opj_j2k_compare_qcc(p_j2k, 0, compno)) {
5356             if (! opj_j2k_write_qcc(p_j2k, compno, p_stream, p_manager)) {
5357                 return OPJ_FALSE;
5358             }
5359         }
5360     }
5361     return OPJ_TRUE;
5362 }
5363
5364 static OPJ_BOOL opj_j2k_write_regions(opj_j2k_t *p_j2k,
5365                                       struct opj_stream_private *p_stream,
5366                                       struct opj_event_mgr * p_manager)
5367 {
5368     OPJ_UINT32 compno;
5369     const opj_tccp_t *l_tccp = 00;
5370
5371     /* preconditions */
5372     assert(p_j2k != 00);
5373     assert(p_manager != 00);
5374     assert(p_stream != 00);
5375
5376     l_tccp = p_j2k->m_cp.tcps->tccps;
5377
5378     for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {
5379         if (l_tccp->roishift) {
5380
5381             if (! opj_j2k_write_rgn(p_j2k, 0, compno, p_j2k->m_private_image->numcomps,
5382                                     p_stream, p_manager)) {
5383                 return OPJ_FALSE;
5384             }
5385         }
5386
5387         ++l_tccp;
5388     }
5389
5390     return OPJ_TRUE;
5391 }
5392
5393 static OPJ_BOOL opj_j2k_write_epc(opj_j2k_t *p_j2k,
5394                                   struct opj_stream_private *p_stream,
5395                                   struct opj_event_mgr * p_manager)
5396 {
5397     opj_codestream_index_t * l_cstr_index = 00;
5398
5399     /* preconditions */
5400     assert(p_j2k != 00);
5401     assert(p_manager != 00);
5402     assert(p_stream != 00);
5403
5404     OPJ_UNUSED(p_manager);
5405
5406     l_cstr_index = p_j2k->cstr_index;
5407     if (l_cstr_index) {
5408         l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
5409         /* UniPG>> */
5410         /* The following adjustment is done to adjust the codestream size */
5411         /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
5412         /* the first bunch of bytes is not in the codestream              */
5413         l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;
5414         /* <<UniPG */
5415     }
5416
5417 #ifdef USE_JPWL
5418     /* preparation of JPWL marker segments */
5419 #if 0
5420     if (cp->epc_on) {
5421
5422         /* encode according to JPWL */
5423         jpwl_encode(p_j2k, p_stream, image);
5424
5425     }
5426 #endif
5427     assert(0 && "TODO");
5428 #endif /* USE_JPWL */
5429
5430     return OPJ_TRUE;
5431 }
5432
5433 static OPJ_BOOL opj_j2k_read_unk(opj_j2k_t *p_j2k,
5434                                  opj_stream_private_t *p_stream,
5435                                  OPJ_UINT32 *output_marker,
5436                                  opj_event_mgr_t * p_manager
5437                                 )
5438 {
5439     OPJ_UINT32 l_unknown_marker;
5440     const opj_dec_memory_marker_handler_t * l_marker_handler;
5441     OPJ_UINT32 l_size_unk = 2;
5442
5443     /* preconditions*/
5444     assert(p_j2k != 00);
5445     assert(p_manager != 00);
5446     assert(p_stream != 00);
5447
5448     opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
5449
5450     for (;;) {
5451         /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
5452         if (opj_stream_read_data(p_stream,
5453                                  p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
5454             opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
5455             return OPJ_FALSE;
5456         }
5457
5458         /* read 2 bytes as the new marker ID*/
5459         opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
5460                        &l_unknown_marker, 2);
5461
5462         if (!(l_unknown_marker < 0xff00)) {
5463
5464             /* Get the marker handler from the marker ID*/
5465             l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
5466
5467             if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
5468                 opj_event_msg(p_manager, EVT_ERROR,
5469                               "Marker is not compliant with its position\n");
5470                 return OPJ_FALSE;
5471             } else {
5472                 if (l_marker_handler->id != J2K_MS_UNK) {
5473                     /* Add the marker to the codestream index*/
5474                     if (l_marker_handler->id != J2K_MS_SOT) {
5475                         OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
5476                                                             (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
5477                                                             l_size_unk);
5478                         if (res == OPJ_FALSE) {
5479                             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
5480                             return OPJ_FALSE;
5481                         }
5482                     }
5483                     break; /* next marker is known and well located */
5484                 } else {
5485                     l_size_unk += 2;
5486                 }
5487             }
5488         }
5489     }
5490
5491     *output_marker = l_marker_handler->id ;
5492
5493     return OPJ_TRUE;
5494 }
5495
5496 static OPJ_BOOL opj_j2k_write_mct_record(opj_j2k_t *p_j2k,
5497         opj_mct_data_t * p_mct_record,
5498         struct opj_stream_private *p_stream,
5499         struct opj_event_mgr * p_manager)
5500 {
5501     OPJ_UINT32 l_mct_size;
5502     OPJ_BYTE * l_current_data = 00;
5503     OPJ_UINT32 l_tmp;
5504
5505     /* preconditions */
5506     assert(p_j2k != 00);
5507     assert(p_manager != 00);
5508     assert(p_stream != 00);
5509
5510     l_mct_size = 10 + p_mct_record->m_data_size;
5511
5512     if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
5513         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
5514                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);
5515         if (! new_header_tile_data) {
5516             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5517             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5518             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5519             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n");
5520             return OPJ_FALSE;
5521         }
5522         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5523         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
5524     }
5525
5526     l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5527
5528     opj_write_bytes(l_current_data, J2K_MS_MCT,
5529                     2);                                   /* MCT */
5530     l_current_data += 2;
5531
5532     opj_write_bytes(l_current_data, l_mct_size - 2,
5533                     2);                                 /* Lmct */
5534     l_current_data += 2;
5535
5536     opj_write_bytes(l_current_data, 0,
5537                     2);                                                    /* Zmct */
5538     l_current_data += 2;
5539
5540     /* only one marker atm */
5541     l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) |
5542             (p_mct_record->m_element_type << 10);
5543
5544     opj_write_bytes(l_current_data, l_tmp, 2);
5545     l_current_data += 2;
5546
5547     opj_write_bytes(l_current_data, 0,
5548                     2);                                                    /* Ymct */
5549     l_current_data += 2;
5550
5551     memcpy(l_current_data, p_mct_record->m_data, p_mct_record->m_data_size);
5552
5553     if (opj_stream_write_data(p_stream,
5554                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size,
5555                               p_manager) != l_mct_size) {
5556         return OPJ_FALSE;
5557     }
5558
5559     return OPJ_TRUE;
5560 }
5561
5562 /**
5563  * Reads a MCT marker (Multiple Component Transform)
5564  *
5565  * @param       p_header_data   the data contained in the MCT box.
5566  * @param       p_j2k                   the jpeg2000 codec.
5567  * @param       p_header_size   the size of the data contained in the MCT marker.
5568  * @param       p_manager               the user event manager.
5569 */
5570 static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
5571                                  OPJ_BYTE * p_header_data,
5572                                  OPJ_UINT32 p_header_size,
5573                                  opj_event_mgr_t * p_manager
5574                                 )
5575 {
5576     OPJ_UINT32 i;
5577     opj_tcp_t *l_tcp = 00;
5578     OPJ_UINT32 l_tmp;
5579     OPJ_UINT32 l_indix;
5580     opj_mct_data_t * l_mct_data;
5581
5582     /* preconditions */
5583     assert(p_header_data != 00);
5584     assert(p_j2k != 00);
5585
5586     l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5587             &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5588             p_j2k->m_specific_param.m_decoder.m_default_tcp;
5589
5590     if (p_header_size < 2) {
5591         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5592         return OPJ_FALSE;
5593     }
5594
5595     /* first marker */
5596     opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmct */
5597     p_header_data += 2;
5598     if (l_tmp != 0) {
5599         opj_event_msg(p_manager, EVT_WARNING,
5600                       "Cannot take in charge mct data within multiple MCT records\n");
5601         return OPJ_TRUE;
5602     }
5603
5604     if (p_header_size <= 6) {
5605         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5606         return OPJ_FALSE;
5607     }
5608
5609     /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
5610     opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Imct */
5611     p_header_data += 2;
5612
5613     l_indix = l_tmp & 0xff;
5614     l_mct_data = l_tcp->m_mct_records;
5615
5616     for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
5617         if (l_mct_data->m_index == l_indix) {
5618             break;
5619         }
5620         ++l_mct_data;
5621     }
5622
5623     /* NOT FOUND */
5624     if (i == l_tcp->m_nb_mct_records) {
5625         if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
5626             opj_mct_data_t *new_mct_records;
5627             l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
5628
5629             new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records,
5630                               l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
5631             if (! new_mct_records) {
5632                 opj_free(l_tcp->m_mct_records);
5633                 l_tcp->m_mct_records = NULL;
5634                 l_tcp->m_nb_max_mct_records = 0;
5635                 l_tcp->m_nb_mct_records = 0;
5636                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n");
5637                 return OPJ_FALSE;
5638             }
5639
5640             /* Update m_mcc_records[].m_offset_array and m_decorrelation_array
5641              * to point to the new addresses */
5642             if (new_mct_records != l_tcp->m_mct_records) {
5643                 for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
5644                     opj_simple_mcc_decorrelation_data_t* l_mcc_record =
5645                         &(l_tcp->m_mcc_records[i]);
5646                     if (l_mcc_record->m_decorrelation_array) {
5647                         l_mcc_record->m_decorrelation_array =
5648                             new_mct_records +
5649                             (l_mcc_record->m_decorrelation_array -
5650                              l_tcp->m_mct_records);
5651                     }
5652                     if (l_mcc_record->m_offset_array) {
5653                         l_mcc_record->m_offset_array =
5654                             new_mct_records +
5655                             (l_mcc_record->m_offset_array -
5656                              l_tcp->m_mct_records);
5657                     }
5658                 }
5659             }
5660
5661             l_tcp->m_mct_records = new_mct_records;
5662             l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5663             memset(l_mct_data, 0, (l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) *
5664                    sizeof(opj_mct_data_t));
5665         }
5666
5667         l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5668         ++l_tcp->m_nb_mct_records;
5669     }
5670
5671     if (l_mct_data->m_data) {
5672         opj_free(l_mct_data->m_data);
5673         l_mct_data->m_data = 00;
5674         l_mct_data->m_data_size = 0;
5675     }
5676
5677     l_mct_data->m_index = l_indix;
5678     l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
5679     l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
5680
5681     opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymct */
5682     p_header_data += 2;
5683     if (l_tmp != 0) {
5684         opj_event_msg(p_manager, EVT_WARNING,
5685                       "Cannot take in charge multiple MCT markers\n");
5686         return OPJ_TRUE;
5687     }
5688
5689     p_header_size -= 6;
5690
5691     l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
5692     if (! l_mct_data->m_data) {
5693         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5694         return OPJ_FALSE;
5695     }
5696     memcpy(l_mct_data->m_data, p_header_data, p_header_size);
5697
5698     l_mct_data->m_data_size = p_header_size;
5699
5700     return OPJ_TRUE;
5701 }
5702
5703 static OPJ_BOOL opj_j2k_write_mcc_record(opj_j2k_t *p_j2k,
5704         struct opj_simple_mcc_decorrelation_data * p_mcc_record,
5705         struct opj_stream_private *p_stream,
5706         struct opj_event_mgr * p_manager)
5707 {
5708     OPJ_UINT32 i;
5709     OPJ_UINT32 l_mcc_size;
5710     OPJ_BYTE * l_current_data = 00;
5711     OPJ_UINT32 l_nb_bytes_for_comp;
5712     OPJ_UINT32 l_mask;
5713     OPJ_UINT32 l_tmcc;
5714
5715     /* preconditions */
5716     assert(p_j2k != 00);
5717     assert(p_manager != 00);
5718     assert(p_stream != 00);
5719
5720     if (p_mcc_record->m_nb_comps > 255) {
5721         l_nb_bytes_for_comp = 2;
5722         l_mask = 0x8000;
5723     } else {
5724         l_nb_bytes_for_comp = 1;
5725         l_mask = 0;
5726     }
5727
5728     l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
5729     if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
5730         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
5731                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);
5732         if (! new_header_tile_data) {
5733             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5734             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5735             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5736             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n");
5737             return OPJ_FALSE;
5738         }
5739         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5740         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
5741     }
5742
5743     l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5744
5745     opj_write_bytes(l_current_data, J2K_MS_MCC,
5746                     2);                                   /* MCC */
5747     l_current_data += 2;
5748
5749     opj_write_bytes(l_current_data, l_mcc_size - 2,
5750                     2);                                 /* Lmcc */
5751     l_current_data += 2;
5752
5753     /* first marker */
5754     opj_write_bytes(l_current_data, 0,
5755                     2);                                  /* Zmcc */
5756     l_current_data += 2;
5757
5758     opj_write_bytes(l_current_data, p_mcc_record->m_index,
5759                     1);                                        /* Imcc -> no need for other values, take the first */
5760     ++l_current_data;
5761
5762     /* only one marker atm */
5763     opj_write_bytes(l_current_data, 0,
5764                     2);                                  /* Ymcc */
5765     l_current_data += 2;
5766
5767     opj_write_bytes(l_current_data, 1,
5768                     2);                                  /* Qmcc -> number of collections -> 1 */
5769     l_current_data += 2;
5770
5771     opj_write_bytes(l_current_data, 0x1,
5772                     1);                                /* Xmcci type of component transformation -> array based decorrelation */
5773     ++l_current_data;
5774
5775     opj_write_bytes(l_current_data, p_mcc_record->m_nb_comps | l_mask,
5776                     2);  /* Nmcci number of input components involved and size for each component offset = 8 bits */
5777     l_current_data += 2;
5778
5779     for (i = 0; i < p_mcc_record->m_nb_comps; ++i) {
5780         opj_write_bytes(l_current_data, i,
5781                         l_nb_bytes_for_comp);                          /* Cmccij Component offset*/
5782         l_current_data += l_nb_bytes_for_comp;
5783     }
5784
5785     opj_write_bytes(l_current_data, p_mcc_record->m_nb_comps | l_mask,
5786                     2);  /* Mmcci number of output components involved and size for each component offset = 8 bits */
5787     l_current_data += 2;
5788
5789     for (i = 0; i < p_mcc_record->m_nb_comps; ++i) {
5790         opj_write_bytes(l_current_data, i,
5791                         l_nb_bytes_for_comp);                          /* Wmccij Component offset*/
5792         l_current_data += l_nb_bytes_for_comp;
5793     }
5794
5795     l_tmcc = ((!p_mcc_record->m_is_irreversible) & 1U) << 16;
5796
5797     if (p_mcc_record->m_decorrelation_array) {
5798         l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
5799     }
5800
5801     if (p_mcc_record->m_offset_array) {
5802         l_tmcc |= ((p_mcc_record->m_offset_array->m_index) << 8);
5803     }
5804
5805     opj_write_bytes(l_current_data, l_tmcc,
5806                     3);     /* Tmcci : use MCT defined as number 1 and irreversible array based. */
5807     l_current_data += 3;
5808
5809     if (opj_stream_write_data(p_stream,
5810                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size,
5811                               p_manager) != l_mcc_size) {
5812         return OPJ_FALSE;
5813     }
5814
5815     return OPJ_TRUE;
5816 }
5817
5818 static OPJ_BOOL opj_j2k_read_mcc(opj_j2k_t *p_j2k,
5819                                  OPJ_BYTE * p_header_data,
5820                                  OPJ_UINT32 p_header_size,
5821                                  opj_event_mgr_t * p_manager)
5822 {
5823     OPJ_UINT32 i, j;
5824     OPJ_UINT32 l_tmp;
5825     OPJ_UINT32 l_indix;
5826     opj_tcp_t * l_tcp;
5827     opj_simple_mcc_decorrelation_data_t * l_mcc_record;
5828     opj_mct_data_t * l_mct_data;
5829     OPJ_UINT32 l_nb_collections;
5830     OPJ_UINT32 l_nb_comps;
5831     OPJ_UINT32 l_nb_bytes_by_comp;
5832     OPJ_BOOL l_new_mcc = OPJ_FALSE;
5833
5834     /* preconditions */
5835     assert(p_header_data != 00);
5836     assert(p_j2k != 00);
5837     assert(p_manager != 00);
5838
5839     l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5840             &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5841             p_j2k->m_specific_param.m_decoder.m_default_tcp;
5842
5843     if (p_header_size < 2) {
5844         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5845         return OPJ_FALSE;
5846     }
5847
5848     /* first marker */
5849     opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmcc */
5850     p_header_data += 2;
5851     if (l_tmp != 0) {
5852         opj_event_msg(p_manager, EVT_WARNING,
5853                       "Cannot take in charge multiple data spanning\n");
5854         return OPJ_TRUE;
5855     }
5856
5857     if (p_header_size < 7) {
5858         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5859         return OPJ_FALSE;
5860     }
5861
5862     opj_read_bytes(p_header_data, &l_indix,
5863                    1); /* Imcc -> no need for other values, take the first */
5864     ++p_header_data;
5865
5866     l_mcc_record = l_tcp->m_mcc_records;
5867
5868     for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
5869         if (l_mcc_record->m_index == l_indix) {
5870             break;
5871         }
5872         ++l_mcc_record;
5873     }
5874
5875     /** NOT FOUND */
5876     if (i == l_tcp->m_nb_mcc_records) {
5877         if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
5878             opj_simple_mcc_decorrelation_data_t *new_mcc_records;
5879             l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
5880
5881             new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
5882                                   l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(
5883                                       opj_simple_mcc_decorrelation_data_t));
5884             if (! new_mcc_records) {
5885                 opj_free(l_tcp->m_mcc_records);
5886                 l_tcp->m_mcc_records = NULL;
5887                 l_tcp->m_nb_max_mcc_records = 0;
5888                 l_tcp->m_nb_mcc_records = 0;
5889                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n");
5890                 return OPJ_FALSE;
5891             }
5892             l_tcp->m_mcc_records = new_mcc_records;
5893             l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
5894             memset(l_mcc_record, 0, (l_tcp->m_nb_max_mcc_records - l_tcp->m_nb_mcc_records)
5895                    * sizeof(opj_simple_mcc_decorrelation_data_t));
5896         }
5897         l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
5898         l_new_mcc = OPJ_TRUE;
5899     }
5900     l_mcc_record->m_index = l_indix;
5901
5902     /* only one marker atm */
5903     opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymcc */
5904     p_header_data += 2;
5905     if (l_tmp != 0) {
5906         opj_event_msg(p_manager, EVT_WARNING,
5907                       "Cannot take in charge multiple data spanning\n");
5908         return OPJ_TRUE;
5909     }
5910
5911     opj_read_bytes(p_header_data, &l_nb_collections,
5912                    2);                              /* Qmcc -> number of collections -> 1 */
5913     p_header_data += 2;
5914
5915     if (l_nb_collections > 1) {
5916         opj_event_msg(p_manager, EVT_WARNING,
5917                       "Cannot take in charge multiple collections\n");
5918         return OPJ_TRUE;
5919     }
5920
5921     p_header_size -= 7;
5922
5923     for (i = 0; i < l_nb_collections; ++i) {
5924         if (p_header_size < 3) {
5925             opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5926             return OPJ_FALSE;
5927         }
5928
5929         opj_read_bytes(p_header_data, &l_tmp,
5930                        1); /* Xmcci type of component transformation -> array based decorrelation */
5931         ++p_header_data;
5932
5933         if (l_tmp != 1) {
5934             opj_event_msg(p_manager, EVT_WARNING,
5935                           "Cannot take in charge collections other than array decorrelation\n");
5936             return OPJ_TRUE;
5937         }
5938
5939         opj_read_bytes(p_header_data, &l_nb_comps, 2);
5940
5941         p_header_data += 2;
5942         p_header_size -= 3;
5943
5944         l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
5945         l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
5946
5947         if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
5948             opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5949             return OPJ_FALSE;
5950         }
5951
5952         p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
5953
5954         for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
5955             opj_read_bytes(p_header_data, &l_tmp,
5956                            l_nb_bytes_by_comp);      /* Cmccij Component offset*/
5957             p_header_data += l_nb_bytes_by_comp;
5958
5959             if (l_tmp != j) {
5960                 opj_event_msg(p_manager, EVT_WARNING,
5961                               "Cannot take in charge collections with indix shuffle\n");
5962                 return OPJ_TRUE;
5963             }
5964         }
5965
5966         opj_read_bytes(p_header_data, &l_nb_comps, 2);
5967         p_header_data += 2;
5968
5969         l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
5970         l_nb_comps &= 0x7fff;
5971
5972         if (l_nb_comps != l_mcc_record->m_nb_comps) {
5973             opj_event_msg(p_manager, EVT_WARNING,
5974                           "Cannot take in charge collections without same number of indixes\n");
5975             return OPJ_TRUE;
5976         }
5977
5978         if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
5979             opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5980             return OPJ_FALSE;
5981         }
5982
5983         p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
5984
5985         for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
5986             opj_read_bytes(p_header_data, &l_tmp,
5987                            l_nb_bytes_by_comp);      /* Wmccij Component offset*/
5988             p_header_data += l_nb_bytes_by_comp;
5989
5990             if (l_tmp != j) {
5991                 opj_event_msg(p_manager, EVT_WARNING,
5992                               "Cannot take in charge collections with indix shuffle\n");
5993                 return OPJ_TRUE;
5994             }
5995         }
5996
5997         opj_read_bytes(p_header_data, &l_tmp, 3); /* Wmccij Component offset*/
5998         p_header_data += 3;
5999
6000         l_mcc_record->m_is_irreversible = !((l_tmp >> 16) & 1);
6001         l_mcc_record->m_decorrelation_array = 00;
6002         l_mcc_record->m_offset_array = 00;
6003
6004         l_indix = l_tmp & 0xff;
6005         if (l_indix != 0) {
6006             l_mct_data = l_tcp->m_mct_records;
6007             for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6008                 if (l_mct_data->m_index == l_indix) {
6009                     l_mcc_record->m_decorrelation_array = l_mct_data;
6010                     break;
6011                 }
6012                 ++l_mct_data;
6013             }
6014
6015             if (l_mcc_record->m_decorrelation_array == 00) {
6016                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6017                 return OPJ_FALSE;
6018             }
6019         }
6020
6021         l_indix = (l_tmp >> 8) & 0xff;
6022         if (l_indix != 0) {
6023             l_mct_data = l_tcp->m_mct_records;
6024             for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6025                 if (l_mct_data->m_index == l_indix) {
6026                     l_mcc_record->m_offset_array = l_mct_data;
6027                     break;
6028                 }
6029                 ++l_mct_data;
6030             }
6031
6032             if (l_mcc_record->m_offset_array == 00) {
6033                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6034                 return OPJ_FALSE;
6035             }
6036         }
6037     }
6038
6039     if (p_header_size != 0) {
6040         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6041         return OPJ_FALSE;
6042     }
6043
6044     if (l_new_mcc) {
6045         ++l_tcp->m_nb_mcc_records;
6046     }
6047
6048     return OPJ_TRUE;
6049 }
6050
6051 static OPJ_BOOL opj_j2k_write_mco(opj_j2k_t *p_j2k,
6052                                   struct opj_stream_private *p_stream,
6053                                   struct opj_event_mgr * p_manager
6054                                  )
6055 {
6056     OPJ_BYTE * l_current_data = 00;
6057     OPJ_UINT32 l_mco_size;
6058     opj_tcp_t * l_tcp = 00;
6059     opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6060     OPJ_UINT32 i;
6061
6062     /* preconditions */
6063     assert(p_j2k != 00);
6064     assert(p_manager != 00);
6065     assert(p_stream != 00);
6066
6067     l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
6068
6069     l_mco_size = 5 + l_tcp->m_nb_mcc_records;
6070     if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
6071
6072         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
6073                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);
6074         if (! new_header_tile_data) {
6075             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
6076             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
6077             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
6078             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n");
6079             return OPJ_FALSE;
6080         }
6081         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
6082         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
6083     }
6084     l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
6085
6086
6087     opj_write_bytes(l_current_data, J2K_MS_MCO, 2);                 /* MCO */
6088     l_current_data += 2;
6089
6090     opj_write_bytes(l_current_data, l_mco_size - 2, 2);             /* Lmco */
6091     l_current_data += 2;
6092
6093     opj_write_bytes(l_current_data, l_tcp->m_nb_mcc_records,
6094                     1);    /* Nmco : only one transform stage*/
6095     ++l_current_data;
6096
6097     l_mcc_record = l_tcp->m_mcc_records;
6098     for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
6099         opj_write_bytes(l_current_data, l_mcc_record->m_index,
6100                         1); /* Imco -> use the mcc indicated by 1*/
6101         ++l_current_data;
6102         ++l_mcc_record;
6103     }
6104
6105     if (opj_stream_write_data(p_stream,
6106                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size,
6107                               p_manager) != l_mco_size) {
6108         return OPJ_FALSE;
6109     }
6110
6111     return OPJ_TRUE;
6112 }
6113
6114 /**
6115  * Reads a MCO marker (Multiple Component Transform Ordering)
6116  *
6117  * @param       p_header_data   the data contained in the MCO box.
6118  * @param       p_j2k                   the jpeg2000 codec.
6119  * @param       p_header_size   the size of the data contained in the MCO marker.
6120  * @param       p_manager               the user event manager.
6121 */
6122 static OPJ_BOOL opj_j2k_read_mco(opj_j2k_t *p_j2k,
6123                                  OPJ_BYTE * p_header_data,
6124                                  OPJ_UINT32 p_header_size,
6125                                  opj_event_mgr_t * p_manager
6126                                 )
6127 {
6128     OPJ_UINT32 l_tmp, i;
6129     OPJ_UINT32 l_nb_stages;
6130     opj_tcp_t * l_tcp;
6131     opj_tccp_t * l_tccp;
6132     opj_image_t * l_image;
6133
6134     /* preconditions */
6135     assert(p_header_data != 00);
6136     assert(p_j2k != 00);
6137     assert(p_manager != 00);
6138
6139     l_image = p_j2k->m_private_image;
6140     l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6141             &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6142             p_j2k->m_specific_param.m_decoder.m_default_tcp;
6143
6144     if (p_header_size < 1) {
6145         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
6146         return OPJ_FALSE;
6147     }
6148
6149     opj_read_bytes(p_header_data, &l_nb_stages,
6150                    1);                         /* Nmco : only one transform stage*/
6151     ++p_header_data;
6152
6153     if (l_nb_stages > 1) {
6154         opj_event_msg(p_manager, EVT_WARNING,
6155                       "Cannot take in charge multiple transformation stages.\n");
6156         return OPJ_TRUE;
6157     }
6158
6159     if (p_header_size != l_nb_stages + 1) {
6160         opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
6161         return OPJ_FALSE;
6162     }
6163
6164     l_tccp = l_tcp->tccps;
6165
6166     for (i = 0; i < l_image->numcomps; ++i) {
6167         l_tccp->m_dc_level_shift = 0;
6168         ++l_tccp;
6169     }
6170
6171     if (l_tcp->m_mct_decoding_matrix) {
6172         opj_free(l_tcp->m_mct_decoding_matrix);
6173         l_tcp->m_mct_decoding_matrix = 00;
6174     }
6175
6176     for (i = 0; i < l_nb_stages; ++i) {
6177         opj_read_bytes(p_header_data, &l_tmp, 1);
6178         ++p_header_data;
6179
6180         if (! opj_j2k_add_mct(l_tcp, p_j2k->m_private_image, l_tmp)) {
6181             return OPJ_FALSE;
6182         }
6183     }
6184
6185     return OPJ_TRUE;
6186 }
6187
6188 static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
6189                                 OPJ_UINT32 p_index)
6190 {
6191     OPJ_UINT32 i;
6192     opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6193     opj_mct_data_t * l_deco_array, * l_offset_array;
6194     OPJ_UINT32 l_data_size, l_mct_size, l_offset_size;
6195     OPJ_UINT32 l_nb_elem;
6196     OPJ_UINT32 * l_offset_data, * l_current_offset_data;
6197     opj_tccp_t * l_tccp;
6198
6199     /* preconditions */
6200     assert(p_tcp != 00);
6201
6202     l_mcc_record = p_tcp->m_mcc_records;
6203
6204     for (i = 0; i < p_tcp->m_nb_mcc_records; ++i) {
6205         if (l_mcc_record->m_index == p_index) {
6206             break;
6207         }
6208     }
6209
6210     if (i == p_tcp->m_nb_mcc_records) {
6211         /** element discarded **/
6212         return OPJ_TRUE;
6213     }
6214
6215     if (l_mcc_record->m_nb_comps != p_image->numcomps) {
6216         /** do not support number of comps != image */
6217         return OPJ_TRUE;
6218     }
6219
6220     l_deco_array = l_mcc_record->m_decorrelation_array;
6221
6222     if (l_deco_array) {
6223         l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps
6224                       * p_image->numcomps;
6225         if (l_deco_array->m_data_size != l_data_size) {
6226             return OPJ_FALSE;
6227         }
6228
6229         l_nb_elem = p_image->numcomps * p_image->numcomps;
6230         l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
6231         p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
6232
6233         if (! p_tcp->m_mct_decoding_matrix) {
6234             return OPJ_FALSE;
6235         }
6236
6237         j2k_mct_read_functions_to_float[l_deco_array->m_element_type](
6238             l_deco_array->m_data, p_tcp->m_mct_decoding_matrix, l_nb_elem);
6239     }
6240
6241     l_offset_array = l_mcc_record->m_offset_array;
6242
6243     if (l_offset_array) {
6244         l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] *
6245                       p_image->numcomps;
6246         if (l_offset_array->m_data_size != l_data_size) {
6247             return OPJ_FALSE;
6248         }
6249
6250         l_nb_elem = p_image->numcomps;
6251         l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
6252         l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
6253
6254         if (! l_offset_data) {
6255             return OPJ_FALSE;
6256         }
6257
6258         j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](
6259             l_offset_array->m_data, l_offset_data, l_nb_elem);
6260
6261         l_tccp = p_tcp->tccps;
6262         l_current_offset_data = l_offset_data;
6263
6264         for (i = 0; i < p_image->numcomps; ++i) {
6265             l_tccp->m_dc_level_shift = (OPJ_INT32) * (l_current_offset_data++);
6266             ++l_tccp;
6267         }
6268
6269         opj_free(l_offset_data);
6270     }
6271
6272     return OPJ_TRUE;
6273 }
6274
6275 static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
6276                                   struct opj_stream_private *p_stream,
6277                                   struct opj_event_mgr * p_manager)
6278 {
6279     OPJ_UINT32 i;
6280     OPJ_UINT32 l_cbd_size;
6281     OPJ_BYTE * l_current_data = 00;
6282     opj_image_t *l_image = 00;
6283     opj_image_comp_t * l_comp = 00;
6284
6285     /* preconditions */
6286     assert(p_j2k != 00);
6287     assert(p_manager != 00);
6288     assert(p_stream != 00);
6289
6290     l_image = p_j2k->m_private_image;
6291     l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
6292
6293     if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
6294         OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
6295                                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
6296         if (! new_header_tile_data) {
6297             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
6298             p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
6299             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
6300             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
6301             return OPJ_FALSE;
6302         }
6303         p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
6304         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
6305     }
6306
6307     l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
6308
6309     opj_write_bytes(l_current_data, J2K_MS_CBD, 2);                 /* CBD */
6310     l_current_data += 2;
6311
6312     opj_write_bytes(l_current_data, l_cbd_size - 2, 2);             /* L_CBD */
6313     l_current_data += 2;
6314
6315     opj_write_bytes(l_current_data, l_image->numcomps, 2);          /* Ncbd */
6316     l_current_data += 2;
6317
6318     l_comp = l_image->comps;
6319
6320     for (i = 0; i < l_image->numcomps; ++i) {
6321         opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1),
6322                         1);           /* Component bit depth */
6323         ++l_current_data;
6324
6325         ++l_comp;
6326     }
6327
6328     if (opj_stream_write_data(p_stream,
6329                               p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size,
6330                               p_manager) != l_cbd_size) {
6331         return OPJ_FALSE;
6332     }
6333
6334     return OPJ_TRUE;
6335 }
6336
6337 /**
6338  * Reads a CBD marker (Component bit depth definition)
6339  * @param       p_header_data   the data contained in the CBD box.
6340  * @param       p_j2k                   the jpeg2000 codec.
6341  * @param       p_header_size   the size of the data contained in the CBD marker.
6342  * @param       p_manager               the user event manager.
6343 */
6344 static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
6345                                  OPJ_BYTE * p_header_data,
6346                                  OPJ_UINT32 p_header_size,
6347                                  opj_event_mgr_t * p_manager
6348                                 )
6349 {
6350     OPJ_UINT32 l_nb_comp, l_num_comp;
6351     OPJ_UINT32 l_comp_def;
6352     OPJ_UINT32 i;
6353     opj_image_comp_t * l_comp = 00;
6354
6355     /* preconditions */
6356     assert(p_header_data != 00);
6357     assert(p_j2k != 00);
6358     assert(p_manager != 00);
6359
6360     l_num_comp = p_j2k->m_private_image->numcomps;
6361
6362     if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
6363         opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6364         return OPJ_FALSE;
6365     }
6366
6367     opj_read_bytes(p_header_data, &l_nb_comp,
6368                    2);                           /* Ncbd */
6369     p_header_data += 2;
6370
6371     if (l_nb_comp != l_num_comp) {
6372         opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6373         return OPJ_FALSE;
6374     }
6375
6376     l_comp = p_j2k->m_private_image->comps;
6377     for (i = 0; i < l_num_comp; ++i) {
6378         opj_read_bytes(p_header_data, &l_comp_def,
6379                        1);                  /* Component bit depth */
6380         ++p_header_data;
6381         l_comp->sgnd = (l_comp_def >> 7) & 1;
6382         l_comp->prec = (l_comp_def & 0x7f) + 1;
6383
6384         if (l_comp->prec > 31) {
6385             opj_event_msg(p_manager, EVT_ERROR,
6386                           "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",
6387                           i, l_comp->prec);
6388             return OPJ_FALSE;
6389         }
6390         ++l_comp;
6391     }
6392
6393     return OPJ_TRUE;
6394 }
6395
6396 /* ----------------------------------------------------------------------- */
6397 /* J2K / JPT decoder interface                                             */
6398 /* ----------------------------------------------------------------------- */
6399
6400 void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
6401 {
6402     if (j2k && parameters) {
6403         j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
6404         j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
6405
6406         j2k->dump_state = (parameters->flags & OPJ_DPARAMETERS_DUMP_FLAG);
6407 #ifdef USE_JPWL
6408         j2k->m_cp.correct = parameters->jpwl_correct;
6409         j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
6410         j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
6411 #endif /* USE_JPWL */
6412     }
6413 }
6414
6415 OPJ_BOOL opj_j2k_set_threads(opj_j2k_t *j2k, OPJ_UINT32 num_threads)
6416 {
6417     /* Currently we pass the thread-pool to the tcd, so we cannot re-set it */
6418     /* afterwards */
6419     if (opj_has_thread_support() && j2k->m_tcd == NULL) {
6420         opj_thread_pool_destroy(j2k->m_tp);
6421         j2k->m_tp = NULL;
6422         if (num_threads <= (OPJ_UINT32)INT_MAX) {
6423             j2k->m_tp = opj_thread_pool_create((int)num_threads);
6424         }
6425         if (j2k->m_tp == NULL) {
6426             j2k->m_tp = opj_thread_pool_create(0);
6427             return OPJ_FALSE;
6428         }
6429         return OPJ_TRUE;
6430     }
6431     return OPJ_FALSE;
6432 }
6433
6434 static int opj_j2k_get_default_thread_count()
6435 {
6436     const char* num_threads_str = getenv("OPJ_NUM_THREADS");
6437     int num_cpus;
6438     int num_threads;
6439
6440     if (num_threads_str == NULL || !opj_has_thread_support()) {
6441         return 0;
6442     }
6443     num_cpus = opj_get_num_cpus();
6444     if (strcmp(num_threads_str, "ALL_CPUS") == 0) {
6445         return num_cpus;
6446     }
6447     if (num_cpus == 0) {
6448         num_cpus = 32;
6449     }
6450     num_threads = atoi(num_threads_str);
6451     if (num_threads < 0) {
6452         num_threads = 0;
6453     } else if (num_threads > 2 * num_cpus) {
6454         num_threads = 2 * num_cpus;
6455     }
6456     return num_threads;
6457 }
6458
6459 /* ----------------------------------------------------------------------- */
6460 /* J2K encoder interface                                                       */
6461 /* ----------------------------------------------------------------------- */
6462
6463 opj_j2k_t* opj_j2k_create_compress(void)
6464 {
6465     opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
6466     if (!l_j2k) {
6467         return NULL;
6468     }
6469
6470
6471     l_j2k->m_is_decoder = 0;
6472     l_j2k->m_cp.m_is_decoder = 0;
6473
6474     l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(
6475                 OPJ_J2K_DEFAULT_HEADER_SIZE);
6476     if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
6477         opj_j2k_destroy(l_j2k);
6478         return NULL;
6479     }
6480
6481     l_j2k->m_specific_param.m_encoder.m_header_tile_data_size =
6482         OPJ_J2K_DEFAULT_HEADER_SIZE;
6483
6484     /* validation list creation*/
6485     l_j2k->m_validation_list = opj_procedure_list_create();
6486     if (! l_j2k->m_validation_list) {
6487         opj_j2k_destroy(l_j2k);
6488         return NULL;
6489     }
6490
6491     /* execution list creation*/
6492     l_j2k->m_procedure_list = opj_procedure_list_create();
6493     if (! l_j2k->m_procedure_list) {
6494         opj_j2k_destroy(l_j2k);
6495         return NULL;
6496     }
6497
6498     l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
6499     if (!l_j2k->m_tp) {
6500         l_j2k->m_tp = opj_thread_pool_create(0);
6501     }
6502     if (!l_j2k->m_tp) {
6503         opj_j2k_destroy(l_j2k);
6504         return NULL;
6505     }
6506
6507     return l_j2k;
6508 }
6509
6510 static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres)
6511 {
6512     POC[0].tile  = 1;
6513     POC[0].resno0  = 0;
6514     POC[0].compno0 = 0;
6515     POC[0].layno1  = 1;
6516     POC[0].resno1  = (OPJ_UINT32)(numres - 1);
6517     POC[0].compno1 = 3;
6518     POC[0].prg1 = OPJ_CPRL;
6519     POC[1].tile  = 1;
6520     POC[1].resno0  = (OPJ_UINT32)(numres - 1);
6521     POC[1].compno0 = 0;
6522     POC[1].layno1  = 1;
6523     POC[1].resno1  = (OPJ_UINT32)numres;
6524     POC[1].compno1 = 3;
6525     POC[1].prg1 = OPJ_CPRL;
6526     return 2;
6527 }
6528
6529 static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
6530         opj_image_t *image, opj_event_mgr_t *p_manager)
6531 {
6532     /* Configure cinema parameters */
6533     int i;
6534
6535     /* No tiling */
6536     parameters->tile_size_on = OPJ_FALSE;
6537     parameters->cp_tdx = 1;
6538     parameters->cp_tdy = 1;
6539
6540     /* One tile part for each component */
6541     parameters->tp_flag = 'C';
6542     parameters->tp_on = 1;
6543
6544     /* Tile and Image shall be at (0,0) */
6545     parameters->cp_tx0 = 0;
6546     parameters->cp_ty0 = 0;
6547     parameters->image_offset_x0 = 0;
6548     parameters->image_offset_y0 = 0;
6549
6550     /* Codeblock size= 32*32 */
6551     parameters->cblockw_init = 32;
6552     parameters->cblockh_init = 32;
6553
6554     /* Codeblock style: no mode switch enabled */
6555     parameters->mode = 0;
6556
6557     /* No ROI */
6558     parameters->roi_compno = -1;
6559
6560     /* No subsampling */
6561     parameters->subsampling_dx = 1;
6562     parameters->subsampling_dy = 1;
6563
6564     /* 9-7 transform */
6565     parameters->irreversible = 1;
6566
6567     /* Number of layers */
6568     if (parameters->tcp_numlayers > 1) {
6569         opj_event_msg(p_manager, EVT_WARNING,
6570                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6571                       "1 single quality layer"
6572                       "-> Number of layers forced to 1 (rather than %d)\n"
6573                       "-> Rate of the last layer (%3.1f) will be used",
6574                       parameters->tcp_numlayers,
6575                       parameters->tcp_rates[parameters->tcp_numlayers - 1]);
6576         parameters->tcp_rates[0] = parameters->tcp_rates[parameters->tcp_numlayers - 1];
6577         parameters->tcp_numlayers = 1;
6578     }
6579
6580     /* Resolution levels */
6581     switch (parameters->rsiz) {
6582     case OPJ_PROFILE_CINEMA_2K:
6583         if (parameters->numresolution > 6) {
6584             opj_event_msg(p_manager, EVT_WARNING,
6585                           "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6586                           "Number of decomposition levels <= 5\n"
6587                           "-> Number of decomposition levels forced to 5 (rather than %d)\n",
6588                           parameters->numresolution + 1);
6589             parameters->numresolution = 6;
6590         }
6591         break;
6592     case OPJ_PROFILE_CINEMA_4K:
6593         if (parameters->numresolution < 2) {
6594             opj_event_msg(p_manager, EVT_WARNING,
6595                           "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6596                           "Number of decomposition levels >= 1 && <= 6\n"
6597                           "-> Number of decomposition levels forced to 1 (rather than %d)\n",
6598                           parameters->numresolution + 1);
6599             parameters->numresolution = 1;
6600         } else if (parameters->numresolution > 7) {
6601             opj_event_msg(p_manager, EVT_WARNING,
6602                           "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6603                           "Number of decomposition levels >= 1 && <= 6\n"
6604                           "-> Number of decomposition levels forced to 6 (rather than %d)\n",
6605                           parameters->numresolution + 1);
6606             parameters->numresolution = 7;
6607         }
6608         break;
6609     default :
6610         break;
6611     }
6612
6613     /* Precincts */
6614     parameters->csty |= 0x01;
6615     if (parameters->numresolution == 1) {
6616         parameters->res_spec = 1;
6617         parameters->prcw_init[0] = 128;
6618         parameters->prch_init[0] = 128;
6619     } else {
6620         parameters->res_spec = parameters->numresolution - 1;
6621         for (i = 0; i < parameters->res_spec; i++) {
6622             parameters->prcw_init[i] = 256;
6623             parameters->prch_init[i] = 256;
6624         }
6625     }
6626
6627     /* The progression order shall be CPRL */
6628     parameters->prog_order = OPJ_CPRL;
6629
6630     /* Progression order changes for 4K, disallowed for 2K */
6631     if (parameters->rsiz == OPJ_PROFILE_CINEMA_4K) {
6632         parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,
6633                               parameters->numresolution);
6634     } else {
6635         parameters->numpocs = 0;
6636     }
6637
6638     /* Limited bit-rate */
6639     parameters->cp_disto_alloc = 1;
6640     if (parameters->max_cs_size <= 0) {
6641         /* No rate has been introduced, 24 fps is assumed */
6642         parameters->max_cs_size = OPJ_CINEMA_24_CS;
6643         opj_event_msg(p_manager, EVT_WARNING,
6644                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6645                       "Maximum 1302083 compressed bytes @ 24fps\n"
6646                       "As no rate has been given, this limit will be used.\n");
6647     } else if (parameters->max_cs_size > OPJ_CINEMA_24_CS) {
6648         opj_event_msg(p_manager, EVT_WARNING,
6649                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6650                       "Maximum 1302083 compressed bytes @ 24fps\n"
6651                       "-> Specified rate exceeds this limit. Rate will be forced to 1302083 bytes.\n");
6652         parameters->max_cs_size = OPJ_CINEMA_24_CS;
6653     }
6654
6655     if (parameters->max_comp_size <= 0) {
6656         /* No rate has been introduced, 24 fps is assumed */
6657         parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6658         opj_event_msg(p_manager, EVT_WARNING,
6659                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6660                       "Maximum 1041666 compressed bytes @ 24fps\n"
6661                       "As no rate has been given, this limit will be used.\n");
6662     } else if (parameters->max_comp_size > OPJ_CINEMA_24_COMP) {
6663         opj_event_msg(p_manager, EVT_WARNING,
6664                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6665                       "Maximum 1041666 compressed bytes @ 24fps\n"
6666                       "-> Specified rate exceeds this limit. Rate will be forced to 1041666 bytes.\n");
6667         parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6668     }
6669
6670     parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
6671                                image->comps[0].h * image->comps[0].prec) /
6672                                (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
6673                                        image->comps[0].dy);
6674
6675 }
6676
6677 static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
6678         opj_event_mgr_t *p_manager)
6679 {
6680     OPJ_UINT32 i;
6681
6682     /* Number of components */
6683     if (image->numcomps != 3) {
6684         opj_event_msg(p_manager, EVT_WARNING,
6685                       "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6686                       "3 components"
6687                       "-> Number of components of input image (%d) is not compliant\n"
6688                       "-> Non-profile-3 codestream will be generated\n",
6689                       image->numcomps);
6690         return OPJ_FALSE;
6691     }
6692
6693     /* Bitdepth */
6694     for (i = 0; i < image->numcomps; i++) {
6695         if ((image->comps[i].bpp != 12) | (image->comps[i].sgnd)) {
6696             char signed_str[] = "signed";
6697             char unsigned_str[] = "unsigned";
6698             char *tmp_str = image->comps[i].sgnd ? signed_str : unsigned_str;
6699             opj_event_msg(p_manager, EVT_WARNING,
6700                           "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6701                           "Precision of each component shall be 12 bits unsigned"
6702                           "-> At least component %d of input image (%d bits, %s) is not compliant\n"
6703                           "-> Non-profile-3 codestream will be generated\n",
6704                           i, image->comps[i].bpp, tmp_str);
6705             return OPJ_FALSE;
6706         }
6707     }
6708
6709     /* Image size */
6710     switch (rsiz) {
6711     case OPJ_PROFILE_CINEMA_2K:
6712         if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))) {
6713             opj_event_msg(p_manager, EVT_WARNING,
6714                           "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6715                           "width <= 2048 and height <= 1080\n"
6716                           "-> Input image size %d x %d is not compliant\n"
6717                           "-> Non-profile-3 codestream will be generated\n",
6718                           image->comps[0].w, image->comps[0].h);
6719             return OPJ_FALSE;
6720         }
6721         break;
6722     case OPJ_PROFILE_CINEMA_4K:
6723         if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))) {
6724             opj_event_msg(p_manager, EVT_WARNING,
6725                           "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6726                           "width <= 4096 and height <= 2160\n"
6727                           "-> Image size %d x %d is not compliant\n"
6728                           "-> Non-profile-4 codestream will be generated\n",
6729                           image->comps[0].w, image->comps[0].h);
6730             return OPJ_FALSE;
6731         }
6732         break;
6733     default :
6734         break;
6735     }
6736
6737     return OPJ_TRUE;
6738 }
6739
6740 OPJ_BOOL opj_j2k_setup_encoder(opj_j2k_t *p_j2k,
6741                                opj_cparameters_t *parameters,
6742                                opj_image_t *image,
6743                                opj_event_mgr_t * p_manager)
6744 {
6745     OPJ_UINT32 i, j, tileno, numpocs_tile;
6746     opj_cp_t *cp = 00;
6747     OPJ_UINT32 cblkw, cblkh;
6748
6749     if (!p_j2k || !parameters || ! image) {
6750         return OPJ_FALSE;
6751     }
6752
6753     if ((parameters->numresolution <= 0) ||
6754             (parameters->numresolution > OPJ_J2K_MAXRLVLS)) {
6755         opj_event_msg(p_manager, EVT_ERROR,
6756                       "Invalid number of resolutions : %d not in range [1,%d]\n",
6757                       parameters->numresolution, OPJ_J2K_MAXRLVLS);
6758         return OPJ_FALSE;
6759     }
6760
6761     if (parameters->cblockw_init < 4 || parameters->cblockw_init > 1024) {
6762         opj_event_msg(p_manager, EVT_ERROR,
6763                       "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
6764                       parameters->cblockw_init);
6765         return OPJ_FALSE;
6766     }
6767     if (parameters->cblockh_init < 4 || parameters->cblockh_init > 1024) {
6768         opj_event_msg(p_manager, EVT_ERROR,
6769                       "Invalid value for cblockh_init: %d not a power of 2 not in range [4,1024]\n",
6770                       parameters->cblockh_init);
6771         return OPJ_FALSE;
6772     }
6773     if (parameters->cblockw_init * parameters->cblockh_init > 4096) {
6774         opj_event_msg(p_manager, EVT_ERROR,
6775                       "Invalid value for cblockw_init * cblockh_init: should be <= 4096\n");
6776         return OPJ_FALSE;
6777     }
6778     cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
6779     cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
6780     if (parameters->cblockw_init != (1 << cblkw)) {
6781         opj_event_msg(p_manager, EVT_ERROR,
6782                       "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
6783                       parameters->cblockw_init);
6784         return OPJ_FALSE;
6785     }
6786     if (parameters->cblockh_init != (1 << cblkh)) {
6787         opj_event_msg(p_manager, EVT_ERROR,
6788                       "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
6789                       parameters->cblockh_init);
6790         return OPJ_FALSE;
6791     }
6792
6793     /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
6794     cp = &(p_j2k->m_cp);
6795
6796     /* set default values for cp */
6797     cp->tw = 1;
6798     cp->th = 1;
6799
6800     /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */
6801     if (parameters->rsiz ==
6802             OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */
6803         OPJ_BOOL deprecated_used = OPJ_FALSE;
6804         switch (parameters->cp_cinema) {
6805         case OPJ_CINEMA2K_24:
6806             parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
6807             parameters->max_cs_size = OPJ_CINEMA_24_CS;
6808             parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6809             deprecated_used = OPJ_TRUE;
6810             break;
6811         case OPJ_CINEMA2K_48:
6812             parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
6813             parameters->max_cs_size = OPJ_CINEMA_48_CS;
6814             parameters->max_comp_size = OPJ_CINEMA_48_COMP;
6815             deprecated_used = OPJ_TRUE;
6816             break;
6817         case OPJ_CINEMA4K_24:
6818             parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
6819             parameters->max_cs_size = OPJ_CINEMA_24_CS;
6820             parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6821             deprecated_used = OPJ_TRUE;
6822             break;
6823         case OPJ_OFF:
6824         default:
6825             break;
6826         }
6827         switch (parameters->cp_rsiz) {
6828         case OPJ_CINEMA2K:
6829             parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
6830             deprecated_used = OPJ_TRUE;
6831             break;
6832         case OPJ_CINEMA4K:
6833             parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
6834             deprecated_used = OPJ_TRUE;
6835             break;
6836         case OPJ_MCT:
6837             parameters->rsiz = OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT;
6838             deprecated_used = OPJ_TRUE;
6839         case OPJ_STD_RSIZ:
6840         default:
6841             break;
6842         }
6843         if (deprecated_used) {
6844             opj_event_msg(p_manager, EVT_WARNING,
6845                           "Deprecated fields cp_cinema or cp_rsiz are used\n"
6846                           "Please consider using only the rsiz field\n"
6847                           "See openjpeg.h documentation for more details\n");
6848         }
6849     }
6850
6851     /* If no explicit layers are provided, use lossless settings */
6852     if (parameters->tcp_numlayers == 0) {
6853         parameters->tcp_numlayers = 1;
6854         parameters->cp_disto_alloc = 1;
6855         parameters->tcp_rates[0] = 0;
6856     }
6857
6858     if (parameters->cp_disto_alloc) {
6859         /* Emit warnings if tcp_rates are not decreasing */
6860         for (i = 1; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
6861             OPJ_FLOAT32 rate_i_corr = parameters->tcp_rates[i];
6862             OPJ_FLOAT32 rate_i_m_1_corr = parameters->tcp_rates[i - 1];
6863             if (rate_i_corr <= 1.0) {
6864                 rate_i_corr = 1.0;
6865             }
6866             if (rate_i_m_1_corr <= 1.0) {
6867                 rate_i_m_1_corr = 1.0;
6868             }
6869             if (rate_i_corr >= rate_i_m_1_corr) {
6870                 if (rate_i_corr != parameters->tcp_rates[i] &&
6871                         rate_i_m_1_corr != parameters->tcp_rates[i - 1]) {
6872                     opj_event_msg(p_manager, EVT_WARNING,
6873                                   "tcp_rates[%d]=%f (corrected as %f) should be strictly lesser "
6874                                   "than tcp_rates[%d]=%f (corrected as %f)\n",
6875                                   i, parameters->tcp_rates[i], rate_i_corr,
6876                                   i - 1, parameters->tcp_rates[i - 1], rate_i_m_1_corr);
6877                 } else if (rate_i_corr != parameters->tcp_rates[i]) {
6878                     opj_event_msg(p_manager, EVT_WARNING,
6879                                   "tcp_rates[%d]=%f (corrected as %f) should be strictly lesser "
6880                                   "than tcp_rates[%d]=%f\n",
6881                                   i, parameters->tcp_rates[i], rate_i_corr,
6882                                   i - 1, parameters->tcp_rates[i - 1]);
6883                 } else if (rate_i_m_1_corr != parameters->tcp_rates[i - 1]) {
6884                     opj_event_msg(p_manager, EVT_WARNING,
6885                                   "tcp_rates[%d]=%f should be strictly lesser "
6886                                   "than tcp_rates[%d]=%f (corrected as %f)\n",
6887                                   i, parameters->tcp_rates[i],
6888                                   i - 1, parameters->tcp_rates[i - 1], rate_i_m_1_corr);
6889                 } else {
6890                     opj_event_msg(p_manager, EVT_WARNING,
6891                                   "tcp_rates[%d]=%f should be strictly lesser "
6892                                   "than tcp_rates[%d]=%f\n",
6893                                   i, parameters->tcp_rates[i],
6894                                   i - 1, parameters->tcp_rates[i - 1]);
6895                 }
6896             }
6897         }
6898     } else if (parameters->cp_fixed_quality) {
6899         /* Emit warnings if tcp_distoratio are not increasing */
6900         for (i = 1; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
6901             if (parameters->tcp_distoratio[i] < parameters->tcp_distoratio[i - 1] &&
6902                     !(i == (OPJ_UINT32)parameters->tcp_numlayers - 1 &&
6903                       parameters->tcp_distoratio[i] == 0)) {
6904                 opj_event_msg(p_manager, EVT_WARNING,
6905                               "tcp_distoratio[%d]=%f should be strictly greater "
6906                               "than tcp_distoratio[%d]=%f\n",
6907                               i, parameters->tcp_distoratio[i], i - 1,
6908                               parameters->tcp_distoratio[i - 1]);
6909             }
6910         }
6911     }
6912
6913     /* see if max_codestream_size does limit input rate */
6914     if (parameters->max_cs_size <= 0) {
6915         if (parameters->tcp_rates[parameters->tcp_numlayers - 1] > 0) {
6916             OPJ_FLOAT32 temp_size;
6917             temp_size = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
6918                                        image->comps[0].h * image->comps[0].prec) /
6919                                       ((double)parameters->tcp_rates[parameters->tcp_numlayers - 1] * 8 *
6920                                        image->comps[0].dx * image->comps[0].dy));
6921             if (temp_size > INT_MAX) {
6922                 parameters->max_cs_size = INT_MAX;
6923             } else {
6924                 parameters->max_cs_size = (int) floor(temp_size);
6925             }
6926         } else {
6927             parameters->max_cs_size = 0;
6928         }
6929     } else {
6930         OPJ_FLOAT32 temp_rate;
6931         OPJ_BOOL cap = OPJ_FALSE;
6932         temp_rate = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
6933                                    image->comps[0].h * image->comps[0].prec) /
6934                                   (((double)parameters->max_cs_size) * 8 * image->comps[0].dx *
6935                                    image->comps[0].dy));
6936         for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
6937             if (parameters->tcp_rates[i] < temp_rate) {
6938                 parameters->tcp_rates[i] = temp_rate;
6939                 cap = OPJ_TRUE;
6940             }
6941         }
6942         if (cap) {
6943             opj_event_msg(p_manager, EVT_WARNING,
6944                           "The desired maximum codestream size has limited\n"
6945                           "at least one of the desired quality layers\n");
6946         }
6947     }
6948
6949     /* Manage profiles and applications and set RSIZ */
6950     /* set cinema parameters if required */
6951     if (OPJ_IS_CINEMA(parameters->rsiz)) {
6952         if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K)
6953                 || (parameters->rsiz == OPJ_PROFILE_CINEMA_S4K)) {
6954             opj_event_msg(p_manager, EVT_WARNING,
6955                           "JPEG 2000 Scalable Digital Cinema profiles not yet supported\n");
6956             parameters->rsiz = OPJ_PROFILE_NONE;
6957         } else {
6958             opj_j2k_set_cinema_parameters(parameters, image, p_manager);
6959             if (!opj_j2k_is_cinema_compliant(image, parameters->rsiz, p_manager)) {
6960                 parameters->rsiz = OPJ_PROFILE_NONE;
6961             }
6962         }
6963     } else if (OPJ_IS_STORAGE(parameters->rsiz)) {
6964         opj_event_msg(p_manager, EVT_WARNING,
6965                       "JPEG 2000 Long Term Storage profile not yet supported\n");
6966         parameters->rsiz = OPJ_PROFILE_NONE;
6967     } else if (OPJ_IS_BROADCAST(parameters->rsiz)) {
6968         opj_event_msg(p_manager, EVT_WARNING,
6969                       "JPEG 2000 Broadcast profiles not yet supported\n");
6970         parameters->rsiz = OPJ_PROFILE_NONE;
6971     } else if (OPJ_IS_IMF(parameters->rsiz)) {
6972         opj_event_msg(p_manager, EVT_WARNING,
6973                       "JPEG 2000 IMF profiles not yet supported\n");
6974         parameters->rsiz = OPJ_PROFILE_NONE;
6975     } else if (OPJ_IS_PART2(parameters->rsiz)) {
6976         if (parameters->rsiz == ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_NONE))) {
6977             opj_event_msg(p_manager, EVT_WARNING,
6978                           "JPEG 2000 Part-2 profile defined\n"
6979                           "but no Part-2 extension enabled.\n"
6980                           "Profile set to NONE.\n");
6981             parameters->rsiz = OPJ_PROFILE_NONE;
6982         } else if (parameters->rsiz != ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT))) {
6983             opj_event_msg(p_manager, EVT_WARNING,
6984                           "Unsupported Part-2 extension enabled\n"
6985                           "Profile set to NONE.\n");
6986             parameters->rsiz = OPJ_PROFILE_NONE;
6987         }
6988     }
6989
6990     /*
6991     copy user encoding parameters
6992     */
6993     cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)
6994             parameters->max_comp_size;
6995     cp->rsiz = parameters->rsiz;
6996     cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)
6997             parameters->cp_disto_alloc & 1u;
6998     cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)
6999             parameters->cp_fixed_alloc & 1u;
7000     cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)
7001             parameters->cp_fixed_quality & 1u;
7002
7003     /* mod fixed_quality */
7004     if (parameters->cp_fixed_alloc && parameters->cp_matrice) {
7005         size_t array_size = (size_t)parameters->tcp_numlayers *
7006                             (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
7007         cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
7008         if (!cp->m_specific_param.m_enc.m_matrice) {
7009             opj_event_msg(p_manager, EVT_ERROR,
7010                           "Not enough memory to allocate copy of user encoding parameters matrix \n");
7011             return OPJ_FALSE;
7012         }
7013         memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice,
7014                array_size);
7015     }
7016
7017     /* tiles */
7018     cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
7019     cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
7020
7021     /* tile offset */
7022     cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
7023     cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
7024
7025     /* comment string */
7026     if (parameters->cp_comment) {
7027         cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1U);
7028         if (!cp->comment) {
7029             opj_event_msg(p_manager, EVT_ERROR,
7030                           "Not enough memory to allocate copy of comment string\n");
7031             return OPJ_FALSE;
7032         }
7033         strcpy(cp->comment, parameters->cp_comment);
7034     } else {
7035         /* Create default comment for codestream */
7036         const char comment[] = "Created by OpenJPEG version ";
7037         const size_t clen = strlen(comment);
7038         const char *version = opj_version();
7039
7040         /* UniPG>> */
7041 #ifdef USE_JPWL
7042         cp->comment = (char*)opj_malloc(clen + strlen(version) + 11);
7043         if (!cp->comment) {
7044             opj_event_msg(p_manager, EVT_ERROR,
7045                           "Not enough memory to allocate comment string\n");
7046             return OPJ_FALSE;
7047         }
7048         sprintf(cp->comment, "%s%s with JPWL", comment, version);
7049 #else
7050         cp->comment = (char*)opj_malloc(clen + strlen(version) + 1);
7051         if (!cp->comment) {
7052             opj_event_msg(p_manager, EVT_ERROR,
7053                           "Not enough memory to allocate comment string\n");
7054             return OPJ_FALSE;
7055         }
7056         sprintf(cp->comment, "%s%s", comment, version);
7057 #endif
7058         /* <<UniPG */
7059     }
7060
7061     /*
7062     calculate other encoding parameters
7063     */
7064
7065     if (parameters->tile_size_on) {
7066         cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->x1 - cp->tx0),
7067                                              (OPJ_INT32)cp->tdx);
7068         cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->y1 - cp->ty0),
7069                                              (OPJ_INT32)cp->tdy);
7070     } else {
7071         cp->tdx = image->x1 - cp->tx0;
7072         cp->tdy = image->y1 - cp->ty0;
7073     }
7074
7075     if (parameters->tp_on) {
7076         cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
7077         cp->m_specific_param.m_enc.m_tp_on = 1;
7078     }
7079
7080 #ifdef USE_JPWL
7081     /*
7082     calculate JPWL encoding parameters
7083     */
7084
7085     if (parameters->jpwl_epc_on) {
7086         OPJ_INT32 i;
7087
7088         /* set JPWL on */
7089         cp->epc_on = OPJ_TRUE;
7090         cp->info_on = OPJ_FALSE; /* no informative technique */
7091
7092         /* set EPB on */
7093         if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
7094             cp->epb_on = OPJ_TRUE;
7095
7096             cp->hprot_MH = parameters->jpwl_hprot_MH;
7097             for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
7098                 cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
7099                 cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
7100             }
7101             /* if tile specs are not specified, copy MH specs */
7102             if (cp->hprot_TPH[0] == -1) {
7103                 cp->hprot_TPH_tileno[0] = 0;
7104                 cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
7105             }
7106             for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
7107                 cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
7108                 cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
7109                 cp->pprot[i] = parameters->jpwl_pprot[i];
7110             }
7111         }
7112
7113         /* set ESD writing */
7114         if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
7115             cp->esd_on = OPJ_TRUE;
7116
7117             cp->sens_size = parameters->jpwl_sens_size;
7118             cp->sens_addr = parameters->jpwl_sens_addr;
7119             cp->sens_range = parameters->jpwl_sens_range;
7120
7121             cp->sens_MH = parameters->jpwl_sens_MH;
7122             for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
7123                 cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
7124                 cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
7125             }
7126         }
7127
7128         /* always set RED writing to false: we are at the encoder */
7129         cp->red_on = OPJ_FALSE;
7130
7131     } else {
7132         cp->epc_on = OPJ_FALSE;
7133     }
7134 #endif /* USE_JPWL */
7135
7136     /* initialize the mutiple tiles */
7137     /* ---------------------------- */
7138     cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
7139     if (!cp->tcps) {
7140         opj_event_msg(p_manager, EVT_ERROR,
7141                       "Not enough memory to allocate tile coding parameters\n");
7142         return OPJ_FALSE;
7143     }
7144
7145     for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
7146         opj_tcp_t *tcp = &cp->tcps[tileno];
7147         tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
7148
7149         for (j = 0; j < tcp->numlayers; j++) {
7150             if (OPJ_IS_CINEMA(cp->rsiz)) {
7151                 if (cp->m_specific_param.m_enc.m_fixed_quality) {
7152                     tcp->distoratio[j] = parameters->tcp_distoratio[j];
7153                 }
7154                 tcp->rates[j] = parameters->tcp_rates[j];
7155             } else {
7156                 if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* add fixed_quality */
7157                     tcp->distoratio[j] = parameters->tcp_distoratio[j];
7158                 } else {
7159                     tcp->rates[j] = parameters->tcp_rates[j];
7160                 }
7161             }
7162             if (!cp->m_specific_param.m_enc.m_fixed_quality &&
7163                     tcp->rates[j] <= 1.0) {
7164                 tcp->rates[j] = 0.0;    /* force lossless */
7165             }
7166         }
7167
7168         tcp->csty = (OPJ_UINT32)parameters->csty;
7169         tcp->prg = parameters->prog_order;
7170         tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
7171
7172         numpocs_tile = 0;
7173         tcp->POC = 0;
7174
7175         if (parameters->numpocs) {
7176             /* initialisation of POC */
7177             for (i = 0; i < parameters->numpocs; i++) {
7178                 if (tileno + 1 == parameters->POC[i].tile)  {
7179                     opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
7180
7181                     tcp_poc->resno0         = parameters->POC[numpocs_tile].resno0;
7182                     tcp_poc->compno0        = parameters->POC[numpocs_tile].compno0;
7183                     tcp_poc->layno1         = parameters->POC[numpocs_tile].layno1;
7184                     tcp_poc->resno1         = parameters->POC[numpocs_tile].resno1;
7185                     tcp_poc->compno1        = parameters->POC[numpocs_tile].compno1;
7186                     tcp_poc->prg1           = parameters->POC[numpocs_tile].prg1;
7187                     tcp_poc->tile           = parameters->POC[numpocs_tile].tile;
7188
7189                     numpocs_tile++;
7190                 }
7191             }
7192
7193             if (numpocs_tile) {
7194
7195                 /* TODO MSD use the return value*/
7196                 opj_j2k_check_poc_val(parameters->POC, tileno, parameters->numpocs,
7197                                       (OPJ_UINT32)parameters->numresolution, image->numcomps,
7198                                       (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
7199
7200                 tcp->POC = 1;
7201                 tcp->numpocs = numpocs_tile - 1 ;
7202             }
7203         } else {
7204             tcp->numpocs = 0;
7205         }
7206
7207         tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
7208         if (!tcp->tccps) {
7209             opj_event_msg(p_manager, EVT_ERROR,
7210                           "Not enough memory to allocate tile component coding parameters\n");
7211             return OPJ_FALSE;
7212         }
7213         if (parameters->mct_data) {
7214
7215             OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(
7216                                       OPJ_FLOAT32);
7217             OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
7218             OPJ_INT32 * l_dc_shift = (OPJ_INT32 *)((OPJ_BYTE *) parameters->mct_data +
7219                                                    lMctSize);
7220
7221             if (!lTmpBuf) {
7222                 opj_event_msg(p_manager, EVT_ERROR,
7223                               "Not enough memory to allocate temp buffer\n");
7224                 return OPJ_FALSE;
7225             }
7226
7227             tcp->mct = 2;
7228             tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
7229             if (! tcp->m_mct_coding_matrix) {
7230                 opj_free(lTmpBuf);
7231                 lTmpBuf = NULL;
7232                 opj_event_msg(p_manager, EVT_ERROR,
7233                               "Not enough memory to allocate encoder MCT coding matrix \n");
7234                 return OPJ_FALSE;
7235             }
7236             memcpy(tcp->m_mct_coding_matrix, parameters->mct_data, lMctSize);
7237             memcpy(lTmpBuf, parameters->mct_data, lMctSize);
7238
7239             tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
7240             if (! tcp->m_mct_decoding_matrix) {
7241                 opj_free(lTmpBuf);
7242                 lTmpBuf = NULL;
7243                 opj_event_msg(p_manager, EVT_ERROR,
7244                               "Not enough memory to allocate encoder MCT decoding matrix \n");
7245                 return OPJ_FALSE;
7246             }
7247             if (opj_matrix_inversion_f(lTmpBuf, (tcp->m_mct_decoding_matrix),
7248                                        image->numcomps) == OPJ_FALSE) {
7249                 opj_free(lTmpBuf);
7250                 lTmpBuf = NULL;
7251                 opj_event_msg(p_manager, EVT_ERROR,
7252                               "Failed to inverse encoder MCT decoding matrix \n");
7253                 return OPJ_FALSE;
7254             }
7255
7256             tcp->mct_norms = (OPJ_FLOAT64*)
7257                              opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
7258             if (! tcp->mct_norms) {
7259                 opj_free(lTmpBuf);
7260                 lTmpBuf = NULL;
7261                 opj_event_msg(p_manager, EVT_ERROR,
7262                               "Not enough memory to allocate encoder MCT norms \n");
7263                 return OPJ_FALSE;
7264             }
7265             opj_calculate_norms(tcp->mct_norms, image->numcomps,
7266                                 tcp->m_mct_decoding_matrix);
7267             opj_free(lTmpBuf);
7268
7269             for (i = 0; i < image->numcomps; i++) {
7270                 opj_tccp_t *tccp = &tcp->tccps[i];
7271                 tccp->m_dc_level_shift = l_dc_shift[i];
7272             }
7273
7274             if (opj_j2k_setup_mct_encoding(tcp, image) == OPJ_FALSE) {
7275                 /* free will be handled by opj_j2k_destroy */
7276                 opj_event_msg(p_manager, EVT_ERROR, "Failed to setup j2k mct encoding\n");
7277                 return OPJ_FALSE;
7278             }
7279         } else {
7280             if (tcp->mct == 1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
7281                 if ((image->comps[0].dx != image->comps[1].dx) ||
7282                         (image->comps[0].dx != image->comps[2].dx) ||
7283                         (image->comps[0].dy != image->comps[1].dy) ||
7284                         (image->comps[0].dy != image->comps[2].dy)) {
7285                     opj_event_msg(p_manager, EVT_WARNING,
7286                                   "Cannot perform MCT on components with different sizes. Disabling MCT.\n");
7287                     tcp->mct = 0;
7288                 }
7289             }
7290             for (i = 0; i < image->numcomps; i++) {
7291                 opj_tccp_t *tccp = &tcp->tccps[i];
7292                 opj_image_comp_t * l_comp = &(image->comps[i]);
7293
7294                 if (! l_comp->sgnd) {
7295                     tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
7296                 }
7297             }
7298         }
7299
7300         for (i = 0; i < image->numcomps; i++) {
7301             opj_tccp_t *tccp = &tcp->tccps[i];
7302
7303             tccp->csty = parameters->csty &
7304                          0x01;   /* 0 => one precinct || 1 => custom precinct  */
7305             tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
7306             tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
7307             tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
7308             tccp->cblksty = (OPJ_UINT32)parameters->mode;
7309             tccp->qmfbid = parameters->irreversible ? 0 : 1;
7310             tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT :
7311                            J2K_CCP_QNTSTY_NOQNT;
7312             tccp->numgbits = 2;
7313
7314             if ((OPJ_INT32)i == parameters->roi_compno) {
7315                 tccp->roishift = parameters->roi_shift;
7316             } else {
7317                 tccp->roishift = 0;
7318             }
7319
7320             if (parameters->csty & J2K_CCP_CSTY_PRT) {
7321                 OPJ_INT32 p = 0, it_res;
7322                 assert(tccp->numresolutions > 0);
7323                 for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
7324                     if (p < parameters->res_spec) {
7325
7326                         if (parameters->prcw_init[p] < 1) {
7327                             tccp->prcw[it_res] = 1;
7328                         } else {
7329                             tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
7330                         }
7331
7332                         if (parameters->prch_init[p] < 1) {
7333                             tccp->prch[it_res] = 1;
7334                         } else {
7335                             tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
7336                         }
7337
7338                     } else {
7339                         OPJ_INT32 res_spec = parameters->res_spec;
7340                         OPJ_INT32 size_prcw = 0;
7341                         OPJ_INT32 size_prch = 0;
7342
7343                         assert(res_spec > 0); /* issue 189 */
7344                         size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
7345                         size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
7346
7347
7348                         if (size_prcw < 1) {
7349                             tccp->prcw[it_res] = 1;
7350                         } else {
7351                             tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
7352                         }
7353
7354                         if (size_prch < 1) {
7355                             tccp->prch[it_res] = 1;
7356                         } else {
7357                             tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
7358                         }
7359                     }
7360                     p++;
7361                     /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
7362                 }       /*end for*/
7363             } else {
7364                 for (j = 0; j < tccp->numresolutions; j++) {
7365                     tccp->prcw[j] = 15;
7366                     tccp->prch[j] = 15;
7367                 }
7368             }
7369
7370             opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
7371         }
7372     }
7373
7374     if (parameters->mct_data) {
7375         opj_free(parameters->mct_data);
7376         parameters->mct_data = 00;
7377     }
7378     return OPJ_TRUE;
7379 }
7380
7381 static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
7382                                      OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
7383 {
7384     assert(cstr_index != 00);
7385
7386     /* expand the list? */
7387     if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
7388         opj_marker_info_t *new_marker;
7389         cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32)
7390                                               cstr_index->maxmarknum);
7391         new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker,
7392                      cstr_index->maxmarknum * sizeof(opj_marker_info_t));
7393         if (! new_marker) {
7394             opj_free(cstr_index->marker);
7395             cstr_index->marker = NULL;
7396             cstr_index->maxmarknum = 0;
7397             cstr_index->marknum = 0;
7398             /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
7399             return OPJ_FALSE;
7400         }
7401         cstr_index->marker = new_marker;
7402     }
7403
7404     /* add the marker */
7405     cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
7406     cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
7407     cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
7408     cstr_index->marknum++;
7409     return OPJ_TRUE;
7410 }
7411
7412 static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
7413                                      opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
7414                                      OPJ_UINT32 len)
7415 {
7416     assert(cstr_index != 00);
7417     assert(cstr_index->tile_index != 00);
7418
7419     /* expand the list? */
7420     if ((cstr_index->tile_index[tileno].marknum + 1) >
7421             cstr_index->tile_index[tileno].maxmarknum) {
7422         opj_marker_info_t *new_marker;
7423         cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 +
7424                 (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
7425         new_marker = (opj_marker_info_t *) opj_realloc(
7426                          cstr_index->tile_index[tileno].marker,
7427                          cstr_index->tile_index[tileno].maxmarknum * sizeof(opj_marker_info_t));
7428         if (! new_marker) {
7429             opj_free(cstr_index->tile_index[tileno].marker);
7430             cstr_index->tile_index[tileno].marker = NULL;
7431             cstr_index->tile_index[tileno].maxmarknum = 0;
7432             cstr_index->tile_index[tileno].marknum = 0;
7433             /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
7434             return OPJ_FALSE;
7435         }
7436         cstr_index->tile_index[tileno].marker = new_marker;
7437     }
7438
7439     /* add the marker */
7440     cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type
7441         = (OPJ_UINT16)type;
7442     cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos
7443         = (OPJ_INT32)pos;
7444     cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len
7445         = (OPJ_INT32)len;
7446     cstr_index->tile_index[tileno].marknum++;
7447
7448     if (type == J2K_MS_SOT) {
7449         OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
7450
7451         if (cstr_index->tile_index[tileno].tp_index) {
7452             cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
7453         }
7454
7455     }
7456     return OPJ_TRUE;
7457 }
7458
7459 /*
7460  * -----------------------------------------------------------------------
7461  * -----------------------------------------------------------------------
7462  * -----------------------------------------------------------------------
7463  */
7464
7465 OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k,
7466                                 opj_stream_private_t *p_stream,
7467                                 opj_event_mgr_t * p_manager
7468                                )
7469 {
7470     (void)p_j2k;
7471     (void)p_stream;
7472     (void)p_manager;
7473     return OPJ_TRUE;
7474 }
7475
7476 OPJ_BOOL opj_j2k_read_header(opj_stream_private_t *p_stream,
7477                              opj_j2k_t* p_j2k,
7478                              opj_image_t** p_image,
7479                              opj_event_mgr_t* p_manager)
7480 {
7481     /* preconditions */
7482     assert(p_j2k != 00);
7483     assert(p_stream != 00);
7484     assert(p_manager != 00);
7485
7486     /* create an empty image header */
7487     p_j2k->m_private_image = opj_image_create0();
7488     if (! p_j2k->m_private_image) {
7489         return OPJ_FALSE;
7490     }
7491
7492     /* customization of the validation */
7493     if (! opj_j2k_setup_decoding_validation(p_j2k, p_manager)) {
7494         opj_image_destroy(p_j2k->m_private_image);
7495         p_j2k->m_private_image = NULL;
7496         return OPJ_FALSE;
7497     }
7498
7499     /* validation of the parameters codec */
7500     if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
7501         opj_image_destroy(p_j2k->m_private_image);
7502         p_j2k->m_private_image = NULL;
7503         return OPJ_FALSE;
7504     }
7505
7506     /* customization of the encoding */
7507     if (! opj_j2k_setup_header_reading(p_j2k, p_manager)) {
7508         opj_image_destroy(p_j2k->m_private_image);
7509         p_j2k->m_private_image = NULL;
7510         return OPJ_FALSE;
7511     }
7512
7513     /* read header */
7514     if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
7515         opj_image_destroy(p_j2k->m_private_image);
7516         p_j2k->m_private_image = NULL;
7517         return OPJ_FALSE;
7518     }
7519
7520     *p_image = opj_image_create0();
7521     if (!(*p_image)) {
7522         return OPJ_FALSE;
7523     }
7524
7525     /* Copy codestream image information to the output image */
7526     opj_copy_image_header(p_j2k->m_private_image, *p_image);
7527
7528     /*Allocate and initialize some elements of codestrem index*/
7529     if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
7530         return OPJ_FALSE;
7531     }
7532
7533     return OPJ_TRUE;
7534 }
7535
7536 static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
7537         opj_event_mgr_t * p_manager)
7538 {
7539     /* preconditions*/
7540     assert(p_j2k != 00);
7541     assert(p_manager != 00);
7542
7543     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
7544                                            (opj_procedure)opj_j2k_read_header_procedure, p_manager)) {
7545         return OPJ_FALSE;
7546     }
7547
7548     /* DEVELOPER CORNER, add your custom procedures */
7549     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
7550                                            (opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager))  {
7551         return OPJ_FALSE;
7552     }
7553
7554     return OPJ_TRUE;
7555 }
7556
7557 static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
7558         opj_event_mgr_t * p_manager)
7559 {
7560     /* preconditions*/
7561     assert(p_j2k != 00);
7562     assert(p_manager != 00);
7563
7564     if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
7565                                            (opj_procedure)opj_j2k_build_decoder, p_manager)) {
7566         return OPJ_FALSE;
7567     }
7568     if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
7569                                            (opj_procedure)opj_j2k_decoding_validation, p_manager)) {
7570         return OPJ_FALSE;
7571     }
7572
7573     /* DEVELOPER CORNER, add your custom validation procedure */
7574     return OPJ_TRUE;
7575 }
7576
7577 static OPJ_BOOL opj_j2k_mct_validation(opj_j2k_t * p_j2k,
7578                                        opj_stream_private_t *p_stream,
7579                                        opj_event_mgr_t * p_manager)
7580 {
7581     OPJ_BOOL l_is_valid = OPJ_TRUE;
7582     OPJ_UINT32 i, j;
7583
7584     /* preconditions */
7585     assert(p_j2k != 00);
7586     assert(p_stream != 00);
7587     assert(p_manager != 00);
7588
7589     OPJ_UNUSED(p_stream);
7590     OPJ_UNUSED(p_manager);
7591
7592     if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
7593         OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
7594         opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
7595
7596         for (i = 0; i < l_nb_tiles; ++i) {
7597             if (l_tcp->mct == 2) {
7598                 opj_tccp_t * l_tccp = l_tcp->tccps;
7599                 l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
7600
7601                 for (j = 0; j < p_j2k->m_private_image->numcomps; ++j) {
7602                     l_is_valid &= !(l_tccp->qmfbid & 1);
7603                     ++l_tccp;
7604                 }
7605             }
7606             ++l_tcp;
7607         }
7608     }
7609
7610     return l_is_valid;
7611 }
7612
7613 OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)
7614 {
7615     OPJ_UINT32 i;
7616     OPJ_UINT32 l_indix = 1;
7617     opj_mct_data_t * l_mct_deco_data = 00, * l_mct_offset_data = 00;
7618     opj_simple_mcc_decorrelation_data_t * l_mcc_data;
7619     OPJ_UINT32 l_mct_size, l_nb_elem;
7620     OPJ_FLOAT32 * l_data, * l_current_data;
7621     opj_tccp_t * l_tccp;
7622
7623     /* preconditions */
7624     assert(p_tcp != 00);
7625
7626     if (p_tcp->mct != 2) {
7627         return OPJ_TRUE;
7628     }
7629
7630     if (p_tcp->m_mct_decoding_matrix) {
7631         if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
7632             opj_mct_data_t *new_mct_records;
7633             p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
7634
7635             new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
7636                               p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
7637             if (! new_mct_records) {
7638                 opj_free(p_tcp->m_mct_records);
7639                 p_tcp->m_mct_records = NULL;
7640                 p_tcp->m_nb_max_mct_records = 0;
7641                 p_tcp->m_nb_mct_records = 0;
7642                 /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
7643                 return OPJ_FALSE;
7644             }
7645             p_tcp->m_mct_records = new_mct_records;
7646             l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
7647
7648             memset(l_mct_deco_data, 0,
7649                    (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
7650                        opj_mct_data_t));
7651         }
7652         l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
7653
7654         if (l_mct_deco_data->m_data) {
7655             opj_free(l_mct_deco_data->m_data);
7656             l_mct_deco_data->m_data = 00;
7657         }
7658
7659         l_mct_deco_data->m_index = l_indix++;
7660         l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
7661         l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
7662         l_nb_elem = p_image->numcomps * p_image->numcomps;
7663         l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
7664         l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
7665
7666         if (! l_mct_deco_data->m_data) {
7667             return OPJ_FALSE;
7668         }
7669
7670         j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](
7671             p_tcp->m_mct_decoding_matrix, l_mct_deco_data->m_data, l_nb_elem);
7672
7673         l_mct_deco_data->m_data_size = l_mct_size;
7674         ++p_tcp->m_nb_mct_records;
7675     }
7676
7677     if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
7678         opj_mct_data_t *new_mct_records;
7679         p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
7680         new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
7681                           p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
7682         if (! new_mct_records) {
7683             opj_free(p_tcp->m_mct_records);
7684             p_tcp->m_mct_records = NULL;
7685             p_tcp->m_nb_max_mct_records = 0;
7686             p_tcp->m_nb_mct_records = 0;
7687             /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
7688             return OPJ_FALSE;
7689         }
7690         p_tcp->m_mct_records = new_mct_records;
7691         l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
7692
7693         memset(l_mct_offset_data, 0,
7694                (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
7695                    opj_mct_data_t));
7696
7697         if (l_mct_deco_data) {
7698             l_mct_deco_data = l_mct_offset_data - 1;
7699         }
7700     }
7701
7702     l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
7703
7704     if (l_mct_offset_data->m_data) {
7705         opj_free(l_mct_offset_data->m_data);
7706         l_mct_offset_data->m_data = 00;
7707     }
7708
7709     l_mct_offset_data->m_index = l_indix++;
7710     l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
7711     l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
7712     l_nb_elem = p_image->numcomps;
7713     l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
7714     l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
7715
7716     if (! l_mct_offset_data->m_data) {
7717         return OPJ_FALSE;
7718     }
7719
7720     l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
7721     if (! l_data) {
7722         opj_free(l_mct_offset_data->m_data);
7723         l_mct_offset_data->m_data = 00;
7724         return OPJ_FALSE;
7725     }
7726
7727     l_tccp = p_tcp->tccps;
7728     l_current_data = l_data;
7729
7730     for (i = 0; i < l_nb_elem; ++i) {
7731         *(l_current_data++) = (OPJ_FLOAT32)(l_tccp->m_dc_level_shift);
7732         ++l_tccp;
7733     }
7734
7735     j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,
7736             l_mct_offset_data->m_data, l_nb_elem);
7737
7738     opj_free(l_data);
7739
7740     l_mct_offset_data->m_data_size = l_mct_size;
7741
7742     ++p_tcp->m_nb_mct_records;
7743
7744     if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
7745         opj_simple_mcc_decorrelation_data_t *new_mcc_records;
7746         p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
7747         new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
7748                               p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(
7749                                   opj_simple_mcc_decorrelation_data_t));
7750         if (! new_mcc_records) {
7751             opj_free(p_tcp->m_mcc_records);
7752             p_tcp->m_mcc_records = NULL;
7753             p_tcp->m_nb_max_mcc_records = 0;
7754             p_tcp->m_nb_mcc_records = 0;
7755             /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
7756             return OPJ_FALSE;
7757         }
7758         p_tcp->m_mcc_records = new_mcc_records;
7759         l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
7760         memset(l_mcc_data, 0, (p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) *
7761                sizeof(opj_simple_mcc_decorrelation_data_t));
7762
7763     }
7764
7765     l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
7766     l_mcc_data->m_decorrelation_array = l_mct_deco_data;
7767     l_mcc_data->m_is_irreversible = 1;
7768     l_mcc_data->m_nb_comps = p_image->numcomps;
7769     l_mcc_data->m_index = l_indix++;
7770     l_mcc_data->m_offset_array = l_mct_offset_data;
7771     ++p_tcp->m_nb_mcc_records;
7772
7773     return OPJ_TRUE;
7774 }
7775
7776 static OPJ_BOOL opj_j2k_build_decoder(opj_j2k_t * p_j2k,
7777                                       opj_stream_private_t *p_stream,
7778                                       opj_event_mgr_t * p_manager)
7779 {
7780     /* add here initialization of cp
7781        copy paste of setup_decoder */
7782     (void)p_j2k;
7783     (void)p_stream;
7784     (void)p_manager;
7785     return OPJ_TRUE;
7786 }
7787
7788 static OPJ_BOOL opj_j2k_build_encoder(opj_j2k_t * p_j2k,
7789                                       opj_stream_private_t *p_stream,
7790                                       opj_event_mgr_t * p_manager)
7791 {
7792     /* add here initialization of cp
7793        copy paste of setup_encoder */
7794     (void)p_j2k;
7795     (void)p_stream;
7796     (void)p_manager;
7797     return OPJ_TRUE;
7798 }
7799
7800 static OPJ_BOOL opj_j2k_encoding_validation(opj_j2k_t * p_j2k,
7801         opj_stream_private_t *p_stream,
7802         opj_event_mgr_t * p_manager)
7803 {
7804     OPJ_BOOL l_is_valid = OPJ_TRUE;
7805
7806     /* preconditions */
7807     assert(p_j2k != 00);
7808     assert(p_stream != 00);
7809     assert(p_manager != 00);
7810
7811     OPJ_UNUSED(p_stream);
7812
7813     /* STATE checking */
7814     /* make sure the state is at 0 */
7815     l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
7816
7817     /* POINTER validation */
7818     /* make sure a p_j2k codec is present */
7819     l_is_valid &= (p_j2k->m_procedure_list != 00);
7820     /* make sure a validation list is present */
7821     l_is_valid &= (p_j2k->m_validation_list != 00);
7822
7823     /* ISO 15444-1:2004 states between 1 & 33 (0 -> 32) */
7824     /* 33 (32) would always fail the check below (if a cast to 64bits was done) */
7825     /* FIXME Shall we change OPJ_J2K_MAXRLVLS to 32 ? */
7826     if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) ||
7827             (p_j2k->m_cp.tcps->tccps->numresolutions > 32)) {
7828         opj_event_msg(p_manager, EVT_ERROR,
7829                       "Number of resolutions is too high in comparison to the size of tiles\n");
7830         return OPJ_FALSE;
7831     }
7832
7833     if ((p_j2k->m_cp.tdx) < (OPJ_UINT32)(1 <<
7834                                          (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
7835         opj_event_msg(p_manager, EVT_ERROR,
7836                       "Number of resolutions is too high in comparison to the size of tiles\n");
7837         return OPJ_FALSE;
7838     }
7839
7840     if ((p_j2k->m_cp.tdy) < (OPJ_UINT32)(1 <<
7841                                          (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
7842         opj_event_msg(p_manager, EVT_ERROR,
7843                       "Number of resolutions is too high in comparison to the size of tiles\n");
7844         return OPJ_FALSE;
7845     }
7846
7847     /* PARAMETER VALIDATION */
7848     return l_is_valid;
7849 }
7850
7851 static OPJ_BOOL opj_j2k_decoding_validation(opj_j2k_t *p_j2k,
7852         opj_stream_private_t *p_stream,
7853         opj_event_mgr_t * p_manager
7854                                            )
7855 {
7856     OPJ_BOOL l_is_valid = OPJ_TRUE;
7857
7858     /* preconditions*/
7859     assert(p_j2k != 00);
7860     assert(p_stream != 00);
7861     assert(p_manager != 00);
7862
7863     OPJ_UNUSED(p_stream);
7864     OPJ_UNUSED(p_manager);
7865
7866     /* STATE checking */
7867     /* make sure the state is at 0 */
7868 #ifdef TODO_MSD
7869     l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
7870 #endif
7871     l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
7872
7873     /* POINTER validation */
7874     /* make sure a p_j2k codec is present */
7875     /* make sure a procedure list is present */
7876     l_is_valid &= (p_j2k->m_procedure_list != 00);
7877     /* make sure a validation list is present */
7878     l_is_valid &= (p_j2k->m_validation_list != 00);
7879
7880     /* PARAMETER VALIDATION */
7881     return l_is_valid;
7882 }
7883
7884 static OPJ_BOOL opj_j2k_read_header_procedure(opj_j2k_t *p_j2k,
7885         opj_stream_private_t *p_stream,
7886         opj_event_mgr_t * p_manager)
7887 {
7888     OPJ_UINT32 l_current_marker;
7889     OPJ_UINT32 l_marker_size;
7890     const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
7891     OPJ_BOOL l_has_siz = 0;
7892     OPJ_BOOL l_has_cod = 0;
7893     OPJ_BOOL l_has_qcd = 0;
7894
7895     /* preconditions */
7896     assert(p_stream != 00);
7897     assert(p_j2k != 00);
7898     assert(p_manager != 00);
7899
7900     /*  We enter in the main header */
7901     p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
7902
7903     /* Try to read the SOC marker, the codestream must begin with SOC marker */
7904     if (! opj_j2k_read_soc(p_j2k, p_stream, p_manager)) {
7905         opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
7906         return OPJ_FALSE;
7907     }
7908
7909     /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
7910     if (opj_stream_read_data(p_stream,
7911                              p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
7912         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7913         return OPJ_FALSE;
7914     }
7915
7916     /* Read 2 bytes as the new marker ID */
7917     opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
7918                    &l_current_marker, 2);
7919
7920     /* Try to read until the SOT is detected */
7921     while (l_current_marker != J2K_MS_SOT) {
7922
7923         /* Check if the current marker ID is valid */
7924         if (l_current_marker < 0xff00) {
7925             opj_event_msg(p_manager, EVT_ERROR,
7926                           "A marker ID was expected (0xff--) instead of %.8x\n", l_current_marker);
7927             return OPJ_FALSE;
7928         }
7929
7930         /* Get the marker handler from the marker ID */
7931         l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
7932
7933         /* Manage case where marker is unknown */
7934         if (l_marker_handler->id == J2K_MS_UNK) {
7935             if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)) {
7936                 opj_event_msg(p_manager, EVT_ERROR,
7937                               "Unknow marker have been detected and generated error.\n");
7938                 return OPJ_FALSE;
7939             }
7940
7941             if (l_current_marker == J2K_MS_SOT) {
7942                 break;    /* SOT marker is detected main header is completely read */
7943             } else { /* Get the marker handler from the marker ID */
7944                 l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
7945             }
7946         }
7947
7948         if (l_marker_handler->id == J2K_MS_SIZ) {
7949             /* Mark required SIZ marker as found */
7950             l_has_siz = 1;
7951         }
7952         if (l_marker_handler->id == J2K_MS_COD) {
7953             /* Mark required COD marker as found */
7954             l_has_cod = 1;
7955         }
7956         if (l_marker_handler->id == J2K_MS_QCD) {
7957             /* Mark required QCD marker as found */
7958             l_has_qcd = 1;
7959         }
7960
7961         /* Check if the marker is known and if it is the right place to find it */
7962         if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
7963             opj_event_msg(p_manager, EVT_ERROR,
7964                           "Marker is not compliant with its position\n");
7965             return OPJ_FALSE;
7966         }
7967
7968         /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
7969         if (opj_stream_read_data(p_stream,
7970                                  p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
7971             opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7972             return OPJ_FALSE;
7973         }
7974
7975         /* read 2 bytes as the marker size */
7976         opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
7977                        2);
7978         if (l_marker_size < 2) {
7979             opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
7980             return OPJ_FALSE;
7981         }
7982         l_marker_size -= 2; /* Subtract the size of the marker ID already read */
7983
7984         /* Check if the marker size is compatible with the header data size */
7985         if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
7986             OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(
7987                                             p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
7988             if (! new_header_data) {
7989                 opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
7990                 p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
7991                 p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
7992                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
7993                 return OPJ_FALSE;
7994             }
7995             p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
7996             p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
7997         }
7998
7999         /* Try to read the rest of the marker segment from stream and copy them into the buffer */
8000         if (opj_stream_read_data(p_stream,
8001                                  p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
8002                                  p_manager) != l_marker_size) {
8003             opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8004             return OPJ_FALSE;
8005         }
8006
8007         /* Read the marker segment with the correct marker handler */
8008         if (!(*(l_marker_handler->handler))(p_j2k,
8009                                             p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
8010             opj_event_msg(p_manager, EVT_ERROR,
8011                           "Marker handler function failed to read the marker segment\n");
8012             return OPJ_FALSE;
8013         }
8014
8015         /* Add the marker to the codestream index*/
8016         if (OPJ_FALSE == opj_j2k_add_mhmarker(
8017                     p_j2k->cstr_index,
8018                     l_marker_handler->id,
8019                     (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
8020                     l_marker_size + 4)) {
8021             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
8022             return OPJ_FALSE;
8023         }
8024
8025         /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
8026         if (opj_stream_read_data(p_stream,
8027                                  p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
8028             opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8029             return OPJ_FALSE;
8030         }
8031
8032         /* read 2 bytes as the new marker ID */
8033         opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
8034                        &l_current_marker, 2);
8035     }
8036
8037     if (l_has_siz == 0) {
8038         opj_event_msg(p_manager, EVT_ERROR,
8039                       "required SIZ marker not found in main header\n");
8040         return OPJ_FALSE;
8041     }
8042     if (l_has_cod == 0) {
8043         opj_event_msg(p_manager, EVT_ERROR,
8044                       "required COD marker not found in main header\n");
8045         return OPJ_FALSE;
8046     }
8047     if (l_has_qcd == 0) {
8048         opj_event_msg(p_manager, EVT_ERROR,
8049                       "required QCD marker not found in main header\n");
8050         return OPJ_FALSE;
8051     }
8052
8053     if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) {
8054         opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n");
8055         return OPJ_FALSE;
8056     }
8057
8058     opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
8059
8060     /* Position of the last element if the main header */
8061     p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
8062
8063     /* Next step: read a tile-part header */
8064     p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
8065
8066     return OPJ_TRUE;
8067 }
8068
8069 static OPJ_BOOL opj_j2k_exec(opj_j2k_t * p_j2k,
8070                              opj_procedure_list_t * p_procedure_list,
8071                              opj_stream_private_t *p_stream,
8072                              opj_event_mgr_t * p_manager)
8073 {
8074     OPJ_BOOL(** l_procedure)(opj_j2k_t *, opj_stream_private_t *,
8075                              opj_event_mgr_t *) = 00;
8076     OPJ_BOOL l_result = OPJ_TRUE;
8077     OPJ_UINT32 l_nb_proc, i;
8078
8079     /* preconditions*/
8080     assert(p_procedure_list != 00);
8081     assert(p_j2k != 00);
8082     assert(p_stream != 00);
8083     assert(p_manager != 00);
8084
8085     l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
8086     l_procedure = (OPJ_BOOL(**)(opj_j2k_t *, opj_stream_private_t *,
8087                                 opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
8088
8089     for (i = 0; i < l_nb_proc; ++i) {
8090         l_result = l_result && ((*l_procedure)(p_j2k, p_stream, p_manager));
8091         ++l_procedure;
8092     }
8093
8094     /* and clear the procedure list at the end.*/
8095     opj_procedure_list_clear(p_procedure_list);
8096     return l_result;
8097 }
8098
8099 /* FIXME DOC*/
8100 static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,
8101         opj_stream_private_t *p_stream,
8102         opj_event_mgr_t * p_manager
8103                                                        )
8104 {
8105     opj_tcp_t * l_tcp = 00;
8106     opj_tcp_t * l_default_tcp = 00;
8107     OPJ_UINT32 l_nb_tiles;
8108     OPJ_UINT32 i, j;
8109     opj_tccp_t *l_current_tccp = 00;
8110     OPJ_UINT32 l_tccp_size;
8111     OPJ_UINT32 l_mct_size;
8112     opj_image_t * l_image;
8113     OPJ_UINT32 l_mcc_records_size, l_mct_records_size;
8114     opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
8115     opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
8116     OPJ_UINT32 l_offset;
8117
8118     /* preconditions */
8119     assert(p_j2k != 00);
8120     assert(p_stream != 00);
8121     assert(p_manager != 00);
8122
8123     OPJ_UNUSED(p_stream);
8124
8125     l_image = p_j2k->m_private_image;
8126     l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
8127     l_tcp = p_j2k->m_cp.tcps;
8128     l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
8129     l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
8130     l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(
8131                      OPJ_FLOAT32);
8132
8133     /* For each tile */
8134     for (i = 0; i < l_nb_tiles; ++i) {
8135         /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
8136         l_current_tccp = l_tcp->tccps;
8137         /*Copy default coding parameters into the current tile coding parameters*/
8138         memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
8139         /* Initialize some values of the current tile coding parameters*/
8140         l_tcp->cod = 0;
8141         l_tcp->ppt = 0;
8142         l_tcp->ppt_data = 00;
8143         l_tcp->m_current_tile_part_number = -1;
8144         /* Remove memory not owned by this tile in case of early error return. */
8145         l_tcp->m_mct_decoding_matrix = 00;
8146         l_tcp->m_nb_max_mct_records = 0;
8147         l_tcp->m_mct_records = 00;
8148         l_tcp->m_nb_max_mcc_records = 0;
8149         l_tcp->m_mcc_records = 00;
8150         /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
8151         l_tcp->tccps = l_current_tccp;
8152
8153         /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
8154         if (l_default_tcp->m_mct_decoding_matrix) {
8155             l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
8156             if (! l_tcp->m_mct_decoding_matrix) {
8157                 return OPJ_FALSE;
8158             }
8159             memcpy(l_tcp->m_mct_decoding_matrix, l_default_tcp->m_mct_decoding_matrix,
8160                    l_mct_size);
8161         }
8162
8163         /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
8164         l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(
8165                                  opj_mct_data_t);
8166         l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
8167         if (! l_tcp->m_mct_records) {
8168             return OPJ_FALSE;
8169         }
8170         memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records, l_mct_records_size);
8171
8172         /* Copy the mct record data from dflt_tile_cp to the current tile*/
8173         l_src_mct_rec = l_default_tcp->m_mct_records;
8174         l_dest_mct_rec = l_tcp->m_mct_records;
8175
8176         for (j = 0; j < l_default_tcp->m_nb_mct_records; ++j) {
8177
8178             if (l_src_mct_rec->m_data) {
8179
8180                 l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
8181                 if (! l_dest_mct_rec->m_data) {
8182                     return OPJ_FALSE;
8183                 }
8184                 memcpy(l_dest_mct_rec->m_data, l_src_mct_rec->m_data,
8185                        l_src_mct_rec->m_data_size);
8186             }
8187
8188             ++l_src_mct_rec;
8189             ++l_dest_mct_rec;
8190             /* Update with each pass to free exactly what has been allocated on early return. */
8191             l_tcp->m_nb_max_mct_records += 1;
8192         }
8193
8194         /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
8195         l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(
8196                                  opj_simple_mcc_decorrelation_data_t);
8197         l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(
8198                                    l_mcc_records_size);
8199         if (! l_tcp->m_mcc_records) {
8200             return OPJ_FALSE;
8201         }
8202         memcpy(l_tcp->m_mcc_records, l_default_tcp->m_mcc_records, l_mcc_records_size);
8203         l_tcp->m_nb_max_mcc_records = l_default_tcp->m_nb_max_mcc_records;
8204
8205         /* Copy the mcc record data from dflt_tile_cp to the current tile*/
8206         l_src_mcc_rec = l_default_tcp->m_mcc_records;
8207         l_dest_mcc_rec = l_tcp->m_mcc_records;
8208
8209         for (j = 0; j < l_default_tcp->m_nb_max_mcc_records; ++j) {
8210
8211             if (l_src_mcc_rec->m_decorrelation_array) {
8212                 l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array -
8213                                         l_default_tcp->m_mct_records);
8214                 l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
8215             }
8216
8217             if (l_src_mcc_rec->m_offset_array) {
8218                 l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array -
8219                                         l_default_tcp->m_mct_records);
8220                 l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
8221             }
8222
8223             ++l_src_mcc_rec;
8224             ++l_dest_mcc_rec;
8225         }
8226
8227         /* Copy all the dflt_tile_compo_cp to the current tile cp */
8228         memcpy(l_current_tccp, l_default_tcp->tccps, l_tccp_size);
8229
8230         /* Move to next tile cp*/
8231         ++l_tcp;
8232     }
8233
8234     /* Create the current tile decoder*/
8235     p_j2k->m_tcd = opj_tcd_create(OPJ_TRUE);
8236     if (! p_j2k->m_tcd) {
8237         return OPJ_FALSE;
8238     }
8239
8240     if (!opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp), p_j2k->m_tp)) {
8241         opj_tcd_destroy(p_j2k->m_tcd);
8242         p_j2k->m_tcd = 00;
8243         opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
8244         return OPJ_FALSE;
8245     }
8246
8247     return OPJ_TRUE;
8248 }
8249
8250 static const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler(
8251     OPJ_UINT32 p_id)
8252 {
8253     const opj_dec_memory_marker_handler_t *e;
8254     for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
8255         if (e->id == p_id) {
8256             break; /* we find a handler corresponding to the marker ID*/
8257         }
8258     }
8259     return e;
8260 }
8261
8262 void opj_j2k_destroy(opj_j2k_t *p_j2k)
8263 {
8264     if (p_j2k == 00) {
8265         return;
8266     }
8267
8268     if (p_j2k->m_is_decoder) {
8269
8270         if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
8271             opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
8272             opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
8273             p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
8274         }
8275
8276         if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
8277             opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
8278             p_j2k->m_specific_param.m_decoder.m_header_data = 00;
8279             p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
8280         }
8281
8282         opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
8283         p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = 00;
8284         p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
8285
8286     } else {
8287
8288         if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
8289             opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
8290             p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
8291         }
8292
8293         if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
8294             opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
8295             p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
8296             p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
8297         }
8298
8299         if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
8300             opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
8301             p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
8302             p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
8303         }
8304     }
8305
8306     opj_tcd_destroy(p_j2k->m_tcd);
8307
8308     opj_j2k_cp_destroy(&(p_j2k->m_cp));
8309     memset(&(p_j2k->m_cp), 0, sizeof(opj_cp_t));
8310
8311     opj_procedure_list_destroy(p_j2k->m_procedure_list);
8312     p_j2k->m_procedure_list = 00;
8313
8314     opj_procedure_list_destroy(p_j2k->m_validation_list);
8315     p_j2k->m_procedure_list = 00;
8316
8317     j2k_destroy_cstr_index(p_j2k->cstr_index);
8318     p_j2k->cstr_index = NULL;
8319
8320     opj_image_destroy(p_j2k->m_private_image);
8321     p_j2k->m_private_image = NULL;
8322
8323     opj_image_destroy(p_j2k->m_output_image);
8324     p_j2k->m_output_image = NULL;
8325
8326     opj_thread_pool_destroy(p_j2k->m_tp);
8327     p_j2k->m_tp = NULL;
8328
8329     opj_free(p_j2k);
8330 }
8331
8332 void j2k_destroy_cstr_index(opj_codestream_index_t *p_cstr_ind)
8333 {
8334     if (p_cstr_ind) {
8335
8336         if (p_cstr_ind->marker) {
8337             opj_free(p_cstr_ind->marker);
8338             p_cstr_ind->marker = NULL;
8339         }
8340
8341         if (p_cstr_ind->tile_index) {
8342             OPJ_UINT32 it_tile = 0;
8343
8344             for (it_tile = 0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
8345
8346                 if (p_cstr_ind->tile_index[it_tile].packet_index) {
8347                     opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
8348                     p_cstr_ind->tile_index[it_tile].packet_index = NULL;
8349                 }
8350
8351                 if (p_cstr_ind->tile_index[it_tile].tp_index) {
8352                     opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
8353                     p_cstr_ind->tile_index[it_tile].tp_index = NULL;
8354                 }
8355
8356                 if (p_cstr_ind->tile_index[it_tile].marker) {
8357                     opj_free(p_cstr_ind->tile_index[it_tile].marker);
8358                     p_cstr_ind->tile_index[it_tile].marker = NULL;
8359
8360                 }
8361             }
8362
8363             opj_free(p_cstr_ind->tile_index);
8364             p_cstr_ind->tile_index = NULL;
8365         }
8366
8367         opj_free(p_cstr_ind);
8368     }
8369 }
8370
8371 static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp)
8372 {
8373     if (p_tcp == 00) {
8374         return;
8375     }
8376
8377     if (p_tcp->ppt_markers != 00) {
8378         OPJ_UINT32 i;
8379         for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
8380             if (p_tcp->ppt_markers[i].m_data != NULL) {
8381                 opj_free(p_tcp->ppt_markers[i].m_data);
8382             }
8383         }
8384         p_tcp->ppt_markers_count = 0U;
8385         opj_free(p_tcp->ppt_markers);
8386         p_tcp->ppt_markers = NULL;
8387     }
8388
8389     if (p_tcp->ppt_buffer != 00) {
8390         opj_free(p_tcp->ppt_buffer);
8391         p_tcp->ppt_buffer = 00;
8392     }
8393
8394     if (p_tcp->tccps != 00) {
8395         opj_free(p_tcp->tccps);
8396         p_tcp->tccps = 00;
8397     }
8398
8399     if (p_tcp->m_mct_coding_matrix != 00) {
8400         opj_free(p_tcp->m_mct_coding_matrix);
8401         p_tcp->m_mct_coding_matrix = 00;
8402     }
8403
8404     if (p_tcp->m_mct_decoding_matrix != 00) {
8405         opj_free(p_tcp->m_mct_decoding_matrix);
8406         p_tcp->m_mct_decoding_matrix = 00;
8407     }
8408
8409     if (p_tcp->m_mcc_records) {
8410         opj_free(p_tcp->m_mcc_records);
8411         p_tcp->m_mcc_records = 00;
8412         p_tcp->m_nb_max_mcc_records = 0;
8413         p_tcp->m_nb_mcc_records = 0;
8414     }
8415
8416     if (p_tcp->m_mct_records) {
8417         opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
8418         OPJ_UINT32 i;
8419
8420         for (i = 0; i < p_tcp->m_nb_mct_records; ++i) {
8421             if (l_mct_data->m_data) {
8422                 opj_free(l_mct_data->m_data);
8423                 l_mct_data->m_data = 00;
8424             }
8425
8426             ++l_mct_data;
8427         }
8428
8429         opj_free(p_tcp->m_mct_records);
8430         p_tcp->m_mct_records = 00;
8431     }
8432
8433     if (p_tcp->mct_norms != 00) {
8434         opj_free(p_tcp->mct_norms);
8435         p_tcp->mct_norms = 00;
8436     }
8437
8438     opj_j2k_tcp_data_destroy(p_tcp);
8439
8440 }
8441
8442 static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp)
8443 {
8444     if (p_tcp->m_data) {
8445         opj_free(p_tcp->m_data);
8446         p_tcp->m_data = NULL;
8447         p_tcp->m_data_size = 0;
8448     }
8449 }
8450
8451 static void opj_j2k_cp_destroy(opj_cp_t *p_cp)
8452 {
8453     OPJ_UINT32 l_nb_tiles;
8454     opj_tcp_t * l_current_tile = 00;
8455
8456     if (p_cp == 00) {
8457         return;
8458     }
8459     if (p_cp->tcps != 00) {
8460         OPJ_UINT32 i;
8461         l_current_tile = p_cp->tcps;
8462         l_nb_tiles = p_cp->th * p_cp->tw;
8463
8464         for (i = 0U; i < l_nb_tiles; ++i) {
8465             opj_j2k_tcp_destroy(l_current_tile);
8466             ++l_current_tile;
8467         }
8468         opj_free(p_cp->tcps);
8469         p_cp->tcps = 00;
8470     }
8471     if (p_cp->ppm_markers != 00) {
8472         OPJ_UINT32 i;
8473         for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
8474             if (p_cp->ppm_markers[i].m_data != NULL) {
8475                 opj_free(p_cp->ppm_markers[i].m_data);
8476             }
8477         }
8478         p_cp->ppm_markers_count = 0U;
8479         opj_free(p_cp->ppm_markers);
8480         p_cp->ppm_markers = NULL;
8481     }
8482     opj_free(p_cp->ppm_buffer);
8483     p_cp->ppm_buffer = 00;
8484     p_cp->ppm_data =
8485         NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
8486     opj_free(p_cp->comment);
8487     p_cp->comment = 00;
8488     if (! p_cp->m_is_decoder) {
8489         opj_free(p_cp->m_specific_param.m_enc.m_matrice);
8490         p_cp->m_specific_param.m_enc.m_matrice = 00;
8491     }
8492 }
8493
8494 static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t
8495         *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
8496         opj_event_mgr_t * p_manager)
8497 {
8498     OPJ_BYTE   l_header_data[10];
8499     OPJ_OFF_T  l_stream_pos_backup;
8500     OPJ_UINT32 l_current_marker;
8501     OPJ_UINT32 l_marker_size;
8502     OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts;
8503
8504     /* initialize to no correction needed */
8505     *p_correction_needed = OPJ_FALSE;
8506
8507     if (!opj_stream_has_seek(p_stream)) {
8508         /* We can't do much in this case, seek is needed */
8509         return OPJ_TRUE;
8510     }
8511
8512     l_stream_pos_backup = opj_stream_tell(p_stream);
8513     if (l_stream_pos_backup == -1) {
8514         /* let's do nothing */
8515         return OPJ_TRUE;
8516     }
8517
8518     for (;;) {
8519         /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
8520         if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
8521             /* assume all is OK */
8522             if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
8523                 return OPJ_FALSE;
8524             }
8525             return OPJ_TRUE;
8526         }
8527
8528         /* Read 2 bytes from buffer as the new marker ID */
8529         opj_read_bytes(l_header_data, &l_current_marker, 2);
8530
8531         if (l_current_marker != J2K_MS_SOT) {
8532             /* assume all is OK */
8533             if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
8534                 return OPJ_FALSE;
8535             }
8536             return OPJ_TRUE;
8537         }
8538
8539         /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
8540         if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
8541             opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8542             return OPJ_FALSE;
8543         }
8544
8545         /* Read 2 bytes from the buffer as the marker size */
8546         opj_read_bytes(l_header_data, &l_marker_size, 2);
8547
8548         /* Check marker size for SOT Marker */
8549         if (l_marker_size != 10) {
8550             opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
8551             return OPJ_FALSE;
8552         }
8553         l_marker_size -= 2;
8554
8555         if (opj_stream_read_data(p_stream, l_header_data, l_marker_size,
8556                                  p_manager) != l_marker_size) {
8557             opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8558             return OPJ_FALSE;
8559         }
8560
8561         if (! opj_j2k_get_sot_values(l_header_data, l_marker_size, &l_tile_no,
8562                                      &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
8563             return OPJ_FALSE;
8564         }
8565
8566         if (l_tile_no == tile_no) {
8567             /* we found what we were looking for */
8568             break;
8569         }
8570
8571         if (l_tot_len < 14U) {
8572             /* last SOT until EOC or invalid Psot value */
8573             /* assume all is OK */
8574             if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
8575                 return OPJ_FALSE;
8576             }
8577             return OPJ_TRUE;
8578         }
8579         l_tot_len -= 12U;
8580         /* look for next SOT marker */
8581         if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len),
8582                             p_manager) != (OPJ_OFF_T)(l_tot_len)) {
8583             /* assume all is OK */
8584             if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
8585                 return OPJ_FALSE;
8586             }
8587             return OPJ_TRUE;
8588         }
8589     }
8590
8591     /* check for correction */
8592     if (l_current_part == l_num_parts) {
8593         *p_correction_needed = OPJ_TRUE;
8594     }
8595
8596     if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
8597         return OPJ_FALSE;
8598     }
8599     return OPJ_TRUE;
8600 }
8601
8602 OPJ_BOOL opj_j2k_read_tile_header(opj_j2k_t * p_j2k,
8603                                   OPJ_UINT32 * p_tile_index,
8604                                   OPJ_UINT32 * p_data_size,
8605                                   OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
8606                                   OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
8607                                   OPJ_UINT32 * p_nb_comps,
8608                                   OPJ_BOOL * p_go_on,
8609                                   opj_stream_private_t *p_stream,
8610                                   opj_event_mgr_t * p_manager)
8611 {
8612     OPJ_UINT32 l_current_marker = J2K_MS_SOT;
8613     OPJ_UINT32 l_marker_size;
8614     const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
8615     opj_tcp_t * l_tcp = NULL;
8616
8617     /* preconditions */
8618     assert(p_stream != 00);
8619     assert(p_j2k != 00);
8620     assert(p_manager != 00);
8621
8622     /* Reach the End Of Codestream ?*/
8623     if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
8624         l_current_marker = J2K_MS_EOC;
8625     }
8626     /* We need to encounter a SOT marker (a new tile-part header) */
8627     else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
8628         return OPJ_FALSE;
8629     }
8630
8631     /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
8632     while ((!p_j2k->m_specific_param.m_decoder.m_can_decode) &&
8633             (l_current_marker != J2K_MS_EOC)) {
8634
8635         /* Try to read until the Start Of Data is detected */
8636         while (l_current_marker != J2K_MS_SOD) {
8637
8638             if (opj_stream_get_number_byte_left(p_stream) == 0) {
8639                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
8640                 break;
8641             }
8642
8643             /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
8644             if (opj_stream_read_data(p_stream,
8645                                      p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
8646                 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8647                 return OPJ_FALSE;
8648             }
8649
8650             /* Read 2 bytes from the buffer as the marker size */
8651             opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
8652                            2);
8653
8654             /* Check marker size (does not include marker ID but includes marker size) */
8655             if (l_marker_size < 2) {
8656                 opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
8657                 return OPJ_FALSE;
8658             }
8659
8660             /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
8661             if (l_current_marker == 0x8080 &&
8662                     opj_stream_get_number_byte_left(p_stream) == 0) {
8663                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
8664                 break;
8665             }
8666
8667             /* Why this condition? FIXME */
8668             if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH) {
8669                 p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
8670             }
8671             l_marker_size -= 2; /* Subtract the size of the marker ID already read */
8672
8673             /* Get the marker handler from the marker ID */
8674             l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
8675
8676             /* Check if the marker is known and if it is the right place to find it */
8677             if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
8678                 opj_event_msg(p_manager, EVT_ERROR,
8679                               "Marker is not compliant with its position\n");
8680                 return OPJ_FALSE;
8681             }
8682             /* FIXME manage case of unknown marker as in the main header ? */
8683
8684             /* Check if the marker size is compatible with the header data size */
8685             if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
8686                 OPJ_BYTE *new_header_data = NULL;
8687                 /* If we are here, this means we consider this marker as known & we will read it */
8688                 /* Check enough bytes left in stream before allocation */
8689                 if ((OPJ_OFF_T)l_marker_size >  opj_stream_get_number_byte_left(p_stream)) {
8690                     opj_event_msg(p_manager, EVT_ERROR,
8691                                   "Marker size inconsistent with stream length\n");
8692                     return OPJ_FALSE;
8693                 }
8694                 new_header_data = (OPJ_BYTE *) opj_realloc(
8695                                       p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
8696                 if (! new_header_data) {
8697                     opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
8698                     p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
8699                     p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
8700                     opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
8701                     return OPJ_FALSE;
8702                 }
8703                 p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
8704                 p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
8705             }
8706
8707             /* Try to read the rest of the marker segment from stream and copy them into the buffer */
8708             if (opj_stream_read_data(p_stream,
8709                                      p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
8710                                      p_manager) != l_marker_size) {
8711                 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8712                 return OPJ_FALSE;
8713             }
8714
8715             if (!l_marker_handler->handler) {
8716                 /* See issue #175 */
8717                 opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
8718                 return OPJ_FALSE;
8719             }
8720             /* Read the marker segment with the correct marker handler */
8721             if (!(*(l_marker_handler->handler))(p_j2k,
8722                                                 p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
8723                 opj_event_msg(p_manager, EVT_ERROR,
8724                               "Fail to read the current marker segment (%#x)\n", l_current_marker);
8725                 return OPJ_FALSE;
8726             }
8727
8728             /* Add the marker to the codestream index*/
8729             if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
8730                                                   p_j2k->cstr_index,
8731                                                   l_marker_handler->id,
8732                                                   (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
8733                                                   l_marker_size + 4)) {
8734                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
8735                 return OPJ_FALSE;
8736             }
8737
8738             /* Keep the position of the last SOT marker read */
8739             if (l_marker_handler->id == J2K_MS_SOT) {
8740                 OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4
8741                                      ;
8742                 if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos) {
8743                     p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
8744                 }
8745             }
8746
8747             if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
8748                 /* Skip the rest of the tile part header*/
8749                 if (opj_stream_skip(p_stream, p_j2k->m_specific_param.m_decoder.m_sot_length,
8750                                     p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
8751                     opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8752                     return OPJ_FALSE;
8753                 }
8754                 l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
8755             } else {
8756                 /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
8757                 if (opj_stream_read_data(p_stream,
8758                                          p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
8759                     opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8760                     return OPJ_FALSE;
8761                 }
8762                 /* Read 2 bytes from the buffer as the new marker ID */
8763                 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
8764                                &l_current_marker, 2);
8765             }
8766         }
8767         if (opj_stream_get_number_byte_left(p_stream) == 0
8768                 && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
8769             break;
8770         }
8771
8772         /* If we didn't skip data before, we need to read the SOD marker*/
8773         if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
8774             /* Try to read the SOD marker and skip data ? FIXME */
8775             if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
8776                 return OPJ_FALSE;
8777             }
8778             if (p_j2k->m_specific_param.m_decoder.m_can_decode &&
8779                     !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) {
8780                 /* Issue 254 */
8781                 OPJ_BOOL l_correction_needed;
8782
8783                 p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
8784                 if (!opj_j2k_need_nb_tile_parts_correction(p_stream,
8785                         p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
8786                     opj_event_msg(p_manager, EVT_ERROR,
8787                                   "opj_j2k_apply_nb_tile_parts_correction error\n");
8788                     return OPJ_FALSE;
8789                 }
8790                 if (l_correction_needed) {
8791                     OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
8792                     OPJ_UINT32 l_tile_no;
8793
8794                     p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
8795                     p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1;
8796                     /* correct tiles */
8797                     for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
8798                         if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) {
8799                             p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts += 1;
8800                         }
8801                     }
8802                     opj_event_msg(p_manager, EVT_WARNING,
8803                                   "Non conformant codestream TPsot==TNsot.\n");
8804                 }
8805             }
8806             if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
8807                 /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
8808                 if (opj_stream_read_data(p_stream,
8809                                          p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
8810                     opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8811                     return OPJ_FALSE;
8812                 }
8813
8814                 /* Read 2 bytes from buffer as the new marker ID */
8815                 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
8816                                &l_current_marker, 2);
8817             }
8818         } else {
8819             /* Indicate we will try to read a new tile-part header*/
8820             p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
8821             p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
8822             p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
8823
8824             /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
8825             if (opj_stream_read_data(p_stream,
8826                                      p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
8827                 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8828                 return OPJ_FALSE;
8829             }
8830
8831             /* Read 2 bytes from buffer as the new marker ID */
8832             opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
8833                            &l_current_marker, 2);
8834         }
8835     }
8836
8837     /* Current marker is the EOC marker ?*/
8838     if (l_current_marker == J2K_MS_EOC) {
8839         if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
8840             p_j2k->m_current_tile_number = 0;
8841             p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
8842         }
8843     }
8844
8845     /* FIXME DOC ???*/
8846     if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
8847         OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
8848         l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
8849
8850         while ((p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00)) {
8851             ++p_j2k->m_current_tile_number;
8852             ++l_tcp;
8853         }
8854
8855         if (p_j2k->m_current_tile_number == l_nb_tiles) {
8856             *p_go_on = OPJ_FALSE;
8857             return OPJ_TRUE;
8858         }
8859     }
8860
8861     if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number,
8862                             p_manager)) {
8863         opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n");
8864         return OPJ_FALSE;
8865     }
8866     /*FIXME ???*/
8867     if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
8868                                    p_manager)) {
8869         opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
8870         return OPJ_FALSE;
8871     }
8872
8873     opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
8874                   p_j2k->m_current_tile_number + 1, (p_j2k->m_cp.th * p_j2k->m_cp.tw));
8875
8876     *p_tile_index = p_j2k->m_current_tile_number;
8877     *p_go_on = OPJ_TRUE;
8878     if (p_data_size) {
8879         /* For internal use in j2k.c, we don't need this */
8880         /* This is just needed for folks using the opj_read_tile_header() / opj_decode_tile_data() combo */
8881         *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd, OPJ_FALSE);
8882         if (*p_data_size == UINT_MAX) {
8883             return OPJ_FALSE;
8884         }
8885     }
8886     *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
8887     *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
8888     *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
8889     *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
8890     *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
8891
8892     p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
8893
8894     return OPJ_TRUE;
8895 }
8896
8897 OPJ_BOOL opj_j2k_decode_tile(opj_j2k_t * p_j2k,
8898                              OPJ_UINT32 p_tile_index,
8899                              OPJ_BYTE * p_data,
8900                              OPJ_UINT32 p_data_size,
8901                              opj_stream_private_t *p_stream,
8902                              opj_event_mgr_t * p_manager)
8903 {
8904     OPJ_UINT32 l_current_marker;
8905     OPJ_BYTE l_data [2];
8906     opj_tcp_t * l_tcp;
8907     opj_image_t* l_image_for_bounds;
8908
8909     /* preconditions */
8910     assert(p_stream != 00);
8911     assert(p_j2k != 00);
8912     assert(p_manager != 00);
8913
8914     if (!(p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_DATA)
8915             || (p_tile_index != p_j2k->m_current_tile_number)) {
8916         return OPJ_FALSE;
8917     }
8918
8919     l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
8920     if (! l_tcp->m_data) {
8921         opj_j2k_tcp_destroy(l_tcp);
8922         return OPJ_FALSE;
8923     }
8924
8925     /* When using the opj_read_tile_header / opj_decode_tile_data API */
8926     /* such as in test_tile_decoder, m_output_image is NULL, so fall back */
8927     /* to the full image dimension. This is a bit surprising that */
8928     /* opj_set_decode_area() is only used to determinte intersecting tiles, */
8929     /* but full tile decoding is done */
8930     l_image_for_bounds = p_j2k->m_output_image ? p_j2k->m_output_image :
8931                          p_j2k->m_private_image;
8932     if (! opj_tcd_decode_tile(p_j2k->m_tcd,
8933                               l_image_for_bounds->x0,
8934                               l_image_for_bounds->y0,
8935                               l_image_for_bounds->x1,
8936                               l_image_for_bounds->y1,
8937                               p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode,
8938                               p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
8939                               l_tcp->m_data,
8940                               l_tcp->m_data_size,
8941                               p_tile_index,
8942                               p_j2k->cstr_index, p_manager)) {
8943         opj_j2k_tcp_destroy(l_tcp);
8944         p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
8945         opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
8946         return OPJ_FALSE;
8947     }
8948
8949     /* p_data can be set to NULL when the call will take care of using */
8950     /* itself the TCD data. This is typically the case for whole single */
8951     /* tile decoding optimization. */
8952     if (p_data != NULL) {
8953         if (! opj_tcd_update_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
8954             return OPJ_FALSE;
8955         }
8956
8957         /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
8958         * we destroy just the data which will be re-read in read_tile_header*/
8959         /*opj_j2k_tcp_destroy(l_tcp);
8960         p_j2k->m_tcd->tcp = 0;*/
8961         opj_j2k_tcp_data_destroy(l_tcp);
8962     }
8963
8964     p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
8965     p_j2k->m_specific_param.m_decoder.m_state &= (~(OPJ_UINT32)J2K_STATE_DATA);
8966
8967     if (opj_stream_get_number_byte_left(p_stream) == 0
8968             && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
8969         return OPJ_TRUE;
8970     }
8971
8972     if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
8973         if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
8974             opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8975             return OPJ_FALSE;
8976         }
8977
8978         opj_read_bytes(l_data, &l_current_marker, 2);
8979
8980         if (l_current_marker == J2K_MS_EOC) {
8981             p_j2k->m_current_tile_number = 0;
8982             p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
8983         } else if (l_current_marker != J2K_MS_SOT) {
8984             if (opj_stream_get_number_byte_left(p_stream) == 0) {
8985                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
8986                 opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n");
8987                 return OPJ_TRUE;
8988             }
8989             opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
8990             return OPJ_FALSE;
8991         }
8992     }
8993
8994     return OPJ_TRUE;
8995 }
8996
8997 static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd,
8998         opj_image_t* p_output_image)
8999 {
9000     OPJ_UINT32 i, j;
9001     OPJ_UINT32 l_width_src, l_height_src;
9002     OPJ_UINT32 l_width_dest, l_height_dest;
9003     OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
9004     OPJ_SIZE_T l_start_offset_src;
9005     OPJ_UINT32 l_start_x_dest, l_start_y_dest;
9006     OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
9007     OPJ_SIZE_T l_start_offset_dest;
9008
9009     opj_image_comp_t * l_img_comp_src = 00;
9010     opj_image_comp_t * l_img_comp_dest = 00;
9011
9012     opj_tcd_tilecomp_t * l_tilec = 00;
9013     opj_image_t * l_image_src = 00;
9014     OPJ_INT32 * l_dest_ptr;
9015
9016     l_tilec = p_tcd->tcd_image->tiles->comps;
9017     l_image_src = p_tcd->image;
9018     l_img_comp_src = l_image_src->comps;
9019
9020     l_img_comp_dest = p_output_image->comps;
9021
9022     for (i = 0; i < l_image_src->numcomps;
9023             i++, ++l_img_comp_dest, ++l_img_comp_src,  ++l_tilec) {
9024         OPJ_INT32 res_x0, res_x1, res_y0, res_y1;
9025         OPJ_UINT32 src_data_stride;
9026         const OPJ_INT32* p_src_data;
9027
9028         /* Copy info from decoded comp image to output image */
9029         l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
9030
9031         if (p_tcd->whole_tile_decoding) {
9032             opj_tcd_resolution_t* l_res = l_tilec->resolutions +
9033                                           l_img_comp_src->resno_decoded;
9034             res_x0 = l_res->x0;
9035             res_y0 = l_res->y0;
9036             res_x1 = l_res->x1;
9037             res_y1 = l_res->y1;
9038             src_data_stride = (OPJ_UINT32)(
9039                                   l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x1 -
9040                                   l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x0);
9041             p_src_data = l_tilec->data;
9042         } else {
9043             opj_tcd_resolution_t* l_res = l_tilec->resolutions +
9044                                           l_img_comp_src->resno_decoded;
9045             res_x0 = (OPJ_INT32)l_res->win_x0;
9046             res_y0 = (OPJ_INT32)l_res->win_y0;
9047             res_x1 = (OPJ_INT32)l_res->win_x1;
9048             res_y1 = (OPJ_INT32)l_res->win_y1;
9049             src_data_stride = l_res->win_x1 - l_res->win_x0;
9050             p_src_data = l_tilec->data_win;
9051         }
9052
9053         if (p_src_data == NULL) {
9054             /* Happens for partial component decoding */
9055             continue;
9056         }
9057
9058         l_width_src = (OPJ_UINT32)(res_x1 - res_x0);
9059         l_height_src = (OPJ_UINT32)(res_y1 - res_y0);
9060
9061
9062         /* Current tile component size*/
9063         /*if (i == 0) {
9064         fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
9065                         res_x0, res_x1, res_y0, res_y1);
9066         }*/
9067
9068
9069         /* Border of the current output component*/
9070         l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor);
9071         l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor);
9072         l_x1_dest = l_x0_dest +
9073                     l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */
9074         l_y1_dest = l_y0_dest + l_img_comp_dest->h;
9075
9076         /*if (i == 0) {
9077         fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
9078                         l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
9079         }*/
9080
9081         /*-----*/
9082         /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
9083          * of the input buffer (decoded tile component) which will be move
9084          * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
9085          * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified
9086          * by this input area.
9087          * */
9088         assert(res_x0 >= 0);
9089         assert(res_x1 >= 0);
9090         if (l_x0_dest < (OPJ_UINT32)res_x0) {
9091             l_start_x_dest = (OPJ_UINT32)res_x0 - l_x0_dest;
9092             l_offset_x0_src = 0;
9093
9094             if (l_x1_dest >= (OPJ_UINT32)res_x1) {
9095                 l_width_dest = l_width_src;
9096                 l_offset_x1_src = 0;
9097             } else {
9098                 l_width_dest = l_x1_dest - (OPJ_UINT32)res_x0 ;
9099                 l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
9100             }
9101         } else {
9102             l_start_x_dest = 0U;
9103             l_offset_x0_src = (OPJ_INT32)l_x0_dest - res_x0;
9104
9105             if (l_x1_dest >= (OPJ_UINT32)res_x1) {
9106                 l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
9107                 l_offset_x1_src = 0;
9108             } else {
9109                 l_width_dest = l_img_comp_dest->w ;
9110                 l_offset_x1_src = res_x1 - (OPJ_INT32)l_x1_dest;
9111             }
9112         }
9113
9114         if (l_y0_dest < (OPJ_UINT32)res_y0) {
9115             l_start_y_dest = (OPJ_UINT32)res_y0 - l_y0_dest;
9116             l_offset_y0_src = 0;
9117
9118             if (l_y1_dest >= (OPJ_UINT32)res_y1) {
9119                 l_height_dest = l_height_src;
9120                 l_offset_y1_src = 0;
9121             } else {
9122                 l_height_dest = l_y1_dest - (OPJ_UINT32)res_y0 ;
9123                 l_offset_y1_src = (OPJ_INT32)(l_height_src - l_height_dest);
9124             }
9125         } else {
9126             l_start_y_dest = 0U;
9127             l_offset_y0_src = (OPJ_INT32)l_y0_dest - res_y0;
9128
9129             if (l_y1_dest >= (OPJ_UINT32)res_y1) {
9130                 l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
9131                 l_offset_y1_src = 0;
9132             } else {
9133                 l_height_dest = l_img_comp_dest->h ;
9134                 l_offset_y1_src = res_y1 - (OPJ_INT32)l_y1_dest;
9135             }
9136         }
9137
9138         if ((l_offset_x0_src < 0) || (l_offset_y0_src < 0) || (l_offset_x1_src < 0) ||
9139                 (l_offset_y1_src < 0)) {
9140             return OPJ_FALSE;
9141         }
9142         /* testcase 2977.pdf.asan.67.2198 */
9143         if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
9144             return OPJ_FALSE;
9145         }
9146         /*-----*/
9147
9148         /* Compute the input buffer offset */
9149         l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src
9150                              * (OPJ_SIZE_T)src_data_stride;
9151
9152         /* Compute the output buffer offset */
9153         l_start_offset_dest = (OPJ_SIZE_T)l_start_x_dest + (OPJ_SIZE_T)l_start_y_dest
9154                               * (OPJ_SIZE_T)l_img_comp_dest->w;
9155
9156         /* Allocate output component buffer if necessary */
9157         if (l_img_comp_dest->data == NULL &&
9158                 l_start_offset_src == 0 && l_start_offset_dest == 0 &&
9159                 src_data_stride == l_img_comp_dest->w &&
9160                 l_width_dest == l_img_comp_dest->w &&
9161                 l_height_dest == l_img_comp_dest->h) {
9162             /* If the final image matches the tile buffer, then borrow it */
9163             /* directly to save a copy */
9164             if (p_tcd->whole_tile_decoding) {
9165                 l_img_comp_dest->data = l_tilec->data;
9166                 l_tilec->data = NULL;
9167             } else {
9168                 l_img_comp_dest->data = l_tilec->data_win;
9169                 l_tilec->data_win = NULL;
9170             }
9171             continue;
9172         } else if (l_img_comp_dest->data == NULL) {
9173             OPJ_SIZE_T l_width = l_img_comp_dest->w;
9174             OPJ_SIZE_T l_height = l_img_comp_dest->h;
9175
9176             if ((l_height == 0U) || (l_width > (SIZE_MAX / l_height)) ||
9177                     l_width * l_height > SIZE_MAX / sizeof(OPJ_INT32)) {
9178                 /* would overflow */
9179                 return OPJ_FALSE;
9180             }
9181             l_img_comp_dest->data = (OPJ_INT32*) opj_image_data_alloc(l_width * l_height *
9182                                     sizeof(OPJ_INT32));
9183             if (! l_img_comp_dest->data) {
9184                 return OPJ_FALSE;
9185             }
9186
9187             if (l_img_comp_dest->w != l_width_dest ||
9188                     l_img_comp_dest->h != l_height_dest) {
9189                 memset(l_img_comp_dest->data, 0,
9190                        (OPJ_SIZE_T)l_img_comp_dest->w * l_img_comp_dest->h * sizeof(OPJ_INT32));
9191             }
9192         }
9193
9194         /* Move the output buffer to the first place where we will write*/
9195         l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
9196
9197         {
9198             const OPJ_INT32 * l_src_ptr = p_src_data;
9199             l_src_ptr += l_start_offset_src;
9200
9201             for (j = 0; j < l_height_dest; ++j) {
9202                 memcpy(l_dest_ptr, l_src_ptr, l_width_dest * sizeof(OPJ_INT32));
9203                 l_dest_ptr += l_img_comp_dest->w;
9204                 l_src_ptr += src_data_stride;
9205             }
9206         }
9207
9208
9209     }
9210
9211     return OPJ_TRUE;
9212 }
9213
9214 static OPJ_BOOL opj_j2k_update_image_dimensions(opj_image_t* p_image,
9215         opj_event_mgr_t * p_manager)
9216 {
9217     OPJ_UINT32 it_comp;
9218     OPJ_INT32 l_comp_x1, l_comp_y1;
9219     opj_image_comp_t* l_img_comp = NULL;
9220
9221     l_img_comp = p_image->comps;
9222     for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
9223         OPJ_INT32 l_h, l_w;
9224
9225         l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0,
9226                          (OPJ_INT32)l_img_comp->dx);
9227         l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0,
9228                          (OPJ_INT32)l_img_comp->dy);
9229         l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
9230         l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
9231
9232         l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
9233               - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
9234         if (l_w < 0) {
9235             opj_event_msg(p_manager, EVT_ERROR,
9236                           "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
9237                           it_comp, l_w);
9238             return OPJ_FALSE;
9239         }
9240         l_img_comp->w = (OPJ_UINT32)l_w;
9241
9242         l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
9243               - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
9244         if (l_h < 0) {
9245             opj_event_msg(p_manager, EVT_ERROR,
9246                           "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
9247                           it_comp, l_h);
9248             return OPJ_FALSE;
9249         }
9250         l_img_comp->h = (OPJ_UINT32)l_h;
9251
9252         l_img_comp++;
9253     }
9254
9255     return OPJ_TRUE;
9256 }
9257
9258 OPJ_BOOL opj_j2k_set_decoded_components(opj_j2k_t *p_j2k,
9259                                         OPJ_UINT32 numcomps,
9260                                         const OPJ_UINT32* comps_indices,
9261                                         opj_event_mgr_t * p_manager)
9262 {
9263     OPJ_UINT32 i;
9264     OPJ_BOOL* already_mapped;
9265
9266     if (p_j2k->m_private_image == NULL) {
9267         opj_event_msg(p_manager, EVT_ERROR,
9268                       "opj_read_header() should be called before "
9269                       "opj_set_decoded_components().\n");
9270         return OPJ_FALSE;
9271     }
9272
9273     already_mapped = (OPJ_BOOL*) opj_calloc(sizeof(OPJ_BOOL),
9274                                             p_j2k->m_private_image->numcomps);
9275     if (already_mapped == NULL) {
9276         return OPJ_FALSE;
9277     }
9278
9279     for (i = 0; i < numcomps; i++) {
9280         if (comps_indices[i] >= p_j2k->m_private_image->numcomps) {
9281             opj_event_msg(p_manager, EVT_ERROR,
9282                           "Invalid component index: %u\n",
9283                           comps_indices[i]);
9284             opj_free(already_mapped);
9285             return OPJ_FALSE;
9286         }
9287         if (already_mapped[comps_indices[i]]) {
9288             opj_event_msg(p_manager, EVT_ERROR,
9289                           "Component index %u used several times\n",
9290                           comps_indices[i]);
9291             opj_free(already_mapped);
9292             return OPJ_FALSE;
9293         }
9294         already_mapped[comps_indices[i]] = OPJ_TRUE;
9295     }
9296     opj_free(already_mapped);
9297
9298     opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
9299     if (numcomps) {
9300         p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode =
9301             (OPJ_UINT32*) opj_malloc(numcomps * sizeof(OPJ_UINT32));
9302         if (p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode == NULL) {
9303             p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
9304             return OPJ_FALSE;
9305         }
9306         memcpy(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
9307                comps_indices,
9308                numcomps * sizeof(OPJ_UINT32));
9309     } else {
9310         p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = NULL;
9311     }
9312     p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = numcomps;
9313
9314     return OPJ_TRUE;
9315 }
9316
9317
9318 OPJ_BOOL opj_j2k_set_decode_area(opj_j2k_t *p_j2k,
9319                                  opj_image_t* p_image,
9320                                  OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
9321                                  OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
9322                                  opj_event_mgr_t * p_manager)
9323 {
9324     opj_cp_t * l_cp = &(p_j2k->m_cp);
9325     opj_image_t * l_image = p_j2k->m_private_image;
9326     OPJ_BOOL ret;
9327     OPJ_UINT32 it_comp;
9328
9329     if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
9330             p_j2k->m_cp.tcps[0].m_data != NULL) {
9331         /* In the case of a single-tiled image whose codestream we have already */
9332         /* ingested, go on */
9333     }
9334     /* Check if we are read the main header */
9335     else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
9336         opj_event_msg(p_manager, EVT_ERROR,
9337                       "Need to decode the main header before begin to decode the remaining codestream.\n");
9338         return OPJ_FALSE;
9339     }
9340
9341     /* Update the comps[].factor member of the output image with the one */
9342     /* of m_reduce */
9343     for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
9344         p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
9345     }
9346
9347     if (!p_start_x && !p_start_y && !p_end_x && !p_end_y) {
9348         opj_event_msg(p_manager, EVT_INFO,
9349                       "No decoded area parameters, set the decoded area to the whole image\n");
9350
9351         p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
9352         p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
9353         p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
9354         p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
9355
9356         p_image->x0 = l_image->x0;
9357         p_image->y0 = l_image->y0;
9358         p_image->x1 = l_image->x1;
9359         p_image->y1 = l_image->y1;
9360
9361         return opj_j2k_update_image_dimensions(p_image, p_manager);
9362     }
9363
9364     /* ----- */
9365     /* Check if the positions provided by the user are correct */
9366
9367     /* Left */
9368     if (p_start_x < 0) {
9369         opj_event_msg(p_manager, EVT_ERROR,
9370                       "Left position of the decoded area (region_x0=%d) should be >= 0.\n",
9371                       p_start_x);
9372         return OPJ_FALSE;
9373     } else if ((OPJ_UINT32)p_start_x > l_image->x1) {
9374         opj_event_msg(p_manager, EVT_ERROR,
9375                       "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
9376                       p_start_x, l_image->x1);
9377         return OPJ_FALSE;
9378     } else if ((OPJ_UINT32)p_start_x < l_image->x0) {
9379         opj_event_msg(p_manager, EVT_WARNING,
9380                       "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
9381                       p_start_x, l_image->x0);
9382         p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
9383         p_image->x0 = l_image->x0;
9384     } else {
9385         p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x -
9386                 l_cp->tx0) / l_cp->tdx;
9387         p_image->x0 = (OPJ_UINT32)p_start_x;
9388     }
9389
9390     /* Up */
9391     if (p_start_y < 0) {
9392         opj_event_msg(p_manager, EVT_ERROR,
9393                       "Up position of the decoded area (region_y0=%d) should be >= 0.\n",
9394                       p_start_y);
9395         return OPJ_FALSE;
9396     } else if ((OPJ_UINT32)p_start_y > l_image->y1) {
9397         opj_event_msg(p_manager, EVT_ERROR,
9398                       "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
9399                       p_start_y, l_image->y1);
9400         return OPJ_FALSE;
9401     } else if ((OPJ_UINT32)p_start_y < l_image->y0) {
9402         opj_event_msg(p_manager, EVT_WARNING,
9403                       "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
9404                       p_start_y, l_image->y0);
9405         p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
9406         p_image->y0 = l_image->y0;
9407     } else {
9408         p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y -
9409                 l_cp->ty0) / l_cp->tdy;
9410         p_image->y0 = (OPJ_UINT32)p_start_y;
9411     }
9412
9413     /* Right */
9414     if (p_end_x <= 0) {
9415         opj_event_msg(p_manager, EVT_ERROR,
9416                       "Right position of the decoded area (region_x1=%d) should be > 0.\n",
9417                       p_end_x);
9418         return OPJ_FALSE;
9419     } else if ((OPJ_UINT32)p_end_x < l_image->x0) {
9420         opj_event_msg(p_manager, EVT_ERROR,
9421                       "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
9422                       p_end_x, l_image->x0);
9423         return OPJ_FALSE;
9424     } else if ((OPJ_UINT32)p_end_x > l_image->x1) {
9425         opj_event_msg(p_manager, EVT_WARNING,
9426                       "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
9427                       p_end_x, l_image->x1);
9428         p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
9429         p_image->x1 = l_image->x1;
9430     } else {
9431         p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv(
9432                     p_end_x - (OPJ_INT32)l_cp->tx0, (OPJ_INT32)l_cp->tdx);
9433         p_image->x1 = (OPJ_UINT32)p_end_x;
9434     }
9435
9436     /* Bottom */
9437     if (p_end_y <= 0) {
9438         opj_event_msg(p_manager, EVT_ERROR,
9439                       "Bottom position of the decoded area (region_y1=%d) should be > 0.\n",
9440                       p_end_y);
9441         return OPJ_FALSE;
9442     } else if ((OPJ_UINT32)p_end_y < l_image->y0) {
9443         opj_event_msg(p_manager, EVT_ERROR,
9444                       "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
9445                       p_end_y, l_image->y0);
9446         return OPJ_FALSE;
9447     }
9448     if ((OPJ_UINT32)p_end_y > l_image->y1) {
9449         opj_event_msg(p_manager, EVT_WARNING,
9450                       "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
9451                       p_end_y, l_image->y1);
9452         p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
9453         p_image->y1 = l_image->y1;
9454     } else {
9455         p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv(
9456                     p_end_y - (OPJ_INT32)l_cp->ty0, (OPJ_INT32)l_cp->tdy);
9457         p_image->y1 = (OPJ_UINT32)p_end_y;
9458     }
9459     /* ----- */
9460
9461     p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
9462
9463     ret = opj_j2k_update_image_dimensions(p_image, p_manager);
9464
9465     if (ret) {
9466         opj_event_msg(p_manager, EVT_INFO, "Setting decoding area to %d,%d,%d,%d\n",
9467                       p_image->x0, p_image->y0, p_image->x1, p_image->y1);
9468     }
9469
9470     return ret;
9471 }
9472
9473 opj_j2k_t* opj_j2k_create_decompress(void)
9474 {
9475     opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
9476     if (!l_j2k) {
9477         return 00;
9478     }
9479
9480     l_j2k->m_is_decoder = 1;
9481     l_j2k->m_cp.m_is_decoder = 1;
9482     /* in the absence of JP2 boxes, consider different bit depth / sign */
9483     /* per component is allowed */
9484     l_j2k->m_cp.allow_different_bit_depth_sign = 1;
9485
9486 #ifdef OPJ_DISABLE_TPSOT_FIX
9487     l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
9488 #endif
9489
9490     l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,
9491             sizeof(opj_tcp_t));
9492     if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
9493         opj_j2k_destroy(l_j2k);
9494         return 00;
9495     }
9496
9497     l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,
9498             OPJ_J2K_DEFAULT_HEADER_SIZE);
9499     if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
9500         opj_j2k_destroy(l_j2k);
9501         return 00;
9502     }
9503
9504     l_j2k->m_specific_param.m_decoder.m_header_data_size =
9505         OPJ_J2K_DEFAULT_HEADER_SIZE;
9506
9507     l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
9508
9509     l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
9510
9511     /* codestream index creation */
9512     l_j2k->cstr_index = opj_j2k_create_cstr_index();
9513     if (!l_j2k->cstr_index) {
9514         opj_j2k_destroy(l_j2k);
9515         return 00;
9516     }
9517
9518     /* validation list creation */
9519     l_j2k->m_validation_list = opj_procedure_list_create();
9520     if (! l_j2k->m_validation_list) {
9521         opj_j2k_destroy(l_j2k);
9522         return 00;
9523     }
9524
9525     /* execution list creation */
9526     l_j2k->m_procedure_list = opj_procedure_list_create();
9527     if (! l_j2k->m_procedure_list) {
9528         opj_j2k_destroy(l_j2k);
9529         return 00;
9530     }
9531
9532     l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
9533     if (!l_j2k->m_tp) {
9534         l_j2k->m_tp = opj_thread_pool_create(0);
9535     }
9536     if (!l_j2k->m_tp) {
9537         opj_j2k_destroy(l_j2k);
9538         return NULL;
9539     }
9540
9541     return l_j2k;
9542 }
9543
9544 static opj_codestream_index_t* opj_j2k_create_cstr_index(void)
9545 {
9546     opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
9547                                          opj_calloc(1, sizeof(opj_codestream_index_t));
9548     if (!cstr_index) {
9549         return NULL;
9550     }
9551
9552     cstr_index->maxmarknum = 100;
9553     cstr_index->marknum = 0;
9554     cstr_index->marker = (opj_marker_info_t*)
9555                          opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
9556     if (!cstr_index-> marker) {
9557         opj_free(cstr_index);
9558         return NULL;
9559     }
9560
9561     cstr_index->tile_index = NULL;
9562
9563     return cstr_index;
9564 }
9565
9566 static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t *p_j2k,
9567         OPJ_UINT32 p_tile_no,
9568         OPJ_UINT32 p_comp_no)
9569 {
9570     opj_cp_t *l_cp = 00;
9571     opj_tcp_t *l_tcp = 00;
9572     opj_tccp_t *l_tccp = 00;
9573
9574     /* preconditions */
9575     assert(p_j2k != 00);
9576
9577     l_cp = &(p_j2k->m_cp);
9578     l_tcp = &l_cp->tcps[p_tile_no];
9579     l_tccp = &l_tcp->tccps[p_comp_no];
9580
9581     /* preconditions again */
9582     assert(p_tile_no < (l_cp->tw * l_cp->th));
9583     assert(p_comp_no < p_j2k->m_private_image->numcomps);
9584
9585     if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
9586         return 5 + l_tccp->numresolutions;
9587     } else {
9588         return 5;
9589     }
9590 }
9591
9592 static OPJ_BOOL opj_j2k_compare_SPCod_SPCoc(opj_j2k_t *p_j2k,
9593         OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
9594 {
9595     OPJ_UINT32 i;
9596     opj_cp_t *l_cp = NULL;
9597     opj_tcp_t *l_tcp = NULL;
9598     opj_tccp_t *l_tccp0 = NULL;
9599     opj_tccp_t *l_tccp1 = NULL;
9600
9601     /* preconditions */
9602     assert(p_j2k != 00);
9603
9604     l_cp = &(p_j2k->m_cp);
9605     l_tcp = &l_cp->tcps[p_tile_no];
9606     l_tccp0 = &l_tcp->tccps[p_first_comp_no];
9607     l_tccp1 = &l_tcp->tccps[p_second_comp_no];
9608
9609     if (l_tccp0->numresolutions != l_tccp1->numresolutions) {
9610         return OPJ_FALSE;
9611     }
9612     if (l_tccp0->cblkw != l_tccp1->cblkw) {
9613         return OPJ_FALSE;
9614     }
9615     if (l_tccp0->cblkh != l_tccp1->cblkh) {
9616         return OPJ_FALSE;
9617     }
9618     if (l_tccp0->cblksty != l_tccp1->cblksty) {
9619         return OPJ_FALSE;
9620     }
9621     if (l_tccp0->qmfbid != l_tccp1->qmfbid) {
9622         return OPJ_FALSE;
9623     }
9624     if ((l_tccp0->csty & J2K_CCP_CSTY_PRT) != (l_tccp1->csty & J2K_CCP_CSTY_PRT)) {
9625         return OPJ_FALSE;
9626     }
9627
9628     for (i = 0U; i < l_tccp0->numresolutions; ++i) {
9629         if (l_tccp0->prcw[i] != l_tccp1->prcw[i]) {
9630             return OPJ_FALSE;
9631         }
9632         if (l_tccp0->prch[i] != l_tccp1->prch[i]) {
9633             return OPJ_FALSE;
9634         }
9635     }
9636     return OPJ_TRUE;
9637 }
9638
9639 static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(opj_j2k_t *p_j2k,
9640         OPJ_UINT32 p_tile_no,
9641         OPJ_UINT32 p_comp_no,
9642         OPJ_BYTE * p_data,
9643         OPJ_UINT32 * p_header_size,
9644         struct opj_event_mgr * p_manager)
9645 {
9646     OPJ_UINT32 i;
9647     opj_cp_t *l_cp = 00;
9648     opj_tcp_t *l_tcp = 00;
9649     opj_tccp_t *l_tccp = 00;
9650
9651     /* preconditions */
9652     assert(p_j2k != 00);
9653     assert(p_header_size != 00);
9654     assert(p_manager != 00);
9655     assert(p_data != 00);
9656
9657     l_cp = &(p_j2k->m_cp);
9658     l_tcp = &l_cp->tcps[p_tile_no];
9659     l_tccp = &l_tcp->tccps[p_comp_no];
9660
9661     /* preconditions again */
9662     assert(p_tile_no < (l_cp->tw * l_cp->th));
9663     assert(p_comp_no < (p_j2k->m_private_image->numcomps));
9664
9665     if (*p_header_size < 5) {
9666         opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
9667         return OPJ_FALSE;
9668     }
9669
9670     opj_write_bytes(p_data, l_tccp->numresolutions - 1, 1); /* SPcoc (D) */
9671     ++p_data;
9672
9673     opj_write_bytes(p_data, l_tccp->cblkw - 2, 1);                  /* SPcoc (E) */
9674     ++p_data;
9675
9676     opj_write_bytes(p_data, l_tccp->cblkh - 2, 1);                  /* SPcoc (F) */
9677     ++p_data;
9678
9679     opj_write_bytes(p_data, l_tccp->cblksty,
9680                     1);                            /* SPcoc (G) */
9681     ++p_data;
9682
9683     opj_write_bytes(p_data, l_tccp->qmfbid,
9684                     1);                             /* SPcoc (H) */
9685     ++p_data;
9686
9687     *p_header_size = *p_header_size - 5;
9688
9689     if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
9690
9691         if (*p_header_size < l_tccp->numresolutions) {
9692             opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
9693             return OPJ_FALSE;
9694         }
9695
9696         for (i = 0; i < l_tccp->numresolutions; ++i) {
9697             opj_write_bytes(p_data, l_tccp->prcw[i] + (l_tccp->prch[i] << 4),
9698                             1);   /* SPcoc (I_i) */
9699             ++p_data;
9700         }
9701
9702         *p_header_size = *p_header_size - l_tccp->numresolutions;
9703     }
9704
9705     return OPJ_TRUE;
9706 }
9707
9708 static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
9709         OPJ_UINT32 compno,
9710         OPJ_BYTE * p_header_data,
9711         OPJ_UINT32 * p_header_size,
9712         opj_event_mgr_t * p_manager)
9713 {
9714     OPJ_UINT32 i, l_tmp;
9715     opj_cp_t *l_cp = NULL;
9716     opj_tcp_t *l_tcp = NULL;
9717     opj_tccp_t *l_tccp = NULL;
9718     OPJ_BYTE * l_current_ptr = NULL;
9719
9720     /* preconditions */
9721     assert(p_j2k != 00);
9722     assert(p_manager != 00);
9723     assert(p_header_data != 00);
9724
9725     l_cp = &(p_j2k->m_cp);
9726     l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
9727             &l_cp->tcps[p_j2k->m_current_tile_number] :
9728             p_j2k->m_specific_param.m_decoder.m_default_tcp;
9729
9730     /* precondition again */
9731     assert(compno < p_j2k->m_private_image->numcomps);
9732
9733     l_tccp = &l_tcp->tccps[compno];
9734     l_current_ptr = p_header_data;
9735
9736     /* make sure room is sufficient */
9737     if (*p_header_size < 5) {
9738         opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
9739         return OPJ_FALSE;
9740     }
9741
9742     opj_read_bytes(l_current_ptr, &l_tccp->numresolutions,
9743                    1);              /* SPcox (D) */
9744     ++l_tccp->numresolutions;                                                                               /* tccp->numresolutions = read() + 1 */
9745     if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
9746         opj_event_msg(p_manager, EVT_ERROR,
9747                       "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
9748                       l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
9749         return OPJ_FALSE;
9750     }
9751     ++l_current_ptr;
9752
9753     /* If user wants to remove more resolutions than the codestream contains, return error */
9754     if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
9755         opj_event_msg(p_manager, EVT_ERROR,
9756                       "Error decoding component %d.\nThe number of resolutions "
9757                       "to remove (%d) is greater or equal than the number "
9758                       "of resolutions of this component (%d)\nModify the cp_reduce parameter.\n\n",
9759                       compno, l_cp->m_specific_param.m_dec.m_reduce, l_tccp->numresolutions);
9760         p_j2k->m_specific_param.m_decoder.m_state |=
9761             0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
9762         return OPJ_FALSE;
9763     }
9764
9765     opj_read_bytes(l_current_ptr, &l_tccp->cblkw, 1);               /* SPcoc (E) */
9766     ++l_current_ptr;
9767     l_tccp->cblkw += 2;
9768
9769     opj_read_bytes(l_current_ptr, &l_tccp->cblkh, 1);               /* SPcoc (F) */
9770     ++l_current_ptr;
9771     l_tccp->cblkh += 2;
9772
9773     if ((l_tccp->cblkw > 10) || (l_tccp->cblkh > 10) ||
9774             ((l_tccp->cblkw + l_tccp->cblkh) > 12)) {
9775         opj_event_msg(p_manager, EVT_ERROR,
9776                       "Error reading SPCod SPCoc element, Invalid cblkw/cblkh combination\n");
9777         return OPJ_FALSE;
9778     }
9779
9780
9781     opj_read_bytes(l_current_ptr, &l_tccp->cblksty, 1);             /* SPcoc (G) */
9782     ++l_current_ptr;
9783     if (l_tccp->cblksty & 0xC0U) { /* 2 msb are reserved, assume we can't read */
9784         opj_event_msg(p_manager, EVT_ERROR,
9785                       "Error reading SPCod SPCoc element, Invalid code-block style found\n");
9786         return OPJ_FALSE;
9787     }
9788
9789     opj_read_bytes(l_current_ptr, &l_tccp->qmfbid, 1);              /* SPcoc (H) */
9790     ++l_current_ptr;
9791
9792     *p_header_size = *p_header_size - 5;
9793
9794     /* use custom precinct size ? */
9795     if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
9796         if (*p_header_size < l_tccp->numresolutions) {
9797             opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
9798             return OPJ_FALSE;
9799         }
9800
9801         for (i = 0; i < l_tccp->numresolutions; ++i) {
9802             opj_read_bytes(l_current_ptr, &l_tmp, 1);               /* SPcoc (I_i) */
9803             ++l_current_ptr;
9804             /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */
9805             if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) {
9806                 opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n");
9807                 return OPJ_FALSE;
9808             }
9809             l_tccp->prcw[i] = l_tmp & 0xf;
9810             l_tccp->prch[i] = l_tmp >> 4;
9811         }
9812
9813         *p_header_size = *p_header_size - l_tccp->numresolutions;
9814     } else {
9815         /* set default size for the precinct width and height */
9816         for (i = 0; i < l_tccp->numresolutions; ++i) {
9817             l_tccp->prcw[i] = 15;
9818             l_tccp->prch[i] = 15;
9819         }
9820     }
9821
9822 #ifdef WIP_REMOVE_MSD
9823     /* INDEX >> */
9824     if (p_j2k->cstr_info && compno == 0) {
9825         OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
9826
9827         p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh =
9828             l_tccp->cblkh;
9829         p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw =
9830             l_tccp->cblkw;
9831         p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions
9832             = l_tccp->numresolutions;
9833         p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty =
9834             l_tccp->cblksty;
9835         p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid =
9836             l_tccp->qmfbid;
9837
9838         memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx, l_tccp->prcw,
9839                l_data_size);
9840         memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy, l_tccp->prch,
9841                l_data_size);
9842     }
9843     /* << INDEX */
9844 #endif
9845
9846     return OPJ_TRUE;
9847 }
9848
9849 static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k)
9850 {
9851     /* loop */
9852     OPJ_UINT32 i;
9853     opj_cp_t *l_cp = NULL;
9854     opj_tcp_t *l_tcp = NULL;
9855     opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
9856     OPJ_UINT32 l_prc_size;
9857
9858     /* preconditions */
9859     assert(p_j2k != 00);
9860
9861     l_cp = &(p_j2k->m_cp);
9862     l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
9863             ?
9864             &l_cp->tcps[p_j2k->m_current_tile_number] :
9865             p_j2k->m_specific_param.m_decoder.m_default_tcp;
9866
9867     l_ref_tccp = &l_tcp->tccps[0];
9868     l_copied_tccp = l_ref_tccp + 1;
9869     l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
9870
9871     for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
9872         l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
9873         l_copied_tccp->cblkw = l_ref_tccp->cblkw;
9874         l_copied_tccp->cblkh = l_ref_tccp->cblkh;
9875         l_copied_tccp->cblksty = l_ref_tccp->cblksty;
9876         l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
9877         memcpy(l_copied_tccp->prcw, l_ref_tccp->prcw, l_prc_size);
9878         memcpy(l_copied_tccp->prch, l_ref_tccp->prch, l_prc_size);
9879         ++l_copied_tccp;
9880     }
9881 }
9882
9883 static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size(opj_j2k_t *p_j2k,
9884         OPJ_UINT32 p_tile_no,
9885         OPJ_UINT32 p_comp_no)
9886 {
9887     OPJ_UINT32 l_num_bands;
9888
9889     opj_cp_t *l_cp = 00;
9890     opj_tcp_t *l_tcp = 00;
9891     opj_tccp_t *l_tccp = 00;
9892
9893     /* preconditions */
9894     assert(p_j2k != 00);
9895
9896     l_cp = &(p_j2k->m_cp);
9897     l_tcp = &l_cp->tcps[p_tile_no];
9898     l_tccp = &l_tcp->tccps[p_comp_no];
9899
9900     /* preconditions again */
9901     assert(p_tile_no < l_cp->tw * l_cp->th);
9902     assert(p_comp_no < p_j2k->m_private_image->numcomps);
9903
9904     l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
9905                   (l_tccp->numresolutions * 3 - 2);
9906
9907     if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
9908         return 1 + l_num_bands;
9909     } else {
9910         return 1 + 2 * l_num_bands;
9911     }
9912 }
9913
9914 static OPJ_BOOL opj_j2k_compare_SQcd_SQcc(opj_j2k_t *p_j2k,
9915         OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
9916 {
9917     opj_cp_t *l_cp = NULL;
9918     opj_tcp_t *l_tcp = NULL;
9919     opj_tccp_t *l_tccp0 = NULL;
9920     opj_tccp_t *l_tccp1 = NULL;
9921     OPJ_UINT32 l_band_no, l_num_bands;
9922
9923     /* preconditions */
9924     assert(p_j2k != 00);
9925
9926     l_cp = &(p_j2k->m_cp);
9927     l_tcp = &l_cp->tcps[p_tile_no];
9928     l_tccp0 = &l_tcp->tccps[p_first_comp_no];
9929     l_tccp1 = &l_tcp->tccps[p_second_comp_no];
9930
9931     if (l_tccp0->qntsty != l_tccp1->qntsty) {
9932         return OPJ_FALSE;
9933     }
9934     if (l_tccp0->numgbits != l_tccp1->numgbits) {
9935         return OPJ_FALSE;
9936     }
9937     if (l_tccp0->qntsty == J2K_CCP_QNTSTY_SIQNT) {
9938         l_num_bands = 1U;
9939     } else {
9940         l_num_bands = l_tccp0->numresolutions * 3U - 2U;
9941         if (l_num_bands != (l_tccp1->numresolutions * 3U - 2U)) {
9942             return OPJ_FALSE;
9943         }
9944     }
9945
9946     for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
9947         if (l_tccp0->stepsizes[l_band_no].expn != l_tccp1->stepsizes[l_band_no].expn) {
9948             return OPJ_FALSE;
9949         }
9950     }
9951     if (l_tccp0->qntsty != J2K_CCP_QNTSTY_NOQNT) {
9952         for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
9953             if (l_tccp0->stepsizes[l_band_no].mant != l_tccp1->stepsizes[l_band_no].mant) {
9954                 return OPJ_FALSE;
9955             }
9956         }
9957     }
9958     return OPJ_TRUE;
9959 }
9960
9961
9962 static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
9963                                         OPJ_UINT32 p_tile_no,
9964                                         OPJ_UINT32 p_comp_no,
9965                                         OPJ_BYTE * p_data,
9966                                         OPJ_UINT32 * p_header_size,
9967                                         struct opj_event_mgr * p_manager)
9968 {
9969     OPJ_UINT32 l_header_size;
9970     OPJ_UINT32 l_band_no, l_num_bands;
9971     OPJ_UINT32 l_expn, l_mant;
9972
9973     opj_cp_t *l_cp = 00;
9974     opj_tcp_t *l_tcp = 00;
9975     opj_tccp_t *l_tccp = 00;
9976
9977     /* preconditions */
9978     assert(p_j2k != 00);
9979     assert(p_header_size != 00);
9980     assert(p_manager != 00);
9981     assert(p_data != 00);
9982
9983     l_cp = &(p_j2k->m_cp);
9984     l_tcp = &l_cp->tcps[p_tile_no];
9985     l_tccp = &l_tcp->tccps[p_comp_no];
9986
9987     /* preconditions again */
9988     assert(p_tile_no < l_cp->tw * l_cp->th);
9989     assert(p_comp_no < p_j2k->m_private_image->numcomps);
9990
9991     l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
9992                   (l_tccp->numresolutions * 3 - 2);
9993
9994     if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
9995         l_header_size = 1 + l_num_bands;
9996
9997         if (*p_header_size < l_header_size) {
9998             opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
9999             return OPJ_FALSE;
10000         }
10001
10002         opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
10003                         1);   /* Sqcx */
10004         ++p_data;
10005
10006         for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
10007             l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
10008             opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */
10009             ++p_data;
10010         }
10011     } else {
10012         l_header_size = 1 + 2 * l_num_bands;
10013
10014         if (*p_header_size < l_header_size) {
10015             opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
10016             return OPJ_FALSE;
10017         }
10018
10019         opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
10020                         1);   /* Sqcx */
10021         ++p_data;
10022
10023         for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
10024             l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
10025             l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
10026
10027             opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */
10028             p_data += 2;
10029         }
10030     }
10031
10032     *p_header_size = *p_header_size - l_header_size;
10033
10034     return OPJ_TRUE;
10035 }
10036
10037 static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
10038                                        OPJ_UINT32 p_comp_no,
10039                                        OPJ_BYTE* p_header_data,
10040                                        OPJ_UINT32 * p_header_size,
10041                                        opj_event_mgr_t * p_manager
10042                                       )
10043 {
10044     /* loop*/
10045     OPJ_UINT32 l_band_no;
10046     opj_cp_t *l_cp = 00;
10047     opj_tcp_t *l_tcp = 00;
10048     opj_tccp_t *l_tccp = 00;
10049     OPJ_BYTE * l_current_ptr = 00;
10050     OPJ_UINT32 l_tmp, l_num_band;
10051
10052     /* preconditions*/
10053     assert(p_j2k != 00);
10054     assert(p_manager != 00);
10055     assert(p_header_data != 00);
10056
10057     l_cp = &(p_j2k->m_cp);
10058     /* come from tile part header or main header ?*/
10059     l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
10060             ?
10061             &l_cp->tcps[p_j2k->m_current_tile_number] :
10062             p_j2k->m_specific_param.m_decoder.m_default_tcp;
10063
10064     /* precondition again*/
10065     assert(p_comp_no <  p_j2k->m_private_image->numcomps);
10066
10067     l_tccp = &l_tcp->tccps[p_comp_no];
10068     l_current_ptr = p_header_data;
10069
10070     if (*p_header_size < 1) {
10071         opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
10072         return OPJ_FALSE;
10073     }
10074     *p_header_size -= 1;
10075
10076     opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* Sqcx */
10077     ++l_current_ptr;
10078
10079     l_tccp->qntsty = l_tmp & 0x1f;
10080     l_tccp->numgbits = l_tmp >> 5;
10081     if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
10082         l_num_band = 1;
10083     } else {
10084         l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
10085                      (*p_header_size) :
10086                      (*p_header_size) / 2;
10087
10088         if (l_num_band > OPJ_J2K_MAXBANDS) {
10089             opj_event_msg(p_manager, EVT_WARNING,
10090                           "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
10091                           "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
10092                           "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS,
10093                           OPJ_J2K_MAXBANDS);
10094             /*return OPJ_FALSE;*/
10095         }
10096     }
10097
10098 #ifdef USE_JPWL
10099     if (l_cp->correct) {
10100
10101         /* if JPWL is on, we check whether there are too many subbands */
10102         if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
10103             opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
10104                           "JPWL: bad number of subbands in Sqcx (%d)\n",
10105                           l_num_band);
10106             if (!JPWL_ASSUME) {
10107                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
10108                 return OPJ_FALSE;
10109             }
10110             /* we try to correct */
10111             l_num_band = 1;
10112             opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
10113                           "- setting number of bands to %d => HYPOTHESIS!!!\n",
10114                           l_num_band);
10115         };
10116
10117     };
10118 #endif /* USE_JPWL */
10119
10120     if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
10121         for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
10122             opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* SPqcx_i */
10123             ++l_current_ptr;
10124             if (l_band_no < OPJ_J2K_MAXBANDS) {
10125                 l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
10126                 l_tccp->stepsizes[l_band_no].mant = 0;
10127             }
10128         }
10129         *p_header_size = *p_header_size - l_num_band;
10130     } else {
10131         for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
10132             opj_read_bytes(l_current_ptr, &l_tmp, 2);                       /* SPqcx_i */
10133             l_current_ptr += 2;
10134             if (l_band_no < OPJ_J2K_MAXBANDS) {
10135                 l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
10136                 l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
10137             }
10138         }
10139         *p_header_size = *p_header_size - 2 * l_num_band;
10140     }
10141
10142     /* Add Antonin : if scalar_derived -> compute other stepsizes */
10143     if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
10144         for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
10145             l_tccp->stepsizes[l_band_no].expn =
10146                 ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0)
10147                 ?
10148                 (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
10149             l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
10150         }
10151     }
10152
10153     return OPJ_TRUE;
10154 }
10155
10156 static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k)
10157 {
10158     OPJ_UINT32 i;
10159     opj_cp_t *l_cp = NULL;
10160     opj_tcp_t *l_tcp = NULL;
10161     opj_tccp_t *l_ref_tccp = NULL;
10162     opj_tccp_t *l_copied_tccp = NULL;
10163     OPJ_UINT32 l_size;
10164
10165     /* preconditions */
10166     assert(p_j2k != 00);
10167
10168     l_cp = &(p_j2k->m_cp);
10169     l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
10170             &l_cp->tcps[p_j2k->m_current_tile_number] :
10171             p_j2k->m_specific_param.m_decoder.m_default_tcp;
10172
10173     l_ref_tccp = &l_tcp->tccps[0];
10174     l_copied_tccp = l_ref_tccp + 1;
10175     l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
10176
10177     for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
10178         l_copied_tccp->qntsty = l_ref_tccp->qntsty;
10179         l_copied_tccp->numgbits = l_ref_tccp->numgbits;
10180         memcpy(l_copied_tccp->stepsizes, l_ref_tccp->stepsizes, l_size);
10181         ++l_copied_tccp;
10182     }
10183 }
10184
10185 static void opj_j2k_dump_tile_info(opj_tcp_t * l_default_tile,
10186                                    OPJ_INT32 numcomps, FILE* out_stream)
10187 {
10188     if (l_default_tile) {
10189         OPJ_INT32 compno;
10190
10191         fprintf(out_stream, "\t default tile {\n");
10192         fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
10193         fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
10194         fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
10195         fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
10196
10197         for (compno = 0; compno < numcomps; compno++) {
10198             opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
10199             OPJ_UINT32 resno;
10200             OPJ_INT32 bandno, numbands;
10201
10202             /* coding style*/
10203             fprintf(out_stream, "\t\t comp %d {\n", compno);
10204             fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
10205             fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
10206             fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
10207             fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
10208             fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
10209             fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
10210
10211             fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
10212             for (resno = 0; resno < l_tccp->numresolutions; resno++) {
10213                 fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
10214             }
10215             fprintf(out_stream, "\n");
10216
10217             /* quantization style*/
10218             fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
10219             fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
10220             fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
10221             numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
10222                        (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
10223             for (bandno = 0; bandno < numbands; bandno++) {
10224                 fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
10225                         l_tccp->stepsizes[bandno].expn);
10226             }
10227             fprintf(out_stream, "\n");
10228
10229             /* RGN value*/
10230             fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
10231
10232             fprintf(out_stream, "\t\t }\n");
10233         } /*end of component of default tile*/
10234         fprintf(out_stream, "\t }\n"); /*end of default tile*/
10235     }
10236 }
10237
10238 void j2k_dump(opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)
10239 {
10240     /* Check if the flag is compatible with j2k file*/
10241     if ((flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)) {
10242         fprintf(out_stream, "Wrong flag\n");
10243         return;
10244     }
10245
10246     /* Dump the image_header */
10247     if (flag & OPJ_IMG_INFO) {
10248         if (p_j2k->m_private_image) {
10249             j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
10250         }
10251     }
10252
10253     /* Dump the codestream info from main header */
10254     if (flag & OPJ_J2K_MH_INFO) {
10255         if (p_j2k->m_private_image) {
10256             opj_j2k_dump_MH_info(p_j2k, out_stream);
10257         }
10258     }
10259     /* Dump all tile/codestream info */
10260     if (flag & OPJ_J2K_TCH_INFO) {
10261         OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
10262         OPJ_UINT32 i;
10263         opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
10264         if (p_j2k->m_private_image) {
10265             for (i = 0; i < l_nb_tiles; ++i) {
10266                 opj_j2k_dump_tile_info(l_tcp, (OPJ_INT32)p_j2k->m_private_image->numcomps,
10267                                        out_stream);
10268                 ++l_tcp;
10269             }
10270         }
10271     }
10272
10273     /* Dump the codestream info of the current tile */
10274     if (flag & OPJ_J2K_TH_INFO) {
10275
10276     }
10277
10278     /* Dump the codestream index from main header */
10279     if (flag & OPJ_J2K_MH_IND) {
10280         opj_j2k_dump_MH_index(p_j2k, out_stream);
10281     }
10282
10283     /* Dump the codestream index of the current tile */
10284     if (flag & OPJ_J2K_TH_IND) {
10285
10286     }
10287
10288 }
10289
10290 static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)
10291 {
10292     opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
10293     OPJ_UINT32 it_marker, it_tile, it_tile_part;
10294
10295     fprintf(out_stream, "Codestream index from main header: {\n");
10296
10297     fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
10298             "\t Main header end position=%" PRIi64 "\n",
10299             cstr_index->main_head_start, cstr_index->main_head_end);
10300
10301     fprintf(out_stream, "\t Marker list: {\n");
10302
10303     if (cstr_index->marker) {
10304         for (it_marker = 0; it_marker < cstr_index->marknum ; it_marker++) {
10305             fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
10306                     cstr_index->marker[it_marker].type,
10307                     cstr_index->marker[it_marker].pos,
10308                     cstr_index->marker[it_marker].len);
10309         }
10310     }
10311
10312     fprintf(out_stream, "\t }\n");
10313
10314     if (cstr_index->tile_index) {
10315
10316         /* Simple test to avoid to write empty information*/
10317         OPJ_UINT32 l_acc_nb_of_tile_part = 0;
10318         for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
10319             l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
10320         }
10321
10322         if (l_acc_nb_of_tile_part) {
10323             fprintf(out_stream, "\t Tile index: {\n");
10324
10325             for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
10326                 OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
10327
10328                 fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile,
10329                         nb_of_tile_part);
10330
10331                 if (cstr_index->tile_index[it_tile].tp_index) {
10332                     for (it_tile_part = 0; it_tile_part < nb_of_tile_part; it_tile_part++) {
10333                         fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%"
10334                                 PRIi64 ", end_pos=%" PRIi64 ".\n",
10335                                 it_tile_part,
10336                                 cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
10337                                 cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
10338                                 cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
10339                     }
10340                 }
10341
10342                 if (cstr_index->tile_index[it_tile].marker) {
10343                     for (it_marker = 0; it_marker < cstr_index->tile_index[it_tile].marknum ;
10344                             it_marker++) {
10345                         fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
10346                                 cstr_index->tile_index[it_tile].marker[it_marker].type,
10347                                 cstr_index->tile_index[it_tile].marker[it_marker].pos,
10348                                 cstr_index->tile_index[it_tile].marker[it_marker].len);
10349                     }
10350                 }
10351             }
10352             fprintf(out_stream, "\t }\n");
10353         }
10354     }
10355
10356     fprintf(out_stream, "}\n");
10357
10358 }
10359
10360
10361 static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)
10362 {
10363
10364     fprintf(out_stream, "Codestream info from main header: {\n");
10365
10366     fprintf(out_stream, "\t tx0=%d, ty0=%d\n", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0);
10367     fprintf(out_stream, "\t tdx=%d, tdy=%d\n", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy);
10368     fprintf(out_stream, "\t tw=%d, th=%d\n", p_j2k->m_cp.tw, p_j2k->m_cp.th);
10369     opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,
10370                            (OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
10371     fprintf(out_stream, "}\n");
10372 }
10373
10374 void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag,
10375                            FILE* out_stream)
10376 {
10377     char tab[2];
10378
10379     if (dev_dump_flag) {
10380         fprintf(stdout, "[DEV] Dump an image_header struct {\n");
10381         tab[0] = '\0';
10382     } else {
10383         fprintf(out_stream, "Image info {\n");
10384         tab[0] = '\t';
10385         tab[1] = '\0';
10386     }
10387
10388     fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
10389     fprintf(out_stream,     "%s x1=%d, y1=%d\n", tab, img_header->x1,
10390             img_header->y1);
10391     fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
10392
10393     if (img_header->comps) {
10394         OPJ_UINT32 compno;
10395         for (compno = 0; compno < img_header->numcomps; compno++) {
10396             fprintf(out_stream, "%s\t component %d {\n", tab, compno);
10397             j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag,
10398                                        out_stream);
10399             fprintf(out_stream, "%s}\n", tab);
10400         }
10401     }
10402
10403     fprintf(out_stream, "}\n");
10404 }
10405
10406 void j2k_dump_image_comp_header(opj_image_comp_t* comp_header,
10407                                 OPJ_BOOL dev_dump_flag, FILE* out_stream)
10408 {
10409     char tab[3];
10410
10411     if (dev_dump_flag) {
10412         fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
10413         tab[0] = '\0';
10414     }       else {
10415         tab[0] = '\t';
10416         tab[1] = '\t';
10417         tab[2] = '\0';
10418     }
10419
10420     fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
10421     fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
10422     fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
10423
10424     if (dev_dump_flag) {
10425         fprintf(out_stream, "}\n");
10426     }
10427 }
10428
10429 opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k)
10430 {
10431     OPJ_UINT32 compno;
10432     OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
10433     opj_tcp_t *l_default_tile;
10434     opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,
10435                                           sizeof(opj_codestream_info_v2_t));
10436     if (!cstr_info) {
10437         return NULL;
10438     }
10439
10440     cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
10441
10442     cstr_info->tx0 = p_j2k->m_cp.tx0;
10443     cstr_info->ty0 = p_j2k->m_cp.ty0;
10444     cstr_info->tdx = p_j2k->m_cp.tdx;
10445     cstr_info->tdy = p_j2k->m_cp.tdy;
10446     cstr_info->tw = p_j2k->m_cp.tw;
10447     cstr_info->th = p_j2k->m_cp.th;
10448
10449     cstr_info->tile_info = NULL; /* Not fill from the main header*/
10450
10451     l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
10452
10453     cstr_info->m_default_tile_info.csty = l_default_tile->csty;
10454     cstr_info->m_default_tile_info.prg = l_default_tile->prg;
10455     cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
10456     cstr_info->m_default_tile_info.mct = l_default_tile->mct;
10457
10458     cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(
10459                 cstr_info->nbcomps, sizeof(opj_tccp_info_t));
10460     if (!cstr_info->m_default_tile_info.tccp_info) {
10461         opj_destroy_cstr_info(&cstr_info);
10462         return NULL;
10463     }
10464
10465     for (compno = 0; compno < numcomps; compno++) {
10466         opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
10467         opj_tccp_info_t *l_tccp_info = &
10468                                        (cstr_info->m_default_tile_info.tccp_info[compno]);
10469         OPJ_INT32 bandno, numbands;
10470
10471         /* coding style*/
10472         l_tccp_info->csty = l_tccp->csty;
10473         l_tccp_info->numresolutions = l_tccp->numresolutions;
10474         l_tccp_info->cblkw = l_tccp->cblkw;
10475         l_tccp_info->cblkh = l_tccp->cblkh;
10476         l_tccp_info->cblksty = l_tccp->cblksty;
10477         l_tccp_info->qmfbid = l_tccp->qmfbid;
10478         if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS) {
10479             memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
10480             memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
10481         }
10482
10483         /* quantization style*/
10484         l_tccp_info->qntsty = l_tccp->qntsty;
10485         l_tccp_info->numgbits = l_tccp->numgbits;
10486
10487         numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
10488                    (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
10489         if (numbands < OPJ_J2K_MAXBANDS) {
10490             for (bandno = 0; bandno < numbands; bandno++) {
10491                 l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)
10492                                                       l_tccp->stepsizes[bandno].mant;
10493                 l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)
10494                                                       l_tccp->stepsizes[bandno].expn;
10495             }
10496         }
10497
10498         /* RGN value*/
10499         l_tccp_info->roishift = l_tccp->roishift;
10500     }
10501
10502     return cstr_info;
10503 }
10504
10505 opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k)
10506 {
10507     opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
10508                                            opj_calloc(1, sizeof(opj_codestream_index_t));
10509     if (!l_cstr_index) {
10510         return NULL;
10511     }
10512
10513     l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
10514     l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
10515     l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
10516
10517     l_cstr_index->marknum = p_j2k->cstr_index->marknum;
10518     l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum *
10519                            sizeof(opj_marker_info_t));
10520     if (!l_cstr_index->marker) {
10521         opj_free(l_cstr_index);
10522         return NULL;
10523     }
10524
10525     if (p_j2k->cstr_index->marker) {
10526         memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker,
10527                l_cstr_index->marknum * sizeof(opj_marker_info_t));
10528     } else {
10529         opj_free(l_cstr_index->marker);
10530         l_cstr_index->marker = NULL;
10531     }
10532
10533     l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
10534     l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
10535                                    l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
10536     if (!l_cstr_index->tile_index) {
10537         opj_free(l_cstr_index->marker);
10538         opj_free(l_cstr_index);
10539         return NULL;
10540     }
10541
10542     if (!p_j2k->cstr_index->tile_index) {
10543         opj_free(l_cstr_index->tile_index);
10544         l_cstr_index->tile_index = NULL;
10545     } else {
10546         OPJ_UINT32 it_tile = 0;
10547         for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++) {
10548
10549             /* Tile Marker*/
10550             l_cstr_index->tile_index[it_tile].marknum =
10551                 p_j2k->cstr_index->tile_index[it_tile].marknum;
10552
10553             l_cstr_index->tile_index[it_tile].marker =
10554                 (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum *
10555                                                sizeof(opj_marker_info_t));
10556
10557             if (!l_cstr_index->tile_index[it_tile].marker) {
10558                 OPJ_UINT32 it_tile_free;
10559
10560                 for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
10561                     opj_free(l_cstr_index->tile_index[it_tile_free].marker);
10562                 }
10563
10564                 opj_free(l_cstr_index->tile_index);
10565                 opj_free(l_cstr_index->marker);
10566                 opj_free(l_cstr_index);
10567                 return NULL;
10568             }
10569
10570             if (p_j2k->cstr_index->tile_index[it_tile].marker)
10571                 memcpy(l_cstr_index->tile_index[it_tile].marker,
10572                        p_j2k->cstr_index->tile_index[it_tile].marker,
10573                        l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t));
10574             else {
10575                 opj_free(l_cstr_index->tile_index[it_tile].marker);
10576                 l_cstr_index->tile_index[it_tile].marker = NULL;
10577             }
10578
10579             /* Tile part index*/
10580             l_cstr_index->tile_index[it_tile].nb_tps =
10581                 p_j2k->cstr_index->tile_index[it_tile].nb_tps;
10582
10583             l_cstr_index->tile_index[it_tile].tp_index =
10584                 (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps * sizeof(
10585                                                 opj_tp_index_t));
10586
10587             if (!l_cstr_index->tile_index[it_tile].tp_index) {
10588                 OPJ_UINT32 it_tile_free;
10589
10590                 for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
10591                     opj_free(l_cstr_index->tile_index[it_tile_free].marker);
10592                     opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
10593                 }
10594
10595                 opj_free(l_cstr_index->tile_index);
10596                 opj_free(l_cstr_index->marker);
10597                 opj_free(l_cstr_index);
10598                 return NULL;
10599             }
10600
10601             if (p_j2k->cstr_index->tile_index[it_tile].tp_index) {
10602                 memcpy(l_cstr_index->tile_index[it_tile].tp_index,
10603                        p_j2k->cstr_index->tile_index[it_tile].tp_index,
10604                        l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t));
10605             } else {
10606                 opj_free(l_cstr_index->tile_index[it_tile].tp_index);
10607                 l_cstr_index->tile_index[it_tile].tp_index = NULL;
10608             }
10609
10610             /* Packet index (NOT USED)*/
10611             l_cstr_index->tile_index[it_tile].nb_packet = 0;
10612             l_cstr_index->tile_index[it_tile].packet_index = NULL;
10613
10614         }
10615     }
10616
10617     return l_cstr_index;
10618 }
10619
10620 static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
10621 {
10622     OPJ_UINT32 it_tile = 0;
10623
10624     p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
10625     p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
10626                                         p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
10627     if (!p_j2k->cstr_index->tile_index) {
10628         return OPJ_FALSE;
10629     }
10630
10631     for (it_tile = 0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++) {
10632         p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
10633         p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
10634         p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
10635                 opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum,
10636                            sizeof(opj_marker_info_t));
10637         if (!p_j2k->cstr_index->tile_index[it_tile].marker) {
10638             return OPJ_FALSE;
10639         }
10640     }
10641
10642     return OPJ_TRUE;
10643 }
10644
10645 static OPJ_BOOL opj_j2k_are_all_used_components_decoded(opj_j2k_t *p_j2k,
10646         opj_event_mgr_t * p_manager)
10647 {
10648     OPJ_UINT32 compno;
10649     OPJ_BOOL decoded_all_used_components = OPJ_TRUE;
10650
10651     if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode) {
10652         for (compno = 0;
10653                 compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
10654             OPJ_UINT32 dec_compno =
10655                 p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
10656             if (p_j2k->m_output_image->comps[dec_compno].data == NULL) {
10657                 opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
10658                               dec_compno);
10659                 decoded_all_used_components = OPJ_FALSE;
10660             }
10661         }
10662     } else {
10663         for (compno = 0; compno < p_j2k->m_output_image->numcomps; compno++) {
10664             if (p_j2k->m_output_image->comps[compno].data == NULL) {
10665                 opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
10666                               compno);
10667                 decoded_all_used_components = OPJ_FALSE;
10668             }
10669         }
10670     }
10671
10672     if (decoded_all_used_components == OPJ_FALSE) {
10673         opj_event_msg(p_manager, EVT_ERROR, "Failed to decode all used components\n");
10674         return OPJ_FALSE;
10675     }
10676
10677     return OPJ_TRUE;
10678 }
10679
10680
10681 static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
10682                                      opj_stream_private_t *p_stream,
10683                                      opj_event_mgr_t * p_manager)
10684 {
10685     OPJ_BOOL l_go_on = OPJ_TRUE;
10686     OPJ_UINT32 l_current_tile_no;
10687     OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
10688     OPJ_UINT32 l_nb_comps;
10689     OPJ_UINT32 nr_tiles = 0;
10690
10691     /* Particular case for whole single tile decoding */
10692     /* We can avoid allocating intermediate tile buffers */
10693     if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
10694             p_j2k->m_cp.tx0 == 0 && p_j2k->m_cp.ty0 == 0 &&
10695             p_j2k->m_output_image->x0 == 0 &&
10696             p_j2k->m_output_image->y0 == 0 &&
10697             p_j2k->m_output_image->x1 == p_j2k->m_cp.tdx &&
10698             p_j2k->m_output_image->y1 == p_j2k->m_cp.tdy) {
10699         OPJ_UINT32 i;
10700         if (! opj_j2k_read_tile_header(p_j2k,
10701                                        &l_current_tile_no,
10702                                        NULL,
10703                                        &l_tile_x0, &l_tile_y0,
10704                                        &l_tile_x1, &l_tile_y1,
10705                                        &l_nb_comps,
10706                                        &l_go_on,
10707                                        p_stream,
10708                                        p_manager)) {
10709             return OPJ_FALSE;
10710         }
10711
10712         if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
10713                                   p_stream, p_manager)) {
10714             opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile 1/1\n");
10715             return OPJ_FALSE;
10716         }
10717
10718         /* Transfer TCD data to output image data */
10719         for (i = 0; i < p_j2k->m_output_image->numcomps; i++) {
10720             opj_image_data_free(p_j2k->m_output_image->comps[i].data);
10721             p_j2k->m_output_image->comps[i].data =
10722                 p_j2k->m_tcd->tcd_image->tiles->comps[i].data;
10723             p_j2k->m_output_image->comps[i].resno_decoded =
10724                 p_j2k->m_tcd->image->comps[i].resno_decoded;
10725             p_j2k->m_tcd->tcd_image->tiles->comps[i].data = NULL;
10726         }
10727
10728         return OPJ_TRUE;
10729     }
10730
10731     for (;;) {
10732         if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
10733                 p_j2k->m_cp.tcps[0].m_data != NULL) {
10734             l_current_tile_no = 0;
10735             p_j2k->m_current_tile_number = 0;
10736             p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
10737         } else {
10738             if (! opj_j2k_read_tile_header(p_j2k,
10739                                            &l_current_tile_no,
10740                                            NULL,
10741                                            &l_tile_x0, &l_tile_y0,
10742                                            &l_tile_x1, &l_tile_y1,
10743                                            &l_nb_comps,
10744                                            &l_go_on,
10745                                            p_stream,
10746                                            p_manager)) {
10747                 return OPJ_FALSE;
10748             }
10749
10750             if (! l_go_on) {
10751                 break;
10752             }
10753         }
10754
10755         if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
10756                                   p_stream, p_manager)) {
10757             opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n",
10758                           l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
10759             return OPJ_FALSE;
10760         }
10761
10762         opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
10763                       l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
10764
10765         if (! opj_j2k_update_image_data(p_j2k->m_tcd,
10766                                         p_j2k->m_output_image)) {
10767             return OPJ_FALSE;
10768         }
10769
10770         if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
10771                 !(p_j2k->m_output_image->x0 == p_j2k->m_private_image->x0 &&
10772                   p_j2k->m_output_image->y0 == p_j2k->m_private_image->y0 &&
10773                   p_j2k->m_output_image->x1 == p_j2k->m_private_image->x1 &&
10774                   p_j2k->m_output_image->y1 == p_j2k->m_private_image->y1)) {
10775             /* Keep current tcp data */
10776         } else {
10777             opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
10778         }
10779
10780         opj_event_msg(p_manager, EVT_INFO,
10781                       "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
10782
10783         if (opj_stream_get_number_byte_left(p_stream) == 0
10784                 && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
10785             break;
10786         }
10787         if (++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) {
10788             break;
10789         }
10790     }
10791
10792     if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
10793         return OPJ_FALSE;
10794     }
10795
10796     return OPJ_TRUE;
10797 }
10798
10799 /**
10800  * Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures.
10801  */
10802 static OPJ_BOOL opj_j2k_setup_decoding(opj_j2k_t *p_j2k,
10803                                        opj_event_mgr_t * p_manager)
10804 {
10805     /* preconditions*/
10806     assert(p_j2k != 00);
10807     assert(p_manager != 00);
10808
10809     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
10810                                            (opj_procedure)opj_j2k_decode_tiles, p_manager)) {
10811         return OPJ_FALSE;
10812     }
10813     /* DEVELOPER CORNER, add your custom procedures */
10814
10815     return OPJ_TRUE;
10816 }
10817
10818 /*
10819  * Read and decode one tile.
10820  */
10821 static OPJ_BOOL opj_j2k_decode_one_tile(opj_j2k_t *p_j2k,
10822                                         opj_stream_private_t *p_stream,
10823                                         opj_event_mgr_t * p_manager)
10824 {
10825     OPJ_BOOL l_go_on = OPJ_TRUE;
10826     OPJ_UINT32 l_current_tile_no;
10827     OPJ_UINT32 l_tile_no_to_dec;
10828     OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
10829     OPJ_UINT32 l_nb_comps;
10830     OPJ_UINT32 l_nb_tiles;
10831     OPJ_UINT32 i;
10832
10833     /*Allocate and initialize some elements of codestrem index if not already done*/
10834     if (!p_j2k->cstr_index->tile_index) {
10835         if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
10836             return OPJ_FALSE;
10837         }
10838     }
10839     /* Move into the codestream to the first SOT used to decode the desired tile */
10840     l_tile_no_to_dec = (OPJ_UINT32)
10841                        p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
10842     if (p_j2k->cstr_index->tile_index)
10843         if (p_j2k->cstr_index->tile_index->tp_index) {
10844             if (! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
10845                 /* the index for this tile has not been built,
10846                  *  so move to the last SOT read */
10847                 if (!(opj_stream_read_seek(p_stream,
10848                                            p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos + 2, p_manager))) {
10849                     opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
10850                     return OPJ_FALSE;
10851                 }
10852             } else {
10853                 if (!(opj_stream_read_seek(p_stream,
10854                                            p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos + 2,
10855                                            p_manager))) {
10856                     opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
10857                     return OPJ_FALSE;
10858                 }
10859             }
10860             /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
10861             if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
10862                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
10863             }
10864         }
10865
10866     /* Reset current tile part number for all tiles, and not only the one */
10867     /* of interest. */
10868     /* Not completely sure this is always correct but required for */
10869     /* ./build/bin/j2k_random_tile_access ./build/tests/tte1.j2k */
10870     l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
10871     for (i = 0; i < l_nb_tiles; ++i) {
10872         p_j2k->m_cp.tcps[i].m_current_tile_part_number = -1;
10873     }
10874
10875     for (;;) {
10876         if (! opj_j2k_read_tile_header(p_j2k,
10877                                        &l_current_tile_no,
10878                                        NULL,
10879                                        &l_tile_x0, &l_tile_y0,
10880                                        &l_tile_x1, &l_tile_y1,
10881                                        &l_nb_comps,
10882                                        &l_go_on,
10883                                        p_stream,
10884                                        p_manager)) {
10885             return OPJ_FALSE;
10886         }
10887
10888         if (! l_go_on) {
10889             break;
10890         }
10891
10892         if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
10893                                   p_stream, p_manager)) {
10894             return OPJ_FALSE;
10895         }
10896         opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
10897                       l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
10898
10899         if (! opj_j2k_update_image_data(p_j2k->m_tcd,
10900                                         p_j2k->m_output_image)) {
10901             return OPJ_FALSE;
10902         }
10903         opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
10904
10905         opj_event_msg(p_manager, EVT_INFO,
10906                       "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
10907
10908         if (l_current_tile_no == l_tile_no_to_dec) {
10909             /* move into the codestream to the first SOT (FIXME or not move?)*/
10910             if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2,
10911                                        p_manager))) {
10912                 opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
10913                 return OPJ_FALSE;
10914             }
10915             break;
10916         } else {
10917             opj_event_msg(p_manager, EVT_WARNING,
10918                           "Tile read, decoded and updated is not the desired one (%d vs %d).\n",
10919                           l_current_tile_no + 1, l_tile_no_to_dec + 1);
10920         }
10921
10922     }
10923
10924     if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
10925         return OPJ_FALSE;
10926     }
10927
10928     return OPJ_TRUE;
10929 }
10930
10931 /**
10932  * Sets up the procedures to do on decoding one tile. Developpers wanting to extend the library can add their own reading procedures.
10933  */
10934 static OPJ_BOOL opj_j2k_setup_decoding_tile(opj_j2k_t *p_j2k,
10935         opj_event_mgr_t * p_manager)
10936 {
10937     /* preconditions*/
10938     assert(p_j2k != 00);
10939     assert(p_manager != 00);
10940
10941     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
10942                                            (opj_procedure)opj_j2k_decode_one_tile, p_manager)) {
10943         return OPJ_FALSE;
10944     }
10945     /* DEVELOPER CORNER, add your custom procedures */
10946
10947     return OPJ_TRUE;
10948 }
10949
10950 static OPJ_BOOL opj_j2k_move_data_from_codec_to_output_image(opj_j2k_t * p_j2k,
10951         opj_image_t * p_image)
10952 {
10953     OPJ_UINT32 compno;
10954
10955     /* Move data and copy one information from codec to output image*/
10956     if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode > 0) {
10957         opj_image_comp_t* newcomps =
10958             (opj_image_comp_t*) opj_malloc(
10959                 p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode *
10960                 sizeof(opj_image_comp_t));
10961         if (newcomps == NULL) {
10962             opj_image_destroy(p_j2k->m_private_image);
10963             p_j2k->m_private_image = NULL;
10964             return OPJ_FALSE;
10965         }
10966         for (compno = 0; compno < p_image->numcomps; compno++) {
10967             opj_image_data_free(p_image->comps[compno].data);
10968             p_image->comps[compno].data = NULL;
10969         }
10970         for (compno = 0;
10971                 compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
10972             OPJ_UINT32 src_compno =
10973                 p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
10974             memcpy(&(newcomps[compno]),
10975                    &(p_j2k->m_output_image->comps[src_compno]),
10976                    sizeof(opj_image_comp_t));
10977             newcomps[compno].resno_decoded =
10978                 p_j2k->m_output_image->comps[src_compno].resno_decoded;
10979             newcomps[compno].data = p_j2k->m_output_image->comps[src_compno].data;
10980             p_j2k->m_output_image->comps[src_compno].data = NULL;
10981         }
10982         for (compno = 0; compno < p_image->numcomps; compno++) {
10983             assert(p_j2k->m_output_image->comps[compno].data == NULL);
10984             opj_image_data_free(p_j2k->m_output_image->comps[compno].data);
10985             p_j2k->m_output_image->comps[compno].data = NULL;
10986         }
10987         p_image->numcomps = p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode;
10988         opj_free(p_image->comps);
10989         p_image->comps = newcomps;
10990     } else {
10991         for (compno = 0; compno < p_image->numcomps; compno++) {
10992             p_image->comps[compno].resno_decoded =
10993                 p_j2k->m_output_image->comps[compno].resno_decoded;
10994             opj_image_data_free(p_image->comps[compno].data);
10995             p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
10996 #if 0
10997             char fn[256];
10998             sprintf(fn, "/tmp/%d.raw", compno);
10999             FILE *debug = fopen(fn, "wb");
11000             fwrite(p_image->comps[compno].data, sizeof(OPJ_INT32),
11001                    p_image->comps[compno].w * p_image->comps[compno].h, debug);
11002             fclose(debug);
11003 #endif
11004             p_j2k->m_output_image->comps[compno].data = NULL;
11005         }
11006     }
11007     return OPJ_TRUE;
11008 }
11009
11010 OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k,
11011                         opj_stream_private_t * p_stream,
11012                         opj_image_t * p_image,
11013                         opj_event_mgr_t * p_manager)
11014 {
11015     if (!p_image) {
11016         return OPJ_FALSE;
11017     }
11018
11019     /* Heuristics to detect sequence opj_read_header(), opj_set_decoded_resolution_factor() */
11020     /* and finally opj_decode_image() without manual setting of comps[].factor */
11021     /* We could potentially always execute it, if we don't allow people to do */
11022     /* opj_read_header(), modify x0,y0,x1,y1 of returned image an call opj_decode_image() */
11023     if (p_j2k->m_cp.m_specific_param.m_dec.m_reduce > 0 &&
11024             p_j2k->m_private_image != NULL &&
11025             p_j2k->m_private_image->numcomps > 0 &&
11026             p_j2k->m_private_image->comps[0].factor ==
11027             p_j2k->m_cp.m_specific_param.m_dec.m_reduce &&
11028             p_image->numcomps > 0 &&
11029             p_image->comps[0].factor == 0 &&
11030             /* Don't mess with image dimension if the user has allocated it */
11031             p_image->comps[0].data == NULL) {
11032         OPJ_UINT32 it_comp;
11033
11034         /* Update the comps[].factor member of the output image with the one */
11035         /* of m_reduce */
11036         for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
11037             p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
11038         }
11039         if (!opj_j2k_update_image_dimensions(p_image, p_manager)) {
11040             return OPJ_FALSE;
11041         }
11042     }
11043
11044     if (p_j2k->m_output_image == NULL) {
11045         p_j2k->m_output_image = opj_image_create0();
11046         if (!(p_j2k->m_output_image)) {
11047             return OPJ_FALSE;
11048         }
11049     }
11050     opj_copy_image_header(p_image, p_j2k->m_output_image);
11051
11052     /* customization of the decoding */
11053     if (!opj_j2k_setup_decoding(p_j2k, p_manager)) {
11054         return OPJ_FALSE;
11055     }
11056
11057     /* Decode the codestream */
11058     if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
11059         opj_image_destroy(p_j2k->m_private_image);
11060         p_j2k->m_private_image = NULL;
11061         return OPJ_FALSE;
11062     }
11063
11064     /* Move data and copy one information from codec to output image*/
11065     return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
11066 }
11067
11068 OPJ_BOOL opj_j2k_get_tile(opj_j2k_t *p_j2k,
11069                           opj_stream_private_t *p_stream,
11070                           opj_image_t* p_image,
11071                           opj_event_mgr_t * p_manager,
11072                           OPJ_UINT32 tile_index)
11073 {
11074     OPJ_UINT32 compno;
11075     OPJ_UINT32 l_tile_x, l_tile_y;
11076     opj_image_comp_t* l_img_comp;
11077
11078     if (!p_image) {
11079         opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
11080         return OPJ_FALSE;
11081     }
11082
11083     if (p_image->numcomps < p_j2k->m_private_image->numcomps) {
11084         opj_event_msg(p_manager, EVT_ERROR,
11085                       "Image has less components than codestream.\n");
11086         return OPJ_FALSE;
11087     }
11088
11089     if (/*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th)) {
11090         opj_event_msg(p_manager, EVT_ERROR,
11091                       "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index,
11092                       (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
11093         return OPJ_FALSE;
11094     }
11095
11096     /* Compute the dimension of the desired tile*/
11097     l_tile_x = tile_index % p_j2k->m_cp.tw;
11098     l_tile_y = tile_index / p_j2k->m_cp.tw;
11099
11100     p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
11101     if (p_image->x0 < p_j2k->m_private_image->x0) {
11102         p_image->x0 = p_j2k->m_private_image->x0;
11103     }
11104     p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
11105     if (p_image->x1 > p_j2k->m_private_image->x1) {
11106         p_image->x1 = p_j2k->m_private_image->x1;
11107     }
11108
11109     p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
11110     if (p_image->y0 < p_j2k->m_private_image->y0) {
11111         p_image->y0 = p_j2k->m_private_image->y0;
11112     }
11113     p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
11114     if (p_image->y1 > p_j2k->m_private_image->y1) {
11115         p_image->y1 = p_j2k->m_private_image->y1;
11116     }
11117
11118     l_img_comp = p_image->comps;
11119     for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) {
11120         OPJ_INT32 l_comp_x1, l_comp_y1;
11121
11122         l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
11123
11124         l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0,
11125                          (OPJ_INT32)l_img_comp->dx);
11126         l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0,
11127                          (OPJ_INT32)l_img_comp->dy);
11128         l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
11129         l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
11130
11131         l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1,
11132                                      (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0,
11133                                              (OPJ_INT32)l_img_comp->factor));
11134         l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1,
11135                                      (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0,
11136                                              (OPJ_INT32)l_img_comp->factor));
11137
11138         l_img_comp++;
11139     }
11140
11141     if (p_image->numcomps > p_j2k->m_private_image->numcomps) {
11142         /* Can happen when calling repeatdly opj_get_decoded_tile() on an
11143          * image with a color palette, where color palette expansion is done
11144          * later in jp2.c */
11145         for (compno = p_j2k->m_private_image->numcomps; compno < p_image->numcomps;
11146                 ++compno) {
11147             opj_image_data_free(p_image->comps[compno].data);
11148             p_image->comps[compno].data = NULL;
11149         }
11150         p_image->numcomps = p_j2k->m_private_image->numcomps;
11151     }
11152
11153     /* Destroy the previous output image*/
11154     if (p_j2k->m_output_image) {
11155         opj_image_destroy(p_j2k->m_output_image);
11156     }
11157
11158     /* Create the ouput image from the information previously computed*/
11159     p_j2k->m_output_image = opj_image_create0();
11160     if (!(p_j2k->m_output_image)) {
11161         return OPJ_FALSE;
11162     }
11163     opj_copy_image_header(p_image, p_j2k->m_output_image);
11164
11165     p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
11166
11167     /* customization of the decoding */
11168     if (!opj_j2k_setup_decoding_tile(p_j2k, p_manager)) {
11169         return OPJ_FALSE;
11170     }
11171
11172     /* Decode the codestream */
11173     if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
11174         opj_image_destroy(p_j2k->m_private_image);
11175         p_j2k->m_private_image = NULL;
11176         return OPJ_FALSE;
11177     }
11178
11179     /* Move data and copy one information from codec to output image*/
11180     return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
11181 }
11182
11183 OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
11184         OPJ_UINT32 res_factor,
11185         opj_event_mgr_t * p_manager)
11186 {
11187     OPJ_UINT32 it_comp;
11188
11189     p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
11190
11191     if (p_j2k->m_private_image) {
11192         if (p_j2k->m_private_image->comps) {
11193             if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
11194                 if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
11195                     for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
11196                         OPJ_UINT32 max_res =
11197                             p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
11198                         if (res_factor >= max_res) {
11199                             opj_event_msg(p_manager, EVT_ERROR,
11200                                           "Resolution factor is greater than the maximum resolution in the component.\n");
11201                             return OPJ_FALSE;
11202                         }
11203                         p_j2k->m_private_image->comps[it_comp].factor = res_factor;
11204                     }
11205                     return OPJ_TRUE;
11206                 }
11207             }
11208         }
11209     }
11210
11211     return OPJ_FALSE;
11212 }
11213
11214 OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,
11215                         opj_stream_private_t *p_stream,
11216                         opj_event_mgr_t * p_manager)
11217 {
11218     OPJ_UINT32 i, j;
11219     OPJ_UINT32 l_nb_tiles;
11220     OPJ_SIZE_T l_max_tile_size = 0, l_current_tile_size;
11221     OPJ_BYTE * l_current_data = 00;
11222     OPJ_BOOL l_reuse_data = OPJ_FALSE;
11223     opj_tcd_t* p_tcd = 00;
11224
11225     /* preconditions */
11226     assert(p_j2k != 00);
11227     assert(p_stream != 00);
11228     assert(p_manager != 00);
11229
11230     p_tcd = p_j2k->m_tcd;
11231
11232     l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
11233     if (l_nb_tiles == 1) {
11234         l_reuse_data = OPJ_TRUE;
11235 #ifdef __SSE__
11236         for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
11237             opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
11238             if (((size_t)l_img_comp->data & 0xFU) !=
11239                     0U) { /* tile data shall be aligned on 16 bytes */
11240                 l_reuse_data = OPJ_FALSE;
11241             }
11242         }
11243 #endif
11244     }
11245     for (i = 0; i < l_nb_tiles; ++i) {
11246         if (! opj_j2k_pre_write_tile(p_j2k, i, p_stream, p_manager)) {
11247             if (l_current_data) {
11248                 opj_free(l_current_data);
11249             }
11250             return OPJ_FALSE;
11251         }
11252
11253         /* if we only have one tile, then simply set tile component data equal to image component data */
11254         /* otherwise, allocate the data */
11255         for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
11256             opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j;
11257             if (l_reuse_data) {
11258                 opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
11259                 l_tilec->data  =  l_img_comp->data;
11260                 l_tilec->ownsData = OPJ_FALSE;
11261             } else {
11262                 if (! opj_alloc_tile_component_data(l_tilec)) {
11263                     opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
11264                     if (l_current_data) {
11265                         opj_free(l_current_data);
11266                     }
11267                     return OPJ_FALSE;
11268                 }
11269             }
11270         }
11271         l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd);
11272         if (!l_reuse_data) {
11273             if (l_current_tile_size > l_max_tile_size) {
11274                 OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data,
11275                                                l_current_tile_size);
11276                 if (! l_new_current_data) {
11277                     if (l_current_data) {
11278                         opj_free(l_current_data);
11279                     }
11280                     opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
11281                     return OPJ_FALSE;
11282                 }
11283                 l_current_data = l_new_current_data;
11284                 l_max_tile_size = l_current_tile_size;
11285             }
11286             if (l_current_data == NULL) {
11287                 /* Should not happen in practice, but will avoid Coverity to */
11288                 /* complain about a null pointer dereference */
11289                 assert(0);
11290                 return OPJ_FALSE;
11291             }
11292
11293             /* copy image data (32 bit) to l_current_data as contiguous, all-component, zero offset buffer */
11294             /* 32 bit components @ 8 bit precision get converted to 8 bit */
11295             /* 32 bit components @ 16 bit precision get converted to 16 bit */
11296             opj_j2k_get_tile_data(p_j2k->m_tcd, l_current_data);
11297
11298             /* now copy this data into the tile component */
11299             if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, l_current_data,
11300                                          l_current_tile_size)) {
11301                 opj_event_msg(p_manager, EVT_ERROR,
11302                               "Size mismatch between tile data and sent data.");
11303                 opj_free(l_current_data);
11304                 return OPJ_FALSE;
11305             }
11306         }
11307
11308         if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
11309             if (l_current_data) {
11310                 opj_free(l_current_data);
11311             }
11312             return OPJ_FALSE;
11313         }
11314     }
11315
11316     if (l_current_data) {
11317         opj_free(l_current_data);
11318     }
11319     return OPJ_TRUE;
11320 }
11321
11322 OPJ_BOOL opj_j2k_end_compress(opj_j2k_t *p_j2k,
11323                               opj_stream_private_t *p_stream,
11324                               opj_event_mgr_t * p_manager)
11325 {
11326     /* customization of the encoding */
11327     if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) {
11328         return OPJ_FALSE;
11329     }
11330
11331     if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
11332         return OPJ_FALSE;
11333     }
11334
11335     return OPJ_TRUE;
11336 }
11337
11338 OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
11339                                 opj_stream_private_t *p_stream,
11340                                 opj_image_t * p_image,
11341                                 opj_event_mgr_t * p_manager)
11342 {
11343     /* preconditions */
11344     assert(p_j2k != 00);
11345     assert(p_stream != 00);
11346     assert(p_manager != 00);
11347
11348     p_j2k->m_private_image = opj_image_create0();
11349     if (! p_j2k->m_private_image) {
11350         opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header.");
11351         return OPJ_FALSE;
11352     }
11353     opj_copy_image_header(p_image, p_j2k->m_private_image);
11354
11355     /* TODO_MSD: Find a better way */
11356     if (p_image->comps) {
11357         OPJ_UINT32 it_comp;
11358         for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
11359             if (p_image->comps[it_comp].data) {
11360                 p_j2k->m_private_image->comps[it_comp].data = p_image->comps[it_comp].data;
11361                 p_image->comps[it_comp].data = NULL;
11362
11363             }
11364         }
11365     }
11366
11367     /* customization of the validation */
11368     if (! opj_j2k_setup_encoding_validation(p_j2k, p_manager)) {
11369         return OPJ_FALSE;
11370     }
11371
11372     /* validation of the parameters codec */
11373     if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
11374         return OPJ_FALSE;
11375     }
11376
11377     /* customization of the encoding */
11378     if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) {
11379         return OPJ_FALSE;
11380     }
11381
11382     /* write header */
11383     if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
11384         return OPJ_FALSE;
11385     }
11386
11387     return OPJ_TRUE;
11388 }
11389
11390 static OPJ_BOOL opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,
11391                                        OPJ_UINT32 p_tile_index,
11392                                        opj_stream_private_t *p_stream,
11393                                        opj_event_mgr_t * p_manager)
11394 {
11395     (void)p_stream;
11396     if (p_tile_index != p_j2k->m_current_tile_number) {
11397         opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match.");
11398         return OPJ_FALSE;
11399     }
11400
11401     opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n",
11402                   p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
11403
11404     p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
11405     p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
11406     p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
11407
11408     /* initialisation before tile encoding  */
11409     if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
11410                                    p_manager)) {
11411         return OPJ_FALSE;
11412     }
11413
11414     return OPJ_TRUE;
11415 }
11416
11417 static void opj_get_tile_dimensions(opj_image_t * l_image,
11418                                     opj_tcd_tilecomp_t * l_tilec,
11419                                     opj_image_comp_t * l_img_comp,
11420                                     OPJ_UINT32* l_size_comp,
11421                                     OPJ_UINT32* l_width,
11422                                     OPJ_UINT32* l_height,
11423                                     OPJ_UINT32* l_offset_x,
11424                                     OPJ_UINT32* l_offset_y,
11425                                     OPJ_UINT32* l_image_width,
11426                                     OPJ_UINT32* l_stride,
11427                                     OPJ_UINT32* l_tile_offset)
11428 {
11429     OPJ_UINT32 l_remaining;
11430     *l_size_comp = l_img_comp->prec >> 3; /* (/8) */
11431     l_remaining = l_img_comp->prec & 7;  /* (%8) */
11432     if (l_remaining) {
11433         *l_size_comp += 1;
11434     }
11435
11436     if (*l_size_comp == 3) {
11437         *l_size_comp = 4;
11438     }
11439
11440     *l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
11441     *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
11442     *l_offset_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x0,
11443                   (OPJ_INT32)l_img_comp->dx);
11444     *l_offset_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->y0,
11445                   (OPJ_INT32)l_img_comp->dy);
11446     *l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 -
11447                      (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
11448     *l_stride = *l_image_width - *l_width;
11449     *l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((
11450                          OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width;
11451 }
11452
11453 static void opj_j2k_get_tile_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
11454 {
11455     OPJ_UINT32 i, j, k = 0;
11456
11457     for (i = 0; i < p_tcd->image->numcomps; ++i) {
11458         opj_image_t * l_image =  p_tcd->image;
11459         OPJ_INT32 * l_src_ptr;
11460         opj_tcd_tilecomp_t * l_tilec = p_tcd->tcd_image->tiles->comps + i;
11461         opj_image_comp_t * l_img_comp = l_image->comps + i;
11462         OPJ_UINT32 l_size_comp, l_width, l_height, l_offset_x, l_offset_y,
11463                    l_image_width, l_stride, l_tile_offset;
11464
11465         opj_get_tile_dimensions(l_image,
11466                                 l_tilec,
11467                                 l_img_comp,
11468                                 &l_size_comp,
11469                                 &l_width,
11470                                 &l_height,
11471                                 &l_offset_x,
11472                                 &l_offset_y,
11473                                 &l_image_width,
11474                                 &l_stride,
11475                                 &l_tile_offset);
11476
11477         l_src_ptr = l_img_comp->data + l_tile_offset;
11478
11479         switch (l_size_comp) {
11480         case 1: {
11481             OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
11482             if (l_img_comp->sgnd) {
11483                 for (j = 0; j < l_height; ++j) {
11484                     for (k = 0; k < l_width; ++k) {
11485                         *(l_dest_ptr) = (OPJ_CHAR)(*l_src_ptr);
11486                         ++l_dest_ptr;
11487                         ++l_src_ptr;
11488                     }
11489                     l_src_ptr += l_stride;
11490                 }
11491             } else {
11492                 for (j = 0; j < l_height; ++j) {
11493                     for (k = 0; k < l_width; ++k) {
11494                         *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr) & 0xff);
11495                         ++l_dest_ptr;
11496                         ++l_src_ptr;
11497                     }
11498                     l_src_ptr += l_stride;
11499                 }
11500             }
11501
11502             p_data = (OPJ_BYTE*) l_dest_ptr;
11503         }
11504         break;
11505         case 2: {
11506             OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
11507             if (l_img_comp->sgnd) {
11508                 for (j = 0; j < l_height; ++j) {
11509                     for (k = 0; k < l_width; ++k) {
11510                         *(l_dest_ptr++) = (OPJ_INT16)(*(l_src_ptr++));
11511                     }
11512                     l_src_ptr += l_stride;
11513                 }
11514             } else {
11515                 for (j = 0; j < l_height; ++j) {
11516                     for (k = 0; k < l_width; ++k) {
11517                         *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
11518                     }
11519                     l_src_ptr += l_stride;
11520                 }
11521             }
11522
11523             p_data = (OPJ_BYTE*) l_dest_ptr;
11524         }
11525         break;
11526         case 4: {
11527             OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
11528             for (j = 0; j < l_height; ++j) {
11529                 for (k = 0; k < l_width; ++k) {
11530                     *(l_dest_ptr++) = *(l_src_ptr++);
11531                 }
11532                 l_src_ptr += l_stride;
11533             }
11534
11535             p_data = (OPJ_BYTE*) l_dest_ptr;
11536         }
11537         break;
11538         }
11539     }
11540 }
11541
11542 static OPJ_BOOL opj_j2k_post_write_tile(opj_j2k_t * p_j2k,
11543                                         opj_stream_private_t *p_stream,
11544                                         opj_event_mgr_t * p_manager)
11545 {
11546     OPJ_UINT32 l_nb_bytes_written;
11547     OPJ_BYTE * l_current_data = 00;
11548     OPJ_UINT32 l_tile_size = 0;
11549     OPJ_UINT32 l_available_data;
11550
11551     /* preconditions */
11552     assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
11553
11554     l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
11555     l_available_data = l_tile_size;
11556     l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
11557
11558     l_nb_bytes_written = 0;
11559     if (! opj_j2k_write_first_tile_part(p_j2k, l_current_data, &l_nb_bytes_written,
11560                                         l_available_data, p_stream, p_manager)) {
11561         return OPJ_FALSE;
11562     }
11563     l_current_data += l_nb_bytes_written;
11564     l_available_data -= l_nb_bytes_written;
11565
11566     l_nb_bytes_written = 0;
11567     if (! opj_j2k_write_all_tile_parts(p_j2k, l_current_data, &l_nb_bytes_written,
11568                                        l_available_data, p_stream, p_manager)) {
11569         return OPJ_FALSE;
11570     }
11571
11572     l_available_data -= l_nb_bytes_written;
11573     l_nb_bytes_written = l_tile_size - l_available_data;
11574
11575     if (opj_stream_write_data(p_stream,
11576                               p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
11577                               l_nb_bytes_written, p_manager) != l_nb_bytes_written) {
11578         return OPJ_FALSE;
11579     }
11580
11581     ++p_j2k->m_current_tile_number;
11582
11583     return OPJ_TRUE;
11584 }
11585
11586 static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
11587         opj_event_mgr_t * p_manager)
11588 {
11589     /* preconditions */
11590     assert(p_j2k != 00);
11591     assert(p_manager != 00);
11592
11593     /* DEVELOPER CORNER, insert your custom procedures */
11594     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11595                                            (opj_procedure)opj_j2k_write_eoc, p_manager)) {
11596         return OPJ_FALSE;
11597     }
11598
11599     if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) {
11600         if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11601                                                (opj_procedure)opj_j2k_write_updated_tlm, p_manager)) {
11602             return OPJ_FALSE;
11603         }
11604     }
11605
11606     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11607                                            (opj_procedure)opj_j2k_write_epc, p_manager)) {
11608         return OPJ_FALSE;
11609     }
11610     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11611                                            (opj_procedure)opj_j2k_end_encoding, p_manager)) {
11612         return OPJ_FALSE;
11613     }
11614     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11615                                            (opj_procedure)opj_j2k_destroy_header_memory, p_manager)) {
11616         return OPJ_FALSE;
11617     }
11618     return OPJ_TRUE;
11619 }
11620
11621 static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
11622         opj_event_mgr_t * p_manager)
11623 {
11624     /* preconditions */
11625     assert(p_j2k != 00);
11626     assert(p_manager != 00);
11627
11628     if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
11629                                            (opj_procedure)opj_j2k_build_encoder, p_manager)) {
11630         return OPJ_FALSE;
11631     }
11632     if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
11633                                            (opj_procedure)opj_j2k_encoding_validation, p_manager)) {
11634         return OPJ_FALSE;
11635     }
11636
11637     /* DEVELOPER CORNER, add your custom validation procedure */
11638     if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
11639                                            (opj_procedure)opj_j2k_mct_validation, p_manager)) {
11640         return OPJ_FALSE;
11641     }
11642
11643     return OPJ_TRUE;
11644 }
11645
11646 static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
11647         opj_event_mgr_t * p_manager)
11648 {
11649     /* preconditions */
11650     assert(p_j2k != 00);
11651     assert(p_manager != 00);
11652
11653     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11654                                            (opj_procedure)opj_j2k_init_info, p_manager)) {
11655         return OPJ_FALSE;
11656     }
11657     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11658                                            (opj_procedure)opj_j2k_write_soc, p_manager)) {
11659         return OPJ_FALSE;
11660     }
11661     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11662                                            (opj_procedure)opj_j2k_write_siz, p_manager)) {
11663         return OPJ_FALSE;
11664     }
11665     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11666                                            (opj_procedure)opj_j2k_write_cod, p_manager)) {
11667         return OPJ_FALSE;
11668     }
11669     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11670                                            (opj_procedure)opj_j2k_write_qcd, p_manager)) {
11671         return OPJ_FALSE;
11672     }
11673     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11674                                            (opj_procedure)opj_j2k_write_all_coc, p_manager)) {
11675         return OPJ_FALSE;
11676     }
11677     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11678                                            (opj_procedure)opj_j2k_write_all_qcc, p_manager)) {
11679         return OPJ_FALSE;
11680     }
11681
11682     if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) {
11683         if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11684                                                (opj_procedure)opj_j2k_write_tlm, p_manager)) {
11685             return OPJ_FALSE;
11686         }
11687
11688         if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) {
11689             if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11690                                                    (opj_procedure)opj_j2k_write_poc, p_manager)) {
11691                 return OPJ_FALSE;
11692             }
11693         }
11694     }
11695
11696     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11697                                            (opj_procedure)opj_j2k_write_regions, p_manager)) {
11698         return OPJ_FALSE;
11699     }
11700
11701     if (p_j2k->m_cp.comment != 00)  {
11702         if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11703                                                (opj_procedure)opj_j2k_write_com, p_manager)) {
11704             return OPJ_FALSE;
11705         }
11706     }
11707
11708     /* DEVELOPER CORNER, insert your custom procedures */
11709     if (p_j2k->m_cp.rsiz & OPJ_EXTENSION_MCT) {
11710         if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11711                                                (opj_procedure)opj_j2k_write_mct_data_group, p_manager)) {
11712             return OPJ_FALSE;
11713         }
11714     }
11715     /* End of Developer Corner */
11716
11717     if (p_j2k->cstr_index) {
11718         if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11719                                                (opj_procedure)opj_j2k_get_end_header, p_manager)) {
11720             return OPJ_FALSE;
11721         }
11722     }
11723
11724     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11725                                            (opj_procedure)opj_j2k_create_tcd, p_manager)) {
11726         return OPJ_FALSE;
11727     }
11728     if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11729                                            (opj_procedure)opj_j2k_update_rates, p_manager)) {
11730         return OPJ_FALSE;
11731     }
11732
11733     return OPJ_TRUE;
11734 }
11735
11736 static OPJ_BOOL opj_j2k_write_first_tile_part(opj_j2k_t *p_j2k,
11737         OPJ_BYTE * p_data,
11738         OPJ_UINT32 * p_data_written,
11739         OPJ_UINT32 total_data_size,
11740         opj_stream_private_t *p_stream,
11741         struct opj_event_mgr * p_manager)
11742 {
11743     OPJ_UINT32 l_nb_bytes_written = 0;
11744     OPJ_UINT32 l_current_nb_bytes_written;
11745     OPJ_BYTE * l_begin_data = 00;
11746
11747     opj_tcd_t * l_tcd = 00;
11748     opj_cp_t * l_cp = 00;
11749
11750     l_tcd = p_j2k->m_tcd;
11751     l_cp = &(p_j2k->m_cp);
11752
11753     l_tcd->cur_pino = 0;
11754
11755     /*Get number of tile parts*/
11756     p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
11757
11758     /* INDEX >> */
11759     /* << INDEX */
11760
11761     l_current_nb_bytes_written = 0;
11762     l_begin_data = p_data;
11763     if (! opj_j2k_write_sot(p_j2k, p_data, total_data_size,
11764                             &l_current_nb_bytes_written, p_stream,
11765                             p_manager)) {
11766         return OPJ_FALSE;
11767     }
11768
11769     l_nb_bytes_written += l_current_nb_bytes_written;
11770     p_data += l_current_nb_bytes_written;
11771     total_data_size -= l_current_nb_bytes_written;
11772
11773     if (!OPJ_IS_CINEMA(l_cp->rsiz)) {
11774 #if 0
11775         for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
11776             l_current_nb_bytes_written = 0;
11777             opj_j2k_write_coc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
11778                                         p_manager);
11779             l_nb_bytes_written += l_current_nb_bytes_written;
11780             p_data += l_current_nb_bytes_written;
11781             total_data_size -= l_current_nb_bytes_written;
11782
11783             l_current_nb_bytes_written = 0;
11784             opj_j2k_write_qcc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
11785                                         p_manager);
11786             l_nb_bytes_written += l_current_nb_bytes_written;
11787             p_data += l_current_nb_bytes_written;
11788             total_data_size -= l_current_nb_bytes_written;
11789         }
11790 #endif
11791         if (l_cp->tcps[p_j2k->m_current_tile_number].POC) {
11792             l_current_nb_bytes_written = 0;
11793             opj_j2k_write_poc_in_memory(p_j2k, p_data, &l_current_nb_bytes_written,
11794                                         p_manager);
11795             l_nb_bytes_written += l_current_nb_bytes_written;
11796             p_data += l_current_nb_bytes_written;
11797             total_data_size -= l_current_nb_bytes_written;
11798         }
11799     }
11800
11801     l_current_nb_bytes_written = 0;
11802     if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
11803                             total_data_size, p_stream, p_manager)) {
11804         return OPJ_FALSE;
11805     }
11806
11807     l_nb_bytes_written += l_current_nb_bytes_written;
11808     * p_data_written = l_nb_bytes_written;
11809
11810     /* Writing Psot in SOT marker */
11811     opj_write_bytes(l_begin_data + 6, l_nb_bytes_written,
11812                     4);                                 /* PSOT */
11813
11814     if (OPJ_IS_CINEMA(l_cp->rsiz)) {
11815         opj_j2k_update_tlm(p_j2k, l_nb_bytes_written);
11816     }
11817
11818     return OPJ_TRUE;
11819 }
11820
11821 static OPJ_BOOL opj_j2k_write_all_tile_parts(opj_j2k_t *p_j2k,
11822         OPJ_BYTE * p_data,
11823         OPJ_UINT32 * p_data_written,
11824         OPJ_UINT32 total_data_size,
11825         opj_stream_private_t *p_stream,
11826         struct opj_event_mgr * p_manager
11827                                             )
11828 {
11829     OPJ_UINT32 tilepartno = 0;
11830     OPJ_UINT32 l_nb_bytes_written = 0;
11831     OPJ_UINT32 l_current_nb_bytes_written;
11832     OPJ_UINT32 l_part_tile_size;
11833     OPJ_UINT32 tot_num_tp;
11834     OPJ_UINT32 pino;
11835
11836     OPJ_BYTE * l_begin_data;
11837     opj_tcp_t *l_tcp = 00;
11838     opj_tcd_t * l_tcd = 00;
11839     opj_cp_t * l_cp = 00;
11840
11841     l_tcd = p_j2k->m_tcd;
11842     l_cp = &(p_j2k->m_cp);
11843     l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
11844
11845     /*Get number of tile parts*/
11846     tot_num_tp = opj_j2k_get_num_tp(l_cp, 0, p_j2k->m_current_tile_number);
11847
11848     /* start writing remaining tile parts */
11849     ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
11850     for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
11851         p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
11852         l_current_nb_bytes_written = 0;
11853         l_part_tile_size = 0;
11854         l_begin_data = p_data;
11855
11856         if (! opj_j2k_write_sot(p_j2k, p_data,
11857                                 total_data_size,
11858                                 &l_current_nb_bytes_written,
11859                                 p_stream,
11860                                 p_manager)) {
11861             return OPJ_FALSE;
11862         }
11863
11864         l_nb_bytes_written += l_current_nb_bytes_written;
11865         p_data += l_current_nb_bytes_written;
11866         total_data_size -= l_current_nb_bytes_written;
11867         l_part_tile_size += l_current_nb_bytes_written;
11868
11869         l_current_nb_bytes_written = 0;
11870         if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
11871                                 total_data_size, p_stream, p_manager)) {
11872             return OPJ_FALSE;
11873         }
11874
11875         p_data += l_current_nb_bytes_written;
11876         l_nb_bytes_written += l_current_nb_bytes_written;
11877         total_data_size -= l_current_nb_bytes_written;
11878         l_part_tile_size += l_current_nb_bytes_written;
11879
11880         /* Writing Psot in SOT marker */
11881         opj_write_bytes(l_begin_data + 6, l_part_tile_size,
11882                         4);                                   /* PSOT */
11883
11884         if (OPJ_IS_CINEMA(l_cp->rsiz)) {
11885             opj_j2k_update_tlm(p_j2k, l_part_tile_size);
11886         }
11887
11888         ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
11889     }
11890
11891     for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
11892         l_tcd->cur_pino = pino;
11893
11894         /*Get number of tile parts*/
11895         tot_num_tp = opj_j2k_get_num_tp(l_cp, pino, p_j2k->m_current_tile_number);
11896         for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
11897             p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
11898             l_current_nb_bytes_written = 0;
11899             l_part_tile_size = 0;
11900             l_begin_data = p_data;
11901
11902             if (! opj_j2k_write_sot(p_j2k, p_data,
11903                                     total_data_size,
11904                                     &l_current_nb_bytes_written, p_stream,
11905                                     p_manager)) {
11906                 return OPJ_FALSE;
11907             }
11908
11909             l_nb_bytes_written += l_current_nb_bytes_written;
11910             p_data += l_current_nb_bytes_written;
11911             total_data_size -= l_current_nb_bytes_written;
11912             l_part_tile_size += l_current_nb_bytes_written;
11913
11914             l_current_nb_bytes_written = 0;
11915
11916             if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
11917                                     total_data_size, p_stream, p_manager)) {
11918                 return OPJ_FALSE;
11919             }
11920
11921             l_nb_bytes_written += l_current_nb_bytes_written;
11922             p_data += l_current_nb_bytes_written;
11923             total_data_size -= l_current_nb_bytes_written;
11924             l_part_tile_size += l_current_nb_bytes_written;
11925
11926             /* Writing Psot in SOT marker */
11927             opj_write_bytes(l_begin_data + 6, l_part_tile_size,
11928                             4);                                   /* PSOT */
11929
11930             if (OPJ_IS_CINEMA(l_cp->rsiz)) {
11931                 opj_j2k_update_tlm(p_j2k, l_part_tile_size);
11932             }
11933
11934             ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
11935         }
11936     }
11937
11938     *p_data_written = l_nb_bytes_written;
11939
11940     return OPJ_TRUE;
11941 }
11942
11943 static OPJ_BOOL opj_j2k_write_updated_tlm(opj_j2k_t *p_j2k,
11944         struct opj_stream_private *p_stream,
11945         struct opj_event_mgr * p_manager)
11946 {
11947     OPJ_UINT32 l_tlm_size;
11948     OPJ_OFF_T l_tlm_position, l_current_position;
11949
11950     /* preconditions */
11951     assert(p_j2k != 00);
11952     assert(p_manager != 00);
11953     assert(p_stream != 00);
11954
11955     l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
11956     l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
11957     l_current_position = opj_stream_tell(p_stream);
11958
11959     if (! opj_stream_seek(p_stream, l_tlm_position, p_manager)) {
11960         return OPJ_FALSE;
11961     }
11962
11963     if (opj_stream_write_data(p_stream,
11964                               p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer, l_tlm_size,
11965                               p_manager) != l_tlm_size) {
11966         return OPJ_FALSE;
11967     }
11968
11969     if (! opj_stream_seek(p_stream, l_current_position, p_manager)) {
11970         return OPJ_FALSE;
11971     }
11972
11973     return OPJ_TRUE;
11974 }
11975
11976 static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
11977                                      struct opj_stream_private *p_stream,
11978                                      struct opj_event_mgr * p_manager)
11979 {
11980     /* preconditions */
11981     assert(p_j2k != 00);
11982     assert(p_manager != 00);
11983     assert(p_stream != 00);
11984
11985     OPJ_UNUSED(p_stream);
11986     OPJ_UNUSED(p_manager);
11987
11988     opj_tcd_destroy(p_j2k->m_tcd);
11989     p_j2k->m_tcd = 00;
11990
11991     if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
11992         opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
11993         p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
11994         p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
11995     }
11996
11997     if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
11998         opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
11999         p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
12000     }
12001
12002     p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
12003
12004     return OPJ_TRUE;
12005 }
12006
12007 /**
12008  * Destroys the memory associated with the decoding of headers.
12009  */
12010 static OPJ_BOOL opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,
12011         opj_stream_private_t *p_stream,
12012         opj_event_mgr_t * p_manager
12013                                              )
12014 {
12015     /* preconditions */
12016     assert(p_j2k != 00);
12017     assert(p_stream != 00);
12018     assert(p_manager != 00);
12019
12020     OPJ_UNUSED(p_stream);
12021     OPJ_UNUSED(p_manager);
12022
12023     if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
12024         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
12025         p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
12026     }
12027
12028     p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
12029
12030     return OPJ_TRUE;
12031 }
12032
12033 static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
12034                                   struct opj_stream_private *p_stream,
12035                                   struct opj_event_mgr * p_manager)
12036 {
12037     opj_codestream_info_t * l_cstr_info = 00;
12038
12039     /* preconditions */
12040     assert(p_j2k != 00);
12041     assert(p_manager != 00);
12042     assert(p_stream != 00);
12043     (void)l_cstr_info;
12044
12045     OPJ_UNUSED(p_stream);
12046
12047     /* TODO mergeV2: check this part which use cstr_info */
12048     /*l_cstr_info = p_j2k->cstr_info;
12049
12050     if (l_cstr_info)  {
12051             OPJ_UINT32 compno;
12052             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));
12053
12054             l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
12055             l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
12056
12057             l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
12058
12059             l_cstr_info->tw = p_j2k->m_cp.tw;
12060             l_cstr_info->th = p_j2k->m_cp.th;
12061
12062             l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/        /* new version parser */
12063     /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/      /* new version parser */
12064     /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/     /* new version parser */
12065     /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/     /* new version parser */
12066
12067     /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
12068
12069     l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
12070
12071     l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
12072
12073     for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
12074             l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
12075     }
12076
12077     l_cstr_info->D_max = 0.0;       */      /* ADD Marcela */
12078
12079     /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
12080
12081     /*l_cstr_info->maxmarknum = 100;
12082     l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
12083     l_cstr_info->marknum = 0;
12084     }*/
12085
12086     return opj_j2k_calculate_tp(p_j2k, &(p_j2k->m_cp),
12087                                 &p_j2k->m_specific_param.m_encoder.m_total_tile_parts, p_j2k->m_private_image,
12088                                 p_manager);
12089 }
12090
12091 /**
12092  * Creates a tile-coder encoder.
12093  *
12094  * @param       p_stream                the stream to write data to.
12095  * @param       p_j2k                   J2K codec.
12096  * @param       p_manager               the user event manager.
12097 */
12098 static OPJ_BOOL opj_j2k_create_tcd(opj_j2k_t *p_j2k,
12099                                    opj_stream_private_t *p_stream,
12100                                    opj_event_mgr_t * p_manager
12101                                   )
12102 {
12103     /* preconditions */
12104     assert(p_j2k != 00);
12105     assert(p_manager != 00);
12106     assert(p_stream != 00);
12107
12108     OPJ_UNUSED(p_stream);
12109
12110     p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
12111
12112     if (! p_j2k->m_tcd) {
12113         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
12114         return OPJ_FALSE;
12115     }
12116
12117     if (!opj_tcd_init(p_j2k->m_tcd, p_j2k->m_private_image, &p_j2k->m_cp,
12118                       p_j2k->m_tp)) {
12119         opj_tcd_destroy(p_j2k->m_tcd);
12120         p_j2k->m_tcd = 00;
12121         return OPJ_FALSE;
12122     }
12123
12124     return OPJ_TRUE;
12125 }
12126
12127 OPJ_BOOL opj_j2k_write_tile(opj_j2k_t * p_j2k,
12128                             OPJ_UINT32 p_tile_index,
12129                             OPJ_BYTE * p_data,
12130                             OPJ_UINT32 p_data_size,
12131                             opj_stream_private_t *p_stream,
12132                             opj_event_mgr_t * p_manager)
12133 {
12134     if (! opj_j2k_pre_write_tile(p_j2k, p_tile_index, p_stream, p_manager)) {
12135         opj_event_msg(p_manager, EVT_ERROR,
12136                       "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
12137         return OPJ_FALSE;
12138     } else {
12139         OPJ_UINT32 j;
12140         /* Allocate data */
12141         for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12142             opj_tcd_tilecomp_t* l_tilec = p_j2k->m_tcd->tcd_image->tiles->comps + j;
12143
12144             if (! opj_alloc_tile_component_data(l_tilec)) {
12145                 opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
12146                 return OPJ_FALSE;
12147             }
12148         }
12149
12150         /* now copy data into the tile component */
12151         if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
12152             opj_event_msg(p_manager, EVT_ERROR,
12153                           "Size mismatch between tile data and sent data.");
12154             return OPJ_FALSE;
12155         }
12156         if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
12157             opj_event_msg(p_manager, EVT_ERROR,
12158                           "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
12159             return OPJ_FALSE;
12160         }
12161     }
12162
12163     return OPJ_TRUE;
12164 }