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