[trunk]remove some warnings raised by Wall
[openjpeg.git] / src / lib / openjp2 / jp2.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) 2010-2011, Kaori Hagihara
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 #include "opj_includes.h"
33
34 /** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
35 /*@{*/
36
37 #define BOX_SIZE        1024
38
39 /** @name Local static functions */
40 /*@{*/
41
42 /*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
43
44 /**
45  * Reads a IHDR box - Image Header box
46  *
47  * @param       p_image_header_data                     pointer to actual data (already read from file)
48  * @param       jp2                                                     the jpeg2000 file codec.
49  * @param       p_image_header_size                     the size of the image header
50  * @param       p_manager                                       the user event manager.
51  *
52  * @return      true if the image header is valid, false else.
53  */
54 static opj_bool opj_jp2_read_ihdr(  opj_jp2_t *jp2,
55                                     OPJ_BYTE *p_image_header_data,
56                                     OPJ_UINT32 p_image_header_size,
57                                     opj_event_mgr_t * p_manager );
58
59 /**
60  * Writes the Image Header box - Image Header box.
61  *
62  * @param jp2                                   jpeg2000 file codec.
63  * @param p_nb_bytes_written    pointer to store the nb of bytes written by the function.
64  *
65  * @return      the data being copied.
66 */
67 static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
68                                      OPJ_UINT32 * p_nb_bytes_written );
69
70 /**
71  * Writes the Bit per Component box.
72  *
73  * @param       jp2                                             jpeg2000 file codec.
74  * @param       p_nb_bytes_written              pointer to store the nb of bytes written by the function.
75  *
76  * @return      the data being copied.
77 */
78 static OPJ_BYTE * opj_jp2_write_bpcc(   opj_jp2_t *jp2,
79                                                                         OPJ_UINT32 * p_nb_bytes_written );
80
81 /**
82  * Reads a Bit per Component box.
83  *
84  * @param       p_bpc_header_data                       pointer to actual data (already read from file)
85  * @param       jp2                                                     the jpeg2000 file codec.
86  * @param       p_bpc_header_size                       the size of the bpc header
87  * @param       p_manager                                       the user event manager.
88  *
89  * @return      true if the bpc header is valid, fale else.
90  */
91 static opj_bool opj_jp2_read_bpcc(  opj_jp2_t *jp2,
92                                     OPJ_BYTE * p_bpc_header_data,
93                                     OPJ_UINT32 p_bpc_header_size,
94                                     opj_event_mgr_t * p_manager );
95
96 static opj_bool opj_jp2_read_cdef(      opj_jp2_t * jp2,
97                                     OPJ_BYTE * p_cdef_header_data,
98                                                                         OPJ_UINT32 p_cdef_header_size,
99                                                                         opj_event_mgr_t * p_manager );
100
101 static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color);
102
103 /**
104  * Writes the Colour Specification box.
105  *
106  * @param jp2                                   jpeg2000 file codec.
107  * @param p_nb_bytes_written    pointer to store the nb of bytes written by the function.
108  *
109  * @return      the data being copied.
110 */
111 static OPJ_BYTE * opj_jp2_write_colr(   opj_jp2_t *jp2,
112                                                                             OPJ_UINT32 * p_nb_bytes_written );
113
114 /**
115  * Writes a FTYP box - File type box
116  *
117  * @param       cio                     the stream to write data to.
118  * @param       jp2                     the jpeg2000 file codec.
119  * @param       p_manager       the user event manager.
120  *
121  * @return      true if writing was successful.
122  */
123 static opj_bool opj_jp2_write_ftyp(     opj_jp2_t *jp2,
124                                                                         opj_stream_private_t *cio,
125                                                                         opj_event_mgr_t * p_manager );
126
127 /**
128  * Reads a a FTYP box - File type box
129  *
130  * @param       p_header_data   the data contained in the FTYP box.
131  * @param       jp2                             the jpeg2000 file codec.
132  * @param       p_header_size   the size of the data contained in the FTYP box.
133  * @param       p_manager               the user event manager.
134  *
135  * @return true if the FTYP box is valid.
136  */
137 static opj_bool opj_jp2_read_ftyp(      opj_jp2_t *jp2,
138                                                                         OPJ_BYTE * p_header_data,
139                                                                         OPJ_UINT32 p_header_size,
140                                                                         opj_event_mgr_t * p_manager );
141
142 opj_bool opj_jp2_skip_jp2c(     opj_jp2_t *jp2,
143                                                     opj_stream_private_t *cio,
144                                                     opj_event_mgr_t * p_manager );
145
146 /**
147  * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
148  *
149  * @param       p_header_data   the data contained in the file header box.
150  * @param       jp2                             the jpeg2000 file codec.
151  * @param       p_header_size   the size of the data contained in the file header box.
152  * @param       p_manager               the user event manager.
153  *
154  * @return true if the JP2 Header box was successfully reconized.
155 */
156 static opj_bool opj_jp2_read_jp2h(  opj_jp2_t *jp2,
157                                     OPJ_BYTE *p_header_data,
158                                     OPJ_UINT32 p_header_size,
159                                     opj_event_mgr_t * p_manager );
160
161 /**
162  * Writes the Jpeg2000 codestream Header box - JP2C Header box. This function must be called AFTER the coding has been done.
163  *
164  * @param       cio                     the stream to write data to.
165  * @param       jp2                     the jpeg2000 file codec.
166  * @param       p_manager       user event manager.
167  *
168  * @return true if writing was successful.
169 */
170 static opj_bool opj_jp2_write_jp2c(     opj_jp2_t *jp2,
171                                                                     opj_stream_private_t *cio,
172                                                                     opj_event_mgr_t * p_manager );
173
174 /**
175  * Reads a jpeg2000 file signature box.
176  *
177  * @param       p_header_data   the data contained in the signature box.
178  * @param       jp2                             the jpeg2000 file codec.
179  * @param       p_header_size   the size of the data contained in the signature box.
180  * @param       p_manager               the user event manager.
181  *
182  * @return true if the file signature box is valid.
183  */
184 static opj_bool opj_jp2_read_jp(opj_jp2_t *jp2,
185                                 OPJ_BYTE * p_header_data,
186                                 OPJ_UINT32 p_header_size,
187                                 opj_event_mgr_t * p_manager);
188
189 /**
190  * Writes a jpeg2000 file signature box.
191  *
192  * @param cio the stream to write data to.
193  * @param       jp2                     the jpeg2000 file codec.
194  * @param p_manager the user event manager.
195  *
196  * @return true if writing was successful.
197  */
198 static opj_bool opj_jp2_write_jp(       opj_jp2_t *jp2,
199                                                     opj_stream_private_t *cio,
200                                                         opj_event_mgr_t * p_manager );
201
202 /**
203 Apply collected palette data
204 @param color Collector for profile, cdef and pclr data
205 @param image
206 */
207 static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color);
208
209 static void opj_jp2_free_pclr(opj_jp2_color_t *color);
210
211 /**
212  * Collect palette data
213  *
214  * @param jp2 JP2 handle
215  * @param p_pclr_header_data    FIXME DOC
216  * @param p_pclr_header_size    FIXME DOC
217  * @param p_manager
218  *
219  * @return Returns true if successful, returns false otherwise
220 */
221 static opj_bool opj_jp2_read_pclr(      opj_jp2_t *jp2,
222                                     OPJ_BYTE * p_pclr_header_data,
223                                     OPJ_UINT32 p_pclr_header_size,
224                                     opj_event_mgr_t * p_manager );
225
226 /**
227  * Collect component mapping data
228  *
229  * @param jp2                 JP2 handle
230  * @param p_cmap_header_data  FIXME DOC
231  * @param p_cmap_header_size  FIXME DOC
232  * @param p_manager           FIXME DOC
233  *
234  * @return Returns true if successful, returns false otherwise
235 */
236
237 static opj_bool opj_jp2_read_cmap(      opj_jp2_t * jp2,
238                                     OPJ_BYTE * p_cmap_header_data,
239                                     OPJ_UINT32 p_cmap_header_size,
240                                     opj_event_mgr_t * p_manager );
241
242 /**
243  * Reads the Color Specification box.
244  *
245  * @param       p_colr_header_data                      pointer to actual data (already read from file)
246  * @param       jp2                                                     the jpeg2000 file codec.
247  * @param       p_colr_header_size                      the size of the color header
248  * @param       p_manager                                       the user event manager.
249  *
250  * @return      true if the bpc header is valid, fale else.
251 */
252 static opj_bool opj_jp2_read_colr(  opj_jp2_t *jp2,
253                                     OPJ_BYTE * p_colr_header_data,
254                                     OPJ_UINT32 p_colr_header_size,
255                                     opj_event_mgr_t * p_manager );
256
257 /*@}*/
258
259 /*@}*/
260
261 /**
262  * Sets up the procedures to do on writing header after the codestream.
263  * Developpers wanting to extend the library can add their own writing procedures.
264  */
265 static void opj_jp2_setup_end_header_writing (opj_jp2_t *jp2);
266
267 /**
268  * Sets up the procedures to do on reading header after the codestream.
269  * Developpers wanting to extend the library can add their own writing procedures.
270  */
271 static void opj_jp2_setup_end_header_reading (opj_jp2_t *jp2);
272
273 /**
274  * Reads a jpeg2000 file header structure.
275  *
276  * @param jp2 the jpeg2000 file header structure.
277  * @param stream the stream to read data from.
278  * @param p_manager the user event manager.
279  *
280  * @return true if the box is valid.
281  */
282 static opj_bool opj_jp2_read_header_procedure(  opj_jp2_t *jp2,
283                                                 opj_stream_private_t *stream,
284                                                 opj_event_mgr_t * p_manager );
285
286 /**
287  * Excutes the given procedures on the given codec.
288  *
289  * @param       p_procedure_list        the list of procedures to execute
290  * @param       jp2                                     the jpeg2000 file codec to execute the procedures on.
291  * @param       stream                                  the stream to execute the procedures on.
292  * @param       p_manager                       the user manager.
293  *
294  * @return      true                            if all the procedures were successfully executed.
295  */
296 static opj_bool opj_jp2_exec (  opj_jp2_t * jp2,
297                                 opj_procedure_list_t * p_procedure_list,
298                                 opj_stream_private_t *stream,
299                                 opj_event_mgr_t * p_manager );
300
301 /**
302  * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure.
303  *
304  * @param       cio                                             the input stream to read data from.
305  * @param       box                                             the box structure to fill.
306  * @param       p_number_bytes_read             pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
307  * @param       p_manager                               user event manager.
308  *
309  * @return      true if the box is reconized, false otherwise
310 */
311 static opj_bool opj_jp2_read_boxhdr(opj_jp2_box_t *box,
312                                     OPJ_UINT32 * p_number_bytes_read,
313                                     opj_stream_private_t *cio,
314                                     opj_event_mgr_t * p_manager);
315
316 /**
317  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
318  * are valid. Developpers wanting to extend the library can add their own validation procedures.
319  */
320 static void opj_jp2_setup_encoding_validation (opj_jp2_t *jp2);
321
322 /**
323  * Sets up the procedures to do on writing header. Developpers wanting to extend the library can add their own writing procedures.
324  */
325 static void opj_jp2_setup_header_writing (opj_jp2_t *jp2);
326
327 opj_bool opj_jp2_default_validation (   opj_jp2_t * jp2,
328                                         opj_stream_private_t *cio,
329                                         opj_event_mgr_t * p_manager );
330
331 /**
332  * Finds the image execution function related to the given box id.
333  *
334  * @param       p_id    the id of the handler to fetch.
335  *
336  * @return      the given handler or NULL if it could not be found.
337  */
338 static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id);
339
340 /**
341  * Finds the execution function related to the given box id.
342  *
343  * @param       p_id    the id of the handler to fetch.
344  *
345  * @return      the given handler or NULL if it could not be found.
346  */
347 static const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id );
348
349 const opj_jp2_header_handler_t jp2_header [] =
350 {
351         {JP2_JP,opj_jp2_read_jp},
352         {JP2_FTYP,opj_jp2_read_ftyp},
353         {JP2_JP2H,opj_jp2_read_jp2h}
354 };
355
356 const opj_jp2_header_handler_t jp2_img_header [] =
357 {
358         {JP2_IHDR,opj_jp2_read_ihdr},
359         {JP2_COLR,opj_jp2_read_colr},
360         {JP2_BPCC,opj_jp2_read_bpcc},
361         {JP2_PCLR,opj_jp2_read_pclr},
362         {JP2_CMAP,opj_jp2_read_cmap},
363         {JP2_CDEF,opj_jp2_read_cdef}
364
365 };
366
367 /**
368  * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure. Data is read from a character string
369  *
370  * @param       box                                             the box structure to fill.
371  * @param       p_data                                  the character string to read data from.
372  * @param       p_number_bytes_read             pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
373  * @param       p_box_max_size                  the maximum number of bytes in the box.
374  * @param       p_manager         FIXME DOC
375  *
376  * @return      true if the box is reconized, false otherwise
377 */
378 static opj_bool opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,
379                                             OPJ_BYTE * p_data,
380                                             OPJ_UINT32 * p_number_bytes_read,
381                                             OPJ_UINT32 p_box_max_size,
382                                             opj_event_mgr_t * p_manager );
383
384 /**
385  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
386  * are valid. Developpers wanting to extend the library can add their own validation procedures.
387  */
388 static void opj_jp2_setup_decoding_validation (opj_jp2_t *jp2);
389
390 /**
391  * Sets up the procedures to do on reading header.
392  * Developpers wanting to extend the library can add their own writing procedures.
393  */
394 static void opj_jp2_setup_header_reading (opj_jp2_t *jp2);
395
396 /* ----------------------------------------------------------------------- */
397
398  opj_bool opj_jp2_read_boxhdr(opj_jp2_box_t *box,
399                                     OPJ_UINT32 * p_number_bytes_read,
400                                     opj_stream_private_t *cio,
401                                     opj_event_mgr_t * p_manager
402                                     )
403 {
404         /* read header from file */
405         OPJ_BYTE l_data_header [8];
406
407         /* preconditions */
408         assert(cio != 00);
409         assert(box != 00);
410         assert(p_number_bytes_read != 00);
411         assert(p_manager != 00);
412
413         *p_number_bytes_read = opj_stream_read_data(cio,l_data_header,8,p_manager);
414         if (*p_number_bytes_read != 8) {
415                 return OPJ_FALSE;
416         }
417
418         /* process read data */
419         opj_read_bytes(l_data_header,&(box->length), 4);
420         opj_read_bytes(l_data_header+4,&(box->type), 4);
421
422         /* do we have a "special very large box ?" */
423         /* read then the XLBox */
424         if (box->length == 1) {
425                 OPJ_UINT32 l_xl_part_size;
426
427                 OPJ_UINT32 l_nb_bytes_read = opj_stream_read_data(cio,l_data_header,8,p_manager);
428                 if (l_nb_bytes_read != 8) {
429                         if (l_nb_bytes_read > 0) {
430                                 *p_number_bytes_read += l_nb_bytes_read;
431                         }
432
433                         return OPJ_FALSE;
434                 }
435
436                 opj_read_bytes(l_data_header,&l_xl_part_size, 4);
437                 if (l_xl_part_size != 0) {
438                         opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
439                         return OPJ_FALSE;
440                 }
441                 opj_read_bytes(l_data_header,&(box->length), 4);
442         }
443         return OPJ_TRUE;
444 }
445
446 #if 0
447 static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
448         OPJ_UINT32 i;
449         opj_jp2_box_t box;
450
451         box.init_pos = cio_tell(cio);
452         cio_skip(cio, 4);
453         cio_write(cio, JP2_URL, 4);     /* DBTL */
454         cio_write(cio, 0, 1);           /* VERS */
455         cio_write(cio, 0, 3);           /* FLAG */
456
457         if(Idx_file) {
458                 for (i = 0; i < strlen(Idx_file); i++) {
459                         cio_write(cio, Idx_file[i], 1);
460                 }
461         }
462
463         box.length = cio_tell(cio) - box.init_pos;
464         cio_seek(cio, box.init_pos);
465         cio_write(cio, box.length, 4);  /* L */
466         cio_seek(cio, box.init_pos + box.length);
467 }
468 #endif
469
470 opj_bool opj_jp2_read_ihdr( opj_jp2_t *jp2,
471                             OPJ_BYTE *p_image_header_data,
472                             OPJ_UINT32 p_image_header_size,
473                             opj_event_mgr_t * p_manager )
474 {
475         /* preconditions */
476         assert(p_image_header_data != 00);
477         assert(jp2 != 00);
478         assert(p_manager != 00);
479
480         if (p_image_header_size != 14) {
481                 opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
482                 return OPJ_FALSE;
483         }
484
485         opj_read_bytes(p_image_header_data,&(jp2->h),4);                        /* HEIGHT */
486         p_image_header_data += 4;
487         opj_read_bytes(p_image_header_data,&(jp2->w),4);                        /* WIDTH */
488         p_image_header_data += 4;
489         opj_read_bytes(p_image_header_data,&(jp2->numcomps),2);         /* NC */
490         p_image_header_data += 2;
491
492         /* allocate memory for components */
493         jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
494         if (jp2->comps == 0) {
495                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n");
496                 return OPJ_FALSE;
497         }
498         memset(jp2->comps,0,jp2->numcomps * sizeof(opj_jp2_comps_t));
499
500         opj_read_bytes(p_image_header_data,&(jp2->bpc),1);                      /* BPC */
501         ++ p_image_header_data;
502
503         opj_read_bytes(p_image_header_data,&(jp2->C),1);                        /* C */
504         ++ p_image_header_data;
505
506         /* Should be equal to 7 cf. chapter about image header box of the norm */
507         if (jp2->C != 7){
508                 opj_event_msg(p_manager, EVT_INFO, "JP2 IHDR box: compression type indicate that the file is not a conforming JP2 file (%d) \n", jp2->C);
509         }
510
511         opj_read_bytes(p_image_header_data,&(jp2->UnkC),1);                     /* UnkC */
512         ++ p_image_header_data;
513         opj_read_bytes(p_image_header_data,&(jp2->IPR),1);                      /* IPR */
514         ++ p_image_header_data;
515
516         return OPJ_TRUE;
517 }
518
519 OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
520                               OPJ_UINT32 * p_nb_bytes_written
521                               )
522 {
523         OPJ_BYTE * l_ihdr_data,* l_current_ihdr_ptr;
524         
525         /* preconditions */
526         assert(jp2 != 00);
527         assert(p_nb_bytes_written != 00);
528
529         /* default image header is 22 bytes wide */
530         l_ihdr_data = (OPJ_BYTE *) opj_malloc(22);
531         if (l_ihdr_data == 00) {
532                 return 00;
533         }
534         memset(l_ihdr_data,0,22);
535
536         l_current_ihdr_ptr = l_ihdr_data;
537         
538         opj_write_bytes(l_current_ihdr_ptr,22,4);                               /* write box size */
539         l_current_ihdr_ptr+=4;
540
541         opj_write_bytes(l_current_ihdr_ptr,JP2_IHDR, 4);                /* IHDR */
542         l_current_ihdr_ptr+=4;
543         
544         opj_write_bytes(l_current_ihdr_ptr,jp2->h, 4);          /* HEIGHT */
545         l_current_ihdr_ptr+=4;
546         
547         opj_write_bytes(l_current_ihdr_ptr, jp2->w, 4);         /* WIDTH */
548         l_current_ihdr_ptr+=4;
549         
550         opj_write_bytes(l_current_ihdr_ptr, jp2->numcomps, 2);          /* NC */
551         l_current_ihdr_ptr+=2;
552         
553         opj_write_bytes(l_current_ihdr_ptr, jp2->bpc, 1);               /* BPC */
554         ++l_current_ihdr_ptr;
555         
556         opj_write_bytes(l_current_ihdr_ptr, jp2->C, 1);         /* C : Always 7 */
557         ++l_current_ihdr_ptr;
558         
559         opj_write_bytes(l_current_ihdr_ptr, jp2->UnkC, 1);              /* UnkC, colorspace unknown */
560         ++l_current_ihdr_ptr;
561         
562         opj_write_bytes(l_current_ihdr_ptr, jp2->IPR, 1);               /* IPR, no intellectual property */
563         ++l_current_ihdr_ptr;
564         
565         *p_nb_bytes_written = 22;
566         
567         return l_ihdr_data;
568 }
569
570 OPJ_BYTE * opj_jp2_write_bpcc(  opj_jp2_t *jp2,
571                                                         OPJ_UINT32 * p_nb_bytes_written
572                                 )
573 {
574         OPJ_UINT32 i;
575         /* room for 8 bytes for box and 1 byte for each component */
576         OPJ_INT32 l_bpcc_size = 8 + jp2->numcomps;
577         OPJ_BYTE * l_bpcc_data,* l_current_bpcc_ptr;
578         
579         /* preconditions */
580         assert(jp2 != 00);
581         assert(p_nb_bytes_written != 00);
582
583         l_bpcc_data = (OPJ_BYTE *) opj_malloc(l_bpcc_size);
584         if (l_bpcc_data == 00) {
585                 return 00;
586         }
587         memset(l_bpcc_data,0,l_bpcc_size);
588
589         l_current_bpcc_ptr = l_bpcc_data;
590
591         opj_write_bytes(l_current_bpcc_ptr,l_bpcc_size,4);                              /* write box size */
592         l_current_bpcc_ptr += 4;
593         
594         opj_write_bytes(l_current_bpcc_ptr,JP2_BPCC,4);                                 /* BPCC */
595         l_current_bpcc_ptr += 4;
596
597         for (i = 0; i < jp2->numcomps; ++i)  {
598                 opj_write_bytes(l_current_bpcc_ptr, jp2->comps[i].bpcc, 1); /* write each component information */
599                 ++l_current_bpcc_ptr;
600         }
601
602         *p_nb_bytes_written = l_bpcc_size;
603         
604         return l_bpcc_data;
605 }
606
607 opj_bool opj_jp2_read_bpcc( opj_jp2_t *jp2,
608                             OPJ_BYTE * p_bpc_header_data,
609                             OPJ_UINT32 p_bpc_header_size,
610                             opj_event_mgr_t * p_manager
611                             )
612 {
613         OPJ_UINT32 i;
614
615         /* preconditions */
616         assert(p_bpc_header_data != 00);
617         assert(jp2 != 00);
618         assert(p_manager != 00);
619
620         
621         if (jp2->bpc != 255 ){
622                 opj_event_msg(p_manager, EVT_WARNING, "A BPCC header box is available although BPC given by the IHDR box (%d) indicate components bit depth is constant\n",jp2->bpc);
623         }
624
625         /* and length is relevant */
626         if (p_bpc_header_size != jp2->numcomps) {
627                 opj_event_msg(p_manager, EVT_ERROR, "Bad BPCC header box (bad size)\n");
628                 return OPJ_FALSE;
629         }
630
631         /* read info for each component */
632         for (i = 0; i < jp2->numcomps; ++i) {
633                 opj_read_bytes(p_bpc_header_data,&jp2->comps[i].bpcc ,1);       /* read each BPCC component */
634                 ++p_bpc_header_data;
635         }
636
637         return OPJ_TRUE;
638 }
639
640 OPJ_BYTE * opj_jp2_write_colr(  opj_jp2_t *jp2,
641                                                             OPJ_UINT32 * p_nb_bytes_written
642                                 )
643 {
644         /* room for 8 bytes for box 3 for common data and variable upon profile*/
645         OPJ_UINT32 l_colr_size = 11;
646         OPJ_BYTE * l_colr_data,* l_current_colr_ptr;
647         
648         /* preconditions */
649         assert(jp2 != 00);
650         assert(p_nb_bytes_written != 00);
651
652         switch (jp2->meth) {
653                 case 1 :
654                         l_colr_size += 4;
655                         break;
656                 case 2 :
657                         ++l_colr_size;
658                         break;
659                 default :
660                         return 00;
661         }
662
663         l_colr_data = (OPJ_BYTE *) opj_malloc(l_colr_size);
664         if (l_colr_data == 00) {
665                 return 00;
666         }
667         memset(l_colr_data,0,l_colr_size);
668         
669         l_current_colr_ptr = l_colr_data;
670
671         opj_write_bytes(l_current_colr_ptr,l_colr_size,4);                              /* write box size */
672         l_current_colr_ptr += 4;
673         
674         opj_write_bytes(l_current_colr_ptr,JP2_COLR,4);                                 /* BPCC */
675         l_current_colr_ptr += 4;
676         
677         opj_write_bytes(l_current_colr_ptr, jp2->meth,1);                               /* METH */
678         ++l_current_colr_ptr;
679         
680         opj_write_bytes(l_current_colr_ptr, jp2->precedence,1);                 /* PRECEDENCE */
681         ++l_current_colr_ptr;
682         
683         opj_write_bytes(l_current_colr_ptr, jp2->approx,1);                             /* APPROX */
684         ++l_current_colr_ptr;
685         
686         if (jp2->meth == 1) {
687                 opj_write_bytes(l_current_colr_ptr, jp2->enumcs,4);                     /* EnumCS */
688         }
689         else {
690                 opj_write_bytes(l_current_colr_ptr, 0, 1);                                      /* PROFILE (??) */
691         }
692
693         *p_nb_bytes_written = l_colr_size;
694         
695         return l_colr_data;
696 }
697
698 void opj_jp2_free_pclr(opj_jp2_color_t *color)
699 {
700     opj_free(color->jp2_pclr->channel_sign);
701     opj_free(color->jp2_pclr->channel_size);
702     opj_free(color->jp2_pclr->entries);
703
704         if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
705
706     opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
707 }
708
709 void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
710 {
711         opj_image_comp_t *old_comps, *new_comps;
712         OPJ_BYTE *channel_size, *channel_sign;
713         OPJ_UINT32 *entries;
714         opj_jp2_cmap_comp_t *cmap;
715         OPJ_INT32 *src, *dst;
716         OPJ_UINT32 j, max;
717         OPJ_UINT16 i, nr_channels, cmp, pcol;
718         OPJ_INT32 k, top_k;
719
720         channel_size = color->jp2_pclr->channel_size;
721         channel_sign = color->jp2_pclr->channel_sign;
722         entries = color->jp2_pclr->entries;
723         cmap = color->jp2_pclr->cmap;
724         nr_channels = color->jp2_pclr->nr_channels;
725
726         old_comps = image->comps;
727         new_comps = (opj_image_comp_t*)
728                         opj_malloc(nr_channels * sizeof(opj_image_comp_t));
729
730         for(i = 0; i < nr_channels; ++i) {
731                 pcol = cmap[i].pcol; cmp = cmap[i].cmp;
732
733                 new_comps[pcol] = old_comps[cmp];
734
735                 /* Direct use */
736                 if(cmap[i].mtyp == 0){
737                         old_comps[cmp].data = NULL; continue;
738                 }
739
740                 /* Palette mapping: */
741                 new_comps[pcol].data = (OPJ_INT32*)
742                                 opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));
743                 new_comps[pcol].prec = channel_size[i];
744                 new_comps[pcol].sgnd = channel_sign[i];
745         }
746
747         top_k = color->jp2_pclr->nr_entries - 1;
748
749         for(i = 0; i < nr_channels; ++i) {
750                 /* Direct use: */
751                 if(cmap[i].mtyp == 0) continue;
752
753                 /* Palette mapping: */
754                 cmp = cmap[i].cmp; pcol = cmap[i].pcol;
755                 src = old_comps[cmp].data;
756                 dst = new_comps[pcol].data;
757                 max = new_comps[pcol].w * new_comps[pcol].h;
758
759                 for(j = 0; j < max; ++j)
760                 {
761                         /* The index */
762                         if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;
763
764                         /* The colour */
765                         dst[j] = entries[k * nr_channels + pcol];
766                 }
767         }
768
769         max = image->numcomps;
770         for(i = 0; i < max; ++i) {
771                 if(old_comps[i].data) opj_free(old_comps[i].data);
772         }
773
774         opj_free(old_comps);
775         image->comps = new_comps;
776         image->numcomps = nr_channels;
777
778         opj_jp2_free_pclr(color);
779
780 }/* apply_pclr() */
781
782 opj_bool opj_jp2_read_pclr(     opj_jp2_t *jp2,
783                             OPJ_BYTE * p_pclr_header_data,
784                             OPJ_UINT32 p_pclr_header_size,
785                             opj_event_mgr_t * p_manager
786                             )
787 {
788         opj_jp2_pclr_t *jp2_pclr;
789         OPJ_BYTE *channel_size, *channel_sign;
790         OPJ_UINT32 *entries;
791         OPJ_UINT16 nr_entries,nr_channels;
792         OPJ_UINT16 i, j;
793         OPJ_UINT32 l_value;
794
795         /* preconditions */
796         assert(p_pclr_header_data != 00);
797         assert(jp2 != 00);
798         assert(p_manager != 00);
799     (void)p_pclr_header_size;
800
801         if(jp2->color.jp2_pclr)
802                 return OPJ_FALSE;
803
804         opj_read_bytes(p_pclr_header_data, &l_value , 2);       /* NE */
805         p_pclr_header_data += 2;
806         nr_entries = (OPJ_UINT16) l_value;
807
808         opj_read_bytes(p_pclr_header_data, &l_value , 1);       /* NPC */
809         ++p_pclr_header_data;
810         nr_channels = (OPJ_UINT16) l_value;
811
812         entries = (OPJ_UINT32*) opj_malloc(nr_channels * nr_entries * sizeof(OPJ_UINT32));
813         channel_size = (OPJ_BYTE*) opj_malloc(nr_channels);
814         channel_sign = (OPJ_BYTE*) opj_malloc(nr_channels);
815
816         jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
817         jp2_pclr->channel_sign = channel_sign;
818         jp2_pclr->channel_size = channel_size;
819         jp2_pclr->entries = entries;
820         jp2_pclr->nr_entries = nr_entries;
821         jp2_pclr->nr_channels = (OPJ_BYTE) l_value;
822         jp2_pclr->cmap = NULL;
823
824         jp2->color.jp2_pclr = jp2_pclr;
825
826         for(i = 0; i < nr_channels; ++i) {
827                 opj_read_bytes(p_pclr_header_data, &l_value , 1);       /* Bi */
828                 ++p_pclr_header_data;
829
830                 channel_size[i] = (l_value & 0x7f) + 1;
831                 channel_sign[i] = (l_value & 0x80)? 1 : 0;
832         }
833
834         for(j = 0; j < nr_entries; ++j) {
835                 for(i = 0; i < nr_channels; ++i) {
836                         OPJ_INT32 bytes_to_read = (channel_size[i]+7)>>3;
837
838                         opj_read_bytes(p_pclr_header_data, &l_value , bytes_to_read);   /* Cji */
839                         p_pclr_header_data += bytes_to_read;
840                         *entries = (OPJ_UINT32) l_value;
841                         entries++;
842                 }
843         }
844
845         return OPJ_TRUE;
846 }
847
848 opj_bool opj_jp2_read_cmap(     opj_jp2_t * jp2,
849                             OPJ_BYTE * p_cmap_header_data,
850                             OPJ_UINT32 p_cmap_header_size,
851                             opj_event_mgr_t * p_manager
852                             )
853 {
854         opj_jp2_cmap_comp_t *cmap;
855         OPJ_BYTE i, nr_channels;
856         OPJ_UINT32 l_value;
857
858         /* preconditions */
859         assert(jp2 != 00);
860         assert(p_cmap_header_data != 00);
861         assert(p_manager != 00);
862   (void)p_cmap_header_size;
863
864         /* Need nr_channels: */
865         if(jp2->color.jp2_pclr == NULL) {
866                 opj_event_msg(p_manager, EVT_ERROR, "Need to read a PCLR box before the CMAP box.\n");
867                 return OPJ_FALSE;
868         }
869
870         /* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
871          * inside a JP2 Header box' :
872         */
873         if(jp2->color.jp2_pclr->cmap) {
874                 opj_event_msg(p_manager, EVT_ERROR, "Only one CMAP box is allowed.\n");
875                 return OPJ_FALSE;
876         }
877
878         nr_channels = jp2->color.jp2_pclr->nr_channels;
879         cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
880
881         for(i = 0; i < nr_channels; ++i) {
882                 opj_read_bytes(p_cmap_header_data, &l_value, 2);                        /* CMP^i */
883                 p_cmap_header_data +=2;
884                 cmap[i].cmp = (OPJ_UINT16) l_value;
885
886                 opj_read_bytes(p_cmap_header_data, &l_value, 1);                        /* MTYP^i */
887                 ++p_cmap_header_data;
888                 cmap[i].mtyp = (OPJ_BYTE) l_value;
889
890                 opj_read_bytes(p_cmap_header_data, &l_value, 1);                        /* PCOL^i */
891                 ++p_cmap_header_data;
892                 cmap[i].pcol = (OPJ_BYTE) l_value;
893         }
894
895         jp2->color.jp2_pclr->cmap = cmap;
896
897         return OPJ_TRUE;
898 }
899
900 void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)
901 {
902         opj_jp2_cdef_info_t *info;
903         OPJ_UINT16 i, n, cn, asoc, acn;
904
905         info = color->jp2_cdef->info;
906         n = color->jp2_cdef->n;
907
908         for(i = 0; i < n; ++i)
909         {
910                 /* WATCH: acn = asoc - 1 ! */
911                 if((asoc = info[i].asoc) == 0) continue;
912
913                 cn = info[i].cn; 
914         acn = asoc - 1;
915
916                 if(cn != acn)
917                 {
918                         opj_image_comp_t saved;
919
920                         memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
921                         memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
922                         memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
923
924                         info[i].asoc = cn + 1;
925                         info[acn].asoc = info[acn].cn + 1;
926                 }
927         }
928
929         if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
930
931         opj_free(color->jp2_cdef); color->jp2_cdef = NULL;
932
933 }/* jp2_apply_cdef() */
934
935 opj_bool opj_jp2_read_cdef(     opj_jp2_t * jp2,
936                             OPJ_BYTE * p_cdef_header_data,
937                                                         OPJ_UINT32 p_cdef_header_size,
938                                                         opj_event_mgr_t * p_manager
939                             )
940 {
941         opj_jp2_cdef_info_t *cdef_info;
942         OPJ_UINT16 i;
943         OPJ_UINT32 l_value;
944
945         /* preconditions */
946         assert(jp2 != 00);
947         assert(p_cdef_header_data != 00);
948         assert(p_manager != 00);
949     (void)p_cdef_header_size;
950
951         /* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
952          * inside a JP2 Header box.'*/
953         if(jp2->color.jp2_cdef) return OPJ_FALSE;
954
955         opj_read_bytes(p_cdef_header_data,&l_value ,2);                 /* N */
956         p_cdef_header_data+= 2;
957
958         if ( (OPJ_UINT16)l_value == 0){ /* szukw000: FIXME */
959                 opj_event_msg(p_manager, EVT_ERROR, "Number of channel description is equal to zero in CDEF box.\n");
960                 return OPJ_FALSE;
961         }
962
963         cdef_info = (opj_jp2_cdef_info_t*) opj_malloc(l_value * sizeof(opj_jp2_cdef_info_t));
964
965         jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
966         jp2->color.jp2_cdef->info = cdef_info;
967         jp2->color.jp2_cdef->n = (OPJ_UINT16) l_value;
968
969         for(i = 0; i < jp2->color.jp2_cdef->n; ++i) {
970                 opj_read_bytes(p_cdef_header_data, &l_value, 2);                        /* Cn^i */
971                 p_cdef_header_data +=2;
972                 cdef_info[i].cn = (OPJ_UINT16) l_value;
973
974                 opj_read_bytes(p_cdef_header_data, &l_value, 2);                        /* Typ^i */
975                 p_cdef_header_data +=2;
976                 cdef_info[i].typ = (OPJ_UINT16) l_value;
977
978                 opj_read_bytes(p_cdef_header_data, &l_value, 2);                        /* Asoc^i */
979                 p_cdef_header_data +=2;
980                 cdef_info[i].asoc = (OPJ_UINT16) l_value;
981    }
982
983         return OPJ_TRUE;
984 }
985
986 opj_bool opj_jp2_read_colr( opj_jp2_t *jp2,
987                             OPJ_BYTE * p_colr_header_data,
988                             OPJ_UINT32 p_colr_header_size,
989                             opj_event_mgr_t * p_manager
990                             )
991 {
992         OPJ_UINT32 l_value;
993
994         /* preconditions */
995         assert(jp2 != 00);
996         assert(p_colr_header_data != 00);
997         assert(p_manager != 00);
998
999         if (p_colr_header_size < 3) {
1000                 opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size)\n");
1001                 return OPJ_FALSE;
1002         }
1003
1004         /* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
1005          * Specification boxes after the first.'
1006         */
1007         if(jp2->color.jp2_has_colr) {
1008                 opj_event_msg(p_manager, EVT_INFO, "A conforming JP2 reader shall ignore all Colour Specification boxes after the first, so we ignore this one.\n");
1009                 p_colr_header_data += p_colr_header_size;
1010                 return OPJ_TRUE;
1011         }
1012
1013         opj_read_bytes(p_colr_header_data,&jp2->meth ,1);                       /* METH */
1014         ++p_colr_header_data;
1015
1016         opj_read_bytes(p_colr_header_data,&jp2->precedence ,1);         /* PRECEDENCE */
1017         ++p_colr_header_data;
1018
1019         opj_read_bytes(p_colr_header_data,&jp2->approx ,1);                     /* APPROX */
1020         ++p_colr_header_data;
1021
1022         if (jp2->meth == 1) {
1023                 if (p_colr_header_size != 7) {
1024                         opj_event_msg(p_manager, EVT_ERROR, "Bad BPCC header box (bad size)\n");
1025                         return OPJ_FALSE;
1026                 }
1027
1028                 opj_read_bytes(p_colr_header_data,&jp2->enumcs ,4);                     /* EnumCS */
1029         }
1030         else if (jp2->meth == 2) {
1031                 /* ICC profile */
1032                 OPJ_INT32 it_icc_value = 0;
1033                 OPJ_INT32 icc_len = p_colr_header_size - 3;
1034
1035                 jp2->color.icc_profile_len = icc_len;
1036                 jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_malloc(icc_len);
1037
1038                 memset(jp2->color.icc_profile_buf, 0, icc_len * sizeof(OPJ_BYTE));
1039
1040                 for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value)
1041                 {
1042                         opj_read_bytes(p_colr_header_data,&l_value,1);          /* icc values */
1043                         ++p_colr_header_data;
1044                         jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_value;
1045                 }
1046
1047         }
1048         else 
1049                 opj_event_msg(p_manager, EVT_INFO, "COLR BOX meth value is not a regular value (%d), so we will skip the fields following the approx field.\n", jp2->meth);
1050
1051         jp2->color.jp2_has_colr = 1;
1052
1053         return OPJ_TRUE;
1054 }
1055
1056 opj_bool opj_jp2_decode(opj_jp2_t *jp2,
1057                         opj_stream_private_t *p_stream,
1058                         opj_image_t* p_image,
1059                         opj_event_mgr_t * p_manager)
1060 {
1061         if (!p_image)
1062                 return OPJ_FALSE;
1063
1064         /* J2K decoding */
1065         if( ! opj_j2k_decode(jp2->j2k, p_stream, p_image, p_manager) ) {
1066                 opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
1067                 return OPJ_FALSE;
1068         }
1069
1070     if (!jp2->ignore_pclr_cmap_cdef){
1071
1072             /* Set Image Color Space */
1073             if (jp2->enumcs == 16)
1074                     p_image->color_space = CLRSPC_SRGB;
1075             else if (jp2->enumcs == 17)
1076                     p_image->color_space = CLRSPC_GRAY;
1077             else if (jp2->enumcs == 18)
1078                     p_image->color_space = CLRSPC_SYCC;
1079             else
1080                     p_image->color_space = CLRSPC_UNKNOWN;
1081
1082             /* Apply the color space if needed */
1083             if(jp2->color.jp2_cdef) {
1084                     opj_jp2_apply_cdef(p_image, &(jp2->color));
1085             }
1086
1087             if(jp2->color.jp2_pclr) {
1088                     /* Part 1, I.5.3.4: Either both or none : */
1089                     if( !jp2->color.jp2_pclr->cmap)
1090                             opj_jp2_free_pclr(&(jp2->color));
1091                     else
1092                             opj_jp2_apply_pclr(p_image, &(jp2->color));
1093             }
1094
1095             if(jp2->color.icc_profile_buf) {
1096                     p_image->icc_profile_buf = jp2->color.icc_profile_buf;
1097                     p_image->icc_profile_len = jp2->color.icc_profile_len;
1098                     jp2->color.icc_profile_buf = NULL;
1099             }
1100     }
1101
1102         return OPJ_TRUE;
1103 }
1104
1105 opj_bool opj_jp2_write_jp2h(opj_jp2_t *jp2,
1106                             opj_stream_private_t *stream,
1107                             opj_event_mgr_t * p_manager
1108                             )
1109 {
1110         opj_jp2_img_header_writer_handler_t l_writers [3];
1111         opj_jp2_img_header_writer_handler_t * l_current_writer;
1112
1113         OPJ_INT32 i, l_nb_pass;
1114         /* size of data for super box*/
1115         OPJ_INT32 l_jp2h_size = 8;
1116         opj_bool l_result = OPJ_TRUE;
1117
1118         /* to store the data of the super box */
1119         OPJ_BYTE l_jp2h_data [8];
1120         
1121         /* preconditions */
1122         assert(stream != 00);
1123         assert(jp2 != 00);
1124         assert(p_manager != 00);
1125
1126         memset(l_writers,0,sizeof(l_writers));
1127
1128         if (jp2->bpc == 255) {
1129                 l_nb_pass = 3;
1130                 l_writers[0].handler = opj_jp2_write_ihdr;
1131                 l_writers[1].handler = opj_jp2_write_bpcc;
1132                 l_writers[2].handler = opj_jp2_write_colr;
1133         }
1134         else {
1135                 l_nb_pass = 2;
1136                 l_writers[0].handler = opj_jp2_write_ihdr;
1137                 l_writers[1].handler = opj_jp2_write_colr;
1138         }
1139         
1140         /* write box header */
1141         /* write JP2H type */
1142         opj_write_bytes(l_jp2h_data+4,JP2_JP2H,4);
1143
1144         l_current_writer = l_writers;
1145         for (i=0;i<l_nb_pass;++i) {
1146                 l_current_writer->m_data = l_current_writer->handler(jp2,&(l_current_writer->m_size));
1147                 if (l_current_writer->m_data == 00) {
1148                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to hold JP2 Header data\n");
1149                         l_result = OPJ_FALSE;
1150                         break;
1151                 }
1152
1153                 l_jp2h_size += l_current_writer->m_size;
1154                 ++l_current_writer;
1155         }
1156
1157         if (! l_result) {
1158                 l_current_writer = l_writers;
1159                 for (i=0;i<l_nb_pass;++i) {
1160                         if (l_current_writer->m_data != 00) {
1161                                 opj_free(l_current_writer->m_data );
1162                         }
1163                         ++l_current_writer;
1164                 }
1165
1166                 return OPJ_FALSE;
1167         }
1168
1169         /* write super box size */
1170         opj_write_bytes(l_jp2h_data,l_jp2h_size,4);
1171         
1172         /* write super box data on stream */
1173         if (opj_stream_write_data(stream,l_jp2h_data,8,p_manager) != 8) {
1174                 opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
1175                 l_result = OPJ_FALSE;
1176         }
1177         
1178         if (l_result) {
1179                 l_current_writer = l_writers;
1180                 for (i=0;i<l_nb_pass;++i) {
1181                         if (opj_stream_write_data(stream,l_current_writer->m_data,l_current_writer->m_size,p_manager) != l_current_writer->m_size) {
1182                                 opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
1183                                 l_result = OPJ_FALSE;
1184                                 break;
1185                         }
1186                         ++l_current_writer;
1187                 }
1188         }
1189
1190         l_current_writer = l_writers;
1191         
1192         /* cleanup */
1193         for (i=0;i<l_nb_pass;++i) {
1194                 if (l_current_writer->m_data != 00) {
1195                         opj_free(l_current_writer->m_data );
1196                 }
1197                 ++l_current_writer;
1198         }
1199
1200         return l_result;
1201 }
1202
1203 opj_bool opj_jp2_write_ftyp(opj_jp2_t *jp2,
1204                                                         opj_stream_private_t *cio,
1205                                                         opj_event_mgr_t * p_manager )
1206 {
1207         OPJ_UINT32 i;
1208         OPJ_UINT32 l_ftyp_size = 16 + 4 * jp2->numcl;
1209         OPJ_BYTE * l_ftyp_data, * l_current_data_ptr;
1210         opj_bool l_result;
1211
1212         /* preconditions */
1213         assert(cio != 00);
1214         assert(jp2 != 00);
1215         assert(p_manager != 00);
1216
1217         l_ftyp_data = (OPJ_BYTE *) opj_malloc(l_ftyp_size);
1218         
1219         if (l_ftyp_data == 00) {
1220                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
1221                 return OPJ_FALSE;
1222         }
1223
1224         memset(l_ftyp_data,0,l_ftyp_size);
1225
1226         l_current_data_ptr = l_ftyp_data;
1227
1228         opj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */
1229         l_current_data_ptr += 4;
1230
1231         opj_write_bytes(l_current_data_ptr, JP2_FTYP,4); /* FTYP */
1232         l_current_data_ptr += 4;
1233
1234         opj_write_bytes(l_current_data_ptr, jp2->brand,4); /* BR */
1235         l_current_data_ptr += 4;
1236
1237         opj_write_bytes(l_current_data_ptr, jp2->minversion,4); /* MinV */
1238         l_current_data_ptr += 4;
1239
1240         for (i = 0; i < jp2->numcl; i++)  {
1241                 opj_write_bytes(l_current_data_ptr, jp2->cl[i],4);      /* CL */
1242         }
1243         
1244         l_result = (opj_stream_write_data(cio,l_ftyp_data,l_ftyp_size,p_manager) == l_ftyp_size);
1245         if (! l_result)
1246         {
1247                 opj_event_msg(p_manager, EVT_ERROR, "Error while writing ftyp data to stream\n");
1248         }
1249
1250         opj_free(l_ftyp_data);
1251         
1252         return l_result;
1253 }
1254
1255 opj_bool opj_jp2_write_jp2c(opj_jp2_t *jp2,
1256                                                         opj_stream_private_t *cio,
1257                                                         opj_event_mgr_t * p_manager )
1258 {
1259         OPJ_OFF_T j2k_codestream_exit;
1260         OPJ_BYTE l_data_header [8];
1261         
1262         /* preconditions */
1263         assert(jp2 != 00);
1264         assert(cio != 00);
1265         assert(p_manager != 00);
1266         assert(opj_stream_has_seek(cio));
1267         
1268         j2k_codestream_exit = opj_stream_tell(cio);
1269         opj_write_bytes(l_data_header,
1270                     (OPJ_UINT32) (j2k_codestream_exit - jp2->j2k_codestream_offset),
1271                     4); /* size of codestream */
1272         opj_write_bytes(l_data_header + 4,JP2_JP2C,4);                                                                     /* JP2C */
1273
1274         if (! opj_stream_seek(cio,jp2->j2k_codestream_offset,p_manager)) {
1275                 opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
1276                 return OPJ_FALSE;
1277         }
1278         
1279         if (opj_stream_write_data(cio,l_data_header,8,p_manager) != 8) {
1280                 opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
1281                 return OPJ_FALSE;
1282         }
1283
1284         if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
1285                 opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
1286                 return OPJ_FALSE;
1287         }
1288
1289         return OPJ_TRUE;
1290 }
1291
1292 opj_bool opj_jp2_write_jp(      opj_jp2_t *jp2,
1293                                             opj_stream_private_t *cio,
1294                                                 opj_event_mgr_t * p_manager )
1295 {
1296         /* 12 bytes will be read */
1297         OPJ_BYTE l_signature_data [12];
1298
1299         /* preconditions */
1300         assert(cio != 00);
1301         assert(jp2 != 00);
1302         assert(p_manager != 00);
1303
1304         /* write box length */
1305         opj_write_bytes(l_signature_data,12,4);
1306         /* writes box type */
1307         opj_write_bytes(l_signature_data+4,JP2_JP,4);
1308         /* writes magic number*/
1309         opj_write_bytes(l_signature_data+8,0x0d0a870a,4);
1310         
1311         if (opj_stream_write_data(cio,l_signature_data,12,p_manager) != 12) {
1312                 return OPJ_FALSE;
1313         }
1314
1315         return OPJ_TRUE;
1316 }
1317
1318 /* ----------------------------------------------------------------------- */
1319 /* JP2 decoder interface                                             */
1320 /* ----------------------------------------------------------------------- */
1321
1322 void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
1323 {
1324         /* setup the J2K codec */
1325         opj_j2k_setup_decoder(jp2->j2k, parameters);
1326
1327         /* further JP2 initializations go here */
1328         jp2->color.jp2_has_colr = 0;
1329     jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
1330 }
1331
1332 /* ----------------------------------------------------------------------- */
1333 /* JP2 encoder interface                                             */
1334 /* ----------------------------------------------------------------------- */
1335
1336 void opj_jp2_setup_encoder(     opj_jp2_t *jp2,
1337                             opj_cparameters_t *parameters,
1338                             opj_image_t *image,
1339                             opj_event_mgr_t * p_manager)
1340 {
1341     OPJ_UINT32 i;
1342         OPJ_INT32 depth_0, sign;
1343
1344         if(!jp2 || !parameters || !image)
1345                 return;
1346
1347         /* setup the J2K codec */
1348         /* ------------------- */
1349
1350         /* Check if number of components respects standard */
1351         if (image->numcomps < 1 || image->numcomps > 16384) {
1352                 opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n");
1353                 return;
1354         }
1355
1356         opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager );
1357
1358         /* setup the JP2 codec */
1359         /* ------------------- */
1360         
1361         /* Profile box */
1362
1363         jp2->brand = JP2_JP2;   /* BR */
1364         jp2->minversion = 0;    /* MinV */
1365         jp2->numcl = 1;
1366         jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
1367         jp2->cl[0] = JP2_JP2;   /* CL0 : JP2 */
1368
1369         /* Image Header box */
1370
1371         jp2->numcomps = image->numcomps;        /* NC */
1372         jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
1373         jp2->h = image->y1 - image->y0;         /* HEIGHT */
1374         jp2->w = image->x1 - image->x0;         /* WIDTH */
1375         /* BPC */
1376         depth_0 = image->comps[0].prec - 1;
1377         sign = image->comps[0].sgnd;
1378         jp2->bpc = depth_0 + (sign << 7);
1379         for (i = 1; i < image->numcomps; i++) {
1380                 OPJ_INT32 depth = image->comps[i].prec - 1;
1381                 sign = image->comps[i].sgnd;
1382                 if (depth_0 != depth)
1383                         jp2->bpc = 255;
1384         }
1385         jp2->C = 7;                     /* C : Always 7 */
1386         jp2->UnkC = 0;          /* UnkC, colorspace specified in colr box */
1387         jp2->IPR = 0;           /* IPR, no intellectual property */
1388         
1389         /* BitsPerComponent box */
1390         for (i = 0; i < image->numcomps; i++) {
1391                 jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
1392         }
1393
1394         /* Colour Specification box */
1395         if ((image->numcomps == 1 || image->numcomps == 3) && (jp2->bpc != 255)) {
1396                 jp2->meth = 1;  /* METH: Enumerated colourspace */
1397         } else {
1398                 jp2->meth = 2;  /* METH: Restricted ICC profile */
1399         }
1400         if (jp2->meth == 1) {
1401                 if (image->color_space == 1)
1402                         jp2->enumcs = 16;       /* sRGB as defined by IEC 61966-2-1 */
1403                 else if (image->color_space == 2)
1404                         jp2->enumcs = 17;       /* greyscale */
1405                 else if (image->color_space == 3)
1406                         jp2->enumcs = 18;       /* YUV */
1407         } else {
1408                 jp2->enumcs = 0;                /* PROFILE (??) */
1409         }
1410         jp2->precedence = 0;    /* PRECEDENCE */
1411         jp2->approx = 0;                /* APPROX */
1412 }
1413
1414 opj_bool opj_jp2_encode(opj_jp2_t *jp2,
1415                                                 opj_stream_private_t *stream,
1416                                                 opj_event_mgr_t * p_manager)
1417 {
1418         return opj_j2k_encode_v2(jp2->j2k, stream, p_manager);
1419 }
1420
1421 opj_bool opj_jp2_end_decompress(opj_jp2_t *jp2,
1422                                 opj_stream_private_t *cio,
1423                                 opj_event_mgr_t * p_manager
1424                                 )
1425 {
1426         /* preconditions */
1427         assert(jp2 != 00);
1428         assert(cio != 00);
1429         assert(p_manager != 00);
1430
1431         /* customization of the end encoding */
1432         opj_jp2_setup_end_header_reading(jp2);
1433
1434         /* write header */
1435         if (! opj_jp2_exec (jp2,jp2->m_procedure_list,cio,p_manager)) {
1436                 return OPJ_FALSE;
1437         }
1438
1439         return opj_j2k_end_decompress(jp2->j2k, cio, p_manager);
1440 }
1441
1442 opj_bool opj_jp2_end_compress(  opj_jp2_t *jp2,
1443                                                             opj_stream_private_t *cio,
1444                                                             opj_event_mgr_t * p_manager
1445                                 )
1446 {
1447         /* preconditions */
1448         assert(jp2 != 00);
1449         assert(cio != 00);
1450         assert(p_manager != 00);
1451
1452         /* customization of the end encoding */
1453         opj_jp2_setup_end_header_writing(jp2);
1454
1455         if (! opj_j2k_end_compress(jp2->j2k,cio,p_manager)) {
1456                 return OPJ_FALSE;
1457         }
1458
1459         /* write header */
1460         return opj_jp2_exec(jp2,jp2->m_procedure_list,cio,p_manager);
1461 }
1462
1463 void opj_jp2_setup_end_header_writing (opj_jp2_t *jp2)
1464 {
1465         /* preconditions */
1466         assert(jp2 != 00);
1467
1468         opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2c );
1469         /* DEVELOPER CORNER, add your custom procedures */
1470 }
1471
1472 void opj_jp2_setup_end_header_reading (opj_jp2_t *jp2)
1473 {
1474         /* preconditions */
1475         assert(jp2 != 00);
1476         opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure );
1477         /* DEVELOPER CORNER, add your custom procedures */
1478 }
1479
1480 opj_bool opj_jp2_default_validation (   opj_jp2_t * jp2,
1481                                         opj_stream_private_t *cio,
1482                                         opj_event_mgr_t * p_manager
1483                                         )
1484 {
1485         opj_bool l_is_valid = OPJ_TRUE;
1486         OPJ_UINT32 i;
1487
1488         /* preconditions */
1489         assert(jp2 != 00);
1490         assert(cio != 00);
1491         assert(p_manager != 00);
1492
1493         /* JPEG2000 codec validation */
1494
1495         /* STATE checking */
1496         /* make sure the state is at 0 */
1497         l_is_valid &= (jp2->jp2_state == JP2_STATE_NONE);
1498
1499         /* make sure not reading a jp2h ???? WEIRD */
1500         l_is_valid &= (jp2->jp2_img_state == JP2_IMG_STATE_NONE);
1501
1502         /* POINTER validation */
1503         /* make sure a j2k codec is present */
1504         l_is_valid &= (jp2->j2k != 00);
1505
1506         /* make sure a procedure list is present */
1507         l_is_valid &= (jp2->m_procedure_list != 00);
1508
1509         /* make sure a validation list is present */
1510         l_is_valid &= (jp2->m_validation_list != 00);
1511
1512         /* PARAMETER VALIDATION */
1513         /* number of components */
1514         l_is_valid &= (jp2->numcl > 0);
1515         /* width */
1516         l_is_valid &= (jp2->h > 0);
1517         /* height */
1518         l_is_valid &= (jp2->w > 0);
1519         /* precision */
1520         for (i = 0; i < jp2->numcomps; ++i)     {
1521                 l_is_valid &= (jp2->comps[i].bpcc > 0);
1522         }
1523
1524         /* METH */
1525         l_is_valid &= ((jp2->meth > 0) && (jp2->meth < 3));
1526
1527         /* stream validation */
1528         /* back and forth is needed */
1529         l_is_valid &= opj_stream_has_seek(cio);
1530
1531         return l_is_valid;
1532 }
1533
1534 opj_bool opj_jp2_read_header_procedure(  opj_jp2_t *jp2,
1535                                                 opj_stream_private_t *stream,
1536                                                 opj_event_mgr_t * p_manager
1537                                                 )
1538 {
1539         opj_jp2_box_t box;
1540         OPJ_UINT32 l_nb_bytes_read;
1541         const opj_jp2_header_handler_t * l_current_handler;
1542         OPJ_UINT32 l_last_data_size = BOX_SIZE;
1543         OPJ_UINT32 l_current_data_size;
1544         OPJ_BYTE * l_current_data = 00;
1545
1546         /* preconditions */
1547         assert(stream != 00);
1548         assert(jp2 != 00);
1549         assert(p_manager != 00);
1550
1551         l_current_data = (OPJ_BYTE*)opj_malloc(l_last_data_size);
1552
1553         if (l_current_data == 00) {
1554                 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 file header\n");
1555                 return OPJ_FALSE;
1556         }
1557         memset(l_current_data, 0 , l_last_data_size);
1558
1559         while (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) {
1560                 /* is it the codestream box ? */
1561                 if (box.type == JP2_JP2C) {
1562                         if (jp2->jp2_state & JP2_STATE_HEADER) {
1563                                 jp2->jp2_state |= JP2_STATE_CODESTREAM;
1564                                 opj_free(l_current_data);
1565                                 return OPJ_TRUE;
1566                         }
1567                         else {
1568                                 opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n");
1569                                 opj_free(l_current_data);
1570                                 return OPJ_FALSE;
1571                         }
1572                 }
1573                 else if (box.length == 0) {
1574                         opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
1575                         opj_free(l_current_data);
1576                         return OPJ_FALSE;
1577                 }
1578
1579                 l_current_handler = opj_jp2_find_handler(box.type);
1580                 l_current_data_size = box.length - l_nb_bytes_read;
1581
1582                 if (l_current_handler != 00) {
1583                         if (l_current_data_size > l_last_data_size) {
1584                                 OPJ_BYTE* new_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,l_current_data_size);
1585                                 if (!l_current_data){
1586                                         opj_free(l_current_data);
1587                     opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 box\n");
1588                                         return OPJ_FALSE;
1589                                 }
1590                 l_current_data = new_current_data;
1591                                 l_last_data_size = l_current_data_size;
1592                         }
1593
1594                         l_nb_bytes_read = opj_stream_read_data(stream,l_current_data,l_current_data_size,p_manager);
1595                         if (l_nb_bytes_read != l_current_data_size) {
1596                                 opj_event_msg(p_manager, EVT_ERROR, "Problem with reading JPEG2000 box, stream error\n");
1597                 opj_free(l_current_data);                
1598                                 return OPJ_FALSE;
1599                         }
1600
1601                         if (! l_current_handler->handler(jp2,l_current_data,l_current_data_size,p_manager)) {
1602                                 opj_free(l_current_data);
1603                                 return OPJ_FALSE;
1604                         }
1605                 }
1606                 else {
1607                         jp2->jp2_state |= JP2_STATE_UNKNOWN;
1608                         if (opj_stream_skip(stream,l_current_data_size,p_manager) != l_current_data_size) {
1609                                 opj_event_msg(p_manager, EVT_ERROR, "Problem with skipping JPEG2000 box, stream error\n");
1610                                 opj_free(l_current_data);
1611                                 return OPJ_FALSE;
1612                         }
1613                 }
1614         }
1615
1616         opj_free(l_current_data);
1617
1618         return OPJ_TRUE;
1619 }
1620
1621 /**
1622  * Excutes the given procedures on the given codec.
1623  *
1624  * @param       p_procedure_list        the list of procedures to execute
1625  * @param       jp2                                     the jpeg2000 file codec to execute the procedures on.
1626  * @param       stream                                  the stream to execute the procedures on.
1627  * @param       p_manager                       the user manager.
1628  *
1629  * @return      true                            if all the procedures were successfully executed.
1630  */
1631 static opj_bool opj_jp2_exec (  opj_jp2_t * jp2,
1632                                 opj_procedure_list_t * p_procedure_list,
1633                                 opj_stream_private_t *stream,
1634                                 opj_event_mgr_t * p_manager
1635                                 )
1636
1637 {
1638         opj_bool (** l_procedure) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *) = 00;
1639         opj_bool l_result = OPJ_TRUE;
1640         OPJ_UINT32 l_nb_proc, i;
1641
1642         /* preconditions */
1643         assert(p_procedure_list != 00);
1644         assert(jp2 != 00);
1645         assert(stream != 00);
1646         assert(p_manager != 00);
1647
1648         l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
1649         l_procedure = (opj_bool (**) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
1650
1651         for     (i=0;i<l_nb_proc;++i) {
1652                 l_result = l_result && (*l_procedure) (jp2,stream,p_manager);
1653                 ++l_procedure;
1654         }
1655
1656         /* and clear the procedure list at the end. */
1657         opj_procedure_list_clear(p_procedure_list);
1658         return l_result;
1659 }
1660
1661 opj_bool opj_jp2_start_compress(opj_jp2_t *jp2,
1662                                 opj_stream_private_t *stream,
1663                                 opj_image_t * p_image,
1664                                 opj_event_mgr_t * p_manager
1665                                 )
1666 {
1667         /* preconditions */
1668         assert(jp2 != 00);
1669         assert(stream != 00);
1670         assert(p_manager != 00);
1671
1672         /* customization of the validation */
1673         opj_jp2_setup_encoding_validation (jp2);
1674
1675         /* validation of the parameters codec */
1676         if (! opj_jp2_exec(jp2,jp2->m_validation_list,stream,p_manager)) {
1677                 return OPJ_FALSE;
1678         }
1679
1680         /* customization of the encoding */
1681         opj_jp2_setup_header_writing(jp2);
1682
1683         /* write header */
1684         if (! opj_jp2_exec (jp2,jp2->m_procedure_list,stream,p_manager)) {
1685                 return OPJ_FALSE;
1686         }
1687
1688         return opj_j2k_start_compress(jp2->j2k,stream,p_image,p_manager);
1689 }
1690
1691 const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id)
1692 {
1693         OPJ_UINT32 i, l_handler_size = sizeof(jp2_header) / sizeof(opj_jp2_header_handler_t);
1694
1695         for (i=0;i<l_handler_size;++i) {
1696                 if (jp2_header[i].id == p_id) {
1697                         return &jp2_header[i];
1698                 }
1699         }
1700         return NULL;
1701 }
1702
1703 /**
1704  * Finds the image execution function related to the given box id.
1705  *
1706  * @param       p_id    the id of the handler to fetch.
1707  *
1708  * @return      the given handler or 00 if it could not be found.
1709  */
1710 static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id)
1711 {
1712         OPJ_UINT32 i, l_handler_size = sizeof(jp2_img_header) / sizeof(opj_jp2_header_handler_t);
1713         for (i=0;i<l_handler_size;++i)
1714         {
1715                 if (jp2_img_header[i].id == p_id) {
1716                         return &jp2_img_header[i];
1717                 }
1718         }
1719
1720         return NULL;
1721 }
1722
1723 /**
1724  * Reads a jpeg2000 file signature box.
1725  *
1726  * @param       p_header_data   the data contained in the signature box.
1727  * @param       jp2                             the jpeg2000 file codec.
1728  * @param       p_header_size   the size of the data contained in the signature box.
1729  * @param       p_manager               the user event manager.
1730  *
1731  * @return true if the file signature box is valid.
1732  */
1733 static opj_bool opj_jp2_read_jp(opj_jp2_t *jp2,
1734                                 OPJ_BYTE * p_header_data,
1735                                 OPJ_UINT32 p_header_size,
1736                                 opj_event_mgr_t * p_manager
1737                                 )
1738
1739 {
1740         OPJ_UINT32 l_magic_number;
1741
1742         /* preconditions */
1743         assert(p_header_data != 00);
1744         assert(jp2 != 00);
1745         assert(p_manager != 00);
1746
1747         if (jp2->jp2_state != JP2_STATE_NONE) {
1748                 opj_event_msg(p_manager, EVT_ERROR, "The signature box must be the first box in the file.\n");
1749                 return OPJ_FALSE;
1750         }
1751
1752         /* assure length of data is correct (4 -> magic number) */
1753         if (p_header_size != 4) {
1754                 opj_event_msg(p_manager, EVT_ERROR, "Error with JP signature Box size\n");
1755                 return OPJ_FALSE;
1756         }
1757
1758         /* rearrange data */
1759         opj_read_bytes(p_header_data,&l_magic_number,4);
1760         if (l_magic_number != 0x0d0a870a ) {
1761                 opj_event_msg(p_manager, EVT_ERROR, "Error with JP Signature : bad magic number\n");
1762                 return OPJ_FALSE;
1763         }
1764
1765         jp2->jp2_state |= JP2_STATE_SIGNATURE;
1766
1767         return OPJ_TRUE;
1768 }
1769
1770 /**
1771  * Reads a a FTYP box - File type box
1772  *
1773  * @param       p_header_data   the data contained in the FTYP box.
1774  * @param       jp2                             the jpeg2000 file codec.
1775  * @param       p_header_size   the size of the data contained in the FTYP box.
1776  * @param       p_manager               the user event manager.
1777  *
1778  * @return true if the FTYP box is valid.
1779  */
1780 static opj_bool opj_jp2_read_ftyp(      opj_jp2_t *jp2,
1781                                                                         OPJ_BYTE * p_header_data,
1782                                                                         OPJ_UINT32 p_header_size,
1783                                                                         opj_event_mgr_t * p_manager
1784                                     )
1785 {
1786         OPJ_UINT32 i, l_remaining_bytes;
1787
1788         /* preconditions */
1789         assert(p_header_data != 00);
1790         assert(jp2 != 00);
1791         assert(p_manager != 00);
1792
1793         if (jp2->jp2_state != JP2_STATE_SIGNATURE) {
1794                 opj_event_msg(p_manager, EVT_ERROR, "The ftyp box must be the second box in the file.\n");
1795                 return OPJ_FALSE;
1796         }
1797
1798         /* assure length of data is correct */
1799         if (p_header_size < 8) {
1800                 opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
1801                 return OPJ_FALSE;
1802         }
1803
1804         opj_read_bytes(p_header_data,&jp2->brand,4);            /* BR */
1805         p_header_data += 4;
1806
1807         opj_read_bytes(p_header_data,&jp2->minversion,4);               /* MinV */
1808         p_header_data += 4;
1809
1810         l_remaining_bytes = p_header_size - 8;
1811
1812         /* the number of remaining bytes should be a multiple of 4 */
1813         if ((l_remaining_bytes & 0x3) != 0) {
1814                 opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
1815                 return OPJ_FALSE;
1816         }
1817
1818         /* div by 4 */
1819         jp2->numcl = l_remaining_bytes >> 2;
1820         if (jp2->numcl) {
1821                 jp2->cl = (OPJ_UINT32 *) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
1822                 if (jp2->cl == 00) {
1823                         opj_event_msg(p_manager, EVT_ERROR, "Not enough memory with FTYP Box\n");
1824                         return OPJ_FALSE;
1825                 }
1826                 memset(jp2->cl,0,jp2->numcl * sizeof(OPJ_UINT32));
1827         }
1828
1829         for (i = 0; i < jp2->numcl; ++i)
1830         {
1831                 opj_read_bytes(p_header_data,&jp2->cl[i],4);            /* CLi */
1832                 p_header_data += 4;
1833         }
1834
1835         jp2->jp2_state |= JP2_STATE_FILE_TYPE;
1836
1837         return OPJ_TRUE;
1838 }
1839
1840 opj_bool opj_jp2_skip_jp2c(     opj_jp2_t *jp2,
1841                                                 opj_stream_private_t *stream,
1842                                                 opj_event_mgr_t * p_manager )
1843 {
1844         /* preconditions */
1845         assert(jp2 != 00);
1846         assert(stream != 00);
1847         assert(p_manager != 00);
1848
1849         jp2->j2k_codestream_offset = opj_stream_tell(stream);
1850
1851         if (opj_stream_skip(stream,8,p_manager) != 8) {
1852                 return OPJ_FALSE;
1853         }
1854
1855         return OPJ_TRUE;
1856 }
1857
1858 /**
1859  * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
1860  *
1861  * @param       p_header_data   the data contained in the file header box.
1862  * @param       jp2                             the jpeg2000 file codec.
1863  * @param       p_header_size   the size of the data contained in the file header box.
1864  * @param       p_manager               the user event manager.
1865  *
1866  * @return true if the JP2 Header box was successfully reconized.
1867 */
1868 static opj_bool opj_jp2_read_jp2h(  opj_jp2_t *jp2,
1869                                     OPJ_BYTE *p_header_data,
1870                                     OPJ_UINT32 p_header_size,
1871                                     opj_event_mgr_t * p_manager
1872                                     )
1873 {
1874         OPJ_UINT32 l_box_size=0, l_current_data_size = 0;
1875         opj_jp2_box_t box;
1876         const opj_jp2_header_handler_t * l_current_handler;
1877
1878         /* preconditions */
1879         assert(p_header_data != 00);
1880         assert(jp2 != 00);
1881         assert(p_manager != 00);
1882
1883         /* make sure the box is well placed */
1884         if ((jp2->jp2_state & JP2_STATE_FILE_TYPE) != JP2_STATE_FILE_TYPE ) {
1885                 opj_event_msg(p_manager, EVT_ERROR, "The  box must be the first box in the file.\n");
1886                 return OPJ_FALSE;
1887         }
1888
1889         jp2->jp2_img_state = JP2_IMG_STATE_NONE;
1890
1891         /* iterate while remaining data */
1892         while (p_header_size > 0) {
1893
1894                 if (! opj_jp2_read_boxhdr_char(&box,p_header_data,&l_box_size,p_header_size, p_manager)) {
1895                         opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box\n");
1896                         return OPJ_FALSE;
1897                 }
1898
1899                 if (box.length > p_header_size) {
1900                         opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: box length is inconsistent.\n");
1901                         return OPJ_FALSE;
1902                 }
1903
1904                 l_current_handler = opj_jp2_img_find_handler(box.type);
1905                 l_current_data_size = box.length - l_box_size;
1906                 p_header_data += l_box_size;
1907
1908                 if (l_current_handler != 00) {
1909                         if (! l_current_handler->handler(jp2,p_header_data,l_current_data_size,p_manager)) {
1910                                 return OPJ_FALSE;
1911                         }
1912                 }
1913                 else {
1914                         jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;
1915                 }
1916
1917                 p_header_data += l_current_data_size;
1918                 p_header_size -= box.length;
1919         }
1920
1921         jp2->jp2_state |= JP2_STATE_HEADER;
1922
1923         return OPJ_TRUE;
1924 }
1925
1926 opj_bool opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,
1927                                      OPJ_BYTE * p_data,
1928                                      OPJ_UINT32 * p_number_bytes_read,
1929                                      OPJ_UINT32 p_box_max_size,
1930                                      opj_event_mgr_t * p_manager
1931                                      )
1932 {
1933         OPJ_UINT32 l_value;
1934
1935         /* preconditions */
1936         assert(p_data != 00);
1937         assert(box != 00);
1938         assert(p_number_bytes_read != 00);
1939         assert(p_manager != 00);
1940
1941         if (p_box_max_size < 8) {
1942                 opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of less than 8 bytes\n");
1943                 return OPJ_FALSE;
1944         }
1945
1946         /* process read data */
1947         opj_read_bytes(p_data, &l_value, 4);
1948         p_data += 4;
1949         box->length = (OPJ_INT32)(l_value);
1950
1951         opj_read_bytes(p_data, &l_value, 4);
1952         p_data += 4;
1953         box->type = (OPJ_INT32)(l_value);
1954
1955         *p_number_bytes_read = 8;
1956
1957         /* do we have a "special very large box ?" */
1958         /* read then the XLBox */
1959         if (box->length == 1) {
1960                 OPJ_UINT32 l_xl_part_size;
1961
1962                 if (p_box_max_size < 16) {
1963                         opj_event_msg(p_manager, EVT_ERROR, "Cannot handle XL box of less than 16 bytes\n");
1964                         return OPJ_FALSE;
1965                 }
1966
1967                 opj_read_bytes(p_data,&l_xl_part_size, 4);
1968                 p_data += 4;
1969                 *p_number_bytes_read += 4;
1970
1971                 if (l_xl_part_size != 0) {
1972                         opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
1973                         return OPJ_FALSE;
1974                 }
1975
1976                 opj_read_bytes(p_data, &l_value, 4);
1977                 *p_number_bytes_read += 4;
1978                 box->length = (OPJ_INT32)(l_value);
1979
1980                 if (box->length == 0) {
1981                         opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
1982                         return OPJ_FALSE;
1983                 }
1984         }
1985         else if (box->length == 0) {
1986                 opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
1987                 return OPJ_FALSE;
1988         }
1989
1990         return OPJ_TRUE;
1991 }
1992
1993 opj_bool opj_jp2_read_header(   opj_stream_private_t *p_stream,
1994                                 opj_jp2_t *jp2,
1995                                 opj_image_t ** p_image,
1996                                 opj_event_mgr_t * p_manager
1997                                 )
1998 {
1999         /* preconditions */
2000         assert(jp2 != 00);
2001         assert(p_stream != 00);
2002         assert(p_manager != 00);
2003
2004         /* customization of the validation */
2005         opj_jp2_setup_decoding_validation (jp2);
2006
2007         /* customization of the encoding */
2008         opj_jp2_setup_header_reading(jp2);
2009
2010         /* validation of the parameters codec */
2011         if (! opj_jp2_exec(jp2,jp2->m_validation_list,p_stream,p_manager)) {
2012                 return OPJ_FALSE;
2013         }
2014
2015         /* read header */
2016         if (! opj_jp2_exec (jp2,jp2->m_procedure_list,p_stream,p_manager)) {
2017                 return OPJ_FALSE;
2018         }
2019
2020         return opj_j2k_read_header(     p_stream,
2021                                                         jp2->j2k,
2022                                                         p_image,
2023                                                         p_manager);
2024 }
2025
2026 void opj_jp2_setup_encoding_validation (opj_jp2_t *jp2)
2027 {
2028         /* preconditions */
2029         assert(jp2 != 00);
2030
2031         opj_procedure_list_add_procedure(jp2->m_validation_list, (opj_procedure)opj_jp2_default_validation);
2032         /* DEVELOPER CORNER, add your custom validation procedure */
2033 }
2034
2035 void opj_jp2_setup_decoding_validation (opj_jp2_t *jp2)
2036 {
2037         /* preconditions */
2038         assert(jp2 != 00);
2039         /* DEVELOPER CORNER, add your custom validation procedure */
2040 }
2041
2042 void opj_jp2_setup_header_writing (opj_jp2_t *jp2)
2043 {
2044         /* preconditions */
2045         assert(jp2 != 00);
2046
2047         opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp );
2048         opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_ftyp );
2049         opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2h );
2050         opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_skip_jp2c );
2051
2052         /* DEVELOPER CORNER, insert your custom procedures */
2053
2054 }
2055
2056 void opj_jp2_setup_header_reading (opj_jp2_t *jp2)
2057 {
2058         /* preconditions */
2059         assert(jp2 != 00);
2060
2061         opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure );
2062         /* DEVELOPER CORNER, add your custom procedures */
2063 }
2064
2065 opj_bool opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,
2066                                     OPJ_UINT32 * p_tile_index,
2067                                     OPJ_UINT32 * p_data_size,
2068                                     OPJ_INT32 * p_tile_x0,
2069                                     OPJ_INT32 * p_tile_y0,
2070                                     OPJ_INT32 * p_tile_x1,
2071                                     OPJ_INT32 * p_tile_y1,
2072                                     OPJ_UINT32 * p_nb_comps,
2073                                     opj_bool * p_go_on,
2074                                     opj_stream_private_t *p_stream,
2075                                     opj_event_mgr_t * p_manager
2076                                     )
2077 {
2078         return opj_j2k_read_tile_header(p_jp2->j2k,
2079                                                                 p_tile_index,
2080                                                                 p_data_size,
2081                                                                 p_tile_x0, p_tile_y0,
2082                                                                 p_tile_x1, p_tile_y1,
2083                                                                 p_nb_comps,
2084                                                                 p_go_on,
2085                                                                 p_stream,
2086                                                                 p_manager);
2087 }
2088
2089 opj_bool opj_jp2_write_tile (   opj_jp2_t *p_jp2,
2090                                                             OPJ_UINT32 p_tile_index,
2091                                                             OPJ_BYTE * p_data,
2092                                                             OPJ_UINT32 p_data_size,
2093                                                             opj_stream_private_t *p_stream,
2094                                                             opj_event_mgr_t * p_manager
2095                                 )
2096
2097 {
2098         return opj_j2k_write_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
2099 }
2100
2101 opj_bool opj_jp2_decode_tile (  opj_jp2_t * p_jp2,
2102                                 OPJ_UINT32 p_tile_index,
2103                                 OPJ_BYTE * p_data,
2104                                 OPJ_UINT32 p_data_size,
2105                                 opj_stream_private_t *p_stream,
2106                                 opj_event_mgr_t * p_manager
2107                                 )
2108 {
2109         return opj_j2k_decode_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
2110 }
2111
2112 void opj_jp2_destroy(opj_jp2_t *jp2)
2113 {
2114         if (jp2) {
2115                 /* destroy the J2K codec */
2116                 opj_j2k_destroy(jp2->j2k);
2117                 jp2->j2k = 00;
2118
2119                 if (jp2->comps) {
2120                         opj_free(jp2->comps);
2121                         jp2->comps = 00;
2122                 }
2123
2124                 if (jp2->cl) {
2125                         opj_free(jp2->cl);
2126                         jp2->cl = 00;
2127                 }
2128
2129                 if (jp2->color.icc_profile_buf) {
2130                         opj_free(jp2->color.icc_profile_buf);
2131                         jp2->color.icc_profile_buf = 00;
2132                 }
2133
2134                 if (jp2->color.jp2_cdef) {
2135                         if (jp2->color.jp2_cdef->info) {
2136                                 opj_free(jp2->color.jp2_cdef->info);
2137                                 jp2->color.jp2_cdef->info = NULL;
2138                         }
2139
2140                         opj_free(jp2->color.jp2_cdef);
2141                         jp2->color.jp2_cdef = 00;
2142                 }
2143
2144                 if (jp2->color.jp2_pclr) {
2145                         if (jp2->color.jp2_pclr->cmap) {
2146                                 opj_free(jp2->color.jp2_pclr->cmap);
2147                                 jp2->color.jp2_pclr->cmap = NULL;
2148                         }
2149                         if (jp2->color.jp2_pclr->channel_sign) {
2150                                 opj_free(jp2->color.jp2_pclr->channel_sign);
2151                                 jp2->color.jp2_pclr->channel_sign = NULL;
2152                         }
2153                         if (jp2->color.jp2_pclr->channel_size) {
2154                                 opj_free(jp2->color.jp2_pclr->channel_size);
2155                                 jp2->color.jp2_pclr->channel_size = NULL;
2156                         }
2157                         if (jp2->color.jp2_pclr->entries) {
2158                                 opj_free(jp2->color.jp2_pclr->entries);
2159                                 jp2->color.jp2_pclr->entries = NULL;
2160                         }
2161
2162                         opj_free(jp2->color.jp2_pclr);
2163                         jp2->color.jp2_pclr = 00;
2164                 }
2165
2166                 if (jp2->m_validation_list) {
2167                         opj_procedure_list_destroy(jp2->m_validation_list);
2168                         jp2->m_validation_list = 00;
2169                 }
2170
2171                 if (jp2->m_procedure_list) {
2172                         opj_procedure_list_destroy(jp2->m_procedure_list);
2173                         jp2->m_procedure_list = 00;
2174                 }
2175
2176                 opj_free(jp2);
2177         }
2178 }
2179
2180 opj_bool opj_jp2_set_decode_area(       opj_jp2_t *p_jp2,
2181                                                                     opj_image_t* p_image,
2182                                                                     OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
2183                                                                     OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
2184                                                                     opj_event_mgr_t * p_manager
2185                                     )
2186 {
2187         return opj_j2k_set_decode_area(p_jp2->j2k, p_image, p_start_x, p_start_y, p_end_x, p_end_y, p_manager);
2188 }
2189
2190 opj_bool opj_jp2_get_tile(      opj_jp2_t *p_jp2,
2191                             opj_stream_private_t *p_stream,
2192                             opj_image_t* p_image,
2193                             opj_event_mgr_t * p_manager,
2194                             OPJ_UINT32 tile_index
2195                             )
2196 {
2197         if (!p_image)
2198                 return OPJ_FALSE;
2199
2200         opj_event_msg(p_manager, EVT_WARNING, "JP2 box which are after the codestream will not be read by this function.\n");
2201
2202         if (! opj_j2k_get_tile(p_jp2->j2k, p_stream, p_image, p_manager, tile_index) ){
2203                 opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
2204                 return OPJ_FALSE;
2205         }
2206
2207         /* Set Image Color Space */
2208         if (p_jp2->enumcs == 16)
2209                 p_image->color_space = CLRSPC_SRGB;
2210         else if (p_jp2->enumcs == 17)
2211                 p_image->color_space = CLRSPC_GRAY;
2212         else if (p_jp2->enumcs == 18)
2213                 p_image->color_space = CLRSPC_SYCC;
2214         else
2215                 p_image->color_space = CLRSPC_UNKNOWN;
2216
2217         /* Apply the color space if needed */
2218         if(p_jp2->color.jp2_cdef) {
2219                 opj_jp2_apply_cdef(p_image, &(p_jp2->color));
2220         }
2221
2222         if(p_jp2->color.jp2_pclr) {
2223                 /* Part 1, I.5.3.4: Either both or none : */
2224                 if( !p_jp2->color.jp2_pclr->cmap)
2225                         opj_jp2_free_pclr(&(p_jp2->color));
2226                 else
2227                         opj_jp2_apply_pclr(p_image, &(p_jp2->color));
2228         }
2229
2230         if(p_jp2->color.icc_profile_buf) {
2231                 p_image->icc_profile_buf = p_jp2->color.icc_profile_buf;
2232                 p_image->icc_profile_len = p_jp2->color.icc_profile_len;
2233                 p_jp2->color.icc_profile_buf = NULL;
2234         }
2235
2236         return OPJ_TRUE;
2237 }
2238
2239 /* ----------------------------------------------------------------------- */
2240 /* JP2 encoder interface                                             */
2241 /* ----------------------------------------------------------------------- */
2242
2243 opj_jp2_t* opj_jp2_create(opj_bool p_is_decoder)
2244 {
2245         opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
2246         if (jp2) {
2247                 memset(jp2,0,sizeof(opj_jp2_t));
2248
2249                 /* create the J2K codec */
2250                 if (! p_is_decoder) {
2251                         jp2->j2k = opj_j2k_create_compress();
2252                 }
2253                 else {
2254                         jp2->j2k = opj_j2k_create_decompress();
2255                 }
2256
2257                 if (jp2->j2k == 00) {
2258                         opj_jp2_destroy(jp2);
2259                         return 00;
2260                 }
2261
2262                 /* Color structure */
2263                 jp2->color.icc_profile_buf = NULL;
2264                 jp2->color.icc_profile_len = 0;
2265                 jp2->color.jp2_cdef = NULL;
2266                 jp2->color.jp2_pclr = NULL;
2267                 jp2->color.jp2_has_colr = 0;
2268
2269                 /* validation list creation */
2270                 jp2->m_validation_list = opj_procedure_list_create();
2271                 if (! jp2->m_validation_list) {
2272                         opj_jp2_destroy(jp2);
2273                         return 00;
2274                 }
2275
2276                 /* execution list creation */
2277                 jp2->m_procedure_list = opj_procedure_list_create();
2278                 if (! jp2->m_procedure_list) {
2279                         opj_jp2_destroy(jp2);
2280                         return 00;
2281                 }
2282         }
2283
2284         return jp2;
2285 }
2286
2287 void jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream)
2288 {
2289         /* preconditions */
2290         assert(p_jp2 != 00);
2291
2292         j2k_dump(p_jp2->j2k,
2293                                         flag,
2294                                         out_stream);
2295 }
2296
2297 opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2)
2298 {
2299         return j2k_get_cstr_index(p_jp2->j2k);
2300 }
2301
2302 opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2)
2303 {
2304         return j2k_get_cstr_info(p_jp2->j2k);
2305 }
2306
2307 opj_bool opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,
2308                                                OPJ_UINT32 res_factor,
2309                                                opj_event_mgr_t * p_manager)
2310 {
2311         return opj_j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);
2312 }
2313