1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The copyright in this software is being made available under the 2-clauses 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * BSD License, included below. This software may be subject to other third 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * party and contributor rights, including patent rights, and no such rights 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are granted under this license. 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2014, Professor Benoit Macq 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2001-2003, David Janssens 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2002-2003, Yannick Verschueren 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2003-2007, Francois-Olivier Devaux 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2003-2014, Antonin Descampe 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2005, Herve Drolon, FreeImage Team 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr> 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2006-2007, Parvatha Elangovan 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2010-2011, Kaori Hagihara 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (c) 2012, CS Systemes d'Information, France 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * All rights reserved. 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Redistribution and use in source and binary forms, with or without 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * modification, are permitted provided that the following conditions 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are met: 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1. Redistributions of source code must retain the above copyright 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * notice, this list of conditions and the following disclaimer. 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 2. Redistributions in binary form must reproduce the above copyright 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * notice, this list of conditions and the following disclaimer in the 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * documentation and/or other materials provided with the distribution. 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSSIBILITY OF SUCH DAMAGE. 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "opj_includes.h" 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** @name Local static functions */ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@{*/ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures. 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_header_reading (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The read header procedure. 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k, 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The default encoding validation procedure without any extension. 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec to validate. 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the input stream to validate. 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return true if the parameters are correct. 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_encoding_validation ( opj_j2k_t * p_j2k, 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The default decoding validation procedure without any extension. 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec to validate. 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the input stream to validate. 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return true if the parameters are correct. 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_decoding_validation ( opj_j2k_t * p_j2k, 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are valid. Developpers wanting to extend the library can add their own validation procedures. 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are valid. Developpers wanting to extend the library can add their own validation procedures. 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * are valid. Developpers wanting to extend the library can add their own validation procedures. 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_end_compress (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The mct encoding validation procedure. 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec to validate. 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the input stream to validate. 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return true if the parameters are correct. 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_mct_validation (opj_j2k_t * p_j2k, 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Builds the tcd decoder to use to decode tile. 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_build_decoder ( opj_j2k_t * p_j2k, 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Builds the tcd encoder to use to encode tile. 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_build_encoder ( opj_j2k_t * p_j2k, 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Creates a tile-coder decoder. 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_create_tcd( opj_j2k_t *p_j2k, 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Excutes the given procedures on the given codec. 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_procedure_list the list of procedures to execute 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec to execute the procedures on. 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to execute the procedures on. 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user manager. 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return true if all the procedures were successfully executed. 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k, 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_procedure_list_t * p_procedure_list, 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Updates the rates of the tcp. 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_update_rates( opj_j2k_t *p_j2k, 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copies the decoding tile parameters onto all the tile parameters. 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Creates also the tile decoder. 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2k, 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Destroys the memory associated with the decoding of headers. 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k, 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads the lookup table containing all the marker, status and action, and returns the handler associated 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * with the marker value. 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_id Marker value to look up 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return the handler associated with the id. 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler (OPJ_UINT32 p_id); 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Destroys a tile coding parameter structure. 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_tcp the tile coding parameter to destroy. 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp); 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Destroys the data inside a tile coding parameter structure. 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_tcp the tile coding parameter which contain data to destroy. 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp); 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Destroys a coding parameter structure. 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_cp the coding parameter to destroy. 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_cp_destroy (opj_cp_t *p_cp); 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile. 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_tile_no FIXME DOC 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the component number to output. 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data FIXME DOC 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size FIXME DOC 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return FIXME DOC 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_SPCod_SPCoc( opj_j2k_t *p_j2k, 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_header_size, 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the size taken by writing a SPCod or SPCoc for the given tile and component. 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the J2K codec. 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_tile_no the tile index. 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the component being outputted. 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return the number of bytes taken by the SPCod element. 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (opj_j2k_t *p_j2k, 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no ); 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile. 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param compno FIXME DOC 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the COM box. 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the COM marker. 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_SPCod_SPCoc( opj_j2k_t *p_j2k, 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno, 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_header_size, 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the size taken by writing SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC. 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_tile_no the tile index. 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the component being outputted. 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the J2K codec. 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return the number of bytes taken by the SPCod element. 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k, 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no ); 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC. 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_tile_no the tile to output. 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the component number to output. 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data the data buffer. 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size pointer to the size of the data buffer, it is changed by the function. 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k, 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_header_size, 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Updates the Tile Length Marker. 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_update_tlm ( opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size); 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC. 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param compno the component number to output. 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data buffer. 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size pointer to the size of the data buffer, it is changed by the function. 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_SQcd_SQcc( opj_j2k_t *p_j2k, 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno, 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_header_size, 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copies the tile component parameters of all the component from the first tile component. 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the J2k codec. 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k ); 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copies the tile quantization parameters of all the component from the first tile component. 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the J2k codec. 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k ); 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads the tiles. 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k, 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k, 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_index, 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image); 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic void opj_get_tile_dimensions(opj_image_t * l_image, 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_tcd_tilecomp_t * l_tilec, 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_image_comp_t * l_img_comp, 344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_size_comp, 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_width, 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_height, 347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_offset_x, 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_offset_y, 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_image_width, 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_stride, 351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_tile_offset); 352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data); 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_post_write_tile (opj_j2k_t * p_j2k, 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Sets up the procedures to do on writing header. 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Developers wanting to extend the library can add their own writing procedures. 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_header_writing (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_first_tile_part( opj_j2k_t *p_j2k, 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_total_data_size, 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ); 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_all_tile_parts( opj_j2k_t *p_j2k, 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_total_data_size, 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ); 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the offset of the header. 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_get_end_header( opj_j2k_t *p_j2k, 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k); 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ----------------------------------------------------------------------- 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ----------------------------------------------------------------------- 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ----------------------------------------------------------------------- 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the SOC marker (Start Of Codestream) 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_soc( opj_j2k_t *p_j2k, 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a SOC marker (Start of Codestream) 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 file codec. 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream XXX needs data 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_soc( opj_j2k_t *p_j2k, 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the SIZ marker (image and tile size) 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_siz( opj_j2k_t *p_j2k, 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a SIZ marker (image and tile size) 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 file codec. 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the SIZ box. 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the SIZ marker. 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k, 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the COM marker (comment) 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_com( opj_j2k_t *p_j2k, 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a COM marker (comments) 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 file codec. 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the COM box. 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the COM marker. 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_com ( opj_j2k_t *p_j2k, 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the COD marker (Coding style default) 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_cod( opj_j2k_t *p_j2k, 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a COD marker (Coding Styke defaults) 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the COD box. 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the COD marker. 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_cod ( opj_j2k_t *p_j2k, 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the COC marker (Coding style component) 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the index of the component to output. 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k, 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the COC marker (Coding style component) 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the index of the component to output. 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data FIXME DOC 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data_written FIXME DOC 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k, 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the maximum size taken by a coc. 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec to use. 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k); 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a COC marker (Coding Style Component) 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the COC box. 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the COC marker. 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_coc ( opj_j2k_t *p_j2k, 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the QCD marker (quantization default) 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_qcd( opj_j2k_t *p_j2k, 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a QCD marker (Quantization defaults) 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the QCD box. 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the QCD marker. 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_qcd ( opj_j2k_t *p_j2k, 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the QCC marker (quantization component) 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the index of the component to output. 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_qcc( opj_j2k_t *p_j2k, 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the QCC marker (quantization component) 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the index of the component to output. 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data FIXME DOC 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data_written the stream to write data to. 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k, 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the maximum size taken by a qcc. 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k); 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a QCC marker (Quantization component) 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the QCC box. 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the QCC marker. 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_qcc( opj_j2k_t *p_j2k, 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the POC marker (Progression Order Change) 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_poc( opj_j2k_t *p_j2k, 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the POC marker (Progression Order Change) 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data FIXME DOC 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data_written the stream to write data to. 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k, 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the maximum size taken by the writing of a POC. 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k); 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a POC marker (Progression Order Change) 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the POC box. 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the POC marker. 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_poc ( opj_j2k_t *p_j2k, 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the maximum size taken by the toc headers of all the tile parts of any given tile. 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k); 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the maximum size taken by the headers of the SOT. 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec to use. 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k); 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a CRG marker (Component registration) 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the TLM box. 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the TLM marker. 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_crg ( opj_j2k_t *p_j2k, 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a TLM marker (Tile Length Marker) 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the TLM box. 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the TLM marker. 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_tlm ( opj_j2k_t *p_j2k, 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the updated tlm. 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k, 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a PLM marker (Packet length, main header marker) 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the TLM box. 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the TLM marker. 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_plm ( opj_j2k_t *p_j2k, 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a PLT marker (Packet length, tile-part header) 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the PLT box. 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the PLT marker. 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_plt ( opj_j2k_t *p_j2k, 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Reads a PPM marker (Packed headers, main header) 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the POC box. 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the POC marker. 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_ppm ( 731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_j2k_t *p_j2k, 732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_BYTE * p_header_data, 733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 p_header_size, 734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_mgr_t * p_manager ); 735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/** 737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Merges all PPM markers read (Packed headers, main header) 738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_cp main coding parameters. 740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_manager the user event manager. 741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_merge_ppm ( opj_cp_t *p_cp, opj_event_mgr_t * p_manager ); 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a PPT marker (Packed packet headers, tile-part header) 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the PPT box. 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the PPT marker. 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_ppt ( opj_j2k_t *p_j2k, 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/** 758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Merges all PPT markers read (Packed headers, tile-part header) 759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_tcp the tile. 761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_manager the user event manager. 762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_merge_ppt ( opj_tcp_t *p_tcp, 764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_mgr_t * p_manager ); 765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the TLM marker (Tile Length Marker) 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_tlm( opj_j2k_t *p_j2k, 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the SOT marker (Start of tile-part) 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data FIXME DOC 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data_written FIXME DOC 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_sot( opj_j2k_t *p_j2k, 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_stream_private_t *p_stream, 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Reads values from a SOT marker (Start of tile-part) 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * the j2k decoder state is not affected. No side effects, no checks except for p_header_size. 797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_header_data the data contained in the SOT marker. 799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_header_size the size of the data contained in the SOT marker. 800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_tile_no Isot. 801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_tot_len Psot. 802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_current_part TPsot. 803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_num_parts TNsot. 804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_manager the user event manager. 805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE * p_header_data, 807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 p_header_size, 808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32* p_tile_no, 809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32* p_tot_len, 810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32* p_current_part, 811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32* p_num_parts, 812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_mgr_t * p_manager ); 813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/** 814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Reads a SOT marker (Start of tile-part) 815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_header_data the data contained in the SOT marker. 817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_j2k the jpeg2000 codec. 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the PPT marker. 819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_manager the user event manager. 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the SOD marker (Start of data) 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_tile_coder FIXME DOC 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data FIXME DOC 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_data_written FIXME DOC 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_total_data_size FIXME DOC 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_sod( opj_j2k_t *p_j2k, 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_t * p_tile_coder, 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_total_data_size, 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_stream_private_t *p_stream, 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a SOD marker (Start Of Data) 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream FIXME DOC 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_sod( opj_j2k_t *p_j2k, 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_update_tlm (opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size ) 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_j2k->m_current_tile_number,1); /* PSOT */ 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current; 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_tile_part_size,4); /* PSOT */ 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4; 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the RGN marker (Region Of Interest) 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_tile_no the tile to output 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_comp_no the component to output 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param nb_comps the number of components 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_rgn( opj_j2k_t *p_j2k, 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 nb_comps, 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a RGN marker (Region Of Interest) 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the POC box. 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the POC marker. 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k, 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the EOC marker (End of Codestream) 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_eoc( opj_j2k_t *p_j2k, 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a EOC marker (End Of Codestream) 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream FIXME DOC 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_eoc ( opj_j2k_t *p_j2k, 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the CBD-MCT-MCC-MCO markers (Multi components transform) 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_mct_data_group( opj_j2k_t *p_j2k, 926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Inits the Info 931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_init_info( opj_j2k_t *p_j2k, 937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 941ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovAdd main header marker information 942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param cstr_index Codestream information structure 943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param type marker type 944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param pos byte offset of marker segment 945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param len length of marker segment 946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ; 948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 949ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovAdd tile header marker information 950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param tileno tile index number 951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param cstr_index Codestream information structure 952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param type marker type 953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param pos byte offset of marker segment 954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov@param len length of marker segment 955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic 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); 957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads an unknown marker 960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream object to read from. 963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param output_marker FIXME DOC 964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return true if the marker could be deduced. 967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_unk( opj_j2k_t *p_j2k, 969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 *output_marker, 971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the MCT marker (Multiple Component Transform) 975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_mct_record FIXME DOC 978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_mct_record( opj_j2k_t *p_j2k, 982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t * p_mct_record, 983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a MCT marker (Multiple Component Transform) 988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the MCT box. 990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the MCT marker. 992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_mct ( opj_j2k_t *p_j2k, 995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the MCC marker (Multiple Component Collection) 1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_mcc_record FIXME DOC 1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_mcc_record( opj_j2k_t *p_j2k, 1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t * p_mcc_record, 1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a MCC marker (Multiple Component Collection) 1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the MCC box. 1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the MCC marker. 1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k, 1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the MCO marker (Multiple component transformation ordering) 1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k, 1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a MCO marker (Multiple Component Transform Ordering) 1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the MCO box. 1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the MCO marker. 1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_mco ( opj_j2k_t *p_j2k, 1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index); 1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Ends the encoding, i.e. frees memory. 1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_end_encoding( opj_j2k_t *p_j2k, 1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes the CBD marker (Component bit depth definition) 1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k, 1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a CBD marker (Component bit depth definition) 1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the CBD box. 1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the CBD marker. 1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_cbd ( opj_j2k_t *p_j2k, 1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes COC marker for each component. 1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_all_coc( opj_j2k_t *p_j2k, 1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes QCC marker for each component. 1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_all_qcc( opj_j2k_t *p_j2k, 1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes regions of interests. 1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k, 1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Writes EPC ???? 1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_write_epc( opj_j2k_t *p_j2k, 1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Checks the progression order changes values. Tells of the poc given as input are valid. 1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * A nice message is outputted at errors. 1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_pocs the progression order changes. 1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_nb_pocs the number of progression order changes. 1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_nb_resolutions the number of resolutions. 1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param numcomps the number of components 1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param numlayers the number of layers. 1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return true if the pocs are valid. 1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs, 1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_nb_pocs, 1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_nb_resolutions, 1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 numcomps, 1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 numlayers, 1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Gets the number of tile parts used for the given change of progression (if any) and the given tile. 1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param cp the coding parameters. 1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param pino the offset of the given poc (i.e. its position in the coding parameter). 1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param tileno the given tile. 1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return the number of tile parts. 1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_UINT32 opj_j2k_get_num_tp( opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno); 1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Calculates the total number of tile parts needed by the encoder to 1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * encode such an image. If not enough memory is available, then the function return false. 1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_nb_tiles pointer that will hold the number of tile parts. 1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param cp the coding parameters for the image. 1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param image the image to encode. 1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the p_j2k encoder. 1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @return true if the function was successful, false else. 1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_calculate_tp( opj_j2k_t *p_j2k, 1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *cp, 1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_nb_tiles, 1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *image, 1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager); 1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream); 1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream); 1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic opj_codestream_index_t* opj_j2k_create_cstr_index(void); 1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp); 1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp); 1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres); 1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager); 1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager); 1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/** 1214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Checks for invalid number of tile-parts in SOT marker (TPsot==TNsot). See issue 254. 1215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 1216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_stream the stream to read data from. 1217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param tile_no tile number we're looking for. 1218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_correction_needed output value. if true, non conformant codestream needs TNsot correction. 1219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_manager the user event manager. 1220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 1221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @return true if the function was successful, false else. 1222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 1223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic 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 ); 1224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/ 1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*@}*/ 1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */ 1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct j2k_prog_order{ 1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_PROG_ORDER enum_prog; 1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char str_prog[5]; 1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}j2k_prog_order_t; 1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic j2k_prog_order_t j2k_prog_order_list[] = { 1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {OPJ_CPRL, "CPRL"}, 1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {OPJ_LRCP, "LRCP"}, 1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {OPJ_PCRL, "PCRL"}, 1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {OPJ_RLCP, "RLCP"}, 1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {OPJ_RPCL, "RPCL"}, 1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {(OPJ_PROG_ORDER)-1, ""} 1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * FIXME DOC 1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic const OPJ_UINT32 MCT_ELEMENT_SIZE [] = 1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2, 1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4, 1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4, 1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8 1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef void (* opj_j2k_mct_function) (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); 1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic const opj_j2k_mct_function j2k_mct_read_functions_to_float [] = 1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_read_int16_to_float, 1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_read_int32_to_float, 1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_read_float32_to_float, 1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_read_float64_to_float 1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] = 1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_read_int16_to_int32, 1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_read_int32_to_int32, 1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_read_float32_to_int32, 1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_read_float64_to_int32 1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic const opj_j2k_mct_function j2k_mct_write_functions_from_float [] = 1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_float_to_int16, 1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_float_to_int32, 1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_float_to_float, 1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_float_to_float64 1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct opj_dec_memory_marker_handler 1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /** marker value */ 1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 id; 1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /** value of the state when the marker can appear */ 1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 states; 1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /** action linked to the marker */ 1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL (*handler) ( opj_j2k_t *p_j2k, 1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ); 1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovopj_dec_memory_marker_handler_t; 1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] = 1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot}, 1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod}, 1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc}, 1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn}, 1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd}, 1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc}, 1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc}, 1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz}, 1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm}, 1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm}, 1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt}, 1308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {J2K_MS_PPM, J2K_STATE_MH, opj_j2k_read_ppm}, 1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt}, 1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_SOP, 0, 0}, 1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg}, 1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com}, 1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct}, 1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_CBD, J2K_STATE_MH , opj_j2k_read_cbd}, 1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc}, 1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco}, 1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TODO_MS /* remove these functions which are not commpatible with the v2 API */ 1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc}, 1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb}, 1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd}, 1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red}, 1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPSEC 1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec}, 1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_INSEC, 0, j2k_read_insec} 1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPSEC */ 1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/ 1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; 1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data; 1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_temp; 1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_src_data,&l_temp,2); 1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_data+=sizeof(OPJ_INT16); 1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_data++) = (OPJ_FLOAT32) l_temp; 1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; 1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data; 1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_temp; 1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_src_data,&l_temp,4); 1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_data+=sizeof(OPJ_INT32); 1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_data++) = (OPJ_FLOAT32) l_temp; 1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; 1367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data; 1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 l_temp; 1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_float(l_src_data,&l_temp); 1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_data+=sizeof(OPJ_FLOAT32); 1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_data++) = l_temp; 1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; 1383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data; 1384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT64 l_temp; 1386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_double(l_src_data,&l_temp); 1389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_data+=sizeof(OPJ_FLOAT64); 1391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_data++) = (OPJ_FLOAT32) l_temp; 1393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; 1399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data; 1400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_temp; 1402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_src_data,&l_temp,2); 1405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_data+=sizeof(OPJ_INT16); 1407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_data++) = (OPJ_INT32) l_temp; 1409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; 1415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data; 1416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_temp; 1418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_src_data,&l_temp,4); 1421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_data+=sizeof(OPJ_INT32); 1423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_data++) = (OPJ_INT32) l_temp; 1425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; 1431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data; 1432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 l_temp; 1434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_float(l_src_data,&l_temp); 1437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_data+=sizeof(OPJ_FLOAT32); 1439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_data++) = (OPJ_INT32) l_temp; 1441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; 1447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data; 1448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT64 l_temp; 1450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_double(l_src_data,&l_temp); 1453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_data+=sizeof(OPJ_FLOAT64); 1455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_data++) = (OPJ_INT32) l_temp; 1457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data; 1463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data; 1464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_temp; 1466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_temp = (OPJ_UINT32) *(l_src_data++); 1469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT16)); 1471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_data+=sizeof(OPJ_INT16); 1473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data; 1479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data; 1480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_temp; 1482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_temp = (OPJ_UINT32) *(l_src_data++); 1485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT32)); 1487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_data+=sizeof(OPJ_INT32); 1489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data; 1495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data; 1496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 l_temp; 1498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_temp = (OPJ_FLOAT32) *(l_src_data++); 1501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_float(l_dest_data,l_temp); 1503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_data+=sizeof(OPJ_FLOAT32); 1505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) 1509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data; 1511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data; 1512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT64 l_temp; 1514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_nb_elem;++i) { 1516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_temp = (OPJ_FLOAT64) *(l_src_data++); 1517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_double(l_dest_data,l_temp); 1519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_data+=sizeof(OPJ_FLOAT64); 1521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovchar *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){ 1525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k_prog_order_t *po; 1526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){ 1527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(po->enum_prog == prg_order){ 1528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return po->str_prog; 1529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return po->str_prog; 1532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs, 1535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_nb_pocs, 1536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_nb_resolutions, 1537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_num_comps, 1538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_num_layers, 1539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 1540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32* packet_array; 1542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 index , resno, compno, layno; 1543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 step_c = 1; 1545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 step_r = p_num_comps * step_c; 1546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 step_l = p_nb_resolutions * step_r; 1547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL loss = OPJ_FALSE; 1548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 layno0 = 0; 1549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers, sizeof(OPJ_UINT32)); 1551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (packet_array == 00) { 1552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager , EVT_ERROR, "Not enough memory for checking the poc values.\n"); 1553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_nb_pocs == 0) { 1557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(packet_array); 1558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 1559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index = step_r * p_pocs->resno0; 1562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* take each resolution for each poc */ 1563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) 1564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 1565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c; 1566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* take each comp of each resolution for each poc */ 1568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) { 1569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 comp_index = res_index + layno0 * step_l; 1570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* and finally take each layer of each res of ... */ 1572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (layno = layno0; layno < p_pocs->layno1 ; ++layno) { 1573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*index = step_r * resno + step_c * compno + step_l * layno;*/ 1574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov packet_array[comp_index] = 1; 1575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov comp_index += step_l; 1576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov res_index += step_c; 1579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index += step_r; 1582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_pocs; 1584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* iterate through all the pocs */ 1586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 1; i < p_nb_pocs ; ++i) { 1587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_last_layno1 = (p_pocs-1)->layno1 ; 1588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov layno0 = (p_pocs->layno1 > l_last_layno1)? l_last_layno1 : 0; 1590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index = step_r * p_pocs->resno0; 1591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* take each resolution for each poc */ 1593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) { 1594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c; 1595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* take each comp of each resolution for each poc */ 1597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) { 1598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 comp_index = res_index + layno0 * step_l; 1599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* and finally take each layer of each res of ... */ 1601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (layno = layno0; layno < p_pocs->layno1 ; ++layno) { 1602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*index = step_r * resno + step_c * compno + step_l * layno;*/ 1603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov packet_array[comp_index] = 1; 1604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov comp_index += step_l; 1605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov res_index += step_c; 1608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index += step_r; 1611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_pocs; 1614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index = 0; 1617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (layno = 0; layno < p_num_layers ; ++layno) { 1618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (resno = 0; resno < p_nb_resolutions; ++resno) { 1619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 0; compno < p_num_comps; ++compno) { 1620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov loss |= (packet_array[index]!=1); 1621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*index = step_r * resno + step_c * compno + step_l * layno;*/ 1622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index += step_c; 1623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (loss) { 1628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager , EVT_ERROR, "Missing packets possible loss of data\n"); 1629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(packet_array); 1632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return !loss; 1634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */ 1637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno) 1639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const OPJ_CHAR *prog = 00; 1641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 1642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 tpnum = 1; 1643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *tcp = 00; 1644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_poc_t * l_current_poc = 00; 1645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 1647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(tileno < (cp->tw * cp->th)); 1648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(pino < (cp->tcps[tileno].numpocs + 1)); 1649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* get the given tile coding parameter */ 1651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp = &cp->tcps[tileno]; 1652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(tcp != 00); 1653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc = &(tcp->pocs[pino]); 1655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(l_current_poc != 0); 1656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* get the progression order as a character string */ 1658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prog = opj_j2k_convert_progression_order(tcp->prg); 1659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(strlen(prog) > 0); 1660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cp->m_specific_param.m_enc.m_tp_on == 1) { 1662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<4;++i) { 1663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (prog[i]) 1664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 1665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* component wise */ 1666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'C': 1667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tpnum *= l_current_poc->compE; 1668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* resolution wise */ 1670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'R': 1671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tpnum *= l_current_poc->resE; 1672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* precinct wise */ 1674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'P': 1675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tpnum *= l_current_poc->prcE; 1676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* layer wise */ 1678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 'L': 1679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tpnum *= l_current_poc->layE; 1680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* whould we split here ? */ 1683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cp->m_specific_param.m_enc.m_tp_flag == prog[i] ) { 1684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->m_specific_param.m_enc.m_tp_pos=i; 1685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 1690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tpnum=1; 1691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return tpnum; 1694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_calculate_tp( opj_j2k_t *p_j2k, 1697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *cp, 1698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_nb_tiles, 1699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *image, 1700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 1701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 1702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 pino,tileno; 1704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles; 1705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *tcp; 1706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 1708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_nb_tiles != 00); 1709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(cp != 00); 1710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(image != 00); 1711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 1712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 1713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_tiles = cp->tw * cp->th; 1715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * p_nb_tiles = 0; 1716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp = cp->tcps; 1717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* INDEX >> */ 1719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* TODO mergeV2: check this part which use cstr_info */ 1720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*if (p_j2k->cstr_info) { 1721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile; 1722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (tileno = 0; tileno < l_nb_tiles; ++tileno) { 1724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 cur_totnum_tp = 0; 1725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_pi_update_encoding_parameters(image,cp,tileno); 1727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (pino = 0; pino <= tcp->numpocs; ++pino) 1729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 1730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno); 1731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_nb_tiles = *p_nb_tiles + tp_num; 1733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cur_totnum_tp += tp_num; 1735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->m_nb_tile_parts = cur_totnum_tp; 1738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t)); 1740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_info_tile_ptr->tp == 00) { 1741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t)); 1745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_info_tile_ptr->num_tps = cur_totnum_tp; 1747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_info_tile_ptr; 1749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++tcp; 1750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else */{ 1753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (tileno = 0; tileno < l_nb_tiles; ++tileno) { 1754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 cur_totnum_tp = 0; 1755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_pi_update_encoding_parameters(image,cp,tileno); 1757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (pino = 0; pino <= tcp->numpocs; ++pino) { 1759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno); 1760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_nb_tiles = *p_nb_tiles + tp_num; 1762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cur_totnum_tp += tp_num; 1764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->m_nb_tile_parts = cur_totnum_tp; 1766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++tcp; 1768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 1772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_soc( opj_j2k_t *p_j2k, 1775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 1777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 2 bytes will be written */ 1779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_start_stream = 00; 1780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 1782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 1783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 1784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 1785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 1787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* write SOC identifier */ 1789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_start_stream,J2K_MS_SOC,2); 1790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_write_data(p_stream,l_start_stream,2,p_manager) != 2) { 1792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* UniPG>> */ 1796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 1797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* update markers struct */ 1798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 1799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2); 1800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert( 0 && "TODO" ); 1802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 1803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* <<UniPG */ 1804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 1806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a SOC marker (Start of Codestream) 1810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 file codec. 1811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream FIXME DOC 1812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_soc( opj_j2k_t *p_j2k, 1815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 1817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 1818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE l_data [2]; 1820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_marker; 1821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 1823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 1824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 1825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 1826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) { 1828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_data,&l_marker,2); 1832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_marker != J2K_MS_SOC) { 1833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Next marker should be a SIZ marker in the main header */ 1837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ; 1838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FIXME move it in a index structure included in p_j2k*/ 1840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2; 1841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_INFO, "Start to read j2k main header (%d).\n", p_j2k->cstr_index->main_head_start); 1843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Add the marker to the codestream index*/ 1845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC, p_j2k->cstr_index->main_head_start, 2)) { 1846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); 1847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 1850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_siz( opj_j2k_t *p_j2k, 1853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 1854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 1855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_size_len; 1858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_ptr; 1859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * l_image = 00; 1860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *cp = 00; 1861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t * l_img_comp = 00; 1862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 1864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 1865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 1866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 1867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 1869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp = &(p_j2k->m_cp); 1870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_size_len = 40 + 3 * l_image->numcomps; 1871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp = l_image->comps; 1872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 1874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len); 1876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 1877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 1878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 1879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 1880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n"); 1881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 1884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len; 1885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 1888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* write SOC identifier */ 1890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr,J2K_MS_SIZ,2); /* SIZ */ 1891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=2; 1892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr,l_size_len-2,2); /* L_SIZ */ 1894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=2; 1895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, cp->rsiz, 2); /* Rsiz (capabilities) */ 1897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=2; 1898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */ 1900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=4; 1901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */ 1903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=4; 1904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */ 1906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=4; 1907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */ 1909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=4; 1910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, cp->tdx, 4); /* XTsiz */ 1912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=4; 1913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, cp->tdy, 4); /* YTsiz */ 1915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=4; 1916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, cp->tx0, 4); /* XT0siz */ 1918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=4; 1919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, cp->ty0, 4); /* YT0siz */ 1921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=4; 1922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, l_image->numcomps, 2); /* Csiz */ 1924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=2; 1925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_image->numcomps; ++i) { 1927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* TODO here with MCT ? */ 1928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7), 1); /* Ssiz_i */ 1929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 1930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, l_img_comp->dx, 1); /* XRsiz_i */ 1932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 1933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr, l_img_comp->dy, 1); /* YRsiz_i */ 1935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 1936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_img_comp; 1938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 1941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 1945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 1948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a SIZ marker (image and tile size) 1949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 file codec. 1950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the SIZ box. 1951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the SIZ marker. 1952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 1953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 1954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k, 1955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 1956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 1957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 1958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 1959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 1961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comp; 1962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comp_remain; 1963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_remaining_size; 1964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles; 1965e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32 l_tmp, l_tx1, l_ty1; 1966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *l_image = 00; 1967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 1968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t * l_img_comp = 00; 1969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_current_tile_param = 00; 1970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 1972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 1973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 1974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 1975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 1977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 1978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* minimum size == 39 - 3 (= minimum component parameter) */ 1980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 36) { 1981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n"); 1982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size = p_header_size - 36; 1986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comp = l_remaining_size / 3; 1987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comp_remain = l_remaining_size % 3; 1988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_comp_remain != 0){ 1989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n"); 1990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 1991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 1993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp ,2); /* Rsiz (capabilities) */ 1994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 1995e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_cp->rsiz = (OPJ_UINT16) l_tmp; 1996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4); /* Xsiz */ 1997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=4; 1998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4); /* Ysiz */ 1999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=4; 2000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4); /* X0siz */ 2001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=4; 2002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4); /* Y0siz */ 2003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=4; 2004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx, 4); /* XTsiz */ 2005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=4; 2006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy, 4); /* YTsiz */ 2007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=4; 2008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0, 4); /* XT0siz */ 2009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=4; 2010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0, 4); /* YT0siz */ 2011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=4; 2012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp, 2); /* Csiz */ 2013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 2014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp < 16385) 2015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->numcomps = (OPJ_UINT16) l_tmp; 2016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 2017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp); 2018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_image->numcomps != l_nb_comp) { 2022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 2023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* testcase 4035.pdf.SIGSEGV.d8b.3375 */ 2027e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* testcase issue427-null-image-size.jp2 */ 2028e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) { 2029e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 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); 2030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */ 2033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(l_cp->tdx * l_cp->tdy)) { 2034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 2035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* testcase 1610.pdf.SIGSEGV.59c.681 */ 2039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (((OPJ_UINT64)l_image->x1) * ((OPJ_UINT64)l_image->y1) != (l_image->x1 * l_image->y1)) { 2040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Prevent buffer overflow (x1: %d, y1: %d)\n", l_image->x1, l_image->y1); 2041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2044e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* testcase issue427-illegal-tile-offset.jp2 */ 2045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */ 2046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */ 2047e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) || (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0) ) { 2048e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: illegal tile offset\n"); 2049e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 2050e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 2051e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 2052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 2053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->correct) { 2054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if JPWL is on, we check whether TX errors have damaged 2055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov too much the SIZ parameters */ 2056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(l_image->x1 * l_image->y1)) { 2057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 2058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: bad image size (%d x %d)\n", 2059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->x1, l_image->y1); 2060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME || JPWL_ASSUME) { 2061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 2062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ? 2067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_image->numcomps != ((len - 38) / 3)) { 2068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, 2069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n", 2070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->numcomps, ((len - 38) / 3)); 2071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME) { 2072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 2073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ /* we try to correct */ 2076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"); 2077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_image->numcomps < ((len - 38) / 3)) { 2078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len = 38 + 3 * l_image->numcomps; 2079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n", 2080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov len); 2081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 2082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->numcomps = ((len - 38) / 3); 2083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n", 2084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->numcomps); 2085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 2088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* update components number in the jpwl_exp_comps filed */ 2090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->exp_comps = l_image->numcomps; 2091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 2093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Allocate the resulting image components */ 2095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps, sizeof(opj_image_comp_t)); 2096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_image->comps == 00){ 2097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->numcomps = 0; 2098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n"); 2099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp = l_image->comps; 2103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read the component information */ 2105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_image->numcomps; ++i){ 2106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 tmp; 2107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&tmp,1); /* Ssiz_i */ 2108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 2109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->prec = (tmp & 0x7f) + 1; 2110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->sgnd = tmp >> 7; 2111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&tmp,1); /* XRsiz_i */ 2112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 2113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */ 2114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&tmp,1); /* YRsiz_i */ 2115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 2116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */ 2117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( l_img_comp->dx < 1 || l_img_comp->dx > 255 || 2118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->dy < 1 || l_img_comp->dy > 255 ) { 2119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 212033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n", 2121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i, l_img_comp->dx, l_img_comp->dy); 2122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 212433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if( l_img_comp->prec > 38) { /* TODO openjpeg won't handle more than ? */ 212533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, 212633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm)\n", 212733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann i, l_img_comp->prec); 212833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann return OPJ_FALSE; 212933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } 2130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 2132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->correct) { 2133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if JPWL is on, we check whether TX errors have damaged 2134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov too much the SIZ parameters, again */ 2135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(l_image->comps[i].dx * l_image->comps[i].dy)) { 2136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, 2137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n", 2138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i, i, l_image->comps[i].dx, l_image->comps[i].dy); 2139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME) { 2140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 2141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* we try to correct */ 2144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"); 2145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_image->comps[i].dx) { 2146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->comps[i].dx = 1; 2147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n", 2148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i, l_image->comps[i].dx); 2149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_image->comps[i].dy) { 2151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image->comps[i].dy = 1; 2152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n", 2153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i, l_image->comps[i].dy); 2154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 2158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->resno_decoded = 0; /* number of resolution decoded */ 2159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->factor = l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */ 2160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_img_comp; 2161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Compute the number of tiles */ 216433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx); 216533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann l_cp->th = opj_uint_ceildiv(l_image->y1 - l_cp->ty0, l_cp->tdy); 2166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check that the number of tiles is valid */ 2168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) { 2169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg( p_manager, EVT_ERROR, 2170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n", 2171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->tw, l_cp->th); 2172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_tiles = l_cp->tw * l_cp->th; 2175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Define the tiles which will be decoded */ 2177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) { 2178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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; 2179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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; 218033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0, l_cp->tdx); 218133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0, l_cp->tdy); 2182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 2184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0; 2185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0; 2186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw; 2187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th; 2188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 2191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->correct) { 2192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if JPWL is on, we check whether TX errors have damaged 2193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov too much the SIZ parameters */ 2194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) || (l_cp->th > l_cp->max_tiles)) { 2195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, 2196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: bad number of tiles (%d x %d)\n", 2197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->tw, l_cp->th); 2198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME) { 2199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 2200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* we try to correct */ 2203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"); 2204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->tw < 1) { 2205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->tw= 1; 2206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n", 2207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->tw); 2208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->tw > l_cp->max_tiles) { 2210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->tw= 1; 2211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- too large x, increase expectance of %d\n" 2212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "- setting %d tiles in x => HYPOTHESIS!!!\n", 2213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->max_tiles, l_cp->tw); 2214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->th < 1) { 2216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->th= 1; 2217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n", 2218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->th); 2219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->th > l_cp->max_tiles) { 2221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->th= 1; 2222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- too large y, increase expectance of %d to continue\n", 2223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "- setting %d tiles in y => HYPOTHESIS!!!\n", 2224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->max_tiles, l_cp->th); 2225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 2229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* memory allocations */ 2231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t)); 2232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->tcps == 00) { 2233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n"); 2234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 2238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->correct) { 2239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_cp->tcps) { 2240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, 2241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: could not alloc tcps field of cp\n"); 2242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME || JPWL_ASSUME) { 2243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 2244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 2249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps = 2251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t)); 2252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps == 00) { 2253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n"); 2254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records = 2258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS ,sizeof(opj_mct_data_t)); 2259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) { 2261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n"); 2262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records = OPJ_J2K_MCT_DEFAULT_NB_RECORDS; 2265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records = 2267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (opj_simple_mcc_decorrelation_data_t*) 2268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS, sizeof(opj_simple_mcc_decorrelation_data_t)); 2269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) { 2271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n"); 2272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records = OPJ_J2K_MCC_DEFAULT_NB_RECORDS; 2275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set up default dc level shift */ 2277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_image->numcomps;++i) { 2278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_image->comps[i].sgnd) { 2279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1 << (l_image->comps[i].prec - 1); 2280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_tile_param = l_cp->tcps; 2284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_nb_tiles; ++i) { 2285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t)); 2286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_current_tile_param->tccps == 00) { 2287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n"); 2288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_tile_param; 2292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MH; /* FIXME J2K_DEC_STATE_MH; */ 2295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_header_update(l_image,l_cp); 2296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_com( opj_j2k_t *p_j2k, 2301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 2302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_comment_size; 2306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_total_com_size; 2307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const OPJ_CHAR *l_comment; 2308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_ptr = 00; 2309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 2313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comment = p_j2k->m_cp.comment; 2316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comment_size = (OPJ_UINT32)strlen(l_comment); 2317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_total_com_size = l_comment_size + 6; 2318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_total_com_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 2320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 2321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 2322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 2323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 2324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 2325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write the COM marker\n"); 2326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 2329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size; 2330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 2333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr,J2K_MS_COM , 2); /* COM */ 2335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=2; 2336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr,l_total_com_size - 2 , 2); /* L_COM */ 2338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=2; 2339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_ptr,1 , 2); /* General use (IS 8859-15:1999 (Latin) values) */ 2341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=2; 2342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy( l_current_ptr,l_comment,l_comment_size); 2344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 2346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 2353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a COM marker (comments) 2354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 file codec. 2355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the COM box. 2356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the COM marker. 2357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 2358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 2359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_com ( opj_j2k_t *p_j2k, 2360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 2361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 2362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 2369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_header_size; 2370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_cod( opj_j2k_t *p_j2k, 2375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 2376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 2377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 2379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 2380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_code_size,l_remaining_size; 2381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 2382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 2387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 2389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number]; 2390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,0); 2391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size = l_code_size; 2392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 2394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size); 2395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 2396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 2397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 2398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 2399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n"); 2400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 2403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size; 2404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 2407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_COD,2); /* COD */ 2409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_code_size-2,2); /* L_COD */ 2412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_tcp->csty,1); /* Scod */ 2415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 2416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_tcp->prg,1); /* SGcod (A) */ 2418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 2419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_tcp->numlayers,2); /* SGcod (B) */ 2421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 2422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_tcp->mct,1); /* SGcod (C) */ 2424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 2425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size -= 9; 2427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) { 2429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n"); 2430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_remaining_size != 0) { 2434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n"); 2435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 2439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 2446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a COD marker (Coding Styke defaults) 2447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the COD box. 2448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 2449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the COD marker. 2450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 2451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 2452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_cod ( opj_j2k_t *p_j2k, 2453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 2454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 2455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* loop */ 2459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 2460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tmp; 2461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 2462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 2463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *l_image = 00; 2464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 2467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 2471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 2472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If we are in the first tile-part header of the current tile */ 2474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? 2475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_cp->tcps[p_j2k->m_current_tile_number] : 2476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 2477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 2478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Only one COD per tile */ 2479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_tcp->cod) { 2480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "COD marker already read. No more than one COD marker per tile.\n"); 2481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 2482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 2483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->cod = 1; 2484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 2485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Make sure room is sufficient */ 2486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 5) { 2487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n"); 2488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tcp->csty,1); /* Scod */ 2492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 2493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Make sure we know how to decode this */ 2494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP | J2K_CP_CSTY_EPH)) != 0U) { 2495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n"); 2496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 2497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 2498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,1); /* SGcod (A) */ 2499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 2500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->prg = (OPJ_PROG_ORDER) l_tmp; 2501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Make sure progression order is valid */ 2502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_tcp->prg > OPJ_CPRL ) { 2503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Unknown progression order in COD marker\n"); 2504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->prg = OPJ_PROG_UNKNOWN; 2505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 2506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tcp->numlayers,2); /* SGcod (B) */ 2507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 2508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 2509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((l_tcp->numlayers < 1U) || (l_tcp->numlayers > 65535U)) { 2510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Invalid number of layers in COD marker : %d not in range [1-65535]\n", l_tcp->numlayers); 2511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 2512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 2513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If user didn't set a number layer to decode take the max specify in the codestream. */ 2515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->m_specific_param.m_dec.m_layer) { 2516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer; 2517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 2519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->num_layers_to_decode = l_tcp->numlayers; 2520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tcp->mct,1); /* SGcod (C) */ 2523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 2524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size -= 5; 2526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_image->numcomps; ++i) { 2527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT; 2528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_SPCod_SPCoc(p_j2k,0,p_header_data,&p_header_size,p_manager)) { 2531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n"); 2532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != 0) { 2536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n"); 2537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Apply the coding style to other components of the current tile or the m_default_tcp*/ 2541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_copy_tile_component_parameters(p_j2k); 2542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Index */ 2544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef WIP_REMOVE_MSD 2545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->cstr_info) { 2546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/ 2547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->prog = l_tcp->prg; 2548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->numlayers = l_tcp->numlayers; 2549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(l_image->numcomps * sizeof(OPJ_UINT32)); 2550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_image->numcomps; ++i) { 2551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1; 2552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 2555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 2560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k, 2561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 2562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 2563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 2564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_coc_size,l_remaining_size; 2566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_comp_room; 2567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 2572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2; 2574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no); 2576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 2578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data; 2579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*p_j2k->m_specific_param.m_encoder.m_header_tile_data 2580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov = (OPJ_BYTE*)opj_realloc( 2581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data, 2582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_coc_size);*/ 2583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size); 2585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 2586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 2587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 2588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 2589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n"); 2590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 2593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size; 2594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 2597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 2599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 2605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 2607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_write_coc_in_memory( opj_j2k_t *p_j2k, 2608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 2609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 2610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 2611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 2615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 2616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_coc_size,l_remaining_size; 2617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 2618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *l_image = 00; 2619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_comp_room; 2620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 2626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number]; 2627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 2628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = (l_image->numcomps <= 256) ? 1 : 2; 2629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no); 2631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size = l_coc_size; 2632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_data; 2634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_COC,2); /* COC */ 2636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_coc_size-2,2); /* L_COC */ 2639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,p_comp_no, l_comp_room); /* Ccoc */ 2642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=l_comp_room; 2643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty, 1); /* Scoc */ 2645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 2646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size -= (5 + l_comp_room); 2648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager); 2649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * p_data_written = l_coc_size; 2650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 2652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k) 2654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i,j; 2656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comp; 2657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles; 2658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_max = 0; 2659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ; 2663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comp = p_j2k->m_private_image->numcomps; 2664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_tiles;++i) { 2666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_nb_comp;++j) { 2667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_max = opj_uint_max(l_max,opj_j2k_get_SPCod_SPCoc_size(p_j2k,i,j)); 2668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 6 + l_max; 2672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 2675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a COC marker (Coding Style Component) 2676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the COC box. 2677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 2678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the COC marker. 2679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 2680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 2681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_coc ( opj_j2k_t *p_j2k, 2682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 2683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 2684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = NULL; 2688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = NULL; 2689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *l_image = NULL; 2690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_comp_room; 2691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_comp_no; 2692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 2695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 2699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ) ? /*FIXME J2K_DEC_STATE_TPH*/ 2700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_cp->tcps[p_j2k->m_current_tile_number] : 2701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 2702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 2703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = l_image->numcomps <= 256 ? 1 : 2; 2705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure room is sufficient*/ 2707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < l_comp_room + 1) { 2708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n"); 2709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size -= l_comp_room + 1; 2712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_comp_no,l_comp_room); /* Ccoc */ 2714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data += l_comp_room; 2715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_comp_no >= l_image->numcomps) { 2716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker (bad number of components)\n"); 2717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tcp->tccps[l_comp_no].csty,1); /* Scoc */ 2721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data ; 2722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_SPCod_SPCoc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) { 2724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n"); 2725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != 0) { 2729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n"); 2730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_qcd( opj_j2k_t *p_j2k, 2736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 2737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_qcd_size,l_remaining_size; 2741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 2742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 2747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,0); 2749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size = l_qcd_size; 2750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 2752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size); 2753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 2754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 2755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 2756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 2757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n"); 2758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 2761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size; 2762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 2765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_QCD,2); /* QCD */ 2767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_qcd_size-2,2); /* L_QCD */ 2770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size -= 4; 2773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) { 2775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n"); 2776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_remaining_size != 0) { 2780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n"); 2781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 2785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 2792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a QCD marker (Quantization defaults) 2793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the QCD box. 2794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 2795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the QCD marker. 2796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 2797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 2798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_qcd ( opj_j2k_t *p_j2k, 2799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 2800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 2801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 2806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_SQcd_SQcc(p_j2k,0,p_header_data,&p_header_size,p_manager)) { 2810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n"); 2811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != 0) { 2815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n"); 2816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */ 2820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_copy_tile_quantization_parameters(p_j2k); 2821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 2826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_qcc( opj_j2k_t *p_j2k, 2827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 2828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 2829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_qcc_size,l_remaining_size; 2833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 2838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no); 2840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0:1; 2841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size = l_qcc_size; 2842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 2844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size); 2845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 2846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 2847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 2848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 2849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n"); 2850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 2853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size; 2854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 2857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 2859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 2863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 2865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 2867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_write_qcc_in_memory( opj_j2k_t *p_j2k, 2868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 2869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 2870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 2871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_qcc_size,l_remaining_size; 2875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 2876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no); 2882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size = l_qcc_size; 2883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_data; 2885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_QCC,2); /* QCC */ 2887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_private_image->numcomps <= 256) { 2890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --l_qcc_size; 2891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_qcc_size-2,2); /* L_QCC */ 2893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data, p_comp_no, 1); /* Cqcc */ 2896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 2897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */ 2899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size -= 6; 2900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 2902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_qcc_size-2,2); /* L_QCC */ 2903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 2904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data, p_comp_no, 2); /* Cqcc */ 2906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 2907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_size -= 6; 2909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,p_comp_no,l_current_data,&l_remaining_size,p_manager); 2912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_data_written = l_qcc_size; 2914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 2916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k) 2918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return opj_j2k_get_max_coc_size(p_j2k); 2920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 2921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 2923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a QCC marker (Quantization component) 2924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the QCC box. 2925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 2926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the QCC marker. 2927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 2928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 2929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_qcc( opj_j2k_t *p_j2k, 2930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 2931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 2932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 2933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 2934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 2935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_num_comp,l_comp_no; 2936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 2938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 2939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 2940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 2941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_comp = p_j2k->m_private_image->numcomps; 2943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_num_comp <= 256) { 2945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 1) { 2946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n"); 2947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_comp_no,1); 2950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 2951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --p_header_size; 2952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 2954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 2) { 2955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n"); 2956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_comp_no,2); 2959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 2960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size-=2; 2961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 2964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_cp.correct) { 2965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static OPJ_UINT32 backup_compno = 0; 2967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* compno is negative or larger than the number of components!!! */ 2969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) { 2970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 2971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: bad component number in QCC (%d out of a maximum of %d)\n", 2972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_no, l_num_comp); 2973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME) { 2974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 2975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* we try to correct */ 2978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_no = backup_compno % l_num_comp; 2979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n" 2980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "- setting component number to %d\n", 2981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_no); 2982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* keep your private count of tiles */ 2985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov backup_compno++; 2986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 2987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 2988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_comp_no >= p_j2k->m_private_image->numcomps) { 2990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 2991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Invalid component number: %d, regarding the number of components %d\n", 2992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_no, p_j2k->m_private_image->numcomps); 2993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 2995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_SQcd_SQcc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) { 2997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n"); 2998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 2999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != 0) { 3002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n"); 3003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_poc( opj_j2k_t *p_j2k, 3010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 3011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comp; 3015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_poc; 3016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_poc_size; 3017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_written_size = 0; 3018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 3019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_poc_room; 3020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 3025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]; 3027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comp = p_j2k->m_private_image->numcomps; 3028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_poc = 1 + l_tcp->numpocs; 3029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_comp <= 256) { 3031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_poc_room = 1; 3032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 3034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_poc_room = 2; 3035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc; 3037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 3039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size); 3040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 3041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 3042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 3043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 3044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n"); 3045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 3048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size; 3049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_poc_in_memory(p_j2k,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_written_size,p_manager); 3052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 3054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_write_poc_in_memory( opj_j2k_t *p_j2k, 3061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 3062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 3063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 3067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 3068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comp; 3069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_poc; 3070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_poc_size; 3071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *l_image = 00; 3072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 3073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = 00; 3074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_poc_t *l_current_poc = 00; 3075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_poc_room; 3076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]; 3082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = &l_tcp->tccps[0]; 3083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 3084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comp = l_image->numcomps; 3085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_poc = 1 + l_tcp->numpocs; 3086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_comp <= 256) { 3088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_poc_room = 1; 3089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 3091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_poc_room = 2; 3092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc; 3095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_data; 3097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_POC,2); /* POC */ 3099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 3100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_poc_size-2,2); /* Lpoc */ 3102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 3103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc = l_tcp->pocs; 3105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_nb_poc; ++i) { 3106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_current_poc->resno0,1); /* RSpoc_i */ 3107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 3108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_current_poc->compno0,l_poc_room); /* CSpoc_i */ 3110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=l_poc_room; 3111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_current_poc->layno1,2); /* LYEpoc_i */ 3113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 3114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_current_poc->resno1,1); /* REpoc_i */ 3116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 3117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_current_poc->compno1,l_poc_room); /* CEpoc_i */ 3119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=l_poc_room; 3120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_current_poc->prg,1); /* Ppoc_i */ 3122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 3123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/ 3125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers); 3126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions); 3127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->compno1, (OPJ_INT32)l_nb_comp); 3128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_poc; 3130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_data_written = l_poc_size; 3133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k) 3136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = 00; 3138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles = 0; 3139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_max_poc = 0; 3140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 3141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_cp.tcps; 3143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; 3144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_tiles;++i) { 3146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_max_poc = opj_uint_max(l_max_poc,l_tcp->numpocs); 3147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 3148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_max_poc; 3151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 4 + 9 * l_max_poc; 3153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k) 3156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 3158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles; 3159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_max = 0; 3160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = 00; 3161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_cp.tcps; 3163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ; 3164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_tiles;++i) { 3166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_max = opj_uint_max(l_max,l_tcp->m_nb_tile_parts); 3167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 3169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 12 * l_max; 3172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k) 3175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_bytes = 0; 3177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comps; 3178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_coc_bytes,l_qcc_bytes; 3179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comps = p_j2k->m_private_image->numcomps - 1; 3181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k); 3182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) { 3184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k); 3185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes += l_nb_comps * l_coc_bytes; 3186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k); 3188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes += l_nb_comps * l_qcc_bytes; 3189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k); 3192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*** DEVELOPER CORNER, Add room for your headers ***/ 3194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return l_nb_bytes; 3196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 3199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a POC marker (Progression Order Change) 3200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 3201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the POC box. 3202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 3203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the POC marker. 3204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 3205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 3206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_poc ( opj_j2k_t *p_j2k, 3207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 3208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 3209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i, l_nb_comp, l_tmp; 3213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * l_image = 00; 3214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining; 3215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_chunk_size, l_comp_room; 3216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 3218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 3219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_poc_t *l_current_poc = 00; 3220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 3223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 3227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comp = l_image->numcomps; 3228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_comp <= 256) { 3229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = 1; 3230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 3232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = 2; 3233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_chunk_size = 5 + 2 * l_comp_room; 3235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc_nb = p_header_size / l_chunk_size; 3236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc_remaining = p_header_size % l_chunk_size; 3237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) { 3239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n"); 3240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 3244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? 3245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_cp->tcps[p_j2k->m_current_tile_number] : 3246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 3247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0; 3248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc_nb += l_old_poc_nb; 3249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(l_current_poc_nb >= 32) 3251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb); 3253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(l_current_poc_nb < 32); 3256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now poc is in use.*/ 3258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->POC = 1; 3259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc = &l_tcp->pocs[l_old_poc_nb]; 3261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = l_old_poc_nb; i < l_current_poc_nb; ++i) { 3262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&(l_current_poc->resno0),1); /* RSpoc_i */ 3263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&(l_current_poc->compno0),l_comp_room); /* CSpoc_i */ 3265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=l_comp_room; 3266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&(l_current_poc->layno1),2); /* LYEpoc_i */ 3267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure layer end is in acceptable bounds */ 3268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers); 3269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 3270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&(l_current_poc->resno1),1); /* REpoc_i */ 3271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&(l_current_poc->compno1),l_comp_room); /* CEpoc_i */ 3273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=l_comp_room; 3274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,1); /* Ppoc_i */ 3275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp; 3277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure comp is in acceptable bounds */ 3278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp); 3279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_poc; 3280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->numpocs = l_current_poc_nb - 1; 3283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 3287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a CRG marker (Component registration) 3288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 3289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the TLM box. 3290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 3291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the TLM marker. 3292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 3293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 3294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_crg ( opj_j2k_t *p_j2k, 3295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 3296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 3297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comp; 3301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 3303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comp = p_j2k->m_private_image->numcomps; 3307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != l_nb_comp *4) { 3309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n"); 3310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Do not care of this at the moment since only local variables are set here */ 3313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 3314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for 3315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (i = 0; i < l_nb_comp; ++i) 3316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Xcrg_i,2); // Xcrg_i 3318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 3319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Ycrg_i,2); // Xcrg_i 3320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 3321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 3323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 3327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a TLM marker (Tile Length Marker) 3328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 3329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the TLM box. 3330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 3331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the TLM marker. 3332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 3333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 3334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_tlm ( opj_j2k_t *p_j2k, 3335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 3336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 3337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient, l_Ptlm_size; 3341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 3343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 2) { 3347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n"); 3348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size -= 2; 3351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Ztlm,1); /* Ztlm */ 3353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Stlm,1); /* Stlm */ 3355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_ST = ((l_Stlm >> 4) & 0x3); 3358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_SP = (l_Stlm >> 6) & 0x1; 3359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_Ptlm_size = (l_SP + 1) * 2; 3361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_quotient = l_Ptlm_size + l_ST; 3362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tot_num_tp_remaining = p_header_size % l_quotient; 3364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tot_num_tp_remaining != 0) { 3366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n"); 3367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FIXME Do not care of this at the moment since only local variables are set here */ 3370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 3371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for 3372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (i = 0; i < l_tot_num_tp; ++i) 3373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST); // Ttlm_i 3375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data += l_ST; 3376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size); // Ptlm_i 3377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data += l_Ptlm_size; 3378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }*/ 3379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 3383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a PLM marker (Packet length, main header marker) 3384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 3385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the TLM box. 3386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 3387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the TLM marker. 3388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 3389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 3390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_plm ( opj_j2k_t *p_j2k, 3391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 3392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 3393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 3398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 1) { 3402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n"); 3403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Do not care of this at the moment since only local variables are set here */ 3406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 3407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Zplm,1); // Zplm 3408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --p_header_size; 3410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while 3412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (p_header_size > 0) 3413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Nplm,1); // Nplm 3415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size -= (1+l_Nplm); 3417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if 3418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (p_header_size < 0) 3419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n"); 3421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 3422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for 3424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (i = 0; i < l_Nplm; ++i) 3425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,1); // Iplm_ij 3427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // take only the last seven bytes 3429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_packet_len |= (l_tmp & 0x7f); 3430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if 3431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (l_tmp & 0x80) 3432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_packet_len <<= 7; 3434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 3436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // store packet length and proceed to next packet 3438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_packet_len = 0; 3439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if 3442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (l_packet_len != 0) 3443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 3444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n"); 3445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 3446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 3449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 3453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a PLT marker (Packet length, tile-part header) 3454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 3455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the PLT box. 3456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 3457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the PLT marker. 3458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 3459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 3460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_plt ( opj_j2k_t *p_j2k, 3461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 3462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 3463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i; 3467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 3470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 1) { 3474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n"); 3475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_Zplt,1); /* Zplt */ 3479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --p_header_size; 3481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < p_header_size; ++i) { 3483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,1); /* Iplt_ij */ 3484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 3485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* take only the last seven bytes */ 3486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_packet_len |= (l_tmp & 0x7f); 3487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp & 0x80) { 3488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_packet_len <<= 7; 3489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 3491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* store packet length and proceed to next packet */ 3492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_packet_len = 0; 3493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_packet_len != 0) { 3497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n"); 3498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/** 3505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Reads a PPM marker (Packed packet headers, main header) 3506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 3507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_header_data the data contained in the POC box. 3508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_j2k the jpeg2000 codec. 3509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_header_size the size of the data contained in the POC marker. 3510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_manager the user event manager. 3511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 3512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_ppm ( 3514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_j2k_t *p_j2k, 3515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_BYTE * p_header_data, 3516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 p_header_size, 3517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_mgr_t * p_manager ) 3518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 3519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_cp_t *l_cp = 00; 3520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_Z_ppm; 3521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* preconditions */ 3523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_header_data != 00); 3524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_j2k != 00); 3525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 3526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */ 3528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_header_size < 2) { 3529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n"); 3530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp = &(p_j2k->m_cp); 3534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp->ppm = 1; 3535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(p_header_data,&l_Z_ppm,1); /* Z_ppm */ 3537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++p_header_data; 3538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann --p_header_size; 3539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* check allocation needed */ 3541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_cp->ppm_markers == NULL) { /* first PPM marker */ 3542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */ 3543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(l_cp->ppm_markers_count == 0U); 3544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx)); 3546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_cp->ppm_markers == NULL) { 3547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n"); 3548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp->ppm_markers_count = l_newCount; 3551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (l_cp->ppm_markers_count <= l_Z_ppm) { 3552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */ 3553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_ppx *new_ppm_markers; 3554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers, l_newCount * sizeof(opj_ppx)); 3555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (new_ppm_markers == NULL) { 3556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_cp destruction */ 3557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n"); 3558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp->ppm_markers = new_ppm_markers; 3561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0, (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx)); 3562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp->ppm_markers_count = l_newCount; 3563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) { 3566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_cp destruction */ 3567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm); 3568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp->ppm_markers[l_Z_ppm].m_data = opj_malloc(p_header_size); 3572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_cp->ppm_markers[l_Z_ppm].m_data == NULL) { 3573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_cp destruction */ 3574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n"); 3575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size; 3578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size); 3579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 3581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/** 3584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Merges all PPM markers read (Packed headers, main header) 3585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 3586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_cp main coding parameters. 3587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_manager the user event manager. 3588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 3589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_merge_ppm ( opj_cp_t *p_cp, opj_event_mgr_t * p_manager ) 3590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining; 3592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* preconditions */ 3594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_cp != 00); 3595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 3596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_cp->ppm_buffer == NULL); 3597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_cp->ppm == 0U) { 3599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 3600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppm_data_size = 0U; 3603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_N_ppm_remaining = 0U; 3604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0U; i < p_cp->ppm_markers_count; ++i) { 3605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_cp->ppm_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppm */ 3606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_N_ppm; 3607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size; 3608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data; 3609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_N_ppm_remaining >= l_data_size) { 3611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_N_ppm_remaining -= l_data_size; 3612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size = 0U; 3613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 3614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data += l_N_ppm_remaining; 3615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size -= l_N_ppm_remaining; 3616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_N_ppm_remaining = 0U; 3617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_data_size > 0U) { 3620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann do 3621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 3622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* read Nppm */ 3623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_data_size < 4U) { 3624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_cp destruction */ 3625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n"); 3626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(l_data, &l_N_ppm, 4); 3629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data+=4; 3630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size-=4; 3631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 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 */ 3632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_data_size >= l_N_ppm) { 3634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size -= l_N_ppm; 3635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data += l_N_ppm; 3636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 3637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_N_ppm_remaining = l_N_ppm - l_data_size; 3638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size = 0U; 3639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } while (l_data_size > 0U); 3641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_N_ppm_remaining != 0U) { 3646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_cp destruction */ 3647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n"); 3648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size); 3652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_cp->ppm_buffer == 00) { 3653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n"); 3654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_len = l_ppm_data_size; 3657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppm_data_size = 0U; 3658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_N_ppm_remaining = 0U; 3659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0U; i < p_cp->ppm_markers_count; ++i) { 3660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_cp->ppm_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppm */ 3661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_N_ppm; 3662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size; 3663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data; 3664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_N_ppm_remaining >= l_data_size) { 3666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size); 3667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppm_data_size += l_data_size; 3668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_N_ppm_remaining -= l_data_size; 3669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size = 0U; 3670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 3671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining); 3672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppm_data_size += l_N_ppm_remaining; 3673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data += l_N_ppm_remaining; 3674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size -= l_N_ppm_remaining; 3675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_N_ppm_remaining = 0U; 3676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_data_size > 0U) { 3679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann do 3680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 3681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* read Nppm */ 3682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_data_size < 4U) { 3683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_cp destruction */ 3684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n"); 3685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(l_data, &l_N_ppm, 4); 3688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data+=4; 3689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size-=4; 3690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_data_size >= l_N_ppm) { 3692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm); 3693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppm_data_size += l_N_ppm; 3694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size -= l_N_ppm; 3695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data += l_N_ppm; 3696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 3697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size); 3698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppm_data_size += l_data_size; 3699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_N_ppm_remaining = l_N_ppm - l_data_size; 3700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_data_size = 0U; 3701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } while (l_data_size > 0U); 3703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_cp->ppm_markers[i].m_data); 3705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_markers[i].m_data = NULL; 3706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_markers[i].m_data_size = 0U; 3707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_data = p_cp->ppm_buffer; 3711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_data_size = p_cp->ppm_len; 3712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_markers_count = 0U; 3714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_cp->ppm_markers); 3715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_markers = NULL; 3716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 3718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 3721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a PPT marker (Packed packet headers, tile-part header) 3722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 3723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the PPT box. 3724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 3725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the PPT marker. 3726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 3727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 3728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_ppt ( opj_j2k_t *p_j2k, 3729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 3730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 3731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_cp_t *l_cp = 00; 3735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_tcp_t *l_tcp = 00; 3736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_Z_ppt; 3737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* preconditions */ 3739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_header_data != 00); 3740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_j2k != 00); 3741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 3742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* We need to have the Z_ppt element + 1 byte of Ippt at minimum */ 3744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_header_size < 2) { 3745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n"); 3746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_cp = &(p_j2k->m_cp); 3750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_cp->ppm){ 3751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n"); 3752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]); 3756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tcp->ppt = 1; 3757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(p_header_data,&l_Z_ppt,1); /* Z_ppt */ 3759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++p_header_data; 3760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann --p_header_size; 3761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* check allocation needed */ 3763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_tcp->ppt_markers == NULL) { /* first PPT marker */ 3764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */ 3765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(l_tcp->ppt_markers_count == 0U); 3766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx)); 3768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_tcp->ppt_markers == NULL) { 3769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); 3770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tcp->ppt_markers_count = l_newCount; 3773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (l_tcp->ppt_markers_count <= l_Z_ppt) { 3774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */ 3775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_ppx *new_ppt_markers; 3776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers, l_newCount * sizeof(opj_ppx)); 3777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (new_ppt_markers == NULL) { 3778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_tcp destruction */ 3779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); 3780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tcp->ppt_markers = new_ppt_markers; 3783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0, (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx)); 3784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tcp->ppt_markers_count = l_newCount; 3785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) { 3788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_tcp destruction */ 3789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt); 3790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tcp->ppt_markers[l_Z_ppt].m_data = opj_malloc(p_header_size); 3794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_tcp->ppt_markers[l_Z_ppt].m_data == NULL) { 3795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* clean up to be done on l_tcp destruction */ 3796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); 3797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size; 3800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size); 3801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 3802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 3803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/** 3805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Merges all PPT markers read (Packed packet headers, tile-part header) 3806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 3807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_tcp the tile. 3808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * @param p_manager the user event manager. 3809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 3810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp, opj_event_mgr_t * p_manager) 3811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 3812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 i, l_ppt_data_size; 3813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* preconditions */ 3814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_tcp != 00); 3815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 3816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_tcp->ppt_buffer == NULL); 3817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->ppt == 0U) { 3819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 3820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppt_data_size = 0U; 3823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0U; i < p_tcp->ppt_markers_count; ++i) { 3824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppt_data_size += p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */ 3825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size); 3828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->ppt_buffer == 00) { 3829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); 3830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_len = l_ppt_data_size; 3833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppt_data_size = 0U; 3834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0U; i < p_tcp->ppt_markers_count; ++i) { 3835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->ppt_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppt */ 3836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data, p_tcp->ppt_markers[i].m_data_size); 3837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_ppt_data_size += p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */ 3838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->ppt_markers[i].m_data); 3840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_markers[i].m_data = NULL; 3841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_markers[i].m_data_size = 0U; 3842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_markers_count = 0U; 3846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->ppt_markers); 3847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_markers = NULL; 3848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_data = p_tcp->ppt_buffer; 3850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_data_size = p_tcp->ppt_len; 3851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 3852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_tlm( opj_j2k_t *p_j2k, 3855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 3856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 3860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tlm_size; 3861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 3866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tlm_size = 6 + (5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts); 3868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 3870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size); 3871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 3872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 3873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 3874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 3875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n"); 3876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 3879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size; 3880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 3883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* change the way data is written to avoid seeking if possible */ 3885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* TODO */ 3886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream); 3887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_TLM,2); /* TLM */ 3889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 3890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_tlm_size-2,2); /* Lpoc */ 3892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 3893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,0,1); /* Ztlm=0*/ 3895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 3896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,0x50,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */ 3898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 3899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */ 3901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 3902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 3903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 3904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_sot( opj_j2k_t *p_j2k, 3909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 3910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 3911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_stream_private_t *p_stream, 3912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 3913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 3914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 3919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,J2K_MS_SOT,2); /* SOT */ 3921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += 2; 3922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,10,2); /* Lsot */ 3924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += 2; 3925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data, p_j2k->m_current_tile_number,2); /* Isot */ 3927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += 2; 3928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Psot */ 3930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += 4; 3931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data, p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,1); /* TPsot */ 3933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 3934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data, p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,1); /* TNsot */ 3936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 3937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* UniPG>> */ 3939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 3940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* update markers struct */ 3941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 3942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2); 3943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 3944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert( 0 && "TODO" ); 3945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 3946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * p_data_written = 12; 3948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 3950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 3951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE * p_header_data, 3953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 p_header_size, 3954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32* p_tile_no, 3955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32* p_tot_len, 3956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32* p_current_part, 3957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32* p_num_parts, 3958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_mgr_t * p_manager ) 3959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 3960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* preconditions */ 3961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_header_data != 00); 3962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 3963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* Size of this marker is fixed = 12 (we have already read marker and its size)*/ 3965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_header_size != 8) { 3966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n"); 3967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 3968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(p_header_data,p_tile_no,2); /* Isot */ 3971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_header_data+=2; 3972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(p_header_data,p_tot_len,4); /* Psot */ 3973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_header_data+=4; 3974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(p_header_data,p_current_part,1); /* TPsot */ 3975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++p_header_data; 3976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(p_header_data,p_num_parts ,1); /* TNsot */ 3977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++p_header_data; 3978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 3979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 3980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, 3982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 3983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 3984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 3985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 3986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 3987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 3988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tot_len, l_num_parts = 0; 3989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_part; 3990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tile_x,l_tile_y; 3991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 3993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 3995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 3996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 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)) { 3998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n"); 3999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 4003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* testcase 2.pdf.SIGFPE.706.1112 */ 4005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) { 4006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n", p_j2k->m_current_tile_number); 4007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number]; 4011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_x = p_j2k->m_current_tile_number % l_cp->tw; 4012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_y = p_j2k->m_current_tile_number / l_cp->tw; 4013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 4015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->correct) { 4016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 tileno = p_j2k->m_current_tile_number; 4018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static OPJ_UINT32 backup_tileno = 0; 4019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* tileno is negative or larger than the number of tiles!!! */ 4021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (tileno > (l_cp->tw * l_cp->th)) { 4022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 4023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: bad tile number (%d out of a maximum of %d)\n", 4024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tileno, (l_cp->tw * l_cp->th)); 4025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME) { 4026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 4027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* we try to correct */ 4030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tileno = backup_tileno; 4031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n" 4032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "- setting tile number to %d\n", 4033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tileno); 4034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* keep your private count of tiles */ 4037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov backup_tileno++; 4038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 4039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 4040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* look for the tile in the list of already processed tile (in parts). */ 4042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Optimization possible here with a more complex data structure and with the removing of tiles */ 4043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* since the time taken by this function can only grow at the time */ 4044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* PSot should be equal to zero or >=14 or <= 2^32-1 */ 4046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((l_tot_len !=0 ) && (l_tot_len < 14) ) 4047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 4048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tot_len == 12 ) /* MSD: Special case for the PHR data which are read by kakadu*/ 4049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 4050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n", l_tot_len); 4051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 4053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 4054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len); 4055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 4060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->correct) { 4061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* totlen is negative or larger than the bytes left!!! */ 4063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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))) { */ 4064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 4065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: bad tile byte size (%d bytes against %d bytes left)\n", 4066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tot_len, p_header_size ); /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */ 4067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME) { 4068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 4069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* we try to correct */ 4072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tot_len = 0; 4073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n" 4074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "- setting Psot to %d => assuming it is the last tile\n", 4075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tot_len); 4076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 4078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 4079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/ 4081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_tot_len) { 4082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_INFO, "Psot value of the current tile-part is equal to zero, " 4083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "we assuming it is the last tile-part of the codestream.\n"); 4084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1; 4085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_num_parts != 0) { /* Number of tile-part header is provided by this tile-part header */ 4088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_num_parts += p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction; 4089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of 4090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */ 4091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->m_nb_tile_parts) { 4092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_current_part >= l_tcp->m_nb_tile_parts){ 4093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current " 4094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "number of tile-part (%d), giving up\n", l_current_part, l_tcp->m_nb_tile_parts ); 4095e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1; 4096e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 4097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( l_current_part >= l_num_parts ) { 4100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* testcase 451.pdf.SIGSEGV.ce9.3723 */ 4101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current " 4102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts ); 4103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1; 4104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_nb_tile_parts = l_num_parts; 4107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If know the number of tile part header we will check if we didn't read the last*/ 4110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->m_nb_tile_parts) { 4111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->m_nb_tile_parts == (l_current_part+1)) { 4112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov p_j2k->m_specific_param.m_decoder.m_can_decode = 1; /* Process the last tile-part header*/ 4113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part){ 4117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Keep the size of data to skip after this marker */ 4118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len - 12; /* SOT_marker_size = 12 */ 4119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FIXME: need to be computed from the number of bytes remaining in the codestream */ 4122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_sot_length = 0; 4123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH; 4126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/ 4128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) { 4129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_skip_data = 4130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x) 4131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x) 4132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y) 4133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y); 4134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert( p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0 ); 4137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_skip_data = 4138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (p_j2k->m_current_tile_number != (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec); 4139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Index */ 4142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->cstr_index) 4143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 4144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k->cstr_index->tile_index != 00); 4145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number; 4146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno = l_current_part; 4147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_num_parts != 0){ 4149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps = l_num_parts; 4150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_num_parts; 4151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) { 4153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = 4154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t)); 4155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) { 4156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n"); 4157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 4158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 4159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc( 4162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index, l_num_parts* sizeof(opj_tp_index_t)); 4163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_tp_index) { 4164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index); 4165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL; 4166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n"); 4167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index; 4170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else{ 4173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ { 4174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) { 4176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10; 4177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = 4178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (opj_tp_index_t*)opj_calloc( p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps, 4179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof(opj_tp_index_t)); 4180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) { 4181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0; 4182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n"); 4183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 4184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 4185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( l_current_part >= p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps ){ 4188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tp_index_t *new_tp_index; 4189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_current_part + 1; 4190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_tp_index = (opj_tp_index_t *) opj_realloc( 4191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index, 4192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps * sizeof(opj_tp_index_t)); 4193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_tp_index) { 4194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index); 4195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL; 4196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0; 4197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n"); 4198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index; 4201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 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 */ 4209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if (p_j2k->cstr_info) { 4210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->first) { 4211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (tileno == 0) { 4212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13; 4213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].tileno = tileno; 4216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12; 4217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1; 4218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].num_tps = numparts; 4219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (numparts) { 4221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t)); 4222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10) 4225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].end_pos += totlen; 4229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12; 4232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos = 4233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1; 4234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }*/ 4235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_sod( opj_j2k_t *p_j2k, 4239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_t * p_tile_coder, 4240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 4241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 4242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_total_data_size, 4243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_stream_private_t *p_stream, 4244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 4245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 4246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_codestream_info_t *l_cstr_info = 00; 4248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_remaining_data; 4249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,J2K_MS_SOD,2); /* SOD */ 4256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += 2; 4257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make room for the EOF marker */ 4259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining_data = p_total_data_size - 4; 4260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* update tile coder */ 4262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tile_coder->tp_num = p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ; 4263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tile_coder->cur_tp_num = p_j2k->m_specific_param.m_encoder.m_current_tile_part_number; 4264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* INDEX >> */ 4266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* TODO mergeV2: check this part which use cstr_info */ 4267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_info = p_j2k->cstr_info; 4268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cstr_info) { 4269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) { 4270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1; 4271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number; 4272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else {*/ 4274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 4275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TODO 4276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if 4277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream)) 4278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 4279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream); 4280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }*/ 4281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*}*/ 4282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* UniPG>> */ 4283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 4284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* update markers struct */ 4285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2); 4286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 4287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert( 0 && "TODO" ); 4288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 4289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <<UniPG */ 4290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*}*/ 4291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* << INDEX */ 4292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) { 4294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tile_coder->tcd_image->tiles->packno = 0; 4295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cstr_info) { 4296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->packno = 0; 4297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_data_written = 0; 4301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)) { 4303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n"); 4304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_data_written += 2; 4308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k, 4313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 4314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 4315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 4316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_SIZE_T l_current_read_size; 4318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_codestream_index_t * l_cstr_index = 00; 4319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE ** l_current_data = 00; 4320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = 00; 4321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * l_tile_len = 00; 4322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE; 4323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]); 4330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) { 4332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* opj_stream_get_number_byte_left returns OPJ_OFF_T 4333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // but we are in the last tile part, 4334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // so its result will fit on OPJ_UINT32 unless we find 4335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // a file with a single tile part of more than 4 GB...*/ 4336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(opj_stream_get_number_byte_left(p_stream) - 2); 4337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check to avoid pass the limit of OPJ_UINT32 */ 4340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2 ) 4341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_sot_length -= 2; 4342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* MSD: case commented to support empty SOT marker (PHR data) */ 4344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = &(l_tcp->m_data); 4348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_len = &l_tcp->m_data_size; 4349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Patch to support new PHR data */ 4351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_sot_length) { 4352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* If we are here, we'll try to read the data after allocation */ 4353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Check enough bytes left in stream before allocation */ 4354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length > opj_stream_get_number_byte_left(p_stream)) { 4355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Tile part length size inconsistent with stream length\n"); 4356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 4357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 4358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! *l_current_data) { 4359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* LH: oddly enough, in this path, l_tile_len!=0. 4360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * TODO: If this was consistent, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...). 4361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 4362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_current_data = (OPJ_BYTE*) opj_malloc(p_j2k->m_specific_param.m_decoder.m_sot_length); 4363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 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); 4366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_new_current_data) { 4367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(*l_current_data); 4368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*nothing more is done as l_current_data will be set to null, and just 4369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov afterward we enter in the error path 4370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov and the actual tile_len is updated (committed) at the end of the 4371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov function. */ 4372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_current_data = l_new_current_data; 4374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_current_data == 00) { 4377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n"); 4378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_sot_length_pb_detected = OPJ_TRUE; 4383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Index */ 4386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index = p_j2k->cstr_index; 4387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cstr_index) { 4388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2; 4389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_tile_part = l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno; 4391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header = 4392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_pos; 4393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos = 4394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2; 4395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number, 4397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index, 4398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov J2K_MS_SOD, 4399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_pos, 4400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) { 4401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); 4402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_index->packno = 0;*/ 4406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Patch to support new PHR data */ 4409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_sot_length_pb_detected) { 4410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_read_size = opj_stream_read_data( 4411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_stream, 4412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_current_data + *l_tile_len, 4413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_sot_length, 4414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_manager); 4415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 4417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 4418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_read_size = 0; 4419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) { 4422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC; 4423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT; 4426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_tile_len += (OPJ_UINT32)l_current_read_size; 4429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k, 4434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 4435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 4436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 nb_comps, 4437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 4438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 4439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 4440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 4442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_rgn_size; 4443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 4444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 4445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = 00; 4446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_comp_room; 4447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 4454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &l_cp->tcps[p_tile_no]; 4455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = &l_tcp->tccps[p_comp_no]; 4456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nb_comps <= 256) { 4458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = 1; 4459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = 2; 4462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_rgn_size = 6 + l_comp_room; 4465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 4467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_RGN,2); /* RGN */ 4469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 4470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_rgn_size-2,2); /* Lrgn */ 4472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 4473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,p_comp_no,l_comp_room); /* Crgn */ 4475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=l_comp_room; 4476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data, 0,1); /* Srgn */ 4478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 4479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,1); /* SPrgn */ 4481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 4482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 4484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_eoc( opj_j2k_t *p_j2k, 4491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 4492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 4493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 4494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,J2K_MS_EOC,2); /* EOC */ 4501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* UniPG>> */ 4503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 4504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* update markers struct */ 4505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 4506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2); 4507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 4508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 4509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,2,p_manager) != 2) { 4511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ! opj_stream_flush(p_stream,p_manager) ) { 4515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 4522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a RGN marker (Region Of Interest) 4523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 4524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the POC box. 4525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 4526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the POC marker. 4527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 4528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 4529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k, 4530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 4531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 4532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 4533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 4534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comp; 4536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * l_image = 00; 4537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 4539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 4540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty; 4541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 4543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 4544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 4548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comp = l_image->numcomps; 4549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_comp <= 256) { 4551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = 1; } 4552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room = 2; } 4554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != 2 + l_comp_room) { 4556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n"); 4557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 4561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? 4562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_cp->tcps[p_j2k->m_current_tile_number] : 4563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 4564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_comp_no,l_comp_room); /* Crgn */ 4566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=l_comp_room; 4567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_roi_sty,1); /* Srgn */ 4568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 4569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 4571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->correct) { 4572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* totlen is negative or larger than the bytes left!!! */ 4573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_comp_room >= l_nb_comp) { 4574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 4575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: bad component number in RGN (%d when there are only %d)\n", 4576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_room, l_nb_comp); 4577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME || JPWL_ASSUME) { 4578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 4579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 4583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 4584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* testcase 3635.pdf.asan.77.2930 */ 4586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_comp_no >= l_nb_comp) { 4587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 4588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "bad component number in RGN (%d when there are only %d)\n", 4589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_no, l_nb_comp); 4590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&(l_tcp->tccps[l_comp_no].roishift)),1); /* SPrgn */ 4594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 4595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp) 4601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (OPJ_FLOAT32) ((p_tcp->m_nb_tile_parts - 1) * 14); 4603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp) 4606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_tcp; 4608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 4609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_update_rates( opj_j2k_t *p_j2k, 4612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 4613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 4614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t * l_cp = 00; 4616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * l_image = 00; 4617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = 00; 4618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t * l_img_comp = 00; 4619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i,j,k; 4621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 l_x0,l_y0,l_x1,l_y1; 4622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_rates = 0; 4623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 l_sot_remove; 4624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_bits_empty, l_size_pixel; 4625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tile_size = 0; 4626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_last_res; 4627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 (* l_tp_stride_func)(opj_tcp_t *) = 00; 4628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 4635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 4636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = l_cp->tcps; 4637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy; 4639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_size_pixel = l_image->numcomps * l_image->comps->prec; 4640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(l_cp->th * l_cp->tw); 4641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->m_specific_param.m_enc.m_tp_on) { 4643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tp_stride_func = opj_j2k_get_tp_stride; 4644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 4646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tp_stride_func = opj_j2k_get_default_stride; 4647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_cp->th;++i) { 4650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_cp->tw;++j) { 4651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) / (OPJ_FLOAT32)l_tcp->numlayers; 4652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 4 borders of the tile rescale on the image if necessary */ 4654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx), (OPJ_INT32)l_image->x0); 4655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy), (OPJ_INT32)l_image->y0); 4656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1); 4657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1); 4658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_rates = l_tcp->rates; 4660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Modification of the RATE >> */ 4662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_rates) { 4663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_rates = (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0))) 4664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov / 4665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((*l_rates) * (OPJ_FLOAT32)l_bits_empty) 4666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 4667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov - 4668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset; 4669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_rates; 4672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k = 1; k < l_tcp->numlayers; ++k) { 4674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_rates) { 4675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_rates = (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0))) 4676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov / 4677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((*l_rates) * (OPJ_FLOAT32)l_bits_empty) 4678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 4679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov - 4680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset; 4681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_rates; 4684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 4687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = l_cp->tcps; 4692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_cp->th;++i) { 4694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_cp->tw;++j) { 4695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_rates = l_tcp->rates; 4696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_rates) { 4698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_rates -= l_sot_remove; 4699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_rates < 30) { 4701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_rates = 30; 4702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_rates; 4706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_last_res = l_tcp->numlayers - 1; 4708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k = 1; k < l_last_res; ++k) { 4710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_rates) { 4712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_rates -= l_sot_remove; 4713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_rates < *(l_rates - 1) + 10) { 4715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_rates = (*(l_rates - 1)) + 20; 4716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_rates; 4720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_rates) { 4723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_rates -= (l_sot_remove + 2.f); 4724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*l_rates < *(l_rates - 1) + 10) { 4726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *l_rates = (*(l_rates - 1)) + 20; 4727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 4731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp = l_image->comps; 4735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_size = 0; 4736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_image->numcomps;++i) { 4738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_size += ( opj_uint_ceildiv(l_cp->tdx,l_img_comp->dx) 4739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 4740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_uint_ceildiv(l_cp->tdy,l_img_comp->dy) 4741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 4742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->prec 4743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ); 4744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_img_comp; 4746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_size = (OPJ_UINT32) (l_tile_size * 0.1625); /* 1.3/8 = 0.1625 */ 4749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k); 4751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size; 4753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 4754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size); 4755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) { 4756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (OPJ_IS_CINEMA(l_cp->rsiz)) { 4760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 4761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (OPJ_BYTE *) opj_malloc(5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts); 4762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) { 4763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 4767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer; 4768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 4774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_eoc ( opj_j2k_t *p_j2k, 4775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 4776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 4777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 4779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_t * l_tcd = 00; 4780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles; 4781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = 00; 4782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL l_success; 4783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; 4790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_cp.tcps; 4791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcd = opj_tcd_create(OPJ_TRUE); 4793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcd == 00) { 4794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n"); 4795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_nb_tiles; ++i) { 4799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->m_data) { 4800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_tcd_init_decode_tile(l_tcd, i)) { 4801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_destroy(l_tcd); 4802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n"); 4803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i, p_j2k->cstr_index); 4807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cleanup */ 4808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_success) { 4810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR; 4811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 4812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_tcp_destroy(l_tcp); 4816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 4817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_destroy(l_tcd); 4820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 4823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k, 4825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 4826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 4827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream); 4834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_mct_data_group( opj_j2k_t *p_j2k, 4839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 4840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 4841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 4843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t * l_mcc_record; 4844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t * l_mct_record; 4845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp; 4846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_cbd(p_j2k,p_stream,p_manager)) { 4853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]); 4857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_record = l_tcp->m_mct_records; 4858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_tcp->m_nb_mct_records;++i) { 4860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_mct_record(p_j2k,l_mct_record,p_stream,p_manager)) { 4862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_mct_record; 4866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record = l_tcp->m_mcc_records; 4869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_tcp->m_nb_mcc_records;++i) { 4871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_mcc_record(p_j2k,l_mcc_record,p_stream,p_manager)) { 4873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_mcc_record; 4877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_mco(p_j2k,p_stream,p_manager)) { 4880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 4887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k, 4888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 4889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 4890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno; 4892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) 4899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 4900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_coc(p_j2k,compno,p_stream, p_manager)) { 4901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 4908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 4910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k, 4911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 4912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 4913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno; 4915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) 4922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 4923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_qcc(p_j2k,compno,p_stream, p_manager)) { 4924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 4931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k, 4934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 4935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 4936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno; 4938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_tccp_t *l_tccp = 00; 4939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = p_j2k->m_cp.tcps->tccps; 4946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) { 4948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->roishift) { 4949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_rgn(p_j2k,0,compno,p_j2k->m_private_image->numcomps,p_stream,p_manager)) { 4951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 4952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tccp; 4956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_epc( opj_j2k_t *p_j2k, 4962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 4963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 4964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 4965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_codestream_index_t * l_cstr_index = 00; 4966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 4968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 4969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 4970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 4971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index = p_j2k->cstr_index; 4973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cstr_index) { 4974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream); 4975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* UniPG>> */ 4976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The following adjustment is done to adjust the codestream size */ 4977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */ 4978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the first bunch of bytes is not in the codestream */ 4979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start; 4980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <<UniPG */ 4981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 4984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preparation of JPWL marker segments */ 4985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 4986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(cp->epc_on) { 4987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* encode according to JPWL */ 4989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jpwl_encode(p_j2k, p_stream, image); 4990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 4992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 4993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert( 0 && "TODO" ); 4994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 4995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 4997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 4998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 4999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_unk ( opj_j2k_t *p_j2k, 5000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 5001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 *output_marker, 5002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 5003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 5004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_unknown_marker; 5006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_dec_memory_marker_handler_t * l_marker_handler; 5007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_size_unk = 2; 5008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 5010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 5012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 5013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n"); 5015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (;;) { 5017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/ 5018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { 5019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 5020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* read 2 bytes as the new marker ID*/ 5024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_unknown_marker,2); 5025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(l_unknown_marker < 0xff00)) { 5027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Get the marker handler from the marker ID*/ 5029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker); 5030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) { 5032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n"); 5033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 5036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_marker_handler->id != J2K_MS_UNK) { 5037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Add the marker to the codestream index*/ 5038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_marker_handler->id != J2K_MS_SOT) 5039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 5040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK, 5041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk, 5042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_size_unk); 5043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (res == OPJ_FALSE) { 5044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); 5045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; /* next marker is known and well located */ 5049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 5051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_size_unk += 2; 5052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *output_marker = l_marker_handler->id ; 5057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_mct_record( opj_j2k_t *p_j2k, 5062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t * p_mct_record, 5063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 5064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 5065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_mct_size; 5067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 5068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tmp; 5069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 5073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 5074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_size = 10 + p_mct_record->m_data_size; 5076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 5078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size); 5079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 5080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 5081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 5082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 5083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n"); 5084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 5087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size; 5088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 5091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_MCT,2); /* MCT */ 5093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_mct_size-2,2); /* Lmct */ 5096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,0,2); /* Zmct */ 5099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* only one marker atm */ 5102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) | (p_mct_record->m_element_type << 10); 5103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_tmp,2); 5105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,0,2); /* Ymct */ 5108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 5109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_current_data,p_mct_record->m_data,p_mct_record->m_data_size); 5111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 5113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 5120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a MCT marker (Multiple Component Transform) 5121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 5122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the MCT box. 5123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 5124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the MCT marker. 5125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 5126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 5127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_mct ( opj_j2k_t *p_j2k, 5128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 5129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 5130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 5131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 5132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 5134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 5135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tmp; 5136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_indix; 5137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t * l_mct_data; 51384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann OPJ_BOOL new_mct = OPJ_FALSE; 5139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 5142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ? 5145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] : 5146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 5147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 2) { 5149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n"); 5150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* first marker */ 5154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,2); /* Zmct */ 5155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data += 2; 5156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp != 0) { 5157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge mct data within multiple MCT records\n"); 5158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(p_header_size <= 6) { 5162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n"); 5163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/ 5167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,2); /* Imct */ 5168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data += 2; 5169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_indix = l_tmp & 0xff; 5171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data = l_tcp->m_mct_records; 5172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_tcp->m_nb_mct_records;++i) { 5174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mct_data->m_index == l_indix) { 5175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 5176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_mct_data; 5178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* NOT FOUND */ 5181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == l_tcp->m_nb_mct_records) { 5182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) { 5183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t *new_mct_records; 5184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS; 5185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)); 5187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_mct_records) { 5188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_tcp->m_mct_records); 5189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mct_records = NULL; 5190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_nb_max_mct_records = 0; 5191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_nb_mct_records = 0; 5192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n"); 5193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mct_records = new_mct_records; 5196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records; 5197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(l_mct_data ,0,(l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t)); 5198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records; 52014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new_mct = OPJ_TRUE; 5202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mct_data->m_data) { 5205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_mct_data->m_data); 5206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data->m_data = 00; 5207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data->m_index = l_indix; 5210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp >> 8) & 3); 5211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp >> 10) & 3); 5212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,2); /* Ymct */ 5214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 5215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp != 0) { 5216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple MCT markers\n"); 5217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size -= 6; 5221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size); 5223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_mct_data->m_data) { 5224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n"); 5225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_mct_data->m_data,p_header_data,p_header_size); 5228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data->m_data_size = p_header_size; 5230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 52314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (new_mct) { 52324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++l_tcp->m_nb_mct_records; 52334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_mcc_record( opj_j2k_t *p_j2k, 5238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_simple_mcc_decorrelation_data * p_mcc_record, 5239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 5240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 5241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 5243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_mcc_size; 5244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 5245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_bytes_for_comp; 5246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_mask; 5247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tmcc; 5248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 5252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 5253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_mcc_record->m_nb_comps > 255 ) { 5255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_for_comp = 2; 5256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mask = 0x8000; 5257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 5259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_for_comp = 1; 5260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mask = 0; 5261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19; 5264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) 5265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 5266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size); 5267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 5268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 5269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 5270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 5271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n"); 5272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 5275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size; 5276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 5279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_MCC,2); /* MCC */ 5281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_mcc_size-2,2); /* Lmcc */ 5284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* first marker */ 5287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,0,2); /* Zmcc */ 5288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,p_mcc_record->m_index,1); /* Imcc -> no need for other values, take the first */ 5291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 5292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* only one marker atm */ 5294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,0,2); /* Ymcc */ 5295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 5296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,1,2); /* Qmcc -> number of collections -> 1 */ 5298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 5299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,0x1,1); /* Xmcci type of component transformation -> array based decorrelation */ 5301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 5302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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 */ 5304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 5305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_mcc_record->m_nb_comps;++i) { 5307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp); /* Cmccij Component offset*/ 5308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=l_nb_bytes_for_comp; 5309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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 */ 5312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 5313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_mcc_record->m_nb_comps;++i) 5315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 5316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp); /* Wmccij Component offset*/ 5317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=l_nb_bytes_for_comp; 5318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tmcc = ((!p_mcc_record->m_is_irreversible)&1)<<16; 5321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_mcc_record->m_decorrelation_array) { 5323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tmcc |= p_mcc_record->m_decorrelation_array->m_index; 5324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_mcc_record->m_offset_array) { 5327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tmcc |= ((p_mcc_record->m_offset_array->m_index)<<8); 5328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_tmcc,3); /* Tmcci : use MCT defined as number 1 and irreversible array based. */ 5331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=3; 5332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 5334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k, 5341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 5342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 5343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 5344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i,j; 5346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tmp; 5347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_indix; 5348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp; 5349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t * l_mcc_record; 5350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t * l_mct_data; 5351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_collections; 5352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comps; 5353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_bytes_by_comp; 5354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_BOOL new_mcc = OPJ_FALSE; 5355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 5358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 5360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ? 5362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] : 5363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 5364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 2) { 5366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n"); 5367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* first marker */ 5371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,2); /* Zmcc */ 5372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data += 2; 5373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp != 0) { 5374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n"); 5375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 7) { 5379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n"); 5380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_indix,1); /* Imcc -> no need for other values, take the first */ 5384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 5385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record = l_tcp->m_mcc_records; 5387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i=0;i<l_tcp->m_nb_mcc_records;++i) { 5389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mcc_record->m_index == l_indix) { 5390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 5391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_mcc_record; 5393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /** NOT FOUND */ 5396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i == l_tcp->m_nb_mcc_records) { 5397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) { 5398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t *new_mcc_records; 5399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS; 5400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc( 5402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t)); 5403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_mcc_records) { 5404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_tcp->m_mcc_records); 5405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mcc_records = NULL; 5406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_nb_max_mcc_records = 0; 5407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_nb_mcc_records = 0; 5408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n"); 5409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mcc_records = new_mcc_records; 5412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records; 5413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)); 5414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records; 5416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new_mcc = OPJ_TRUE; 5417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record->m_index = l_indix; 5419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* only one marker atm */ 5421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,2); /* Ymcc */ 5422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 5423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp != 0) { 5424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n"); 5425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_nb_collections,2); /* Qmcc -> number of collections -> 1 */ 5429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 5430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_collections > 1) { 5432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple collections\n"); 5433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size -= 7; 5437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_collections;++i) { 5439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 3) { 5440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n"); 5441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,1); /* Xmcci type of component transformation -> array based decorrelation */ 5445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 5446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp != 1) { 5448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections other than array decorrelation\n"); 5449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_nb_comps,2); 5453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 5455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size-=3; 5456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_by_comp = 1 + (l_nb_comps>>15); 5458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff; 5459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) { 5461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n"); 5462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2); 5466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_mcc_record->m_nb_comps;++j) { 5468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp); /* Cmccij Component offset*/ 5469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=l_nb_bytes_by_comp; 5470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp != j) { 5472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n"); 5473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_nb_comps,2); 5478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 5479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_by_comp = 1 + (l_nb_comps>>15); 5481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_comps &= 0x7fff; 5482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_comps != l_mcc_record->m_nb_comps) { 5484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections without same number of indixes\n"); 5485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) { 5489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n"); 5490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3); 5494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_mcc_record->m_nb_comps;++j) { 5496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp); /* Wmccij Component offset*/ 5497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=l_nb_bytes_by_comp; 5498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tmp != j) { 5500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n"); 5501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,3); /* Wmccij Component offset*/ 5506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data += 3; 5507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record->m_is_irreversible = ! ((l_tmp>>16) & 1); 5509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record->m_decorrelation_array = 00; 5510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record->m_offset_array = 00; 5511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_indix = l_tmp & 0xff; 5513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_indix != 0) { 5514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data = l_tcp->m_mct_records; 5515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_tcp->m_nb_mct_records;++j) { 5516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mct_data->m_index == l_indix) { 5517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record->m_decorrelation_array = l_mct_data; 5518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 5519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_mct_data; 5521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mcc_record->m_decorrelation_array == 00) { 5524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n"); 5525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_indix = (l_tmp >> 8) & 0xff; 5530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_indix != 0) { 5531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_data = l_tcp->m_mct_records; 5532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_tcp->m_nb_mct_records;++j) { 5533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mct_data->m_index == l_indix) { 5534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record->m_offset_array = l_mct_data; 5535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 5536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_mct_data; 5538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mcc_record->m_offset_array == 00) { 5541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n"); 5542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != 0) { 5548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n"); 5549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (new_mcc) { 5553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++l_tcp->m_nb_mcc_records; 5554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 5555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k, 5560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 5561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager 5562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 5563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 5565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_mco_size; 5566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = 00; 5567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t * l_mcc_record; 5568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 5569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 5573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 5574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp =&(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]); 5576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mco_size = 5 + l_tcp->m_nb_mcc_records; 5578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 5579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size); 5581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 5582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 5583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 5584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 5585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n"); 5586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 5589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size; 5590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 5592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_MCO,2); /* MCO */ 5595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_mco_size-2,2); /* Lmco */ 5598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1); /* Nmco : only one transform stage*/ 5601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 5602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record = l_tcp->m_mcc_records; 5604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i=0;i<l_tcp->m_nb_mcc_records;++i) { 5605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_mcc_record->m_index,1);/* Imco -> use the mcc indicated by 1*/ 5606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 5607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_mcc_record; 5608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 5611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 5618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a MCO marker (Multiple Component Transform Ordering) 5619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 5620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the MCO box. 5621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 5622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the MCO marker. 5623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 5624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 5625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_mco ( opj_j2k_t *p_j2k, 5626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 5627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 5628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 5629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 5630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tmp, i; 5632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_stages; 5633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp; 5634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t * l_tccp; 5635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * l_image; 5636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 5639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 5641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 5643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ? 5644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] : 5645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 5646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size < 1) { 5648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n"); 5649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(p_header_data,&l_nb_stages,1); /* Nmco : only one transform stage*/ 5653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 5654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_stages > 1) { 5656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple transformation stages.\n"); 5657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != l_nb_stages + 1) { 5661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n"); 5662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = l_tcp->tccps; 5666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_image->numcomps;++i) { 5668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->m_dc_level_shift = 0; 5669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tccp; 5670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->m_mct_decoding_matrix) { 5673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_tcp->m_mct_decoding_matrix); 5674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mct_decoding_matrix = 00; 5675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_stages;++i) { 5678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_tmp,1); 5679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 5680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_add_mct(l_tcp,p_j2k->m_private_image,l_tmp)) { 5682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index) 5690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 5692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t * l_mcc_record; 5693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t * l_deco_array, * l_offset_array; 5694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_data_size,l_mct_size, l_offset_size; 5695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_elem; 5696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * l_offset_data, * l_current_offset_data; 5697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t * l_tccp; 5698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_tcp != 00); 5701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_record = p_tcp->m_mcc_records; 5703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_tcp->m_nb_mcc_records;++i) { 5705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mcc_record->m_index == p_index) { 5706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 5707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (i==p_tcp->m_nb_mcc_records) { 5711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /** element discarded **/ 5712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mcc_record->m_nb_comps != p_image->numcomps) { 5716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /** do not support number of comps != image */ 5717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_deco_array = l_mcc_record->m_decorrelation_array; 5721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_deco_array) { 5723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps * p_image->numcomps; 572433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (l_deco_array->m_data_size != l_data_size || ! l_deco_array->m_data) { 5725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_elem = p_image->numcomps * p_image->numcomps; 5729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32); 5730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size); 5731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_tcp->m_mct_decoding_matrix ) { 5733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 5737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_array = l_mcc_record->m_offset_array; 5740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_offset_array) { 5742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] * p_image->numcomps; 574333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (l_offset_array->m_data_size != l_data_size || ! l_offset_array->m_data) { 5744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_elem = p_image->numcomps; 5748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32); 5749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size); 5750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_offset_data ) { 5752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](l_offset_array->m_data,l_offset_data,l_nb_elem); 5756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = p_tcp->tccps; 5758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_offset_data = l_offset_data; 5759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_image->numcomps;++i) { 5761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->m_dc_level_shift = (OPJ_INT32)*(l_current_offset_data++); 5762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tccp; 5763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_offset_data); 5766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k, 5772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 5773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 5774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 5776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_cbd_size; 5777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 5778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *l_image = 00; 5779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t * l_comp = 00; 5780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 5784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 5785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 5787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cbd_size = 6 + p_j2k->m_private_image->numcomps; 5788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { 5790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size); 5791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_tile_data) { 5792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 5793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL; 5794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 5795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n"); 5796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; 5799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size; 5800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; 5803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,J2K_MS_CBD,2); /* CBD */ 5805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_cbd_size-2,2); /* L_CBD */ 5808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += 2; 5809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data,l_image->numcomps, 2); /* Ncbd */ 5811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data+=2; 5812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp = l_image->comps; 5814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_image->numcomps;++i) { 5816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1), 1); /* Component bit depth */ 5817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_data; 5818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_comp; 5820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 5823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 5830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Reads a CBD marker (Component bit depth definition) 5831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_data the data contained in the CBD box. 5832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k the jpeg2000 codec. 5833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_header_size the size of the data contained in the CBD marker. 5834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 5835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 5836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_read_cbd ( opj_j2k_t *p_j2k, 5837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 5838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_header_size, 5839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 5840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 5841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comp,l_num_comp; 5843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_comp_def; 5844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 5845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t * l_comp = 00; 5846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 5848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 5849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 5850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 5851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_comp = p_j2k->m_private_image->numcomps; 5853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) { 5855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n"); 5856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_nb_comp,2); /* Ncbd */ 5860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_header_data+=2; 5861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_nb_comp != l_num_comp) { 5863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n"); 5864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 5865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp = p_j2k->m_private_image->comps; 5868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_num_comp;++i) { 5869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_header_data,&l_comp_def,1); /* Component bit depth */ 5870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_header_data; 5871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp->sgnd = (l_comp_def>>7) & 1; 5872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp->prec = (l_comp_def&0x7f) + 1; 5873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_comp; 5874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 5877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */ 5880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* J2K / JPT decoder interface */ 5881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */ 5882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) 5884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(j2k && parameters) { 5886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer; 5887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce; 5888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 5890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k->m_cp.correct = parameters->jpwl_correct; 5891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k->m_cp.exp_comps = parameters->jpwl_exp_comps; 5892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k->m_cp.max_tiles = parameters->jpwl_max_tiles; 5893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 5894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */ 5898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* J2K encoder interface */ 5899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ----------------------------------------------------------------------- */ 5900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovopj_j2k_t* opj_j2k_create_compress(void) 5902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5903e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1,sizeof(opj_j2k_t)); 5904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_j2k) { 5905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 5906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_is_decoder = 0; 5910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_cp.m_is_decoder = 0; 5911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE); 5913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) { 5914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_destroy(l_j2k); 5915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 5916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_specific_param.m_encoder.m_header_tile_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE; 5919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* validation list creation*/ 5921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_validation_list = opj_procedure_list_create(); 5922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_j2k->m_validation_list) { 5923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_destroy(l_j2k); 5924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 5925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* execution list creation*/ 5928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_procedure_list = opj_procedure_list_create(); 5929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_j2k->m_procedure_list) { 5930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_destroy(l_j2k); 5931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 5932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 5933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return l_j2k; 5935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){ 5938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[0].tile = 1; 5939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[0].resno0 = 0; 5940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[0].compno0 = 0; 5941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[0].layno1 = 1; 5942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[0].resno1 = (OPJ_UINT32)(numres-1); 5943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[0].compno1 = 3; 5944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[0].prg1 = OPJ_CPRL; 5945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[1].tile = 1; 5946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[1].resno0 = (OPJ_UINT32)(numres-1); 5947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[1].compno0 = 0; 5948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[1].layno1 = 1; 5949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[1].resno1 = (OPJ_UINT32)numres; 5950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[1].compno1 = 3; 5951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov POC[1].prg1 = OPJ_CPRL; 5952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 5953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 5954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager) 5956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 5957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Configure cinema parameters */ 5958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i; 5959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* No tiling */ 5961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->tile_size_on = OPJ_FALSE; 5962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->cp_tdx=1; 5963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->cp_tdy=1; 5964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* One tile part for each component */ 5966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->tp_flag = 'C'; 5967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->tp_on = 1; 5968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Tile and Image shall be at (0,0) */ 5970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->cp_tx0 = 0; 5971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->cp_ty0 = 0; 5972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->image_offset_x0 = 0; 5973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->image_offset_y0 = 0; 5974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Codeblock size= 32*32 */ 5976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->cblockw_init = 32; 5977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->cblockh_init = 32; 5978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Codeblock style: no mode switch enabled */ 5980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->mode = 0; 5981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* No ROI */ 5983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->roi_compno = -1; 5984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* No subsampling */ 5986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->subsampling_dx = 1; 5987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->subsampling_dy = 1; 5988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 9-7 transform */ 5990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->irreversible = 1; 5991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Number of layers */ 5993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->tcp_numlayers > 1){ 5994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 5995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n" 5996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "1 single quality layer" 5997e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "-> Number of layers forced to 1 (rather than %d)\n" 5998e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "-> Rate of the last layer (%3.1f) will be used", 5999e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->tcp_numlayers, parameters->tcp_rates[parameters->tcp_numlayers-1]); 6000e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->tcp_rates[0] = parameters->tcp_rates[parameters->tcp_numlayers-1]; 6001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->tcp_numlayers = 1; 6002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Resolution levels */ 6005e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (parameters->rsiz){ 6006e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_PROFILE_CINEMA_2K: 6007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(parameters->numresolution > 6){ 6008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPEG 2000 Profile-3 (2k dc profile) requires:\n" 6010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Number of decomposition levels <= 5\n" 6011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Number of decomposition levels forced to 5 (rather than %d)\n", 6012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->numresolution+1); 6013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->numresolution = 6; 6014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 6016e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_PROFILE_CINEMA_4K: 6017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(parameters->numresolution < 2){ 6018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPEG 2000 Profile-4 (4k dc profile) requires:\n" 6020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Number of decomposition levels >= 1 && <= 6\n" 6021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Number of decomposition levels forced to 1 (rather than %d)\n", 6022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->numresolution+1); 6023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->numresolution = 1; 6024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }else if(parameters->numresolution > 7){ 6025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPEG 2000 Profile-4 (4k dc profile) requires:\n" 6027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Number of decomposition levels >= 1 && <= 6\n" 6028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Number of decomposition levels forced to 6 (rather than %d)\n", 6029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->numresolution+1); 6030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->numresolution = 7; 6031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 6033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default : 6034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 6035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Precincts */ 6038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->csty |= 0x01; 6039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->res_spec = parameters->numresolution-1; 6040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i<parameters->res_spec; i++) { 6041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->prcw_init[i] = 256; 6042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->prch_init[i] = 256; 6043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The progression order shall be CPRL */ 6046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->prog_order = OPJ_CPRL; 6047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Progression order changes for 4K, disallowed for 2K */ 6049e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (parameters->rsiz == OPJ_PROFILE_CINEMA_4K) { 6050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,parameters->numresolution); 6051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->numpocs = 0; 6053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Limited bit-rate */ 6056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->cp_disto_alloc = 1; 6057e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (parameters->max_cs_size <= 0) { 6058e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* No rate has been introduced, 24 fps is assumed */ 6059e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_cs_size = OPJ_CINEMA_24_CS; 6060e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6061e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n" 6062e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Maximum 1302083 compressed bytes @ 24fps\n" 6063e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "As no rate has been given, this limit will be used.\n"); 6064e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (parameters->max_cs_size > OPJ_CINEMA_24_CS) { 6065e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6066e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n" 6067e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Maximum 1302083 compressed bytes @ 24fps\n" 6068e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "-> Specified rate exceeds this limit. Rate will be forced to 1302083 bytes.\n"); 6069e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_cs_size = OPJ_CINEMA_24_CS; 6070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6071e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 6072e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (parameters->max_comp_size <= 0) { 6073e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* No rate has been introduced, 24 fps is assumed */ 6074e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_comp_size = OPJ_CINEMA_24_COMP; 6075e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6076e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n" 6077e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Maximum 1041666 compressed bytes @ 24fps\n" 6078e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "As no rate has been given, this limit will be used.\n"); 6079e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (parameters->max_comp_size > OPJ_CINEMA_24_COMP) { 6080e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6081e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n" 6082e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Maximum 1041666 compressed bytes @ 24fps\n" 6083e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "-> Specified rate exceeds this limit. Rate will be forced to 1041666 bytes.\n"); 6084e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_comp_size = OPJ_CINEMA_24_COMP; 6085e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6086e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 6087e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->tcp_rates[0] = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/ 6088e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx * image->comps[0].dy); 6089e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 6090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager) 6093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 6095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Number of components */ 6097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (image->numcomps != 3){ 6098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPEG 2000 Profile-3 (2k dc profile) requires:\n" 6100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "3 components" 6101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Number of components of input image (%d) is not compliant\n" 6102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Non-profile-3 codestream will be generated\n", 6103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image->numcomps); 6104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Bitdepth */ 6108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < image->numcomps; i++) { 6109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((image->comps[i].bpp != 12) | (image->comps[i].sgnd)){ 6110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char signed_str[] = "signed"; 6111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char unsigned_str[] = "unsigned"; 6112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char *tmp_str = image->comps[i].sgnd?signed_str:unsigned_str; 6113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPEG 2000 Profile-3 (2k dc profile) requires:\n" 6115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Precision of each component shall be 12 bits unsigned" 6116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> At least component %d of input image (%d bits, %s) is not compliant\n" 6117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Non-profile-3 codestream will be generated\n", 6118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i,image->comps[i].bpp, tmp_str); 6119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Image size */ 6124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (rsiz){ 6125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_PROFILE_CINEMA_2K: 6126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))){ 6127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPEG 2000 Profile-3 (2k dc profile) requires:\n" 6129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "width <= 2048 and height <= 1080\n" 6130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Input image size %d x %d is not compliant\n" 6131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Non-profile-3 codestream will be generated\n", 6132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image->comps[0].w,image->comps[0].h); 6133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 6136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_PROFILE_CINEMA_4K: 6137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))){ 6138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPEG 2000 Profile-4 (4k dc profile) requires:\n" 6140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "width <= 4096 and height <= 2160\n" 6141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Image size %d x %d is not compliant\n" 6142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "-> Non-profile-4 codestream will be generated\n", 6143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image->comps[0].w,image->comps[0].h); 6144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 6147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default : 6148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 6149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 6152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovOPJ_BOOL opj_j2k_setup_encoder( opj_j2k_t *p_j2k, 6155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cparameters_t *parameters, 6156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t *image, 6157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 6158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i, j, tileno, numpocs_tile; 6160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *cp = 00; 6161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!p_j2k || !parameters || ! image) { 6163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 6166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((parameters->numresolution <= 0) || (parameters->numresolution > OPJ_J2K_MAXRLVLS)) { 6167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Invalid number of resolutions : %d not in range [1,%d]\n", parameters->numresolution, OPJ_J2K_MAXRLVLS); 6168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */ 6172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp = &(p_j2k->m_cp); 6173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set default values for cp */ 6175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->tw = 1; 6176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->th = 1; 6177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */ 6179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (parameters->rsiz == OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */ 6180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_BOOL deprecated_used = OPJ_FALSE; 6181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (parameters->cp_cinema){ 6182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_CINEMA2K_24: 6183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_CINEMA_2K; 6184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_cs_size = OPJ_CINEMA_24_CS; 6185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_comp_size = OPJ_CINEMA_24_COMP; 6186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov deprecated_used = OPJ_TRUE; 6187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 6188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_CINEMA2K_48: 6189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_CINEMA_2K; 6190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_cs_size = OPJ_CINEMA_48_CS; 6191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_comp_size = OPJ_CINEMA_48_COMP; 6192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov deprecated_used = OPJ_TRUE; 6193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 6194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_CINEMA4K_24: 6195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_CINEMA_4K; 6196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_cs_size = OPJ_CINEMA_24_CS; 6197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_comp_size = OPJ_CINEMA_24_COMP; 6198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov deprecated_used = OPJ_TRUE; 6199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 6200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_OFF: 6201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 6202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 6203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (parameters->cp_rsiz){ 6205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_CINEMA2K: 6206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_CINEMA_2K; 6207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov deprecated_used = OPJ_TRUE; 6208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 6209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_CINEMA4K: 6210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_CINEMA_4K; 6211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov deprecated_used = OPJ_TRUE; 6212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 6213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_MCT: 6214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT; 6215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov deprecated_used = OPJ_TRUE; 6216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case OPJ_STD_RSIZ: 6217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 6218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 6219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (deprecated_used) { 6221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Deprecated fields cp_cinema or cp_rsiz are used\n" 6223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Please consider using only the rsiz field\n" 6224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "See openjpeg.h documentation for more details\n"); 6225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 6228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* see if max_codestream_size does limit input rate */ 6229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (parameters->max_cs_size <= 0) { 6230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (parameters->tcp_rates[parameters->tcp_numlayers-1] > 0) { 6231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_FLOAT32 temp_size; 6232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov temp_size =(OPJ_FLOAT32)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/ 6233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (parameters->tcp_rates[parameters->tcp_numlayers-1] * 8 * (OPJ_FLOAT32)image->comps[0].dx * (OPJ_FLOAT32)image->comps[0].dy); 6234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_cs_size = (int) floor(temp_size); 6235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 6236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->max_cs_size = 0; 6237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 6239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_FLOAT32 temp_rate; 6240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_BOOL cap = OPJ_FALSE; 6241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov temp_rate = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/ 6242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx * image->comps[0].dy); 6243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) { 6244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (parameters->tcp_rates[i] < temp_rate) { 6245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->tcp_rates[i] = temp_rate; 6246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cap = OPJ_TRUE; 6247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (cap) { 6250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "The desired maximum codestream size has limited\n" 6252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "at least one of the desired quality layers\n"); 6253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 6256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Manage profiles and applications and set RSIZ */ 6257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set cinema parameters if required */ 6258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (OPJ_IS_CINEMA(parameters->rsiz)){ 6259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K) 6260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov || (parameters->rsiz == OPJ_PROFILE_CINEMA_S4K)){ 6261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 Scalable Digital Cinema profiles not yet supported\n"); 6263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_NONE; 6264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 6265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_j2k_set_cinema_parameters(parameters,image,p_manager); 6266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!opj_j2k_is_cinema_compliant(image,parameters->rsiz,p_manager)) { 6267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_NONE; 6268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (OPJ_IS_STORAGE(parameters->rsiz)) { 6271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 Long Term Storage profile not yet supported\n"); 6273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_NONE; 6274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (OPJ_IS_BROADCAST(parameters->rsiz)) { 6275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 Broadcast profiles not yet supported\n"); 6277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_NONE; 6278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (OPJ_IS_IMF(parameters->rsiz)) { 6279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 IMF profiles not yet supported\n"); 6281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_NONE; 6282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (OPJ_IS_PART2(parameters->rsiz)) { 6283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (parameters->rsiz == ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_NONE))) { 6284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "JPEG 2000 Part-2 profile defined\n" 6286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "but no Part-2 extension enabled.\n" 6287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Profile set to NONE.\n"); 6288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_NONE; 6289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (parameters->rsiz != ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT))) { 6290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 6291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Unsupported Part-2 extension enabled\n" 6292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "Profile set to NONE.\n"); 6293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov parameters->rsiz = OPJ_PROFILE_NONE; 6294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 6298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov copy user encoding parameters 6299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 6300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)parameters->max_comp_size; 6301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cp->rsiz = parameters->rsiz; 6302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)parameters->cp_disto_alloc & 1u; 6303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)parameters->cp_fixed_alloc & 1u; 6304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)parameters->cp_fixed_quality & 1u; 6305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* mod fixed_quality */ 6307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->cp_fixed_alloc && parameters->cp_matrice) { 6308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t array_size = (size_t)parameters->tcp_numlayers * (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32); 6309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size); 6310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!cp->m_specific_param.m_enc.m_matrice) { 6311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate copy of user encoding parameters matrix \n"); 6312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice, array_size); 6315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* tiles */ 6318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->tdx = (OPJ_UINT32)parameters->cp_tdx; 6319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->tdy = (OPJ_UINT32)parameters->cp_tdy; 6320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* tile offset */ 6322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->tx0 = (OPJ_UINT32)parameters->cp_tx0; 6323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->ty0 = (OPJ_UINT32)parameters->cp_ty0; 6324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* comment string */ 6326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(parameters->cp_comment) { 6327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1U); 6328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(!cp->comment) { 6329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate copy of comment string\n"); 6330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov strcpy(cp->comment, parameters->cp_comment); 6333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 6334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Create default comment for codestream */ 6335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const char comment[] = "Created by OpenJPEG version "; 6336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const size_t clen = strlen(comment); 6337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const char *version = opj_version(); 6338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 6339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* UniPG>> */ 6340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef USE_JPWL 6341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cp->comment = (char*)opj_malloc(clen+strlen(version)+11); 6342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(!cp->comment) { 6343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate comment string\n"); 6344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sprintf(cp->comment,"%s%s with JPWL", comment, version); 6347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 6348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov cp->comment = (char*)opj_malloc(clen+strlen(version)+1); 6349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(!cp->comment) { 6350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate comment string\n"); 6351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sprintf(cp->comment,"%s%s", comment, version); 6354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 6355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* <<UniPG */ 6356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 6359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov calculate other encoding parameters 6360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 6361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->tile_size_on) { 636333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann cp->tw = opj_uint_ceildiv(image->x1 - cp->tx0, cp->tdx); 636433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann cp->th = opj_uint_ceildiv(image->y1 - cp->ty0, cp->tdy); 6365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->tdx = image->x1 - cp->tx0; 6367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->tdy = image->y1 - cp->ty0; 6368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->tp_on) { 6371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag; 6372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->m_specific_param.m_enc.m_tp_on = 1; 6373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 6376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 6377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov calculate JPWL encoding parameters 6378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 6379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->jpwl_epc_on) { 6381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 i; 6382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set JPWL on */ 6384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->epc_on = OPJ_TRUE; 6385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->info_on = OPJ_FALSE; /* no informative technique */ 6386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set EPB on */ 6388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) { 6389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->epb_on = OPJ_TRUE; 6390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->hprot_MH = parameters->jpwl_hprot_MH; 6392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { 6393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i]; 6394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i]; 6395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if tile specs are not specified, copy MH specs */ 6397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cp->hprot_TPH[0] == -1) { 6398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->hprot_TPH_tileno[0] = 0; 6399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->hprot_TPH[0] = parameters->jpwl_hprot_MH; 6400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { 6402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i]; 6403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i]; 6404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->pprot[i] = parameters->jpwl_pprot[i]; 6405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set ESD writing */ 6409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) { 6410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->esd_on = OPJ_TRUE; 6411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->sens_size = parameters->jpwl_sens_size; 6413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->sens_addr = parameters->jpwl_sens_addr; 6414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->sens_range = parameters->jpwl_sens_range; 6415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->sens_MH = parameters->jpwl_sens_MH; 6417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { 6418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i]; 6419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i]; 6420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* always set RED writing to false: we are at the encoder */ 6424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->red_on = OPJ_FALSE; 6425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->epc_on = OPJ_FALSE; 6428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 6430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* initialize the mutiple tiles */ 6432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ---------------------------- */ 6433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); 6434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!cp->tcps) { 6435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate tile coding parameters\n"); 6436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->numpocs) { 6439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* initialisation of POC */ 6440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_check_poc_val(parameters->POC,parameters->numpocs, (OPJ_UINT32)parameters->numresolution, image->numcomps, (OPJ_UINT32)parameters->tcp_numlayers, p_manager); 6441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* TODO MSD use the return value*/ 6442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { 6445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *tcp = &cp->tcps[tileno]; 6446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers; 6447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j = 0; j < tcp->numlayers; j++) { 6449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(OPJ_IS_CINEMA(cp->rsiz)){ 6450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cp->m_specific_param.m_enc.m_fixed_quality) { 6451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->distoratio[j] = parameters->tcp_distoratio[j]; 6452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->rates[j] = parameters->tcp_rates[j]; 6454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }else{ 6455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cp->m_specific_param.m_enc.m_fixed_quality) { /* add fixed_quality */ 6456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->distoratio[j] = parameters->tcp_distoratio[j]; 6457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->rates[j] = parameters->tcp_rates[j]; 6459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->csty = (OPJ_UINT32)parameters->csty; 6464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->prg = parameters->prog_order; 6465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->mct = (OPJ_UINT32)parameters->tcp_mct; 6466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov numpocs_tile = 0; 6468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->POC = 0; 6469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->numpocs) { 6471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* initialisation of POC */ 6472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->POC = 1; 6473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < parameters->numpocs; i++) { 6474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (tileno + 1 == parameters->POC[i].tile ) { 6475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile]; 6476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0; 6478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0; 6479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1; 6480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1; 6481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1; 6482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1; 6483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp_poc->tile = parameters->POC[numpocs_tile].tile; 6484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov numpocs_tile++; 6486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->numpocs = numpocs_tile -1 ; 6490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }else{ 6491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->numpocs = 0; 6492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); 6495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!tcp->tccps) { 6496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate tile component coding parameters\n"); 6497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->mct_data) { 6500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32); 6502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize); 6503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dc_shift = (OPJ_INT32 *) ((OPJ_BYTE *) parameters->mct_data + lMctSize); 6504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!lTmpBuf) { 6506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate temp buffer\n"); 6507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 6510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->mct = 2; 6511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize); 6512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! tcp->m_mct_coding_matrix) { 6513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_free(lTmpBuf); 6514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov lTmpBuf = NULL; 6515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT coding matrix \n"); 6516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(tcp->m_mct_coding_matrix,parameters->mct_data,lMctSize); 6519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(lTmpBuf,parameters->mct_data,lMctSize); 6520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize); 6522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! tcp->m_mct_decoding_matrix) { 6523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_free(lTmpBuf); 6524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov lTmpBuf = NULL; 6525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT decoding matrix \n"); 6526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(opj_matrix_inversion_f(lTmpBuf,(tcp->m_mct_decoding_matrix),image->numcomps) == OPJ_FALSE) { 6529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_free(lTmpBuf); 6530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov lTmpBuf = NULL; 6531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Failed to inverse encoder MCT decoding matrix \n"); 6532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tcp->mct_norms = (OPJ_FLOAT64*) 6536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64)); 6537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! tcp->mct_norms) { 6538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_free(lTmpBuf); 6539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov lTmpBuf = NULL; 6540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT norms \n"); 6541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_calculate_norms(tcp->mct_norms,image->numcomps,tcp->m_mct_decoding_matrix); 6544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(lTmpBuf); 6545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < image->numcomps; i++) { 6547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *tccp = &tcp->tccps[i]; 6548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->m_dc_level_shift = l_dc_shift[i]; 6549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (opj_j2k_setup_mct_encoding(tcp,image) == OPJ_FALSE) { 6552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* free will be handled by opj_j2k_destroy */ 6553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Failed to setup j2k mct encoding\n"); 6554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 6555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 6558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(tcp->mct==1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */ 6559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((image->comps[0].dx != image->comps[1].dx) || 6560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (image->comps[0].dx != image->comps[2].dx) || 6561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (image->comps[0].dy != image->comps[1].dy) || 6562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (image->comps[0].dy != image->comps[2].dy)) { 6563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Cannot perform MCT on components with different sizes. Disabling MCT.\n"); 6564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov tcp->mct = 0; 6565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 6567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < image->numcomps; i++) { 6568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *tccp = &tcp->tccps[i]; 6569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t * l_comp = &(image->comps[i]); 6570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_comp->sgnd) { 6572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->m_dc_level_shift = 1 << (l_comp->prec - 1); 6573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < image->numcomps; i++) { 6578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *tccp = &tcp->tccps[i]; 6579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */ 6581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->numresolutions = (OPJ_UINT32)parameters->numresolution; 6582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init); 6583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init); 6584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->cblksty = (OPJ_UINT32)parameters->mode; 6585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->qmfbid = parameters->irreversible ? 0 : 1; 6586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT; 6587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->numgbits = 2; 6588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((OPJ_INT32)i == parameters->roi_compno) { 6590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->roishift = parameters->roi_shift; 6591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->roishift = 0; 6593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->csty & J2K_CCP_CSTY_PRT) { 6596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 p = 0, it_res; 6597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert( tccp->numresolutions > 0 ); 6598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) { 6599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p < parameters->res_spec) { 6600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->prcw_init[p] < 1) { 6602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prcw[it_res] = 1; 6603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]); 6605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->prch_init[p] < 1) { 6608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prch[it_res] = 1; 6609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }else { 6610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]); 6611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 res_spec = parameters->res_spec; 6615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 size_prcw = 0; 6616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 size_prch = 0; 6617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(res_spec>0); /* issue 189 */ 6619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1)); 6620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1)); 6621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (size_prcw < 1) { 6624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prcw[it_res] = 1; 6625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw); 6627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (size_prch < 1) { 6630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prch[it_res] = 1; 6631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch); 6633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p++; 6636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */ 6637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } /*end for*/ 6638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 6639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j = 0; j < tccp->numresolutions; j++) { 6640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prcw[j] = 15; 6641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tccp->prch[j] = 15; 6642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec); 6646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (parameters->mct_data) { 6650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(parameters->mct_data); 6651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov parameters->mct_data = 00; 6652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_TRUE; 6654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) 6657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(cstr_index != 00); 6659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* expand the list? */ 6661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) { 6662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_marker_info_t *new_marker; 6663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->maxmarknum); 6664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker, cstr_index->maxmarknum *sizeof(opj_marker_info_t)); 6665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_marker) { 6666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(cstr_index->marker); 6667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker = NULL; 6668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->maxmarknum = 0; 6669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marknum = 0; 6670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */ 6671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker = new_marker; 6674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* add the marker */ 6677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type; 6678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos; 6679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len; 6680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marknum++; 6681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 6682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic 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) 6685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(cstr_index != 00); 6687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(cstr_index->tile_index != 00); 6688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* expand the list? */ 6690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((cstr_index->tile_index[tileno].marknum + 1) > cstr_index->tile_index[tileno].maxmarknum) { 6691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_marker_info_t *new_marker; 6692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum); 6693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_marker = (opj_marker_info_t *) opj_realloc( 6694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].marker, 6695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].maxmarknum *sizeof(opj_marker_info_t)); 6696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_marker) { 6697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(cstr_index->tile_index[tileno].marker); 6698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].marker = NULL; 6699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].maxmarknum = 0; 6700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].marknum = 0; 6701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */ 6702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].marker = new_marker; 6705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* add the marker */ 6708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type = (OPJ_UINT16)type; 6709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos = (OPJ_INT32)pos; 6710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len = (OPJ_INT32)len; 6711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].marknum++; 6712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (type == J2K_MS_SOT) { 6714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno; 6715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cstr_index->tile_index[tileno].tp_index) 6717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos; 6718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 6721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 6724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ----------------------------------------------------------------------- 6725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ----------------------------------------------------------------------- 6726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ----------------------------------------------------------------------- 6727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 6728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6729ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k, 6730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 6731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 6732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 6733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_j2k; 6735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_stream; 6736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_manager; 6737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 6738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6740ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_read_header( opj_stream_private_t *p_stream, 6741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_t* p_j2k, 6742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t** p_image, 6743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t* p_manager ) 6744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 6746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 6747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 6748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 6749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* create an empty image header */ 6751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image = opj_image_create0(); 6752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_j2k->m_private_image) { 6753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* customization of the validation */ 6757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_j2k_setup_decoding_validation(p_j2k, p_manager)) { 6758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_image_destroy(p_j2k->m_private_image); 6759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_j2k->m_private_image = NULL; 6760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 6761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* validation of the parameters codec */ 6764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream,p_manager)) { 6765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_destroy(p_j2k->m_private_image); 6766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image = NULL; 6767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* customization of the encoding */ 6771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_j2k_setup_header_reading(p_j2k, p_manager)) { 6772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_image_destroy(p_j2k->m_private_image); 6773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_j2k->m_private_image = NULL; 6774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 6775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* read header */ 6778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) { 6779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_destroy(p_j2k->m_private_image); 6780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image = NULL; 6781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_image = opj_image_create0(); 6785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (*p_image)) { 6786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Copy codestream image information to the output image */ 6790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_copy_image_header(p_j2k->m_private_image, *p_image); 6791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*Allocate and initialize some elements of codestrem index*/ 6793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){ 6794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 6798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_header_reading (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) 6801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 6803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 6804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 6805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_read_header_procedure, p_manager)) { 6807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 6808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* DEVELOPER CORNER, add your custom procedures */ 6811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager)) { 6812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 6813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 6815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 6816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) 6819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 6821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 6822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 6823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,(opj_procedure)opj_j2k_build_decoder, p_manager)) { 6825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 6826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,(opj_procedure)opj_j2k_decoding_validation, p_manager)) { 6828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 6829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 6830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* DEVELOPER CORNER, add your custom validation procedure */ 6832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 6833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_mct_validation ( opj_j2k_t * p_j2k, 6836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 6837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 6838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL l_is_valid = OPJ_TRUE; 6840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i,j; 6841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 6843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 6844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 6845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 6846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) { 6848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; 6849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = p_j2k->m_cp.tcps; 6850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_tiles;++i) { 6852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tcp->mct == 2) { 6853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t * l_tccp = l_tcp->tccps; 6854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= (l_tcp->m_mct_coding_matrix != 00); 6855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<p_j2k->m_private_image->numcomps;++j) { 6857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= ! (l_tccp->qmfbid & 1); 6858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tccp; 6859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 6862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return l_is_valid; 6866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 6867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6868ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image) 6869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 6870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 6871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_indix = 1; 6872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t * l_mct_deco_data = 00,* l_mct_offset_data = 00; 6873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t * l_mcc_data; 6874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_mct_size,l_nb_elem; 6875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_FLOAT32 * l_data, * l_current_data; 6876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t * l_tccp; 6877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 6879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_tcp != 00); 6880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_tcp->mct != 2) { 6882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 6883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_tcp->m_mct_decoding_matrix) { 6886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) { 6887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t *new_mct_records; 6888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS; 6889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)); 6891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_mct_records) { 6892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_tcp->m_mct_records); 6893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_mct_records = NULL; 6894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_max_mct_records = 0; 6895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_mct_records = 0; 6896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */ 6897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_mct_records = new_mct_records; 6900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records; 6901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(l_mct_deco_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t)); 6903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records; 6905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mct_deco_data->m_data) { 6907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_mct_deco_data->m_data); 6908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data->m_data = 00; 6909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data->m_index = l_indix++; 6912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION; 6913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT; 6914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_elem = p_image->numcomps * p_image->numcomps; 6915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type]; 6916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size ); 6917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_mct_deco_data->m_data) { 6919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 6923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data->m_data_size = l_mct_size; 6925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_tcp->m_nb_mct_records; 6926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) { 6929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t *new_mct_records; 6930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS; 6931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)); 6932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_mct_records) { 6933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_tcp->m_mct_records); 6934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_mct_records = NULL; 6935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_max_mct_records = 0; 6936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_mct_records = 0; 6937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */ 6938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_mct_records = new_mct_records; 6941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records; 6942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(l_mct_offset_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t)); 6944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mct_deco_data) { 6946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_deco_data = l_mct_offset_data - 1; 6947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records; 6951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_mct_offset_data->m_data) { 6953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_mct_offset_data->m_data); 6954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data->m_data = 00; 6955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data->m_index = l_indix++; 6958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET; 6959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT; 6960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_elem = p_image->numcomps; 6961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type]; 6962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size ); 6963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_mct_offset_data->m_data) { 6965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32)); 6969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_data) { 6970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_mct_offset_data->m_data); 6971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data->m_data = 00; 6972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 6973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = p_tcp->tccps; 6976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = l_data; 6977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_elem;++i) { 6979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_current_data++) = (OPJ_FLOAT32) (l_tccp->m_dc_level_shift); 6980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tccp; 6981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 6982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,l_mct_offset_data->m_data,l_nb_elem); 6984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_data); 6986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_offset_data->m_data_size = l_mct_size; 6988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_tcp->m_nb_mct_records; 6990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) { 6992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t *new_mcc_records; 6993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS; 6994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc( 6995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t)); 6996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_mcc_records) { 6997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_tcp->m_mcc_records); 6998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_mcc_records = NULL; 6999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_max_mcc_records = 0; 7000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_nb_mcc_records = 0; 7001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */ 7002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_mcc_records = new_mcc_records; 7005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records; 7006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)); 7007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records; 7011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_data->m_decorrelation_array = l_mct_deco_data; 7012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_data->m_is_irreversible = 1; 7013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_data->m_nb_comps = p_image->numcomps; 7014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_data->m_index = l_indix++; 7015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_data->m_offset_array = l_mct_offset_data; 7016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_tcp->m_nb_mcc_records; 7017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 7019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k, 7022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 7023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 7024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* add here initialization of cp 7026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov copy paste of setup_decoder */ 7027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_j2k; 7028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_stream; 7029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_manager; 7030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 7031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k, 7034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 7035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 7036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* add here initialization of cp 7038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov copy paste of setup_encoder */ 7039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_j2k; 7040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_stream; 7041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_manager; 7042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 7043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_encoding_validation ( opj_j2k_t * p_j2k, 7046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 7047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 7048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL l_is_valid = OPJ_TRUE; 7050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 7052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 7053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 7054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 7055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* STATE checking */ 7057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure the state is at 0 */ 7058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE); 7059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* POINTER validation */ 7061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure a p_j2k codec is present */ 7062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= (p_j2k->m_procedure_list != 00); 7063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure a validation list is present */ 7064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= (p_j2k->m_validation_list != 00); 7065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7066e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* ISO 15444-1:2004 states between 1 & 33 (0 -> 32) */ 7067e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* 33 (32) would always fail the check below (if a cast to 64bits was done) */ 7068e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* FIXME Shall we change OPJ_J2K_MAXRLVLS to 32 ? */ 7069e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) || (p_j2k->m_cp.tcps->tccps->numresolutions > 32)) { 7070e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n"); 7071e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 7072e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7073e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7074e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((p_j2k->m_cp.tdx) < (OPJ_UINT32) (1 << (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) { 7075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n"); 7076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7079e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((p_j2k->m_cp.tdy) < (OPJ_UINT32) (1 << (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) { 7080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n"); 7081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* PARAMETER VALIDATION */ 7085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return l_is_valid; 7086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_decoding_validation ( opj_j2k_t *p_j2k, 7089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 7090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 7091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 7092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL l_is_valid = OPJ_TRUE; 7094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 7096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 7097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 7098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 7099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* STATE checking */ 7101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure the state is at 0 */ 7102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TODO_MSD 7103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE); 7104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 7105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000); 7106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* POINTER validation */ 7108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure a p_j2k codec is present */ 7109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure a procedure list is present */ 7110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= (p_j2k->m_procedure_list != 00); 7111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure a validation list is present */ 7112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_is_valid &= (p_j2k->m_validation_list != 00); 7113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* PARAMETER VALIDATION */ 7115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return l_is_valid; 7116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k, 7119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 7120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 7121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_marker; 7123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_marker_size; 7124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_dec_memory_marker_handler_t * l_marker_handler = 00; 7125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_BOOL l_has_siz = 0; 7126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_BOOL l_has_cod = 0; 7127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_BOOL l_has_qcd = 0; 7128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 7130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 7131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 7132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 7133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* We enter in the main header */ 7135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC; 7136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read the SOC marker, the codestream must begin with SOC marker */ 7138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_soc(p_j2k,p_stream,p_manager)) { 7139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n"); 7140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */ 7144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { 7145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read 2 bytes as the new marker ID */ 7150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2); 7151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read until the SOT is detected */ 7153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (l_current_marker != J2K_MS_SOT) { 7154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if the current marker ID is valid */ 7156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_current_marker < 0xff00) { 7157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "A marker ID was expected (0xff--) instead of %.8x\n", l_current_marker); 7158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Get the marker handler from the marker ID */ 7162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_handler = opj_j2k_get_marker_handler(l_current_marker); 7163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Manage case where marker is unknown */ 7165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_marker_handler->id == J2K_MS_UNK) { 7166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)){ 7167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Unknow marker have been detected and generated error.\n"); 7168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_current_marker == J2K_MS_SOT) 7172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; /* SOT marker is detected main header is completely read */ 7173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else /* Get the marker handler from the marker ID */ 7174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_handler = opj_j2k_get_marker_handler(l_current_marker); 7175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_marker_handler->id == J2K_MS_SIZ) { 7178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Mark required SIZ marker as found */ 7179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_has_siz = 1; 7180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_marker_handler->id == J2K_MS_COD) { 7182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Mark required COD marker as found */ 7183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_has_cod = 1; 7184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_marker_handler->id == J2K_MS_QCD) { 7186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Mark required QCD marker as found */ 7187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_has_qcd = 1; 7188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if the marker is known and if it is the right place to find it */ 7191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) { 7192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n"); 7193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */ 7197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { 7198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* read 2 bytes as the marker size */ 7203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2); 72044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (l_marker_size < 2) { 72054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n"); 72064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return OPJ_FALSE; 72074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_size -= 2; /* Subtract the size of the marker ID already read */ 7209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if the marker size is compatible with the header data size */ 7211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) { 7212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size); 7213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_data) { 7214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_decoder.m_header_data); 7215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data = NULL; 7216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data_size = 0; 7217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n"); 7218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data; 7221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size; 7222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read the rest of the marker segment from stream and copy them into the buffer */ 7225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 7226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read the marker segment with the correct marker handler */ 7231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) { 7232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Marker handler function failed to read the marker segment\n"); 7233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Add the marker to the codestream index*/ 7237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (OPJ_FALSE == opj_j2k_add_mhmarker( 7238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index, 7239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_handler->id, 7240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4, 7241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_size + 4 )) { 7242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); 7243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */ 7247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { 7248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* read 2 bytes as the new marker ID */ 7253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2); 7254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_has_siz == 0) { 7257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "required SIZ marker not found in main header\n"); 7258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 7259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_has_cod == 0) { 7261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "required COD marker not found in main header\n"); 7262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 7263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_has_qcd == 0) { 7265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "required QCD marker not found in main header\n"); 7266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 7267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) { 7270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n"); 7271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n"); 7275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Position of the last element if the main header */ 7277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2; 7278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Next step: read a tile-part header */ 7280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT; 7281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 7283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k, 7286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_procedure_list_t * p_procedure_list, 7287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 7288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 7289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL (** l_procedure) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *) = 00; 7291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL l_result = OPJ_TRUE; 7292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_proc, i; 7293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 7295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_procedure_list != 00); 7296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 7297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 7298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 7299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list); 7301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_procedure = (OPJ_BOOL (**) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list); 7302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_proc;++i) { 7304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_result = l_result && ((*l_procedure) (p_j2k,p_stream,p_manager)); 7305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_procedure; 7306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* and clear the procedure list at the end.*/ 7309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_procedure_list_clear(p_procedure_list); 7310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return l_result; 7311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* FIXME DOC*/ 7314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2k, 7315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 7316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 7317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 7318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = 00; 7320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_default_tcp = 00; 7321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles; 7322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i,j; 7323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_current_tccp = 00; 7324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tccp_size; 7325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_mct_size; 7326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * l_image; 7327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_mcc_records_size,l_mct_records_size; 7328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec; 7329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec; 7330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_offset; 7331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 7333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 7334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 7335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 7336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image = p_j2k->m_private_image; 7338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; 7339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_cp.tcps; 7340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t); 7341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp; 7342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32); 7343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* For each tile */ 7345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0; i<l_nb_tiles; ++i) { 7346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/ 7347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_tccp = l_tcp->tccps; 7348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*Copy default coding parameters into the current tile coding parameters*/ 7349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t)); 7350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Initialize some values of the current tile coding parameters*/ 7351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->cod = 0; 7352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->ppt = 0; 7353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->ppt_data = 00; 7354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Remove memory not owned by this tile in case of early error return. */ 7355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->m_mct_decoding_matrix = 00; 7356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->m_nb_max_mct_records = 0; 7357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->m_mct_records = 00; 7358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->m_nb_max_mcc_records = 0; 7359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->m_mcc_records = 00; 7360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/ 7361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->tccps = l_current_tccp; 7362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/ 7364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_default_tcp->m_mct_decoding_matrix) { 7365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size); 7366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_tcp->m_mct_decoding_matrix ) { 7367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_tcp->m_mct_decoding_matrix,l_default_tcp->m_mct_decoding_matrix,l_mct_size); 7370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/ 7373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(opj_mct_data_t); 7374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size); 7375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_tcp->m_mct_records) { 7376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records,l_mct_records_size); 7379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Copy the mct record data from dflt_tile_cp to the current tile*/ 7381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_mct_rec = l_default_tcp->m_mct_records; 7382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_mct_rec = l_tcp->m_mct_records; 7383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_default_tcp->m_nb_mct_records;++j) { 7385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_src_mct_rec->m_data) { 7387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size); 7389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(! l_dest_mct_rec->m_data) { 7390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_dest_mct_rec->m_data,l_src_mct_rec->m_data,l_src_mct_rec->m_data_size); 7393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_src_mct_rec; 7396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_dest_mct_rec; 7397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Update with each pass to free exactly what has been allocated on early return. */ 7398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->m_nb_max_mct_records += 1; 7399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/ 7402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(opj_simple_mcc_decorrelation_data_t); 7403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(l_mcc_records_size); 7404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_tcp->m_mcc_records) { 7405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_tcp->m_mcc_records,l_default_tcp->m_mcc_records,l_mcc_records_size); 7408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tcp->m_nb_max_mcc_records = l_default_tcp->m_nb_max_mcc_records; 7409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Copy the mcc record data from dflt_tile_cp to the current tile*/ 7411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_mcc_rec = l_default_tcp->m_mcc_records; 7412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_mcc_rec = l_tcp->m_mcc_records; 7413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_default_tcp->m_nb_max_mcc_records;++j) { 7415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_src_mcc_rec->m_decorrelation_array) { 7417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array - l_default_tcp->m_mct_records); 7418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset; 7419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_src_mcc_rec->m_offset_array) { 7422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array - l_default_tcp->m_mct_records); 7423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset; 7424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_src_mcc_rec; 7427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_dest_mcc_rec; 7428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Copy all the dflt_tile_compo_cp to the current tile cp */ 7431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_current_tccp,l_default_tcp->tccps,l_tccp_size); 7432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Move to next tile cp*/ 7434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 7435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Create the current tile decoder*/ 7438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_tcd = (opj_tcd_t*)opj_tcd_create(OPJ_TRUE); /* FIXME why a cast ? */ 7439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_j2k->m_tcd ) { 7440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp)) ) { 7444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_destroy(p_j2k->m_tcd); 7445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_tcd = 00; 7446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n"); 7447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 7451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler (OPJ_UINT32 p_id) 7454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_dec_memory_marker_handler_t *e; 7456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) { 7457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (e->id == p_id) { 7458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; /* we find a handler corresponding to the marker ID*/ 7459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return e; 7462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid opj_j2k_destroy (opj_j2k_t *p_j2k) 7465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k == 00) { 7467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 7468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_is_decoder) { 7471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) { 7473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp); 7474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp); 7475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp = 00; 7476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) { 7479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_decoder.m_header_data); 7480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data = 00; 7481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data_size = 0; 7482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 7485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) { 7487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data); 7488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00; 7489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) { 7492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer); 7493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00; 7494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00; 7495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) { 7498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 7499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00; 7500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 7501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_destroy(p_j2k->m_tcd); 7505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_cp_destroy(&(p_j2k->m_cp)); 7507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memset(&(p_j2k->m_cp),0,sizeof(opj_cp_t)); 7508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_procedure_list_destroy(p_j2k->m_procedure_list); 7510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_procedure_list = 00; 7511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_procedure_list_destroy(p_j2k->m_validation_list); 7513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_procedure_list = 00; 7514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k_destroy_cstr_index(p_j2k->cstr_index); 7516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index = NULL; 7517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_destroy(p_j2k->m_private_image); 7519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image = NULL; 7520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_destroy(p_j2k->m_output_image); 7522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_output_image = NULL; 7523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k); 7525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind) 7528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_cstr_ind) { 7530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_cstr_ind->marker) { 7532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_cstr_ind->marker); 7533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_cstr_ind->marker = NULL; 7534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_cstr_ind->tile_index) { 7537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_tile = 0; 7538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_tile=0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) { 7540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(p_cstr_ind->tile_index[it_tile].packet_index) { 7542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_cstr_ind->tile_index[it_tile].packet_index); 7543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_cstr_ind->tile_index[it_tile].packet_index = NULL; 7544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(p_cstr_ind->tile_index[it_tile].tp_index){ 7547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_cstr_ind->tile_index[it_tile].tp_index); 7548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_cstr_ind->tile_index[it_tile].tp_index = NULL; 7549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(p_cstr_ind->tile_index[it_tile].marker){ 7552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_cstr_ind->tile_index[it_tile].marker); 7553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_cstr_ind->tile_index[it_tile].marker = NULL; 7554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( p_cstr_ind->tile_index); 7559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_cstr_ind->tile_index = NULL; 7560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_cstr_ind); 7563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp) 7567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp == 00) { 7569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 7570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->ppt_markers != 00) { 7573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 i; 7574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0U; i < p_tcp->ppt_markers_count; ++i) { 7575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->ppt_markers[i].m_data != NULL) { 7576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->ppt_markers[i].m_data); 7577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_markers_count = 0U; 7580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->ppt_markers); 7581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_markers = NULL; 7582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->ppt_buffer != 00) { 7585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->ppt_buffer); 7586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->ppt_buffer = 00; 7587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->tccps != 00) { 7590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->tccps); 7591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->tccps = 00; 7592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->m_mct_coding_matrix != 00) { 7595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->m_mct_coding_matrix); 7596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->m_mct_coding_matrix = 00; 7597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->m_mct_decoding_matrix != 00) { 7600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->m_mct_decoding_matrix); 7601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->m_mct_decoding_matrix = 00; 7602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->m_mcc_records) { 7605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->m_mcc_records); 7606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->m_mcc_records = 00; 7607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->m_nb_max_mcc_records = 0; 7608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->m_nb_mcc_records = 0; 7609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->m_mct_records) { 7612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_mct_data_t * l_mct_data = p_tcp->m_mct_records; 7613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 i; 7614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i=0;i<p_tcp->m_nb_mct_records;++i) { 7616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_mct_data->m_data) { 7617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(l_mct_data->m_data); 7618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_mct_data->m_data = 00; 7619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++l_mct_data; 7622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->m_mct_records); 7625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->m_mct_records = 00; 7626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_tcp->mct_norms != 00) { 7629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_tcp->mct_norms); 7630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_tcp->mct_norms = 00; 7631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_j2k_tcp_data_destroy(p_tcp); 7634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp) 7638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_tcp->m_data) { 7640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_tcp->m_data); 7641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_data = NULL; 7642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tcp->m_data_size = 0; 7643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_cp_destroy (opj_cp_t *p_cp) 7647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_nb_tiles; 7649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_tcp_t * l_current_tile = 00; 7650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_cp == 00) 7652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 7653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 7654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_cp->tcps != 00) 7656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 7657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 i; 7658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_current_tile = p_cp->tcps; 7659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_nb_tiles = p_cp->th * p_cp->tw; 7660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0U; i < l_nb_tiles; ++i) 7662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 7663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_j2k_tcp_destroy(l_current_tile); 7664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ++l_current_tile; 7665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_cp->tcps); 7667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->tcps = 00; 7668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_cp->ppm_markers != 00) { 7670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 i; 7671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0U; i < p_cp->ppm_markers_count; ++i) { 7672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_cp->ppm_markers[i].m_data != NULL) { 7673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_cp->ppm_markers[i].m_data); 7674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_markers_count = 0U; 7677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_cp->ppm_markers); 7678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_markers = NULL; 7679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_cp->ppm_buffer); 7681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_buffer = 00; 7682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->ppm_data = NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */ 7683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_cp->comment); 7684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->comment = 00; 7685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! p_cp->m_is_decoder) 7686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 7687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(p_cp->m_specific_param.m_enc.m_matrice); 7688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_cp->m_specific_param.m_enc.m_matrice = 00; 7689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 7691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic 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 ) 7693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 7694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_BYTE l_header_data[10]; 7695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_OFF_T l_stream_pos_backup; 7696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_current_marker; 7697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_marker_size; 7698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts; 7699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* initialize to no correction needed */ 7701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *p_correction_needed = OPJ_FALSE; 7702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_stream_pos_backup = opj_stream_tell(p_stream); 7704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_stream_pos_backup == -1) { 7705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* let's do nothing */ 7706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 7707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (;;) { 7710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */ 7711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (opj_stream_read_data(p_stream,l_header_data, 2, p_manager) != 2) { 7712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* assume all is OK */ 7713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) { 7714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 7717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* Read 2 bytes from buffer as the new marker ID */ 7720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(l_header_data, &l_current_marker, 2); 7721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_current_marker != J2K_MS_SOT) { 7723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* assume all is OK */ 7724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) { 7725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 7728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */ 7731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) { 7732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* Read 2 bytes from the buffer as the marker size */ 7737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_read_bytes(l_header_data, &l_marker_size, 2); 7738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* Check marker size for SOT Marker */ 7740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_marker_size != 10) { 7741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n"); 7742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_marker_size -= 2; 7745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (opj_stream_read_data(p_stream, l_header_data, l_marker_size, p_manager) != l_marker_size) { 7747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 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)) { 7752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_tile_no == tile_no) { 7756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* we found what we were looking for */ 7757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 7758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((l_tot_len == 0U) || (l_tot_len < 14U)) { 7761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* last SOT until EOC or invalid Psot value */ 7762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* assume all is OK */ 7763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) { 7764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 7767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_tot_len -= 12U; 7769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* look for next SOT marker */ 7770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len), p_manager) != (OPJ_OFF_T)(l_tot_len)) { 7771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* assume all is OK */ 7772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) { 7773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 7776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* check for correction */ 7780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_current_part == l_num_parts) { 7781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *p_correction_needed = OPJ_TRUE; 7782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) { 7785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 7788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 7789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7790ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_read_tile_header( opj_j2k_t * p_j2k, 7791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_tile_index, 7792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_size, 7793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0, 7794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1, 7795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_nb_comps, 7796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL * p_go_on, 7797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 7798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 7799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_marker = J2K_MS_SOT; 7801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_marker_size; 7802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const opj_dec_memory_marker_handler_t * l_marker_handler = 00; 7803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = NULL; 7804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 7806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 7807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 7808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 7809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Reach the End Of Codestream ?*/ 7811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC){ 7812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_marker = J2K_MS_EOC; 7813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* We need to encounter a SOT marker (a new tile-part header) */ 7815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT){ 7816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */ 7820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while ( (!p_j2k->m_specific_param.m_decoder.m_can_decode) && (l_current_marker != J2K_MS_EOC) ) { 7821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read until the Start Of Data is detected */ 7823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (l_current_marker != J2K_MS_SOD) { 7824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(opj_stream_get_number_byte_left(p_stream) == 0) 7826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 7827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC; 7828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 7829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */ 7832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { 7833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read 2 bytes from the buffer as the marker size */ 7838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2); 7839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Check marker size (does not include marker ID but includes marker size) */ 7841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_marker_size < 2) { 7842e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n"); 7843e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 7844e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7845e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */ 7847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_current_marker == 0x8080 && opj_stream_get_number_byte_left(p_stream) == 0) { 7848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC; 7849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 7850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Why this condition? FIXME */ 7853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH){ 7854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2); 7855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_size -= 2; /* Subtract the size of the marker ID already read */ 7857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Get the marker handler from the marker ID */ 7859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_handler = opj_j2k_get_marker_handler(l_current_marker); 7860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if the marker is known and if it is the right place to find it */ 7862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) { 7863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n"); 7864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* FIXME manage case of unknown marker as in the main header ? */ 7867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if the marker size is compatible with the header data size */ 7869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) { 7870e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_BYTE *new_header_data = NULL; 7871e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* If we are here, this means we consider this marker as known & we will read it */ 7872e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Check enough bytes left in stream before allocation */ 7873e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((OPJ_OFF_T)l_marker_size > opj_stream_get_number_byte_left(p_stream)) { 7874e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Marker size inconsistent with stream length\n"); 7875e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 7876e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 7877e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size); 7878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! new_header_data) { 7879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_decoder.m_header_data); 7880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data = NULL; 7881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data_size = 0; 7882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n"); 7883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data; 7886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size; 7887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read the rest of the marker segment from stream and copy them into the buffer */ 7890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 7891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_marker_handler->handler) { 7896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* See issue #175 */ 7897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n"); 7898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read the marker segment with the correct marker handler */ 7901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) { 7902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Fail to read the current marker segment (%#x)\n", l_current_marker); 7903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Add the marker to the codestream index*/ 7907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number, 7908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index, 7909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_handler->id, 7910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4, 7911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_marker_size + 4 )) { 7912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); 7913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Keep the position of the last SOT marker read */ 7917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( l_marker_handler->id == J2K_MS_SOT ) { 7918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4 ; 7919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos) 7920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 7921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos; 7922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_skip_data) { 7926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Skip the rest of the tile part header*/ 7927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 7928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */ 7932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 7934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/ 7935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { 7936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read 2 bytes from the buffer as the new marker ID */ 7940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2); 7941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(opj_stream_get_number_byte_left(p_stream) == 0 7944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) 7945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 7946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If we didn't skip data before, we need to read the SOD marker*/ 7948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_j2k->m_specific_param.m_decoder.m_skip_data) { 7949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read the SOD marker and skip data ? FIXME */ 7950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) { 7951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_j2k->m_specific_param.m_decoder.m_can_decode && !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) { 7954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* Issue 254 */ 7955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_BOOL l_correction_needed; 7956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1; 7958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if(!opj_j2k_need_nb_tile_parts_correction(p_stream, p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) { 7959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "opj_j2k_apply_nb_tile_parts_correction error\n"); 7960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 7961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_correction_needed) { 7963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th; 7964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_tile_no; 7965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_j2k->m_specific_param.m_decoder.m_can_decode = 0; 7967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1; 7968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* correct tiles */ 7969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) { 7970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) { 7971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts+=1; 7972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_WARNING, "Non conformant codestream TPsot==TNsot.\n"); 7975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 7977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_j2k->m_specific_param.m_decoder.m_can_decode){ 7978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */ 7979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { 7980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read 2 bytes from buffer as the new marker ID */ 7985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2); 7986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 7989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Indicate we will try to read a new tile-part header*/ 7990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_skip_data = 0; 7991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_can_decode = 0; 7992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT; 7993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */ 7995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { 7996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 7997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 7998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 7999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Read 2 bytes from buffer as the new marker ID */ 8001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2); 8002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Current marker is the EOC marker ?*/ 8006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_current_marker == J2K_MS_EOC) { 8007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC ){ 8008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_current_tile_number = 0; 8009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC; 8010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FIXME DOC ???*/ 8014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ! p_j2k->m_specific_param.m_decoder.m_can_decode) { 8015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; 8016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number; 8017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while( (p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00) ) { 8019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_j2k->m_current_tile_number; 8020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 8021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_current_tile_number == l_nb_tiles) { 8024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_go_on = OPJ_FALSE; 8025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number, p_manager)) { 8030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n"); 8031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 8032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 8033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*FIXME ???*/ 8034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number, p_manager)) { 8035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n"); 8036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n", 8040e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov p_j2k->m_current_tile_number+1, (p_j2k->m_cp.th * p_j2k->m_cp.tw)); 8041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_tile_index = p_j2k->m_current_tile_number; 8043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_go_on = OPJ_TRUE; 8044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd); 80454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (*p_data_size == (OPJ_UINT32)-1) { 80464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return OPJ_FALSE; 80474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 80484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0; 8050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0; 8051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1; 8052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1; 8053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps; 8054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state |= 0x0080;/* FIXME J2K_DEC_STATE_DATA;*/ 8056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8060ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_decode_tile ( opj_j2k_t * p_j2k, 8061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_index, 8062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 8063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_data_size, 8064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 8065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 8066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_marker; 8068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE l_data [2]; 8069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp; 8070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 8072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 8073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 8074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 8075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !(p_j2k->m_specific_param.m_decoder.m_state & 0x0080/*FIXME J2K_DEC_STATE_DATA*/) 8077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov || (p_tile_index != p_j2k->m_current_tile_number) ) { 8078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]); 8082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_tcp->m_data) { 8083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_tcp_destroy(l_tcp); 8084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_tcd_decode_tile( p_j2k->m_tcd, 8088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_data, 8089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp->m_data_size, 8090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_tile_index, 8091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann p_j2k->cstr_index, p_manager) ) { 8092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_tcp_destroy(l_tcp); 8093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/*FIXME J2K_DEC_STATE_ERR;*/ 8094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n"); 8095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size)) { 8099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access) 8103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * we destroy just the data which will be re-read in read_tile_header*/ 8104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*opj_j2k_tcp_destroy(l_tcp); 8105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_tcd->tcp = 0;*/ 8106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_tcp_data_destroy(l_tcp); 8107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_can_decode = 0; 8109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state &= (~ (0x0080u));/* FIXME J2K_DEC_STATE_DATA);*/ 8110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(opj_stream_get_number_byte_left(p_stream) == 0 8112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC){ 8113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_state != 0x0100){ /*FIXME J2K_DEC_STATE_EOC)*/ 8117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) { 8118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); 8119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_data,&l_current_marker,2); 8123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_current_marker == J2K_MS_EOC) { 8125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_current_tile_number = 0; 8126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = 0x0100;/*FIXME J2K_DEC_STATE_EOC;*/ 8127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if (l_current_marker != J2K_MS_SOT) 8129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 8130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(opj_stream_get_number_byte_left(p_stream) == 0) { 8131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC; 8132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n"); 8133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n"); 8136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image) 8144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i,j,k = 0; 8146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_width_src,l_height_src; 8147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_width_dest,l_height_dest; 8148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src; 8149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_SIZE_T l_start_offset_src, l_line_offset_src, l_end_offset_src ; 8150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_start_x_dest , l_start_y_dest; 8151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest; 8152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann OPJ_SIZE_T l_start_offset_dest, l_line_offset_dest; 8153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t * l_img_comp_src = 00; 8155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t * l_img_comp_dest = 00; 8156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_tilecomp_t * l_tilec = 00; 8158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * l_image_src = 00; 8159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_size_comp, l_remaining; 8160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dest_ptr; 8161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_resolution_t* l_res= 00; 8162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tilec = p_tcd->tcd_image->tiles->comps; 8164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_image_src = p_tcd->image; 8165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp_src = l_image_src->comps; 8166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp_dest = p_output_image->comps; 8168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0; i<l_image_src->numcomps; i++) { 8170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Allocate output component buffer if necessary */ 8172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_img_comp_dest->data) { 8173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32 width = l_img_comp_dest->w; 8174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32 height = l_img_comp_dest->h; 8175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const OPJ_UINT32 MAX_SIZE = UINT32_MAX / sizeof(OPJ_INT32); 8176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (height == 0 || width > MAX_SIZE / height) { 8177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 8178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 8179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_img_comp_dest->data = (OPJ_INT32*)opj_calloc(width * height, sizeof(OPJ_INT32)); 8180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!l_img_comp_dest->data) { 8181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 8182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 8183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Copy info from decoded comp image to output image */ 8186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded; 8187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*-----*/ 8189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Compute the precision of the output buffer */ 8190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_size_comp = l_img_comp_src->prec >> 3; /*(/ 8)*/ 8191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_remaining = l_img_comp_src->prec & 7; /* (%8) */ 8192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_res = l_tilec->resolutions + l_img_comp_src->resno_decoded; 8193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_remaining) { 8195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_size_comp; 8196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_size_comp == 3) { 8199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_size_comp = 4; 8200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*-----*/ 8202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Current tile component size*/ 8204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*if (i == 0) { 8205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n", 8206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_res->x0, l_res->x1, l_res->y0, l_res->y1); 8207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }*/ 8208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_width_src = (OPJ_UINT32)(l_res->x1 - l_res->x0); 8210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_height_src = (OPJ_UINT32)(l_res->y1 - l_res->y0); 8211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Border of the current output component*/ 8213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor); 8214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor); 8215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_x1_dest = l_x0_dest + l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */ 8216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_y1_dest = l_y0_dest + l_img_comp_dest->h; 8217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*if (i == 0) { 8219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n", 8220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor ); 8221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }*/ 8222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*-----*/ 8224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src) 8225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * of the input buffer (decoded tile component) which will be move 8226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * in the output buffer. Compute the area of the output buffer (l_start_x_dest, 8227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * l_start_y_dest, l_width_dest, l_height_dest) which will be modified 8228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * by this input area. 8229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * */ 8230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert( l_res->x0 >= 0); 8231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert( l_res->x1 >= 0); 82324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 82334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann /* Prevent bad casting to unsigned values in the subsequent lines. */ 82344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ( l_res->x0 < 0 || l_res->x1 < 0 || l_res->y0 < 0 || l_res->y1 < 0 ) { 82354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return OPJ_FALSE; 82364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 82374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( l_x0_dest < (OPJ_UINT32)l_res->x0 ) { 8239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest; 8240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_x0_src = 0; 8241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) { 8243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_width_dest = l_width_src; 8244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_x1_src = 0; 8245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_width_dest = l_x1_dest - (OPJ_UINT32)l_res->x0 ; 8248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest); 8249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_start_x_dest = 0U; 8253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_x0_src = (OPJ_INT32)l_x0_dest - l_res->x0; 8254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) { 8256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src; 8257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_x1_src = 0; 8258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_width_dest = l_img_comp_dest->w ; 8261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_x1_src = l_res->x1 - (OPJ_INT32)l_x1_dest; 8262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( l_y0_dest < (OPJ_UINT32)l_res->y0 ) { 8266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_start_y_dest = (OPJ_UINT32)l_res->y0 - l_y0_dest; 8267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_y0_src = 0; 8268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) { 8270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_height_dest = l_height_src; 8271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_y1_src = 0; 8272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_height_dest = l_y1_dest - (OPJ_UINT32)l_res->y0 ; 8275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_y1_src = (OPJ_INT32)(l_height_src - l_height_dest); 8276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_start_y_dest = 0U; 8280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_y0_src = (OPJ_INT32)l_y0_dest - l_res->y0; 8281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) { 8283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src; 8284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_y1_src = 0; 8285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_height_dest = l_img_comp_dest->h ; 8288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_y1_src = l_res->y1 - (OPJ_INT32)l_y1_dest; 8289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( (l_offset_x0_src < 0 ) || (l_offset_y0_src < 0 ) || (l_offset_x1_src < 0 ) || (l_offset_y1_src < 0 ) ){ 8293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* testcase 2977.pdf.asan.67.2198 */ 8296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) { 8297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*-----*/ 8300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Compute the input buffer offset */ 8302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src * (OPJ_SIZE_T)l_width_src; 8303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_line_offset_src = (OPJ_SIZE_T)l_offset_x1_src + (OPJ_SIZE_T)l_offset_x0_src; 8304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_end_offset_src = (OPJ_SIZE_T)l_offset_y1_src * (OPJ_SIZE_T)l_width_src - (OPJ_SIZE_T)l_offset_x0_src; 8305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Compute the output buffer offset */ 8307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 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; 8308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_line_offset_dest = (OPJ_SIZE_T)l_img_comp_dest->w - (OPJ_SIZE_T)l_width_dest; 8309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Move the output buffer to the first place where we will write*/ 8311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest; 8312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*if (i == 0) { 8314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(stdout, "COMPO[%d]:\n",i); 8315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(stdout, "SRC: l_start_x_src=%d, l_start_y_src=%d, l_width_src=%d, l_height_src=%d\n" 8316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "\t tile offset:%d, %d, %d, %d\n" 8317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "\t buffer offset: %d; %d, %d\n", 8318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_res->x0, l_res->y0, l_width_src, l_height_src, 8319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src, 8320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_start_offset_src, l_line_offset_src, l_end_offset_src); 8321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(stdout, "DEST: l_start_x_dest=%d, l_start_y_dest=%d, l_width_dest=%d, l_height_dest=%d\n" 8323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "\t start offset: %d, line offset= %d\n", 8324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_start_x_dest, l_start_y_dest, l_width_dest, l_height_dest, l_start_offset_dest, l_line_offset_dest); 8325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }*/ 8326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (l_size_comp) { 8328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 8329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 8330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_CHAR * l_src_ptr = (OPJ_CHAR*) p_data; 8331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_start_offset_src; /* Move to the first place where we will read*/ 8332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_img_comp_src->sgnd) { 8334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j = 0 ; j < l_height_dest ; ++j) { 8335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( k = 0 ; k < l_width_dest ; ++k) { 8336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++)); /* Copy only the data needed for the output image */ 8337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_ptr+= l_line_offset_dest; /* Move to the next place where we will write */ 8340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_line_offset_src ; /* Move to the next place where we will read */ 8341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( j = 0 ; j < l_height_dest ; ++j ) { 8345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( k = 0 ; k < l_width_dest ; ++k) { 8346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr++) = (OPJ_INT32) ((*(l_src_ptr++))&0xff); 8347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_ptr+= l_line_offset_dest; 8350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_line_offset_src; 8351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_end_offset_src; /* Move to the end of this component-part of the input buffer */ 8355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data = (OPJ_BYTE*) l_src_ptr; /* Keep the current position for the next component-part */ 8356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 8358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 8359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 8360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_data; 8361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_start_offset_src; 8362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_img_comp_src->sgnd) { 8364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_height_dest;++j) { 8365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k=0;k<l_width_dest;++k) { 8366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr++) = *(l_src_ptr++); 8367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_ptr+= l_line_offset_dest; 8370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_line_offset_src ; 8371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_height_dest;++j) { 8375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k=0;k<l_width_dest;++k) { 8376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff; 8377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_ptr+= l_line_offset_dest; 8380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_line_offset_src ; 8381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_end_offset_src; 8385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data = (OPJ_BYTE*) l_src_ptr; 8386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 8388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 4: 8389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 8390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_data; 8391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_start_offset_src; 8392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_height_dest;++j) { 8394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k=0;k<l_width_dest;++k) { 8395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr++) = (*(l_src_ptr++)); 8396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_dest_ptr+= l_line_offset_dest; 8399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_line_offset_src ; 8400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_end_offset_src; 8403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data = (OPJ_BYTE*) l_src_ptr; 8404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 8406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_img_comp_dest; 8409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_img_comp_src; 8410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tilec; 8411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8416ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_set_decode_area( opj_j2k_t *p_j2k, 8417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t* p_image, 8418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 p_start_x, OPJ_INT32 p_start_y, 8419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 p_end_x, OPJ_INT32 p_end_y, 8420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 8421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t * l_cp = &(p_j2k->m_cp); 8423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * l_image = p_j2k->m_private_image; 8424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_comp; 8426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 l_comp_x1, l_comp_y1; 8427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t* l_img_comp = NULL; 8428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if we are read the main header */ 8430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) { /* FIXME J2K_DEC_STATE_TPHSOT)*/ 8431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Need to decode the main header before begin to decode the remaining codestream"); 8432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !p_start_x && !p_start_y && !p_end_x && !p_end_y){ 8436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_INFO, "No decoded area parameters, set the decoded area to the whole image\n"); 8437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0; 8439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0; 8440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw; 8441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th; 8442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ----- */ 8447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if the positions provided by the user are correct */ 8448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Left */ 8450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_start_x >= 0 ); 8451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_start_y >= 0 ); 8452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((OPJ_UINT32)p_start_x > l_image->x1 ) { 8454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 8455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n", 8456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_start_x, l_image->x1); 8457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ((OPJ_UINT32)p_start_x < l_image->x0){ 8460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 8461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n", 8462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_start_x, l_image->x0); 8463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0; 8464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x0 = l_image->x0; 8465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x - l_cp->tx0) / l_cp->tdx; 8468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x0 = (OPJ_UINT32)p_start_x; 8469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Up */ 8472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((OPJ_UINT32)p_start_y > l_image->y1){ 8473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 8474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n", 8475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_start_y, l_image->y1); 8476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ((OPJ_UINT32)p_start_y < l_image->y0){ 8479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 8480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n", 8481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_start_y, l_image->y0); 8482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0; 8483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->y0 = l_image->y0; 8484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y - l_cp->ty0) / l_cp->tdy; 8487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->y0 = (OPJ_UINT32)p_start_y; 8488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Right */ 8491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert((OPJ_UINT32)p_end_x > 0); 8492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert((OPJ_UINT32)p_end_y > 0); 8493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((OPJ_UINT32)p_end_x < l_image->x0) { 8494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 8495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n", 8496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_end_x, l_image->x0); 8497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ((OPJ_UINT32)p_end_x > l_image->x1) { 8500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 8501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n", 8502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_end_x, l_image->x1); 8503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw; 8504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x1 = l_image->x1; 8505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 8508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x1 = (OPJ_UINT32)p_end_x; 8509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Bottom */ 8512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((OPJ_UINT32)p_end_y < l_image->y0) { 8513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 8514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n", 8515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_end_y, l_image->y0); 8516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((OPJ_UINT32)p_end_y > l_image->y1){ 8519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, 8520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n", 8521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_end_y, l_image->y1); 8522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th; 8523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->y1 = l_image->y1; 8524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else{ 8526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 8527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->y1 = (OPJ_UINT32)p_end_y; 8528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ----- */ 8530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1; 8532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp = p_image->comps; 8534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_comp=0; it_comp < p_image->numcomps; ++it_comp) 8535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 8536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 l_h,l_w; 8537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 853833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx); 853933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy); 8540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx); 8541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy); 8542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor) 8544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor); 8545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_w < 0){ 8546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 8547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n", 8548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov it_comp, l_w); 8549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->w = (OPJ_UINT32)l_w; 8552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor) 8554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor); 8555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_h < 0){ 8556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 8557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n", 8558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov it_comp, l_h); 8559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->h = (OPJ_UINT32)l_h; 8562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp++; 8564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg( p_manager, EVT_INFO,"Setting decoding area to %d,%d,%d,%d\n", 8567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x0, p_image->y0, p_image->x1, p_image->y1); 8568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovopj_j2k_t* opj_j2k_create_decompress(void) 8573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1,sizeof(opj_j2k_t)); 8575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_j2k) { 8576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 00; 8577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_is_decoder = 1; 8580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_cp.m_is_decoder = 1; 8581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef OPJ_DISABLE_TPSOT_FIX 8583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1; 8584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 8585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 8586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,sizeof(opj_tcp_t)); 8587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) { 8588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_destroy(l_j2k); 8589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 00; 8590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,OPJ_J2K_DEFAULT_HEADER_SIZE); 8593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_j2k->m_specific_param.m_decoder.m_header_data) { 8594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_destroy(l_j2k); 8595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 00; 8596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_specific_param.m_decoder.m_header_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE; 8599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ; 8601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ; 8603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* codestream index creation */ 8605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->cstr_index = opj_j2k_create_cstr_index(); 8606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_j2k->cstr_index){ 8607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_destroy(l_j2k); 8608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 00; 8609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* validation list creation */ 8612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_validation_list = opj_procedure_list_create(); 8613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_j2k->m_validation_list) { 8614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_destroy(l_j2k); 8615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 00; 8616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* execution list creation */ 8619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_j2k->m_procedure_list = opj_procedure_list_create(); 8620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_j2k->m_procedure_list) { 8621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_destroy(l_j2k); 8622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 00; 8623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return l_j2k; 8626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic opj_codestream_index_t* opj_j2k_create_cstr_index(void) 8629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_codestream_index_t* cstr_index = (opj_codestream_index_t*) 8631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_calloc(1,sizeof(opj_codestream_index_t)); 8632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!cstr_index) 8633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 8634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->maxmarknum = 100; 8636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marknum = 0; 8637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker = (opj_marker_info_t*) 8638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t)); 8639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!cstr_index-> marker) { 8640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(cstr_index); 8641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 8642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 8643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index = NULL; 8645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return cstr_index; 8647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size ( opj_j2k_t *p_j2k, 8650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 8651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no ) 8652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 8654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 8655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = 00; 8656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 8658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 8659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 8661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &l_cp->tcps[p_tile_no]; 8662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = &l_tcp->tccps[p_comp_no]; 8663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions again */ 8665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_tile_no < (l_cp->tw * l_cp->th)); 8666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_comp_no < p_j2k->m_private_image->numcomps); 8667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->csty & J2K_CCP_CSTY_PRT) { 8669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 5 + l_tccp->numresolutions; 8670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 5; 8673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_SPCod_SPCoc( opj_j2k_t *p_j2k, 8677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 8678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 8679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 8680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_header_size, 8681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 8682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 8684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 8685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 8686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = 00; 8687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 8689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 8690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_size != 00); 8691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 8692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_data != 00); 8693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 8695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &l_cp->tcps[p_tile_no]; 8696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = &l_tcp->tccps[p_comp_no]; 8697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions again */ 8699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_tile_no < (l_cp->tw * l_cp->th)); 8700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_comp_no <(p_j2k->m_private_image->numcomps)); 8701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*p_header_size < 5) { 8703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n"); 8704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,l_tccp->numresolutions - 1, 1); /* SPcoc (D) */ 8708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,l_tccp->cblkw - 2, 1); /* SPcoc (E) */ 8711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,l_tccp->cblkh - 2, 1); /* SPcoc (F) */ 8714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,l_tccp->cblksty, 1); /* SPcoc (G) */ 8717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,l_tccp->qmfbid, 1); /* SPcoc (H) */ 8720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_header_size = *p_header_size - 5; 8723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->csty & J2K_CCP_CSTY_PRT) { 8725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*p_header_size < l_tccp->numresolutions) { 8727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n"); 8728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_tccp->numresolutions; ++i) { 8732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,l_tccp->prcw[i] + (l_tccp->prch[i] << 4), 1); /* SPcoc (I_i) */ 8733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_header_size = *p_header_size - l_tccp->numresolutions; 8737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_SPCod_SPCoc( opj_j2k_t *p_j2k, 8743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno, 8744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_header_data, 8745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_header_size, 8746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 8747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i, l_tmp; 8749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = NULL; 8750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = NULL; 8751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = NULL; 8752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_ptr = NULL; 8753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 8755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 8756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 8757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 8758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 8760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? 8761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_cp->tcps[p_j2k->m_current_tile_number] : 8762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 8763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* precondition again */ 87654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (compno >= p_j2k->m_private_image->numcomps) { 87664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return OPJ_FALSE; 87674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = &l_tcp->tccps[compno]; 8770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr = p_header_data; 8771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* make sure room is sufficient */ 8773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*p_header_size < 5) { 8774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n"); 8775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr, &l_tccp->numresolutions ,1); /* SPcox (D) */ 8779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tccp->numresolutions; /* tccp->numresolutions = read() + 1 */ 8780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) { 8781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, 8782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n", 8783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->numresolutions, OPJ_J2K_MAXRLVLS); 8784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 8787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If user wants to remove more resolutions than the codestream contains, return error */ 8789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) { 8790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number " 8791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno); 8792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/* FIXME J2K_DEC_STATE_ERR;*/ 8793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr,&l_tccp->cblkw ,1); /* SPcoc (E) */ 8797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 8798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->cblkw += 2; 8799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr,&l_tccp->cblkh ,1); /* SPcoc (F) */ 8801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 8802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->cblkh += 2; 8803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((l_tccp->cblkw > 10) || (l_tccp->cblkh > 10) || ((l_tccp->cblkw + l_tccp->cblkh) > 12)) { 8805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element, Invalid cblkw/cblkh combination\n"); 8806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 8807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 8808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 8809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 8810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1); /* SPcoc (G) */ 8811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 8812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1); /* SPcoc (H) */ 8814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 8815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_header_size = *p_header_size - 5; 8817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* use custom precinct size ? */ 8819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->csty & J2K_CCP_CSTY_PRT) { 8820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*p_header_size < l_tccp->numresolutions) { 8821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n"); 8822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_tccp->numresolutions; ++i) { 8826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr,&l_tmp ,1); /* SPcoc (I_i) */ 8827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 8828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */ 8829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) { 8830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n"); 8831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 8832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 8833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->prcw[i] = l_tmp & 0xf; 8834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->prch[i] = l_tmp >> 4; 8835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_header_size = *p_header_size - l_tccp->numresolutions; 8838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* set default size for the precinct width and height */ 8841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < l_tccp->numresolutions; ++i) { 8842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->prcw[i] = 15; 8843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->prch[i] = 15; 8844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef WIP_REMOVE_MSD 8848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* INDEX >> */ 8849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->cstr_info && compno == 0) { 8850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32); 8851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh = l_tccp->cblkh; 8853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw = l_tccp->cblkw; 8854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions = l_tccp->numresolutions; 8855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty = l_tccp->cblksty; 8856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid = l_tccp->qmfbid; 8857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx,l_tccp->prcw, l_data_size); 8859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy,l_tccp->prch, l_data_size); 8860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* << INDEX */ 8862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 8863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 8865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k ) 8868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* loop */ 8870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 8871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = NULL; 8872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = NULL; 8873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL; 8874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_prc_size; 8875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 8877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 8878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 8880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /* FIXME J2K_DEC_STATE_TPH*/ 8881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_cp->tcps[p_j2k->m_current_tile_number] : 8882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 8883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_ref_tccp = &l_tcp->tccps[0]; 8885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp = l_ref_tccp + 1; 8886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32); 8887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=1; i<p_j2k->m_private_image->numcomps; ++i) { 8889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp->numresolutions = l_ref_tccp->numresolutions; 8890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp->cblkw = l_ref_tccp->cblkw; 8891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp->cblkh = l_ref_tccp->cblkh; 8892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp->cblksty = l_ref_tccp->cblksty; 8893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp->qmfbid = l_ref_tccp->qmfbid; 8894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_copied_tccp->prcw,l_ref_tccp->prcw,l_prc_size); 8895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_copied_tccp->prch,l_ref_tccp->prch,l_prc_size); 8896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_copied_tccp; 8897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k, 8901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 8902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no ) 8903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_num_bands; 8905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 8907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 8908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = 00; 8909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 8911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 8912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 8914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &l_cp->tcps[p_tile_no]; 8915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = &l_tcp->tccps[p_comp_no]; 8916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions again */ 8918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_tile_no < l_cp->tw * l_cp->th); 8919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_comp_no < p_j2k->m_private_image->numcomps); 8920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2); 8922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { 8924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1 + l_num_bands; 8925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1 + 2*l_num_bands; 8928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 8930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_SQcd_SQcc( opj_j2k_t *p_j2k, 8932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_no, 8933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 8934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 8935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_header_size, 8936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 8937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 8938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_header_size; 8939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_band_no, l_num_bands; 8940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_expn,l_mant; 8941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 8943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 8944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = 00; 8945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 8947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 8948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_size != 00); 8949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 8950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_data != 00); 8951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 8953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = &l_cp->tcps[p_tile_no]; 8954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = &l_tcp->tccps[p_comp_no]; 8955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions again */ 8957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_tile_no < l_cp->tw * l_cp->th); 8958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_comp_no <p_j2k->m_private_image->numcomps); 8959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2); 8961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { 8963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_header_size = 1 + l_num_bands; 8964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*p_header_size < l_header_size) { 8966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n"); 8967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1); /* Sqcx */ 8971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) { 8974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn; 8975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data, l_expn << 3, 1); /* SPqcx_i */ 8976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 8980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_header_size = 1 + 2*l_num_bands; 8981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*p_header_size < l_header_size) { 8983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n"); 8984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 8985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1); /* Sqcx */ 8988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_data; 8989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) { 8991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn; 8992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant; 8993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2); /* SPqcx_i */ 8995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += 2; 8996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 8998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 8999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_header_size = *p_header_size - l_header_size; 9000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 9002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k, 9005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_comp_no, 9006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE* p_header_data, 9007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_header_size, 9008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 9009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 9010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* loop*/ 9012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_band_no; 9013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = 00; 9014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 9015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = 00; 9016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_ptr = 00; 9017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tmp, l_num_band; 9018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 9020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 9021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 9022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_header_data != 00); 9023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 9025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* come from tile part header or main header ?*/ 9026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /*FIXME J2K_DEC_STATE_TPH*/ 9027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_cp->tcps[p_j2k->m_current_tile_number] : 9028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 9029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* precondition again*/ 90314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (p_comp_no >= p_j2k->m_private_image->numcomps) { 90324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return OPJ_FALSE; 90334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp = &l_tcp->tccps[p_comp_no]; 9036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr = p_header_data; 9037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (*p_header_size < 1) { 9039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n"); 9040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_header_size -= 1; 9043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr, &l_tmp ,1); /* Sqcx */ 9045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 9046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->qntsty = l_tmp & 0x1f; 9048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->numgbits = l_tmp >> 5; 9049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) { 9050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_band = 1; 9051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 9053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? 9054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*p_header_size) : 9055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*p_header_size) / 2; 9056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( l_num_band > OPJ_J2K_MAXBANDS ) { 9058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "While reading CCP_QNTSTY element inside QCD or QCC marker segment, " 9059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to " 9060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS, OPJ_J2K_MAXBANDS); 9061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*return OPJ_FALSE;*/ 9062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef USE_JPWL 9066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->correct) { 9067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* if JPWL is on, we check whether there are too many subbands */ 9069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) { 9070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, 9071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "JPWL: bad number of subbands in Sqcx (%d)\n", 9072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_band); 9073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!JPWL_ASSUME) { 9074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n"); 9075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* we try to correct */ 9078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_band = 1; 9079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n" 9080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "- setting number of bands to %d => HYPOTHESIS!!!\n", 9081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_num_band); 9082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 9083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 9085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* USE_JPWL */ 9086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { 9088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) { 9089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr, &l_tmp ,1); /* SPqcx_i */ 9090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_current_ptr; 9091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_band_no < OPJ_J2K_MAXBANDS){ 9092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3); 9093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->stepsizes[l_band_no].mant = 0; 9094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_header_size = *p_header_size - l_num_band; 9097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 9099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) { 9100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_read_bytes(l_current_ptr, &l_tmp ,2); /* SPqcx_i */ 9101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_ptr+=2; 9102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_band_no < OPJ_J2K_MAXBANDS){ 9103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11); 9104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff; 9105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_header_size = *p_header_size - 2*l_num_band; 9108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Add Antonin : if scalar_derived -> compute other stepsizes */ 9111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) { 9112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) { 9113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->stepsizes[l_band_no].expn = 9114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0) ? 9115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0; 9116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant; 9117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 9121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k ) 9124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 9126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t *l_cp = NULL; 9127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = NULL; 9128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_ref_tccp = NULL; 9129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_copied_tccp = NULL; 9130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_size; 9131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 9133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 9134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 9136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ? 9137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_cp->tcps[p_j2k->m_current_tile_number] : 9138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_default_tcp; 9139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_ref_tccp = &l_tcp->tccps[0]; 9141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp = l_ref_tccp + 1; 9142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t); 9143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=1;i<p_j2k->m_private_image->numcomps;++i) { 9145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp->qntsty = l_ref_tccp->qntsty; 9146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_copied_tccp->numgbits = l_ref_tccp->numgbits; 9147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_copied_tccp->stepsizes,l_ref_tccp->stepsizes,l_size); 9148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_copied_tccp; 9149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void opj_j2k_dump_tile_info( opj_tcp_t * l_default_tile,OPJ_INT32 numcomps,FILE* out_stream) 9153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_default_tile) 9155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 9156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 compno; 9157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t default tile {\n"); 9159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty); 9160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg); 9161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers); 9162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct); 9163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 0; compno < numcomps; compno++) { 9165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]); 9166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 resno; 9167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 bandno, numbands; 9168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* coding style*/ 9170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t comp %d {\n", compno); 9171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty); 9172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions); 9173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw); 9174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh); 9175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty); 9176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid); 9177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t preccintsize (w,h)="); 9179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (resno = 0; resno < l_tccp->numresolutions; resno++) { 9180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]); 9181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\n"); 9183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* quantization style*/ 9185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty); 9186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits); 9187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t stepsizes (m,e)="); 9188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2; 9189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (bandno = 0; bandno < numbands; bandno++) { 9190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant, 9191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp->stepsizes[bandno].expn); 9192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\n"); 9194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* RGN value*/ 9196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift); 9197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t }\n"); 9199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } /*end of component of default tile*/ 9200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t }\n"); /*end of default tile*/ 9201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream) 9205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Check if the flag is compatible with j2k file*/ 9207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( (flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)){ 9208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "Wrong flag\n"); 9209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 9210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Dump the image_header */ 9213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flag & OPJ_IMG_INFO){ 9214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_private_image) 9215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream); 9216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Dump the codestream info from main header */ 9219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flag & OPJ_J2K_MH_INFO){ 9220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_dump_MH_info(p_j2k, out_stream); 9221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Dump all tile/codestream info */ 9223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flag & OPJ_J2K_TCH_INFO){ 9224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; 9225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i; 9226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t * l_tcp = p_j2k->m_cp.tcps; 9227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_tiles;++i) { 9228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_dump_tile_info( l_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream); 9229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_tcp; 9230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Dump the codestream info of the current tile */ 9234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flag & OPJ_J2K_TH_INFO){ 9235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Dump the codestream index from main header */ 9239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flag & OPJ_J2K_MH_IND){ 9240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_dump_MH_index(p_j2k, out_stream); 9241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Dump the codestream index of the current tile */ 9244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (flag & OPJ_J2K_TH_IND){ 9245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream) 9251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_codestream_index_t* cstr_index = p_j2k->cstr_index; 9253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_marker, it_tile, it_tile_part; 9254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "Codestream index from main header: {\n"); 9256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n" 9258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "\t Main header end position=%" PRIi64 "\n", 9259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->main_head_start, cstr_index->main_head_end); 9260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t Marker list: {\n"); 9262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cstr_index->marker){ 9264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_marker=0; it_marker < cstr_index->marknum ; it_marker++){ 9265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n", 9266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker[it_marker].type, 9267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker[it_marker].pos, 9268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->marker[it_marker].len ); 9269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t }\n"); 9273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cstr_index->tile_index){ 9275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Simple test to avoid to write empty information*/ 9277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_acc_nb_of_tile_part = 0; 9278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){ 9279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps; 9280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_acc_nb_of_tile_part) 9283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 9284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t Tile index: {\n"); 9285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){ 9287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps; 9288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile, nb_of_tile_part); 9290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cstr_index->tile_index[it_tile].tp_index){ 9292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_tile_part =0; it_tile_part < nb_of_tile_part; it_tile_part++){ 9293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%" PRIi64 ", end_pos=%" PRIi64 ".\n", 9294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov it_tile_part, 9295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos, 9296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header, 9297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos); 9298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cstr_index->tile_index[it_tile].marker){ 9302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_marker=0; it_marker < cstr_index->tile_index[it_tile].marknum ; it_marker++){ 9303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n", 9304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[it_tile].marker[it_marker].type, 9305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[it_tile].marker[it_marker].pos, 9306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_index->tile_index[it_tile].marker[it_marker].len ); 9307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream,"\t }\n"); 9311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream,"}\n"); 9315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream) 9320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "Codestream info from main header: {\n"); 9323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t tx0=%d, ty0=%d\n", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0); 9325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t tdx=%d, tdy=%d\n", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy); 9326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "\t tw=%d, th=%d\n", p_j2k->m_cp.tw, p_j2k->m_cp.th); 9327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 9328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "}\n"); 9329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag, FILE* out_stream) 9332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char tab[2]; 9334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dev_dump_flag){ 9336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(stdout, "[DEV] Dump an image_header struct {\n"); 9337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tab[0] = '\0'; 9338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 9340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "Image info {\n"); 9341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tab[0] = '\t';tab[1] = '\0'; 9342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0); 9345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "%s x1=%d, y1=%d\n", tab, img_header->x1, img_header->y1); 9346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps); 9347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (img_header->comps){ 9349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno; 9350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 0; compno < img_header->numcomps; compno++) { 9351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "%s\t component %d {\n", tab, compno); 9352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag, out_stream); 9353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream,"%s}\n",tab); 9354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "}\n"); 9358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid j2k_dump_image_comp_header(opj_image_comp_t* comp_header, OPJ_BOOL dev_dump_flag, FILE* out_stream) 9361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char tab[3]; 9363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dev_dump_flag){ 9365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n"); 9366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tab[0] = '\0'; 9367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 9368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tab[0] = '\t';tab[1] = '\t';tab[2] = '\0'; 9369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy); 9372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec); 9373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd); 9374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (dev_dump_flag) 9376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fprintf(out_stream, "}\n"); 9377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovopj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k) 9380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno; 9382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps; 9383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_default_tile; 9384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,sizeof(opj_codestream_info_v2_t)); 9385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!cstr_info) 9386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 9387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->nbcomps = p_j2k->m_private_image->numcomps; 9389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->tx0 = p_j2k->m_cp.tx0; 9391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->ty0 = p_j2k->m_cp.ty0; 9392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->tdx = p_j2k->m_cp.tdx; 9393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->tdy = p_j2k->m_cp.tdy; 9394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->tw = p_j2k->m_cp.tw; 9395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->th = p_j2k->m_cp.th; 9396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->tile_info = NULL; /* Not fill from the main header*/ 9398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp; 9400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->m_default_tile_info.csty = l_default_tile->csty; 9402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->m_default_tile_info.prg = l_default_tile->prg; 9403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers; 9404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->m_default_tile_info.mct = l_default_tile->mct; 9405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(cstr_info->nbcomps, sizeof(opj_tccp_info_t)); 9407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!cstr_info->m_default_tile_info.tccp_info) 9408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 9409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_destroy_cstr_info(&cstr_info); 9410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 9411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 0; compno < numcomps; compno++) { 9414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]); 9415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tccp_info_t *l_tccp_info = &(cstr_info->m_default_tile_info.tccp_info[compno]); 9416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 bandno, numbands; 9417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* coding style*/ 9419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->csty = l_tccp->csty; 9420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->numresolutions = l_tccp->numresolutions; 9421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->cblkw = l_tccp->cblkw; 9422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->cblkh = l_tccp->cblkh; 9423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->cblksty = l_tccp->cblksty; 9424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->qmfbid = l_tccp->qmfbid; 9425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS) 9426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 9427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions); 9428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions); 9429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* quantization style*/ 9432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->qntsty = l_tccp->qntsty; 9433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->numgbits = l_tccp->numgbits; 9434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2; 9436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (numbands < OPJ_J2K_MAXBANDS) { 9437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (bandno = 0; bandno < numbands; bandno++) { 9438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].mant; 9439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].expn; 9440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* RGN value*/ 9444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tccp_info->roishift = l_tccp->roishift; 9445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return cstr_info; 9448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovopj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k) 9451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*) 9453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_calloc(1,sizeof(opj_codestream_index_t)); 9454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_cstr_index) 9455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 9456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start; 9458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end; 9459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size; 9460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->marknum = p_j2k->cstr_index->marknum; 9462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum*sizeof(opj_marker_info_t)); 9463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_cstr_index->marker){ 9464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index); 9465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 9466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->cstr_index->marker) 9469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker, l_cstr_index->marknum * sizeof(opj_marker_info_t) ); 9470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else{ 9471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_cstr_index->marker); 9472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->marker = NULL; 9473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles; 9476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t) ); 9477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_cstr_index->tile_index){ 9478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index->marker); 9479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index); 9480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 9481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_j2k->cstr_index->tile_index){ 9484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_cstr_index->tile_index); 9485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index = NULL; 9486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 9488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_tile = 0; 9489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++ ){ 9490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Tile Marker*/ 9492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].marknum = p_j2k->cstr_index->tile_index[it_tile].marknum; 9493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].marker = 9495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum*sizeof(opj_marker_info_t)); 9496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!l_cstr_index->tile_index[it_tile].marker) { 9498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_tile_free; 9499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){ 9501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_cstr_index->tile_index[it_tile_free].marker); 9502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index->tile_index); 9505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index->marker); 9506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index); 9507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 9508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->cstr_index->tile_index[it_tile].marker) 9511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy( l_cstr_index->tile_index[it_tile].marker, 9512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[it_tile].marker, 9513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t) ); 9514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else{ 9515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_cstr_index->tile_index[it_tile].marker); 9516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].marker = NULL; 9517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Tile part index*/ 9520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].nb_tps = p_j2k->cstr_index->tile_index[it_tile].nb_tps; 9521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].tp_index = 9523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps*sizeof(opj_tp_index_t)); 9524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!l_cstr_index->tile_index[it_tile].tp_index){ 9526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_tile_free; 9527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){ 9529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_cstr_index->tile_index[it_tile_free].marker); 9530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_cstr_index->tile_index[it_tile_free].tp_index); 9531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index->tile_index); 9534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index->marker); 9535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free( l_cstr_index); 9536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 9537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->cstr_index->tile_index[it_tile].tp_index){ 9540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov memcpy( l_cstr_index->tile_index[it_tile].tp_index, 9541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[it_tile].tp_index, 9542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t) ); 9543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else{ 9545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_cstr_index->tile_index[it_tile].tp_index); 9546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].tp_index = NULL; 9547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Packet index (NOT USED)*/ 9550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].nb_packet = 0; 9551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_index->tile_index[it_tile].packet_index = NULL; 9552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return l_cstr_index; 9557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k) 9560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_tile=0; 9562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th; 9564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t)); 9565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_j2k->cstr_index->tile_index) 9566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_tile=0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++){ 9569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100; 9570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[it_tile].marknum = 0; 9571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*) 9572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum, sizeof(opj_marker_info_t)); 9573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_j2k->cstr_index->tile_index[it_tile].marker) 9574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 9578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k, 9581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 9582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 9583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL l_go_on = OPJ_TRUE; 9585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_tile_no; 9586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_data_size,l_max_data_size; 9587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1; 9588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comps; 9589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data; 9590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 nr_tiles = 0; 9591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = (OPJ_BYTE*)opj_malloc(1000); 9593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_current_data) { 9594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tiles\n"); 9595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_max_data_size = 1000; 9598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (;;) { 9600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_tile_header( p_j2k, 9601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_current_tile_no, 9602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_data_size, 9603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_tile_x0, &l_tile_y0, 9604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_tile_x1, &l_tile_y1, 9605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_nb_comps, 9606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_go_on, 9607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_stream, 9608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_manager)) { 9609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_go_on) { 9614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 9615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_data_size > l_max_data_size) { 9618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size); 9619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_new_current_data) { 9620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 9622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = l_new_current_data; 9625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_max_data_size = l_data_size; 9626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) { 9629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 9631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 9634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) { 9636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1); 9640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(opj_stream_get_number_byte_left(p_stream) == 0 9642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) 9643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 9644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(++nr_tiles == p_j2k->m_cp.th * p_j2k->m_cp.tw) 9645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 9646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 9651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 9654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures. 9655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 9656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_decoding (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) 9657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 9659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 9660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 9661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_tiles, p_manager)) { 9663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 9664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 9665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* DEVELOPER CORNER, add your custom procedures */ 9666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 9668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 9671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Read and decode one tile. 9672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 9673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_decode_one_tile ( opj_j2k_t *p_j2k, 9674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 9675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 9676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BOOL l_go_on = OPJ_TRUE; 9678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_tile_no; 9679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tile_no_to_dec; 9680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_data_size,l_max_data_size; 9681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1; 9682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_comps; 9683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data; 9684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = (OPJ_BYTE*)opj_malloc(1000); 9686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_current_data) { 9687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode one tile\n"); 9688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_max_data_size = 1000; 9691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*Allocate and initialize some elements of codestrem index if not already done*/ 9693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( !p_j2k->cstr_index->tile_index) 9694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 9695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){ 9696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Move into the codestream to the first SOT used to decode the desired tile */ 9701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_no_to_dec = (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec; 9702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->cstr_index->tile_index) 9703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(p_j2k->cstr_index->tile_index->tp_index) 9704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 9705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) { 9706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the index for this tile has not been built, 9707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * so move to the last SOT read */ 9708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !(opj_stream_read_seek(p_stream, p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos+2, p_manager)) ){ 9709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n"); 9710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(l_current_data); 9711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else{ 9715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)) ) { 9716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n"); 9717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(l_current_data); 9718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */ 9722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) 9723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT; 9724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (;;) { 9727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_read_tile_header( p_j2k, 9728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_current_tile_no, 9729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_data_size, 9730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_tile_x0, &l_tile_y0, 9731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_tile_x1, &l_tile_y1, 9732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_nb_comps, 9733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &l_go_on, 9734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_stream, 9735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_manager)) { 9736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_go_on) { 9741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 9742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_data_size > l_max_data_size) { 9745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size); 9746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! l_new_current_data) { 9747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = NULL; 9749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* TODO: LH: why tile numbering policy used in messages differs from 9750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov the one used in opj_j2k_decode_tiles() ? */ 9751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 9752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = l_new_current_data; 9755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_max_data_size = l_data_size; 9756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) { 9759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 9763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) { 9765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no); 9769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(l_current_tile_no == l_tile_no_to_dec) 9771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 9772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* move into the codestream to the the first SOT (FIXME or not move?)*/ 9773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2, p_manager) ) ) { 9774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n"); 9775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(l_current_data); 9776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 9779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 9781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 9782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(l_current_data); 9787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 9789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 9792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Sets up the procedures to do on decoding one tile. Developpers wanting to extend the library can add their own reading procedures. 9793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 9794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_decoding_tile (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) 9795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions*/ 9797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 9798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 9799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_one_tile, p_manager)) { 9801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 9802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 9803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* DEVELOPER CORNER, add your custom procedures */ 9804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 9806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9808ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k, 9809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t * p_stream, 9810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * p_image, 9811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 9812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno; 9814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_image) 9816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 9818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_output_image = opj_image_create0(); 9819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (p_j2k->m_output_image)) { 9820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_copy_image_header(p_image, p_j2k->m_output_image); 9823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* customization of the decoding */ 9825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_j2k_setup_decoding(p_j2k, p_manager); 9826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Decode the codestream */ 9828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) { 9829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_destroy(p_j2k->m_private_image); 9830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image = NULL; 9831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Move data and copy one information from codec to output image*/ 9835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 0; compno < p_image->numcomps; compno++) { 9836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded; 9837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data; 9838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 9839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov char fn[256]; 9840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sprintf( fn, "/tmp/%d.raw", compno ); 9841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FILE *debug = fopen( fn, "wb" ); 9842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fwrite( p_image->comps[compno].data, sizeof(OPJ_INT32), p_image->comps[compno].w * p_image->comps[compno].h, debug ); 9843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fclose( debug ); 9844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 9845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_output_image->comps[compno].data = NULL; 9846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 9849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9851ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_get_tile( opj_j2k_t *p_j2k, 9852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 9853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t* p_image, 9854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager, 9855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 tile_index ) 9856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno; 9858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tile_x, l_tile_y; 9859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_comp_t* l_img_comp; 9860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!p_image) { 9862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n"); 9863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( /*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) ){ 9867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 9868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Compute the dimension of the desired tile*/ 9872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_x = tile_index % p_j2k->m_cp.tw; 9873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_y = tile_index / p_j2k->m_cp.tw; 9874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0; 9876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_image->x0 < p_j2k->m_private_image->x0) 9877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x0 = p_j2k->m_private_image->x0; 9878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0; 9879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_image->x1 > p_j2k->m_private_image->x1) 9880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->x1 = p_j2k->m_private_image->x1; 9881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0; 9883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_image->y0 < p_j2k->m_private_image->y0) 9884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->y0 = p_j2k->m_private_image->y0; 9885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0; 9886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_image->y1 > p_j2k->m_private_image->y1) 9887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->y1 = p_j2k->m_private_image->y1; 9888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp = p_image->comps; 9890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno=0; compno < p_image->numcomps; ++compno) 9891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 9892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 l_comp_x1, l_comp_y1; 9893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor; 9895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 989633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx); 989733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy); 9898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx); 9899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy); 9900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)); 9902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)); 9903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_img_comp++; 9905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Destroy the previous output image*/ 9908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_output_image) 9909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_destroy(p_j2k->m_output_image); 9910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Create the ouput image from the information previously computed*/ 9912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_output_image = opj_image_create0(); 9913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (p_j2k->m_output_image)) { 9914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_copy_image_header(p_image, p_j2k->m_output_image); 9917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index; 9919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* customization of the decoding */ 9921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_j2k_setup_decoding_tile(p_j2k, p_manager); 9922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Decode the codestream */ 9924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) { 9925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_destroy(p_j2k->m_private_image); 9926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image = NULL; 9927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Move data and copy one information from codec to output image*/ 9931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 0; compno < p_image->numcomps; compno++) { 9932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded; 9933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_image->comps[compno].data) 9935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_image->comps[compno].data); 9936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data; 9938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_output_image->comps[compno].data = NULL; 9940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 9943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9945ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k, 9946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 res_factor, 9947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 9948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_comp; 9950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor; 9952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_private_image) { 9954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_private_image->comps) { 9955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_default_tcp) { 9956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) { 9957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) { 9958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 max_res = p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions; 9959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( res_factor >= max_res){ 9960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Resolution factor is greater than the maximum resolution in the component.\n"); 9961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image->comps[it_comp].factor = res_factor; 9964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 9966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 9973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9974ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k, 9975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 9976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 9977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 9978e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32 i, j; 9979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_tiles; 9980e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32 l_max_tile_size = 0, l_current_tile_size; 9981e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_BYTE * l_current_data = 00; 9982e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_tcd_t* p_tcd = 00; 9983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 9985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 9986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 9987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 9988e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 9989e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov p_tcd = p_j2k->m_tcd; 9990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 9991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; 9992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<l_nb_tiles;++i) { 9993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_pre_write_tile(p_j2k,i,p_stream,p_manager)) { 9994e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_current_data) { 9995e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_free(l_current_data); 9996e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 9997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 9998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 9999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10000e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* if we only have one tile, then simply set tile component data equal to image component data */ 10001e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* otherwise, allocate the data */ 10002e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (j=0;j<p_j2k->m_tcd->image->numcomps;++j) { 10003e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j; 10004e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_nb_tiles == 1) { 10005e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_image_comp_t * l_img_comp = p_tcd->image->comps + j; 10006e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tilec->data = l_img_comp->data; 10007e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tilec->ownsData = OPJ_FALSE; 10008e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 10009e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(! opj_alloc_tile_component_data(l_tilec)) { 10010e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data." ); 10011e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_current_data) { 10012e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_free(l_current_data); 10013e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10014e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 10015e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10018e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd); 10019e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_nb_tiles > 1) { 10020e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_current_tile_size > l_max_tile_size) { 10021e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_current_tile_size); 10022e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! l_new_current_data) { 10023e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_current_data) { 10024e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_free(l_current_data); 10025e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10026e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n"); 10027e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 10028e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10029e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_current_data = l_new_current_data; 10030e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_max_tile_size = l_current_tile_size; 10031e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10032e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10033e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* copy image data (32 bit) to l_current_data as contiguous, all-component, zero offset buffer */ 10034e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* 32 bit components @ 8 bit precision get converted to 8 bit */ 10035e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* 32 bit components @ 16 bit precision get converted to 16 bit */ 10036e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_j2k_get_tile_data(p_j2k->m_tcd,l_current_data); 10037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10038e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* now copy this data into the tile component */ 10039e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! opj_tcd_copy_tile_data(p_j2k->m_tcd,l_current_data,l_current_tile_size)) { 10040e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." ); 10041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(l_current_data); 10042e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 10043e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10044e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10046e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! opj_j2k_post_write_tile (p_j2k,p_stream,p_manager)) { 10047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (l_current_data) { 10048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opj_free(l_current_data); 10049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10054e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_current_data) { 10055e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_free(l_current_data); 10056e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10060ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_end_compress( opj_j2k_t *p_j2k, 10061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 10063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* customization of the encoding */ 10065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) { 10066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_exec (p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) 10070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 10071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10077ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k, 10078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_image_t * p_image, 10080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager) 10081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 10085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 10086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image = opj_image_create0(); 10088e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! p_j2k->m_private_image) { 10089e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header." ); 10090e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 10091e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_copy_image_header(p_image, p_j2k->m_private_image); 10093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* TODO_MSD: Find a better way */ 10095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_image->comps) { 10096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 it_comp; 10097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) { 10098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_image->comps[it_comp].data) { 10099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_private_image->comps[it_comp].data =p_image->comps[it_comp].data; 10100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_image->comps[it_comp].data = NULL; 10101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* customization of the validation */ 10107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_j2k_setup_encoding_validation (p_j2k, p_manager)) { 10108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* validation of the parameters codec */ 10112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager)) { 10113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* customization of the encoding */ 10117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) { 10118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* write header */ 10122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) { 10123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k, 10130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_index, 10131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 10133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)p_stream; 10135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_tile_index != p_j2k->m_current_tile_number) { 10136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match." ); 10137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 10141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0; 10143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts; 10144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0; 10145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* initialisation before tile encoding */ 10147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number, p_manager)) { 10148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_get_tile_dimensions(opj_image_t * l_image, 10155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_tcd_tilecomp_t * l_tilec, 10156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_image_comp_t * l_img_comp, 10157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_size_comp, 10158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_width, 10159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_height, 10160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_offset_x, 10161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_offset_y, 10162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_image_width, 10163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_stride, 10164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32* l_tile_offset) { 10165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32 l_remaining; 10166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *l_size_comp = l_img_comp->prec >> 3; /* (/8) */ 10167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_remaining = l_img_comp->prec & 7; /* (%8) */ 10168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (l_remaining) { 10169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *l_size_comp += 1; 10170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (*l_size_comp == 3) { 10173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *l_size_comp = 4; 10174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *l_width = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0); 10177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0); 1017833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann *l_offset_x = opj_uint_ceildiv(l_image->x0, l_img_comp->dx); 1017933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann *l_offset_y = opj_uint_ceildiv(l_image->y0, l_img_comp->dy); 10180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 - (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx); 10181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *l_stride = *l_image_width - *l_width; 10182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width; 10183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 10184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data) 10186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 i,j,k = 0; 10188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i=0;i<p_tcd->image->numcomps;++i) { 10190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_image_t * l_image = p_tcd->image; 10191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_INT32 * l_src_ptr; 10192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_tcd_tilecomp_t * l_tilec = p_tcd->tcd_image->tiles->comps + i; 10193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_image_comp_t * l_img_comp = l_image->comps + i; 10194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32 l_size_comp,l_width,l_height,l_offset_x,l_offset_y, l_image_width,l_stride,l_tile_offset; 10195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_get_tile_dimensions(l_image, 10197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_tilec, 10198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_img_comp, 10199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &l_size_comp, 10200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &l_width, 10201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &l_height, 10202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &l_offset_x, 10203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &l_offset_y, 10204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &l_image_width, 10205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &l_stride, 10206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov &l_tile_offset); 10207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov l_src_ptr = l_img_comp->data + l_tile_offset; 10209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (l_size_comp) { 10211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 1: 10212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 10213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data; 10214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_img_comp->sgnd) { 10215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_height;++j) { 10216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k=0;k<l_width;++k) { 10217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr) = (OPJ_CHAR) (*l_src_ptr); 10218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_dest_ptr; 10219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_src_ptr; 10220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_stride; 10222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 10225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_height;++j) { 10226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k=0;k<l_width;++k) { 10227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr)&0xff); 10228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_dest_ptr; 10229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++l_src_ptr; 10230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_stride; 10232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data = (OPJ_BYTE*) l_dest_ptr; 10236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 10238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 2: 10239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 10240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data; 10241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_img_comp->sgnd) { 10242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_height;++j) { 10243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k=0;k<l_width;++k) { 10244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++)); 10245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_stride; 10247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 10250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_height;++j) { 10251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k=0;k<l_width;++k) { 10252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff); 10253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_stride; 10255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data = (OPJ_BYTE*) l_dest_ptr; 10259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 10261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 4: 10262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 10263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data; 10264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (j=0;j<l_height;++j) { 10265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (k=0;k<l_width;++k) { 10266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *(l_dest_ptr++) = *(l_src_ptr++); 10267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_src_ptr += l_stride; 10269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data = (OPJ_BYTE*) l_dest_ptr; 10272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 10274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_post_write_tile ( opj_j2k_t * p_j2k, 10279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 10281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_bytes_written; 10283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_current_data = 00; 10284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tile_size = 0; 10285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_available_data; 10286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data); 10289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size; 10291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_available_data = l_tile_size; 10292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data; 10293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written = 0; 10295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_first_tile_part(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) { 10296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_data += l_nb_bytes_written; 10299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_available_data -= l_nb_bytes_written; 10300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written = 0; 10302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_all_tile_parts(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) { 10303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_available_data -= l_nb_bytes_written; 10307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written = l_tile_size - l_available_data; 10308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( opj_stream_write_data( p_stream, 10310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_encoded_tile_data, 10311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written,p_manager) != l_nb_bytes_written) { 10312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_j2k->m_current_tile_number; 10316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_end_compress (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) 10321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 10325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* DEVELOPER CORNER, insert your custom procedures */ 10327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_eoc, p_manager)) { 10328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) { 10332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_updated_tlm, p_manager)) { 10333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_epc, p_manager)) { 10338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_end_encoding, p_manager)) { 10341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_destroy_header_memory, p_manager)) { 10344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 10347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) 10350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 10354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_encoder, p_manager)) { 10356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_encoding_validation, p_manager)) { 10359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* DEVELOPER CORNER, add your custom validation procedure */ 10363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_mct_validation, p_manager)) { 10364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 10367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 10368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_setup_header_writing (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) 10371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(p_manager != 00); 10375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_init_info, p_manager)) { 10377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_soc, p_manager)) { 10380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_siz, p_manager)) { 10383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_cod, p_manager)) { 10386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_qcd, p_manager)) { 10389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) { 10393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* No need for COC or QCC, QCD and COD are used 10394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_coc, p_manager)) { 10395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_qcc, p_manager)) { 10398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 10401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_tlm, p_manager)) { 10402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) { 10406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_poc, p_manager)) { 10407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_regions, p_manager)) { 10413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_cp.comment != 00) { 10417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_com, p_manager)) { 10418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* DEVELOPER CORNER, insert your custom procedures */ 10423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (p_j2k->m_cp.rsiz & OPJ_EXTENSION_MCT) { 10424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_mct_data_group, p_manager)) { 10425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* End of Developer Corner */ 10429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->cstr_index) { 10431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_get_end_header, p_manager)) { 10432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_create_tcd, p_manager)) { 10437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_update_rates, p_manager)) { 10440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_FALSE; 10441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 10442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 10443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return OPJ_TRUE; 10444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k, 10447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 10448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 10449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_total_data_size, 10450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 10452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_bytes_written = 0; 10454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_nb_bytes_written; 10455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_begin_data = 00; 10456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_t * l_tcd = 00; 10458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t * l_cp = 00; 10459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcd = p_j2k->m_tcd; 10461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 10462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcd->cur_pino = 0; 10464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*Get number of tile parts*/ 10466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0; 10467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* INDEX >> */ 10469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* << INDEX */ 10470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_begin_data = p_data; 10473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) 10474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 10475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += l_current_nb_bytes_written; 10480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_total_data_size -= l_current_nb_bytes_written; 10481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!OPJ_IS_CINEMA(l_cp->rsiz)) { 10483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 10484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) { 10485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_coc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager); 10487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += l_current_nb_bytes_written; 10489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_total_data_size -= l_current_nb_bytes_written; 10490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_qcc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager); 10493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += l_current_nb_bytes_written; 10495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_total_data_size -= l_current_nb_bytes_written; 10496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 10498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cp->tcps[p_j2k->m_current_tile_number].numpocs) { 10500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_write_poc_in_memory(p_j2k,p_data,&l_current_nb_bytes_written,p_manager); 10502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += l_current_nb_bytes_written; 10504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_total_data_size -= l_current_nb_bytes_written; 10505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) { 10510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * p_data_written = l_nb_bytes_written; 10515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Writing Psot in SOT marker */ 10517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_begin_data + 6,l_nb_bytes_written,4); /* PSOT */ 10518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (OPJ_IS_CINEMA(l_cp->rsiz)){ 10520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_update_tlm(p_j2k,l_nb_bytes_written); 10521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_all_tile_parts( opj_j2k_t *p_j2k, 10527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 10528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 * p_data_written, 10529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_total_data_size, 10530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager 10532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 10533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 tilepartno=0; 10535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_nb_bytes_written = 0; 10536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_current_nb_bytes_written; 10537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_part_tile_size; 10538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 tot_num_tp; 10539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 pino; 10540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * l_begin_data; 10542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcp_t *l_tcp = 00; 10543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_t * l_tcd = 00; 10544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_cp_t * l_cp = 00; 10545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcd = p_j2k->m_tcd; 10547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cp = &(p_j2k->m_cp); 10548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcp = l_cp->tcps + p_j2k->m_current_tile_number; 10549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*Get number of tile parts*/ 10551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tot_num_tp = opj_j2k_get_num_tp(l_cp,0,p_j2k->m_current_tile_number); 10552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* start writing remaining tile parts */ 10554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number; 10555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) { 10556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno; 10557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_part_tile_size = 0; 10559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_begin_data = p_data; 10560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) { 10562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += l_current_nb_bytes_written; 10567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_total_data_size -= l_current_nb_bytes_written; 10568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_part_tile_size += l_current_nb_bytes_written; 10569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) { 10572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += l_current_nb_bytes_written; 10576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_total_data_size -= l_current_nb_bytes_written; 10578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_part_tile_size += l_current_nb_bytes_written; 10579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Writing Psot in SOT marker */ 10581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_begin_data + 6,l_part_tile_size,4); /* PSOT */ 10582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (OPJ_IS_CINEMA(l_cp->rsiz)) { 10584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_update_tlm(p_j2k,l_part_tile_size); 10585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number; 10588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (pino = 1; pino <= l_tcp->numpocs; ++pino) { 10591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tcd->cur_pino = pino; 10592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*Get number of tile parts*/ 10594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tot_num_tp = opj_j2k_get_num_tp(l_cp,pino,p_j2k->m_current_tile_number); 10595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) { 10596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno; 10597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_part_tile_size = 0; 10599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_begin_data = p_data; 10600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) { 10602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += l_current_nb_bytes_written; 10607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_total_data_size -= l_current_nb_bytes_written; 10608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_part_tile_size += l_current_nb_bytes_written; 10609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_nb_bytes_written = 0; 10611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) { 10613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_nb_bytes_written += l_current_nb_bytes_written; 10617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_data += l_current_nb_bytes_written; 10618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_total_data_size -= l_current_nb_bytes_written; 10619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_part_tile_size += l_current_nb_bytes_written; 10620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Writing Psot in SOT marker */ 10622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_write_bytes(l_begin_data + 6,l_part_tile_size,4); /* PSOT */ 10623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (OPJ_IS_CINEMA(l_cp->rsiz)) { 10625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_j2k_update_tlm(p_j2k,l_part_tile_size); 10626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number; 10629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *p_data_written = l_nb_bytes_written; 10633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k, 10638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 10639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 10640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 l_tlm_size; 10642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_OFF_T l_tlm_position, l_current_position; 10643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 10647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 10648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts; 10650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start; 10651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_current_position = opj_stream_tell(p_stream); 10652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_stream_seek(p_stream,l_tlm_position,p_manager)) { 10654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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) { 10658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_stream_seek(p_stream,l_current_position,p_manager)) { 10662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_end_encoding( opj_j2k_t *p_j2k, 10669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 10670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 10671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 10675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 10676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_destroy(p_j2k->m_tcd); 10678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_tcd = 00; 10679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) { 10681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer); 10682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0; 10683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0; 10684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) { 10687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data); 10688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0; 10689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0; 10692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 10697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Destroys the memory associated with the decoding of headers. 10698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 10699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k, 10700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 10702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 10703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 10707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 10708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) { 10710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data); 10711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0; 10712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0; 10715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic OPJ_BOOL opj_j2k_init_info( opj_j2k_t *p_j2k, 10720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_stream_private *p_stream, 10721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct opj_event_mgr * p_manager ) 10722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_codestream_info_t * l_cstr_info = 00; 10724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 10728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 10729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)l_cstr_info; 10730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* TODO mergeV2: check this part which use cstr_info */ 10732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_info = p_j2k->cstr_info; 10733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (l_cstr_info) { 10735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 compno; 10736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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)); 10737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0; 10739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0; 10740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg; 10742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->tw = p_j2k->m_cp.tw; 10744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->th = p_j2k->m_cp.th; 10745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/ /* new version parser */ 10747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/ /* new version parser */ 10748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/ /* new version parser */ 10749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/ /* new version parser */ 10750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_info->numcomps = p_j2k->m_image->numcomps; 10752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers; 10754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32)); 10756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (compno=0; compno < p_j2k->m_image->numcomps; compno++) { 10758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1; 10759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->D_max = 0.0; */ /* ADD Marcela */ 10762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */ 10764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*l_cstr_info->maxmarknum = 100; 10766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t)); 10767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov l_cstr_info->marknum = 0; 10768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }*/ 10769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 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); 10771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/** 10774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Creates a tile-coder decoder. 10775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 10776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_stream the stream to write data to. 10777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_j2k J2K codec. 10778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * @param p_manager the user event manager. 10779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/ 10780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic OPJ_BOOL opj_j2k_create_tcd( opj_j2k_t *p_j2k, 10781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager 10783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 10784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* preconditions */ 10786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_j2k != 00); 10787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_manager != 00); 10788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov assert(p_stream != 00); 10789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE); 10791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! p_j2k->m_tcd) { 10793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n"); 10794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!opj_tcd_init(p_j2k->m_tcd,p_j2k->m_private_image,&p_j2k->m_cp)) { 10798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_tcd_destroy(p_j2k->m_tcd); 10799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov p_j2k->m_tcd = 00; 10800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10806ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovOPJ_BOOL opj_j2k_write_tile (opj_j2k_t * p_j2k, 10807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_tile_index, 10808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_BYTE * p_data, 10809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OPJ_UINT32 p_data_size, 10810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_stream_private_t *p_stream, 10811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_mgr_t * p_manager ) 10812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! opj_j2k_pre_write_tile(p_j2k,p_tile_index,p_stream,p_manager)) { 10814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index); 10815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 10818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov OPJ_UINT32 j; 10819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Allocate data */ 10820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (j=0;j<p_j2k->m_tcd->image->numcomps;++j) { 10821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_tcd_tilecomp_t* l_tilec = p_j2k->m_tcd->tcd_image->tiles->comps + j; 10822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if(! opj_alloc_tile_component_data(l_tilec)) { 10824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data." ); 10825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 10826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* now copy data into the the tile component */ 10830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! opj_tcd_copy_tile_data(p_j2k->m_tcd,p_data,p_data_size)) { 10831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." ); 10832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return OPJ_FALSE; 10833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 10834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (! opj_j2k_post_write_tile(p_j2k,p_stream,p_manager)) { 10835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index); 10836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_FALSE; 10837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 10839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 10840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return OPJ_TRUE; 10841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 10842