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