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