Home | History | Annotate | Download | only in libopenjpeg20
      1 /*
      2  * The copyright in this software is being made available under the 2-clauses
      3  * BSD License, included below. This software may be subject to other third
      4  * party and contributor rights, including patent rights, and no such rights
      5  * are granted under this license.
      6  *
      7  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
      8  * Copyright (c) 2002-2014, Professor Benoit Macq
      9  * Copyright (c) 2001-2003, David Janssens
     10  * Copyright (c) 2002-2003, Yannick Verschueren
     11  * Copyright (c) 2003-2007, Francois-Olivier Devaux
     12  * Copyright (c) 2003-2014, Antonin Descampe
     13  * Copyright (c) 2005, Herve Drolon, FreeImage Team
     14  * Copyright (c) 2010-2011, Kaori Hagihara
     15  * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
     16  * Copyright (c) 2012, CS Systemes d'Information, France
     17  * All rights reserved.
     18  *
     19  * Redistribution and use in source and binary forms, with or without
     20  * modification, are permitted provided that the following conditions
     21  * are met:
     22  * 1. Redistributions of source code must retain the above copyright
     23  *    notice, this list of conditions and the following disclaimer.
     24  * 2. Redistributions in binary form must reproduce the above copyright
     25  *    notice, this list of conditions and the following disclaimer in the
     26  *    documentation and/or other materials provided with the distribution.
     27  *
     28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
     29  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     32  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     33  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     34  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     35  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     36  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     37  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     38  * POSSIBILITY OF SUCH DAMAGE.
     39  */
     40 #include "opj_includes.h"
     41 
     42 /** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
     43 /*@{*/
     44 
     45 #define OPJ_BOX_SIZE	1024
     46 
     47 /** @name Local static functions */
     48 /*@{*/
     49 
     50 /*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
     51 
     52 /**
     53  * Reads a IHDR box - Image Header box
     54  *
     55  * @param	p_image_header_data			pointer to actual data (already read from file)
     56  * @param	jp2							the jpeg2000 file codec.
     57  * @param	p_image_header_size			the size of the image header
     58  * @param	p_manager					the user event manager.
     59  *
     60  * @return	true if the image header is valid, false else.
     61  */
     62 static OPJ_BOOL opj_jp2_read_ihdr(  opj_jp2_t *jp2,
     63                                     OPJ_BYTE *p_image_header_data,
     64                                     OPJ_UINT32 p_image_header_size,
     65                                     opj_event_mgr_t * p_manager );
     66 
     67 /**
     68  * Writes the Image Header box - Image Header box.
     69  *
     70  * @param jp2					jpeg2000 file codec.
     71  * @param p_nb_bytes_written	pointer to store the nb of bytes written by the function.
     72  *
     73  * @return	the data being copied.
     74 */
     75 static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
     76                                      OPJ_UINT32 * p_nb_bytes_written );
     77 
     78 /**
     79  * Writes the Bit per Component box.
     80  *
     81  * @param	jp2						jpeg2000 file codec.
     82  * @param	p_nb_bytes_written		pointer to store the nb of bytes written by the function.
     83  *
     84  * @return	the data being copied.
     85 */
     86 static OPJ_BYTE * opj_jp2_write_bpcc(	opj_jp2_t *jp2,
     87 								        OPJ_UINT32 * p_nb_bytes_written );
     88 
     89 /**
     90  * Reads a Bit per Component box.
     91  *
     92  * @param	p_bpc_header_data			pointer to actual data (already read from file)
     93  * @param	jp2							the jpeg2000 file codec.
     94  * @param	p_bpc_header_size			the size of the bpc header
     95  * @param	p_manager					the user event manager.
     96  *
     97  * @return	true if the bpc header is valid, fale else.
     98  */
     99 static OPJ_BOOL opj_jp2_read_bpcc(  opj_jp2_t *jp2,
    100                                     OPJ_BYTE * p_bpc_header_data,
    101                                     OPJ_UINT32 p_bpc_header_size,
    102                                     opj_event_mgr_t * p_manager );
    103 
    104 static OPJ_BOOL opj_jp2_read_cdef(	opj_jp2_t * jp2,
    105                                     OPJ_BYTE * p_cdef_header_data,
    106 									OPJ_UINT32 p_cdef_header_size,
    107 									opj_event_mgr_t * p_manager );
    108 
    109 static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *);
    110 
    111 /**
    112  * Writes the Channel Definition box.
    113  *
    114  * @param jp2					jpeg2000 file codec.
    115  * @param p_nb_bytes_written	pointer to store the nb of bytes written by the function.
    116  *
    117  * @return	the data being copied.
    118  */
    119 static OPJ_BYTE * opj_jp2_write_cdef(   opj_jp2_t *jp2,
    120 																		 OPJ_UINT32 * p_nb_bytes_written );
    121 
    122 /**
    123  * Writes the Colour Specification box.
    124  *
    125  * @param jp2					jpeg2000 file codec.
    126  * @param p_nb_bytes_written	pointer to store the nb of bytes written by the function.
    127  *
    128  * @return	the data being copied.
    129 */
    130 static OPJ_BYTE * opj_jp2_write_colr(   opj_jp2_t *jp2,
    131 									    OPJ_UINT32 * p_nb_bytes_written );
    132 
    133 /**
    134  * Writes a FTYP box - File type box
    135  *
    136  * @param	cio			the stream to write data to.
    137  * @param	jp2			the jpeg2000 file codec.
    138  * @param	p_manager	the user event manager.
    139  *
    140  * @return	true if writing was successful.
    141  */
    142 static OPJ_BOOL opj_jp2_write_ftyp(	opj_jp2_t *jp2,
    143 									opj_stream_private_t *cio,
    144 									opj_event_mgr_t * p_manager );
    145 
    146 /**
    147  * Reads a a FTYP box - File type box
    148  *
    149  * @param	p_header_data	the data contained in the FTYP box.
    150  * @param	jp2				the jpeg2000 file codec.
    151  * @param	p_header_size	the size of the data contained in the FTYP box.
    152  * @param	p_manager		the user event manager.
    153  *
    154  * @return true if the FTYP box is valid.
    155  */
    156 static OPJ_BOOL opj_jp2_read_ftyp(	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 static OPJ_BOOL opj_jp2_skip_jp2c(	opj_jp2_t *jp2,
    162 						    opj_stream_private_t *cio,
    163 						    opj_event_mgr_t * p_manager );
    164 
    165 /**
    166  * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
    167  *
    168  * @param	p_header_data	the data contained in the file header box.
    169  * @param	jp2				the jpeg2000 file codec.
    170  * @param	p_header_size	the size of the data contained in the file header box.
    171  * @param	p_manager		the user event manager.
    172  *
    173  * @return true if the JP2 Header box was successfully recognized.
    174 */
    175 static OPJ_BOOL opj_jp2_read_jp2h(  opj_jp2_t *jp2,
    176                                     OPJ_BYTE *p_header_data,
    177                                     OPJ_UINT32 p_header_size,
    178                                     opj_event_mgr_t * p_manager );
    179 
    180 /**
    181  * Writes the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
    182  *
    183  * @param  jp2      the jpeg2000 file codec.
    184  * @param  stream      the stream to write data to.
    185  * @param  p_manager  user event manager.
    186  *
    187  * @return true if writing was successful.
    188  */
    189 static OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
    190 														opj_stream_private_t *stream,
    191 														opj_event_mgr_t * p_manager );
    192 
    193 /**
    194  * Writes the Jpeg2000 codestream Header box - JP2C Header box. This function must be called AFTER the coding has been done.
    195  *
    196  * @param	cio			the stream to write data to.
    197  * @param	jp2			the jpeg2000 file codec.
    198  * @param	p_manager	user event manager.
    199  *
    200  * @return true if writing was successful.
    201 */
    202 static OPJ_BOOL opj_jp2_write_jp2c(	opj_jp2_t *jp2,
    203 								    opj_stream_private_t *cio,
    204 								    opj_event_mgr_t * p_manager );
    205 
    206 #ifdef USE_JPIP
    207 /**
    208  * Write index Finder box
    209  * @param cio     the stream to write to.
    210  * @param	jp2			the jpeg2000 file codec.
    211  * @param	p_manager	user event manager.
    212 */
    213 static OPJ_BOOL opj_jpip_write_iptr(	opj_jp2_t *jp2,
    214 								    opj_stream_private_t *cio,
    215 								    opj_event_mgr_t * p_manager );
    216 
    217 /**
    218  * Write index Finder box
    219  * @param cio     the stream to write to.
    220  * @param	jp2			the jpeg2000 file codec.
    221  * @param	p_manager	user event manager.
    222  */
    223 static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
    224   opj_stream_private_t *cio,
    225   opj_event_mgr_t * p_manager );
    226 
    227 /**
    228  * Write file Index (superbox)
    229  * @param cio     the stream to write to.
    230  * @param	jp2			the jpeg2000 file codec.
    231  * @param	p_manager	user event manager.
    232  */
    233 static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
    234   opj_stream_private_t *cio,
    235   opj_event_mgr_t * p_manager );
    236 #endif /* USE_JPIP */
    237 
    238 /**
    239  * Reads a jpeg2000 file signature box.
    240  *
    241  * @param	p_header_data	the data contained in the signature box.
    242  * @param	jp2				the jpeg2000 file codec.
    243  * @param	p_header_size	the size of the data contained in the signature box.
    244  * @param	p_manager		the user event manager.
    245  *
    246  * @return true if the file signature box is valid.
    247  */
    248 static OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,
    249                                 OPJ_BYTE * p_header_data,
    250                                 OPJ_UINT32 p_header_size,
    251                                 opj_event_mgr_t * p_manager);
    252 
    253 /**
    254  * Writes a jpeg2000 file signature box.
    255  *
    256  * @param cio the stream to write data to.
    257  * @param	jp2			the jpeg2000 file codec.
    258  * @param p_manager the user event manager.
    259  *
    260  * @return true if writing was successful.
    261  */
    262 static OPJ_BOOL opj_jp2_write_jp(	opj_jp2_t *jp2,
    263 			    	        	    opj_stream_private_t *cio,
    264 				            		opj_event_mgr_t * p_manager );
    265 
    266 /**
    267 Apply collected palette data
    268 @param color Collector for profile, cdef and pclr data
    269 @param image
    270 */
    271 static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color);
    272 
    273 static void opj_jp2_free_pclr(opj_jp2_color_t *color);
    274 
    275 /**
    276  * Collect palette data
    277  *
    278  * @param jp2 JP2 handle
    279  * @param p_pclr_header_data    FIXME DOC
    280  * @param p_pclr_header_size    FIXME DOC
    281  * @param p_manager
    282  *
    283  * @return Returns true if successful, returns false otherwise
    284 */
    285 static OPJ_BOOL opj_jp2_read_pclr(	opj_jp2_t *jp2,
    286                                     OPJ_BYTE * p_pclr_header_data,
    287                                     OPJ_UINT32 p_pclr_header_size,
    288                                     opj_event_mgr_t * p_manager );
    289 
    290 /**
    291  * Collect component mapping data
    292  *
    293  * @param jp2                 JP2 handle
    294  * @param p_cmap_header_data  FIXME DOC
    295  * @param p_cmap_header_size  FIXME DOC
    296  * @param p_manager           FIXME DOC
    297  *
    298  * @return Returns true if successful, returns false otherwise
    299 */
    300 
    301 static OPJ_BOOL opj_jp2_read_cmap(	opj_jp2_t * jp2,
    302                                     OPJ_BYTE * p_cmap_header_data,
    303                                     OPJ_UINT32 p_cmap_header_size,
    304                                     opj_event_mgr_t * p_manager );
    305 
    306 /**
    307  * Reads the Color Specification box.
    308  *
    309  * @param	p_colr_header_data			pointer to actual data (already read from file)
    310  * @param	jp2							the jpeg2000 file codec.
    311  * @param	p_colr_header_size			the size of the color header
    312  * @param	p_manager					the user event manager.
    313  *
    314  * @return	true if the bpc header is valid, fale else.
    315 */
    316 static OPJ_BOOL opj_jp2_read_colr(  opj_jp2_t *jp2,
    317                                     OPJ_BYTE * p_colr_header_data,
    318                                     OPJ_UINT32 p_colr_header_size,
    319                                     opj_event_mgr_t * p_manager );
    320 
    321 /*@}*/
    322 
    323 /*@}*/
    324 
    325 /**
    326  * Sets up the procedures to do on writing header after the codestream.
    327  * Developpers wanting to extend the library can add their own writing procedures.
    328  */
    329 static OPJ_BOOL opj_jp2_setup_end_header_writing (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
    330 
    331 /**
    332  * Sets up the procedures to do on reading header after the codestream.
    333  * Developpers wanting to extend the library can add their own writing procedures.
    334  */
    335 static OPJ_BOOL opj_jp2_setup_end_header_reading (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
    336 
    337 /**
    338  * Reads a jpeg2000 file header structure.
    339  *
    340  * @param jp2 the jpeg2000 file header structure.
    341  * @param stream the stream to read data from.
    342  * @param p_manager the user event manager.
    343  *
    344  * @return true if the box is valid.
    345  */
    346 static OPJ_BOOL opj_jp2_read_header_procedure(  opj_jp2_t *jp2,
    347                                                 opj_stream_private_t *stream,
    348                                                 opj_event_mgr_t * p_manager );
    349 
    350 /**
    351  * Excutes the given procedures on the given codec.
    352  *
    353  * @param	p_procedure_list	the list of procedures to execute
    354  * @param	jp2					the jpeg2000 file codec to execute the procedures on.
    355  * @param	stream					the stream to execute the procedures on.
    356  * @param	p_manager			the user manager.
    357  *
    358  * @return	true				if all the procedures were successfully executed.
    359  */
    360 static OPJ_BOOL opj_jp2_exec (  opj_jp2_t * jp2,
    361                                 opj_procedure_list_t * p_procedure_list,
    362                                 opj_stream_private_t *stream,
    363                                 opj_event_mgr_t * p_manager );
    364 
    365 /**
    366  * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure.
    367  *
    368  * @param	cio						the input stream to read data from.
    369  * @param	box						the box structure to fill.
    370  * @param	p_number_bytes_read		pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
    371  * @param	p_manager				user event manager.
    372  *
    373  * @return	true if the box is recognized, false otherwise
    374 */
    375 static OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
    376                                     OPJ_UINT32 * p_number_bytes_read,
    377                                     opj_stream_private_t *cio,
    378                                     opj_event_mgr_t * p_manager);
    379 
    380 /**
    381  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
    382  * are valid. Developpers wanting to extend the library can add their own validation procedures.
    383  */
    384 static OPJ_BOOL opj_jp2_setup_encoding_validation (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
    385 
    386 /**
    387  * Sets up the procedures to do on writing header. Developpers wanting to extend the library can add their own writing procedures.
    388  */
    389 static OPJ_BOOL opj_jp2_setup_header_writing (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
    390 
    391 static OPJ_BOOL opj_jp2_default_validation (	opj_jp2_t * jp2,
    392                                         opj_stream_private_t *cio,
    393                                         opj_event_mgr_t * p_manager );
    394 
    395 /**
    396  * Finds the image execution function related to the given box id.
    397  *
    398  * @param	p_id	the id of the handler to fetch.
    399  *
    400  * @return	the given handler or NULL if it could not be found.
    401  */
    402 static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id);
    403 
    404 /**
    405  * Finds the execution function related to the given box id.
    406  *
    407  * @param	p_id	the id of the handler to fetch.
    408  *
    409  * @return	the given handler or NULL if it could not be found.
    410  */
    411 static const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id );
    412 
    413 static const opj_jp2_header_handler_t jp2_header [] =
    414 {
    415 	{JP2_JP,opj_jp2_read_jp},
    416 	{JP2_FTYP,opj_jp2_read_ftyp},
    417 	{JP2_JP2H,opj_jp2_read_jp2h}
    418 };
    419 
    420 static const opj_jp2_header_handler_t jp2_img_header [] =
    421 {
    422 	{JP2_IHDR,opj_jp2_read_ihdr},
    423 	{JP2_COLR,opj_jp2_read_colr},
    424 	{JP2_BPCC,opj_jp2_read_bpcc},
    425 	{JP2_PCLR,opj_jp2_read_pclr},
    426 	{JP2_CMAP,opj_jp2_read_cmap},
    427 	{JP2_CDEF,opj_jp2_read_cdef}
    428 
    429 };
    430 
    431 /**
    432  * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure. Data is read from a character string
    433  *
    434  * @param	box						the box structure to fill.
    435  * @param	p_data					the character string to read data from.
    436  * @param	p_number_bytes_read		pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
    437  * @param	p_box_max_size			the maximum number of bytes in the box.
    438  * @param	p_manager         FIXME DOC
    439  *
    440  * @return	true if the box is recognized, false otherwise
    441 */
    442 static OPJ_BOOL opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,
    443                                             OPJ_BYTE * p_data,
    444                                             OPJ_UINT32 * p_number_bytes_read,
    445                                             OPJ_UINT32 p_box_max_size,
    446                                             opj_event_mgr_t * p_manager );
    447 
    448 /**
    449  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
    450  * are valid. Developpers wanting to extend the library can add their own validation procedures.
    451  */
    452 static OPJ_BOOL opj_jp2_setup_decoding_validation (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
    453 
    454 /**
    455  * Sets up the procedures to do on reading header.
    456  * Developpers wanting to extend the library can add their own writing procedures.
    457  */
    458 static OPJ_BOOL opj_jp2_setup_header_reading (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
    459 
    460 /* ----------------------------------------------------------------------- */
    461 static OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
    462                               OPJ_UINT32 * p_number_bytes_read,
    463                               opj_stream_private_t *cio,
    464                               opj_event_mgr_t * p_manager )
    465 {
    466 	/* read header from file */
    467 	OPJ_BYTE l_data_header [8];
    468 
    469 	/* preconditions */
    470 	assert(cio != 00);
    471 	assert(box != 00);
    472 	assert(p_number_bytes_read != 00);
    473 	assert(p_manager != 00);
    474 
    475 	*p_number_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);
    476 	if (*p_number_bytes_read != 8) {
    477 		return OPJ_FALSE;
    478 	}
    479 
    480 	/* process read data */
    481 	opj_read_bytes(l_data_header,&(box->length), 4);
    482 	opj_read_bytes(l_data_header+4,&(box->type), 4);
    483 
    484   if(box->length == 0)/* last box */
    485     {
    486     const OPJ_OFF_T bleft = opj_stream_get_number_byte_left(cio);
    487     box->length = (OPJ_UINT32)bleft;
    488     assert( (OPJ_OFF_T)box->length == bleft );
    489     return OPJ_TRUE;
    490     }
    491 
    492 	/* do we have a "special very large box ?" */
    493 	/* read then the XLBox */
    494 	if (box->length == 1) {
    495 		OPJ_UINT32 l_xl_part_size;
    496 
    497 		OPJ_UINT32 l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);
    498 		if (l_nb_bytes_read != 8) {
    499 			if (l_nb_bytes_read > 0) {
    500 				*p_number_bytes_read += l_nb_bytes_read;
    501 			}
    502 
    503 			return OPJ_FALSE;
    504 		}
    505 
    506         *p_number_bytes_read = 16;
    507 		opj_read_bytes(l_data_header,&l_xl_part_size, 4);
    508 		if (l_xl_part_size != 0) {
    509 			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
    510 			return OPJ_FALSE;
    511 		}
    512 		opj_read_bytes(l_data_header+4,&(box->length), 4);
    513 	}
    514     return OPJ_TRUE;
    515 }
    516 
    517 #if 0
    518 static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
    519 	OPJ_UINT32 i;
    520 	opj_jp2_box_t box;
    521 
    522 	box.init_pos = cio_tell(cio);
    523 	cio_skip(cio, 4);
    524 	cio_write(cio, JP2_URL, 4);	/* DBTL */
    525 	cio_write(cio, 0, 1);		/* VERS */
    526 	cio_write(cio, 0, 3);		/* FLAG */
    527 
    528 	if(Idx_file) {
    529 		for (i = 0; i < strlen(Idx_file); i++) {
    530 			cio_write(cio, Idx_file[i], 1);
    531 		}
    532 	}
    533 
    534 	box.length = cio_tell(cio) - box.init_pos;
    535 	cio_seek(cio, box.init_pos);
    536 	cio_write(cio, box.length, 4);	/* L */
    537 	cio_seek(cio, box.init_pos + box.length);
    538 }
    539 #endif
    540 
    541 static OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
    542                             OPJ_BYTE *p_image_header_data,
    543                             OPJ_UINT32 p_image_header_size,
    544                             opj_event_mgr_t * p_manager )
    545 {
    546 	/* preconditions */
    547 	assert(p_image_header_data != 00);
    548 	assert(jp2 != 00);
    549 	assert(p_manager != 00);
    550 
    551 	if (p_image_header_size != 14) {
    552 		opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
    553 		return OPJ_FALSE;
    554 	}
    555 
    556 	opj_read_bytes(p_image_header_data,&(jp2->h),4);			/* HEIGHT */
    557 	p_image_header_data += 4;
    558 	opj_read_bytes(p_image_header_data,&(jp2->w),4);			/* WIDTH */
    559 	p_image_header_data += 4;
    560 	opj_read_bytes(p_image_header_data,&(jp2->numcomps),2);		/* NC */
    561 	p_image_header_data += 2;
    562 
    563 	/* allocate memory for components */
    564 	jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps, sizeof(opj_jp2_comps_t));
    565 	if (jp2->comps == 0) {
    566 		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n");
    567 		return OPJ_FALSE;
    568 	}
    569 
    570 	opj_read_bytes(p_image_header_data,&(jp2->bpc),1);			/* BPC */
    571 	++ p_image_header_data;
    572 
    573 	opj_read_bytes(p_image_header_data,&(jp2->C),1);			/* C */
    574 	++ p_image_header_data;
    575 
    576 	/* Should be equal to 7 cf. chapter about image header box of the norm */
    577 	if (jp2->C != 7){
    578 		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);
    579 	}
    580 
    581 	opj_read_bytes(p_image_header_data,&(jp2->UnkC),1);			/* UnkC */
    582 	++ p_image_header_data;
    583 	opj_read_bytes(p_image_header_data,&(jp2->IPR),1);			/* IPR */
    584 	++ p_image_header_data;
    585 
    586 	return OPJ_TRUE;
    587 }
    588 
    589 static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
    590                               OPJ_UINT32 * p_nb_bytes_written
    591                               )
    592 {
    593 	OPJ_BYTE * l_ihdr_data,* l_current_ihdr_ptr;
    594 
    595 	/* preconditions */
    596 	assert(jp2 != 00);
    597 	assert(p_nb_bytes_written != 00);
    598 
    599 	/* default image header is 22 bytes wide */
    600 	l_ihdr_data = (OPJ_BYTE *) opj_calloc(1,22);
    601 	if (l_ihdr_data == 00) {
    602 		return 00;
    603 	}
    604 
    605 	l_current_ihdr_ptr = l_ihdr_data;
    606 
    607 	opj_write_bytes(l_current_ihdr_ptr,22,4);				/* write box size */
    608 	l_current_ihdr_ptr+=4;
    609 
    610 	opj_write_bytes(l_current_ihdr_ptr,JP2_IHDR, 4);		/* IHDR */
    611 	l_current_ihdr_ptr+=4;
    612 
    613 	opj_write_bytes(l_current_ihdr_ptr,jp2->h, 4);		/* HEIGHT */
    614 	l_current_ihdr_ptr+=4;
    615 
    616 	opj_write_bytes(l_current_ihdr_ptr, jp2->w, 4);		/* WIDTH */
    617 	l_current_ihdr_ptr+=4;
    618 
    619 	opj_write_bytes(l_current_ihdr_ptr, jp2->numcomps, 2);		/* NC */
    620 	l_current_ihdr_ptr+=2;
    621 
    622 	opj_write_bytes(l_current_ihdr_ptr, jp2->bpc, 1);		/* BPC */
    623 	++l_current_ihdr_ptr;
    624 
    625 	opj_write_bytes(l_current_ihdr_ptr, jp2->C, 1);		/* C : Always 7 */
    626 	++l_current_ihdr_ptr;
    627 
    628 	opj_write_bytes(l_current_ihdr_ptr, jp2->UnkC, 1);		/* UnkC, colorspace unknown */
    629 	++l_current_ihdr_ptr;
    630 
    631 	opj_write_bytes(l_current_ihdr_ptr, jp2->IPR, 1);		/* IPR, no intellectual property */
    632 	++l_current_ihdr_ptr;
    633 
    634 	*p_nb_bytes_written = 22;
    635 
    636 	return l_ihdr_data;
    637 }
    638 
    639 static OPJ_BYTE * opj_jp2_write_bpcc(	opj_jp2_t *jp2,
    640 						        OPJ_UINT32 * p_nb_bytes_written
    641                                 )
    642 {
    643 	OPJ_UINT32 i;
    644 	/* room for 8 bytes for box and 1 byte for each component */
    645 	OPJ_UINT32 l_bpcc_size = 8 + jp2->numcomps;
    646 	OPJ_BYTE * l_bpcc_data,* l_current_bpcc_ptr;
    647 
    648 	/* preconditions */
    649 	assert(jp2 != 00);
    650 	assert(p_nb_bytes_written != 00);
    651 
    652 	l_bpcc_data = (OPJ_BYTE *) opj_calloc(1,l_bpcc_size);
    653 	if (l_bpcc_data == 00) {
    654 		return 00;
    655 	}
    656 
    657 	l_current_bpcc_ptr = l_bpcc_data;
    658 
    659 	opj_write_bytes(l_current_bpcc_ptr,l_bpcc_size,4);				/* write box size */
    660 	l_current_bpcc_ptr += 4;
    661 
    662 	opj_write_bytes(l_current_bpcc_ptr,JP2_BPCC,4);					/* BPCC */
    663 	l_current_bpcc_ptr += 4;
    664 
    665 	for (i = 0; i < jp2->numcomps; ++i)  {
    666 		opj_write_bytes(l_current_bpcc_ptr, jp2->comps[i].bpcc, 1); /* write each component information */
    667 		++l_current_bpcc_ptr;
    668 	}
    669 
    670 	*p_nb_bytes_written = l_bpcc_size;
    671 
    672 	return l_bpcc_data;
    673 }
    674 
    675 static OPJ_BOOL opj_jp2_read_bpcc( opj_jp2_t *jp2,
    676                             OPJ_BYTE * p_bpc_header_data,
    677                             OPJ_UINT32 p_bpc_header_size,
    678                             opj_event_mgr_t * p_manager
    679                             )
    680 {
    681 	OPJ_UINT32 i;
    682 
    683 	/* preconditions */
    684 	assert(p_bpc_header_data != 00);
    685 	assert(jp2 != 00);
    686 	assert(p_manager != 00);
    687 
    688 
    689 	if (jp2->bpc != 255 ){
    690 		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);
    691 	}
    692 
    693 	/* and length is relevant */
    694 	if (p_bpc_header_size != jp2->numcomps) {
    695 		opj_event_msg(p_manager, EVT_ERROR, "Bad BPCC header box (bad size)\n");
    696 		return OPJ_FALSE;
    697 	}
    698 
    699 	/* read info for each component */
    700 	for (i = 0; i < jp2->numcomps; ++i) {
    701 		opj_read_bytes(p_bpc_header_data,&jp2->comps[i].bpcc ,1);	/* read each BPCC component */
    702 		++p_bpc_header_data;
    703 	}
    704 
    705 	return OPJ_TRUE;
    706 }
    707 static OPJ_BYTE * opj_jp2_write_cdef(opj_jp2_t *jp2, OPJ_UINT32 * p_nb_bytes_written)
    708 {
    709 	/* room for 8 bytes for box, 2 for n */
    710 	OPJ_UINT32 l_cdef_size = 10;
    711 	OPJ_BYTE * l_cdef_data,* l_current_cdef_ptr;
    712 	OPJ_UINT32 l_value;
    713 	OPJ_UINT16 i;
    714 
    715 	/* preconditions */
    716 	assert(jp2 != 00);
    717 	assert(p_nb_bytes_written != 00);
    718 	assert(jp2->color.jp2_cdef != 00);
    719 	assert(jp2->color.jp2_cdef->info != 00);
    720 	assert(jp2->color.jp2_cdef->n > 0U);
    721 
    722 	l_cdef_size += 6U * jp2->color.jp2_cdef->n;
    723 
    724 	l_cdef_data = (OPJ_BYTE *) opj_malloc(l_cdef_size);
    725 	if (l_cdef_data == 00) {
    726 		return 00;
    727 	}
    728 
    729 	l_current_cdef_ptr = l_cdef_data;
    730 
    731 	opj_write_bytes(l_current_cdef_ptr,l_cdef_size,4);			/* write box size */
    732 	l_current_cdef_ptr += 4;
    733 
    734 	opj_write_bytes(l_current_cdef_ptr,JP2_CDEF,4);					/* BPCC */
    735 	l_current_cdef_ptr += 4;
    736 
    737 	l_value = jp2->color.jp2_cdef->n;
    738 	opj_write_bytes(l_current_cdef_ptr,l_value,2);					/* N */
    739 	l_current_cdef_ptr += 2;
    740 
    741 	for (i = 0U; i < jp2->color.jp2_cdef->n; ++i) {
    742 		l_value = jp2->color.jp2_cdef->info[i].cn;
    743 		opj_write_bytes(l_current_cdef_ptr,l_value,2);					/* Cni */
    744 		l_current_cdef_ptr += 2;
    745 		l_value = jp2->color.jp2_cdef->info[i].typ;
    746 		opj_write_bytes(l_current_cdef_ptr,l_value,2);					/* Typi */
    747 		l_current_cdef_ptr += 2;
    748 		l_value = jp2->color.jp2_cdef->info[i].asoc;
    749 		opj_write_bytes(l_current_cdef_ptr,l_value,2);					/* Asoci */
    750 		l_current_cdef_ptr += 2;
    751 	}
    752 	*p_nb_bytes_written = l_cdef_size;
    753 
    754 	return l_cdef_data;
    755 }
    756 
    757 static OPJ_BYTE * opj_jp2_write_colr(  opj_jp2_t *jp2,
    758 							    OPJ_UINT32 * p_nb_bytes_written
    759                                 )
    760 {
    761 	/* room for 8 bytes for box 3 for common data and variable upon profile*/
    762 	OPJ_UINT32 l_colr_size = 11;
    763 	OPJ_BYTE * l_colr_data,* l_current_colr_ptr;
    764 
    765 	/* preconditions */
    766 	assert(jp2 != 00);
    767 	assert(p_nb_bytes_written != 00);
    768     assert(jp2->meth == 1 || jp2->meth == 2);
    769 
    770 	switch (jp2->meth) {
    771 		case 1 :
    772 			l_colr_size += 4; /* EnumCS */
    773 			break;
    774 		case 2 :
    775             assert(jp2->color.icc_profile_len);	/* ICC profile */
    776             l_colr_size += jp2->color.icc_profile_len;
    777 			break;
    778 		default :
    779 			return 00;
    780 	}
    781 
    782 	l_colr_data = (OPJ_BYTE *) opj_calloc(1,l_colr_size);
    783 	if (l_colr_data == 00) {
    784 		return 00;
    785 	}
    786 
    787 	l_current_colr_ptr = l_colr_data;
    788 
    789 	opj_write_bytes(l_current_colr_ptr,l_colr_size,4);				/* write box size */
    790 	l_current_colr_ptr += 4;
    791 
    792 	opj_write_bytes(l_current_colr_ptr,JP2_COLR,4);					/* BPCC */
    793 	l_current_colr_ptr += 4;
    794 
    795 	opj_write_bytes(l_current_colr_ptr, jp2->meth,1);				/* METH */
    796 	++l_current_colr_ptr;
    797 
    798 	opj_write_bytes(l_current_colr_ptr, jp2->precedence,1);			/* PRECEDENCE */
    799 	++l_current_colr_ptr;
    800 
    801 	opj_write_bytes(l_current_colr_ptr, jp2->approx,1);				/* APPROX */
    802 	++l_current_colr_ptr;
    803 
    804 	if (jp2->meth == 1) { /* Meth value is restricted to 1 or 2 (Table I.9 of part 1) */
    805         opj_write_bytes(l_current_colr_ptr, jp2->enumcs,4); }       /* EnumCS */
    806     else {
    807         if (jp2->meth == 2) {                                      /* ICC profile */
    808             OPJ_UINT32 i;
    809             for(i = 0; i < jp2->color.icc_profile_len; ++i) {
    810                 opj_write_bytes(l_current_colr_ptr, jp2->color.icc_profile_buf[i], 1);
    811                 ++l_current_colr_ptr;
    812             }
    813         }
    814 	}
    815 
    816 	*p_nb_bytes_written = l_colr_size;
    817 
    818 	return l_colr_data;
    819 }
    820 
    821 static void opj_jp2_free_pclr(opj_jp2_color_t *color)
    822 {
    823     opj_free(color->jp2_pclr->channel_sign);
    824     opj_free(color->jp2_pclr->channel_size);
    825     opj_free(color->jp2_pclr->entries);
    826 
    827 	if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
    828 
    829     opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
    830 }
    831 
    832 static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *p_manager)
    833 {
    834 	OPJ_UINT16 i;
    835 
    836 	/* testcase 4149.pdf.SIGSEGV.cf7.3501 */
    837 	if (color->jp2_cdef) {
    838 		opj_jp2_cdef_info_t *info = color->jp2_cdef->info;
    839 		OPJ_UINT16 n = color->jp2_cdef->n;
    840 		OPJ_UINT32 nr_channels = image->numcomps; /* FIXME image->numcomps == jp2->numcomps before color is applied ??? */
    841 
    842 		/* cdef applies to cmap channels if any */
    843 		if (color->jp2_pclr && color->jp2_pclr->cmap) {
    844 			nr_channels = (OPJ_UINT32)color->jp2_pclr->nr_channels;
    845 		}
    846 
    847 		for (i = 0; i < n; i++) {
    848 			if (info[i].cn >= nr_channels) {
    849 				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].cn, nr_channels);
    850 				return OPJ_FALSE;
    851 			}
    852 			if (info[i].asoc == 65535U) continue;
    853 
    854 			if (info[i].asoc > 0 && (OPJ_UINT32)(info[i].asoc - 1) >= nr_channels) {
    855 				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].asoc - 1, nr_channels);
    856 				return OPJ_FALSE;
    857 			}
    858 		}
    859 
    860 		/* issue 397 */
    861 		/* ISO 15444-1 states that if cdef is present, it shall contain a complete list of channel definitions. */
    862 		while (nr_channels > 0)
    863 		{
    864 			for(i = 0; i < n; ++i) {
    865 				if ((OPJ_UINT32)info[i].cn == (nr_channels - 1U)) {
    866 					break;
    867 				}
    868 			}
    869 			if (i == n) {
    870 				opj_event_msg(p_manager, EVT_ERROR, "Incomplete channel definitions.\n");
    871 				return OPJ_FALSE;
    872 			}
    873 			--nr_channels;
    874 		}
    875 	}
    876 
    877 	/* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and
    878 	   66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */
    879 	if (color->jp2_pclr && color->jp2_pclr->cmap) {
    880 		OPJ_UINT16 nr_channels = color->jp2_pclr->nr_channels;
    881 		opj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap;
    882 		OPJ_BOOL *pcol_usage, is_sane = OPJ_TRUE;
    883 
    884 		/* verify that all original components match an existing one */
    885 		for (i = 0; i < nr_channels; i++) {
    886 			if (cmap[i].cmp >= image->numcomps) {
    887 				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", cmap[i].cmp, image->numcomps);
    888 				is_sane = OPJ_FALSE;
    889 			}
    890 		}
    891 
    892 		pcol_usage = opj_calloc(nr_channels, sizeof(OPJ_BOOL));
    893 		if (!pcol_usage) {
    894 			opj_event_msg(p_manager, EVT_ERROR, "Unexpected OOM.\n");
    895 			return OPJ_FALSE;
    896 		}
    897 		/* verify that no component is targeted more than once */
    898 		for (i = 0; i < nr_channels; i++) {
    899 			if (cmap[i].mtyp != 0 && cmap[i].mtyp != 1) {
    900 				opj_event_msg(p_manager, EVT_ERROR, "Unexpected MTYP value.\n");
    901 				opj_free(pcol_usage);
    902 				return OPJ_FALSE;
    903 			}
    904 			OPJ_UINT16 pcol = cmap[i].pcol;
    905 			if (pcol >= nr_channels) {
    906 				opj_event_msg(p_manager, EVT_ERROR, "Invalid component/palette index for direct mapping %d.\n", pcol);
    907 				is_sane = OPJ_FALSE;
    908 			}
    909 			else if (pcol_usage[pcol] && cmap[i].mtyp != 0) {
    910 				opj_event_msg(p_manager, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
    911 				is_sane = OPJ_FALSE;
    912 			}
    913       else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) {
    914         /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then
    915          * the value of this field shall be 0. */
    916 				opj_event_msg(p_manager, EVT_ERROR, "Direct use at #%d however pcol=%d.\n", i, pcol);
    917 				is_sane = OPJ_FALSE;
    918       }
    919 			else
    920 				pcol_usage[pcol] = OPJ_TRUE;
    921 		}
    922 		/* verify that all components are targeted at least once */
    923 		for (i = 0; i < nr_channels; i++) {
    924 			if (!pcol_usage[i] && cmap[i].mtyp != 0) {
    925 				opj_event_msg(p_manager, EVT_ERROR, "Component %d doesn't have a mapping.\n", i);
    926 				is_sane = OPJ_FALSE;
    927 			}
    928 		}
    929 		/* Issue 235/447 weird cmap */
    930 		if (1 && is_sane && (image->numcomps==1U)) {
    931 			for (i = 0; i < nr_channels; i++) {
    932 				if (!pcol_usage[i]) {
    933 					is_sane = 0U;
    934 					opj_event_msg(p_manager, EVT_WARNING, "Component mapping seems wrong. Trying to correct.\n", i);
    935 					break;
    936 				}
    937 			}
    938 			if (!is_sane) {
    939 				is_sane = OPJ_TRUE;
    940 				for (i = 0; i < nr_channels; i++) {
    941 					cmap[i].mtyp = 1U;
    942 					cmap[i].pcol = (OPJ_BYTE) i;
    943 				}
    944 			}
    945 		}
    946 		opj_free(pcol_usage);
    947 		if (!is_sane) {
    948 			return OPJ_FALSE;
    949 		}
    950 	}
    951 
    952 	return OPJ_TRUE;
    953 }
    954 
    955 /* file9.jp2 */
    956 static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
    957 {
    958 	opj_image_comp_t *old_comps, *new_comps;
    959 	OPJ_BYTE *channel_size, *channel_sign;
    960 	OPJ_UINT32 *entries;
    961 	opj_jp2_cmap_comp_t *cmap;
    962 	OPJ_INT32 *src, *dst;
    963 	OPJ_UINT32 j, max;
    964 	OPJ_UINT16 i, nr_channels, cmp, pcol;
    965 	OPJ_INT32 k, top_k;
    966 
    967 	channel_size = color->jp2_pclr->channel_size;
    968 	channel_sign = color->jp2_pclr->channel_sign;
    969 	entries = color->jp2_pclr->entries;
    970 	cmap = color->jp2_pclr->cmap;
    971 	nr_channels = color->jp2_pclr->nr_channels;
    972 
    973 	old_comps = image->comps;
    974 	new_comps = (opj_image_comp_t*)
    975 			opj_malloc(nr_channels * sizeof(opj_image_comp_t));
    976 	if (!new_comps) {
    977 		/* FIXME no error code for opj_jp2_apply_pclr */
    978 		/* FIXME event manager error callback */
    979 		return;
    980 	}
    981 	for(i = 0; i < nr_channels; ++i) {
    982 		pcol = cmap[i].pcol; cmp = cmap[i].cmp;
    983 
    984 		/* Direct use */
    985     if(cmap[i].mtyp == 0){
    986       assert( pcol == 0 );
    987       new_comps[i] = old_comps[cmp];
    988     } else {
    989       assert( i == pcol ); // probably wrong?
    990       new_comps[i] = old_comps[cmp];
    991     }
    992 
    993 		/* Palette mapping: */
    994 		new_comps[i].data = (OPJ_INT32*)
    995 				opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));
    996 		if (!new_comps[i].data) {
    997 			opj_free(new_comps);
    998 			new_comps = NULL;
    999 			/* FIXME no error code for opj_jp2_apply_pclr */
   1000 			/* FIXME event manager error callback */
   1001 			return;
   1002 		}
   1003 		new_comps[i].prec = channel_size[i];
   1004 		new_comps[i].sgnd = channel_sign[i];
   1005 	}
   1006 
   1007 	top_k = color->jp2_pclr->nr_entries - 1;
   1008 
   1009 	for(i = 0; i < nr_channels; ++i) {
   1010 		/* Palette mapping: */
   1011 		cmp = cmap[i].cmp; pcol = cmap[i].pcol;
   1012 		src = old_comps[cmp].data;
   1013     assert( src );
   1014 		max = new_comps[i].w * new_comps[i].h;
   1015 
   1016 		/* Direct use: */
   1017     if(cmap[i].mtyp == 0) {
   1018       assert( cmp == 0 ); // probably wrong.
   1019       dst = new_comps[i].data;
   1020       assert( dst );
   1021       for(j = 0; j < max; ++j) {
   1022         dst[j] = src[j];
   1023       }
   1024     }
   1025     else {
   1026       assert( i == pcol ); // probably wrong?
   1027       dst = new_comps[i].data;
   1028       assert( dst );
   1029       for(j = 0; j < max; ++j) {
   1030         /* The index */
   1031         if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;
   1032 
   1033         /* The colour */
   1034         dst[j] = (OPJ_INT32)entries[k * nr_channels + pcol];
   1035         }
   1036     }
   1037 	}
   1038 
   1039 	max = image->numcomps;
   1040 	for(i = 0; i < max; ++i) {
   1041 		if(old_comps[i].data) opj_free(old_comps[i].data);
   1042 	}
   1043 
   1044 	opj_free(old_comps);
   1045 	image->comps = new_comps;
   1046 	image->numcomps = nr_channels;
   1047 
   1048 	opj_jp2_free_pclr(color);
   1049 
   1050 }/* apply_pclr() */
   1051 
   1052 static OPJ_BOOL opj_jp2_read_pclr(	opj_jp2_t *jp2,
   1053                             OPJ_BYTE * p_pclr_header_data,
   1054                             OPJ_UINT32 p_pclr_header_size,
   1055                             opj_event_mgr_t * p_manager
   1056                             )
   1057 {
   1058 	opj_jp2_pclr_t *jp2_pclr;
   1059 	OPJ_BYTE *channel_size, *channel_sign;
   1060 	OPJ_UINT32 *entries;
   1061 	OPJ_UINT16 nr_entries,nr_channels;
   1062 	OPJ_UINT16 i, j;
   1063 	OPJ_UINT32 l_value;
   1064 	OPJ_BYTE *orig_header_data = p_pclr_header_data;
   1065 
   1066 	/* preconditions */
   1067 	assert(p_pclr_header_data != 00);
   1068 	assert(jp2 != 00);
   1069 	assert(p_manager != 00);
   1070     (void)p_pclr_header_size;
   1071 
   1072 	if(jp2->color.jp2_pclr)
   1073 		return OPJ_FALSE;
   1074 
   1075 	if (p_pclr_header_size < 3)
   1076 		return OPJ_FALSE;
   1077 
   1078 	opj_read_bytes(p_pclr_header_data, &l_value , 2);	/* NE */
   1079 	p_pclr_header_data += 2;
   1080 	nr_entries = (OPJ_UINT16) l_value;
   1081 	if ((nr_entries == 0U) || (nr_entries > 1024U)) {
   1082 		opj_event_msg(p_manager, EVT_ERROR, "Invalid PCLR box. Reports %d entries\n", (int)nr_entries);
   1083 		return OPJ_FALSE;
   1084 	}
   1085 
   1086 	opj_read_bytes(p_pclr_header_data, &l_value , 1);	/* NPC */
   1087 	++p_pclr_header_data;
   1088 	nr_channels = (OPJ_UINT16) l_value;
   1089 	if (nr_channels == 0U) {
   1090 		opj_event_msg(p_manager, EVT_ERROR, "Invalid PCLR box. Reports 0 palette columns\n");
   1091 		return OPJ_FALSE;
   1092 	}
   1093 
   1094 	if (p_pclr_header_size < 3 + (OPJ_UINT32)nr_channels)
   1095 		return OPJ_FALSE;
   1096 
   1097 	entries = (OPJ_UINT32*) opj_malloc((size_t)nr_channels * nr_entries * sizeof(OPJ_UINT32));
   1098     if (!entries)
   1099         return OPJ_FALSE;
   1100 	channel_size = (OPJ_BYTE*) opj_malloc(nr_channels);
   1101     if (!channel_size)
   1102     {
   1103         opj_free(entries);
   1104         return OPJ_FALSE;
   1105     }
   1106 	channel_sign = (OPJ_BYTE*) opj_malloc(nr_channels);
   1107 	if (!channel_sign)
   1108 	{
   1109         opj_free(entries);
   1110         opj_free(channel_size);
   1111         return OPJ_FALSE;
   1112 	}
   1113 
   1114 	jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
   1115     if (!jp2_pclr)
   1116     {
   1117         opj_free(entries);
   1118         opj_free(channel_size);
   1119         opj_free(channel_sign);
   1120         return OPJ_FALSE;
   1121     }
   1122 
   1123 	jp2_pclr->channel_sign = channel_sign;
   1124 	jp2_pclr->channel_size = channel_size;
   1125 	jp2_pclr->entries = entries;
   1126 	jp2_pclr->nr_entries = nr_entries;
   1127 	jp2_pclr->nr_channels = (OPJ_BYTE) l_value;
   1128 	jp2_pclr->cmap = NULL;
   1129 
   1130 	jp2->color.jp2_pclr = jp2_pclr;
   1131 
   1132 	for(i = 0; i < nr_channels; ++i) {
   1133 		opj_read_bytes(p_pclr_header_data, &l_value , 1);	/* Bi */
   1134 		++p_pclr_header_data;
   1135 
   1136 		channel_size[i] = (OPJ_BYTE)((l_value & 0x7f) + 1);
   1137 		channel_sign[i] = (l_value & 0x80) ? 1 : 0;
   1138 	}
   1139 
   1140 	for(j = 0; j < nr_entries; ++j) {
   1141 		for(i = 0; i < nr_channels; ++i) {
   1142 			OPJ_UINT32 bytes_to_read = (OPJ_UINT32)((channel_size[i]+7)>>3);
   1143 
   1144 			if (bytes_to_read > sizeof(OPJ_UINT32))
   1145 				bytes_to_read = sizeof(OPJ_UINT32);
   1146 			if ((ptrdiff_t)p_pclr_header_size < (ptrdiff_t)(p_pclr_header_data - orig_header_data) + (ptrdiff_t)bytes_to_read)
   1147 				return OPJ_FALSE;
   1148 
   1149 			opj_read_bytes(p_pclr_header_data, &l_value , bytes_to_read);	/* Cji */
   1150 			p_pclr_header_data += bytes_to_read;
   1151 			*entries = (OPJ_UINT32) l_value;
   1152 			entries++;
   1153 		}
   1154 	}
   1155 
   1156 	return OPJ_TRUE;
   1157 }
   1158 
   1159 static OPJ_BOOL opj_jp2_read_cmap(	opj_jp2_t * jp2,
   1160                             OPJ_BYTE * p_cmap_header_data,
   1161                             OPJ_UINT32 p_cmap_header_size,
   1162                             opj_event_mgr_t * p_manager
   1163                             )
   1164 {
   1165 	opj_jp2_cmap_comp_t *cmap;
   1166 	OPJ_BYTE i, nr_channels;
   1167 	OPJ_UINT32 l_value;
   1168 
   1169 	/* preconditions */
   1170 	assert(jp2 != 00);
   1171 	assert(p_cmap_header_data != 00);
   1172 	assert(p_manager != 00);
   1173     (void)p_cmap_header_size;
   1174 
   1175 	/* Need nr_channels: */
   1176 	if(jp2->color.jp2_pclr == NULL) {
   1177 		opj_event_msg(p_manager, EVT_ERROR, "Need to read a PCLR box before the CMAP box.\n");
   1178 		return OPJ_FALSE;
   1179 	}
   1180 
   1181 	/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
   1182 	 * inside a JP2 Header box' :
   1183 	*/
   1184 	if(jp2->color.jp2_pclr->cmap) {
   1185 		opj_event_msg(p_manager, EVT_ERROR, "Only one CMAP box is allowed.\n");
   1186 		return OPJ_FALSE;
   1187 	}
   1188 
   1189 	nr_channels = jp2->color.jp2_pclr->nr_channels;
   1190 	if (p_cmap_header_size < (OPJ_UINT32)nr_channels * 4) {
   1191 		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CMAP box.\n");
   1192 		return OPJ_FALSE;
   1193 	}
   1194 
   1195 	cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
   1196     if (!cmap)
   1197         return OPJ_FALSE;
   1198 
   1199 
   1200 	for(i = 0; i < nr_channels; ++i) {
   1201 		opj_read_bytes_BE(p_cmap_header_data, &l_value, 2);			/* CMP^i */
   1202 		p_cmap_header_data +=2;
   1203 		cmap[i].cmp = (OPJ_UINT16) l_value;
   1204 
   1205 		opj_read_bytes(p_cmap_header_data, &l_value, 1);			/* MTYP^i */
   1206 		++p_cmap_header_data;
   1207 		cmap[i].mtyp = (OPJ_BYTE) l_value;
   1208 
   1209 		opj_read_bytes(p_cmap_header_data, &l_value, 1);			/* PCOL^i */
   1210 		++p_cmap_header_data;
   1211 		cmap[i].pcol = (OPJ_BYTE) l_value;
   1212 	}
   1213 
   1214 	jp2->color.jp2_pclr->cmap = cmap;
   1215 
   1216 	return OPJ_TRUE;
   1217 }
   1218 
   1219 static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *manager)
   1220 {
   1221 	opj_jp2_cdef_info_t *info;
   1222 	OPJ_UINT16 i, n, cn, asoc, acn;
   1223 
   1224 	info = color->jp2_cdef->info;
   1225 	n = color->jp2_cdef->n;
   1226 
   1227 	for(i = 0; i < n; ++i)
   1228 	{
   1229 		/* WATCH: acn = asoc - 1 ! */
   1230 		asoc = info[i].asoc;
   1231 		cn = info[i].cn;
   1232 
   1233 		if( cn >= image->numcomps)
   1234 		{
   1235 			opj_event_msg(manager, EVT_WARNING, "opj_jp2_apply_cdef: cn=%d, numcomps=%d\n", cn, image->numcomps);
   1236 			continue;
   1237 		}
   1238 		if(asoc == 0 || asoc == 65535)
   1239 		{
   1240 			image->comps[cn].alpha = info[i].typ;
   1241 			continue;
   1242 		}
   1243 
   1244 		acn = (OPJ_UINT16)(asoc - 1);
   1245 		if( acn >= image->numcomps )
   1246 		{
   1247 			opj_event_msg(manager, EVT_WARNING, "opj_jp2_apply_cdef: acn=%d, numcomps=%d\n", acn, image->numcomps);
   1248 			continue;
   1249 		}
   1250 
   1251 		/* Swap only if color channel */
   1252 		if((cn != acn) && (info[i].typ == 0))
   1253 		{
   1254 			opj_image_comp_t saved;
   1255 			OPJ_UINT16 j;
   1256 
   1257 			memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
   1258 			memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
   1259 			memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
   1260 
   1261 			/* Swap channels in following channel definitions, don't bother with j <= i that are already processed */
   1262 			for (j = (OPJ_UINT16)(i + 1U); j < n ; ++j)
   1263 			{
   1264 				if (info[j].cn == cn) {
   1265 					info[j].cn = acn;
   1266 				}
   1267 				else if (info[j].cn == acn) {
   1268 					info[j].cn = cn;
   1269 				}
   1270 				/* asoc is related to color index. Do not update. */
   1271 			}
   1272 		}
   1273 
   1274 		image->comps[cn].alpha = info[i].typ;
   1275 	}
   1276 
   1277 	if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
   1278 
   1279 	opj_free(color->jp2_cdef); color->jp2_cdef = NULL;
   1280 
   1281 }/* jp2_apply_cdef() */
   1282 
   1283 static OPJ_BOOL opj_jp2_read_cdef(	opj_jp2_t * jp2,
   1284                             OPJ_BYTE * p_cdef_header_data,
   1285 							OPJ_UINT32 p_cdef_header_size,
   1286 							opj_event_mgr_t * p_manager
   1287                             )
   1288 {
   1289 	opj_jp2_cdef_info_t *cdef_info;
   1290 	OPJ_UINT16 i;
   1291 	OPJ_UINT32 l_value;
   1292 
   1293 	/* preconditions */
   1294 	assert(jp2 != 00);
   1295 	assert(p_cdef_header_data != 00);
   1296 	assert(p_manager != 00);
   1297     (void)p_cdef_header_size;
   1298 
   1299 	/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
   1300 	 * inside a JP2 Header box.'*/
   1301 	if(jp2->color.jp2_cdef) return OPJ_FALSE;
   1302 
   1303 	if (p_cdef_header_size < 2) {
   1304 		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
   1305 		return OPJ_FALSE;
   1306 	}
   1307 
   1308 	opj_read_bytes(p_cdef_header_data,&l_value ,2);			/* N */
   1309 	p_cdef_header_data+= 2;
   1310 
   1311 	if ( (OPJ_UINT16)l_value == 0){ /* szukw000: FIXME */
   1312 		opj_event_msg(p_manager, EVT_ERROR, "Number of channel description is equal to zero in CDEF box.\n");
   1313 		return OPJ_FALSE;
   1314 	}
   1315 
   1316 	if (p_cdef_header_size < 2 + (OPJ_UINT32)(OPJ_UINT16)l_value * 6) {
   1317 		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
   1318 		return OPJ_FALSE;
   1319 	}
   1320 
   1321 	cdef_info = (opj_jp2_cdef_info_t*) opj_malloc(l_value * sizeof(opj_jp2_cdef_info_t));
   1322 	if (!cdef_info)
   1323 		return OPJ_FALSE;
   1324 
   1325 	jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
   1326 	if(!jp2->color.jp2_cdef)
   1327 	{
   1328 		opj_free(cdef_info);
   1329 		return OPJ_FALSE;
   1330 	}
   1331 	jp2->color.jp2_cdef->info = cdef_info;
   1332 	jp2->color.jp2_cdef->n = (OPJ_UINT16) l_value;
   1333 
   1334 	for(i = 0; i < jp2->color.jp2_cdef->n; ++i) {
   1335 		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Cn^i */
   1336 		p_cdef_header_data +=2;
   1337 		cdef_info[i].cn = (OPJ_UINT16) l_value;
   1338 
   1339 		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Typ^i */
   1340 		p_cdef_header_data +=2;
   1341 		cdef_info[i].typ = (OPJ_UINT16) l_value;
   1342 
   1343 		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Asoc^i */
   1344 		p_cdef_header_data +=2;
   1345 		cdef_info[i].asoc = (OPJ_UINT16) l_value;
   1346    }
   1347 
   1348 	return OPJ_TRUE;
   1349 }
   1350 
   1351 static OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
   1352                             OPJ_BYTE * p_colr_header_data,
   1353                             OPJ_UINT32 p_colr_header_size,
   1354                             opj_event_mgr_t * p_manager
   1355                             )
   1356 {
   1357 	OPJ_UINT32 l_value;
   1358 
   1359 	/* preconditions */
   1360 	assert(jp2 != 00);
   1361 	assert(p_colr_header_data != 00);
   1362 	assert(p_manager != 00);
   1363 
   1364 	if (p_colr_header_size < 3) {
   1365 		opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size)\n");
   1366 		return OPJ_FALSE;
   1367 	}
   1368 
   1369 	/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
   1370 	 * Specification boxes after the first.'
   1371 	*/
   1372 	if(jp2->color.jp2_has_colr) {
   1373 		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");
   1374 		p_colr_header_data += p_colr_header_size;
   1375 		return OPJ_TRUE;
   1376 	}
   1377 
   1378 	opj_read_bytes(p_colr_header_data,&jp2->meth ,1);			/* METH */
   1379 	++p_colr_header_data;
   1380 
   1381 	opj_read_bytes(p_colr_header_data,&jp2->precedence ,1);		/* PRECEDENCE */
   1382 	++p_colr_header_data;
   1383 
   1384 	opj_read_bytes(p_colr_header_data,&jp2->approx ,1);			/* APPROX */
   1385 	++p_colr_header_data;
   1386 
   1387 	if (jp2->meth == 1) {
   1388 		if (p_colr_header_size < 7) {
   1389 			opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
   1390 			return OPJ_FALSE;
   1391 		}
   1392 		if ((p_colr_header_size > 7) && (jp2->enumcs != 14)) { /* handled below for CIELab) */
   1393 			/* testcase Altona_Technical_v20_x4.pdf */
   1394 			opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
   1395 		}
   1396 
   1397 		opj_read_bytes(p_colr_header_data,&jp2->enumcs ,4);			/* EnumCS */
   1398 
   1399 		p_colr_header_data += 4;
   1400 
   1401 		if(jp2->enumcs == 14)/* CIELab */
   1402 		{
   1403 			OPJ_UINT32 *cielab;
   1404 			OPJ_UINT32 rl, ol, ra, oa, rb, ob, il;
   1405 
   1406 			cielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32));
   1407 			cielab[0] = 14; /* enumcs */
   1408 
   1409 			/* default values */
   1410 			rl = ra = rb = ol = oa = ob = 0;
   1411 			il = 0x00443530; /* D50 */
   1412 			cielab[1] = 0x44454600;/* DEF */
   1413 
   1414 			if(p_colr_header_size == 35)
   1415 			{
   1416 				opj_read_bytes(p_colr_header_data, &rl, 4);
   1417 				p_colr_header_data += 4;
   1418 				opj_read_bytes(p_colr_header_data, &ol, 4);
   1419 				p_colr_header_data += 4;
   1420 				opj_read_bytes(p_colr_header_data, &ra, 4);
   1421 				p_colr_header_data += 4;
   1422 				opj_read_bytes(p_colr_header_data, &oa, 4);
   1423 				p_colr_header_data += 4;
   1424 				opj_read_bytes(p_colr_header_data, &rb, 4);
   1425 				p_colr_header_data += 4;
   1426 				opj_read_bytes(p_colr_header_data, &ob, 4);
   1427 				p_colr_header_data += 4;
   1428 				opj_read_bytes(p_colr_header_data, &il, 4);
   1429 				p_colr_header_data += 4;
   1430 
   1431 				cielab[1] = 0;
   1432 			}
   1433 			else if(p_colr_header_size != 7)
   1434 			{
   1435 				opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (CIELab, bad size: %d)\n", p_colr_header_size);
   1436 			}
   1437 			cielab[2] = rl; cielab[4] = ra; cielab[6] = rb;
   1438 			cielab[3] = ol; cielab[5] = oa; cielab[7] = ob;
   1439 			cielab[8] = il;
   1440 
   1441 			jp2->color.icc_profile_buf = (OPJ_BYTE*)cielab;
   1442 			jp2->color.icc_profile_len = 0;
   1443 		}
   1444 		jp2->color.jp2_has_colr = 1;
   1445 	}
   1446 	else if (jp2->meth == 2) {
   1447 		/* ICC profile */
   1448 		OPJ_INT32 it_icc_value = 0;
   1449 		OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;
   1450 
   1451 		jp2->color.icc_profile_len = (OPJ_UINT32)icc_len;
   1452 		jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_calloc(1,(size_t)icc_len);
   1453 		if (!jp2->color.icc_profile_buf)
   1454 		{
   1455 			jp2->color.icc_profile_len = 0;
   1456 			return OPJ_FALSE;
   1457 		}
   1458 
   1459 		for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value)
   1460 		{
   1461 			opj_read_bytes(p_colr_header_data,&l_value,1);		/* icc values */
   1462 			++p_colr_header_data;
   1463 			jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_value;
   1464 		}
   1465 
   1466 		jp2->color.jp2_has_colr = 1;
   1467 	}
   1468 	else if (jp2->meth > 2)
   1469 	{
   1470 		/*	ISO/IEC 15444-1:2004 (E), Table I.9 Legal METH values:
   1471 		conforming JP2 reader shall ignore the entire Colour Specification box.*/
   1472 		opj_event_msg(p_manager, EVT_INFO, "COLR BOX meth value is not a regular value (%d), "
   1473 			"so we will ignore the entire Colour Specification box. \n", jp2->meth);
   1474 	}
   1475 	return OPJ_TRUE;
   1476 }
   1477 
   1478 OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
   1479                         opj_stream_private_t *p_stream,
   1480                         opj_image_t* p_image,
   1481                         opj_event_mgr_t * p_manager)
   1482 {
   1483 	if (!p_image)
   1484 		return OPJ_FALSE;
   1485 
   1486 	/* J2K decoding */
   1487 	if( ! opj_j2k_decode(jp2->j2k, p_stream, p_image, p_manager) ) {
   1488 		opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
   1489 		return OPJ_FALSE;
   1490 	}
   1491 
   1492 	if (!jp2->ignore_pclr_cmap_cdef){
   1493 		if (!opj_jp2_check_color(p_image, &(jp2->color), p_manager)) {
   1494 			return OPJ_FALSE;
   1495 		}
   1496 
   1497 		/* Set Image Color Space */
   1498 		if (jp2->enumcs == 16)
   1499 			p_image->color_space = OPJ_CLRSPC_SRGB;
   1500 		else if (jp2->enumcs == 17)
   1501 			p_image->color_space = OPJ_CLRSPC_GRAY;
   1502 		else if (jp2->enumcs == 18)
   1503 			p_image->color_space = OPJ_CLRSPC_SYCC;
   1504 		else if (jp2->enumcs == 24)
   1505 			p_image->color_space = OPJ_CLRSPC_EYCC;
   1506 		else if (jp2->enumcs == 12)
   1507 			p_image->color_space = OPJ_CLRSPC_CMYK;
   1508 		else
   1509 			p_image->color_space = OPJ_CLRSPC_UNKNOWN;
   1510 
   1511 		if(jp2->color.jp2_pclr) {
   1512 			/* Part 1, I.5.3.4: Either both or none : */
   1513 			if( !jp2->color.jp2_pclr->cmap)
   1514 				opj_jp2_free_pclr(&(jp2->color));
   1515 			else if (p_image->pdfium_use_colorspace)
   1516 				opj_jp2_apply_pclr(p_image, &(jp2->color));
   1517 		}
   1518 
   1519 		/* Apply the color space if needed */
   1520 		if(jp2->color.jp2_cdef) {
   1521 			opj_jp2_apply_cdef(p_image, &(jp2->color), p_manager);
   1522 		}
   1523 
   1524 		if(jp2->color.icc_profile_buf) {
   1525 			p_image->icc_profile_buf = jp2->color.icc_profile_buf;
   1526 			p_image->icc_profile_len = jp2->color.icc_profile_len;
   1527 			jp2->color.icc_profile_buf = NULL;
   1528 		}
   1529 	}
   1530 
   1531 	return OPJ_TRUE;
   1532 }
   1533 
   1534 static OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
   1535                             opj_stream_private_t *stream,
   1536                             opj_event_mgr_t * p_manager
   1537                             )
   1538 {
   1539 	opj_jp2_img_header_writer_handler_t l_writers [4];
   1540 	opj_jp2_img_header_writer_handler_t * l_current_writer;
   1541 
   1542 	OPJ_INT32 i, l_nb_pass;
   1543 	/* size of data for super box*/
   1544 	OPJ_UINT32 l_jp2h_size = 8;
   1545 	OPJ_BOOL l_result = OPJ_TRUE;
   1546 
   1547 	/* to store the data of the super box */
   1548 	OPJ_BYTE l_jp2h_data [8];
   1549 
   1550 	/* preconditions */
   1551 	assert(stream != 00);
   1552 	assert(jp2 != 00);
   1553 	assert(p_manager != 00);
   1554 
   1555 	memset(l_writers,0,sizeof(l_writers));
   1556 
   1557 	if (jp2->bpc == 255) {
   1558 		l_nb_pass = 3;
   1559 		l_writers[0].handler = opj_jp2_write_ihdr;
   1560 		l_writers[1].handler = opj_jp2_write_bpcc;
   1561 		l_writers[2].handler = opj_jp2_write_colr;
   1562 	}
   1563 	else {
   1564 		l_nb_pass = 2;
   1565 		l_writers[0].handler = opj_jp2_write_ihdr;
   1566 		l_writers[1].handler = opj_jp2_write_colr;
   1567 	}
   1568 
   1569 	if (jp2->color.jp2_cdef != NULL) {
   1570 		l_writers[l_nb_pass].handler = opj_jp2_write_cdef;
   1571 		l_nb_pass++;
   1572 	}
   1573 
   1574 	/* write box header */
   1575 	/* write JP2H type */
   1576 	opj_write_bytes(l_jp2h_data+4,JP2_JP2H,4);
   1577 
   1578 	l_current_writer = l_writers;
   1579 	for (i=0;i<l_nb_pass;++i) {
   1580 		l_current_writer->m_data = l_current_writer->handler(jp2,&(l_current_writer->m_size));
   1581 		if (l_current_writer->m_data == 00) {
   1582 			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to hold JP2 Header data\n");
   1583 			l_result = OPJ_FALSE;
   1584 			break;
   1585 		}
   1586 
   1587 		l_jp2h_size += l_current_writer->m_size;
   1588 		++l_current_writer;
   1589 	}
   1590 
   1591 	if (! l_result) {
   1592 		l_current_writer = l_writers;
   1593 		for (i=0;i<l_nb_pass;++i) {
   1594 			if (l_current_writer->m_data != 00) {
   1595 				opj_free(l_current_writer->m_data );
   1596 			}
   1597 			++l_current_writer;
   1598 		}
   1599 
   1600 		return OPJ_FALSE;
   1601 	}
   1602 
   1603 	/* write super box size */
   1604 	opj_write_bytes(l_jp2h_data,l_jp2h_size,4);
   1605 
   1606 	/* write super box data on stream */
   1607 	if (opj_stream_write_data(stream,l_jp2h_data,8,p_manager) != 8) {
   1608 		opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
   1609 		l_result = OPJ_FALSE;
   1610 	}
   1611 
   1612 	if (l_result) {
   1613 		l_current_writer = l_writers;
   1614 		for (i=0;i<l_nb_pass;++i) {
   1615 			if (opj_stream_write_data(stream,l_current_writer->m_data,l_current_writer->m_size,p_manager) != l_current_writer->m_size) {
   1616 				opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
   1617 				l_result = OPJ_FALSE;
   1618 				break;
   1619 			}
   1620 			++l_current_writer;
   1621 		}
   1622 	}
   1623 
   1624 	l_current_writer = l_writers;
   1625 
   1626 	/* cleanup */
   1627 	for (i=0;i<l_nb_pass;++i) {
   1628 		if (l_current_writer->m_data != 00) {
   1629 			opj_free(l_current_writer->m_data );
   1630 		}
   1631 		++l_current_writer;
   1632 	}
   1633 
   1634 	return l_result;
   1635 }
   1636 
   1637 static OPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,
   1638 							opj_stream_private_t *cio,
   1639 							opj_event_mgr_t * p_manager )
   1640 {
   1641 	OPJ_UINT32 i;
   1642 	OPJ_UINT32 l_ftyp_size = 16 + 4 * jp2->numcl;
   1643 	OPJ_BYTE * l_ftyp_data, * l_current_data_ptr;
   1644 	OPJ_BOOL l_result;
   1645 
   1646 	/* preconditions */
   1647 	assert(cio != 00);
   1648 	assert(jp2 != 00);
   1649 	assert(p_manager != 00);
   1650 
   1651 	l_ftyp_data = (OPJ_BYTE *) opj_calloc(1,l_ftyp_size);
   1652 
   1653 	if (l_ftyp_data == 00) {
   1654 		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
   1655 		return OPJ_FALSE;
   1656 	}
   1657 
   1658 	l_current_data_ptr = l_ftyp_data;
   1659 
   1660 	opj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */
   1661 	l_current_data_ptr += 4;
   1662 
   1663 	opj_write_bytes(l_current_data_ptr, JP2_FTYP,4); /* FTYP */
   1664 	l_current_data_ptr += 4;
   1665 
   1666 	opj_write_bytes(l_current_data_ptr, jp2->brand,4); /* BR */
   1667 	l_current_data_ptr += 4;
   1668 
   1669 	opj_write_bytes(l_current_data_ptr, jp2->minversion,4); /* MinV */
   1670 	l_current_data_ptr += 4;
   1671 
   1672 	for (i = 0; i < jp2->numcl; i++)  {
   1673 		opj_write_bytes(l_current_data_ptr, jp2->cl[i],4);	/* CL */
   1674 	}
   1675 
   1676 	l_result = (opj_stream_write_data(cio,l_ftyp_data,l_ftyp_size,p_manager) == l_ftyp_size);
   1677 	if (! l_result)
   1678 	{
   1679 		opj_event_msg(p_manager, EVT_ERROR, "Error while writing ftyp data to stream\n");
   1680 	}
   1681 
   1682 	opj_free(l_ftyp_data);
   1683 
   1684 	return l_result;
   1685 }
   1686 
   1687 static OPJ_BOOL opj_jp2_write_jp2c(opj_jp2_t *jp2,
   1688 							opj_stream_private_t *cio,
   1689 							opj_event_mgr_t * p_manager )
   1690 {
   1691 	OPJ_OFF_T j2k_codestream_exit;
   1692 	OPJ_BYTE l_data_header [8];
   1693 
   1694 	/* preconditions */
   1695 	assert(jp2 != 00);
   1696 	assert(cio != 00);
   1697 	assert(p_manager != 00);
   1698 	assert(opj_stream_has_seek(cio));
   1699 
   1700 	j2k_codestream_exit = opj_stream_tell(cio);
   1701 	opj_write_bytes(l_data_header,
   1702                     (OPJ_UINT32) (j2k_codestream_exit - jp2->j2k_codestream_offset),
   1703                     4); /* size of codestream */
   1704 	opj_write_bytes(l_data_header + 4,JP2_JP2C,4);									   /* JP2C */
   1705 
   1706 	if (! opj_stream_seek(cio,jp2->j2k_codestream_offset,p_manager)) {
   1707 		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   1708 		return OPJ_FALSE;
   1709 	}
   1710 
   1711 	if (opj_stream_write_data(cio,l_data_header,8,p_manager) != 8) {
   1712 		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   1713 		return OPJ_FALSE;
   1714 	}
   1715 
   1716 	if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
   1717 		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   1718 		return OPJ_FALSE;
   1719 	}
   1720 
   1721 	return OPJ_TRUE;
   1722 }
   1723 
   1724 static OPJ_BOOL opj_jp2_write_jp(	opj_jp2_t *jp2,
   1725 			    		    opj_stream_private_t *cio,
   1726 				    		opj_event_mgr_t * p_manager )
   1727 {
   1728 	/* 12 bytes will be read */
   1729 	OPJ_BYTE l_signature_data [12];
   1730 
   1731 	/* preconditions */
   1732 	assert(cio != 00);
   1733 	assert(jp2 != 00);
   1734 	assert(p_manager != 00);
   1735 
   1736 	/* write box length */
   1737 	opj_write_bytes(l_signature_data,12,4);
   1738 	/* writes box type */
   1739 	opj_write_bytes(l_signature_data+4,JP2_JP,4);
   1740 	/* writes magic number*/
   1741 	opj_write_bytes(l_signature_data+8,0x0d0a870a,4);
   1742 
   1743 	if (opj_stream_write_data(cio,l_signature_data,12,p_manager) != 12) {
   1744 		return OPJ_FALSE;
   1745 	}
   1746 
   1747 	return OPJ_TRUE;
   1748 }
   1749 
   1750 /* ----------------------------------------------------------------------- */
   1751 /* JP2 decoder interface                                             */
   1752 /* ----------------------------------------------------------------------- */
   1753 
   1754 void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
   1755 {
   1756 	/* setup the J2K codec */
   1757 	opj_j2k_setup_decoder(jp2->j2k, parameters);
   1758 
   1759 	/* further JP2 initializations go here */
   1760 	jp2->color.jp2_has_colr = 0;
   1761     jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
   1762 }
   1763 
   1764 /* ----------------------------------------------------------------------- */
   1765 /* JP2 encoder interface                                             */
   1766 /* ----------------------------------------------------------------------- */
   1767 
   1768 OPJ_BOOL opj_jp2_setup_encoder(	opj_jp2_t *jp2,
   1769                             opj_cparameters_t *parameters,
   1770                             opj_image_t *image,
   1771                             opj_event_mgr_t * p_manager)
   1772 {
   1773 	OPJ_UINT32 i;
   1774 	OPJ_UINT32 depth_0;
   1775   OPJ_UINT32 sign;
   1776 	OPJ_UINT32 alpha_count;
   1777 	OPJ_UINT32 color_channels = 0U;
   1778 	OPJ_UINT32 alpha_channel = 0U;
   1779 
   1780 
   1781 	if(!jp2 || !parameters || !image)
   1782 		return OPJ_FALSE;
   1783 
   1784 	/* setup the J2K codec */
   1785 	/* ------------------- */
   1786 
   1787 	/* Check if number of components respects standard */
   1788 	if (image->numcomps < 1 || image->numcomps > 16384) {
   1789 		opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n");
   1790 		return OPJ_FALSE;
   1791 	}
   1792 
   1793 	if (opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager ) == OPJ_FALSE) {
   1794 		return OPJ_FALSE;
   1795 	}
   1796 
   1797 	/* setup the JP2 codec */
   1798 	/* ------------------- */
   1799 
   1800 	/* Profile box */
   1801 
   1802 	jp2->brand = JP2_JP2;	/* BR */
   1803 	jp2->minversion = 0;	/* MinV */
   1804 	jp2->numcl = 1;
   1805 	jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
   1806 	if (!jp2->cl){
   1807 		jp2->cl = NULL;
   1808 		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
   1809 		return OPJ_FALSE;
   1810 	}
   1811 	jp2->cl[0] = JP2_JP2;	/* CL0 : JP2 */
   1812 
   1813 	/* Image Header box */
   1814 
   1815 	jp2->numcomps = image->numcomps;	/* NC */
   1816 	jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
   1817 	if (!jp2->comps) {
   1818 		jp2->comps = NULL;
   1819 		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
   1820 		/* Memory of jp2->cl will be freed by opj_jp2_destroy */
   1821 		return OPJ_FALSE;
   1822 	}
   1823 
   1824 	jp2->h = image->y1 - image->y0;		/* HEIGHT */
   1825 	jp2->w = image->x1 - image->x0;		/* WIDTH */
   1826 	/* BPC */
   1827 	depth_0 = image->comps[0].prec - 1;
   1828 	sign = image->comps[0].sgnd;
   1829 	jp2->bpc = depth_0 + (sign << 7);
   1830 	for (i = 1; i < image->numcomps; i++) {
   1831 		OPJ_UINT32 depth = image->comps[i].prec - 1;
   1832 		sign = image->comps[i].sgnd;
   1833 		if (depth_0 != depth)
   1834 			jp2->bpc = 255;
   1835 	}
   1836 	jp2->C = 7;			/* C : Always 7 */
   1837 	jp2->UnkC = 0;		/* UnkC, colorspace specified in colr box */
   1838 	jp2->IPR = 0;		/* IPR, no intellectual property */
   1839 
   1840 	/* BitsPerComponent box */
   1841 	for (i = 0; i < image->numcomps; i++) {
   1842 		jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
   1843 	}
   1844 
   1845 	/* Colour Specification box */
   1846     if(image->icc_profile_len) {
   1847         jp2->meth = 2;
   1848         jp2->enumcs = 0;
   1849     }
   1850     else {
   1851         jp2->meth = 1;
   1852         if (image->color_space == 1)
   1853             jp2->enumcs = 16;	/* sRGB as defined by IEC 61966-2-1 */
   1854         else if (image->color_space == 2)
   1855             jp2->enumcs = 17;	/* greyscale */
   1856         else if (image->color_space == 3)
   1857             jp2->enumcs = 18;	/* YUV */
   1858     }
   1859 
   1860 	/* Channel Definition box */
   1861 	/* FIXME not provided by parameters */
   1862 	/* We try to do what we can... */
   1863 	alpha_count = 0U;
   1864 	for (i = 0; i < image->numcomps; i++) {
   1865 		if (image->comps[i].alpha != 0) {
   1866 			alpha_count++;
   1867 			alpha_channel = i;
   1868 		}
   1869 	}
   1870 	if (alpha_count == 1U) { /* no way to deal with more than 1 alpha channel */
   1871 		switch (jp2->enumcs) {
   1872 			case 16:
   1873 			case 18:
   1874 				color_channels = 3;
   1875 				break;
   1876 			case 17:
   1877 				color_channels = 1;
   1878 				break;
   1879 			default:
   1880 				alpha_count = 0U;
   1881 				break;
   1882 		}
   1883 		if (alpha_count == 0U) {
   1884 			opj_event_msg(p_manager, EVT_WARNING, "Alpha channel specified but unknown enumcs. No cdef box will be created.\n");
   1885 		} else if (image->numcomps < (color_channels+1)) {
   1886 			opj_event_msg(p_manager, EVT_WARNING, "Alpha channel specified but not enough image components for an automatic cdef box creation.\n");
   1887 			alpha_count = 0U;
   1888 		} else if ((OPJ_UINT32)alpha_channel < color_channels) {
   1889 			opj_event_msg(p_manager, EVT_WARNING, "Alpha channel position conflicts with color channel. No cdef box will be created.\n");
   1890 			alpha_count = 0U;
   1891 		}
   1892 	} else if (alpha_count > 1) {
   1893 		opj_event_msg(p_manager, EVT_WARNING, "Multiple alpha channels specified. No cdef box will be created.\n");
   1894 	}
   1895 	if (alpha_count == 1U) { /* if here, we know what we can do */
   1896 		jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
   1897 		if(!jp2->color.jp2_cdef) {
   1898 			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup the JP2 encoder\n");
   1899 			return OPJ_FALSE;
   1900 		}
   1901 		/* no memset needed, all values will be overwritten except if jp2->color.jp2_cdef->info allocation fails, */
   1902 		/* in which case jp2->color.jp2_cdef->info will be NULL => valid for destruction */
   1903 		jp2->color.jp2_cdef->info = (opj_jp2_cdef_info_t*) opj_malloc(image->numcomps * sizeof(opj_jp2_cdef_info_t));
   1904 		if (!jp2->color.jp2_cdef->info) {
   1905 			/* memory will be freed by opj_jp2_destroy */
   1906 			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup the JP2 encoder\n");
   1907 			return OPJ_FALSE;
   1908 		}
   1909 		jp2->color.jp2_cdef->n = (OPJ_UINT16) image->numcomps; /* cast is valid : image->numcomps [1,16384] */
   1910 		for (i = 0U; i < color_channels; i++) {
   1911 			jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)i; /* cast is valid : image->numcomps [1,16384] */
   1912 			jp2->color.jp2_cdef->info[i].typ = 0U;
   1913 			jp2->color.jp2_cdef->info[i].asoc = (OPJ_UINT16)(i+1U); /* No overflow + cast is valid : image->numcomps [1,16384] */
   1914 		}
   1915 		for (; i < image->numcomps; i++) {
   1916 			if (image->comps[i].alpha != 0) { /* we'll be here exactly once */
   1917 				jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)i; /* cast is valid : image->numcomps [1,16384] */
   1918 				jp2->color.jp2_cdef->info[i].typ = 1U; /* Opacity channel */
   1919 				jp2->color.jp2_cdef->info[i].asoc = 0U; /* Apply alpha channel to the whole image */
   1920 			} else {
   1921 				/* Unknown channel */
   1922 				jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)i; /* cast is valid : image->numcomps [1,16384] */
   1923 				jp2->color.jp2_cdef->info[i].typ = 65535U;
   1924 				jp2->color.jp2_cdef->info[i].asoc = 65535U;
   1925 			}
   1926 		}
   1927 	}
   1928 
   1929 	jp2->precedence = 0;	/* PRECEDENCE */
   1930 	jp2->approx = 0;		/* APPROX */
   1931 
   1932 	jp2->jpip_on = parameters->jpip_on;
   1933 
   1934 	return OPJ_TRUE;
   1935 }
   1936 
   1937 OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,
   1938 						opj_stream_private_t *stream,
   1939 						opj_event_mgr_t * p_manager)
   1940 {
   1941 	return opj_j2k_encode(jp2->j2k, stream, p_manager);
   1942 }
   1943 
   1944 OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,
   1945                                 opj_stream_private_t *cio,
   1946                                 opj_event_mgr_t * p_manager
   1947                                 )
   1948 {
   1949 	/* preconditions */
   1950 	assert(jp2 != 00);
   1951 	assert(cio != 00);
   1952 	assert(p_manager != 00);
   1953 
   1954 	/* customization of the end encoding */
   1955 	if (! opj_jp2_setup_end_header_reading(jp2, p_manager)) {
   1956 		return OPJ_FALSE;
   1957 	}
   1958 
   1959 	/* write header */
   1960 	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,cio,p_manager)) {
   1961 		return OPJ_FALSE;
   1962 	}
   1963 
   1964 	return opj_j2k_end_decompress(jp2->j2k, cio, p_manager);
   1965 }
   1966 
   1967 OPJ_BOOL opj_jp2_end_compress(	opj_jp2_t *jp2,
   1968 							    opj_stream_private_t *cio,
   1969 							    opj_event_mgr_t * p_manager
   1970                                 )
   1971 {
   1972 	/* preconditions */
   1973 	assert(jp2 != 00);
   1974 	assert(cio != 00);
   1975 	assert(p_manager != 00);
   1976 
   1977 	/* customization of the end encoding */
   1978 	if (! opj_jp2_setup_end_header_writing(jp2, p_manager)) {
   1979 		return OPJ_FALSE;
   1980 	}
   1981 
   1982 	if (! opj_j2k_end_compress(jp2->j2k,cio,p_manager)) {
   1983 		return OPJ_FALSE;
   1984 	}
   1985 
   1986 	/* write header */
   1987 	return opj_jp2_exec(jp2,jp2->m_procedure_list,cio,p_manager);
   1988 }
   1989 
   1990 static OPJ_BOOL opj_jp2_setup_end_header_writing (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
   1991 {
   1992 	/* preconditions */
   1993 	assert(jp2 != 00);
   1994 	assert(p_manager != 00);
   1995 
   1996 #ifdef USE_JPIP
   1997 	if( jp2->jpip_on ) {
   1998 		if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_iptr, p_manager)) {
   1999 			return OPJ_FALSE;
   2000 		}
   2001 	}
   2002 #endif
   2003 	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2c, p_manager)) {
   2004 		return OPJ_FALSE;
   2005 	}
   2006 	/* DEVELOPER CORNER, add your custom procedures */
   2007 #ifdef USE_JPIP
   2008   if( jp2->jpip_on )
   2009 	{
   2010 		if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_cidx, p_manager)) {
   2011 			return OPJ_FALSE;
   2012 		}
   2013 		if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_fidx, p_manager)) {
   2014 			return OPJ_FALSE;
   2015 		}
   2016 	}
   2017 #endif
   2018 	return OPJ_TRUE;
   2019 }
   2020 
   2021 static OPJ_BOOL opj_jp2_setup_end_header_reading (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
   2022 {
   2023 	/* preconditions */
   2024 	assert(jp2 != 00);
   2025 	assert(p_manager != 00);
   2026 
   2027 	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure, p_manager)) {
   2028 		return OPJ_FALSE;
   2029 	}
   2030 	/* DEVELOPER CORNER, add your custom procedures */
   2031 
   2032 	return OPJ_TRUE;
   2033 }
   2034 
   2035 static OPJ_BOOL opj_jp2_default_validation (	opj_jp2_t * jp2,
   2036                                         opj_stream_private_t *cio,
   2037                                         opj_event_mgr_t * p_manager
   2038                                         )
   2039 {
   2040 	OPJ_BOOL l_is_valid = OPJ_TRUE;
   2041 	OPJ_UINT32 i;
   2042 
   2043 	/* preconditions */
   2044 	assert(jp2 != 00);
   2045 	assert(cio != 00);
   2046 	assert(p_manager != 00);
   2047 
   2048 	/* JPEG2000 codec validation */
   2049 
   2050 	/* STATE checking */
   2051 	/* make sure the state is at 0 */
   2052 	l_is_valid &= (jp2->jp2_state == JP2_STATE_NONE);
   2053 
   2054 	/* make sure not reading a jp2h ???? WEIRD */
   2055 	l_is_valid &= (jp2->jp2_img_state == JP2_IMG_STATE_NONE);
   2056 
   2057 	/* POINTER validation */
   2058 	/* make sure a j2k codec is present */
   2059 	l_is_valid &= (jp2->j2k != 00);
   2060 
   2061 	/* make sure a procedure list is present */
   2062 	l_is_valid &= (jp2->m_procedure_list != 00);
   2063 
   2064 	/* make sure a validation list is present */
   2065 	l_is_valid &= (jp2->m_validation_list != 00);
   2066 
   2067 	/* PARAMETER VALIDATION */
   2068 	/* number of components */
   2069 	l_is_valid &= (jp2->numcl > 0);
   2070 	/* width */
   2071 	l_is_valid &= (jp2->h > 0);
   2072 	/* height */
   2073 	l_is_valid &= (jp2->w > 0);
   2074 	/* precision */
   2075 	for (i = 0; i < jp2->numcomps; ++i)	{
   2076 		l_is_valid &= ((jp2->comps[i].bpcc & 0x7FU) < 38U); /* 0 is valid, ignore sign for check */
   2077 	}
   2078 
   2079 	/* METH */
   2080 	l_is_valid &= ((jp2->meth > 0) && (jp2->meth < 3));
   2081 
   2082 	/* stream validation */
   2083 	/* back and forth is needed */
   2084 	l_is_valid &= opj_stream_has_seek(cio);
   2085 
   2086 	return l_is_valid;
   2087 }
   2088 
   2089 static OPJ_BOOL opj_jp2_read_header_procedure(  opj_jp2_t *jp2,
   2090                                                 opj_stream_private_t *stream,
   2091                                                 opj_event_mgr_t * p_manager
   2092                                                 )
   2093 {
   2094 	opj_jp2_box_t box;
   2095 	OPJ_UINT32 l_nb_bytes_read;
   2096 	const opj_jp2_header_handler_t * l_current_handler;
   2097 	const opj_jp2_header_handler_t * l_current_handler_misplaced;
   2098 	OPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE;
   2099 	OPJ_UINT32 l_current_data_size;
   2100 	OPJ_BYTE * l_current_data = 00;
   2101 
   2102 	/* preconditions */
   2103 	assert(stream != 00);
   2104 	assert(jp2 != 00);
   2105 	assert(p_manager != 00);
   2106 
   2107 	l_current_data = (OPJ_BYTE*)opj_calloc(1,l_last_data_size);
   2108 
   2109 	if (l_current_data == 00) {
   2110 		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 file header\n");
   2111 		return OPJ_FALSE;
   2112 	}
   2113 
   2114 	while (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) {
   2115 		/* is it the codestream box ? */
   2116 		if (box.type == JP2_JP2C) {
   2117 			if (jp2->jp2_state & JP2_STATE_HEADER) {
   2118 				jp2->jp2_state |= JP2_STATE_CODESTREAM;
   2119                                 opj_free(l_current_data);
   2120 				return OPJ_TRUE;
   2121 			}
   2122 			else {
   2123 				opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n");
   2124 				opj_free(l_current_data);
   2125 				return OPJ_FALSE;
   2126 			}
   2127 		}
   2128 		else if	(box.length == 0) {
   2129 			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
   2130 			opj_free(l_current_data);
   2131 			return OPJ_FALSE;
   2132 		}
   2133 		/* testcase 1851.pdf.SIGSEGV.ce9.948 */
   2134         else if (box.length < l_nb_bytes_read) {
   2135 			opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length, box.type);
   2136 			opj_free(l_current_data);
   2137 			return OPJ_FALSE;
   2138 		}
   2139 
   2140 		l_current_handler = opj_jp2_find_handler(box.type);
   2141 		l_current_handler_misplaced = opj_jp2_img_find_handler(box.type);
   2142 		l_current_data_size = box.length - l_nb_bytes_read;
   2143 
   2144 		if ((l_current_handler != 00) || (l_current_handler_misplaced != 00)) {
   2145 			if (l_current_handler == 00) {
   2146 				opj_event_msg(p_manager, EVT_WARNING, "Found a misplaced '%c%c%c%c' box outside jp2h box\n", (OPJ_BYTE)(box.type>>24), (OPJ_BYTE)(box.type>>16), (OPJ_BYTE)(box.type>>8), (OPJ_BYTE)(box.type>>0));
   2147 				if (jp2->jp2_state & JP2_STATE_HEADER) {
   2148 					/* read anyway, we already have jp2h */
   2149 					l_current_handler = l_current_handler_misplaced;
   2150 				} else {
   2151 					opj_event_msg(p_manager, EVT_WARNING, "JPEG2000 Header box not read yet, '%c%c%c%c' box will be ignored\n", (OPJ_BYTE)(box.type>>24), (OPJ_BYTE)(box.type>>16), (OPJ_BYTE)(box.type>>8), (OPJ_BYTE)(box.type>>0));
   2152 					jp2->jp2_state |= JP2_STATE_UNKNOWN;
   2153 					if (opj_stream_skip(stream,l_current_data_size,p_manager) != l_current_data_size) {
   2154 							opj_event_msg(p_manager, EVT_ERROR, "Problem with skipping JPEG2000 box, stream error\n");
   2155 							opj_free(l_current_data);
   2156 							return OPJ_FALSE;
   2157 					}
   2158 					continue;
   2159 				}
   2160 			}
   2161 			if ((OPJ_OFF_T)l_current_data_size > opj_stream_get_number_byte_left(stream)) {
   2162 				/* do not even try to malloc if we can't read */
   2163 				opj_event_msg(p_manager, EVT_ERROR, "Invalid box size %d for box '%c%c%c%c'. Need %d bytes, %d bytes remaining \n", box.length, (OPJ_BYTE)(box.type>>24), (OPJ_BYTE)(box.type>>16), (OPJ_BYTE)(box.type>>8), (OPJ_BYTE)(box.type>>0), l_current_data_size, (OPJ_UINT32)opj_stream_get_number_byte_left(stream));
   2164 				opj_free(l_current_data);
   2165 				return OPJ_FALSE;
   2166 			}
   2167 			if (l_current_data_size > l_last_data_size) {
   2168 				OPJ_BYTE* new_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,l_current_data_size);
   2169 				if (!new_current_data) {
   2170 					opj_free(l_current_data);
   2171                     opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 box\n");
   2172 					return OPJ_FALSE;
   2173 				}
   2174                 l_current_data = new_current_data;
   2175 				l_last_data_size = l_current_data_size;
   2176 			}
   2177 
   2178 			l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(stream,l_current_data,l_current_data_size,p_manager);
   2179 			if (l_nb_bytes_read != l_current_data_size) {
   2180 				opj_event_msg(p_manager, EVT_ERROR, "Problem with reading JPEG2000 box, stream error\n");
   2181                 opj_free(l_current_data);
   2182 				return OPJ_FALSE;
   2183 			}
   2184 
   2185 			if (! l_current_handler->handler(jp2,l_current_data,l_current_data_size,p_manager)) {
   2186 				opj_free(l_current_data);
   2187 				return OPJ_FALSE;
   2188 			}
   2189 		}
   2190 		else {
   2191             if (!(jp2->jp2_state & JP2_STATE_SIGNATURE)) {
   2192                 opj_event_msg(p_manager, EVT_ERROR, "Malformed JP2 file format: first box must be JPEG 2000 signature box\n");
   2193                 opj_free(l_current_data);
   2194                 return OPJ_FALSE;
   2195             }
   2196             if (!(jp2->jp2_state & JP2_STATE_FILE_TYPE)) {
   2197                 opj_event_msg(p_manager, EVT_ERROR, "Malformed JP2 file format: second box must be file type box\n");
   2198                 opj_free(l_current_data);
   2199                 return OPJ_FALSE;
   2200             }
   2201 			jp2->jp2_state |= JP2_STATE_UNKNOWN;
   2202 			if (opj_stream_skip(stream,l_current_data_size,p_manager) != l_current_data_size) {
   2203 				opj_event_msg(p_manager, EVT_ERROR, "Problem with skipping JPEG2000 box, stream error\n");
   2204 				opj_free(l_current_data);
   2205 				return OPJ_FALSE;
   2206 			}
   2207 		}
   2208 	}
   2209 
   2210 	opj_free(l_current_data);
   2211 
   2212 	return OPJ_TRUE;
   2213 }
   2214 
   2215 /**
   2216  * Excutes the given procedures on the given codec.
   2217  *
   2218  * @param	p_procedure_list	the list of procedures to execute
   2219  * @param	jp2					the jpeg2000 file codec to execute the procedures on.
   2220  * @param	stream					the stream to execute the procedures on.
   2221  * @param	p_manager			the user manager.
   2222  *
   2223  * @return	true				if all the procedures were successfully executed.
   2224  */
   2225 static OPJ_BOOL opj_jp2_exec (  opj_jp2_t * jp2,
   2226                                 opj_procedure_list_t * p_procedure_list,
   2227                                 opj_stream_private_t *stream,
   2228                                 opj_event_mgr_t * p_manager
   2229                                 )
   2230 
   2231 {
   2232 	OPJ_BOOL (** l_procedure) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *) = 00;
   2233 	OPJ_BOOL l_result = OPJ_TRUE;
   2234 	OPJ_UINT32 l_nb_proc, i;
   2235 
   2236 	/* preconditions */
   2237 	assert(p_procedure_list != 00);
   2238 	assert(jp2 != 00);
   2239 	assert(stream != 00);
   2240 	assert(p_manager != 00);
   2241 
   2242 	l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
   2243 	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);
   2244 
   2245 	for	(i=0;i<l_nb_proc;++i) {
   2246 		l_result = l_result && (*l_procedure) (jp2,stream,p_manager);
   2247 		++l_procedure;
   2248 	}
   2249 
   2250 	/* and clear the procedure list at the end. */
   2251 	opj_procedure_list_clear(p_procedure_list);
   2252 	return l_result;
   2253 }
   2254 
   2255 OPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,
   2256                                 opj_stream_private_t *stream,
   2257                                 opj_image_t * p_image,
   2258                                 opj_event_mgr_t * p_manager
   2259                                 )
   2260 {
   2261 	/* preconditions */
   2262 	assert(jp2 != 00);
   2263 	assert(stream != 00);
   2264 	assert(p_manager != 00);
   2265 
   2266 	/* customization of the validation */
   2267 	if (! opj_jp2_setup_encoding_validation (jp2, p_manager)) {
   2268 		return OPJ_FALSE;
   2269 	}
   2270 
   2271 	/* validation of the parameters codec */
   2272 	if (! opj_jp2_exec(jp2,jp2->m_validation_list,stream,p_manager)) {
   2273 		return OPJ_FALSE;
   2274 	}
   2275 
   2276 	/* customization of the encoding */
   2277 	if (! opj_jp2_setup_header_writing(jp2, p_manager)) {
   2278 		return OPJ_FALSE;
   2279 	}
   2280 
   2281 	/* write header */
   2282 	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,stream,p_manager)) {
   2283 		return OPJ_FALSE;
   2284 	}
   2285 
   2286 	return opj_j2k_start_compress(jp2->j2k,stream,p_image,p_manager);
   2287 }
   2288 
   2289 static const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id)
   2290 {
   2291 	OPJ_UINT32 i, l_handler_size = sizeof(jp2_header) / sizeof(opj_jp2_header_handler_t);
   2292 
   2293 	for (i=0;i<l_handler_size;++i) {
   2294 		if (jp2_header[i].id == p_id) {
   2295 			return &jp2_header[i];
   2296 		}
   2297 	}
   2298 	return NULL;
   2299 }
   2300 
   2301 /**
   2302  * Finds the image execution function related to the given box id.
   2303  *
   2304  * @param	p_id	the id of the handler to fetch.
   2305  *
   2306  * @return	the given handler or 00 if it could not be found.
   2307  */
   2308 static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id)
   2309 {
   2310 	OPJ_UINT32 i, l_handler_size = sizeof(jp2_img_header) / sizeof(opj_jp2_header_handler_t);
   2311 	for (i=0;i<l_handler_size;++i)
   2312 	{
   2313 		if (jp2_img_header[i].id == p_id) {
   2314 			return &jp2_img_header[i];
   2315 		}
   2316 	}
   2317 
   2318 	return NULL;
   2319 }
   2320 
   2321 /**
   2322  * Reads a jpeg2000 file signature box.
   2323  *
   2324  * @param	p_header_data	the data contained in the signature box.
   2325  * @param	jp2				the jpeg2000 file codec.
   2326  * @param	p_header_size	the size of the data contained in the signature box.
   2327  * @param	p_manager		the user event manager.
   2328  *
   2329  * @return true if the file signature box is valid.
   2330  */
   2331 static OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,
   2332                                 OPJ_BYTE * p_header_data,
   2333                                 OPJ_UINT32 p_header_size,
   2334                                 opj_event_mgr_t * p_manager
   2335                                 )
   2336 
   2337 {
   2338 	OPJ_UINT32 l_magic_number;
   2339 
   2340 	/* preconditions */
   2341 	assert(p_header_data != 00);
   2342 	assert(jp2 != 00);
   2343 	assert(p_manager != 00);
   2344 
   2345 	if (jp2->jp2_state != JP2_STATE_NONE) {
   2346 		opj_event_msg(p_manager, EVT_ERROR, "The signature box must be the first box in the file.\n");
   2347 		return OPJ_FALSE;
   2348 	}
   2349 
   2350 	/* assure length of data is correct (4 -> magic number) */
   2351 	if (p_header_size != 4) {
   2352 		opj_event_msg(p_manager, EVT_ERROR, "Error with JP signature Box size\n");
   2353 		return OPJ_FALSE;
   2354 	}
   2355 
   2356 	/* rearrange data */
   2357 	opj_read_bytes(p_header_data,&l_magic_number,4);
   2358 	if (l_magic_number != 0x0d0a870a ) {
   2359 		opj_event_msg(p_manager, EVT_ERROR, "Error with JP Signature : bad magic number\n");
   2360 		return OPJ_FALSE;
   2361 	}
   2362 
   2363 	jp2->jp2_state |= JP2_STATE_SIGNATURE;
   2364 
   2365 	return OPJ_TRUE;
   2366 }
   2367 
   2368 /**
   2369  * Reads a a FTYP box - File type box
   2370  *
   2371  * @param	p_header_data	the data contained in the FTYP box.
   2372  * @param	jp2				the jpeg2000 file codec.
   2373  * @param	p_header_size	the size of the data contained in the FTYP box.
   2374  * @param	p_manager		the user event manager.
   2375  *
   2376  * @return true if the FTYP box is valid.
   2377  */
   2378 static OPJ_BOOL opj_jp2_read_ftyp(	opj_jp2_t *jp2,
   2379 									OPJ_BYTE * p_header_data,
   2380 									OPJ_UINT32 p_header_size,
   2381 									opj_event_mgr_t * p_manager
   2382                                     )
   2383 {
   2384 	OPJ_UINT32 i, l_remaining_bytes;
   2385 
   2386 	/* preconditions */
   2387 	assert(p_header_data != 00);
   2388 	assert(jp2 != 00);
   2389 	assert(p_manager != 00);
   2390 
   2391 	if (jp2->jp2_state != JP2_STATE_SIGNATURE) {
   2392 		opj_event_msg(p_manager, EVT_ERROR, "The ftyp box must be the second box in the file.\n");
   2393 		return OPJ_FALSE;
   2394 	}
   2395 
   2396 	/* assure length of data is correct */
   2397 	if (p_header_size < 8) {
   2398 		opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
   2399 		return OPJ_FALSE;
   2400 	}
   2401 
   2402 	opj_read_bytes(p_header_data,&jp2->brand,4);		/* BR */
   2403 	p_header_data += 4;
   2404 
   2405 	opj_read_bytes(p_header_data,&jp2->minversion,4);		/* MinV */
   2406 	p_header_data += 4;
   2407 
   2408 	l_remaining_bytes = p_header_size - 8;
   2409 
   2410 	/* the number of remaining bytes should be a multiple of 4 */
   2411 	if ((l_remaining_bytes & 0x3) != 0) {
   2412 		opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
   2413 		return OPJ_FALSE;
   2414 	}
   2415 
   2416 	/* div by 4 */
   2417 	jp2->numcl = l_remaining_bytes >> 2;
   2418 	if (jp2->numcl) {
   2419 		jp2->cl = (OPJ_UINT32 *) opj_calloc(jp2->numcl, sizeof(OPJ_UINT32));
   2420 		if (jp2->cl == 00) {
   2421 			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory with FTYP Box\n");
   2422 			return OPJ_FALSE;
   2423 		}
   2424 	}
   2425 
   2426 	for (i = 0; i < jp2->numcl; ++i)
   2427 	{
   2428 		opj_read_bytes(p_header_data,&jp2->cl[i],4);		/* CLi */
   2429 		p_header_data += 4;
   2430 	}
   2431 
   2432 	jp2->jp2_state |= JP2_STATE_FILE_TYPE;
   2433 
   2434 	return OPJ_TRUE;
   2435 }
   2436 
   2437 static OPJ_BOOL opj_jp2_skip_jp2c(	opj_jp2_t *jp2,
   2438 					    	opj_stream_private_t *stream,
   2439 					    	opj_event_mgr_t * p_manager )
   2440 {
   2441 	/* preconditions */
   2442 	assert(jp2 != 00);
   2443 	assert(stream != 00);
   2444 	assert(p_manager != 00);
   2445 
   2446 	jp2->j2k_codestream_offset = opj_stream_tell(stream);
   2447 
   2448 	if (opj_stream_skip(stream,8,p_manager) != 8) {
   2449 		return OPJ_FALSE;
   2450 	}
   2451 
   2452 	return OPJ_TRUE;
   2453 }
   2454 
   2455 static OPJ_BOOL opj_jpip_skip_iptr(	opj_jp2_t *jp2,
   2456   opj_stream_private_t *stream,
   2457   opj_event_mgr_t * p_manager )
   2458 {
   2459   /* preconditions */
   2460   assert(jp2 != 00);
   2461   assert(stream != 00);
   2462   assert(p_manager != 00);
   2463 
   2464   jp2->jpip_iptr_offset = opj_stream_tell(stream);
   2465 
   2466   if (opj_stream_skip(stream,24,p_manager) != 24) {
   2467     return OPJ_FALSE;
   2468   }
   2469 
   2470   return OPJ_TRUE;
   2471 }
   2472 
   2473 /**
   2474  * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
   2475  *
   2476  * @param	p_header_data	the data contained in the file header box.
   2477  * @param	jp2				the jpeg2000 file codec.
   2478  * @param	p_header_size	the size of the data contained in the file header box.
   2479  * @param	p_manager		the user event manager.
   2480  *
   2481  * @return true if the JP2 Header box was successfully recognized.
   2482 */
   2483 static OPJ_BOOL opj_jp2_read_jp2h(  opj_jp2_t *jp2,
   2484                                     OPJ_BYTE *p_header_data,
   2485                                     OPJ_UINT32 p_header_size,
   2486                                     opj_event_mgr_t * p_manager
   2487                                     )
   2488 {
   2489 	OPJ_UINT32 l_box_size=0, l_current_data_size = 0;
   2490 	opj_jp2_box_t box;
   2491 	const opj_jp2_header_handler_t * l_current_handler;
   2492 	OPJ_BOOL l_has_ihdr = 0;
   2493 
   2494 	/* preconditions */
   2495 	assert(p_header_data != 00);
   2496 	assert(jp2 != 00);
   2497 	assert(p_manager != 00);
   2498 
   2499 	/* make sure the box is well placed */
   2500 	if ((jp2->jp2_state & JP2_STATE_FILE_TYPE) != JP2_STATE_FILE_TYPE ) {
   2501 		opj_event_msg(p_manager, EVT_ERROR, "The  box must be the first box in the file.\n");
   2502 		return OPJ_FALSE;
   2503 	}
   2504 
   2505 	jp2->jp2_img_state = JP2_IMG_STATE_NONE;
   2506 
   2507 	/* iterate while remaining data */
   2508 	while (p_header_size > 0) {
   2509 
   2510 		if (! opj_jp2_read_boxhdr_char(&box,p_header_data,&l_box_size,p_header_size, p_manager)) {
   2511 			opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box\n");
   2512 			return OPJ_FALSE;
   2513 		}
   2514 
   2515 		if (box.length > p_header_size) {
   2516 			opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: box length is inconsistent.\n");
   2517 			return OPJ_FALSE;
   2518 		}
   2519 
   2520 		l_current_handler = opj_jp2_img_find_handler(box.type);
   2521 		l_current_data_size = box.length - l_box_size;
   2522 		p_header_data += l_box_size;
   2523 
   2524 		if (l_current_handler != 00) {
   2525 			if (! l_current_handler->handler(jp2,p_header_data,l_current_data_size,p_manager)) {
   2526 				return OPJ_FALSE;
   2527 			}
   2528 		}
   2529 		else {
   2530 			jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;
   2531 		}
   2532 
   2533 		if (box.type == JP2_IHDR) {
   2534 			l_has_ihdr = 1;
   2535 		}
   2536 
   2537 		p_header_data += l_current_data_size;
   2538 		p_header_size -= box.length;
   2539 	}
   2540 
   2541 	if (l_has_ihdr == 0) {
   2542 		opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: no 'ihdr' box.\n");
   2543 		return OPJ_FALSE;
   2544 	}
   2545 
   2546 	jp2->jp2_state |= JP2_STATE_HEADER;
   2547 
   2548 	return OPJ_TRUE;
   2549 }
   2550 
   2551 static OPJ_BOOL opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,
   2552                                      OPJ_BYTE * p_data,
   2553                                      OPJ_UINT32 * p_number_bytes_read,
   2554                                      OPJ_UINT32 p_box_max_size,
   2555                                      opj_event_mgr_t * p_manager
   2556                                      )
   2557 {
   2558 	OPJ_UINT32 l_value;
   2559 
   2560 	/* preconditions */
   2561 	assert(p_data != 00);
   2562 	assert(box != 00);
   2563 	assert(p_number_bytes_read != 00);
   2564 	assert(p_manager != 00);
   2565 
   2566 	if (p_box_max_size < 8) {
   2567 		opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of less than 8 bytes\n");
   2568 		return OPJ_FALSE;
   2569 	}
   2570 
   2571 	/* process read data */
   2572 	opj_read_bytes(p_data, &l_value, 4);
   2573 	p_data += 4;
   2574 	box->length = (OPJ_UINT32)(l_value);
   2575 
   2576 	opj_read_bytes(p_data, &l_value, 4);
   2577 	p_data += 4;
   2578 	box->type = (OPJ_UINT32)(l_value);
   2579 
   2580 	*p_number_bytes_read = 8;
   2581 
   2582 	/* do we have a "special very large box ?" */
   2583 	/* read then the XLBox */
   2584 	if (box->length == 1) {
   2585 		OPJ_UINT32 l_xl_part_size;
   2586 
   2587 		if (p_box_max_size < 16) {
   2588 			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle XL box of less than 16 bytes\n");
   2589 			return OPJ_FALSE;
   2590 		}
   2591 
   2592 		opj_read_bytes(p_data,&l_xl_part_size, 4);
   2593 		p_data += 4;
   2594 		*p_number_bytes_read += 4;
   2595 
   2596 		if (l_xl_part_size != 0) {
   2597 			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
   2598 			return OPJ_FALSE;
   2599 		}
   2600 
   2601 		opj_read_bytes(p_data, &l_value, 4);
   2602 		*p_number_bytes_read += 4;
   2603 		box->length = (OPJ_UINT32)(l_value);
   2604 
   2605 		if (box->length == 0) {
   2606 			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
   2607 			return OPJ_FALSE;
   2608 		}
   2609 	}
   2610 	else if (box->length == 0) {
   2611 		opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
   2612 		return OPJ_FALSE;
   2613 	}
   2614 	if (box->length < *p_number_bytes_read) {
   2615 		opj_event_msg(p_manager, EVT_ERROR, "Box length is inconsistent.\n");
   2616 		return OPJ_FALSE;
   2617 	}
   2618 	return OPJ_TRUE;
   2619 }
   2620 
   2621 OPJ_BOOL opj_jp2_read_header(	opj_stream_private_t *p_stream,
   2622                                 opj_jp2_t *jp2,
   2623                                 opj_image_t ** p_image,
   2624                                 opj_event_mgr_t * p_manager
   2625                                 )
   2626 {
   2627 	/* preconditions */
   2628 	assert(jp2 != 00);
   2629 	assert(p_stream != 00);
   2630 	assert(p_manager != 00);
   2631 
   2632 	/* customization of the validation */
   2633 	if (! opj_jp2_setup_decoding_validation (jp2, p_manager)) {
   2634 		return OPJ_FALSE;
   2635 	}
   2636 
   2637 	/* customization of the encoding */
   2638 	if (! opj_jp2_setup_header_reading(jp2, p_manager)) {
   2639 		return OPJ_FALSE;
   2640 	}
   2641 
   2642 	/* validation of the parameters codec */
   2643 	if (! opj_jp2_exec(jp2,jp2->m_validation_list,p_stream,p_manager)) {
   2644 		return OPJ_FALSE;
   2645 	}
   2646 
   2647 	/* read header */
   2648 	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,p_stream,p_manager)) {
   2649 		return OPJ_FALSE;
   2650 	}
   2651 
   2652 	return opj_j2k_read_header(	p_stream,
   2653 							jp2->j2k,
   2654 							p_image,
   2655 							p_manager);
   2656 }
   2657 
   2658 static OPJ_BOOL opj_jp2_setup_encoding_validation (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
   2659 {
   2660 	/* preconditions */
   2661 	assert(jp2 != 00);
   2662 	assert(p_manager != 00);
   2663 
   2664 	if (! opj_procedure_list_add_procedure(jp2->m_validation_list, (opj_procedure)opj_jp2_default_validation, p_manager)) {
   2665 		return OPJ_FALSE;
   2666 	}
   2667 	/* DEVELOPER CORNER, add your custom validation procedure */
   2668 
   2669 	return OPJ_TRUE;
   2670 }
   2671 
   2672 static OPJ_BOOL opj_jp2_setup_decoding_validation (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
   2673 {
   2674 	/* preconditions */
   2675 	assert(jp2 != 00);
   2676 	assert(p_manager != 00);
   2677 
   2678 	/* DEVELOPER CORNER, add your custom validation procedure */
   2679 
   2680 	return OPJ_TRUE;
   2681 }
   2682 
   2683 static OPJ_BOOL opj_jp2_setup_header_writing (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
   2684 {
   2685 	/* preconditions */
   2686 	assert(jp2 != 00);
   2687 	assert(p_manager != 00);
   2688 
   2689 	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp, p_manager)) {
   2690 		return OPJ_FALSE;
   2691 	}
   2692 	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_ftyp, p_manager)) {
   2693 		return OPJ_FALSE;
   2694 	}
   2695 	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2h, p_manager)) {
   2696 		return OPJ_FALSE;
   2697 	}
   2698 	if( jp2->jpip_on ) {
   2699 		if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_skip_iptr, p_manager)) {
   2700 			return OPJ_FALSE;
   2701 		}
   2702 	}
   2703 	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_skip_jp2c,p_manager)) {
   2704 		return OPJ_FALSE;
   2705 	}
   2706 
   2707 	/* DEVELOPER CORNER, insert your custom procedures */
   2708 
   2709 	return OPJ_TRUE;
   2710 }
   2711 
   2712 static OPJ_BOOL opj_jp2_setup_header_reading (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
   2713 {
   2714 	/* preconditions */
   2715 	assert(jp2 != 00);
   2716 	assert(p_manager != 00);
   2717 
   2718 	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure, p_manager)) {
   2719 		return OPJ_FALSE;
   2720 	}
   2721 
   2722 	/* DEVELOPER CORNER, add your custom procedures */
   2723 
   2724 	return OPJ_TRUE;
   2725 }
   2726 
   2727 OPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,
   2728                                     OPJ_UINT32 * p_tile_index,
   2729                                     OPJ_UINT32 * p_data_size,
   2730                                     OPJ_INT32 * p_tile_x0,
   2731                                     OPJ_INT32 * p_tile_y0,
   2732                                     OPJ_INT32 * p_tile_x1,
   2733                                     OPJ_INT32 * p_tile_y1,
   2734                                     OPJ_UINT32 * p_nb_comps,
   2735                                     OPJ_BOOL * p_go_on,
   2736                                     opj_stream_private_t *p_stream,
   2737                                     opj_event_mgr_t * p_manager
   2738                                     )
   2739 {
   2740 	return opj_j2k_read_tile_header(p_jp2->j2k,
   2741 								p_tile_index,
   2742 								p_data_size,
   2743 								p_tile_x0, p_tile_y0,
   2744 								p_tile_x1, p_tile_y1,
   2745 								p_nb_comps,
   2746 								p_go_on,
   2747 								p_stream,
   2748 								p_manager);
   2749 }
   2750 
   2751 OPJ_BOOL opj_jp2_write_tile (	opj_jp2_t *p_jp2,
   2752 					 	 	    OPJ_UINT32 p_tile_index,
   2753 					 	 	    OPJ_BYTE * p_data,
   2754 					 	 	    OPJ_UINT32 p_data_size,
   2755 					 	 	    opj_stream_private_t *p_stream,
   2756 					 	 	    opj_event_mgr_t * p_manager
   2757                                 )
   2758 
   2759 {
   2760 	return opj_j2k_write_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
   2761 }
   2762 
   2763 OPJ_BOOL opj_jp2_decode_tile (  opj_jp2_t * p_jp2,
   2764                                 OPJ_UINT32 p_tile_index,
   2765                                 OPJ_BYTE * p_data,
   2766                                 OPJ_UINT32 p_data_size,
   2767                                 opj_stream_private_t *p_stream,
   2768                                 opj_event_mgr_t * p_manager
   2769                                 )
   2770 {
   2771 	return opj_j2k_decode_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
   2772 }
   2773 
   2774 void opj_jp2_destroy(opj_jp2_t *jp2)
   2775 {
   2776 	if (jp2) {
   2777 		/* destroy the J2K codec */
   2778 		opj_j2k_destroy(jp2->j2k);
   2779 		jp2->j2k = 00;
   2780 
   2781 		if (jp2->comps) {
   2782 			opj_free(jp2->comps);
   2783 			jp2->comps = 00;
   2784 		}
   2785 
   2786 		if (jp2->cl) {
   2787 			opj_free(jp2->cl);
   2788 			jp2->cl = 00;
   2789 		}
   2790 
   2791 		if (jp2->color.icc_profile_buf) {
   2792 			opj_free(jp2->color.icc_profile_buf);
   2793 			jp2->color.icc_profile_buf = 00;
   2794 		}
   2795 
   2796 		if (jp2->color.jp2_cdef) {
   2797 			if (jp2->color.jp2_cdef->info) {
   2798 				opj_free(jp2->color.jp2_cdef->info);
   2799 				jp2->color.jp2_cdef->info = NULL;
   2800 			}
   2801 
   2802 			opj_free(jp2->color.jp2_cdef);
   2803 			jp2->color.jp2_cdef = 00;
   2804 		}
   2805 
   2806 		if (jp2->color.jp2_pclr) {
   2807 			if (jp2->color.jp2_pclr->cmap) {
   2808 				opj_free(jp2->color.jp2_pclr->cmap);
   2809 				jp2->color.jp2_pclr->cmap = NULL;
   2810 			}
   2811 			if (jp2->color.jp2_pclr->channel_sign) {
   2812 				opj_free(jp2->color.jp2_pclr->channel_sign);
   2813 				jp2->color.jp2_pclr->channel_sign = NULL;
   2814 			}
   2815 			if (jp2->color.jp2_pclr->channel_size) {
   2816 				opj_free(jp2->color.jp2_pclr->channel_size);
   2817 				jp2->color.jp2_pclr->channel_size = NULL;
   2818 			}
   2819 			if (jp2->color.jp2_pclr->entries) {
   2820 				opj_free(jp2->color.jp2_pclr->entries);
   2821 				jp2->color.jp2_pclr->entries = NULL;
   2822 			}
   2823 
   2824 			opj_free(jp2->color.jp2_pclr);
   2825 			jp2->color.jp2_pclr = 00;
   2826 		}
   2827 
   2828 		if (jp2->m_validation_list) {
   2829 			opj_procedure_list_destroy(jp2->m_validation_list);
   2830 			jp2->m_validation_list = 00;
   2831 		}
   2832 
   2833 		if (jp2->m_procedure_list) {
   2834 			opj_procedure_list_destroy(jp2->m_procedure_list);
   2835 			jp2->m_procedure_list = 00;
   2836 		}
   2837 
   2838 		opj_free(jp2);
   2839 	}
   2840 }
   2841 
   2842 OPJ_BOOL opj_jp2_set_decode_area(	opj_jp2_t *p_jp2,
   2843 								    opj_image_t* p_image,
   2844 								    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
   2845 								    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
   2846 								    opj_event_mgr_t * p_manager
   2847                                     )
   2848 {
   2849 	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);
   2850 }
   2851 
   2852 OPJ_BOOL opj_jp2_get_tile(	opj_jp2_t *p_jp2,
   2853                             opj_stream_private_t *p_stream,
   2854                             opj_image_t* p_image,
   2855                             opj_event_mgr_t * p_manager,
   2856                             OPJ_UINT32 tile_index
   2857                             )
   2858 {
   2859 	if (!p_image)
   2860 		return OPJ_FALSE;
   2861 
   2862 	opj_event_msg(p_manager, EVT_WARNING, "JP2 box which are after the codestream will not be read by this function.\n");
   2863 
   2864 	if (! opj_j2k_get_tile(p_jp2->j2k, p_stream, p_image, p_manager, tile_index) ){
   2865 		opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
   2866 		return OPJ_FALSE;
   2867 	}
   2868 
   2869 	if (!opj_jp2_check_color(p_image, &(p_jp2->color), p_manager)) {
   2870 		return OPJ_FALSE;
   2871 	}
   2872 
   2873 	/* Set Image Color Space */
   2874 	if (p_jp2->enumcs == 16)
   2875 		p_image->color_space = OPJ_CLRSPC_SRGB;
   2876 	else if (p_jp2->enumcs == 17)
   2877 		p_image->color_space = OPJ_CLRSPC_GRAY;
   2878 	else if (p_jp2->enumcs == 18)
   2879 		p_image->color_space = OPJ_CLRSPC_SYCC;
   2880 	else if (p_jp2->enumcs == 24)
   2881 		p_image->color_space = OPJ_CLRSPC_EYCC;
   2882 	else if (p_jp2->enumcs == 12)
   2883 		p_image->color_space = OPJ_CLRSPC_CMYK;
   2884 	else
   2885 		p_image->color_space = OPJ_CLRSPC_UNKNOWN;
   2886 
   2887 	if(p_jp2->color.jp2_pclr) {
   2888 		/* Part 1, I.5.3.4: Either both or none : */
   2889 		if( !p_jp2->color.jp2_pclr->cmap)
   2890 			opj_jp2_free_pclr(&(p_jp2->color));
   2891 		else
   2892 			opj_jp2_apply_pclr(p_image, &(p_jp2->color));
   2893 	}
   2894 
   2895 	/* Apply the color space if needed */
   2896 	if(p_jp2->color.jp2_cdef) {
   2897 		opj_jp2_apply_cdef(p_image, &(p_jp2->color), p_manager);
   2898 	}
   2899 
   2900 	if(p_jp2->color.icc_profile_buf) {
   2901 		p_image->icc_profile_buf = p_jp2->color.icc_profile_buf;
   2902 		p_image->icc_profile_len = p_jp2->color.icc_profile_len;
   2903 		p_jp2->color.icc_profile_buf = NULL;
   2904 	}
   2905 
   2906 	return OPJ_TRUE;
   2907 }
   2908 
   2909 /* ----------------------------------------------------------------------- */
   2910 /* JP2 encoder interface                                             */
   2911 /* ----------------------------------------------------------------------- */
   2912 
   2913 opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder)
   2914 {
   2915 	opj_jp2_t *jp2 = (opj_jp2_t*)opj_calloc(1,sizeof(opj_jp2_t));
   2916 	if (jp2) {
   2917 
   2918 		/* create the J2K codec */
   2919 		if (! p_is_decoder) {
   2920 			jp2->j2k = opj_j2k_create_compress();
   2921 		}
   2922 		else {
   2923 			jp2->j2k = opj_j2k_create_decompress();
   2924 		}
   2925 
   2926 		if (jp2->j2k == 00) {
   2927 			opj_jp2_destroy(jp2);
   2928 			return 00;
   2929 		}
   2930 
   2931 		/* Color structure */
   2932 		jp2->color.icc_profile_buf = NULL;
   2933 		jp2->color.icc_profile_len = 0;
   2934 		jp2->color.jp2_cdef = NULL;
   2935 		jp2->color.jp2_pclr = NULL;
   2936 		jp2->color.jp2_has_colr = 0;
   2937 
   2938 		/* validation list creation */
   2939 		jp2->m_validation_list = opj_procedure_list_create();
   2940 		if (! jp2->m_validation_list) {
   2941 			opj_jp2_destroy(jp2);
   2942 			return 00;
   2943 		}
   2944 
   2945 		/* execution list creation */
   2946 		jp2->m_procedure_list = opj_procedure_list_create();
   2947 		if (! jp2->m_procedure_list) {
   2948 			opj_jp2_destroy(jp2);
   2949 			return 00;
   2950 		}
   2951 	}
   2952 
   2953 	return jp2;
   2954 }
   2955 
   2956 void jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream)
   2957 {
   2958 	/* preconditions */
   2959 	assert(p_jp2 != 00);
   2960 
   2961 	j2k_dump(p_jp2->j2k,
   2962 					flag,
   2963 					out_stream);
   2964 }
   2965 
   2966 opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2)
   2967 {
   2968 	return j2k_get_cstr_index(p_jp2->j2k);
   2969 }
   2970 
   2971 opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2)
   2972 {
   2973 	return j2k_get_cstr_info(p_jp2->j2k);
   2974 }
   2975 
   2976 OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,
   2977                                                OPJ_UINT32 res_factor,
   2978                                                opj_event_mgr_t * p_manager)
   2979 {
   2980 	return opj_j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);
   2981 }
   2982 
   2983 /* JPIP specific */
   2984 
   2985 #ifdef USE_JPIP
   2986 static OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,
   2987   opj_stream_private_t *cio,
   2988   opj_event_mgr_t * p_manager )
   2989 {
   2990   OPJ_OFF_T j2k_codestream_exit;
   2991   OPJ_BYTE l_data_header [24];
   2992 
   2993   /* preconditions */
   2994   assert(jp2 != 00);
   2995   assert(cio != 00);
   2996   assert(p_manager != 00);
   2997   assert(opj_stream_has_seek(cio));
   2998 
   2999   j2k_codestream_exit = opj_stream_tell(cio);
   3000   opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
   3001   opj_write_bytes(l_data_header + 4,JPIP_IPTR,4);									   /* IPTR */
   3002 #if 0
   3003   opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
   3004   opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
   3005 #else
   3006   opj_write_double(l_data_header + 4 + 4, 0); /* offset */
   3007   opj_write_double(l_data_header + 8 + 8, 0); /* length */
   3008 #endif
   3009 
   3010   if (! opj_stream_seek(cio,jp2->jpip_iptr_offset,p_manager)) {
   3011     opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   3012     return OPJ_FALSE;
   3013   }
   3014 
   3015   if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
   3016     opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   3017     return OPJ_FALSE;
   3018   }
   3019 
   3020   if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
   3021     opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   3022     return OPJ_FALSE;
   3023   }
   3024 
   3025   return OPJ_TRUE;
   3026 }
   3027 
   3028 static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
   3029   opj_stream_private_t *cio,
   3030   opj_event_mgr_t * p_manager )
   3031 {
   3032   OPJ_OFF_T j2k_codestream_exit;
   3033   OPJ_BYTE l_data_header [24];
   3034 
   3035   /* preconditions */
   3036   assert(jp2 != 00);
   3037   assert(cio != 00);
   3038   assert(p_manager != 00);
   3039   assert(opj_stream_has_seek(cio));
   3040 
   3041   opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
   3042   opj_write_bytes(l_data_header + 4,JPIP_FIDX,4);									   /* IPTR */
   3043   opj_write_double(l_data_header + 4 + 4, 0); /* offset */
   3044   opj_write_double(l_data_header + 8 + 8, 0); /* length */
   3045 
   3046   if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
   3047     opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   3048     return OPJ_FALSE;
   3049   }
   3050 
   3051   j2k_codestream_exit = opj_stream_tell(cio);
   3052   if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
   3053     opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   3054     return OPJ_FALSE;
   3055   }
   3056 
   3057   return OPJ_TRUE;
   3058 }
   3059 
   3060 static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
   3061   opj_stream_private_t *cio,
   3062   opj_event_mgr_t * p_manager )
   3063 {
   3064   OPJ_OFF_T j2k_codestream_exit;
   3065   OPJ_BYTE l_data_header [24];
   3066 
   3067   /* preconditions */
   3068   assert(jp2 != 00);
   3069   assert(cio != 00);
   3070   assert(p_manager != 00);
   3071   assert(opj_stream_has_seek(cio));
   3072 
   3073   j2k_codestream_exit = opj_stream_tell(cio);
   3074   opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
   3075   opj_write_bytes(l_data_header + 4,JPIP_CIDX,4);									   /* IPTR */
   3076 #if 0
   3077   opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
   3078   opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
   3079 #else
   3080   opj_write_double(l_data_header + 4 + 4, 0); /* offset */
   3081   opj_write_double(l_data_header + 8 + 8, 0); /* length */
   3082 #endif
   3083 
   3084   if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
   3085     opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   3086     return OPJ_FALSE;
   3087   }
   3088 
   3089   if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
   3090     opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   3091     return OPJ_FALSE;
   3092   }
   3093 
   3094   j2k_codestream_exit = opj_stream_tell(cio);
   3095   if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
   3096     opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
   3097     return OPJ_FALSE;
   3098   }
   3099 
   3100   return OPJ_TRUE;
   3101 }
   3102 
   3103 #if 0
   3104 static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,
   3105   opj_event_mgr_t * p_manager )
   3106 {
   3107   OPJ_BYTE l_data_header [8];
   3108   OPJ_OFF_T len, lenp;
   3109 
   3110   lenp = opj_stream_tell(cio);
   3111   opj_stream_skip(cio, 4, p_manager);         /* L [at the end] */
   3112   opj_write_bytes(l_data_header,JPIP_PRXY,4); /* IPTR           */
   3113   opj_stream_write_data(cio,l_data_header,4,p_manager);
   3114 
   3115   opj_write_bytes( l_data_header, offset_jp2c, 8); /* OOFF           */
   3116   opj_stream_write_data(cio,l_data_header,8,p_manager);
   3117   opj_write_bytes( l_data_header, length_jp2c, 4); /* OBH part 1     */
   3118   opj_write_bytes( l_data_header+4, JP2_JP2C, 4);  /* OBH part 2     */
   3119   opj_stream_write_data(cio,l_data_header,8,p_manager);
   3120 
   3121   opj_write_bytes( l_data_header, 1, 1);/* NI             */
   3122   opj_stream_write_data(cio,l_data_header,1,p_manager);
   3123 
   3124   opj_write_bytes( l_data_header, offset_idx, 8);  /* IOFF           */
   3125   opj_stream_write_data(cio,l_data_header,8,p_manager);
   3126   opj_write_bytes( l_data_header, length_idx, 4);  /* IBH part 1     */
   3127   opj_write_bytes( l_data_header+4, JPIP_CIDX, 4);   /* IBH part 2     */
   3128   opj_stream_write_data(cio,l_data_header,8,p_manager);
   3129 
   3130   len = opj_stream_tell(cio)-lenp;
   3131   opj_stream_skip(cio, lenp, p_manager);
   3132   opj_write_bytes(l_data_header,len,4);/* L              */
   3133   opj_stream_write_data(cio,l_data_header,4,p_manager);
   3134   opj_stream_seek(cio, lenp+len,p_manager);
   3135 }
   3136 #endif
   3137 
   3138 
   3139 #if 0
   3140 static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,
   3141   opj_event_mgr_t * p_manager )
   3142 {
   3143   OPJ_BYTE l_data_header [4];
   3144   OPJ_OFF_T len, lenp;
   3145 
   3146   lenp = opj_stream_tell(cio);
   3147   opj_stream_skip(cio, 4, p_manager);
   3148   opj_write_bytes(l_data_header,JPIP_FIDX,4); /* FIDX */
   3149   opj_stream_write_data(cio,l_data_header,4,p_manager);
   3150 
   3151   write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio,p_manager);
   3152 
   3153   len = opj_stream_tell(cio)-lenp;
   3154   opj_stream_skip(cio, lenp, p_manager);
   3155   opj_write_bytes(l_data_header,len,4);/* L              */
   3156   opj_stream_write_data(cio,l_data_header,4,p_manager);
   3157   opj_stream_seek(cio, lenp+len,p_manager);
   3158 
   3159   return len;
   3160 }
   3161 #endif
   3162 #endif /* USE_JPIP */
   3163