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