[trunk] Updated checks regarding number of decomposition levels when compressing
[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  * All rights reserved.
20  *
21  * Redistribution and use in source and binary forms, with or without
22  * modification, are permitted provided that the following conditions
23  * are met:
24  * 1. Redistributions of source code must retain the above copyright
25  *    notice, this list of conditions and the following disclaimer.
26  * 2. Redistributions in binary form must reproduce the above copyright
27  *    notice, this list of conditions and the following disclaimer in the
28  *    documentation and/or other materials provided with the distribution.
29  *
30  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
31  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
34  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
35  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
36  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
37  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
38  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
39  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
40  * POSSIBILITY OF SUCH DAMAGE.
41  */
42
43 #include "opj_includes.h"
44
45 /** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
46 /*@{*/
47
48 /** @name Local static functions */
49 /*@{*/
50
51 /**
52  * Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures.
53  */
54 static void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k);
55
56 /**
57  * The read header procedure.
58  */
59 static OPJ_BOOL opj_j2k_read_header_procedure(  opj_j2k_t *p_j2k,
60                                                 opj_stream_private_t *p_stream,
61                                                 opj_event_mgr_t * p_manager);
62
63 /**
64  * The default encoding validation procedure without any extension.
65  *
66  * @param       p_j2k                   the jpeg2000 codec to validate.
67  * @param       p_stream                the input stream to validate.
68  * @param       p_manager               the user event manager.
69  *
70  * @return true if the parameters are correct.
71  */
72 static OPJ_BOOL opj_j2k_encoding_validation (   opj_j2k_t * p_j2k,
73                                                 opj_stream_private_t *p_stream,
74                                                 opj_event_mgr_t * p_manager );
75
76 /**
77  * The default decoding validation procedure without any extension.
78  *
79  * @param       p_j2k                   the jpeg2000 codec to validate.
80  * @param       p_stream                                the input stream to validate.
81  * @param       p_manager               the user event manager.
82  *
83  * @return true if the parameters are correct.
84  */
85 static OPJ_BOOL opj_j2k_decoding_validation (   opj_j2k_t * p_j2k,
86                                                 opj_stream_private_t *p_stream,
87                                                 opj_event_mgr_t * p_manager );
88
89 /**
90  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
91  * are valid. Developpers wanting to extend the library can add their own validation procedures.
92  */
93 static void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k);
94
95 /**
96  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
97  * are valid. Developpers wanting to extend the library can add their own validation procedures.
98  */
99 static void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k);
100
101 /**
102  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
103  * are valid. Developpers wanting to extend the library can add their own validation procedures.
104  */
105 static void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k);
106
107 /**
108  * The mct encoding validation procedure.
109  *
110  * @param       p_j2k                   the jpeg2000 codec to validate.
111  * @param       p_stream                                the input stream to validate.
112  * @param       p_manager               the user event manager.
113  *
114  * @return true if the parameters are correct.
115  */
116 static OPJ_BOOL opj_j2k_mct_validation (opj_j2k_t * p_j2k,
117                                         opj_stream_private_t *p_stream,
118                                         opj_event_mgr_t * p_manager );
119
120 /**
121  * Builds the tcd decoder to use to decode tile.
122  */
123 static OPJ_BOOL opj_j2k_build_decoder ( opj_j2k_t * p_j2k,
124                                         opj_stream_private_t *p_stream,
125                                         opj_event_mgr_t * p_manager );
126 /**
127  * Builds the tcd encoder to use to encode tile.
128  */
129 static OPJ_BOOL opj_j2k_build_encoder ( opj_j2k_t * p_j2k,
130                                         opj_stream_private_t *p_stream,
131                                         opj_event_mgr_t * p_manager );
132
133 /**
134  * Creates a tile-coder decoder.
135  *
136  * @param       p_stream                        the stream to write data to.
137  * @param       p_j2k                           J2K codec.
138  * @param       p_manager                   the user event manager.
139 */
140 static OPJ_BOOL opj_j2k_create_tcd(     opj_j2k_t *p_j2k,
141                                                                     opj_stream_private_t *p_stream,
142                                                                     opj_event_mgr_t * p_manager );
143
144 /**
145  * Excutes the given procedures on the given codec.
146  *
147  * @param       p_procedure_list        the list of procedures to execute
148  * @param       p_j2k                           the jpeg2000 codec to execute the procedures on.
149  * @param       p_stream                        the stream to execute the procedures on.
150  * @param       p_manager                       the user manager.
151  *
152  * @return      true                            if all the procedures were successfully executed.
153  */
154 static OPJ_BOOL opj_j2k_exec (  opj_j2k_t * p_j2k,
155                             opj_procedure_list_t * p_procedure_list,
156                             opj_stream_private_t *p_stream,
157                             opj_event_mgr_t * p_manager);
158
159 /**
160  * Updates the rates of the tcp.
161  *
162  * @param       p_stream                                the stream to write data to.
163  * @param       p_j2k                           J2K codec.
164  * @param       p_manager               the user event manager.
165 */
166 static OPJ_BOOL opj_j2k_update_rates(   opj_j2k_t *p_j2k,
167                                                                             opj_stream_private_t *p_stream,
168                                                                             opj_event_mgr_t * p_manager );
169
170 /**
171  * Copies the decoding tile parameters onto all the tile parameters.
172  * Creates also the tile decoder.
173  */
174 static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd (       opj_j2k_t * p_j2k,
175                                                             opj_stream_private_t *p_stream,
176                                                             opj_event_mgr_t * p_manager );
177
178 /**
179  * Destroys the memory associated with the decoding of headers.
180  */
181 static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,
182                                                 opj_stream_private_t *p_stream,
183                                                 opj_event_mgr_t * p_manager );
184
185 /**
186  * Reads the lookup table containing all the marker, status and action, and returns the handler associated
187  * with the marker value.
188  * @param       p_id            Marker value to look up
189  *
190  * @return      the handler associated with the id.
191 */
192 static const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler (OPJ_UINT32 p_id);
193
194 /**
195  * Destroys a tile coding parameter structure.
196  *
197  * @param       p_tcp           the tile coding parameter to destroy.
198  */
199 static void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp);
200
201 /**
202  * Destroys the data inside a tile coding parameter structure.
203  *
204  * @param       p_tcp           the tile coding parameter which contain data to destroy.
205  */
206 static void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp);
207
208 /**
209  * Destroys a coding parameter structure.
210  *
211  * @param       p_cp            the coding parameter to destroy.
212  */
213 static void opj_j2k_cp_destroy (opj_cp_t *p_cp);
214
215 /**
216  * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
217  *
218  * @param       p_j2k           J2K codec.
219  * @param       p_tile_no       FIXME DOC
220  * @param       p_comp_no       the component number to output.
221  * @param       p_data          FIXME DOC
222  * @param       p_header_size   FIXME DOC
223  * @param       p_manager       the user event manager.
224  *
225  * @return FIXME DOC
226 */
227 static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(      opj_j2k_t *p_j2k,
228                                                                                     OPJ_UINT32 p_tile_no,
229                                                                                     OPJ_UINT32 p_comp_no,
230                                                                                     OPJ_BYTE * p_data,
231                                                                                     OPJ_UINT32 * p_header_size,
232                                                                                     opj_event_mgr_t * p_manager );
233
234 /**
235  * Gets the size taken by writing a SPCod or SPCoc for the given tile and component.
236  *
237  * @param       p_j2k                   the J2K codec.
238  * @param       p_tile_no               the tile index.
239  * @param       p_comp_no               the component being outputted.
240  *
241  * @return      the number of bytes taken by the SPCod element.
242  */
243 static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (opj_j2k_t *p_j2k,
244                                                                                             OPJ_UINT32 p_tile_no,
245                                                                                             OPJ_UINT32 p_comp_no );
246
247 /**
248  * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
249  * @param       p_j2k           the jpeg2000 codec.
250  * @param       compno          FIXME DOC
251  * @param       p_header_data   the data contained in the COM box.
252  * @param       p_header_size   the size of the data contained in the COM marker.
253  * @param       p_manager       the user event manager.
254 */
255 static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(   opj_j2k_t *p_j2k,
256                                             OPJ_UINT32 compno,
257                                             OPJ_BYTE * p_header_data,
258                                             OPJ_UINT32 * p_header_size,
259                                             opj_event_mgr_t * p_manager );
260
261 /**
262  * Gets the size taken by writing SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
263  *
264  * @param       p_tile_no               the tile index.
265  * @param       p_comp_no               the component being outputted.
266  * @param       p_j2k                   the J2K codec.
267  *
268  * @return      the number of bytes taken by the SPCod element.
269  */
270 static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size (  opj_j2k_t *p_j2k,
271                                                                                     OPJ_UINT32 p_tile_no,
272                                                                                     OPJ_UINT32 p_comp_no );
273
274 /**
275  * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
276  *
277  * @param       p_tile_no               the tile to output.
278  * @param       p_comp_no               the component number to output.
279  * @param       p_data                  the data buffer.
280  * @param       p_header_size   pointer to the size of the data buffer, it is changed by the function.
281  * @param       p_j2k                   J2K codec.
282  * @param       p_manager               the user event manager.
283  *
284 */
285 static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
286                                                                             OPJ_UINT32 p_tile_no,
287                                                                             OPJ_UINT32 p_comp_no,
288                                                                             OPJ_BYTE * p_data,
289                                                                             OPJ_UINT32 * p_header_size,
290                                                                             opj_event_mgr_t * p_manager);
291
292 /**
293  * Updates the Tile Length Marker.
294  */
295 static void opj_j2k_update_tlm ( opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size);
296
297 /**
298  * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
299  *
300  * @param       p_j2k           J2K codec.
301  * @param       compno          the component number to output.
302  * @param       p_header_data   the data buffer.
303  * @param       p_header_size   pointer to the size of the data buffer, it is changed by the function.
304  * @param       p_manager       the user event manager.
305  *
306 */
307 static OPJ_BOOL opj_j2k_read_SQcd_SQcc( opj_j2k_t *p_j2k,
308                                         OPJ_UINT32 compno,
309                                         OPJ_BYTE * p_header_data,
310                                         OPJ_UINT32 * p_header_size,
311                                         opj_event_mgr_t * p_manager );
312
313 /**
314  * Copies the tile component parameters of all the component from the first tile component.
315  *
316  * @param               p_j2k           the J2k codec.
317  */
318 static void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k );
319
320 /**
321  * Copies the tile quantization parameters of all the component from the first tile component.
322  *
323  * @param               p_j2k           the J2k codec.
324  */
325 static void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k );
326
327 /**
328  * Reads the tiles.
329  */
330 static OPJ_BOOL opj_j2k_decode_tiles (  opj_j2k_t *p_j2k,
331                                         opj_stream_private_t *p_stream,
332                                         opj_event_mgr_t * p_manager);
333
334 static OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k,
335                                                                              OPJ_UINT32 p_tile_index,
336                                                                              opj_stream_private_t *p_stream,
337                                                                              opj_event_mgr_t * p_manager );
338
339 static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image);
340
341 static void opj_get_tile_dimensions(opj_image_t * l_image,
342                                                                                                                                                 opj_tcd_tilecomp_t * l_tilec,
343                                                                                                                                                 opj_image_comp_t * l_img_comp,
344                                                                                                                                                 OPJ_UINT32* l_size_comp,
345                                                                                                                                                 OPJ_UINT32* l_width,
346                                                                                                                                                 OPJ_UINT32* l_height,
347                                                                                                                                                 OPJ_UINT32* l_offset_x,
348                                                                                                                                                 OPJ_UINT32* l_offset_y,
349                                                                                                                                                 OPJ_UINT32* l_image_width,
350                                                                                                                                                 OPJ_UINT32* l_stride,
351                                                                                                                                                 OPJ_UINT32* l_tile_offset);
352
353 static void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
354
355 static OPJ_BOOL opj_j2k_post_write_tile (opj_j2k_t * p_j2k,
356                                                                              opj_stream_private_t *p_stream,
357                                                                              opj_event_mgr_t * p_manager );
358
359 /**
360  * Sets up the procedures to do on writing header.
361  * Developers wanting to extend the library can add their own writing procedures.
362  */
363 static void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k);
364
365 static OPJ_BOOL opj_j2k_write_first_tile_part(  opj_j2k_t *p_j2k,
366                                                                                             OPJ_BYTE * p_data,
367                                                                                             OPJ_UINT32 * p_data_written,
368                                                                                             OPJ_UINT32 p_total_data_size,
369                                                                                             opj_stream_private_t *p_stream,
370                                                                                             struct opj_event_mgr * p_manager );
371
372 static OPJ_BOOL opj_j2k_write_all_tile_parts(   opj_j2k_t *p_j2k,
373                                                                                             OPJ_BYTE * p_data,
374                                                                                             OPJ_UINT32 * p_data_written,
375                                                                                             OPJ_UINT32 p_total_data_size,
376                                                                                             opj_stream_private_t *p_stream,
377                                                                                             struct opj_event_mgr * p_manager );
378
379 /**
380  * Gets the offset of the header.
381  *
382  * @param       p_stream                the stream to write data to.
383  * @param       p_j2k                   J2K codec.
384  * @param       p_manager               the user event manager.
385 */
386 static OPJ_BOOL opj_j2k_get_end_header( opj_j2k_t *p_j2k,
387                                         opj_stream_private_t *p_stream,
388                                         opj_event_mgr_t * p_manager );
389
390 static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k);
391
392 /*
393  * -----------------------------------------------------------------------
394  * -----------------------------------------------------------------------
395  * -----------------------------------------------------------------------
396  */
397
398 /**
399  * Writes the SOC marker (Start Of Codestream)
400  *
401  * @param       p_stream                        the stream to write data to.
402  * @param       p_j2k                   J2K codec.
403  * @param       p_manager       the user event manager.
404 */
405 static OPJ_BOOL opj_j2k_write_soc(      opj_j2k_t *p_j2k,
406                                                         opj_stream_private_t *p_stream,
407                                                             opj_event_mgr_t * p_manager );
408
409 /**
410  * Reads a SOC marker (Start of Codestream)
411  * @param       p_j2k           the jpeg2000 file codec.
412  * @param       p_stream        XXX needs data
413  * @param       p_manager       the user event manager.
414 */
415 static OPJ_BOOL opj_j2k_read_soc(   opj_j2k_t *p_j2k,
416                                     opj_stream_private_t *p_stream,
417                                     opj_event_mgr_t * p_manager );
418
419 /**
420  * Writes the SIZ marker (image and tile size)
421  *
422  * @param       p_j2k           J2K codec.
423  * @param       p_stream        the stream to write data to.
424  * @param       p_manager       the user event manager.
425 */
426 static OPJ_BOOL opj_j2k_write_siz(      opj_j2k_t *p_j2k,
427                                                                 opj_stream_private_t *p_stream,
428                                                                 opj_event_mgr_t * p_manager );
429
430 /**
431  * Reads a SIZ marker (image and tile size)
432  * @param       p_j2k           the jpeg2000 file codec.
433  * @param       p_header_data   the data contained in the SIZ box.
434  * @param       p_header_size   the size of the data contained in the SIZ marker.
435  * @param       p_manager       the user event manager.
436 */
437 static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
438                                  OPJ_BYTE * p_header_data,
439                                  OPJ_UINT32 p_header_size,
440                                  opj_event_mgr_t * p_manager);
441
442 /**
443  * Writes the COM marker (comment)
444  *
445  * @param       p_stream                        the stream to write data to.
446  * @param       p_j2k                   J2K codec.
447  * @param       p_manager       the user event manager.
448 */
449 static OPJ_BOOL opj_j2k_write_com(      opj_j2k_t *p_j2k,
450                                                                         opj_stream_private_t *p_stream,
451                                                                         opj_event_mgr_t * p_manager );
452
453 /**
454  * Reads a COM marker (comments)
455  * @param       p_j2k           the jpeg2000 file codec.
456  * @param       p_header_data   the data contained in the COM box.
457  * @param       p_header_size   the size of the data contained in the COM marker.
458  * @param       p_manager       the user event manager.
459 */
460 static OPJ_BOOL opj_j2k_read_com (  opj_j2k_t *p_j2k,
461                                     OPJ_BYTE * p_header_data,
462                                     OPJ_UINT32 p_header_size,
463                                     opj_event_mgr_t * p_manager );
464 /**
465  * Writes the COD marker (Coding style default)
466  *
467  * @param       p_stream                        the stream to write data to.
468  * @param       p_j2k                   J2K codec.
469  * @param       p_manager       the user event manager.
470 */
471 static OPJ_BOOL opj_j2k_write_cod(      opj_j2k_t *p_j2k,
472                                                                         opj_stream_private_t *p_stream,
473                                                                         opj_event_mgr_t * p_manager );
474
475 /**
476  * Reads a COD marker (Coding Styke defaults)
477  * @param       p_header_data   the data contained in the COD box.
478  * @param       p_j2k                   the jpeg2000 codec.
479  * @param       p_header_size   the size of the data contained in the COD marker.
480  * @param       p_manager               the user event manager.
481 */
482 static OPJ_BOOL opj_j2k_read_cod (  opj_j2k_t *p_j2k,
483                                     OPJ_BYTE * p_header_data,
484                                     OPJ_UINT32 p_header_size,
485                                     opj_event_mgr_t * p_manager);
486
487 #if 0
488 /**
489  * Writes the COC marker (Coding style component)
490  *
491  * @param       p_j2k       J2K codec.
492  * @param       p_comp_no   the index of the component to output.
493  * @param       p_stream    the stream to write data to.
494  * @param       p_manager   the user event manager.
495 */
496 static OPJ_BOOL opj_j2k_write_coc(  opj_j2k_t *p_j2k,
497                                                                 OPJ_UINT32 p_comp_no,
498                                                                 opj_stream_private_t *p_stream,
499                                                                 opj_event_mgr_t * p_manager );
500 #endif
501
502 #if 0
503 /**
504  * Writes the COC marker (Coding style component)
505  *
506  * @param       p_j2k                   J2K codec.
507  * @param       p_comp_no               the index of the component to output.
508  * @param       p_data          FIXME DOC
509  * @param       p_data_written  FIXME DOC
510  * @param       p_manager               the user event manager.
511 */
512 static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
513                                                                             OPJ_UINT32 p_comp_no,
514                                                                             OPJ_BYTE * p_data,
515                                                                             OPJ_UINT32 * p_data_written,
516                                                                             opj_event_mgr_t * p_manager );
517 #endif
518
519 /**
520  * Gets the maximum size taken by a coc.
521  *
522  * @param       p_j2k   the jpeg2000 codec to use.
523  */
524 static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k);
525
526 /**
527  * Reads a COC marker (Coding Style Component)
528  * @param       p_header_data   the data contained in the COC box.
529  * @param       p_j2k                   the jpeg2000 codec.
530  * @param       p_header_size   the size of the data contained in the COC marker.
531  * @param       p_manager               the user event manager.
532 */
533 static OPJ_BOOL opj_j2k_read_coc (  opj_j2k_t *p_j2k,
534                                     OPJ_BYTE * p_header_data,
535                                     OPJ_UINT32 p_header_size,
536                                     opj_event_mgr_t * p_manager );
537
538 /**
539  * Writes the QCD marker (quantization default)
540  *
541  * @param       p_j2k                   J2K codec.
542  * @param       p_stream                the stream to write data to.
543  * @param       p_manager               the user event manager.
544 */
545 static OPJ_BOOL opj_j2k_write_qcd(      opj_j2k_t *p_j2k,
546                                                                         opj_stream_private_t *p_stream,
547                                                                         opj_event_mgr_t * p_manager );
548
549 /**
550  * Reads a QCD marker (Quantization defaults)
551  * @param       p_header_data   the data contained in the QCD box.
552  * @param       p_j2k                   the jpeg2000 codec.
553  * @param       p_header_size   the size of the data contained in the QCD marker.
554  * @param       p_manager               the user event manager.
555 */
556 static OPJ_BOOL opj_j2k_read_qcd (  opj_j2k_t *p_j2k,
557                                     OPJ_BYTE * p_header_data,
558                                     OPJ_UINT32 p_header_size,
559                                     opj_event_mgr_t * p_manager );
560 #if 0
561 /**
562  * Writes the QCC marker (quantization component)
563  *
564  * @param       p_comp_no       the index of the component to output.
565  * @param       p_stream                the stream to write data to.
566  * @param       p_j2k                   J2K codec.
567  * @param       p_manager               the user event manager.
568 */
569 static OPJ_BOOL opj_j2k_write_qcc(      opj_j2k_t *p_j2k,
570                                                                         OPJ_UINT32 p_comp_no,
571                                                                         opj_stream_private_t *p_stream,
572                                                                         opj_event_mgr_t * p_manager );
573 #endif
574
575 #if 0
576 /**
577  * Writes the QCC marker (quantization component)
578  *
579  * @param       p_j2k           J2K codec.
580  * @param       p_comp_no       the index of the component to output.
581  * @param       p_data          FIXME DOC
582  * @param       p_data_written  the stream to write data to.
583  * @param       p_manager       the user event manager.
584 */
585 static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
586                                                                             OPJ_UINT32 p_comp_no,
587                                                                             OPJ_BYTE * p_data,
588                                                                             OPJ_UINT32 * p_data_written,
589                                                                             opj_event_mgr_t * p_manager );
590 #endif
591
592 /**
593  * Gets the maximum size taken by a qcc.
594  */
595 static OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k);
596
597 /**
598  * Reads a QCC marker (Quantization component)
599  * @param       p_header_data   the data contained in the QCC box.
600  * @param       p_j2k                   the jpeg2000 codec.
601  * @param       p_header_size   the size of the data contained in the QCC marker.
602  * @param       p_manager               the user event manager.
603 */
604 static OPJ_BOOL opj_j2k_read_qcc(   opj_j2k_t *p_j2k,
605                                     OPJ_BYTE * p_header_data,
606                                     OPJ_UINT32 p_header_size,
607                                     opj_event_mgr_t * p_manager);
608 /**
609  * Writes the POC marker (Progression Order Change)
610  *
611  * @param       p_stream                                the stream to write data to.
612  * @param       p_j2k                           J2K codec.
613  * @param       p_manager               the user event manager.
614 */
615 static OPJ_BOOL opj_j2k_write_poc(      opj_j2k_t *p_j2k,
616                                                                         opj_stream_private_t *p_stream,
617                                                                         opj_event_mgr_t * p_manager );
618 /**
619  * Writes the POC marker (Progression Order Change)
620  *
621  * @param       p_j2k          J2K codec.
622  * @param       p_data         FIXME DOC
623  * @param       p_data_written the stream to write data to.
624  * @param       p_manager      the user event manager.
625  */
626 static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
627                                                                             OPJ_BYTE * p_data,
628                                                                             OPJ_UINT32 * p_data_written,
629                                                                             opj_event_mgr_t * p_manager );
630 /**
631  * Gets the maximum size taken by the writing of a POC.
632  */
633 static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k);
634
635 /**
636  * Reads a POC marker (Progression Order Change)
637  *
638  * @param       p_header_data   the data contained in the POC box.
639  * @param       p_j2k                   the jpeg2000 codec.
640  * @param       p_header_size   the size of the data contained in the POC marker.
641  * @param       p_manager               the user event manager.
642 */
643 static OPJ_BOOL opj_j2k_read_poc (  opj_j2k_t *p_j2k,
644                                     OPJ_BYTE * p_header_data,
645                                     OPJ_UINT32 p_header_size,
646                                     opj_event_mgr_t * p_manager );
647
648 /**
649  * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.
650  */
651 static OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k);
652
653 /**
654  * Gets the maximum size taken by the headers of the SOT.
655  *
656  * @param       p_j2k   the jpeg2000 codec to use.
657  */
658 static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k);
659
660 /**
661  * Reads a CRG marker (Component registration)
662  *
663  * @param       p_header_data   the data contained in the TLM box.
664  * @param       p_j2k                   the jpeg2000 codec.
665  * @param       p_header_size   the size of the data contained in the TLM marker.
666  * @param       p_manager               the user event manager.
667 */
668 static OPJ_BOOL opj_j2k_read_crg (  opj_j2k_t *p_j2k,
669                                     OPJ_BYTE * p_header_data,
670                                     OPJ_UINT32 p_header_size,
671                                     opj_event_mgr_t * p_manager );
672 /**
673  * Reads a TLM marker (Tile Length Marker)
674  *
675  * @param       p_header_data   the data contained in the TLM box.
676  * @param       p_j2k                   the jpeg2000 codec.
677  * @param       p_header_size   the size of the data contained in the TLM marker.
678  * @param       p_manager               the user event manager.
679 */
680 static OPJ_BOOL opj_j2k_read_tlm (  opj_j2k_t *p_j2k,
681                                     OPJ_BYTE * p_header_data,
682                                     OPJ_UINT32 p_header_size,
683                                     opj_event_mgr_t * p_manager);
684
685 /**
686  * Writes the updated tlm.
687  *
688  * @param       p_stream                the stream to write data to.
689  * @param       p_j2k                   J2K codec.
690  * @param       p_manager               the user event manager.
691 */
692 static OPJ_BOOL opj_j2k_write_updated_tlm(      opj_j2k_t *p_j2k,
693                                             opj_stream_private_t *p_stream,
694                                             opj_event_mgr_t * p_manager );
695
696 /**
697  * Reads a PLM marker (Packet length, main header marker)
698  *
699  * @param       p_header_data   the data contained in the TLM box.
700  * @param       p_j2k                   the jpeg2000 codec.
701  * @param       p_header_size   the size of the data contained in the TLM marker.
702  * @param       p_manager               the user event manager.
703 */
704 static OPJ_BOOL opj_j2k_read_plm (  opj_j2k_t *p_j2k,
705                                     OPJ_BYTE * p_header_data,
706                                     OPJ_UINT32 p_header_size,
707                                     opj_event_mgr_t * p_manager);
708 /**
709  * Reads a PLT marker (Packet length, tile-part header)
710  *
711  * @param       p_header_data   the data contained in the PLT box.
712  * @param       p_j2k                   the jpeg2000 codec.
713  * @param       p_header_size   the size of the data contained in the PLT marker.
714  * @param       p_manager               the user event manager.
715 */
716 static OPJ_BOOL opj_j2k_read_plt (  opj_j2k_t *p_j2k,
717                                     OPJ_BYTE * p_header_data,
718                                     OPJ_UINT32 p_header_size,
719                                     opj_event_mgr_t * p_manager );
720
721 #if 0
722 /**
723  * Reads a PPM marker (Packed packet headers, main header)
724  *
725  * @param       p_header_data   the data contained in the POC box.
726  * @param       p_j2k                   the jpeg2000 codec.
727  * @param       p_header_size   the size of the data contained in the POC marker.
728  * @param       p_manager               the user event manager.
729 */
730 static OPJ_BOOL j2k_read_ppm_v2 (
731                                                 opj_j2k_t *p_j2k,
732                                                 OPJ_BYTE * p_header_data,
733                                                 OPJ_UINT32 p_header_size,
734                                                 struct opj_event_mgr * p_manager
735                                         );
736 #endif
737
738 static OPJ_BOOL j2k_read_ppm_v3 (
739                                                 opj_j2k_t *p_j2k,
740                                                 OPJ_BYTE * p_header_data,
741                                                 OPJ_UINT32 p_header_size,
742                                                 opj_event_mgr_t * p_manager );
743
744 /**
745  * Reads a PPT marker (Packed packet headers, tile-part header)
746  *
747  * @param       p_header_data   the data contained in the PPT box.
748  * @param       p_j2k                   the jpeg2000 codec.
749  * @param       p_header_size   the size of the data contained in the PPT marker.
750  * @param       p_manager               the user event manager.
751 */
752 static OPJ_BOOL opj_j2k_read_ppt (  opj_j2k_t *p_j2k,
753                                     OPJ_BYTE * p_header_data,
754                                     OPJ_UINT32 p_header_size,
755                                     opj_event_mgr_t * p_manager );
756 /**
757  * Writes the TLM marker (Tile Length Marker)
758  *
759  * @param       p_stream                                the stream to write data to.
760  * @param       p_j2k                           J2K codec.
761  * @param       p_manager               the user event manager.
762 */
763 static OPJ_BOOL opj_j2k_write_tlm(      opj_j2k_t *p_j2k,
764                                                                         opj_stream_private_t *p_stream,
765                                                                         opj_event_mgr_t * p_manager );
766
767 /**
768  * Writes the SOT marker (Start of tile-part)
769  *
770  * @param       p_j2k            J2K codec.
771  * @param       p_data           FIXME DOC
772  * @param       p_data_written   FIXME DOC
773  * @param       p_stream         the stream to write data to.
774  * @param       p_manager        the user event manager.
775 */
776 static OPJ_BOOL opj_j2k_write_sot(      opj_j2k_t *p_j2k,
777                                                                         OPJ_BYTE * p_data,
778                                                                         OPJ_UINT32 * p_data_written,
779                                                                         const opj_stream_private_t *p_stream,
780                                                                         opj_event_mgr_t * p_manager );
781
782 /**
783  * Reads a PPT marker (Packed packet headers, tile-part header)
784  *
785  * @param       p_header_data   the data contained in the PPT box.
786  * @param       p_j2k                   the jpeg2000 codec.
787  * @param       p_header_size   the size of the data contained in the PPT marker.
788  * @param       p_manager               the user event manager.
789 */
790 static OPJ_BOOL opj_j2k_read_sot (  opj_j2k_t *p_j2k,
791                                     OPJ_BYTE * p_header_data,
792                                     OPJ_UINT32 p_header_size,
793                                     opj_event_mgr_t * p_manager );
794 /**
795  * Writes the SOD marker (Start of data)
796  *
797  * @param       p_j2k               J2K codec.
798  * @param       p_tile_coder        FIXME DOC
799  * @param       p_data              FIXME DOC
800  * @param       p_data_written      FIXME DOC
801  * @param       p_total_data_size   FIXME DOC
802  * @param       p_stream            the stream to write data to.
803  * @param       p_manager           the user event manager.
804 */
805 static OPJ_BOOL opj_j2k_write_sod(      opj_j2k_t *p_j2k,
806                                                                         opj_tcd_t * p_tile_coder,
807                                                                         OPJ_BYTE * p_data,
808                                                                         OPJ_UINT32 * p_data_written,
809                                                                         OPJ_UINT32 p_total_data_size,
810                                                                         const opj_stream_private_t *p_stream,
811                                                                         opj_event_mgr_t * p_manager );
812
813 /**
814  * Reads a SOD marker (Start Of Data)
815  *
816  * @param       p_j2k                   the jpeg2000 codec.
817  * @param       p_stream                FIXME DOC
818  * @param       p_manager               the user event manager.
819 */
820 static OPJ_BOOL opj_j2k_read_sod(   opj_j2k_t *p_j2k,
821                                     opj_stream_private_t *p_stream,
822                                     opj_event_mgr_t * p_manager );
823
824 void opj_j2k_update_tlm (opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size )
825 {
826         opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_j2k->m_current_tile_number,1);            /* PSOT */
827         ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current;
828
829         opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_tile_part_size,4);                                        /* PSOT */
830         p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
831 }
832
833 /**
834  * Writes the RGN marker (Region Of Interest)
835  *
836  * @param       p_tile_no               the tile to output
837  * @param       p_comp_no               the component to output
838  * @param       nb_comps                the number of components
839  * @param       p_stream                the stream to write data to.
840  * @param       p_j2k                   J2K codec.
841  * @param       p_manager               the user event manager.
842 */
843 static OPJ_BOOL opj_j2k_write_rgn(  opj_j2k_t *p_j2k,
844                                     OPJ_UINT32 p_tile_no,
845                                     OPJ_UINT32 p_comp_no,
846                                     OPJ_UINT32 nb_comps,
847                                     opj_stream_private_t *p_stream,
848                                     opj_event_mgr_t * p_manager );
849
850 /**
851  * Reads a RGN marker (Region Of Interest)
852  *
853  * @param       p_header_data   the data contained in the POC box.
854  * @param       p_j2k                   the jpeg2000 codec.
855  * @param       p_header_size   the size of the data contained in the POC marker.
856  * @param       p_manager               the user event manager.
857 */
858 static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,
859                                   OPJ_BYTE * p_header_data,
860                                   OPJ_UINT32 p_header_size,
861                                   opj_event_mgr_t * p_manager );
862
863 /**
864  * Writes the EOC marker (End of Codestream)
865  *
866  * @param       p_stream                the stream to write data to.
867  * @param       p_j2k                   J2K codec.
868  * @param       p_manager               the user event manager.
869 */
870 static OPJ_BOOL opj_j2k_write_eoc(      opj_j2k_t *p_j2k,
871                                     opj_stream_private_t *p_stream,
872                                     opj_event_mgr_t * p_manager );
873
874 #if 0
875 /**
876  * Reads a EOC marker (End Of Codestream)
877  *
878  * @param       p_j2k                   the jpeg2000 codec.
879  * @param       p_stream                FIXME DOC
880  * @param       p_manager               the user event manager.
881 */
882 static OPJ_BOOL opj_j2k_read_eoc (      opj_j2k_t *p_j2k,
883                                                                 opj_stream_private_t *p_stream,
884                                                                 opj_event_mgr_t * p_manager );
885 #endif
886
887 /**
888  * Writes the CBD-MCT-MCC-MCO markers (Multi components transform)
889  *
890  * @param       p_stream                        the stream to write data to.
891  * @param       p_j2k                   J2K codec.
892  * @param       p_manager       the user event manager.
893 */
894 static OPJ_BOOL opj_j2k_write_mct_data_group(   opj_j2k_t *p_j2k,
895                                                 opj_stream_private_t *p_stream,
896                                                 opj_event_mgr_t * p_manager );
897
898 /**
899  * Inits the Info
900  *
901  * @param       p_stream                the stream to write data to.
902  * @param       p_j2k                   J2K codec.
903  * @param       p_manager               the user event manager.
904 */
905 static OPJ_BOOL opj_j2k_init_info(      opj_j2k_t *p_j2k,
906                                     opj_stream_private_t *p_stream,
907                                     opj_event_mgr_t * p_manager );
908
909 /**
910 Add main header marker information
911 @param cstr_index    Codestream information structure
912 @param type         marker type
913 @param pos          byte offset of marker segment
914 @param len          length of marker segment
915  */
916 static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;
917 /**
918 Add tile header marker information
919 @param tileno       tile index number
920 @param cstr_index   Codestream information structure
921 @param type         marker type
922 @param pos          byte offset of marker segment
923 @param len          length of marker segment
924  */
925 static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len);
926
927 /**
928  * Reads an unknown marker
929  *
930  * @param       p_j2k                   the jpeg2000 codec.
931  * @param       p_stream                the stream object to read from.
932  * @param       output_marker           FIXME DOC
933  * @param       p_manager               the user event manager.
934  *
935  * @return      true                    if the marker could be deduced.
936 */
937 static OPJ_BOOL opj_j2k_read_unk( opj_j2k_t *p_j2k,
938                                   opj_stream_private_t *p_stream,
939                                   OPJ_UINT32 *output_marker,
940                                   opj_event_mgr_t * p_manager );
941
942 /**
943  * Writes the MCT marker (Multiple Component Transform)
944  *
945  * @param       p_j2k           J2K codec.
946  * @param       p_mct_record    FIXME DOC
947  * @param       p_stream        the stream to write data to.
948  * @param       p_manager       the user event manager.
949 */
950 static OPJ_BOOL opj_j2k_write_mct_record(       opj_j2k_t *p_j2k,
951                                                                                     opj_mct_data_t * p_mct_record,
952                                             opj_stream_private_t *p_stream,
953                                             opj_event_mgr_t * p_manager );
954
955 /**
956  * Reads a MCT marker (Multiple Component Transform)
957  *
958  * @param       p_header_data   the data contained in the MCT box.
959  * @param       p_j2k                   the jpeg2000 codec.
960  * @param       p_header_size   the size of the data contained in the MCT marker.
961  * @param       p_manager               the user event manager.
962 */
963 static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
964                                                                     OPJ_BYTE * p_header_data,
965                                                                     OPJ_UINT32 p_header_size,
966                                                                     opj_event_mgr_t * p_manager );
967
968 /**
969  * Writes the MCC marker (Multiple Component Collection)
970  *
971  * @param       p_j2k                   J2K codec.
972  * @param       p_mcc_record            FIXME DOC
973  * @param       p_stream                the stream to write data to.
974  * @param       p_manager               the user event manager.
975 */
976 static OPJ_BOOL opj_j2k_write_mcc_record(   opj_j2k_t *p_j2k,
977                                             opj_simple_mcc_decorrelation_data_t * p_mcc_record,
978                                             opj_stream_private_t *p_stream,
979                                             opj_event_mgr_t * p_manager );
980
981 /**
982  * Reads a MCC marker (Multiple Component Collection)
983  *
984  * @param       p_header_data   the data contained in the MCC box.
985  * @param       p_j2k                   the jpeg2000 codec.
986  * @param       p_header_size   the size of the data contained in the MCC marker.
987  * @param       p_manager               the user event manager.
988 */
989 static OPJ_BOOL opj_j2k_read_mcc (      opj_j2k_t *p_j2k,
990                                                                     OPJ_BYTE * p_header_data,
991                                                                     OPJ_UINT32 p_header_size,
992                                                                     opj_event_mgr_t * p_manager );
993
994 /**
995  * Writes the MCO marker (Multiple component transformation ordering)
996  *
997  * @param       p_stream                                the stream to write data to.
998  * @param       p_j2k                           J2K codec.
999  * @param       p_manager               the user event manager.
1000 */
1001 static OPJ_BOOL opj_j2k_write_mco(      opj_j2k_t *p_j2k,
1002                                     opj_stream_private_t *p_stream,
1003                                     opj_event_mgr_t * p_manager );
1004
1005 /**
1006  * Reads a MCO marker (Multiple Component Transform Ordering)
1007  *
1008  * @param       p_header_data   the data contained in the MCO box.
1009  * @param       p_j2k                   the jpeg2000 codec.
1010  * @param       p_header_size   the size of the data contained in the MCO marker.
1011  * @param       p_manager               the user event manager.
1012 */
1013 static OPJ_BOOL opj_j2k_read_mco (      opj_j2k_t *p_j2k,
1014                                                                     OPJ_BYTE * p_header_data,
1015                                                                     OPJ_UINT32 p_header_size,
1016                                                                     opj_event_mgr_t * p_manager );
1017
1018 static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index);
1019
1020 static void  opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1021 static void  opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1022 static void  opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1023 static void  opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1024
1025 static void  opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1026 static void  opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1027 static void  opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1028 static void  opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1029
1030 static void  opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1031 static void  opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1032 static void  opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1033 static void  opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1034
1035 /**
1036  * Ends the encoding, i.e. frees memory.
1037  *
1038  * @param       p_stream                the stream to write data to.
1039  * @param       p_j2k                   J2K codec.
1040  * @param       p_manager               the user event manager.
1041 */
1042 static OPJ_BOOL opj_j2k_end_encoding(   opj_j2k_t *p_j2k,
1043                                                                             opj_stream_private_t *p_stream,
1044                                                                             opj_event_mgr_t * p_manager );
1045
1046 /**
1047  * Writes the CBD marker (Component bit depth definition)
1048  *
1049  * @param       p_stream                                the stream to write data to.
1050  * @param       p_j2k                           J2K codec.
1051  * @param       p_manager               the user event manager.
1052 */
1053 static OPJ_BOOL opj_j2k_write_cbd(      opj_j2k_t *p_j2k,
1054                                                                     opj_stream_private_t *p_stream,
1055                                                                         opj_event_mgr_t * p_manager );
1056
1057 /**
1058  * Reads a CBD marker (Component bit depth definition)
1059  * @param       p_header_data   the data contained in the CBD box.
1060  * @param       p_j2k                   the jpeg2000 codec.
1061  * @param       p_header_size   the size of the data contained in the CBD marker.
1062  * @param       p_manager               the user event manager.
1063 */
1064 static OPJ_BOOL opj_j2k_read_cbd (      opj_j2k_t *p_j2k,
1065                                                                 OPJ_BYTE * p_header_data,
1066                                                                 OPJ_UINT32 p_header_size,
1067                                                                 opj_event_mgr_t * p_manager);
1068
1069 #if 0
1070 /**
1071  * Writes COC marker for each component.
1072  *
1073  * @param       p_stream                the stream to write data to.
1074  * @param       p_j2k                   J2K codec.
1075  * @param       p_manager               the user event manager.
1076 */
1077 static OPJ_BOOL opj_j2k_write_all_coc( opj_j2k_t *p_j2k,
1078                                                                         opj_stream_private_t *p_stream,
1079                                                                         opj_event_mgr_t * p_manager );
1080 #endif
1081
1082 #if 0
1083 /**
1084  * Writes QCC marker for each component.
1085  *
1086  * @param       p_stream                the stream to write data to.
1087  * @param       p_j2k                   J2K codec.
1088  * @param       p_manager               the user event manager.
1089 */
1090 static OPJ_BOOL opj_j2k_write_all_qcc( opj_j2k_t *p_j2k,
1091                                                                         opj_stream_private_t *p_stream,
1092                                                                         opj_event_mgr_t * p_manager );
1093 #endif
1094
1095 /**
1096  * Writes regions of interests.
1097  *
1098  * @param       p_stream                the stream to write data to.
1099  * @param       p_j2k                   J2K codec.
1100  * @param       p_manager               the user event manager.
1101 */
1102 static OPJ_BOOL opj_j2k_write_regions(  opj_j2k_t *p_j2k,
1103                                                                         opj_stream_private_t *p_stream,
1104                                                                         opj_event_mgr_t * p_manager );
1105
1106 /**
1107  * Writes EPC ????
1108  *
1109  * @param       p_stream                the stream to write data to.
1110  * @param       p_j2k                   J2K codec.
1111  * @param       p_manager               the user event manager.
1112 */
1113 static OPJ_BOOL opj_j2k_write_epc(      opj_j2k_t *p_j2k,
1114                                                                     opj_stream_private_t *p_stream,
1115                                                                     opj_event_mgr_t * p_manager );
1116
1117 /**
1118  * Checks the progression order changes values. Tells of the poc given as input are valid.
1119  * A nice message is outputted at errors.
1120  *
1121  * @param       p_pocs                  the progression order changes.
1122  * @param       p_nb_pocs               the number of progression order changes.
1123  * @param       p_nb_resolutions        the number of resolutions.
1124  * @param       numcomps                the number of components
1125  * @param       numlayers               the number of layers.
1126  * @param       p_manager               the user event manager.
1127  *
1128  * @return      true if the pocs are valid.
1129  */
1130 static OPJ_BOOL opj_j2k_check_poc_val(  const opj_poc_t *p_pocs,
1131                                                                             OPJ_UINT32 p_nb_pocs,
1132                                                                             OPJ_UINT32 p_nb_resolutions,
1133                                                                             OPJ_UINT32 numcomps,
1134                                                                             OPJ_UINT32 numlayers,
1135                                                                             opj_event_mgr_t * p_manager);
1136
1137 /**
1138  * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
1139  *
1140  * @param               cp                      the coding parameters.
1141  * @param               pino            the offset of the given poc (i.e. its position in the coding parameter).
1142  * @param               tileno          the given tile.
1143  *
1144  * @return              the number of tile parts.
1145  */
1146 static OPJ_UINT32 opj_j2k_get_num_tp( opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno);
1147
1148 /**
1149  * Calculates the total number of tile parts needed by the encoder to
1150  * encode such an image. If not enough memory is available, then the function return false.
1151  *
1152  * @param       p_nb_tiles      pointer that will hold the number of tile parts.
1153  * @param       cp                      the coding parameters for the image.
1154  * @param       image           the image to encode.
1155  * @param       p_j2k                   the p_j2k encoder.
1156  * @param       p_manager       the user event manager.
1157  *
1158  * @return true if the function was successful, false else.
1159  */
1160 static OPJ_BOOL opj_j2k_calculate_tp(   opj_j2k_t *p_j2k,
1161                                                                             opj_cp_t *cp,
1162                                                                             OPJ_UINT32 * p_nb_tiles,
1163                                                                             opj_image_t *image,
1164                                                                             opj_event_mgr_t * p_manager);
1165
1166 static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream);
1167
1168 static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream);
1169
1170 static opj_codestream_index_t* opj_j2k_create_cstr_index(void);
1171
1172 static OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp);
1173
1174 static OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp);
1175
1176 static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres);
1177
1178 static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager);
1179
1180 static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager);
1181
1182 /*@}*/
1183
1184 /*@}*/
1185
1186 /* ----------------------------------------------------------------------- */
1187 typedef struct j2k_prog_order{
1188         OPJ_PROG_ORDER enum_prog;
1189         char str_prog[5];
1190 }j2k_prog_order_t;
1191
1192 j2k_prog_order_t j2k_prog_order_list[] = {
1193         {OPJ_CPRL, "CPRL"},
1194         {OPJ_LRCP, "LRCP"},
1195         {OPJ_PCRL, "PCRL"},
1196         {OPJ_RLCP, "RLCP"},
1197         {OPJ_RPCL, "RPCL"},
1198         {(OPJ_PROG_ORDER)-1, ""}
1199 };
1200
1201 /**
1202  * FIXME DOC
1203  */
1204 static const OPJ_UINT32 MCT_ELEMENT_SIZE [] =
1205 {
1206         2,
1207         4,
1208         4,
1209         8
1210 };
1211
1212 typedef void (* opj_j2k_mct_function) (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1213
1214 const opj_j2k_mct_function j2k_mct_read_functions_to_float [] =
1215 {
1216         opj_j2k_read_int16_to_float,
1217         opj_j2k_read_int32_to_float,
1218         opj_j2k_read_float32_to_float,
1219         opj_j2k_read_float64_to_float
1220 };
1221
1222 const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] =
1223 {
1224         opj_j2k_read_int16_to_int32,
1225         opj_j2k_read_int32_to_int32,
1226         opj_j2k_read_float32_to_int32,
1227         opj_j2k_read_float64_to_int32
1228 };
1229
1230 const opj_j2k_mct_function j2k_mct_write_functions_from_float [] =
1231 {
1232         opj_j2k_write_float_to_int16,
1233         opj_j2k_write_float_to_int32,
1234         opj_j2k_write_float_to_float,
1235         opj_j2k_write_float_to_float64
1236 };
1237
1238 typedef struct opj_dec_memory_marker_handler
1239 {
1240         /** marker value */
1241         OPJ_UINT32 id;
1242         /** value of the state when the marker can appear */
1243         OPJ_UINT32 states;
1244         /** action linked to the marker */
1245         OPJ_BOOL (*handler) (   opj_j2k_t *p_j2k,
1246                             OPJ_BYTE * p_header_data,
1247                             OPJ_UINT32 p_header_size,
1248                             opj_event_mgr_t * p_manager );
1249 }
1250 opj_dec_memory_marker_handler_t;
1251
1252 const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
1253 {
1254   {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},
1255   {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},
1256   {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},
1257   {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},
1258   {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},
1259   {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},
1260   {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},
1261   {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},
1262   {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},
1263   {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},
1264   {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},
1265   {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm_v3},
1266   {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},
1267   {J2K_MS_SOP, 0, 0},
1268   {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},
1269   {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},
1270   {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},
1271   {J2K_MS_CBD, J2K_STATE_MH , opj_j2k_read_cbd},
1272   {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},
1273   {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},
1274 #ifdef USE_JPWL
1275 #ifdef TODO_MS /* remove these functions which are not commpatible with the v2 API */
1276   {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
1277   {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
1278   {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
1279   {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
1280 #endif
1281 #endif /* USE_JPWL */
1282 #ifdef USE_JPSEC
1283   {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
1284   {J2K_MS_INSEC, 0, j2k_read_insec}
1285 #endif /* USE_JPSEC */
1286   {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/
1287 };
1288
1289 void  opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1290 {
1291         OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1292         OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1293         OPJ_UINT32 i;
1294         OPJ_UINT32 l_temp;
1295
1296         for (i=0;i<p_nb_elem;++i) {
1297                 opj_read_bytes(l_src_data,&l_temp,2);
1298
1299                 l_src_data+=sizeof(OPJ_INT16);
1300
1301                 *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1302         }
1303 }
1304
1305 void  opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1306 {
1307         OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1308         OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1309         OPJ_UINT32 i;
1310         OPJ_UINT32 l_temp;
1311
1312         for (i=0;i<p_nb_elem;++i) {
1313                 opj_read_bytes(l_src_data,&l_temp,4);
1314
1315                 l_src_data+=sizeof(OPJ_INT32);
1316
1317                 *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1318         }
1319 }
1320
1321 void  opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1322 {
1323         OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1324         OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1325         OPJ_UINT32 i;
1326         OPJ_FLOAT32 l_temp;
1327
1328         for (i=0;i<p_nb_elem;++i) {
1329                 opj_read_float(l_src_data,&l_temp);
1330
1331                 l_src_data+=sizeof(OPJ_FLOAT32);
1332
1333                 *(l_dest_data++) = l_temp;
1334         }
1335 }
1336
1337 void  opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1338 {
1339         OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1340         OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1341         OPJ_UINT32 i;
1342         OPJ_FLOAT64 l_temp;
1343
1344         for (i=0;i<p_nb_elem;++i) {
1345                 opj_read_double(l_src_data,&l_temp);
1346
1347                 l_src_data+=sizeof(OPJ_FLOAT64);
1348
1349                 *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1350         }
1351 }
1352
1353 void  opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1354 {
1355         OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1356         OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1357         OPJ_UINT32 i;
1358         OPJ_UINT32 l_temp;
1359
1360         for (i=0;i<p_nb_elem;++i) {
1361                 opj_read_bytes(l_src_data,&l_temp,2);
1362
1363                 l_src_data+=sizeof(OPJ_INT16);
1364
1365                 *(l_dest_data++) = (OPJ_INT32) l_temp;
1366         }
1367 }
1368
1369 void  opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1370 {
1371         OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1372         OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1373         OPJ_UINT32 i;
1374         OPJ_UINT32 l_temp;
1375
1376         for (i=0;i<p_nb_elem;++i) {
1377                 opj_read_bytes(l_src_data,&l_temp,4);
1378
1379                 l_src_data+=sizeof(OPJ_INT32);
1380
1381                 *(l_dest_data++) = (OPJ_INT32) l_temp;
1382         }
1383 }
1384
1385 void  opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1386 {
1387         OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1388         OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1389         OPJ_UINT32 i;
1390         OPJ_FLOAT32 l_temp;
1391
1392         for (i=0;i<p_nb_elem;++i) {
1393                 opj_read_float(l_src_data,&l_temp);
1394
1395                 l_src_data+=sizeof(OPJ_FLOAT32);
1396
1397                 *(l_dest_data++) = (OPJ_INT32) l_temp;
1398         }
1399 }
1400
1401 void  opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1402 {
1403         OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1404         OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1405         OPJ_UINT32 i;
1406         OPJ_FLOAT64 l_temp;
1407
1408         for (i=0;i<p_nb_elem;++i) {
1409                 opj_read_double(l_src_data,&l_temp);
1410
1411                 l_src_data+=sizeof(OPJ_FLOAT64);
1412
1413                 *(l_dest_data++) = (OPJ_INT32) l_temp;
1414         }
1415 }
1416
1417 void  opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1418 {
1419         OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1420         OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1421         OPJ_UINT32 i;
1422         OPJ_UINT32 l_temp;
1423
1424         for (i=0;i<p_nb_elem;++i) {
1425                 l_temp = (OPJ_UINT32) *(l_src_data++);
1426
1427                 opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT16));
1428
1429                 l_dest_data+=sizeof(OPJ_INT16);
1430         }
1431 }
1432
1433 void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1434 {
1435         OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1436         OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1437         OPJ_UINT32 i;
1438         OPJ_UINT32 l_temp;
1439
1440         for (i=0;i<p_nb_elem;++i) {
1441                 l_temp = (OPJ_UINT32) *(l_src_data++);
1442
1443                 opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT32));
1444
1445                 l_dest_data+=sizeof(OPJ_INT32);
1446         }
1447 }
1448
1449 void  opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1450 {
1451         OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1452         OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1453         OPJ_UINT32 i;
1454         OPJ_FLOAT32 l_temp;
1455
1456         for (i=0;i<p_nb_elem;++i) {
1457                 l_temp = (OPJ_FLOAT32) *(l_src_data++);
1458
1459                 opj_write_float(l_dest_data,l_temp);
1460
1461                 l_dest_data+=sizeof(OPJ_FLOAT32);
1462         }
1463 }
1464
1465 void  opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1466 {
1467         OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1468         OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1469         OPJ_UINT32 i;
1470         OPJ_FLOAT64 l_temp;
1471
1472         for (i=0;i<p_nb_elem;++i) {
1473                 l_temp = (OPJ_FLOAT64) *(l_src_data++);
1474
1475                 opj_write_double(l_dest_data,l_temp);
1476
1477                 l_dest_data+=sizeof(OPJ_FLOAT64);
1478         }
1479 }
1480
1481 char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){
1482         j2k_prog_order_t *po;
1483         for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){
1484                 if(po->enum_prog == prg_order){
1485                         return po->str_prog;
1486                 }
1487         }
1488         return po->str_prog;
1489 }
1490
1491 OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs,
1492                                                         OPJ_UINT32 p_nb_pocs,
1493                                                         OPJ_UINT32 p_nb_resolutions,
1494                                                         OPJ_UINT32 p_num_comps,
1495                                                         OPJ_UINT32 p_num_layers,
1496                                                         opj_event_mgr_t * p_manager)
1497 {
1498         OPJ_UINT32* packet_array;
1499         OPJ_UINT32 index , resno, compno, layno;
1500         OPJ_UINT32 i;
1501         OPJ_UINT32 step_c = 1;
1502         OPJ_UINT32 step_r = p_num_comps * step_c;
1503         OPJ_UINT32 step_l = p_nb_resolutions * step_r;
1504         OPJ_BOOL loss = OPJ_FALSE;
1505         OPJ_UINT32 layno0 = 0;
1506
1507         packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers, sizeof(OPJ_UINT32));
1508         if (packet_array == 00) {
1509                 opj_event_msg(p_manager , EVT_ERROR, "Not enough memory for checking the poc values.\n");
1510                 return OPJ_FALSE;
1511         }
1512
1513         if (p_nb_pocs == 0) {
1514         opj_free(packet_array);
1515                 return OPJ_TRUE;
1516         }
1517
1518         index = step_r * p_pocs->resno0;
1519         /* take each resolution for each poc */
1520         for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno)
1521         {
1522                 OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
1523
1524                 /* take each comp of each resolution for each poc */
1525                 for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
1526                         OPJ_UINT32 comp_index = res_index + layno0 * step_l;
1527
1528                         /* and finally take each layer of each res of ... */
1529                         for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
1530                                 /*index = step_r * resno + step_c * compno + step_l * layno;*/
1531                                 packet_array[comp_index] = 1;
1532                                 comp_index += step_l;
1533                         }
1534
1535                         res_index += step_c;
1536                 }
1537
1538                 index += step_r;
1539         }
1540         ++p_pocs;
1541
1542         /* iterate through all the pocs */
1543         for (i = 1; i < p_nb_pocs ; ++i) {
1544                 OPJ_UINT32 l_last_layno1 = (p_pocs-1)->layno1 ;
1545
1546                 layno0 = (p_pocs->layno1 > l_last_layno1)? l_last_layno1 : 0;
1547                 index = step_r * p_pocs->resno0;
1548
1549                 /* take each resolution for each poc */
1550                 for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) {
1551                         OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
1552
1553                         /* take each comp of each resolution for each poc */
1554                         for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
1555                                 OPJ_UINT32 comp_index = res_index + layno0 * step_l;
1556
1557                                 /* and finally take each layer of each res of ... */
1558                                 for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
1559                                         /*index = step_r * resno + step_c * compno + step_l * layno;*/
1560                                         packet_array[comp_index] = 1;
1561                                         comp_index += step_l;
1562                                 }
1563
1564                                 res_index += step_c;
1565                         }
1566
1567                         index += step_r;
1568                 }
1569
1570                 ++p_pocs;
1571         }
1572
1573         index = 0;
1574         for (layno = 0; layno < p_num_layers ; ++layno) {
1575                 for (resno = 0; resno < p_nb_resolutions; ++resno) {
1576                         for (compno = 0; compno < p_num_comps; ++compno) {
1577                                 loss |= (packet_array[index]!=1);
1578                                 /*index = step_r * resno + step_c * compno + step_l * layno;*/
1579                                 index += step_c;
1580                         }
1581                 }
1582         }
1583
1584         if (loss) {
1585                 opj_event_msg(p_manager , EVT_ERROR, "Missing packets possible loss of data\n");
1586         }
1587
1588         opj_free(packet_array);
1589
1590         return !loss;
1591 }
1592
1593 /* ----------------------------------------------------------------------- */
1594
1595 OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno)
1596 {
1597         const OPJ_CHAR *prog = 00;
1598         OPJ_INT32 i;
1599         OPJ_UINT32 tpnum = 1;
1600         opj_tcp_t *tcp = 00;
1601         opj_poc_t * l_current_poc = 00;
1602
1603         /*  preconditions */
1604         assert(tileno < (cp->tw * cp->th));
1605         assert(pino < (cp->tcps[tileno].numpocs + 1));
1606
1607         /* get the given tile coding parameter */
1608         tcp = &cp->tcps[tileno];
1609         assert(tcp != 00);
1610
1611         l_current_poc = &(tcp->pocs[pino]);
1612         assert(l_current_poc != 0);
1613
1614         /* get the progression order as a character string */
1615         prog = opj_j2k_convert_progression_order(tcp->prg);
1616         assert(strlen(prog) > 0);
1617
1618         if (cp->m_specific_param.m_enc.m_tp_on == 1) {
1619                 for (i=0;i<4;++i) {
1620                         switch (prog[i])
1621                         {
1622                                 /* component wise */
1623                                 case 'C':
1624                                         tpnum *= l_current_poc->compE;
1625                                         break;
1626                                 /* resolution wise */
1627                                 case 'R':
1628                                         tpnum *= l_current_poc->resE;
1629                                         break;
1630                                 /* precinct wise */
1631                                 case 'P':
1632                                         tpnum *= l_current_poc->prcE;
1633                                         break;
1634                                 /* layer wise */
1635                                 case 'L':
1636                                         tpnum *= l_current_poc->layE;
1637                                         break;
1638                         }
1639                         /* whould we split here ? */
1640                         if ( cp->m_specific_param.m_enc.m_tp_flag == prog[i] ) {
1641                                 cp->m_specific_param.m_enc.m_tp_pos=i;
1642                                 break;
1643                         }
1644                 }
1645         }
1646         else {
1647                 tpnum=1;
1648         }
1649
1650         return tpnum;
1651 }
1652
1653 OPJ_BOOL opj_j2k_calculate_tp(  opj_j2k_t *p_j2k,
1654                                                         opj_cp_t *cp,
1655                                                         OPJ_UINT32 * p_nb_tiles,
1656                                                         opj_image_t *image,
1657                                                         opj_event_mgr_t * p_manager
1658                                 )
1659 {
1660         OPJ_UINT32 pino,tileno;
1661         OPJ_UINT32 l_nb_tiles;
1662         opj_tcp_t *tcp;
1663
1664         /* preconditions */
1665         assert(p_nb_tiles != 00);
1666         assert(cp != 00);
1667         assert(image != 00);
1668         assert(p_j2k != 00);
1669         assert(p_manager != 00);
1670
1671         l_nb_tiles = cp->tw * cp->th;
1672         * p_nb_tiles = 0;
1673         tcp = cp->tcps;
1674
1675         /* INDEX >> */
1676         /* TODO mergeV2: check this part which use cstr_info */
1677         /*if (p_j2k->cstr_info) {
1678                 opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
1679
1680                 for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1681                         OPJ_UINT32 cur_totnum_tp = 0;
1682
1683                         opj_pi_update_encoding_parameters(image,cp,tileno);
1684
1685                         for (pino = 0; pino <= tcp->numpocs; ++pino)
1686                         {
1687                                 OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
1688
1689                                 *p_nb_tiles = *p_nb_tiles + tp_num;
1690
1691                                 cur_totnum_tp += tp_num;
1692                         }
1693
1694                         tcp->m_nb_tile_parts = cur_totnum_tp;
1695
1696                         l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
1697                         if (l_info_tile_ptr->tp == 00) {
1698                                 return OPJ_FALSE;
1699                         }
1700
1701                         memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
1702
1703                         l_info_tile_ptr->num_tps = cur_totnum_tp;
1704
1705                         ++l_info_tile_ptr;
1706                         ++tcp;
1707                 }
1708         }
1709         else */{
1710                 for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1711                         OPJ_UINT32 cur_totnum_tp = 0;
1712
1713                         opj_pi_update_encoding_parameters(image,cp,tileno);
1714
1715                         for (pino = 0; pino <= tcp->numpocs; ++pino) {
1716                                 OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
1717
1718                                 *p_nb_tiles = *p_nb_tiles + tp_num;
1719
1720                                 cur_totnum_tp += tp_num;
1721                         }
1722                         tcp->m_nb_tile_parts = cur_totnum_tp;
1723
1724                         ++tcp;
1725                 }
1726         }
1727
1728         return OPJ_TRUE;
1729 }
1730
1731 OPJ_BOOL opj_j2k_write_soc(     opj_j2k_t *p_j2k,
1732                                                 opj_stream_private_t *p_stream,
1733                                                     opj_event_mgr_t * p_manager )
1734 {
1735         /* 2 bytes will be written */
1736         OPJ_BYTE * l_start_stream = 00;
1737
1738         /* preconditions */
1739         assert(p_stream != 00);
1740         assert(p_j2k != 00);
1741         assert(p_manager != 00);
1742
1743         l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1744
1745         /* write SOC identifier */
1746         opj_write_bytes(l_start_stream,J2K_MS_SOC,2);
1747
1748         if (opj_stream_write_data(p_stream,l_start_stream,2,p_manager) != 2) {
1749                 return OPJ_FALSE;
1750         }
1751
1752 /* UniPG>> */
1753 #ifdef USE_JPWL
1754         /* update markers struct */
1755 /*
1756         OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
1757 */
1758   assert( 0 && "TODO" );
1759 #endif /* USE_JPWL */
1760 /* <<UniPG */
1761
1762         return OPJ_TRUE;
1763 }
1764
1765 /**
1766  * Reads a SOC marker (Start of Codestream)
1767  * @param       p_j2k           the jpeg2000 file codec.
1768  * @param       p_stream        FIXME DOC
1769  * @param       p_manager       the user event manager.
1770 */
1771 static OPJ_BOOL opj_j2k_read_soc(   opj_j2k_t *p_j2k,
1772                                     opj_stream_private_t *p_stream,
1773                                     opj_event_mgr_t * p_manager
1774                                     )
1775 {
1776         OPJ_BYTE l_data [2];
1777         OPJ_UINT32 l_marker;
1778
1779         /* preconditions */
1780         assert(p_j2k != 00);
1781         assert(p_manager != 00);
1782         assert(p_stream != 00);
1783
1784         if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
1785                 return OPJ_FALSE;
1786         }
1787
1788         opj_read_bytes(l_data,&l_marker,2);
1789         if (l_marker != J2K_MS_SOC) {
1790                 return OPJ_FALSE;
1791         }
1792
1793         /* Next marker should be a SIZ marker in the main header */
1794         p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;
1795
1796         /* FIXME move it in a index structure included in p_j2k*/
1797         p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
1798
1799         opj_event_msg(p_manager, EVT_INFO, "Start to read j2k main header (%d).\n", p_j2k->cstr_index->main_head_start);
1800
1801         /* Add the marker to the codestream index*/
1802         if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC, p_j2k->cstr_index->main_head_start, 2)) {
1803                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
1804                 return OPJ_FALSE;
1805         }
1806         return OPJ_TRUE;
1807 }
1808
1809 OPJ_BOOL opj_j2k_write_siz(     opj_j2k_t *p_j2k,
1810                                                         opj_stream_private_t *p_stream,
1811                                                         opj_event_mgr_t * p_manager )
1812 {
1813         OPJ_UINT32 i;
1814         OPJ_UINT32 l_size_len;
1815         OPJ_BYTE * l_current_ptr;
1816         opj_image_t * l_image = 00;
1817         opj_cp_t *cp = 00;
1818         opj_image_comp_t * l_img_comp = 00;
1819
1820         /* preconditions */
1821         assert(p_stream != 00);
1822         assert(p_j2k != 00);
1823         assert(p_manager != 00);
1824
1825         l_image = p_j2k->m_private_image;
1826         cp = &(p_j2k->m_cp);
1827         l_size_len = 40 + 3 * l_image->numcomps;
1828         l_img_comp = l_image->comps;
1829
1830         if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
1831
1832                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);
1833                 if (! new_header_tile_data) {
1834                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
1835                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
1836                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
1837                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n");
1838                         return OPJ_FALSE;
1839                 }
1840                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
1841                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
1842         }
1843
1844         l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1845
1846         /* write SOC identifier */
1847         opj_write_bytes(l_current_ptr,J2K_MS_SIZ,2);    /* SIZ */
1848         l_current_ptr+=2;
1849
1850         opj_write_bytes(l_current_ptr,l_size_len-2,2); /* L_SIZ */
1851         l_current_ptr+=2;
1852
1853         opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */
1854         l_current_ptr+=2;
1855
1856         opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
1857         l_current_ptr+=4;
1858
1859         opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
1860         l_current_ptr+=4;
1861
1862         opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
1863         l_current_ptr+=4;
1864
1865         opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
1866         l_current_ptr+=4;
1867
1868         opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */
1869         l_current_ptr+=4;
1870
1871         opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */
1872         l_current_ptr+=4;
1873
1874         opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */
1875         l_current_ptr+=4;
1876
1877         opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */
1878         l_current_ptr+=4;
1879
1880         opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */
1881         l_current_ptr+=2;
1882
1883         for (i = 0; i < l_image->numcomps; ++i) {
1884                 /* TODO here with MCT ? */
1885                 opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7), 1);      /* Ssiz_i */
1886                 ++l_current_ptr;
1887
1888                 opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */
1889                 ++l_current_ptr;
1890
1891                 opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */
1892                 ++l_current_ptr;
1893
1894                 ++l_img_comp;
1895         }
1896
1897         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_size_len,p_manager) != l_size_len) {
1898                 return OPJ_FALSE;
1899         }
1900
1901         return OPJ_TRUE;
1902 }
1903
1904 /**
1905  * Reads a SIZ marker (image and tile size)
1906  * @param       p_j2k           the jpeg2000 file codec.
1907  * @param       p_header_data   the data contained in the SIZ box.
1908  * @param       p_header_size   the size of the data contained in the SIZ marker.
1909  * @param       p_manager       the user event manager.
1910 */
1911 static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
1912                                  OPJ_BYTE * p_header_data,
1913                                  OPJ_UINT32 p_header_size,
1914                                  opj_event_mgr_t * p_manager
1915                                  )
1916 {
1917         OPJ_UINT32 i;
1918         OPJ_UINT32 l_nb_comp;
1919         OPJ_UINT32 l_nb_comp_remain;
1920         OPJ_UINT32 l_remaining_size;
1921         OPJ_UINT32 l_nb_tiles;
1922         OPJ_UINT32 l_tmp, l_tx1, l_ty1;
1923         opj_image_t *l_image = 00;
1924         opj_cp_t *l_cp = 00;
1925         opj_image_comp_t * l_img_comp = 00;
1926         opj_tcp_t * l_current_tile_param = 00;
1927
1928         /* preconditions */
1929         assert(p_j2k != 00);
1930         assert(p_manager != 00);
1931         assert(p_header_data != 00);
1932
1933         l_image = p_j2k->m_private_image;
1934         l_cp = &(p_j2k->m_cp);
1935
1936         /* minimum size == 39 - 3 (= minimum component parameter) */
1937         if (p_header_size < 36) {
1938                 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
1939                 return OPJ_FALSE;
1940         }
1941
1942         l_remaining_size = p_header_size - 36;
1943         l_nb_comp = l_remaining_size / 3;
1944         l_nb_comp_remain = l_remaining_size % 3;
1945         if (l_nb_comp_remain != 0){
1946                 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
1947                 return OPJ_FALSE;
1948         }
1949
1950         opj_read_bytes(p_header_data,&l_tmp ,2);                                                /* Rsiz (capabilities) */
1951         p_header_data+=2;
1952         l_cp->rsiz = (OPJ_UINT16) l_tmp;
1953         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */
1954         p_header_data+=4;
1955         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */
1956         p_header_data+=4;
1957         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */
1958         p_header_data+=4;
1959         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */
1960         p_header_data+=4;
1961         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx, 4);             /* XTsiz */
1962         p_header_data+=4;
1963         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy, 4);             /* YTsiz */
1964         p_header_data+=4;
1965         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0, 4);             /* XT0siz */
1966         p_header_data+=4;
1967         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0, 4);             /* YT0siz */
1968         p_header_data+=4;
1969         opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp, 2);                 /* Csiz */
1970         p_header_data+=2;
1971         if (l_tmp < 16385)
1972                 l_image->numcomps = (OPJ_UINT16) l_tmp;
1973         else {
1974                 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
1975                 return OPJ_FALSE;
1976         }
1977
1978         if (l_image->numcomps != l_nb_comp) {
1979                 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n", l_image->numcomps, l_nb_comp);
1980                 return OPJ_FALSE;
1981         }
1982
1983         /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
1984         /* testcase issue427-null-image-size.jp2 */
1985         if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) {
1986                 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: negative or zero image size (%d x %d)\n", l_image->x1 - l_image->x0, l_image->y1 - l_image->y0);
1987                 return OPJ_FALSE;
1988         }
1989         /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
1990         if (!(l_cp->tdx * l_cp->tdy)) {
1991                 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx, l_cp->tdy);
1992                 return OPJ_FALSE;
1993         }
1994
1995         /* testcase 1610.pdf.SIGSEGV.59c.681 */
1996         if (((OPJ_UINT64)l_image->x1) * ((OPJ_UINT64)l_image->y1) != (l_image->x1 * l_image->y1)) {
1997                 opj_event_msg(p_manager, EVT_ERROR, "Prevent buffer overflow (x1: %d, y1: %d)\n", l_image->x1, l_image->y1);
1998                 return OPJ_FALSE;
1999         }
2000
2001         /* testcase issue427-illegal-tile-offset.jp2 */
2002         l_tx1 = l_cp->tx0 + l_cp->tdx;
2003         if (l_tx1 < l_cp->tx0) { /* manage overflow */
2004                 l_tx1 = 0xFFFFFFFFU;
2005         }
2006         l_ty1 = l_cp->ty0 + l_cp->tdy;
2007         if (l_ty1 < l_cp->ty0) { /* manage overflow */
2008                 l_ty1 = 0xFFFFFFFFU;
2009         }
2010         if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) || (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0) ) {
2011                 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: illegal tile offset\n");
2012                 return OPJ_FALSE;
2013         }
2014
2015 #ifdef USE_JPWL
2016         if (l_cp->correct) {
2017                 /* if JPWL is on, we check whether TX errors have damaged
2018                   too much the SIZ parameters */
2019                 if (!(l_image->x1 * l_image->y1)) {
2020                         opj_event_msg(p_manager, EVT_ERROR,
2021                                 "JPWL: bad image size (%d x %d)\n",
2022                                 l_image->x1, l_image->y1);
2023                         if (!JPWL_ASSUME || JPWL_ASSUME) {
2024                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2025                                 return OPJ_FALSE;
2026                         }
2027                 }
2028
2029         /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ?
2030                 if (l_image->numcomps != ((len - 38) / 3)) {
2031                         opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2032                                 "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
2033                                 l_image->numcomps, ((len - 38) / 3));
2034                         if (!JPWL_ASSUME) {
2035                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2036                                 return OPJ_FALSE;
2037                         }
2038         */              /* we try to correct */
2039         /*              opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n");
2040                         if (l_image->numcomps < ((len - 38) / 3)) {
2041                                 len = 38 + 3 * l_image->numcomps;
2042                                 opj_event_msg(p_manager, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
2043                                         len);
2044                         } else {
2045                                 l_image->numcomps = ((len - 38) / 3);
2046                                 opj_event_msg(p_manager, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
2047                                         l_image->numcomps);
2048                         }
2049                 }
2050         */
2051
2052                 /* update components number in the jpwl_exp_comps filed */
2053                 l_cp->exp_comps = l_image->numcomps;
2054         }
2055 #endif /* USE_JPWL */
2056
2057         /* Allocate the resulting image components */
2058         l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps, sizeof(opj_image_comp_t));
2059         if (l_image->comps == 00){
2060                 l_image->numcomps = 0;
2061                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2062                 return OPJ_FALSE;
2063         }
2064
2065         l_img_comp = l_image->comps;
2066
2067         /* Read the component information */
2068         for (i = 0; i < l_image->numcomps; ++i){
2069                 OPJ_UINT32 tmp;
2070                 opj_read_bytes(p_header_data,&tmp,1);   /* Ssiz_i */
2071                 ++p_header_data;
2072                 l_img_comp->prec = (tmp & 0x7f) + 1;
2073                 l_img_comp->sgnd = tmp >> 7;
2074                 opj_read_bytes(p_header_data,&tmp,1);   /* XRsiz_i */
2075                 ++p_header_data;
2076                 l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2077                 opj_read_bytes(p_header_data,&tmp,1);   /* YRsiz_i */
2078                 ++p_header_data;
2079                 l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2080                 if( l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
2081                     l_img_comp->dy < 1 || l_img_comp->dy > 255 ) {
2082                     opj_event_msg(p_manager, EVT_ERROR,
2083                                   "Invalid values for comp = %d : dx=%u dy=%u\n (should be between 1 and 255 according the JPEG2000 norm)",
2084                                   i, l_img_comp->dx, l_img_comp->dy);
2085                     return OPJ_FALSE;
2086                 }
2087
2088 #ifdef USE_JPWL
2089                 if (l_cp->correct) {
2090                 /* if JPWL is on, we check whether TX errors have damaged
2091                         too much the SIZ parameters, again */
2092                         if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {
2093                                 opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2094                                         "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
2095                                         i, i, l_image->comps[i].dx, l_image->comps[i].dy);
2096                                 if (!JPWL_ASSUME) {
2097                                         opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2098                                         return OPJ_FALSE;
2099                                 }
2100                                 /* we try to correct */
2101                                 opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
2102                                 if (!l_image->comps[i].dx) {
2103                                         l_image->comps[i].dx = 1;
2104                                         opj_event_msg(p_manager, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
2105                                                 i, l_image->comps[i].dx);
2106                                 }
2107                                 if (!l_image->comps[i].dy) {
2108                                         l_image->comps[i].dy = 1;
2109                                         opj_event_msg(p_manager, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
2110                                                 i, l_image->comps[i].dy);
2111                                 }
2112                         }
2113                 }
2114 #endif /* USE_JPWL */
2115                 l_img_comp->resno_decoded = 0;                                                          /* number of resolution decoded */
2116                 l_img_comp->factor = l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
2117                 ++l_img_comp;
2118         }
2119
2120         /* Compute the number of tiles */
2121         l_cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->x1 - l_cp->tx0), (OPJ_INT32)l_cp->tdx);
2122         l_cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->y1 - l_cp->ty0), (OPJ_INT32)l_cp->tdy);
2123
2124         /* Check that the number of tiles is valid */
2125         if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
2126             opj_event_msg(  p_manager, EVT_ERROR, 
2127                             "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
2128                             l_cp->tw, l_cp->th);
2129             return OPJ_FALSE;
2130         }
2131         l_nb_tiles = l_cp->tw * l_cp->th;
2132
2133         /* Define the tiles which will be decoded */
2134         if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
2135                 p_j2k->m_specific_param.m_decoder.m_start_tile_x = (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
2136                 p_j2k->m_specific_param.m_decoder.m_start_tile_y = (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
2137                 p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0), (OPJ_INT32)l_cp->tdx);
2138                 p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0), (OPJ_INT32)l_cp->tdy);
2139         }
2140         else {
2141                 p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
2142                 p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
2143                 p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
2144                 p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
2145         }
2146
2147 #ifdef USE_JPWL
2148         if (l_cp->correct) {
2149                 /* if JPWL is on, we check whether TX errors have damaged
2150                   too much the SIZ parameters */
2151                 if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) || (l_cp->th > l_cp->max_tiles)) {
2152                         opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2153                                 "JPWL: bad number of tiles (%d x %d)\n",
2154                                 l_cp->tw, l_cp->th);
2155                         if (!JPWL_ASSUME) {
2156                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2157                                 return OPJ_FALSE;
2158                         }
2159                         /* we try to correct */
2160                         opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
2161                         if (l_cp->tw < 1) {
2162                                 l_cp->tw= 1;
2163                                 opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n",
2164                                                 l_cp->tw);
2165                         }
2166                         if (l_cp->tw > l_cp->max_tiles) {
2167                                 l_cp->tw= 1;
2168                                 opj_event_msg(p_manager, EVT_WARNING, "- too large x, increase expectance of %d\n"
2169                                         "- setting %d tiles in x => HYPOTHESIS!!!\n",
2170                                         l_cp->max_tiles, l_cp->tw);
2171                         }
2172                         if (l_cp->th < 1) {
2173                                 l_cp->th= 1;
2174                                 opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n",
2175                                                 l_cp->th);
2176                         }
2177                         if (l_cp->th > l_cp->max_tiles) {
2178                                 l_cp->th= 1;
2179                                 opj_event_msg(p_manager, EVT_WARNING, "- too large y, increase expectance of %d to continue\n",
2180                                         "- setting %d tiles in y => HYPOTHESIS!!!\n",
2181                                         l_cp->max_tiles, l_cp->th);
2182                         }
2183                 }
2184         }
2185 #endif /* USE_JPWL */
2186
2187         /* memory allocations */
2188         l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
2189         if (l_cp->tcps == 00) {
2190                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2191                 return OPJ_FALSE;
2192         }
2193
2194 #ifdef USE_JPWL
2195         if (l_cp->correct) {
2196                 if (!l_cp->tcps) {
2197                         opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2198                                 "JPWL: could not alloc tcps field of cp\n");
2199                         if (!JPWL_ASSUME || JPWL_ASSUME) {
2200                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2201                                 return OPJ_FALSE;
2202                         }
2203                 }
2204         }
2205 #endif /* USE_JPWL */
2206
2207         p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
2208                         (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
2209         if(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps  == 00) {
2210                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2211                 return OPJ_FALSE;
2212         }
2213
2214         p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
2215                         (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS ,sizeof(opj_mct_data_t));
2216
2217         if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {
2218                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2219                 return OPJ_FALSE;
2220         }
2221         p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records = OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
2222
2223         p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
2224                         (opj_simple_mcc_decorrelation_data_t*)
2225                         opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS, sizeof(opj_simple_mcc_decorrelation_data_t));
2226
2227         if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {
2228                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2229                 return OPJ_FALSE;
2230         }
2231         p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records = OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
2232
2233         /* set up default dc level shift */
2234         for (i=0;i<l_image->numcomps;++i) {
2235                 if (! l_image->comps[i].sgnd) {
2236                         p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1 << (l_image->comps[i].prec - 1);
2237                 }
2238         }
2239
2240         l_current_tile_param = l_cp->tcps;
2241         for     (i = 0; i < l_nb_tiles; ++i) {
2242                 l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
2243                 if (l_current_tile_param->tccps == 00) {
2244                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2245                         return OPJ_FALSE;
2246                 }
2247
2248                 ++l_current_tile_param;
2249         }
2250
2251         p_j2k->m_specific_param.m_decoder.m_state =  J2K_STATE_MH; /* FIXME J2K_DEC_STATE_MH; */
2252         opj_image_comp_header_update(l_image,l_cp);
2253
2254         return OPJ_TRUE;
2255 }
2256
2257 OPJ_BOOL opj_j2k_write_com(     opj_j2k_t *p_j2k,
2258                                                         opj_stream_private_t *p_stream,
2259                                                         opj_event_mgr_t * p_manager
2260                             )
2261 {
2262         OPJ_UINT32 l_comment_size;
2263         OPJ_UINT32 l_total_com_size;
2264         const OPJ_CHAR *l_comment;
2265         OPJ_BYTE * l_current_ptr = 00;
2266
2267         /* preconditions */
2268         assert(p_j2k != 00);
2269         assert(p_stream != 00);
2270         assert(p_manager != 00);
2271
2272         l_comment = p_j2k->m_cp.comment;
2273         l_comment_size = (OPJ_UINT32)strlen(l_comment);
2274         l_total_com_size = l_comment_size + 6;
2275
2276         if (l_total_com_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2277                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);
2278                 if (! new_header_tile_data) {
2279                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2280                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2281                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2282                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write the COM marker\n");
2283                         return OPJ_FALSE;
2284                 }
2285                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2286                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
2287         }
2288
2289         l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2290
2291         opj_write_bytes(l_current_ptr,J2K_MS_COM , 2);  /* COM */
2292         l_current_ptr+=2;
2293
2294         opj_write_bytes(l_current_ptr,l_total_com_size - 2 , 2);        /* L_COM */
2295         l_current_ptr+=2;
2296
2297         opj_write_bytes(l_current_ptr,1 , 2);   /* General use (IS 8859-15:1999 (Latin) values) */
2298         l_current_ptr+=2;
2299
2300         memcpy( l_current_ptr,l_comment,l_comment_size);
2301
2302         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_total_com_size,p_manager) != l_total_com_size) {
2303                 return OPJ_FALSE;
2304         }
2305
2306         return OPJ_TRUE;
2307 }
2308
2309 /**
2310  * Reads a COM marker (comments)
2311  * @param       p_j2k           the jpeg2000 file codec.
2312  * @param       p_header_data   the data contained in the COM box.
2313  * @param       p_header_size   the size of the data contained in the COM marker.
2314  * @param       p_manager               the user event manager.
2315 */
2316 static OPJ_BOOL opj_j2k_read_com (  opj_j2k_t *p_j2k,
2317                                     OPJ_BYTE * p_header_data,
2318                                     OPJ_UINT32 p_header_size,
2319                                     opj_event_mgr_t * p_manager
2320                                     )
2321 {
2322         /* preconditions */
2323         assert(p_j2k != 00);
2324         assert(p_manager != 00);
2325         assert(p_header_data != 00);
2326   (void)p_header_size;
2327
2328         return OPJ_TRUE;
2329 }
2330
2331 OPJ_BOOL opj_j2k_write_cod(     opj_j2k_t *p_j2k,
2332                                                         opj_stream_private_t *p_stream,
2333                                                         opj_event_mgr_t * p_manager )
2334 {
2335         opj_cp_t *l_cp = 00;
2336         opj_tcp_t *l_tcp = 00;
2337         OPJ_UINT32 l_code_size,l_remaining_size;
2338         OPJ_BYTE * l_current_data = 00;
2339
2340         /* preconditions */
2341         assert(p_j2k != 00);
2342         assert(p_manager != 00);
2343         assert(p_stream != 00);
2344
2345         l_cp = &(p_j2k->m_cp);
2346         l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2347         l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,0);
2348         l_remaining_size = l_code_size;
2349
2350         if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2351                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);
2352                 if (! new_header_tile_data) {
2353                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2354                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2355                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2356                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n");
2357                         return OPJ_FALSE;
2358                 }
2359                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2360                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
2361         }
2362
2363         l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2364
2365         opj_write_bytes(l_current_data,J2K_MS_COD,2);           /* COD */
2366         l_current_data += 2;
2367
2368         opj_write_bytes(l_current_data,l_code_size-2,2);        /* L_COD */
2369         l_current_data += 2;
2370
2371         opj_write_bytes(l_current_data,l_tcp->csty,1);          /* Scod */
2372         ++l_current_data;
2373
2374         opj_write_bytes(l_current_data,l_tcp->prg,1);           /* SGcod (A) */
2375         ++l_current_data;
2376
2377         opj_write_bytes(l_current_data,l_tcp->numlayers,2);     /* SGcod (B) */
2378         l_current_data+=2;
2379
2380         opj_write_bytes(l_current_data,l_tcp->mct,1);           /* SGcod (C) */
2381         ++l_current_data;
2382
2383         l_remaining_size -= 9;
2384
2385         if (! opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {
2386                 opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
2387                 return OPJ_FALSE;
2388         }
2389
2390         if (l_remaining_size != 0) {
2391                 opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
2392                 return OPJ_FALSE;
2393         }
2394
2395         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_code_size,p_manager) != l_code_size) {
2396                 return OPJ_FALSE;
2397         }
2398
2399         return OPJ_TRUE;
2400 }
2401
2402 /**
2403  * Reads a COD marker (Coding Styke defaults)
2404  * @param       p_header_data   the data contained in the COD box.
2405  * @param       p_j2k                   the jpeg2000 codec.
2406  * @param       p_header_size   the size of the data contained in the COD marker.
2407  * @param       p_manager               the user event manager.
2408 */
2409 static OPJ_BOOL opj_j2k_read_cod (  opj_j2k_t *p_j2k,
2410                                     OPJ_BYTE * p_header_data,
2411                                     OPJ_UINT32 p_header_size,
2412                                     opj_event_mgr_t * p_manager
2413                                     )
2414 {
2415         /* loop */
2416         OPJ_UINT32 i;
2417         OPJ_UINT32 l_tmp;
2418         opj_cp_t *l_cp = 00;
2419         opj_tcp_t *l_tcp = 00;
2420         opj_image_t *l_image = 00;
2421
2422         /* preconditions */
2423         assert(p_header_data != 00);
2424         assert(p_j2k != 00);
2425         assert(p_manager != 00);
2426
2427         l_image = p_j2k->m_private_image;
2428         l_cp = &(p_j2k->m_cp);
2429
2430         /* If we are in the first tile-part header of the current tile */
2431         l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
2432                                 &l_cp->tcps[p_j2k->m_current_tile_number] :
2433                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
2434
2435         /* Make sure room is sufficient */
2436         if (p_header_size < 5) {
2437                 opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2438                 return OPJ_FALSE;
2439         }
2440
2441         opj_read_bytes(p_header_data,&l_tcp->csty,1);           /* Scod */
2442         ++p_header_data;
2443         /* Make sure we know how to decode this */
2444         if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP | J2K_CP_CSTY_EPH)) != 0U) {
2445                 opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n");
2446                 return OPJ_FALSE;
2447         }
2448         opj_read_bytes(p_header_data,&l_tmp,1);                         /* SGcod (A) */
2449         ++p_header_data;
2450         l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
2451         /* Make sure progression order is valid */
2452         if (l_tcp->prg > OPJ_CPRL ) {
2453                 opj_event_msg(p_manager, EVT_ERROR, "Unknown progression order in COD marker\n");
2454                 l_tcp->prg = OPJ_PROG_UNKNOWN;
2455         }
2456         opj_read_bytes(p_header_data,&l_tcp->numlayers,2);      /* SGcod (B) */
2457         p_header_data+=2;
2458
2459         /* If user didn't set a number layer to decode take the max specify in the codestream. */
2460         if      (l_cp->m_specific_param.m_dec.m_layer) {
2461                 l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
2462         }
2463         else {
2464                 l_tcp->num_layers_to_decode = l_tcp->numlayers;
2465         }
2466
2467         opj_read_bytes(p_header_data,&l_tcp->mct,1);            /* SGcod (C) */
2468         ++p_header_data;
2469
2470         p_header_size -= 5;
2471         for     (i = 0; i < l_image->numcomps; ++i) {
2472                 l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
2473         }
2474
2475         if (! opj_j2k_read_SPCod_SPCoc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {
2476                 opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2477                 return OPJ_FALSE;
2478         }
2479
2480         if (p_header_size != 0) {
2481                 opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2482                 return OPJ_FALSE;
2483         }
2484
2485         /* Apply the coding style to other components of the current tile or the m_default_tcp*/
2486         opj_j2k_copy_tile_component_parameters(p_j2k);
2487
2488         /* Index */
2489 #ifdef WIP_REMOVE_MSD
2490         if (p_j2k->cstr_info) {
2491                 /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/
2492                 p_j2k->cstr_info->prog = l_tcp->prg;
2493                 p_j2k->cstr_info->numlayers = l_tcp->numlayers;
2494                 p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(l_image->numcomps * sizeof(OPJ_UINT32));
2495                 for     (i = 0; i < l_image->numcomps; ++i) {
2496                         p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
2497                 }
2498         }
2499 #endif
2500
2501         return OPJ_TRUE;
2502 }
2503
2504 #if 0
2505 OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k,
2506                                                 OPJ_UINT32 p_comp_no,
2507                                                 opj_stream_private_t *p_stream,
2508                                                 opj_event_mgr_t * p_manager )
2509 {
2510         OPJ_UINT32 l_coc_size,l_remaining_size;
2511         OPJ_UINT32 l_comp_room;
2512
2513         /* preconditions */
2514         assert(p_j2k != 00);
2515         assert(p_manager != 00);
2516         assert(p_stream != 00);
2517
2518         l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;
2519
2520         l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
2521
2522         if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2523                 OPJ_BYTE *new_header_tile_data;
2524                 /*p_j2k->m_specific_param.m_encoder.m_header_tile_data
2525                         = (OPJ_BYTE*)opj_realloc(
2526                                 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
2527                                 l_coc_size);*/
2528
2529                 new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);
2530                 if (! new_header_tile_data) {
2531                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2532                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2533                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2534                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n");
2535                         return OPJ_FALSE;
2536                 }
2537                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2538                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
2539         }
2540
2541         opj_j2k_write_coc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
2542
2543         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_coc_size,p_manager) != l_coc_size) {
2544                 return OPJ_FALSE;
2545         }
2546
2547         return OPJ_TRUE;
2548 }
2549 #endif
2550
2551 #if 0
2552 void opj_j2k_write_coc_in_memory(   opj_j2k_t *p_j2k,
2553                                                 OPJ_UINT32 p_comp_no,
2554                                                 OPJ_BYTE * p_data,
2555                                                 OPJ_UINT32 * p_data_written,
2556                                                 opj_event_mgr_t * p_manager
2557                                     )
2558 {
2559         opj_cp_t *l_cp = 00;
2560         opj_tcp_t *l_tcp = 00;
2561         OPJ_UINT32 l_coc_size,l_remaining_size;
2562         OPJ_BYTE * l_current_data = 00;
2563         opj_image_t *l_image = 00;
2564         OPJ_UINT32 l_comp_room;
2565
2566         /* preconditions */
2567         assert(p_j2k != 00);
2568         assert(p_manager != 00);
2569
2570         l_cp = &(p_j2k->m_cp);
2571         l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2572         l_image = p_j2k->m_private_image;
2573         l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
2574
2575         l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
2576         l_remaining_size = l_coc_size;
2577
2578         l_current_data = p_data;
2579
2580         opj_write_bytes(l_current_data,J2K_MS_COC,2);                           /* COC */
2581         l_current_data += 2;
2582
2583         opj_write_bytes(l_current_data,l_coc_size-2,2);                         /* L_COC */
2584         l_current_data += 2;
2585
2586         opj_write_bytes(l_current_data,p_comp_no, l_comp_room);         /* Ccoc */
2587         l_current_data+=l_comp_room;
2588
2589         opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty, 1);               /* Scoc */
2590         ++l_current_data;
2591
2592         l_remaining_size -= (5 + l_comp_room);
2593         opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager);
2594         * p_data_written = l_coc_size;
2595 }
2596 #endif
2597
2598 OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k)
2599 {
2600         OPJ_UINT32 i,j;
2601         OPJ_UINT32 l_nb_comp;
2602         OPJ_UINT32 l_nb_tiles;
2603         OPJ_UINT32 l_max = 0;
2604
2605         /* preconditions */
2606
2607         l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
2608         l_nb_comp = p_j2k->m_private_image->numcomps;
2609
2610         for (i=0;i<l_nb_tiles;++i) {
2611                 for (j=0;j<l_nb_comp;++j) {
2612                         l_max = opj_uint_max(l_max,opj_j2k_get_SPCod_SPCoc_size(p_j2k,i,j));
2613                 }
2614         }
2615
2616         return 6 + l_max;
2617 }
2618
2619 /**
2620  * Reads a COC marker (Coding Style Component)
2621  * @param       p_header_data   the data contained in the COC box.
2622  * @param       p_j2k                   the jpeg2000 codec.
2623  * @param       p_header_size   the size of the data contained in the COC marker.
2624  * @param       p_manager               the user event manager.
2625 */
2626 static OPJ_BOOL opj_j2k_read_coc (  opj_j2k_t *p_j2k,
2627                                     OPJ_BYTE * p_header_data,
2628                                     OPJ_UINT32 p_header_size,
2629                                     opj_event_mgr_t * p_manager
2630                                     )
2631 {
2632         opj_cp_t *l_cp = NULL;
2633         opj_tcp_t *l_tcp = NULL;
2634         opj_image_t *l_image = NULL;
2635         OPJ_UINT32 l_comp_room;
2636         OPJ_UINT32 l_comp_no;
2637
2638         /* preconditions */
2639         assert(p_header_data != 00);
2640         assert(p_j2k != 00);
2641         assert(p_manager != 00);
2642
2643         l_cp = &(p_j2k->m_cp);
2644         l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ) ? /*FIXME J2K_DEC_STATE_TPH*/
2645                                 &l_cp->tcps[p_j2k->m_current_tile_number] :
2646                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
2647         l_image = p_j2k->m_private_image;
2648
2649         l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
2650
2651         /* make sure room is sufficient*/
2652         if (p_header_size < l_comp_room + 1) {
2653                 opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2654                 return OPJ_FALSE;
2655         }
2656         p_header_size -= l_comp_room + 1;
2657
2658         opj_read_bytes(p_header_data,&l_comp_no,l_comp_room);                   /* Ccoc */
2659         p_header_data += l_comp_room;
2660         if (l_comp_no >= l_image->numcomps) {
2661                 opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker (bad number of components)\n");
2662                 return OPJ_FALSE;
2663         }
2664
2665         opj_read_bytes(p_header_data,&l_tcp->tccps[l_comp_no].csty,1);                  /* Scoc */
2666         ++p_header_data ;
2667
2668         if (! opj_j2k_read_SPCod_SPCoc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {
2669                 opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2670                 return OPJ_FALSE;
2671         }
2672
2673         if (p_header_size != 0) {
2674                 opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2675                 return OPJ_FALSE;
2676         }
2677         return OPJ_TRUE;
2678 }
2679
2680 OPJ_BOOL opj_j2k_write_qcd(     opj_j2k_t *p_j2k,
2681                                                         opj_stream_private_t *p_stream,
2682                                                         opj_event_mgr_t * p_manager
2683                             )
2684 {
2685         OPJ_UINT32 l_qcd_size,l_remaining_size;
2686         OPJ_BYTE * l_current_data = 00;
2687
2688         /* preconditions */
2689         assert(p_j2k != 00);
2690         assert(p_manager != 00);
2691         assert(p_stream != 00);
2692
2693         l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,0);
2694         l_remaining_size = l_qcd_size;
2695
2696         if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2697                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);
2698                 if (! new_header_tile_data) {
2699                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2700                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2701                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2702                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n");
2703                         return OPJ_FALSE;
2704                 }
2705                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2706                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
2707         }
2708
2709         l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2710
2711         opj_write_bytes(l_current_data,J2K_MS_QCD,2);           /* QCD */
2712         l_current_data += 2;
2713
2714         opj_write_bytes(l_current_data,l_qcd_size-2,2);         /* L_QCD */
2715         l_current_data += 2;
2716
2717         l_remaining_size -= 4;
2718
2719         if (! opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {
2720                 opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
2721                 return OPJ_FALSE;
2722         }
2723
2724         if (l_remaining_size != 0) {
2725                 opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
2726                 return OPJ_FALSE;
2727         }
2728
2729         if (opj_stream_write_data(p_stream, p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcd_size,p_manager) != l_qcd_size) {
2730                 return OPJ_FALSE;
2731         }
2732
2733         return OPJ_TRUE;
2734 }
2735
2736 /**
2737  * Reads a QCD marker (Quantization defaults)
2738  * @param       p_header_data   the data contained in the QCD box.
2739  * @param       p_j2k                   the jpeg2000 codec.
2740  * @param       p_header_size   the size of the data contained in the QCD marker.
2741  * @param       p_manager               the user event manager.
2742 */
2743 static OPJ_BOOL opj_j2k_read_qcd (  opj_j2k_t *p_j2k,
2744                                     OPJ_BYTE * p_header_data,
2745                                     OPJ_UINT32 p_header_size,
2746                                     opj_event_mgr_t * p_manager
2747                                     )
2748 {
2749         /* preconditions */
2750         assert(p_header_data != 00);
2751         assert(p_j2k != 00);
2752         assert(p_manager != 00);
2753
2754         if (! opj_j2k_read_SQcd_SQcc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {
2755                 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
2756                 return OPJ_FALSE;
2757         }
2758
2759         if (p_header_size != 0) {
2760                 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
2761                 return OPJ_FALSE;
2762         }
2763
2764         /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
2765         opj_j2k_copy_tile_quantization_parameters(p_j2k);
2766
2767         return OPJ_TRUE;
2768 }
2769
2770 #if 0
2771 OPJ_BOOL opj_j2k_write_qcc(     opj_j2k_t *p_j2k,
2772                                                 OPJ_UINT32 p_comp_no,
2773                                                 opj_stream_private_t *p_stream,
2774                                                 opj_event_mgr_t * p_manager
2775                             )
2776 {
2777         OPJ_UINT32 l_qcc_size,l_remaining_size;
2778
2779         /* preconditions */
2780         assert(p_j2k != 00);
2781         assert(p_manager != 00);
2782         assert(p_stream != 00);
2783
2784         l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
2785         l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0:1;
2786         l_remaining_size = l_qcc_size;
2787
2788         if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2789                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);
2790                 if (! new_header_tile_data) {
2791                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2792                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2793                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2794                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n");
2795                         return OPJ_FALSE;
2796                 }
2797                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2798                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
2799         }
2800
2801         opj_j2k_write_qcc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
2802
2803         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcc_size,p_manager) != l_qcc_size) {
2804                 return OPJ_FALSE;
2805         }
2806
2807         return OPJ_TRUE;
2808 }
2809 #endif
2810
2811 #if 0
2812 void opj_j2k_write_qcc_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_UINT32 l_qcc_size,l_remaining_size;
2820         OPJ_BYTE * l_current_data = 00;
2821
2822         /* preconditions */
2823         assert(p_j2k != 00);
2824         assert(p_manager != 00);
2825
2826         l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
2827         l_remaining_size = l_qcc_size;
2828
2829         l_current_data = p_data;
2830
2831         opj_write_bytes(l_current_data,J2K_MS_QCC,2);           /* QCC */
2832         l_current_data += 2;
2833
2834         if (p_j2k->m_private_image->numcomps <= 256) {
2835                 --l_qcc_size;
2836
2837                 opj_write_bytes(l_current_data,l_qcc_size-2,2);         /* L_QCC */
2838                 l_current_data += 2;
2839
2840                 opj_write_bytes(l_current_data, p_comp_no, 1);  /* Cqcc */
2841                 ++l_current_data;
2842
2843                 /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */
2844                 l_remaining_size -= 6;
2845         }
2846         else {
2847                 opj_write_bytes(l_current_data,l_qcc_size-2,2);         /* L_QCC */
2848                 l_current_data += 2;
2849
2850                 opj_write_bytes(l_current_data, p_comp_no, 2);  /* Cqcc */
2851                 l_current_data+=2;
2852
2853                 l_remaining_size -= 6;
2854         }
2855
2856         opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,p_comp_no,l_current_data,&l_remaining_size,p_manager);
2857
2858         *p_data_written = l_qcc_size;
2859 }
2860 #endif
2861
2862 OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k)
2863 {
2864         return opj_j2k_get_max_coc_size(p_j2k);
2865 }
2866
2867 /**
2868  * Reads a QCC marker (Quantization component)
2869  * @param       p_header_data   the data contained in the QCC box.
2870  * @param       p_j2k                   the jpeg2000 codec.
2871  * @param       p_header_size   the size of the data contained in the QCC marker.
2872  * @param       p_manager               the user event manager.
2873 */
2874 static OPJ_BOOL opj_j2k_read_qcc(   opj_j2k_t *p_j2k,
2875                                     OPJ_BYTE * p_header_data,
2876                                     OPJ_UINT32 p_header_size,
2877                                     opj_event_mgr_t * p_manager
2878                                     )
2879 {
2880         OPJ_UINT32 l_num_comp,l_comp_no;
2881
2882         /* preconditions */
2883         assert(p_header_data != 00);
2884         assert(p_j2k != 00);
2885         assert(p_manager != 00);
2886
2887         l_num_comp = p_j2k->m_private_image->numcomps;
2888
2889         if (l_num_comp <= 256) {
2890                 if (p_header_size < 1) {
2891                         opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
2892                         return OPJ_FALSE;
2893                 }
2894                 opj_read_bytes(p_header_data,&l_comp_no,1);
2895                 ++p_header_data;
2896                 --p_header_size;
2897         }
2898         else {
2899                 if (p_header_size < 2) {
2900                         opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
2901                         return OPJ_FALSE;
2902                 }
2903                 opj_read_bytes(p_header_data,&l_comp_no,2);
2904                 p_header_data+=2;
2905                 p_header_size-=2;
2906         }
2907
2908 #ifdef USE_JPWL
2909         if (p_j2k->m_cp.correct) {
2910
2911                 static OPJ_UINT32 backup_compno = 0;
2912
2913                 /* compno is negative or larger than the number of components!!! */
2914                 if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {
2915                         opj_event_msg(p_manager, EVT_ERROR,
2916                                 "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
2917                                 l_comp_no, l_num_comp);
2918                         if (!JPWL_ASSUME) {
2919                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2920                                 return OPJ_FALSE;
2921                         }
2922                         /* we try to correct */
2923                         l_comp_no = backup_compno % l_num_comp;
2924                         opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
2925                                 "- setting component number to %d\n",
2926                                 l_comp_no);
2927                 }
2928
2929                 /* keep your private count of tiles */
2930                 backup_compno++;
2931         };
2932 #endif /* USE_JPWL */
2933
2934         if (l_comp_no >= p_j2k->m_private_image->numcomps) {
2935                 opj_event_msg(p_manager, EVT_ERROR,
2936                               "Invalid component number: %d, regarding the number of components %d\n",
2937                               l_comp_no, p_j2k->m_private_image->numcomps);
2938                 return OPJ_FALSE;
2939         }
2940
2941         if (! opj_j2k_read_SQcd_SQcc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {
2942                 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
2943                 return OPJ_FALSE;
2944         }
2945
2946         if (p_header_size != 0) {
2947                 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
2948                 return OPJ_FALSE;
2949         }
2950
2951         return OPJ_TRUE;
2952 }
2953
2954 OPJ_BOOL opj_j2k_write_poc(     opj_j2k_t *p_j2k,
2955                                                         opj_stream_private_t *p_stream,
2956                                                         opj_event_mgr_t * p_manager
2957                             )
2958 {
2959         OPJ_UINT32 l_nb_comp;
2960         OPJ_UINT32 l_nb_poc;
2961         OPJ_UINT32 l_poc_size;
2962         OPJ_UINT32 l_written_size = 0;
2963         opj_tcp_t *l_tcp = 00;
2964         OPJ_UINT32 l_poc_room;
2965
2966         /* preconditions */
2967         assert(p_j2k != 00);
2968         assert(p_manager != 00);
2969         assert(p_stream != 00);
2970
2971         l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
2972         l_nb_comp = p_j2k->m_private_image->numcomps;
2973         l_nb_poc = 1 + l_tcp->numpocs;
2974
2975         if (l_nb_comp <= 256) {
2976                 l_poc_room = 1;
2977         }
2978         else {
2979                 l_poc_room = 2;
2980         }
2981         l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
2982
2983         if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2984                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);
2985                 if (! new_header_tile_data) {
2986                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2987                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2988                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2989                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n");
2990                         return OPJ_FALSE;
2991                 }
2992                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2993                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
2994         }
2995
2996         opj_j2k_write_poc_in_memory(p_j2k,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_written_size,p_manager);
2997
2998         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_poc_size,p_manager) != l_poc_size) {
2999                 return OPJ_FALSE;
3000         }
3001
3002         return OPJ_TRUE;
3003 }
3004
3005 void opj_j2k_write_poc_in_memory(   opj_j2k_t *p_j2k,
3006                                                                 OPJ_BYTE * p_data,
3007                                                                 OPJ_UINT32 * p_data_written,
3008                                                                 opj_event_mgr_t * p_manager
3009                                     )
3010 {
3011         OPJ_UINT32 i;
3012         OPJ_BYTE * l_current_data = 00;
3013         OPJ_UINT32 l_nb_comp;
3014         OPJ_UINT32 l_nb_poc;
3015         OPJ_UINT32 l_poc_size;
3016         opj_image_t *l_image = 00;
3017         opj_tcp_t *l_tcp = 00;
3018         opj_tccp_t *l_tccp = 00;
3019         opj_poc_t *l_current_poc = 00;
3020         OPJ_UINT32 l_poc_room;
3021
3022         /* preconditions */
3023         assert(p_j2k != 00);
3024         assert(p_manager != 00);
3025
3026         l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
3027         l_tccp = &l_tcp->tccps[0];
3028         l_image = p_j2k->m_private_image;
3029         l_nb_comp = l_image->numcomps;
3030         l_nb_poc = 1 + l_tcp->numpocs;
3031
3032         if (l_nb_comp <= 256) {
3033                 l_poc_room = 1;
3034         }
3035         else {
3036                 l_poc_room = 2;
3037         }
3038
3039         l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
3040
3041         l_current_data = p_data;
3042
3043         opj_write_bytes(l_current_data,J2K_MS_POC,2);                                   /* POC  */
3044         l_current_data += 2;
3045
3046         opj_write_bytes(l_current_data,l_poc_size-2,2);                                 /* Lpoc */
3047         l_current_data += 2;
3048
3049         l_current_poc =  l_tcp->pocs;
3050         for (i = 0; i < l_nb_poc; ++i) {
3051                 opj_write_bytes(l_current_data,l_current_poc->resno0,1);                                /* RSpoc_i */
3052                 ++l_current_data;
3053
3054                 opj_write_bytes(l_current_data,l_current_poc->compno0,l_poc_room);              /* CSpoc_i */
3055                 l_current_data+=l_poc_room;
3056
3057                 opj_write_bytes(l_current_data,l_current_poc->layno1,2);                                /* LYEpoc_i */
3058                 l_current_data+=2;
3059
3060                 opj_write_bytes(l_current_data,l_current_poc->resno1,1);                                /* REpoc_i */
3061                 ++l_current_data;
3062
3063                 opj_write_bytes(l_current_data,l_current_poc->compno1,l_poc_room);              /* CEpoc_i */
3064                 l_current_data+=l_poc_room;
3065
3066                 opj_write_bytes(l_current_data,l_current_poc->prg,1);                                   /* Ppoc_i */
3067                 ++l_current_data;
3068
3069                 /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
3070                 l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);
3071                 l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);
3072                 l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->compno1, (OPJ_INT32)l_nb_comp);
3073
3074                 ++l_current_poc;
3075         }
3076
3077         *p_data_written = l_poc_size;
3078 }
3079
3080 OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k)
3081 {
3082         opj_tcp_t * l_tcp = 00;
3083         OPJ_UINT32 l_nb_tiles = 0;
3084         OPJ_UINT32 l_max_poc = 0;
3085         OPJ_UINT32 i;
3086
3087         l_tcp = p_j2k->m_cp.tcps;
3088         l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
3089
3090         for (i=0;i<l_nb_tiles;++i) {
3091                 l_max_poc = opj_uint_max(l_max_poc,l_tcp->numpocs);
3092                 ++l_tcp;
3093         }
3094
3095         ++l_max_poc;
3096
3097         return 4 + 9 * l_max_poc;
3098 }
3099
3100 OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k)
3101 {
3102         OPJ_UINT32 i;
3103         OPJ_UINT32 l_nb_tiles;
3104         OPJ_UINT32 l_max = 0;
3105         opj_tcp_t * l_tcp = 00;
3106
3107         l_tcp = p_j2k->m_cp.tcps;
3108         l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
3109
3110         for (i=0;i<l_nb_tiles;++i) {
3111                 l_max = opj_uint_max(l_max,l_tcp->m_nb_tile_parts);
3112
3113                 ++l_tcp;
3114         }
3115
3116         return 12 * l_max;
3117 }
3118
3119 OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
3120 {
3121         OPJ_UINT32 l_nb_bytes = 0;
3122         OPJ_UINT32 l_nb_comps;
3123         OPJ_UINT32 l_coc_bytes,l_qcc_bytes;
3124
3125         l_nb_comps = p_j2k->m_private_image->numcomps - 1;
3126         l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
3127
3128         if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) {
3129                 l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
3130                 l_nb_bytes += l_nb_comps * l_coc_bytes;
3131
3132                 l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
3133                 l_nb_bytes += l_nb_comps * l_qcc_bytes;
3134         }
3135
3136         l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
3137
3138         /*** DEVELOPER CORNER, Add room for your headers ***/
3139
3140         return l_nb_bytes;
3141 }
3142
3143 /**
3144  * Reads a POC marker (Progression Order Change)
3145  *
3146  * @param       p_header_data   the data contained in the POC box.
3147  * @param       p_j2k                   the jpeg2000 codec.
3148  * @param       p_header_size   the size of the data contained in the POC marker.
3149  * @param       p_manager               the user event manager.
3150 */
3151 static OPJ_BOOL opj_j2k_read_poc (  opj_j2k_t *p_j2k,
3152                                     OPJ_BYTE * p_header_data,
3153                                     OPJ_UINT32 p_header_size,
3154                                     opj_event_mgr_t * p_manager
3155                                     )
3156 {
3157         OPJ_UINT32 i, l_nb_comp, l_tmp;
3158         opj_image_t * l_image = 00;
3159         OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
3160         OPJ_UINT32 l_chunk_size, l_comp_room;
3161
3162         opj_cp_t *l_cp = 00;
3163         opj_tcp_t *l_tcp = 00;
3164         opj_poc_t *l_current_poc = 00;
3165
3166         /* preconditions */
3167         assert(p_header_data != 00);
3168         assert(p_j2k != 00);
3169         assert(p_manager != 00);
3170
3171         l_image = p_j2k->m_private_image;
3172         l_nb_comp = l_image->numcomps;
3173         if (l_nb_comp <= 256) {
3174                 l_comp_room = 1;
3175         }
3176         else {
3177                 l_comp_room = 2;
3178         }
3179         l_chunk_size = 5 + 2 * l_comp_room;
3180         l_current_poc_nb = p_header_size / l_chunk_size;
3181         l_current_poc_remaining = p_header_size % l_chunk_size;
3182
3183         if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
3184                 opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
3185                 return OPJ_FALSE;
3186         }
3187
3188         l_cp = &(p_j2k->m_cp);
3189         l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
3190                                 &l_cp->tcps[p_j2k->m_current_tile_number] :
3191                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
3192         l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
3193         l_current_poc_nb += l_old_poc_nb;
3194
3195         if(l_current_poc_nb >= 32)
3196           {
3197           opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
3198           return OPJ_FALSE;
3199           }
3200         assert(l_current_poc_nb < 32);
3201
3202         /* now poc is in use.*/
3203         l_tcp->POC = 1;
3204
3205         l_current_poc = &l_tcp->pocs[l_old_poc_nb];
3206         for     (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
3207                 opj_read_bytes(p_header_data,&(l_current_poc->resno0),1);                               /* RSpoc_i */
3208                 ++p_header_data;
3209                 opj_read_bytes(p_header_data,&(l_current_poc->compno0),l_comp_room);    /* CSpoc_i */
3210                 p_header_data+=l_comp_room;
3211                 opj_read_bytes(p_header_data,&(l_current_poc->layno1),2);                               /* LYEpoc_i */
3212                 /* make sure layer end is in acceptable bounds */
3213                 l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
3214                 p_header_data+=2;
3215                 opj_read_bytes(p_header_data,&(l_current_poc->resno1),1);                               /* REpoc_i */
3216                 ++p_header_data;
3217                 opj_read_bytes(p_header_data,&(l_current_poc->compno1),l_comp_room);    /* CEpoc_i */
3218                 p_header_data+=l_comp_room;
3219                 opj_read_bytes(p_header_data,&l_tmp,1);                                                                 /* Ppoc_i */
3220                 ++p_header_data;
3221                 l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
3222                 /* make sure comp is in acceptable bounds */
3223                 l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
3224                 ++l_current_poc;
3225         }
3226
3227         l_tcp->numpocs = l_current_poc_nb - 1;
3228         return OPJ_TRUE;
3229 }
3230
3231 /**
3232  * Reads a CRG marker (Component registration)
3233  *
3234  * @param       p_header_data   the data contained in the TLM box.
3235  * @param       p_j2k                   the jpeg2000 codec.
3236  * @param       p_header_size   the size of the data contained in the TLM marker.
3237  * @param       p_manager               the user event manager.
3238 */
3239 static OPJ_BOOL opj_j2k_read_crg (  opj_j2k_t *p_j2k,
3240                                     OPJ_BYTE * p_header_data,
3241                                     OPJ_UINT32 p_header_size,
3242                                     opj_event_mgr_t * p_manager
3243                                     )
3244 {
3245         OPJ_UINT32 l_nb_comp;
3246         /* preconditions */
3247         assert(p_header_data != 00);
3248         assert(p_j2k != 00);
3249         assert(p_manager != 00);
3250
3251         l_nb_comp = p_j2k->m_private_image->numcomps;
3252
3253         if (p_header_size != l_nb_comp *4) {
3254                 opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
3255                 return OPJ_FALSE;
3256         }
3257         /* Do not care of this at the moment since only local variables are set here */
3258         /*
3259         for
3260                 (i = 0; i < l_nb_comp; ++i)
3261         {
3262                 opj_read_bytes(p_header_data,&l_Xcrg_i,2);                              // Xcrg_i
3263                 p_header_data+=2;
3264                 opj_read_bytes(p_header_data,&l_Ycrg_i,2);                              // Xcrg_i
3265                 p_header_data+=2;
3266         }
3267         */
3268         return OPJ_TRUE;
3269 }
3270
3271 /**
3272  * Reads a TLM marker (Tile Length Marker)
3273  *
3274  * @param       p_header_data   the data contained in the TLM box.
3275  * @param       p_j2k                   the jpeg2000 codec.
3276  * @param       p_header_size   the size of the data contained in the TLM marker.
3277  * @param       p_manager               the user event manager.
3278 */
3279 static OPJ_BOOL opj_j2k_read_tlm (  opj_j2k_t *p_j2k,
3280                                     OPJ_BYTE * p_header_data,
3281                                     OPJ_UINT32 p_header_size,
3282                                     opj_event_mgr_t * p_manager
3283                                     )
3284 {
3285         OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient, l_Ptlm_size;
3286         /* preconditions */
3287         assert(p_header_data != 00);
3288         assert(p_j2k != 00);
3289         assert(p_manager != 00);
3290
3291         if (p_header_size < 2) {
3292                 opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
3293                 return OPJ_FALSE;
3294         }
3295         p_header_size -= 2;
3296
3297         opj_read_bytes(p_header_data,&l_Ztlm,1);                                /* Ztlm */
3298         ++p_header_data;
3299         opj_read_bytes(p_header_data,&l_Stlm,1);                                /* Stlm */
3300         ++p_header_data;
3301
3302         l_ST = ((l_Stlm >> 4) & 0x3);
3303         l_SP = (l_Stlm >> 6) & 0x1;
3304
3305         l_Ptlm_size = (l_SP + 1) * 2;
3306         l_quotient = l_Ptlm_size + l_ST;
3307
3308         l_tot_num_tp_remaining = p_header_size % l_quotient;
3309
3310         if (l_tot_num_tp_remaining != 0) {
3311                 opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
3312                 return OPJ_FALSE;
3313         }
3314         /* FIXME Do not care of this at the moment since only local variables are set here */
3315         /*
3316         for
3317                 (i = 0; i < l_tot_num_tp; ++i)
3318         {
3319                 opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST);                           // Ttlm_i
3320                 p_header_data += l_ST;
3321                 opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size);            // Ptlm_i
3322                 p_header_data += l_Ptlm_size;
3323         }*/
3324         return OPJ_TRUE;
3325 }
3326
3327 /**
3328  * Reads a PLM marker (Packet length, main header marker)
3329  *
3330  * @param       p_header_data   the data contained in the TLM box.
3331  * @param       p_j2k                   the jpeg2000 codec.
3332  * @param       p_header_size   the size of the data contained in the TLM marker.
3333  * @param       p_manager               the user event manager.
3334 */
3335 static OPJ_BOOL opj_j2k_read_plm (  opj_j2k_t *p_j2k,
3336                                     OPJ_BYTE * p_header_data,
3337                                     OPJ_UINT32 p_header_size,
3338                                     opj_event_mgr_t * p_manager
3339                                     )
3340 {
3341         /* preconditions */
3342         assert(p_header_data != 00);
3343         assert(p_j2k != 00);
3344         assert(p_manager != 00);
3345
3346         if (p_header_size < 1) {
3347                 opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3348                 return OPJ_FALSE;
3349         }
3350         /* Do not care of this at the moment since only local variables are set here */
3351         /*
3352         opj_read_bytes(p_header_data,&l_Zplm,1);                                        // Zplm
3353         ++p_header_data;
3354         --p_header_size;
3355
3356         while
3357                 (p_header_size > 0)
3358         {
3359                 opj_read_bytes(p_header_data,&l_Nplm,1);                                // Nplm
3360                 ++p_header_data;
3361                 p_header_size -= (1+l_Nplm);
3362                 if
3363                         (p_header_size < 0)
3364                 {
3365                         opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3366                         return false;
3367                 }
3368                 for
3369                         (i = 0; i < l_Nplm; ++i)
3370                 {
3371                         opj_read_bytes(p_header_data,&l_tmp,1);                         // Iplm_ij
3372                         ++p_header_data;
3373                         // take only the last seven bytes
3374                         l_packet_len |= (l_tmp & 0x7f);
3375                         if
3376                                 (l_tmp & 0x80)
3377                         {
3378                                 l_packet_len <<= 7;
3379                         }
3380                         else
3381                         {
3382                 // store packet length and proceed to next packet
3383                                 l_packet_len = 0;
3384                         }
3385                 }
3386                 if
3387                         (l_packet_len != 0)
3388                 {
3389                         opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3390                         return false;
3391                 }
3392         }
3393         */
3394         return OPJ_TRUE;
3395 }
3396
3397 /**
3398  * Reads a PLT marker (Packet length, tile-part header)
3399  *
3400  * @param       p_header_data   the data contained in the PLT box.
3401  * @param       p_j2k                   the jpeg2000 codec.
3402  * @param       p_header_size   the size of the data contained in the PLT marker.
3403  * @param       p_manager               the user event manager.
3404 */
3405 static OPJ_BOOL opj_j2k_read_plt (  opj_j2k_t *p_j2k,
3406                                     OPJ_BYTE * p_header_data,
3407                                     OPJ_UINT32 p_header_size,
3408                                     opj_event_mgr_t * p_manager
3409                                     )
3410 {
3411         OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
3412
3413         /* preconditions */
3414         assert(p_header_data != 00);
3415         assert(p_j2k != 00);
3416         assert(p_manager != 00);
3417
3418         if (p_header_size < 1) {
3419                 opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3420                 return OPJ_FALSE;
3421         }
3422
3423         opj_read_bytes(p_header_data,&l_Zplt,1);                /* Zplt */
3424         ++p_header_data;
3425         --p_header_size;
3426
3427         for (i = 0; i < p_header_size; ++i) {
3428                 opj_read_bytes(p_header_data,&l_tmp,1);         /* Iplt_ij */
3429                 ++p_header_data;
3430                 /* take only the last seven bytes */
3431                 l_packet_len |= (l_tmp & 0x7f);
3432                 if (l_tmp & 0x80) {
3433                         l_packet_len <<= 7;
3434                 }
3435                 else {
3436             /* store packet length and proceed to next packet */
3437                         l_packet_len = 0;
3438                 }
3439         }
3440
3441         if (l_packet_len != 0) {
3442                 opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3443                 return OPJ_FALSE;
3444         }
3445
3446         return OPJ_TRUE;
3447 }
3448
3449 #if 0
3450 OPJ_BOOL j2k_read_ppm_v2 (
3451                                                 opj_j2k_t *p_j2k,
3452                                                 OPJ_BYTE * p_header_data,
3453                                                 OPJ_UINT32 p_header_size,
3454                                                 struct opj_event_mgr * p_manager
3455                                         )
3456 {
3457
3458         opj_cp_t *l_cp = 00;
3459         OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;
3460
3461         /* preconditions */
3462         assert(p_header_data != 00);
3463         assert(p_j2k != 00);
3464         assert(p_manager != 00);
3465
3466         if (p_header_size < 1) {
3467                 opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3468                 return OPJ_FALSE;
3469         }
3470
3471         l_cp = &(p_j2k->m_cp);
3472         l_cp->ppm = 1;
3473
3474         opj_read_bytes(p_header_data,&l_Z_ppm,1);               /* Z_ppm */
3475         ++p_header_data;
3476         --p_header_size;
3477
3478         /* First PPM marker */
3479         if (l_Z_ppm == 0) {
3480                 if (p_header_size < 4) {
3481                         opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3482                         return OPJ_FALSE;
3483                 }
3484
3485                 opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */
3486                 p_header_data+=4;
3487                 p_header_size-=4;
3488
3489                 /* First PPM marker: Initialization */
3490                 l_cp->ppm_len = l_N_ppm;
3491                 l_cp->ppm_data_size = 0;
3492
3493                 l_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len);
3494                 if (l_cp->ppm_buffer == 00) {
3495                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n");
3496                         return OPJ_FALSE;
3497                 }
3498                 memset(l_cp->ppm_buffer,0,l_cp->ppm_len);
3499
3500                 l_cp->ppm_data = l_cp->ppm_buffer;
3501         }
3502
3503         while (1) {
3504                 if (l_cp->ppm_data_size == l_cp->ppm_len) {
3505                         if (p_header_size >= 4) {
3506                                 /* read a N_ppm */
3507                                 opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */
3508                                 p_header_data+=4;
3509                                 p_header_size-=4;
3510                                 l_cp->ppm_len += l_N_ppm ;
3511
3512                                 OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);
3513                                 if (! new_ppm_buffer) {
3514                                         opj_free(l_cp->ppm_buffer);
3515                                         l_cp->ppm_buffer = NULL;
3516                                         l_cp->ppm_len = 0;
3517                                         l_cp->ppm_data = NULL;
3518                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n");
3519                                         return OPJ_FALSE;
3520                                 }
3521                                 l_cp->ppm_buffer = new_ppm_buffer;
3522                                 memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);
3523                                 l_cp->ppm_data = l_cp->ppm_buffer;
3524                         }
3525                         else {
3526                                 return OPJ_FALSE;
3527                         }
3528                 }
3529
3530                 l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;
3531
3532                 if (l_remaining_data <= p_header_size) {
3533                         /* we must store less information than available in the packet */
3534                         memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);
3535                         l_cp->ppm_data_size = l_cp->ppm_len;
3536                         p_header_size -= l_remaining_data;
3537                         p_header_data += l_remaining_data;
3538                 }
3539                 else {
3540                         memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);
3541                         l_cp->ppm_data_size += p_header_size;
3542                         p_header_data += p_header_size;
3543                         p_header_size = 0;
3544                         break;
3545                 }
3546         }
3547
3548         return OPJ_TRUE;
3549 }
3550 #endif
3551
3552 OPJ_BOOL j2k_read_ppm_v3 (
3553                                                 opj_j2k_t *p_j2k,
3554                                                 OPJ_BYTE * p_header_data,
3555                                                 OPJ_UINT32 p_header_size,
3556                                                 struct opj_event_mgr * p_manager
3557                                         )
3558 {
3559         opj_cp_t *l_cp = 00;
3560         OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;
3561
3562         /* preconditions */
3563         assert(p_header_data != 00);
3564         assert(p_j2k != 00);
3565         assert(p_manager != 00);
3566
3567         /* Minimum size of PPM marker is equal to the size of Zppm element */
3568         if (p_header_size < 1) {
3569                 opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3570                 return OPJ_FALSE;
3571         }
3572
3573         l_cp = &(p_j2k->m_cp);
3574         l_cp->ppm = 1;
3575
3576         opj_read_bytes(p_header_data,&l_Z_ppm,1);               /* Z_ppm */
3577         ++p_header_data;
3578         --p_header_size;
3579
3580         /* First PPM marker */
3581         if (l_Z_ppm == 0) {
3582                 if (l_cp->ppm_data != NULL) {
3583                         opj_event_msg(p_manager, EVT_ERROR, "Zppm O already processed. Found twice.\n");
3584                         opj_free(l_cp->ppm_data);
3585                         l_cp->ppm_data = NULL;
3586                         l_cp->ppm_buffer = NULL;
3587                         l_cp->ppm = 0; /* do not use PPM */
3588                         return OPJ_FALSE;
3589                 }
3590                 /* We need now at least the Nppm^0 element */
3591                 if (p_header_size < 4) {
3592                         opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3593                         return OPJ_FALSE;
3594                 }
3595
3596                 opj_read_bytes(p_header_data,&l_N_ppm,4);               /* First N_ppm */
3597                 p_header_data+=4;
3598                 p_header_size-=4;
3599
3600                 /* sanity check: how much bytes is left for Ippm */
3601                 if( p_header_size < l_N_ppm )
3602                   {
3603                   opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\n", p_header_size, l_N_ppm, l_Z_ppm );
3604                   opj_free(l_cp->ppm_data);
3605                   l_cp->ppm_data = NULL;
3606                   l_cp->ppm_buffer = NULL;
3607                   l_cp->ppm = 0; /* do not use PPM */
3608                   return OPJ_FALSE;
3609                   }
3610
3611                 /* First PPM marker: Initialization */
3612                 l_cp->ppm_len = l_N_ppm;
3613                 l_cp->ppm_data_read = 0;
3614
3615                 l_cp->ppm_data = (OPJ_BYTE *) opj_calloc(1,l_cp->ppm_len);
3616                 l_cp->ppm_buffer = l_cp->ppm_data;
3617                 if (l_cp->ppm_data == 00) {
3618                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read ppm marker\n");
3619                         return OPJ_FALSE;
3620                 }
3621
3622                 l_cp->ppm_data_current = l_cp->ppm_data;
3623
3624                 /*l_cp->ppm_data = l_cp->ppm_buffer;*/
3625         }
3626         else {
3627                 if (p_header_size < 4) {
3628                         opj_event_msg(p_manager, EVT_WARNING, "Empty PPM marker\n");
3629                         return OPJ_TRUE;
3630                 }
3631                 else {
3632                         /* Uncompleted Ippm series in the previous PPM marker?*/
3633                         if (l_cp->ppm_data_read < l_cp->ppm_len) {
3634                                 /* Get the place where add the remaining Ippm series*/
3635                                 l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_data_read]);
3636                                 l_N_ppm = l_cp->ppm_len - l_cp->ppm_data_read;
3637                         }
3638                         else {
3639                                 OPJ_BYTE *new_ppm_data;
3640                                 opj_read_bytes(p_header_data,&l_N_ppm,4);               /* First N_ppm */
3641                                 p_header_data+=4;
3642                                 p_header_size-=4;
3643
3644                                 /* sanity check: how much bytes is left for Ippm */
3645                                 if( p_header_size < l_N_ppm )
3646                                   {
3647                                   opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\n", p_header_size, l_N_ppm, l_Z_ppm );
3648                                   opj_free(l_cp->ppm_data);
3649                                   l_cp->ppm_data = NULL;
3650                                   l_cp->ppm_buffer = NULL;
3651                                   l_cp->ppm = 0; /* do not use PPM */
3652                                   return OPJ_FALSE;
3653                                   }
3654                                 /* Increase the size of ppm_data to add the new Ippm series*/
3655                                 assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
3656                                 new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
3657                                 if (! new_ppm_data) {
3658                                         opj_free(l_cp->ppm_data);
3659                                         l_cp->ppm_data = NULL;
3660                                         l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
3661                                         l_cp->ppm_len = 0;
3662                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new Ippm series\n");
3663                                         return OPJ_FALSE;
3664                                 }
3665                                 l_cp->ppm_data = new_ppm_data;
3666                                 l_cp->ppm_buffer = l_cp->ppm_data;
3667
3668                                 /* Keep the position of the place where concatenate the new series*/
3669                                 l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
3670                                 l_cp->ppm_len += l_N_ppm;
3671                         }
3672                 }
3673         }
3674
3675         l_remaining_data = p_header_size;
3676
3677         while (l_remaining_data >= l_N_ppm) {
3678                 /* read a complete Ippm series*/
3679                 memcpy(l_cp->ppm_data_current, p_header_data, l_N_ppm);
3680                 p_header_size -= l_N_ppm;
3681                 p_header_data += l_N_ppm;
3682
3683                 l_cp->ppm_data_read += l_N_ppm; /* Increase the number of data read*/
3684
3685                 if (p_header_size)
3686                 {
3687                         if (p_header_size < 4) {
3688                                 opj_free(l_cp->ppm_data);
3689                                 l_cp->ppm_data = NULL;
3690                                 l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
3691                                 l_cp->ppm_len = 0;
3692                                 l_cp->ppm = 0;
3693                                 opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3694                                 return OPJ_FALSE;
3695                         }
3696                         opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm^i */
3697                         p_header_data+=4;
3698                         p_header_size-=4;
3699                 }
3700                 else {
3701                         l_remaining_data = p_header_size;
3702                         break;
3703                 }
3704
3705                 l_remaining_data = p_header_size;
3706
3707                 /* Next Ippm series is a complete series ?*/
3708                 if (l_remaining_data >= l_N_ppm) {
3709                         OPJ_BYTE *new_ppm_data;
3710                         /* Increase the size of ppm_data to add the new Ippm series*/
3711                         assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
3712                         /* Overflow check */
3713                         if ((l_cp->ppm_len + l_N_ppm) < l_N_ppm) {
3714                                 opj_free(l_cp->ppm_data);
3715                                 l_cp->ppm_data = NULL;
3716                                 l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
3717                                 l_cp->ppm_len = 0;
3718                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\n");
3719                                 return OPJ_FALSE;
3720                         }
3721                         new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
3722                         if (! new_ppm_data) {
3723                                 opj_free(l_cp->ppm_data);
3724                                 l_cp->ppm_data = NULL;
3725                                 l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
3726                                 l_cp->ppm_len = 0;
3727                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\n");
3728                                 return OPJ_FALSE;
3729                         }
3730                         l_cp->ppm_data = new_ppm_data;
3731                         l_cp->ppm_buffer = l_cp->ppm_data;
3732
3733                         /* Keep the position of the place where concatenate the new series */
3734                         l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
3735                         l_cp->ppm_len += l_N_ppm;
3736                 }
3737
3738         }
3739
3740         /* Need to read an incomplete Ippm series*/
3741         if (l_remaining_data) {
3742                 OPJ_BYTE *new_ppm_data;
3743                 assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
3744
3745                 /* Overflow check */
3746                 if ((l_cp->ppm_len + l_N_ppm) < l_N_ppm) {
3747                         opj_free(l_cp->ppm_data);
3748                         l_cp->ppm_data = NULL;
3749                         l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
3750                         l_cp->ppm_len = 0;
3751                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\n");
3752                         return OPJ_FALSE;
3753                 }
3754                 new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
3755                 if (! new_ppm_data) {
3756                         opj_free(l_cp->ppm_data);
3757                         l_cp->ppm_data = NULL;
3758                         l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
3759                         l_cp->ppm_len = 0;
3760                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (incomplete) Ippm series\n");
3761                         return OPJ_FALSE;
3762                 }
3763                 l_cp->ppm_data = new_ppm_data;
3764                 l_cp->ppm_buffer = l_cp->ppm_data;
3765
3766                 /* Keep the position of the place where concatenate the new series*/
3767                 l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
3768                 l_cp->ppm_len += l_N_ppm;
3769
3770                 /* Read incomplete Ippm series*/
3771                 memcpy(l_cp->ppm_data_current, p_header_data, l_remaining_data);
3772                 p_header_size -= l_remaining_data;
3773                 p_header_data += l_remaining_data;
3774
3775                 l_cp->ppm_data_read += l_remaining_data; /* Increase the number of data read*/
3776         }
3777
3778 #ifdef CLEAN_MSD
3779
3780                 if (l_cp->ppm_data_size == l_cp->ppm_len) {
3781                         if (p_header_size >= 4) {
3782                                 /* read a N_ppm*/
3783                                 opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */
3784                                 p_header_data+=4;
3785                                 p_header_size-=4;
3786                                 l_cp->ppm_len += l_N_ppm ;
3787
3788                                 OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);
3789                                 if (! new_ppm_buffer) {
3790                                         opj_free(l_cp->ppm_buffer);
3791                                         l_cp->ppm_buffer = NULL;
3792                                         l_cp->ppm_len = 0;
3793                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read ppm marker\n");
3794                                         return OPJ_FALSE;
3795                                 }
3796                                 l_cp->ppm_buffer = new_ppm_buffer;
3797                                 memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);
3798
3799                                 l_cp->ppm_data = l_cp->ppm_buffer;
3800                         }
3801                         else {
3802                                 return OPJ_FALSE;
3803                         }
3804                 }
3805
3806                 l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;
3807
3808                 if (l_remaining_data <= p_header_size) {
3809                         /* we must store less information than available in the packet */
3810                         memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);
3811                         l_cp->ppm_data_size = l_cp->ppm_len;
3812                         p_header_size -= l_remaining_data;
3813                         p_header_data += l_remaining_data;
3814                 }
3815                 else {
3816                         memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);
3817                         l_cp->ppm_data_size += p_header_size;
3818                         p_header_data += p_header_size;
3819                         p_header_size = 0;
3820                         break;
3821                 }
3822         }
3823 #endif
3824         return OPJ_TRUE;
3825 }
3826
3827 /**
3828  * Reads a PPT marker (Packed packet headers, tile-part header)
3829  *
3830  * @param       p_header_data   the data contained in the PPT box.
3831  * @param       p_j2k                   the jpeg2000 codec.
3832  * @param       p_header_size   the size of the data contained in the PPT marker.
3833  * @param       p_manager               the user event manager.
3834 */
3835 static OPJ_BOOL opj_j2k_read_ppt (  opj_j2k_t *p_j2k,
3836                                     OPJ_BYTE * p_header_data,
3837                                     OPJ_UINT32 p_header_size,
3838                                     opj_event_mgr_t * p_manager
3839                                     )
3840 {
3841         opj_cp_t *l_cp = 00;
3842         opj_tcp_t *l_tcp = 00;
3843         OPJ_UINT32 l_Z_ppt;
3844
3845         /* preconditions */
3846         assert(p_header_data != 00);
3847         assert(p_j2k != 00);
3848         assert(p_manager != 00);
3849
3850         /* We need to have the Z_ppt element at minimum */
3851         if (p_header_size < 1) {
3852                 opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
3853                 return OPJ_FALSE;
3854         }
3855
3856         l_cp = &(p_j2k->m_cp);
3857         if (l_cp->ppm){
3858                 opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
3859                 return OPJ_FALSE;
3860         }
3861
3862         l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
3863         l_tcp->ppt = 1;
3864
3865         opj_read_bytes(p_header_data,&l_Z_ppt,1);               /* Z_ppt */
3866         ++p_header_data;
3867         --p_header_size;
3868
3869         /* Allocate buffer to read the packet header */
3870         if (l_Z_ppt == 0) {
3871                 /* First PPT marker */
3872                 l_tcp->ppt_data_size = 0;
3873                 l_tcp->ppt_len = p_header_size;
3874
3875                 opj_free(l_tcp->ppt_buffer);
3876                 l_tcp->ppt_buffer = (OPJ_BYTE *) opj_calloc(l_tcp->ppt_len, sizeof(OPJ_BYTE) );
3877                 if (l_tcp->ppt_buffer == 00) {
3878                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
3879                         return OPJ_FALSE;
3880                 }
3881                 l_tcp->ppt_data = l_tcp->ppt_buffer;
3882
3883                 /* memset(l_tcp->ppt_buffer,0,l_tcp->ppt_len); */
3884         }
3885         else {
3886                 OPJ_BYTE *new_ppt_buffer;
3887                 l_tcp->ppt_len += p_header_size;
3888
3889                 new_ppt_buffer = (OPJ_BYTE *) opj_realloc(l_tcp->ppt_buffer, l_tcp->ppt_len);
3890                 if (! new_ppt_buffer) {
3891                         opj_free(l_tcp->ppt_buffer);
3892                         l_tcp->ppt_buffer = NULL;
3893                         l_tcp->ppt_len = 0;
3894                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
3895                         return OPJ_FALSE;
3896                 }
3897                 l_tcp->ppt_buffer = new_ppt_buffer;
3898                 l_tcp->ppt_data = l_tcp->ppt_buffer;
3899
3900                 memset(l_tcp->ppt_buffer+l_tcp->ppt_data_size,0,p_header_size);
3901         }
3902
3903         /* Read packet header from buffer */
3904         memcpy(l_tcp->ppt_buffer+l_tcp->ppt_data_size,p_header_data,p_header_size);
3905
3906         l_tcp->ppt_data_size += p_header_size;
3907
3908         return OPJ_TRUE;
3909 }
3910
3911 OPJ_BOOL opj_j2k_write_tlm(     opj_j2k_t *p_j2k,
3912                                                         opj_stream_private_t *p_stream,
3913                                                         opj_event_mgr_t * p_manager
3914                             )
3915 {
3916         OPJ_BYTE * l_current_data = 00;
3917         OPJ_UINT32 l_tlm_size;
3918
3919         /* preconditions */
3920         assert(p_j2k != 00);
3921         assert(p_manager != 00);
3922         assert(p_stream != 00);
3923
3924         l_tlm_size = 6 + (5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
3925
3926         if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3927                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);
3928                 if (! new_header_tile_data) {
3929                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3930                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3931                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3932                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n");
3933                         return OPJ_FALSE;
3934                 }
3935                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3936                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
3937         }
3938
3939         l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
3940
3941         /* change the way data is written to avoid seeking if possible */
3942         /* TODO */
3943         p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
3944
3945         opj_write_bytes(l_current_data,J2K_MS_TLM,2);                                   /* TLM */
3946         l_current_data += 2;
3947
3948         opj_write_bytes(l_current_data,l_tlm_size-2,2);                                 /* Lpoc */
3949         l_current_data += 2;
3950
3951         opj_write_bytes(l_current_data,0,1);                                                    /* Ztlm=0*/
3952         ++l_current_data;
3953
3954         opj_write_bytes(l_current_data,0x50,1);                                                 /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
3955         ++l_current_data;
3956
3957         /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
3958         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_tlm_size,p_manager) != l_tlm_size) {
3959                 return OPJ_FALSE;
3960         }
3961
3962         return OPJ_TRUE;
3963 }
3964
3965 OPJ_BOOL opj_j2k_write_sot(     opj_j2k_t *p_j2k,
3966                                                         OPJ_BYTE * p_data,
3967                                                         OPJ_UINT32 * p_data_written,
3968                                                         const opj_stream_private_t *p_stream,
3969                                                         opj_event_mgr_t * p_manager
3970                             )
3971 {
3972         /* preconditions */
3973         assert(p_j2k != 00);
3974         assert(p_manager != 00);
3975         assert(p_stream != 00);
3976
3977         opj_write_bytes(p_data,J2K_MS_SOT,2);                                   /* SOT */
3978         p_data += 2;
3979
3980         opj_write_bytes(p_data,10,2);                                                   /* Lsot */
3981         p_data += 2;
3982
3983         opj_write_bytes(p_data, p_j2k->m_current_tile_number,2);                        /* Isot */
3984         p_data += 2;
3985
3986         /* Psot  */
3987         p_data += 4;
3988
3989         opj_write_bytes(p_data, p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,1);                        /* TPsot */
3990         ++p_data;
3991
3992         opj_write_bytes(p_data, p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,1);                      /* TNsot */
3993         ++p_data;
3994
3995         /* UniPG>> */
3996 #ifdef USE_JPWL
3997         /* update markers struct */
3998 /*
3999         OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
4000 */
4001   assert( 0 && "TODO" );
4002 #endif /* USE_JPWL */
4003
4004         * p_data_written = 12;
4005
4006         return OPJ_TRUE;
4007 }
4008
4009 OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k,
4010                             OPJ_BYTE * p_header_data,
4011                             OPJ_UINT32 p_header_size,
4012                             opj_event_mgr_t * p_manager )
4013 {
4014         opj_cp_t *l_cp = 00;
4015         opj_tcp_t *l_tcp = 00;
4016         OPJ_UINT32 l_tot_len, l_num_parts = 0;
4017         OPJ_UINT32 l_current_part;
4018         OPJ_UINT32 l_tile_x,l_tile_y;
4019
4020         /* preconditions */
4021         assert(p_header_data != 00);
4022         assert(p_j2k != 00);
4023         assert(p_manager != 00);
4024
4025         /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
4026         if (p_header_size != 8) {
4027                 opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4028                 return OPJ_FALSE;
4029         }
4030
4031         l_cp = &(p_j2k->m_cp);
4032         opj_read_bytes(p_header_data,&(p_j2k->m_current_tile_number),2);                /* Isot */
4033         p_header_data+=2;
4034
4035         /* testcase 2.pdf.SIGFPE.706.1112 */
4036         if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
4037                 opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n", p_j2k->m_current_tile_number);
4038                 return OPJ_FALSE;
4039         }
4040
4041         l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
4042         l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
4043         l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
4044
4045 #ifdef USE_JPWL
4046         if (l_cp->correct) {
4047
4048                 OPJ_UINT32 tileno = p_j2k->m_current_tile_number;
4049                 static OPJ_UINT32 backup_tileno = 0;
4050
4051                 /* tileno is negative or larger than the number of tiles!!! */
4052                 if (tileno > (l_cp->tw * l_cp->th)) {
4053                         opj_event_msg(p_manager, EVT_ERROR,
4054                                         "JPWL: bad tile number (%d out of a maximum of %d)\n",
4055                                         tileno, (l_cp->tw * l_cp->th));
4056                         if (!JPWL_ASSUME) {
4057                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4058                                 return OPJ_FALSE;
4059                         }
4060                         /* we try to correct */
4061                         tileno = backup_tileno;
4062                         opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
4063                                         "- setting tile number to %d\n",
4064                                         tileno);
4065                 }
4066
4067                 /* keep your private count of tiles */
4068                 backup_tileno++;
4069         };
4070 #endif /* USE_JPWL */
4071
4072         /* look for the tile in the list of already processed tile (in parts). */
4073         /* Optimization possible here with a more complex data structure and with the removing of tiles */
4074         /* since the time taken by this function can only grow at the time */
4075
4076         opj_read_bytes(p_header_data,&l_tot_len,4);             /* Psot */
4077         p_header_data+=4;
4078
4079         /* PSot should be equal to zero or >=14 or <= 2^32-1 */
4080         if ((l_tot_len !=0 ) && (l_tot_len < 14) )
4081         {
4082             if (l_tot_len == 12 ) /* MSD: Special case for the PHR data which are read by kakadu*/
4083             {
4084                 opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n", l_tot_len);
4085             }
4086             else
4087             {
4088                 opj_event_msg(p_manager, EVT_ERROR, "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
4089                 return OPJ_FALSE;
4090             }
4091         }
4092
4093 #ifdef USE_JPWL
4094         if (l_cp->correct) {
4095
4096                 /* totlen is negative or larger than the bytes left!!! */
4097                 if (/*(l_tot_len < 0) ||*/ (l_tot_len > p_header_size ) ) { /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */
4098                         opj_event_msg(p_manager, EVT_ERROR,
4099                                         "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
4100                                         l_tot_len, p_header_size ); /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */
4101                         if (!JPWL_ASSUME) {
4102                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4103                                 return OPJ_FALSE;
4104                         }
4105                         /* we try to correct */
4106                         l_tot_len = 0;
4107                         opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
4108                                         "- setting Psot to %d => assuming it is the last tile\n",
4109                                         l_tot_len);
4110                 }
4111                 };
4112 #endif /* USE_JPWL */
4113
4114                 /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/
4115                 if (!l_tot_len) {
4116                         opj_event_msg(p_manager, EVT_INFO, "Psot value of the current tile-part is equal to zero, "
4117                                         "we assuming it is the last tile-part of the codestream.\n");
4118                         p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4119                 }
4120
4121                 opj_read_bytes(p_header_data,&l_current_part ,1);       /* TPsot */
4122                 ++p_header_data;
4123
4124                 opj_read_bytes(p_header_data,&l_num_parts ,1);          /* TNsot */
4125                 ++p_header_data;
4126
4127                 if (l_num_parts != 0) { /* Number of tile-part header is provided by this tile-part header */
4128                         /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of
4129                          * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */
4130                         if (l_tcp->m_nb_tile_parts) {
4131                                 if (l_current_part >= l_tcp->m_nb_tile_parts){
4132                                         opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current "
4133                                                         "number of tile-part (%d), giving up\n", l_current_part, l_tcp->m_nb_tile_parts );
4134                                         p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4135                                         return OPJ_FALSE;
4136                                 }
4137                         }
4138                         if( l_current_part >= l_num_parts ) {
4139                           /* testcase 451.pdf.SIGSEGV.ce9.3723 */
4140                           opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current "
4141                             "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts );
4142                           p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4143                           return OPJ_FALSE;
4144                         }
4145                         l_tcp->m_nb_tile_parts = l_num_parts;
4146                 }
4147
4148                 /* If know the number of tile part header we will check if we didn't read the last*/
4149                 if (l_tcp->m_nb_tile_parts) {
4150                         if (l_tcp->m_nb_tile_parts == (l_current_part+1)) {
4151                                 p_j2k->m_specific_param.m_decoder.m_can_decode = 1; /* Process the last tile-part header*/
4152                         }
4153                 }
4154
4155                 if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part){
4156                         /* Keep the size of data to skip after this marker */
4157                         p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len - 12; /* SOT_marker_size = 12 */
4158                 }
4159                 else {
4160                         /* FIXME: need to be computed from the number of bytes remaining in the codestream */
4161                         p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
4162                 }
4163
4164                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;
4165
4166                 /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/
4167                 if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
4168                         p_j2k->m_specific_param.m_decoder.m_skip_data =
4169                                 (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
4170                                 ||      (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
4171                                 ||  (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
4172                                 ||      (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
4173                 }
4174                 else {
4175                         assert( p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0 );
4176                         p_j2k->m_specific_param.m_decoder.m_skip_data =
4177                                 (p_j2k->m_current_tile_number != (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);
4178                 }
4179
4180                 /* Index */
4181                 if (p_j2k->cstr_index)
4182                 {
4183                         assert(p_j2k->cstr_index->tile_index != 00);
4184                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
4185                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno = l_current_part;
4186
4187                         if (l_num_parts != 0){
4188                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps = l_num_parts;
4189                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_num_parts;
4190
4191                                 if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4192                                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4193                                                 (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
4194                                         if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4195                                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n");
4196                                                 return OPJ_FALSE;
4197                                                                                                                                                                 }
4198                                 }
4199                                 else {
4200                                         opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
4201                                                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index, l_num_parts* sizeof(opj_tp_index_t));
4202                                         if (! new_tp_index) {
4203                                                 opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
4204                                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
4205                                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n");
4206                                                 return OPJ_FALSE;
4207                                         }
4208                                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;
4209                                 }
4210                         }
4211                         else{
4212                                 /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
4213
4214                                         if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4215                                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
4216                                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4217                                                         (opj_tp_index_t*)opj_calloc( p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
4218                                                                         sizeof(opj_tp_index_t));
4219                                                                                                                                                                                                 if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4220                                                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
4221                                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n");
4222                                                         return OPJ_FALSE;
4223                                                                                                                                                                         }
4224                                         }
4225
4226                                         if ( l_current_part >= p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps ){
4227                                                 opj_tp_index_t *new_tp_index;
4228                                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_current_part + 1;
4229                                                 new_tp_index = (opj_tp_index_t *) opj_realloc(
4230                                                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4231                                                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps * sizeof(opj_tp_index_t));
4232                                                 if (! new_tp_index) {
4233                                                         opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
4234                                                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
4235                                                         p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
4236                                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n");
4237                                                         return OPJ_FALSE;
4238                                                 }
4239                                                 p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;
4240                                         }
4241                                 }
4242
4243                         }
4244
4245                 }
4246
4247                 /* 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 */
4248                 /* if (p_j2k->cstr_info) {
4249                    if (l_tcp->first) {
4250                    if (tileno == 0) {
4251                    p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;
4252                    }
4253
4254                    p_j2k->cstr_info->tile[tileno].tileno = tileno;
4255                    p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;
4256                    p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
4257                    p_j2k->cstr_info->tile[tileno].num_tps = numparts;
4258
4259                    if (numparts) {
4260                    p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
4261                    }
4262                    else {
4263                    p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
4264                    }
4265                    }
4266                    else {
4267                    p_j2k->cstr_info->tile[tileno].end_pos += totlen;
4268                    }
4269
4270                    p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;
4271                    p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
4272                    p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
4273                    }*/
4274                 return OPJ_TRUE;
4275         }
4276
4277 OPJ_BOOL opj_j2k_write_sod(     opj_j2k_t *p_j2k,
4278                                                         opj_tcd_t * p_tile_coder,
4279                                                         OPJ_BYTE * p_data,
4280                                                         OPJ_UINT32 * p_data_written,
4281                                                         OPJ_UINT32 p_total_data_size,
4282                                                         const opj_stream_private_t *p_stream,
4283                                                         opj_event_mgr_t * p_manager
4284                             )
4285 {
4286         opj_codestream_info_t *l_cstr_info = 00;
4287         OPJ_UINT32 l_remaining_data;
4288
4289         /* preconditions */
4290         assert(p_j2k != 00);
4291         assert(p_manager != 00);
4292         assert(p_stream != 00);
4293
4294         opj_write_bytes(p_data,J2K_MS_SOD,2);                                   /* SOD */
4295         p_data += 2;
4296
4297         /* make room for the EOF marker */
4298         l_remaining_data =  p_total_data_size - 4;
4299
4300         /* update tile coder */
4301         p_tile_coder->tp_num = p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
4302         p_tile_coder->cur_tp_num = p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
4303
4304          /* INDEX >> */
4305         /* TODO mergeV2: check this part which use cstr_info */
4306         /*l_cstr_info = p_j2k->cstr_info;
4307         if (l_cstr_info) {
4308                 if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {
4309                         //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
4310                         l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
4311                 }
4312                 else {*/
4313                         /*
4314                         TODO
4315                         if
4316                                 (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
4317                         {
4318                                 cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
4319                         }*/
4320                 /*}*/
4321                 /* UniPG>> */
4322 #ifdef USE_JPWL
4323                 /* update markers struct */
4324                 /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
4325 */
4326   assert( 0 && "TODO" );
4327 #endif /* USE_JPWL */
4328                 /* <<UniPG */
4329         /*}*/
4330         /* << INDEX */
4331
4332         if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
4333                 p_tile_coder->tcd_image->tiles->packno = 0;
4334                 if (l_cstr_info) {
4335                         l_cstr_info->packno = 0;
4336                 }
4337         }
4338
4339         *p_data_written = 0;
4340
4341         if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number, p_data, p_data_written, l_remaining_data , l_cstr_info)) {
4342                 opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
4343                 return OPJ_FALSE;
4344         }
4345
4346         *p_data_written += 2;
4347
4348         return OPJ_TRUE;
4349 }
4350
4351 OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k,
4352                            opj_stream_private_t *p_stream,
4353                                                    opj_event_mgr_t * p_manager
4354                            )
4355 {
4356         OPJ_SIZE_T l_current_read_size;
4357         opj_codestream_index_t * l_cstr_index = 00;
4358         OPJ_BYTE ** l_current_data = 00;
4359         opj_tcp_t * l_tcp = 00;
4360         OPJ_UINT32 * l_tile_len = 00;
4361         OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
4362
4363         /* preconditions */
4364         assert(p_j2k != 00);
4365         assert(p_manager != 00);
4366         assert(p_stream != 00);
4367
4368         l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4369
4370         if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4371                 /* opj_stream_get_number_byte_left returns OPJ_OFF_T
4372                 // but we are in the last tile part,
4373                 // so its result will fit on OPJ_UINT32 unless we find
4374                 // a file with a single tile part of more than 4 GB...*/
4375                 p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(opj_stream_get_number_byte_left(p_stream) - 2);
4376         }
4377         else {
4378             /* Check to avoid pass the limit of OPJ_UINT32 */
4379             if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2 )
4380                 p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
4381             else {
4382                 /* MSD: case commented to support empty SOT marker (PHR data) */
4383             }
4384         }
4385
4386         l_current_data = &(l_tcp->m_data);
4387         l_tile_len = &l_tcp->m_data_size;
4388
4389         /* Patch to support new PHR data */
4390         if (p_j2k->m_specific_param.m_decoder.m_sot_length) {
4391             /* If we are here, we'll try to read the data after allocation */
4392             /* Check enough bytes left in stream before allocation */
4393             if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length > opj_stream_get_number_byte_left(p_stream)) {
4394                 opj_event_msg(p_manager, EVT_ERROR, "Tile part length size inconsistent with stream length\n");
4395                 return OPJ_FALSE;
4396             }
4397             if (! *l_current_data) {
4398                 /* LH: oddly enough, in this path, l_tile_len!=0.
4399                  * TODO: If this was consistant, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).
4400                  */
4401                 *l_current_data = (OPJ_BYTE*) opj_malloc(p_j2k->m_specific_param.m_decoder.m_sot_length);
4402             }
4403             else {
4404                 OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data, *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length);
4405                 if (! l_new_current_data) {
4406                         opj_free(*l_current_data);
4407                         /*nothing more is done as l_current_data will be set to null, and just
4408                           afterward we enter in the error path
4409                           and the actual tile_len is updated (committed) at the end of the
4410                           function. */
4411                 }
4412                 *l_current_data = l_new_current_data;
4413             }
4414             
4415             if (*l_current_data == 00) {
4416                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n");
4417                 return OPJ_FALSE;
4418             }
4419         }
4420         else {
4421             l_sot_length_pb_detected = OPJ_TRUE;
4422         }
4423
4424         /* Index */
4425         l_cstr_index = p_j2k->cstr_index;
4426         if (l_cstr_index) {
4427                 OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
4428
4429                 OPJ_UINT32 l_current_tile_part = l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
4430                 l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header =
4431                                 l_current_pos;
4432                 l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos =
4433                                 l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
4434
4435                 if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
4436                                         l_cstr_index,
4437                                         J2K_MS_SOD,
4438                                         l_current_pos,
4439                                         p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {
4440                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
4441                         return OPJ_FALSE;
4442                 }
4443
4444                 /*l_cstr_index->packno = 0;*/
4445         }
4446
4447         /* Patch to support new PHR data */
4448         if (!l_sot_length_pb_detected) {
4449             l_current_read_size = opj_stream_read_data(
4450                         p_stream,
4451                         *l_current_data + *l_tile_len,
4452                         p_j2k->m_specific_param.m_decoder.m_sot_length,
4453                         p_manager);
4454         }
4455         else
4456         {
4457             l_current_read_size = 0;
4458         }
4459
4460         if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {
4461                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
4462         }
4463         else {
4464                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
4465         }
4466
4467         *l_tile_len += (OPJ_UINT32)l_current_read_size;
4468
4469         return OPJ_TRUE;
4470 }
4471
4472  OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
4473                             OPJ_UINT32 p_tile_no,
4474                             OPJ_UINT32 p_comp_no,
4475                             OPJ_UINT32 nb_comps,
4476                             opj_stream_private_t *p_stream,
4477                             opj_event_mgr_t * p_manager
4478                             )
4479 {
4480         OPJ_BYTE * l_current_data = 00;
4481         OPJ_UINT32 l_rgn_size;
4482         opj_cp_t *l_cp = 00;
4483         opj_tcp_t *l_tcp = 00;
4484         opj_tccp_t *l_tccp = 00;
4485         OPJ_UINT32 l_comp_room;
4486
4487         /* preconditions */
4488         assert(p_j2k != 00);
4489         assert(p_manager != 00);
4490         assert(p_stream != 00);
4491
4492         l_cp = &(p_j2k->m_cp);
4493         l_tcp = &l_cp->tcps[p_tile_no];
4494         l_tccp = &l_tcp->tccps[p_comp_no];
4495
4496         if (nb_comps <= 256) {
4497                 l_comp_room = 1;
4498         }
4499         else {
4500                 l_comp_room = 2;
4501         }
4502
4503         l_rgn_size = 6 + l_comp_room;
4504
4505         l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
4506
4507         opj_write_bytes(l_current_data,J2K_MS_RGN,2);                                   /* RGN  */
4508         l_current_data += 2;
4509
4510         opj_write_bytes(l_current_data,l_rgn_size-2,2);                                 /* Lrgn */
4511         l_current_data += 2;
4512
4513         opj_write_bytes(l_current_data,p_comp_no,l_comp_room);                          /* Crgn */
4514         l_current_data+=l_comp_room;
4515
4516         opj_write_bytes(l_current_data, 0,1);                                           /* Srgn */
4517         ++l_current_data;
4518
4519         opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,1);                            /* SPrgn */
4520         ++l_current_data;
4521
4522         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_rgn_size,p_manager) != l_rgn_size) {
4523                 return OPJ_FALSE;
4524         }
4525
4526         return OPJ_TRUE;
4527 }
4528
4529 OPJ_BOOL opj_j2k_write_eoc(     opj_j2k_t *p_j2k,
4530                             opj_stream_private_t *p_stream,
4531                             opj_event_mgr_t * p_manager
4532                             )
4533 {
4534         /* preconditions */
4535         assert(p_j2k != 00);
4536         assert(p_manager != 00);
4537         assert(p_stream != 00);
4538
4539         opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,J2K_MS_EOC,2);                                     /* EOC */
4540
4541 /* UniPG>> */
4542 #ifdef USE_JPWL
4543         /* update markers struct */
4544         /*
4545         OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
4546 */
4547 #endif /* USE_JPWL */
4548
4549         if ( opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,2,p_manager) != 2) {
4550                 return OPJ_FALSE;
4551         }
4552
4553         if ( ! opj_stream_flush(p_stream,p_manager) ) {
4554                 return OPJ_FALSE;
4555         }
4556
4557         return OPJ_TRUE;
4558 }
4559
4560 /**
4561  * Reads a RGN marker (Region Of Interest)
4562  *
4563  * @param       p_header_data   the data contained in the POC box.
4564  * @param       p_j2k                   the jpeg2000 codec.
4565  * @param       p_header_size   the size of the data contained in the POC marker.
4566  * @param       p_manager               the user event manager.
4567 */
4568 static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,
4569                                   OPJ_BYTE * p_header_data,
4570                                   OPJ_UINT32 p_header_size,
4571                                   opj_event_mgr_t * p_manager
4572                                   )
4573 {
4574         OPJ_UINT32 l_nb_comp;
4575         opj_image_t * l_image = 00;
4576
4577         opj_cp_t *l_cp = 00;
4578         opj_tcp_t *l_tcp = 00;
4579         OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
4580
4581         /* preconditions*/
4582         assert(p_header_data != 00);
4583         assert(p_j2k != 00);
4584         assert(p_manager != 00);
4585
4586         l_image = p_j2k->m_private_image;
4587         l_nb_comp = l_image->numcomps;
4588
4589         if (l_nb_comp <= 256) {
4590                 l_comp_room = 1; }
4591         else {
4592                 l_comp_room = 2; }
4593
4594         if (p_header_size != 2 + l_comp_room) {
4595                 opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
4596                 return OPJ_FALSE;
4597         }
4598
4599         l_cp = &(p_j2k->m_cp);
4600         l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
4601                                 &l_cp->tcps[p_j2k->m_current_tile_number] :
4602                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
4603
4604         opj_read_bytes(p_header_data,&l_comp_no,l_comp_room);           /* Crgn */
4605         p_header_data+=l_comp_room;
4606         opj_read_bytes(p_header_data,&l_roi_sty,1);                                     /* Srgn */
4607         ++p_header_data;
4608
4609 #ifdef USE_JPWL
4610         if (l_cp->correct) {
4611                 /* totlen is negative or larger than the bytes left!!! */
4612                 if (l_comp_room >= l_nb_comp) {
4613                         opj_event_msg(p_manager, EVT_ERROR,
4614                                 "JPWL: bad component number in RGN (%d when there are only %d)\n",
4615                                 l_comp_room, l_nb_comp);
4616                         if (!JPWL_ASSUME || JPWL_ASSUME) {
4617                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4618                                 return OPJ_FALSE;
4619                         }
4620                 }
4621         };
4622 #endif /* USE_JPWL */
4623
4624         /* testcase 3635.pdf.asan.77.2930 */
4625         if (l_comp_no >= l_nb_comp) {
4626                 opj_event_msg(p_manager, EVT_ERROR,
4627                         "bad component number in RGN (%d when there are only %d)\n",
4628                         l_comp_no, l_nb_comp);
4629                 return OPJ_FALSE;
4630         }
4631
4632         opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&(l_tcp->tccps[l_comp_no].roishift)),1);   /* SPrgn */
4633         ++p_header_data;
4634
4635         return OPJ_TRUE;
4636
4637 }
4638
4639 OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp)
4640 {
4641         return (OPJ_FLOAT32) ((p_tcp->m_nb_tile_parts - 1) * 14);
4642 }
4643
4644 OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp)
4645 {
4646     (void)p_tcp;
4647     return 0;
4648 }
4649
4650 OPJ_BOOL opj_j2k_update_rates(  opj_j2k_t *p_j2k,
4651                                                             opj_stream_private_t *p_stream,
4652                                                             opj_event_mgr_t * p_manager )
4653 {
4654         opj_cp_t * l_cp = 00;
4655         opj_image_t * l_image = 00;
4656         opj_tcp_t * l_tcp = 00;
4657         opj_image_comp_t * l_img_comp = 00;
4658
4659         OPJ_UINT32 i,j,k;
4660         OPJ_INT32 l_x0,l_y0,l_x1,l_y1;
4661         OPJ_FLOAT32 * l_rates = 0;
4662         OPJ_FLOAT32 l_sot_remove;
4663         OPJ_UINT32 l_bits_empty, l_size_pixel;
4664         OPJ_UINT32 l_tile_size = 0;
4665         OPJ_UINT32 l_last_res;
4666         OPJ_FLOAT32 (* l_tp_stride_func)(opj_tcp_t *) = 00;
4667
4668         /* preconditions */
4669         assert(p_j2k != 00);
4670         assert(p_manager != 00);
4671         assert(p_stream != 00);
4672
4673         l_cp = &(p_j2k->m_cp);
4674         l_image = p_j2k->m_private_image;
4675         l_tcp = l_cp->tcps;
4676
4677         l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
4678         l_size_pixel = l_image->numcomps * l_image->comps->prec;
4679         l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(l_cp->th * l_cp->tw);
4680
4681         if (l_cp->m_specific_param.m_enc.m_tp_on) {
4682                 l_tp_stride_func = opj_j2k_get_tp_stride;
4683         }
4684         else {
4685                 l_tp_stride_func = opj_j2k_get_default_stride;
4686         }
4687
4688         for (i=0;i<l_cp->th;++i) {
4689                 for (j=0;j<l_cp->tw;++j) {
4690                         OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) / (OPJ_FLOAT32)l_tcp->numlayers;
4691
4692                         /* 4 borders of the tile rescale on the image if necessary */
4693                         l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx), (OPJ_INT32)l_image->x0);
4694                         l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy), (OPJ_INT32)l_image->y0);
4695                         l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1);
4696                         l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1);
4697
4698                         l_rates = l_tcp->rates;
4699
4700                         /* Modification of the RATE >> */
4701                         if (*l_rates) {
4702                                 *l_rates =              (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))
4703                                                                 /
4704                                                                 ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
4705                                                                 )
4706                                                                 -
4707                                                                 l_offset;
4708                         }
4709
4710                         ++l_rates;
4711
4712                         for (k = 1; k < l_tcp->numlayers; ++k) {
4713                                 if (*l_rates) {
4714                                         *l_rates =              (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))
4715                                                                         /
4716                                                                                 ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
4717                                                                         )
4718                                                                         -
4719                                                                         l_offset;
4720                                 }
4721
4722                                 ++l_rates;
4723                         }
4724
4725                         ++l_tcp;
4726
4727                 }
4728         }
4729
4730         l_tcp = l_cp->tcps;
4731
4732         for (i=0;i<l_cp->th;++i) {
4733                 for     (j=0;j<l_cp->tw;++j) {
4734                         l_rates = l_tcp->rates;
4735
4736                         if (*l_rates) {
4737                                 *l_rates -= l_sot_remove;
4738
4739                                 if (*l_rates < 30) {
4740                                         *l_rates = 30;
4741                                 }
4742                         }
4743
4744                         ++l_rates;
4745
4746                         l_last_res = l_tcp->numlayers - 1;
4747
4748                         for (k = 1; k < l_last_res; ++k) {
4749
4750                                 if (*l_rates) {
4751                                         *l_rates -= l_sot_remove;
4752
4753                                         if (*l_rates < *(l_rates - 1) + 10) {
4754                                                 *l_rates  = (*(l_rates - 1)) + 20;
4755                                         }
4756                                 }
4757
4758                                 ++l_rates;
4759                         }
4760
4761                         if (*l_rates) {
4762                                 *l_rates -= (l_sot_remove + 2.f);
4763
4764                                 if (*l_rates < *(l_rates - 1) + 10) {
4765                                         *l_rates  = (*(l_rates - 1)) + 20;
4766                                 }
4767                         }
4768
4769                         ++l_tcp;
4770                 }
4771         }
4772
4773         l_img_comp = l_image->comps;
4774         l_tile_size = 0;
4775
4776         for (i=0;i<l_image->numcomps;++i) {
4777                 l_tile_size += (        opj_uint_ceildiv(l_cp->tdx,l_img_comp->dx)
4778                                                         *
4779                                                         opj_uint_ceildiv(l_cp->tdy,l_img_comp->dy)
4780                                                         *
4781                                                         l_img_comp->prec
4782                                                 );
4783
4784                 ++l_img_comp;
4785         }
4786
4787         l_tile_size = (OPJ_UINT32) (l_tile_size * 0.1625); /* 1.3/8 = 0.1625 */
4788
4789         l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
4790
4791         p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size;
4792         p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
4793                         (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
4794         if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {
4795                 return OPJ_FALSE;
4796         }
4797
4798         if (OPJ_IS_CINEMA(l_cp->rsiz)) {
4799                 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
4800                                 (OPJ_BYTE *) opj_malloc(5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
4801                 if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
4802                         return OPJ_FALSE;
4803                 }
4804
4805                 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
4806                                 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
4807         }
4808
4809         return OPJ_TRUE;
4810 }
4811
4812 #if 0
4813 OPJ_BOOL opj_j2k_read_eoc (     opj_j2k_t *p_j2k,
4814                                                         opj_stream_private_t *p_stream,
4815                                                         opj_event_mgr_t * p_manager )
4816 {
4817         OPJ_UINT32 i;
4818         opj_tcd_t * l_tcd = 00;
4819         OPJ_UINT32 l_nb_tiles;
4820         opj_tcp_t * l_tcp = 00;
4821         OPJ_BOOL l_success;
4822
4823         /* preconditions */
4824         assert(p_j2k != 00);
4825         assert(p_manager != 00);
4826         assert(p_stream != 00);
4827
4828         l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
4829         l_tcp = p_j2k->m_cp.tcps;
4830
4831         l_tcd = opj_tcd_create(OPJ_TRUE);
4832         if (l_tcd == 00) {
4833                 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
4834                 return OPJ_FALSE;
4835         }
4836
4837         for (i = 0; i < l_nb_tiles; ++i) {
4838                 if (l_tcp->m_data) {
4839                         if (! opj_tcd_init_decode_tile(l_tcd, i)) {
4840                                 opj_tcd_destroy(l_tcd);
4841                                 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
4842                                 return OPJ_FALSE;
4843                         }
4844
4845                         l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i, p_j2k->cstr_index);
4846                         /* cleanup */
4847
4848                         if (! l_success) {
4849                                 p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
4850                                 break;
4851                         }
4852                 }
4853
4854                 opj_j2k_tcp_destroy(l_tcp);
4855                 ++l_tcp;
4856         }
4857
4858         opj_tcd_destroy(l_tcd);
4859         return OPJ_TRUE;
4860 }
4861 #endif
4862
4863 OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
4864                                                         struct opj_stream_private *p_stream,
4865                                                         struct opj_event_mgr * p_manager )
4866 {
4867         /* preconditions */
4868         assert(p_j2k != 00);
4869         assert(p_manager != 00);
4870         assert(p_stream != 00);
4871
4872         p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
4873
4874         return OPJ_TRUE;
4875 }
4876
4877 OPJ_BOOL opj_j2k_write_mct_data_group(  opj_j2k_t *p_j2k,
4878                                                                         struct opj_stream_private *p_stream,
4879                                                                         struct opj_event_mgr * p_manager )
4880 {
4881         OPJ_UINT32 i;
4882         opj_simple_mcc_decorrelation_data_t * l_mcc_record;
4883         opj_mct_data_t * l_mct_record;
4884         opj_tcp_t * l_tcp;
4885
4886         /* preconditions */
4887         assert(p_j2k != 00);
4888         assert(p_stream != 00);
4889         assert(p_manager != 00);
4890
4891         if (! opj_j2k_write_cbd(p_j2k,p_stream,p_manager)) {
4892                 return OPJ_FALSE;
4893         }
4894
4895         l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4896         l_mct_record = l_tcp->m_mct_records;
4897
4898         for (i=0;i<l_tcp->m_nb_mct_records;++i) {
4899
4900                 if (! opj_j2k_write_mct_record(p_j2k,l_mct_record,p_stream,p_manager)) {
4901                         return OPJ_FALSE;
4902                 }
4903
4904                 ++l_mct_record;
4905         }
4906
4907         l_mcc_record = l_tcp->m_mcc_records;
4908
4909         for     (i=0;i<l_tcp->m_nb_mcc_records;++i) {
4910
4911                 if (! opj_j2k_write_mcc_record(p_j2k,l_mcc_record,p_stream,p_manager)) {
4912                         return OPJ_FALSE;
4913                 }
4914
4915                 ++l_mcc_record;
4916         }
4917
4918         if (! opj_j2k_write_mco(p_j2k,p_stream,p_manager)) {
4919                 return OPJ_FALSE;
4920         }
4921
4922         return OPJ_TRUE;
4923 }
4924
4925 #if 0
4926 OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,
4927                                                                         struct opj_stream_private *p_stream,
4928                                                                         struct opj_event_mgr * p_manager )
4929 {
4930         OPJ_UINT32 compno;
4931
4932         /* preconditions */
4933         assert(p_j2k != 00);
4934         assert(p_manager != 00);
4935         assert(p_stream != 00);
4936
4937         for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)
4938         {
4939                 if (! opj_j2k_write_coc(p_j2k,compno,p_stream, p_manager)) {
4940                         return OPJ_FALSE;
4941                 }
4942         }
4943
4944         return OPJ_TRUE;
4945 }
4946 #endif
4947
4948 #if 0
4949 OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,
4950                                                                         struct opj_stream_private *p_stream,
4951                                                                         struct opj_event_mgr * p_manager )
4952 {
4953         OPJ_UINT32 compno;
4954
4955         /* preconditions */
4956         assert(p_j2k != 00);
4957         assert(p_manager != 00);
4958         assert(p_stream != 00);
4959
4960         for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)
4961         {
4962                 if (! opj_j2k_write_qcc(p_j2k,compno,p_stream, p_manager)) {
4963                         return OPJ_FALSE;
4964                 }
4965         }
4966
4967         return OPJ_TRUE;
4968 }
4969 #endif
4970
4971
4972 OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k,
4973                                                         struct opj_stream_private *p_stream,
4974                                                         struct opj_event_mgr * p_manager )
4975 {
4976         OPJ_UINT32 compno;
4977         const opj_tccp_t *l_tccp = 00;
4978
4979         /* preconditions */
4980         assert(p_j2k != 00);
4981         assert(p_manager != 00);
4982         assert(p_stream != 00);
4983
4984         l_tccp = p_j2k->m_cp.tcps->tccps;
4985
4986         for     (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {
4987                 if (l_tccp->roishift) {
4988
4989                         if (! opj_j2k_write_rgn(p_j2k,0,compno,p_j2k->m_private_image->numcomps,p_stream,p_manager)) {
4990                                 return OPJ_FALSE;
4991                         }
4992                 }
4993
4994                 ++l_tccp;
4995         }
4996
4997         return OPJ_TRUE;
4998 }
4999
5000 OPJ_BOOL opj_j2k_write_epc(     opj_j2k_t *p_j2k,
5001                                                 struct opj_stream_private *p_stream,
5002                                                 struct opj_event_mgr * p_manager )
5003 {
5004         opj_codestream_index_t * l_cstr_index = 00;
5005
5006         /* preconditions */
5007         assert(p_j2k != 00);
5008         assert(p_manager != 00);
5009         assert(p_stream != 00);
5010
5011         l_cstr_index = p_j2k->cstr_index;
5012         if (l_cstr_index) {
5013                 l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
5014                 /* UniPG>> */
5015                 /* The following adjustment is done to adjust the codestream size */
5016                 /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
5017                 /* the first bunch of bytes is not in the codestream              */
5018                 l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;
5019                 /* <<UniPG */
5020         }
5021
5022 #ifdef USE_JPWL
5023         /* preparation of JPWL marker segments */
5024 #if 0
5025         if(cp->epc_on) {
5026
5027                 /* encode according to JPWL */
5028                 jpwl_encode(p_j2k, p_stream, image);
5029
5030         }
5031 #endif
5032   assert( 0 && "TODO" );
5033 #endif /* USE_JPWL */
5034
5035         return OPJ_TRUE;
5036 }
5037
5038 OPJ_BOOL opj_j2k_read_unk (     opj_j2k_t *p_j2k,
5039                                                         opj_stream_private_t *p_stream,
5040                                                         OPJ_UINT32 *output_marker,
5041                                                         opj_event_mgr_t * p_manager
5042                                                         )
5043 {
5044         OPJ_UINT32 l_unknown_marker;
5045         const opj_dec_memory_marker_handler_t * l_marker_handler;
5046         OPJ_UINT32 l_size_unk = 2;
5047
5048         /* preconditions*/
5049         assert(p_j2k != 00);
5050         assert(p_manager != 00);
5051         assert(p_stream != 00);
5052
5053         opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
5054
5055         while(1) {
5056                 /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
5057                 if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
5058                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
5059                         return OPJ_FALSE;
5060                 }
5061
5062                 /* read 2 bytes as the new marker ID*/
5063                 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_unknown_marker,2);
5064
5065                 if (!(l_unknown_marker < 0xff00)) {
5066
5067                         /* Get the marker handler from the marker ID*/
5068                         l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
5069
5070                         if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
5071                                 opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
5072                                 return OPJ_FALSE;
5073                         }
5074                         else {
5075                                 if (l_marker_handler->id != J2K_MS_UNK) {
5076                                         /* Add the marker to the codestream index*/
5077                                         if (l_marker_handler->id != J2K_MS_SOT)
5078                                         {
5079                                                 OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
5080                                                                 (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
5081                                                                 l_size_unk);
5082                                                 if (res == OPJ_FALSE) {
5083                                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
5084                                                         return OPJ_FALSE;
5085                                                 }
5086                                         }
5087                                         break; /* next marker is known and well located */
5088                                 }
5089                                 else
5090                                         l_size_unk += 2;
5091                         }
5092                 }
5093         }
5094
5095         *output_marker = l_marker_handler->id ;
5096
5097         return OPJ_TRUE;
5098 }
5099
5100 OPJ_BOOL opj_j2k_write_mct_record(      opj_j2k_t *p_j2k,
5101                                                                 opj_mct_data_t * p_mct_record,
5102                                                                 struct opj_stream_private *p_stream,
5103                                                                 struct opj_event_mgr * p_manager )
5104 {
5105         OPJ_UINT32 l_mct_size;
5106         OPJ_BYTE * l_current_data = 00;
5107         OPJ_UINT32 l_tmp;
5108
5109         /* preconditions */
5110         assert(p_j2k != 00);
5111         assert(p_manager != 00);
5112         assert(p_stream != 00);
5113
5114         l_mct_size = 10 + p_mct_record->m_data_size;
5115
5116         if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
5117                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);
5118                 if (! new_header_tile_data) {
5119                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5120                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5121                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5122                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n");
5123                         return OPJ_FALSE;
5124                 }
5125                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5126                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
5127         }
5128
5129         l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5130
5131         opj_write_bytes(l_current_data,J2K_MS_MCT,2);                                   /* MCT */
5132         l_current_data += 2;
5133
5134         opj_write_bytes(l_current_data,l_mct_size-2,2);                                 /* Lmct */
5135         l_current_data += 2;
5136
5137         opj_write_bytes(l_current_data,0,2);                                                    /* Zmct */
5138         l_current_data += 2;
5139
5140         /* only one marker atm */
5141         l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) | (p_mct_record->m_element_type << 10);
5142
5143         opj_write_bytes(l_current_data,l_tmp,2);
5144         l_current_data += 2;
5145
5146         opj_write_bytes(l_current_data,0,2);                                                    /* Ymct */
5147         l_current_data+=2;
5148
5149         memcpy(l_current_data,p_mct_record->m_data,p_mct_record->m_data_size);
5150
5151         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mct_size,p_manager) != l_mct_size) {
5152                 return OPJ_FALSE;
5153         }
5154
5155         return OPJ_TRUE;
5156 }
5157
5158 /**
5159  * Reads a MCT marker (Multiple Component Transform)
5160  *
5161  * @param       p_header_data   the data contained in the MCT box.
5162  * @param       p_j2k                   the jpeg2000 codec.
5163  * @param       p_header_size   the size of the data contained in the MCT marker.
5164  * @param       p_manager               the user event manager.
5165 */
5166 static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
5167                                                                     OPJ_BYTE * p_header_data,
5168                                                                     OPJ_UINT32 p_header_size,
5169                                                                     opj_event_mgr_t * p_manager
5170                                     )
5171 {
5172         OPJ_UINT32 i;
5173         opj_tcp_t *l_tcp = 00;
5174         OPJ_UINT32 l_tmp;
5175         OPJ_UINT32 l_indix;
5176         opj_mct_data_t * l_mct_data;
5177
5178         /* preconditions */
5179         assert(p_header_data != 00);
5180         assert(p_j2k != 00);
5181
5182         l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5183                         &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5184                         p_j2k->m_specific_param.m_decoder.m_default_tcp;
5185
5186         if (p_header_size < 2) {
5187                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5188                 return OPJ_FALSE;
5189         }
5190
5191         /* first marker */
5192         opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmct */
5193         p_header_data += 2;
5194         if (l_tmp != 0) {
5195                 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge mct data within multiple MCT records\n");
5196                 return OPJ_TRUE;
5197         }
5198
5199         if(p_header_size <= 6) {
5200                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5201                 return OPJ_FALSE;
5202         }
5203
5204         /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
5205         opj_read_bytes(p_header_data,&l_tmp,2);                         /* Imct */
5206         p_header_data += 2;
5207
5208         l_indix = l_tmp & 0xff;
5209         l_mct_data = l_tcp->m_mct_records;
5210
5211         for (i=0;i<l_tcp->m_nb_mct_records;++i) {
5212                 if (l_mct_data->m_index == l_indix) {
5213                         break;
5214                 }
5215                 ++l_mct_data;
5216         }
5217
5218         /* NOT FOUND */
5219         if (i == l_tcp->m_nb_mct_records) {
5220                 if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
5221                         opj_mct_data_t *new_mct_records;
5222                         l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
5223
5224                         new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records, l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
5225                         if (! new_mct_records) {
5226                                 opj_free(l_tcp->m_mct_records);
5227                                 l_tcp->m_mct_records = NULL;
5228                                 l_tcp->m_nb_max_mct_records = 0;
5229                                 l_tcp->m_nb_mct_records = 0;
5230                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n");
5231                                 return OPJ_FALSE;
5232                         }
5233                         l_tcp->m_mct_records = new_mct_records;
5234                         l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5235                         memset(l_mct_data ,0,(l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
5236                 }
5237
5238                 l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5239         }
5240
5241         if (l_mct_data->m_data) {
5242                 opj_free(l_mct_data->m_data);
5243                 l_mct_data->m_data = 00;
5244         }
5245
5246         l_mct_data->m_index = l_indix;
5247         l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
5248         l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
5249
5250         opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymct */
5251         p_header_data+=2;
5252         if (l_tmp != 0) {
5253                 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple MCT markers\n");
5254                 return OPJ_TRUE;
5255         }
5256
5257         p_header_size -= 6;
5258
5259         l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
5260         if (! l_mct_data->m_data) {
5261                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5262                 return OPJ_FALSE;
5263         }
5264         memcpy(l_mct_data->m_data,p_header_data,p_header_size);
5265
5266         l_mct_data->m_data_size = p_header_size;
5267         ++l_tcp->m_nb_mct_records;
5268
5269         return OPJ_TRUE;
5270 }
5271
5272 OPJ_BOOL opj_j2k_write_mcc_record(      opj_j2k_t *p_j2k,
5273                                                                 struct opj_simple_mcc_decorrelation_data * p_mcc_record,
5274                                                                 struct opj_stream_private *p_stream,
5275                                                                 struct opj_event_mgr * p_manager )
5276 {
5277         OPJ_UINT32 i;
5278         OPJ_UINT32 l_mcc_size;
5279         OPJ_BYTE * l_current_data = 00;
5280         OPJ_UINT32 l_nb_bytes_for_comp;
5281         OPJ_UINT32 l_mask;
5282         OPJ_UINT32 l_tmcc;
5283
5284         /* preconditions */
5285         assert(p_j2k != 00);
5286         assert(p_manager != 00);
5287         assert(p_stream != 00);
5288
5289         if (p_mcc_record->m_nb_comps > 255 ) {
5290         l_nb_bytes_for_comp = 2;
5291                 l_mask = 0x8000;
5292         }
5293         else {
5294                 l_nb_bytes_for_comp = 1;
5295                 l_mask = 0;
5296         }
5297
5298         l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
5299         if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
5300         {
5301                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);
5302                 if (! new_header_tile_data) {
5303                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5304                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5305                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5306                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n");
5307                         return OPJ_FALSE;
5308                 }
5309                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5310                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
5311         }
5312
5313         l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5314
5315         opj_write_bytes(l_current_data,J2K_MS_MCC,2);                                   /* MCC */
5316         l_current_data += 2;
5317
5318         opj_write_bytes(l_current_data,l_mcc_size-2,2);                                 /* Lmcc */
5319         l_current_data += 2;
5320
5321         /* first marker */
5322         opj_write_bytes(l_current_data,0,2);                                    /* Zmcc */
5323         l_current_data += 2;
5324
5325         opj_write_bytes(l_current_data,p_mcc_record->m_index,1);                                        /* Imcc -> no need for other values, take the first */
5326         ++l_current_data;
5327
5328         /* only one marker atm */
5329         opj_write_bytes(l_current_data,0,2);                                    /* Ymcc */
5330         l_current_data+=2;
5331
5332         opj_write_bytes(l_current_data,1,2);                                    /* Qmcc -> number of collections -> 1 */
5333         l_current_data+=2;
5334
5335         opj_write_bytes(l_current_data,0x1,1);                                  /* Xmcci type of component transformation -> array based decorrelation */
5336         ++l_current_data;
5337
5338         opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps | l_mask,2);    /* Nmcci number of input components involved and size for each component offset = 8 bits */
5339         l_current_data+=2;
5340
5341         for (i=0;i<p_mcc_record->m_nb_comps;++i) {
5342                 opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp);                          /* Cmccij Component offset*/
5343                 l_current_data+=l_nb_bytes_for_comp;
5344         }
5345
5346         opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps|l_mask,2);      /* Mmcci number of output components involved and size for each component offset = 8 bits */
5347         l_current_data+=2;
5348
5349         for (i=0;i<p_mcc_record->m_nb_comps;++i)
5350         {
5351                 opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp);                          /* Wmccij Component offset*/
5352                 l_current_data+=l_nb_bytes_for_comp;
5353         }
5354
5355         l_tmcc = ((!p_mcc_record->m_is_irreversible)&1)<<16;
5356
5357         if (p_mcc_record->m_decorrelation_array) {
5358                 l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
5359         }
5360
5361         if (p_mcc_record->m_offset_array) {
5362                 l_tmcc |= ((p_mcc_record->m_offset_array->m_index)<<8);
5363         }
5364
5365         opj_write_bytes(l_current_data,l_tmcc,3);       /* Tmcci : use MCT defined as number 1 and irreversible array based. */
5366         l_current_data+=3;
5367
5368         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mcc_size,p_manager) != l_mcc_size) {
5369                 return OPJ_FALSE;
5370         }
5371
5372         return OPJ_TRUE;
5373 }
5374
5375 OPJ_BOOL opj_j2k_read_mcc (     opj_j2k_t *p_j2k,
5376                                                 OPJ_BYTE * p_header_data,
5377                                                 OPJ_UINT32 p_header_size,
5378                                                 opj_event_mgr_t * p_manager )
5379 {
5380         OPJ_UINT32 i,j;
5381         OPJ_UINT32 l_tmp;
5382         OPJ_UINT32 l_indix;
5383         opj_tcp_t * l_tcp;
5384         opj_simple_mcc_decorrelation_data_t * l_mcc_record;
5385         opj_mct_data_t * l_mct_data;
5386         OPJ_UINT32 l_nb_collections;
5387         OPJ_UINT32 l_nb_comps;
5388         OPJ_UINT32 l_nb_bytes_by_comp;
5389
5390         /* preconditions */
5391         assert(p_header_data != 00);
5392         assert(p_j2k != 00);
5393         assert(p_manager != 00);
5394
5395         l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5396                         &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5397                         p_j2k->m_specific_param.m_decoder.m_default_tcp;
5398
5399         if (p_header_size < 2) {
5400                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5401                 return OPJ_FALSE;
5402         }
5403
5404         /* first marker */
5405         opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmcc */
5406         p_header_data += 2;
5407         if (l_tmp != 0) {
5408                 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
5409                 return OPJ_TRUE;
5410         }
5411
5412         if (p_header_size < 7) {
5413                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5414                 return OPJ_FALSE;
5415         }
5416
5417         opj_read_bytes(p_header_data,&l_indix,1); /* Imcc -> no need for other values, take the first */
5418         ++p_header_data;
5419
5420         l_mcc_record = l_tcp->m_mcc_records;
5421
5422         for(i=0;i<l_tcp->m_nb_mcc_records;++i) {
5423                 if (l_mcc_record->m_index == l_indix) {
5424                         break;
5425                 }
5426                 ++l_mcc_record;
5427         }
5428
5429         /** NOT FOUND */
5430         if (i == l_tcp->m_nb_mcc_records) {
5431                 if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
5432                         opj_simple_mcc_decorrelation_data_t *new_mcc_records;
5433                         l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
5434
5435                         new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
5436                                         l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
5437                         if (! new_mcc_records) {
5438                                 opj_free(l_tcp->m_mcc_records);
5439                                 l_tcp->m_mcc_records = NULL;
5440                                 l_tcp->m_nb_max_mcc_records = 0;
5441                                 l_tcp->m_nb_mcc_records = 0;
5442                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n");
5443                                 return OPJ_FALSE;
5444                         }
5445                         l_tcp->m_mcc_records = new_mcc_records;
5446                         l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
5447                         memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
5448                 }
5449                 l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
5450         }
5451         l_mcc_record->m_index = l_indix;
5452
5453         /* only one marker atm */
5454         opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymcc */
5455         p_header_data+=2;
5456         if (l_tmp != 0) {
5457                 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
5458                 return OPJ_TRUE;
5459         }
5460
5461         opj_read_bytes(p_header_data,&l_nb_collections,2);                              /* Qmcc -> number of collections -> 1 */
5462         p_header_data+=2;
5463
5464         if (l_nb_collections > 1) {
5465                 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple collections\n");
5466                 return OPJ_TRUE;
5467         }
5468
5469         p_header_size -= 7;
5470
5471         for (i=0;i<l_nb_collections;++i) {
5472                 if (p_header_size < 3) {
5473                         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5474                         return OPJ_FALSE;
5475                 }
5476
5477                 opj_read_bytes(p_header_data,&l_tmp,1); /* Xmcci type of component transformation -> array based decorrelation */
5478                 ++p_header_data;
5479
5480                 if (l_tmp != 1) {
5481                         opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections other than array decorrelation\n");
5482                         return OPJ_TRUE;
5483                 }
5484
5485                 opj_read_bytes(p_header_data,&l_nb_comps,2);
5486
5487                 p_header_data+=2;
5488                 p_header_size-=3;
5489
5490                 l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
5491                 l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
5492
5493                 if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
5494                         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5495                         return OPJ_FALSE;
5496                 }
5497
5498                 p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
5499
5500                 for (j=0;j<l_mcc_record->m_nb_comps;++j) {
5501                         opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp);        /* Cmccij Component offset*/
5502                         p_header_data+=l_nb_bytes_by_comp;
5503
5504                         if (l_tmp != j) {
5505                                 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
5506                                 return OPJ_TRUE;
5507                         }
5508                 }
5509
5510                 opj_read_bytes(p_header_data,&l_nb_comps,2);
5511                 p_header_data+=2;
5512
5513                 l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
5514                 l_nb_comps &= 0x7fff;
5515
5516                 if (l_nb_comps != l_mcc_record->m_nb_comps) {
5517                         opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections without same number of indixes\n");
5518                         return OPJ_TRUE;
5519                 }
5520
5521                 if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
5522                         opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5523                         return OPJ_FALSE;
5524                 }
5525
5526                 p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
5527
5528                 for (j=0;j<l_mcc_record->m_nb_comps;++j) {
5529                         opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp);        /* Wmccij Component offset*/
5530                         p_header_data+=l_nb_bytes_by_comp;
5531
5532                         if (l_tmp != j) {
5533                                 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
5534                                 return OPJ_TRUE;
5535                         }
5536                 }
5537
5538                 opj_read_bytes(p_header_data,&l_tmp,3); /* Wmccij Component offset*/
5539                 p_header_data += 3;
5540
5541                 l_mcc_record->m_is_irreversible = ! ((l_tmp>>16) & 1);
5542                 l_mcc_record->m_decorrelation_array = 00;
5543                 l_mcc_record->m_offset_array = 00;
5544
5545                 l_indix = l_tmp & 0xff;
5546                 if (l_indix != 0) {
5547                         l_mct_data = l_tcp->m_mct_records;
5548                         for (j=0;j<l_tcp->m_nb_mct_records;++j) {
5549                                 if (l_mct_data->m_index == l_indix) {
5550                                         l_mcc_record->m_decorrelation_array = l_mct_data;
5551                                         break;
5552                                 }
5553                                 ++l_mct_data;
5554                         }
5555
5556                         if (l_mcc_record->m_decorrelation_array == 00) {
5557                                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5558                                 return OPJ_FALSE;
5559                         }
5560                 }
5561
5562                 l_indix = (l_tmp >> 8) & 0xff;
5563                 if (l_indix != 0) {
5564                         l_mct_data = l_tcp->m_mct_records;
5565                         for (j=0;j<l_tcp->m_nb_mct_records;++j) {
5566                                 if (l_mct_data->m_index == l_indix) {
5567                                         l_mcc_record->m_offset_array = l_mct_data;
5568                                         break;
5569                                 }
5570                                 ++l_mct_data;
5571                         }
5572
5573                         if (l_mcc_record->m_offset_array == 00) {
5574                                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5575                                 return OPJ_FALSE;
5576                         }
5577                 }
5578         }
5579
5580         if (p_header_size != 0) {
5581                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
5582                 return OPJ_FALSE;
5583         }
5584
5585         ++l_tcp->m_nb_mcc_records;
5586
5587         return OPJ_TRUE;
5588 }
5589
5590 OPJ_BOOL opj_j2k_write_mco(     opj_j2k_t *p_j2k,
5591                                                 struct opj_stream_private *p_stream,
5592                                                 struct opj_event_mgr * p_manager
5593                                   )
5594 {
5595         OPJ_BYTE * l_current_data = 00;
5596         OPJ_UINT32 l_mco_size;
5597         opj_tcp_t * l_tcp = 00;
5598         opj_simple_mcc_decorrelation_data_t * l_mcc_record;
5599         OPJ_UINT32 i;
5600
5601         /* preconditions */
5602         assert(p_j2k != 00);
5603         assert(p_manager != 00);
5604         assert(p_stream != 00);
5605
5606         l_tcp =&(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
5607         l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5608
5609         l_mco_size = 5 + l_tcp->m_nb_mcc_records;
5610         if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
5611
5612                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);
5613                 if (! new_header_tile_data) {
5614                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5615                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5616                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5617                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n");
5618                         return OPJ_FALSE;
5619                 }
5620                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5621                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
5622         }
5623
5624         opj_write_bytes(l_current_data,J2K_MS_MCO,2);                   /* MCO */
5625         l_current_data += 2;
5626
5627         opj_write_bytes(l_current_data,l_mco_size-2,2);                 /* Lmco */
5628         l_current_data += 2;
5629
5630         opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1);      /* Nmco : only one tranform stage*/
5631         ++l_current_data;
5632
5633         l_mcc_record = l_tcp->m_mcc_records;
5634         for     (i=0;i<l_tcp->m_nb_mcc_records;++i) {
5635                 opj_write_bytes(l_current_data,l_mcc_record->m_index,1);/* Imco -> use the mcc indicated by 1*/
5636                 ++l_current_data;
5637
5638                 ++l_mcc_record;
5639         }
5640
5641         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mco_size,p_manager) != l_mco_size) {
5642                 return OPJ_FALSE;
5643         }
5644
5645         return OPJ_TRUE;
5646 }
5647
5648 /**
5649  * Reads a MCO marker (Multiple Component Transform Ordering)
5650  *
5651  * @param       p_header_data   the data contained in the MCO box.
5652  * @param       p_j2k                   the jpeg2000 codec.
5653  * @param       p_header_size   the size of the data contained in the MCO marker.
5654  * @param       p_manager               the user event manager.
5655 */
5656 static OPJ_BOOL opj_j2k_read_mco (      opj_j2k_t *p_j2k,
5657                                                                     OPJ_BYTE * p_header_data,
5658                                                                     OPJ_UINT32 p_header_size,
5659                                                                     opj_event_mgr_t * p_manager
5660                                     )
5661 {
5662         OPJ_UINT32 l_tmp, i;
5663         OPJ_UINT32 l_nb_stages;
5664         opj_tcp_t * l_tcp;
5665         opj_tccp_t * l_tccp;
5666         opj_image_t * l_image;
5667
5668         /* preconditions */
5669         assert(p_header_data != 00);
5670         assert(p_j2k != 00);
5671         assert(p_manager != 00);
5672
5673         l_image = p_j2k->m_private_image;
5674         l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5675                         &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5676                         p_j2k->m_specific_param.m_decoder.m_default_tcp;
5677
5678         if (p_header_size < 1) {
5679                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
5680                 return OPJ_FALSE;
5681         }
5682
5683         opj_read_bytes(p_header_data,&l_nb_stages,1);                           /* Nmco : only one tranform stage*/
5684         ++p_header_data;
5685
5686         if (l_nb_stages > 1) {
5687                 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple transformation stages.\n");
5688                 return OPJ_TRUE;
5689         }
5690
5691         if (p_header_size != l_nb_stages + 1) {
5692                 opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
5693                 return OPJ_FALSE;
5694         }
5695
5696         l_tccp = l_tcp->tccps;
5697
5698         for (i=0;i<l_image->numcomps;++i) {
5699                 l_tccp->m_dc_level_shift = 0;
5700                 ++l_tccp;
5701         }
5702
5703         if (l_tcp->m_mct_decoding_matrix) {
5704                 opj_free(l_tcp->m_mct_decoding_matrix);
5705                 l_tcp->m_mct_decoding_matrix = 00;
5706         }
5707
5708         for (i=0;i<l_nb_stages;++i) {
5709                 opj_read_bytes(p_header_data,&l_tmp,1);
5710                 ++p_header_data;
5711
5712                 if (! opj_j2k_add_mct(l_tcp,p_j2k->m_private_image,l_tmp)) {
5713                         return OPJ_FALSE;
5714                 }
5715         }
5716
5717         return OPJ_TRUE;
5718 }
5719
5720 OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index)
5721 {
5722         OPJ_UINT32 i;
5723         opj_simple_mcc_decorrelation_data_t * l_mcc_record;
5724         opj_mct_data_t * l_deco_array, * l_offset_array;
5725         OPJ_UINT32 l_data_size,l_mct_size, l_offset_size;
5726         OPJ_UINT32 l_nb_elem;
5727         OPJ_UINT32 * l_offset_data, * l_current_offset_data;
5728         opj_tccp_t * l_tccp;
5729
5730         /* preconditions */
5731         assert(p_tcp != 00);
5732
5733         l_mcc_record = p_tcp->m_mcc_records;
5734
5735         for (i=0;i<p_tcp->m_nb_mcc_records;++i) {
5736                 if (l_mcc_record->m_index == p_index) {
5737                         break;
5738                 }
5739         }
5740
5741         if (i==p_tcp->m_nb_mcc_records) {
5742                 /** element discarded **/
5743                 return OPJ_TRUE;
5744         }
5745
5746         if (l_mcc_record->m_nb_comps != p_image->numcomps) {
5747                 /** do not support number of comps != image */
5748                 return OPJ_TRUE;
5749         }
5750
5751         l_deco_array = l_mcc_record->m_decorrelation_array;
5752
5753         if (l_deco_array) {
5754                 l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps * p_image->numcomps;
5755                 if (l_deco_array->m_data_size != l_data_size) {
5756                         return OPJ_FALSE;
5757                 }
5758
5759                 l_nb_elem = p_image->numcomps * p_image->numcomps;
5760                 l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
5761                 p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
5762
5763                 if (! p_tcp->m_mct_decoding_matrix ) {
5764                         return OPJ_FALSE;
5765                 }
5766
5767                 j2k_mct_read_functions_to_float[l_deco_array->m_element_type](l_deco_array->m_data,p_tcp->m_mct_decoding_matrix,l_nb_elem);
5768         }
5769
5770         l_offset_array = l_mcc_record->m_offset_array;
5771
5772         if (l_offset_array) {
5773                 l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] * p_image->numcomps;
5774                 if (l_offset_array->m_data_size != l_data_size) {
5775                         return OPJ_FALSE;
5776                 }
5777
5778                 l_nb_elem = p_image->numcomps;
5779                 l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
5780                 l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
5781
5782                 if (! l_offset_data ) {
5783                         return OPJ_FALSE;
5784                 }
5785
5786                 j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](l_offset_array->m_data,l_offset_data,l_nb_elem);
5787
5788                 l_tccp = p_tcp->tccps;
5789                 l_current_offset_data = l_offset_data;
5790
5791                 for (i=0;i<p_image->numcomps;++i) {
5792                         l_tccp->m_dc_level_shift = (OPJ_INT32)*(l_current_offset_data++);
5793                         ++l_tccp;
5794                 }
5795
5796                 opj_free(l_offset_data);
5797         }
5798
5799         return OPJ_TRUE;
5800 }
5801
5802 OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k,
5803                                                 struct opj_stream_private *p_stream,
5804                                                 struct opj_event_mgr * p_manager )
5805 {
5806         OPJ_UINT32 i;
5807         OPJ_UINT32 l_cbd_size;
5808         OPJ_BYTE * l_current_data = 00;
5809         opj_image_t *l_image = 00;
5810         opj_image_comp_t * l_comp = 00;
5811
5812         /* preconditions */
5813         assert(p_j2k != 00);
5814         assert(p_manager != 00);
5815         assert(p_stream != 00);
5816
5817         l_image = p_j2k->m_private_image;
5818         l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
5819
5820         if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
5821                 OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
5822                 if (! new_header_tile_data) {
5823                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5824                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5825                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5826                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
5827                         return OPJ_FALSE;
5828                 }
5829                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5830                 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
5831         }
5832
5833         l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5834
5835         opj_write_bytes(l_current_data,J2K_MS_CBD,2);                   /* CBD */
5836         l_current_data += 2;
5837
5838         opj_write_bytes(l_current_data,l_cbd_size-2,2);                 /* L_CBD */
5839         l_current_data += 2;
5840
5841         opj_write_bytes(l_current_data,l_image->numcomps, 2);           /* Ncbd */
5842         l_current_data+=2;
5843
5844         l_comp = l_image->comps;
5845
5846         for (i=0;i<l_image->numcomps;++i) {
5847                 opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1), 1);           /* Component bit depth */
5848                 ++l_current_data;
5849
5850                 ++l_comp;
5851         }
5852
5853         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_cbd_size,p_manager) != l_cbd_size) {
5854                 return OPJ_FALSE;
5855         }
5856
5857         return OPJ_TRUE;
5858 }
5859
5860 /**
5861  * Reads a CBD marker (Component bit depth definition)
5862  * @param       p_header_data   the data contained in the CBD box.
5863  * @param       p_j2k                   the jpeg2000 codec.
5864  * @param       p_header_size   the size of the data contained in the CBD marker.
5865  * @param       p_manager               the user event manager.
5866 */
5867 static OPJ_BOOL opj_j2k_read_cbd (      opj_j2k_t *p_j2k,
5868                                                                 OPJ_BYTE * p_header_data,
5869                                                                 OPJ_UINT32 p_header_size,
5870                                                                 opj_event_mgr_t * p_manager
5871                                     )
5872 {
5873         OPJ_UINT32 l_nb_comp,l_num_comp;
5874         OPJ_UINT32 l_comp_def;
5875         OPJ_UINT32 i;
5876         opj_image_comp_t * l_comp = 00;
5877
5878         /* preconditions */
5879         assert(p_header_data != 00);
5880         assert(p_j2k != 00);
5881         assert(p_manager != 00);
5882
5883         l_num_comp = p_j2k->m_private_image->numcomps;
5884
5885         if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
5886                 opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
5887                 return OPJ_FALSE;
5888         }
5889
5890         opj_read_bytes(p_header_data,&l_nb_comp,2);                             /* Ncbd */
5891         p_header_data+=2;
5892
5893         if (l_nb_comp != l_num_comp) {
5894                 opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
5895                 return OPJ_FALSE;
5896         }
5897
5898         l_comp = p_j2k->m_private_image->comps;
5899         for (i=0;i<l_num_comp;++i) {
5900                 opj_read_bytes(p_header_data,&l_comp_def,1);                    /* Component bit depth */
5901                 ++p_header_data;
5902         l_comp->sgnd = (l_comp_def>>7) & 1;
5903                 l_comp->prec = (l_comp_def&0x7f) + 1;
5904                 ++l_comp;
5905         }
5906
5907         return OPJ_TRUE;
5908 }
5909
5910 /* ----------------------------------------------------------------------- */
5911 /* J2K / JPT decoder interface                                             */
5912 /* ----------------------------------------------------------------------- */
5913
5914 void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
5915 {
5916         if(j2k && parameters) {
5917                 j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
5918                 j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
5919
5920 #ifdef USE_JPWL
5921                 j2k->m_cp.correct = parameters->jpwl_correct;
5922                 j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
5923                 j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
5924 #endif /* USE_JPWL */
5925         }
5926 }
5927
5928 /* ----------------------------------------------------------------------- */
5929 /* J2K encoder interface                                                       */
5930 /* ----------------------------------------------------------------------- */
5931
5932 opj_j2k_t* opj_j2k_create_compress(void)
5933 {
5934         opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1,sizeof(opj_j2k_t));
5935         if (!l_j2k) {
5936                 return NULL;
5937         }
5938
5939
5940         l_j2k->m_is_decoder = 0;
5941         l_j2k->m_cp.m_is_decoder = 0;
5942
5943         l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE);
5944         if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
5945                 opj_j2k_destroy(l_j2k);
5946                 return NULL;
5947         }
5948
5949         l_j2k->m_specific_param.m_encoder.m_header_tile_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;
5950
5951         /* validation list creation*/
5952         l_j2k->m_validation_list = opj_procedure_list_create();
5953         if (! l_j2k->m_validation_list) {
5954                 opj_j2k_destroy(l_j2k);
5955                 return NULL;
5956         }
5957
5958         /* execution list creation*/
5959         l_j2k->m_procedure_list = opj_procedure_list_create();
5960         if (! l_j2k->m_procedure_list) {
5961                 opj_j2k_destroy(l_j2k);
5962                 return NULL;
5963         }
5964
5965         return l_j2k;
5966 }
5967
5968 int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){
5969     POC[0].tile  = 1;
5970     POC[0].resno0  = 0;
5971     POC[0].compno0 = 0;
5972     POC[0].layno1  = 1;
5973     POC[0].resno1  = (OPJ_UINT32)(numres-1);
5974     POC[0].compno1 = 3;
5975     POC[0].prg1 = OPJ_CPRL;
5976     POC[1].tile  = 1;
5977     POC[1].resno0  = (OPJ_UINT32)(numres-1);
5978     POC[1].compno0 = 0;
5979     POC[1].layno1  = 1;
5980     POC[1].resno1  = (OPJ_UINT32)numres;
5981     POC[1].compno1 = 3;
5982     POC[1].prg1 = OPJ_CPRL;
5983     return 2;
5984 }
5985
5986 void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager)
5987 {
5988     /* Configure cinema parameters */
5989     int i;
5990
5991     /* No tiling */
5992     parameters->tile_size_on = OPJ_FALSE;
5993     parameters->cp_tdx=1;
5994     parameters->cp_tdy=1;
5995
5996     /* One tile part for each component */
5997     parameters->tp_flag = 'C';
5998     parameters->tp_on = 1;
5999
6000     /* Tile and Image shall be at (0,0) */
6001     parameters->cp_tx0 = 0;
6002     parameters->cp_ty0 = 0;
6003     parameters->image_offset_x0 = 0;
6004     parameters->image_offset_y0 = 0;
6005
6006     /* Codeblock size= 32*32 */
6007     parameters->cblockw_init = 32;
6008     parameters->cblockh_init = 32;
6009
6010     /* Codeblock style: no mode switch enabled */
6011     parameters->mode = 0;
6012
6013     /* No ROI */
6014     parameters->roi_compno = -1;
6015
6016     /* No subsampling */
6017     parameters->subsampling_dx = 1;
6018     parameters->subsampling_dy = 1;
6019
6020     /* 9-7 transform */
6021     parameters->irreversible = 1;
6022
6023     /* Number of layers */
6024     if (parameters->tcp_numlayers > 1){
6025         opj_event_msg(p_manager, EVT_WARNING,
6026                 "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6027                 "1 single quality layer"
6028                 "-> Number of layers forced to 1 (rather than %d)\n"
6029                 "-> Rate of the last layer (%3.1f) will be used",
6030                 parameters->tcp_numlayers, parameters->tcp_rates[parameters->tcp_numlayers-1]);
6031         parameters->tcp_rates[0] = parameters->tcp_rates[parameters->tcp_numlayers-1];
6032         parameters->tcp_numlayers = 1;
6033     }
6034
6035     /* Resolution levels */
6036     switch (parameters->rsiz){
6037     case OPJ_PROFILE_CINEMA_2K:
6038         if(parameters->numresolution > 6){
6039             opj_event_msg(p_manager, EVT_WARNING,
6040                     "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6041                     "Number of decomposition levels <= 5\n"
6042                     "-> Number of decomposition levels forced to 5 (rather than %d)\n",
6043                     parameters->numresolution+1);
6044             parameters->numresolution = 6;
6045         }
6046         break;
6047     case OPJ_PROFILE_CINEMA_4K:
6048         if(parameters->numresolution < 2){
6049             opj_event_msg(p_manager, EVT_WARNING,
6050                     "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6051                     "Number of decomposition levels >= 1 && <= 6\n"
6052                     "-> Number of decomposition levels forced to 1 (rather than %d)\n",
6053                     parameters->numresolution+1);
6054             parameters->numresolution = 1;
6055         }else if(parameters->numresolution > 7){
6056             opj_event_msg(p_manager, EVT_WARNING,
6057                     "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6058                     "Number of decomposition levels >= 1 && <= 6\n"
6059                     "-> Number of decomposition levels forced to 6 (rather than %d)\n",
6060                     parameters->numresolution+1);
6061             parameters->numresolution = 7;
6062         }
6063         break;
6064     default :
6065         break;
6066     }
6067
6068     /* Precincts */
6069     parameters->csty |= 0x01;
6070     parameters->res_spec = parameters->numresolution-1;
6071     for (i = 0; i<parameters->res_spec; i++) {
6072         parameters->prcw_init[i] = 256;
6073         parameters->prch_init[i] = 256;
6074     }
6075
6076     /* The progression order shall be CPRL */
6077     parameters->prog_order = OPJ_CPRL;
6078
6079     /* Progression order changes for 4K, disallowed for 2K */
6080     if (parameters->rsiz == OPJ_PROFILE_CINEMA_4K) {
6081         parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,parameters->numresolution);
6082     } else {
6083         parameters->numpocs = 0;
6084     }
6085
6086     /* Limited bit-rate */
6087     parameters->cp_disto_alloc = 1;
6088     if (parameters->max_cs_size <= 0) {
6089         /* No rate has been introduced, 24 fps is assumed */
6090         parameters->max_cs_size = OPJ_CINEMA_24_CS;
6091         opj_event_msg(p_manager, EVT_WARNING,
6092                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6093                       "Maximum 1302083 compressed bytes @ 24fps\n"
6094                       "As no rate has been given, this limit will be used.\n");
6095     } else if (parameters->max_cs_size > OPJ_CINEMA_24_CS) {
6096         opj_event_msg(p_manager, EVT_WARNING,
6097                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6098                       "Maximum 1302083 compressed bytes @ 24fps\n"
6099                       "-> Specified rate exceeds this limit. Rate will be forced to 1302083 bytes.\n");
6100         parameters->max_cs_size = OPJ_CINEMA_24_CS;
6101     }
6102
6103     if (parameters->max_comp_size <= 0) {
6104         /* No rate has been introduced, 24 fps is assumed */
6105         parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6106         opj_event_msg(p_manager, EVT_WARNING,
6107                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6108                       "Maximum 1041666 compressed bytes @ 24fps\n"
6109                       "As no rate has been given, this limit will be used.\n");
6110     } else if (parameters->max_comp_size > OPJ_CINEMA_24_COMP) {
6111         opj_event_msg(p_manager, EVT_WARNING,
6112                       "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6113                       "Maximum 1041666 compressed bytes @ 24fps\n"
6114                       "-> Specified rate exceeds this limit. Rate will be forced to 1041666 bytes.\n");
6115         parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6116     }
6117
6118     parameters->tcp_rates[0] = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
6119             (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx * image->comps[0].dy);
6120
6121 }
6122
6123 OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager)
6124 {
6125     OPJ_UINT32 i;
6126
6127     /* Number of components */
6128     if (image->numcomps != 3){
6129         opj_event_msg(p_manager, EVT_WARNING,
6130                 "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6131                 "3 components"
6132                 "-> Number of components of input image (%d) is not compliant\n"
6133                 "-> Non-profile-3 codestream will be generated\n",
6134                 image->numcomps);
6135         return OPJ_FALSE;
6136     }
6137
6138     /* Bitdepth */
6139     for (i = 0; i < image->numcomps; i++) {
6140         if ((image->comps[i].bpp != 12) | (image->comps[i].sgnd)){
6141             char signed_str[] = "signed";
6142             char unsigned_str[] = "unsigned";
6143             char *tmp_str = image->comps[i].sgnd?signed_str:unsigned_str;
6144             opj_event_msg(p_manager, EVT_WARNING,
6145                     "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6146                     "Precision of each component shall be 12 bits unsigned"
6147                     "-> At least component %d of input image (%d bits, %s) is not compliant\n"
6148                     "-> Non-profile-3 codestream will be generated\n",
6149                     i,image->comps[i].bpp, tmp_str);
6150             return OPJ_FALSE;
6151         }
6152     }
6153
6154     /* Image size */
6155     switch (rsiz){
6156     case OPJ_PROFILE_CINEMA_2K:
6157         if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))){
6158             opj_event_msg(p_manager, EVT_WARNING,
6159                     "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6160                     "width <= 2048 and height <= 1080\n"
6161                     "-> Input image size %d x %d is not compliant\n"
6162                     "-> Non-profile-3 codestream will be generated\n",
6163                     image->comps[0].w,image->comps[0].h);
6164             return OPJ_FALSE;
6165         }
6166         break;
6167     case OPJ_PROFILE_CINEMA_4K:
6168         if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))){
6169             opj_event_msg(p_manager, EVT_WARNING,
6170                     "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6171                     "width <= 4096 and height <= 2160\n"
6172                     "-> Image size %d x %d is not compliant\n"
6173                     "-> Non-profile-4 codestream will be generated\n",
6174                     image->comps[0].w,image->comps[0].h);
6175             return OPJ_FALSE;
6176         }
6177         break;
6178     default :
6179         break;
6180     }
6181
6182     return OPJ_TRUE;
6183 }
6184
6185 OPJ_BOOL opj_j2k_setup_encoder(     opj_j2k_t *p_j2k,
6186                                                     opj_cparameters_t *parameters,
6187                                                     opj_image_t *image,
6188                                                     opj_event_mgr_t * p_manager)
6189 {
6190         OPJ_UINT32 i, j, tileno, numpocs_tile;
6191         opj_cp_t *cp = 00;
6192
6193         if(!p_j2k || !parameters || ! image) {
6194                 return OPJ_FALSE;
6195         }
6196
6197         if ((parameters->numresolution <= 0) || (parameters->numresolution > OPJ_J2K_MAXRLVLS)) {
6198             opj_event_msg(p_manager, EVT_ERROR, "Invalid number of resolutions : %d not in range [1,%d]\n", parameters->numresolution, OPJ_J2K_MAXRLVLS);
6199             return OPJ_FALSE;
6200         }
6201
6202         /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
6203         cp = &(p_j2k->m_cp);
6204
6205         /* set default values for cp */
6206         cp->tw = 1;
6207         cp->th = 1;
6208
6209         /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */
6210         if (parameters->rsiz == OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */
6211             OPJ_BOOL deprecated_used = OPJ_FALSE;
6212             switch (parameters->cp_cinema){
6213             case OPJ_CINEMA2K_24:
6214                 parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
6215                 parameters->max_cs_size = OPJ_CINEMA_24_CS;
6216                 parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6217                 deprecated_used = OPJ_TRUE;
6218                 break;
6219             case OPJ_CINEMA2K_48:
6220                 parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
6221                 parameters->max_cs_size = OPJ_CINEMA_48_CS;
6222                 parameters->max_comp_size = OPJ_CINEMA_48_COMP;
6223                 deprecated_used = OPJ_TRUE;
6224                 break;
6225             case OPJ_CINEMA4K_24:
6226                 parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
6227                 parameters->max_cs_size = OPJ_CINEMA_24_CS;
6228                 parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6229                 deprecated_used = OPJ_TRUE;
6230                 break;
6231             case OPJ_OFF:
6232             default:
6233                 break;
6234             }
6235             switch (parameters->cp_rsiz){
6236             case OPJ_CINEMA2K:
6237                 parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
6238                 deprecated_used = OPJ_TRUE;
6239                 break;
6240             case OPJ_CINEMA4K:
6241                 parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
6242                 deprecated_used = OPJ_TRUE;
6243                 break;
6244             case OPJ_MCT:
6245                 parameters->rsiz = OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT;
6246                 deprecated_used = OPJ_TRUE;
6247             case OPJ_STD_RSIZ:
6248             default:
6249                 break;
6250             }
6251             if (deprecated_used) {
6252                 opj_event_msg(p_manager, EVT_WARNING,
6253                         "Deprecated fields cp_cinema or cp_rsiz are used\n"
6254                         "Please consider using only the rsiz field\n"
6255                         "See openjpeg.h documentation for more details\n");
6256             }
6257         }
6258
6259         /* see if max_codestream_size does limit input rate */
6260         if (parameters->max_cs_size <= 0) {
6261             if (parameters->tcp_rates[parameters->tcp_numlayers-1] > 0) {
6262                 OPJ_FLOAT32 temp_size;
6263                 temp_size =(OPJ_FLOAT32)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
6264                         (parameters->tcp_rates[parameters->tcp_numlayers-1] * 8 * (OPJ_FLOAT32)image->comps[0].dx * (OPJ_FLOAT32)image->comps[0].dy);
6265                 parameters->max_cs_size = (int) floor(temp_size);
6266             } else {
6267                 parameters->max_cs_size = 0;
6268             }
6269         } else {
6270             OPJ_FLOAT32 temp_rate;
6271             OPJ_BOOL cap = OPJ_FALSE;
6272             temp_rate = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
6273                     (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx * image->comps[0].dy);
6274             for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
6275                 if (parameters->tcp_rates[i] < temp_rate) {
6276                     parameters->tcp_rates[i] = temp_rate;
6277                     cap = OPJ_TRUE;
6278                 }
6279             }
6280             if (cap) {
6281                 opj_event_msg(p_manager, EVT_WARNING,
6282                         "The desired maximum codestream size has limited\n"
6283                         "at least one of the desired quality layers\n");
6284             }
6285         }
6286
6287         /* Manage profiles and applications and set RSIZ */
6288         /* set cinema parameters if required */
6289         if (OPJ_IS_CINEMA(parameters->rsiz)){
6290             if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K)
6291                     || (parameters->rsiz == OPJ_PROFILE_CINEMA_S4K)){
6292                 opj_event_msg(p_manager, EVT_WARNING,
6293                         "JPEG 2000 Scalable Digital Cinema profiles not yet supported\n");
6294                 parameters->rsiz = OPJ_PROFILE_NONE;
6295             } else {
6296                 opj_j2k_set_cinema_parameters(parameters,image,p_manager);
6297                 if (!opj_j2k_is_cinema_compliant(image,parameters->rsiz,p_manager)) {
6298                     parameters->rsiz = OPJ_PROFILE_NONE;
6299                 }
6300             }
6301         } else if (OPJ_IS_STORAGE(parameters->rsiz)) {
6302             opj_event_msg(p_manager, EVT_WARNING,
6303                     "JPEG 2000 Long Term Storage profile not yet supported\n");
6304             parameters->rsiz = OPJ_PROFILE_NONE;
6305         } else if (OPJ_IS_BROADCAST(parameters->rsiz)) {
6306             opj_event_msg(p_manager, EVT_WARNING,
6307                     "JPEG 2000 Broadcast profiles not yet supported\n");
6308             parameters->rsiz = OPJ_PROFILE_NONE;
6309         } else if (OPJ_IS_IMF(parameters->rsiz)) {
6310             opj_event_msg(p_manager, EVT_WARNING,
6311                     "JPEG 2000 IMF profiles not yet supported\n");
6312             parameters->rsiz = OPJ_PROFILE_NONE;
6313         } else if (OPJ_IS_PART2(parameters->rsiz)) {
6314             if (parameters->rsiz == ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_NONE))) {
6315                 opj_event_msg(p_manager, EVT_WARNING,
6316                               "JPEG 2000 Part-2 profile defined\n"
6317                               "but no Part-2 extension enabled.\n"
6318                               "Profile set to NONE.\n");
6319                 parameters->rsiz = OPJ_PROFILE_NONE;
6320             } else if (parameters->rsiz != ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT))) {
6321                 opj_event_msg(p_manager, EVT_WARNING,
6322                               "Unsupported Part-2 extension enabled\n"
6323                               "Profile set to NONE.\n");
6324                 parameters->rsiz = OPJ_PROFILE_NONE;
6325             }
6326         }
6327
6328         /*
6329         copy user encoding parameters
6330         */
6331         cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)parameters->max_comp_size;
6332         cp->rsiz = parameters->rsiz;
6333         cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)parameters->cp_disto_alloc & 1u;
6334         cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)parameters->cp_fixed_alloc & 1u;
6335         cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)parameters->cp_fixed_quality & 1u;
6336
6337         /* mod fixed_quality */
6338         if (parameters->cp_fixed_alloc && parameters->cp_matrice) {
6339                 size_t array_size = (size_t)parameters->tcp_numlayers * (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
6340                 cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
6341                                                                 if (!cp->m_specific_param.m_enc.m_matrice) {
6342                                                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate copy of user encoding parameters matrix \n");
6343                                                                         return OPJ_FALSE;
6344                                                                 }
6345                 memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice, array_size);
6346         }
6347
6348         /* tiles */
6349         cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
6350         cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
6351
6352         /* tile offset */
6353         cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
6354         cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
6355
6356         /* comment string */
6357         if(parameters->cp_comment) {
6358                 cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1U);
6359                                                                 if(!cp->comment) {
6360                                                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate copy of comment string\n");
6361                                                                         return OPJ_FALSE;
6362                                                                 }
6363                 strcpy(cp->comment, parameters->cp_comment);
6364         } else {
6365                 /* Create default comment for codestream */
6366                 const char comment[] = "Created by OpenJPEG version ";
6367                 const size_t clen = strlen(comment);
6368                 const char *version = opj_version();
6369
6370                 /* UniPG>> */
6371 #ifdef USE_JPWL
6372                 cp->comment = (char*)opj_malloc(clen+strlen(version)+11);
6373                                                                 if(!cp->comment) {
6374                                                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate comment string\n");
6375                                                                         return OPJ_FALSE;
6376                                                                 }
6377                 sprintf(cp->comment,"%s%s with JPWL", comment, version);
6378 #else
6379                 cp->comment = (char*)opj_malloc(clen+strlen(version)+1);
6380                                                                 if(!cp->comment) {
6381                                                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate comment string\n");
6382                                                                         return OPJ_FALSE;
6383                                                                 }
6384                 sprintf(cp->comment,"%s%s", comment, version);
6385 #endif
6386                 /* <<UniPG */
6387                                 }
6388
6389         /*
6390         calculate other encoding parameters
6391         */
6392
6393         if (parameters->tile_size_on) {
6394                 cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->x1 - cp->tx0), (OPJ_INT32)cp->tdx);
6395                 cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->y1 - cp->ty0), (OPJ_INT32)cp->tdy);
6396         } else {
6397                 cp->tdx = image->x1 - cp->tx0;
6398                 cp->tdy = image->y1 - cp->ty0;
6399         }
6400
6401         if (parameters->tp_on) {
6402                 cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
6403                 cp->m_specific_param.m_enc.m_tp_on = 1;
6404         }
6405
6406 #ifdef USE_JPWL
6407         /*
6408         calculate JPWL encoding parameters
6409         */
6410
6411         if (parameters->jpwl_epc_on) {
6412                 OPJ_INT32 i;
6413
6414                 /* set JPWL on */
6415                 cp->epc_on = OPJ_TRUE;
6416                 cp->info_on = OPJ_FALSE; /* no informative technique */
6417
6418                 /* set EPB on */
6419                 if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
6420                         cp->epb_on = OPJ_TRUE;
6421
6422                         cp->hprot_MH = parameters->jpwl_hprot_MH;
6423                         for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
6424                                 cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
6425                                 cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
6426                         }
6427                         /* if tile specs are not specified, copy MH specs */
6428                         if (cp->hprot_TPH[0] == -1) {
6429                                 cp->hprot_TPH_tileno[0] = 0;
6430                                 cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
6431                         }
6432                         for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
6433                                 cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
6434                                 cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
6435                                 cp->pprot[i] = parameters->jpwl_pprot[i];
6436                         }
6437                 }
6438
6439                 /* set ESD writing */
6440                 if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
6441                         cp->esd_on = OPJ_TRUE;
6442
6443                         cp->sens_size = parameters->jpwl_sens_size;
6444                         cp->sens_addr = parameters->jpwl_sens_addr;
6445                         cp->sens_range = parameters->jpwl_sens_range;
6446
6447                         cp->sens_MH = parameters->jpwl_sens_MH;
6448                         for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
6449                                 cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
6450                                 cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
6451                         }
6452                 }
6453
6454                 /* always set RED writing to false: we are at the encoder */
6455                 cp->red_on = OPJ_FALSE;
6456
6457         } else {
6458                 cp->epc_on = OPJ_FALSE;
6459         }
6460 #endif /* USE_JPWL */
6461
6462         /* initialize the mutiple tiles */
6463         /* ---------------------------- */
6464         cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
6465         if (!cp->tcps) {
6466                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate tile coding parameters\n");
6467                 return OPJ_FALSE;
6468         }
6469         if (parameters->numpocs) {
6470                 /* initialisation of POC */
6471                 opj_j2k_check_poc_val(parameters->POC,parameters->numpocs, (OPJ_UINT32)parameters->numresolution, image->numcomps, (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
6472                 /* TODO MSD use the return value*/
6473         }
6474
6475         for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
6476                 opj_tcp_t *tcp = &cp->tcps[tileno];
6477                 tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
6478
6479                 for (j = 0; j < tcp->numlayers; j++) {
6480                         if(OPJ_IS_CINEMA(cp->rsiz)){
6481                                 if (cp->m_specific_param.m_enc.m_fixed_quality) {
6482                                         tcp->distoratio[j] = parameters->tcp_distoratio[j];
6483                                 }
6484                                 tcp->rates[j] = parameters->tcp_rates[j];
6485                         }else{
6486                                 if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* add fixed_quality */
6487                                         tcp->distoratio[j] = parameters->tcp_distoratio[j];
6488                                 } else {
6489                                         tcp->rates[j] = parameters->tcp_rates[j];
6490                                 }
6491                         }
6492                 }
6493
6494                 tcp->csty = (OPJ_UINT32)parameters->csty;
6495                 tcp->prg = parameters->prog_order;
6496                 tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
6497
6498                 numpocs_tile = 0;
6499                 tcp->POC = 0;
6500
6501                 if (parameters->numpocs) {
6502                         /* initialisation of POC */
6503                         tcp->POC = 1;
6504                         for (i = 0; i < parameters->numpocs; i++) {
6505                                 if (tileno + 1 == parameters->POC[i].tile )  {
6506                                         opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
6507
6508                                         tcp_poc->resno0         = parameters->POC[numpocs_tile].resno0;
6509                                         tcp_poc->compno0        = parameters->POC[numpocs_tile].compno0;
6510                                         tcp_poc->layno1         = parameters->POC[numpocs_tile].layno1;
6511                                         tcp_poc->resno1         = parameters->POC[numpocs_tile].resno1;
6512                                         tcp_poc->compno1        = parameters->POC[numpocs_tile].compno1;
6513                                         tcp_poc->prg1           = parameters->POC[numpocs_tile].prg1;
6514                                         tcp_poc->tile           = parameters->POC[numpocs_tile].tile;
6515
6516                                         numpocs_tile++;
6517                                 }
6518                         }
6519
6520                         tcp->numpocs = numpocs_tile -1 ;
6521                 }else{
6522                         tcp->numpocs = 0;
6523                 }
6524
6525                 tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
6526                 if (!tcp->tccps) {
6527                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate tile component coding parameters\n");
6528                         return OPJ_FALSE;
6529                 }
6530                 if (parameters->mct_data) {
6531                       
6532                     OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
6533                     OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
6534                     OPJ_INT32 * l_dc_shift = (OPJ_INT32 *) ((OPJ_BYTE *) parameters->mct_data + lMctSize);
6535
6536                                                                                 if (!lTmpBuf) {
6537                             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate temp buffer\n");
6538                             return OPJ_FALSE;
6539                     }
6540
6541                     tcp->mct = 2;
6542                     tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
6543                                                                                 if (! tcp->m_mct_coding_matrix) {
6544                             opj_free(lTmpBuf);
6545                                                                                                                 lTmpBuf = NULL;
6546                             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT coding matrix \n");
6547                             return OPJ_FALSE;
6548                     }
6549                     memcpy(tcp->m_mct_coding_matrix,parameters->mct_data,lMctSize);
6550                     memcpy(lTmpBuf,parameters->mct_data,lMctSize);
6551
6552                     tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
6553                                                                                 if (! tcp->m_mct_decoding_matrix) {
6554                                                                                                                 opj_free(lTmpBuf);
6555                                                                                                                 lTmpBuf = NULL;
6556                             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT decoding matrix \n");
6557                             return OPJ_FALSE;
6558                     }
6559                     if(opj_matrix_inversion_f(lTmpBuf,(tcp->m_mct_decoding_matrix),image->numcomps) == OPJ_FALSE) {
6560                             opj_free(lTmpBuf);
6561                                                                                                                 lTmpBuf = NULL;
6562                             opj_event_msg(p_manager, EVT_ERROR, "Failed to inverse encoder MCT decoding matrix \n");
6563                             return OPJ_FALSE;
6564                                                                                 }
6565
6566                     tcp->mct_norms = (OPJ_FLOAT64*)
6567                                     opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
6568                                                                                 if (! tcp->mct_norms) {
6569                             opj_free(lTmpBuf);
6570                                                                                                                 lTmpBuf = NULL;
6571                             opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT norms \n");
6572                             return OPJ_FALSE;
6573                     }
6574                     opj_calculate_norms(tcp->mct_norms,image->numcomps,tcp->m_mct_decoding_matrix);
6575                     opj_free(lTmpBuf);
6576
6577                     for (i = 0; i < image->numcomps; i++) {
6578                             opj_tccp_t *tccp = &tcp->tccps[i];
6579                             tccp->m_dc_level_shift = l_dc_shift[i];
6580                     }
6581
6582                     if (opj_j2k_setup_mct_encoding(tcp,image) == OPJ_FALSE) {
6583                         /* free will be handled by opj_j2k_destroy */
6584                                                                                                 opj_event_msg(p_manager, EVT_ERROR, "Failed to setup j2k mct encoding\n");
6585                         return OPJ_FALSE;
6586                     }
6587                 }
6588                 else {
6589                     if(tcp->mct==1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
6590                         if ((image->comps[0].dx != image->comps[1].dx) ||
6591                                 (image->comps[0].dx != image->comps[2].dx) ||
6592                                 (image->comps[0].dy != image->comps[1].dy) ||
6593                                 (image->comps[0].dy != image->comps[2].dy)) {
6594                             opj_event_msg(p_manager, EVT_WARNING, "Cannot perform MCT on components with different sizes. Disabling MCT.\n");
6595                             tcp->mct = 0;
6596                         }
6597                     }
6598                         for (i = 0; i < image->numcomps; i++) {
6599                                 opj_tccp_t *tccp = &tcp->tccps[i];
6600                                 opj_image_comp_t * l_comp = &(image->comps[i]);
6601
6602                                 if (! l_comp->sgnd) {
6603                                         tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
6604                                 }
6605                         }
6606                 }
6607
6608                 for (i = 0; i < image->numcomps; i++) {
6609                         opj_tccp_t *tccp = &tcp->tccps[i];
6610
6611                         tccp->csty = parameters->csty & 0x01;   /* 0 => one precinct || 1 => custom precinct  */
6612                         tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
6613                         tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
6614                         tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
6615                         tccp->cblksty = (OPJ_UINT32)parameters->mode;
6616                         tccp->qmfbid = parameters->irreversible ? 0 : 1;
6617                         tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
6618                         tccp->numgbits = 2;
6619
6620                         if ((OPJ_INT32)i == parameters->roi_compno) {
6621                                 tccp->roishift = parameters->roi_shift;
6622                         } else {
6623                                 tccp->roishift = 0;
6624                         }
6625
6626                                 if (parameters->csty & J2K_CCP_CSTY_PRT) {
6627                                         OPJ_INT32 p = 0, it_res;
6628                                         assert( tccp->numresolutions > 0 );
6629                                         for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
6630                                                 if (p < parameters->res_spec) {
6631
6632                                                         if (parameters->prcw_init[p] < 1) {
6633                                                                 tccp->prcw[it_res] = 1;
6634                                                         } else {
6635                                                                 tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
6636                                                         }
6637
6638                                                         if (parameters->prch_init[p] < 1) {
6639                                                                 tccp->prch[it_res] = 1;
6640                                                         }else {
6641                                                                 tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
6642                                                         }
6643
6644                                                 } else {
6645                                                         OPJ_INT32 res_spec = parameters->res_spec;
6646                                                         OPJ_INT32 size_prcw = 0;
6647                                                         OPJ_INT32 size_prch = 0;
6648
6649                                                         assert(res_spec>0); /* issue 189 */
6650                                                         size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
6651                                                         size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
6652
6653
6654                                                         if (size_prcw < 1) {
6655                                                                 tccp->prcw[it_res] = 1;
6656                                                         } else {
6657                                                                 tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
6658                                                         }
6659
6660                                                         if (size_prch < 1) {
6661                                                                 tccp->prch[it_res] = 1;
6662                                                         } else {
6663                                                                 tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
6664                                                         }
6665                                                 }
6666                                                 p++;
6667                                                 /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
6668                                         }       /*end for*/
6669                                 } else {
6670                                         for (j = 0; j < tccp->numresolutions; j++) {
6671                                                 tccp->prcw[j] = 15;
6672                                                 tccp->prch[j] = 15;
6673                                         }
6674                                 }
6675
6676                         opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
6677                 }
6678         }
6679
6680         if (parameters->mct_data) {
6681                 opj_free(parameters->mct_data);
6682                 parameters->mct_data = 00;
6683         }
6684         return OPJ_TRUE;
6685 }
6686
6687 static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
6688 {
6689         assert(cstr_index != 00);
6690
6691         /* expand the list? */
6692         if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
6693                 opj_marker_info_t *new_marker;
6694                 cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->maxmarknum);
6695                 new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker, cstr_index->maxmarknum *sizeof(opj_marker_info_t));
6696                 if (! new_marker) {
6697                         opj_free(cstr_index->marker);
6698                         cstr_index->marker = NULL;
6699                         cstr_index->maxmarknum = 0;
6700                         cstr_index->marknum = 0;
6701                         /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
6702                         return OPJ_FALSE;
6703                 }
6704                 cstr_index->marker = new_marker;
6705         }
6706
6707         /* add the marker */
6708         cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
6709         cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
6710         cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
6711         cstr_index->marknum++;
6712         return OPJ_TRUE;
6713 }
6714
6715 static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
6716 {
6717         assert(cstr_index != 00);
6718         assert(cstr_index->tile_index != 00);
6719
6720         /* expand the list? */
6721         if ((cstr_index->tile_index[tileno].marknum + 1) > cstr_index->tile_index[tileno].maxmarknum) {
6722                 opj_marker_info_t *new_marker;
6723                 cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
6724                 new_marker = (opj_marker_info_t *) opj_realloc(
6725                                 cstr_index->tile_index[tileno].marker,
6726                                 cstr_index->tile_index[tileno].maxmarknum *sizeof(opj_marker_info_t));
6727                 if (! new_marker) {
6728                         opj_free(cstr_index->tile_index[tileno].marker);
6729                         cstr_index->tile_index[tileno].marker = NULL;
6730                         cstr_index->tile_index[tileno].maxmarknum = 0;
6731                         cstr_index->tile_index[tileno].marknum = 0;
6732                         /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
6733                         return OPJ_FALSE;
6734                 }
6735                 cstr_index->tile_index[tileno].marker = new_marker;
6736         }
6737
6738         /* add the marker */
6739         cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type = (OPJ_UINT16)type;
6740         cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos = (OPJ_INT32)pos;
6741         cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len = (OPJ_INT32)len;
6742         cstr_index->tile_index[tileno].marknum++;
6743
6744         if (type == J2K_MS_SOT) {
6745                 OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
6746
6747                 if (cstr_index->tile_index[tileno].tp_index)
6748                         cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
6749
6750         }
6751         return OPJ_TRUE;
6752 }
6753
6754 /*
6755  * -----------------------------------------------------------------------
6756  * -----------------------------------------------------------------------
6757  * -----------------------------------------------------------------------
6758  */
6759
6760 OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k,
6761                                 opj_stream_private_t *p_stream,
6762                                 opj_event_mgr_t * p_manager
6763                                 )
6764 {
6765     (void)p_j2k;
6766     (void)p_stream;
6767     (void)p_manager;
6768     return OPJ_TRUE;
6769 }
6770
6771 OPJ_BOOL opj_j2k_read_header(   opj_stream_private_t *p_stream,
6772                                                             opj_j2k_t* p_j2k,
6773                                                             opj_image_t** p_image,
6774                                                             opj_event_mgr_t* p_manager )
6775 {
6776         /* preconditions */
6777         assert(p_j2k != 00);
6778         assert(p_stream != 00);
6779         assert(p_manager != 00);
6780
6781         /* create an empty image header */
6782         p_j2k->m_private_image = opj_image_create0();
6783         if (! p_j2k->m_private_image) {
6784                 return OPJ_FALSE;
6785         }
6786
6787         /* customization of the validation */
6788         opj_j2k_setup_decoding_validation(p_j2k);
6789
6790         /* validation of the parameters codec */
6791         if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream,p_manager)) {
6792                 opj_image_destroy(p_j2k->m_private_image);
6793                 p_j2k->m_private_image = NULL;
6794                 return OPJ_FALSE;
6795         }
6796
6797         /* customization of the encoding */
6798         opj_j2k_setup_header_reading(p_j2k);
6799
6800         /* read header */
6801         if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
6802                 opj_image_destroy(p_j2k->m_private_image);
6803                 p_j2k->m_private_image = NULL;
6804                 return OPJ_FALSE;
6805         }
6806
6807         *p_image = opj_image_create0();
6808         if (! (*p_image)) {
6809                 return OPJ_FALSE;
6810         }
6811
6812         /* Copy codestream image information to the output image */
6813         opj_copy_image_header(p_j2k->m_private_image, *p_image);
6814
6815     /*Allocate and initialize some elements of codestrem index*/
6816         if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){
6817                 return OPJ_FALSE;
6818         }
6819
6820         return OPJ_TRUE;
6821 }
6822
6823 void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k)
6824 {
6825         /* preconditions*/
6826         assert(p_j2k != 00);
6827
6828         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_read_header_procedure);
6829
6830         /* DEVELOPER CORNER, add your custom procedures */
6831         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd);
6832
6833 }
6834
6835 void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k)
6836 {
6837         /* preconditions*/
6838         assert(p_j2k != 00);
6839
6840         opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_decoder);
6841         opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_decoding_validation);
6842         /* DEVELOPER CORNER, add your custom validation procedure */
6843
6844 }
6845
6846 OPJ_BOOL opj_j2k_mct_validation (       opj_j2k_t * p_j2k,
6847                                                                 opj_stream_private_t *p_stream,
6848                                                                 opj_event_mgr_t * p_manager )
6849 {
6850         OPJ_BOOL l_is_valid = OPJ_TRUE;
6851         OPJ_UINT32 i,j;
6852
6853         /* preconditions */
6854         assert(p_j2k != 00);
6855         assert(p_stream != 00);
6856         assert(p_manager != 00);
6857
6858         if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
6859                 OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
6860                 opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
6861
6862                 for (i=0;i<l_nb_tiles;++i) {
6863                         if (l_tcp->mct == 2) {
6864                                 opj_tccp_t * l_tccp = l_tcp->tccps;
6865                                 l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
6866
6867                                 for (j=0;j<p_j2k->m_private_image->numcomps;++j) {
6868                                         l_is_valid &= ! (l_tccp->qmfbid & 1);
6869                                         ++l_tccp;
6870                                 }
6871                         }
6872                         ++l_tcp;
6873                 }
6874         }
6875
6876         return l_is_valid;
6877 }
6878
6879 OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)
6880 {
6881         OPJ_UINT32 i;
6882         OPJ_UINT32 l_indix = 1;
6883         opj_mct_data_t * l_mct_deco_data = 00,* l_mct_offset_data = 00;
6884         opj_simple_mcc_decorrelation_data_t * l_mcc_data;
6885         OPJ_UINT32 l_mct_size,l_nb_elem;
6886         OPJ_FLOAT32 * l_data, * l_current_data;
6887         opj_tccp_t * l_tccp;
6888
6889         /* preconditions */
6890         assert(p_tcp != 00);
6891
6892         if (p_tcp->mct != 2) {
6893                 return OPJ_TRUE;
6894         }
6895
6896         if (p_tcp->m_mct_decoding_matrix) {
6897                 if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
6898                         opj_mct_data_t *new_mct_records;
6899                         p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
6900
6901                         new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
6902                         if (! new_mct_records) {
6903                                 opj_free(p_tcp->m_mct_records);
6904                                 p_tcp->m_mct_records = NULL;
6905                                 p_tcp->m_nb_max_mct_records = 0;
6906                                 p_tcp->m_nb_mct_records = 0;
6907                                 /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
6908                                 return OPJ_FALSE;
6909                         }
6910                         p_tcp->m_mct_records = new_mct_records;
6911                         l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
6912
6913                         memset(l_mct_deco_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
6914                 }
6915                 l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
6916
6917                 if (l_mct_deco_data->m_data) {
6918                         opj_free(l_mct_deco_data->m_data);
6919                         l_mct_deco_data->m_data = 00;
6920                 }
6921
6922                 l_mct_deco_data->m_index = l_indix++;
6923                 l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
6924                 l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
6925                 l_nb_elem = p_image->numcomps * p_image->numcomps;
6926                 l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
6927                 l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
6928
6929                 if (! l_mct_deco_data->m_data) {
6930                         return OPJ_FALSE;
6931                 }
6932
6933                 j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](p_tcp->m_mct_decoding_matrix,l_mct_deco_data->m_data,l_nb_elem);
6934
6935                 l_mct_deco_data->m_data_size = l_mct_size;
6936                 ++p_tcp->m_nb_mct_records;
6937         }
6938
6939         if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
6940                 opj_mct_data_t *new_mct_records;
6941                 p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
6942                 new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
6943                 if (! new_mct_records) {
6944                         opj_free(p_tcp->m_mct_records);
6945                         p_tcp->m_mct_records = NULL;
6946                         p_tcp->m_nb_max_mct_records = 0;
6947                         p_tcp->m_nb_mct_records = 0;
6948                         /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
6949                         return OPJ_FALSE;
6950                 }
6951                 p_tcp->m_mct_records = new_mct_records;
6952                 l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
6953
6954                 memset(l_mct_offset_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
6955
6956                 if (l_mct_deco_data) {
6957                         l_mct_deco_data = l_mct_offset_data - 1;
6958                 }
6959         }
6960
6961         l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
6962
6963         if (l_mct_offset_data->m_data) {
6964                 opj_free(l_mct_offset_data->m_data);
6965                 l_mct_offset_data->m_data = 00;
6966         }
6967
6968         l_mct_offset_data->m_index = l_indix++;
6969         l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
6970         l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
6971         l_nb_elem = p_image->numcomps;
6972         l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
6973         l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
6974
6975         if (! l_mct_offset_data->m_data) {
6976                 return OPJ_FALSE;
6977         }
6978
6979         l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
6980         if (! l_data) {
6981                 opj_free(l_mct_offset_data->m_data);
6982                 l_mct_offset_data->m_data = 00;
6983                 return OPJ_FALSE;
6984         }
6985
6986         l_tccp = p_tcp->tccps;
6987         l_current_data = l_data;
6988
6989         for (i=0;i<l_nb_elem;++i) {
6990                 *(l_current_data++) = (OPJ_FLOAT32) (l_tccp->m_dc_level_shift);
6991                 ++l_tccp;
6992         }
6993
6994         j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,l_mct_offset_data->m_data,l_nb_elem);
6995
6996         opj_free(l_data);
6997
6998         l_mct_offset_data->m_data_size = l_mct_size;
6999
7000         ++p_tcp->m_nb_mct_records;
7001
7002         if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
7003                 opj_simple_mcc_decorrelation_data_t *new_mcc_records;
7004                 p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
7005                 new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
7006                                 p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
7007                 if (! new_mcc_records) {
7008                         opj_free(p_tcp->m_mcc_records);
7009                         p_tcp->m_mcc_records = NULL;
7010                         p_tcp->m_nb_max_mcc_records = 0;
7011                         p_tcp->m_nb_mcc_records = 0;
7012                         /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
7013                         return OPJ_FALSE;
7014                 }
7015                 p_tcp->m_mcc_records = new_mcc_records;
7016                 l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
7017                 memset(l_mcc_data ,0,(p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
7018
7019         }
7020
7021         l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
7022         l_mcc_data->m_decorrelation_array = l_mct_deco_data;
7023         l_mcc_data->m_is_irreversible = 1;
7024         l_mcc_data->m_nb_comps = p_image->numcomps;
7025         l_mcc_data->m_index = l_indix++;
7026         l_mcc_data->m_offset_array = l_mct_offset_data;
7027         ++p_tcp->m_nb_mcc_records;
7028
7029         return OPJ_TRUE;
7030 }
7031
7032 OPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k,
7033                                                             opj_stream_private_t *p_stream,
7034                                                             opj_event_mgr_t * p_manager )
7035 {
7036         /* add here initialization of cp
7037            copy paste of setup_decoder */
7038   (void)p_j2k;
7039   (void)p_stream;
7040   (void)p_manager;
7041         return OPJ_TRUE;
7042 }
7043
7044 OPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k,
7045                                                         opj_stream_private_t *p_stream,
7046                                                         opj_event_mgr_t * p_manager )
7047 {
7048         /* add here initialization of cp
7049            copy paste of setup_encoder */
7050   (void)p_j2k;
7051   (void)p_stream;
7052   (void)p_manager;
7053         return OPJ_TRUE;
7054 }
7055
7056 OPJ_BOOL opj_j2k_encoding_validation (  opj_j2k_t * p_j2k,
7057                                                                             opj_stream_private_t *p_stream,
7058                                                                             opj_event_mgr_t * p_manager )
7059 {
7060         OPJ_BOOL l_is_valid = OPJ_TRUE;
7061
7062         /* preconditions */
7063         assert(p_j2k != 00);
7064         assert(p_stream != 00);
7065         assert(p_manager != 00);
7066
7067         /* STATE checking */
7068         /* make sure the state is at 0 */
7069         l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
7070
7071         /* POINTER validation */
7072         /* make sure a p_j2k codec is present */
7073         l_is_valid &= (p_j2k->m_procedure_list != 00);
7074         /* make sure a validation list is present */
7075         l_is_valid &= (p_j2k->m_validation_list != 00);
7076
7077         /* ISO 15444-1:2004 states between 1 & 33 (0 -> 32) */
7078         /* 33 (32) would always fail the check below (if a cast to 64bits was done) */
7079         /* FIXME Shall we change OPJ_J2K_MAXRLVLS to 32 ? */
7080         if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) || (p_j2k->m_cp.tcps->tccps->numresolutions > 32)) {
7081                 opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
7082                 return OPJ_FALSE;
7083         }
7084
7085         if ((p_j2k->m_cp.tdx) < (OPJ_UINT32) (1 << (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
7086                 opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
7087                 return OPJ_FALSE;
7088         }
7089
7090         if ((p_j2k->m_cp.tdy) < (OPJ_UINT32) (1 << (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
7091                 opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
7092                 return OPJ_FALSE;
7093         }
7094
7095         /* PARAMETER VALIDATION */
7096         return l_is_valid;
7097 }
7098
7099 OPJ_BOOL opj_j2k_decoding_validation (  opj_j2k_t *p_j2k,
7100                                         opj_stream_private_t *p_stream,
7101                                         opj_event_mgr_t * p_manager
7102                                         )
7103 {
7104         OPJ_BOOL l_is_valid = OPJ_TRUE;
7105
7106         /* preconditions*/
7107         assert(p_j2k != 00);
7108         assert(p_stream != 00);
7109         assert(p_manager != 00);
7110
7111         /* STATE checking */
7112         /* make sure the state is at 0 */
7113 #ifdef TODO_MSD
7114         l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
7115 #endif
7116         l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
7117
7118         /* POINTER validation */
7119         /* make sure a p_j2k codec is present */
7120         /* make sure a procedure list is present */
7121         l_is_valid &= (p_j2k->m_procedure_list != 00);
7122         /* make sure a validation list is present */
7123         l_is_valid &= (p_j2k->m_validation_list != 00);
7124
7125         /* PARAMETER VALIDATION */
7126         return l_is_valid;
7127 }
7128
7129 OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k,
7130                                                                             opj_stream_private_t *p_stream,
7131                                                                             opj_event_mgr_t * p_manager)
7132 {
7133         OPJ_UINT32 l_current_marker;
7134         OPJ_UINT32 l_marker_size;
7135         const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
7136         OPJ_BOOL l_has_siz = 0;
7137         OPJ_BOOL l_has_cod = 0;
7138         OPJ_BOOL l_has_qcd = 0;
7139
7140         /* preconditions */
7141         assert(p_stream != 00);
7142         assert(p_j2k != 00);
7143         assert(p_manager != 00);
7144
7145         /*  We enter in the main header */
7146         p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
7147
7148         /* Try to read the SOC marker, the codestream must begin with SOC marker */
7149         if (! opj_j2k_read_soc(p_j2k,p_stream,p_manager)) {
7150                 opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
7151                 return OPJ_FALSE;
7152         }
7153
7154         /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
7155         if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
7156                 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7157                 return OPJ_FALSE;
7158         }
7159
7160         /* Read 2 bytes as the new marker ID */
7161         opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
7162
7163         /* Try to read until the SOT is detected */
7164         while (l_current_marker != J2K_MS_SOT) {
7165
7166                 /* Check if the current marker ID is valid */
7167                 if (l_current_marker < 0xff00) {
7168                         opj_event_msg(p_manager, EVT_ERROR, "We expected read a marker ID (0xff--) instead of %.8x\n", l_current_marker);
7169                         return OPJ_FALSE;
7170                 }
7171
7172                 /* Get the marker handler from the marker ID */
7173                 l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
7174
7175                 /* Manage case where marker is unknown */
7176                 if (l_marker_handler->id == J2K_MS_UNK) {
7177                         if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)){
7178                                 opj_event_msg(p_manager, EVT_ERROR, "Unknow marker have been detected and generated error.\n");
7179                                 return OPJ_FALSE;
7180                         }
7181
7182                         if (l_current_marker == J2K_MS_SOT)
7183                                 break; /* SOT marker is detected main header is completely read */
7184                         else    /* Get the marker handler from the marker ID */
7185                                 l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
7186                 }
7187
7188                 if (l_marker_handler->id == J2K_MS_SIZ) {
7189                     /* Mark required SIZ marker as found */
7190                     l_has_siz = 1;
7191                 }
7192                 if (l_marker_handler->id == J2K_MS_COD) {
7193                     /* Mark required COD marker as found */
7194                     l_has_cod = 1;
7195                 }
7196                 if (l_marker_handler->id == J2K_MS_QCD) {
7197                     /* Mark required QCD marker as found */
7198                     l_has_qcd = 1;
7199                 }
7200
7201                 /* Check if the marker is known and if it is the right place to find it */
7202                 if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {
7203                         opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
7204                         return OPJ_FALSE;
7205                 }
7206
7207                 /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
7208                 if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
7209                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7210                         return OPJ_FALSE;
7211                 }
7212
7213                 /* read 2 bytes as the marker size */
7214                 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
7215                 l_marker_size -= 2; /* Subtract the size of the marker ID already read */
7216
7217                 /* Check if the marker size is compatible with the header data size */
7218                 if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
7219                         OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
7220                         if (! new_header_data) {
7221                                 opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
7222                                 p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
7223                                 p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
7224                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
7225                                 return OPJ_FALSE;
7226                         }
7227                         p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
7228                         p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
7229                 }
7230
7231                 /* Try to read the rest of the marker segment from stream and copy them into the buffer */
7232                 if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {
7233                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7234                         return OPJ_FALSE;
7235                 }
7236
7237                 /* Read the marker segment with the correct marker handler */
7238                 if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {
7239                         opj_event_msg(p_manager, EVT_ERROR, "Marker handler function failed to read the marker segment\n");
7240                         return OPJ_FALSE;
7241                 }
7242
7243                 /* Add the marker to the codestream index*/
7244                 if (OPJ_FALSE == opj_j2k_add_mhmarker(
7245                                         p_j2k->cstr_index,
7246                                         l_marker_handler->id,
7247                                         (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
7248                                         l_marker_size + 4 )) {
7249                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
7250                         return OPJ_FALSE;
7251                 }
7252
7253                 /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
7254                 if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
7255                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7256                         return OPJ_FALSE;
7257                 }
7258
7259                 /* read 2 bytes as the new marker ID */
7260                 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
7261         }
7262
7263         if (l_has_siz == 0) {
7264             opj_event_msg(p_manager, EVT_ERROR, "required SIZ marker not found in main header\n");
7265             return OPJ_FALSE;
7266         }
7267         if (l_has_cod == 0) {
7268             opj_event_msg(p_manager, EVT_ERROR, "required COD marker not found in main header\n");
7269             return OPJ_FALSE;
7270         }
7271         if (l_has_qcd == 0) {
7272             opj_event_msg(p_manager, EVT_ERROR, "required QCD marker not found in main header\n");
7273             return OPJ_FALSE;
7274         }
7275
7276         opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
7277
7278         /* Position of the last element if the main header */
7279         p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
7280
7281         /* Next step: read a tile-part header */
7282         p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
7283
7284         return OPJ_TRUE;
7285 }
7286
7287 OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k,
7288                                         opj_procedure_list_t * p_procedure_list,
7289                                         opj_stream_private_t *p_stream,
7290                                         opj_event_mgr_t * p_manager )
7291 {
7292         OPJ_BOOL (** l_procedure) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *) = 00;
7293         OPJ_BOOL l_result = OPJ_TRUE;
7294         OPJ_UINT32 l_nb_proc, i;
7295
7296         /* preconditions*/
7297         assert(p_procedure_list != 00);
7298         assert(p_j2k != 00);
7299         assert(p_stream != 00);
7300         assert(p_manager != 00);
7301
7302         l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
7303         l_procedure = (OPJ_BOOL (**) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
7304
7305         for     (i=0;i<l_nb_proc;++i) {
7306                 l_result = l_result && ((*l_procedure) (p_j2k,p_stream,p_manager));
7307                 ++l_procedure;
7308         }
7309
7310         /* and clear the procedure list at the end.*/
7311         opj_procedure_list_clear(p_procedure_list);
7312         return l_result;
7313 }
7314
7315 /* FIXME DOC*/
7316 static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd (       opj_j2k_t * p_j2k,
7317                                                             opj_stream_private_t *p_stream,
7318                                                             opj_event_mgr_t * p_manager
7319                                                             )
7320 {
7321         opj_tcp_t * l_tcp = 00;
7322         opj_tcp_t * l_default_tcp = 00;
7323         OPJ_UINT32 l_nb_tiles;
7324         OPJ_UINT32 i,j;
7325         opj_tccp_t *l_current_tccp = 00;
7326         OPJ_UINT32 l_tccp_size;
7327         OPJ_UINT32 l_mct_size;
7328         opj_image_t * l_image;
7329         OPJ_UINT32 l_mcc_records_size,l_mct_records_size;
7330         opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
7331         opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
7332         OPJ_UINT32 l_offset;
7333
7334         /* preconditions */
7335         assert(p_j2k != 00);
7336         assert(p_stream != 00);
7337         assert(p_manager != 00);
7338
7339         l_image = p_j2k->m_private_image;
7340         l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
7341         l_tcp = p_j2k->m_cp.tcps;
7342         l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
7343         l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
7344         l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
7345
7346         /* For each tile */
7347         for (i=0; i<l_nb_tiles; ++i) {
7348                 /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
7349                 l_current_tccp = l_tcp->tccps;
7350                 /*Copy default coding parameters into the current tile coding parameters*/
7351                 memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
7352                 /* Initialize some values of the current tile coding parameters*/
7353                 l_tcp->ppt = 0;
7354                 l_tcp->ppt_data = 00;
7355                 /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
7356                 l_tcp->tccps = l_current_tccp;
7357
7358                 /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
7359                 if (l_default_tcp->m_mct_decoding_matrix) {
7360                         l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
7361                         if (! l_tcp->m_mct_decoding_matrix ) {
7362                                 return OPJ_FALSE;
7363                         }
7364                         memcpy(l_tcp->m_mct_decoding_matrix,l_default_tcp->m_mct_decoding_matrix,l_mct_size);
7365                 }
7366
7367                 /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
7368                 l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(opj_mct_data_t);
7369                 l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
7370                 if (! l_tcp->m_mct_records) {
7371                         return OPJ_FALSE;
7372                 }
7373                 memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records,l_mct_records_size);
7374
7375                 /* Copy the mct record data from dflt_tile_cp to the current tile*/
7376                 l_src_mct_rec = l_default_tcp->m_mct_records;
7377                 l_dest_mct_rec = l_tcp->m_mct_records;
7378
7379                 for (j=0;j<l_default_tcp->m_nb_mct_records;++j) {
7380
7381                         if (l_src_mct_rec->m_data) {
7382
7383                                 l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
7384                                 if(! l_dest_mct_rec->m_data) {
7385                                         return OPJ_FALSE;
7386                                 }
7387                                 memcpy(l_dest_mct_rec->m_data,l_src_mct_rec->m_data,l_src_mct_rec->m_data_size);
7388                         }
7389
7390                         ++l_src_mct_rec;
7391                         ++l_dest_mct_rec;
7392                 }
7393
7394                 /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
7395                 l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(opj_simple_mcc_decorrelation_data_t);
7396                 l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(l_mcc_records_size);
7397                 if (! l_tcp->m_mcc_records) {
7398                         return OPJ_FALSE;
7399                 }
7400                 memcpy(l_tcp->m_mcc_records,l_default_tcp->m_mcc_records,l_mcc_records_size);
7401
7402                 /* Copy the mcc record data from dflt_tile_cp to the current tile*/
7403                 l_src_mcc_rec = l_default_tcp->m_mcc_records;
7404                 l_dest_mcc_rec = l_tcp->m_mcc_records;
7405
7406                 for (j=0;j<l_default_tcp->m_nb_max_mcc_records;++j) {
7407
7408                         if (l_src_mcc_rec->m_decorrelation_array) {
7409                                 l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array - l_default_tcp->m_mct_records);
7410                                 l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
7411                         }
7412
7413                         if (l_src_mcc_rec->m_offset_array) {
7414                                 l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array - l_default_tcp->m_mct_records);
7415                                 l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
7416                         }
7417
7418                         ++l_src_mcc_rec;
7419                         ++l_dest_mcc_rec;
7420                 }
7421
7422                 /* Copy all the dflt_tile_compo_cp to the current tile cp */
7423                 memcpy(l_current_tccp,l_default_tcp->tccps,l_tccp_size);
7424
7425                 /* Move to next tile cp*/
7426                 ++l_tcp;
7427         }
7428
7429         /* Create the current tile decoder*/
7430         p_j2k->m_tcd = (opj_tcd_t*)opj_tcd_create(OPJ_TRUE); /* FIXME why a cast ? */
7431         if (! p_j2k->m_tcd ) {
7432                 return OPJ_FALSE;
7433         }
7434
7435         if ( !opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp)) ) {
7436                 opj_tcd_destroy(p_j2k->m_tcd);
7437                 p_j2k->m_tcd = 00;
7438                 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
7439                 return OPJ_FALSE;
7440         }
7441
7442         return OPJ_TRUE;
7443 }
7444
7445 const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler (OPJ_UINT32 p_id)
7446 {
7447         const opj_dec_memory_marker_handler_t *e;
7448         for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
7449                 if (e->id == p_id) {
7450                         break; /* we find a handler corresponding to the marker ID*/
7451                 }
7452         }
7453         return e;
7454 }
7455
7456 void opj_j2k_destroy (opj_j2k_t *p_j2k)
7457 {
7458         if (p_j2k == 00) {
7459                 return;
7460         }
7461
7462         if (p_j2k->m_is_decoder) {
7463
7464                 if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
7465                         opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
7466                         opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
7467                         p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
7468                 }
7469
7470                 if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
7471                         opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
7472                         p_j2k->m_specific_param.m_decoder.m_header_data = 00;
7473                         p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
7474                 }
7475         }
7476         else {
7477
7478                 if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
7479                         opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
7480                         p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
7481                 }
7482
7483                 if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
7484                         opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
7485                         p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
7486                         p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
7487                 }
7488
7489                 if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
7490                         opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
7491                         p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
7492                         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
7493                 }
7494         }
7495
7496         opj_tcd_destroy(p_j2k->m_tcd);
7497
7498         opj_j2k_cp_destroy(&(p_j2k->m_cp));
7499         memset(&(p_j2k->m_cp),0,sizeof(opj_cp_t));
7500
7501         opj_procedure_list_destroy(p_j2k->m_procedure_list);
7502         p_j2k->m_procedure_list = 00;
7503
7504         opj_procedure_list_destroy(p_j2k->m_validation_list);
7505         p_j2k->m_procedure_list = 00;
7506
7507         j2k_destroy_cstr_index(p_j2k->cstr_index);
7508         p_j2k->cstr_index = NULL;
7509
7510         opj_image_destroy(p_j2k->m_private_image);
7511         p_j2k->m_private_image = NULL;
7512
7513         opj_image_destroy(p_j2k->m_output_image);
7514         p_j2k->m_output_image = NULL;
7515
7516         opj_free(p_j2k);
7517 }
7518
7519 void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind)
7520 {
7521         if (p_cstr_ind) {
7522
7523                 if (p_cstr_ind->marker) {
7524                         opj_free(p_cstr_ind->marker);
7525                         p_cstr_ind->marker = NULL;
7526                 }
7527
7528                 if (p_cstr_ind->tile_index) {
7529                         OPJ_UINT32 it_tile = 0;
7530
7531                         for (it_tile=0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
7532
7533                                 if(p_cstr_ind->tile_index[it_tile].packet_index) {
7534                                         opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
7535                                         p_cstr_ind->tile_index[it_tile].packet_index = NULL;
7536                                 }
7537
7538                                 if(p_cstr_ind->tile_index[it_tile].tp_index){
7539                                         opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
7540                                         p_cstr_ind->tile_index[it_tile].tp_index = NULL;
7541                                 }
7542
7543                                 if(p_cstr_ind->tile_index[it_tile].marker){
7544                                         opj_free(p_cstr_ind->tile_index[it_tile].marker);
7545                                         p_cstr_ind->tile_index[it_tile].marker = NULL;
7546
7547                                 }
7548                         }
7549
7550                         opj_free( p_cstr_ind->tile_index);
7551                         p_cstr_ind->tile_index = NULL;
7552                 }
7553
7554                 opj_free(p_cstr_ind);
7555         }
7556 }
7557
7558 void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp)
7559 {
7560         if (p_tcp == 00) {
7561                 return;
7562         }
7563
7564         if (p_tcp->ppt_buffer != 00) {
7565                 opj_free(p_tcp->ppt_buffer);
7566                 p_tcp->ppt_buffer = 00;
7567         }
7568
7569         if (p_tcp->tccps != 00) {
7570                 opj_free(p_tcp->tccps);
7571                 p_tcp->tccps = 00;
7572         }
7573
7574         if (p_tcp->m_mct_coding_matrix != 00) {
7575                 opj_free(p_tcp->m_mct_coding_matrix);
7576                 p_tcp->m_mct_coding_matrix = 00;
7577         }
7578
7579         if (p_tcp->m_mct_decoding_matrix != 00) {
7580                 opj_free(p_tcp->m_mct_decoding_matrix);
7581                 p_tcp->m_mct_decoding_matrix = 00;
7582         }
7583
7584         if (p_tcp->m_mcc_records) {
7585                 opj_free(p_tcp->m_mcc_records);
7586                 p_tcp->m_mcc_records = 00;
7587                 p_tcp->m_nb_max_mcc_records = 0;
7588                 p_tcp->m_nb_mcc_records = 0;
7589         }
7590
7591         if (p_tcp->m_mct_records) {
7592                 opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
7593                 OPJ_UINT32 i;
7594
7595                 for (i=0;i<p_tcp->m_nb_mct_records;++i) {
7596                         if (l_mct_data->m_data) {
7597                                 opj_free(l_mct_data->m_data);
7598                                 l_mct_data->m_data = 00;
7599                         }
7600
7601                         ++l_mct_data;
7602                 }
7603
7604                 opj_free(p_tcp->m_mct_records);
7605                 p_tcp->m_mct_records = 00;
7606         }
7607
7608         if (p_tcp->mct_norms != 00) {
7609                 opj_free(p_tcp->mct_norms);
7610                 p_tcp->mct_norms = 00;
7611         }
7612
7613         opj_j2k_tcp_data_destroy(p_tcp);
7614
7615 }
7616
7617 void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp)
7618 {
7619         if (p_tcp->m_data) {
7620                 opj_free(p_tcp->m_data);
7621                 p_tcp->m_data = NULL;
7622                 p_tcp->m_data_size = 0;
7623         }
7624 }
7625
7626 void opj_j2k_cp_destroy (opj_cp_t *p_cp)
7627 {
7628         OPJ_UINT32 l_nb_tiles;
7629         opj_tcp_t * l_current_tile = 00;
7630         OPJ_UINT32 i;
7631
7632         if (p_cp == 00)
7633         {
7634                 return;
7635         }
7636         if (p_cp->tcps != 00)
7637         {
7638                 l_current_tile = p_cp->tcps;
7639                 l_nb_tiles = p_cp->th * p_cp->tw;
7640
7641                 for (i = 0; i < l_nb_tiles; ++i)
7642                 {
7643                         opj_j2k_tcp_destroy(l_current_tile);
7644                         ++l_current_tile;
7645                 }
7646                 opj_free(p_cp->tcps);
7647                 p_cp->tcps = 00;
7648         }
7649         opj_free(p_cp->ppm_buffer);
7650         p_cp->ppm_buffer = 00;
7651         p_cp->ppm_data = NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
7652         opj_free(p_cp->comment);
7653         p_cp->comment = 00;
7654         if (! p_cp->m_is_decoder)
7655         {
7656                 opj_free(p_cp->m_specific_param.m_enc.m_matrice);
7657                 p_cp->m_specific_param.m_enc.m_matrice = 00;
7658         }
7659 }
7660
7661 OPJ_BOOL opj_j2k_read_tile_header(      opj_j2k_t * p_j2k,
7662                                                                     OPJ_UINT32 * p_tile_index,
7663                                                                     OPJ_UINT32 * p_data_size,
7664                                                                     OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
7665                                                                     OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
7666                                                                     OPJ_UINT32 * p_nb_comps,
7667                                                                     OPJ_BOOL * p_go_on,
7668                                                                     opj_stream_private_t *p_stream,
7669                                                                     opj_event_mgr_t * p_manager )
7670 {
7671         OPJ_UINT32 l_current_marker = J2K_MS_SOT;
7672         OPJ_UINT32 l_marker_size;
7673         const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
7674         opj_tcp_t * l_tcp = NULL;
7675         OPJ_UINT32 l_nb_tiles;
7676
7677         /* preconditions */
7678         assert(p_stream != 00);
7679         assert(p_j2k != 00);
7680         assert(p_manager != 00);
7681
7682         /* Reach the End Of Codestream ?*/
7683         if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC){
7684                 l_current_marker = J2K_MS_EOC;
7685         }
7686         /* We need to encounter a SOT marker (a new tile-part header) */
7687         else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT){
7688                 return OPJ_FALSE;
7689         }
7690
7691         /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
7692         while ( (!p_j2k->m_specific_param.m_decoder.m_can_decode) && (l_current_marker != J2K_MS_EOC) ) {
7693
7694                 /* Try to read until the Start Of Data is detected */
7695                 while (l_current_marker != J2K_MS_SOD) {
7696                     
7697                     if(opj_stream_get_number_byte_left(p_stream) == 0)
7698                     {
7699                         p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
7700                         break;
7701                     }
7702
7703                         /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
7704                         if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
7705                                 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7706                                 return OPJ_FALSE;
7707                         }
7708
7709                         /* Read 2 bytes from the buffer as the marker size */
7710                         opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
7711
7712                         /* Check marker size (does not include marker ID but includes marker size) */
7713                         if (l_marker_size < 2) {
7714                                 opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
7715                                 return OPJ_FALSE;
7716                         }
7717
7718                         /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
7719                         if (l_current_marker == 0x8080 && opj_stream_get_number_byte_left(p_stream) == 0) {
7720                                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
7721                                 break;
7722                         }
7723
7724                         /* Why this condition? FIXME */
7725                         if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH){
7726                                 p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
7727                         }
7728                         l_marker_size -= 2; /* Subtract the size of the marker ID already read */
7729
7730                         /* Get the marker handler from the marker ID */
7731                         l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
7732
7733                         /* Check if the marker is known and if it is the right place to find it */
7734                         if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {
7735                                 opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
7736                                 return OPJ_FALSE;
7737                         }
7738 /* FIXME manage case of unknown marker as in the main header ? */
7739
7740                         /* Check if the marker size is compatible with the header data size */
7741                         if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
7742                                 OPJ_BYTE *new_header_data = NULL;
7743                                 /* If we are here, this means we consider this marker as known & we will read it */
7744                                 /* Check enough bytes left in stream before allocation */
7745                                 if ((OPJ_OFF_T)l_marker_size >  opj_stream_get_number_byte_left(p_stream)) {
7746                                         opj_event_msg(p_manager, EVT_ERROR, "Marker size inconsistent with stream length\n");
7747                                         return OPJ_FALSE;
7748                                 }
7749                                 new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
7750                                 if (! new_header_data) {
7751                                         opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
7752                                         p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
7753                                         p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
7754                                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
7755                                         return OPJ_FALSE;
7756                                 }
7757                                 p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
7758                                 p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
7759                         }
7760
7761                         /* Try to read the rest of the marker segment from stream and copy them into the buffer */
7762                         if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {
7763                                 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7764                                 return OPJ_FALSE;
7765                         }
7766
7767                         if (!l_marker_handler->handler) {
7768                                 /* See issue #175 */
7769                                 opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
7770                                 return OPJ_FALSE;
7771                         }
7772                         /* Read the marker segment with the correct marker handler */
7773                         if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {
7774                                 opj_event_msg(p_manager, EVT_ERROR, "Fail to read the current marker segment (%#x)\n", l_current_marker);
7775                                 return OPJ_FALSE;
7776                         }
7777
7778                         /* Add the marker to the codestream index*/
7779                         if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
7780                                                 p_j2k->cstr_index,
7781                                                 l_marker_handler->id,
7782                                                 (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
7783                                                 l_marker_size + 4 )) {
7784                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
7785                                 return OPJ_FALSE;
7786                         }
7787
7788                         /* Keep the position of the last SOT marker read */
7789                         if ( l_marker_handler->id == J2K_MS_SOT ) {
7790                                 OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4 ;
7791                                 if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos)
7792                                 {
7793                                         p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
7794                                 }
7795                         }
7796
7797                         if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
7798                                 /* Skip the rest of the tile part header*/
7799                                 if (opj_stream_skip(p_stream,p_j2k->m_specific_param.m_decoder.m_sot_length,p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
7800                                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7801                                         return OPJ_FALSE;
7802                                 }
7803                                 l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
7804                         }
7805                         else {
7806                                 /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
7807                                 if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
7808                                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7809                                         return OPJ_FALSE;
7810                                 }
7811                                 /* Read 2 bytes from the buffer as the new marker ID */
7812                                 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
7813                         }
7814                 }
7815                 if(opj_stream_get_number_byte_left(p_stream) == 0
7816                     && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)
7817                     break;
7818
7819                 /* If we didn't skip data before, we need to read the SOD marker*/
7820                 if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
7821                         /* Try to read the SOD marker and skip data ? FIXME */
7822                         if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
7823                                 return OPJ_FALSE;
7824                         }
7825
7826                         if (! p_j2k->m_specific_param.m_decoder.m_can_decode){
7827                                 /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
7828                                 if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
7829                                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7830                                         return OPJ_FALSE;
7831                                 }
7832
7833                                 /* Read 2 bytes from buffer as the new marker ID */
7834                                 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
7835                         }
7836                 }
7837                 else {
7838                         /* Indicate we will try to read a new tile-part header*/
7839                         p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
7840                         p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
7841                         p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
7842
7843                         /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
7844                         if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
7845                                 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7846                                 return OPJ_FALSE;
7847                         }
7848
7849                         /* Read 2 bytes from buffer as the new marker ID */
7850                         opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
7851                 }
7852         }
7853
7854         /* Current marker is the EOC marker ?*/
7855         if (l_current_marker == J2K_MS_EOC) {
7856                 if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC ){
7857                         p_j2k->m_current_tile_number = 0;
7858                         p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
7859                 }
7860         }
7861
7862         /* FIXME DOC ???*/
7863         if ( ! p_j2k->m_specific_param.m_decoder.m_can_decode) {
7864                 l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
7865                 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
7866
7867                 while( (p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00) ) {
7868                         ++p_j2k->m_current_tile_number;
7869                         ++l_tcp;
7870                 }
7871
7872                 if (p_j2k->m_current_tile_number == l_nb_tiles) {
7873                         *p_go_on = OPJ_FALSE;
7874                         return OPJ_TRUE;
7875                 }
7876         }
7877
7878         /*FIXME ???*/
7879         if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) {
7880                 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
7881                 return OPJ_FALSE;
7882         }
7883
7884         opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
7885                         p_j2k->m_current_tile_number+1, (p_j2k->m_cp.th * p_j2k->m_cp.tw));
7886
7887         *p_tile_index = p_j2k->m_current_tile_number;
7888         *p_go_on = OPJ_TRUE;
7889         *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd);
7890         *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
7891         *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
7892         *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
7893         *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
7894         *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
7895
7896          p_j2k->m_specific_param.m_decoder.m_state |= 0x0080;/* FIXME J2K_DEC_STATE_DATA;*/
7897
7898         return OPJ_TRUE;
7899 }
7900
7901 OPJ_BOOL opj_j2k_decode_tile (  opj_j2k_t * p_j2k,
7902                                                         OPJ_UINT32 p_tile_index,
7903                                                         OPJ_BYTE * p_data,
7904                                                         OPJ_UINT32 p_data_size,
7905                                                         opj_stream_private_t *p_stream,
7906                                                         opj_event_mgr_t * p_manager )
7907 {
7908         OPJ_UINT32 l_current_marker;
7909         OPJ_BYTE l_data [2];
7910         opj_tcp_t * l_tcp;
7911
7912         /* preconditions */
7913         assert(p_stream != 00);
7914         assert(p_j2k != 00);
7915         assert(p_manager != 00);
7916
7917         if ( !(p_j2k->m_specific_param.m_decoder.m_state & 0x0080/*FIXME J2K_DEC_STATE_DATA*/)
7918                 || (p_tile_index != p_j2k->m_current_tile_number) ) {
7919                 return OPJ_FALSE;
7920         }
7921
7922         l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
7923         if (! l_tcp->m_data) {
7924                 opj_j2k_tcp_destroy(l_tcp);
7925                 return OPJ_FALSE;
7926         }
7927
7928         if (! opj_tcd_decode_tile(      p_j2k->m_tcd,
7929                                                                 l_tcp->m_data,
7930                                                                 l_tcp->m_data_size,
7931                                                                 p_tile_index,
7932                                                                 p_j2k->cstr_index) ) {
7933                 opj_j2k_tcp_destroy(l_tcp);
7934                 p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/*FIXME J2K_DEC_STATE_ERR;*/
7935                 opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
7936                 return OPJ_FALSE;
7937         }
7938
7939         if (! opj_tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size)) {
7940                 return OPJ_FALSE;
7941         }
7942
7943         /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
7944          * we destroy just the data which will be re-read in read_tile_header*/
7945         /*opj_j2k_tcp_destroy(l_tcp);
7946         p_j2k->m_tcd->tcp = 0;*/
7947         opj_j2k_tcp_data_destroy(l_tcp);
7948
7949         p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
7950         p_j2k->m_specific_param.m_decoder.m_state &= (~ (0x0080u));/* FIXME J2K_DEC_STATE_DATA);*/
7951
7952         if(opj_stream_get_number_byte_left(p_stream) == 0 
7953             && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC){
7954             return OPJ_TRUE;
7955         }
7956
7957         if (p_j2k->m_specific_param.m_decoder.m_state != 0x0100){ /*FIXME J2K_DEC_STATE_EOC)*/
7958                 if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
7959                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
7960                         return OPJ_FALSE;
7961                 }
7962
7963                 opj_read_bytes(l_data,&l_current_marker,2);
7964
7965                 if (l_current_marker == J2K_MS_EOC) {
7966                         p_j2k->m_current_tile_number = 0;
7967                         p_j2k->m_specific_param.m_decoder.m_state =  0x0100;/*FIXME J2K_DEC_STATE_EOC;*/
7968                 }
7969                 else if (l_current_marker != J2K_MS_SOT)
7970                 {       
7971                         if(opj_stream_get_number_byte_left(p_stream) == 0) {
7972                             p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
7973                             opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n");
7974                             return OPJ_TRUE;
7975                         }
7976                         opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
7977                         return OPJ_FALSE;
7978                 }
7979         }
7980
7981         return OPJ_TRUE;
7982 }
7983
7984 OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image)
7985 {
7986         OPJ_UINT32 i,j,k = 0;
7987         OPJ_UINT32 l_width_src,l_height_src;
7988         OPJ_UINT32 l_width_dest,l_height_dest;
7989         OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
7990         OPJ_INT32 l_start_offset_src, l_line_offset_src, l_end_offset_src ;
7991         OPJ_UINT32 l_start_x_dest , l_start_y_dest;
7992         OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
7993         OPJ_INT32 l_start_offset_dest, l_line_offset_dest;
7994
7995         opj_image_comp_t * l_img_comp_src = 00;
7996         opj_image_comp_t * l_img_comp_dest = 00;
7997
7998         opj_tcd_tilecomp_t * l_tilec = 00;
7999         opj_image_t * l_image_src = 00;
8000         OPJ_UINT32 l_size_comp, l_remaining;
8001         OPJ_INT32 * l_dest_ptr;
8002         opj_tcd_resolution_t* l_res= 00;
8003
8004         l_tilec = p_tcd->tcd_image->tiles->comps;
8005         l_image_src = p_tcd->image;
8006         l_img_comp_src = l_image_src->comps;
8007
8008         l_img_comp_dest = p_output_image->comps;
8009
8010         for (i=0; i<l_image_src->numcomps; i++) {
8011
8012                 /* Allocate output component buffer if necessary */
8013                 if (!l_img_comp_dest->data) {
8014
8015                         l_img_comp_dest->data = (OPJ_INT32*) opj_calloc(l_img_comp_dest->w * l_img_comp_dest->h, sizeof(OPJ_INT32));
8016                         if (! l_img_comp_dest->data) {
8017                                 return OPJ_FALSE;
8018                         }
8019                 }
8020
8021                 /* Copy info from decoded comp image to output image */
8022                 l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
8023
8024                 /*-----*/
8025                 /* Compute the precision of the output buffer */
8026                 l_size_comp = l_img_comp_src->prec >> 3; /*(/ 8)*/
8027                 l_remaining = l_img_comp_src->prec & 7;  /* (%8) */
8028                 l_res = l_tilec->resolutions + l_img_comp_src->resno_decoded;
8029
8030                 if (l_remaining) {
8031                         ++l_size_comp;
8032                 }
8033
8034                 if (l_size_comp == 3) {
8035                         l_size_comp = 4;
8036                 }
8037                 /*-----*/
8038
8039                 /* Current tile component size*/
8040                 /*if (i == 0) {
8041                 fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
8042                                 l_res->x0, l_res->x1, l_res->y0, l_res->y1);
8043                 }*/
8044
8045                 l_width_src = (OPJ_UINT32)(l_res->x1 - l_res->x0);
8046                 l_height_src = (OPJ_UINT32)(l_res->y1 - l_res->y0);
8047
8048                 /* Border of the current output component*/
8049                 l_x0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->x0, (OPJ_INT32)l_img_comp_dest->factor);
8050                 l_y0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->y0, (OPJ_INT32)l_img_comp_dest->factor);
8051                 l_x1_dest = l_x0_dest + l_img_comp_dest->w;
8052                 l_y1_dest = l_y0_dest + l_img_comp_dest->h;
8053
8054                 /*if (i == 0) {
8055                 fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
8056                                 l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
8057                 }*/
8058
8059                 /*-----*/
8060                 /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
8061                  * of the input buffer (decoded tile component) which will be move
8062                  * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
8063                  * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified
8064                  * by this input area.
8065                  * */
8066                 assert( l_res->x0 >= 0);
8067                 assert( l_res->x1 >= 0);
8068                 if ( l_x0_dest < (OPJ_UINT32)l_res->x0 ) {
8069                         l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest;
8070                         l_offset_x0_src = 0;
8071
8072                         if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {
8073                                 l_width_dest = l_width_src;
8074                                 l_offset_x1_src = 0;
8075                         }
8076                         else {
8077                                 l_width_dest = l_x1_dest - (OPJ_UINT32)l_res->x0 ;
8078                                 l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
8079                         }
8080                 }
8081                 else {
8082                         l_start_x_dest = 0 ;
8083                         l_offset_x0_src = (OPJ_INT32)l_x0_dest - l_res->x0;
8084
8085                         if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {
8086                                 l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
8087                                 l_offset_x1_src = 0;
8088                         }
8089                         else {
8090                                 l_width_dest = l_img_comp_dest->w ;
8091                                 l_offset_x1_src = l_res->x1 - (OPJ_INT32)l_x1_dest;
8092                         }
8093                 }
8094
8095                 if ( l_y0_dest < (OPJ_UINT32)l_res->y0 ) {
8096                         l_start_y_dest = (OPJ_UINT32)l_res->y0 - l_y0_dest;
8097                         l_offset_y0_src = 0;
8098
8099                         if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {
8100                                 l_height_dest = l_height_src;
8101                                 l_offset_y1_src = 0;
8102                         }
8103                         else {
8104                                 l_height_dest = l_y1_dest - (OPJ_UINT32)l_res->y0 ;
8105                                 l_offset_y1_src =  (OPJ_INT32)(l_height_src - l_height_dest);
8106                         }
8107                 }
8108                 else {
8109                         l_start_y_dest = 0 ;
8110                         l_offset_y0_src = (OPJ_INT32)l_y0_dest - l_res->y0;
8111
8112                         if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {
8113                                 l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
8114                                 l_offset_y1_src = 0;
8115                         }
8116                         else {
8117                                 l_height_dest = l_img_comp_dest->h ;
8118                                 l_offset_y1_src = l_res->y1 - (OPJ_INT32)l_y1_dest;
8119                         }
8120                 }
8121
8122                 if( (l_offset_x0_src < 0 ) || (l_offset_y0_src < 0 ) || (l_offset_x1_src < 0 ) || (l_offset_y1_src < 0 ) ){
8123                         return OPJ_FALSE;
8124                 }
8125                 /* testcase 2977.pdf.asan.67.2198 */
8126                 if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
8127                         return OPJ_FALSE;
8128                 }
8129                 /*-----*/
8130
8131                 /* Compute the input buffer offset */
8132                 l_start_offset_src = l_offset_x0_src + l_offset_y0_src * (OPJ_INT32)l_width_src;
8133                 l_line_offset_src = l_offset_x1_src + l_offset_x0_src;
8134                 l_end_offset_src = l_offset_y1_src * (OPJ_INT32)l_width_src - l_offset_x0_src;
8135
8136                 /* Compute the output buffer offset */
8137                 l_start_offset_dest = (OPJ_INT32)(l_start_x_dest + l_start_y_dest * l_img_comp_dest->w);
8138                 l_line_offset_dest = (OPJ_INT32)(l_img_comp_dest->w - l_width_dest);
8139
8140                 /* Move the output buffer to the first place where we will write*/
8141                 l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
8142
8143                 /*if (i == 0) {
8144                         fprintf(stdout, "COMPO[%d]:\n",i);
8145                         fprintf(stdout, "SRC: l_start_x_src=%d, l_start_y_src=%d, l_width_src=%d, l_height_src=%d\n"
8146                                         "\t tile offset:%d, %d, %d, %d\n"
8147                                         "\t buffer offset: %d; %d, %d\n",
8148                                         l_res->x0, l_res->y0, l_width_src, l_height_src,
8149                                         l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src,
8150                                         l_start_offset_src, l_line_offset_src, l_end_offset_src);
8151
8152                         fprintf(stdout, "DEST: l_start_x_dest=%d, l_start_y_dest=%d, l_width_dest=%d, l_height_dest=%d\n"
8153                                         "\t start offset: %d, line offset= %d\n",
8154                                         l_start_x_dest, l_start_y_dest, l_width_dest, l_height_dest, l_start_offset_dest, l_line_offset_dest);
8155                 }*/
8156
8157                 switch (l_size_comp) {
8158                         case 1:
8159                                 {
8160                                         OPJ_CHAR * l_src_ptr = (OPJ_CHAR*) p_data;
8161                                         l_src_ptr += l_start_offset_src; /* Move to the first place where we will read*/
8162
8163                                         if (l_img_comp_src->sgnd) {
8164                                                 for (j = 0 ; j < l_height_dest ; ++j) {
8165                                                         for ( k = 0 ; k < l_width_dest ; ++k) {
8166                                                                 *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++)); /* Copy only the data needed for the output image */
8167                                                         }
8168
8169                                                         l_dest_ptr+= l_line_offset_dest; /* Move to the next place where we will write */
8170                                                         l_src_ptr += l_line_offset_src ; /* Move to the next place where we will read */
8171                                                 }
8172                                         }
8173                                         else {
8174                                                 for ( j = 0 ; j < l_height_dest ; ++j ) {
8175                                                         for ( k = 0 ; k < l_width_dest ; ++k) {
8176                                                                 *(l_dest_ptr++) = (OPJ_INT32) ((*(l_src_ptr++))&0xff);
8177                                                         }
8178
8179                                                         l_dest_ptr+= l_line_offset_dest;
8180                                                         l_src_ptr += l_line_offset_src;
8181                                                 }
8182                                         }
8183
8184                                         l_src_ptr += l_end_offset_src; /* Move to the end of this component-part of the input buffer */
8185                                         p_data = (OPJ_BYTE*) l_src_ptr; /* Keep the current position for the next component-part */
8186                                 }
8187                                 break;
8188                         case 2:
8189                                 {
8190                                         OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_data;
8191                                         l_src_ptr += l_start_offset_src;
8192
8193                                         if (l_img_comp_src->sgnd) {
8194                                                 for (j=0;j<l_height_dest;++j) {
8195                                                         for (k=0;k<l_width_dest;++k) {
8196                                                                 *(l_dest_ptr++) = *(l_src_ptr++);
8197                                                         }
8198
8199                                                         l_dest_ptr+= l_line_offset_dest;
8200                                                         l_src_ptr += l_line_offset_src ;
8201                                                 }
8202                                         }
8203                                         else {
8204                                                 for (j=0;j<l_height_dest;++j) {
8205                                                         for (k=0;k<l_width_dest;++k) {
8206                                                                 *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
8207                                                         }
8208
8209                                                         l_dest_ptr+= l_line_offset_dest;
8210                                                         l_src_ptr += l_line_offset_src ;
8211                                                 }
8212                                         }
8213
8214                                         l_src_ptr += l_end_offset_src;
8215                                         p_data = (OPJ_BYTE*) l_src_ptr;
8216                                 }
8217                                 break;
8218                         case 4:
8219                                 {
8220                                         OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_data;
8221                                         l_src_ptr += l_start_offset_src;
8222
8223                                         for (j=0;j<l_height_dest;++j) {
8224                                                 for (k=0;k<l_width_dest;++k) {
8225                                                         *(l_dest_ptr++) = (*(l_src_ptr++));
8226                                                 }
8227
8228                                                 l_dest_ptr+= l_line_offset_dest;
8229                                                 l_src_ptr += l_line_offset_src ;
8230                                         }
8231
8232                                         l_src_ptr += l_end_offset_src;
8233                                         p_data = (OPJ_BYTE*) l_src_ptr;
8234                                 }
8235                                 break;
8236                 }
8237
8238                 ++l_img_comp_dest;
8239                 ++l_img_comp_src;
8240                 ++l_tilec;
8241         }
8242
8243         return OPJ_TRUE;
8244 }
8245
8246 OPJ_BOOL opj_j2k_set_decode_area(       opj_j2k_t *p_j2k,
8247                                                                     opj_image_t* p_image,
8248                                                                     OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
8249                                                                     OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
8250                                                                     opj_event_mgr_t * p_manager )
8251 {
8252         opj_cp_t * l_cp = &(p_j2k->m_cp);
8253         opj_image_t * l_image = p_j2k->m_private_image;
8254
8255         OPJ_UINT32 it_comp;
8256         OPJ_INT32 l_comp_x1, l_comp_y1;
8257         opj_image_comp_t* l_img_comp = NULL;
8258
8259         /* Check if we are read the main header */
8260         if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) { /* FIXME J2K_DEC_STATE_TPHSOT)*/
8261                 opj_event_msg(p_manager, EVT_ERROR, "Need to decode the main header before begin to decode the remaining codestream");
8262                 return OPJ_FALSE;
8263         }
8264
8265         if ( !p_start_x && !p_start_y && !p_end_x && !p_end_y){
8266                 opj_event_msg(p_manager, EVT_INFO, "No decoded area parameters, set the decoded area to the whole image\n");
8267
8268                 p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
8269                 p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
8270                 p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
8271                 p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
8272
8273                 return OPJ_TRUE;
8274         }
8275
8276         /* ----- */
8277         /* Check if the positions provided by the user are correct */
8278
8279         /* Left */
8280         assert(p_start_x >= 0 );
8281         assert(p_start_y >= 0 );
8282
8283         if ((OPJ_UINT32)p_start_x > l_image->x1 ) {
8284                 opj_event_msg(p_manager, EVT_ERROR,
8285                         "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
8286                         p_start_x, l_image->x1);
8287                 return OPJ_FALSE;
8288         }
8289         else if ((OPJ_UINT32)p_start_x < l_image->x0){
8290                 opj_event_msg(p_manager, EVT_WARNING,
8291                                 "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
8292                                 p_start_x, l_image->x0);
8293                 p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
8294                 p_image->x0 = l_image->x0;
8295         }
8296         else {
8297                 p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x - l_cp->tx0) / l_cp->tdx;
8298                 p_image->x0 = (OPJ_UINT32)p_start_x;
8299         }
8300
8301         /* Up */
8302         if ((OPJ_UINT32)p_start_y > l_image->y1){
8303                 opj_event_msg(p_manager, EVT_ERROR,
8304                                 "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
8305                                 p_start_y, l_image->y1);
8306                 return OPJ_FALSE;
8307         }
8308         else if ((OPJ_UINT32)p_start_y < l_image->y0){
8309                 opj_event_msg(p_manager, EVT_WARNING,
8310                                 "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
8311                                 p_start_y, l_image->y0);
8312                 p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
8313                 p_image->y0 = l_image->y0;
8314         }
8315         else {
8316                 p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y - l_cp->ty0) / l_cp->tdy;
8317                 p_image->y0 = (OPJ_UINT32)p_start_y;
8318         }
8319
8320         /* Right */
8321         assert((OPJ_UINT32)p_end_x > 0);
8322         assert((OPJ_UINT32)p_end_y > 0);
8323         if ((OPJ_UINT32)p_end_x < l_image->x0) {
8324                 opj_event_msg(p_manager, EVT_ERROR,
8325                         "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
8326                         p_end_x, l_image->x0);
8327                 return OPJ_FALSE;
8328         }
8329         else if ((OPJ_UINT32)p_end_x > l_image->x1) {
8330                 opj_event_msg(p_manager, EVT_WARNING,
8331                         "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
8332                         p_end_x, l_image->x1);
8333                 p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
8334                 p_image->x1 = l_image->x1;
8335         }
8336         else {
8337                 p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv(p_end_x - (OPJ_INT32)l_cp->tx0, (OPJ_INT32)l_cp->tdx);
8338                 p_image->x1 = (OPJ_UINT32)p_end_x;
8339         }
8340
8341         /* Bottom */
8342         if ((OPJ_UINT32)p_end_y < l_image->y0) {
8343                 opj_event_msg(p_manager, EVT_ERROR,
8344                         "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
8345                         p_end_y, l_image->y0);
8346                 return OPJ_FALSE;
8347         }
8348         if ((OPJ_UINT32)p_end_y > l_image->y1){
8349                 opj_event_msg(p_manager, EVT_WARNING,
8350                         "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
8351                         p_end_y, l_image->y1);
8352                 p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
8353                 p_image->y1 = l_image->y1;
8354         }
8355         else{
8356                 p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv(p_end_y - (OPJ_INT32)l_cp->ty0, (OPJ_INT32)l_cp->tdy);
8357                 p_image->y1 = (OPJ_UINT32)p_end_y;
8358         }
8359         /* ----- */
8360
8361         p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
8362
8363         l_img_comp = p_image->comps;
8364         for (it_comp=0; it_comp < p_image->numcomps; ++it_comp)
8365         {
8366                 OPJ_INT32 l_h,l_w;
8367
8368                 l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);
8369                 l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);
8370                 l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
8371                 l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
8372
8373                 l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
8374                                 - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
8375                 if (l_w < 0){
8376                         opj_event_msg(p_manager, EVT_ERROR,
8377                                 "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
8378                                 it_comp, l_w);
8379                         return OPJ_FALSE;
8380                 }
8381                 l_img_comp->w = (OPJ_UINT32)l_w;
8382
8383                 l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
8384                                 - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
8385                 if (l_h < 0){
8386                         opj_event_msg(p_manager, EVT_ERROR,
8387                                 "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
8388                                 it_comp, l_h);
8389                         return OPJ_FALSE;
8390                 }
8391                 l_img_comp->h = (OPJ_UINT32)l_h;
8392
8393                 l_img_comp++;
8394         }
8395
8396         opj_event_msg( p_manager, EVT_INFO,"Setting decoding area to %d,%d,%d,%d\n",
8397                         p_image->x0, p_image->y0, p_image->x1, p_image->y1);
8398
8399         return OPJ_TRUE;
8400 }
8401
8402 opj_j2k_t* opj_j2k_create_decompress(void)
8403 {
8404         opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1,sizeof(opj_j2k_t));
8405         if (!l_j2k) {
8406                 return 00;
8407         }
8408
8409         l_j2k->m_is_decoder = 1;
8410         l_j2k->m_cp.m_is_decoder = 1;
8411
8412         l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,sizeof(opj_tcp_t));
8413         if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
8414                 opj_j2k_destroy(l_j2k);
8415                 return 00;
8416         }
8417
8418         l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,OPJ_J2K_DEFAULT_HEADER_SIZE);
8419         if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
8420                 opj_j2k_destroy(l_j2k);
8421                 return 00;
8422         }
8423
8424         l_j2k->m_specific_param.m_decoder.m_header_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;
8425
8426         l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
8427
8428         l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
8429
8430         /* codestream index creation */
8431         l_j2k->cstr_index = opj_j2k_create_cstr_index();
8432         if (!l_j2k->cstr_index){
8433                 opj_j2k_destroy(l_j2k);
8434                 return 00;
8435         }
8436
8437         /* validation list creation */
8438         l_j2k->m_validation_list = opj_procedure_list_create();
8439         if (! l_j2k->m_validation_list) {
8440                 opj_j2k_destroy(l_j2k);
8441                 return 00;
8442         }
8443
8444         /* execution list creation */
8445         l_j2k->m_procedure_list = opj_procedure_list_create();
8446         if (! l_j2k->m_procedure_list) {
8447                 opj_j2k_destroy(l_j2k);
8448                 return 00;
8449         }
8450
8451         return l_j2k;
8452 }
8453
8454 opj_codestream_index_t* opj_j2k_create_cstr_index(void)
8455 {
8456         opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
8457                         opj_calloc(1,sizeof(opj_codestream_index_t));
8458         if (!cstr_index)
8459                 return NULL;
8460
8461         cstr_index->maxmarknum = 100;
8462         cstr_index->marknum = 0;
8463         cstr_index->marker = (opj_marker_info_t*)
8464                         opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
8465         if (!cstr_index-> marker)
8466                 return NULL;
8467
8468         cstr_index->tile_index = NULL;
8469
8470         return cstr_index;
8471 }
8472
8473 OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (       opj_j2k_t *p_j2k,
8474                                                                                 OPJ_UINT32 p_tile_no,
8475                                                                                 OPJ_UINT32 p_comp_no )
8476 {
8477         opj_cp_t *l_cp = 00;
8478         opj_tcp_t *l_tcp = 00;
8479         opj_tccp_t *l_tccp = 00;
8480
8481         /* preconditions */
8482         assert(p_j2k != 00);
8483
8484         l_cp = &(p_j2k->m_cp);
8485         l_tcp = &l_cp->tcps[p_tile_no];
8486         l_tccp = &l_tcp->tccps[p_comp_no];
8487
8488         /* preconditions again */
8489         assert(p_tile_no < (l_cp->tw * l_cp->th));
8490         assert(p_comp_no < p_j2k->m_private_image->numcomps);
8491
8492         if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
8493                 return 5 + l_tccp->numresolutions;
8494         }
8495         else {
8496                 return 5;
8497         }
8498 }
8499
8500 OPJ_BOOL opj_j2k_write_SPCod_SPCoc(     opj_j2k_t *p_j2k,
8501                                                                     OPJ_UINT32 p_tile_no,
8502                                                                     OPJ_UINT32 p_comp_no,
8503                                                                     OPJ_BYTE * p_data,
8504                                                                     OPJ_UINT32 * p_header_size,
8505                                                                     struct opj_event_mgr * p_manager )
8506 {
8507         OPJ_UINT32 i;
8508         opj_cp_t *l_cp = 00;
8509         opj_tcp_t *l_tcp = 00;
8510         opj_tccp_t *l_tccp = 00;
8511
8512         /* preconditions */
8513         assert(p_j2k != 00);
8514         assert(p_header_size != 00);
8515         assert(p_manager != 00);
8516         assert(p_data != 00);
8517
8518         l_cp = &(p_j2k->m_cp);
8519         l_tcp = &l_cp->tcps[p_tile_no];
8520         l_tccp = &l_tcp->tccps[p_comp_no];
8521
8522         /* preconditions again */
8523         assert(p_tile_no < (l_cp->tw * l_cp->th));
8524         assert(p_comp_no <(p_j2k->m_private_image->numcomps));
8525
8526         if (*p_header_size < 5) {
8527                 opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
8528                 return OPJ_FALSE;
8529         }
8530
8531         opj_write_bytes(p_data,l_tccp->numresolutions - 1, 1);  /* SPcoc (D) */
8532         ++p_data;
8533
8534         opj_write_bytes(p_data,l_tccp->cblkw - 2, 1);                   /* SPcoc (E) */
8535         ++p_data;
8536
8537         opj_write_bytes(p_data,l_tccp->cblkh - 2, 1);                   /* SPcoc (F) */
8538         ++p_data;
8539
8540         opj_write_bytes(p_data,l_tccp->cblksty, 1);                             /* SPcoc (G) */
8541         ++p_data;
8542
8543         opj_write_bytes(p_data,l_tccp->qmfbid, 1);                              /* SPcoc (H) */
8544         ++p_data;
8545
8546         *p_header_size = *p_header_size - 5;
8547
8548         if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
8549
8550                 if (*p_header_size < l_tccp->numresolutions) {
8551                         opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
8552                         return OPJ_FALSE;
8553                 }
8554
8555                 for (i = 0; i < l_tccp->numresolutions; ++i) {
8556                         opj_write_bytes(p_data,l_tccp->prcw[i] + (l_tccp->prch[i] << 4), 1);    /* SPcoc (I_i) */
8557                         ++p_data;
8558                 }
8559
8560                 *p_header_size = *p_header_size - l_tccp->numresolutions;
8561         }
8562
8563         return OPJ_TRUE;
8564 }
8565
8566 OPJ_BOOL opj_j2k_read_SPCod_SPCoc(  opj_j2k_t *p_j2k,
8567                                                                 OPJ_UINT32 compno,
8568                                                                 OPJ_BYTE * p_header_data,
8569                                                                 OPJ_UINT32 * p_header_size,
8570                                                                 opj_event_mgr_t * p_manager)
8571 {
8572         OPJ_UINT32 i, l_tmp;
8573         opj_cp_t *l_cp = NULL;
8574         opj_tcp_t *l_tcp = NULL;
8575         opj_tccp_t *l_tccp = NULL;
8576         OPJ_BYTE * l_current_ptr = NULL;
8577
8578         /* preconditions */
8579         assert(p_j2k != 00);
8580         assert(p_manager != 00);
8581         assert(p_header_data != 00);
8582
8583         l_cp = &(p_j2k->m_cp);
8584         l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
8585                                 &l_cp->tcps[p_j2k->m_current_tile_number] :
8586                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
8587
8588         /* precondition again */
8589         assert(compno < p_j2k->m_private_image->numcomps);
8590
8591         l_tccp = &l_tcp->tccps[compno];
8592         l_current_ptr = p_header_data;
8593
8594         /* make sure room is sufficient */
8595         if (*p_header_size < 5) {
8596                 opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
8597                 return OPJ_FALSE;
8598         }
8599
8600         opj_read_bytes(l_current_ptr, &l_tccp->numresolutions ,1);              /* SPcox (D) */
8601         ++l_tccp->numresolutions;                                                                               /* tccp->numresolutions = read() + 1 */
8602         if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
8603                 opj_event_msg(p_manager, EVT_ERROR,
8604                               "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
8605                               l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
8606                 return OPJ_FALSE;
8607         }
8608         ++l_current_ptr;
8609
8610         /* If user wants to remove more resolutions than the codestream contains, return error */
8611         if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
8612                 opj_event_msg(p_manager, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
8613                                         "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno);
8614                 p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
8615                 return OPJ_FALSE;
8616         }
8617
8618         opj_read_bytes(l_current_ptr,&l_tccp->cblkw ,1);                /* SPcoc (E) */
8619         ++l_current_ptr;
8620         l_tccp->cblkw += 2;
8621
8622         opj_read_bytes(l_current_ptr,&l_tccp->cblkh ,1);                /* SPcoc (F) */
8623         ++l_current_ptr;
8624         l_tccp->cblkh += 2;
8625
8626         opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1);              /* SPcoc (G) */
8627         ++l_current_ptr;
8628
8629         opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1);               /* SPcoc (H) */
8630         ++l_current_ptr;
8631
8632         *p_header_size = *p_header_size - 5;
8633
8634         /* use custom precinct size ? */
8635         if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
8636                 if (*p_header_size < l_tccp->numresolutions) {
8637                         opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
8638                         return OPJ_FALSE;
8639                 }
8640
8641                 for     (i = 0; i < l_tccp->numresolutions; ++i) {
8642                         opj_read_bytes(l_current_ptr,&l_tmp ,1);                /* SPcoc (I_i) */
8643                         ++l_current_ptr;
8644                         /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */
8645                         if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) {
8646                                 opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n");
8647                                 return OPJ_FALSE;
8648                         }
8649                         l_tccp->prcw[i] = l_tmp & 0xf;
8650                         l_tccp->prch[i] = l_tmp >> 4;
8651                 }
8652
8653                 *p_header_size = *p_header_size - l_tccp->numresolutions;
8654         }
8655         else {
8656                 /* set default size for the precinct width and height */
8657                 for     (i = 0; i < l_tccp->numresolutions; ++i) {
8658                         l_tccp->prcw[i] = 15;
8659                         l_tccp->prch[i] = 15;
8660                 }
8661         }
8662
8663 #ifdef WIP_REMOVE_MSD
8664         /* INDEX >> */
8665         if (p_j2k->cstr_info && compno == 0) {
8666                 OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
8667
8668                 p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh = l_tccp->cblkh;
8669                 p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw = l_tccp->cblkw;
8670                 p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions = l_tccp->numresolutions;
8671                 p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty = l_tccp->cblksty;
8672                 p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid = l_tccp->qmfbid;
8673
8674                 memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx,l_tccp->prcw, l_data_size);
8675                 memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy,l_tccp->prch, l_data_size);
8676         }
8677         /* << INDEX */
8678 #endif
8679
8680         return OPJ_TRUE;
8681 }
8682
8683 void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k )
8684 {
8685         /* loop */
8686         OPJ_UINT32 i;
8687         opj_cp_t *l_cp = NULL;
8688         opj_tcp_t *l_tcp = NULL;
8689         opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
8690         OPJ_UINT32 l_prc_size;
8691
8692         /* preconditions */
8693         assert(p_j2k != 00);
8694
8695         l_cp = &(p_j2k->m_cp);
8696         l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /* FIXME J2K_DEC_STATE_TPH*/
8697                                 &l_cp->tcps[p_j2k->m_current_tile_number] :
8698                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
8699
8700         l_ref_tccp = &l_tcp->tccps[0];
8701         l_copied_tccp = l_ref_tccp + 1;
8702         l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
8703
8704         for     (i=1; i<p_j2k->m_private_image->numcomps; ++i) {
8705                 l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
8706                 l_copied_tccp->cblkw = l_ref_tccp->cblkw;
8707                 l_copied_tccp->cblkh = l_ref_tccp->cblkh;
8708                 l_copied_tccp->cblksty = l_ref_tccp->cblksty;
8709                 l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
8710                 memcpy(l_copied_tccp->prcw,l_ref_tccp->prcw,l_prc_size);
8711                 memcpy(l_copied_tccp->prch,l_ref_tccp->prch,l_prc_size);
8712                 ++l_copied_tccp;
8713         }
8714 }
8715
8716 OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k,
8717                                                                         OPJ_UINT32 p_tile_no,
8718                                                                         OPJ_UINT32 p_comp_no )
8719 {
8720         OPJ_UINT32 l_num_bands;
8721
8722         opj_cp_t *l_cp = 00;
8723         opj_tcp_t *l_tcp = 00;
8724         opj_tccp_t *l_tccp = 00;
8725
8726         /* preconditions */
8727         assert(p_j2k != 00);
8728
8729         l_cp = &(p_j2k->m_cp);
8730         l_tcp = &l_cp->tcps[p_tile_no];
8731         l_tccp = &l_tcp->tccps[p_comp_no];
8732
8733         /* preconditions again */
8734         assert(p_tile_no < l_cp->tw * l_cp->th);
8735         assert(p_comp_no < p_j2k->m_private_image->numcomps);
8736
8737         l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
8738
8739         if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
8740                 return 1 + l_num_bands;
8741         }
8742         else {
8743                 return 1 + 2*l_num_bands;
8744         }
8745 }
8746
8747 OPJ_BOOL opj_j2k_write_SQcd_SQcc(       opj_j2k_t *p_j2k,
8748                                                                 OPJ_UINT32 p_tile_no,
8749                                                                 OPJ_UINT32 p_comp_no,
8750                                                                 OPJ_BYTE * p_data,
8751                                                                 OPJ_UINT32 * p_header_size,
8752                                                                 struct opj_event_mgr * p_manager )
8753 {
8754         OPJ_UINT32 l_header_size;
8755         OPJ_UINT32 l_band_no, l_num_bands;
8756         OPJ_UINT32 l_expn,l_mant;
8757
8758         opj_cp_t *l_cp = 00;
8759         opj_tcp_t *l_tcp = 00;
8760         opj_tccp_t *l_tccp = 00;
8761
8762         /* preconditions */
8763         assert(p_j2k != 00);
8764         assert(p_header_size != 00);
8765         assert(p_manager != 00);
8766         assert(p_data != 00);
8767
8768         l_cp = &(p_j2k->m_cp);
8769         l_tcp = &l_cp->tcps[p_tile_no];
8770         l_tccp = &l_tcp->tccps[p_comp_no];
8771
8772         /* preconditions again */
8773         assert(p_tile_no < l_cp->tw * l_cp->th);
8774         assert(p_comp_no <p_j2k->m_private_image->numcomps);
8775
8776         l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
8777
8778         if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
8779                 l_header_size = 1 + l_num_bands;
8780
8781                 if (*p_header_size < l_header_size) {
8782                         opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
8783                         return OPJ_FALSE;
8784                 }
8785
8786                 opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1);    /* Sqcx */
8787                 ++p_data;
8788
8789                 for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
8790                         l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
8791                         opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */
8792                         ++p_data;
8793                 }
8794         }
8795         else {
8796                 l_header_size = 1 + 2*l_num_bands;
8797
8798                 if (*p_header_size < l_header_size) {
8799                         opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
8800                         return OPJ_FALSE;
8801                 }
8802
8803                 opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1);    /* Sqcx */
8804                 ++p_data;
8805
8806                 for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
8807                         l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
8808                         l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
8809
8810                         opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */
8811                         p_data += 2;
8812                 }
8813         }
8814
8815         *p_header_size = *p_header_size - l_header_size;
8816
8817         return OPJ_TRUE;
8818 }
8819
8820 OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
8821                                                             OPJ_UINT32 p_comp_no,
8822                                                             OPJ_BYTE* p_header_data,
8823                                                             OPJ_UINT32 * p_header_size,
8824                                                             opj_event_mgr_t * p_manager
8825                                                             )
8826 {
8827         /* loop*/
8828         OPJ_UINT32 l_band_no;
8829         opj_cp_t *l_cp = 00;
8830         opj_tcp_t *l_tcp = 00;
8831         opj_tccp_t *l_tccp = 00;
8832         OPJ_BYTE * l_current_ptr = 00;
8833         OPJ_UINT32 l_tmp, l_num_band;
8834
8835         /* preconditions*/
8836         assert(p_j2k != 00);
8837         assert(p_manager != 00);
8838         assert(p_header_data != 00);
8839
8840         l_cp = &(p_j2k->m_cp);
8841         /* come from tile part header or main header ?*/
8842         l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /*FIXME J2K_DEC_STATE_TPH*/
8843                                 &l_cp->tcps[p_j2k->m_current_tile_number] :
8844                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
8845
8846         /* precondition again*/
8847         assert(p_comp_no <  p_j2k->m_private_image->numcomps);
8848
8849         l_tccp = &l_tcp->tccps[p_comp_no];
8850         l_current_ptr = p_header_data;
8851
8852         if (*p_header_size < 1) {
8853                 opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
8854                 return OPJ_FALSE;
8855         }
8856         *p_header_size -= 1;
8857
8858         opj_read_bytes(l_current_ptr, &l_tmp ,1);                       /* Sqcx */
8859         ++l_current_ptr;
8860
8861         l_tccp->qntsty = l_tmp & 0x1f;
8862         l_tccp->numgbits = l_tmp >> 5;
8863         if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
8864         l_num_band = 1;
8865         }
8866         else {
8867                 l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
8868                         (*p_header_size) :
8869                         (*p_header_size) / 2;
8870
8871                 if( l_num_band > OPJ_J2K_MAXBANDS ) {
8872                         opj_event_msg(p_manager, EVT_WARNING, "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
8873                                 "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
8874                                 "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS, OPJ_J2K_MAXBANDS);
8875                         /*return OPJ_FALSE;*/
8876                 }
8877         }
8878
8879 #ifdef USE_JPWL
8880         if (l_cp->correct) {
8881
8882                 /* if JPWL is on, we check whether there are too many subbands */
8883                 if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
8884                         opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
8885                                 "JPWL: bad number of subbands in Sqcx (%d)\n",
8886                                 l_num_band);
8887                         if (!JPWL_ASSUME) {
8888                                 opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
8889                                 return OPJ_FALSE;
8890                         }
8891                         /* we try to correct */
8892                         l_num_band = 1;
8893                         opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
8894                                 "- setting number of bands to %d => HYPOTHESIS!!!\n",
8895                                 l_num_band);
8896                 };
8897
8898         };
8899 #endif /* USE_JPWL */
8900
8901         if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
8902                 for     (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
8903                         opj_read_bytes(l_current_ptr, &l_tmp ,1);                       /* SPqcx_i */
8904                         ++l_current_ptr;
8905                         if (l_band_no < OPJ_J2K_MAXBANDS){
8906                                 l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
8907                                 l_tccp->stepsizes[l_band_no].mant = 0;
8908                         }
8909                 }
8910                 *p_header_size = *p_header_size - l_num_band;
8911         }
8912         else {
8913                 for     (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
8914                         opj_read_bytes(l_current_ptr, &l_tmp ,2);                       /* SPqcx_i */
8915                         l_current_ptr+=2;
8916                         if (l_band_no < OPJ_J2K_MAXBANDS){
8917                                 l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
8918                                 l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
8919                         }
8920                 }
8921                 *p_header_size = *p_header_size - 2*l_num_band;
8922         }
8923
8924         /* Add Antonin : if scalar_derived -> compute other stepsizes */
8925         if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
8926                 for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
8927                         l_tccp->stepsizes[l_band_no].expn =
8928                                 ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0) ?
8929                                         (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
8930                         l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
8931                 }
8932         }
8933
8934         return OPJ_TRUE;
8935 }
8936
8937 void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k )
8938 {
8939         OPJ_UINT32 i;
8940         opj_cp_t *l_cp = NULL;
8941         opj_tcp_t *l_tcp = NULL;
8942         opj_tccp_t *l_ref_tccp = NULL;
8943         opj_tccp_t *l_copied_tccp = NULL;
8944         OPJ_UINT32 l_size;
8945
8946         /* preconditions */
8947         assert(p_j2k != 00);
8948
8949         l_cp = &(p_j2k->m_cp);
8950         l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
8951                         &l_cp->tcps[p_j2k->m_current_tile_number] :
8952                         p_j2k->m_specific_param.m_decoder.m_default_tcp;
8953
8954         l_ref_tccp = &l_tcp->tccps[0];
8955         l_copied_tccp = l_ref_tccp + 1;
8956         l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
8957
8958         for     (i=1;i<p_j2k->m_private_image->numcomps;++i) {
8959                 l_copied_tccp->qntsty = l_ref_tccp->qntsty;
8960                 l_copied_tccp->numgbits = l_ref_tccp->numgbits;
8961                 memcpy(l_copied_tccp->stepsizes,l_ref_tccp->stepsizes,l_size);
8962                 ++l_copied_tccp;
8963         }
8964 }
8965
8966 static void opj_j2k_dump_tile_info( opj_tcp_t * l_default_tile,OPJ_INT32 numcomps,FILE* out_stream)
8967 {
8968         if (l_default_tile)
8969         {
8970                 OPJ_INT32 compno;
8971
8972                 fprintf(out_stream, "\t default tile {\n");
8973                 fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
8974                 fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
8975                 fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
8976                 fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
8977
8978                 for (compno = 0; compno < numcomps; compno++) {
8979                         opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
8980                         OPJ_UINT32 resno;
8981       OPJ_INT32 bandno, numbands;
8982
8983                         /* coding style*/
8984                         fprintf(out_stream, "\t\t comp %d {\n", compno);
8985                         fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
8986                         fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
8987                         fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
8988                         fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
8989                         fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
8990                         fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
8991
8992                         fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
8993                         for (resno = 0; resno < l_tccp->numresolutions; resno++) {
8994                                 fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
8995                         }
8996                         fprintf(out_stream, "\n");
8997
8998                         /* quantization style*/
8999                         fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
9000                         fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
9001                         fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
9002                         numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
9003                         for (bandno = 0; bandno < numbands; bandno++) {
9004                                 fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
9005                                         l_tccp->stepsizes[bandno].expn);
9006                         }
9007                         fprintf(out_stream, "\n");
9008
9009                         /* RGN value*/
9010                         fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
9011
9012                         fprintf(out_stream, "\t\t }\n");
9013                 } /*end of component of default tile*/
9014                 fprintf(out_stream, "\t }\n"); /*end of default tile*/
9015             }
9016 }
9017
9018 void j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)
9019 {
9020         /* Check if the flag is compatible with j2k file*/
9021         if ( (flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)){
9022                 fprintf(out_stream, "Wrong flag\n");
9023                 return;
9024         }
9025
9026         /* Dump the image_header */
9027         if (flag & OPJ_IMG_INFO){
9028                 if (p_j2k->m_private_image)
9029                         j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
9030         }
9031
9032         /* Dump the codestream info from main header */
9033         if (flag & OPJ_J2K_MH_INFO){
9034                 opj_j2k_dump_MH_info(p_j2k, out_stream);
9035         }
9036         /* Dump all tile/codestream info */
9037         if (flag & OPJ_J2K_TCH_INFO){
9038           OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
9039           OPJ_UINT32 i;
9040           opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
9041           for (i=0;i<l_nb_tiles;++i) {
9042             opj_j2k_dump_tile_info( l_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
9043             ++l_tcp;
9044           }
9045         }
9046
9047         /* Dump the codestream info of the current tile */
9048         if (flag & OPJ_J2K_TH_INFO){
9049
9050         }
9051
9052         /* Dump the codestream index from main header */
9053         if (flag & OPJ_J2K_MH_IND){
9054                 opj_j2k_dump_MH_index(p_j2k, out_stream);
9055         }
9056
9057         /* Dump the codestream index of the current tile */
9058         if (flag & OPJ_J2K_TH_IND){
9059
9060         }
9061
9062 }
9063
9064 void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)
9065 {
9066         opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
9067         OPJ_UINT32 it_marker, it_tile, it_tile_part;
9068
9069         fprintf(out_stream, "Codestream index from main header: {\n");
9070
9071         fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
9072                                     "\t Main header end position=%" PRIi64 "\n",
9073                         cstr_index->main_head_start, cstr_index->main_head_end);
9074
9075         fprintf(out_stream, "\t Marker list: {\n");
9076
9077         if (cstr_index->marker){
9078                 for (it_marker=0; it_marker < cstr_index->marknum ; it_marker++){
9079                         fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
9080                                         cstr_index->marker[it_marker].type,
9081                                         cstr_index->marker[it_marker].pos,
9082                                         cstr_index->marker[it_marker].len );
9083                 }
9084         }
9085
9086         fprintf(out_stream, "\t }\n");
9087
9088         if (cstr_index->tile_index){
9089
9090         /* Simple test to avoid to write empty information*/
9091         OPJ_UINT32 l_acc_nb_of_tile_part = 0;
9092         for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){
9093                         l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
9094         }
9095
9096         if (l_acc_nb_of_tile_part)
9097         {
9098             fprintf(out_stream, "\t Tile index: {\n");
9099
9100                     for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){
9101                             OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
9102
9103                             fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile, nb_of_tile_part);
9104
9105                             if (cstr_index->tile_index[it_tile].tp_index){
9106                                     for (it_tile_part =0; it_tile_part < nb_of_tile_part; it_tile_part++){
9107                                             fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%" PRIi64 ", end_pos=%" PRIi64 ".\n",
9108                                                             it_tile_part,
9109                                                             cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
9110                                                             cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
9111                                                             cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
9112                                     }
9113                             }
9114
9115                             if (cstr_index->tile_index[it_tile].marker){
9116                                     for (it_marker=0; it_marker < cstr_index->tile_index[it_tile].marknum ; it_marker++){
9117                                             fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
9118                                                             cstr_index->tile_index[it_tile].marker[it_marker].type,
9119                                                             cstr_index->tile_index[it_tile].marker[it_marker].pos,
9120                                                             cstr_index->tile_index[it_tile].marker[it_marker].len );
9121                                     }
9122                             }
9123                     }
9124                     fprintf(out_stream,"\t }\n");
9125         }
9126         }
9127
9128         fprintf(out_stream,"}\n");
9129
9130 }
9131
9132
9133 void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)
9134 {
9135
9136         fprintf(out_stream, "Codestream info from main header: {\n");
9137
9138         fprintf(out_stream, "\t tx0=%d, ty0=%d\n", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0);
9139         fprintf(out_stream, "\t tdx=%d, tdy=%d\n", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy);
9140         fprintf(out_stream, "\t tw=%d, th=%d\n", p_j2k->m_cp.tw, p_j2k->m_cp.th);
9141         opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
9142         fprintf(out_stream, "}\n");
9143 }
9144
9145 void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)
9146 {
9147         char tab[2];
9148
9149         if (dev_dump_flag){
9150                 fprintf(stdout, "[DEV] Dump an image_header struct {\n");
9151                 tab[0] = '\0';
9152         }
9153         else {
9154                 fprintf(out_stream, "Image info {\n");
9155                 tab[0] = '\t';tab[1] = '\0';
9156         }
9157
9158         fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
9159         fprintf(out_stream,     "%s x1=%d, y1=%d\n", tab, img_header->x1, img_header->y1);
9160         fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
9161
9162         if (img_header->comps){
9163                 OPJ_UINT32 compno;
9164                 for (compno = 0; compno < img_header->numcomps; compno++) {
9165                         fprintf(out_stream, "%s\t component %d {\n", tab, compno);
9166                         j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag, out_stream);
9167                         fprintf(out_stream,"%s}\n",tab);
9168                 }
9169         }
9170
9171         fprintf(out_stream, "}\n");
9172 }
9173
9174 void j2k_dump_image_comp_header(opj_image_comp_t* comp_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)
9175 {
9176         char tab[3];
9177
9178         if (dev_dump_flag){
9179                 fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
9180                 tab[0] = '\0';
9181         }       else {
9182                 tab[0] = '\t';tab[1] = '\t';tab[2] = '\0';
9183         }
9184
9185         fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
9186         fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
9187         fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
9188
9189         if (dev_dump_flag)
9190                 fprintf(out_stream, "}\n");
9191 }
9192
9193 opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k)
9194 {
9195         OPJ_UINT32 compno;
9196         OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
9197         opj_tcp_t *l_default_tile;
9198         opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,sizeof(opj_codestream_info_v2_t));
9199                 if (!cstr_info)
9200                         return NULL;
9201
9202         cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
9203
9204         cstr_info->tx0 = p_j2k->m_cp.tx0;
9205         cstr_info->ty0 = p_j2k->m_cp.ty0;
9206         cstr_info->tdx = p_j2k->m_cp.tdx;
9207         cstr_info->tdy = p_j2k->m_cp.tdy;
9208         cstr_info->tw = p_j2k->m_cp.tw;
9209         cstr_info->th = p_j2k->m_cp.th;
9210
9211         cstr_info->tile_info = NULL; /* Not fill from the main header*/
9212
9213         l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
9214
9215         cstr_info->m_default_tile_info.csty = l_default_tile->csty;
9216         cstr_info->m_default_tile_info.prg = l_default_tile->prg;
9217         cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
9218         cstr_info->m_default_tile_info.mct = l_default_tile->mct;
9219
9220         cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(cstr_info->nbcomps, sizeof(opj_tccp_info_t));
9221                 if (!cstr_info->m_default_tile_info.tccp_info)
9222                 {
9223                         opj_destroy_cstr_info(&cstr_info);
9224                         return NULL;
9225                 }
9226
9227         for (compno = 0; compno < numcomps; compno++) {
9228                 opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
9229                 opj_tccp_info_t *l_tccp_info = &(cstr_info->m_default_tile_info.tccp_info[compno]);
9230                 OPJ_INT32 bandno, numbands;
9231
9232                 /* coding style*/
9233                 l_tccp_info->csty = l_tccp->csty;
9234                 l_tccp_info->numresolutions = l_tccp->numresolutions;
9235                 l_tccp_info->cblkw = l_tccp->cblkw;
9236                 l_tccp_info->cblkh = l_tccp->cblkh;
9237                 l_tccp_info->cblksty = l_tccp->cblksty;
9238                 l_tccp_info->qmfbid = l_tccp->qmfbid;
9239                 if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS)
9240                 {
9241                         memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
9242                         memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
9243                 }
9244
9245                 /* quantization style*/
9246                 l_tccp_info->qntsty = l_tccp->qntsty;
9247                 l_tccp_info->numgbits = l_tccp->numgbits;
9248
9249                 numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
9250                 if (numbands < OPJ_J2K_MAXBANDS) {
9251                         for (bandno = 0; bandno < numbands; bandno++) {
9252                                 l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].mant;
9253                                 l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].expn;
9254                         }
9255                 }
9256
9257                 /* RGN value*/
9258                 l_tccp_info->roishift = l_tccp->roishift;
9259         }
9260
9261         return cstr_info;
9262 }
9263
9264 opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k)
9265 {
9266         opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
9267                         opj_calloc(1,sizeof(opj_codestream_index_t));
9268         if (!l_cstr_index)
9269                 return NULL;
9270
9271         l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
9272         l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
9273         l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
9274
9275         l_cstr_index->marknum = p_j2k->cstr_index->marknum;
9276         l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum*sizeof(opj_marker_info_t));
9277         if (!l_cstr_index->marker){
9278                 opj_free( l_cstr_index);
9279                 return NULL;
9280         }
9281
9282         if (p_j2k->cstr_index->marker)
9283                 memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker, l_cstr_index->marknum * sizeof(opj_marker_info_t) );
9284         else{
9285                 opj_free(l_cstr_index->marker);
9286                 l_cstr_index->marker = NULL;
9287         }
9288
9289         l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
9290         l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t) );
9291         if (!l_cstr_index->tile_index){
9292                 opj_free( l_cstr_index->marker);
9293                 opj_free( l_cstr_index);
9294                 return NULL;
9295         }
9296
9297         if (!p_j2k->cstr_index->tile_index){
9298                 opj_free(l_cstr_index->tile_index);
9299                 l_cstr_index->tile_index = NULL;
9300         }
9301         else {
9302                 OPJ_UINT32 it_tile = 0;
9303                 for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++ ){
9304
9305                         /* Tile Marker*/
9306                         l_cstr_index->tile_index[it_tile].marknum = p_j2k->cstr_index->tile_index[it_tile].marknum;
9307
9308                         l_cstr_index->tile_index[it_tile].marker =
9309                                 (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum*sizeof(opj_marker_info_t));
9310
9311                         if (!l_cstr_index->tile_index[it_tile].marker) {
9312                                 OPJ_UINT32 it_tile_free;
9313
9314                                 for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){
9315                                         opj_free(l_cstr_index->tile_index[it_tile_free].marker);
9316                                 }
9317
9318                                 opj_free( l_cstr_index->tile_index);
9319                                 opj_free( l_cstr_index->marker);
9320                                 opj_free( l_cstr_index);
9321                                 return NULL;
9322                         }
9323
9324                         if (p_j2k->cstr_index->tile_index[it_tile].marker)
9325                                 memcpy( l_cstr_index->tile_index[it_tile].marker,
9326                                                 p_j2k->cstr_index->tile_index[it_tile].marker,
9327                                                 l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t) );
9328                         else{
9329                                 opj_free(l_cstr_index->tile_index[it_tile].marker);
9330                                 l_cstr_index->tile_index[it_tile].marker = NULL;
9331                         }
9332
9333                         /* Tile part index*/
9334                         l_cstr_index->tile_index[it_tile].nb_tps = p_j2k->cstr_index->tile_index[it_tile].nb_tps;
9335
9336                         l_cstr_index->tile_index[it_tile].tp_index =
9337                                 (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps*sizeof(opj_tp_index_t));
9338
9339                         if(!l_cstr_index->tile_index[it_tile].tp_index){
9340                                 OPJ_UINT32 it_tile_free;
9341
9342                                 for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){
9343                                         opj_free(l_cstr_index->tile_index[it_tile_free].marker);
9344                                         opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
9345                                 }
9346
9347                                 opj_free( l_cstr_index->tile_index);
9348                                 opj_free( l_cstr_index->marker);
9349                                 opj_free( l_cstr_index);
9350                                 return NULL;
9351                         }
9352
9353                         if (p_j2k->cstr_index->tile_index[it_tile].tp_index){
9354                                 memcpy( l_cstr_index->tile_index[it_tile].tp_index,
9355                                                 p_j2k->cstr_index->tile_index[it_tile].tp_index,
9356                                                 l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t) );
9357                         }
9358                         else{
9359                                 opj_free(l_cstr_index->tile_index[it_tile].tp_index);
9360                                 l_cstr_index->tile_index[it_tile].tp_index = NULL;
9361                         }
9362
9363                         /* Packet index (NOT USED)*/
9364                         l_cstr_index->tile_index[it_tile].nb_packet = 0;
9365                         l_cstr_index->tile_index[it_tile].packet_index = NULL;
9366
9367                 }
9368         }
9369
9370         return l_cstr_index;
9371 }
9372
9373 OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
9374 {
9375         OPJ_UINT32 it_tile=0;
9376
9377         p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
9378         p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
9379         if (!p_j2k->cstr_index->tile_index)
9380                 return OPJ_FALSE;
9381
9382         for (it_tile=0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++){
9383                 p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
9384                 p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
9385                 p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
9386                                 opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum, sizeof(opj_marker_info_t));
9387                 if (!p_j2k->cstr_index->tile_index[it_tile].marker)
9388                         return OPJ_FALSE;
9389         }
9390
9391         return OPJ_TRUE;
9392 }
9393
9394 OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k,
9395                                                             opj_stream_private_t *p_stream,
9396                                                             opj_event_mgr_t * p_manager)
9397 {
9398         OPJ_BOOL l_go_on = OPJ_TRUE;
9399         OPJ_UINT32 l_current_tile_no;
9400         OPJ_UINT32 l_data_size,l_max_data_size;
9401         OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
9402         OPJ_UINT32 l_nb_comps;
9403         OPJ_BYTE * l_current_data;
9404         OPJ_UINT32 nr_tiles = 0;
9405
9406         l_current_data = (OPJ_BYTE*)opj_malloc(1000);
9407         if (! l_current_data) {
9408                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tiles\n");
9409                 return OPJ_FALSE;
9410         }
9411         l_max_data_size = 1000;
9412
9413         while (OPJ_TRUE) {
9414                 if (! opj_j2k_read_tile_header( p_j2k,
9415                                         &l_current_tile_no,
9416                                         &l_data_size,
9417                                         &l_tile_x0, &l_tile_y0,
9418                                         &l_tile_x1, &l_tile_y1,
9419                                         &l_nb_comps,
9420                                         &l_go_on,
9421                                         p_stream,
9422                                         p_manager)) {
9423                         opj_free(l_current_data);
9424                         return OPJ_FALSE;
9425                 }
9426
9427                 if (! l_go_on) {
9428                         break;
9429                 }
9430
9431                 if (l_data_size > l_max_data_size) {
9432                         OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);
9433                         if (! l_new_current_data) {
9434                                 opj_free(l_current_data);
9435                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
9436                                 return OPJ_FALSE;
9437                         }
9438                         l_current_data = l_new_current_data;
9439                         l_max_data_size = l_data_size;
9440                 }
9441
9442                 if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {
9443                         opj_free(l_current_data);
9444                         opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
9445                         return OPJ_FALSE;
9446                 }
9447                 opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
9448
9449                 if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {
9450                         opj_free(l_current_data);
9451                         return OPJ_FALSE;
9452                 }
9453                 opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
9454                 
9455                 if(opj_stream_get_number_byte_left(p_stream) == 0  
9456                     && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)
9457                     break;
9458                 if(++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) 
9459                     break;
9460         }
9461
9462         opj_free(l_current_data);
9463
9464         return OPJ_TRUE;
9465 }
9466
9467 /**
9468  * Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures.
9469  */
9470 static void opj_j2k_setup_decoding (opj_j2k_t *p_j2k)
9471 {
9472         /* preconditions*/
9473         assert(p_j2k != 00);
9474
9475         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_tiles);
9476         /* DEVELOPER CORNER, add your custom procedures */
9477
9478 }
9479
9480 /*
9481  * Read and decode one tile.
9482  */
9483 static OPJ_BOOL opj_j2k_decode_one_tile (       opj_j2k_t *p_j2k,
9484                                                                             opj_stream_private_t *p_stream,
9485                                                                             opj_event_mgr_t * p_manager)
9486 {
9487         OPJ_BOOL l_go_on = OPJ_TRUE;
9488         OPJ_UINT32 l_current_tile_no;
9489         OPJ_UINT32 l_tile_no_to_dec;
9490         OPJ_UINT32 l_data_size,l_max_data_size;
9491         OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
9492         OPJ_UINT32 l_nb_comps;
9493         OPJ_BYTE * l_current_data;
9494
9495         l_current_data = (OPJ_BYTE*)opj_malloc(1000);
9496         if (! l_current_data) {
9497                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode one tile\n");
9498                 return OPJ_FALSE;
9499         }
9500         l_max_data_size = 1000;
9501
9502         /*Allocate and initialize some elements of codestrem index if not already done*/
9503         if( !p_j2k->cstr_index->tile_index)
9504         {
9505                 if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){
9506                         opj_free(l_current_data);
9507                         return OPJ_FALSE;
9508                 }
9509         }
9510         /* Move into the codestream to the first SOT used to decode the desired tile */
9511         l_tile_no_to_dec = (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
9512         if (p_j2k->cstr_index->tile_index)
9513                 if(p_j2k->cstr_index->tile_index->tp_index)
9514                 {
9515                         if ( ! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
9516                                 /* the index for this tile has not been built,
9517                                  *  so move to the last SOT read */
9518                                 if ( !(opj_stream_read_seek(p_stream, p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos+2, p_manager)) ){
9519                                         opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
9520                         opj_free(l_current_data);
9521                                         return OPJ_FALSE;
9522                                 }
9523                         }
9524                         else{
9525                                 if ( !(opj_stream_read_seek(p_stream, p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos+2, p_manager)) ) {
9526                                         opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
9527                         opj_free(l_current_data);
9528                                         return OPJ_FALSE;
9529                                 }
9530                         }
9531                         /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
9532                         if(p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC)
9533                                 p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
9534                 }
9535
9536         while (OPJ_TRUE) {
9537                 if (! opj_j2k_read_tile_header( p_j2k,
9538                                         &l_current_tile_no,
9539                                         &l_data_size,
9540                                         &l_tile_x0, &l_tile_y0,
9541                                         &l_tile_x1, &l_tile_y1,
9542                                         &l_nb_comps,
9543                                         &l_go_on,
9544                                         p_stream,
9545                                         p_manager)) {
9546                         opj_free(l_current_data);
9547                         return OPJ_FALSE;
9548                 }
9549
9550                 if (! l_go_on) {
9551                         break;
9552                 }
9553
9554                 if (l_data_size > l_max_data_size) {
9555                         OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);
9556                         if (! l_new_current_data) {
9557                                 opj_free(l_current_data);
9558                                 l_current_data = NULL;
9559                                 /* TODO: LH: why tile numbering policy used in messages differs from
9560                                    the one used in opj_j2k_decode_tiles() ? */
9561                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
9562                                 return OPJ_FALSE;
9563                         }
9564                         l_current_data = l_new_current_data;
9565                         l_max_data_size = l_data_size;
9566                 }
9567
9568                 if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {
9569                         opj_free(l_current_data);
9570                         return OPJ_FALSE;
9571                 }
9572                 opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
9573
9574                 if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {
9575                         opj_free(l_current_data);
9576                         return OPJ_FALSE;
9577                 }
9578                 opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no);
9579
9580                 if(l_current_tile_no == l_tile_no_to_dec)
9581                 {
9582                         /* move into the codestream to the the first SOT (FIXME or not move?)*/
9583                         if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2, p_manager) ) ) {
9584                                 opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
9585                                 return OPJ_FALSE;
9586                         }
9587                         break;
9588                 }
9589                 else {
9590                         opj_event_msg(p_manager, EVT_WARNING, "Tile read, decode and updated is not the desired (%d vs %d).\n", l_current_tile_no, l_tile_no_to_dec);
9591                 }
9592
9593         }
9594
9595         opj_free(l_current_data);
9596
9597         return OPJ_TRUE;
9598 }
9599
9600 /**
9601  * Sets up the procedures to do on decoding one tile. Developpers wanting to extend the library can add their own reading procedures.
9602  */
9603 static void opj_j2k_setup_decoding_tile (opj_j2k_t *p_j2k)
9604 {
9605         /* preconditions*/
9606         assert(p_j2k != 00);
9607
9608         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_one_tile);
9609         /* DEVELOPER CORNER, add your custom procedures */
9610
9611 }
9612
9613 OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k,
9614                                                 opj_stream_private_t * p_stream,
9615                                                 opj_image_t * p_image,
9616                                                 opj_event_mgr_t * p_manager)
9617 {
9618         OPJ_UINT32 compno;
9619
9620         if (!p_image)
9621                 return OPJ_FALSE;
9622
9623         p_j2k->m_output_image = opj_image_create0();
9624         if (! (p_j2k->m_output_image)) {
9625                 return OPJ_FALSE;
9626         }
9627         opj_copy_image_header(p_image, p_j2k->m_output_image);
9628
9629         /* customization of the decoding */
9630         opj_j2k_setup_decoding(p_j2k);
9631
9632         /* Decode the codestream */
9633         if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
9634                 opj_image_destroy(p_j2k->m_private_image);
9635                 p_j2k->m_private_image = NULL;
9636                 return OPJ_FALSE;
9637         }
9638
9639         /* Move data and copy one information from codec to output image*/
9640         for (compno = 0; compno < p_image->numcomps; compno++) {
9641                 p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;
9642                 p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
9643 #if 0
9644                 char fn[256];
9645                 sprintf( fn, "/tmp/%d.raw", compno );
9646                 FILE *debug = fopen( fn, "wb" );
9647                 fwrite( p_image->comps[compno].data, sizeof(OPJ_INT32), p_image->comps[compno].w * p_image->comps[compno].h, debug );
9648                 fclose( debug );
9649 #endif
9650                 p_j2k->m_output_image->comps[compno].data = NULL;
9651         }
9652
9653         return OPJ_TRUE;
9654 }
9655
9656 OPJ_BOOL opj_j2k_get_tile(      opj_j2k_t *p_j2k,
9657                                                     opj_stream_private_t *p_stream,
9658                                                     opj_image_t* p_image,
9659                                                     opj_event_mgr_t * p_manager,
9660                                                     OPJ_UINT32 tile_index )
9661 {
9662         OPJ_UINT32 compno;
9663         OPJ_UINT32 l_tile_x, l_tile_y;
9664         opj_image_comp_t* l_img_comp;
9665
9666         if (!p_image) {
9667                 opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
9668                 return OPJ_FALSE;
9669         }
9670
9671         if ( /*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) ){
9672                 opj_event_msg(p_manager, EVT_ERROR, "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index, (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
9673                 return OPJ_FALSE;
9674         }
9675
9676         /* Compute the dimension of the desired tile*/
9677         l_tile_x = tile_index % p_j2k->m_cp.tw;
9678         l_tile_y = tile_index / p_j2k->m_cp.tw;
9679
9680         p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
9681         if (p_image->x0 < p_j2k->m_private_image->x0)
9682                 p_image->x0 = p_j2k->m_private_image->x0;
9683         p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
9684         if (p_image->x1 > p_j2k->m_private_image->x1)
9685                 p_image->x1 = p_j2k->m_private_image->x1;
9686
9687         p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
9688         if (p_image->y0 < p_j2k->m_private_image->y0)
9689                 p_image->y0 = p_j2k->m_private_image->y0;
9690         p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
9691         if (p_image->y1 > p_j2k->m_private_image->y1)
9692                 p_image->y1 = p_j2k->m_private_image->y1;
9693
9694         l_img_comp = p_image->comps;
9695         for (compno=0; compno < p_image->numcomps; ++compno)
9696         {
9697                 OPJ_INT32 l_comp_x1, l_comp_y1;
9698
9699                 l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
9700
9701                 l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);
9702                 l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);
9703                 l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
9704                 l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
9705
9706                 l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor));
9707                 l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor));
9708
9709                 l_img_comp++;
9710         }
9711
9712         /* Destroy the previous output image*/
9713         if (p_j2k->m_output_image)
9714                 opj_image_destroy(p_j2k->m_output_image);
9715
9716         /* Create the ouput image from the information previously computed*/
9717         p_j2k->m_output_image = opj_image_create0();
9718         if (! (p_j2k->m_output_image)) {
9719                 return OPJ_FALSE;
9720         }
9721         opj_copy_image_header(p_image, p_j2k->m_output_image);
9722
9723         p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
9724
9725         /* customization of the decoding */
9726         opj_j2k_setup_decoding_tile(p_j2k);
9727
9728         /* Decode the codestream */
9729         if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
9730                 opj_image_destroy(p_j2k->m_private_image);
9731                 p_j2k->m_private_image = NULL;
9732                 return OPJ_FALSE;
9733         }
9734
9735         /* Move data and copy one information from codec to output image*/
9736         for (compno = 0; compno < p_image->numcomps; compno++) {
9737                 p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;
9738
9739                 if (p_image->comps[compno].data)
9740                         opj_free(p_image->comps[compno].data);
9741
9742                 p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
9743
9744                 p_j2k->m_output_image->comps[compno].data = NULL;
9745         }
9746
9747         return OPJ_TRUE;
9748 }
9749
9750 OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
9751                                                OPJ_UINT32 res_factor,
9752                                                opj_event_mgr_t * p_manager)
9753 {
9754         OPJ_UINT32 it_comp;
9755
9756         p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
9757
9758         if (p_j2k->m_private_image) {
9759                 if (p_j2k->m_private_image->comps) {
9760                         if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
9761                                 if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
9762                                         for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
9763                                                 OPJ_UINT32 max_res = p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
9764                                                 if ( res_factor >= max_res){
9765                                                         opj_event_msg(p_manager, EVT_ERROR, "Resolution factor is greater than the maximum resolution in the component.\n");
9766                                                         return OPJ_FALSE;
9767                                                 }
9768                                                 p_j2k->m_private_image->comps[it_comp].factor = res_factor;
9769                                         }
9770                                         return OPJ_TRUE;
9771                                 }
9772                         }
9773                 }
9774         }
9775
9776         return OPJ_FALSE;
9777 }
9778
9779 OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,
9780                         opj_stream_private_t *p_stream,
9781                         opj_event_mgr_t * p_manager )
9782 {
9783         OPJ_UINT32 i, j;
9784         OPJ_UINT32 l_nb_tiles;
9785         OPJ_UINT32 l_max_tile_size = 0, l_current_tile_size;
9786         OPJ_BYTE * l_current_data = 00;
9787         opj_tcd_t* p_tcd = 00;
9788
9789         /* preconditions */
9790         assert(p_j2k != 00);
9791         assert(p_stream != 00);
9792         assert(p_manager != 00);
9793         
9794         p_tcd = p_j2k->m_tcd;
9795
9796         l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
9797         for (i=0;i<l_nb_tiles;++i) {
9798                 if (! opj_j2k_pre_write_tile(p_j2k,i,p_stream,p_manager)) {
9799                         if (l_current_data) {
9800                                 opj_free(l_current_data);
9801                         }
9802                         return OPJ_FALSE;
9803                 }
9804
9805                 /* if we only have one tile, then simply set tile component data equal to image component data */
9806                 /* otherwise, allocate the data */
9807                 for (j=0;j<p_j2k->m_tcd->image->numcomps;++j) {
9808                         opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j;
9809                         if (l_nb_tiles == 1) {
9810                                                                                                         opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
9811                                                                                                         l_tilec->data  =  l_img_comp->data;
9812                                                                                                         l_tilec->ownsData = OPJ_FALSE;
9813                         } else {
9814                                                                                                         if(! opj_alloc_tile_component_data(l_tilec)) {
9815                                                                                                                 opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data." );
9816                                                                                                                 if (l_current_data) {
9817                                                                                                                         opj_free(l_current_data);
9818                                                                                                                 }
9819                                                                                                                 return OPJ_FALSE;
9820                                                                                                         }
9821                                                                                                         opj_alloc_tile_component_data(l_tilec);
9822                         }
9823                 }
9824                 l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd);
9825                 if (l_nb_tiles > 1) {
9826                         if (l_current_tile_size > l_max_tile_size) {
9827                                                                                                         OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_current_tile_size);
9828                                                                                                         if (! l_new_current_data) {
9829                                                                                                                 if (l_current_data) {
9830                                                                                                                         opj_free(l_current_data);
9831                                                                                                                 }
9832                                                                                                                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
9833                                                                                                                 return OPJ_FALSE;
9834                                                                                                                                 }
9835                                                                                                                                 l_current_data = l_new_current_data;
9836                                                                                                                                 l_max_tile_size = l_current_tile_size;
9837                         }
9838
9839                         /* copy image data (32 bit) to l_current_data as contiguous, all-component, zero offset buffer */
9840                         /* 32 bit components @ 8 bit precision get converted to 8 bit */
9841                         /* 32 bit components @ 16 bit precision get converted to 16 bit */
9842                         opj_j2k_get_tile_data(p_j2k->m_tcd,l_current_data);
9843
9844                         /* now copy this data into the tile component */
9845                         if (! opj_tcd_copy_tile_data(p_j2k->m_tcd,l_current_data,l_current_tile_size)) {
9846                                                                                                                                 opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." );
9847                                                                                                                                 return OPJ_FALSE;
9848                         }
9849                 }
9850
9851                 if (! opj_j2k_post_write_tile (p_j2k,p_stream,p_manager)) {
9852                         return OPJ_FALSE;
9853                 }
9854         }
9855
9856         if (l_current_data) {
9857                 opj_free(l_current_data);
9858         }
9859         return OPJ_TRUE;
9860 }
9861
9862 OPJ_BOOL opj_j2k_end_compress(  opj_j2k_t *p_j2k,
9863                                                         opj_stream_private_t *p_stream,
9864                                                         opj_event_mgr_t * p_manager)
9865 {
9866         /* customization of the encoding */
9867         opj_j2k_setup_end_compress(p_j2k);
9868
9869         if (! opj_j2k_exec (p_j2k, p_j2k->m_procedure_list, p_stream, p_manager))
9870         {
9871                 return OPJ_FALSE;
9872         }
9873
9874         return OPJ_TRUE;
9875 }
9876
9877 OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
9878                                                             opj_stream_private_t *p_stream,
9879                                                             opj_image_t * p_image,
9880                                                             opj_event_mgr_t * p_manager)
9881 {
9882         /* preconditions */
9883         assert(p_j2k != 00);
9884         assert(p_stream != 00);
9885         assert(p_manager != 00);
9886
9887         p_j2k->m_private_image = opj_image_create0();
9888         if (! p_j2k->m_private_image) {
9889                 opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header." );
9890                 return OPJ_FALSE;
9891         }
9892         opj_copy_image_header(p_image, p_j2k->m_private_image);
9893
9894         /* TODO_MSD: Find a better way */
9895         if (p_image->comps) {
9896                 OPJ_UINT32 it_comp;
9897                 for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
9898                         if (p_image->comps[it_comp].data) {
9899                                 p_j2k->m_private_image->comps[it_comp].data =p_image->comps[it_comp].data;
9900                                 p_image->comps[it_comp].data = NULL;
9901
9902                         }
9903                 }
9904         }
9905
9906         /* customization of the validation */
9907         opj_j2k_setup_encoding_validation (p_j2k);
9908
9909         /* validation of the parameters codec */
9910         if (! opj_j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager)) {
9911                 return OPJ_FALSE;
9912         }
9913
9914         /* customization of the encoding */
9915         opj_j2k_setup_header_writing(p_j2k);
9916
9917         /* write header */
9918         if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
9919                 return OPJ_FALSE;
9920         }
9921
9922         return OPJ_TRUE;
9923 }
9924
9925 OPJ_BOOL opj_j2k_pre_write_tile (       opj_j2k_t * p_j2k,
9926                                                                 OPJ_UINT32 p_tile_index,
9927                                                                 opj_stream_private_t *p_stream,
9928                                                                 opj_event_mgr_t * p_manager )
9929 {
9930   (void)p_stream;
9931         if (p_tile_index != p_j2k->m_current_tile_number) {
9932                 opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match." );
9933                 return OPJ_FALSE;
9934         }
9935
9936         opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n", p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
9937
9938         p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
9939         p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
9940         p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
9941
9942         /* initialisation before tile encoding  */
9943         if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) {
9944                 return OPJ_FALSE;
9945         }
9946
9947         return OPJ_TRUE;
9948 }
9949
9950 void opj_get_tile_dimensions(opj_image_t * l_image,
9951                              opj_tcd_tilecomp_t * l_tilec,
9952                              opj_image_comp_t * l_img_comp,
9953                              OPJ_UINT32* l_size_comp,
9954                              OPJ_UINT32* l_width,
9955                              OPJ_UINT32* l_height,
9956                              OPJ_UINT32* l_offset_x,
9957                              OPJ_UINT32* l_offset_y,
9958                              OPJ_UINT32* l_image_width,
9959                              OPJ_UINT32* l_stride,
9960                              OPJ_UINT32* l_tile_offset) {
9961         OPJ_UINT32 l_remaining;
9962         *l_size_comp = l_img_comp->prec >> 3; /* (/8) */
9963         l_remaining = l_img_comp->prec & 7;  /* (%8) */
9964         if (l_remaining) {
9965                 *l_size_comp += 1;
9966         }
9967
9968         if (*l_size_comp == 3) {
9969                 *l_size_comp = 4;
9970         }
9971
9972         *l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
9973         *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
9974         *l_offset_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
9975         *l_offset_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->y0, (OPJ_INT32)l_img_comp->dy);
9976         *l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 - (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
9977         *l_stride = *l_image_width - *l_width;
9978         *l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width;
9979 }
9980
9981 void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
9982 {
9983         OPJ_UINT32 i,j,k = 0;
9984
9985         for (i=0;i<p_tcd->image->numcomps;++i) {
9986                 opj_image_t * l_image =  p_tcd->image;
9987                 OPJ_INT32 * l_src_ptr;
9988                 opj_tcd_tilecomp_t * l_tilec = p_tcd->tcd_image->tiles->comps + i;
9989                 opj_image_comp_t * l_img_comp = l_image->comps + i;
9990                 OPJ_UINT32 l_size_comp,l_width,l_height,l_offset_x,l_offset_y, l_image_width,l_stride,l_tile_offset;
9991
9992                 opj_get_tile_dimensions(l_image,
9993                                         l_tilec,
9994                                         l_img_comp,
9995                                         &l_size_comp,
9996                                         &l_width,
9997                                         &l_height,
9998                                         &l_offset_x,
9999                                         &l_offset_y,
10000                                         &l_image_width,
10001                                         &l_stride,
10002                                         &l_tile_offset);
10003
10004                 l_src_ptr = l_img_comp->data + l_tile_offset;
10005
10006                 switch (l_size_comp) {
10007                         case 1:
10008                                 {
10009                                         OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
10010                                         if (l_img_comp->sgnd) {
10011                                                 for     (j=0;j<l_height;++j) {
10012                                                         for (k=0;k<l_width;++k) {
10013                                                                 *(l_dest_ptr) = (OPJ_CHAR) (*l_src_ptr);
10014                                                                 ++l_dest_ptr;
10015                                                                 ++l_src_ptr;
10016                                                         }
10017                                                         l_src_ptr += l_stride;
10018                                                 }
10019                                         }
10020                                         else {
10021                                                 for (j=0;j<l_height;++j) {
10022                                                         for (k=0;k<l_width;++k) {
10023                                                                 *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr)&0xff);
10024                                                                 ++l_dest_ptr;
10025                                                                 ++l_src_ptr;
10026                                                         }
10027                                                         l_src_ptr += l_stride;
10028                                                 }
10029                                         }
10030
10031                                         p_data = (OPJ_BYTE*) l_dest_ptr;
10032                                 }
10033                                 break;
10034                         case 2:
10035                                 {
10036                                         OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
10037                                         if (l_img_comp->sgnd) {
10038                                                 for (j=0;j<l_height;++j) {
10039                                                         for (k=0;k<l_width;++k) {
10040                                                                 *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));
10041                                                         }
10042                                                         l_src_ptr += l_stride;
10043                                                 }
10044                                         }
10045                                         else {
10046                                                 for (j=0;j<l_height;++j) {
10047                                                         for (k=0;k<l_width;++k) {
10048                                                                 *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
10049                                                         }
10050                                                         l_src_ptr += l_stride;
10051                                                 }
10052                                         }
10053
10054                                         p_data = (OPJ_BYTE*) l_dest_ptr;
10055                                 }
10056                                 break;
10057                         case 4:
10058                                 {
10059                                         OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
10060                                         for (j=0;j<l_height;++j) {
10061                                                 for (k=0;k<l_width;++k) {
10062                                                         *(l_dest_ptr++) = *(l_src_ptr++);
10063                                                 }
10064                                                 l_src_ptr += l_stride;
10065                                         }
10066
10067                                         p_data = (OPJ_BYTE*) l_dest_ptr;
10068                                 }
10069                                 break;
10070                 }
10071         }
10072 }
10073
10074 OPJ_BOOL opj_j2k_post_write_tile (      opj_j2k_t * p_j2k,
10075                                                                 opj_stream_private_t *p_stream,
10076                                                                 opj_event_mgr_t * p_manager )
10077 {
10078         OPJ_UINT32 l_nb_bytes_written;
10079         OPJ_BYTE * l_current_data = 00;
10080         OPJ_UINT32 l_tile_size = 0;
10081         OPJ_UINT32 l_available_data;
10082
10083         /* preconditions */
10084         assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
10085
10086         l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
10087         l_available_data = l_tile_size;
10088         l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
10089
10090         l_nb_bytes_written = 0;
10091         if (! opj_j2k_write_first_tile_part(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {
10092                 return OPJ_FALSE;
10093         }
10094         l_current_data += l_nb_bytes_written;
10095         l_available_data -= l_nb_bytes_written;
10096
10097         l_nb_bytes_written = 0;
10098         if (! opj_j2k_write_all_tile_parts(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {
10099                 return OPJ_FALSE;
10100         }
10101
10102         l_available_data -= l_nb_bytes_written;
10103         l_nb_bytes_written = l_tile_size - l_available_data;
10104
10105         if ( opj_stream_write_data(     p_stream,
10106                                                                 p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
10107                                                                 l_nb_bytes_written,p_manager) != l_nb_bytes_written) {
10108                 return OPJ_FALSE;
10109         }
10110
10111         ++p_j2k->m_current_tile_number;
10112
10113         return OPJ_TRUE;
10114 }
10115
10116 void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k)
10117 {
10118         /* preconditions */
10119         assert(p_j2k != 00);
10120
10121         /* DEVELOPER CORNER, insert your custom procedures */
10122         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_eoc );
10123
10124         if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) {
10125                 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_updated_tlm);
10126         }
10127
10128         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_epc );
10129         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_end_encoding );
10130         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_destroy_header_memory);
10131 }
10132
10133 void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k)
10134 {
10135         /* preconditions */
10136         assert(p_j2k != 00);
10137
10138         opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_encoder);
10139         opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_encoding_validation);
10140
10141         /* DEVELOPER CORNER, add your custom validation procedure */
10142         opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_mct_validation);
10143 }
10144
10145 void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k)
10146 {
10147         /* preconditions */
10148         assert(p_j2k != 00);
10149
10150         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_init_info );
10151         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_soc );
10152         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_siz );
10153         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_cod );
10154         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_qcd );
10155
10156         if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) {
10157                 /* No need for COC or QCC, QCD and COD are used
10158                 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_coc );
10159                 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_qcc );
10160                 */
10161                 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_tlm );
10162
10163                 if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) {
10164                         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_poc );
10165                 }
10166         }
10167
10168         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_regions);
10169
10170         if (p_j2k->m_cp.comment != 00)  {
10171                 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_com);
10172         }
10173
10174         /* DEVELOPER CORNER, insert your custom procedures */
10175         if (p_j2k->m_cp.rsiz & OPJ_EXTENSION_MCT) {
10176                 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_mct_data_group );
10177         }
10178         /* End of Developer Corner */
10179
10180         if (p_j2k->cstr_index) {
10181                 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_get_end_header );
10182         }
10183
10184         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_create_tcd);
10185         opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_update_rates);
10186 }
10187
10188 OPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k,
10189                                                                         OPJ_BYTE * p_data,
10190                                                                         OPJ_UINT32 * p_data_written,
10191                                                                         OPJ_UINT32 p_total_data_size,
10192                                                                         opj_stream_private_t *p_stream,
10193                                                                         struct opj_event_mgr * p_manager )
10194 {
10195         OPJ_UINT32 l_nb_bytes_written = 0;
10196         OPJ_UINT32 l_current_nb_bytes_written;
10197         OPJ_BYTE * l_begin_data = 00;
10198
10199         opj_tcd_t * l_tcd = 00;
10200         opj_cp_t * l_cp = 00;
10201
10202         l_tcd = p_j2k->m_tcd;
10203         l_cp = &(p_j2k->m_cp);
10204
10205         l_tcd->cur_pino = 0;
10206
10207         /*Get number of tile parts*/
10208         p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
10209
10210         /* INDEX >> */
10211         /* << INDEX */
10212
10213         l_current_nb_bytes_written = 0;
10214         l_begin_data = p_data;
10215         if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager))
10216         {
10217                 return OPJ_FALSE;
10218         }
10219
10220         l_nb_bytes_written += l_current_nb_bytes_written;
10221         p_data += l_current_nb_bytes_written;
10222         p_total_data_size -= l_current_nb_bytes_written;
10223
10224         if (!OPJ_IS_CINEMA(l_cp->rsiz)) {
10225 #if 0
10226                 for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
10227                         l_current_nb_bytes_written = 0;
10228                         opj_j2k_write_coc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
10229                         l_nb_bytes_written += l_current_nb_bytes_written;
10230                         p_data += l_current_nb_bytes_written;
10231                         p_total_data_size -= l_current_nb_bytes_written;
10232
10233                         l_current_nb_bytes_written = 0;
10234                         opj_j2k_write_qcc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
10235                         l_nb_bytes_written += l_current_nb_bytes_written;
10236                         p_data += l_current_nb_bytes_written;
10237                         p_total_data_size -= l_current_nb_bytes_written;
10238                 }
10239 #endif
10240
10241                 if (l_cp->tcps[p_j2k->m_current_tile_number].numpocs) {
10242                         l_current_nb_bytes_written = 0;
10243                         opj_j2k_write_poc_in_memory(p_j2k,p_data,&l_current_nb_bytes_written,p_manager);
10244                         l_nb_bytes_written += l_current_nb_bytes_written;
10245                         p_data += l_current_nb_bytes_written;
10246                         p_total_data_size -= l_current_nb_bytes_written;
10247                 }
10248         }
10249
10250         l_current_nb_bytes_written = 0;
10251         if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
10252                 return OPJ_FALSE;
10253         }
10254
10255         l_nb_bytes_written += l_current_nb_bytes_written;
10256         * p_data_written = l_nb_bytes_written;
10257
10258         /* Writing Psot in SOT marker */
10259         opj_write_bytes(l_begin_data + 6,l_nb_bytes_written,4);                                 /* PSOT */
10260
10261         if (OPJ_IS_CINEMA(l_cp->rsiz)){
10262                 opj_j2k_update_tlm(p_j2k,l_nb_bytes_written);
10263         }
10264
10265         return OPJ_TRUE;
10266 }
10267
10268 OPJ_BOOL opj_j2k_write_all_tile_parts(  opj_j2k_t *p_j2k,
10269                                                                         OPJ_BYTE * p_data,
10270                                                                         OPJ_UINT32 * p_data_written,
10271                                                                         OPJ_UINT32 p_total_data_size,
10272                                                                         opj_stream_private_t *p_stream,
10273                                                                         struct opj_event_mgr * p_manager
10274                                                                 )
10275 {
10276         OPJ_UINT32 tilepartno=0;
10277         OPJ_UINT32 l_nb_bytes_written = 0;
10278         OPJ_UINT32 l_current_nb_bytes_written;
10279         OPJ_UINT32 l_part_tile_size;
10280         OPJ_UINT32 tot_num_tp;
10281         OPJ_UINT32 pino;
10282
10283         OPJ_BYTE * l_begin_data;
10284         opj_tcp_t *l_tcp = 00;
10285         opj_tcd_t * l_tcd = 00;
10286         opj_cp_t * l_cp = 00;
10287
10288         l_tcd = p_j2k->m_tcd;
10289         l_cp = &(p_j2k->m_cp);
10290         l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
10291
10292         /*Get number of tile parts*/
10293         tot_num_tp = opj_j2k_get_num_tp(l_cp,0,p_j2k->m_current_tile_number);
10294
10295         /* start writing remaining tile parts */
10296         ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
10297         for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
10298                 p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
10299                 l_current_nb_bytes_written = 0;
10300                 l_part_tile_size = 0;
10301                 l_begin_data = p_data;
10302
10303                 if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {
10304                         return OPJ_FALSE;
10305                 }
10306
10307                 l_nb_bytes_written += l_current_nb_bytes_written;
10308                 p_data += l_current_nb_bytes_written;
10309                 p_total_data_size -= l_current_nb_bytes_written;
10310                 l_part_tile_size += l_current_nb_bytes_written;
10311
10312                 l_current_nb_bytes_written = 0;
10313                 if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
10314                         return OPJ_FALSE;
10315                 }
10316
10317                 p_data += l_current_nb_bytes_written;
10318                 l_nb_bytes_written += l_current_nb_bytes_written;
10319                 p_total_data_size -= l_current_nb_bytes_written;
10320                 l_part_tile_size += l_current_nb_bytes_written;
10321
10322                 /* Writing Psot in SOT marker */
10323                 opj_write_bytes(l_begin_data + 6,l_part_tile_size,4);                                   /* PSOT */
10324
10325                 if (OPJ_IS_CINEMA(l_cp->rsiz)) {
10326                         opj_j2k_update_tlm(p_j2k,l_part_tile_size);
10327                 }
10328
10329                 ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
10330         }
10331
10332         for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
10333                 l_tcd->cur_pino = pino;
10334
10335                 /*Get number of tile parts*/
10336                 tot_num_tp = opj_j2k_get_num_tp(l_cp,pino,p_j2k->m_current_tile_number);
10337                 for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
10338                         p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
10339                         l_current_nb_bytes_written = 0;
10340                         l_part_tile_size = 0;
10341                         l_begin_data = p_data;
10342
10343                         if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {
10344                                 return OPJ_FALSE;
10345                         }
10346
10347                         l_nb_bytes_written += l_current_nb_bytes_written;
10348                         p_data += l_current_nb_bytes_written;
10349                         p_total_data_size -= l_current_nb_bytes_written;
10350                         l_part_tile_size += l_current_nb_bytes_written;
10351
10352                         l_current_nb_bytes_written = 0;
10353
10354                         if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
10355                                 return OPJ_FALSE;
10356                         }
10357
10358                         l_nb_bytes_written += l_current_nb_bytes_written;
10359                         p_data += l_current_nb_bytes_written;
10360                         p_total_data_size -= l_current_nb_bytes_written;
10361                         l_part_tile_size += l_current_nb_bytes_written;
10362
10363                         /* Writing Psot in SOT marker */
10364                         opj_write_bytes(l_begin_data + 6,l_part_tile_size,4);                                   /* PSOT */
10365
10366                         if (OPJ_IS_CINEMA(l_cp->rsiz)) {
10367                                 opj_j2k_update_tlm(p_j2k,l_part_tile_size);
10368                         }
10369
10370                         ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
10371                 }
10372         }
10373
10374         *p_data_written = l_nb_bytes_written;
10375
10376         return OPJ_TRUE;
10377 }
10378
10379 OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k,
10380                                                                     struct opj_stream_private *p_stream,
10381                                                                     struct opj_event_mgr * p_manager )
10382 {
10383         OPJ_UINT32 l_tlm_size;
10384         OPJ_OFF_T l_tlm_position, l_current_position;
10385
10386         /* preconditions */
10387         assert(p_j2k != 00);
10388         assert(p_manager != 00);
10389         assert(p_stream != 00);
10390
10391         l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
10392         l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
10393         l_current_position = opj_stream_tell(p_stream);
10394
10395         if (! opj_stream_seek(p_stream,l_tlm_position,p_manager)) {
10396                 return OPJ_FALSE;
10397         }
10398
10399         if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer,l_tlm_size,p_manager) != l_tlm_size) {
10400                 return OPJ_FALSE;
10401         }
10402
10403         if (! opj_stream_seek(p_stream,l_current_position,p_manager)) {
10404                 return OPJ_FALSE;
10405         }
10406
10407         return OPJ_TRUE;
10408 }
10409
10410 OPJ_BOOL opj_j2k_end_encoding(  opj_j2k_t *p_j2k,
10411                                                         struct opj_stream_private *p_stream,
10412                                                         struct opj_event_mgr * p_manager )
10413 {
10414         /* preconditions */
10415         assert(p_j2k != 00);
10416         assert(p_manager != 00);
10417         assert(p_stream != 00);
10418
10419         opj_tcd_destroy(p_j2k->m_tcd);
10420         p_j2k->m_tcd = 00;
10421
10422         if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
10423                 opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
10424                 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
10425                 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
10426         }
10427
10428         if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
10429                 opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
10430                 p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
10431         }
10432
10433         p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
10434
10435         return OPJ_TRUE;
10436 }
10437
10438 /**
10439  * Destroys the memory associated with the decoding of headers.
10440  */
10441 static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,
10442                                                 opj_stream_private_t *p_stream,
10443                                                 opj_event_mgr_t * p_manager
10444                                                 )
10445 {
10446         /* preconditions */
10447         assert(p_j2k != 00);
10448         assert(p_stream != 00);
10449         assert(p_manager != 00);
10450
10451         if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
10452                 opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
10453                 p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
10454         }
10455
10456         p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
10457
10458         return OPJ_TRUE;
10459 }
10460
10461 OPJ_BOOL opj_j2k_init_info(     opj_j2k_t *p_j2k,
10462                                                 struct opj_stream_private *p_stream,
10463                                                 struct opj_event_mgr * p_manager )
10464 {
10465         opj_codestream_info_t * l_cstr_info = 00;
10466
10467         /* preconditions */
10468         assert(p_j2k != 00);
10469         assert(p_manager != 00);
10470         assert(p_stream != 00);
10471   (void)l_cstr_info;
10472
10473         /* TODO mergeV2: check this part which use cstr_info */
10474         /*l_cstr_info = p_j2k->cstr_info;
10475
10476         if (l_cstr_info)  {
10477                 OPJ_UINT32 compno;
10478                 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));
10479
10480                 l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
10481                 l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
10482
10483                 l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
10484
10485                 l_cstr_info->tw = p_j2k->m_cp.tw;
10486                 l_cstr_info->th = p_j2k->m_cp.th;
10487
10488                 l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/        /* new version parser */
10489                 /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/      /* new version parser */
10490                 /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/     /* new version parser */
10491                 /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/     /* new version parser */
10492
10493                 /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
10494
10495                 l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
10496
10497                 l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
10498
10499                 for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
10500                         l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
10501                 }
10502
10503                 l_cstr_info->D_max = 0.0;       */      /* ADD Marcela */
10504
10505                 /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
10506
10507                 /*l_cstr_info->maxmarknum = 100;
10508                 l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
10509                 l_cstr_info->marknum = 0;
10510         }*/
10511
10512         return opj_j2k_calculate_tp(p_j2k,&(p_j2k->m_cp),&p_j2k->m_specific_param.m_encoder.m_total_tile_parts,p_j2k->m_private_image,p_manager);
10513 }
10514
10515 /**
10516  * Creates a tile-coder decoder.
10517  *
10518  * @param       p_stream                the stream to write data to.
10519  * @param       p_j2k                   J2K codec.
10520  * @param       p_manager               the user event manager.
10521 */
10522 static OPJ_BOOL opj_j2k_create_tcd(     opj_j2k_t *p_j2k,
10523                                                                     opj_stream_private_t *p_stream,
10524                                                                     opj_event_mgr_t * p_manager
10525                                     )
10526 {
10527         /* preconditions */
10528         assert(p_j2k != 00);
10529         assert(p_manager != 00);
10530         assert(p_stream != 00);
10531
10532         p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
10533
10534         if (! p_j2k->m_tcd) {
10535                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
10536                 return OPJ_FALSE;
10537         }
10538
10539         if (!opj_tcd_init(p_j2k->m_tcd,p_j2k->m_private_image,&p_j2k->m_cp)) {
10540                 opj_tcd_destroy(p_j2k->m_tcd);
10541                 p_j2k->m_tcd = 00;
10542                 return OPJ_FALSE;
10543         }
10544
10545         return OPJ_TRUE;
10546 }
10547
10548 OPJ_BOOL opj_j2k_write_tile (opj_j2k_t * p_j2k,
10549                                                  OPJ_UINT32 p_tile_index,
10550                                                  OPJ_BYTE * p_data,
10551                                                  OPJ_UINT32 p_data_size,
10552                                                  opj_stream_private_t *p_stream,
10553                                                  opj_event_mgr_t * p_manager )
10554 {
10555         if (! opj_j2k_pre_write_tile(p_j2k,p_tile_index,p_stream,p_manager)) {
10556                 opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
10557                 return OPJ_FALSE;
10558         }
10559         else {
10560                 OPJ_UINT32 j;
10561                 /* Allocate data */
10562                 for (j=0;j<p_j2k->m_tcd->image->numcomps;++j) {
10563                         opj_tcd_tilecomp_t* l_tilec = p_j2k->m_tcd->tcd_image->tiles->comps + j;
10564
10565                         if(! opj_alloc_tile_component_data(l_tilec)) {
10566                                                                                                         opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data." );
10567                                 return OPJ_FALSE;
10568                         }
10569                 }
10570
10571                 /* now copy data into the the tile component */
10572                 if (! opj_tcd_copy_tile_data(p_j2k->m_tcd,p_data,p_data_size)) {
10573                         opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." );
10574                         return OPJ_FALSE;
10575                 }
10576                 if (! opj_j2k_post_write_tile(p_j2k,p_stream,p_manager)) {
10577                         opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
10578                         return OPJ_FALSE;
10579                 }
10580         }
10581
10582         return OPJ_TRUE;
10583 }