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