1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker * The copyright in this software is being made available under the 2-clauses
3*3ac0a46fSAndroid Build Coastguard Worker * BSD License, included below. This software may be subject to other third
4*3ac0a46fSAndroid Build Coastguard Worker * party and contributor rights, including patent rights, and no such rights
5*3ac0a46fSAndroid Build Coastguard Worker * are granted under this license.
6*3ac0a46fSAndroid Build Coastguard Worker *
7*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2002-2014, Professor Benoit Macq
9*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2001-2003, David Janssens
10*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2002-2003, Yannick Verschueren
11*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2003-2007, Francois-Olivier Devaux
12*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2003-2014, Antonin Descampe
13*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2005, Herve Drolon, FreeImage Team
14*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <[email protected]>
15*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2006-2007, Parvatha Elangovan
16*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2010-2011, Kaori Hagihara
17*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
18*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2012, CS Systemes d'Information, France
19*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2017, IntoPIX SA <[email protected]>
20*3ac0a46fSAndroid Build Coastguard Worker * All rights reserved.
21*3ac0a46fSAndroid Build Coastguard Worker *
22*3ac0a46fSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
23*3ac0a46fSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
24*3ac0a46fSAndroid Build Coastguard Worker * are met:
25*3ac0a46fSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
26*3ac0a46fSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
27*3ac0a46fSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
28*3ac0a46fSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
29*3ac0a46fSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
30*3ac0a46fSAndroid Build Coastguard Worker *
31*3ac0a46fSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
32*3ac0a46fSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33*3ac0a46fSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34*3ac0a46fSAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
35*3ac0a46fSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
36*3ac0a46fSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
37*3ac0a46fSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
38*3ac0a46fSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
39*3ac0a46fSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40*3ac0a46fSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*3ac0a46fSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
42*3ac0a46fSAndroid Build Coastguard Worker */
43*3ac0a46fSAndroid Build Coastguard Worker
44*3ac0a46fSAndroid Build Coastguard Worker #include "opj_includes.h"
45*3ac0a46fSAndroid Build Coastguard Worker
46*3ac0a46fSAndroid Build Coastguard Worker /** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
47*3ac0a46fSAndroid Build Coastguard Worker /*@{*/
48*3ac0a46fSAndroid Build Coastguard Worker
49*3ac0a46fSAndroid Build Coastguard Worker /** @name Local static functions */
50*3ac0a46fSAndroid Build Coastguard Worker /*@{*/
51*3ac0a46fSAndroid Build Coastguard Worker
52*3ac0a46fSAndroid Build Coastguard Worker /**
53*3ac0a46fSAndroid Build Coastguard Worker * Sets up the procedures to do on reading header. Developers wanting to extend the library can add their own reading procedures.
54*3ac0a46fSAndroid Build Coastguard Worker */
55*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
56*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
57*3ac0a46fSAndroid Build Coastguard Worker
58*3ac0a46fSAndroid Build Coastguard Worker /**
59*3ac0a46fSAndroid Build Coastguard Worker * The read header procedure.
60*3ac0a46fSAndroid Build Coastguard Worker */
61*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_header_procedure(opj_j2k_t *p_j2k,
62*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
63*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
64*3ac0a46fSAndroid Build Coastguard Worker
65*3ac0a46fSAndroid Build Coastguard Worker /**
66*3ac0a46fSAndroid Build Coastguard Worker * The default encoding validation procedure without any extension.
67*3ac0a46fSAndroid Build Coastguard Worker *
68*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec to validate.
69*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the input stream to validate.
70*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
71*3ac0a46fSAndroid Build Coastguard Worker *
72*3ac0a46fSAndroid Build Coastguard Worker * @return true if the parameters are correct.
73*3ac0a46fSAndroid Build Coastguard Worker */
74*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_encoding_validation(opj_j2k_t * p_j2k,
75*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
76*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
77*3ac0a46fSAndroid Build Coastguard Worker
78*3ac0a46fSAndroid Build Coastguard Worker /**
79*3ac0a46fSAndroid Build Coastguard Worker * The default decoding validation procedure without any extension.
80*3ac0a46fSAndroid Build Coastguard Worker *
81*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec to validate.
82*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the input stream to validate.
83*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
84*3ac0a46fSAndroid Build Coastguard Worker *
85*3ac0a46fSAndroid Build Coastguard Worker * @return true if the parameters are correct.
86*3ac0a46fSAndroid Build Coastguard Worker */
87*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_decoding_validation(opj_j2k_t * p_j2k,
88*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
89*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
90*3ac0a46fSAndroid Build Coastguard Worker
91*3ac0a46fSAndroid Build Coastguard Worker /**
92*3ac0a46fSAndroid Build Coastguard Worker * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
93*3ac0a46fSAndroid Build Coastguard Worker * are valid. Developers wanting to extend the library can add their own validation procedures.
94*3ac0a46fSAndroid Build Coastguard Worker */
95*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
96*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
97*3ac0a46fSAndroid Build Coastguard Worker
98*3ac0a46fSAndroid Build Coastguard Worker /**
99*3ac0a46fSAndroid Build Coastguard Worker * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
100*3ac0a46fSAndroid Build Coastguard Worker * are valid. Developers wanting to extend the library can add their own validation procedures.
101*3ac0a46fSAndroid Build Coastguard Worker */
102*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
103*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
104*3ac0a46fSAndroid Build Coastguard Worker
105*3ac0a46fSAndroid Build Coastguard Worker /**
106*3ac0a46fSAndroid Build Coastguard Worker * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
107*3ac0a46fSAndroid Build Coastguard Worker * are valid. Developers wanting to extend the library can add their own validation procedures.
108*3ac0a46fSAndroid Build Coastguard Worker */
109*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
110*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
111*3ac0a46fSAndroid Build Coastguard Worker
112*3ac0a46fSAndroid Build Coastguard Worker /**
113*3ac0a46fSAndroid Build Coastguard Worker * The mct encoding validation procedure.
114*3ac0a46fSAndroid Build Coastguard Worker *
115*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec to validate.
116*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the input stream to validate.
117*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
118*3ac0a46fSAndroid Build Coastguard Worker *
119*3ac0a46fSAndroid Build Coastguard Worker * @return true if the parameters are correct.
120*3ac0a46fSAndroid Build Coastguard Worker */
121*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_mct_validation(opj_j2k_t * p_j2k,
122*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
123*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
124*3ac0a46fSAndroid Build Coastguard Worker
125*3ac0a46fSAndroid Build Coastguard Worker /**
126*3ac0a46fSAndroid Build Coastguard Worker * Builds the tcd decoder to use to decode tile.
127*3ac0a46fSAndroid Build Coastguard Worker */
128*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_build_decoder(opj_j2k_t * p_j2k,
129*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
130*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
131*3ac0a46fSAndroid Build Coastguard Worker /**
132*3ac0a46fSAndroid Build Coastguard Worker * Builds the tcd encoder to use to encode tile.
133*3ac0a46fSAndroid Build Coastguard Worker */
134*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_build_encoder(opj_j2k_t * p_j2k,
135*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
136*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
137*3ac0a46fSAndroid Build Coastguard Worker
138*3ac0a46fSAndroid Build Coastguard Worker /**
139*3ac0a46fSAndroid Build Coastguard Worker * Creates a tile-coder encoder.
140*3ac0a46fSAndroid Build Coastguard Worker *
141*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
142*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
143*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
144*3ac0a46fSAndroid Build Coastguard Worker */
145*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_create_tcd(opj_j2k_t *p_j2k,
146*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
147*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
148*3ac0a46fSAndroid Build Coastguard Worker
149*3ac0a46fSAndroid Build Coastguard Worker /**
150*3ac0a46fSAndroid Build Coastguard Worker * Executes the given procedures on the given codec.
151*3ac0a46fSAndroid Build Coastguard Worker *
152*3ac0a46fSAndroid Build Coastguard Worker * @param p_procedure_list the list of procedures to execute
153*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec to execute the procedures on.
154*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to execute the procedures on.
155*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user manager.
156*3ac0a46fSAndroid Build Coastguard Worker *
157*3ac0a46fSAndroid Build Coastguard Worker * @return true if all the procedures were successfully executed.
158*3ac0a46fSAndroid Build Coastguard Worker */
159*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_exec(opj_j2k_t * p_j2k,
160*3ac0a46fSAndroid Build Coastguard Worker opj_procedure_list_t * p_procedure_list,
161*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
162*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
163*3ac0a46fSAndroid Build Coastguard Worker
164*3ac0a46fSAndroid Build Coastguard Worker /**
165*3ac0a46fSAndroid Build Coastguard Worker * Updates the rates of the tcp.
166*3ac0a46fSAndroid Build Coastguard Worker *
167*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
168*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
169*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
170*3ac0a46fSAndroid Build Coastguard Worker */
171*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_update_rates(opj_j2k_t *p_j2k,
172*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
173*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
174*3ac0a46fSAndroid Build Coastguard Worker
175*3ac0a46fSAndroid Build Coastguard Worker /**
176*3ac0a46fSAndroid Build Coastguard Worker * Copies the decoding tile parameters onto all the tile parameters.
177*3ac0a46fSAndroid Build Coastguard Worker * Creates also the tile decoder.
178*3ac0a46fSAndroid Build Coastguard Worker */
179*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,
180*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
181*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
182*3ac0a46fSAndroid Build Coastguard Worker
183*3ac0a46fSAndroid Build Coastguard Worker /**
184*3ac0a46fSAndroid Build Coastguard Worker * Destroys the memory associated with the decoding of headers.
185*3ac0a46fSAndroid Build Coastguard Worker */
186*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,
187*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
188*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
189*3ac0a46fSAndroid Build Coastguard Worker
190*3ac0a46fSAndroid Build Coastguard Worker /**
191*3ac0a46fSAndroid Build Coastguard Worker * Reads the lookup table containing all the marker, status and action, and returns the handler associated
192*3ac0a46fSAndroid Build Coastguard Worker * with the marker value.
193*3ac0a46fSAndroid Build Coastguard Worker * @param p_id Marker value to look up
194*3ac0a46fSAndroid Build Coastguard Worker *
195*3ac0a46fSAndroid Build Coastguard Worker * @return the handler associated with the id.
196*3ac0a46fSAndroid Build Coastguard Worker */
197*3ac0a46fSAndroid Build Coastguard Worker static const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler(
198*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_id);
199*3ac0a46fSAndroid Build Coastguard Worker
200*3ac0a46fSAndroid Build Coastguard Worker /**
201*3ac0a46fSAndroid Build Coastguard Worker * Destroys a tile coding parameter structure.
202*3ac0a46fSAndroid Build Coastguard Worker *
203*3ac0a46fSAndroid Build Coastguard Worker * @param p_tcp the tile coding parameter to destroy.
204*3ac0a46fSAndroid Build Coastguard Worker */
205*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp);
206*3ac0a46fSAndroid Build Coastguard Worker
207*3ac0a46fSAndroid Build Coastguard Worker /**
208*3ac0a46fSAndroid Build Coastguard Worker * Destroys the data inside a tile coding parameter structure.
209*3ac0a46fSAndroid Build Coastguard Worker *
210*3ac0a46fSAndroid Build Coastguard Worker * @param p_tcp the tile coding parameter which contain data to destroy.
211*3ac0a46fSAndroid Build Coastguard Worker */
212*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp);
213*3ac0a46fSAndroid Build Coastguard Worker
214*3ac0a46fSAndroid Build Coastguard Worker /**
215*3ac0a46fSAndroid Build Coastguard Worker * Destroys a coding parameter structure.
216*3ac0a46fSAndroid Build Coastguard Worker *
217*3ac0a46fSAndroid Build Coastguard Worker * @param p_cp the coding parameter to destroy.
218*3ac0a46fSAndroid Build Coastguard Worker */
219*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_cp_destroy(opj_cp_t *p_cp);
220*3ac0a46fSAndroid Build Coastguard Worker
221*3ac0a46fSAndroid Build Coastguard Worker /**
222*3ac0a46fSAndroid Build Coastguard Worker * Compare 2 a SPCod/ SPCoc elements, i.e. the coding style of a given component of a tile.
223*3ac0a46fSAndroid Build Coastguard Worker *
224*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
225*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_no Tile number
226*3ac0a46fSAndroid Build Coastguard Worker * @param p_first_comp_no The 1st component number to compare.
227*3ac0a46fSAndroid Build Coastguard Worker * @param p_second_comp_no The 1st component number to compare.
228*3ac0a46fSAndroid Build Coastguard Worker *
229*3ac0a46fSAndroid Build Coastguard Worker * @return OPJ_TRUE if SPCdod are equals.
230*3ac0a46fSAndroid Build Coastguard Worker */
231*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_compare_SPCod_SPCoc(opj_j2k_t *p_j2k,
232*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
233*3ac0a46fSAndroid Build Coastguard Worker
234*3ac0a46fSAndroid Build Coastguard Worker /**
235*3ac0a46fSAndroid Build Coastguard Worker * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
236*3ac0a46fSAndroid Build Coastguard Worker *
237*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
238*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_no FIXME DOC
239*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the component number to output.
240*3ac0a46fSAndroid Build Coastguard Worker * @param p_data FIXME DOC
241*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size FIXME DOC
242*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
243*3ac0a46fSAndroid Build Coastguard Worker *
244*3ac0a46fSAndroid Build Coastguard Worker * @return FIXME DOC
245*3ac0a46fSAndroid Build Coastguard Worker */
246*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(opj_j2k_t *p_j2k,
247*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
248*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
249*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
250*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_header_size,
251*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
252*3ac0a46fSAndroid Build Coastguard Worker
253*3ac0a46fSAndroid Build Coastguard Worker /**
254*3ac0a46fSAndroid Build Coastguard Worker * Gets the size taken by writing a SPCod or SPCoc for the given tile and component.
255*3ac0a46fSAndroid Build Coastguard Worker *
256*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the J2K codec.
257*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_no the tile index.
258*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the component being outputted.
259*3ac0a46fSAndroid Build Coastguard Worker *
260*3ac0a46fSAndroid Build Coastguard Worker * @return the number of bytes taken by the SPCod element.
261*3ac0a46fSAndroid Build Coastguard Worker */
262*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t *p_j2k,
263*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
264*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no);
265*3ac0a46fSAndroid Build Coastguard Worker
266*3ac0a46fSAndroid Build Coastguard Worker /**
267*3ac0a46fSAndroid Build Coastguard Worker * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
268*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
269*3ac0a46fSAndroid Build Coastguard Worker * @param compno FIXME DOC
270*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the COM box.
271*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the COM marker.
272*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
273*3ac0a46fSAndroid Build Coastguard Worker */
274*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
275*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno,
276*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
277*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_header_size,
278*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
279*3ac0a46fSAndroid Build Coastguard Worker
280*3ac0a46fSAndroid Build Coastguard Worker /**
281*3ac0a46fSAndroid Build Coastguard Worker * Gets the size taken by writing SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
282*3ac0a46fSAndroid Build Coastguard Worker *
283*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_no the tile index.
284*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the component being outputted.
285*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the J2K codec.
286*3ac0a46fSAndroid Build Coastguard Worker *
287*3ac0a46fSAndroid Build Coastguard Worker * @return the number of bytes taken by the SPCod element.
288*3ac0a46fSAndroid Build Coastguard Worker */
289*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size(opj_j2k_t *p_j2k,
290*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
291*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no);
292*3ac0a46fSAndroid Build Coastguard Worker
293*3ac0a46fSAndroid Build Coastguard Worker /**
294*3ac0a46fSAndroid Build Coastguard Worker * Compares 2 SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
295*3ac0a46fSAndroid Build Coastguard Worker *
296*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
297*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_no the tile to output.
298*3ac0a46fSAndroid Build Coastguard Worker * @param p_first_comp_no the first component number to compare.
299*3ac0a46fSAndroid Build Coastguard Worker * @param p_second_comp_no the second component number to compare.
300*3ac0a46fSAndroid Build Coastguard Worker *
301*3ac0a46fSAndroid Build Coastguard Worker * @return OPJ_TRUE if equals.
302*3ac0a46fSAndroid Build Coastguard Worker */
303*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_compare_SQcd_SQcc(opj_j2k_t *p_j2k,
304*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
305*3ac0a46fSAndroid Build Coastguard Worker
306*3ac0a46fSAndroid Build Coastguard Worker
307*3ac0a46fSAndroid Build Coastguard Worker /**
308*3ac0a46fSAndroid Build Coastguard Worker * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
309*3ac0a46fSAndroid Build Coastguard Worker *
310*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_no the tile to output.
311*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the component number to output.
312*3ac0a46fSAndroid Build Coastguard Worker * @param p_data the data buffer.
313*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size pointer to the size of the data buffer, it is changed by the function.
314*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
315*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
316*3ac0a46fSAndroid Build Coastguard Worker *
317*3ac0a46fSAndroid Build Coastguard Worker */
318*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
319*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
320*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
321*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
322*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_header_size,
323*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
324*3ac0a46fSAndroid Build Coastguard Worker
325*3ac0a46fSAndroid Build Coastguard Worker /**
326*3ac0a46fSAndroid Build Coastguard Worker * Updates the Tile Length Marker.
327*3ac0a46fSAndroid Build Coastguard Worker */
328*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_update_tlm(opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size);
329*3ac0a46fSAndroid Build Coastguard Worker
330*3ac0a46fSAndroid Build Coastguard Worker /**
331*3ac0a46fSAndroid Build Coastguard Worker * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
332*3ac0a46fSAndroid Build Coastguard Worker *
333*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
334*3ac0a46fSAndroid Build Coastguard Worker * @param compno the component number to output.
335*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data buffer.
336*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size pointer to the size of the data buffer, it is changed by the function.
337*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
338*3ac0a46fSAndroid Build Coastguard Worker *
339*3ac0a46fSAndroid Build Coastguard Worker */
340*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
341*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno,
342*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
343*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_header_size,
344*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
345*3ac0a46fSAndroid Build Coastguard Worker
346*3ac0a46fSAndroid Build Coastguard Worker /**
347*3ac0a46fSAndroid Build Coastguard Worker * Copies the tile component parameters of all the component from the first tile component.
348*3ac0a46fSAndroid Build Coastguard Worker *
349*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the J2k codec.
350*3ac0a46fSAndroid Build Coastguard Worker */
351*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k);
352*3ac0a46fSAndroid Build Coastguard Worker
353*3ac0a46fSAndroid Build Coastguard Worker /**
354*3ac0a46fSAndroid Build Coastguard Worker * Copies the tile quantization parameters of all the component from the first tile component.
355*3ac0a46fSAndroid Build Coastguard Worker *
356*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the J2k codec.
357*3ac0a46fSAndroid Build Coastguard Worker */
358*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k);
359*3ac0a46fSAndroid Build Coastguard Worker
360*3ac0a46fSAndroid Build Coastguard Worker /**
361*3ac0a46fSAndroid Build Coastguard Worker * Reads the tiles.
362*3ac0a46fSAndroid Build Coastguard Worker */
363*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
364*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
365*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
366*3ac0a46fSAndroid Build Coastguard Worker
367*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,
368*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_index,
369*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
370*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
371*3ac0a46fSAndroid Build Coastguard Worker
372*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd,
373*3ac0a46fSAndroid Build Coastguard Worker opj_image_t* p_output_image);
374*3ac0a46fSAndroid Build Coastguard Worker
375*3ac0a46fSAndroid Build Coastguard Worker static void opj_get_tile_dimensions(opj_image_t * l_image,
376*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t * l_tilec,
377*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp,
378*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_size_comp,
379*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_width,
380*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_height,
381*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_offset_x,
382*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_offset_y,
383*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_image_width,
384*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_stride,
385*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_tile_offset);
386*3ac0a46fSAndroid Build Coastguard Worker
387*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_get_tile_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
388*3ac0a46fSAndroid Build Coastguard Worker
389*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_post_write_tile(opj_j2k_t * p_j2k,
390*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
391*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
392*3ac0a46fSAndroid Build Coastguard Worker
393*3ac0a46fSAndroid Build Coastguard Worker /**
394*3ac0a46fSAndroid Build Coastguard Worker * Sets up the procedures to do on writing header.
395*3ac0a46fSAndroid Build Coastguard Worker * Developers wanting to extend the library can add their own writing procedures.
396*3ac0a46fSAndroid Build Coastguard Worker */
397*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
398*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
399*3ac0a46fSAndroid Build Coastguard Worker
400*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_first_tile_part(opj_j2k_t *p_j2k,
401*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
402*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
403*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 total_data_size,
404*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
405*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager);
406*3ac0a46fSAndroid Build Coastguard Worker
407*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_all_tile_parts(opj_j2k_t *p_j2k,
408*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
409*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
410*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 total_data_size,
411*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
412*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager);
413*3ac0a46fSAndroid Build Coastguard Worker
414*3ac0a46fSAndroid Build Coastguard Worker /**
415*3ac0a46fSAndroid Build Coastguard Worker * Gets the offset of the header.
416*3ac0a46fSAndroid Build Coastguard Worker *
417*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
418*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
419*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
420*3ac0a46fSAndroid Build Coastguard Worker */
421*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
422*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
423*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
424*3ac0a46fSAndroid Build Coastguard Worker
425*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k);
426*3ac0a46fSAndroid Build Coastguard Worker
427*3ac0a46fSAndroid Build Coastguard Worker /*
428*3ac0a46fSAndroid Build Coastguard Worker * -----------------------------------------------------------------------
429*3ac0a46fSAndroid Build Coastguard Worker * -----------------------------------------------------------------------
430*3ac0a46fSAndroid Build Coastguard Worker * -----------------------------------------------------------------------
431*3ac0a46fSAndroid Build Coastguard Worker */
432*3ac0a46fSAndroid Build Coastguard Worker
433*3ac0a46fSAndroid Build Coastguard Worker /**
434*3ac0a46fSAndroid Build Coastguard Worker * Writes the SOC marker (Start Of Codestream)
435*3ac0a46fSAndroid Build Coastguard Worker *
436*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
437*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
438*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
439*3ac0a46fSAndroid Build Coastguard Worker */
440*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_soc(opj_j2k_t *p_j2k,
441*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
442*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
443*3ac0a46fSAndroid Build Coastguard Worker
444*3ac0a46fSAndroid Build Coastguard Worker /**
445*3ac0a46fSAndroid Build Coastguard Worker * Reads a SOC marker (Start of Codestream)
446*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 file codec.
447*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream XXX needs data
448*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
449*3ac0a46fSAndroid Build Coastguard Worker */
450*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_soc(opj_j2k_t *p_j2k,
451*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
452*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
453*3ac0a46fSAndroid Build Coastguard Worker
454*3ac0a46fSAndroid Build Coastguard Worker /**
455*3ac0a46fSAndroid Build Coastguard Worker * Writes the SIZ marker (image and tile size)
456*3ac0a46fSAndroid Build Coastguard Worker *
457*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
458*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
459*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
460*3ac0a46fSAndroid Build Coastguard Worker */
461*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_siz(opj_j2k_t *p_j2k,
462*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
463*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
464*3ac0a46fSAndroid Build Coastguard Worker
465*3ac0a46fSAndroid Build Coastguard Worker /**
466*3ac0a46fSAndroid Build Coastguard Worker * Reads a SIZ marker (image and tile size)
467*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 file codec.
468*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the SIZ box.
469*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the SIZ marker.
470*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
471*3ac0a46fSAndroid Build Coastguard Worker */
472*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
473*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
474*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
475*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
476*3ac0a46fSAndroid Build Coastguard Worker
477*3ac0a46fSAndroid Build Coastguard Worker /**
478*3ac0a46fSAndroid Build Coastguard Worker * Writes the COM marker (comment)
479*3ac0a46fSAndroid Build Coastguard Worker *
480*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
481*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
482*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
483*3ac0a46fSAndroid Build Coastguard Worker */
484*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_com(opj_j2k_t *p_j2k,
485*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
486*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
487*3ac0a46fSAndroid Build Coastguard Worker
488*3ac0a46fSAndroid Build Coastguard Worker /**
489*3ac0a46fSAndroid Build Coastguard Worker * Reads a COM marker (comments)
490*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 file codec.
491*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the COM box.
492*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the COM marker.
493*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
494*3ac0a46fSAndroid Build Coastguard Worker */
495*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_com(opj_j2k_t *p_j2k,
496*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
497*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
498*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
499*3ac0a46fSAndroid Build Coastguard Worker /**
500*3ac0a46fSAndroid Build Coastguard Worker * Writes the COD marker (Coding style default)
501*3ac0a46fSAndroid Build Coastguard Worker *
502*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
503*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
504*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
505*3ac0a46fSAndroid Build Coastguard Worker */
506*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_cod(opj_j2k_t *p_j2k,
507*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
508*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
509*3ac0a46fSAndroid Build Coastguard Worker
510*3ac0a46fSAndroid Build Coastguard Worker /**
511*3ac0a46fSAndroid Build Coastguard Worker * Reads a COD marker (Coding style defaults)
512*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the COD box.
513*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
514*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the COD marker.
515*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
516*3ac0a46fSAndroid Build Coastguard Worker */
517*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_cod(opj_j2k_t *p_j2k,
518*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
519*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
520*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
521*3ac0a46fSAndroid Build Coastguard Worker
522*3ac0a46fSAndroid Build Coastguard Worker /**
523*3ac0a46fSAndroid Build Coastguard Worker * Compares 2 COC markers (Coding style component)
524*3ac0a46fSAndroid Build Coastguard Worker *
525*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
526*3ac0a46fSAndroid Build Coastguard Worker * @param p_first_comp_no the index of the first component to compare.
527*3ac0a46fSAndroid Build Coastguard Worker * @param p_second_comp_no the index of the second component to compare.
528*3ac0a46fSAndroid Build Coastguard Worker *
529*3ac0a46fSAndroid Build Coastguard Worker * @return OPJ_TRUE if equals
530*3ac0a46fSAndroid Build Coastguard Worker */
531*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_compare_coc(opj_j2k_t *p_j2k,
532*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
533*3ac0a46fSAndroid Build Coastguard Worker
534*3ac0a46fSAndroid Build Coastguard Worker /**
535*3ac0a46fSAndroid Build Coastguard Worker * Writes the COC marker (Coding style component)
536*3ac0a46fSAndroid Build Coastguard Worker *
537*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
538*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the index of the component to output.
539*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
540*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
541*3ac0a46fSAndroid Build Coastguard Worker */
542*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_coc(opj_j2k_t *p_j2k,
543*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
544*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
545*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
546*3ac0a46fSAndroid Build Coastguard Worker
547*3ac0a46fSAndroid Build Coastguard Worker /**
548*3ac0a46fSAndroid Build Coastguard Worker * Writes the COC marker (Coding style component)
549*3ac0a46fSAndroid Build Coastguard Worker *
550*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
551*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the index of the component to output.
552*3ac0a46fSAndroid Build Coastguard Worker * @param p_data FIXME DOC
553*3ac0a46fSAndroid Build Coastguard Worker * @param p_data_written FIXME DOC
554*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
555*3ac0a46fSAndroid Build Coastguard Worker */
556*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
557*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
558*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
559*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
560*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
561*3ac0a46fSAndroid Build Coastguard Worker
562*3ac0a46fSAndroid Build Coastguard Worker /**
563*3ac0a46fSAndroid Build Coastguard Worker * Gets the maximum size taken by a coc.
564*3ac0a46fSAndroid Build Coastguard Worker *
565*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec to use.
566*3ac0a46fSAndroid Build Coastguard Worker */
567*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k);
568*3ac0a46fSAndroid Build Coastguard Worker
569*3ac0a46fSAndroid Build Coastguard Worker /**
570*3ac0a46fSAndroid Build Coastguard Worker * Reads a COC marker (Coding Style Component)
571*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the COC box.
572*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
573*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the COC marker.
574*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
575*3ac0a46fSAndroid Build Coastguard Worker */
576*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_coc(opj_j2k_t *p_j2k,
577*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
578*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
579*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
580*3ac0a46fSAndroid Build Coastguard Worker
581*3ac0a46fSAndroid Build Coastguard Worker /**
582*3ac0a46fSAndroid Build Coastguard Worker * Writes the QCD marker (quantization default)
583*3ac0a46fSAndroid Build Coastguard Worker *
584*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
585*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
586*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
587*3ac0a46fSAndroid Build Coastguard Worker */
588*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_qcd(opj_j2k_t *p_j2k,
589*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
590*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
591*3ac0a46fSAndroid Build Coastguard Worker
592*3ac0a46fSAndroid Build Coastguard Worker /**
593*3ac0a46fSAndroid Build Coastguard Worker * Reads a QCD marker (Quantization defaults)
594*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the QCD box.
595*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
596*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the QCD marker.
597*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
598*3ac0a46fSAndroid Build Coastguard Worker */
599*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_qcd(opj_j2k_t *p_j2k,
600*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
601*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
602*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
603*3ac0a46fSAndroid Build Coastguard Worker
604*3ac0a46fSAndroid Build Coastguard Worker /**
605*3ac0a46fSAndroid Build Coastguard Worker * Compare QCC markers (quantization component)
606*3ac0a46fSAndroid Build Coastguard Worker *
607*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
608*3ac0a46fSAndroid Build Coastguard Worker * @param p_first_comp_no the index of the first component to compare.
609*3ac0a46fSAndroid Build Coastguard Worker * @param p_second_comp_no the index of the second component to compare.
610*3ac0a46fSAndroid Build Coastguard Worker *
611*3ac0a46fSAndroid Build Coastguard Worker * @return OPJ_TRUE if equals.
612*3ac0a46fSAndroid Build Coastguard Worker */
613*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_compare_qcc(opj_j2k_t *p_j2k,
614*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
615*3ac0a46fSAndroid Build Coastguard Worker
616*3ac0a46fSAndroid Build Coastguard Worker /**
617*3ac0a46fSAndroid Build Coastguard Worker * Writes the QCC marker (quantization component)
618*3ac0a46fSAndroid Build Coastguard Worker *
619*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the index of the component to output.
620*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
621*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
622*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
623*3ac0a46fSAndroid Build Coastguard Worker */
624*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_qcc(opj_j2k_t *p_j2k,
625*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
626*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
627*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
628*3ac0a46fSAndroid Build Coastguard Worker
629*3ac0a46fSAndroid Build Coastguard Worker /**
630*3ac0a46fSAndroid Build Coastguard Worker * Writes the QCC marker (quantization component)
631*3ac0a46fSAndroid Build Coastguard Worker *
632*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
633*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the index of the component to output.
634*3ac0a46fSAndroid Build Coastguard Worker * @param p_data FIXME DOC
635*3ac0a46fSAndroid Build Coastguard Worker * @param p_data_written the stream to write data to.
636*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
637*3ac0a46fSAndroid Build Coastguard Worker */
638*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
639*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
640*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
641*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
642*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
643*3ac0a46fSAndroid Build Coastguard Worker
644*3ac0a46fSAndroid Build Coastguard Worker /**
645*3ac0a46fSAndroid Build Coastguard Worker * Gets the maximum size taken by a qcc.
646*3ac0a46fSAndroid Build Coastguard Worker */
647*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_max_qcc_size(opj_j2k_t *p_j2k);
648*3ac0a46fSAndroid Build Coastguard Worker
649*3ac0a46fSAndroid Build Coastguard Worker /**
650*3ac0a46fSAndroid Build Coastguard Worker * Reads a QCC marker (Quantization component)
651*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the QCC box.
652*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
653*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the QCC marker.
654*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
655*3ac0a46fSAndroid Build Coastguard Worker */
656*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_qcc(opj_j2k_t *p_j2k,
657*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
658*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
659*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
660*3ac0a46fSAndroid Build Coastguard Worker /**
661*3ac0a46fSAndroid Build Coastguard Worker * Writes the POC marker (Progression Order Change)
662*3ac0a46fSAndroid Build Coastguard Worker *
663*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
664*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
665*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
666*3ac0a46fSAndroid Build Coastguard Worker */
667*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_poc(opj_j2k_t *p_j2k,
668*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
669*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
670*3ac0a46fSAndroid Build Coastguard Worker /**
671*3ac0a46fSAndroid Build Coastguard Worker * Writes the POC marker (Progression Order Change)
672*3ac0a46fSAndroid Build Coastguard Worker *
673*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
674*3ac0a46fSAndroid Build Coastguard Worker * @param p_data FIXME DOC
675*3ac0a46fSAndroid Build Coastguard Worker * @param p_data_written the stream to write data to.
676*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
677*3ac0a46fSAndroid Build Coastguard Worker */
678*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
679*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
680*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
681*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
682*3ac0a46fSAndroid Build Coastguard Worker /**
683*3ac0a46fSAndroid Build Coastguard Worker * Gets the maximum size taken by the writing of a POC.
684*3ac0a46fSAndroid Build Coastguard Worker */
685*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k);
686*3ac0a46fSAndroid Build Coastguard Worker
687*3ac0a46fSAndroid Build Coastguard Worker /**
688*3ac0a46fSAndroid Build Coastguard Worker * Reads a POC marker (Progression Order Change)
689*3ac0a46fSAndroid Build Coastguard Worker *
690*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the POC box.
691*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
692*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the POC marker.
693*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
694*3ac0a46fSAndroid Build Coastguard Worker */
695*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_poc(opj_j2k_t *p_j2k,
696*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
697*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
698*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
699*3ac0a46fSAndroid Build Coastguard Worker
700*3ac0a46fSAndroid Build Coastguard Worker /**
701*3ac0a46fSAndroid Build Coastguard Worker * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.
702*3ac0a46fSAndroid Build Coastguard Worker */
703*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k);
704*3ac0a46fSAndroid Build Coastguard Worker
705*3ac0a46fSAndroid Build Coastguard Worker /**
706*3ac0a46fSAndroid Build Coastguard Worker * Gets the maximum size taken by the headers of the SOT.
707*3ac0a46fSAndroid Build Coastguard Worker *
708*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec to use.
709*3ac0a46fSAndroid Build Coastguard Worker */
710*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k);
711*3ac0a46fSAndroid Build Coastguard Worker
712*3ac0a46fSAndroid Build Coastguard Worker /**
713*3ac0a46fSAndroid Build Coastguard Worker * Reads a CRG marker (Component registration)
714*3ac0a46fSAndroid Build Coastguard Worker *
715*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the TLM box.
716*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
717*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the TLM marker.
718*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
719*3ac0a46fSAndroid Build Coastguard Worker */
720*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_crg(opj_j2k_t *p_j2k,
721*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
722*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
723*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
724*3ac0a46fSAndroid Build Coastguard Worker /**
725*3ac0a46fSAndroid Build Coastguard Worker * Reads a TLM marker (Tile Length Marker)
726*3ac0a46fSAndroid Build Coastguard Worker *
727*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the TLM box.
728*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
729*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the TLM marker.
730*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
731*3ac0a46fSAndroid Build Coastguard Worker */
732*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_tlm(opj_j2k_t *p_j2k,
733*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
734*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
735*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
736*3ac0a46fSAndroid Build Coastguard Worker
737*3ac0a46fSAndroid Build Coastguard Worker /**
738*3ac0a46fSAndroid Build Coastguard Worker * Writes the updated tlm.
739*3ac0a46fSAndroid Build Coastguard Worker *
740*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
741*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
742*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
743*3ac0a46fSAndroid Build Coastguard Worker */
744*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_updated_tlm(opj_j2k_t *p_j2k,
745*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
746*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
747*3ac0a46fSAndroid Build Coastguard Worker
748*3ac0a46fSAndroid Build Coastguard Worker /**
749*3ac0a46fSAndroid Build Coastguard Worker * Reads a PLM marker (Packet length, main header marker)
750*3ac0a46fSAndroid Build Coastguard Worker *
751*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the TLM box.
752*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
753*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the TLM marker.
754*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
755*3ac0a46fSAndroid Build Coastguard Worker */
756*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_plm(opj_j2k_t *p_j2k,
757*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
758*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
759*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
760*3ac0a46fSAndroid Build Coastguard Worker /**
761*3ac0a46fSAndroid Build Coastguard Worker * Reads a PLT marker (Packet length, tile-part header)
762*3ac0a46fSAndroid Build Coastguard Worker *
763*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the PLT box.
764*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
765*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the PLT marker.
766*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
767*3ac0a46fSAndroid Build Coastguard Worker */
768*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_plt(opj_j2k_t *p_j2k,
769*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
770*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
771*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
772*3ac0a46fSAndroid Build Coastguard Worker
773*3ac0a46fSAndroid Build Coastguard Worker /**
774*3ac0a46fSAndroid Build Coastguard Worker * Reads a PPM marker (Packed headers, main header)
775*3ac0a46fSAndroid Build Coastguard Worker *
776*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the POC box.
777*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
778*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the POC marker.
779*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
780*3ac0a46fSAndroid Build Coastguard Worker */
781*3ac0a46fSAndroid Build Coastguard Worker
782*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_ppm(
783*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t *p_j2k,
784*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
785*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
786*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
787*3ac0a46fSAndroid Build Coastguard Worker
788*3ac0a46fSAndroid Build Coastguard Worker /**
789*3ac0a46fSAndroid Build Coastguard Worker * Merges all PPM markers read (Packed headers, main header)
790*3ac0a46fSAndroid Build Coastguard Worker *
791*3ac0a46fSAndroid Build Coastguard Worker * @param p_cp main coding parameters.
792*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
793*3ac0a46fSAndroid Build Coastguard Worker */
794*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_merge_ppm(opj_cp_t *p_cp, opj_event_mgr_t * p_manager);
795*3ac0a46fSAndroid Build Coastguard Worker
796*3ac0a46fSAndroid Build Coastguard Worker /**
797*3ac0a46fSAndroid Build Coastguard Worker * Reads a PPT marker (Packed packet headers, tile-part header)
798*3ac0a46fSAndroid Build Coastguard Worker *
799*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the PPT box.
800*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
801*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the PPT marker.
802*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
803*3ac0a46fSAndroid Build Coastguard Worker */
804*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_ppt(opj_j2k_t *p_j2k,
805*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
806*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
807*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
808*3ac0a46fSAndroid Build Coastguard Worker
809*3ac0a46fSAndroid Build Coastguard Worker /**
810*3ac0a46fSAndroid Build Coastguard Worker * Merges all PPT markers read (Packed headers, tile-part header)
811*3ac0a46fSAndroid Build Coastguard Worker *
812*3ac0a46fSAndroid Build Coastguard Worker * @param p_tcp the tile.
813*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
814*3ac0a46fSAndroid Build Coastguard Worker */
815*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp,
816*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
817*3ac0a46fSAndroid Build Coastguard Worker
818*3ac0a46fSAndroid Build Coastguard Worker
819*3ac0a46fSAndroid Build Coastguard Worker /**
820*3ac0a46fSAndroid Build Coastguard Worker * Writes the TLM marker (Tile Length Marker)
821*3ac0a46fSAndroid Build Coastguard Worker *
822*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
823*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
824*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
825*3ac0a46fSAndroid Build Coastguard Worker */
826*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_tlm(opj_j2k_t *p_j2k,
827*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
828*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
829*3ac0a46fSAndroid Build Coastguard Worker
830*3ac0a46fSAndroid Build Coastguard Worker /**
831*3ac0a46fSAndroid Build Coastguard Worker * Writes the SOT marker (Start of tile-part)
832*3ac0a46fSAndroid Build Coastguard Worker *
833*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
834*3ac0a46fSAndroid Build Coastguard Worker * @param p_data Output buffer
835*3ac0a46fSAndroid Build Coastguard Worker * @param total_data_size Output buffer size
836*3ac0a46fSAndroid Build Coastguard Worker * @param p_data_written Number of bytes written into stream
837*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
838*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
839*3ac0a46fSAndroid Build Coastguard Worker */
840*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_sot(opj_j2k_t *p_j2k,
841*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
842*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 total_data_size,
843*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
844*3ac0a46fSAndroid Build Coastguard Worker const opj_stream_private_t *p_stream,
845*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
846*3ac0a46fSAndroid Build Coastguard Worker
847*3ac0a46fSAndroid Build Coastguard Worker /**
848*3ac0a46fSAndroid Build Coastguard Worker * Reads values from a SOT marker (Start of tile-part)
849*3ac0a46fSAndroid Build Coastguard Worker *
850*3ac0a46fSAndroid Build Coastguard Worker * the j2k decoder state is not affected. No side effects, no checks except for p_header_size.
851*3ac0a46fSAndroid Build Coastguard Worker *
852*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the SOT marker.
853*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the SOT marker.
854*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_no Isot.
855*3ac0a46fSAndroid Build Coastguard Worker * @param p_tot_len Psot.
856*3ac0a46fSAndroid Build Coastguard Worker * @param p_current_part TPsot.
857*3ac0a46fSAndroid Build Coastguard Worker * @param p_num_parts TNsot.
858*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
859*3ac0a46fSAndroid Build Coastguard Worker */
860*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE * p_header_data,
861*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
862*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* p_tile_no,
863*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* p_tot_len,
864*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* p_current_part,
865*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* p_num_parts,
866*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
867*3ac0a46fSAndroid Build Coastguard Worker /**
868*3ac0a46fSAndroid Build Coastguard Worker * Reads a SOT marker (Start of tile-part)
869*3ac0a46fSAndroid Build Coastguard Worker *
870*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the SOT marker.
871*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
872*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the PPT marker.
873*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
874*3ac0a46fSAndroid Build Coastguard Worker */
875*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_sot(opj_j2k_t *p_j2k,
876*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
877*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
878*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
879*3ac0a46fSAndroid Build Coastguard Worker /**
880*3ac0a46fSAndroid Build Coastguard Worker * Writes the SOD marker (Start of data)
881*3ac0a46fSAndroid Build Coastguard Worker *
882*3ac0a46fSAndroid Build Coastguard Worker * This also writes optional PLT markers (before SOD)
883*3ac0a46fSAndroid Build Coastguard Worker *
884*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
885*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_coder FIXME DOC
886*3ac0a46fSAndroid Build Coastguard Worker * @param p_data FIXME DOC
887*3ac0a46fSAndroid Build Coastguard Worker * @param p_data_written FIXME DOC
888*3ac0a46fSAndroid Build Coastguard Worker * @param total_data_size FIXME DOC
889*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
890*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
891*3ac0a46fSAndroid Build Coastguard Worker */
892*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_sod(opj_j2k_t *p_j2k,
893*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_t * p_tile_coder,
894*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
895*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
896*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 total_data_size,
897*3ac0a46fSAndroid Build Coastguard Worker const opj_stream_private_t *p_stream,
898*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
899*3ac0a46fSAndroid Build Coastguard Worker
900*3ac0a46fSAndroid Build Coastguard Worker /**
901*3ac0a46fSAndroid Build Coastguard Worker * Reads a SOD marker (Start Of Data)
902*3ac0a46fSAndroid Build Coastguard Worker *
903*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
904*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream FIXME DOC
905*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
906*3ac0a46fSAndroid Build Coastguard Worker */
907*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_sod(opj_j2k_t *p_j2k,
908*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
909*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
910*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_update_tlm(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_part_size)911*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_update_tlm(opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size)
912*3ac0a46fSAndroid Build Coastguard Worker {
913*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte) {
914*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
915*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number, 1);
916*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 1;
917*3ac0a46fSAndroid Build Coastguard Worker } else {
918*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
919*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number, 2);
920*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 2;
921*3ac0a46fSAndroid Build Coastguard Worker }
922*3ac0a46fSAndroid Build Coastguard Worker
923*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
924*3ac0a46fSAndroid Build Coastguard Worker p_tile_part_size, 4); /* PSOT */
925*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
926*3ac0a46fSAndroid Build Coastguard Worker }
927*3ac0a46fSAndroid Build Coastguard Worker
928*3ac0a46fSAndroid Build Coastguard Worker /**
929*3ac0a46fSAndroid Build Coastguard Worker * Writes the RGN marker (Region Of Interest)
930*3ac0a46fSAndroid Build Coastguard Worker *
931*3ac0a46fSAndroid Build Coastguard Worker * @param p_tile_no the tile to output
932*3ac0a46fSAndroid Build Coastguard Worker * @param p_comp_no the component to output
933*3ac0a46fSAndroid Build Coastguard Worker * @param nb_comps the number of components
934*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
935*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
936*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
937*3ac0a46fSAndroid Build Coastguard Worker */
938*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
939*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
940*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
941*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 nb_comps,
942*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
943*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
944*3ac0a46fSAndroid Build Coastguard Worker
945*3ac0a46fSAndroid Build Coastguard Worker /**
946*3ac0a46fSAndroid Build Coastguard Worker * Reads a RGN marker (Region Of Interest)
947*3ac0a46fSAndroid Build Coastguard Worker *
948*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the POC box.
949*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
950*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the POC marker.
951*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
952*3ac0a46fSAndroid Build Coastguard Worker */
953*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_rgn(opj_j2k_t *p_j2k,
954*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
955*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
956*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
957*3ac0a46fSAndroid Build Coastguard Worker
958*3ac0a46fSAndroid Build Coastguard Worker /**
959*3ac0a46fSAndroid Build Coastguard Worker * Writes the EOC marker (End of Codestream)
960*3ac0a46fSAndroid Build Coastguard Worker *
961*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
962*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
963*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
964*3ac0a46fSAndroid Build Coastguard Worker */
965*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_eoc(opj_j2k_t *p_j2k,
966*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
967*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
968*3ac0a46fSAndroid Build Coastguard Worker
969*3ac0a46fSAndroid Build Coastguard Worker #if 0
970*3ac0a46fSAndroid Build Coastguard Worker /**
971*3ac0a46fSAndroid Build Coastguard Worker * Reads a EOC marker (End Of Codestream)
972*3ac0a46fSAndroid Build Coastguard Worker *
973*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
974*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream FIXME DOC
975*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
976*3ac0a46fSAndroid Build Coastguard Worker */
977*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_eoc(opj_j2k_t *p_j2k,
978*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
979*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
980*3ac0a46fSAndroid Build Coastguard Worker #endif
981*3ac0a46fSAndroid Build Coastguard Worker
982*3ac0a46fSAndroid Build Coastguard Worker /**
983*3ac0a46fSAndroid Build Coastguard Worker * Writes the CBD-MCT-MCC-MCO markers (Multi components transform)
984*3ac0a46fSAndroid Build Coastguard Worker *
985*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
986*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
987*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
988*3ac0a46fSAndroid Build Coastguard Worker */
989*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_mct_data_group(opj_j2k_t *p_j2k,
990*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
991*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
992*3ac0a46fSAndroid Build Coastguard Worker
993*3ac0a46fSAndroid Build Coastguard Worker /**
994*3ac0a46fSAndroid Build Coastguard Worker * Inits the Info
995*3ac0a46fSAndroid Build Coastguard Worker *
996*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
997*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
998*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
999*3ac0a46fSAndroid Build Coastguard Worker */
1000*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
1001*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1002*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1003*3ac0a46fSAndroid Build Coastguard Worker
1004*3ac0a46fSAndroid Build Coastguard Worker /**
1005*3ac0a46fSAndroid Build Coastguard Worker Add main header marker information
1006*3ac0a46fSAndroid Build Coastguard Worker @param cstr_index Codestream information structure
1007*3ac0a46fSAndroid Build Coastguard Worker @param type marker type
1008*3ac0a46fSAndroid Build Coastguard Worker @param pos byte offset of marker segment
1009*3ac0a46fSAndroid Build Coastguard Worker @param len length of marker segment
1010*3ac0a46fSAndroid Build Coastguard Worker */
1011*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
1012*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;
1013*3ac0a46fSAndroid Build Coastguard Worker /**
1014*3ac0a46fSAndroid Build Coastguard Worker Add tile header marker information
1015*3ac0a46fSAndroid Build Coastguard Worker @param tileno tile index number
1016*3ac0a46fSAndroid Build Coastguard Worker @param cstr_index Codestream information structure
1017*3ac0a46fSAndroid Build Coastguard Worker @param type marker type
1018*3ac0a46fSAndroid Build Coastguard Worker @param pos byte offset of marker segment
1019*3ac0a46fSAndroid Build Coastguard Worker @param len length of marker segment
1020*3ac0a46fSAndroid Build Coastguard Worker */
1021*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
1022*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
1023*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 len);
1024*3ac0a46fSAndroid Build Coastguard Worker
1025*3ac0a46fSAndroid Build Coastguard Worker /**
1026*3ac0a46fSAndroid Build Coastguard Worker * Reads an unknown marker
1027*3ac0a46fSAndroid Build Coastguard Worker *
1028*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
1029*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream object to read from.
1030*3ac0a46fSAndroid Build Coastguard Worker * @param output_marker FIXME DOC
1031*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1032*3ac0a46fSAndroid Build Coastguard Worker *
1033*3ac0a46fSAndroid Build Coastguard Worker * @return true if the marker could be deduced.
1034*3ac0a46fSAndroid Build Coastguard Worker */
1035*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_unk(opj_j2k_t *p_j2k,
1036*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1037*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 *output_marker,
1038*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1039*3ac0a46fSAndroid Build Coastguard Worker
1040*3ac0a46fSAndroid Build Coastguard Worker /**
1041*3ac0a46fSAndroid Build Coastguard Worker * Writes the MCT marker (Multiple Component Transform)
1042*3ac0a46fSAndroid Build Coastguard Worker *
1043*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1044*3ac0a46fSAndroid Build Coastguard Worker * @param p_mct_record FIXME DOC
1045*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1046*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1047*3ac0a46fSAndroid Build Coastguard Worker */
1048*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_mct_record(opj_j2k_t *p_j2k,
1049*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * p_mct_record,
1050*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1051*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1052*3ac0a46fSAndroid Build Coastguard Worker
1053*3ac0a46fSAndroid Build Coastguard Worker /**
1054*3ac0a46fSAndroid Build Coastguard Worker * Reads a MCT marker (Multiple Component Transform)
1055*3ac0a46fSAndroid Build Coastguard Worker *
1056*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the MCT box.
1057*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
1058*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the MCT marker.
1059*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1060*3ac0a46fSAndroid Build Coastguard Worker */
1061*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
1062*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
1063*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
1064*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1065*3ac0a46fSAndroid Build Coastguard Worker
1066*3ac0a46fSAndroid Build Coastguard Worker /**
1067*3ac0a46fSAndroid Build Coastguard Worker * Writes the MCC marker (Multiple Component Collection)
1068*3ac0a46fSAndroid Build Coastguard Worker *
1069*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1070*3ac0a46fSAndroid Build Coastguard Worker * @param p_mcc_record FIXME DOC
1071*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1072*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1073*3ac0a46fSAndroid Build Coastguard Worker */
1074*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_mcc_record(opj_j2k_t *p_j2k,
1075*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t * p_mcc_record,
1076*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1077*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1078*3ac0a46fSAndroid Build Coastguard Worker
1079*3ac0a46fSAndroid Build Coastguard Worker /**
1080*3ac0a46fSAndroid Build Coastguard Worker * Reads a MCC marker (Multiple Component Collection)
1081*3ac0a46fSAndroid Build Coastguard Worker *
1082*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the MCC box.
1083*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
1084*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the MCC marker.
1085*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1086*3ac0a46fSAndroid Build Coastguard Worker */
1087*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_mcc(opj_j2k_t *p_j2k,
1088*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
1089*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
1090*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1091*3ac0a46fSAndroid Build Coastguard Worker
1092*3ac0a46fSAndroid Build Coastguard Worker /**
1093*3ac0a46fSAndroid Build Coastguard Worker * Writes the MCO marker (Multiple component transformation ordering)
1094*3ac0a46fSAndroid Build Coastguard Worker *
1095*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1096*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1097*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1098*3ac0a46fSAndroid Build Coastguard Worker */
1099*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_mco(opj_j2k_t *p_j2k,
1100*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1101*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1102*3ac0a46fSAndroid Build Coastguard Worker
1103*3ac0a46fSAndroid Build Coastguard Worker /**
1104*3ac0a46fSAndroid Build Coastguard Worker * Reads a MCO marker (Multiple Component Transform Ordering)
1105*3ac0a46fSAndroid Build Coastguard Worker *
1106*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the MCO box.
1107*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
1108*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the MCO marker.
1109*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1110*3ac0a46fSAndroid Build Coastguard Worker */
1111*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_mco(opj_j2k_t *p_j2k,
1112*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
1113*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
1114*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1115*3ac0a46fSAndroid Build Coastguard Worker
1116*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
1117*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_index);
1118*3ac0a46fSAndroid Build Coastguard Worker
1119*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_int16_to_float(const void * p_src_data,
1120*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1121*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_int32_to_float(const void * p_src_data,
1122*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1123*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_float32_to_float(const void * p_src_data,
1124*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1125*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_float64_to_float(const void * p_src_data,
1126*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1127*3ac0a46fSAndroid Build Coastguard Worker
1128*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_int16_to_int32(const void * p_src_data,
1129*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1130*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_int32_to_int32(const void * p_src_data,
1131*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1132*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_float32_to_int32(const void * p_src_data,
1133*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1134*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_float64_to_int32(const void * p_src_data,
1135*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1136*3ac0a46fSAndroid Build Coastguard Worker
1137*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_float_to_int16(const void * p_src_data,
1138*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1139*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_float_to_int32(const void * p_src_data,
1140*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1141*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_float_to_float(const void * p_src_data,
1142*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1143*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_float_to_float64(const void * p_src_data,
1144*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1145*3ac0a46fSAndroid Build Coastguard Worker
1146*3ac0a46fSAndroid Build Coastguard Worker /**
1147*3ac0a46fSAndroid Build Coastguard Worker * Ends the encoding, i.e. frees memory.
1148*3ac0a46fSAndroid Build Coastguard Worker *
1149*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1150*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1151*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1152*3ac0a46fSAndroid Build Coastguard Worker */
1153*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
1154*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1155*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1156*3ac0a46fSAndroid Build Coastguard Worker
1157*3ac0a46fSAndroid Build Coastguard Worker /**
1158*3ac0a46fSAndroid Build Coastguard Worker * Writes the CBD marker (Component bit depth definition)
1159*3ac0a46fSAndroid Build Coastguard Worker *
1160*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1161*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1162*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1163*3ac0a46fSAndroid Build Coastguard Worker */
1164*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
1165*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1166*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1167*3ac0a46fSAndroid Build Coastguard Worker
1168*3ac0a46fSAndroid Build Coastguard Worker /**
1169*3ac0a46fSAndroid Build Coastguard Worker * Reads a CBD marker (Component bit depth definition)
1170*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the CBD box.
1171*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
1172*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the CBD marker.
1173*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1174*3ac0a46fSAndroid Build Coastguard Worker */
1175*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
1176*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
1177*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
1178*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1179*3ac0a46fSAndroid Build Coastguard Worker
1180*3ac0a46fSAndroid Build Coastguard Worker /**
1181*3ac0a46fSAndroid Build Coastguard Worker * Reads a CAP marker (extended capabilities definition). Empty implementation.
1182*3ac0a46fSAndroid Build Coastguard Worker * Found in HTJ2K files
1183*3ac0a46fSAndroid Build Coastguard Worker *
1184*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the CAP box.
1185*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
1186*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the CAP marker.
1187*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1188*3ac0a46fSAndroid Build Coastguard Worker */
1189*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_cap(opj_j2k_t *p_j2k,
1190*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
1191*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
1192*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1193*3ac0a46fSAndroid Build Coastguard Worker
1194*3ac0a46fSAndroid Build Coastguard Worker /**
1195*3ac0a46fSAndroid Build Coastguard Worker * Reads a CPF marker (corresponding profile). Empty implementation. Found in HTJ2K files
1196*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the CPF box.
1197*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
1198*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the CPF marker.
1199*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1200*3ac0a46fSAndroid Build Coastguard Worker */
1201*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_cpf(opj_j2k_t *p_j2k,
1202*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
1203*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
1204*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1205*3ac0a46fSAndroid Build Coastguard Worker
1206*3ac0a46fSAndroid Build Coastguard Worker
1207*3ac0a46fSAndroid Build Coastguard Worker /**
1208*3ac0a46fSAndroid Build Coastguard Worker * Writes COC marker for each component.
1209*3ac0a46fSAndroid Build Coastguard Worker *
1210*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1211*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1212*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1213*3ac0a46fSAndroid Build Coastguard Worker */
1214*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,
1215*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1216*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1217*3ac0a46fSAndroid Build Coastguard Worker
1218*3ac0a46fSAndroid Build Coastguard Worker /**
1219*3ac0a46fSAndroid Build Coastguard Worker * Writes QCC marker for each component.
1220*3ac0a46fSAndroid Build Coastguard Worker *
1221*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1222*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1223*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1224*3ac0a46fSAndroid Build Coastguard Worker */
1225*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,
1226*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1227*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1228*3ac0a46fSAndroid Build Coastguard Worker
1229*3ac0a46fSAndroid Build Coastguard Worker /**
1230*3ac0a46fSAndroid Build Coastguard Worker * Writes regions of interests.
1231*3ac0a46fSAndroid Build Coastguard Worker *
1232*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1233*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1234*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1235*3ac0a46fSAndroid Build Coastguard Worker */
1236*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_regions(opj_j2k_t *p_j2k,
1237*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1238*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1239*3ac0a46fSAndroid Build Coastguard Worker
1240*3ac0a46fSAndroid Build Coastguard Worker /**
1241*3ac0a46fSAndroid Build Coastguard Worker * Writes EPC ????
1242*3ac0a46fSAndroid Build Coastguard Worker *
1243*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
1244*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
1245*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1246*3ac0a46fSAndroid Build Coastguard Worker */
1247*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_epc(opj_j2k_t *p_j2k,
1248*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1249*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1250*3ac0a46fSAndroid Build Coastguard Worker
1251*3ac0a46fSAndroid Build Coastguard Worker /**
1252*3ac0a46fSAndroid Build Coastguard Worker * Checks the progression order changes values. Tells of the poc given as input are valid.
1253*3ac0a46fSAndroid Build Coastguard Worker * A nice message is outputted at errors.
1254*3ac0a46fSAndroid Build Coastguard Worker *
1255*3ac0a46fSAndroid Build Coastguard Worker * @param p_pocs the progression order changes.
1256*3ac0a46fSAndroid Build Coastguard Worker * @param tileno the tile number of interest
1257*3ac0a46fSAndroid Build Coastguard Worker * @param p_nb_pocs the number of progression order changes.
1258*3ac0a46fSAndroid Build Coastguard Worker * @param p_nb_resolutions the number of resolutions.
1259*3ac0a46fSAndroid Build Coastguard Worker * @param numcomps the number of components
1260*3ac0a46fSAndroid Build Coastguard Worker * @param numlayers the number of layers.
1261*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1262*3ac0a46fSAndroid Build Coastguard Worker *
1263*3ac0a46fSAndroid Build Coastguard Worker * @return true if the pocs are valid.
1264*3ac0a46fSAndroid Build Coastguard Worker */
1265*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_check_poc_val(const opj_poc_t *p_pocs,
1266*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tileno,
1267*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_nb_pocs,
1268*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_nb_resolutions,
1269*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 numcomps,
1270*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 numlayers,
1271*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1272*3ac0a46fSAndroid Build Coastguard Worker
1273*3ac0a46fSAndroid Build Coastguard Worker /**
1274*3ac0a46fSAndroid Build Coastguard Worker * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
1275*3ac0a46fSAndroid Build Coastguard Worker *
1276*3ac0a46fSAndroid Build Coastguard Worker * @param cp the coding parameters.
1277*3ac0a46fSAndroid Build Coastguard Worker * @param pino the offset of the given poc (i.e. its position in the coding parameter).
1278*3ac0a46fSAndroid Build Coastguard Worker * @param tileno the given tile.
1279*3ac0a46fSAndroid Build Coastguard Worker *
1280*3ac0a46fSAndroid Build Coastguard Worker * @return the number of tile parts.
1281*3ac0a46fSAndroid Build Coastguard Worker */
1282*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino,
1283*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tileno);
1284*3ac0a46fSAndroid Build Coastguard Worker
1285*3ac0a46fSAndroid Build Coastguard Worker /**
1286*3ac0a46fSAndroid Build Coastguard Worker * Calculates the total number of tile parts needed by the encoder to
1287*3ac0a46fSAndroid Build Coastguard Worker * encode such an image. If not enough memory is available, then the function return false.
1288*3ac0a46fSAndroid Build Coastguard Worker *
1289*3ac0a46fSAndroid Build Coastguard Worker * @param p_nb_tiles pointer that will hold the number of tile parts.
1290*3ac0a46fSAndroid Build Coastguard Worker * @param cp the coding parameters for the image.
1291*3ac0a46fSAndroid Build Coastguard Worker * @param image the image to encode.
1292*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the p_j2k encoder.
1293*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1294*3ac0a46fSAndroid Build Coastguard Worker *
1295*3ac0a46fSAndroid Build Coastguard Worker * @return true if the function was successful, false else.
1296*3ac0a46fSAndroid Build Coastguard Worker */
1297*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_calculate_tp(opj_j2k_t *p_j2k,
1298*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *cp,
1299*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_nb_tiles,
1300*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image,
1301*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1302*3ac0a46fSAndroid Build Coastguard Worker
1303*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream);
1304*3ac0a46fSAndroid Build Coastguard Worker
1305*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream);
1306*3ac0a46fSAndroid Build Coastguard Worker
1307*3ac0a46fSAndroid Build Coastguard Worker static opj_codestream_index_t* opj_j2k_create_cstr_index(void);
1308*3ac0a46fSAndroid Build Coastguard Worker
1309*3ac0a46fSAndroid Build Coastguard Worker static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp);
1310*3ac0a46fSAndroid Build Coastguard Worker
1311*3ac0a46fSAndroid Build Coastguard Worker static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp);
1312*3ac0a46fSAndroid Build Coastguard Worker
1313*3ac0a46fSAndroid Build Coastguard Worker static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres);
1314*3ac0a46fSAndroid Build Coastguard Worker
1315*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
1316*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image, opj_event_mgr_t *p_manager);
1317*3ac0a46fSAndroid Build Coastguard Worker
1318*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
1319*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager);
1320*3ac0a46fSAndroid Build Coastguard Worker
1321*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_set_imf_parameters(opj_cparameters_t *parameters,
1322*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image, opj_event_mgr_t *p_manager);
1323*3ac0a46fSAndroid Build Coastguard Worker
1324*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_is_imf_compliant(opj_cparameters_t *parameters,
1325*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image,
1326*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager);
1327*3ac0a46fSAndroid Build Coastguard Worker
1328*3ac0a46fSAndroid Build Coastguard Worker /**
1329*3ac0a46fSAndroid Build Coastguard Worker * Checks for invalid number of tile-parts in SOT marker (TPsot==TNsot). See issue 254.
1330*3ac0a46fSAndroid Build Coastguard Worker *
1331*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to read data from.
1332*3ac0a46fSAndroid Build Coastguard Worker * @param tile_no tile number we're looking for.
1333*3ac0a46fSAndroid Build Coastguard Worker * @param p_correction_needed output value. if true, non conformant codestream needs TNsot correction.
1334*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1335*3ac0a46fSAndroid Build Coastguard Worker *
1336*3ac0a46fSAndroid Build Coastguard Worker * @return true if the function was successful, false else.
1337*3ac0a46fSAndroid Build Coastguard Worker */
1338*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t
1339*3ac0a46fSAndroid Build Coastguard Worker *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
1340*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1341*3ac0a46fSAndroid Build Coastguard Worker
1342*3ac0a46fSAndroid Build Coastguard Worker /*@}*/
1343*3ac0a46fSAndroid Build Coastguard Worker
1344*3ac0a46fSAndroid Build Coastguard Worker /*@}*/
1345*3ac0a46fSAndroid Build Coastguard Worker
1346*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
1347*3ac0a46fSAndroid Build Coastguard Worker typedef struct j2k_prog_order {
1348*3ac0a46fSAndroid Build Coastguard Worker OPJ_PROG_ORDER enum_prog;
1349*3ac0a46fSAndroid Build Coastguard Worker char str_prog[5];
1350*3ac0a46fSAndroid Build Coastguard Worker } j2k_prog_order_t;
1351*3ac0a46fSAndroid Build Coastguard Worker
1352*3ac0a46fSAndroid Build Coastguard Worker static const j2k_prog_order_t j2k_prog_order_list[] = {
1353*3ac0a46fSAndroid Build Coastguard Worker {OPJ_CPRL, "CPRL"},
1354*3ac0a46fSAndroid Build Coastguard Worker {OPJ_LRCP, "LRCP"},
1355*3ac0a46fSAndroid Build Coastguard Worker {OPJ_PCRL, "PCRL"},
1356*3ac0a46fSAndroid Build Coastguard Worker {OPJ_RLCP, "RLCP"},
1357*3ac0a46fSAndroid Build Coastguard Worker {OPJ_RPCL, "RPCL"},
1358*3ac0a46fSAndroid Build Coastguard Worker {(OPJ_PROG_ORDER) - 1, ""}
1359*3ac0a46fSAndroid Build Coastguard Worker };
1360*3ac0a46fSAndroid Build Coastguard Worker
1361*3ac0a46fSAndroid Build Coastguard Worker /**
1362*3ac0a46fSAndroid Build Coastguard Worker * FIXME DOC
1363*3ac0a46fSAndroid Build Coastguard Worker */
1364*3ac0a46fSAndroid Build Coastguard Worker static const OPJ_UINT32 MCT_ELEMENT_SIZE [] = {
1365*3ac0a46fSAndroid Build Coastguard Worker 2,
1366*3ac0a46fSAndroid Build Coastguard Worker 4,
1367*3ac0a46fSAndroid Build Coastguard Worker 4,
1368*3ac0a46fSAndroid Build Coastguard Worker 8
1369*3ac0a46fSAndroid Build Coastguard Worker };
1370*3ac0a46fSAndroid Build Coastguard Worker
1371*3ac0a46fSAndroid Build Coastguard Worker typedef void (* opj_j2k_mct_function)(const void * p_src_data,
1372*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem);
1373*3ac0a46fSAndroid Build Coastguard Worker
1374*3ac0a46fSAndroid Build Coastguard Worker static const opj_j2k_mct_function j2k_mct_read_functions_to_float [] = {
1375*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_read_int16_to_float,
1376*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_read_int32_to_float,
1377*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_read_float32_to_float,
1378*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_read_float64_to_float
1379*3ac0a46fSAndroid Build Coastguard Worker };
1380*3ac0a46fSAndroid Build Coastguard Worker
1381*3ac0a46fSAndroid Build Coastguard Worker static const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] = {
1382*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_read_int16_to_int32,
1383*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_read_int32_to_int32,
1384*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_read_float32_to_int32,
1385*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_read_float64_to_int32
1386*3ac0a46fSAndroid Build Coastguard Worker };
1387*3ac0a46fSAndroid Build Coastguard Worker
1388*3ac0a46fSAndroid Build Coastguard Worker static const opj_j2k_mct_function j2k_mct_write_functions_from_float [] = {
1389*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_float_to_int16,
1390*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_float_to_int32,
1391*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_float_to_float,
1392*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_float_to_float64
1393*3ac0a46fSAndroid Build Coastguard Worker };
1394*3ac0a46fSAndroid Build Coastguard Worker
1395*3ac0a46fSAndroid Build Coastguard Worker typedef struct opj_dec_memory_marker_handler {
1396*3ac0a46fSAndroid Build Coastguard Worker /** marker value */
1397*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 id;
1398*3ac0a46fSAndroid Build Coastguard Worker /** value of the state when the marker can appear */
1399*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 states;
1400*3ac0a46fSAndroid Build Coastguard Worker /** action linked to the marker */
1401*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL(*handler)(opj_j2k_t *p_j2k,
1402*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
1403*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
1404*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager);
1405*3ac0a46fSAndroid Build Coastguard Worker }
1406*3ac0a46fSAndroid Build Coastguard Worker opj_dec_memory_marker_handler_t;
1407*3ac0a46fSAndroid Build Coastguard Worker
1408*3ac0a46fSAndroid Build Coastguard Worker static const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
1409*3ac0a46fSAndroid Build Coastguard Worker {
1410*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},
1411*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},
1412*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},
1413*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},
1414*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},
1415*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},
1416*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},
1417*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},
1418*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},
1419*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},
1420*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},
1421*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_PPM, J2K_STATE_MH, opj_j2k_read_ppm},
1422*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},
1423*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_SOP, 0, 0},
1424*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},
1425*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},
1426*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},
1427*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_CBD, J2K_STATE_MH, opj_j2k_read_cbd},
1428*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_CAP, J2K_STATE_MH, opj_j2k_read_cap},
1429*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_CPF, J2K_STATE_MH, opj_j2k_read_cpf},
1430*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},
1431*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},
1432*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
1433*3ac0a46fSAndroid Build Coastguard Worker #ifdef TODO_MS /* remove these functions which are not compatible with the v2 API */
1434*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
1435*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
1436*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
1437*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
1438*3ac0a46fSAndroid Build Coastguard Worker #endif
1439*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
1440*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPSEC
1441*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
1442*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_INSEC, 0, j2k_read_insec}
1443*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPSEC */
1444*3ac0a46fSAndroid Build Coastguard Worker {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/
1445*3ac0a46fSAndroid Build Coastguard Worker };
1446*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_int16_to_float(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1447*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_int16_to_float(const void * p_src_data,
1448*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1449*3ac0a46fSAndroid Build Coastguard Worker {
1450*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1451*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1452*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1453*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_temp;
1454*3ac0a46fSAndroid Build Coastguard Worker
1455*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1456*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_src_data, &l_temp, 2);
1457*3ac0a46fSAndroid Build Coastguard Worker
1458*3ac0a46fSAndroid Build Coastguard Worker l_src_data += sizeof(OPJ_INT16);
1459*3ac0a46fSAndroid Build Coastguard Worker
1460*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1461*3ac0a46fSAndroid Build Coastguard Worker }
1462*3ac0a46fSAndroid Build Coastguard Worker }
1463*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_int32_to_float(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1464*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_int32_to_float(const void * p_src_data,
1465*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1466*3ac0a46fSAndroid Build Coastguard Worker {
1467*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1468*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1469*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1470*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_temp;
1471*3ac0a46fSAndroid Build Coastguard Worker
1472*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1473*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_src_data, &l_temp, 4);
1474*3ac0a46fSAndroid Build Coastguard Worker
1475*3ac0a46fSAndroid Build Coastguard Worker l_src_data += sizeof(OPJ_INT32);
1476*3ac0a46fSAndroid Build Coastguard Worker
1477*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1478*3ac0a46fSAndroid Build Coastguard Worker }
1479*3ac0a46fSAndroid Build Coastguard Worker }
1480*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_float32_to_float(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1481*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_float32_to_float(const void * p_src_data,
1482*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1483*3ac0a46fSAndroid Build Coastguard Worker {
1484*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1485*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1486*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1487*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 l_temp;
1488*3ac0a46fSAndroid Build Coastguard Worker
1489*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1490*3ac0a46fSAndroid Build Coastguard Worker opj_read_float(l_src_data, &l_temp);
1491*3ac0a46fSAndroid Build Coastguard Worker
1492*3ac0a46fSAndroid Build Coastguard Worker l_src_data += sizeof(OPJ_FLOAT32);
1493*3ac0a46fSAndroid Build Coastguard Worker
1494*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_data++) = l_temp;
1495*3ac0a46fSAndroid Build Coastguard Worker }
1496*3ac0a46fSAndroid Build Coastguard Worker }
1497*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_float64_to_float(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1498*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_float64_to_float(const void * p_src_data,
1499*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1500*3ac0a46fSAndroid Build Coastguard Worker {
1501*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1502*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1503*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1504*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 l_temp;
1505*3ac0a46fSAndroid Build Coastguard Worker
1506*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1507*3ac0a46fSAndroid Build Coastguard Worker opj_read_double(l_src_data, &l_temp);
1508*3ac0a46fSAndroid Build Coastguard Worker
1509*3ac0a46fSAndroid Build Coastguard Worker l_src_data += sizeof(OPJ_FLOAT64);
1510*3ac0a46fSAndroid Build Coastguard Worker
1511*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1512*3ac0a46fSAndroid Build Coastguard Worker }
1513*3ac0a46fSAndroid Build Coastguard Worker }
1514*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_int16_to_int32(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1515*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_int16_to_int32(const void * p_src_data,
1516*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1517*3ac0a46fSAndroid Build Coastguard Worker {
1518*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1519*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1520*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1521*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_temp;
1522*3ac0a46fSAndroid Build Coastguard Worker
1523*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1524*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_src_data, &l_temp, 2);
1525*3ac0a46fSAndroid Build Coastguard Worker
1526*3ac0a46fSAndroid Build Coastguard Worker l_src_data += sizeof(OPJ_INT16);
1527*3ac0a46fSAndroid Build Coastguard Worker
1528*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_data++) = (OPJ_INT32) l_temp;
1529*3ac0a46fSAndroid Build Coastguard Worker }
1530*3ac0a46fSAndroid Build Coastguard Worker }
1531*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_int32_to_int32(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1532*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_int32_to_int32(const void * p_src_data,
1533*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1534*3ac0a46fSAndroid Build Coastguard Worker {
1535*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1536*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1537*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1538*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_temp;
1539*3ac0a46fSAndroid Build Coastguard Worker
1540*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1541*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_src_data, &l_temp, 4);
1542*3ac0a46fSAndroid Build Coastguard Worker
1543*3ac0a46fSAndroid Build Coastguard Worker l_src_data += sizeof(OPJ_INT32);
1544*3ac0a46fSAndroid Build Coastguard Worker
1545*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_data++) = (OPJ_INT32) l_temp;
1546*3ac0a46fSAndroid Build Coastguard Worker }
1547*3ac0a46fSAndroid Build Coastguard Worker }
1548*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_float32_to_int32(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1549*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_float32_to_int32(const void * p_src_data,
1550*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1551*3ac0a46fSAndroid Build Coastguard Worker {
1552*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1553*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1554*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1555*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 l_temp;
1556*3ac0a46fSAndroid Build Coastguard Worker
1557*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1558*3ac0a46fSAndroid Build Coastguard Worker opj_read_float(l_src_data, &l_temp);
1559*3ac0a46fSAndroid Build Coastguard Worker
1560*3ac0a46fSAndroid Build Coastguard Worker l_src_data += sizeof(OPJ_FLOAT32);
1561*3ac0a46fSAndroid Build Coastguard Worker
1562*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_data++) = (OPJ_INT32) l_temp;
1563*3ac0a46fSAndroid Build Coastguard Worker }
1564*3ac0a46fSAndroid Build Coastguard Worker }
1565*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_float64_to_int32(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1566*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_read_float64_to_int32(const void * p_src_data,
1567*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1568*3ac0a46fSAndroid Build Coastguard Worker {
1569*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1570*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1571*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1572*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 l_temp;
1573*3ac0a46fSAndroid Build Coastguard Worker
1574*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1575*3ac0a46fSAndroid Build Coastguard Worker opj_read_double(l_src_data, &l_temp);
1576*3ac0a46fSAndroid Build Coastguard Worker
1577*3ac0a46fSAndroid Build Coastguard Worker l_src_data += sizeof(OPJ_FLOAT64);
1578*3ac0a46fSAndroid Build Coastguard Worker
1579*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_data++) = (OPJ_INT32) l_temp;
1580*3ac0a46fSAndroid Build Coastguard Worker }
1581*3ac0a46fSAndroid Build Coastguard Worker }
1582*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_float_to_int16(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1583*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_float_to_int16(const void * p_src_data,
1584*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1585*3ac0a46fSAndroid Build Coastguard Worker {
1586*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1587*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1588*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1589*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_temp;
1590*3ac0a46fSAndroid Build Coastguard Worker
1591*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1592*3ac0a46fSAndroid Build Coastguard Worker l_temp = (OPJ_UINT32) * (l_src_data++);
1593*3ac0a46fSAndroid Build Coastguard Worker
1594*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_dest_data, l_temp, sizeof(OPJ_INT16));
1595*3ac0a46fSAndroid Build Coastguard Worker
1596*3ac0a46fSAndroid Build Coastguard Worker l_dest_data += sizeof(OPJ_INT16);
1597*3ac0a46fSAndroid Build Coastguard Worker }
1598*3ac0a46fSAndroid Build Coastguard Worker }
1599*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_float_to_int32(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1600*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_float_to_int32(const void * p_src_data,
1601*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1602*3ac0a46fSAndroid Build Coastguard Worker {
1603*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1604*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1605*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1606*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_temp;
1607*3ac0a46fSAndroid Build Coastguard Worker
1608*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1609*3ac0a46fSAndroid Build Coastguard Worker l_temp = (OPJ_UINT32) * (l_src_data++);
1610*3ac0a46fSAndroid Build Coastguard Worker
1611*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_dest_data, l_temp, sizeof(OPJ_INT32));
1612*3ac0a46fSAndroid Build Coastguard Worker
1613*3ac0a46fSAndroid Build Coastguard Worker l_dest_data += sizeof(OPJ_INT32);
1614*3ac0a46fSAndroid Build Coastguard Worker }
1615*3ac0a46fSAndroid Build Coastguard Worker }
1616*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_float_to_float(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1617*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_float_to_float(const void * p_src_data,
1618*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1619*3ac0a46fSAndroid Build Coastguard Worker {
1620*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1621*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1622*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1623*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 l_temp;
1624*3ac0a46fSAndroid Build Coastguard Worker
1625*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1626*3ac0a46fSAndroid Build Coastguard Worker l_temp = (OPJ_FLOAT32) * (l_src_data++);
1627*3ac0a46fSAndroid Build Coastguard Worker
1628*3ac0a46fSAndroid Build Coastguard Worker opj_write_float(l_dest_data, l_temp);
1629*3ac0a46fSAndroid Build Coastguard Worker
1630*3ac0a46fSAndroid Build Coastguard Worker l_dest_data += sizeof(OPJ_FLOAT32);
1631*3ac0a46fSAndroid Build Coastguard Worker }
1632*3ac0a46fSAndroid Build Coastguard Worker }
1633*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_float_to_float64(const void * p_src_data,void * p_dest_data,OPJ_UINT32 p_nb_elem)1634*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_float_to_float64(const void * p_src_data,
1635*3ac0a46fSAndroid Build Coastguard Worker void * p_dest_data, OPJ_UINT32 p_nb_elem)
1636*3ac0a46fSAndroid Build Coastguard Worker {
1637*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1638*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1639*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1640*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 l_temp;
1641*3ac0a46fSAndroid Build Coastguard Worker
1642*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_elem; ++i) {
1643*3ac0a46fSAndroid Build Coastguard Worker l_temp = (OPJ_FLOAT64) * (l_src_data++);
1644*3ac0a46fSAndroid Build Coastguard Worker
1645*3ac0a46fSAndroid Build Coastguard Worker opj_write_double(l_dest_data, l_temp);
1646*3ac0a46fSAndroid Build Coastguard Worker
1647*3ac0a46fSAndroid Build Coastguard Worker l_dest_data += sizeof(OPJ_FLOAT64);
1648*3ac0a46fSAndroid Build Coastguard Worker }
1649*3ac0a46fSAndroid Build Coastguard Worker }
1650*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order)1651*3ac0a46fSAndroid Build Coastguard Worker const char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order)
1652*3ac0a46fSAndroid Build Coastguard Worker {
1653*3ac0a46fSAndroid Build Coastguard Worker const j2k_prog_order_t *po;
1654*3ac0a46fSAndroid Build Coastguard Worker for (po = j2k_prog_order_list; po->enum_prog != -1; po++) {
1655*3ac0a46fSAndroid Build Coastguard Worker if (po->enum_prog == prg_order) {
1656*3ac0a46fSAndroid Build Coastguard Worker return po->str_prog;
1657*3ac0a46fSAndroid Build Coastguard Worker }
1658*3ac0a46fSAndroid Build Coastguard Worker }
1659*3ac0a46fSAndroid Build Coastguard Worker return po->str_prog;
1660*3ac0a46fSAndroid Build Coastguard Worker }
1661*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_check_poc_val(const opj_poc_t * p_pocs,OPJ_UINT32 tileno,OPJ_UINT32 p_nb_pocs,OPJ_UINT32 p_nb_resolutions,OPJ_UINT32 p_num_comps,OPJ_UINT32 p_num_layers,opj_event_mgr_t * p_manager)1662*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_check_poc_val(const opj_poc_t *p_pocs,
1663*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tileno,
1664*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_nb_pocs,
1665*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_nb_resolutions,
1666*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_num_comps,
1667*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_num_layers,
1668*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
1669*3ac0a46fSAndroid Build Coastguard Worker {
1670*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* packet_array;
1671*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 index, resno, compno, layno;
1672*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1673*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 step_c = 1;
1674*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 step_r = p_num_comps * step_c;
1675*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 step_l = p_nb_resolutions * step_r;
1676*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL loss = OPJ_FALSE;
1677*3ac0a46fSAndroid Build Coastguard Worker
1678*3ac0a46fSAndroid Build Coastguard Worker assert(p_nb_pocs > 0);
1679*3ac0a46fSAndroid Build Coastguard Worker
1680*3ac0a46fSAndroid Build Coastguard Worker packet_array = (OPJ_UINT32*) opj_calloc((size_t)step_l * p_num_layers,
1681*3ac0a46fSAndroid Build Coastguard Worker sizeof(OPJ_UINT32));
1682*3ac0a46fSAndroid Build Coastguard Worker if (packet_array == 00) {
1683*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
1684*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory for checking the poc values.\n");
1685*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1686*3ac0a46fSAndroid Build Coastguard Worker }
1687*3ac0a46fSAndroid Build Coastguard Worker
1688*3ac0a46fSAndroid Build Coastguard Worker /* iterate through all the pocs that match our tile of interest. */
1689*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_nb_pocs; ++i) {
1690*3ac0a46fSAndroid Build Coastguard Worker const opj_poc_t *poc = &p_pocs[i];
1691*3ac0a46fSAndroid Build Coastguard Worker if (tileno + 1 == poc->tile) {
1692*3ac0a46fSAndroid Build Coastguard Worker index = step_r * poc->resno0;
1693*3ac0a46fSAndroid Build Coastguard Worker
1694*3ac0a46fSAndroid Build Coastguard Worker /* take each resolution for each poc */
1695*3ac0a46fSAndroid Build Coastguard Worker for (resno = poc->resno0 ;
1696*3ac0a46fSAndroid Build Coastguard Worker resno < opj_uint_min(poc->resno1, p_nb_resolutions); ++resno) {
1697*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 res_index = index + poc->compno0 * step_c;
1698*3ac0a46fSAndroid Build Coastguard Worker
1699*3ac0a46fSAndroid Build Coastguard Worker /* take each comp of each resolution for each poc */
1700*3ac0a46fSAndroid Build Coastguard Worker for (compno = poc->compno0 ;
1701*3ac0a46fSAndroid Build Coastguard Worker compno < opj_uint_min(poc->compno1, p_num_comps); ++compno) {
1702*3ac0a46fSAndroid Build Coastguard Worker /* The layer index always starts at zero for every progression. */
1703*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 layno0 = 0;
1704*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 comp_index = res_index + layno0 * step_l;
1705*3ac0a46fSAndroid Build Coastguard Worker
1706*3ac0a46fSAndroid Build Coastguard Worker /* and finally take each layer of each res of ... */
1707*3ac0a46fSAndroid Build Coastguard Worker for (layno = layno0; layno < opj_uint_min(poc->layno1, p_num_layers);
1708*3ac0a46fSAndroid Build Coastguard Worker ++layno) {
1709*3ac0a46fSAndroid Build Coastguard Worker packet_array[comp_index] = 1;
1710*3ac0a46fSAndroid Build Coastguard Worker comp_index += step_l;
1711*3ac0a46fSAndroid Build Coastguard Worker }
1712*3ac0a46fSAndroid Build Coastguard Worker
1713*3ac0a46fSAndroid Build Coastguard Worker res_index += step_c;
1714*3ac0a46fSAndroid Build Coastguard Worker }
1715*3ac0a46fSAndroid Build Coastguard Worker
1716*3ac0a46fSAndroid Build Coastguard Worker index += step_r;
1717*3ac0a46fSAndroid Build Coastguard Worker }
1718*3ac0a46fSAndroid Build Coastguard Worker }
1719*3ac0a46fSAndroid Build Coastguard Worker }
1720*3ac0a46fSAndroid Build Coastguard Worker
1721*3ac0a46fSAndroid Build Coastguard Worker index = 0;
1722*3ac0a46fSAndroid Build Coastguard Worker for (layno = 0; layno < p_num_layers ; ++layno) {
1723*3ac0a46fSAndroid Build Coastguard Worker for (resno = 0; resno < p_nb_resolutions; ++resno) {
1724*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < p_num_comps; ++compno) {
1725*3ac0a46fSAndroid Build Coastguard Worker loss |= (packet_array[index] != 1);
1726*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
1727*3ac0a46fSAndroid Build Coastguard Worker if (packet_array[index] != 1) {
1728*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr,
1729*3ac0a46fSAndroid Build Coastguard Worker "Missing packet in POC: layno=%d resno=%d compno=%d\n",
1730*3ac0a46fSAndroid Build Coastguard Worker layno, resno, compno);
1731*3ac0a46fSAndroid Build Coastguard Worker }
1732*3ac0a46fSAndroid Build Coastguard Worker #endif
1733*3ac0a46fSAndroid Build Coastguard Worker index += step_c;
1734*3ac0a46fSAndroid Build Coastguard Worker }
1735*3ac0a46fSAndroid Build Coastguard Worker }
1736*3ac0a46fSAndroid Build Coastguard Worker }
1737*3ac0a46fSAndroid Build Coastguard Worker
1738*3ac0a46fSAndroid Build Coastguard Worker if (loss) {
1739*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Missing packets possible loss of data\n");
1740*3ac0a46fSAndroid Build Coastguard Worker }
1741*3ac0a46fSAndroid Build Coastguard Worker
1742*3ac0a46fSAndroid Build Coastguard Worker opj_free(packet_array);
1743*3ac0a46fSAndroid Build Coastguard Worker
1744*3ac0a46fSAndroid Build Coastguard Worker return !loss;
1745*3ac0a46fSAndroid Build Coastguard Worker }
1746*3ac0a46fSAndroid Build Coastguard Worker
1747*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
1748*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_num_tp(opj_cp_t * cp,OPJ_UINT32 pino,OPJ_UINT32 tileno)1749*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino,
1750*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tileno)
1751*3ac0a46fSAndroid Build Coastguard Worker {
1752*3ac0a46fSAndroid Build Coastguard Worker const OPJ_CHAR *prog = 00;
1753*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 i;
1754*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tpnum = 1;
1755*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *tcp = 00;
1756*3ac0a46fSAndroid Build Coastguard Worker opj_poc_t * l_current_poc = 00;
1757*3ac0a46fSAndroid Build Coastguard Worker
1758*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
1759*3ac0a46fSAndroid Build Coastguard Worker assert(tileno < (cp->tw * cp->th));
1760*3ac0a46fSAndroid Build Coastguard Worker assert(pino < (cp->tcps[tileno].numpocs + 1));
1761*3ac0a46fSAndroid Build Coastguard Worker
1762*3ac0a46fSAndroid Build Coastguard Worker /* get the given tile coding parameter */
1763*3ac0a46fSAndroid Build Coastguard Worker tcp = &cp->tcps[tileno];
1764*3ac0a46fSAndroid Build Coastguard Worker assert(tcp != 00);
1765*3ac0a46fSAndroid Build Coastguard Worker
1766*3ac0a46fSAndroid Build Coastguard Worker l_current_poc = &(tcp->pocs[pino]);
1767*3ac0a46fSAndroid Build Coastguard Worker assert(l_current_poc != 0);
1768*3ac0a46fSAndroid Build Coastguard Worker
1769*3ac0a46fSAndroid Build Coastguard Worker /* get the progression order as a character string */
1770*3ac0a46fSAndroid Build Coastguard Worker prog = opj_j2k_convert_progression_order(tcp->prg);
1771*3ac0a46fSAndroid Build Coastguard Worker assert(strlen(prog) > 0);
1772*3ac0a46fSAndroid Build Coastguard Worker
1773*3ac0a46fSAndroid Build Coastguard Worker if (cp->m_specific_param.m_enc.m_tp_on == 1) {
1774*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) {
1775*3ac0a46fSAndroid Build Coastguard Worker switch (prog[i]) {
1776*3ac0a46fSAndroid Build Coastguard Worker /* component wise */
1777*3ac0a46fSAndroid Build Coastguard Worker case 'C':
1778*3ac0a46fSAndroid Build Coastguard Worker tpnum *= l_current_poc->compE;
1779*3ac0a46fSAndroid Build Coastguard Worker break;
1780*3ac0a46fSAndroid Build Coastguard Worker /* resolution wise */
1781*3ac0a46fSAndroid Build Coastguard Worker case 'R':
1782*3ac0a46fSAndroid Build Coastguard Worker tpnum *= l_current_poc->resE;
1783*3ac0a46fSAndroid Build Coastguard Worker break;
1784*3ac0a46fSAndroid Build Coastguard Worker /* precinct wise */
1785*3ac0a46fSAndroid Build Coastguard Worker case 'P':
1786*3ac0a46fSAndroid Build Coastguard Worker tpnum *= l_current_poc->prcE;
1787*3ac0a46fSAndroid Build Coastguard Worker break;
1788*3ac0a46fSAndroid Build Coastguard Worker /* layer wise */
1789*3ac0a46fSAndroid Build Coastguard Worker case 'L':
1790*3ac0a46fSAndroid Build Coastguard Worker tpnum *= l_current_poc->layE;
1791*3ac0a46fSAndroid Build Coastguard Worker break;
1792*3ac0a46fSAndroid Build Coastguard Worker }
1793*3ac0a46fSAndroid Build Coastguard Worker /* would we split here ? */
1794*3ac0a46fSAndroid Build Coastguard Worker if (cp->m_specific_param.m_enc.m_tp_flag == prog[i]) {
1795*3ac0a46fSAndroid Build Coastguard Worker cp->m_specific_param.m_enc.m_tp_pos = i;
1796*3ac0a46fSAndroid Build Coastguard Worker break;
1797*3ac0a46fSAndroid Build Coastguard Worker }
1798*3ac0a46fSAndroid Build Coastguard Worker }
1799*3ac0a46fSAndroid Build Coastguard Worker } else {
1800*3ac0a46fSAndroid Build Coastguard Worker tpnum = 1;
1801*3ac0a46fSAndroid Build Coastguard Worker }
1802*3ac0a46fSAndroid Build Coastguard Worker
1803*3ac0a46fSAndroid Build Coastguard Worker return tpnum;
1804*3ac0a46fSAndroid Build Coastguard Worker }
1805*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_calculate_tp(opj_j2k_t * p_j2k,opj_cp_t * cp,OPJ_UINT32 * p_nb_tiles,opj_image_t * image,opj_event_mgr_t * p_manager)1806*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_calculate_tp(opj_j2k_t *p_j2k,
1807*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *cp,
1808*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_nb_tiles,
1809*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image,
1810*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
1811*3ac0a46fSAndroid Build Coastguard Worker )
1812*3ac0a46fSAndroid Build Coastguard Worker {
1813*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 pino, tileno;
1814*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
1815*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *tcp;
1816*3ac0a46fSAndroid Build Coastguard Worker
1817*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
1818*3ac0a46fSAndroid Build Coastguard Worker assert(p_nb_tiles != 00);
1819*3ac0a46fSAndroid Build Coastguard Worker assert(cp != 00);
1820*3ac0a46fSAndroid Build Coastguard Worker assert(image != 00);
1821*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
1822*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
1823*3ac0a46fSAndroid Build Coastguard Worker
1824*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_j2k);
1825*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
1826*3ac0a46fSAndroid Build Coastguard Worker
1827*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = cp->tw * cp->th;
1828*3ac0a46fSAndroid Build Coastguard Worker * p_nb_tiles = 0;
1829*3ac0a46fSAndroid Build Coastguard Worker tcp = cp->tcps;
1830*3ac0a46fSAndroid Build Coastguard Worker
1831*3ac0a46fSAndroid Build Coastguard Worker /* INDEX >> */
1832*3ac0a46fSAndroid Build Coastguard Worker /* TODO mergeV2: check this part which use cstr_info */
1833*3ac0a46fSAndroid Build Coastguard Worker /*if (p_j2k->cstr_info) {
1834*3ac0a46fSAndroid Build Coastguard Worker opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
1835*3ac0a46fSAndroid Build Coastguard Worker
1836*3ac0a46fSAndroid Build Coastguard Worker for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1837*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cur_totnum_tp = 0;
1838*3ac0a46fSAndroid Build Coastguard Worker
1839*3ac0a46fSAndroid Build Coastguard Worker opj_pi_update_encoding_parameters(image,cp,tileno);
1840*3ac0a46fSAndroid Build Coastguard Worker
1841*3ac0a46fSAndroid Build Coastguard Worker for (pino = 0; pino <= tcp->numpocs; ++pino)
1842*3ac0a46fSAndroid Build Coastguard Worker {
1843*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
1844*3ac0a46fSAndroid Build Coastguard Worker
1845*3ac0a46fSAndroid Build Coastguard Worker *p_nb_tiles = *p_nb_tiles + tp_num;
1846*3ac0a46fSAndroid Build Coastguard Worker
1847*3ac0a46fSAndroid Build Coastguard Worker cur_totnum_tp += tp_num;
1848*3ac0a46fSAndroid Build Coastguard Worker }
1849*3ac0a46fSAndroid Build Coastguard Worker
1850*3ac0a46fSAndroid Build Coastguard Worker tcp->m_nb_tile_parts = cur_totnum_tp;
1851*3ac0a46fSAndroid Build Coastguard Worker
1852*3ac0a46fSAndroid Build Coastguard Worker l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
1853*3ac0a46fSAndroid Build Coastguard Worker if (l_info_tile_ptr->tp == 00) {
1854*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1855*3ac0a46fSAndroid Build Coastguard Worker }
1856*3ac0a46fSAndroid Build Coastguard Worker
1857*3ac0a46fSAndroid Build Coastguard Worker memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
1858*3ac0a46fSAndroid Build Coastguard Worker
1859*3ac0a46fSAndroid Build Coastguard Worker l_info_tile_ptr->num_tps = cur_totnum_tp;
1860*3ac0a46fSAndroid Build Coastguard Worker
1861*3ac0a46fSAndroid Build Coastguard Worker ++l_info_tile_ptr;
1862*3ac0a46fSAndroid Build Coastguard Worker ++tcp;
1863*3ac0a46fSAndroid Build Coastguard Worker }
1864*3ac0a46fSAndroid Build Coastguard Worker }
1865*3ac0a46fSAndroid Build Coastguard Worker else */{
1866*3ac0a46fSAndroid Build Coastguard Worker for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
1867*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cur_totnum_tp = 0;
1868*3ac0a46fSAndroid Build Coastguard Worker
1869*3ac0a46fSAndroid Build Coastguard Worker opj_pi_update_encoding_parameters(image, cp, tileno);
1870*3ac0a46fSAndroid Build Coastguard Worker
1871*3ac0a46fSAndroid Build Coastguard Worker for (pino = 0; pino <= tcp->numpocs; ++pino) {
1872*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp, pino, tileno);
1873*3ac0a46fSAndroid Build Coastguard Worker
1874*3ac0a46fSAndroid Build Coastguard Worker *p_nb_tiles = *p_nb_tiles + tp_num;
1875*3ac0a46fSAndroid Build Coastguard Worker
1876*3ac0a46fSAndroid Build Coastguard Worker cur_totnum_tp += tp_num;
1877*3ac0a46fSAndroid Build Coastguard Worker }
1878*3ac0a46fSAndroid Build Coastguard Worker tcp->m_nb_tile_parts = cur_totnum_tp;
1879*3ac0a46fSAndroid Build Coastguard Worker
1880*3ac0a46fSAndroid Build Coastguard Worker ++tcp;
1881*3ac0a46fSAndroid Build Coastguard Worker }
1882*3ac0a46fSAndroid Build Coastguard Worker }
1883*3ac0a46fSAndroid Build Coastguard Worker
1884*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
1885*3ac0a46fSAndroid Build Coastguard Worker }
1886*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_soc(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)1887*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_soc(opj_j2k_t *p_j2k,
1888*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1889*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
1890*3ac0a46fSAndroid Build Coastguard Worker {
1891*3ac0a46fSAndroid Build Coastguard Worker /* 2 bytes will be written */
1892*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_start_stream = 00;
1893*3ac0a46fSAndroid Build Coastguard Worker
1894*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
1895*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
1896*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
1897*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
1898*3ac0a46fSAndroid Build Coastguard Worker
1899*3ac0a46fSAndroid Build Coastguard Worker l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1900*3ac0a46fSAndroid Build Coastguard Worker
1901*3ac0a46fSAndroid Build Coastguard Worker /* write SOC identifier */
1902*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_start_stream, J2K_MS_SOC, 2);
1903*3ac0a46fSAndroid Build Coastguard Worker
1904*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream, l_start_stream, 2, p_manager) != 2) {
1905*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1906*3ac0a46fSAndroid Build Coastguard Worker }
1907*3ac0a46fSAndroid Build Coastguard Worker
1908*3ac0a46fSAndroid Build Coastguard Worker /* UniPG>> */
1909*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
1910*3ac0a46fSAndroid Build Coastguard Worker /* update markers struct */
1911*3ac0a46fSAndroid Build Coastguard Worker /*
1912*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
1913*3ac0a46fSAndroid Build Coastguard Worker */
1914*3ac0a46fSAndroid Build Coastguard Worker assert(0 && "TODO");
1915*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
1916*3ac0a46fSAndroid Build Coastguard Worker /* <<UniPG */
1917*3ac0a46fSAndroid Build Coastguard Worker
1918*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
1919*3ac0a46fSAndroid Build Coastguard Worker }
1920*3ac0a46fSAndroid Build Coastguard Worker
1921*3ac0a46fSAndroid Build Coastguard Worker /**
1922*3ac0a46fSAndroid Build Coastguard Worker * Reads a SOC marker (Start of Codestream)
1923*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 file codec.
1924*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream FIXME DOC
1925*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
1926*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_soc(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)1927*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_soc(opj_j2k_t *p_j2k,
1928*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1929*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
1930*3ac0a46fSAndroid Build Coastguard Worker )
1931*3ac0a46fSAndroid Build Coastguard Worker {
1932*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE l_data [2];
1933*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_marker;
1934*3ac0a46fSAndroid Build Coastguard Worker
1935*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
1936*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
1937*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
1938*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
1939*3ac0a46fSAndroid Build Coastguard Worker
1940*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
1941*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1942*3ac0a46fSAndroid Build Coastguard Worker }
1943*3ac0a46fSAndroid Build Coastguard Worker
1944*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_data, &l_marker, 2);
1945*3ac0a46fSAndroid Build Coastguard Worker if (l_marker != J2K_MS_SOC) {
1946*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1947*3ac0a46fSAndroid Build Coastguard Worker }
1948*3ac0a46fSAndroid Build Coastguard Worker
1949*3ac0a46fSAndroid Build Coastguard Worker /* Next marker should be a SIZ marker in the main header */
1950*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;
1951*3ac0a46fSAndroid Build Coastguard Worker
1952*3ac0a46fSAndroid Build Coastguard Worker /* FIXME move it in a index structure included in p_j2k*/
1953*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
1954*3ac0a46fSAndroid Build Coastguard Worker
1955*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO,
1956*3ac0a46fSAndroid Build Coastguard Worker "Start to read j2k main header (%" PRId64 ").\n",
1957*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->main_head_start);
1958*3ac0a46fSAndroid Build Coastguard Worker
1959*3ac0a46fSAndroid Build Coastguard Worker /* Add the marker to the codestream index*/
1960*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC,
1961*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->main_head_start, 2)) {
1962*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
1963*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1964*3ac0a46fSAndroid Build Coastguard Worker }
1965*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
1966*3ac0a46fSAndroid Build Coastguard Worker }
1967*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_siz(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)1968*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_siz(opj_j2k_t *p_j2k,
1969*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
1970*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
1971*3ac0a46fSAndroid Build Coastguard Worker {
1972*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
1973*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_size_len;
1974*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_ptr;
1975*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image = 00;
1976*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *cp = 00;
1977*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp = 00;
1978*3ac0a46fSAndroid Build Coastguard Worker
1979*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
1980*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
1981*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
1982*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
1983*3ac0a46fSAndroid Build Coastguard Worker
1984*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
1985*3ac0a46fSAndroid Build Coastguard Worker cp = &(p_j2k->m_cp);
1986*3ac0a46fSAndroid Build Coastguard Worker l_size_len = 40 + 3 * l_image->numcomps;
1987*3ac0a46fSAndroid Build Coastguard Worker l_img_comp = l_image->comps;
1988*3ac0a46fSAndroid Build Coastguard Worker
1989*3ac0a46fSAndroid Build Coastguard Worker if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
1990*3ac0a46fSAndroid Build Coastguard Worker
1991*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
1992*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);
1993*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
1994*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
1995*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
1996*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
1997*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n");
1998*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1999*3ac0a46fSAndroid Build Coastguard Worker }
2000*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2001*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
2002*3ac0a46fSAndroid Build Coastguard Worker }
2003*3ac0a46fSAndroid Build Coastguard Worker
2004*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2005*3ac0a46fSAndroid Build Coastguard Worker
2006*3ac0a46fSAndroid Build Coastguard Worker /* write SOC identifier */
2007*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, J2K_MS_SIZ, 2); /* SIZ */
2008*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 2;
2009*3ac0a46fSAndroid Build Coastguard Worker
2010*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_size_len - 2, 2); /* L_SIZ */
2011*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 2;
2012*3ac0a46fSAndroid Build Coastguard Worker
2013*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, cp->rsiz, 2); /* Rsiz (capabilities) */
2014*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 2;
2015*3ac0a46fSAndroid Build Coastguard Worker
2016*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
2017*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 4;
2018*3ac0a46fSAndroid Build Coastguard Worker
2019*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
2020*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 4;
2021*3ac0a46fSAndroid Build Coastguard Worker
2022*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
2023*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 4;
2024*3ac0a46fSAndroid Build Coastguard Worker
2025*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
2026*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 4;
2027*3ac0a46fSAndroid Build Coastguard Worker
2028*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, cp->tdx, 4); /* XTsiz */
2029*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 4;
2030*3ac0a46fSAndroid Build Coastguard Worker
2031*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, cp->tdy, 4); /* YTsiz */
2032*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 4;
2033*3ac0a46fSAndroid Build Coastguard Worker
2034*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, cp->tx0, 4); /* XT0siz */
2035*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 4;
2036*3ac0a46fSAndroid Build Coastguard Worker
2037*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, cp->ty0, 4); /* YT0siz */
2038*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 4;
2039*3ac0a46fSAndroid Build Coastguard Worker
2040*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_image->numcomps, 2); /* Csiz */
2041*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 2;
2042*3ac0a46fSAndroid Build Coastguard Worker
2043*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image->numcomps; ++i) {
2044*3ac0a46fSAndroid Build Coastguard Worker /* TODO here with MCT ? */
2045*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7),
2046*3ac0a46fSAndroid Build Coastguard Worker 1); /* Ssiz_i */
2047*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
2048*3ac0a46fSAndroid Build Coastguard Worker
2049*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_img_comp->dx, 1); /* XRsiz_i */
2050*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
2051*3ac0a46fSAndroid Build Coastguard Worker
2052*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_img_comp->dy, 1); /* YRsiz_i */
2053*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
2054*3ac0a46fSAndroid Build Coastguard Worker
2055*3ac0a46fSAndroid Build Coastguard Worker ++l_img_comp;
2056*3ac0a46fSAndroid Build Coastguard Worker }
2057*3ac0a46fSAndroid Build Coastguard Worker
2058*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
2059*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len,
2060*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_size_len) {
2061*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2062*3ac0a46fSAndroid Build Coastguard Worker }
2063*3ac0a46fSAndroid Build Coastguard Worker
2064*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2065*3ac0a46fSAndroid Build Coastguard Worker }
2066*3ac0a46fSAndroid Build Coastguard Worker
2067*3ac0a46fSAndroid Build Coastguard Worker /**
2068*3ac0a46fSAndroid Build Coastguard Worker * Reads a SIZ marker (image and tile size)
2069*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 file codec.
2070*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the SIZ box.
2071*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the SIZ marker.
2072*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
2073*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_siz(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)2074*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
2075*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
2076*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
2077*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
2078*3ac0a46fSAndroid Build Coastguard Worker )
2079*3ac0a46fSAndroid Build Coastguard Worker {
2080*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
2081*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comp;
2082*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comp_remain;
2083*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_remaining_size;
2084*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
2085*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tmp, l_tx1, l_ty1;
2086*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_prec0, l_sgnd0;
2087*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *l_image = 00;
2088*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
2089*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp = 00;
2090*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_current_tile_param = 00;
2091*3ac0a46fSAndroid Build Coastguard Worker
2092*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2093*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2094*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
2095*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
2096*3ac0a46fSAndroid Build Coastguard Worker
2097*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
2098*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
2099*3ac0a46fSAndroid Build Coastguard Worker
2100*3ac0a46fSAndroid Build Coastguard Worker /* minimum size == 39 - 3 (= minimum component parameter) */
2101*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 36) {
2102*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2103*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2104*3ac0a46fSAndroid Build Coastguard Worker }
2105*3ac0a46fSAndroid Build Coastguard Worker
2106*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size = p_header_size - 36;
2107*3ac0a46fSAndroid Build Coastguard Worker l_nb_comp = l_remaining_size / 3;
2108*3ac0a46fSAndroid Build Coastguard Worker l_nb_comp_remain = l_remaining_size % 3;
2109*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_comp_remain != 0) {
2110*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2111*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2112*3ac0a46fSAndroid Build Coastguard Worker }
2113*3ac0a46fSAndroid Build Coastguard Worker
2114*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp,
2115*3ac0a46fSAndroid Build Coastguard Worker 2); /* Rsiz (capabilities) */
2116*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
2117*3ac0a46fSAndroid Build Coastguard Worker l_cp->rsiz = (OPJ_UINT16) l_tmp;
2118*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4); /* Xsiz */
2119*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
2120*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4); /* Ysiz */
2121*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
2122*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4); /* X0siz */
2123*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
2124*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4); /* Y0siz */
2125*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
2126*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx,
2127*3ac0a46fSAndroid Build Coastguard Worker 4); /* XTsiz */
2128*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
2129*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy,
2130*3ac0a46fSAndroid Build Coastguard Worker 4); /* YTsiz */
2131*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
2132*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0,
2133*3ac0a46fSAndroid Build Coastguard Worker 4); /* XT0siz */
2134*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
2135*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0,
2136*3ac0a46fSAndroid Build Coastguard Worker 4); /* YT0siz */
2137*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
2138*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp,
2139*3ac0a46fSAndroid Build Coastguard Worker 2); /* Csiz */
2140*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
2141*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp < 16385) {
2142*3ac0a46fSAndroid Build Coastguard Worker l_image->numcomps = (OPJ_UINT16) l_tmp;
2143*3ac0a46fSAndroid Build Coastguard Worker } else {
2144*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2145*3ac0a46fSAndroid Build Coastguard Worker "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
2146*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2147*3ac0a46fSAndroid Build Coastguard Worker }
2148*3ac0a46fSAndroid Build Coastguard Worker
2149*3ac0a46fSAndroid Build Coastguard Worker if (l_image->numcomps != l_nb_comp) {
2150*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2151*3ac0a46fSAndroid Build Coastguard Worker "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n",
2152*3ac0a46fSAndroid Build Coastguard Worker l_image->numcomps, l_nb_comp);
2153*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2154*3ac0a46fSAndroid Build Coastguard Worker }
2155*3ac0a46fSAndroid Build Coastguard Worker
2156*3ac0a46fSAndroid Build Coastguard Worker /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
2157*3ac0a46fSAndroid Build Coastguard Worker /* testcase issue427-null-image-size.jp2 */
2158*3ac0a46fSAndroid Build Coastguard Worker if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) {
2159*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2160*3ac0a46fSAndroid Build Coastguard Worker "Error with SIZ marker: negative or zero image size (%" PRId64 " x %" PRId64
2161*3ac0a46fSAndroid Build Coastguard Worker ")\n", (OPJ_INT64)l_image->x1 - l_image->x0,
2162*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT64)l_image->y1 - l_image->y0);
2163*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2164*3ac0a46fSAndroid Build Coastguard Worker }
2165*3ac0a46fSAndroid Build Coastguard Worker /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
2166*3ac0a46fSAndroid Build Coastguard Worker if ((l_cp->tdx == 0U) || (l_cp->tdy == 0U)) {
2167*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2168*3ac0a46fSAndroid Build Coastguard Worker "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx,
2169*3ac0a46fSAndroid Build Coastguard Worker l_cp->tdy);
2170*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2171*3ac0a46fSAndroid Build Coastguard Worker }
2172*3ac0a46fSAndroid Build Coastguard Worker
2173*3ac0a46fSAndroid Build Coastguard Worker /* testcase issue427-illegal-tile-offset.jp2 */
2174*3ac0a46fSAndroid Build Coastguard Worker l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */
2175*3ac0a46fSAndroid Build Coastguard Worker l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */
2176*3ac0a46fSAndroid Build Coastguard Worker if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) ||
2177*3ac0a46fSAndroid Build Coastguard Worker (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0)) {
2178*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2179*3ac0a46fSAndroid Build Coastguard Worker "Error with SIZ marker: illegal tile offset\n");
2180*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2181*3ac0a46fSAndroid Build Coastguard Worker }
2182*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->dump_state) {
2183*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 siz_w, siz_h;
2184*3ac0a46fSAndroid Build Coastguard Worker
2185*3ac0a46fSAndroid Build Coastguard Worker siz_w = l_image->x1 - l_image->x0;
2186*3ac0a46fSAndroid Build Coastguard Worker siz_h = l_image->y1 - l_image->y0;
2187*3ac0a46fSAndroid Build Coastguard Worker
2188*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->ihdr_w > 0 && p_j2k->ihdr_h > 0
2189*3ac0a46fSAndroid Build Coastguard Worker && (p_j2k->ihdr_w != siz_w || p_j2k->ihdr_h != siz_h)) {
2190*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2191*3ac0a46fSAndroid Build Coastguard Worker "Error with SIZ marker: IHDR w(%u) h(%u) vs. SIZ w(%u) h(%u)\n", p_j2k->ihdr_w,
2192*3ac0a46fSAndroid Build Coastguard Worker p_j2k->ihdr_h, siz_w, siz_h);
2193*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2194*3ac0a46fSAndroid Build Coastguard Worker }
2195*3ac0a46fSAndroid Build Coastguard Worker }
2196*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
2197*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->correct) {
2198*3ac0a46fSAndroid Build Coastguard Worker /* if JPWL is on, we check whether TX errors have damaged
2199*3ac0a46fSAndroid Build Coastguard Worker too much the SIZ parameters */
2200*3ac0a46fSAndroid Build Coastguard Worker if (!(l_image->x1 * l_image->y1)) {
2201*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2202*3ac0a46fSAndroid Build Coastguard Worker "JPWL: bad image size (%d x %d)\n",
2203*3ac0a46fSAndroid Build Coastguard Worker l_image->x1, l_image->y1);
2204*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
2205*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2206*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2207*3ac0a46fSAndroid Build Coastguard Worker }
2208*3ac0a46fSAndroid Build Coastguard Worker }
2209*3ac0a46fSAndroid Build Coastguard Worker
2210*3ac0a46fSAndroid Build Coastguard Worker /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ?
2211*3ac0a46fSAndroid Build Coastguard Worker if (l_image->numcomps != ((len - 38) / 3)) {
2212*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2213*3ac0a46fSAndroid Build Coastguard Worker "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
2214*3ac0a46fSAndroid Build Coastguard Worker l_image->numcomps, ((len - 38) / 3));
2215*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
2216*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2217*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2218*3ac0a46fSAndroid Build Coastguard Worker }
2219*3ac0a46fSAndroid Build Coastguard Worker */ /* we try to correct */
2220*3ac0a46fSAndroid Build Coastguard Worker /* opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n");
2221*3ac0a46fSAndroid Build Coastguard Worker if (l_image->numcomps < ((len - 38) / 3)) {
2222*3ac0a46fSAndroid Build Coastguard Worker len = 38 + 3 * l_image->numcomps;
2223*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
2224*3ac0a46fSAndroid Build Coastguard Worker len);
2225*3ac0a46fSAndroid Build Coastguard Worker } else {
2226*3ac0a46fSAndroid Build Coastguard Worker l_image->numcomps = ((len - 38) / 3);
2227*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
2228*3ac0a46fSAndroid Build Coastguard Worker l_image->numcomps);
2229*3ac0a46fSAndroid Build Coastguard Worker }
2230*3ac0a46fSAndroid Build Coastguard Worker }
2231*3ac0a46fSAndroid Build Coastguard Worker */
2232*3ac0a46fSAndroid Build Coastguard Worker
2233*3ac0a46fSAndroid Build Coastguard Worker /* update components number in the jpwl_exp_comps filed */
2234*3ac0a46fSAndroid Build Coastguard Worker l_cp->exp_comps = l_image->numcomps;
2235*3ac0a46fSAndroid Build Coastguard Worker }
2236*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
2237*3ac0a46fSAndroid Build Coastguard Worker
2238*3ac0a46fSAndroid Build Coastguard Worker /* Allocate the resulting image components */
2239*3ac0a46fSAndroid Build Coastguard Worker l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps,
2240*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_image_comp_t));
2241*3ac0a46fSAndroid Build Coastguard Worker if (l_image->comps == 00) {
2242*3ac0a46fSAndroid Build Coastguard Worker l_image->numcomps = 0;
2243*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2244*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to take in charge SIZ marker\n");
2245*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2246*3ac0a46fSAndroid Build Coastguard Worker }
2247*3ac0a46fSAndroid Build Coastguard Worker
2248*3ac0a46fSAndroid Build Coastguard Worker l_img_comp = l_image->comps;
2249*3ac0a46fSAndroid Build Coastguard Worker
2250*3ac0a46fSAndroid Build Coastguard Worker l_prec0 = 0;
2251*3ac0a46fSAndroid Build Coastguard Worker l_sgnd0 = 0;
2252*3ac0a46fSAndroid Build Coastguard Worker /* Read the component information */
2253*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image->numcomps; ++i) {
2254*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tmp;
2255*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &tmp, 1); /* Ssiz_i */
2256*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
2257*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->prec = (tmp & 0x7f) + 1;
2258*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->sgnd = tmp >> 7;
2259*3ac0a46fSAndroid Build Coastguard Worker
2260*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->dump_state == 0) {
2261*3ac0a46fSAndroid Build Coastguard Worker if (i == 0) {
2262*3ac0a46fSAndroid Build Coastguard Worker l_prec0 = l_img_comp->prec;
2263*3ac0a46fSAndroid Build Coastguard Worker l_sgnd0 = l_img_comp->sgnd;
2264*3ac0a46fSAndroid Build Coastguard Worker } else if (!l_cp->allow_different_bit_depth_sign
2265*3ac0a46fSAndroid Build Coastguard Worker && (l_img_comp->prec != l_prec0 || l_img_comp->sgnd != l_sgnd0)) {
2266*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2267*3ac0a46fSAndroid Build Coastguard Worker "Despite JP2 BPC!=255, precision and/or sgnd values for comp[%d] is different than comp[0]:\n"
2268*3ac0a46fSAndroid Build Coastguard Worker " [0] prec(%d) sgnd(%d) [%d] prec(%d) sgnd(%d)\n", i, l_prec0, l_sgnd0,
2269*3ac0a46fSAndroid Build Coastguard Worker i, l_img_comp->prec, l_img_comp->sgnd);
2270*3ac0a46fSAndroid Build Coastguard Worker }
2271*3ac0a46fSAndroid Build Coastguard Worker /* TODO: we should perhaps also check against JP2 BPCC values */
2272*3ac0a46fSAndroid Build Coastguard Worker }
2273*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &tmp, 1); /* XRsiz_i */
2274*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
2275*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2276*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &tmp, 1); /* YRsiz_i */
2277*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
2278*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
2279*3ac0a46fSAndroid Build Coastguard Worker if (l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
2280*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->dy < 1 || l_img_comp->dy > 255) {
2281*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2282*3ac0a46fSAndroid Build Coastguard Worker "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n",
2283*3ac0a46fSAndroid Build Coastguard Worker i, l_img_comp->dx, l_img_comp->dy);
2284*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2285*3ac0a46fSAndroid Build Coastguard Worker }
2286*3ac0a46fSAndroid Build Coastguard Worker /* Avoids later undefined shift in computation of */
2287*3ac0a46fSAndroid Build Coastguard Worker /* p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
2288*3ac0a46fSAndroid Build Coastguard Worker << (l_image->comps[i].prec - 1); */
2289*3ac0a46fSAndroid Build Coastguard Worker if (l_img_comp->prec > 31) {
2290*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2291*3ac0a46fSAndroid Build Coastguard Worker "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm. OpenJpeg only supports up to 31)\n",
2292*3ac0a46fSAndroid Build Coastguard Worker i, l_img_comp->prec);
2293*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2294*3ac0a46fSAndroid Build Coastguard Worker }
2295*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
2296*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->correct) {
2297*3ac0a46fSAndroid Build Coastguard Worker /* if JPWL is on, we check whether TX errors have damaged
2298*3ac0a46fSAndroid Build Coastguard Worker too much the SIZ parameters, again */
2299*3ac0a46fSAndroid Build Coastguard Worker if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {
2300*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2301*3ac0a46fSAndroid Build Coastguard Worker "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
2302*3ac0a46fSAndroid Build Coastguard Worker i, i, l_image->comps[i].dx, l_image->comps[i].dy);
2303*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
2304*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2305*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2306*3ac0a46fSAndroid Build Coastguard Worker }
2307*3ac0a46fSAndroid Build Coastguard Worker /* we try to correct */
2308*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
2309*3ac0a46fSAndroid Build Coastguard Worker if (!l_image->comps[i].dx) {
2310*3ac0a46fSAndroid Build Coastguard Worker l_image->comps[i].dx = 1;
2311*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2312*3ac0a46fSAndroid Build Coastguard Worker "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
2313*3ac0a46fSAndroid Build Coastguard Worker i, l_image->comps[i].dx);
2314*3ac0a46fSAndroid Build Coastguard Worker }
2315*3ac0a46fSAndroid Build Coastguard Worker if (!l_image->comps[i].dy) {
2316*3ac0a46fSAndroid Build Coastguard Worker l_image->comps[i].dy = 1;
2317*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2318*3ac0a46fSAndroid Build Coastguard Worker "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
2319*3ac0a46fSAndroid Build Coastguard Worker i, l_image->comps[i].dy);
2320*3ac0a46fSAndroid Build Coastguard Worker }
2321*3ac0a46fSAndroid Build Coastguard Worker }
2322*3ac0a46fSAndroid Build Coastguard Worker }
2323*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
2324*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->resno_decoded =
2325*3ac0a46fSAndroid Build Coastguard Worker 0; /* number of resolution decoded */
2326*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->factor =
2327*3ac0a46fSAndroid Build Coastguard Worker l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
2328*3ac0a46fSAndroid Build Coastguard Worker ++l_img_comp;
2329*3ac0a46fSAndroid Build Coastguard Worker }
2330*3ac0a46fSAndroid Build Coastguard Worker
2331*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->tdx == 0 || l_cp->tdy == 0) {
2332*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2333*3ac0a46fSAndroid Build Coastguard Worker }
2334*3ac0a46fSAndroid Build Coastguard Worker
2335*3ac0a46fSAndroid Build Coastguard Worker /* Compute the number of tiles */
2336*3ac0a46fSAndroid Build Coastguard Worker l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
2337*3ac0a46fSAndroid Build Coastguard Worker l_cp->th = opj_uint_ceildiv(l_image->y1 - l_cp->ty0, l_cp->tdy);
2338*3ac0a46fSAndroid Build Coastguard Worker
2339*3ac0a46fSAndroid Build Coastguard Worker /* Check that the number of tiles is valid */
2340*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
2341*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2342*3ac0a46fSAndroid Build Coastguard Worker "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
2343*3ac0a46fSAndroid Build Coastguard Worker l_cp->tw, l_cp->th);
2344*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2345*3ac0a46fSAndroid Build Coastguard Worker }
2346*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = l_cp->tw * l_cp->th;
2347*3ac0a46fSAndroid Build Coastguard Worker
2348*3ac0a46fSAndroid Build Coastguard Worker /* Define the tiles which will be decoded */
2349*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
2350*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_x =
2351*3ac0a46fSAndroid Build Coastguard Worker (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
2352*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_y =
2353*3ac0a46fSAndroid Build Coastguard Worker (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
2354*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv(
2355*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0, l_cp->tdx);
2356*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv(
2357*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0, l_cp->tdy);
2358*3ac0a46fSAndroid Build Coastguard Worker } else {
2359*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
2360*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
2361*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
2362*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
2363*3ac0a46fSAndroid Build Coastguard Worker }
2364*3ac0a46fSAndroid Build Coastguard Worker
2365*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
2366*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->correct) {
2367*3ac0a46fSAndroid Build Coastguard Worker /* if JPWL is on, we check whether TX errors have damaged
2368*3ac0a46fSAndroid Build Coastguard Worker too much the SIZ parameters */
2369*3ac0a46fSAndroid Build Coastguard Worker if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) ||
2370*3ac0a46fSAndroid Build Coastguard Worker (l_cp->th > l_cp->max_tiles)) {
2371*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2372*3ac0a46fSAndroid Build Coastguard Worker "JPWL: bad number of tiles (%d x %d)\n",
2373*3ac0a46fSAndroid Build Coastguard Worker l_cp->tw, l_cp->th);
2374*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
2375*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2376*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2377*3ac0a46fSAndroid Build Coastguard Worker }
2378*3ac0a46fSAndroid Build Coastguard Worker /* we try to correct */
2379*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
2380*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->tw < 1) {
2381*3ac0a46fSAndroid Build Coastguard Worker l_cp->tw = 1;
2382*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2383*3ac0a46fSAndroid Build Coastguard Worker "- setting %d tiles in x => HYPOTHESIS!!!\n",
2384*3ac0a46fSAndroid Build Coastguard Worker l_cp->tw);
2385*3ac0a46fSAndroid Build Coastguard Worker }
2386*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->tw > l_cp->max_tiles) {
2387*3ac0a46fSAndroid Build Coastguard Worker l_cp->tw = 1;
2388*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2389*3ac0a46fSAndroid Build Coastguard Worker "- too large x, increase expectance of %d\n"
2390*3ac0a46fSAndroid Build Coastguard Worker "- setting %d tiles in x => HYPOTHESIS!!!\n",
2391*3ac0a46fSAndroid Build Coastguard Worker l_cp->max_tiles, l_cp->tw);
2392*3ac0a46fSAndroid Build Coastguard Worker }
2393*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->th < 1) {
2394*3ac0a46fSAndroid Build Coastguard Worker l_cp->th = 1;
2395*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2396*3ac0a46fSAndroid Build Coastguard Worker "- setting %d tiles in y => HYPOTHESIS!!!\n",
2397*3ac0a46fSAndroid Build Coastguard Worker l_cp->th);
2398*3ac0a46fSAndroid Build Coastguard Worker }
2399*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->th > l_cp->max_tiles) {
2400*3ac0a46fSAndroid Build Coastguard Worker l_cp->th = 1;
2401*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2402*3ac0a46fSAndroid Build Coastguard Worker "- too large y, increase expectance of %d to continue\n",
2403*3ac0a46fSAndroid Build Coastguard Worker "- setting %d tiles in y => HYPOTHESIS!!!\n",
2404*3ac0a46fSAndroid Build Coastguard Worker l_cp->max_tiles, l_cp->th);
2405*3ac0a46fSAndroid Build Coastguard Worker }
2406*3ac0a46fSAndroid Build Coastguard Worker }
2407*3ac0a46fSAndroid Build Coastguard Worker }
2408*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
2409*3ac0a46fSAndroid Build Coastguard Worker
2410*3ac0a46fSAndroid Build Coastguard Worker /* memory allocations */
2411*3ac0a46fSAndroid Build Coastguard Worker l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
2412*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->tcps == 00) {
2413*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2414*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to take in charge SIZ marker\n");
2415*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2416*3ac0a46fSAndroid Build Coastguard Worker }
2417*3ac0a46fSAndroid Build Coastguard Worker
2418*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
2419*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->correct) {
2420*3ac0a46fSAndroid Build Coastguard Worker if (!l_cp->tcps) {
2421*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2422*3ac0a46fSAndroid Build Coastguard Worker "JPWL: could not alloc tcps field of cp\n");
2423*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
2424*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
2425*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2426*3ac0a46fSAndroid Build Coastguard Worker }
2427*3ac0a46fSAndroid Build Coastguard Worker }
2428*3ac0a46fSAndroid Build Coastguard Worker }
2429*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
2430*3ac0a46fSAndroid Build Coastguard Worker
2431*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
2432*3ac0a46fSAndroid Build Coastguard Worker (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
2433*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps == 00) {
2434*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2435*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to take in charge SIZ marker\n");
2436*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2437*3ac0a46fSAndroid Build Coastguard Worker }
2438*3ac0a46fSAndroid Build Coastguard Worker
2439*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
2440*3ac0a46fSAndroid Build Coastguard Worker (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS,
2441*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_mct_data_t));
2442*3ac0a46fSAndroid Build Coastguard Worker
2443*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {
2444*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2445*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to take in charge SIZ marker\n");
2446*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2447*3ac0a46fSAndroid Build Coastguard Worker }
2448*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records =
2449*3ac0a46fSAndroid Build Coastguard Worker OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
2450*3ac0a46fSAndroid Build Coastguard Worker
2451*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
2452*3ac0a46fSAndroid Build Coastguard Worker (opj_simple_mcc_decorrelation_data_t*)
2453*3ac0a46fSAndroid Build Coastguard Worker opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS,
2454*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_simple_mcc_decorrelation_data_t));
2455*3ac0a46fSAndroid Build Coastguard Worker
2456*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {
2457*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2458*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to take in charge SIZ marker\n");
2459*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2460*3ac0a46fSAndroid Build Coastguard Worker }
2461*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records =
2462*3ac0a46fSAndroid Build Coastguard Worker OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
2463*3ac0a46fSAndroid Build Coastguard Worker
2464*3ac0a46fSAndroid Build Coastguard Worker /* set up default dc level shift */
2465*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image->numcomps; ++i) {
2466*3ac0a46fSAndroid Build Coastguard Worker if (! l_image->comps[i].sgnd) {
2467*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
2468*3ac0a46fSAndroid Build Coastguard Worker << (l_image->comps[i].prec - 1);
2469*3ac0a46fSAndroid Build Coastguard Worker }
2470*3ac0a46fSAndroid Build Coastguard Worker }
2471*3ac0a46fSAndroid Build Coastguard Worker
2472*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_param = l_cp->tcps;
2473*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
2474*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps,
2475*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_tccp_t));
2476*3ac0a46fSAndroid Build Coastguard Worker if (l_current_tile_param->tccps == 00) {
2477*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2478*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to take in charge SIZ marker\n");
2479*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2480*3ac0a46fSAndroid Build Coastguard Worker }
2481*3ac0a46fSAndroid Build Coastguard Worker
2482*3ac0a46fSAndroid Build Coastguard Worker ++l_current_tile_param;
2483*3ac0a46fSAndroid Build Coastguard Worker }
2484*3ac0a46fSAndroid Build Coastguard Worker
2485*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MH;
2486*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_header_update(l_image, l_cp);
2487*3ac0a46fSAndroid Build Coastguard Worker
2488*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2489*3ac0a46fSAndroid Build Coastguard Worker }
2490*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_com(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)2491*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_com(opj_j2k_t *p_j2k,
2492*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
2493*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
2494*3ac0a46fSAndroid Build Coastguard Worker )
2495*3ac0a46fSAndroid Build Coastguard Worker {
2496*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_comment_size;
2497*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_total_com_size;
2498*3ac0a46fSAndroid Build Coastguard Worker const OPJ_CHAR *l_comment;
2499*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_ptr = 00;
2500*3ac0a46fSAndroid Build Coastguard Worker
2501*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2502*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2503*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
2504*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
2505*3ac0a46fSAndroid Build Coastguard Worker
2506*3ac0a46fSAndroid Build Coastguard Worker l_comment = p_j2k->m_cp.comment;
2507*3ac0a46fSAndroid Build Coastguard Worker l_comment_size = (OPJ_UINT32)strlen(l_comment);
2508*3ac0a46fSAndroid Build Coastguard Worker l_total_com_size = l_comment_size + 6;
2509*3ac0a46fSAndroid Build Coastguard Worker
2510*3ac0a46fSAndroid Build Coastguard Worker if (l_total_com_size >
2511*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2512*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2513*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);
2514*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
2515*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2516*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2517*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2518*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2519*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to write the COM marker\n");
2520*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2521*3ac0a46fSAndroid Build Coastguard Worker }
2522*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2523*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
2524*3ac0a46fSAndroid Build Coastguard Worker }
2525*3ac0a46fSAndroid Build Coastguard Worker
2526*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2527*3ac0a46fSAndroid Build Coastguard Worker
2528*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, J2K_MS_COM, 2); /* COM */
2529*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 2;
2530*3ac0a46fSAndroid Build Coastguard Worker
2531*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, l_total_com_size - 2, 2); /* L_COM */
2532*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 2;
2533*3ac0a46fSAndroid Build Coastguard Worker
2534*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_ptr, 1,
2535*3ac0a46fSAndroid Build Coastguard Worker 2); /* General use (IS 8859-15:1999 (Latin) values) */
2536*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 2;
2537*3ac0a46fSAndroid Build Coastguard Worker
2538*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_current_ptr, l_comment, l_comment_size);
2539*3ac0a46fSAndroid Build Coastguard Worker
2540*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
2541*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size,
2542*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_total_com_size) {
2543*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2544*3ac0a46fSAndroid Build Coastguard Worker }
2545*3ac0a46fSAndroid Build Coastguard Worker
2546*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2547*3ac0a46fSAndroid Build Coastguard Worker }
2548*3ac0a46fSAndroid Build Coastguard Worker
2549*3ac0a46fSAndroid Build Coastguard Worker /**
2550*3ac0a46fSAndroid Build Coastguard Worker * Reads a COM marker (comments)
2551*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 file codec.
2552*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the COM box.
2553*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the COM marker.
2554*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
2555*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_com(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)2556*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_com(opj_j2k_t *p_j2k,
2557*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
2558*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
2559*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
2560*3ac0a46fSAndroid Build Coastguard Worker )
2561*3ac0a46fSAndroid Build Coastguard Worker {
2562*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2563*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2564*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
2565*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
2566*3ac0a46fSAndroid Build Coastguard Worker
2567*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_j2k);
2568*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_header_data);
2569*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_header_size);
2570*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
2571*3ac0a46fSAndroid Build Coastguard Worker
2572*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2573*3ac0a46fSAndroid Build Coastguard Worker }
2574*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_cod(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)2575*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_cod(opj_j2k_t *p_j2k,
2576*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
2577*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
2578*3ac0a46fSAndroid Build Coastguard Worker {
2579*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
2580*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
2581*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_code_size, l_remaining_size;
2582*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
2583*3ac0a46fSAndroid Build Coastguard Worker
2584*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2585*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2586*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
2587*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
2588*3ac0a46fSAndroid Build Coastguard Worker
2589*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
2590*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2591*3ac0a46fSAndroid Build Coastguard Worker l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2592*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number, 0);
2593*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size = l_code_size;
2594*3ac0a46fSAndroid Build Coastguard Worker
2595*3ac0a46fSAndroid Build Coastguard Worker if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2596*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2597*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);
2598*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
2599*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2600*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2601*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2602*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n");
2603*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2604*3ac0a46fSAndroid Build Coastguard Worker }
2605*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2606*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
2607*3ac0a46fSAndroid Build Coastguard Worker }
2608*3ac0a46fSAndroid Build Coastguard Worker
2609*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2610*3ac0a46fSAndroid Build Coastguard Worker
2611*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_COD, 2); /* COD */
2612*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
2613*3ac0a46fSAndroid Build Coastguard Worker
2614*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_code_size - 2, 2); /* L_COD */
2615*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
2616*3ac0a46fSAndroid Build Coastguard Worker
2617*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_tcp->csty, 1); /* Scod */
2618*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
2619*3ac0a46fSAndroid Build Coastguard Worker
2620*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, (OPJ_UINT32)l_tcp->prg, 1); /* SGcod (A) */
2621*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
2622*3ac0a46fSAndroid Build Coastguard Worker
2623*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_tcp->numlayers, 2); /* SGcod (B) */
2624*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
2625*3ac0a46fSAndroid Build Coastguard Worker
2626*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_tcp->mct, 1); /* SGcod (C) */
2627*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
2628*3ac0a46fSAndroid Build Coastguard Worker
2629*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size -= 9;
2630*3ac0a46fSAndroid Build Coastguard Worker
2631*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
2632*3ac0a46fSAndroid Build Coastguard Worker l_current_data, &l_remaining_size, p_manager)) {
2633*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
2634*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2635*3ac0a46fSAndroid Build Coastguard Worker }
2636*3ac0a46fSAndroid Build Coastguard Worker
2637*3ac0a46fSAndroid Build Coastguard Worker if (l_remaining_size != 0) {
2638*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
2639*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2640*3ac0a46fSAndroid Build Coastguard Worker }
2641*3ac0a46fSAndroid Build Coastguard Worker
2642*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
2643*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size,
2644*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_code_size) {
2645*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2646*3ac0a46fSAndroid Build Coastguard Worker }
2647*3ac0a46fSAndroid Build Coastguard Worker
2648*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2649*3ac0a46fSAndroid Build Coastguard Worker }
2650*3ac0a46fSAndroid Build Coastguard Worker
2651*3ac0a46fSAndroid Build Coastguard Worker /**
2652*3ac0a46fSAndroid Build Coastguard Worker * Reads a COD marker (Coding style defaults)
2653*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the COD box.
2654*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
2655*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the COD marker.
2656*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
2657*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_cod(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)2658*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_cod(opj_j2k_t *p_j2k,
2659*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
2660*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
2661*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
2662*3ac0a46fSAndroid Build Coastguard Worker )
2663*3ac0a46fSAndroid Build Coastguard Worker {
2664*3ac0a46fSAndroid Build Coastguard Worker /* loop */
2665*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
2666*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tmp;
2667*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
2668*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
2669*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *l_image = 00;
2670*3ac0a46fSAndroid Build Coastguard Worker
2671*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2672*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
2673*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2674*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
2675*3ac0a46fSAndroid Build Coastguard Worker
2676*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
2677*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
2678*3ac0a46fSAndroid Build Coastguard Worker
2679*3ac0a46fSAndroid Build Coastguard Worker /* If we are in the first tile-part header of the current tile */
2680*3ac0a46fSAndroid Build Coastguard Worker l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
2681*3ac0a46fSAndroid Build Coastguard Worker &l_cp->tcps[p_j2k->m_current_tile_number] :
2682*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
2683*3ac0a46fSAndroid Build Coastguard Worker
2684*3ac0a46fSAndroid Build Coastguard Worker #if 0
2685*3ac0a46fSAndroid Build Coastguard Worker /* This check was added per https://github.com/uclouvain/openjpeg/commit/daed8cc9195555e101ab708a501af2dfe6d5e001 */
2686*3ac0a46fSAndroid Build Coastguard Worker /* but this is no longer necessary to handle issue476.jp2 */
2687*3ac0a46fSAndroid Build Coastguard Worker /* and this actually cause issues on legit files. See https://github.com/uclouvain/openjpeg/issues/1043 */
2688*3ac0a46fSAndroid Build Coastguard Worker /* Only one COD per tile */
2689*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->cod) {
2690*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2691*3ac0a46fSAndroid Build Coastguard Worker "COD marker already read. No more than one COD marker per tile.\n");
2692*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2693*3ac0a46fSAndroid Build Coastguard Worker }
2694*3ac0a46fSAndroid Build Coastguard Worker #endif
2695*3ac0a46fSAndroid Build Coastguard Worker l_tcp->cod = 1;
2696*3ac0a46fSAndroid Build Coastguard Worker
2697*3ac0a46fSAndroid Build Coastguard Worker /* Make sure room is sufficient */
2698*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 5) {
2699*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2700*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2701*3ac0a46fSAndroid Build Coastguard Worker }
2702*3ac0a46fSAndroid Build Coastguard Worker
2703*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tcp->csty, 1); /* Scod */
2704*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
2705*3ac0a46fSAndroid Build Coastguard Worker /* Make sure we know how to decode this */
2706*3ac0a46fSAndroid Build Coastguard Worker if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP |
2707*3ac0a46fSAndroid Build Coastguard Worker J2K_CP_CSTY_EPH)) != 0U) {
2708*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n");
2709*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2710*3ac0a46fSAndroid Build Coastguard Worker }
2711*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 1); /* SGcod (A) */
2712*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
2713*3ac0a46fSAndroid Build Coastguard Worker l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
2714*3ac0a46fSAndroid Build Coastguard Worker /* Make sure progression order is valid */
2715*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->prg > OPJ_CPRL) {
2716*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2717*3ac0a46fSAndroid Build Coastguard Worker "Unknown progression order in COD marker\n");
2718*3ac0a46fSAndroid Build Coastguard Worker l_tcp->prg = OPJ_PROG_UNKNOWN;
2719*3ac0a46fSAndroid Build Coastguard Worker }
2720*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tcp->numlayers, 2); /* SGcod (B) */
2721*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
2722*3ac0a46fSAndroid Build Coastguard Worker
2723*3ac0a46fSAndroid Build Coastguard Worker if ((l_tcp->numlayers < 1U) || (l_tcp->numlayers > 65535U)) {
2724*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2725*3ac0a46fSAndroid Build Coastguard Worker "Invalid number of layers in COD marker : %d not in range [1-65535]\n",
2726*3ac0a46fSAndroid Build Coastguard Worker l_tcp->numlayers);
2727*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2728*3ac0a46fSAndroid Build Coastguard Worker }
2729*3ac0a46fSAndroid Build Coastguard Worker
2730*3ac0a46fSAndroid Build Coastguard Worker /* If user didn't set a number layer to decode take the max specify in the codestream. */
2731*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->m_specific_param.m_dec.m_layer) {
2732*3ac0a46fSAndroid Build Coastguard Worker l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
2733*3ac0a46fSAndroid Build Coastguard Worker } else {
2734*3ac0a46fSAndroid Build Coastguard Worker l_tcp->num_layers_to_decode = l_tcp->numlayers;
2735*3ac0a46fSAndroid Build Coastguard Worker }
2736*3ac0a46fSAndroid Build Coastguard Worker
2737*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tcp->mct, 1); /* SGcod (C) */
2738*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
2739*3ac0a46fSAndroid Build Coastguard Worker
2740*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->mct > 1) {
2741*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2742*3ac0a46fSAndroid Build Coastguard Worker "Invalid multiple component transformation\n");
2743*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2744*3ac0a46fSAndroid Build Coastguard Worker }
2745*3ac0a46fSAndroid Build Coastguard Worker
2746*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= 5;
2747*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image->numcomps; ++i) {
2748*3ac0a46fSAndroid Build Coastguard Worker l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
2749*3ac0a46fSAndroid Build Coastguard Worker }
2750*3ac0a46fSAndroid Build Coastguard Worker
2751*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_SPCod_SPCoc(p_j2k, 0, p_header_data, &p_header_size,
2752*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
2753*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2754*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2755*3ac0a46fSAndroid Build Coastguard Worker }
2756*3ac0a46fSAndroid Build Coastguard Worker
2757*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != 0) {
2758*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2759*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2760*3ac0a46fSAndroid Build Coastguard Worker }
2761*3ac0a46fSAndroid Build Coastguard Worker
2762*3ac0a46fSAndroid Build Coastguard Worker /* Apply the coding style to other components of the current tile or the m_default_tcp*/
2763*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_copy_tile_component_parameters(p_j2k);
2764*3ac0a46fSAndroid Build Coastguard Worker
2765*3ac0a46fSAndroid Build Coastguard Worker /* Index */
2766*3ac0a46fSAndroid Build Coastguard Worker #ifdef WIP_REMOVE_MSD
2767*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_info) {
2768*3ac0a46fSAndroid Build Coastguard Worker /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/
2769*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->prog = l_tcp->prg;
2770*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->numlayers = l_tcp->numlayers;
2771*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(
2772*3ac0a46fSAndroid Build Coastguard Worker l_image->numcomps * sizeof(OPJ_UINT32));
2773*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_info->numdecompos) {
2774*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2775*3ac0a46fSAndroid Build Coastguard Worker }
2776*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image->numcomps; ++i) {
2777*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
2778*3ac0a46fSAndroid Build Coastguard Worker }
2779*3ac0a46fSAndroid Build Coastguard Worker }
2780*3ac0a46fSAndroid Build Coastguard Worker #endif
2781*3ac0a46fSAndroid Build Coastguard Worker
2782*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2783*3ac0a46fSAndroid Build Coastguard Worker }
2784*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_coc(opj_j2k_t * p_j2k,OPJ_UINT32 p_comp_no,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)2785*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_coc(opj_j2k_t *p_j2k,
2786*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
2787*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
2788*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
2789*3ac0a46fSAndroid Build Coastguard Worker {
2790*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_coc_size, l_remaining_size;
2791*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_comp_room;
2792*3ac0a46fSAndroid Build Coastguard Worker
2793*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2794*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2795*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
2796*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
2797*3ac0a46fSAndroid Build Coastguard Worker
2798*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;
2799*3ac0a46fSAndroid Build Coastguard Worker
2800*3ac0a46fSAndroid Build Coastguard Worker l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2801*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number, p_comp_no);
2802*3ac0a46fSAndroid Build Coastguard Worker
2803*3ac0a46fSAndroid Build Coastguard Worker if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
2804*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data;
2805*3ac0a46fSAndroid Build Coastguard Worker /*p_j2k->m_specific_param.m_encoder.m_header_tile_data
2806*3ac0a46fSAndroid Build Coastguard Worker = (OPJ_BYTE*)opj_realloc(
2807*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data,
2808*3ac0a46fSAndroid Build Coastguard Worker l_coc_size);*/
2809*3ac0a46fSAndroid Build Coastguard Worker
2810*3ac0a46fSAndroid Build Coastguard Worker new_header_tile_data = (OPJ_BYTE *) opj_realloc(
2811*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);
2812*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
2813*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
2814*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
2815*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
2816*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n");
2817*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2818*3ac0a46fSAndroid Build Coastguard Worker }
2819*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
2820*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
2821*3ac0a46fSAndroid Build Coastguard Worker }
2822*3ac0a46fSAndroid Build Coastguard Worker
2823*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_coc_in_memory(p_j2k, p_comp_no,
2824*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_remaining_size,
2825*3ac0a46fSAndroid Build Coastguard Worker p_manager);
2826*3ac0a46fSAndroid Build Coastguard Worker
2827*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
2828*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size,
2829*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_coc_size) {
2830*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2831*3ac0a46fSAndroid Build Coastguard Worker }
2832*3ac0a46fSAndroid Build Coastguard Worker
2833*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2834*3ac0a46fSAndroid Build Coastguard Worker }
2835*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_compare_coc(opj_j2k_t * p_j2k,OPJ_UINT32 p_first_comp_no,OPJ_UINT32 p_second_comp_no)2836*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_compare_coc(opj_j2k_t *p_j2k,
2837*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
2838*3ac0a46fSAndroid Build Coastguard Worker {
2839*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = NULL;
2840*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = NULL;
2841*3ac0a46fSAndroid Build Coastguard Worker
2842*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2843*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2844*3ac0a46fSAndroid Build Coastguard Worker
2845*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
2846*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2847*3ac0a46fSAndroid Build Coastguard Worker
2848*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->tccps[p_first_comp_no].csty != l_tcp->tccps[p_second_comp_no].csty) {
2849*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2850*3ac0a46fSAndroid Build Coastguard Worker }
2851*3ac0a46fSAndroid Build Coastguard Worker
2852*3ac0a46fSAndroid Build Coastguard Worker
2853*3ac0a46fSAndroid Build Coastguard Worker return opj_j2k_compare_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number,
2854*3ac0a46fSAndroid Build Coastguard Worker p_first_comp_no, p_second_comp_no);
2855*3ac0a46fSAndroid Build Coastguard Worker }
2856*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_coc_in_memory(opj_j2k_t * p_j2k,OPJ_UINT32 p_comp_no,OPJ_BYTE * p_data,OPJ_UINT32 * p_data_written,opj_event_mgr_t * p_manager)2857*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
2858*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
2859*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
2860*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
2861*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
2862*3ac0a46fSAndroid Build Coastguard Worker )
2863*3ac0a46fSAndroid Build Coastguard Worker {
2864*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
2865*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
2866*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_coc_size, l_remaining_size;
2867*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
2868*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *l_image = 00;
2869*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_comp_room;
2870*3ac0a46fSAndroid Build Coastguard Worker
2871*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2872*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2873*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
2874*3ac0a46fSAndroid Build Coastguard Worker
2875*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
2876*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2877*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
2878*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
2879*3ac0a46fSAndroid Build Coastguard Worker
2880*3ac0a46fSAndroid Build Coastguard Worker l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
2881*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number, p_comp_no);
2882*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size = l_coc_size;
2883*3ac0a46fSAndroid Build Coastguard Worker
2884*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_data;
2885*3ac0a46fSAndroid Build Coastguard Worker
2886*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_COC,
2887*3ac0a46fSAndroid Build Coastguard Worker 2); /* COC */
2888*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
2889*3ac0a46fSAndroid Build Coastguard Worker
2890*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_coc_size - 2,
2891*3ac0a46fSAndroid Build Coastguard Worker 2); /* L_COC */
2892*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
2893*3ac0a46fSAndroid Build Coastguard Worker
2894*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, p_comp_no, l_comp_room); /* Ccoc */
2895*3ac0a46fSAndroid Build Coastguard Worker l_current_data += l_comp_room;
2896*3ac0a46fSAndroid Build Coastguard Worker
2897*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty,
2898*3ac0a46fSAndroid Build Coastguard Worker 1); /* Scoc */
2899*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
2900*3ac0a46fSAndroid Build Coastguard Worker
2901*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size -= (5 + l_comp_room);
2902*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
2903*3ac0a46fSAndroid Build Coastguard Worker l_current_data, &l_remaining_size, p_manager);
2904*3ac0a46fSAndroid Build Coastguard Worker * p_data_written = l_coc_size;
2905*3ac0a46fSAndroid Build Coastguard Worker }
2906*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_max_coc_size(opj_j2k_t * p_j2k)2907*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k)
2908*3ac0a46fSAndroid Build Coastguard Worker {
2909*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
2910*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comp;
2911*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
2912*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_max = 0;
2913*3ac0a46fSAndroid Build Coastguard Worker
2914*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2915*3ac0a46fSAndroid Build Coastguard Worker
2916*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
2917*3ac0a46fSAndroid Build Coastguard Worker l_nb_comp = p_j2k->m_private_image->numcomps;
2918*3ac0a46fSAndroid Build Coastguard Worker
2919*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
2920*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_nb_comp; ++j) {
2921*3ac0a46fSAndroid Build Coastguard Worker l_max = opj_uint_max(l_max, opj_j2k_get_SPCod_SPCoc_size(p_j2k, i, j));
2922*3ac0a46fSAndroid Build Coastguard Worker }
2923*3ac0a46fSAndroid Build Coastguard Worker }
2924*3ac0a46fSAndroid Build Coastguard Worker
2925*3ac0a46fSAndroid Build Coastguard Worker return 6 + l_max;
2926*3ac0a46fSAndroid Build Coastguard Worker }
2927*3ac0a46fSAndroid Build Coastguard Worker
2928*3ac0a46fSAndroid Build Coastguard Worker /**
2929*3ac0a46fSAndroid Build Coastguard Worker * Reads a COC marker (Coding Style Component)
2930*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the COC box.
2931*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
2932*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the COC marker.
2933*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
2934*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_coc(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)2935*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_coc(opj_j2k_t *p_j2k,
2936*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
2937*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
2938*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
2939*3ac0a46fSAndroid Build Coastguard Worker )
2940*3ac0a46fSAndroid Build Coastguard Worker {
2941*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = NULL;
2942*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = NULL;
2943*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *l_image = NULL;
2944*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_comp_room;
2945*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_comp_no;
2946*3ac0a46fSAndroid Build Coastguard Worker
2947*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
2948*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
2949*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
2950*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
2951*3ac0a46fSAndroid Build Coastguard Worker
2952*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
2953*3ac0a46fSAndroid Build Coastguard Worker l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
2954*3ac0a46fSAndroid Build Coastguard Worker ?
2955*3ac0a46fSAndroid Build Coastguard Worker &l_cp->tcps[p_j2k->m_current_tile_number] :
2956*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
2957*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
2958*3ac0a46fSAndroid Build Coastguard Worker
2959*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
2960*3ac0a46fSAndroid Build Coastguard Worker
2961*3ac0a46fSAndroid Build Coastguard Worker /* make sure room is sufficient*/
2962*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < l_comp_room + 1) {
2963*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2964*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2965*3ac0a46fSAndroid Build Coastguard Worker }
2966*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= l_comp_room + 1;
2967*3ac0a46fSAndroid Build Coastguard Worker
2968*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_comp_no,
2969*3ac0a46fSAndroid Build Coastguard Worker l_comp_room); /* Ccoc */
2970*3ac0a46fSAndroid Build Coastguard Worker p_header_data += l_comp_room;
2971*3ac0a46fSAndroid Build Coastguard Worker if (l_comp_no >= l_image->numcomps) {
2972*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
2973*3ac0a46fSAndroid Build Coastguard Worker "Error reading COC marker (bad number of components)\n");
2974*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2975*3ac0a46fSAndroid Build Coastguard Worker }
2976*3ac0a46fSAndroid Build Coastguard Worker
2977*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tcp->tccps[l_comp_no].csty,
2978*3ac0a46fSAndroid Build Coastguard Worker 1); /* Scoc */
2979*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data ;
2980*3ac0a46fSAndroid Build Coastguard Worker
2981*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_SPCod_SPCoc(p_j2k, l_comp_no, p_header_data, &p_header_size,
2982*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
2983*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2984*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2985*3ac0a46fSAndroid Build Coastguard Worker }
2986*3ac0a46fSAndroid Build Coastguard Worker
2987*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != 0) {
2988*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
2989*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2990*3ac0a46fSAndroid Build Coastguard Worker }
2991*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2992*3ac0a46fSAndroid Build Coastguard Worker }
2993*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_qcd(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)2994*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_qcd(opj_j2k_t *p_j2k,
2995*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
2996*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
2997*3ac0a46fSAndroid Build Coastguard Worker )
2998*3ac0a46fSAndroid Build Coastguard Worker {
2999*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_qcd_size, l_remaining_size;
3000*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
3001*3ac0a46fSAndroid Build Coastguard Worker
3002*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3003*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3004*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3005*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
3006*3ac0a46fSAndroid Build Coastguard Worker
3007*3ac0a46fSAndroid Build Coastguard Worker l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3008*3ac0a46fSAndroid Build Coastguard Worker 0);
3009*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size = l_qcd_size;
3010*3ac0a46fSAndroid Build Coastguard Worker
3011*3ac0a46fSAndroid Build Coastguard Worker if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3012*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
3013*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);
3014*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
3015*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3016*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3017*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3018*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n");
3019*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3020*3ac0a46fSAndroid Build Coastguard Worker }
3021*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3022*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
3023*3ac0a46fSAndroid Build Coastguard Worker }
3024*3ac0a46fSAndroid Build Coastguard Worker
3025*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
3026*3ac0a46fSAndroid Build Coastguard Worker
3027*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_QCD, 2); /* QCD */
3028*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3029*3ac0a46fSAndroid Build Coastguard Worker
3030*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_qcd_size - 2, 2); /* L_QCD */
3031*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3032*3ac0a46fSAndroid Build Coastguard Worker
3033*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size -= 4;
3034*3ac0a46fSAndroid Build Coastguard Worker
3035*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, 0,
3036*3ac0a46fSAndroid Build Coastguard Worker l_current_data, &l_remaining_size, p_manager)) {
3037*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
3038*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3039*3ac0a46fSAndroid Build Coastguard Worker }
3040*3ac0a46fSAndroid Build Coastguard Worker
3041*3ac0a46fSAndroid Build Coastguard Worker if (l_remaining_size != 0) {
3042*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
3043*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3044*3ac0a46fSAndroid Build Coastguard Worker }
3045*3ac0a46fSAndroid Build Coastguard Worker
3046*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
3047*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size,
3048*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_qcd_size) {
3049*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3050*3ac0a46fSAndroid Build Coastguard Worker }
3051*3ac0a46fSAndroid Build Coastguard Worker
3052*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3053*3ac0a46fSAndroid Build Coastguard Worker }
3054*3ac0a46fSAndroid Build Coastguard Worker
3055*3ac0a46fSAndroid Build Coastguard Worker /**
3056*3ac0a46fSAndroid Build Coastguard Worker * Reads a QCD marker (Quantization defaults)
3057*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the QCD box.
3058*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
3059*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the QCD marker.
3060*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3061*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_qcd(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)3062*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_qcd(opj_j2k_t *p_j2k,
3063*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
3064*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
3065*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3066*3ac0a46fSAndroid Build Coastguard Worker )
3067*3ac0a46fSAndroid Build Coastguard Worker {
3068*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3069*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
3070*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3071*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3072*3ac0a46fSAndroid Build Coastguard Worker
3073*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_SQcd_SQcc(p_j2k, 0, p_header_data, &p_header_size,
3074*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
3075*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3076*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3077*3ac0a46fSAndroid Build Coastguard Worker }
3078*3ac0a46fSAndroid Build Coastguard Worker
3079*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != 0) {
3080*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3081*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3082*3ac0a46fSAndroid Build Coastguard Worker }
3083*3ac0a46fSAndroid Build Coastguard Worker
3084*3ac0a46fSAndroid Build Coastguard Worker /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
3085*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_copy_tile_quantization_parameters(p_j2k);
3086*3ac0a46fSAndroid Build Coastguard Worker
3087*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3088*3ac0a46fSAndroid Build Coastguard Worker }
3089*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_qcc(opj_j2k_t * p_j2k,OPJ_UINT32 p_comp_no,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)3090*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_qcc(opj_j2k_t *p_j2k,
3091*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
3092*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
3093*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3094*3ac0a46fSAndroid Build Coastguard Worker )
3095*3ac0a46fSAndroid Build Coastguard Worker {
3096*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_qcc_size, l_remaining_size;
3097*3ac0a46fSAndroid Build Coastguard Worker
3098*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3099*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3100*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3101*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
3102*3ac0a46fSAndroid Build Coastguard Worker
3103*3ac0a46fSAndroid Build Coastguard Worker l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3104*3ac0a46fSAndroid Build Coastguard Worker p_comp_no);
3105*3ac0a46fSAndroid Build Coastguard Worker l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0 : 1;
3106*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size = l_qcc_size;
3107*3ac0a46fSAndroid Build Coastguard Worker
3108*3ac0a46fSAndroid Build Coastguard Worker if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3109*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
3110*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);
3111*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
3112*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3113*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3114*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3115*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n");
3116*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3117*3ac0a46fSAndroid Build Coastguard Worker }
3118*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3119*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
3120*3ac0a46fSAndroid Build Coastguard Worker }
3121*3ac0a46fSAndroid Build Coastguard Worker
3122*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_qcc_in_memory(p_j2k, p_comp_no,
3123*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_remaining_size,
3124*3ac0a46fSAndroid Build Coastguard Worker p_manager);
3125*3ac0a46fSAndroid Build Coastguard Worker
3126*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
3127*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size,
3128*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_qcc_size) {
3129*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3130*3ac0a46fSAndroid Build Coastguard Worker }
3131*3ac0a46fSAndroid Build Coastguard Worker
3132*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3133*3ac0a46fSAndroid Build Coastguard Worker }
3134*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_compare_qcc(opj_j2k_t * p_j2k,OPJ_UINT32 p_first_comp_no,OPJ_UINT32 p_second_comp_no)3135*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_compare_qcc(opj_j2k_t *p_j2k,
3136*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
3137*3ac0a46fSAndroid Build Coastguard Worker {
3138*3ac0a46fSAndroid Build Coastguard Worker return opj_j2k_compare_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number,
3139*3ac0a46fSAndroid Build Coastguard Worker p_first_comp_no, p_second_comp_no);
3140*3ac0a46fSAndroid Build Coastguard Worker }
3141*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_qcc_in_memory(opj_j2k_t * p_j2k,OPJ_UINT32 p_comp_no,OPJ_BYTE * p_data,OPJ_UINT32 * p_data_written,opj_event_mgr_t * p_manager)3142*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
3143*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
3144*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
3145*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
3146*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3147*3ac0a46fSAndroid Build Coastguard Worker )
3148*3ac0a46fSAndroid Build Coastguard Worker {
3149*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_qcc_size, l_remaining_size;
3150*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
3151*3ac0a46fSAndroid Build Coastguard Worker
3152*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3153*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3154*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3155*3ac0a46fSAndroid Build Coastguard Worker
3156*3ac0a46fSAndroid Build Coastguard Worker l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
3157*3ac0a46fSAndroid Build Coastguard Worker p_comp_no);
3158*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size = l_qcc_size;
3159*3ac0a46fSAndroid Build Coastguard Worker
3160*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_data;
3161*3ac0a46fSAndroid Build Coastguard Worker
3162*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_QCC, 2); /* QCC */
3163*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3164*3ac0a46fSAndroid Build Coastguard Worker
3165*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_private_image->numcomps <= 256) {
3166*3ac0a46fSAndroid Build Coastguard Worker --l_qcc_size;
3167*3ac0a46fSAndroid Build Coastguard Worker
3168*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_qcc_size - 2, 2); /* L_QCC */
3169*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3170*3ac0a46fSAndroid Build Coastguard Worker
3171*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, p_comp_no, 1); /* Cqcc */
3172*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
3173*3ac0a46fSAndroid Build Coastguard Worker
3174*3ac0a46fSAndroid Build Coastguard Worker /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */
3175*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size -= 6;
3176*3ac0a46fSAndroid Build Coastguard Worker } else {
3177*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_qcc_size - 2, 2); /* L_QCC */
3178*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3179*3ac0a46fSAndroid Build Coastguard Worker
3180*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, p_comp_no, 2); /* Cqcc */
3181*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3182*3ac0a46fSAndroid Build Coastguard Worker
3183*3ac0a46fSAndroid Build Coastguard Worker l_remaining_size -= 6;
3184*3ac0a46fSAndroid Build Coastguard Worker }
3185*3ac0a46fSAndroid Build Coastguard Worker
3186*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, p_comp_no,
3187*3ac0a46fSAndroid Build Coastguard Worker l_current_data, &l_remaining_size, p_manager);
3188*3ac0a46fSAndroid Build Coastguard Worker
3189*3ac0a46fSAndroid Build Coastguard Worker *p_data_written = l_qcc_size;
3190*3ac0a46fSAndroid Build Coastguard Worker }
3191*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_max_qcc_size(opj_j2k_t * p_j2k)3192*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_max_qcc_size(opj_j2k_t *p_j2k)
3193*3ac0a46fSAndroid Build Coastguard Worker {
3194*3ac0a46fSAndroid Build Coastguard Worker return opj_j2k_get_max_coc_size(p_j2k);
3195*3ac0a46fSAndroid Build Coastguard Worker }
3196*3ac0a46fSAndroid Build Coastguard Worker
3197*3ac0a46fSAndroid Build Coastguard Worker /**
3198*3ac0a46fSAndroid Build Coastguard Worker * Reads a QCC marker (Quantization component)
3199*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the QCC box.
3200*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
3201*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the QCC marker.
3202*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3203*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_qcc(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)3204*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_qcc(opj_j2k_t *p_j2k,
3205*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
3206*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
3207*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3208*3ac0a46fSAndroid Build Coastguard Worker )
3209*3ac0a46fSAndroid Build Coastguard Worker {
3210*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_num_comp, l_comp_no;
3211*3ac0a46fSAndroid Build Coastguard Worker
3212*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3213*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
3214*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3215*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3216*3ac0a46fSAndroid Build Coastguard Worker
3217*3ac0a46fSAndroid Build Coastguard Worker l_num_comp = p_j2k->m_private_image->numcomps;
3218*3ac0a46fSAndroid Build Coastguard Worker
3219*3ac0a46fSAndroid Build Coastguard Worker if (l_num_comp <= 256) {
3220*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 1) {
3221*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3222*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3223*3ac0a46fSAndroid Build Coastguard Worker }
3224*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_comp_no, 1);
3225*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3226*3ac0a46fSAndroid Build Coastguard Worker --p_header_size;
3227*3ac0a46fSAndroid Build Coastguard Worker } else {
3228*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 2) {
3229*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3230*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3231*3ac0a46fSAndroid Build Coastguard Worker }
3232*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_comp_no, 2);
3233*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
3234*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= 2;
3235*3ac0a46fSAndroid Build Coastguard Worker }
3236*3ac0a46fSAndroid Build Coastguard Worker
3237*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
3238*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.correct) {
3239*3ac0a46fSAndroid Build Coastguard Worker
3240*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 backup_compno = 0;
3241*3ac0a46fSAndroid Build Coastguard Worker
3242*3ac0a46fSAndroid Build Coastguard Worker /* compno is negative or larger than the number of components!!! */
3243*3ac0a46fSAndroid Build Coastguard Worker if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {
3244*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
3245*3ac0a46fSAndroid Build Coastguard Worker "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
3246*3ac0a46fSAndroid Build Coastguard Worker l_comp_no, l_num_comp);
3247*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
3248*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
3249*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3250*3ac0a46fSAndroid Build Coastguard Worker }
3251*3ac0a46fSAndroid Build Coastguard Worker /* we try to correct */
3252*3ac0a46fSAndroid Build Coastguard Worker l_comp_no = backup_compno % l_num_comp;
3253*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
3254*3ac0a46fSAndroid Build Coastguard Worker "- setting component number to %d\n",
3255*3ac0a46fSAndroid Build Coastguard Worker l_comp_no);
3256*3ac0a46fSAndroid Build Coastguard Worker }
3257*3ac0a46fSAndroid Build Coastguard Worker
3258*3ac0a46fSAndroid Build Coastguard Worker /* keep your private count of tiles */
3259*3ac0a46fSAndroid Build Coastguard Worker backup_compno++;
3260*3ac0a46fSAndroid Build Coastguard Worker };
3261*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
3262*3ac0a46fSAndroid Build Coastguard Worker
3263*3ac0a46fSAndroid Build Coastguard Worker if (l_comp_no >= p_j2k->m_private_image->numcomps) {
3264*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
3265*3ac0a46fSAndroid Build Coastguard Worker "Invalid component number: %d, regarding the number of components %d\n",
3266*3ac0a46fSAndroid Build Coastguard Worker l_comp_no, p_j2k->m_private_image->numcomps);
3267*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3268*3ac0a46fSAndroid Build Coastguard Worker }
3269*3ac0a46fSAndroid Build Coastguard Worker
3270*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_SQcd_SQcc(p_j2k, l_comp_no, p_header_data, &p_header_size,
3271*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
3272*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3273*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3274*3ac0a46fSAndroid Build Coastguard Worker }
3275*3ac0a46fSAndroid Build Coastguard Worker
3276*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != 0) {
3277*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3278*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3279*3ac0a46fSAndroid Build Coastguard Worker }
3280*3ac0a46fSAndroid Build Coastguard Worker
3281*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3282*3ac0a46fSAndroid Build Coastguard Worker }
3283*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_poc(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)3284*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_poc(opj_j2k_t *p_j2k,
3285*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
3286*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3287*3ac0a46fSAndroid Build Coastguard Worker )
3288*3ac0a46fSAndroid Build Coastguard Worker {
3289*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comp;
3290*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_poc;
3291*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_poc_size;
3292*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_written_size = 0;
3293*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
3294*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_poc_room;
3295*3ac0a46fSAndroid Build Coastguard Worker
3296*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3297*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3298*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3299*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
3300*3ac0a46fSAndroid Build Coastguard Worker
3301*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
3302*3ac0a46fSAndroid Build Coastguard Worker l_nb_comp = p_j2k->m_private_image->numcomps;
3303*3ac0a46fSAndroid Build Coastguard Worker l_nb_poc = 1 + l_tcp->numpocs;
3304*3ac0a46fSAndroid Build Coastguard Worker
3305*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_comp <= 256) {
3306*3ac0a46fSAndroid Build Coastguard Worker l_poc_room = 1;
3307*3ac0a46fSAndroid Build Coastguard Worker } else {
3308*3ac0a46fSAndroid Build Coastguard Worker l_poc_room = 2;
3309*3ac0a46fSAndroid Build Coastguard Worker }
3310*3ac0a46fSAndroid Build Coastguard Worker l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
3311*3ac0a46fSAndroid Build Coastguard Worker
3312*3ac0a46fSAndroid Build Coastguard Worker if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
3313*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
3314*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);
3315*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
3316*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
3317*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
3318*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
3319*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n");
3320*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3321*3ac0a46fSAndroid Build Coastguard Worker }
3322*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
3323*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
3324*3ac0a46fSAndroid Build Coastguard Worker }
3325*3ac0a46fSAndroid Build Coastguard Worker
3326*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_poc_in_memory(p_j2k,
3327*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_written_size,
3328*3ac0a46fSAndroid Build Coastguard Worker p_manager);
3329*3ac0a46fSAndroid Build Coastguard Worker
3330*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
3331*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size,
3332*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_poc_size) {
3333*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3334*3ac0a46fSAndroid Build Coastguard Worker }
3335*3ac0a46fSAndroid Build Coastguard Worker
3336*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3337*3ac0a46fSAndroid Build Coastguard Worker }
3338*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_poc_in_memory(opj_j2k_t * p_j2k,OPJ_BYTE * p_data,OPJ_UINT32 * p_data_written,opj_event_mgr_t * p_manager)3339*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
3340*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
3341*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
3342*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3343*3ac0a46fSAndroid Build Coastguard Worker )
3344*3ac0a46fSAndroid Build Coastguard Worker {
3345*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
3346*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
3347*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comp;
3348*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_poc;
3349*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_poc_size;
3350*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *l_image = 00;
3351*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
3352*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = 00;
3353*3ac0a46fSAndroid Build Coastguard Worker opj_poc_t *l_current_poc = 00;
3354*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_poc_room;
3355*3ac0a46fSAndroid Build Coastguard Worker
3356*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3357*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3358*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3359*3ac0a46fSAndroid Build Coastguard Worker
3360*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
3361*3ac0a46fSAndroid Build Coastguard Worker
3362*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
3363*3ac0a46fSAndroid Build Coastguard Worker l_tccp = &l_tcp->tccps[0];
3364*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
3365*3ac0a46fSAndroid Build Coastguard Worker l_nb_comp = l_image->numcomps;
3366*3ac0a46fSAndroid Build Coastguard Worker l_nb_poc = 1 + l_tcp->numpocs;
3367*3ac0a46fSAndroid Build Coastguard Worker
3368*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_comp <= 256) {
3369*3ac0a46fSAndroid Build Coastguard Worker l_poc_room = 1;
3370*3ac0a46fSAndroid Build Coastguard Worker } else {
3371*3ac0a46fSAndroid Build Coastguard Worker l_poc_room = 2;
3372*3ac0a46fSAndroid Build Coastguard Worker }
3373*3ac0a46fSAndroid Build Coastguard Worker
3374*3ac0a46fSAndroid Build Coastguard Worker l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
3375*3ac0a46fSAndroid Build Coastguard Worker
3376*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_data;
3377*3ac0a46fSAndroid Build Coastguard Worker
3378*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_POC,
3379*3ac0a46fSAndroid Build Coastguard Worker 2); /* POC */
3380*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3381*3ac0a46fSAndroid Build Coastguard Worker
3382*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_poc_size - 2,
3383*3ac0a46fSAndroid Build Coastguard Worker 2); /* Lpoc */
3384*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3385*3ac0a46fSAndroid Build Coastguard Worker
3386*3ac0a46fSAndroid Build Coastguard Worker l_current_poc = l_tcp->pocs;
3387*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_poc; ++i) {
3388*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_current_poc->resno0,
3389*3ac0a46fSAndroid Build Coastguard Worker 1); /* RSpoc_i */
3390*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
3391*3ac0a46fSAndroid Build Coastguard Worker
3392*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_current_poc->compno0,
3393*3ac0a46fSAndroid Build Coastguard Worker l_poc_room); /* CSpoc_i */
3394*3ac0a46fSAndroid Build Coastguard Worker l_current_data += l_poc_room;
3395*3ac0a46fSAndroid Build Coastguard Worker
3396*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_current_poc->layno1,
3397*3ac0a46fSAndroid Build Coastguard Worker 2); /* LYEpoc_i */
3398*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
3399*3ac0a46fSAndroid Build Coastguard Worker
3400*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_current_poc->resno1,
3401*3ac0a46fSAndroid Build Coastguard Worker 1); /* REpoc_i */
3402*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
3403*3ac0a46fSAndroid Build Coastguard Worker
3404*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_current_poc->compno1,
3405*3ac0a46fSAndroid Build Coastguard Worker l_poc_room); /* CEpoc_i */
3406*3ac0a46fSAndroid Build Coastguard Worker l_current_data += l_poc_room;
3407*3ac0a46fSAndroid Build Coastguard Worker
3408*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, (OPJ_UINT32)l_current_poc->prg,
3409*3ac0a46fSAndroid Build Coastguard Worker 1); /* Ppoc_i */
3410*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
3411*3ac0a46fSAndroid Build Coastguard Worker
3412*3ac0a46fSAndroid Build Coastguard Worker /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
3413*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3414*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);
3415*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3416*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);
3417*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
3418*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->compno1, (OPJ_INT32)l_nb_comp);
3419*3ac0a46fSAndroid Build Coastguard Worker
3420*3ac0a46fSAndroid Build Coastguard Worker ++l_current_poc;
3421*3ac0a46fSAndroid Build Coastguard Worker }
3422*3ac0a46fSAndroid Build Coastguard Worker
3423*3ac0a46fSAndroid Build Coastguard Worker *p_data_written = l_poc_size;
3424*3ac0a46fSAndroid Build Coastguard Worker }
3425*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_max_poc_size(opj_j2k_t * p_j2k)3426*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k)
3427*3ac0a46fSAndroid Build Coastguard Worker {
3428*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = 00;
3429*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles = 0;
3430*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_max_poc = 0;
3431*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
3432*3ac0a46fSAndroid Build Coastguard Worker
3433*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_cp.tcps;
3434*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
3435*3ac0a46fSAndroid Build Coastguard Worker
3436*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
3437*3ac0a46fSAndroid Build Coastguard Worker l_max_poc = opj_uint_max(l_max_poc, l_tcp->numpocs);
3438*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
3439*3ac0a46fSAndroid Build Coastguard Worker }
3440*3ac0a46fSAndroid Build Coastguard Worker
3441*3ac0a46fSAndroid Build Coastguard Worker ++l_max_poc;
3442*3ac0a46fSAndroid Build Coastguard Worker
3443*3ac0a46fSAndroid Build Coastguard Worker return 4 + 9 * l_max_poc;
3444*3ac0a46fSAndroid Build Coastguard Worker }
3445*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_max_toc_size(opj_j2k_t * p_j2k)3446*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k)
3447*3ac0a46fSAndroid Build Coastguard Worker {
3448*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
3449*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
3450*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_max = 0;
3451*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = 00;
3452*3ac0a46fSAndroid Build Coastguard Worker
3453*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_cp.tcps;
3454*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
3455*3ac0a46fSAndroid Build Coastguard Worker
3456*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
3457*3ac0a46fSAndroid Build Coastguard Worker l_max = opj_uint_max(l_max, l_tcp->m_nb_tile_parts);
3458*3ac0a46fSAndroid Build Coastguard Worker
3459*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
3460*3ac0a46fSAndroid Build Coastguard Worker }
3461*3ac0a46fSAndroid Build Coastguard Worker
3462*3ac0a46fSAndroid Build Coastguard Worker return 12 * l_max;
3463*3ac0a46fSAndroid Build Coastguard Worker }
3464*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_specific_header_sizes(opj_j2k_t * p_j2k)3465*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
3466*3ac0a46fSAndroid Build Coastguard Worker {
3467*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_bytes = 0;
3468*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comps;
3469*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_coc_bytes, l_qcc_bytes;
3470*3ac0a46fSAndroid Build Coastguard Worker
3471*3ac0a46fSAndroid Build Coastguard Worker l_nb_comps = p_j2k->m_private_image->numcomps - 1;
3472*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
3473*3ac0a46fSAndroid Build Coastguard Worker
3474*3ac0a46fSAndroid Build Coastguard Worker if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) {
3475*3ac0a46fSAndroid Build Coastguard Worker l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
3476*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes += l_nb_comps * l_coc_bytes;
3477*3ac0a46fSAndroid Build Coastguard Worker
3478*3ac0a46fSAndroid Build Coastguard Worker l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
3479*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes += l_nb_comps * l_qcc_bytes;
3480*3ac0a46fSAndroid Build Coastguard Worker }
3481*3ac0a46fSAndroid Build Coastguard Worker
3482*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
3483*3ac0a46fSAndroid Build Coastguard Worker
3484*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_PLT) {
3485*3ac0a46fSAndroid Build Coastguard Worker /* Reserve space for PLT markers */
3486*3ac0a46fSAndroid Build Coastguard Worker
3487*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
3488*3ac0a46fSAndroid Build Coastguard Worker const opj_cp_t * l_cp = &(p_j2k->m_cp);
3489*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_max_packet_count = 0;
3490*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_cp->th * l_cp->tw; ++i) {
3491*3ac0a46fSAndroid Build Coastguard Worker l_max_packet_count = opj_uint_max(l_max_packet_count,
3492*3ac0a46fSAndroid Build Coastguard Worker opj_get_encoding_packet_count(p_j2k->m_private_image, l_cp, i));
3493*3ac0a46fSAndroid Build Coastguard Worker }
3494*3ac0a46fSAndroid Build Coastguard Worker /* Minimum 6 bytes per PLT marker, and at a minimum (taking a pessimistic */
3495*3ac0a46fSAndroid Build Coastguard Worker /* estimate of 4 bytes for a packet size), one can write */
3496*3ac0a46fSAndroid Build Coastguard Worker /* (65536-6) / 4 = 16382 paquet sizes per PLT marker */
3497*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT =
3498*3ac0a46fSAndroid Build Coastguard Worker 6 * opj_uint_ceildiv(l_max_packet_count, 16382);
3499*3ac0a46fSAndroid Build Coastguard Worker /* Maximum 5 bytes per packet to encode a full UINT32 */
3500*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT +=
3501*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes += 5 * l_max_packet_count;
3502*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT += 1;
3503*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes += p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT;
3504*3ac0a46fSAndroid Build Coastguard Worker }
3505*3ac0a46fSAndroid Build Coastguard Worker
3506*3ac0a46fSAndroid Build Coastguard Worker /*** DEVELOPER CORNER, Add room for your headers ***/
3507*3ac0a46fSAndroid Build Coastguard Worker
3508*3ac0a46fSAndroid Build Coastguard Worker return l_nb_bytes;
3509*3ac0a46fSAndroid Build Coastguard Worker }
3510*3ac0a46fSAndroid Build Coastguard Worker
3511*3ac0a46fSAndroid Build Coastguard Worker /**
3512*3ac0a46fSAndroid Build Coastguard Worker * Reads a POC marker (Progression Order Change)
3513*3ac0a46fSAndroid Build Coastguard Worker *
3514*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the POC box.
3515*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
3516*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the POC marker.
3517*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3518*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_poc(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)3519*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_poc(opj_j2k_t *p_j2k,
3520*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
3521*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
3522*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3523*3ac0a46fSAndroid Build Coastguard Worker )
3524*3ac0a46fSAndroid Build Coastguard Worker {
3525*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, l_nb_comp, l_tmp;
3526*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image = 00;
3527*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
3528*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_chunk_size, l_comp_room;
3529*3ac0a46fSAndroid Build Coastguard Worker
3530*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
3531*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
3532*3ac0a46fSAndroid Build Coastguard Worker opj_poc_t *l_current_poc = 00;
3533*3ac0a46fSAndroid Build Coastguard Worker
3534*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3535*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
3536*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3537*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3538*3ac0a46fSAndroid Build Coastguard Worker
3539*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
3540*3ac0a46fSAndroid Build Coastguard Worker l_nb_comp = l_image->numcomps;
3541*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_comp <= 256) {
3542*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = 1;
3543*3ac0a46fSAndroid Build Coastguard Worker } else {
3544*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = 2;
3545*3ac0a46fSAndroid Build Coastguard Worker }
3546*3ac0a46fSAndroid Build Coastguard Worker l_chunk_size = 5 + 2 * l_comp_room;
3547*3ac0a46fSAndroid Build Coastguard Worker l_current_poc_nb = p_header_size / l_chunk_size;
3548*3ac0a46fSAndroid Build Coastguard Worker l_current_poc_remaining = p_header_size % l_chunk_size;
3549*3ac0a46fSAndroid Build Coastguard Worker
3550*3ac0a46fSAndroid Build Coastguard Worker if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
3551*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
3552*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3553*3ac0a46fSAndroid Build Coastguard Worker }
3554*3ac0a46fSAndroid Build Coastguard Worker
3555*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
3556*3ac0a46fSAndroid Build Coastguard Worker l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
3557*3ac0a46fSAndroid Build Coastguard Worker &l_cp->tcps[p_j2k->m_current_tile_number] :
3558*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
3559*3ac0a46fSAndroid Build Coastguard Worker l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
3560*3ac0a46fSAndroid Build Coastguard Worker l_current_poc_nb += l_old_poc_nb;
3561*3ac0a46fSAndroid Build Coastguard Worker
3562*3ac0a46fSAndroid Build Coastguard Worker if (l_current_poc_nb >= J2K_MAX_POCS) {
3563*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
3564*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3565*3ac0a46fSAndroid Build Coastguard Worker }
3566*3ac0a46fSAndroid Build Coastguard Worker
3567*3ac0a46fSAndroid Build Coastguard Worker /* now poc is in use.*/
3568*3ac0a46fSAndroid Build Coastguard Worker l_tcp->POC = 1;
3569*3ac0a46fSAndroid Build Coastguard Worker
3570*3ac0a46fSAndroid Build Coastguard Worker l_current_poc = &l_tcp->pocs[l_old_poc_nb];
3571*3ac0a46fSAndroid Build Coastguard Worker for (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
3572*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &(l_current_poc->resno0),
3573*3ac0a46fSAndroid Build Coastguard Worker 1); /* RSpoc_i */
3574*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3575*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &(l_current_poc->compno0),
3576*3ac0a46fSAndroid Build Coastguard Worker l_comp_room); /* CSpoc_i */
3577*3ac0a46fSAndroid Build Coastguard Worker p_header_data += l_comp_room;
3578*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &(l_current_poc->layno1),
3579*3ac0a46fSAndroid Build Coastguard Worker 2); /* LYEpoc_i */
3580*3ac0a46fSAndroid Build Coastguard Worker /* make sure layer end is in acceptable bounds */
3581*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
3582*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
3583*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &(l_current_poc->resno1),
3584*3ac0a46fSAndroid Build Coastguard Worker 1); /* REpoc_i */
3585*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3586*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &(l_current_poc->compno1),
3587*3ac0a46fSAndroid Build Coastguard Worker l_comp_room); /* CEpoc_i */
3588*3ac0a46fSAndroid Build Coastguard Worker p_header_data += l_comp_room;
3589*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp,
3590*3ac0a46fSAndroid Build Coastguard Worker 1); /* Ppoc_i */
3591*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3592*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
3593*3ac0a46fSAndroid Build Coastguard Worker /* make sure comp is in acceptable bounds */
3594*3ac0a46fSAndroid Build Coastguard Worker l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
3595*3ac0a46fSAndroid Build Coastguard Worker ++l_current_poc;
3596*3ac0a46fSAndroid Build Coastguard Worker }
3597*3ac0a46fSAndroid Build Coastguard Worker
3598*3ac0a46fSAndroid Build Coastguard Worker l_tcp->numpocs = l_current_poc_nb - 1;
3599*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3600*3ac0a46fSAndroid Build Coastguard Worker }
3601*3ac0a46fSAndroid Build Coastguard Worker
3602*3ac0a46fSAndroid Build Coastguard Worker /**
3603*3ac0a46fSAndroid Build Coastguard Worker * Reads a CRG marker (Component registration)
3604*3ac0a46fSAndroid Build Coastguard Worker *
3605*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the TLM box.
3606*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
3607*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the TLM marker.
3608*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3609*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_crg(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)3610*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_crg(opj_j2k_t *p_j2k,
3611*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
3612*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
3613*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3614*3ac0a46fSAndroid Build Coastguard Worker )
3615*3ac0a46fSAndroid Build Coastguard Worker {
3616*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comp;
3617*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3618*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
3619*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3620*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3621*3ac0a46fSAndroid Build Coastguard Worker
3622*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_header_data);
3623*3ac0a46fSAndroid Build Coastguard Worker
3624*3ac0a46fSAndroid Build Coastguard Worker l_nb_comp = p_j2k->m_private_image->numcomps;
3625*3ac0a46fSAndroid Build Coastguard Worker
3626*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != l_nb_comp * 4) {
3627*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
3628*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3629*3ac0a46fSAndroid Build Coastguard Worker }
3630*3ac0a46fSAndroid Build Coastguard Worker /* Do not care of this at the moment since only local variables are set here */
3631*3ac0a46fSAndroid Build Coastguard Worker /*
3632*3ac0a46fSAndroid Build Coastguard Worker for
3633*3ac0a46fSAndroid Build Coastguard Worker (i = 0; i < l_nb_comp; ++i)
3634*3ac0a46fSAndroid Build Coastguard Worker {
3635*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data,&l_Xcrg_i,2); // Xcrg_i
3636*3ac0a46fSAndroid Build Coastguard Worker p_header_data+=2;
3637*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data,&l_Ycrg_i,2); // Xcrg_i
3638*3ac0a46fSAndroid Build Coastguard Worker p_header_data+=2;
3639*3ac0a46fSAndroid Build Coastguard Worker }
3640*3ac0a46fSAndroid Build Coastguard Worker */
3641*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3642*3ac0a46fSAndroid Build Coastguard Worker }
3643*3ac0a46fSAndroid Build Coastguard Worker
3644*3ac0a46fSAndroid Build Coastguard Worker /**
3645*3ac0a46fSAndroid Build Coastguard Worker * Reads a TLM marker (Tile Length Marker)
3646*3ac0a46fSAndroid Build Coastguard Worker *
3647*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the TLM box.
3648*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
3649*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the TLM marker.
3650*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3651*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_tlm(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)3652*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_tlm(opj_j2k_t *p_j2k,
3653*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
3654*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
3655*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3656*3ac0a46fSAndroid Build Coastguard Worker )
3657*3ac0a46fSAndroid Build Coastguard Worker {
3658*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient,
3659*3ac0a46fSAndroid Build Coastguard Worker l_Ptlm_size;
3660*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3661*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
3662*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3663*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3664*3ac0a46fSAndroid Build Coastguard Worker
3665*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_j2k);
3666*3ac0a46fSAndroid Build Coastguard Worker
3667*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 2) {
3668*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
3669*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3670*3ac0a46fSAndroid Build Coastguard Worker }
3671*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= 2;
3672*3ac0a46fSAndroid Build Coastguard Worker
3673*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_Ztlm,
3674*3ac0a46fSAndroid Build Coastguard Worker 1); /* Ztlm */
3675*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3676*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_Stlm,
3677*3ac0a46fSAndroid Build Coastguard Worker 1); /* Stlm */
3678*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3679*3ac0a46fSAndroid Build Coastguard Worker
3680*3ac0a46fSAndroid Build Coastguard Worker l_ST = ((l_Stlm >> 4) & 0x3);
3681*3ac0a46fSAndroid Build Coastguard Worker l_SP = (l_Stlm >> 6) & 0x1;
3682*3ac0a46fSAndroid Build Coastguard Worker
3683*3ac0a46fSAndroid Build Coastguard Worker l_Ptlm_size = (l_SP + 1) * 2;
3684*3ac0a46fSAndroid Build Coastguard Worker l_quotient = l_Ptlm_size + l_ST;
3685*3ac0a46fSAndroid Build Coastguard Worker
3686*3ac0a46fSAndroid Build Coastguard Worker l_tot_num_tp_remaining = p_header_size % l_quotient;
3687*3ac0a46fSAndroid Build Coastguard Worker
3688*3ac0a46fSAndroid Build Coastguard Worker if (l_tot_num_tp_remaining != 0) {
3689*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
3690*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3691*3ac0a46fSAndroid Build Coastguard Worker }
3692*3ac0a46fSAndroid Build Coastguard Worker /* FIXME Do not care of this at the moment since only local variables are set here */
3693*3ac0a46fSAndroid Build Coastguard Worker /*
3694*3ac0a46fSAndroid Build Coastguard Worker for
3695*3ac0a46fSAndroid Build Coastguard Worker (i = 0; i < l_tot_num_tp; ++i)
3696*3ac0a46fSAndroid Build Coastguard Worker {
3697*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST); // Ttlm_i
3698*3ac0a46fSAndroid Build Coastguard Worker p_header_data += l_ST;
3699*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size); // Ptlm_i
3700*3ac0a46fSAndroid Build Coastguard Worker p_header_data += l_Ptlm_size;
3701*3ac0a46fSAndroid Build Coastguard Worker }*/
3702*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3703*3ac0a46fSAndroid Build Coastguard Worker }
3704*3ac0a46fSAndroid Build Coastguard Worker
3705*3ac0a46fSAndroid Build Coastguard Worker /**
3706*3ac0a46fSAndroid Build Coastguard Worker * Reads a PLM marker (Packet length, main header marker)
3707*3ac0a46fSAndroid Build Coastguard Worker *
3708*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the TLM box.
3709*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
3710*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the TLM marker.
3711*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3712*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_plm(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)3713*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_plm(opj_j2k_t *p_j2k,
3714*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
3715*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
3716*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3717*3ac0a46fSAndroid Build Coastguard Worker )
3718*3ac0a46fSAndroid Build Coastguard Worker {
3719*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3720*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
3721*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3722*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3723*3ac0a46fSAndroid Build Coastguard Worker
3724*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_j2k);
3725*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_header_data);
3726*3ac0a46fSAndroid Build Coastguard Worker
3727*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 1) {
3728*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3729*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3730*3ac0a46fSAndroid Build Coastguard Worker }
3731*3ac0a46fSAndroid Build Coastguard Worker /* Do not care of this at the moment since only local variables are set here */
3732*3ac0a46fSAndroid Build Coastguard Worker /*
3733*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data,&l_Zplm,1); // Zplm
3734*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3735*3ac0a46fSAndroid Build Coastguard Worker --p_header_size;
3736*3ac0a46fSAndroid Build Coastguard Worker
3737*3ac0a46fSAndroid Build Coastguard Worker while
3738*3ac0a46fSAndroid Build Coastguard Worker (p_header_size > 0)
3739*3ac0a46fSAndroid Build Coastguard Worker {
3740*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data,&l_Nplm,1); // Nplm
3741*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3742*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= (1+l_Nplm);
3743*3ac0a46fSAndroid Build Coastguard Worker if
3744*3ac0a46fSAndroid Build Coastguard Worker (p_header_size < 0)
3745*3ac0a46fSAndroid Build Coastguard Worker {
3746*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3747*3ac0a46fSAndroid Build Coastguard Worker return false;
3748*3ac0a46fSAndroid Build Coastguard Worker }
3749*3ac0a46fSAndroid Build Coastguard Worker for
3750*3ac0a46fSAndroid Build Coastguard Worker (i = 0; i < l_Nplm; ++i)
3751*3ac0a46fSAndroid Build Coastguard Worker {
3752*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data,&l_tmp,1); // Iplm_ij
3753*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3754*3ac0a46fSAndroid Build Coastguard Worker // take only the last seven bytes
3755*3ac0a46fSAndroid Build Coastguard Worker l_packet_len |= (l_tmp & 0x7f);
3756*3ac0a46fSAndroid Build Coastguard Worker if
3757*3ac0a46fSAndroid Build Coastguard Worker (l_tmp & 0x80)
3758*3ac0a46fSAndroid Build Coastguard Worker {
3759*3ac0a46fSAndroid Build Coastguard Worker l_packet_len <<= 7;
3760*3ac0a46fSAndroid Build Coastguard Worker }
3761*3ac0a46fSAndroid Build Coastguard Worker else
3762*3ac0a46fSAndroid Build Coastguard Worker {
3763*3ac0a46fSAndroid Build Coastguard Worker // store packet length and proceed to next packet
3764*3ac0a46fSAndroid Build Coastguard Worker l_packet_len = 0;
3765*3ac0a46fSAndroid Build Coastguard Worker }
3766*3ac0a46fSAndroid Build Coastguard Worker }
3767*3ac0a46fSAndroid Build Coastguard Worker if
3768*3ac0a46fSAndroid Build Coastguard Worker (l_packet_len != 0)
3769*3ac0a46fSAndroid Build Coastguard Worker {
3770*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
3771*3ac0a46fSAndroid Build Coastguard Worker return false;
3772*3ac0a46fSAndroid Build Coastguard Worker }
3773*3ac0a46fSAndroid Build Coastguard Worker }
3774*3ac0a46fSAndroid Build Coastguard Worker */
3775*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3776*3ac0a46fSAndroid Build Coastguard Worker }
3777*3ac0a46fSAndroid Build Coastguard Worker
3778*3ac0a46fSAndroid Build Coastguard Worker /**
3779*3ac0a46fSAndroid Build Coastguard Worker * Reads a PLT marker (Packet length, tile-part header)
3780*3ac0a46fSAndroid Build Coastguard Worker *
3781*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the PLT box.
3782*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
3783*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the PLT marker.
3784*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3785*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_plt(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)3786*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_plt(opj_j2k_t *p_j2k,
3787*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
3788*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
3789*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
3790*3ac0a46fSAndroid Build Coastguard Worker )
3791*3ac0a46fSAndroid Build Coastguard Worker {
3792*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
3793*3ac0a46fSAndroid Build Coastguard Worker
3794*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3795*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
3796*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3797*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3798*3ac0a46fSAndroid Build Coastguard Worker
3799*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_j2k);
3800*3ac0a46fSAndroid Build Coastguard Worker
3801*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 1) {
3802*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3803*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3804*3ac0a46fSAndroid Build Coastguard Worker }
3805*3ac0a46fSAndroid Build Coastguard Worker
3806*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_Zplt, 1); /* Zplt */
3807*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3808*3ac0a46fSAndroid Build Coastguard Worker --p_header_size;
3809*3ac0a46fSAndroid Build Coastguard Worker
3810*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_header_size; ++i) {
3811*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 1); /* Iplt_ij */
3812*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3813*3ac0a46fSAndroid Build Coastguard Worker /* take only the last seven bytes */
3814*3ac0a46fSAndroid Build Coastguard Worker l_packet_len |= (l_tmp & 0x7f);
3815*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp & 0x80) {
3816*3ac0a46fSAndroid Build Coastguard Worker l_packet_len <<= 7;
3817*3ac0a46fSAndroid Build Coastguard Worker } else {
3818*3ac0a46fSAndroid Build Coastguard Worker /* store packet length and proceed to next packet */
3819*3ac0a46fSAndroid Build Coastguard Worker l_packet_len = 0;
3820*3ac0a46fSAndroid Build Coastguard Worker }
3821*3ac0a46fSAndroid Build Coastguard Worker }
3822*3ac0a46fSAndroid Build Coastguard Worker
3823*3ac0a46fSAndroid Build Coastguard Worker if (l_packet_len != 0) {
3824*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
3825*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3826*3ac0a46fSAndroid Build Coastguard Worker }
3827*3ac0a46fSAndroid Build Coastguard Worker
3828*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3829*3ac0a46fSAndroid Build Coastguard Worker }
3830*3ac0a46fSAndroid Build Coastguard Worker
3831*3ac0a46fSAndroid Build Coastguard Worker /**
3832*3ac0a46fSAndroid Build Coastguard Worker * Reads a PPM marker (Packed packet headers, main header)
3833*3ac0a46fSAndroid Build Coastguard Worker *
3834*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the POC box.
3835*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
3836*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the POC marker.
3837*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3838*3ac0a46fSAndroid Build Coastguard Worker */
3839*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_ppm(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)3840*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_ppm(
3841*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t *p_j2k,
3842*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
3843*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
3844*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
3845*3ac0a46fSAndroid Build Coastguard Worker {
3846*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
3847*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_Z_ppm;
3848*3ac0a46fSAndroid Build Coastguard Worker
3849*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3850*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
3851*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
3852*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3853*3ac0a46fSAndroid Build Coastguard Worker
3854*3ac0a46fSAndroid Build Coastguard Worker /* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */
3855*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 2) {
3856*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
3857*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3858*3ac0a46fSAndroid Build Coastguard Worker }
3859*3ac0a46fSAndroid Build Coastguard Worker
3860*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
3861*3ac0a46fSAndroid Build Coastguard Worker l_cp->ppm = 1;
3862*3ac0a46fSAndroid Build Coastguard Worker
3863*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_Z_ppm, 1); /* Z_ppm */
3864*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
3865*3ac0a46fSAndroid Build Coastguard Worker --p_header_size;
3866*3ac0a46fSAndroid Build Coastguard Worker
3867*3ac0a46fSAndroid Build Coastguard Worker /* check allocation needed */
3868*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->ppm_markers == NULL) { /* first PPM marker */
3869*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3870*3ac0a46fSAndroid Build Coastguard Worker assert(l_cp->ppm_markers_count == 0U);
3871*3ac0a46fSAndroid Build Coastguard Worker
3872*3ac0a46fSAndroid Build Coastguard Worker l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
3873*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->ppm_markers == NULL) {
3874*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3875*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3876*3ac0a46fSAndroid Build Coastguard Worker }
3877*3ac0a46fSAndroid Build Coastguard Worker l_cp->ppm_markers_count = l_newCount;
3878*3ac0a46fSAndroid Build Coastguard Worker } else if (l_cp->ppm_markers_count <= l_Z_ppm) {
3879*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
3880*3ac0a46fSAndroid Build Coastguard Worker opj_ppx *new_ppm_markers;
3881*3ac0a46fSAndroid Build Coastguard Worker new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers,
3882*3ac0a46fSAndroid Build Coastguard Worker l_newCount * sizeof(opj_ppx));
3883*3ac0a46fSAndroid Build Coastguard Worker if (new_ppm_markers == NULL) {
3884*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_cp destruction */
3885*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3886*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3887*3ac0a46fSAndroid Build Coastguard Worker }
3888*3ac0a46fSAndroid Build Coastguard Worker l_cp->ppm_markers = new_ppm_markers;
3889*3ac0a46fSAndroid Build Coastguard Worker memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0,
3890*3ac0a46fSAndroid Build Coastguard Worker (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx));
3891*3ac0a46fSAndroid Build Coastguard Worker l_cp->ppm_markers_count = l_newCount;
3892*3ac0a46fSAndroid Build Coastguard Worker }
3893*3ac0a46fSAndroid Build Coastguard Worker
3894*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) {
3895*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_cp destruction */
3896*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm);
3897*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3898*3ac0a46fSAndroid Build Coastguard Worker }
3899*3ac0a46fSAndroid Build Coastguard Worker
3900*3ac0a46fSAndroid Build Coastguard Worker l_cp->ppm_markers[l_Z_ppm].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
3901*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->ppm_markers[l_Z_ppm].m_data == NULL) {
3902*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_cp destruction */
3903*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3904*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3905*3ac0a46fSAndroid Build Coastguard Worker }
3906*3ac0a46fSAndroid Build Coastguard Worker l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size;
3907*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size);
3908*3ac0a46fSAndroid Build Coastguard Worker
3909*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3910*3ac0a46fSAndroid Build Coastguard Worker }
3911*3ac0a46fSAndroid Build Coastguard Worker
3912*3ac0a46fSAndroid Build Coastguard Worker /**
3913*3ac0a46fSAndroid Build Coastguard Worker * Merges all PPM markers read (Packed headers, main header)
3914*3ac0a46fSAndroid Build Coastguard Worker *
3915*3ac0a46fSAndroid Build Coastguard Worker * @param p_cp main coding parameters.
3916*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
3917*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_merge_ppm(opj_cp_t * p_cp,opj_event_mgr_t * p_manager)3918*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_merge_ppm(opj_cp_t *p_cp, opj_event_mgr_t * p_manager)
3919*3ac0a46fSAndroid Build Coastguard Worker {
3920*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining;
3921*3ac0a46fSAndroid Build Coastguard Worker
3922*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
3923*3ac0a46fSAndroid Build Coastguard Worker assert(p_cp != 00);
3924*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
3925*3ac0a46fSAndroid Build Coastguard Worker assert(p_cp->ppm_buffer == NULL);
3926*3ac0a46fSAndroid Build Coastguard Worker
3927*3ac0a46fSAndroid Build Coastguard Worker if (p_cp->ppm == 0U) {
3928*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
3929*3ac0a46fSAndroid Build Coastguard Worker }
3930*3ac0a46fSAndroid Build Coastguard Worker
3931*3ac0a46fSAndroid Build Coastguard Worker l_ppm_data_size = 0U;
3932*3ac0a46fSAndroid Build Coastguard Worker l_N_ppm_remaining = 0U;
3933*3ac0a46fSAndroid Build Coastguard Worker for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
3934*3ac0a46fSAndroid Build Coastguard Worker if (p_cp->ppm_markers[i].m_data !=
3935*3ac0a46fSAndroid Build Coastguard Worker NULL) { /* standard doesn't seem to require contiguous Zppm */
3936*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_N_ppm;
3937*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
3938*3ac0a46fSAndroid Build Coastguard Worker const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
3939*3ac0a46fSAndroid Build Coastguard Worker
3940*3ac0a46fSAndroid Build Coastguard Worker if (l_N_ppm_remaining >= l_data_size) {
3941*3ac0a46fSAndroid Build Coastguard Worker l_N_ppm_remaining -= l_data_size;
3942*3ac0a46fSAndroid Build Coastguard Worker l_data_size = 0U;
3943*3ac0a46fSAndroid Build Coastguard Worker } else {
3944*3ac0a46fSAndroid Build Coastguard Worker l_data += l_N_ppm_remaining;
3945*3ac0a46fSAndroid Build Coastguard Worker l_data_size -= l_N_ppm_remaining;
3946*3ac0a46fSAndroid Build Coastguard Worker l_N_ppm_remaining = 0U;
3947*3ac0a46fSAndroid Build Coastguard Worker }
3948*3ac0a46fSAndroid Build Coastguard Worker
3949*3ac0a46fSAndroid Build Coastguard Worker if (l_data_size > 0U) {
3950*3ac0a46fSAndroid Build Coastguard Worker do {
3951*3ac0a46fSAndroid Build Coastguard Worker /* read Nppm */
3952*3ac0a46fSAndroid Build Coastguard Worker if (l_data_size < 4U) {
3953*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_cp destruction */
3954*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
3955*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3956*3ac0a46fSAndroid Build Coastguard Worker }
3957*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_data, &l_N_ppm, 4);
3958*3ac0a46fSAndroid Build Coastguard Worker l_data += 4;
3959*3ac0a46fSAndroid Build Coastguard Worker l_data_size -= 4;
3960*3ac0a46fSAndroid Build Coastguard Worker l_ppm_data_size +=
3961*3ac0a46fSAndroid Build Coastguard Worker 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 */
3962*3ac0a46fSAndroid Build Coastguard Worker
3963*3ac0a46fSAndroid Build Coastguard Worker if (l_data_size >= l_N_ppm) {
3964*3ac0a46fSAndroid Build Coastguard Worker l_data_size -= l_N_ppm;
3965*3ac0a46fSAndroid Build Coastguard Worker l_data += l_N_ppm;
3966*3ac0a46fSAndroid Build Coastguard Worker } else {
3967*3ac0a46fSAndroid Build Coastguard Worker l_N_ppm_remaining = l_N_ppm - l_data_size;
3968*3ac0a46fSAndroid Build Coastguard Worker l_data_size = 0U;
3969*3ac0a46fSAndroid Build Coastguard Worker }
3970*3ac0a46fSAndroid Build Coastguard Worker } while (l_data_size > 0U);
3971*3ac0a46fSAndroid Build Coastguard Worker }
3972*3ac0a46fSAndroid Build Coastguard Worker }
3973*3ac0a46fSAndroid Build Coastguard Worker }
3974*3ac0a46fSAndroid Build Coastguard Worker
3975*3ac0a46fSAndroid Build Coastguard Worker if (l_N_ppm_remaining != 0U) {
3976*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_cp destruction */
3977*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n");
3978*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3979*3ac0a46fSAndroid Build Coastguard Worker }
3980*3ac0a46fSAndroid Build Coastguard Worker
3981*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size);
3982*3ac0a46fSAndroid Build Coastguard Worker if (p_cp->ppm_buffer == 00) {
3983*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
3984*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
3985*3ac0a46fSAndroid Build Coastguard Worker }
3986*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_len = l_ppm_data_size;
3987*3ac0a46fSAndroid Build Coastguard Worker l_ppm_data_size = 0U;
3988*3ac0a46fSAndroid Build Coastguard Worker l_N_ppm_remaining = 0U;
3989*3ac0a46fSAndroid Build Coastguard Worker for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
3990*3ac0a46fSAndroid Build Coastguard Worker if (p_cp->ppm_markers[i].m_data !=
3991*3ac0a46fSAndroid Build Coastguard Worker NULL) { /* standard doesn't seem to require contiguous Zppm */
3992*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_N_ppm;
3993*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
3994*3ac0a46fSAndroid Build Coastguard Worker const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
3995*3ac0a46fSAndroid Build Coastguard Worker
3996*3ac0a46fSAndroid Build Coastguard Worker if (l_N_ppm_remaining >= l_data_size) {
3997*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
3998*3ac0a46fSAndroid Build Coastguard Worker l_ppm_data_size += l_data_size;
3999*3ac0a46fSAndroid Build Coastguard Worker l_N_ppm_remaining -= l_data_size;
4000*3ac0a46fSAndroid Build Coastguard Worker l_data_size = 0U;
4001*3ac0a46fSAndroid Build Coastguard Worker } else {
4002*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining);
4003*3ac0a46fSAndroid Build Coastguard Worker l_ppm_data_size += l_N_ppm_remaining;
4004*3ac0a46fSAndroid Build Coastguard Worker l_data += l_N_ppm_remaining;
4005*3ac0a46fSAndroid Build Coastguard Worker l_data_size -= l_N_ppm_remaining;
4006*3ac0a46fSAndroid Build Coastguard Worker l_N_ppm_remaining = 0U;
4007*3ac0a46fSAndroid Build Coastguard Worker }
4008*3ac0a46fSAndroid Build Coastguard Worker
4009*3ac0a46fSAndroid Build Coastguard Worker if (l_data_size > 0U) {
4010*3ac0a46fSAndroid Build Coastguard Worker do {
4011*3ac0a46fSAndroid Build Coastguard Worker /* read Nppm */
4012*3ac0a46fSAndroid Build Coastguard Worker if (l_data_size < 4U) {
4013*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_cp destruction */
4014*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
4015*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4016*3ac0a46fSAndroid Build Coastguard Worker }
4017*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_data, &l_N_ppm, 4);
4018*3ac0a46fSAndroid Build Coastguard Worker l_data += 4;
4019*3ac0a46fSAndroid Build Coastguard Worker l_data_size -= 4;
4020*3ac0a46fSAndroid Build Coastguard Worker
4021*3ac0a46fSAndroid Build Coastguard Worker if (l_data_size >= l_N_ppm) {
4022*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm);
4023*3ac0a46fSAndroid Build Coastguard Worker l_ppm_data_size += l_N_ppm;
4024*3ac0a46fSAndroid Build Coastguard Worker l_data_size -= l_N_ppm;
4025*3ac0a46fSAndroid Build Coastguard Worker l_data += l_N_ppm;
4026*3ac0a46fSAndroid Build Coastguard Worker } else {
4027*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
4028*3ac0a46fSAndroid Build Coastguard Worker l_ppm_data_size += l_data_size;
4029*3ac0a46fSAndroid Build Coastguard Worker l_N_ppm_remaining = l_N_ppm - l_data_size;
4030*3ac0a46fSAndroid Build Coastguard Worker l_data_size = 0U;
4031*3ac0a46fSAndroid Build Coastguard Worker }
4032*3ac0a46fSAndroid Build Coastguard Worker } while (l_data_size > 0U);
4033*3ac0a46fSAndroid Build Coastguard Worker }
4034*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cp->ppm_markers[i].m_data);
4035*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_markers[i].m_data = NULL;
4036*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_markers[i].m_data_size = 0U;
4037*3ac0a46fSAndroid Build Coastguard Worker }
4038*3ac0a46fSAndroid Build Coastguard Worker }
4039*3ac0a46fSAndroid Build Coastguard Worker
4040*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_data = p_cp->ppm_buffer;
4041*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_data_size = p_cp->ppm_len;
4042*3ac0a46fSAndroid Build Coastguard Worker
4043*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_markers_count = 0U;
4044*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cp->ppm_markers);
4045*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_markers = NULL;
4046*3ac0a46fSAndroid Build Coastguard Worker
4047*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4048*3ac0a46fSAndroid Build Coastguard Worker }
4049*3ac0a46fSAndroid Build Coastguard Worker
4050*3ac0a46fSAndroid Build Coastguard Worker /**
4051*3ac0a46fSAndroid Build Coastguard Worker * Reads a PPT marker (Packed packet headers, tile-part header)
4052*3ac0a46fSAndroid Build Coastguard Worker *
4053*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the PPT box.
4054*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
4055*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the PPT marker.
4056*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
4057*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_ppt(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)4058*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_ppt(opj_j2k_t *p_j2k,
4059*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
4060*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
4061*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
4062*3ac0a46fSAndroid Build Coastguard Worker )
4063*3ac0a46fSAndroid Build Coastguard Worker {
4064*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
4065*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
4066*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_Z_ppt;
4067*3ac0a46fSAndroid Build Coastguard Worker
4068*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
4069*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
4070*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
4071*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
4072*3ac0a46fSAndroid Build Coastguard Worker
4073*3ac0a46fSAndroid Build Coastguard Worker /* We need to have the Z_ppt element + 1 byte of Ippt at minimum */
4074*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 2) {
4075*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
4076*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4077*3ac0a46fSAndroid Build Coastguard Worker }
4078*3ac0a46fSAndroid Build Coastguard Worker
4079*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
4080*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->ppm) {
4081*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4082*3ac0a46fSAndroid Build Coastguard Worker "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
4083*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4084*3ac0a46fSAndroid Build Coastguard Worker }
4085*3ac0a46fSAndroid Build Coastguard Worker
4086*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
4087*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt = 1;
4088*3ac0a46fSAndroid Build Coastguard Worker
4089*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_Z_ppt, 1); /* Z_ppt */
4090*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
4091*3ac0a46fSAndroid Build Coastguard Worker --p_header_size;
4092*3ac0a46fSAndroid Build Coastguard Worker
4093*3ac0a46fSAndroid Build Coastguard Worker /* check allocation needed */
4094*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->ppt_markers == NULL) { /* first PPT marker */
4095*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4096*3ac0a46fSAndroid Build Coastguard Worker assert(l_tcp->ppt_markers_count == 0U);
4097*3ac0a46fSAndroid Build Coastguard Worker
4098*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
4099*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->ppt_markers == NULL) {
4100*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4101*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4102*3ac0a46fSAndroid Build Coastguard Worker }
4103*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt_markers_count = l_newCount;
4104*3ac0a46fSAndroid Build Coastguard Worker } else if (l_tcp->ppt_markers_count <= l_Z_ppt) {
4105*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
4106*3ac0a46fSAndroid Build Coastguard Worker opj_ppx *new_ppt_markers;
4107*3ac0a46fSAndroid Build Coastguard Worker new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers,
4108*3ac0a46fSAndroid Build Coastguard Worker l_newCount * sizeof(opj_ppx));
4109*3ac0a46fSAndroid Build Coastguard Worker if (new_ppt_markers == NULL) {
4110*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_tcp destruction */
4111*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4112*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4113*3ac0a46fSAndroid Build Coastguard Worker }
4114*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt_markers = new_ppt_markers;
4115*3ac0a46fSAndroid Build Coastguard Worker memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0,
4116*3ac0a46fSAndroid Build Coastguard Worker (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx));
4117*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt_markers_count = l_newCount;
4118*3ac0a46fSAndroid Build Coastguard Worker }
4119*3ac0a46fSAndroid Build Coastguard Worker
4120*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) {
4121*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_tcp destruction */
4122*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt);
4123*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4124*3ac0a46fSAndroid Build Coastguard Worker }
4125*3ac0a46fSAndroid Build Coastguard Worker
4126*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt_markers[l_Z_ppt].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
4127*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->ppt_markers[l_Z_ppt].m_data == NULL) {
4128*3ac0a46fSAndroid Build Coastguard Worker /* clean up to be done on l_tcp destruction */
4129*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4130*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4131*3ac0a46fSAndroid Build Coastguard Worker }
4132*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size;
4133*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size);
4134*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4135*3ac0a46fSAndroid Build Coastguard Worker }
4136*3ac0a46fSAndroid Build Coastguard Worker
4137*3ac0a46fSAndroid Build Coastguard Worker /**
4138*3ac0a46fSAndroid Build Coastguard Worker * Merges all PPT markers read (Packed packet headers, tile-part header)
4139*3ac0a46fSAndroid Build Coastguard Worker *
4140*3ac0a46fSAndroid Build Coastguard Worker * @param p_tcp the tile.
4141*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
4142*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_merge_ppt(opj_tcp_t * p_tcp,opj_event_mgr_t * p_manager)4143*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp, opj_event_mgr_t * p_manager)
4144*3ac0a46fSAndroid Build Coastguard Worker {
4145*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, l_ppt_data_size;
4146*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
4147*3ac0a46fSAndroid Build Coastguard Worker assert(p_tcp != 00);
4148*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
4149*3ac0a46fSAndroid Build Coastguard Worker
4150*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->ppt_buffer != NULL) {
4151*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4152*3ac0a46fSAndroid Build Coastguard Worker "opj_j2k_merge_ppt() has already been called\n");
4153*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4154*3ac0a46fSAndroid Build Coastguard Worker }
4155*3ac0a46fSAndroid Build Coastguard Worker
4156*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->ppt == 0U) {
4157*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4158*3ac0a46fSAndroid Build Coastguard Worker }
4159*3ac0a46fSAndroid Build Coastguard Worker
4160*3ac0a46fSAndroid Build Coastguard Worker l_ppt_data_size = 0U;
4161*3ac0a46fSAndroid Build Coastguard Worker for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4162*3ac0a46fSAndroid Build Coastguard Worker l_ppt_data_size +=
4163*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4164*3ac0a46fSAndroid Build Coastguard Worker }
4165*3ac0a46fSAndroid Build Coastguard Worker
4166*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size);
4167*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->ppt_buffer == 00) {
4168*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
4169*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4170*3ac0a46fSAndroid Build Coastguard Worker }
4171*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_len = l_ppt_data_size;
4172*3ac0a46fSAndroid Build Coastguard Worker l_ppt_data_size = 0U;
4173*3ac0a46fSAndroid Build Coastguard Worker for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
4174*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->ppt_markers[i].m_data !=
4175*3ac0a46fSAndroid Build Coastguard Worker NULL) { /* standard doesn't seem to require contiguous Zppt */
4176*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data,
4177*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers[i].m_data_size);
4178*3ac0a46fSAndroid Build Coastguard Worker l_ppt_data_size +=
4179*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
4180*3ac0a46fSAndroid Build Coastguard Worker
4181*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->ppt_markers[i].m_data);
4182*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers[i].m_data = NULL;
4183*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers[i].m_data_size = 0U;
4184*3ac0a46fSAndroid Build Coastguard Worker }
4185*3ac0a46fSAndroid Build Coastguard Worker }
4186*3ac0a46fSAndroid Build Coastguard Worker
4187*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers_count = 0U;
4188*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->ppt_markers);
4189*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers = NULL;
4190*3ac0a46fSAndroid Build Coastguard Worker
4191*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_data = p_tcp->ppt_buffer;
4192*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_data_size = p_tcp->ppt_len;
4193*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4194*3ac0a46fSAndroid Build Coastguard Worker }
4195*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_tlm(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)4196*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_tlm(opj_j2k_t *p_j2k,
4197*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
4198*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
4199*3ac0a46fSAndroid Build Coastguard Worker )
4200*3ac0a46fSAndroid Build Coastguard Worker {
4201*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
4202*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tlm_size;
4203*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 size_per_tile_part;
4204*3ac0a46fSAndroid Build Coastguard Worker
4205*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
4206*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
4207*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
4208*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
4209*3ac0a46fSAndroid Build Coastguard Worker
4210*3ac0a46fSAndroid Build Coastguard Worker /* 10921 = (65535 - header_size) / size_per_tile_part where */
4211*3ac0a46fSAndroid Build Coastguard Worker /* header_size = 4 and size_per_tile_part = 6 */
4212*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_total_tile_parts > 10921) {
4213*3ac0a46fSAndroid Build Coastguard Worker /* We could do more but it would require writing several TLM markers */
4214*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4215*3ac0a46fSAndroid Build Coastguard Worker "A maximum of 10921 tile-parts are supported currently "
4216*3ac0a46fSAndroid Build Coastguard Worker "when writing TLM marker\n");
4217*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4218*3ac0a46fSAndroid Build Coastguard Worker }
4219*3ac0a46fSAndroid Build Coastguard Worker
4220*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_total_tile_parts <= 255) {
4221*3ac0a46fSAndroid Build Coastguard Worker size_per_tile_part = 5;
4222*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte = OPJ_TRUE;
4223*3ac0a46fSAndroid Build Coastguard Worker } else {
4224*3ac0a46fSAndroid Build Coastguard Worker size_per_tile_part = 6;
4225*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte = OPJ_FALSE;
4226*3ac0a46fSAndroid Build Coastguard Worker }
4227*3ac0a46fSAndroid Build Coastguard Worker
4228*3ac0a46fSAndroid Build Coastguard Worker l_tlm_size = 2 + 4 + (size_per_tile_part *
4229*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
4230*3ac0a46fSAndroid Build Coastguard Worker
4231*3ac0a46fSAndroid Build Coastguard Worker if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
4232*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
4233*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);
4234*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
4235*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
4236*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
4237*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
4238*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n");
4239*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4240*3ac0a46fSAndroid Build Coastguard Worker }
4241*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
4242*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
4243*3ac0a46fSAndroid Build Coastguard Worker }
4244*3ac0a46fSAndroid Build Coastguard Worker memset(p_j2k->m_specific_param.m_encoder.m_header_tile_data, 0, l_tlm_size);
4245*3ac0a46fSAndroid Build Coastguard Worker
4246*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
4247*3ac0a46fSAndroid Build Coastguard Worker
4248*3ac0a46fSAndroid Build Coastguard Worker /* change the way data is written to avoid seeking if possible */
4249*3ac0a46fSAndroid Build Coastguard Worker /* TODO */
4250*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
4251*3ac0a46fSAndroid Build Coastguard Worker
4252*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_TLM,
4253*3ac0a46fSAndroid Build Coastguard Worker 2); /* TLM */
4254*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
4255*3ac0a46fSAndroid Build Coastguard Worker
4256*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_tlm_size - 2,
4257*3ac0a46fSAndroid Build Coastguard Worker 2); /* Lpoc */
4258*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
4259*3ac0a46fSAndroid Build Coastguard Worker
4260*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, 0,
4261*3ac0a46fSAndroid Build Coastguard Worker 1); /* Ztlm=0*/
4262*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
4263*3ac0a46fSAndroid Build Coastguard Worker
4264*3ac0a46fSAndroid Build Coastguard Worker /* Stlm 0x50= ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
4265*3ac0a46fSAndroid Build Coastguard Worker /* Stlm 0x60= ST=2(16bits-65535 tiles max),SP=1(Ptlm=32bits) */
4266*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data,
4267*3ac0a46fSAndroid Build Coastguard Worker size_per_tile_part == 5 ? 0x50 : 0x60,
4268*3ac0a46fSAndroid Build Coastguard Worker 1);
4269*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
4270*3ac0a46fSAndroid Build Coastguard Worker
4271*3ac0a46fSAndroid Build Coastguard Worker /* do nothing on the size_per_tile_part * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
4272*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
4273*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size,
4274*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_tlm_size) {
4275*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4276*3ac0a46fSAndroid Build Coastguard Worker }
4277*3ac0a46fSAndroid Build Coastguard Worker
4278*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4279*3ac0a46fSAndroid Build Coastguard Worker }
4280*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_sot(opj_j2k_t * p_j2k,OPJ_BYTE * p_data,OPJ_UINT32 total_data_size,OPJ_UINT32 * p_data_written,const opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)4281*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_sot(opj_j2k_t *p_j2k,
4282*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
4283*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 total_data_size,
4284*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
4285*3ac0a46fSAndroid Build Coastguard Worker const opj_stream_private_t *p_stream,
4286*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
4287*3ac0a46fSAndroid Build Coastguard Worker )
4288*3ac0a46fSAndroid Build Coastguard Worker {
4289*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
4290*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
4291*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
4292*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
4293*3ac0a46fSAndroid Build Coastguard Worker
4294*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
4295*3ac0a46fSAndroid Build Coastguard Worker
4296*3ac0a46fSAndroid Build Coastguard Worker if (total_data_size < 12) {
4297*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4298*3ac0a46fSAndroid Build Coastguard Worker "Not enough bytes in output buffer to write SOT marker\n");
4299*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4300*3ac0a46fSAndroid Build Coastguard Worker }
4301*3ac0a46fSAndroid Build Coastguard Worker
4302*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, J2K_MS_SOT,
4303*3ac0a46fSAndroid Build Coastguard Worker 2); /* SOT */
4304*3ac0a46fSAndroid Build Coastguard Worker p_data += 2;
4305*3ac0a46fSAndroid Build Coastguard Worker
4306*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, 10,
4307*3ac0a46fSAndroid Build Coastguard Worker 2); /* Lsot */
4308*3ac0a46fSAndroid Build Coastguard Worker p_data += 2;
4309*3ac0a46fSAndroid Build Coastguard Worker
4310*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, p_j2k->m_current_tile_number,
4311*3ac0a46fSAndroid Build Coastguard Worker 2); /* Isot */
4312*3ac0a46fSAndroid Build Coastguard Worker p_data += 2;
4313*3ac0a46fSAndroid Build Coastguard Worker
4314*3ac0a46fSAndroid Build Coastguard Worker /* Psot */
4315*3ac0a46fSAndroid Build Coastguard Worker p_data += 4;
4316*3ac0a46fSAndroid Build Coastguard Worker
4317*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data,
4318*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,
4319*3ac0a46fSAndroid Build Coastguard Worker 1); /* TPsot */
4320*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
4321*3ac0a46fSAndroid Build Coastguard Worker
4322*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data,
4323*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,
4324*3ac0a46fSAndroid Build Coastguard Worker 1); /* TNsot */
4325*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
4326*3ac0a46fSAndroid Build Coastguard Worker
4327*3ac0a46fSAndroid Build Coastguard Worker /* UniPG>> */
4328*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
4329*3ac0a46fSAndroid Build Coastguard Worker /* update markers struct */
4330*3ac0a46fSAndroid Build Coastguard Worker /*
4331*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
4332*3ac0a46fSAndroid Build Coastguard Worker */
4333*3ac0a46fSAndroid Build Coastguard Worker assert(0 && "TODO");
4334*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
4335*3ac0a46fSAndroid Build Coastguard Worker
4336*3ac0a46fSAndroid Build Coastguard Worker * p_data_written = 12;
4337*3ac0a46fSAndroid Build Coastguard Worker
4338*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4339*3ac0a46fSAndroid Build Coastguard Worker }
4340*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_sot_values(OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,OPJ_UINT32 * p_tile_no,OPJ_UINT32 * p_tot_len,OPJ_UINT32 * p_current_part,OPJ_UINT32 * p_num_parts,opj_event_mgr_t * p_manager)4341*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE * p_header_data,
4342*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
4343*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* p_tile_no,
4344*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* p_tot_len,
4345*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* p_current_part,
4346*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* p_num_parts,
4347*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
4348*3ac0a46fSAndroid Build Coastguard Worker {
4349*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
4350*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
4351*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
4352*3ac0a46fSAndroid Build Coastguard Worker
4353*3ac0a46fSAndroid Build Coastguard Worker /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
4354*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != 8) {
4355*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4356*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4357*3ac0a46fSAndroid Build Coastguard Worker }
4358*3ac0a46fSAndroid Build Coastguard Worker
4359*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, p_tile_no, 2); /* Isot */
4360*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
4361*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, p_tot_len, 4); /* Psot */
4362*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 4;
4363*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, p_current_part, 1); /* TPsot */
4364*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
4365*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, p_num_parts, 1); /* TNsot */
4366*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
4367*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4368*3ac0a46fSAndroid Build Coastguard Worker }
4369*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_sot(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)4370*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_sot(opj_j2k_t *p_j2k,
4371*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
4372*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
4373*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
4374*3ac0a46fSAndroid Build Coastguard Worker {
4375*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
4376*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
4377*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tot_len, l_num_parts = 0;
4378*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_part;
4379*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tile_x, l_tile_y;
4380*3ac0a46fSAndroid Build Coastguard Worker
4381*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
4382*3ac0a46fSAndroid Build Coastguard Worker
4383*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
4384*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
4385*3ac0a46fSAndroid Build Coastguard Worker
4386*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_get_sot_values(p_header_data, p_header_size,
4387*3ac0a46fSAndroid Build Coastguard Worker &(p_j2k->m_current_tile_number), &l_tot_len, &l_current_part, &l_num_parts,
4388*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
4389*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
4390*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4391*3ac0a46fSAndroid Build Coastguard Worker }
4392*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
4393*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, "SOT %d %d %d %d\n",
4394*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number, l_tot_len, l_current_part, l_num_parts);
4395*3ac0a46fSAndroid Build Coastguard Worker #endif
4396*3ac0a46fSAndroid Build Coastguard Worker
4397*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
4398*3ac0a46fSAndroid Build Coastguard Worker
4399*3ac0a46fSAndroid Build Coastguard Worker /* testcase 2.pdf.SIGFPE.706.1112 */
4400*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
4401*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n",
4402*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number);
4403*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4404*3ac0a46fSAndroid Build Coastguard Worker }
4405*3ac0a46fSAndroid Build Coastguard Worker
4406*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
4407*3ac0a46fSAndroid Build Coastguard Worker l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
4408*3ac0a46fSAndroid Build Coastguard Worker l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
4409*3ac0a46fSAndroid Build Coastguard Worker
4410*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec < 0 ||
4411*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number == (OPJ_UINT32)
4412*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec) {
4413*3ac0a46fSAndroid Build Coastguard Worker /* Do only this check if we decode all tile part headers, or if */
4414*3ac0a46fSAndroid Build Coastguard Worker /* we decode one precise tile. Otherwise the m_current_tile_part_number */
4415*3ac0a46fSAndroid Build Coastguard Worker /* might not be valid */
4416*3ac0a46fSAndroid Build Coastguard Worker /* Fixes issue with id_000020,sig_06,src_001958,op_flip4,pos_149 */
4417*3ac0a46fSAndroid Build Coastguard Worker /* of https://github.com/uclouvain/openjpeg/issues/939 */
4418*3ac0a46fSAndroid Build Coastguard Worker /* We must avoid reading twice the same tile part number for a given tile */
4419*3ac0a46fSAndroid Build Coastguard Worker /* so as to avoid various issues, like opj_j2k_merge_ppt being called */
4420*3ac0a46fSAndroid Build Coastguard Worker /* several times. */
4421*3ac0a46fSAndroid Build Coastguard Worker /* ISO 15444-1 A.4.2 Start of tile-part (SOT) mandates that tile parts */
4422*3ac0a46fSAndroid Build Coastguard Worker /* should appear in increasing order. */
4423*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_current_tile_part_number + 1 != (OPJ_INT32)l_current_part) {
4424*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4425*3ac0a46fSAndroid Build Coastguard Worker "Invalid tile part index for tile number %d. "
4426*3ac0a46fSAndroid Build Coastguard Worker "Got %d, expected %d\n",
4427*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number,
4428*3ac0a46fSAndroid Build Coastguard Worker l_current_part,
4429*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_current_tile_part_number + 1);
4430*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4431*3ac0a46fSAndroid Build Coastguard Worker }
4432*3ac0a46fSAndroid Build Coastguard Worker }
4433*3ac0a46fSAndroid Build Coastguard Worker
4434*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_current_tile_part_number = (OPJ_INT32) l_current_part;
4435*3ac0a46fSAndroid Build Coastguard Worker
4436*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
4437*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->correct) {
4438*3ac0a46fSAndroid Build Coastguard Worker
4439*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tileno = p_j2k->m_current_tile_number;
4440*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 backup_tileno = 0;
4441*3ac0a46fSAndroid Build Coastguard Worker
4442*3ac0a46fSAndroid Build Coastguard Worker /* tileno is negative or larger than the number of tiles!!! */
4443*3ac0a46fSAndroid Build Coastguard Worker if (tileno > (l_cp->tw * l_cp->th)) {
4444*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4445*3ac0a46fSAndroid Build Coastguard Worker "JPWL: bad tile number (%d out of a maximum of %d)\n",
4446*3ac0a46fSAndroid Build Coastguard Worker tileno, (l_cp->tw * l_cp->th));
4447*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
4448*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4449*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4450*3ac0a46fSAndroid Build Coastguard Worker }
4451*3ac0a46fSAndroid Build Coastguard Worker /* we try to correct */
4452*3ac0a46fSAndroid Build Coastguard Worker tileno = backup_tileno;
4453*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
4454*3ac0a46fSAndroid Build Coastguard Worker "- setting tile number to %d\n",
4455*3ac0a46fSAndroid Build Coastguard Worker tileno);
4456*3ac0a46fSAndroid Build Coastguard Worker }
4457*3ac0a46fSAndroid Build Coastguard Worker
4458*3ac0a46fSAndroid Build Coastguard Worker /* keep your private count of tiles */
4459*3ac0a46fSAndroid Build Coastguard Worker backup_tileno++;
4460*3ac0a46fSAndroid Build Coastguard Worker };
4461*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
4462*3ac0a46fSAndroid Build Coastguard Worker
4463*3ac0a46fSAndroid Build Coastguard Worker /* look for the tile in the list of already processed tile (in parts). */
4464*3ac0a46fSAndroid Build Coastguard Worker /* Optimization possible here with a more complex data structure and with the removing of tiles */
4465*3ac0a46fSAndroid Build Coastguard Worker /* since the time taken by this function can only grow at the time */
4466*3ac0a46fSAndroid Build Coastguard Worker
4467*3ac0a46fSAndroid Build Coastguard Worker /* PSot should be equal to zero or >=14 or <= 2^32-1 */
4468*3ac0a46fSAndroid Build Coastguard Worker if ((l_tot_len != 0) && (l_tot_len < 14)) {
4469*3ac0a46fSAndroid Build Coastguard Worker if (l_tot_len ==
4470*3ac0a46fSAndroid Build Coastguard Worker 12) { /* MSD: Special case for the PHR data which are read by kakadu*/
4471*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n",
4472*3ac0a46fSAndroid Build Coastguard Worker l_tot_len);
4473*3ac0a46fSAndroid Build Coastguard Worker } else {
4474*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4475*3ac0a46fSAndroid Build Coastguard Worker "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
4476*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4477*3ac0a46fSAndroid Build Coastguard Worker }
4478*3ac0a46fSAndroid Build Coastguard Worker }
4479*3ac0a46fSAndroid Build Coastguard Worker
4480*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
4481*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->correct) {
4482*3ac0a46fSAndroid Build Coastguard Worker
4483*3ac0a46fSAndroid Build Coastguard Worker /* totlen is negative or larger than the bytes left!!! */
4484*3ac0a46fSAndroid Build Coastguard Worker if (/*(l_tot_len < 0) ||*/ (l_tot_len >
4485*3ac0a46fSAndroid Build Coastguard Worker p_header_size)) { /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */
4486*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4487*3ac0a46fSAndroid Build Coastguard Worker "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
4488*3ac0a46fSAndroid Build Coastguard Worker l_tot_len,
4489*3ac0a46fSAndroid Build Coastguard Worker p_header_size); /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */
4490*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
4491*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
4492*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4493*3ac0a46fSAndroid Build Coastguard Worker }
4494*3ac0a46fSAndroid Build Coastguard Worker /* we try to correct */
4495*3ac0a46fSAndroid Build Coastguard Worker l_tot_len = 0;
4496*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
4497*3ac0a46fSAndroid Build Coastguard Worker "- setting Psot to %d => assuming it is the last tile\n",
4498*3ac0a46fSAndroid Build Coastguard Worker l_tot_len);
4499*3ac0a46fSAndroid Build Coastguard Worker }
4500*3ac0a46fSAndroid Build Coastguard Worker };
4501*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
4502*3ac0a46fSAndroid Build Coastguard Worker
4503*3ac0a46fSAndroid Build Coastguard Worker /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/
4504*3ac0a46fSAndroid Build Coastguard Worker if (!l_tot_len) {
4505*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO,
4506*3ac0a46fSAndroid Build Coastguard Worker "Psot value of the current tile-part is equal to zero, "
4507*3ac0a46fSAndroid Build Coastguard Worker "we assuming it is the last tile-part of the codestream.\n");
4508*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4509*3ac0a46fSAndroid Build Coastguard Worker }
4510*3ac0a46fSAndroid Build Coastguard Worker
4511*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_nb_tile_parts != 0 && l_current_part >= l_tcp->m_nb_tile_parts) {
4512*3ac0a46fSAndroid Build Coastguard Worker /* Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2851 */
4513*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4514*3ac0a46fSAndroid Build Coastguard Worker "In SOT marker, TPSot (%d) is not valid regards to the previous "
4515*3ac0a46fSAndroid Build Coastguard Worker "number of tile-part (%d), giving up\n", l_current_part,
4516*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_tile_parts);
4517*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4518*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4519*3ac0a46fSAndroid Build Coastguard Worker }
4520*3ac0a46fSAndroid Build Coastguard Worker
4521*3ac0a46fSAndroid Build Coastguard Worker if (l_num_parts !=
4522*3ac0a46fSAndroid Build Coastguard Worker 0) { /* Number of tile-part header is provided by this tile-part header */
4523*3ac0a46fSAndroid Build Coastguard Worker l_num_parts += p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction;
4524*3ac0a46fSAndroid Build Coastguard Worker /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of
4525*3ac0a46fSAndroid Build Coastguard Worker * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */
4526*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_nb_tile_parts) {
4527*3ac0a46fSAndroid Build Coastguard Worker if (l_current_part >= l_tcp->m_nb_tile_parts) {
4528*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4529*3ac0a46fSAndroid Build Coastguard Worker "In SOT marker, TPSot (%d) is not valid regards to the current "
4530*3ac0a46fSAndroid Build Coastguard Worker "number of tile-part (%d), giving up\n", l_current_part,
4531*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_tile_parts);
4532*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4533*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4534*3ac0a46fSAndroid Build Coastguard Worker }
4535*3ac0a46fSAndroid Build Coastguard Worker }
4536*3ac0a46fSAndroid Build Coastguard Worker if (l_current_part >= l_num_parts) {
4537*3ac0a46fSAndroid Build Coastguard Worker /* testcase 451.pdf.SIGSEGV.ce9.3723 */
4538*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4539*3ac0a46fSAndroid Build Coastguard Worker "In SOT marker, TPSot (%d) is not valid regards to the current "
4540*3ac0a46fSAndroid Build Coastguard Worker "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts);
4541*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
4542*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4543*3ac0a46fSAndroid Build Coastguard Worker }
4544*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_tile_parts = l_num_parts;
4545*3ac0a46fSAndroid Build Coastguard Worker }
4546*3ac0a46fSAndroid Build Coastguard Worker
4547*3ac0a46fSAndroid Build Coastguard Worker /* If know the number of tile part header we will check if we didn't read the last*/
4548*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_nb_tile_parts) {
4549*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_nb_tile_parts == (l_current_part + 1)) {
4550*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_can_decode =
4551*3ac0a46fSAndroid Build Coastguard Worker 1; /* Process the last tile-part header*/
4552*3ac0a46fSAndroid Build Coastguard Worker }
4553*3ac0a46fSAndroid Build Coastguard Worker }
4554*3ac0a46fSAndroid Build Coastguard Worker
4555*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4556*3ac0a46fSAndroid Build Coastguard Worker /* Keep the size of data to skip after this marker */
4557*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len -
4558*3ac0a46fSAndroid Build Coastguard Worker 12; /* SOT_marker_size = 12 */
4559*3ac0a46fSAndroid Build Coastguard Worker } else {
4560*3ac0a46fSAndroid Build Coastguard Worker /* FIXME: need to be computed from the number of bytes remaining in the codestream */
4561*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
4562*3ac0a46fSAndroid Build Coastguard Worker }
4563*3ac0a46fSAndroid Build Coastguard Worker
4564*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;
4565*3ac0a46fSAndroid Build Coastguard Worker
4566*3ac0a46fSAndroid Build Coastguard Worker /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/
4567*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
4568*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_skip_data =
4569*3ac0a46fSAndroid Build Coastguard Worker (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
4570*3ac0a46fSAndroid Build Coastguard Worker || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
4571*3ac0a46fSAndroid Build Coastguard Worker || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
4572*3ac0a46fSAndroid Build Coastguard Worker || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
4573*3ac0a46fSAndroid Build Coastguard Worker } else {
4574*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0);
4575*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_skip_data =
4576*3ac0a46fSAndroid Build Coastguard Worker (p_j2k->m_current_tile_number != (OPJ_UINT32)
4577*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);
4578*3ac0a46fSAndroid Build Coastguard Worker }
4579*3ac0a46fSAndroid Build Coastguard Worker
4580*3ac0a46fSAndroid Build Coastguard Worker /* Index */
4581*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_index) {
4582*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k->cstr_index->tile_index != 00);
4583*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno =
4584*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number;
4585*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno =
4586*3ac0a46fSAndroid Build Coastguard Worker l_current_part;
4587*3ac0a46fSAndroid Build Coastguard Worker
4588*3ac0a46fSAndroid Build Coastguard Worker if (l_num_parts != 0) {
4589*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps =
4590*3ac0a46fSAndroid Build Coastguard Worker l_num_parts;
4591*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
4592*3ac0a46fSAndroid Build Coastguard Worker l_num_parts;
4593*3ac0a46fSAndroid Build Coastguard Worker
4594*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4595*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4596*3ac0a46fSAndroid Build Coastguard Worker (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
4597*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4598*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4599*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to read SOT marker. Tile index allocation failed\n");
4600*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4601*3ac0a46fSAndroid Build Coastguard Worker }
4602*3ac0a46fSAndroid Build Coastguard Worker } else {
4603*3ac0a46fSAndroid Build Coastguard Worker opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
4604*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4605*3ac0a46fSAndroid Build Coastguard Worker l_num_parts * sizeof(opj_tp_index_t));
4606*3ac0a46fSAndroid Build Coastguard Worker if (! new_tp_index) {
4607*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
4608*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
4609*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4610*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to read SOT marker. Tile index allocation failed\n");
4611*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4612*3ac0a46fSAndroid Build Coastguard Worker }
4613*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4614*3ac0a46fSAndroid Build Coastguard Worker new_tp_index;
4615*3ac0a46fSAndroid Build Coastguard Worker }
4616*3ac0a46fSAndroid Build Coastguard Worker } else {
4617*3ac0a46fSAndroid Build Coastguard Worker /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
4618*3ac0a46fSAndroid Build Coastguard Worker
4619*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4620*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
4621*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4622*3ac0a46fSAndroid Build Coastguard Worker (opj_tp_index_t*)opj_calloc(
4623*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
4624*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_tp_index_t));
4625*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
4626*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
4627*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4628*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to read SOT marker. Tile index allocation failed\n");
4629*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4630*3ac0a46fSAndroid Build Coastguard Worker }
4631*3ac0a46fSAndroid Build Coastguard Worker }
4632*3ac0a46fSAndroid Build Coastguard Worker
4633*3ac0a46fSAndroid Build Coastguard Worker if (l_current_part >=
4634*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps) {
4635*3ac0a46fSAndroid Build Coastguard Worker opj_tp_index_t *new_tp_index;
4636*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
4637*3ac0a46fSAndroid Build Coastguard Worker l_current_part + 1;
4638*3ac0a46fSAndroid Build Coastguard Worker new_tp_index = (opj_tp_index_t *) opj_realloc(
4639*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
4640*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps *
4641*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_tp_index_t));
4642*3ac0a46fSAndroid Build Coastguard Worker if (! new_tp_index) {
4643*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
4644*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
4645*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
4646*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4647*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to read SOT marker. Tile index allocation failed\n");
4648*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4649*3ac0a46fSAndroid Build Coastguard Worker }
4650*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
4651*3ac0a46fSAndroid Build Coastguard Worker new_tp_index;
4652*3ac0a46fSAndroid Build Coastguard Worker }
4653*3ac0a46fSAndroid Build Coastguard Worker }
4654*3ac0a46fSAndroid Build Coastguard Worker
4655*3ac0a46fSAndroid Build Coastguard Worker }
4656*3ac0a46fSAndroid Build Coastguard Worker
4657*3ac0a46fSAndroid Build Coastguard Worker }
4658*3ac0a46fSAndroid Build Coastguard Worker
4659*3ac0a46fSAndroid Build Coastguard Worker /* 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 */
4660*3ac0a46fSAndroid Build Coastguard Worker /* if (p_j2k->cstr_info) {
4661*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->first) {
4662*3ac0a46fSAndroid Build Coastguard Worker if (tileno == 0) {
4663*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;
4664*3ac0a46fSAndroid Build Coastguard Worker }
4665*3ac0a46fSAndroid Build Coastguard Worker
4666*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].tileno = tileno;
4667*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;
4668*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
4669*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].num_tps = numparts;
4670*3ac0a46fSAndroid Build Coastguard Worker
4671*3ac0a46fSAndroid Build Coastguard Worker if (numparts) {
4672*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
4673*3ac0a46fSAndroid Build Coastguard Worker }
4674*3ac0a46fSAndroid Build Coastguard Worker else {
4675*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
4676*3ac0a46fSAndroid Build Coastguard Worker }
4677*3ac0a46fSAndroid Build Coastguard Worker }
4678*3ac0a46fSAndroid Build Coastguard Worker else {
4679*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].end_pos += totlen;
4680*3ac0a46fSAndroid Build Coastguard Worker }
4681*3ac0a46fSAndroid Build Coastguard Worker
4682*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;
4683*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
4684*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
4685*3ac0a46fSAndroid Build Coastguard Worker }*/
4686*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4687*3ac0a46fSAndroid Build Coastguard Worker }
4688*3ac0a46fSAndroid Build Coastguard Worker
4689*3ac0a46fSAndroid Build Coastguard Worker /**
4690*3ac0a46fSAndroid Build Coastguard Worker * Write one or more PLT markers in the provided buffer
4691*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_write_plt_in_memory(opj_j2k_t * p_j2k,opj_tcd_marker_info_t * marker_info,OPJ_BYTE * p_data,OPJ_UINT32 * p_data_written,opj_event_mgr_t * p_manager)4692*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_plt_in_memory(opj_j2k_t *p_j2k,
4693*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_marker_info_t* marker_info,
4694*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
4695*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
4696*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
4697*3ac0a46fSAndroid Build Coastguard Worker {
4698*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE Zplt = 0;
4699*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT16 Lplt;
4700*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE* p_data_start = p_data;
4701*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE* p_data_Lplt = p_data + 2;
4702*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
4703*3ac0a46fSAndroid Build Coastguard Worker
4704*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_j2k);
4705*3ac0a46fSAndroid Build Coastguard Worker
4706*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, J2K_MS_PLT, 2);
4707*3ac0a46fSAndroid Build Coastguard Worker p_data += 2;
4708*3ac0a46fSAndroid Build Coastguard Worker
4709*3ac0a46fSAndroid Build Coastguard Worker /* Reserve space for Lplt */
4710*3ac0a46fSAndroid Build Coastguard Worker p_data += 2;
4711*3ac0a46fSAndroid Build Coastguard Worker
4712*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, Zplt, 1);
4713*3ac0a46fSAndroid Build Coastguard Worker p_data += 1;
4714*3ac0a46fSAndroid Build Coastguard Worker
4715*3ac0a46fSAndroid Build Coastguard Worker Lplt = 3;
4716*3ac0a46fSAndroid Build Coastguard Worker
4717*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < marker_info->packet_count; i++) {
4718*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE var_bytes[5];
4719*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT8 var_bytes_size = 0;
4720*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 packet_size = marker_info->p_packet_size[i];
4721*3ac0a46fSAndroid Build Coastguard Worker
4722*3ac0a46fSAndroid Build Coastguard Worker /* Packet size written in variable-length way, starting with LSB */
4723*3ac0a46fSAndroid Build Coastguard Worker var_bytes[var_bytes_size] = (OPJ_BYTE)(packet_size & 0x7f);
4724*3ac0a46fSAndroid Build Coastguard Worker var_bytes_size ++;
4725*3ac0a46fSAndroid Build Coastguard Worker packet_size >>= 7;
4726*3ac0a46fSAndroid Build Coastguard Worker while (packet_size > 0) {
4727*3ac0a46fSAndroid Build Coastguard Worker var_bytes[var_bytes_size] = (OPJ_BYTE)((packet_size & 0x7f) | 0x80);
4728*3ac0a46fSAndroid Build Coastguard Worker var_bytes_size ++;
4729*3ac0a46fSAndroid Build Coastguard Worker packet_size >>= 7;
4730*3ac0a46fSAndroid Build Coastguard Worker }
4731*3ac0a46fSAndroid Build Coastguard Worker
4732*3ac0a46fSAndroid Build Coastguard Worker /* Check if that can fit in the current PLT marker. If not, finish */
4733*3ac0a46fSAndroid Build Coastguard Worker /* current one, and start a new one */
4734*3ac0a46fSAndroid Build Coastguard Worker if (Lplt + var_bytes_size > 65535) {
4735*3ac0a46fSAndroid Build Coastguard Worker if (Zplt == 255) {
4736*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4737*3ac0a46fSAndroid Build Coastguard Worker "More than 255 PLT markers would be needed for current tile-part !\n");
4738*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4739*3ac0a46fSAndroid Build Coastguard Worker }
4740*3ac0a46fSAndroid Build Coastguard Worker
4741*3ac0a46fSAndroid Build Coastguard Worker /* Patch Lplt */
4742*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data_Lplt, Lplt, 2);
4743*3ac0a46fSAndroid Build Coastguard Worker
4744*3ac0a46fSAndroid Build Coastguard Worker /* Start new segment */
4745*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, J2K_MS_PLT, 2);
4746*3ac0a46fSAndroid Build Coastguard Worker p_data += 2;
4747*3ac0a46fSAndroid Build Coastguard Worker
4748*3ac0a46fSAndroid Build Coastguard Worker /* Reserve space for Lplt */
4749*3ac0a46fSAndroid Build Coastguard Worker p_data_Lplt = p_data;
4750*3ac0a46fSAndroid Build Coastguard Worker p_data += 2;
4751*3ac0a46fSAndroid Build Coastguard Worker
4752*3ac0a46fSAndroid Build Coastguard Worker Zplt ++;
4753*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, Zplt, 1);
4754*3ac0a46fSAndroid Build Coastguard Worker p_data += 1;
4755*3ac0a46fSAndroid Build Coastguard Worker
4756*3ac0a46fSAndroid Build Coastguard Worker Lplt = 3;
4757*3ac0a46fSAndroid Build Coastguard Worker }
4758*3ac0a46fSAndroid Build Coastguard Worker
4759*3ac0a46fSAndroid Build Coastguard Worker Lplt = (OPJ_UINT16)(Lplt + var_bytes_size);
4760*3ac0a46fSAndroid Build Coastguard Worker
4761*3ac0a46fSAndroid Build Coastguard Worker /* Serialize variable-length packet size, starting with MSB */
4762*3ac0a46fSAndroid Build Coastguard Worker for (; var_bytes_size > 0; --var_bytes_size) {
4763*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, var_bytes[var_bytes_size - 1], 1);
4764*3ac0a46fSAndroid Build Coastguard Worker p_data += 1;
4765*3ac0a46fSAndroid Build Coastguard Worker }
4766*3ac0a46fSAndroid Build Coastguard Worker }
4767*3ac0a46fSAndroid Build Coastguard Worker
4768*3ac0a46fSAndroid Build Coastguard Worker *p_data_written = (OPJ_UINT32)(p_data - p_data_start);
4769*3ac0a46fSAndroid Build Coastguard Worker
4770*3ac0a46fSAndroid Build Coastguard Worker /* Patch Lplt */
4771*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data_Lplt, Lplt, 2);
4772*3ac0a46fSAndroid Build Coastguard Worker
4773*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4774*3ac0a46fSAndroid Build Coastguard Worker }
4775*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_sod(opj_j2k_t * p_j2k,opj_tcd_t * p_tile_coder,OPJ_BYTE * p_data,OPJ_UINT32 * p_data_written,OPJ_UINT32 total_data_size,const opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)4776*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_sod(opj_j2k_t *p_j2k,
4777*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_t * p_tile_coder,
4778*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
4779*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
4780*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 total_data_size,
4781*3ac0a46fSAndroid Build Coastguard Worker const opj_stream_private_t *p_stream,
4782*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
4783*3ac0a46fSAndroid Build Coastguard Worker )
4784*3ac0a46fSAndroid Build Coastguard Worker {
4785*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_info_t *l_cstr_info = 00;
4786*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_remaining_data;
4787*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_marker_info_t* marker_info = NULL;
4788*3ac0a46fSAndroid Build Coastguard Worker
4789*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
4790*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
4791*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
4792*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
4793*3ac0a46fSAndroid Build Coastguard Worker
4794*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
4795*3ac0a46fSAndroid Build Coastguard Worker
4796*3ac0a46fSAndroid Build Coastguard Worker if (total_data_size < 4) {
4797*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4798*3ac0a46fSAndroid Build Coastguard Worker "Not enough bytes in output buffer to write SOD marker\n");
4799*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4800*3ac0a46fSAndroid Build Coastguard Worker }
4801*3ac0a46fSAndroid Build Coastguard Worker
4802*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, J2K_MS_SOD,
4803*3ac0a46fSAndroid Build Coastguard Worker 2); /* SOD */
4804*3ac0a46fSAndroid Build Coastguard Worker
4805*3ac0a46fSAndroid Build Coastguard Worker /* make room for the EOF marker */
4806*3ac0a46fSAndroid Build Coastguard Worker l_remaining_data = total_data_size - 4;
4807*3ac0a46fSAndroid Build Coastguard Worker
4808*3ac0a46fSAndroid Build Coastguard Worker /* update tile coder */
4809*3ac0a46fSAndroid Build Coastguard Worker p_tile_coder->tp_num =
4810*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
4811*3ac0a46fSAndroid Build Coastguard Worker p_tile_coder->cur_tp_num =
4812*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
4813*3ac0a46fSAndroid Build Coastguard Worker
4814*3ac0a46fSAndroid Build Coastguard Worker /* INDEX >> */
4815*3ac0a46fSAndroid Build Coastguard Worker /* TODO mergeV2: check this part which use cstr_info */
4816*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_info = p_j2k->cstr_info;
4817*3ac0a46fSAndroid Build Coastguard Worker if (l_cstr_info) {
4818*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {
4819*3ac0a46fSAndroid Build Coastguard Worker //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
4820*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
4821*3ac0a46fSAndroid Build Coastguard Worker }
4822*3ac0a46fSAndroid Build Coastguard Worker else {*/
4823*3ac0a46fSAndroid Build Coastguard Worker /*
4824*3ac0a46fSAndroid Build Coastguard Worker TODO
4825*3ac0a46fSAndroid Build Coastguard Worker if
4826*3ac0a46fSAndroid Build Coastguard Worker (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
4827*3ac0a46fSAndroid Build Coastguard Worker {
4828*3ac0a46fSAndroid Build Coastguard Worker cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
4829*3ac0a46fSAndroid Build Coastguard Worker }*/
4830*3ac0a46fSAndroid Build Coastguard Worker /*}*/
4831*3ac0a46fSAndroid Build Coastguard Worker /* UniPG>> */
4832*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
4833*3ac0a46fSAndroid Build Coastguard Worker /* update markers struct */
4834*3ac0a46fSAndroid Build Coastguard Worker /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
4835*3ac0a46fSAndroid Build Coastguard Worker */
4836*3ac0a46fSAndroid Build Coastguard Worker assert(0 && "TODO");
4837*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
4838*3ac0a46fSAndroid Build Coastguard Worker /* <<UniPG */
4839*3ac0a46fSAndroid Build Coastguard Worker /*}*/
4840*3ac0a46fSAndroid Build Coastguard Worker /* << INDEX */
4841*3ac0a46fSAndroid Build Coastguard Worker
4842*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
4843*3ac0a46fSAndroid Build Coastguard Worker p_tile_coder->tcd_image->tiles->packno = 0;
4844*3ac0a46fSAndroid Build Coastguard Worker #ifdef deadcode
4845*3ac0a46fSAndroid Build Coastguard Worker if (l_cstr_info) {
4846*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->packno = 0;
4847*3ac0a46fSAndroid Build Coastguard Worker }
4848*3ac0a46fSAndroid Build Coastguard Worker #endif
4849*3ac0a46fSAndroid Build Coastguard Worker }
4850*3ac0a46fSAndroid Build Coastguard Worker
4851*3ac0a46fSAndroid Build Coastguard Worker *p_data_written = 0;
4852*3ac0a46fSAndroid Build Coastguard Worker
4853*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_PLT) {
4854*3ac0a46fSAndroid Build Coastguard Worker marker_info = opj_tcd_marker_info_create(
4855*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_PLT);
4856*3ac0a46fSAndroid Build Coastguard Worker if (marker_info == NULL) {
4857*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4858*3ac0a46fSAndroid Build Coastguard Worker "Cannot encode tile: opj_tcd_marker_info_create() failed\n");
4859*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4860*3ac0a46fSAndroid Build Coastguard Worker }
4861*3ac0a46fSAndroid Build Coastguard Worker }
4862*3ac0a46fSAndroid Build Coastguard Worker
4863*3ac0a46fSAndroid Build Coastguard Worker if (l_remaining_data <
4864*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT) {
4865*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4866*3ac0a46fSAndroid Build Coastguard Worker "Not enough bytes in output buffer to write SOD marker\n");
4867*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_marker_info_destroy(marker_info);
4868*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4869*3ac0a46fSAndroid Build Coastguard Worker }
4870*3ac0a46fSAndroid Build Coastguard Worker l_remaining_data -= p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT;
4871*3ac0a46fSAndroid Build Coastguard Worker
4872*3ac0a46fSAndroid Build Coastguard Worker if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number,
4873*3ac0a46fSAndroid Build Coastguard Worker p_data + 2,
4874*3ac0a46fSAndroid Build Coastguard Worker p_data_written, l_remaining_data, l_cstr_info,
4875*3ac0a46fSAndroid Build Coastguard Worker marker_info,
4876*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
4877*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
4878*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_marker_info_destroy(marker_info);
4879*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4880*3ac0a46fSAndroid Build Coastguard Worker }
4881*3ac0a46fSAndroid Build Coastguard Worker
4882*3ac0a46fSAndroid Build Coastguard Worker /* For SOD */
4883*3ac0a46fSAndroid Build Coastguard Worker *p_data_written += 2;
4884*3ac0a46fSAndroid Build Coastguard Worker
4885*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_PLT) {
4886*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_data_written_PLT = 0;
4887*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE* p_PLT_buffer = (OPJ_BYTE*)opj_malloc(
4888*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT);
4889*3ac0a46fSAndroid Build Coastguard Worker if (!p_PLT_buffer) {
4890*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Cannot allocate memory\n");
4891*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_marker_info_destroy(marker_info);
4892*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4893*3ac0a46fSAndroid Build Coastguard Worker }
4894*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_write_plt_in_memory(p_j2k,
4895*3ac0a46fSAndroid Build Coastguard Worker marker_info,
4896*3ac0a46fSAndroid Build Coastguard Worker p_PLT_buffer,
4897*3ac0a46fSAndroid Build Coastguard Worker &l_data_written_PLT,
4898*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
4899*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_marker_info_destroy(marker_info);
4900*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_PLT_buffer);
4901*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4902*3ac0a46fSAndroid Build Coastguard Worker }
4903*3ac0a46fSAndroid Build Coastguard Worker
4904*3ac0a46fSAndroid Build Coastguard Worker assert(l_data_written_PLT <=
4905*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_reserved_bytes_for_PLT);
4906*3ac0a46fSAndroid Build Coastguard Worker
4907*3ac0a46fSAndroid Build Coastguard Worker /* Move PLT marker(s) before SOD */
4908*3ac0a46fSAndroid Build Coastguard Worker memmove(p_data + l_data_written_PLT, p_data, *p_data_written);
4909*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_data, p_PLT_buffer, l_data_written_PLT);
4910*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_PLT_buffer);
4911*3ac0a46fSAndroid Build Coastguard Worker *p_data_written += l_data_written_PLT;
4912*3ac0a46fSAndroid Build Coastguard Worker }
4913*3ac0a46fSAndroid Build Coastguard Worker
4914*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_marker_info_destroy(marker_info);
4915*3ac0a46fSAndroid Build Coastguard Worker
4916*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
4917*3ac0a46fSAndroid Build Coastguard Worker }
4918*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_sod(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)4919*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_sod(opj_j2k_t *p_j2k,
4920*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
4921*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
4922*3ac0a46fSAndroid Build Coastguard Worker )
4923*3ac0a46fSAndroid Build Coastguard Worker {
4924*3ac0a46fSAndroid Build Coastguard Worker OPJ_SIZE_T l_current_read_size;
4925*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_index_t * l_cstr_index = 00;
4926*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE ** l_current_data = 00;
4927*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = 00;
4928*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * l_tile_len = 00;
4929*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
4930*3ac0a46fSAndroid Build Coastguard Worker
4931*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
4932*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
4933*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
4934*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
4935*3ac0a46fSAndroid Build Coastguard Worker
4936*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4937*3ac0a46fSAndroid Build Coastguard Worker
4938*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
4939*3ac0a46fSAndroid Build Coastguard Worker /* opj_stream_get_number_byte_left returns OPJ_OFF_T
4940*3ac0a46fSAndroid Build Coastguard Worker // but we are in the last tile part,
4941*3ac0a46fSAndroid Build Coastguard Worker // so its result will fit on OPJ_UINT32 unless we find
4942*3ac0a46fSAndroid Build Coastguard Worker // a file with a single tile part of more than 4 GB...*/
4943*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(
4944*3ac0a46fSAndroid Build Coastguard Worker opj_stream_get_number_byte_left(p_stream) - 2);
4945*3ac0a46fSAndroid Build Coastguard Worker } else {
4946*3ac0a46fSAndroid Build Coastguard Worker /* Check to avoid pass the limit of OPJ_UINT32 */
4947*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2) {
4948*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
4949*3ac0a46fSAndroid Build Coastguard Worker } else {
4950*3ac0a46fSAndroid Build Coastguard Worker /* MSD: case commented to support empty SOT marker (PHR data) */
4951*3ac0a46fSAndroid Build Coastguard Worker }
4952*3ac0a46fSAndroid Build Coastguard Worker }
4953*3ac0a46fSAndroid Build Coastguard Worker
4954*3ac0a46fSAndroid Build Coastguard Worker l_current_data = &(l_tcp->m_data);
4955*3ac0a46fSAndroid Build Coastguard Worker l_tile_len = &l_tcp->m_data_size;
4956*3ac0a46fSAndroid Build Coastguard Worker
4957*3ac0a46fSAndroid Build Coastguard Worker /* Patch to support new PHR data */
4958*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_sot_length) {
4959*3ac0a46fSAndroid Build Coastguard Worker /* If we are here, we'll try to read the data after allocation */
4960*3ac0a46fSAndroid Build Coastguard Worker /* Check enough bytes left in stream before allocation */
4961*3ac0a46fSAndroid Build Coastguard Worker if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length >
4962*3ac0a46fSAndroid Build Coastguard Worker opj_stream_get_number_byte_left(p_stream)) {
4963*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.strict) {
4964*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4965*3ac0a46fSAndroid Build Coastguard Worker "Tile part length size inconsistent with stream length\n");
4966*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4967*3ac0a46fSAndroid Build Coastguard Worker } else {
4968*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
4969*3ac0a46fSAndroid Build Coastguard Worker "Tile part length size inconsistent with stream length\n");
4970*3ac0a46fSAndroid Build Coastguard Worker }
4971*3ac0a46fSAndroid Build Coastguard Worker }
4972*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_sot_length >
4973*3ac0a46fSAndroid Build Coastguard Worker UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA) {
4974*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4975*3ac0a46fSAndroid Build Coastguard Worker "p_j2k->m_specific_param.m_decoder.m_sot_length > "
4976*3ac0a46fSAndroid Build Coastguard Worker "UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA");
4977*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4978*3ac0a46fSAndroid Build Coastguard Worker }
4979*3ac0a46fSAndroid Build Coastguard Worker /* Add a margin of OPJ_COMMON_CBLK_DATA_EXTRA to the allocation we */
4980*3ac0a46fSAndroid Build Coastguard Worker /* do so that opj_mqc_init_dec_common() can safely add a synthetic */
4981*3ac0a46fSAndroid Build Coastguard Worker /* 0xFFFF marker. */
4982*3ac0a46fSAndroid Build Coastguard Worker if (! *l_current_data) {
4983*3ac0a46fSAndroid Build Coastguard Worker /* LH: oddly enough, in this path, l_tile_len!=0.
4984*3ac0a46fSAndroid Build Coastguard Worker * TODO: If this was consistent, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).
4985*3ac0a46fSAndroid Build Coastguard Worker */
4986*3ac0a46fSAndroid Build Coastguard Worker *l_current_data = (OPJ_BYTE*) opj_malloc(
4987*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length + OPJ_COMMON_CBLK_DATA_EXTRA);
4988*3ac0a46fSAndroid Build Coastguard Worker } else {
4989*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *l_new_current_data;
4990*3ac0a46fSAndroid Build Coastguard Worker if (*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA -
4991*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length) {
4992*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
4993*3ac0a46fSAndroid Build Coastguard Worker "*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA - "
4994*3ac0a46fSAndroid Build Coastguard Worker "p_j2k->m_specific_param.m_decoder.m_sot_length");
4995*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
4996*3ac0a46fSAndroid Build Coastguard Worker }
4997*3ac0a46fSAndroid Build Coastguard Worker
4998*3ac0a46fSAndroid Build Coastguard Worker l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data,
4999*3ac0a46fSAndroid Build Coastguard Worker *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length +
5000*3ac0a46fSAndroid Build Coastguard Worker OPJ_COMMON_CBLK_DATA_EXTRA);
5001*3ac0a46fSAndroid Build Coastguard Worker if (! l_new_current_data) {
5002*3ac0a46fSAndroid Build Coastguard Worker opj_free(*l_current_data);
5003*3ac0a46fSAndroid Build Coastguard Worker /*nothing more is done as l_current_data will be set to null, and just
5004*3ac0a46fSAndroid Build Coastguard Worker afterward we enter in the error path
5005*3ac0a46fSAndroid Build Coastguard Worker and the actual tile_len is updated (committed) at the end of the
5006*3ac0a46fSAndroid Build Coastguard Worker function. */
5007*3ac0a46fSAndroid Build Coastguard Worker }
5008*3ac0a46fSAndroid Build Coastguard Worker *l_current_data = l_new_current_data;
5009*3ac0a46fSAndroid Build Coastguard Worker }
5010*3ac0a46fSAndroid Build Coastguard Worker
5011*3ac0a46fSAndroid Build Coastguard Worker if (*l_current_data == 00) {
5012*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n");
5013*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5014*3ac0a46fSAndroid Build Coastguard Worker }
5015*3ac0a46fSAndroid Build Coastguard Worker } else {
5016*3ac0a46fSAndroid Build Coastguard Worker l_sot_length_pb_detected = OPJ_TRUE;
5017*3ac0a46fSAndroid Build Coastguard Worker }
5018*3ac0a46fSAndroid Build Coastguard Worker
5019*3ac0a46fSAndroid Build Coastguard Worker /* Index */
5020*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index = p_j2k->cstr_index;
5021*3ac0a46fSAndroid Build Coastguard Worker if (l_cstr_index) {
5022*3ac0a46fSAndroid Build Coastguard Worker OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
5023*3ac0a46fSAndroid Build Coastguard Worker
5024*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_tile_part =
5025*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
5026*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header
5027*3ac0a46fSAndroid Build Coastguard Worker =
5028*3ac0a46fSAndroid Build Coastguard Worker l_current_pos;
5029*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos
5030*3ac0a46fSAndroid Build Coastguard Worker =
5031*3ac0a46fSAndroid Build Coastguard Worker l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
5032*3ac0a46fSAndroid Build Coastguard Worker
5033*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
5034*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index,
5035*3ac0a46fSAndroid Build Coastguard Worker J2K_MS_SOD,
5036*3ac0a46fSAndroid Build Coastguard Worker l_current_pos,
5037*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {
5038*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
5039*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5040*3ac0a46fSAndroid Build Coastguard Worker }
5041*3ac0a46fSAndroid Build Coastguard Worker
5042*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_index->packno = 0;*/
5043*3ac0a46fSAndroid Build Coastguard Worker }
5044*3ac0a46fSAndroid Build Coastguard Worker
5045*3ac0a46fSAndroid Build Coastguard Worker /* Patch to support new PHR data */
5046*3ac0a46fSAndroid Build Coastguard Worker if (!l_sot_length_pb_detected) {
5047*3ac0a46fSAndroid Build Coastguard Worker l_current_read_size = opj_stream_read_data(
5048*3ac0a46fSAndroid Build Coastguard Worker p_stream,
5049*3ac0a46fSAndroid Build Coastguard Worker *l_current_data + *l_tile_len,
5050*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length,
5051*3ac0a46fSAndroid Build Coastguard Worker p_manager);
5052*3ac0a46fSAndroid Build Coastguard Worker } else {
5053*3ac0a46fSAndroid Build Coastguard Worker l_current_read_size = 0;
5054*3ac0a46fSAndroid Build Coastguard Worker }
5055*3ac0a46fSAndroid Build Coastguard Worker
5056*3ac0a46fSAndroid Build Coastguard Worker if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {
5057*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
5058*3ac0a46fSAndroid Build Coastguard Worker } else {
5059*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
5060*3ac0a46fSAndroid Build Coastguard Worker }
5061*3ac0a46fSAndroid Build Coastguard Worker
5062*3ac0a46fSAndroid Build Coastguard Worker *l_tile_len += (OPJ_UINT32)l_current_read_size;
5063*3ac0a46fSAndroid Build Coastguard Worker
5064*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5065*3ac0a46fSAndroid Build Coastguard Worker }
5066*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_rgn(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_no,OPJ_UINT32 p_comp_no,OPJ_UINT32 nb_comps,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)5067*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
5068*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
5069*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
5070*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 nb_comps,
5071*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
5072*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
5073*3ac0a46fSAndroid Build Coastguard Worker )
5074*3ac0a46fSAndroid Build Coastguard Worker {
5075*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
5076*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_rgn_size;
5077*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
5078*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
5079*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = 00;
5080*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_comp_room;
5081*3ac0a46fSAndroid Build Coastguard Worker
5082*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5083*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5084*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5085*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5086*3ac0a46fSAndroid Build Coastguard Worker
5087*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
5088*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_tile_no];
5089*3ac0a46fSAndroid Build Coastguard Worker l_tccp = &l_tcp->tccps[p_comp_no];
5090*3ac0a46fSAndroid Build Coastguard Worker
5091*3ac0a46fSAndroid Build Coastguard Worker if (nb_comps <= 256) {
5092*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = 1;
5093*3ac0a46fSAndroid Build Coastguard Worker } else {
5094*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = 2;
5095*3ac0a46fSAndroid Build Coastguard Worker }
5096*3ac0a46fSAndroid Build Coastguard Worker
5097*3ac0a46fSAndroid Build Coastguard Worker l_rgn_size = 6 + l_comp_room;
5098*3ac0a46fSAndroid Build Coastguard Worker
5099*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5100*3ac0a46fSAndroid Build Coastguard Worker
5101*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_RGN,
5102*3ac0a46fSAndroid Build Coastguard Worker 2); /* RGN */
5103*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5104*3ac0a46fSAndroid Build Coastguard Worker
5105*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_rgn_size - 2,
5106*3ac0a46fSAndroid Build Coastguard Worker 2); /* Lrgn */
5107*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5108*3ac0a46fSAndroid Build Coastguard Worker
5109*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, p_comp_no,
5110*3ac0a46fSAndroid Build Coastguard Worker l_comp_room); /* Crgn */
5111*3ac0a46fSAndroid Build Coastguard Worker l_current_data += l_comp_room;
5112*3ac0a46fSAndroid Build Coastguard Worker
5113*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, 0,
5114*3ac0a46fSAndroid Build Coastguard Worker 1); /* Srgn */
5115*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
5116*3ac0a46fSAndroid Build Coastguard Worker
5117*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,
5118*3ac0a46fSAndroid Build Coastguard Worker 1); /* SPrgn */
5119*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
5120*3ac0a46fSAndroid Build Coastguard Worker
5121*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
5122*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_rgn_size,
5123*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_rgn_size) {
5124*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5125*3ac0a46fSAndroid Build Coastguard Worker }
5126*3ac0a46fSAndroid Build Coastguard Worker
5127*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5128*3ac0a46fSAndroid Build Coastguard Worker }
5129*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_eoc(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)5130*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_eoc(opj_j2k_t *p_j2k,
5131*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
5132*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
5133*3ac0a46fSAndroid Build Coastguard Worker )
5134*3ac0a46fSAndroid Build Coastguard Worker {
5135*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5136*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5137*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5138*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5139*3ac0a46fSAndroid Build Coastguard Worker
5140*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,
5141*3ac0a46fSAndroid Build Coastguard Worker J2K_MS_EOC, 2); /* EOC */
5142*3ac0a46fSAndroid Build Coastguard Worker
5143*3ac0a46fSAndroid Build Coastguard Worker /* UniPG>> */
5144*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
5145*3ac0a46fSAndroid Build Coastguard Worker /* update markers struct */
5146*3ac0a46fSAndroid Build Coastguard Worker /*
5147*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
5148*3ac0a46fSAndroid Build Coastguard Worker */
5149*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
5150*3ac0a46fSAndroid Build Coastguard Worker
5151*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
5152*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, 2, p_manager) != 2) {
5153*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5154*3ac0a46fSAndroid Build Coastguard Worker }
5155*3ac0a46fSAndroid Build Coastguard Worker
5156*3ac0a46fSAndroid Build Coastguard Worker if (! opj_stream_flush(p_stream, p_manager)) {
5157*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5158*3ac0a46fSAndroid Build Coastguard Worker }
5159*3ac0a46fSAndroid Build Coastguard Worker
5160*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5161*3ac0a46fSAndroid Build Coastguard Worker }
5162*3ac0a46fSAndroid Build Coastguard Worker
5163*3ac0a46fSAndroid Build Coastguard Worker /**
5164*3ac0a46fSAndroid Build Coastguard Worker * Reads a RGN marker (Region Of Interest)
5165*3ac0a46fSAndroid Build Coastguard Worker *
5166*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the POC box.
5167*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
5168*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the POC marker.
5169*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
5170*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_rgn(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)5171*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_rgn(opj_j2k_t *p_j2k,
5172*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
5173*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
5174*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
5175*3ac0a46fSAndroid Build Coastguard Worker )
5176*3ac0a46fSAndroid Build Coastguard Worker {
5177*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comp;
5178*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image = 00;
5179*3ac0a46fSAndroid Build Coastguard Worker
5180*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
5181*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
5182*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
5183*3ac0a46fSAndroid Build Coastguard Worker
5184*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
5185*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
5186*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5187*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5188*3ac0a46fSAndroid Build Coastguard Worker
5189*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
5190*3ac0a46fSAndroid Build Coastguard Worker l_nb_comp = l_image->numcomps;
5191*3ac0a46fSAndroid Build Coastguard Worker
5192*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_comp <= 256) {
5193*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = 1;
5194*3ac0a46fSAndroid Build Coastguard Worker } else {
5195*3ac0a46fSAndroid Build Coastguard Worker l_comp_room = 2;
5196*3ac0a46fSAndroid Build Coastguard Worker }
5197*3ac0a46fSAndroid Build Coastguard Worker
5198*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != 2 + l_comp_room) {
5199*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
5200*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5201*3ac0a46fSAndroid Build Coastguard Worker }
5202*3ac0a46fSAndroid Build Coastguard Worker
5203*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
5204*3ac0a46fSAndroid Build Coastguard Worker l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
5205*3ac0a46fSAndroid Build Coastguard Worker &l_cp->tcps[p_j2k->m_current_tile_number] :
5206*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
5207*3ac0a46fSAndroid Build Coastguard Worker
5208*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_comp_no, l_comp_room); /* Crgn */
5209*3ac0a46fSAndroid Build Coastguard Worker p_header_data += l_comp_room;
5210*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_roi_sty,
5211*3ac0a46fSAndroid Build Coastguard Worker 1); /* Srgn */
5212*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
5213*3ac0a46fSAndroid Build Coastguard Worker
5214*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
5215*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->correct) {
5216*3ac0a46fSAndroid Build Coastguard Worker /* totlen is negative or larger than the bytes left!!! */
5217*3ac0a46fSAndroid Build Coastguard Worker if (l_comp_room >= l_nb_comp) {
5218*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
5219*3ac0a46fSAndroid Build Coastguard Worker "JPWL: bad component number in RGN (%d when there are only %d)\n",
5220*3ac0a46fSAndroid Build Coastguard Worker l_comp_room, l_nb_comp);
5221*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
5222*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
5223*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5224*3ac0a46fSAndroid Build Coastguard Worker }
5225*3ac0a46fSAndroid Build Coastguard Worker }
5226*3ac0a46fSAndroid Build Coastguard Worker };
5227*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
5228*3ac0a46fSAndroid Build Coastguard Worker
5229*3ac0a46fSAndroid Build Coastguard Worker /* testcase 3635.pdf.asan.77.2930 */
5230*3ac0a46fSAndroid Build Coastguard Worker if (l_comp_no >= l_nb_comp) {
5231*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
5232*3ac0a46fSAndroid Build Coastguard Worker "bad component number in RGN (%d when there are only %d)\n",
5233*3ac0a46fSAndroid Build Coastguard Worker l_comp_no, l_nb_comp);
5234*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5235*3ac0a46fSAndroid Build Coastguard Worker }
5236*3ac0a46fSAndroid Build Coastguard Worker
5237*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data,
5238*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32 *)(&(l_tcp->tccps[l_comp_no].roishift)), 1); /* SPrgn */
5239*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
5240*3ac0a46fSAndroid Build Coastguard Worker
5241*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5242*3ac0a46fSAndroid Build Coastguard Worker
5243*3ac0a46fSAndroid Build Coastguard Worker }
5244*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_tp_stride(opj_tcp_t * p_tcp)5245*3ac0a46fSAndroid Build Coastguard Worker static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp)
5246*3ac0a46fSAndroid Build Coastguard Worker {
5247*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_FLOAT32)((p_tcp->m_nb_tile_parts - 1) * 14);
5248*3ac0a46fSAndroid Build Coastguard Worker }
5249*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_default_stride(opj_tcp_t * p_tcp)5250*3ac0a46fSAndroid Build Coastguard Worker static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp)
5251*3ac0a46fSAndroid Build Coastguard Worker {
5252*3ac0a46fSAndroid Build Coastguard Worker (void)p_tcp;
5253*3ac0a46fSAndroid Build Coastguard Worker return 0;
5254*3ac0a46fSAndroid Build Coastguard Worker }
5255*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_update_rates(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)5256*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_update_rates(opj_j2k_t *p_j2k,
5257*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
5258*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
5259*3ac0a46fSAndroid Build Coastguard Worker {
5260*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t * l_cp = 00;
5261*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image = 00;
5262*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = 00;
5263*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp = 00;
5264*3ac0a46fSAndroid Build Coastguard Worker
5265*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j, k;
5266*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
5267*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_rates = 0;
5268*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 l_sot_remove;
5269*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_bits_empty, l_size_pixel;
5270*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT64 l_tile_size = 0;
5271*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_last_res;
5272*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32(* l_tp_stride_func)(opj_tcp_t *) = 00;
5273*3ac0a46fSAndroid Build Coastguard Worker
5274*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5275*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5276*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5277*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5278*3ac0a46fSAndroid Build Coastguard Worker
5279*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
5280*3ac0a46fSAndroid Build Coastguard Worker
5281*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
5282*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
5283*3ac0a46fSAndroid Build Coastguard Worker l_tcp = l_cp->tcps;
5284*3ac0a46fSAndroid Build Coastguard Worker
5285*3ac0a46fSAndroid Build Coastguard Worker l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
5286*3ac0a46fSAndroid Build Coastguard Worker l_size_pixel = l_image->numcomps * l_image->comps->prec;
5287*3ac0a46fSAndroid Build Coastguard Worker l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(
5288*3ac0a46fSAndroid Build Coastguard Worker l_cp->th * l_cp->tw);
5289*3ac0a46fSAndroid Build Coastguard Worker
5290*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->m_specific_param.m_enc.m_tp_on) {
5291*3ac0a46fSAndroid Build Coastguard Worker l_tp_stride_func = opj_j2k_get_tp_stride;
5292*3ac0a46fSAndroid Build Coastguard Worker } else {
5293*3ac0a46fSAndroid Build Coastguard Worker l_tp_stride_func = opj_j2k_get_default_stride;
5294*3ac0a46fSAndroid Build Coastguard Worker }
5295*3ac0a46fSAndroid Build Coastguard Worker
5296*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_cp->th; ++i) {
5297*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_cp->tw; ++j) {
5298*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) /
5299*3ac0a46fSAndroid Build Coastguard Worker (OPJ_FLOAT32)l_tcp->numlayers;
5300*3ac0a46fSAndroid Build Coastguard Worker
5301*3ac0a46fSAndroid Build Coastguard Worker /* 4 borders of the tile rescale on the image if necessary */
5302*3ac0a46fSAndroid Build Coastguard Worker l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx),
5303*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_image->x0);
5304*3ac0a46fSAndroid Build Coastguard Worker l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy),
5305*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_image->y0);
5306*3ac0a46fSAndroid Build Coastguard Worker l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx),
5307*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_image->x1);
5308*3ac0a46fSAndroid Build Coastguard Worker l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy),
5309*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_image->y1);
5310*3ac0a46fSAndroid Build Coastguard Worker
5311*3ac0a46fSAndroid Build Coastguard Worker l_rates = l_tcp->rates;
5312*3ac0a46fSAndroid Build Coastguard Worker
5313*3ac0a46fSAndroid Build Coastguard Worker /* Modification of the RATE >> */
5314*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < l_tcp->numlayers; ++k) {
5315*3ac0a46fSAndroid Build Coastguard Worker if (*l_rates > 0.0f) {
5316*3ac0a46fSAndroid Build Coastguard Worker *l_rates = (OPJ_FLOAT32)(((OPJ_FLOAT64)l_size_pixel * (OPJ_UINT32)(
5317*3ac0a46fSAndroid Build Coastguard Worker l_x1 - l_x0) *
5318*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)(l_y1 - l_y0))
5319*3ac0a46fSAndroid Build Coastguard Worker / ((*l_rates) * (OPJ_FLOAT32)l_bits_empty))
5320*3ac0a46fSAndroid Build Coastguard Worker -
5321*3ac0a46fSAndroid Build Coastguard Worker l_offset;
5322*3ac0a46fSAndroid Build Coastguard Worker }
5323*3ac0a46fSAndroid Build Coastguard Worker
5324*3ac0a46fSAndroid Build Coastguard Worker ++l_rates;
5325*3ac0a46fSAndroid Build Coastguard Worker }
5326*3ac0a46fSAndroid Build Coastguard Worker
5327*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
5328*3ac0a46fSAndroid Build Coastguard Worker
5329*3ac0a46fSAndroid Build Coastguard Worker }
5330*3ac0a46fSAndroid Build Coastguard Worker }
5331*3ac0a46fSAndroid Build Coastguard Worker
5332*3ac0a46fSAndroid Build Coastguard Worker l_tcp = l_cp->tcps;
5333*3ac0a46fSAndroid Build Coastguard Worker
5334*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_cp->th; ++i) {
5335*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_cp->tw; ++j) {
5336*3ac0a46fSAndroid Build Coastguard Worker l_rates = l_tcp->rates;
5337*3ac0a46fSAndroid Build Coastguard Worker
5338*3ac0a46fSAndroid Build Coastguard Worker if (*l_rates > 0.0f) {
5339*3ac0a46fSAndroid Build Coastguard Worker *l_rates -= l_sot_remove;
5340*3ac0a46fSAndroid Build Coastguard Worker
5341*3ac0a46fSAndroid Build Coastguard Worker if (*l_rates < 30.0f) {
5342*3ac0a46fSAndroid Build Coastguard Worker *l_rates = 30.0f;
5343*3ac0a46fSAndroid Build Coastguard Worker }
5344*3ac0a46fSAndroid Build Coastguard Worker }
5345*3ac0a46fSAndroid Build Coastguard Worker
5346*3ac0a46fSAndroid Build Coastguard Worker ++l_rates;
5347*3ac0a46fSAndroid Build Coastguard Worker
5348*3ac0a46fSAndroid Build Coastguard Worker l_last_res = l_tcp->numlayers - 1;
5349*3ac0a46fSAndroid Build Coastguard Worker
5350*3ac0a46fSAndroid Build Coastguard Worker for (k = 1; k < l_last_res; ++k) {
5351*3ac0a46fSAndroid Build Coastguard Worker
5352*3ac0a46fSAndroid Build Coastguard Worker if (*l_rates > 0.0f) {
5353*3ac0a46fSAndroid Build Coastguard Worker *l_rates -= l_sot_remove;
5354*3ac0a46fSAndroid Build Coastguard Worker
5355*3ac0a46fSAndroid Build Coastguard Worker if (*l_rates < * (l_rates - 1) + 10.0f) {
5356*3ac0a46fSAndroid Build Coastguard Worker *l_rates = (*(l_rates - 1)) + 20.0f;
5357*3ac0a46fSAndroid Build Coastguard Worker }
5358*3ac0a46fSAndroid Build Coastguard Worker }
5359*3ac0a46fSAndroid Build Coastguard Worker
5360*3ac0a46fSAndroid Build Coastguard Worker ++l_rates;
5361*3ac0a46fSAndroid Build Coastguard Worker }
5362*3ac0a46fSAndroid Build Coastguard Worker
5363*3ac0a46fSAndroid Build Coastguard Worker if (*l_rates > 0.0f) {
5364*3ac0a46fSAndroid Build Coastguard Worker *l_rates -= (l_sot_remove + 2.f);
5365*3ac0a46fSAndroid Build Coastguard Worker
5366*3ac0a46fSAndroid Build Coastguard Worker if (*l_rates < * (l_rates - 1) + 10.0f) {
5367*3ac0a46fSAndroid Build Coastguard Worker *l_rates = (*(l_rates - 1)) + 20.0f;
5368*3ac0a46fSAndroid Build Coastguard Worker }
5369*3ac0a46fSAndroid Build Coastguard Worker }
5370*3ac0a46fSAndroid Build Coastguard Worker
5371*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
5372*3ac0a46fSAndroid Build Coastguard Worker }
5373*3ac0a46fSAndroid Build Coastguard Worker }
5374*3ac0a46fSAndroid Build Coastguard Worker
5375*3ac0a46fSAndroid Build Coastguard Worker l_img_comp = l_image->comps;
5376*3ac0a46fSAndroid Build Coastguard Worker l_tile_size = 0;
5377*3ac0a46fSAndroid Build Coastguard Worker
5378*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image->numcomps; ++i) {
5379*3ac0a46fSAndroid Build Coastguard Worker l_tile_size += (OPJ_UINT64)opj_uint_ceildiv(l_cp->tdx, l_img_comp->dx)
5380*3ac0a46fSAndroid Build Coastguard Worker *
5381*3ac0a46fSAndroid Build Coastguard Worker opj_uint_ceildiv(l_cp->tdy, l_img_comp->dy)
5382*3ac0a46fSAndroid Build Coastguard Worker *
5383*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->prec;
5384*3ac0a46fSAndroid Build Coastguard Worker
5385*3ac0a46fSAndroid Build Coastguard Worker ++l_img_comp;
5386*3ac0a46fSAndroid Build Coastguard Worker }
5387*3ac0a46fSAndroid Build Coastguard Worker
5388*3ac0a46fSAndroid Build Coastguard Worker /* TODO: where does this magic value come from ? */
5389*3ac0a46fSAndroid Build Coastguard Worker /* This used to be 1.3 / 8, but with random data and very small code */
5390*3ac0a46fSAndroid Build Coastguard Worker /* block sizes, this is not enough. For example with */
5391*3ac0a46fSAndroid Build Coastguard Worker /* bin/test_tile_encoder 1 256 256 32 32 8 0 reversible_with_precinct.j2k 4 4 3 0 0 1 16 16 */
5392*3ac0a46fSAndroid Build Coastguard Worker /* TODO revise this to take into account the overhead linked to the */
5393*3ac0a46fSAndroid Build Coastguard Worker /* number of packets and number of code blocks in packets */
5394*3ac0a46fSAndroid Build Coastguard Worker l_tile_size = (OPJ_UINT64)((double)l_tile_size * 1.4 / 8);
5395*3ac0a46fSAndroid Build Coastguard Worker
5396*3ac0a46fSAndroid Build Coastguard Worker /* Arbitrary amount to make the following work: */
5397*3ac0a46fSAndroid Build Coastguard Worker /* bin/test_tile_encoder 1 256 256 17 16 8 0 reversible_no_precinct.j2k 4 4 3 0 0 1 */
5398*3ac0a46fSAndroid Build Coastguard Worker l_tile_size += 500;
5399*3ac0a46fSAndroid Build Coastguard Worker
5400*3ac0a46fSAndroid Build Coastguard Worker l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
5401*3ac0a46fSAndroid Build Coastguard Worker
5402*3ac0a46fSAndroid Build Coastguard Worker if (l_tile_size > UINT_MAX) {
5403*3ac0a46fSAndroid Build Coastguard Worker l_tile_size = UINT_MAX;
5404*3ac0a46fSAndroid Build Coastguard Worker }
5405*3ac0a46fSAndroid Build Coastguard Worker
5406*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = (OPJ_UINT32)l_tile_size;
5407*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
5408*3ac0a46fSAndroid Build Coastguard Worker (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
5409*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {
5410*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
5411*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate m_encoded_tile_data. %u MB required\n",
5412*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)(l_tile_size / 1024 / 1024));
5413*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5414*3ac0a46fSAndroid Build Coastguard Worker }
5415*3ac0a46fSAndroid Build Coastguard Worker
5416*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_TLM) {
5417*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
5418*3ac0a46fSAndroid Build Coastguard Worker (OPJ_BYTE *) opj_malloc(6 *
5419*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
5420*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
5421*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5422*3ac0a46fSAndroid Build Coastguard Worker }
5423*3ac0a46fSAndroid Build Coastguard Worker
5424*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
5425*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
5426*3ac0a46fSAndroid Build Coastguard Worker }
5427*3ac0a46fSAndroid Build Coastguard Worker
5428*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5429*3ac0a46fSAndroid Build Coastguard Worker }
5430*3ac0a46fSAndroid Build Coastguard Worker
5431*3ac0a46fSAndroid Build Coastguard Worker #if 0
5432*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_eoc(opj_j2k_t *p_j2k,
5433*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
5434*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
5435*3ac0a46fSAndroid Build Coastguard Worker {
5436*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
5437*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_t * l_tcd = 00;
5438*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
5439*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = 00;
5440*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_success;
5441*3ac0a46fSAndroid Build Coastguard Worker
5442*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5443*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5444*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5445*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5446*3ac0a46fSAndroid Build Coastguard Worker
5447*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
5448*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_cp.tcps;
5449*3ac0a46fSAndroid Build Coastguard Worker
5450*3ac0a46fSAndroid Build Coastguard Worker l_tcd = opj_tcd_create(OPJ_TRUE);
5451*3ac0a46fSAndroid Build Coastguard Worker if (l_tcd == 00) {
5452*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
5453*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5454*3ac0a46fSAndroid Build Coastguard Worker }
5455*3ac0a46fSAndroid Build Coastguard Worker
5456*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
5457*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_data) {
5458*3ac0a46fSAndroid Build Coastguard Worker if (! opj_tcd_init_decode_tile(l_tcd, i)) {
5459*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_destroy(l_tcd);
5460*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
5461*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5462*3ac0a46fSAndroid Build Coastguard Worker }
5463*3ac0a46fSAndroid Build Coastguard Worker
5464*3ac0a46fSAndroid Build Coastguard Worker l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i,
5465*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index);
5466*3ac0a46fSAndroid Build Coastguard Worker /* cleanup */
5467*3ac0a46fSAndroid Build Coastguard Worker
5468*3ac0a46fSAndroid Build Coastguard Worker if (! l_success) {
5469*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
5470*3ac0a46fSAndroid Build Coastguard Worker break;
5471*3ac0a46fSAndroid Build Coastguard Worker }
5472*3ac0a46fSAndroid Build Coastguard Worker }
5473*3ac0a46fSAndroid Build Coastguard Worker
5474*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_destroy(l_tcp);
5475*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
5476*3ac0a46fSAndroid Build Coastguard Worker }
5477*3ac0a46fSAndroid Build Coastguard Worker
5478*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_destroy(l_tcd);
5479*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5480*3ac0a46fSAndroid Build Coastguard Worker }
5481*3ac0a46fSAndroid Build Coastguard Worker #endif
5482*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_end_header(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)5483*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
5484*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
5485*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
5486*3ac0a46fSAndroid Build Coastguard Worker {
5487*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5488*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5489*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5490*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5491*3ac0a46fSAndroid Build Coastguard Worker
5492*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
5493*3ac0a46fSAndroid Build Coastguard Worker
5494*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
5495*3ac0a46fSAndroid Build Coastguard Worker
5496*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5497*3ac0a46fSAndroid Build Coastguard Worker }
5498*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_mct_data_group(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)5499*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_mct_data_group(opj_j2k_t *p_j2k,
5500*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
5501*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
5502*3ac0a46fSAndroid Build Coastguard Worker {
5503*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
5504*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t * l_mcc_record;
5505*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * l_mct_record;
5506*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp;
5507*3ac0a46fSAndroid Build Coastguard Worker
5508*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5509*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5510*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5511*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5512*3ac0a46fSAndroid Build Coastguard Worker
5513*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_cbd(p_j2k, p_stream, p_manager)) {
5514*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5515*3ac0a46fSAndroid Build Coastguard Worker }
5516*3ac0a46fSAndroid Build Coastguard Worker
5517*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
5518*3ac0a46fSAndroid Build Coastguard Worker l_mct_record = l_tcp->m_mct_records;
5519*3ac0a46fSAndroid Build Coastguard Worker
5520*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
5521*3ac0a46fSAndroid Build Coastguard Worker
5522*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_mct_record(p_j2k, l_mct_record, p_stream, p_manager)) {
5523*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5524*3ac0a46fSAndroid Build Coastguard Worker }
5525*3ac0a46fSAndroid Build Coastguard Worker
5526*3ac0a46fSAndroid Build Coastguard Worker ++l_mct_record;
5527*3ac0a46fSAndroid Build Coastguard Worker }
5528*3ac0a46fSAndroid Build Coastguard Worker
5529*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record = l_tcp->m_mcc_records;
5530*3ac0a46fSAndroid Build Coastguard Worker
5531*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
5532*3ac0a46fSAndroid Build Coastguard Worker
5533*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_mcc_record(p_j2k, l_mcc_record, p_stream, p_manager)) {
5534*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5535*3ac0a46fSAndroid Build Coastguard Worker }
5536*3ac0a46fSAndroid Build Coastguard Worker
5537*3ac0a46fSAndroid Build Coastguard Worker ++l_mcc_record;
5538*3ac0a46fSAndroid Build Coastguard Worker }
5539*3ac0a46fSAndroid Build Coastguard Worker
5540*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_mco(p_j2k, p_stream, p_manager)) {
5541*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5542*3ac0a46fSAndroid Build Coastguard Worker }
5543*3ac0a46fSAndroid Build Coastguard Worker
5544*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5545*3ac0a46fSAndroid Build Coastguard Worker }
5546*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_all_coc(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)5547*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_all_coc(
5548*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t *p_j2k,
5549*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
5550*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
5551*3ac0a46fSAndroid Build Coastguard Worker {
5552*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
5553*3ac0a46fSAndroid Build Coastguard Worker
5554*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5555*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5556*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5557*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5558*3ac0a46fSAndroid Build Coastguard Worker
5559*3ac0a46fSAndroid Build Coastguard Worker for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5560*3ac0a46fSAndroid Build Coastguard Worker /* cod is first component of first tile */
5561*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_compare_coc(p_j2k, 0, compno)) {
5562*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_coc(p_j2k, compno, p_stream, p_manager)) {
5563*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5564*3ac0a46fSAndroid Build Coastguard Worker }
5565*3ac0a46fSAndroid Build Coastguard Worker }
5566*3ac0a46fSAndroid Build Coastguard Worker }
5567*3ac0a46fSAndroid Build Coastguard Worker
5568*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5569*3ac0a46fSAndroid Build Coastguard Worker }
5570*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_all_qcc(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)5571*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_all_qcc(
5572*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t *p_j2k,
5573*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
5574*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
5575*3ac0a46fSAndroid Build Coastguard Worker {
5576*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
5577*3ac0a46fSAndroid Build Coastguard Worker
5578*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5579*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5580*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5581*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5582*3ac0a46fSAndroid Build Coastguard Worker
5583*3ac0a46fSAndroid Build Coastguard Worker for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
5584*3ac0a46fSAndroid Build Coastguard Worker /* qcd is first component of first tile */
5585*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_compare_qcc(p_j2k, 0, compno)) {
5586*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_qcc(p_j2k, compno, p_stream, p_manager)) {
5587*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5588*3ac0a46fSAndroid Build Coastguard Worker }
5589*3ac0a46fSAndroid Build Coastguard Worker }
5590*3ac0a46fSAndroid Build Coastguard Worker }
5591*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5592*3ac0a46fSAndroid Build Coastguard Worker }
5593*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_regions(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)5594*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_regions(opj_j2k_t *p_j2k,
5595*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
5596*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
5597*3ac0a46fSAndroid Build Coastguard Worker {
5598*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
5599*3ac0a46fSAndroid Build Coastguard Worker const opj_tccp_t *l_tccp = 00;
5600*3ac0a46fSAndroid Build Coastguard Worker
5601*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5602*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5603*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5604*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5605*3ac0a46fSAndroid Build Coastguard Worker
5606*3ac0a46fSAndroid Build Coastguard Worker l_tccp = p_j2k->m_cp.tcps->tccps;
5607*3ac0a46fSAndroid Build Coastguard Worker
5608*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) {
5609*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->roishift) {
5610*3ac0a46fSAndroid Build Coastguard Worker
5611*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_rgn(p_j2k, 0, compno, p_j2k->m_private_image->numcomps,
5612*3ac0a46fSAndroid Build Coastguard Worker p_stream, p_manager)) {
5613*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5614*3ac0a46fSAndroid Build Coastguard Worker }
5615*3ac0a46fSAndroid Build Coastguard Worker }
5616*3ac0a46fSAndroid Build Coastguard Worker
5617*3ac0a46fSAndroid Build Coastguard Worker ++l_tccp;
5618*3ac0a46fSAndroid Build Coastguard Worker }
5619*3ac0a46fSAndroid Build Coastguard Worker
5620*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5621*3ac0a46fSAndroid Build Coastguard Worker }
5622*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_epc(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)5623*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_epc(opj_j2k_t *p_j2k,
5624*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
5625*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
5626*3ac0a46fSAndroid Build Coastguard Worker {
5627*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_index_t * l_cstr_index = 00;
5628*3ac0a46fSAndroid Build Coastguard Worker
5629*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5630*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5631*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5632*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5633*3ac0a46fSAndroid Build Coastguard Worker
5634*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
5635*3ac0a46fSAndroid Build Coastguard Worker
5636*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index = p_j2k->cstr_index;
5637*3ac0a46fSAndroid Build Coastguard Worker if (l_cstr_index) {
5638*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
5639*3ac0a46fSAndroid Build Coastguard Worker /* UniPG>> */
5640*3ac0a46fSAndroid Build Coastguard Worker /* The following adjustment is done to adjust the codestream size */
5641*3ac0a46fSAndroid Build Coastguard Worker /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
5642*3ac0a46fSAndroid Build Coastguard Worker /* the first bunch of bytes is not in the codestream */
5643*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;
5644*3ac0a46fSAndroid Build Coastguard Worker /* <<UniPG */
5645*3ac0a46fSAndroid Build Coastguard Worker }
5646*3ac0a46fSAndroid Build Coastguard Worker
5647*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
5648*3ac0a46fSAndroid Build Coastguard Worker /* preparation of JPWL marker segments */
5649*3ac0a46fSAndroid Build Coastguard Worker #if 0
5650*3ac0a46fSAndroid Build Coastguard Worker if (cp->epc_on) {
5651*3ac0a46fSAndroid Build Coastguard Worker
5652*3ac0a46fSAndroid Build Coastguard Worker /* encode according to JPWL */
5653*3ac0a46fSAndroid Build Coastguard Worker jpwl_encode(p_j2k, p_stream, image);
5654*3ac0a46fSAndroid Build Coastguard Worker
5655*3ac0a46fSAndroid Build Coastguard Worker }
5656*3ac0a46fSAndroid Build Coastguard Worker #endif
5657*3ac0a46fSAndroid Build Coastguard Worker assert(0 && "TODO");
5658*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
5659*3ac0a46fSAndroid Build Coastguard Worker
5660*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5661*3ac0a46fSAndroid Build Coastguard Worker }
5662*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_unk(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,OPJ_UINT32 * output_marker,opj_event_mgr_t * p_manager)5663*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_unk(opj_j2k_t *p_j2k,
5664*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
5665*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 *output_marker,
5666*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
5667*3ac0a46fSAndroid Build Coastguard Worker )
5668*3ac0a46fSAndroid Build Coastguard Worker {
5669*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_unknown_marker;
5670*3ac0a46fSAndroid Build Coastguard Worker const opj_dec_memory_marker_handler_t * l_marker_handler;
5671*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_size_unk = 2;
5672*3ac0a46fSAndroid Build Coastguard Worker
5673*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
5674*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5675*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5676*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5677*3ac0a46fSAndroid Build Coastguard Worker
5678*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
5679*3ac0a46fSAndroid Build Coastguard Worker
5680*3ac0a46fSAndroid Build Coastguard Worker for (;;) {
5681*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
5682*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
5683*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
5684*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
5685*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5686*3ac0a46fSAndroid Build Coastguard Worker }
5687*3ac0a46fSAndroid Build Coastguard Worker
5688*3ac0a46fSAndroid Build Coastguard Worker /* read 2 bytes as the new marker ID*/
5689*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
5690*3ac0a46fSAndroid Build Coastguard Worker &l_unknown_marker, 2);
5691*3ac0a46fSAndroid Build Coastguard Worker
5692*3ac0a46fSAndroid Build Coastguard Worker if (!(l_unknown_marker < 0xff00)) {
5693*3ac0a46fSAndroid Build Coastguard Worker
5694*3ac0a46fSAndroid Build Coastguard Worker /* Get the marker handler from the marker ID*/
5695*3ac0a46fSAndroid Build Coastguard Worker l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
5696*3ac0a46fSAndroid Build Coastguard Worker
5697*3ac0a46fSAndroid Build Coastguard Worker if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
5698*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
5699*3ac0a46fSAndroid Build Coastguard Worker "Marker is not compliant with its position\n");
5700*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5701*3ac0a46fSAndroid Build Coastguard Worker } else {
5702*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_handler->id != J2K_MS_UNK) {
5703*3ac0a46fSAndroid Build Coastguard Worker /* Add the marker to the codestream index*/
5704*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_handler->id != J2K_MS_SOT) {
5705*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
5706*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
5707*3ac0a46fSAndroid Build Coastguard Worker l_size_unk);
5708*3ac0a46fSAndroid Build Coastguard Worker if (res == OPJ_FALSE) {
5709*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
5710*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5711*3ac0a46fSAndroid Build Coastguard Worker }
5712*3ac0a46fSAndroid Build Coastguard Worker }
5713*3ac0a46fSAndroid Build Coastguard Worker break; /* next marker is known and well located */
5714*3ac0a46fSAndroid Build Coastguard Worker } else {
5715*3ac0a46fSAndroid Build Coastguard Worker l_size_unk += 2;
5716*3ac0a46fSAndroid Build Coastguard Worker }
5717*3ac0a46fSAndroid Build Coastguard Worker }
5718*3ac0a46fSAndroid Build Coastguard Worker }
5719*3ac0a46fSAndroid Build Coastguard Worker }
5720*3ac0a46fSAndroid Build Coastguard Worker
5721*3ac0a46fSAndroid Build Coastguard Worker *output_marker = l_marker_handler->id ;
5722*3ac0a46fSAndroid Build Coastguard Worker
5723*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5724*3ac0a46fSAndroid Build Coastguard Worker }
5725*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_mct_record(opj_j2k_t * p_j2k,opj_mct_data_t * p_mct_record,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)5726*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_mct_record(opj_j2k_t *p_j2k,
5727*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * p_mct_record,
5728*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
5729*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
5730*3ac0a46fSAndroid Build Coastguard Worker {
5731*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_mct_size;
5732*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
5733*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tmp;
5734*3ac0a46fSAndroid Build Coastguard Worker
5735*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5736*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5737*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5738*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5739*3ac0a46fSAndroid Build Coastguard Worker
5740*3ac0a46fSAndroid Build Coastguard Worker l_mct_size = 10 + p_mct_record->m_data_size;
5741*3ac0a46fSAndroid Build Coastguard Worker
5742*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
5743*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
5744*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);
5745*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
5746*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5747*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5748*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5749*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n");
5750*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5751*3ac0a46fSAndroid Build Coastguard Worker }
5752*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5753*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
5754*3ac0a46fSAndroid Build Coastguard Worker }
5755*3ac0a46fSAndroid Build Coastguard Worker
5756*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5757*3ac0a46fSAndroid Build Coastguard Worker
5758*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_MCT,
5759*3ac0a46fSAndroid Build Coastguard Worker 2); /* MCT */
5760*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5761*3ac0a46fSAndroid Build Coastguard Worker
5762*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_mct_size - 2,
5763*3ac0a46fSAndroid Build Coastguard Worker 2); /* Lmct */
5764*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5765*3ac0a46fSAndroid Build Coastguard Worker
5766*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, 0,
5767*3ac0a46fSAndroid Build Coastguard Worker 2); /* Zmct */
5768*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5769*3ac0a46fSAndroid Build Coastguard Worker
5770*3ac0a46fSAndroid Build Coastguard Worker /* only one marker atm */
5771*3ac0a46fSAndroid Build Coastguard Worker l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) |
5772*3ac0a46fSAndroid Build Coastguard Worker (p_mct_record->m_element_type << 10);
5773*3ac0a46fSAndroid Build Coastguard Worker
5774*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_tmp, 2);
5775*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5776*3ac0a46fSAndroid Build Coastguard Worker
5777*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, 0,
5778*3ac0a46fSAndroid Build Coastguard Worker 2); /* Ymct */
5779*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5780*3ac0a46fSAndroid Build Coastguard Worker
5781*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_current_data, p_mct_record->m_data, p_mct_record->m_data_size);
5782*3ac0a46fSAndroid Build Coastguard Worker
5783*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
5784*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size,
5785*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_mct_size) {
5786*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5787*3ac0a46fSAndroid Build Coastguard Worker }
5788*3ac0a46fSAndroid Build Coastguard Worker
5789*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5790*3ac0a46fSAndroid Build Coastguard Worker }
5791*3ac0a46fSAndroid Build Coastguard Worker
5792*3ac0a46fSAndroid Build Coastguard Worker /**
5793*3ac0a46fSAndroid Build Coastguard Worker * Reads a MCT marker (Multiple Component Transform)
5794*3ac0a46fSAndroid Build Coastguard Worker *
5795*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the MCT box.
5796*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
5797*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the MCT marker.
5798*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
5799*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_mct(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)5800*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
5801*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
5802*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
5803*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
5804*3ac0a46fSAndroid Build Coastguard Worker )
5805*3ac0a46fSAndroid Build Coastguard Worker {
5806*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
5807*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
5808*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tmp;
5809*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_indix;
5810*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * l_mct_data;
5811*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL new_mct = OPJ_FALSE;
5812*3ac0a46fSAndroid Build Coastguard Worker
5813*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5814*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
5815*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5816*3ac0a46fSAndroid Build Coastguard Worker
5817*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
5818*3ac0a46fSAndroid Build Coastguard Worker &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
5819*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
5820*3ac0a46fSAndroid Build Coastguard Worker
5821*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 2) {
5822*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5823*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5824*3ac0a46fSAndroid Build Coastguard Worker }
5825*3ac0a46fSAndroid Build Coastguard Worker
5826*3ac0a46fSAndroid Build Coastguard Worker /* first marker */
5827*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 2); /* Zmct */
5828*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
5829*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp != 0) {
5830*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
5831*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge mct data within multiple MCT records\n");
5832*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5833*3ac0a46fSAndroid Build Coastguard Worker }
5834*3ac0a46fSAndroid Build Coastguard Worker
5835*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size <= 6) {
5836*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5837*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5838*3ac0a46fSAndroid Build Coastguard Worker }
5839*3ac0a46fSAndroid Build Coastguard Worker
5840*3ac0a46fSAndroid Build Coastguard Worker /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
5841*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 2); /* Imct */
5842*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
5843*3ac0a46fSAndroid Build Coastguard Worker
5844*3ac0a46fSAndroid Build Coastguard Worker l_indix = l_tmp & 0xff;
5845*3ac0a46fSAndroid Build Coastguard Worker l_mct_data = l_tcp->m_mct_records;
5846*3ac0a46fSAndroid Build Coastguard Worker
5847*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
5848*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_data->m_index == l_indix) {
5849*3ac0a46fSAndroid Build Coastguard Worker break;
5850*3ac0a46fSAndroid Build Coastguard Worker }
5851*3ac0a46fSAndroid Build Coastguard Worker ++l_mct_data;
5852*3ac0a46fSAndroid Build Coastguard Worker }
5853*3ac0a46fSAndroid Build Coastguard Worker
5854*3ac0a46fSAndroid Build Coastguard Worker /* NOT FOUND */
5855*3ac0a46fSAndroid Build Coastguard Worker if (i == l_tcp->m_nb_mct_records) {
5856*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
5857*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t *new_mct_records;
5858*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
5859*3ac0a46fSAndroid Build Coastguard Worker
5860*3ac0a46fSAndroid Build Coastguard Worker new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records,
5861*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
5862*3ac0a46fSAndroid Build Coastguard Worker if (! new_mct_records) {
5863*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_tcp->m_mct_records);
5864*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_records = NULL;
5865*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mct_records = 0;
5866*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_mct_records = 0;
5867*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n");
5868*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5869*3ac0a46fSAndroid Build Coastguard Worker }
5870*3ac0a46fSAndroid Build Coastguard Worker
5871*3ac0a46fSAndroid Build Coastguard Worker /* Update m_mcc_records[].m_offset_array and m_decorrelation_array
5872*3ac0a46fSAndroid Build Coastguard Worker * to point to the new addresses */
5873*3ac0a46fSAndroid Build Coastguard Worker if (new_mct_records != l_tcp->m_mct_records) {
5874*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
5875*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t* l_mcc_record =
5876*3ac0a46fSAndroid Build Coastguard Worker &(l_tcp->m_mcc_records[i]);
5877*3ac0a46fSAndroid Build Coastguard Worker if (l_mcc_record->m_decorrelation_array) {
5878*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_decorrelation_array =
5879*3ac0a46fSAndroid Build Coastguard Worker new_mct_records +
5880*3ac0a46fSAndroid Build Coastguard Worker (l_mcc_record->m_decorrelation_array -
5881*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_records);
5882*3ac0a46fSAndroid Build Coastguard Worker }
5883*3ac0a46fSAndroid Build Coastguard Worker if (l_mcc_record->m_offset_array) {
5884*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_offset_array =
5885*3ac0a46fSAndroid Build Coastguard Worker new_mct_records +
5886*3ac0a46fSAndroid Build Coastguard Worker (l_mcc_record->m_offset_array -
5887*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_records);
5888*3ac0a46fSAndroid Build Coastguard Worker }
5889*3ac0a46fSAndroid Build Coastguard Worker }
5890*3ac0a46fSAndroid Build Coastguard Worker }
5891*3ac0a46fSAndroid Build Coastguard Worker
5892*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_records = new_mct_records;
5893*3ac0a46fSAndroid Build Coastguard Worker l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5894*3ac0a46fSAndroid Build Coastguard Worker memset(l_mct_data, 0, (l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) *
5895*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_mct_data_t));
5896*3ac0a46fSAndroid Build Coastguard Worker }
5897*3ac0a46fSAndroid Build Coastguard Worker
5898*3ac0a46fSAndroid Build Coastguard Worker l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
5899*3ac0a46fSAndroid Build Coastguard Worker new_mct = OPJ_TRUE;
5900*3ac0a46fSAndroid Build Coastguard Worker }
5901*3ac0a46fSAndroid Build Coastguard Worker
5902*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_data->m_data) {
5903*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_mct_data->m_data);
5904*3ac0a46fSAndroid Build Coastguard Worker l_mct_data->m_data = 00;
5905*3ac0a46fSAndroid Build Coastguard Worker l_mct_data->m_data_size = 0;
5906*3ac0a46fSAndroid Build Coastguard Worker }
5907*3ac0a46fSAndroid Build Coastguard Worker
5908*3ac0a46fSAndroid Build Coastguard Worker l_mct_data->m_index = l_indix;
5909*3ac0a46fSAndroid Build Coastguard Worker l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp >> 8) & 3);
5910*3ac0a46fSAndroid Build Coastguard Worker l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp >> 10) & 3);
5911*3ac0a46fSAndroid Build Coastguard Worker
5912*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 2); /* Ymct */
5913*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
5914*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp != 0) {
5915*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
5916*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge multiple MCT markers\n");
5917*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5918*3ac0a46fSAndroid Build Coastguard Worker }
5919*3ac0a46fSAndroid Build Coastguard Worker
5920*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= 6;
5921*3ac0a46fSAndroid Build Coastguard Worker
5922*3ac0a46fSAndroid Build Coastguard Worker l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
5923*3ac0a46fSAndroid Build Coastguard Worker if (! l_mct_data->m_data) {
5924*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
5925*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5926*3ac0a46fSAndroid Build Coastguard Worker }
5927*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_mct_data->m_data, p_header_data, p_header_size);
5928*3ac0a46fSAndroid Build Coastguard Worker
5929*3ac0a46fSAndroid Build Coastguard Worker l_mct_data->m_data_size = p_header_size;
5930*3ac0a46fSAndroid Build Coastguard Worker
5931*3ac0a46fSAndroid Build Coastguard Worker if (new_mct) {
5932*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp->m_nb_mct_records;
5933*3ac0a46fSAndroid Build Coastguard Worker }
5934*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
5935*3ac0a46fSAndroid Build Coastguard Worker }
5936*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_mcc_record(opj_j2k_t * p_j2k,struct opj_simple_mcc_decorrelation_data * p_mcc_record,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)5937*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_mcc_record(opj_j2k_t *p_j2k,
5938*3ac0a46fSAndroid Build Coastguard Worker struct opj_simple_mcc_decorrelation_data * p_mcc_record,
5939*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
5940*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
5941*3ac0a46fSAndroid Build Coastguard Worker {
5942*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
5943*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_mcc_size;
5944*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
5945*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_bytes_for_comp;
5946*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_mask;
5947*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tmcc;
5948*3ac0a46fSAndroid Build Coastguard Worker
5949*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
5950*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
5951*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
5952*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
5953*3ac0a46fSAndroid Build Coastguard Worker
5954*3ac0a46fSAndroid Build Coastguard Worker if (p_mcc_record->m_nb_comps > 255) {
5955*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_for_comp = 2;
5956*3ac0a46fSAndroid Build Coastguard Worker l_mask = 0x8000;
5957*3ac0a46fSAndroid Build Coastguard Worker } else {
5958*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_for_comp = 1;
5959*3ac0a46fSAndroid Build Coastguard Worker l_mask = 0;
5960*3ac0a46fSAndroid Build Coastguard Worker }
5961*3ac0a46fSAndroid Build Coastguard Worker
5962*3ac0a46fSAndroid Build Coastguard Worker l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
5963*3ac0a46fSAndroid Build Coastguard Worker if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
5964*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
5965*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);
5966*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
5967*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
5968*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
5969*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
5970*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n");
5971*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
5972*3ac0a46fSAndroid Build Coastguard Worker }
5973*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
5974*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
5975*3ac0a46fSAndroid Build Coastguard Worker }
5976*3ac0a46fSAndroid Build Coastguard Worker
5977*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5978*3ac0a46fSAndroid Build Coastguard Worker
5979*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_MCC,
5980*3ac0a46fSAndroid Build Coastguard Worker 2); /* MCC */
5981*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5982*3ac0a46fSAndroid Build Coastguard Worker
5983*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_mcc_size - 2,
5984*3ac0a46fSAndroid Build Coastguard Worker 2); /* Lmcc */
5985*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5986*3ac0a46fSAndroid Build Coastguard Worker
5987*3ac0a46fSAndroid Build Coastguard Worker /* first marker */
5988*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, 0,
5989*3ac0a46fSAndroid Build Coastguard Worker 2); /* Zmcc */
5990*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
5991*3ac0a46fSAndroid Build Coastguard Worker
5992*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, p_mcc_record->m_index,
5993*3ac0a46fSAndroid Build Coastguard Worker 1); /* Imcc -> no need for other values, take the first */
5994*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
5995*3ac0a46fSAndroid Build Coastguard Worker
5996*3ac0a46fSAndroid Build Coastguard Worker /* only one marker atm */
5997*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, 0,
5998*3ac0a46fSAndroid Build Coastguard Worker 2); /* Ymcc */
5999*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6000*3ac0a46fSAndroid Build Coastguard Worker
6001*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, 1,
6002*3ac0a46fSAndroid Build Coastguard Worker 2); /* Qmcc -> number of collections -> 1 */
6003*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6004*3ac0a46fSAndroid Build Coastguard Worker
6005*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, 0x1,
6006*3ac0a46fSAndroid Build Coastguard Worker 1); /* Xmcci type of component transformation -> array based decorrelation */
6007*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
6008*3ac0a46fSAndroid Build Coastguard Worker
6009*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, p_mcc_record->m_nb_comps | l_mask,
6010*3ac0a46fSAndroid Build Coastguard Worker 2); /* Nmcci number of input components involved and size for each component offset = 8 bits */
6011*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6012*3ac0a46fSAndroid Build Coastguard Worker
6013*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_mcc_record->m_nb_comps; ++i) {
6014*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, i,
6015*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_for_comp); /* Cmccij Component offset*/
6016*3ac0a46fSAndroid Build Coastguard Worker l_current_data += l_nb_bytes_for_comp;
6017*3ac0a46fSAndroid Build Coastguard Worker }
6018*3ac0a46fSAndroid Build Coastguard Worker
6019*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, p_mcc_record->m_nb_comps | l_mask,
6020*3ac0a46fSAndroid Build Coastguard Worker 2); /* Mmcci number of output components involved and size for each component offset = 8 bits */
6021*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6022*3ac0a46fSAndroid Build Coastguard Worker
6023*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_mcc_record->m_nb_comps; ++i) {
6024*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, i,
6025*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_for_comp); /* Wmccij Component offset*/
6026*3ac0a46fSAndroid Build Coastguard Worker l_current_data += l_nb_bytes_for_comp;
6027*3ac0a46fSAndroid Build Coastguard Worker }
6028*3ac0a46fSAndroid Build Coastguard Worker
6029*3ac0a46fSAndroid Build Coastguard Worker l_tmcc = ((!p_mcc_record->m_is_irreversible) & 1U) << 16;
6030*3ac0a46fSAndroid Build Coastguard Worker
6031*3ac0a46fSAndroid Build Coastguard Worker if (p_mcc_record->m_decorrelation_array) {
6032*3ac0a46fSAndroid Build Coastguard Worker l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
6033*3ac0a46fSAndroid Build Coastguard Worker }
6034*3ac0a46fSAndroid Build Coastguard Worker
6035*3ac0a46fSAndroid Build Coastguard Worker if (p_mcc_record->m_offset_array) {
6036*3ac0a46fSAndroid Build Coastguard Worker l_tmcc |= ((p_mcc_record->m_offset_array->m_index) << 8);
6037*3ac0a46fSAndroid Build Coastguard Worker }
6038*3ac0a46fSAndroid Build Coastguard Worker
6039*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_tmcc,
6040*3ac0a46fSAndroid Build Coastguard Worker 3); /* Tmcci : use MCT defined as number 1 and irreversible array based. */
6041*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 3;
6042*3ac0a46fSAndroid Build Coastguard Worker
6043*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
6044*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size,
6045*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_mcc_size) {
6046*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6047*3ac0a46fSAndroid Build Coastguard Worker }
6048*3ac0a46fSAndroid Build Coastguard Worker
6049*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6050*3ac0a46fSAndroid Build Coastguard Worker }
6051*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_mcc(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)6052*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_mcc(opj_j2k_t *p_j2k,
6053*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
6054*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
6055*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
6056*3ac0a46fSAndroid Build Coastguard Worker {
6057*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
6058*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tmp;
6059*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_indix;
6060*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp;
6061*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6062*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * l_mct_data;
6063*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_collections;
6064*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comps;
6065*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_bytes_by_comp;
6066*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_new_mcc = OPJ_FALSE;
6067*3ac0a46fSAndroid Build Coastguard Worker
6068*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
6069*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
6070*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
6071*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
6072*3ac0a46fSAndroid Build Coastguard Worker
6073*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6074*3ac0a46fSAndroid Build Coastguard Worker &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6075*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
6076*3ac0a46fSAndroid Build Coastguard Worker
6077*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 2) {
6078*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6079*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6080*3ac0a46fSAndroid Build Coastguard Worker }
6081*3ac0a46fSAndroid Build Coastguard Worker
6082*3ac0a46fSAndroid Build Coastguard Worker /* first marker */
6083*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 2); /* Zmcc */
6084*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
6085*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp != 0) {
6086*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6087*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge multiple data spanning\n");
6088*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6089*3ac0a46fSAndroid Build Coastguard Worker }
6090*3ac0a46fSAndroid Build Coastguard Worker
6091*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 7) {
6092*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6093*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6094*3ac0a46fSAndroid Build Coastguard Worker }
6095*3ac0a46fSAndroid Build Coastguard Worker
6096*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_indix,
6097*3ac0a46fSAndroid Build Coastguard Worker 1); /* Imcc -> no need for other values, take the first */
6098*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
6099*3ac0a46fSAndroid Build Coastguard Worker
6100*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record = l_tcp->m_mcc_records;
6101*3ac0a46fSAndroid Build Coastguard Worker
6102*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
6103*3ac0a46fSAndroid Build Coastguard Worker if (l_mcc_record->m_index == l_indix) {
6104*3ac0a46fSAndroid Build Coastguard Worker break;
6105*3ac0a46fSAndroid Build Coastguard Worker }
6106*3ac0a46fSAndroid Build Coastguard Worker ++l_mcc_record;
6107*3ac0a46fSAndroid Build Coastguard Worker }
6108*3ac0a46fSAndroid Build Coastguard Worker
6109*3ac0a46fSAndroid Build Coastguard Worker /** NOT FOUND */
6110*3ac0a46fSAndroid Build Coastguard Worker if (i == l_tcp->m_nb_mcc_records) {
6111*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
6112*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t *new_mcc_records;
6113*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
6114*3ac0a46fSAndroid Build Coastguard Worker
6115*3ac0a46fSAndroid Build Coastguard Worker new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
6116*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(
6117*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t));
6118*3ac0a46fSAndroid Build Coastguard Worker if (! new_mcc_records) {
6119*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_tcp->m_mcc_records);
6120*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mcc_records = NULL;
6121*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mcc_records = 0;
6122*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_mcc_records = 0;
6123*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n");
6124*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6125*3ac0a46fSAndroid Build Coastguard Worker }
6126*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mcc_records = new_mcc_records;
6127*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
6128*3ac0a46fSAndroid Build Coastguard Worker memset(l_mcc_record, 0, (l_tcp->m_nb_max_mcc_records - l_tcp->m_nb_mcc_records)
6129*3ac0a46fSAndroid Build Coastguard Worker * sizeof(opj_simple_mcc_decorrelation_data_t));
6130*3ac0a46fSAndroid Build Coastguard Worker }
6131*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
6132*3ac0a46fSAndroid Build Coastguard Worker l_new_mcc = OPJ_TRUE;
6133*3ac0a46fSAndroid Build Coastguard Worker }
6134*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_index = l_indix;
6135*3ac0a46fSAndroid Build Coastguard Worker
6136*3ac0a46fSAndroid Build Coastguard Worker /* only one marker atm */
6137*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 2); /* Ymcc */
6138*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
6139*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp != 0) {
6140*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6141*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge multiple data spanning\n");
6142*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6143*3ac0a46fSAndroid Build Coastguard Worker }
6144*3ac0a46fSAndroid Build Coastguard Worker
6145*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_nb_collections,
6146*3ac0a46fSAndroid Build Coastguard Worker 2); /* Qmcc -> number of collections -> 1 */
6147*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
6148*3ac0a46fSAndroid Build Coastguard Worker
6149*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_collections > 1) {
6150*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6151*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge multiple collections\n");
6152*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6153*3ac0a46fSAndroid Build Coastguard Worker }
6154*3ac0a46fSAndroid Build Coastguard Worker
6155*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= 7;
6156*3ac0a46fSAndroid Build Coastguard Worker
6157*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_collections; ++i) {
6158*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 3) {
6159*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6160*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6161*3ac0a46fSAndroid Build Coastguard Worker }
6162*3ac0a46fSAndroid Build Coastguard Worker
6163*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp,
6164*3ac0a46fSAndroid Build Coastguard Worker 1); /* Xmcci type of component transformation -> array based decorrelation */
6165*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
6166*3ac0a46fSAndroid Build Coastguard Worker
6167*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp != 1) {
6168*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6169*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge collections other than array decorrelation\n");
6170*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6171*3ac0a46fSAndroid Build Coastguard Worker }
6172*3ac0a46fSAndroid Build Coastguard Worker
6173*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_nb_comps, 2);
6174*3ac0a46fSAndroid Build Coastguard Worker
6175*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
6176*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= 3;
6177*3ac0a46fSAndroid Build Coastguard Worker
6178*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
6179*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
6180*3ac0a46fSAndroid Build Coastguard Worker
6181*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
6182*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6183*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6184*3ac0a46fSAndroid Build Coastguard Worker }
6185*3ac0a46fSAndroid Build Coastguard Worker
6186*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
6187*3ac0a46fSAndroid Build Coastguard Worker
6188*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
6189*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp,
6190*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_by_comp); /* Cmccij Component offset*/
6191*3ac0a46fSAndroid Build Coastguard Worker p_header_data += l_nb_bytes_by_comp;
6192*3ac0a46fSAndroid Build Coastguard Worker
6193*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp != j) {
6194*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6195*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge collections with indix shuffle\n");
6196*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6197*3ac0a46fSAndroid Build Coastguard Worker }
6198*3ac0a46fSAndroid Build Coastguard Worker }
6199*3ac0a46fSAndroid Build Coastguard Worker
6200*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_nb_comps, 2);
6201*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
6202*3ac0a46fSAndroid Build Coastguard Worker
6203*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
6204*3ac0a46fSAndroid Build Coastguard Worker l_nb_comps &= 0x7fff;
6205*3ac0a46fSAndroid Build Coastguard Worker
6206*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_comps != l_mcc_record->m_nb_comps) {
6207*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6208*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge collections without same number of indixes\n");
6209*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6210*3ac0a46fSAndroid Build Coastguard Worker }
6211*3ac0a46fSAndroid Build Coastguard Worker
6212*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
6213*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6214*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6215*3ac0a46fSAndroid Build Coastguard Worker }
6216*3ac0a46fSAndroid Build Coastguard Worker
6217*3ac0a46fSAndroid Build Coastguard Worker p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
6218*3ac0a46fSAndroid Build Coastguard Worker
6219*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
6220*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp,
6221*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_by_comp); /* Wmccij Component offset*/
6222*3ac0a46fSAndroid Build Coastguard Worker p_header_data += l_nb_bytes_by_comp;
6223*3ac0a46fSAndroid Build Coastguard Worker
6224*3ac0a46fSAndroid Build Coastguard Worker if (l_tmp != j) {
6225*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6226*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge collections with indix shuffle\n");
6227*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6228*3ac0a46fSAndroid Build Coastguard Worker }
6229*3ac0a46fSAndroid Build Coastguard Worker }
6230*3ac0a46fSAndroid Build Coastguard Worker
6231*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 3); /* Wmccij Component offset*/
6232*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 3;
6233*3ac0a46fSAndroid Build Coastguard Worker
6234*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_is_irreversible = !((l_tmp >> 16) & 1);
6235*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_decorrelation_array = 00;
6236*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_offset_array = 00;
6237*3ac0a46fSAndroid Build Coastguard Worker
6238*3ac0a46fSAndroid Build Coastguard Worker l_indix = l_tmp & 0xff;
6239*3ac0a46fSAndroid Build Coastguard Worker if (l_indix != 0) {
6240*3ac0a46fSAndroid Build Coastguard Worker l_mct_data = l_tcp->m_mct_records;
6241*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6242*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_data->m_index == l_indix) {
6243*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_decorrelation_array = l_mct_data;
6244*3ac0a46fSAndroid Build Coastguard Worker break;
6245*3ac0a46fSAndroid Build Coastguard Worker }
6246*3ac0a46fSAndroid Build Coastguard Worker ++l_mct_data;
6247*3ac0a46fSAndroid Build Coastguard Worker }
6248*3ac0a46fSAndroid Build Coastguard Worker
6249*3ac0a46fSAndroid Build Coastguard Worker if (l_mcc_record->m_decorrelation_array == 00) {
6250*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6251*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6252*3ac0a46fSAndroid Build Coastguard Worker }
6253*3ac0a46fSAndroid Build Coastguard Worker }
6254*3ac0a46fSAndroid Build Coastguard Worker
6255*3ac0a46fSAndroid Build Coastguard Worker l_indix = (l_tmp >> 8) & 0xff;
6256*3ac0a46fSAndroid Build Coastguard Worker if (l_indix != 0) {
6257*3ac0a46fSAndroid Build Coastguard Worker l_mct_data = l_tcp->m_mct_records;
6258*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
6259*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_data->m_index == l_indix) {
6260*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record->m_offset_array = l_mct_data;
6261*3ac0a46fSAndroid Build Coastguard Worker break;
6262*3ac0a46fSAndroid Build Coastguard Worker }
6263*3ac0a46fSAndroid Build Coastguard Worker ++l_mct_data;
6264*3ac0a46fSAndroid Build Coastguard Worker }
6265*3ac0a46fSAndroid Build Coastguard Worker
6266*3ac0a46fSAndroid Build Coastguard Worker if (l_mcc_record->m_offset_array == 00) {
6267*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6268*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6269*3ac0a46fSAndroid Build Coastguard Worker }
6270*3ac0a46fSAndroid Build Coastguard Worker }
6271*3ac0a46fSAndroid Build Coastguard Worker }
6272*3ac0a46fSAndroid Build Coastguard Worker
6273*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != 0) {
6274*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
6275*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6276*3ac0a46fSAndroid Build Coastguard Worker }
6277*3ac0a46fSAndroid Build Coastguard Worker
6278*3ac0a46fSAndroid Build Coastguard Worker if (l_new_mcc) {
6279*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp->m_nb_mcc_records;
6280*3ac0a46fSAndroid Build Coastguard Worker }
6281*3ac0a46fSAndroid Build Coastguard Worker
6282*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6283*3ac0a46fSAndroid Build Coastguard Worker }
6284*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_mco(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)6285*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_mco(opj_j2k_t *p_j2k,
6286*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
6287*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager
6288*3ac0a46fSAndroid Build Coastguard Worker )
6289*3ac0a46fSAndroid Build Coastguard Worker {
6290*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
6291*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_mco_size;
6292*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = 00;
6293*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6294*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
6295*3ac0a46fSAndroid Build Coastguard Worker
6296*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
6297*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
6298*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
6299*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
6300*3ac0a46fSAndroid Build Coastguard Worker
6301*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
6302*3ac0a46fSAndroid Build Coastguard Worker
6303*3ac0a46fSAndroid Build Coastguard Worker l_mco_size = 5 + l_tcp->m_nb_mcc_records;
6304*3ac0a46fSAndroid Build Coastguard Worker if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
6305*3ac0a46fSAndroid Build Coastguard Worker
6306*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
6307*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);
6308*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
6309*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
6310*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
6311*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
6312*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n");
6313*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6314*3ac0a46fSAndroid Build Coastguard Worker }
6315*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
6316*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
6317*3ac0a46fSAndroid Build Coastguard Worker }
6318*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
6319*3ac0a46fSAndroid Build Coastguard Worker
6320*3ac0a46fSAndroid Build Coastguard Worker
6321*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_MCO, 2); /* MCO */
6322*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6323*3ac0a46fSAndroid Build Coastguard Worker
6324*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_mco_size - 2, 2); /* Lmco */
6325*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6326*3ac0a46fSAndroid Build Coastguard Worker
6327*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_tcp->m_nb_mcc_records,
6328*3ac0a46fSAndroid Build Coastguard Worker 1); /* Nmco : only one transform stage*/
6329*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
6330*3ac0a46fSAndroid Build Coastguard Worker
6331*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record = l_tcp->m_mcc_records;
6332*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
6333*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_mcc_record->m_index,
6334*3ac0a46fSAndroid Build Coastguard Worker 1); /* Imco -> use the mcc indicated by 1*/
6335*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
6336*3ac0a46fSAndroid Build Coastguard Worker ++l_mcc_record;
6337*3ac0a46fSAndroid Build Coastguard Worker }
6338*3ac0a46fSAndroid Build Coastguard Worker
6339*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
6340*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size,
6341*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_mco_size) {
6342*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6343*3ac0a46fSAndroid Build Coastguard Worker }
6344*3ac0a46fSAndroid Build Coastguard Worker
6345*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6346*3ac0a46fSAndroid Build Coastguard Worker }
6347*3ac0a46fSAndroid Build Coastguard Worker
6348*3ac0a46fSAndroid Build Coastguard Worker /**
6349*3ac0a46fSAndroid Build Coastguard Worker * Reads a MCO marker (Multiple Component Transform Ordering)
6350*3ac0a46fSAndroid Build Coastguard Worker *
6351*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the MCO box.
6352*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
6353*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the MCO marker.
6354*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
6355*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_mco(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)6356*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_mco(opj_j2k_t *p_j2k,
6357*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
6358*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
6359*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
6360*3ac0a46fSAndroid Build Coastguard Worker )
6361*3ac0a46fSAndroid Build Coastguard Worker {
6362*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tmp, i;
6363*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_stages;
6364*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp;
6365*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t * l_tccp;
6366*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image;
6367*3ac0a46fSAndroid Build Coastguard Worker
6368*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
6369*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
6370*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
6371*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
6372*3ac0a46fSAndroid Build Coastguard Worker
6373*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
6374*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
6375*3ac0a46fSAndroid Build Coastguard Worker &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
6376*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
6377*3ac0a46fSAndroid Build Coastguard Worker
6378*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size < 1) {
6379*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
6380*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6381*3ac0a46fSAndroid Build Coastguard Worker }
6382*3ac0a46fSAndroid Build Coastguard Worker
6383*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_nb_stages,
6384*3ac0a46fSAndroid Build Coastguard Worker 1); /* Nmco : only one transform stage*/
6385*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
6386*3ac0a46fSAndroid Build Coastguard Worker
6387*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_stages > 1) {
6388*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6389*3ac0a46fSAndroid Build Coastguard Worker "Cannot take in charge multiple transformation stages.\n");
6390*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6391*3ac0a46fSAndroid Build Coastguard Worker }
6392*3ac0a46fSAndroid Build Coastguard Worker
6393*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != l_nb_stages + 1) {
6394*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
6395*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6396*3ac0a46fSAndroid Build Coastguard Worker }
6397*3ac0a46fSAndroid Build Coastguard Worker
6398*3ac0a46fSAndroid Build Coastguard Worker l_tccp = l_tcp->tccps;
6399*3ac0a46fSAndroid Build Coastguard Worker
6400*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image->numcomps; ++i) {
6401*3ac0a46fSAndroid Build Coastguard Worker l_tccp->m_dc_level_shift = 0;
6402*3ac0a46fSAndroid Build Coastguard Worker ++l_tccp;
6403*3ac0a46fSAndroid Build Coastguard Worker }
6404*3ac0a46fSAndroid Build Coastguard Worker
6405*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->m_mct_decoding_matrix) {
6406*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_tcp->m_mct_decoding_matrix);
6407*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_decoding_matrix = 00;
6408*3ac0a46fSAndroid Build Coastguard Worker }
6409*3ac0a46fSAndroid Build Coastguard Worker
6410*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_stages; ++i) {
6411*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_tmp, 1);
6412*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
6413*3ac0a46fSAndroid Build Coastguard Worker
6414*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_add_mct(l_tcp, p_j2k->m_private_image, l_tmp)) {
6415*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6416*3ac0a46fSAndroid Build Coastguard Worker }
6417*3ac0a46fSAndroid Build Coastguard Worker }
6418*3ac0a46fSAndroid Build Coastguard Worker
6419*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6420*3ac0a46fSAndroid Build Coastguard Worker }
6421*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_add_mct(opj_tcp_t * p_tcp,opj_image_t * p_image,OPJ_UINT32 p_index)6422*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
6423*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_index)
6424*3ac0a46fSAndroid Build Coastguard Worker {
6425*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
6426*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t * l_mcc_record;
6427*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * l_deco_array, * l_offset_array;
6428*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_data_size, l_mct_size, l_offset_size;
6429*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_elem;
6430*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * l_offset_data, * l_current_offset_data;
6431*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t * l_tccp;
6432*3ac0a46fSAndroid Build Coastguard Worker
6433*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
6434*3ac0a46fSAndroid Build Coastguard Worker assert(p_tcp != 00);
6435*3ac0a46fSAndroid Build Coastguard Worker
6436*3ac0a46fSAndroid Build Coastguard Worker l_mcc_record = p_tcp->m_mcc_records;
6437*3ac0a46fSAndroid Build Coastguard Worker
6438*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_tcp->m_nb_mcc_records; ++i) {
6439*3ac0a46fSAndroid Build Coastguard Worker if (l_mcc_record->m_index == p_index) {
6440*3ac0a46fSAndroid Build Coastguard Worker break;
6441*3ac0a46fSAndroid Build Coastguard Worker }
6442*3ac0a46fSAndroid Build Coastguard Worker }
6443*3ac0a46fSAndroid Build Coastguard Worker
6444*3ac0a46fSAndroid Build Coastguard Worker if (i == p_tcp->m_nb_mcc_records) {
6445*3ac0a46fSAndroid Build Coastguard Worker /** element discarded **/
6446*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6447*3ac0a46fSAndroid Build Coastguard Worker }
6448*3ac0a46fSAndroid Build Coastguard Worker
6449*3ac0a46fSAndroid Build Coastguard Worker if (l_mcc_record->m_nb_comps != p_image->numcomps) {
6450*3ac0a46fSAndroid Build Coastguard Worker /** do not support number of comps != image */
6451*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6452*3ac0a46fSAndroid Build Coastguard Worker }
6453*3ac0a46fSAndroid Build Coastguard Worker
6454*3ac0a46fSAndroid Build Coastguard Worker l_deco_array = l_mcc_record->m_decorrelation_array;
6455*3ac0a46fSAndroid Build Coastguard Worker
6456*3ac0a46fSAndroid Build Coastguard Worker if (l_deco_array) {
6457*3ac0a46fSAndroid Build Coastguard Worker l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps
6458*3ac0a46fSAndroid Build Coastguard Worker * p_image->numcomps;
6459*3ac0a46fSAndroid Build Coastguard Worker if (l_deco_array->m_data_size != l_data_size || ! l_deco_array->m_data) {
6460*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6461*3ac0a46fSAndroid Build Coastguard Worker }
6462*3ac0a46fSAndroid Build Coastguard Worker
6463*3ac0a46fSAndroid Build Coastguard Worker l_nb_elem = p_image->numcomps * p_image->numcomps;
6464*3ac0a46fSAndroid Build Coastguard Worker l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
6465*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
6466*3ac0a46fSAndroid Build Coastguard Worker
6467*3ac0a46fSAndroid Build Coastguard Worker if (! p_tcp->m_mct_decoding_matrix) {
6468*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6469*3ac0a46fSAndroid Build Coastguard Worker }
6470*3ac0a46fSAndroid Build Coastguard Worker
6471*3ac0a46fSAndroid Build Coastguard Worker j2k_mct_read_functions_to_float[l_deco_array->m_element_type](
6472*3ac0a46fSAndroid Build Coastguard Worker l_deco_array->m_data, p_tcp->m_mct_decoding_matrix, l_nb_elem);
6473*3ac0a46fSAndroid Build Coastguard Worker }
6474*3ac0a46fSAndroid Build Coastguard Worker
6475*3ac0a46fSAndroid Build Coastguard Worker l_offset_array = l_mcc_record->m_offset_array;
6476*3ac0a46fSAndroid Build Coastguard Worker
6477*3ac0a46fSAndroid Build Coastguard Worker if (l_offset_array) {
6478*3ac0a46fSAndroid Build Coastguard Worker l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] *
6479*3ac0a46fSAndroid Build Coastguard Worker p_image->numcomps;
6480*3ac0a46fSAndroid Build Coastguard Worker if (l_offset_array->m_data_size != l_data_size || ! l_offset_array->m_data) {
6481*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6482*3ac0a46fSAndroid Build Coastguard Worker }
6483*3ac0a46fSAndroid Build Coastguard Worker
6484*3ac0a46fSAndroid Build Coastguard Worker l_nb_elem = p_image->numcomps;
6485*3ac0a46fSAndroid Build Coastguard Worker l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
6486*3ac0a46fSAndroid Build Coastguard Worker l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
6487*3ac0a46fSAndroid Build Coastguard Worker
6488*3ac0a46fSAndroid Build Coastguard Worker if (! l_offset_data) {
6489*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6490*3ac0a46fSAndroid Build Coastguard Worker }
6491*3ac0a46fSAndroid Build Coastguard Worker
6492*3ac0a46fSAndroid Build Coastguard Worker j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](
6493*3ac0a46fSAndroid Build Coastguard Worker l_offset_array->m_data, l_offset_data, l_nb_elem);
6494*3ac0a46fSAndroid Build Coastguard Worker
6495*3ac0a46fSAndroid Build Coastguard Worker l_tccp = p_tcp->tccps;
6496*3ac0a46fSAndroid Build Coastguard Worker l_current_offset_data = l_offset_data;
6497*3ac0a46fSAndroid Build Coastguard Worker
6498*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_image->numcomps; ++i) {
6499*3ac0a46fSAndroid Build Coastguard Worker l_tccp->m_dc_level_shift = (OPJ_INT32) * (l_current_offset_data++);
6500*3ac0a46fSAndroid Build Coastguard Worker ++l_tccp;
6501*3ac0a46fSAndroid Build Coastguard Worker }
6502*3ac0a46fSAndroid Build Coastguard Worker
6503*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_offset_data);
6504*3ac0a46fSAndroid Build Coastguard Worker }
6505*3ac0a46fSAndroid Build Coastguard Worker
6506*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6507*3ac0a46fSAndroid Build Coastguard Worker }
6508*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_cbd(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)6509*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
6510*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
6511*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
6512*3ac0a46fSAndroid Build Coastguard Worker {
6513*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
6514*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_cbd_size;
6515*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
6516*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *l_image = 00;
6517*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_comp = 00;
6518*3ac0a46fSAndroid Build Coastguard Worker
6519*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
6520*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
6521*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
6522*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
6523*3ac0a46fSAndroid Build Coastguard Worker
6524*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
6525*3ac0a46fSAndroid Build Coastguard Worker l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
6526*3ac0a46fSAndroid Build Coastguard Worker
6527*3ac0a46fSAndroid Build Coastguard Worker if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
6528*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
6529*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
6530*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_tile_data) {
6531*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
6532*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
6533*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
6534*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
6535*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6536*3ac0a46fSAndroid Build Coastguard Worker }
6537*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
6538*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
6539*3ac0a46fSAndroid Build Coastguard Worker }
6540*3ac0a46fSAndroid Build Coastguard Worker
6541*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
6542*3ac0a46fSAndroid Build Coastguard Worker
6543*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, J2K_MS_CBD, 2); /* CBD */
6544*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6545*3ac0a46fSAndroid Build Coastguard Worker
6546*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_cbd_size - 2, 2); /* L_CBD */
6547*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6548*3ac0a46fSAndroid Build Coastguard Worker
6549*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, l_image->numcomps, 2); /* Ncbd */
6550*3ac0a46fSAndroid Build Coastguard Worker l_current_data += 2;
6551*3ac0a46fSAndroid Build Coastguard Worker
6552*3ac0a46fSAndroid Build Coastguard Worker l_comp = l_image->comps;
6553*3ac0a46fSAndroid Build Coastguard Worker
6554*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image->numcomps; ++i) {
6555*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1),
6556*3ac0a46fSAndroid Build Coastguard Worker 1); /* Component bit depth */
6557*3ac0a46fSAndroid Build Coastguard Worker ++l_current_data;
6558*3ac0a46fSAndroid Build Coastguard Worker
6559*3ac0a46fSAndroid Build Coastguard Worker ++l_comp;
6560*3ac0a46fSAndroid Build Coastguard Worker }
6561*3ac0a46fSAndroid Build Coastguard Worker
6562*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
6563*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size,
6564*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_cbd_size) {
6565*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6566*3ac0a46fSAndroid Build Coastguard Worker }
6567*3ac0a46fSAndroid Build Coastguard Worker
6568*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6569*3ac0a46fSAndroid Build Coastguard Worker }
6570*3ac0a46fSAndroid Build Coastguard Worker
6571*3ac0a46fSAndroid Build Coastguard Worker /**
6572*3ac0a46fSAndroid Build Coastguard Worker * Reads a CBD marker (Component bit depth definition)
6573*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the CBD box.
6574*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
6575*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the CBD marker.
6576*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
6577*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_cbd(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)6578*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
6579*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
6580*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
6581*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
6582*3ac0a46fSAndroid Build Coastguard Worker )
6583*3ac0a46fSAndroid Build Coastguard Worker {
6584*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comp, l_num_comp;
6585*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_comp_def;
6586*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
6587*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_comp = 00;
6588*3ac0a46fSAndroid Build Coastguard Worker
6589*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
6590*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
6591*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
6592*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
6593*3ac0a46fSAndroid Build Coastguard Worker
6594*3ac0a46fSAndroid Build Coastguard Worker l_num_comp = p_j2k->m_private_image->numcomps;
6595*3ac0a46fSAndroid Build Coastguard Worker
6596*3ac0a46fSAndroid Build Coastguard Worker if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
6597*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6598*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6599*3ac0a46fSAndroid Build Coastguard Worker }
6600*3ac0a46fSAndroid Build Coastguard Worker
6601*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_nb_comp,
6602*3ac0a46fSAndroid Build Coastguard Worker 2); /* Ncbd */
6603*3ac0a46fSAndroid Build Coastguard Worker p_header_data += 2;
6604*3ac0a46fSAndroid Build Coastguard Worker
6605*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_comp != l_num_comp) {
6606*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
6607*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6608*3ac0a46fSAndroid Build Coastguard Worker }
6609*3ac0a46fSAndroid Build Coastguard Worker
6610*3ac0a46fSAndroid Build Coastguard Worker l_comp = p_j2k->m_private_image->comps;
6611*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_num_comp; ++i) {
6612*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_header_data, &l_comp_def,
6613*3ac0a46fSAndroid Build Coastguard Worker 1); /* Component bit depth */
6614*3ac0a46fSAndroid Build Coastguard Worker ++p_header_data;
6615*3ac0a46fSAndroid Build Coastguard Worker l_comp->sgnd = (l_comp_def >> 7) & 1;
6616*3ac0a46fSAndroid Build Coastguard Worker l_comp->prec = (l_comp_def & 0x7f) + 1;
6617*3ac0a46fSAndroid Build Coastguard Worker
6618*3ac0a46fSAndroid Build Coastguard Worker if (l_comp->prec > 31) {
6619*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
6620*3ac0a46fSAndroid Build Coastguard Worker "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm. OpenJpeg only supports up to 31)\n",
6621*3ac0a46fSAndroid Build Coastguard Worker i, l_comp->prec);
6622*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6623*3ac0a46fSAndroid Build Coastguard Worker }
6624*3ac0a46fSAndroid Build Coastguard Worker ++l_comp;
6625*3ac0a46fSAndroid Build Coastguard Worker }
6626*3ac0a46fSAndroid Build Coastguard Worker
6627*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6628*3ac0a46fSAndroid Build Coastguard Worker }
6629*3ac0a46fSAndroid Build Coastguard Worker
6630*3ac0a46fSAndroid Build Coastguard Worker /**
6631*3ac0a46fSAndroid Build Coastguard Worker * Reads a CAP marker (extended capabilities definition). Empty implementation.
6632*3ac0a46fSAndroid Build Coastguard Worker * Found in HTJ2K files.
6633*3ac0a46fSAndroid Build Coastguard Worker *
6634*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the CAP box.
6635*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
6636*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the CAP marker.
6637*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
6638*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_cap(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)6639*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_cap(opj_j2k_t *p_j2k,
6640*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
6641*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
6642*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
6643*3ac0a46fSAndroid Build Coastguard Worker )
6644*3ac0a46fSAndroid Build Coastguard Worker {
6645*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
6646*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
6647*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
6648*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
6649*3ac0a46fSAndroid Build Coastguard Worker
6650*3ac0a46fSAndroid Build Coastguard Worker (void)p_j2k;
6651*3ac0a46fSAndroid Build Coastguard Worker (void)p_header_data;
6652*3ac0a46fSAndroid Build Coastguard Worker (void)p_header_size;
6653*3ac0a46fSAndroid Build Coastguard Worker (void)p_manager;
6654*3ac0a46fSAndroid Build Coastguard Worker
6655*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6656*3ac0a46fSAndroid Build Coastguard Worker }
6657*3ac0a46fSAndroid Build Coastguard Worker
6658*3ac0a46fSAndroid Build Coastguard Worker /**
6659*3ac0a46fSAndroid Build Coastguard Worker * Reads a CPF marker (corresponding profile). Empty implementation. Found in HTJ2K files
6660*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_data the data contained in the CPF box.
6661*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k the jpeg2000 codec.
6662*3ac0a46fSAndroid Build Coastguard Worker * @param p_header_size the size of the data contained in the CPF marker.
6663*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
6664*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_read_cpf(opj_j2k_t * p_j2k,OPJ_BYTE * p_header_data,OPJ_UINT32 p_header_size,opj_event_mgr_t * p_manager)6665*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_cpf(opj_j2k_t *p_j2k,
6666*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
6667*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_header_size,
6668*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
6669*3ac0a46fSAndroid Build Coastguard Worker )
6670*3ac0a46fSAndroid Build Coastguard Worker {
6671*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
6672*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
6673*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
6674*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
6675*3ac0a46fSAndroid Build Coastguard Worker
6676*3ac0a46fSAndroid Build Coastguard Worker (void)p_j2k;
6677*3ac0a46fSAndroid Build Coastguard Worker (void)p_header_data;
6678*3ac0a46fSAndroid Build Coastguard Worker (void)p_header_size;
6679*3ac0a46fSAndroid Build Coastguard Worker (void)p_manager;
6680*3ac0a46fSAndroid Build Coastguard Worker
6681*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6682*3ac0a46fSAndroid Build Coastguard Worker }
6683*3ac0a46fSAndroid Build Coastguard Worker
6684*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
6685*3ac0a46fSAndroid Build Coastguard Worker /* J2K / JPT decoder interface */
6686*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
6687*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_setup_decoder(void * p_j2k,opj_dparameters_t * parameters)6688*3ac0a46fSAndroid Build Coastguard Worker void opj_j2k_setup_decoder(void *p_j2k, opj_dparameters_t *parameters)
6689*3ac0a46fSAndroid Build Coastguard Worker {
6690*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* j2k = (opj_j2k_t*)p_j2k;
6691*3ac0a46fSAndroid Build Coastguard Worker if (j2k && parameters) {
6692*3ac0a46fSAndroid Build Coastguard Worker j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
6693*3ac0a46fSAndroid Build Coastguard Worker j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
6694*3ac0a46fSAndroid Build Coastguard Worker
6695*3ac0a46fSAndroid Build Coastguard Worker j2k->dump_state = (parameters->flags & OPJ_DPARAMETERS_DUMP_FLAG);
6696*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
6697*3ac0a46fSAndroid Build Coastguard Worker j2k->m_cp.correct = parameters->jpwl_correct;
6698*3ac0a46fSAndroid Build Coastguard Worker j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
6699*3ac0a46fSAndroid Build Coastguard Worker j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
6700*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
6701*3ac0a46fSAndroid Build Coastguard Worker }
6702*3ac0a46fSAndroid Build Coastguard Worker }
6703*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_decoder_set_strict_mode(void * p_j2k,OPJ_BOOL strict)6704*3ac0a46fSAndroid Build Coastguard Worker void opj_j2k_decoder_set_strict_mode(void *p_j2k, OPJ_BOOL strict)
6705*3ac0a46fSAndroid Build Coastguard Worker {
6706*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* j2k = (opj_j2k_t*)p_j2k;
6707*3ac0a46fSAndroid Build Coastguard Worker if (j2k) {
6708*3ac0a46fSAndroid Build Coastguard Worker j2k->m_cp.strict = strict;
6709*3ac0a46fSAndroid Build Coastguard Worker }
6710*3ac0a46fSAndroid Build Coastguard Worker }
6711*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_set_threads(void * p_j2k,OPJ_UINT32 num_threads)6712*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_set_threads(void *p_j2k, OPJ_UINT32 num_threads)
6713*3ac0a46fSAndroid Build Coastguard Worker {
6714*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* j2k = (opj_j2k_t*)p_j2k;
6715*3ac0a46fSAndroid Build Coastguard Worker /* Currently we pass the thread-pool to the tcd, so we cannot re-set it */
6716*3ac0a46fSAndroid Build Coastguard Worker /* afterwards */
6717*3ac0a46fSAndroid Build Coastguard Worker if (opj_has_thread_support() && j2k->m_tcd == NULL) {
6718*3ac0a46fSAndroid Build Coastguard Worker opj_thread_pool_destroy(j2k->m_tp);
6719*3ac0a46fSAndroid Build Coastguard Worker j2k->m_tp = NULL;
6720*3ac0a46fSAndroid Build Coastguard Worker if (num_threads <= (OPJ_UINT32)INT_MAX) {
6721*3ac0a46fSAndroid Build Coastguard Worker j2k->m_tp = opj_thread_pool_create((int)num_threads);
6722*3ac0a46fSAndroid Build Coastguard Worker }
6723*3ac0a46fSAndroid Build Coastguard Worker if (j2k->m_tp == NULL) {
6724*3ac0a46fSAndroid Build Coastguard Worker j2k->m_tp = opj_thread_pool_create(0);
6725*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6726*3ac0a46fSAndroid Build Coastguard Worker }
6727*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
6728*3ac0a46fSAndroid Build Coastguard Worker }
6729*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6730*3ac0a46fSAndroid Build Coastguard Worker }
6731*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_default_thread_count()6732*3ac0a46fSAndroid Build Coastguard Worker static int opj_j2k_get_default_thread_count()
6733*3ac0a46fSAndroid Build Coastguard Worker {
6734*3ac0a46fSAndroid Build Coastguard Worker const char* num_threads_str = getenv("OPJ_NUM_THREADS");
6735*3ac0a46fSAndroid Build Coastguard Worker int num_cpus;
6736*3ac0a46fSAndroid Build Coastguard Worker int num_threads;
6737*3ac0a46fSAndroid Build Coastguard Worker
6738*3ac0a46fSAndroid Build Coastguard Worker if (num_threads_str == NULL || !opj_has_thread_support()) {
6739*3ac0a46fSAndroid Build Coastguard Worker return 0;
6740*3ac0a46fSAndroid Build Coastguard Worker }
6741*3ac0a46fSAndroid Build Coastguard Worker num_cpus = opj_get_num_cpus();
6742*3ac0a46fSAndroid Build Coastguard Worker if (strcmp(num_threads_str, "ALL_CPUS") == 0) {
6743*3ac0a46fSAndroid Build Coastguard Worker return num_cpus;
6744*3ac0a46fSAndroid Build Coastguard Worker }
6745*3ac0a46fSAndroid Build Coastguard Worker if (num_cpus == 0) {
6746*3ac0a46fSAndroid Build Coastguard Worker num_cpus = 32;
6747*3ac0a46fSAndroid Build Coastguard Worker }
6748*3ac0a46fSAndroid Build Coastguard Worker num_threads = atoi(num_threads_str);
6749*3ac0a46fSAndroid Build Coastguard Worker if (num_threads < 0) {
6750*3ac0a46fSAndroid Build Coastguard Worker num_threads = 0;
6751*3ac0a46fSAndroid Build Coastguard Worker } else if (num_threads > 2 * num_cpus) {
6752*3ac0a46fSAndroid Build Coastguard Worker num_threads = 2 * num_cpus;
6753*3ac0a46fSAndroid Build Coastguard Worker }
6754*3ac0a46fSAndroid Build Coastguard Worker return num_threads;
6755*3ac0a46fSAndroid Build Coastguard Worker }
6756*3ac0a46fSAndroid Build Coastguard Worker
6757*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
6758*3ac0a46fSAndroid Build Coastguard Worker /* J2K encoder interface */
6759*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
6760*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_create_compress(void)6761*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* opj_j2k_create_compress(void)
6762*3ac0a46fSAndroid Build Coastguard Worker {
6763*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
6764*3ac0a46fSAndroid Build Coastguard Worker if (!l_j2k) {
6765*3ac0a46fSAndroid Build Coastguard Worker return NULL;
6766*3ac0a46fSAndroid Build Coastguard Worker }
6767*3ac0a46fSAndroid Build Coastguard Worker
6768*3ac0a46fSAndroid Build Coastguard Worker
6769*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_is_decoder = 0;
6770*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_cp.m_is_decoder = 0;
6771*3ac0a46fSAndroid Build Coastguard Worker
6772*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(
6773*3ac0a46fSAndroid Build Coastguard Worker OPJ_J2K_DEFAULT_HEADER_SIZE);
6774*3ac0a46fSAndroid Build Coastguard Worker if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
6775*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
6776*3ac0a46fSAndroid Build Coastguard Worker return NULL;
6777*3ac0a46fSAndroid Build Coastguard Worker }
6778*3ac0a46fSAndroid Build Coastguard Worker
6779*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_specific_param.m_encoder.m_header_tile_data_size =
6780*3ac0a46fSAndroid Build Coastguard Worker OPJ_J2K_DEFAULT_HEADER_SIZE;
6781*3ac0a46fSAndroid Build Coastguard Worker
6782*3ac0a46fSAndroid Build Coastguard Worker /* validation list creation*/
6783*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_validation_list = opj_procedure_list_create();
6784*3ac0a46fSAndroid Build Coastguard Worker if (! l_j2k->m_validation_list) {
6785*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
6786*3ac0a46fSAndroid Build Coastguard Worker return NULL;
6787*3ac0a46fSAndroid Build Coastguard Worker }
6788*3ac0a46fSAndroid Build Coastguard Worker
6789*3ac0a46fSAndroid Build Coastguard Worker /* execution list creation*/
6790*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_procedure_list = opj_procedure_list_create();
6791*3ac0a46fSAndroid Build Coastguard Worker if (! l_j2k->m_procedure_list) {
6792*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
6793*3ac0a46fSAndroid Build Coastguard Worker return NULL;
6794*3ac0a46fSAndroid Build Coastguard Worker }
6795*3ac0a46fSAndroid Build Coastguard Worker
6796*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
6797*3ac0a46fSAndroid Build Coastguard Worker if (!l_j2k->m_tp) {
6798*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_tp = opj_thread_pool_create(0);
6799*3ac0a46fSAndroid Build Coastguard Worker }
6800*3ac0a46fSAndroid Build Coastguard Worker if (!l_j2k->m_tp) {
6801*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
6802*3ac0a46fSAndroid Build Coastguard Worker return NULL;
6803*3ac0a46fSAndroid Build Coastguard Worker }
6804*3ac0a46fSAndroid Build Coastguard Worker
6805*3ac0a46fSAndroid Build Coastguard Worker return l_j2k;
6806*3ac0a46fSAndroid Build Coastguard Worker }
6807*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_initialise_4K_poc(opj_poc_t * POC,int numres)6808*3ac0a46fSAndroid Build Coastguard Worker static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres)
6809*3ac0a46fSAndroid Build Coastguard Worker {
6810*3ac0a46fSAndroid Build Coastguard Worker POC[0].tile = 1;
6811*3ac0a46fSAndroid Build Coastguard Worker POC[0].resno0 = 0;
6812*3ac0a46fSAndroid Build Coastguard Worker POC[0].compno0 = 0;
6813*3ac0a46fSAndroid Build Coastguard Worker POC[0].layno1 = 1;
6814*3ac0a46fSAndroid Build Coastguard Worker POC[0].resno1 = (OPJ_UINT32)(numres - 1);
6815*3ac0a46fSAndroid Build Coastguard Worker POC[0].compno1 = 3;
6816*3ac0a46fSAndroid Build Coastguard Worker POC[0].prg1 = OPJ_CPRL;
6817*3ac0a46fSAndroid Build Coastguard Worker POC[1].tile = 1;
6818*3ac0a46fSAndroid Build Coastguard Worker POC[1].resno0 = (OPJ_UINT32)(numres - 1);
6819*3ac0a46fSAndroid Build Coastguard Worker POC[1].compno0 = 0;
6820*3ac0a46fSAndroid Build Coastguard Worker POC[1].layno1 = 1;
6821*3ac0a46fSAndroid Build Coastguard Worker POC[1].resno1 = (OPJ_UINT32)numres;
6822*3ac0a46fSAndroid Build Coastguard Worker POC[1].compno1 = 3;
6823*3ac0a46fSAndroid Build Coastguard Worker POC[1].prg1 = OPJ_CPRL;
6824*3ac0a46fSAndroid Build Coastguard Worker return 2;
6825*3ac0a46fSAndroid Build Coastguard Worker }
6826*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_set_cinema_parameters(opj_cparameters_t * parameters,opj_image_t * image,opj_event_mgr_t * p_manager)6827*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
6828*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image, opj_event_mgr_t *p_manager)
6829*3ac0a46fSAndroid Build Coastguard Worker {
6830*3ac0a46fSAndroid Build Coastguard Worker /* Configure cinema parameters */
6831*3ac0a46fSAndroid Build Coastguard Worker int i;
6832*3ac0a46fSAndroid Build Coastguard Worker
6833*3ac0a46fSAndroid Build Coastguard Worker /* No tiling */
6834*3ac0a46fSAndroid Build Coastguard Worker parameters->tile_size_on = OPJ_FALSE;
6835*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdx = 1;
6836*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdy = 1;
6837*3ac0a46fSAndroid Build Coastguard Worker
6838*3ac0a46fSAndroid Build Coastguard Worker /* One tile part for each component */
6839*3ac0a46fSAndroid Build Coastguard Worker parameters->tp_flag = 'C';
6840*3ac0a46fSAndroid Build Coastguard Worker parameters->tp_on = 1;
6841*3ac0a46fSAndroid Build Coastguard Worker
6842*3ac0a46fSAndroid Build Coastguard Worker /* Tile and Image shall be at (0,0) */
6843*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tx0 = 0;
6844*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_ty0 = 0;
6845*3ac0a46fSAndroid Build Coastguard Worker parameters->image_offset_x0 = 0;
6846*3ac0a46fSAndroid Build Coastguard Worker parameters->image_offset_y0 = 0;
6847*3ac0a46fSAndroid Build Coastguard Worker
6848*3ac0a46fSAndroid Build Coastguard Worker /* Codeblock size= 32*32 */
6849*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockw_init = 32;
6850*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockh_init = 32;
6851*3ac0a46fSAndroid Build Coastguard Worker
6852*3ac0a46fSAndroid Build Coastguard Worker /* Codeblock style: no mode switch enabled */
6853*3ac0a46fSAndroid Build Coastguard Worker parameters->mode = 0;
6854*3ac0a46fSAndroid Build Coastguard Worker
6855*3ac0a46fSAndroid Build Coastguard Worker /* No ROI */
6856*3ac0a46fSAndroid Build Coastguard Worker parameters->roi_compno = -1;
6857*3ac0a46fSAndroid Build Coastguard Worker
6858*3ac0a46fSAndroid Build Coastguard Worker /* No subsampling */
6859*3ac0a46fSAndroid Build Coastguard Worker parameters->subsampling_dx = 1;
6860*3ac0a46fSAndroid Build Coastguard Worker parameters->subsampling_dy = 1;
6861*3ac0a46fSAndroid Build Coastguard Worker
6862*3ac0a46fSAndroid Build Coastguard Worker /* 9-7 transform */
6863*3ac0a46fSAndroid Build Coastguard Worker parameters->irreversible = 1;
6864*3ac0a46fSAndroid Build Coastguard Worker
6865*3ac0a46fSAndroid Build Coastguard Worker /* Number of layers */
6866*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tcp_numlayers > 1) {
6867*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6868*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6869*3ac0a46fSAndroid Build Coastguard Worker "1 single quality layer"
6870*3ac0a46fSAndroid Build Coastguard Worker "-> Number of layers forced to 1 (rather than %d)\n"
6871*3ac0a46fSAndroid Build Coastguard Worker "-> Rate of the last layer (%3.1f) will be used",
6872*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_numlayers,
6873*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_rates[parameters->tcp_numlayers - 1]);
6874*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_rates[0] = parameters->tcp_rates[parameters->tcp_numlayers - 1];
6875*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_numlayers = 1;
6876*3ac0a46fSAndroid Build Coastguard Worker }
6877*3ac0a46fSAndroid Build Coastguard Worker
6878*3ac0a46fSAndroid Build Coastguard Worker /* Resolution levels */
6879*3ac0a46fSAndroid Build Coastguard Worker switch (parameters->rsiz) {
6880*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_CINEMA_2K:
6881*3ac0a46fSAndroid Build Coastguard Worker if (parameters->numresolution > 6) {
6882*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6883*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6884*3ac0a46fSAndroid Build Coastguard Worker "Number of decomposition levels <= 5\n"
6885*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels forced to 5 (rather than %d)\n",
6886*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution + 1);
6887*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution = 6;
6888*3ac0a46fSAndroid Build Coastguard Worker }
6889*3ac0a46fSAndroid Build Coastguard Worker break;
6890*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_CINEMA_4K:
6891*3ac0a46fSAndroid Build Coastguard Worker if (parameters->numresolution < 2) {
6892*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6893*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6894*3ac0a46fSAndroid Build Coastguard Worker "Number of decomposition levels >= 1 && <= 6\n"
6895*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels forced to 1 (rather than %d)\n",
6896*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution + 1);
6897*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution = 1;
6898*3ac0a46fSAndroid Build Coastguard Worker } else if (parameters->numresolution > 7) {
6899*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6900*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
6901*3ac0a46fSAndroid Build Coastguard Worker "Number of decomposition levels >= 1 && <= 6\n"
6902*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels forced to 6 (rather than %d)\n",
6903*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution + 1);
6904*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution = 7;
6905*3ac0a46fSAndroid Build Coastguard Worker }
6906*3ac0a46fSAndroid Build Coastguard Worker break;
6907*3ac0a46fSAndroid Build Coastguard Worker default :
6908*3ac0a46fSAndroid Build Coastguard Worker break;
6909*3ac0a46fSAndroid Build Coastguard Worker }
6910*3ac0a46fSAndroid Build Coastguard Worker
6911*3ac0a46fSAndroid Build Coastguard Worker /* Precincts */
6912*3ac0a46fSAndroid Build Coastguard Worker parameters->csty |= J2K_CP_CSTY_PRT;
6913*3ac0a46fSAndroid Build Coastguard Worker if (parameters->numresolution == 1) {
6914*3ac0a46fSAndroid Build Coastguard Worker parameters->res_spec = 1;
6915*3ac0a46fSAndroid Build Coastguard Worker parameters->prcw_init[0] = 128;
6916*3ac0a46fSAndroid Build Coastguard Worker parameters->prch_init[0] = 128;
6917*3ac0a46fSAndroid Build Coastguard Worker } else {
6918*3ac0a46fSAndroid Build Coastguard Worker parameters->res_spec = parameters->numresolution - 1;
6919*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < parameters->res_spec; i++) {
6920*3ac0a46fSAndroid Build Coastguard Worker parameters->prcw_init[i] = 256;
6921*3ac0a46fSAndroid Build Coastguard Worker parameters->prch_init[i] = 256;
6922*3ac0a46fSAndroid Build Coastguard Worker }
6923*3ac0a46fSAndroid Build Coastguard Worker }
6924*3ac0a46fSAndroid Build Coastguard Worker
6925*3ac0a46fSAndroid Build Coastguard Worker /* The progression order shall be CPRL */
6926*3ac0a46fSAndroid Build Coastguard Worker parameters->prog_order = OPJ_CPRL;
6927*3ac0a46fSAndroid Build Coastguard Worker
6928*3ac0a46fSAndroid Build Coastguard Worker /* Progression order changes for 4K, disallowed for 2K */
6929*3ac0a46fSAndroid Build Coastguard Worker if (parameters->rsiz == OPJ_PROFILE_CINEMA_4K) {
6930*3ac0a46fSAndroid Build Coastguard Worker parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,
6931*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution);
6932*3ac0a46fSAndroid Build Coastguard Worker } else {
6933*3ac0a46fSAndroid Build Coastguard Worker parameters->numpocs = 0;
6934*3ac0a46fSAndroid Build Coastguard Worker }
6935*3ac0a46fSAndroid Build Coastguard Worker
6936*3ac0a46fSAndroid Build Coastguard Worker /* Limited bit-rate */
6937*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_disto_alloc = 1;
6938*3ac0a46fSAndroid Build Coastguard Worker if (parameters->max_cs_size <= 0) {
6939*3ac0a46fSAndroid Build Coastguard Worker /* No rate has been introduced, 24 fps is assumed */
6940*3ac0a46fSAndroid Build Coastguard Worker parameters->max_cs_size = OPJ_CINEMA_24_CS;
6941*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6942*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6943*3ac0a46fSAndroid Build Coastguard Worker "Maximum 1302083 compressed bytes @ 24fps\n"
6944*3ac0a46fSAndroid Build Coastguard Worker "As no rate has been given, this limit will be used.\n");
6945*3ac0a46fSAndroid Build Coastguard Worker } else if (parameters->max_cs_size > OPJ_CINEMA_24_CS) {
6946*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6947*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6948*3ac0a46fSAndroid Build Coastguard Worker "Maximum 1302083 compressed bytes @ 24fps\n"
6949*3ac0a46fSAndroid Build Coastguard Worker "-> Specified rate exceeds this limit. Rate will be forced to 1302083 bytes.\n");
6950*3ac0a46fSAndroid Build Coastguard Worker parameters->max_cs_size = OPJ_CINEMA_24_CS;
6951*3ac0a46fSAndroid Build Coastguard Worker }
6952*3ac0a46fSAndroid Build Coastguard Worker
6953*3ac0a46fSAndroid Build Coastguard Worker if (parameters->max_comp_size <= 0) {
6954*3ac0a46fSAndroid Build Coastguard Worker /* No rate has been introduced, 24 fps is assumed */
6955*3ac0a46fSAndroid Build Coastguard Worker parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6956*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6957*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6958*3ac0a46fSAndroid Build Coastguard Worker "Maximum 1041666 compressed bytes @ 24fps\n"
6959*3ac0a46fSAndroid Build Coastguard Worker "As no rate has been given, this limit will be used.\n");
6960*3ac0a46fSAndroid Build Coastguard Worker } else if (parameters->max_comp_size > OPJ_CINEMA_24_COMP) {
6961*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6962*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
6963*3ac0a46fSAndroid Build Coastguard Worker "Maximum 1041666 compressed bytes @ 24fps\n"
6964*3ac0a46fSAndroid Build Coastguard Worker "-> Specified rate exceeds this limit. Rate will be forced to 1041666 bytes.\n");
6965*3ac0a46fSAndroid Build Coastguard Worker parameters->max_comp_size = OPJ_CINEMA_24_COMP;
6966*3ac0a46fSAndroid Build Coastguard Worker }
6967*3ac0a46fSAndroid Build Coastguard Worker
6968*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
6969*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].h * image->comps[0].prec) /
6970*3ac0a46fSAndroid Build Coastguard Worker (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
6971*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].dy);
6972*3ac0a46fSAndroid Build Coastguard Worker
6973*3ac0a46fSAndroid Build Coastguard Worker }
6974*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_is_cinema_compliant(opj_image_t * image,OPJ_UINT16 rsiz,opj_event_mgr_t * p_manager)6975*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
6976*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager)
6977*3ac0a46fSAndroid Build Coastguard Worker {
6978*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
6979*3ac0a46fSAndroid Build Coastguard Worker
6980*3ac0a46fSAndroid Build Coastguard Worker /* Number of components */
6981*3ac0a46fSAndroid Build Coastguard Worker if (image->numcomps != 3) {
6982*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6983*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6984*3ac0a46fSAndroid Build Coastguard Worker "3 components"
6985*3ac0a46fSAndroid Build Coastguard Worker "-> Number of components of input image (%d) is not compliant\n"
6986*3ac0a46fSAndroid Build Coastguard Worker "-> Non-profile-3 codestream will be generated\n",
6987*3ac0a46fSAndroid Build Coastguard Worker image->numcomps);
6988*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
6989*3ac0a46fSAndroid Build Coastguard Worker }
6990*3ac0a46fSAndroid Build Coastguard Worker
6991*3ac0a46fSAndroid Build Coastguard Worker /* Bitdepth */
6992*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < image->numcomps; i++) {
6993*3ac0a46fSAndroid Build Coastguard Worker if ((image->comps[i].prec != 12) | (image->comps[i].sgnd)) {
6994*3ac0a46fSAndroid Build Coastguard Worker char signed_str[] = "signed";
6995*3ac0a46fSAndroid Build Coastguard Worker char unsigned_str[] = "unsigned";
6996*3ac0a46fSAndroid Build Coastguard Worker char *tmp_str = image->comps[i].sgnd ? signed_str : unsigned_str;
6997*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
6998*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
6999*3ac0a46fSAndroid Build Coastguard Worker "Precision of each component shall be 12 bits unsigned"
7000*3ac0a46fSAndroid Build Coastguard Worker "-> At least component %d of input image (%d bits, %s) is not compliant\n"
7001*3ac0a46fSAndroid Build Coastguard Worker "-> Non-profile-3 codestream will be generated\n",
7002*3ac0a46fSAndroid Build Coastguard Worker i, image->comps[i].prec, tmp_str);
7003*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7004*3ac0a46fSAndroid Build Coastguard Worker }
7005*3ac0a46fSAndroid Build Coastguard Worker }
7006*3ac0a46fSAndroid Build Coastguard Worker
7007*3ac0a46fSAndroid Build Coastguard Worker /* Image size */
7008*3ac0a46fSAndroid Build Coastguard Worker switch (rsiz) {
7009*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_CINEMA_2K:
7010*3ac0a46fSAndroid Build Coastguard Worker if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))) {
7011*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7012*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
7013*3ac0a46fSAndroid Build Coastguard Worker "width <= 2048 and height <= 1080\n"
7014*3ac0a46fSAndroid Build Coastguard Worker "-> Input image size %d x %d is not compliant\n"
7015*3ac0a46fSAndroid Build Coastguard Worker "-> Non-profile-3 codestream will be generated\n",
7016*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].w, image->comps[0].h);
7017*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7018*3ac0a46fSAndroid Build Coastguard Worker }
7019*3ac0a46fSAndroid Build Coastguard Worker break;
7020*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_CINEMA_4K:
7021*3ac0a46fSAndroid Build Coastguard Worker if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))) {
7022*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7023*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
7024*3ac0a46fSAndroid Build Coastguard Worker "width <= 4096 and height <= 2160\n"
7025*3ac0a46fSAndroid Build Coastguard Worker "-> Image size %d x %d is not compliant\n"
7026*3ac0a46fSAndroid Build Coastguard Worker "-> Non-profile-4 codestream will be generated\n",
7027*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].w, image->comps[0].h);
7028*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7029*3ac0a46fSAndroid Build Coastguard Worker }
7030*3ac0a46fSAndroid Build Coastguard Worker break;
7031*3ac0a46fSAndroid Build Coastguard Worker default :
7032*3ac0a46fSAndroid Build Coastguard Worker break;
7033*3ac0a46fSAndroid Build Coastguard Worker }
7034*3ac0a46fSAndroid Build Coastguard Worker
7035*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
7036*3ac0a46fSAndroid Build Coastguard Worker }
7037*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_imf_max_NL(opj_cparameters_t * parameters,opj_image_t * image)7038*3ac0a46fSAndroid Build Coastguard Worker static int opj_j2k_get_imf_max_NL(opj_cparameters_t *parameters,
7039*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image)
7040*3ac0a46fSAndroid Build Coastguard Worker {
7041*3ac0a46fSAndroid Build Coastguard Worker /* Decomposition levels */
7042*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT16 rsiz = parameters->rsiz;
7043*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7044*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 XTsiz = parameters->tile_size_on ? (OPJ_UINT32)
7045*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdx : image->x1;
7046*3ac0a46fSAndroid Build Coastguard Worker switch (profile) {
7047*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_2K:
7048*3ac0a46fSAndroid Build Coastguard Worker return 5;
7049*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_4K:
7050*3ac0a46fSAndroid Build Coastguard Worker return 6;
7051*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_8K:
7052*3ac0a46fSAndroid Build Coastguard Worker return 7;
7053*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_2K_R: {
7054*3ac0a46fSAndroid Build Coastguard Worker if (XTsiz >= 2048) {
7055*3ac0a46fSAndroid Build Coastguard Worker return 5;
7056*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 1024) {
7057*3ac0a46fSAndroid Build Coastguard Worker return 4;
7058*3ac0a46fSAndroid Build Coastguard Worker }
7059*3ac0a46fSAndroid Build Coastguard Worker break;
7060*3ac0a46fSAndroid Build Coastguard Worker }
7061*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_4K_R: {
7062*3ac0a46fSAndroid Build Coastguard Worker if (XTsiz >= 4096) {
7063*3ac0a46fSAndroid Build Coastguard Worker return 6;
7064*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 2048) {
7065*3ac0a46fSAndroid Build Coastguard Worker return 5;
7066*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 1024) {
7067*3ac0a46fSAndroid Build Coastguard Worker return 4;
7068*3ac0a46fSAndroid Build Coastguard Worker }
7069*3ac0a46fSAndroid Build Coastguard Worker break;
7070*3ac0a46fSAndroid Build Coastguard Worker }
7071*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_8K_R: {
7072*3ac0a46fSAndroid Build Coastguard Worker if (XTsiz >= 8192) {
7073*3ac0a46fSAndroid Build Coastguard Worker return 7;
7074*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 4096) {
7075*3ac0a46fSAndroid Build Coastguard Worker return 6;
7076*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 2048) {
7077*3ac0a46fSAndroid Build Coastguard Worker return 5;
7078*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 1024) {
7079*3ac0a46fSAndroid Build Coastguard Worker return 4;
7080*3ac0a46fSAndroid Build Coastguard Worker }
7081*3ac0a46fSAndroid Build Coastguard Worker break;
7082*3ac0a46fSAndroid Build Coastguard Worker }
7083*3ac0a46fSAndroid Build Coastguard Worker default:
7084*3ac0a46fSAndroid Build Coastguard Worker break;
7085*3ac0a46fSAndroid Build Coastguard Worker }
7086*3ac0a46fSAndroid Build Coastguard Worker return -1;
7087*3ac0a46fSAndroid Build Coastguard Worker }
7088*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_set_imf_parameters(opj_cparameters_t * parameters,opj_image_t * image,opj_event_mgr_t * p_manager)7089*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_set_imf_parameters(opj_cparameters_t *parameters,
7090*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image, opj_event_mgr_t *p_manager)
7091*3ac0a46fSAndroid Build Coastguard Worker {
7092*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT16 rsiz = parameters->rsiz;
7093*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7094*3ac0a46fSAndroid Build Coastguard Worker
7095*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
7096*3ac0a46fSAndroid Build Coastguard Worker
7097*3ac0a46fSAndroid Build Coastguard Worker /* Override defaults set by opj_set_default_encoder_parameters */
7098*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cblockw_init == OPJ_COMP_PARAM_DEFAULT_CBLOCKW &&
7099*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockh_init == OPJ_COMP_PARAM_DEFAULT_CBLOCKH) {
7100*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockw_init = 32;
7101*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockh_init = 32;
7102*3ac0a46fSAndroid Build Coastguard Worker }
7103*3ac0a46fSAndroid Build Coastguard Worker
7104*3ac0a46fSAndroid Build Coastguard Worker /* One tile part for each component */
7105*3ac0a46fSAndroid Build Coastguard Worker parameters->tp_flag = 'C';
7106*3ac0a46fSAndroid Build Coastguard Worker parameters->tp_on = 1;
7107*3ac0a46fSAndroid Build Coastguard Worker
7108*3ac0a46fSAndroid Build Coastguard Worker if (parameters->prog_order == OPJ_COMP_PARAM_DEFAULT_PROG_ORDER) {
7109*3ac0a46fSAndroid Build Coastguard Worker parameters->prog_order = OPJ_CPRL;
7110*3ac0a46fSAndroid Build Coastguard Worker }
7111*3ac0a46fSAndroid Build Coastguard Worker
7112*3ac0a46fSAndroid Build Coastguard Worker if (profile == OPJ_PROFILE_IMF_2K ||
7113*3ac0a46fSAndroid Build Coastguard Worker profile == OPJ_PROFILE_IMF_4K ||
7114*3ac0a46fSAndroid Build Coastguard Worker profile == OPJ_PROFILE_IMF_8K) {
7115*3ac0a46fSAndroid Build Coastguard Worker /* 9-7 transform */
7116*3ac0a46fSAndroid Build Coastguard Worker parameters->irreversible = 1;
7117*3ac0a46fSAndroid Build Coastguard Worker }
7118*3ac0a46fSAndroid Build Coastguard Worker
7119*3ac0a46fSAndroid Build Coastguard Worker /* Adjust the number of resolutions if set to its defaults */
7120*3ac0a46fSAndroid Build Coastguard Worker if (parameters->numresolution == OPJ_COMP_PARAM_DEFAULT_NUMRESOLUTION &&
7121*3ac0a46fSAndroid Build Coastguard Worker image->x0 == 0 &&
7122*3ac0a46fSAndroid Build Coastguard Worker image->y0 == 0) {
7123*3ac0a46fSAndroid Build Coastguard Worker const int max_NL = opj_j2k_get_imf_max_NL(parameters, image);
7124*3ac0a46fSAndroid Build Coastguard Worker if (max_NL >= 0 && parameters->numresolution > max_NL) {
7125*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution = max_NL + 1;
7126*3ac0a46fSAndroid Build Coastguard Worker }
7127*3ac0a46fSAndroid Build Coastguard Worker
7128*3ac0a46fSAndroid Build Coastguard Worker /* Note: below is generic logic */
7129*3ac0a46fSAndroid Build Coastguard Worker if (!parameters->tile_size_on) {
7130*3ac0a46fSAndroid Build Coastguard Worker while (parameters->numresolution > 0) {
7131*3ac0a46fSAndroid Build Coastguard Worker if (image->x1 < (1U << ((OPJ_UINT32)parameters->numresolution - 1U))) {
7132*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution --;
7133*3ac0a46fSAndroid Build Coastguard Worker continue;
7134*3ac0a46fSAndroid Build Coastguard Worker }
7135*3ac0a46fSAndroid Build Coastguard Worker if (image->y1 < (1U << ((OPJ_UINT32)parameters->numresolution - 1U))) {
7136*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution --;
7137*3ac0a46fSAndroid Build Coastguard Worker continue;
7138*3ac0a46fSAndroid Build Coastguard Worker }
7139*3ac0a46fSAndroid Build Coastguard Worker break;
7140*3ac0a46fSAndroid Build Coastguard Worker }
7141*3ac0a46fSAndroid Build Coastguard Worker }
7142*3ac0a46fSAndroid Build Coastguard Worker }
7143*3ac0a46fSAndroid Build Coastguard Worker
7144*3ac0a46fSAndroid Build Coastguard Worker /* Set defaults precincts */
7145*3ac0a46fSAndroid Build Coastguard Worker if (parameters->csty == 0) {
7146*3ac0a46fSAndroid Build Coastguard Worker parameters->csty |= J2K_CP_CSTY_PRT;
7147*3ac0a46fSAndroid Build Coastguard Worker if (parameters->numresolution == 1) {
7148*3ac0a46fSAndroid Build Coastguard Worker parameters->res_spec = 1;
7149*3ac0a46fSAndroid Build Coastguard Worker parameters->prcw_init[0] = 128;
7150*3ac0a46fSAndroid Build Coastguard Worker parameters->prch_init[0] = 128;
7151*3ac0a46fSAndroid Build Coastguard Worker } else {
7152*3ac0a46fSAndroid Build Coastguard Worker int i;
7153*3ac0a46fSAndroid Build Coastguard Worker parameters->res_spec = parameters->numresolution - 1;
7154*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < parameters->res_spec; i++) {
7155*3ac0a46fSAndroid Build Coastguard Worker parameters->prcw_init[i] = 256;
7156*3ac0a46fSAndroid Build Coastguard Worker parameters->prch_init[i] = 256;
7157*3ac0a46fSAndroid Build Coastguard Worker }
7158*3ac0a46fSAndroid Build Coastguard Worker }
7159*3ac0a46fSAndroid Build Coastguard Worker }
7160*3ac0a46fSAndroid Build Coastguard Worker }
7161*3ac0a46fSAndroid Build Coastguard Worker
7162*3ac0a46fSAndroid Build Coastguard Worker /* Table A.53 from JPEG2000 standard */
7163*3ac0a46fSAndroid Build Coastguard Worker static const OPJ_UINT16 tabMaxSubLevelFromMainLevel[] = {
7164*3ac0a46fSAndroid Build Coastguard Worker 15, /* unspecified */
7165*3ac0a46fSAndroid Build Coastguard Worker 1,
7166*3ac0a46fSAndroid Build Coastguard Worker 1,
7167*3ac0a46fSAndroid Build Coastguard Worker 1,
7168*3ac0a46fSAndroid Build Coastguard Worker 2,
7169*3ac0a46fSAndroid Build Coastguard Worker 3,
7170*3ac0a46fSAndroid Build Coastguard Worker 4,
7171*3ac0a46fSAndroid Build Coastguard Worker 5,
7172*3ac0a46fSAndroid Build Coastguard Worker 6,
7173*3ac0a46fSAndroid Build Coastguard Worker 7,
7174*3ac0a46fSAndroid Build Coastguard Worker 8,
7175*3ac0a46fSAndroid Build Coastguard Worker 9
7176*3ac0a46fSAndroid Build Coastguard Worker };
7177*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_is_imf_compliant(opj_cparameters_t * parameters,opj_image_t * image,opj_event_mgr_t * p_manager)7178*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_is_imf_compliant(opj_cparameters_t *parameters,
7179*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image,
7180*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager)
7181*3ac0a46fSAndroid Build Coastguard Worker {
7182*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
7183*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT16 rsiz = parameters->rsiz;
7184*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT16 profile = OPJ_GET_IMF_PROFILE(rsiz);
7185*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT16 mainlevel = OPJ_GET_IMF_MAINLEVEL(rsiz);
7186*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT16 sublevel = OPJ_GET_IMF_SUBLEVEL(rsiz);
7187*3ac0a46fSAndroid Build Coastguard Worker const int NL = parameters->numresolution - 1;
7188*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 XTsiz = parameters->tile_size_on ? (OPJ_UINT32)
7189*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdx : image->x1;
7190*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL ret = OPJ_TRUE;
7191*3ac0a46fSAndroid Build Coastguard Worker
7192*3ac0a46fSAndroid Build Coastguard Worker /* Validate mainlevel */
7193*3ac0a46fSAndroid Build Coastguard Worker if (mainlevel > OPJ_IMF_MAINLEVEL_MAX) {
7194*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7195*3ac0a46fSAndroid Build Coastguard Worker "IMF profile require mainlevel <= 11.\n"
7196*3ac0a46fSAndroid Build Coastguard Worker "-> %d is thus not compliant\n"
7197*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7198*3ac0a46fSAndroid Build Coastguard Worker mainlevel);
7199*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7200*3ac0a46fSAndroid Build Coastguard Worker } else {
7201*3ac0a46fSAndroid Build Coastguard Worker /* Validate sublevel */
7202*3ac0a46fSAndroid Build Coastguard Worker assert(sizeof(tabMaxSubLevelFromMainLevel) ==
7203*3ac0a46fSAndroid Build Coastguard Worker (OPJ_IMF_MAINLEVEL_MAX + 1) * sizeof(tabMaxSubLevelFromMainLevel[0]));
7204*3ac0a46fSAndroid Build Coastguard Worker if (sublevel > tabMaxSubLevelFromMainLevel[mainlevel]) {
7205*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7206*3ac0a46fSAndroid Build Coastguard Worker "IMF profile require sublevel <= %d for mainlevel = %d.\n"
7207*3ac0a46fSAndroid Build Coastguard Worker "-> %d is thus not compliant\n"
7208*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7209*3ac0a46fSAndroid Build Coastguard Worker tabMaxSubLevelFromMainLevel[mainlevel],
7210*3ac0a46fSAndroid Build Coastguard Worker mainlevel,
7211*3ac0a46fSAndroid Build Coastguard Worker sublevel);
7212*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7213*3ac0a46fSAndroid Build Coastguard Worker }
7214*3ac0a46fSAndroid Build Coastguard Worker }
7215*3ac0a46fSAndroid Build Coastguard Worker
7216*3ac0a46fSAndroid Build Coastguard Worker /* Number of components */
7217*3ac0a46fSAndroid Build Coastguard Worker if (image->numcomps > 3) {
7218*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7219*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require at most 3 components.\n"
7220*3ac0a46fSAndroid Build Coastguard Worker "-> Number of components of input image (%d) is not compliant\n"
7221*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7222*3ac0a46fSAndroid Build Coastguard Worker image->numcomps);
7223*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7224*3ac0a46fSAndroid Build Coastguard Worker }
7225*3ac0a46fSAndroid Build Coastguard Worker
7226*3ac0a46fSAndroid Build Coastguard Worker if (image->x0 != 0 || image->y0 != 0) {
7227*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7228*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require image origin to be at 0,0.\n"
7229*3ac0a46fSAndroid Build Coastguard Worker "-> %d,%d is not compliant\n"
7230*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7231*3ac0a46fSAndroid Build Coastguard Worker image->x0, image->y0 != 0);
7232*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7233*3ac0a46fSAndroid Build Coastguard Worker }
7234*3ac0a46fSAndroid Build Coastguard Worker
7235*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cp_tx0 != 0 || parameters->cp_ty0 != 0) {
7236*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7237*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require tile origin to be at 0,0.\n"
7238*3ac0a46fSAndroid Build Coastguard Worker "-> %d,%d is not compliant\n"
7239*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7240*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tx0, parameters->cp_ty0);
7241*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7242*3ac0a46fSAndroid Build Coastguard Worker }
7243*3ac0a46fSAndroid Build Coastguard Worker
7244*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tile_size_on) {
7245*3ac0a46fSAndroid Build Coastguard Worker if (profile == OPJ_PROFILE_IMF_2K ||
7246*3ac0a46fSAndroid Build Coastguard Worker profile == OPJ_PROFILE_IMF_4K ||
7247*3ac0a46fSAndroid Build Coastguard Worker profile == OPJ_PROFILE_IMF_8K) {
7248*3ac0a46fSAndroid Build Coastguard Worker if ((OPJ_UINT32)parameters->cp_tdx < image->x1 ||
7249*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)parameters->cp_tdy < image->y1) {
7250*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7251*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K/4K/8K single tile profiles require tile to be greater or equal to image size.\n"
7252*3ac0a46fSAndroid Build Coastguard Worker "-> %d,%d is lesser than %d,%d\n"
7253*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7254*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdx,
7255*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdy,
7256*3ac0a46fSAndroid Build Coastguard Worker image->x1,
7257*3ac0a46fSAndroid Build Coastguard Worker image->y1);
7258*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7259*3ac0a46fSAndroid Build Coastguard Worker }
7260*3ac0a46fSAndroid Build Coastguard Worker } else {
7261*3ac0a46fSAndroid Build Coastguard Worker if ((OPJ_UINT32)parameters->cp_tdx >= image->x1 &&
7262*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)parameters->cp_tdy >= image->y1) {
7263*3ac0a46fSAndroid Build Coastguard Worker /* ok */
7264*3ac0a46fSAndroid Build Coastguard Worker } else if (parameters->cp_tdx == 1024 &&
7265*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdy == 1024) {
7266*3ac0a46fSAndroid Build Coastguard Worker /* ok */
7267*3ac0a46fSAndroid Build Coastguard Worker } else if (parameters->cp_tdx == 2048 &&
7268*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdy == 2048 &&
7269*3ac0a46fSAndroid Build Coastguard Worker (profile == OPJ_PROFILE_IMF_4K ||
7270*3ac0a46fSAndroid Build Coastguard Worker profile == OPJ_PROFILE_IMF_8K)) {
7271*3ac0a46fSAndroid Build Coastguard Worker /* ok */
7272*3ac0a46fSAndroid Build Coastguard Worker } else if (parameters->cp_tdx == 4096 &&
7273*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdy == 4096 &&
7274*3ac0a46fSAndroid Build Coastguard Worker profile == OPJ_PROFILE_IMF_8K) {
7275*3ac0a46fSAndroid Build Coastguard Worker /* ok */
7276*3ac0a46fSAndroid Build Coastguard Worker } else {
7277*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7278*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K_R/4K_R/8K_R single/multiple tile profiles "
7279*3ac0a46fSAndroid Build Coastguard Worker "require tile to be greater or equal to image size,\n"
7280*3ac0a46fSAndroid Build Coastguard Worker "or to be (1024,1024), or (2048,2048) for 4K_R/8K_R "
7281*3ac0a46fSAndroid Build Coastguard Worker "or (4096,4096) for 8K_R.\n"
7282*3ac0a46fSAndroid Build Coastguard Worker "-> %d,%d is non conformant\n"
7283*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7284*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdx,
7285*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_tdy);
7286*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7287*3ac0a46fSAndroid Build Coastguard Worker }
7288*3ac0a46fSAndroid Build Coastguard Worker }
7289*3ac0a46fSAndroid Build Coastguard Worker }
7290*3ac0a46fSAndroid Build Coastguard Worker
7291*3ac0a46fSAndroid Build Coastguard Worker /* Bitdepth */
7292*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < image->numcomps; i++) {
7293*3ac0a46fSAndroid Build Coastguard Worker if (!(image->comps[i].prec >= 8 && image->comps[i].prec <= 16) ||
7294*3ac0a46fSAndroid Build Coastguard Worker (image->comps[i].sgnd)) {
7295*3ac0a46fSAndroid Build Coastguard Worker char signed_str[] = "signed";
7296*3ac0a46fSAndroid Build Coastguard Worker char unsigned_str[] = "unsigned";
7297*3ac0a46fSAndroid Build Coastguard Worker char *tmp_str = image->comps[i].sgnd ? signed_str : unsigned_str;
7298*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7299*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require precision of each component to b in [8-16] bits unsigned"
7300*3ac0a46fSAndroid Build Coastguard Worker "-> At least component %d of input image (%d bits, %s) is not compliant\n"
7301*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7302*3ac0a46fSAndroid Build Coastguard Worker i, image->comps[i].prec, tmp_str);
7303*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7304*3ac0a46fSAndroid Build Coastguard Worker }
7305*3ac0a46fSAndroid Build Coastguard Worker }
7306*3ac0a46fSAndroid Build Coastguard Worker
7307*3ac0a46fSAndroid Build Coastguard Worker /* Sub-sampling */
7308*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < image->numcomps; i++) {
7309*3ac0a46fSAndroid Build Coastguard Worker if (i == 0 && image->comps[i].dx != 1) {
7310*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7311*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require XRSiz1 == 1. Here it is set to %d.\n"
7312*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7313*3ac0a46fSAndroid Build Coastguard Worker image->comps[i].dx);
7314*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7315*3ac0a46fSAndroid Build Coastguard Worker }
7316*3ac0a46fSAndroid Build Coastguard Worker if (i == 1 && image->comps[i].dx != 1 && image->comps[i].dx != 2) {
7317*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7318*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require XRSiz2 == 1 or 2. Here it is set to %d.\n"
7319*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7320*3ac0a46fSAndroid Build Coastguard Worker image->comps[i].dx);
7321*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7322*3ac0a46fSAndroid Build Coastguard Worker }
7323*3ac0a46fSAndroid Build Coastguard Worker if (i > 1 && image->comps[i].dx != image->comps[i - 1].dx) {
7324*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7325*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require XRSiz%d to be the same as XRSiz2. "
7326*3ac0a46fSAndroid Build Coastguard Worker "Here it is set to %d instead of %d.\n"
7327*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7328*3ac0a46fSAndroid Build Coastguard Worker i + 1, image->comps[i].dx, image->comps[i - 1].dx);
7329*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7330*3ac0a46fSAndroid Build Coastguard Worker }
7331*3ac0a46fSAndroid Build Coastguard Worker if (image->comps[i].dy != 1) {
7332*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7333*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require YRsiz == 1. "
7334*3ac0a46fSAndroid Build Coastguard Worker "Here it is set to %d for component %d.\n"
7335*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7336*3ac0a46fSAndroid Build Coastguard Worker image->comps[i].dy, i);
7337*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7338*3ac0a46fSAndroid Build Coastguard Worker }
7339*3ac0a46fSAndroid Build Coastguard Worker }
7340*3ac0a46fSAndroid Build Coastguard Worker
7341*3ac0a46fSAndroid Build Coastguard Worker /* Image size */
7342*3ac0a46fSAndroid Build Coastguard Worker switch (profile) {
7343*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_2K:
7344*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_2K_R:
7345*3ac0a46fSAndroid Build Coastguard Worker if (((image->comps[0].w > 2048) | (image->comps[0].h > 1556))) {
7346*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7347*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K/2K_R profile require:\n"
7348*3ac0a46fSAndroid Build Coastguard Worker "width <= 2048 and height <= 1556\n"
7349*3ac0a46fSAndroid Build Coastguard Worker "-> Input image size %d x %d is not compliant\n"
7350*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7351*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].w, image->comps[0].h);
7352*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7353*3ac0a46fSAndroid Build Coastguard Worker }
7354*3ac0a46fSAndroid Build Coastguard Worker break;
7355*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_4K:
7356*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_4K_R:
7357*3ac0a46fSAndroid Build Coastguard Worker if (((image->comps[0].w > 4096) | (image->comps[0].h > 3112))) {
7358*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7359*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K/4K_R profile require:\n"
7360*3ac0a46fSAndroid Build Coastguard Worker "width <= 4096 and height <= 3112\n"
7361*3ac0a46fSAndroid Build Coastguard Worker "-> Input image size %d x %d is not compliant\n"
7362*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7363*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].w, image->comps[0].h);
7364*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7365*3ac0a46fSAndroid Build Coastguard Worker }
7366*3ac0a46fSAndroid Build Coastguard Worker break;
7367*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_8K:
7368*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_8K_R:
7369*3ac0a46fSAndroid Build Coastguard Worker if (((image->comps[0].w > 8192) | (image->comps[0].h > 6224))) {
7370*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7371*3ac0a46fSAndroid Build Coastguard Worker "IMF 8K/8K_R profile require:\n"
7372*3ac0a46fSAndroid Build Coastguard Worker "width <= 8192 and height <= 6224\n"
7373*3ac0a46fSAndroid Build Coastguard Worker "-> Input image size %d x %d is not compliant\n"
7374*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7375*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].w, image->comps[0].h);
7376*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7377*3ac0a46fSAndroid Build Coastguard Worker }
7378*3ac0a46fSAndroid Build Coastguard Worker break;
7379*3ac0a46fSAndroid Build Coastguard Worker default :
7380*3ac0a46fSAndroid Build Coastguard Worker assert(0);
7381*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7382*3ac0a46fSAndroid Build Coastguard Worker }
7383*3ac0a46fSAndroid Build Coastguard Worker
7384*3ac0a46fSAndroid Build Coastguard Worker if (parameters->roi_compno != -1) {
7385*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7386*3ac0a46fSAndroid Build Coastguard Worker "IMF profile forbid RGN / region of interest marker.\n"
7387*3ac0a46fSAndroid Build Coastguard Worker "-> Compression parameters specify a ROI\n"
7388*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n");
7389*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7390*3ac0a46fSAndroid Build Coastguard Worker }
7391*3ac0a46fSAndroid Build Coastguard Worker
7392*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cblockw_init != 32 || parameters->cblockh_init != 32) {
7393*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7394*3ac0a46fSAndroid Build Coastguard Worker "IMF profile require code block size to be 32x32.\n"
7395*3ac0a46fSAndroid Build Coastguard Worker "-> Compression parameters set it to %dx%d.\n"
7396*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7397*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockw_init,
7398*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockh_init);
7399*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7400*3ac0a46fSAndroid Build Coastguard Worker }
7401*3ac0a46fSAndroid Build Coastguard Worker
7402*3ac0a46fSAndroid Build Coastguard Worker if (parameters->prog_order != OPJ_CPRL) {
7403*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7404*3ac0a46fSAndroid Build Coastguard Worker "IMF profile require progression order to be CPRL.\n"
7405*3ac0a46fSAndroid Build Coastguard Worker "-> Compression parameters set it to %d.\n"
7406*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7407*3ac0a46fSAndroid Build Coastguard Worker parameters->prog_order);
7408*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7409*3ac0a46fSAndroid Build Coastguard Worker }
7410*3ac0a46fSAndroid Build Coastguard Worker
7411*3ac0a46fSAndroid Build Coastguard Worker if (parameters->numpocs != 0) {
7412*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7413*3ac0a46fSAndroid Build Coastguard Worker "IMF profile forbid POC markers.\n"
7414*3ac0a46fSAndroid Build Coastguard Worker "-> Compression parameters set %d POC.\n"
7415*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7416*3ac0a46fSAndroid Build Coastguard Worker parameters->numpocs);
7417*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7418*3ac0a46fSAndroid Build Coastguard Worker }
7419*3ac0a46fSAndroid Build Coastguard Worker
7420*3ac0a46fSAndroid Build Coastguard Worker /* Codeblock style: no mode switch enabled */
7421*3ac0a46fSAndroid Build Coastguard Worker if (parameters->mode != 0) {
7422*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7423*3ac0a46fSAndroid Build Coastguard Worker "IMF profile forbid mode switch in code block style.\n"
7424*3ac0a46fSAndroid Build Coastguard Worker "-> Compression parameters set code block style to %d.\n"
7425*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7426*3ac0a46fSAndroid Build Coastguard Worker parameters->mode);
7427*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7428*3ac0a46fSAndroid Build Coastguard Worker }
7429*3ac0a46fSAndroid Build Coastguard Worker
7430*3ac0a46fSAndroid Build Coastguard Worker if (profile == OPJ_PROFILE_IMF_2K ||
7431*3ac0a46fSAndroid Build Coastguard Worker profile == OPJ_PROFILE_IMF_4K ||
7432*3ac0a46fSAndroid Build Coastguard Worker profile == OPJ_PROFILE_IMF_8K) {
7433*3ac0a46fSAndroid Build Coastguard Worker /* Expect 9-7 transform */
7434*3ac0a46fSAndroid Build Coastguard Worker if (parameters->irreversible != 1) {
7435*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7436*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K/4K/8K profiles require 9-7 Irreversible Transform.\n"
7437*3ac0a46fSAndroid Build Coastguard Worker "-> Compression parameters set it to reversible.\n"
7438*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n");
7439*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7440*3ac0a46fSAndroid Build Coastguard Worker }
7441*3ac0a46fSAndroid Build Coastguard Worker } else {
7442*3ac0a46fSAndroid Build Coastguard Worker /* Expect 5-3 transform */
7443*3ac0a46fSAndroid Build Coastguard Worker if (parameters->irreversible != 0) {
7444*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7445*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K/4K/8K profiles require 5-3 reversible Transform.\n"
7446*3ac0a46fSAndroid Build Coastguard Worker "-> Compression parameters set it to irreversible.\n"
7447*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n");
7448*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7449*3ac0a46fSAndroid Build Coastguard Worker }
7450*3ac0a46fSAndroid Build Coastguard Worker }
7451*3ac0a46fSAndroid Build Coastguard Worker
7452*3ac0a46fSAndroid Build Coastguard Worker /* Number of layers */
7453*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tcp_numlayers != 1) {
7454*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7455*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K/4K/8K profiles require 1 single quality layer.\n"
7456*3ac0a46fSAndroid Build Coastguard Worker "-> Number of layers is %d.\n"
7457*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7458*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_numlayers);
7459*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7460*3ac0a46fSAndroid Build Coastguard Worker }
7461*3ac0a46fSAndroid Build Coastguard Worker
7462*3ac0a46fSAndroid Build Coastguard Worker /* Decomposition levels */
7463*3ac0a46fSAndroid Build Coastguard Worker switch (profile) {
7464*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_2K:
7465*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 5)) {
7466*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7467*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K profile requires 1 <= NL <= 5:\n"
7468*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7469*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7470*3ac0a46fSAndroid Build Coastguard Worker NL);
7471*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7472*3ac0a46fSAndroid Build Coastguard Worker }
7473*3ac0a46fSAndroid Build Coastguard Worker break;
7474*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_4K:
7475*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 6)) {
7476*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7477*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K profile requires 1 <= NL <= 6:\n"
7478*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7479*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7480*3ac0a46fSAndroid Build Coastguard Worker NL);
7481*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7482*3ac0a46fSAndroid Build Coastguard Worker }
7483*3ac0a46fSAndroid Build Coastguard Worker break;
7484*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_8K:
7485*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 7)) {
7486*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7487*3ac0a46fSAndroid Build Coastguard Worker "IMF 8K profile requires 1 <= NL <= 7:\n"
7488*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7489*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7490*3ac0a46fSAndroid Build Coastguard Worker NL);
7491*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7492*3ac0a46fSAndroid Build Coastguard Worker }
7493*3ac0a46fSAndroid Build Coastguard Worker break;
7494*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_2K_R: {
7495*3ac0a46fSAndroid Build Coastguard Worker if (XTsiz >= 2048) {
7496*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 5)) {
7497*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7498*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K_R profile requires 1 <= NL <= 5 for XTsiz >= 2048:\n"
7499*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7500*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7501*3ac0a46fSAndroid Build Coastguard Worker NL);
7502*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7503*3ac0a46fSAndroid Build Coastguard Worker }
7504*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 1024) {
7505*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 4)) {
7506*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7507*3ac0a46fSAndroid Build Coastguard Worker "IMF 2K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7508*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7509*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7510*3ac0a46fSAndroid Build Coastguard Worker NL);
7511*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7512*3ac0a46fSAndroid Build Coastguard Worker }
7513*3ac0a46fSAndroid Build Coastguard Worker }
7514*3ac0a46fSAndroid Build Coastguard Worker break;
7515*3ac0a46fSAndroid Build Coastguard Worker }
7516*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_4K_R: {
7517*3ac0a46fSAndroid Build Coastguard Worker if (XTsiz >= 4096) {
7518*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 6)) {
7519*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7520*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K_R profile requires 1 <= NL <= 6 for XTsiz >= 4096:\n"
7521*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7522*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7523*3ac0a46fSAndroid Build Coastguard Worker NL);
7524*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7525*3ac0a46fSAndroid Build Coastguard Worker }
7526*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 2048) {
7527*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 5)) {
7528*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7529*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K_R profile requires 1 <= NL <= 5 for XTsiz in [2048,4096[:\n"
7530*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7531*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7532*3ac0a46fSAndroid Build Coastguard Worker NL);
7533*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7534*3ac0a46fSAndroid Build Coastguard Worker }
7535*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 1024) {
7536*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 4)) {
7537*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7538*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7539*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7540*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7541*3ac0a46fSAndroid Build Coastguard Worker NL);
7542*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7543*3ac0a46fSAndroid Build Coastguard Worker }
7544*3ac0a46fSAndroid Build Coastguard Worker }
7545*3ac0a46fSAndroid Build Coastguard Worker break;
7546*3ac0a46fSAndroid Build Coastguard Worker }
7547*3ac0a46fSAndroid Build Coastguard Worker case OPJ_PROFILE_IMF_8K_R: {
7548*3ac0a46fSAndroid Build Coastguard Worker if (XTsiz >= 8192) {
7549*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 7)) {
7550*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7551*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K_R profile requires 1 <= NL <= 7 for XTsiz >= 8192:\n"
7552*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7553*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7554*3ac0a46fSAndroid Build Coastguard Worker NL);
7555*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7556*3ac0a46fSAndroid Build Coastguard Worker }
7557*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 4096) {
7558*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 6)) {
7559*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7560*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K_R profile requires 1 <= NL <= 6 for XTsiz in [4096,8192[:\n"
7561*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7562*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7563*3ac0a46fSAndroid Build Coastguard Worker NL);
7564*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7565*3ac0a46fSAndroid Build Coastguard Worker }
7566*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 2048) {
7567*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 5)) {
7568*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7569*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K_R profile requires 1 <= NL <= 5 for XTsiz in [2048,4096[:\n"
7570*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7571*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7572*3ac0a46fSAndroid Build Coastguard Worker NL);
7573*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7574*3ac0a46fSAndroid Build Coastguard Worker }
7575*3ac0a46fSAndroid Build Coastguard Worker } else if (XTsiz >= 1024) {
7576*3ac0a46fSAndroid Build Coastguard Worker if (!(NL >= 1 && NL <= 4)) {
7577*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7578*3ac0a46fSAndroid Build Coastguard Worker "IMF 4K_R profile requires 1 <= NL <= 4 for XTsiz in [1024,2048[:\n"
7579*3ac0a46fSAndroid Build Coastguard Worker "-> Number of decomposition levels is %d.\n"
7580*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n",
7581*3ac0a46fSAndroid Build Coastguard Worker NL);
7582*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7583*3ac0a46fSAndroid Build Coastguard Worker }
7584*3ac0a46fSAndroid Build Coastguard Worker }
7585*3ac0a46fSAndroid Build Coastguard Worker break;
7586*3ac0a46fSAndroid Build Coastguard Worker }
7587*3ac0a46fSAndroid Build Coastguard Worker default:
7588*3ac0a46fSAndroid Build Coastguard Worker break;
7589*3ac0a46fSAndroid Build Coastguard Worker }
7590*3ac0a46fSAndroid Build Coastguard Worker
7591*3ac0a46fSAndroid Build Coastguard Worker if (parameters->numresolution == 1) {
7592*3ac0a46fSAndroid Build Coastguard Worker if (parameters->res_spec != 1 ||
7593*3ac0a46fSAndroid Build Coastguard Worker parameters->prcw_init[0] != 128 ||
7594*3ac0a46fSAndroid Build Coastguard Worker parameters->prch_init[0] != 128) {
7595*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7596*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require PPx = PPy = 7 for NLLL band, else 8.\n"
7597*3ac0a46fSAndroid Build Coastguard Worker "-> Supplied values are different from that.\n"
7598*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n");
7599*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7600*3ac0a46fSAndroid Build Coastguard Worker }
7601*3ac0a46fSAndroid Build Coastguard Worker } else {
7602*3ac0a46fSAndroid Build Coastguard Worker int i;
7603*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < parameters->res_spec; i++) {
7604*3ac0a46fSAndroid Build Coastguard Worker if (parameters->prcw_init[i] != 256 ||
7605*3ac0a46fSAndroid Build Coastguard Worker parameters->prch_init[i] != 256) {
7606*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7607*3ac0a46fSAndroid Build Coastguard Worker "IMF profiles require PPx = PPy = 7 for NLLL band, else 8.\n"
7608*3ac0a46fSAndroid Build Coastguard Worker "-> Supplied values are different from that.\n"
7609*3ac0a46fSAndroid Build Coastguard Worker "-> Non-IMF codestream will be generated\n");
7610*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
7611*3ac0a46fSAndroid Build Coastguard Worker }
7612*3ac0a46fSAndroid Build Coastguard Worker }
7613*3ac0a46fSAndroid Build Coastguard Worker }
7614*3ac0a46fSAndroid Build Coastguard Worker
7615*3ac0a46fSAndroid Build Coastguard Worker return ret;
7616*3ac0a46fSAndroid Build Coastguard Worker }
7617*3ac0a46fSAndroid Build Coastguard Worker
7618*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_setup_encoder(void * p_j2k,opj_cparameters_t * parameters,opj_image_t * image,opj_event_mgr_t * p_manager)7619*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_setup_encoder(void *p_j2k,
7620*3ac0a46fSAndroid Build Coastguard Worker opj_cparameters_t *parameters,
7621*3ac0a46fSAndroid Build Coastguard Worker opj_image_t *image,
7622*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
7623*3ac0a46fSAndroid Build Coastguard Worker {
7624*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* j2k = (opj_j2k_t*)p_j2k;
7625*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j, tileno, numpocs_tile;
7626*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *cp = 00;
7627*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblkw, cblkh;
7628*3ac0a46fSAndroid Build Coastguard Worker
7629*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k || !parameters || ! image) {
7630*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7631*3ac0a46fSAndroid Build Coastguard Worker }
7632*3ac0a46fSAndroid Build Coastguard Worker
7633*3ac0a46fSAndroid Build Coastguard Worker if ((parameters->numresolution <= 0) ||
7634*3ac0a46fSAndroid Build Coastguard Worker (parameters->numresolution > OPJ_J2K_MAXRLVLS)) {
7635*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7636*3ac0a46fSAndroid Build Coastguard Worker "Invalid number of resolutions : %d not in range [1,%d]\n",
7637*3ac0a46fSAndroid Build Coastguard Worker parameters->numresolution, OPJ_J2K_MAXRLVLS);
7638*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7639*3ac0a46fSAndroid Build Coastguard Worker }
7640*3ac0a46fSAndroid Build Coastguard Worker
7641*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cblockw_init < 4 || parameters->cblockw_init > 1024) {
7642*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7643*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7644*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockw_init);
7645*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7646*3ac0a46fSAndroid Build Coastguard Worker }
7647*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cblockh_init < 4 || parameters->cblockh_init > 1024) {
7648*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7649*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for cblockh_init: %d not a power of 2 not in range [4,1024]\n",
7650*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockh_init);
7651*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7652*3ac0a46fSAndroid Build Coastguard Worker }
7653*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cblockw_init * parameters->cblockh_init > 4096) {
7654*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7655*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for cblockw_init * cblockh_init: should be <= 4096\n");
7656*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7657*3ac0a46fSAndroid Build Coastguard Worker }
7658*3ac0a46fSAndroid Build Coastguard Worker cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
7659*3ac0a46fSAndroid Build Coastguard Worker cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
7660*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cblockw_init != (1 << cblkw)) {
7661*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7662*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7663*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockw_init);
7664*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7665*3ac0a46fSAndroid Build Coastguard Worker }
7666*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cblockh_init != (1 << cblkh)) {
7667*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7668*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for cblockw_init: %d not a power of 2 in range [4,1024]\n",
7669*3ac0a46fSAndroid Build Coastguard Worker parameters->cblockh_init);
7670*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7671*3ac0a46fSAndroid Build Coastguard Worker }
7672*3ac0a46fSAndroid Build Coastguard Worker
7673*3ac0a46fSAndroid Build Coastguard Worker j2k->m_specific_param.m_encoder.m_nb_comps = image->numcomps;
7674*3ac0a46fSAndroid Build Coastguard Worker
7675*3ac0a46fSAndroid Build Coastguard Worker /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
7676*3ac0a46fSAndroid Build Coastguard Worker cp = &(j2k->m_cp);
7677*3ac0a46fSAndroid Build Coastguard Worker
7678*3ac0a46fSAndroid Build Coastguard Worker /* set default values for cp */
7679*3ac0a46fSAndroid Build Coastguard Worker cp->tw = 1;
7680*3ac0a46fSAndroid Build Coastguard Worker cp->th = 1;
7681*3ac0a46fSAndroid Build Coastguard Worker
7682*3ac0a46fSAndroid Build Coastguard Worker /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */
7683*3ac0a46fSAndroid Build Coastguard Worker if (parameters->rsiz ==
7684*3ac0a46fSAndroid Build Coastguard Worker OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */
7685*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL deprecated_used = OPJ_FALSE;
7686*3ac0a46fSAndroid Build Coastguard Worker switch (parameters->cp_cinema) {
7687*3ac0a46fSAndroid Build Coastguard Worker case OPJ_CINEMA2K_24:
7688*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7689*3ac0a46fSAndroid Build Coastguard Worker parameters->max_cs_size = OPJ_CINEMA_24_CS;
7690*3ac0a46fSAndroid Build Coastguard Worker parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7691*3ac0a46fSAndroid Build Coastguard Worker deprecated_used = OPJ_TRUE;
7692*3ac0a46fSAndroid Build Coastguard Worker break;
7693*3ac0a46fSAndroid Build Coastguard Worker case OPJ_CINEMA2K_48:
7694*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7695*3ac0a46fSAndroid Build Coastguard Worker parameters->max_cs_size = OPJ_CINEMA_48_CS;
7696*3ac0a46fSAndroid Build Coastguard Worker parameters->max_comp_size = OPJ_CINEMA_48_COMP;
7697*3ac0a46fSAndroid Build Coastguard Worker deprecated_used = OPJ_TRUE;
7698*3ac0a46fSAndroid Build Coastguard Worker break;
7699*3ac0a46fSAndroid Build Coastguard Worker case OPJ_CINEMA4K_24:
7700*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
7701*3ac0a46fSAndroid Build Coastguard Worker parameters->max_cs_size = OPJ_CINEMA_24_CS;
7702*3ac0a46fSAndroid Build Coastguard Worker parameters->max_comp_size = OPJ_CINEMA_24_COMP;
7703*3ac0a46fSAndroid Build Coastguard Worker deprecated_used = OPJ_TRUE;
7704*3ac0a46fSAndroid Build Coastguard Worker break;
7705*3ac0a46fSAndroid Build Coastguard Worker case OPJ_OFF:
7706*3ac0a46fSAndroid Build Coastguard Worker default:
7707*3ac0a46fSAndroid Build Coastguard Worker break;
7708*3ac0a46fSAndroid Build Coastguard Worker }
7709*3ac0a46fSAndroid Build Coastguard Worker switch (parameters->cp_rsiz) {
7710*3ac0a46fSAndroid Build Coastguard Worker case OPJ_CINEMA2K:
7711*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
7712*3ac0a46fSAndroid Build Coastguard Worker deprecated_used = OPJ_TRUE;
7713*3ac0a46fSAndroid Build Coastguard Worker break;
7714*3ac0a46fSAndroid Build Coastguard Worker case OPJ_CINEMA4K:
7715*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
7716*3ac0a46fSAndroid Build Coastguard Worker deprecated_used = OPJ_TRUE;
7717*3ac0a46fSAndroid Build Coastguard Worker break;
7718*3ac0a46fSAndroid Build Coastguard Worker case OPJ_MCT:
7719*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT;
7720*3ac0a46fSAndroid Build Coastguard Worker deprecated_used = OPJ_TRUE;
7721*3ac0a46fSAndroid Build Coastguard Worker case OPJ_STD_RSIZ:
7722*3ac0a46fSAndroid Build Coastguard Worker default:
7723*3ac0a46fSAndroid Build Coastguard Worker break;
7724*3ac0a46fSAndroid Build Coastguard Worker }
7725*3ac0a46fSAndroid Build Coastguard Worker if (deprecated_used) {
7726*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7727*3ac0a46fSAndroid Build Coastguard Worker "Deprecated fields cp_cinema or cp_rsiz are used\n"
7728*3ac0a46fSAndroid Build Coastguard Worker "Please consider using only the rsiz field\n"
7729*3ac0a46fSAndroid Build Coastguard Worker "See openjpeg.h documentation for more details\n");
7730*3ac0a46fSAndroid Build Coastguard Worker }
7731*3ac0a46fSAndroid Build Coastguard Worker }
7732*3ac0a46fSAndroid Build Coastguard Worker
7733*3ac0a46fSAndroid Build Coastguard Worker /* If no explicit layers are provided, use lossless settings */
7734*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tcp_numlayers == 0) {
7735*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_numlayers = 1;
7736*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_disto_alloc = 1;
7737*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_rates[0] = 0;
7738*3ac0a46fSAndroid Build Coastguard Worker }
7739*3ac0a46fSAndroid Build Coastguard Worker
7740*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cp_disto_alloc) {
7741*3ac0a46fSAndroid Build Coastguard Worker /* Emit warnings if tcp_rates are not decreasing */
7742*3ac0a46fSAndroid Build Coastguard Worker for (i = 1; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7743*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 rate_i_corr = parameters->tcp_rates[i];
7744*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 rate_i_m_1_corr = parameters->tcp_rates[i - 1];
7745*3ac0a46fSAndroid Build Coastguard Worker if (rate_i_corr <= 1.0) {
7746*3ac0a46fSAndroid Build Coastguard Worker rate_i_corr = 1.0;
7747*3ac0a46fSAndroid Build Coastguard Worker }
7748*3ac0a46fSAndroid Build Coastguard Worker if (rate_i_m_1_corr <= 1.0) {
7749*3ac0a46fSAndroid Build Coastguard Worker rate_i_m_1_corr = 1.0;
7750*3ac0a46fSAndroid Build Coastguard Worker }
7751*3ac0a46fSAndroid Build Coastguard Worker if (rate_i_corr >= rate_i_m_1_corr) {
7752*3ac0a46fSAndroid Build Coastguard Worker if (rate_i_corr != parameters->tcp_rates[i] &&
7753*3ac0a46fSAndroid Build Coastguard Worker rate_i_m_1_corr != parameters->tcp_rates[i - 1]) {
7754*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7755*3ac0a46fSAndroid Build Coastguard Worker "tcp_rates[%d]=%f (corrected as %f) should be strictly lesser "
7756*3ac0a46fSAndroid Build Coastguard Worker "than tcp_rates[%d]=%f (corrected as %f)\n",
7757*3ac0a46fSAndroid Build Coastguard Worker i, parameters->tcp_rates[i], rate_i_corr,
7758*3ac0a46fSAndroid Build Coastguard Worker i - 1, parameters->tcp_rates[i - 1], rate_i_m_1_corr);
7759*3ac0a46fSAndroid Build Coastguard Worker } else if (rate_i_corr != parameters->tcp_rates[i]) {
7760*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7761*3ac0a46fSAndroid Build Coastguard Worker "tcp_rates[%d]=%f (corrected as %f) should be strictly lesser "
7762*3ac0a46fSAndroid Build Coastguard Worker "than tcp_rates[%d]=%f\n",
7763*3ac0a46fSAndroid Build Coastguard Worker i, parameters->tcp_rates[i], rate_i_corr,
7764*3ac0a46fSAndroid Build Coastguard Worker i - 1, parameters->tcp_rates[i - 1]);
7765*3ac0a46fSAndroid Build Coastguard Worker } else if (rate_i_m_1_corr != parameters->tcp_rates[i - 1]) {
7766*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7767*3ac0a46fSAndroid Build Coastguard Worker "tcp_rates[%d]=%f should be strictly lesser "
7768*3ac0a46fSAndroid Build Coastguard Worker "than tcp_rates[%d]=%f (corrected as %f)\n",
7769*3ac0a46fSAndroid Build Coastguard Worker i, parameters->tcp_rates[i],
7770*3ac0a46fSAndroid Build Coastguard Worker i - 1, parameters->tcp_rates[i - 1], rate_i_m_1_corr);
7771*3ac0a46fSAndroid Build Coastguard Worker } else {
7772*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7773*3ac0a46fSAndroid Build Coastguard Worker "tcp_rates[%d]=%f should be strictly lesser "
7774*3ac0a46fSAndroid Build Coastguard Worker "than tcp_rates[%d]=%f\n",
7775*3ac0a46fSAndroid Build Coastguard Worker i, parameters->tcp_rates[i],
7776*3ac0a46fSAndroid Build Coastguard Worker i - 1, parameters->tcp_rates[i - 1]);
7777*3ac0a46fSAndroid Build Coastguard Worker }
7778*3ac0a46fSAndroid Build Coastguard Worker }
7779*3ac0a46fSAndroid Build Coastguard Worker }
7780*3ac0a46fSAndroid Build Coastguard Worker } else if (parameters->cp_fixed_quality) {
7781*3ac0a46fSAndroid Build Coastguard Worker /* Emit warnings if tcp_distoratio are not increasing */
7782*3ac0a46fSAndroid Build Coastguard Worker for (i = 1; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7783*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tcp_distoratio[i] < parameters->tcp_distoratio[i - 1] &&
7784*3ac0a46fSAndroid Build Coastguard Worker !(i == (OPJ_UINT32)parameters->tcp_numlayers - 1 &&
7785*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_distoratio[i] == 0)) {
7786*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7787*3ac0a46fSAndroid Build Coastguard Worker "tcp_distoratio[%d]=%f should be strictly greater "
7788*3ac0a46fSAndroid Build Coastguard Worker "than tcp_distoratio[%d]=%f\n",
7789*3ac0a46fSAndroid Build Coastguard Worker i, parameters->tcp_distoratio[i], i - 1,
7790*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_distoratio[i - 1]);
7791*3ac0a46fSAndroid Build Coastguard Worker }
7792*3ac0a46fSAndroid Build Coastguard Worker }
7793*3ac0a46fSAndroid Build Coastguard Worker }
7794*3ac0a46fSAndroid Build Coastguard Worker
7795*3ac0a46fSAndroid Build Coastguard Worker /* see if max_codestream_size does limit input rate */
7796*3ac0a46fSAndroid Build Coastguard Worker if (parameters->max_cs_size <= 0) {
7797*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tcp_rates[parameters->tcp_numlayers - 1] > 0) {
7798*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 temp_size;
7799*3ac0a46fSAndroid Build Coastguard Worker temp_size = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
7800*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].h * image->comps[0].prec) /
7801*3ac0a46fSAndroid Build Coastguard Worker ((double)parameters->tcp_rates[parameters->tcp_numlayers - 1] * 8 *
7802*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].dx * image->comps[0].dy));
7803*3ac0a46fSAndroid Build Coastguard Worker if (temp_size > INT_MAX) {
7804*3ac0a46fSAndroid Build Coastguard Worker parameters->max_cs_size = INT_MAX;
7805*3ac0a46fSAndroid Build Coastguard Worker } else {
7806*3ac0a46fSAndroid Build Coastguard Worker parameters->max_cs_size = (int) floor(temp_size);
7807*3ac0a46fSAndroid Build Coastguard Worker }
7808*3ac0a46fSAndroid Build Coastguard Worker } else {
7809*3ac0a46fSAndroid Build Coastguard Worker parameters->max_cs_size = 0;
7810*3ac0a46fSAndroid Build Coastguard Worker }
7811*3ac0a46fSAndroid Build Coastguard Worker } else {
7812*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 temp_rate;
7813*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL cap = OPJ_FALSE;
7814*3ac0a46fSAndroid Build Coastguard Worker
7815*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_IS_IMF(parameters->rsiz) && parameters->max_cs_size > 0 &&
7816*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_numlayers == 1 && parameters->tcp_rates[0] == 0) {
7817*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
7818*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].h * image->comps[0].prec) /
7819*3ac0a46fSAndroid Build Coastguard Worker (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
7820*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].dy);
7821*3ac0a46fSAndroid Build Coastguard Worker }
7822*3ac0a46fSAndroid Build Coastguard Worker
7823*3ac0a46fSAndroid Build Coastguard Worker temp_rate = (OPJ_FLOAT32)(((double)image->numcomps * image->comps[0].w *
7824*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].h * image->comps[0].prec) /
7825*3ac0a46fSAndroid Build Coastguard Worker (((double)parameters->max_cs_size) * 8 * image->comps[0].dx *
7826*3ac0a46fSAndroid Build Coastguard Worker image->comps[0].dy));
7827*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
7828*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tcp_rates[i] < temp_rate) {
7829*3ac0a46fSAndroid Build Coastguard Worker parameters->tcp_rates[i] = temp_rate;
7830*3ac0a46fSAndroid Build Coastguard Worker cap = OPJ_TRUE;
7831*3ac0a46fSAndroid Build Coastguard Worker }
7832*3ac0a46fSAndroid Build Coastguard Worker }
7833*3ac0a46fSAndroid Build Coastguard Worker if (cap) {
7834*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7835*3ac0a46fSAndroid Build Coastguard Worker "The desired maximum codestream size has limited\n"
7836*3ac0a46fSAndroid Build Coastguard Worker "at least one of the desired quality layers\n");
7837*3ac0a46fSAndroid Build Coastguard Worker }
7838*3ac0a46fSAndroid Build Coastguard Worker }
7839*3ac0a46fSAndroid Build Coastguard Worker
7840*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_IS_CINEMA(parameters->rsiz) || OPJ_IS_IMF(parameters->rsiz)) {
7841*3ac0a46fSAndroid Build Coastguard Worker j2k->m_specific_param.m_encoder.m_TLM = OPJ_TRUE;
7842*3ac0a46fSAndroid Build Coastguard Worker }
7843*3ac0a46fSAndroid Build Coastguard Worker
7844*3ac0a46fSAndroid Build Coastguard Worker /* Manage profiles and applications and set RSIZ */
7845*3ac0a46fSAndroid Build Coastguard Worker /* set cinema parameters if required */
7846*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_IS_CINEMA(parameters->rsiz)) {
7847*3ac0a46fSAndroid Build Coastguard Worker if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K)
7848*3ac0a46fSAndroid Build Coastguard Worker || (parameters->rsiz == OPJ_PROFILE_CINEMA_S4K)) {
7849*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7850*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Scalable Digital Cinema profiles not yet supported\n");
7851*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_NONE;
7852*3ac0a46fSAndroid Build Coastguard Worker } else {
7853*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_set_cinema_parameters(parameters, image, p_manager);
7854*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_is_cinema_compliant(image, parameters->rsiz, p_manager)) {
7855*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_NONE;
7856*3ac0a46fSAndroid Build Coastguard Worker }
7857*3ac0a46fSAndroid Build Coastguard Worker }
7858*3ac0a46fSAndroid Build Coastguard Worker } else if (OPJ_IS_STORAGE(parameters->rsiz)) {
7859*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7860*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Long Term Storage profile not yet supported\n");
7861*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_NONE;
7862*3ac0a46fSAndroid Build Coastguard Worker } else if (OPJ_IS_BROADCAST(parameters->rsiz)) {
7863*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7864*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Broadcast profiles not yet supported\n");
7865*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_NONE;
7866*3ac0a46fSAndroid Build Coastguard Worker } else if (OPJ_IS_IMF(parameters->rsiz)) {
7867*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_set_imf_parameters(parameters, image, p_manager);
7868*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_is_imf_compliant(parameters, image, p_manager)) {
7869*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_NONE;
7870*3ac0a46fSAndroid Build Coastguard Worker }
7871*3ac0a46fSAndroid Build Coastguard Worker } else if (OPJ_IS_PART2(parameters->rsiz)) {
7872*3ac0a46fSAndroid Build Coastguard Worker if (parameters->rsiz == ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_NONE))) {
7873*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7874*3ac0a46fSAndroid Build Coastguard Worker "JPEG 2000 Part-2 profile defined\n"
7875*3ac0a46fSAndroid Build Coastguard Worker "but no Part-2 extension enabled.\n"
7876*3ac0a46fSAndroid Build Coastguard Worker "Profile set to NONE.\n");
7877*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_NONE;
7878*3ac0a46fSAndroid Build Coastguard Worker } else if (parameters->rsiz != ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT))) {
7879*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
7880*3ac0a46fSAndroid Build Coastguard Worker "Unsupported Part-2 extension enabled\n"
7881*3ac0a46fSAndroid Build Coastguard Worker "Profile set to NONE.\n");
7882*3ac0a46fSAndroid Build Coastguard Worker parameters->rsiz = OPJ_PROFILE_NONE;
7883*3ac0a46fSAndroid Build Coastguard Worker }
7884*3ac0a46fSAndroid Build Coastguard Worker }
7885*3ac0a46fSAndroid Build Coastguard Worker
7886*3ac0a46fSAndroid Build Coastguard Worker /*
7887*3ac0a46fSAndroid Build Coastguard Worker copy user encoding parameters
7888*3ac0a46fSAndroid Build Coastguard Worker */
7889*3ac0a46fSAndroid Build Coastguard Worker cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)
7890*3ac0a46fSAndroid Build Coastguard Worker parameters->max_comp_size;
7891*3ac0a46fSAndroid Build Coastguard Worker cp->rsiz = parameters->rsiz;
7892*3ac0a46fSAndroid Build Coastguard Worker cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)
7893*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_disto_alloc & 1u;
7894*3ac0a46fSAndroid Build Coastguard Worker cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)
7895*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_fixed_alloc & 1u;
7896*3ac0a46fSAndroid Build Coastguard Worker cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)
7897*3ac0a46fSAndroid Build Coastguard Worker parameters->cp_fixed_quality & 1u;
7898*3ac0a46fSAndroid Build Coastguard Worker
7899*3ac0a46fSAndroid Build Coastguard Worker /* mod fixed_quality */
7900*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cp_fixed_alloc && parameters->cp_matrice) {
7901*3ac0a46fSAndroid Build Coastguard Worker size_t array_size = (size_t)parameters->tcp_numlayers *
7902*3ac0a46fSAndroid Build Coastguard Worker (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
7903*3ac0a46fSAndroid Build Coastguard Worker cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
7904*3ac0a46fSAndroid Build Coastguard Worker if (!cp->m_specific_param.m_enc.m_matrice) {
7905*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7906*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate copy of user encoding parameters matrix \n");
7907*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7908*3ac0a46fSAndroid Build Coastguard Worker }
7909*3ac0a46fSAndroid Build Coastguard Worker memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice,
7910*3ac0a46fSAndroid Build Coastguard Worker array_size);
7911*3ac0a46fSAndroid Build Coastguard Worker }
7912*3ac0a46fSAndroid Build Coastguard Worker
7913*3ac0a46fSAndroid Build Coastguard Worker /* tiles */
7914*3ac0a46fSAndroid Build Coastguard Worker cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
7915*3ac0a46fSAndroid Build Coastguard Worker cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
7916*3ac0a46fSAndroid Build Coastguard Worker
7917*3ac0a46fSAndroid Build Coastguard Worker /* tile offset */
7918*3ac0a46fSAndroid Build Coastguard Worker cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
7919*3ac0a46fSAndroid Build Coastguard Worker cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
7920*3ac0a46fSAndroid Build Coastguard Worker
7921*3ac0a46fSAndroid Build Coastguard Worker /* comment string */
7922*3ac0a46fSAndroid Build Coastguard Worker if (parameters->cp_comment) {
7923*3ac0a46fSAndroid Build Coastguard Worker cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1U);
7924*3ac0a46fSAndroid Build Coastguard Worker if (!cp->comment) {
7925*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7926*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate copy of comment string\n");
7927*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7928*3ac0a46fSAndroid Build Coastguard Worker }
7929*3ac0a46fSAndroid Build Coastguard Worker strcpy(cp->comment, parameters->cp_comment);
7930*3ac0a46fSAndroid Build Coastguard Worker } else {
7931*3ac0a46fSAndroid Build Coastguard Worker /* Create default comment for codestream */
7932*3ac0a46fSAndroid Build Coastguard Worker const char comment[] = "Created by OpenJPEG version ";
7933*3ac0a46fSAndroid Build Coastguard Worker const size_t clen = strlen(comment);
7934*3ac0a46fSAndroid Build Coastguard Worker const char *version = opj_version();
7935*3ac0a46fSAndroid Build Coastguard Worker
7936*3ac0a46fSAndroid Build Coastguard Worker /* UniPG>> */
7937*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
7938*3ac0a46fSAndroid Build Coastguard Worker const size_t cp_comment_buf_size = clen + strlen(version) + 11;
7939*3ac0a46fSAndroid Build Coastguard Worker cp->comment = (char*)opj_malloc(cp_comment_buf_size);
7940*3ac0a46fSAndroid Build Coastguard Worker if (!cp->comment) {
7941*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7942*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate comment string\n");
7943*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7944*3ac0a46fSAndroid Build Coastguard Worker }
7945*3ac0a46fSAndroid Build Coastguard Worker snprintf(cp->comment, cp_comment_buf_size, "%s%s with JPWL",
7946*3ac0a46fSAndroid Build Coastguard Worker comment, version);
7947*3ac0a46fSAndroid Build Coastguard Worker #else
7948*3ac0a46fSAndroid Build Coastguard Worker const size_t cp_comment_buf_size = clen + strlen(version) + 1;
7949*3ac0a46fSAndroid Build Coastguard Worker cp->comment = (char*)opj_malloc(cp_comment_buf_size);
7950*3ac0a46fSAndroid Build Coastguard Worker if (!cp->comment) {
7951*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7952*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate comment string\n");
7953*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7954*3ac0a46fSAndroid Build Coastguard Worker }
7955*3ac0a46fSAndroid Build Coastguard Worker snprintf(cp->comment, cp_comment_buf_size, "%s%s", comment, version);
7956*3ac0a46fSAndroid Build Coastguard Worker #endif
7957*3ac0a46fSAndroid Build Coastguard Worker /* <<UniPG */
7958*3ac0a46fSAndroid Build Coastguard Worker }
7959*3ac0a46fSAndroid Build Coastguard Worker
7960*3ac0a46fSAndroid Build Coastguard Worker /*
7961*3ac0a46fSAndroid Build Coastguard Worker calculate other encoding parameters
7962*3ac0a46fSAndroid Build Coastguard Worker */
7963*3ac0a46fSAndroid Build Coastguard Worker
7964*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tile_size_on) {
7965*3ac0a46fSAndroid Build Coastguard Worker if (cp->tdx == 0) {
7966*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Invalid tile width\n");
7967*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7968*3ac0a46fSAndroid Build Coastguard Worker }
7969*3ac0a46fSAndroid Build Coastguard Worker if (cp->tdy == 0) {
7970*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Invalid tile height\n");
7971*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7972*3ac0a46fSAndroid Build Coastguard Worker }
7973*3ac0a46fSAndroid Build Coastguard Worker cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->x1 - cp->tx0),
7974*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)cp->tdx);
7975*3ac0a46fSAndroid Build Coastguard Worker cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->y1 - cp->ty0),
7976*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)cp->tdy);
7977*3ac0a46fSAndroid Build Coastguard Worker /* Check that the number of tiles is valid */
7978*3ac0a46fSAndroid Build Coastguard Worker if (cp->tw > 65535 / cp->th) {
7979*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
7980*3ac0a46fSAndroid Build Coastguard Worker "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
7981*3ac0a46fSAndroid Build Coastguard Worker cp->tw, cp->th);
7982*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
7983*3ac0a46fSAndroid Build Coastguard Worker }
7984*3ac0a46fSAndroid Build Coastguard Worker } else {
7985*3ac0a46fSAndroid Build Coastguard Worker cp->tdx = image->x1 - cp->tx0;
7986*3ac0a46fSAndroid Build Coastguard Worker cp->tdy = image->y1 - cp->ty0;
7987*3ac0a46fSAndroid Build Coastguard Worker }
7988*3ac0a46fSAndroid Build Coastguard Worker
7989*3ac0a46fSAndroid Build Coastguard Worker if (parameters->tp_on) {
7990*3ac0a46fSAndroid Build Coastguard Worker cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
7991*3ac0a46fSAndroid Build Coastguard Worker cp->m_specific_param.m_enc.m_tp_on = 1;
7992*3ac0a46fSAndroid Build Coastguard Worker }
7993*3ac0a46fSAndroid Build Coastguard Worker
7994*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
7995*3ac0a46fSAndroid Build Coastguard Worker /*
7996*3ac0a46fSAndroid Build Coastguard Worker calculate JPWL encoding parameters
7997*3ac0a46fSAndroid Build Coastguard Worker */
7998*3ac0a46fSAndroid Build Coastguard Worker
7999*3ac0a46fSAndroid Build Coastguard Worker if (parameters->jpwl_epc_on) {
8000*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 i;
8001*3ac0a46fSAndroid Build Coastguard Worker
8002*3ac0a46fSAndroid Build Coastguard Worker /* set JPWL on */
8003*3ac0a46fSAndroid Build Coastguard Worker cp->epc_on = OPJ_TRUE;
8004*3ac0a46fSAndroid Build Coastguard Worker cp->info_on = OPJ_FALSE; /* no informative technique */
8005*3ac0a46fSAndroid Build Coastguard Worker
8006*3ac0a46fSAndroid Build Coastguard Worker /* set EPB on */
8007*3ac0a46fSAndroid Build Coastguard Worker if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
8008*3ac0a46fSAndroid Build Coastguard Worker cp->epb_on = OPJ_TRUE;
8009*3ac0a46fSAndroid Build Coastguard Worker
8010*3ac0a46fSAndroid Build Coastguard Worker cp->hprot_MH = parameters->jpwl_hprot_MH;
8011*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
8012*3ac0a46fSAndroid Build Coastguard Worker cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
8013*3ac0a46fSAndroid Build Coastguard Worker cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
8014*3ac0a46fSAndroid Build Coastguard Worker }
8015*3ac0a46fSAndroid Build Coastguard Worker /* if tile specs are not specified, copy MH specs */
8016*3ac0a46fSAndroid Build Coastguard Worker if (cp->hprot_TPH[0] == -1) {
8017*3ac0a46fSAndroid Build Coastguard Worker cp->hprot_TPH_tileno[0] = 0;
8018*3ac0a46fSAndroid Build Coastguard Worker cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
8019*3ac0a46fSAndroid Build Coastguard Worker }
8020*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
8021*3ac0a46fSAndroid Build Coastguard Worker cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
8022*3ac0a46fSAndroid Build Coastguard Worker cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
8023*3ac0a46fSAndroid Build Coastguard Worker cp->pprot[i] = parameters->jpwl_pprot[i];
8024*3ac0a46fSAndroid Build Coastguard Worker }
8025*3ac0a46fSAndroid Build Coastguard Worker }
8026*3ac0a46fSAndroid Build Coastguard Worker
8027*3ac0a46fSAndroid Build Coastguard Worker /* set ESD writing */
8028*3ac0a46fSAndroid Build Coastguard Worker if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
8029*3ac0a46fSAndroid Build Coastguard Worker cp->esd_on = OPJ_TRUE;
8030*3ac0a46fSAndroid Build Coastguard Worker
8031*3ac0a46fSAndroid Build Coastguard Worker cp->sens_size = parameters->jpwl_sens_size;
8032*3ac0a46fSAndroid Build Coastguard Worker cp->sens_addr = parameters->jpwl_sens_addr;
8033*3ac0a46fSAndroid Build Coastguard Worker cp->sens_range = parameters->jpwl_sens_range;
8034*3ac0a46fSAndroid Build Coastguard Worker
8035*3ac0a46fSAndroid Build Coastguard Worker cp->sens_MH = parameters->jpwl_sens_MH;
8036*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
8037*3ac0a46fSAndroid Build Coastguard Worker cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
8038*3ac0a46fSAndroid Build Coastguard Worker cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
8039*3ac0a46fSAndroid Build Coastguard Worker }
8040*3ac0a46fSAndroid Build Coastguard Worker }
8041*3ac0a46fSAndroid Build Coastguard Worker
8042*3ac0a46fSAndroid Build Coastguard Worker /* always set RED writing to false: we are at the encoder */
8043*3ac0a46fSAndroid Build Coastguard Worker cp->red_on = OPJ_FALSE;
8044*3ac0a46fSAndroid Build Coastguard Worker
8045*3ac0a46fSAndroid Build Coastguard Worker } else {
8046*3ac0a46fSAndroid Build Coastguard Worker cp->epc_on = OPJ_FALSE;
8047*3ac0a46fSAndroid Build Coastguard Worker }
8048*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
8049*3ac0a46fSAndroid Build Coastguard Worker
8050*3ac0a46fSAndroid Build Coastguard Worker /* initialize the multiple tiles */
8051*3ac0a46fSAndroid Build Coastguard Worker /* ---------------------------- */
8052*3ac0a46fSAndroid Build Coastguard Worker cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
8053*3ac0a46fSAndroid Build Coastguard Worker if (!cp->tcps) {
8054*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8055*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate tile coding parameters\n");
8056*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8057*3ac0a46fSAndroid Build Coastguard Worker }
8058*3ac0a46fSAndroid Build Coastguard Worker
8059*3ac0a46fSAndroid Build Coastguard Worker for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
8060*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *tcp = &cp->tcps[tileno];
8061*3ac0a46fSAndroid Build Coastguard Worker tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
8062*3ac0a46fSAndroid Build Coastguard Worker
8063*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < tcp->numlayers; j++) {
8064*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_IS_CINEMA(cp->rsiz) || OPJ_IS_IMF(cp->rsiz)) {
8065*3ac0a46fSAndroid Build Coastguard Worker if (cp->m_specific_param.m_enc.m_fixed_quality) {
8066*3ac0a46fSAndroid Build Coastguard Worker tcp->distoratio[j] = parameters->tcp_distoratio[j];
8067*3ac0a46fSAndroid Build Coastguard Worker }
8068*3ac0a46fSAndroid Build Coastguard Worker tcp->rates[j] = parameters->tcp_rates[j];
8069*3ac0a46fSAndroid Build Coastguard Worker } else {
8070*3ac0a46fSAndroid Build Coastguard Worker if (cp->m_specific_param.m_enc.m_fixed_quality) { /* add fixed_quality */
8071*3ac0a46fSAndroid Build Coastguard Worker tcp->distoratio[j] = parameters->tcp_distoratio[j];
8072*3ac0a46fSAndroid Build Coastguard Worker } else {
8073*3ac0a46fSAndroid Build Coastguard Worker tcp->rates[j] = parameters->tcp_rates[j];
8074*3ac0a46fSAndroid Build Coastguard Worker }
8075*3ac0a46fSAndroid Build Coastguard Worker }
8076*3ac0a46fSAndroid Build Coastguard Worker if (!cp->m_specific_param.m_enc.m_fixed_quality &&
8077*3ac0a46fSAndroid Build Coastguard Worker tcp->rates[j] <= 1.0) {
8078*3ac0a46fSAndroid Build Coastguard Worker tcp->rates[j] = 0.0; /* force lossless */
8079*3ac0a46fSAndroid Build Coastguard Worker }
8080*3ac0a46fSAndroid Build Coastguard Worker }
8081*3ac0a46fSAndroid Build Coastguard Worker
8082*3ac0a46fSAndroid Build Coastguard Worker tcp->csty = (OPJ_UINT32)parameters->csty;
8083*3ac0a46fSAndroid Build Coastguard Worker tcp->prg = parameters->prog_order;
8084*3ac0a46fSAndroid Build Coastguard Worker tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
8085*3ac0a46fSAndroid Build Coastguard Worker
8086*3ac0a46fSAndroid Build Coastguard Worker numpocs_tile = 0;
8087*3ac0a46fSAndroid Build Coastguard Worker tcp->POC = 0;
8088*3ac0a46fSAndroid Build Coastguard Worker
8089*3ac0a46fSAndroid Build Coastguard Worker if (parameters->numpocs) {
8090*3ac0a46fSAndroid Build Coastguard Worker /* initialisation of POC */
8091*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < parameters->numpocs; i++) {
8092*3ac0a46fSAndroid Build Coastguard Worker if (tileno + 1 == parameters->POC[i].tile) {
8093*3ac0a46fSAndroid Build Coastguard Worker opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
8094*3ac0a46fSAndroid Build Coastguard Worker
8095*3ac0a46fSAndroid Build Coastguard Worker if (parameters->POC[numpocs_tile].compno0 >= image->numcomps) {
8096*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8097*3ac0a46fSAndroid Build Coastguard Worker "Invalid compno0 for POC %d\n", i);
8098*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8099*3ac0a46fSAndroid Build Coastguard Worker }
8100*3ac0a46fSAndroid Build Coastguard Worker
8101*3ac0a46fSAndroid Build Coastguard Worker tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0;
8102*3ac0a46fSAndroid Build Coastguard Worker tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0;
8103*3ac0a46fSAndroid Build Coastguard Worker tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1;
8104*3ac0a46fSAndroid Build Coastguard Worker tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1;
8105*3ac0a46fSAndroid Build Coastguard Worker tcp_poc->compno1 = opj_uint_min(parameters->POC[numpocs_tile].compno1,
8106*3ac0a46fSAndroid Build Coastguard Worker image->numcomps);
8107*3ac0a46fSAndroid Build Coastguard Worker tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1;
8108*3ac0a46fSAndroid Build Coastguard Worker tcp_poc->tile = parameters->POC[numpocs_tile].tile;
8109*3ac0a46fSAndroid Build Coastguard Worker
8110*3ac0a46fSAndroid Build Coastguard Worker numpocs_tile++;
8111*3ac0a46fSAndroid Build Coastguard Worker }
8112*3ac0a46fSAndroid Build Coastguard Worker }
8113*3ac0a46fSAndroid Build Coastguard Worker
8114*3ac0a46fSAndroid Build Coastguard Worker if (numpocs_tile) {
8115*3ac0a46fSAndroid Build Coastguard Worker
8116*3ac0a46fSAndroid Build Coastguard Worker /* TODO MSD use the return value*/
8117*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_check_poc_val(parameters->POC, tileno, parameters->numpocs,
8118*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)parameters->numresolution, image->numcomps,
8119*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
8120*3ac0a46fSAndroid Build Coastguard Worker
8121*3ac0a46fSAndroid Build Coastguard Worker tcp->POC = 1;
8122*3ac0a46fSAndroid Build Coastguard Worker tcp->numpocs = numpocs_tile - 1 ;
8123*3ac0a46fSAndroid Build Coastguard Worker }
8124*3ac0a46fSAndroid Build Coastguard Worker } else {
8125*3ac0a46fSAndroid Build Coastguard Worker tcp->numpocs = 0;
8126*3ac0a46fSAndroid Build Coastguard Worker }
8127*3ac0a46fSAndroid Build Coastguard Worker
8128*3ac0a46fSAndroid Build Coastguard Worker tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
8129*3ac0a46fSAndroid Build Coastguard Worker if (!tcp->tccps) {
8130*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8131*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate tile component coding parameters\n");
8132*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8133*3ac0a46fSAndroid Build Coastguard Worker }
8134*3ac0a46fSAndroid Build Coastguard Worker if (parameters->mct_data) {
8135*3ac0a46fSAndroid Build Coastguard Worker
8136*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(
8137*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32);
8138*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8139*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * l_dc_shift = (OPJ_INT32 *)((OPJ_BYTE *) parameters->mct_data +
8140*3ac0a46fSAndroid Build Coastguard Worker lMctSize);
8141*3ac0a46fSAndroid Build Coastguard Worker
8142*3ac0a46fSAndroid Build Coastguard Worker if (!lTmpBuf) {
8143*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8144*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate temp buffer\n");
8145*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8146*3ac0a46fSAndroid Build Coastguard Worker }
8147*3ac0a46fSAndroid Build Coastguard Worker
8148*3ac0a46fSAndroid Build Coastguard Worker tcp->mct = 2;
8149*3ac0a46fSAndroid Build Coastguard Worker tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8150*3ac0a46fSAndroid Build Coastguard Worker if (! tcp->m_mct_coding_matrix) {
8151*3ac0a46fSAndroid Build Coastguard Worker opj_free(lTmpBuf);
8152*3ac0a46fSAndroid Build Coastguard Worker lTmpBuf = NULL;
8153*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8154*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate encoder MCT coding matrix \n");
8155*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8156*3ac0a46fSAndroid Build Coastguard Worker }
8157*3ac0a46fSAndroid Build Coastguard Worker memcpy(tcp->m_mct_coding_matrix, parameters->mct_data, lMctSize);
8158*3ac0a46fSAndroid Build Coastguard Worker memcpy(lTmpBuf, parameters->mct_data, lMctSize);
8159*3ac0a46fSAndroid Build Coastguard Worker
8160*3ac0a46fSAndroid Build Coastguard Worker tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
8161*3ac0a46fSAndroid Build Coastguard Worker if (! tcp->m_mct_decoding_matrix) {
8162*3ac0a46fSAndroid Build Coastguard Worker opj_free(lTmpBuf);
8163*3ac0a46fSAndroid Build Coastguard Worker lTmpBuf = NULL;
8164*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8165*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate encoder MCT decoding matrix \n");
8166*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8167*3ac0a46fSAndroid Build Coastguard Worker }
8168*3ac0a46fSAndroid Build Coastguard Worker if (opj_matrix_inversion_f(lTmpBuf, (tcp->m_mct_decoding_matrix),
8169*3ac0a46fSAndroid Build Coastguard Worker image->numcomps) == OPJ_FALSE) {
8170*3ac0a46fSAndroid Build Coastguard Worker opj_free(lTmpBuf);
8171*3ac0a46fSAndroid Build Coastguard Worker lTmpBuf = NULL;
8172*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8173*3ac0a46fSAndroid Build Coastguard Worker "Failed to inverse encoder MCT decoding matrix \n");
8174*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8175*3ac0a46fSAndroid Build Coastguard Worker }
8176*3ac0a46fSAndroid Build Coastguard Worker
8177*3ac0a46fSAndroid Build Coastguard Worker tcp->mct_norms = (OPJ_FLOAT64*)
8178*3ac0a46fSAndroid Build Coastguard Worker opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
8179*3ac0a46fSAndroid Build Coastguard Worker if (! tcp->mct_norms) {
8180*3ac0a46fSAndroid Build Coastguard Worker opj_free(lTmpBuf);
8181*3ac0a46fSAndroid Build Coastguard Worker lTmpBuf = NULL;
8182*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8183*3ac0a46fSAndroid Build Coastguard Worker "Not enough memory to allocate encoder MCT norms \n");
8184*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8185*3ac0a46fSAndroid Build Coastguard Worker }
8186*3ac0a46fSAndroid Build Coastguard Worker opj_calculate_norms(tcp->mct_norms, image->numcomps,
8187*3ac0a46fSAndroid Build Coastguard Worker tcp->m_mct_decoding_matrix);
8188*3ac0a46fSAndroid Build Coastguard Worker opj_free(lTmpBuf);
8189*3ac0a46fSAndroid Build Coastguard Worker
8190*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < image->numcomps; i++) {
8191*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *tccp = &tcp->tccps[i];
8192*3ac0a46fSAndroid Build Coastguard Worker tccp->m_dc_level_shift = l_dc_shift[i];
8193*3ac0a46fSAndroid Build Coastguard Worker }
8194*3ac0a46fSAndroid Build Coastguard Worker
8195*3ac0a46fSAndroid Build Coastguard Worker if (opj_j2k_setup_mct_encoding(tcp, image) == OPJ_FALSE) {
8196*3ac0a46fSAndroid Build Coastguard Worker /* free will be handled by opj_j2k_destroy */
8197*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Failed to setup j2k mct encoding\n");
8198*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8199*3ac0a46fSAndroid Build Coastguard Worker }
8200*3ac0a46fSAndroid Build Coastguard Worker } else {
8201*3ac0a46fSAndroid Build Coastguard Worker if (tcp->mct == 1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
8202*3ac0a46fSAndroid Build Coastguard Worker if ((image->comps[0].dx != image->comps[1].dx) ||
8203*3ac0a46fSAndroid Build Coastguard Worker (image->comps[0].dx != image->comps[2].dx) ||
8204*3ac0a46fSAndroid Build Coastguard Worker (image->comps[0].dy != image->comps[1].dy) ||
8205*3ac0a46fSAndroid Build Coastguard Worker (image->comps[0].dy != image->comps[2].dy)) {
8206*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
8207*3ac0a46fSAndroid Build Coastguard Worker "Cannot perform MCT on components with different sizes. Disabling MCT.\n");
8208*3ac0a46fSAndroid Build Coastguard Worker tcp->mct = 0;
8209*3ac0a46fSAndroid Build Coastguard Worker }
8210*3ac0a46fSAndroid Build Coastguard Worker }
8211*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < image->numcomps; i++) {
8212*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *tccp = &tcp->tccps[i];
8213*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_comp = &(image->comps[i]);
8214*3ac0a46fSAndroid Build Coastguard Worker
8215*3ac0a46fSAndroid Build Coastguard Worker if (! l_comp->sgnd) {
8216*3ac0a46fSAndroid Build Coastguard Worker tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
8217*3ac0a46fSAndroid Build Coastguard Worker }
8218*3ac0a46fSAndroid Build Coastguard Worker }
8219*3ac0a46fSAndroid Build Coastguard Worker }
8220*3ac0a46fSAndroid Build Coastguard Worker
8221*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < image->numcomps; i++) {
8222*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *tccp = &tcp->tccps[i];
8223*3ac0a46fSAndroid Build Coastguard Worker
8224*3ac0a46fSAndroid Build Coastguard Worker tccp->csty = parameters->csty &
8225*3ac0a46fSAndroid Build Coastguard Worker 0x01; /* 0 => one precinct || 1 => custom precinct */
8226*3ac0a46fSAndroid Build Coastguard Worker tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
8227*3ac0a46fSAndroid Build Coastguard Worker tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
8228*3ac0a46fSAndroid Build Coastguard Worker tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
8229*3ac0a46fSAndroid Build Coastguard Worker tccp->cblksty = (OPJ_UINT32)parameters->mode;
8230*3ac0a46fSAndroid Build Coastguard Worker tccp->qmfbid = parameters->irreversible ? 0 : 1;
8231*3ac0a46fSAndroid Build Coastguard Worker tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT :
8232*3ac0a46fSAndroid Build Coastguard Worker J2K_CCP_QNTSTY_NOQNT;
8233*3ac0a46fSAndroid Build Coastguard Worker tccp->numgbits = 2;
8234*3ac0a46fSAndroid Build Coastguard Worker
8235*3ac0a46fSAndroid Build Coastguard Worker if ((OPJ_INT32)i == parameters->roi_compno) {
8236*3ac0a46fSAndroid Build Coastguard Worker tccp->roishift = parameters->roi_shift;
8237*3ac0a46fSAndroid Build Coastguard Worker } else {
8238*3ac0a46fSAndroid Build Coastguard Worker tccp->roishift = 0;
8239*3ac0a46fSAndroid Build Coastguard Worker }
8240*3ac0a46fSAndroid Build Coastguard Worker
8241*3ac0a46fSAndroid Build Coastguard Worker if (parameters->csty & J2K_CCP_CSTY_PRT) {
8242*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 p = 0, it_res;
8243*3ac0a46fSAndroid Build Coastguard Worker assert(tccp->numresolutions > 0);
8244*3ac0a46fSAndroid Build Coastguard Worker for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
8245*3ac0a46fSAndroid Build Coastguard Worker if (p < parameters->res_spec) {
8246*3ac0a46fSAndroid Build Coastguard Worker
8247*3ac0a46fSAndroid Build Coastguard Worker if (parameters->prcw_init[p] < 1) {
8248*3ac0a46fSAndroid Build Coastguard Worker tccp->prcw[it_res] = 1;
8249*3ac0a46fSAndroid Build Coastguard Worker } else {
8250*3ac0a46fSAndroid Build Coastguard Worker tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
8251*3ac0a46fSAndroid Build Coastguard Worker }
8252*3ac0a46fSAndroid Build Coastguard Worker
8253*3ac0a46fSAndroid Build Coastguard Worker if (parameters->prch_init[p] < 1) {
8254*3ac0a46fSAndroid Build Coastguard Worker tccp->prch[it_res] = 1;
8255*3ac0a46fSAndroid Build Coastguard Worker } else {
8256*3ac0a46fSAndroid Build Coastguard Worker tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
8257*3ac0a46fSAndroid Build Coastguard Worker }
8258*3ac0a46fSAndroid Build Coastguard Worker
8259*3ac0a46fSAndroid Build Coastguard Worker } else {
8260*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 res_spec = parameters->res_spec;
8261*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 size_prcw = 0;
8262*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 size_prch = 0;
8263*3ac0a46fSAndroid Build Coastguard Worker
8264*3ac0a46fSAndroid Build Coastguard Worker assert(res_spec > 0); /* issue 189 */
8265*3ac0a46fSAndroid Build Coastguard Worker size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
8266*3ac0a46fSAndroid Build Coastguard Worker size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
8267*3ac0a46fSAndroid Build Coastguard Worker
8268*3ac0a46fSAndroid Build Coastguard Worker
8269*3ac0a46fSAndroid Build Coastguard Worker if (size_prcw < 1) {
8270*3ac0a46fSAndroid Build Coastguard Worker tccp->prcw[it_res] = 1;
8271*3ac0a46fSAndroid Build Coastguard Worker } else {
8272*3ac0a46fSAndroid Build Coastguard Worker tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
8273*3ac0a46fSAndroid Build Coastguard Worker }
8274*3ac0a46fSAndroid Build Coastguard Worker
8275*3ac0a46fSAndroid Build Coastguard Worker if (size_prch < 1) {
8276*3ac0a46fSAndroid Build Coastguard Worker tccp->prch[it_res] = 1;
8277*3ac0a46fSAndroid Build Coastguard Worker } else {
8278*3ac0a46fSAndroid Build Coastguard Worker tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
8279*3ac0a46fSAndroid Build Coastguard Worker }
8280*3ac0a46fSAndroid Build Coastguard Worker }
8281*3ac0a46fSAndroid Build Coastguard Worker p++;
8282*3ac0a46fSAndroid Build Coastguard Worker /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
8283*3ac0a46fSAndroid Build Coastguard Worker } /*end for*/
8284*3ac0a46fSAndroid Build Coastguard Worker } else {
8285*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < tccp->numresolutions; j++) {
8286*3ac0a46fSAndroid Build Coastguard Worker tccp->prcw[j] = 15;
8287*3ac0a46fSAndroid Build Coastguard Worker tccp->prch[j] = 15;
8288*3ac0a46fSAndroid Build Coastguard Worker }
8289*3ac0a46fSAndroid Build Coastguard Worker }
8290*3ac0a46fSAndroid Build Coastguard Worker
8291*3ac0a46fSAndroid Build Coastguard Worker opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
8292*3ac0a46fSAndroid Build Coastguard Worker }
8293*3ac0a46fSAndroid Build Coastguard Worker }
8294*3ac0a46fSAndroid Build Coastguard Worker
8295*3ac0a46fSAndroid Build Coastguard Worker if (parameters->mct_data) {
8296*3ac0a46fSAndroid Build Coastguard Worker opj_free(parameters->mct_data);
8297*3ac0a46fSAndroid Build Coastguard Worker parameters->mct_data = 00;
8298*3ac0a46fSAndroid Build Coastguard Worker }
8299*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8300*3ac0a46fSAndroid Build Coastguard Worker }
8301*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_add_mhmarker(opj_codestream_index_t * cstr_index,OPJ_UINT32 type,OPJ_OFF_T pos,OPJ_UINT32 len)8302*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
8303*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
8304*3ac0a46fSAndroid Build Coastguard Worker {
8305*3ac0a46fSAndroid Build Coastguard Worker assert(cstr_index != 00);
8306*3ac0a46fSAndroid Build Coastguard Worker
8307*3ac0a46fSAndroid Build Coastguard Worker /* expand the list? */
8308*3ac0a46fSAndroid Build Coastguard Worker if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
8309*3ac0a46fSAndroid Build Coastguard Worker opj_marker_info_t *new_marker;
8310*3ac0a46fSAndroid Build Coastguard Worker cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32)
8311*3ac0a46fSAndroid Build Coastguard Worker cstr_index->maxmarknum);
8312*3ac0a46fSAndroid Build Coastguard Worker new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker,
8313*3ac0a46fSAndroid Build Coastguard Worker cstr_index->maxmarknum * sizeof(opj_marker_info_t));
8314*3ac0a46fSAndroid Build Coastguard Worker if (! new_marker) {
8315*3ac0a46fSAndroid Build Coastguard Worker opj_free(cstr_index->marker);
8316*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker = NULL;
8317*3ac0a46fSAndroid Build Coastguard Worker cstr_index->maxmarknum = 0;
8318*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marknum = 0;
8319*3ac0a46fSAndroid Build Coastguard Worker /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
8320*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8321*3ac0a46fSAndroid Build Coastguard Worker }
8322*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker = new_marker;
8323*3ac0a46fSAndroid Build Coastguard Worker }
8324*3ac0a46fSAndroid Build Coastguard Worker
8325*3ac0a46fSAndroid Build Coastguard Worker /* add the marker */
8326*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
8327*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
8328*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
8329*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marknum++;
8330*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8331*3ac0a46fSAndroid Build Coastguard Worker }
8332*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_add_tlmarker(OPJ_UINT32 tileno,opj_codestream_index_t * cstr_index,OPJ_UINT32 type,OPJ_OFF_T pos,OPJ_UINT32 len)8333*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
8334*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
8335*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 len)
8336*3ac0a46fSAndroid Build Coastguard Worker {
8337*3ac0a46fSAndroid Build Coastguard Worker assert(cstr_index != 00);
8338*3ac0a46fSAndroid Build Coastguard Worker assert(cstr_index->tile_index != 00);
8339*3ac0a46fSAndroid Build Coastguard Worker
8340*3ac0a46fSAndroid Build Coastguard Worker /* expand the list? */
8341*3ac0a46fSAndroid Build Coastguard Worker if ((cstr_index->tile_index[tileno].marknum + 1) >
8342*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].maxmarknum) {
8343*3ac0a46fSAndroid Build Coastguard Worker opj_marker_info_t *new_marker;
8344*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 +
8345*3ac0a46fSAndroid Build Coastguard Worker (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
8346*3ac0a46fSAndroid Build Coastguard Worker new_marker = (opj_marker_info_t *) opj_realloc(
8347*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].marker,
8348*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].maxmarknum * sizeof(opj_marker_info_t));
8349*3ac0a46fSAndroid Build Coastguard Worker if (! new_marker) {
8350*3ac0a46fSAndroid Build Coastguard Worker opj_free(cstr_index->tile_index[tileno].marker);
8351*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].marker = NULL;
8352*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].maxmarknum = 0;
8353*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].marknum = 0;
8354*3ac0a46fSAndroid Build Coastguard Worker /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
8355*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8356*3ac0a46fSAndroid Build Coastguard Worker }
8357*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].marker = new_marker;
8358*3ac0a46fSAndroid Build Coastguard Worker }
8359*3ac0a46fSAndroid Build Coastguard Worker
8360*3ac0a46fSAndroid Build Coastguard Worker /* add the marker */
8361*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type
8362*3ac0a46fSAndroid Build Coastguard Worker = (OPJ_UINT16)type;
8363*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos
8364*3ac0a46fSAndroid Build Coastguard Worker = (OPJ_INT32)pos;
8365*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len
8366*3ac0a46fSAndroid Build Coastguard Worker = (OPJ_INT32)len;
8367*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].marknum++;
8368*3ac0a46fSAndroid Build Coastguard Worker
8369*3ac0a46fSAndroid Build Coastguard Worker if (type == J2K_MS_SOT) {
8370*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
8371*3ac0a46fSAndroid Build Coastguard Worker
8372*3ac0a46fSAndroid Build Coastguard Worker if (cstr_index->tile_index[tileno].tp_index) {
8373*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
8374*3ac0a46fSAndroid Build Coastguard Worker }
8375*3ac0a46fSAndroid Build Coastguard Worker
8376*3ac0a46fSAndroid Build Coastguard Worker }
8377*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8378*3ac0a46fSAndroid Build Coastguard Worker }
8379*3ac0a46fSAndroid Build Coastguard Worker
8380*3ac0a46fSAndroid Build Coastguard Worker /*
8381*3ac0a46fSAndroid Build Coastguard Worker * -----------------------------------------------------------------------
8382*3ac0a46fSAndroid Build Coastguard Worker * -----------------------------------------------------------------------
8383*3ac0a46fSAndroid Build Coastguard Worker * -----------------------------------------------------------------------
8384*3ac0a46fSAndroid Build Coastguard Worker */
8385*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_end_decompress(void * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)8386*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_end_decompress(void *p_j2k,
8387*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
8388*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
8389*3ac0a46fSAndroid Build Coastguard Worker )
8390*3ac0a46fSAndroid Build Coastguard Worker {
8391*3ac0a46fSAndroid Build Coastguard Worker (void)p_j2k;
8392*3ac0a46fSAndroid Build Coastguard Worker (void)p_stream;
8393*3ac0a46fSAndroid Build Coastguard Worker (void)p_manager;
8394*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8395*3ac0a46fSAndroid Build Coastguard Worker }
8396*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_header(opj_stream_private_t * p_stream,void * j2k,opj_image_t ** p_image,opj_event_mgr_t * p_manager)8397*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_read_header(opj_stream_private_t *p_stream,
8398*3ac0a46fSAndroid Build Coastguard Worker void* j2k,
8399*3ac0a46fSAndroid Build Coastguard Worker opj_image_t** p_image,
8400*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t* p_manager)
8401*3ac0a46fSAndroid Build Coastguard Worker {
8402*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t *p_j2k = (opj_j2k_t*)j2k;
8403*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
8404*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
8405*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
8406*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
8407*3ac0a46fSAndroid Build Coastguard Worker
8408*3ac0a46fSAndroid Build Coastguard Worker /* create an empty image header */
8409*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = opj_image_create0();
8410*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_private_image) {
8411*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8412*3ac0a46fSAndroid Build Coastguard Worker }
8413*3ac0a46fSAndroid Build Coastguard Worker
8414*3ac0a46fSAndroid Build Coastguard Worker /* customization of the validation */
8415*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_setup_decoding_validation(p_j2k, p_manager)) {
8416*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_private_image);
8417*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = NULL;
8418*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8419*3ac0a46fSAndroid Build Coastguard Worker }
8420*3ac0a46fSAndroid Build Coastguard Worker
8421*3ac0a46fSAndroid Build Coastguard Worker /* validation of the parameters codec */
8422*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
8423*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_private_image);
8424*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = NULL;
8425*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8426*3ac0a46fSAndroid Build Coastguard Worker }
8427*3ac0a46fSAndroid Build Coastguard Worker
8428*3ac0a46fSAndroid Build Coastguard Worker /* customization of the encoding */
8429*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_setup_header_reading(p_j2k, p_manager)) {
8430*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_private_image);
8431*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = NULL;
8432*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8433*3ac0a46fSAndroid Build Coastguard Worker }
8434*3ac0a46fSAndroid Build Coastguard Worker
8435*3ac0a46fSAndroid Build Coastguard Worker /* read header */
8436*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
8437*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_private_image);
8438*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = NULL;
8439*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8440*3ac0a46fSAndroid Build Coastguard Worker }
8441*3ac0a46fSAndroid Build Coastguard Worker
8442*3ac0a46fSAndroid Build Coastguard Worker *p_image = opj_image_create0();
8443*3ac0a46fSAndroid Build Coastguard Worker if (!(*p_image)) {
8444*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8445*3ac0a46fSAndroid Build Coastguard Worker }
8446*3ac0a46fSAndroid Build Coastguard Worker
8447*3ac0a46fSAndroid Build Coastguard Worker /* Copy codestream image information to the output image */
8448*3ac0a46fSAndroid Build Coastguard Worker opj_copy_image_header(p_j2k->m_private_image, *p_image);
8449*3ac0a46fSAndroid Build Coastguard Worker
8450*3ac0a46fSAndroid Build Coastguard Worker /*Allocate and initialize some elements of codestrem index*/
8451*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
8452*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(*p_image);
8453*3ac0a46fSAndroid Build Coastguard Worker *p_image = NULL;
8454*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8455*3ac0a46fSAndroid Build Coastguard Worker }
8456*3ac0a46fSAndroid Build Coastguard Worker
8457*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8458*3ac0a46fSAndroid Build Coastguard Worker }
8459*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_setup_header_reading(opj_j2k_t * p_j2k,opj_event_mgr_t * p_manager)8460*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
8461*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
8462*3ac0a46fSAndroid Build Coastguard Worker {
8463*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
8464*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
8465*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
8466*3ac0a46fSAndroid Build Coastguard Worker
8467*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
8468*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_read_header_procedure, p_manager)) {
8469*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8470*3ac0a46fSAndroid Build Coastguard Worker }
8471*3ac0a46fSAndroid Build Coastguard Worker
8472*3ac0a46fSAndroid Build Coastguard Worker /* DEVELOPER CORNER, add your custom procedures */
8473*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
8474*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager)) {
8475*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8476*3ac0a46fSAndroid Build Coastguard Worker }
8477*3ac0a46fSAndroid Build Coastguard Worker
8478*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8479*3ac0a46fSAndroid Build Coastguard Worker }
8480*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_setup_decoding_validation(opj_j2k_t * p_j2k,opj_event_mgr_t * p_manager)8481*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
8482*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
8483*3ac0a46fSAndroid Build Coastguard Worker {
8484*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
8485*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
8486*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
8487*3ac0a46fSAndroid Build Coastguard Worker
8488*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
8489*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_build_decoder, p_manager)) {
8490*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8491*3ac0a46fSAndroid Build Coastguard Worker }
8492*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
8493*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_decoding_validation, p_manager)) {
8494*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8495*3ac0a46fSAndroid Build Coastguard Worker }
8496*3ac0a46fSAndroid Build Coastguard Worker
8497*3ac0a46fSAndroid Build Coastguard Worker /* DEVELOPER CORNER, add your custom validation procedure */
8498*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8499*3ac0a46fSAndroid Build Coastguard Worker }
8500*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_mct_validation(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)8501*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_mct_validation(opj_j2k_t * p_j2k,
8502*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
8503*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
8504*3ac0a46fSAndroid Build Coastguard Worker {
8505*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_is_valid = OPJ_TRUE;
8506*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
8507*3ac0a46fSAndroid Build Coastguard Worker
8508*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
8509*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
8510*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
8511*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
8512*3ac0a46fSAndroid Build Coastguard Worker
8513*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
8514*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
8515*3ac0a46fSAndroid Build Coastguard Worker
8516*3ac0a46fSAndroid Build Coastguard Worker if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
8517*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
8518*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
8519*3ac0a46fSAndroid Build Coastguard Worker
8520*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
8521*3ac0a46fSAndroid Build Coastguard Worker if (l_tcp->mct == 2) {
8522*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t * l_tccp = l_tcp->tccps;
8523*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
8524*3ac0a46fSAndroid Build Coastguard Worker
8525*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < p_j2k->m_private_image->numcomps; ++j) {
8526*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= !(l_tccp->qmfbid & 1);
8527*3ac0a46fSAndroid Build Coastguard Worker ++l_tccp;
8528*3ac0a46fSAndroid Build Coastguard Worker }
8529*3ac0a46fSAndroid Build Coastguard Worker }
8530*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
8531*3ac0a46fSAndroid Build Coastguard Worker }
8532*3ac0a46fSAndroid Build Coastguard Worker }
8533*3ac0a46fSAndroid Build Coastguard Worker
8534*3ac0a46fSAndroid Build Coastguard Worker return l_is_valid;
8535*3ac0a46fSAndroid Build Coastguard Worker }
8536*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp,opj_image_t * p_image)8537*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)
8538*3ac0a46fSAndroid Build Coastguard Worker {
8539*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
8540*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_indix = 1;
8541*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * l_mct_deco_data = 00, * l_mct_offset_data = 00;
8542*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t * l_mcc_data;
8543*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_mct_size, l_nb_elem;
8544*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 * l_data, * l_current_data;
8545*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t * l_tccp;
8546*3ac0a46fSAndroid Build Coastguard Worker
8547*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
8548*3ac0a46fSAndroid Build Coastguard Worker assert(p_tcp != 00);
8549*3ac0a46fSAndroid Build Coastguard Worker
8550*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->mct != 2) {
8551*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8552*3ac0a46fSAndroid Build Coastguard Worker }
8553*3ac0a46fSAndroid Build Coastguard Worker
8554*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_mct_decoding_matrix) {
8555*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
8556*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t *new_mct_records;
8557*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8558*3ac0a46fSAndroid Build Coastguard Worker
8559*3ac0a46fSAndroid Build Coastguard Worker new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
8560*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
8561*3ac0a46fSAndroid Build Coastguard Worker if (! new_mct_records) {
8562*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->m_mct_records);
8563*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_records = NULL;
8564*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mct_records = 0;
8565*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_mct_records = 0;
8566*3ac0a46fSAndroid Build Coastguard Worker /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8567*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8568*3ac0a46fSAndroid Build Coastguard Worker }
8569*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_records = new_mct_records;
8570*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8571*3ac0a46fSAndroid Build Coastguard Worker
8572*3ac0a46fSAndroid Build Coastguard Worker memset(l_mct_deco_data, 0,
8573*3ac0a46fSAndroid Build Coastguard Worker (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
8574*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t));
8575*3ac0a46fSAndroid Build Coastguard Worker }
8576*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8577*3ac0a46fSAndroid Build Coastguard Worker
8578*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_deco_data->m_data) {
8579*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_mct_deco_data->m_data);
8580*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data->m_data = 00;
8581*3ac0a46fSAndroid Build Coastguard Worker }
8582*3ac0a46fSAndroid Build Coastguard Worker
8583*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data->m_index = l_indix++;
8584*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
8585*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
8586*3ac0a46fSAndroid Build Coastguard Worker l_nb_elem = p_image->numcomps * p_image->numcomps;
8587*3ac0a46fSAndroid Build Coastguard Worker l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
8588*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
8589*3ac0a46fSAndroid Build Coastguard Worker
8590*3ac0a46fSAndroid Build Coastguard Worker if (! l_mct_deco_data->m_data) {
8591*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8592*3ac0a46fSAndroid Build Coastguard Worker }
8593*3ac0a46fSAndroid Build Coastguard Worker
8594*3ac0a46fSAndroid Build Coastguard Worker j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](
8595*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_decoding_matrix, l_mct_deco_data->m_data, l_nb_elem);
8596*3ac0a46fSAndroid Build Coastguard Worker
8597*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data->m_data_size = l_mct_size;
8598*3ac0a46fSAndroid Build Coastguard Worker ++p_tcp->m_nb_mct_records;
8599*3ac0a46fSAndroid Build Coastguard Worker }
8600*3ac0a46fSAndroid Build Coastguard Worker
8601*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
8602*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t *new_mct_records;
8603*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8604*3ac0a46fSAndroid Build Coastguard Worker new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
8605*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
8606*3ac0a46fSAndroid Build Coastguard Worker if (! new_mct_records) {
8607*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->m_mct_records);
8608*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_records = NULL;
8609*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mct_records = 0;
8610*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_mct_records = 0;
8611*3ac0a46fSAndroid Build Coastguard Worker /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8612*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8613*3ac0a46fSAndroid Build Coastguard Worker }
8614*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_records = new_mct_records;
8615*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8616*3ac0a46fSAndroid Build Coastguard Worker
8617*3ac0a46fSAndroid Build Coastguard Worker memset(l_mct_offset_data, 0,
8618*3ac0a46fSAndroid Build Coastguard Worker (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
8619*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t));
8620*3ac0a46fSAndroid Build Coastguard Worker
8621*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_deco_data) {
8622*3ac0a46fSAndroid Build Coastguard Worker l_mct_deco_data = l_mct_offset_data - 1;
8623*3ac0a46fSAndroid Build Coastguard Worker }
8624*3ac0a46fSAndroid Build Coastguard Worker }
8625*3ac0a46fSAndroid Build Coastguard Worker
8626*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
8627*3ac0a46fSAndroid Build Coastguard Worker
8628*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_offset_data->m_data) {
8629*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_mct_offset_data->m_data);
8630*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data->m_data = 00;
8631*3ac0a46fSAndroid Build Coastguard Worker }
8632*3ac0a46fSAndroid Build Coastguard Worker
8633*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data->m_index = l_indix++;
8634*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
8635*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
8636*3ac0a46fSAndroid Build Coastguard Worker l_nb_elem = p_image->numcomps;
8637*3ac0a46fSAndroid Build Coastguard Worker l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
8638*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
8639*3ac0a46fSAndroid Build Coastguard Worker
8640*3ac0a46fSAndroid Build Coastguard Worker if (! l_mct_offset_data->m_data) {
8641*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8642*3ac0a46fSAndroid Build Coastguard Worker }
8643*3ac0a46fSAndroid Build Coastguard Worker
8644*3ac0a46fSAndroid Build Coastguard Worker l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
8645*3ac0a46fSAndroid Build Coastguard Worker if (! l_data) {
8646*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_mct_offset_data->m_data);
8647*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data->m_data = 00;
8648*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8649*3ac0a46fSAndroid Build Coastguard Worker }
8650*3ac0a46fSAndroid Build Coastguard Worker
8651*3ac0a46fSAndroid Build Coastguard Worker l_tccp = p_tcp->tccps;
8652*3ac0a46fSAndroid Build Coastguard Worker l_current_data = l_data;
8653*3ac0a46fSAndroid Build Coastguard Worker
8654*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_elem; ++i) {
8655*3ac0a46fSAndroid Build Coastguard Worker *(l_current_data++) = (OPJ_FLOAT32)(l_tccp->m_dc_level_shift);
8656*3ac0a46fSAndroid Build Coastguard Worker ++l_tccp;
8657*3ac0a46fSAndroid Build Coastguard Worker }
8658*3ac0a46fSAndroid Build Coastguard Worker
8659*3ac0a46fSAndroid Build Coastguard Worker j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,
8660*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data->m_data, l_nb_elem);
8661*3ac0a46fSAndroid Build Coastguard Worker
8662*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_data);
8663*3ac0a46fSAndroid Build Coastguard Worker
8664*3ac0a46fSAndroid Build Coastguard Worker l_mct_offset_data->m_data_size = l_mct_size;
8665*3ac0a46fSAndroid Build Coastguard Worker
8666*3ac0a46fSAndroid Build Coastguard Worker ++p_tcp->m_nb_mct_records;
8667*3ac0a46fSAndroid Build Coastguard Worker
8668*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
8669*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t *new_mcc_records;
8670*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
8671*3ac0a46fSAndroid Build Coastguard Worker new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
8672*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(
8673*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t));
8674*3ac0a46fSAndroid Build Coastguard Worker if (! new_mcc_records) {
8675*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->m_mcc_records);
8676*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mcc_records = NULL;
8677*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mcc_records = 0;
8678*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_mcc_records = 0;
8679*3ac0a46fSAndroid Build Coastguard Worker /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
8680*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8681*3ac0a46fSAndroid Build Coastguard Worker }
8682*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mcc_records = new_mcc_records;
8683*3ac0a46fSAndroid Build Coastguard Worker l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
8684*3ac0a46fSAndroid Build Coastguard Worker memset(l_mcc_data, 0, (p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) *
8685*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_simple_mcc_decorrelation_data_t));
8686*3ac0a46fSAndroid Build Coastguard Worker
8687*3ac0a46fSAndroid Build Coastguard Worker }
8688*3ac0a46fSAndroid Build Coastguard Worker
8689*3ac0a46fSAndroid Build Coastguard Worker l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
8690*3ac0a46fSAndroid Build Coastguard Worker l_mcc_data->m_decorrelation_array = l_mct_deco_data;
8691*3ac0a46fSAndroid Build Coastguard Worker l_mcc_data->m_is_irreversible = 1;
8692*3ac0a46fSAndroid Build Coastguard Worker l_mcc_data->m_nb_comps = p_image->numcomps;
8693*3ac0a46fSAndroid Build Coastguard Worker l_mcc_data->m_index = l_indix++;
8694*3ac0a46fSAndroid Build Coastguard Worker l_mcc_data->m_offset_array = l_mct_offset_data;
8695*3ac0a46fSAndroid Build Coastguard Worker ++p_tcp->m_nb_mcc_records;
8696*3ac0a46fSAndroid Build Coastguard Worker
8697*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8698*3ac0a46fSAndroid Build Coastguard Worker }
8699*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_build_decoder(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)8700*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_build_decoder(opj_j2k_t * p_j2k,
8701*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
8702*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
8703*3ac0a46fSAndroid Build Coastguard Worker {
8704*3ac0a46fSAndroid Build Coastguard Worker /* add here initialization of cp
8705*3ac0a46fSAndroid Build Coastguard Worker copy paste of setup_decoder */
8706*3ac0a46fSAndroid Build Coastguard Worker (void)p_j2k;
8707*3ac0a46fSAndroid Build Coastguard Worker (void)p_stream;
8708*3ac0a46fSAndroid Build Coastguard Worker (void)p_manager;
8709*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8710*3ac0a46fSAndroid Build Coastguard Worker }
8711*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_build_encoder(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)8712*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_build_encoder(opj_j2k_t * p_j2k,
8713*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
8714*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
8715*3ac0a46fSAndroid Build Coastguard Worker {
8716*3ac0a46fSAndroid Build Coastguard Worker /* add here initialization of cp
8717*3ac0a46fSAndroid Build Coastguard Worker copy paste of setup_encoder */
8718*3ac0a46fSAndroid Build Coastguard Worker (void)p_j2k;
8719*3ac0a46fSAndroid Build Coastguard Worker (void)p_stream;
8720*3ac0a46fSAndroid Build Coastguard Worker (void)p_manager;
8721*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8722*3ac0a46fSAndroid Build Coastguard Worker }
8723*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_encoding_validation(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)8724*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_encoding_validation(opj_j2k_t * p_j2k,
8725*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
8726*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
8727*3ac0a46fSAndroid Build Coastguard Worker {
8728*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_is_valid = OPJ_TRUE;
8729*3ac0a46fSAndroid Build Coastguard Worker
8730*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
8731*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
8732*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
8733*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
8734*3ac0a46fSAndroid Build Coastguard Worker
8735*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
8736*3ac0a46fSAndroid Build Coastguard Worker
8737*3ac0a46fSAndroid Build Coastguard Worker /* STATE checking */
8738*3ac0a46fSAndroid Build Coastguard Worker /* make sure the state is at 0 */
8739*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
8740*3ac0a46fSAndroid Build Coastguard Worker
8741*3ac0a46fSAndroid Build Coastguard Worker /* POINTER validation */
8742*3ac0a46fSAndroid Build Coastguard Worker /* make sure a p_j2k codec is present */
8743*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= (p_j2k->m_procedure_list != 00);
8744*3ac0a46fSAndroid Build Coastguard Worker /* make sure a validation list is present */
8745*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= (p_j2k->m_validation_list != 00);
8746*3ac0a46fSAndroid Build Coastguard Worker
8747*3ac0a46fSAndroid Build Coastguard Worker /* ISO 15444-1:2004 states between 1 & 33 (0 -> 32) */
8748*3ac0a46fSAndroid Build Coastguard Worker /* 33 (32) would always fail the check below (if a cast to 64bits was done) */
8749*3ac0a46fSAndroid Build Coastguard Worker /* FIXME Shall we change OPJ_J2K_MAXRLVLS to 32 ? */
8750*3ac0a46fSAndroid Build Coastguard Worker if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) ||
8751*3ac0a46fSAndroid Build Coastguard Worker (p_j2k->m_cp.tcps->tccps->numresolutions > 32)) {
8752*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8753*3ac0a46fSAndroid Build Coastguard Worker "Number of resolutions is too high in comparison to the size of tiles\n");
8754*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8755*3ac0a46fSAndroid Build Coastguard Worker }
8756*3ac0a46fSAndroid Build Coastguard Worker
8757*3ac0a46fSAndroid Build Coastguard Worker if ((p_j2k->m_cp.tdx) < (OPJ_UINT32)(1 <<
8758*3ac0a46fSAndroid Build Coastguard Worker (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
8759*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8760*3ac0a46fSAndroid Build Coastguard Worker "Number of resolutions is too high in comparison to the size of tiles\n");
8761*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8762*3ac0a46fSAndroid Build Coastguard Worker }
8763*3ac0a46fSAndroid Build Coastguard Worker
8764*3ac0a46fSAndroid Build Coastguard Worker if ((p_j2k->m_cp.tdy) < (OPJ_UINT32)(1 <<
8765*3ac0a46fSAndroid Build Coastguard Worker (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
8766*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8767*3ac0a46fSAndroid Build Coastguard Worker "Number of resolutions is too high in comparison to the size of tiles\n");
8768*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8769*3ac0a46fSAndroid Build Coastguard Worker }
8770*3ac0a46fSAndroid Build Coastguard Worker
8771*3ac0a46fSAndroid Build Coastguard Worker /* PARAMETER VALIDATION */
8772*3ac0a46fSAndroid Build Coastguard Worker return l_is_valid;
8773*3ac0a46fSAndroid Build Coastguard Worker }
8774*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_decoding_validation(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)8775*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_decoding_validation(opj_j2k_t *p_j2k,
8776*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
8777*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
8778*3ac0a46fSAndroid Build Coastguard Worker )
8779*3ac0a46fSAndroid Build Coastguard Worker {
8780*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_is_valid = OPJ_TRUE;
8781*3ac0a46fSAndroid Build Coastguard Worker
8782*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
8783*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
8784*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
8785*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
8786*3ac0a46fSAndroid Build Coastguard Worker
8787*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
8788*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
8789*3ac0a46fSAndroid Build Coastguard Worker
8790*3ac0a46fSAndroid Build Coastguard Worker /* STATE checking */
8791*3ac0a46fSAndroid Build Coastguard Worker /* make sure the state is at 0 */
8792*3ac0a46fSAndroid Build Coastguard Worker #ifdef TODO_MSD
8793*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
8794*3ac0a46fSAndroid Build Coastguard Worker #endif
8795*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
8796*3ac0a46fSAndroid Build Coastguard Worker
8797*3ac0a46fSAndroid Build Coastguard Worker /* POINTER validation */
8798*3ac0a46fSAndroid Build Coastguard Worker /* make sure a p_j2k codec is present */
8799*3ac0a46fSAndroid Build Coastguard Worker /* make sure a procedure list is present */
8800*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= (p_j2k->m_procedure_list != 00);
8801*3ac0a46fSAndroid Build Coastguard Worker /* make sure a validation list is present */
8802*3ac0a46fSAndroid Build Coastguard Worker l_is_valid &= (p_j2k->m_validation_list != 00);
8803*3ac0a46fSAndroid Build Coastguard Worker
8804*3ac0a46fSAndroid Build Coastguard Worker /* PARAMETER VALIDATION */
8805*3ac0a46fSAndroid Build Coastguard Worker return l_is_valid;
8806*3ac0a46fSAndroid Build Coastguard Worker }
8807*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_header_procedure(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)8808*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_header_procedure(opj_j2k_t *p_j2k,
8809*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
8810*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
8811*3ac0a46fSAndroid Build Coastguard Worker {
8812*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_marker;
8813*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_marker_size;
8814*3ac0a46fSAndroid Build Coastguard Worker const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
8815*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_has_siz = 0;
8816*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_has_cod = 0;
8817*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_has_qcd = 0;
8818*3ac0a46fSAndroid Build Coastguard Worker
8819*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
8820*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
8821*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
8822*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
8823*3ac0a46fSAndroid Build Coastguard Worker
8824*3ac0a46fSAndroid Build Coastguard Worker /* We enter in the main header */
8825*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
8826*3ac0a46fSAndroid Build Coastguard Worker
8827*3ac0a46fSAndroid Build Coastguard Worker /* Try to read the SOC marker, the codestream must begin with SOC marker */
8828*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_soc(p_j2k, p_stream, p_manager)) {
8829*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
8830*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8831*3ac0a46fSAndroid Build Coastguard Worker }
8832*3ac0a46fSAndroid Build Coastguard Worker
8833*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
8834*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
8835*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
8836*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8837*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8838*3ac0a46fSAndroid Build Coastguard Worker }
8839*3ac0a46fSAndroid Build Coastguard Worker
8840*3ac0a46fSAndroid Build Coastguard Worker /* Read 2 bytes as the new marker ID */
8841*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
8842*3ac0a46fSAndroid Build Coastguard Worker &l_current_marker, 2);
8843*3ac0a46fSAndroid Build Coastguard Worker
8844*3ac0a46fSAndroid Build Coastguard Worker /* Try to read until the SOT is detected */
8845*3ac0a46fSAndroid Build Coastguard Worker while (l_current_marker != J2K_MS_SOT) {
8846*3ac0a46fSAndroid Build Coastguard Worker
8847*3ac0a46fSAndroid Build Coastguard Worker /* Check if the current marker ID is valid */
8848*3ac0a46fSAndroid Build Coastguard Worker if (l_current_marker < 0xff00) {
8849*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8850*3ac0a46fSAndroid Build Coastguard Worker "A marker ID was expected (0xff--) instead of %.8x\n", l_current_marker);
8851*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8852*3ac0a46fSAndroid Build Coastguard Worker }
8853*3ac0a46fSAndroid Build Coastguard Worker
8854*3ac0a46fSAndroid Build Coastguard Worker /* Get the marker handler from the marker ID */
8855*3ac0a46fSAndroid Build Coastguard Worker l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
8856*3ac0a46fSAndroid Build Coastguard Worker
8857*3ac0a46fSAndroid Build Coastguard Worker /* Manage case where marker is unknown */
8858*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_handler->id == J2K_MS_UNK) {
8859*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)) {
8860*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8861*3ac0a46fSAndroid Build Coastguard Worker "Unknown marker has been detected and generated error.\n");
8862*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8863*3ac0a46fSAndroid Build Coastguard Worker }
8864*3ac0a46fSAndroid Build Coastguard Worker
8865*3ac0a46fSAndroid Build Coastguard Worker if (l_current_marker == J2K_MS_SOT) {
8866*3ac0a46fSAndroid Build Coastguard Worker break; /* SOT marker is detected main header is completely read */
8867*3ac0a46fSAndroid Build Coastguard Worker } else { /* Get the marker handler from the marker ID */
8868*3ac0a46fSAndroid Build Coastguard Worker l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
8869*3ac0a46fSAndroid Build Coastguard Worker }
8870*3ac0a46fSAndroid Build Coastguard Worker }
8871*3ac0a46fSAndroid Build Coastguard Worker
8872*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_handler->id == J2K_MS_SIZ) {
8873*3ac0a46fSAndroid Build Coastguard Worker /* Mark required SIZ marker as found */
8874*3ac0a46fSAndroid Build Coastguard Worker l_has_siz = 1;
8875*3ac0a46fSAndroid Build Coastguard Worker }
8876*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_handler->id == J2K_MS_COD) {
8877*3ac0a46fSAndroid Build Coastguard Worker /* Mark required COD marker as found */
8878*3ac0a46fSAndroid Build Coastguard Worker l_has_cod = 1;
8879*3ac0a46fSAndroid Build Coastguard Worker }
8880*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_handler->id == J2K_MS_QCD) {
8881*3ac0a46fSAndroid Build Coastguard Worker /* Mark required QCD marker as found */
8882*3ac0a46fSAndroid Build Coastguard Worker l_has_qcd = 1;
8883*3ac0a46fSAndroid Build Coastguard Worker }
8884*3ac0a46fSAndroid Build Coastguard Worker
8885*3ac0a46fSAndroid Build Coastguard Worker /* Check if the marker is known and if it is the right place to find it */
8886*3ac0a46fSAndroid Build Coastguard Worker if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
8887*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8888*3ac0a46fSAndroid Build Coastguard Worker "Marker is not compliant with its position\n");
8889*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8890*3ac0a46fSAndroid Build Coastguard Worker }
8891*3ac0a46fSAndroid Build Coastguard Worker
8892*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
8893*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
8894*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
8895*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8896*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8897*3ac0a46fSAndroid Build Coastguard Worker }
8898*3ac0a46fSAndroid Build Coastguard Worker
8899*3ac0a46fSAndroid Build Coastguard Worker /* read 2 bytes as the marker size */
8900*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
8901*3ac0a46fSAndroid Build Coastguard Worker 2);
8902*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_size < 2) {
8903*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
8904*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8905*3ac0a46fSAndroid Build Coastguard Worker }
8906*3ac0a46fSAndroid Build Coastguard Worker l_marker_size -= 2; /* Subtract the size of the marker ID already read */
8907*3ac0a46fSAndroid Build Coastguard Worker
8908*3ac0a46fSAndroid Build Coastguard Worker /* Check if the marker size is compatible with the header data size */
8909*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
8910*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(
8911*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
8912*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_data) {
8913*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
8914*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
8915*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
8916*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
8917*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8918*3ac0a46fSAndroid Build Coastguard Worker }
8919*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
8920*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
8921*3ac0a46fSAndroid Build Coastguard Worker }
8922*3ac0a46fSAndroid Build Coastguard Worker
8923*3ac0a46fSAndroid Build Coastguard Worker /* Try to read the rest of the marker segment from stream and copy them into the buffer */
8924*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
8925*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
8926*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_marker_size) {
8927*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8928*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8929*3ac0a46fSAndroid Build Coastguard Worker }
8930*3ac0a46fSAndroid Build Coastguard Worker
8931*3ac0a46fSAndroid Build Coastguard Worker /* Read the marker segment with the correct marker handler */
8932*3ac0a46fSAndroid Build Coastguard Worker if (!(*(l_marker_handler->handler))(p_j2k,
8933*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
8934*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8935*3ac0a46fSAndroid Build Coastguard Worker "Marker handler function failed to read the marker segment\n");
8936*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8937*3ac0a46fSAndroid Build Coastguard Worker }
8938*3ac0a46fSAndroid Build Coastguard Worker
8939*3ac0a46fSAndroid Build Coastguard Worker /* Add the marker to the codestream index*/
8940*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_FALSE == opj_j2k_add_mhmarker(
8941*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index,
8942*3ac0a46fSAndroid Build Coastguard Worker l_marker_handler->id,
8943*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
8944*3ac0a46fSAndroid Build Coastguard Worker l_marker_size + 4)) {
8945*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
8946*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8947*3ac0a46fSAndroid Build Coastguard Worker }
8948*3ac0a46fSAndroid Build Coastguard Worker
8949*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
8950*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
8951*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
8952*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8953*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8954*3ac0a46fSAndroid Build Coastguard Worker }
8955*3ac0a46fSAndroid Build Coastguard Worker
8956*3ac0a46fSAndroid Build Coastguard Worker /* read 2 bytes as the new marker ID */
8957*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
8958*3ac0a46fSAndroid Build Coastguard Worker &l_current_marker, 2);
8959*3ac0a46fSAndroid Build Coastguard Worker }
8960*3ac0a46fSAndroid Build Coastguard Worker
8961*3ac0a46fSAndroid Build Coastguard Worker if (l_has_siz == 0) {
8962*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8963*3ac0a46fSAndroid Build Coastguard Worker "required SIZ marker not found in main header\n");
8964*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8965*3ac0a46fSAndroid Build Coastguard Worker }
8966*3ac0a46fSAndroid Build Coastguard Worker if (l_has_cod == 0) {
8967*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8968*3ac0a46fSAndroid Build Coastguard Worker "required COD marker not found in main header\n");
8969*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8970*3ac0a46fSAndroid Build Coastguard Worker }
8971*3ac0a46fSAndroid Build Coastguard Worker if (l_has_qcd == 0) {
8972*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
8973*3ac0a46fSAndroid Build Coastguard Worker "required QCD marker not found in main header\n");
8974*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8975*3ac0a46fSAndroid Build Coastguard Worker }
8976*3ac0a46fSAndroid Build Coastguard Worker
8977*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) {
8978*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n");
8979*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
8980*3ac0a46fSAndroid Build Coastguard Worker }
8981*3ac0a46fSAndroid Build Coastguard Worker
8982*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
8983*3ac0a46fSAndroid Build Coastguard Worker
8984*3ac0a46fSAndroid Build Coastguard Worker /* Position of the last element if the main header */
8985*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
8986*3ac0a46fSAndroid Build Coastguard Worker
8987*3ac0a46fSAndroid Build Coastguard Worker /* Next step: read a tile-part header */
8988*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
8989*3ac0a46fSAndroid Build Coastguard Worker
8990*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
8991*3ac0a46fSAndroid Build Coastguard Worker }
8992*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_exec(opj_j2k_t * p_j2k,opj_procedure_list_t * p_procedure_list,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)8993*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_exec(opj_j2k_t * p_j2k,
8994*3ac0a46fSAndroid Build Coastguard Worker opj_procedure_list_t * p_procedure_list,
8995*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
8996*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
8997*3ac0a46fSAndroid Build Coastguard Worker {
8998*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL(** l_procedure)(opj_j2k_t *, opj_stream_private_t *,
8999*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *) = 00;
9000*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_result = OPJ_TRUE;
9001*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_proc, i;
9002*3ac0a46fSAndroid Build Coastguard Worker
9003*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
9004*3ac0a46fSAndroid Build Coastguard Worker assert(p_procedure_list != 00);
9005*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
9006*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
9007*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
9008*3ac0a46fSAndroid Build Coastguard Worker
9009*3ac0a46fSAndroid Build Coastguard Worker l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
9010*3ac0a46fSAndroid Build Coastguard Worker l_procedure = (OPJ_BOOL(**)(opj_j2k_t *, opj_stream_private_t *,
9011*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
9012*3ac0a46fSAndroid Build Coastguard Worker
9013*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_proc; ++i) {
9014*3ac0a46fSAndroid Build Coastguard Worker l_result = l_result && ((*l_procedure)(p_j2k, p_stream, p_manager));
9015*3ac0a46fSAndroid Build Coastguard Worker ++l_procedure;
9016*3ac0a46fSAndroid Build Coastguard Worker }
9017*3ac0a46fSAndroid Build Coastguard Worker
9018*3ac0a46fSAndroid Build Coastguard Worker /* and clear the procedure list at the end.*/
9019*3ac0a46fSAndroid Build Coastguard Worker opj_procedure_list_clear(p_procedure_list);
9020*3ac0a46fSAndroid Build Coastguard Worker return l_result;
9021*3ac0a46fSAndroid Build Coastguard Worker }
9022*3ac0a46fSAndroid Build Coastguard Worker
9023*3ac0a46fSAndroid Build Coastguard Worker /* FIXME DOC*/
opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)9024*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,
9025*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
9026*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
9027*3ac0a46fSAndroid Build Coastguard Worker )
9028*3ac0a46fSAndroid Build Coastguard Worker {
9029*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = 00;
9030*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_default_tcp = 00;
9031*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
9032*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
9033*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_current_tccp = 00;
9034*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tccp_size;
9035*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_mct_size;
9036*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image;
9037*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_mcc_records_size, l_mct_records_size;
9038*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
9039*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
9040*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_offset;
9041*3ac0a46fSAndroid Build Coastguard Worker
9042*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
9043*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
9044*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
9045*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
9046*3ac0a46fSAndroid Build Coastguard Worker
9047*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
9048*3ac0a46fSAndroid Build Coastguard Worker
9049*3ac0a46fSAndroid Build Coastguard Worker l_image = p_j2k->m_private_image;
9050*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
9051*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_cp.tcps;
9052*3ac0a46fSAndroid Build Coastguard Worker l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
9053*3ac0a46fSAndroid Build Coastguard Worker l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
9054*3ac0a46fSAndroid Build Coastguard Worker l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(
9055*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32);
9056*3ac0a46fSAndroid Build Coastguard Worker
9057*3ac0a46fSAndroid Build Coastguard Worker /* For each tile */
9058*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
9059*3ac0a46fSAndroid Build Coastguard Worker /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
9060*3ac0a46fSAndroid Build Coastguard Worker l_current_tccp = l_tcp->tccps;
9061*3ac0a46fSAndroid Build Coastguard Worker /*Copy default coding parameters into the current tile coding parameters*/
9062*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
9063*3ac0a46fSAndroid Build Coastguard Worker /* Initialize some values of the current tile coding parameters*/
9064*3ac0a46fSAndroid Build Coastguard Worker l_tcp->cod = 0;
9065*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt = 0;
9066*3ac0a46fSAndroid Build Coastguard Worker l_tcp->ppt_data = 00;
9067*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_current_tile_part_number = -1;
9068*3ac0a46fSAndroid Build Coastguard Worker /* Remove memory not owned by this tile in case of early error return. */
9069*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_decoding_matrix = 00;
9070*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mct_records = 0;
9071*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_records = 00;
9072*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mcc_records = 0;
9073*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mcc_records = 00;
9074*3ac0a46fSAndroid Build Coastguard Worker /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
9075*3ac0a46fSAndroid Build Coastguard Worker l_tcp->tccps = l_current_tccp;
9076*3ac0a46fSAndroid Build Coastguard Worker
9077*3ac0a46fSAndroid Build Coastguard Worker /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
9078*3ac0a46fSAndroid Build Coastguard Worker if (l_default_tcp->m_mct_decoding_matrix) {
9079*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
9080*3ac0a46fSAndroid Build Coastguard Worker if (! l_tcp->m_mct_decoding_matrix) {
9081*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9082*3ac0a46fSAndroid Build Coastguard Worker }
9083*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_tcp->m_mct_decoding_matrix, l_default_tcp->m_mct_decoding_matrix,
9084*3ac0a46fSAndroid Build Coastguard Worker l_mct_size);
9085*3ac0a46fSAndroid Build Coastguard Worker }
9086*3ac0a46fSAndroid Build Coastguard Worker
9087*3ac0a46fSAndroid Build Coastguard Worker /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
9088*3ac0a46fSAndroid Build Coastguard Worker l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(
9089*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t);
9090*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
9091*3ac0a46fSAndroid Build Coastguard Worker if (! l_tcp->m_mct_records) {
9092*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9093*3ac0a46fSAndroid Build Coastguard Worker }
9094*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records, l_mct_records_size);
9095*3ac0a46fSAndroid Build Coastguard Worker
9096*3ac0a46fSAndroid Build Coastguard Worker /* Copy the mct record data from dflt_tile_cp to the current tile*/
9097*3ac0a46fSAndroid Build Coastguard Worker l_src_mct_rec = l_default_tcp->m_mct_records;
9098*3ac0a46fSAndroid Build Coastguard Worker l_dest_mct_rec = l_tcp->m_mct_records;
9099*3ac0a46fSAndroid Build Coastguard Worker
9100*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_default_tcp->m_nb_mct_records; ++j) {
9101*3ac0a46fSAndroid Build Coastguard Worker
9102*3ac0a46fSAndroid Build Coastguard Worker if (l_src_mct_rec->m_data) {
9103*3ac0a46fSAndroid Build Coastguard Worker
9104*3ac0a46fSAndroid Build Coastguard Worker l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
9105*3ac0a46fSAndroid Build Coastguard Worker if (! l_dest_mct_rec->m_data) {
9106*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9107*3ac0a46fSAndroid Build Coastguard Worker }
9108*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_dest_mct_rec->m_data, l_src_mct_rec->m_data,
9109*3ac0a46fSAndroid Build Coastguard Worker l_src_mct_rec->m_data_size);
9110*3ac0a46fSAndroid Build Coastguard Worker }
9111*3ac0a46fSAndroid Build Coastguard Worker
9112*3ac0a46fSAndroid Build Coastguard Worker ++l_src_mct_rec;
9113*3ac0a46fSAndroid Build Coastguard Worker ++l_dest_mct_rec;
9114*3ac0a46fSAndroid Build Coastguard Worker /* Update with each pass to free exactly what has been allocated on early return. */
9115*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mct_records += 1;
9116*3ac0a46fSAndroid Build Coastguard Worker }
9117*3ac0a46fSAndroid Build Coastguard Worker
9118*3ac0a46fSAndroid Build Coastguard Worker /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
9119*3ac0a46fSAndroid Build Coastguard Worker l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(
9120*3ac0a46fSAndroid Build Coastguard Worker opj_simple_mcc_decorrelation_data_t);
9121*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(
9122*3ac0a46fSAndroid Build Coastguard Worker l_mcc_records_size);
9123*3ac0a46fSAndroid Build Coastguard Worker if (! l_tcp->m_mcc_records) {
9124*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9125*3ac0a46fSAndroid Build Coastguard Worker }
9126*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_tcp->m_mcc_records, l_default_tcp->m_mcc_records, l_mcc_records_size);
9127*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_nb_max_mcc_records = l_default_tcp->m_nb_max_mcc_records;
9128*3ac0a46fSAndroid Build Coastguard Worker
9129*3ac0a46fSAndroid Build Coastguard Worker /* Copy the mcc record data from dflt_tile_cp to the current tile*/
9130*3ac0a46fSAndroid Build Coastguard Worker l_src_mcc_rec = l_default_tcp->m_mcc_records;
9131*3ac0a46fSAndroid Build Coastguard Worker l_dest_mcc_rec = l_tcp->m_mcc_records;
9132*3ac0a46fSAndroid Build Coastguard Worker
9133*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_default_tcp->m_nb_max_mcc_records; ++j) {
9134*3ac0a46fSAndroid Build Coastguard Worker
9135*3ac0a46fSAndroid Build Coastguard Worker if (l_src_mcc_rec->m_decorrelation_array) {
9136*3ac0a46fSAndroid Build Coastguard Worker l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array -
9137*3ac0a46fSAndroid Build Coastguard Worker l_default_tcp->m_mct_records);
9138*3ac0a46fSAndroid Build Coastguard Worker l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
9139*3ac0a46fSAndroid Build Coastguard Worker }
9140*3ac0a46fSAndroid Build Coastguard Worker
9141*3ac0a46fSAndroid Build Coastguard Worker if (l_src_mcc_rec->m_offset_array) {
9142*3ac0a46fSAndroid Build Coastguard Worker l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array -
9143*3ac0a46fSAndroid Build Coastguard Worker l_default_tcp->m_mct_records);
9144*3ac0a46fSAndroid Build Coastguard Worker l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
9145*3ac0a46fSAndroid Build Coastguard Worker }
9146*3ac0a46fSAndroid Build Coastguard Worker
9147*3ac0a46fSAndroid Build Coastguard Worker ++l_src_mcc_rec;
9148*3ac0a46fSAndroid Build Coastguard Worker ++l_dest_mcc_rec;
9149*3ac0a46fSAndroid Build Coastguard Worker }
9150*3ac0a46fSAndroid Build Coastguard Worker
9151*3ac0a46fSAndroid Build Coastguard Worker /* Copy all the dflt_tile_compo_cp to the current tile cp */
9152*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_current_tccp, l_default_tcp->tccps, l_tccp_size);
9153*3ac0a46fSAndroid Build Coastguard Worker
9154*3ac0a46fSAndroid Build Coastguard Worker /* Move to next tile cp*/
9155*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
9156*3ac0a46fSAndroid Build Coastguard Worker }
9157*3ac0a46fSAndroid Build Coastguard Worker
9158*3ac0a46fSAndroid Build Coastguard Worker /* Create the current tile decoder*/
9159*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd = opj_tcd_create(OPJ_TRUE);
9160*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_tcd) {
9161*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9162*3ac0a46fSAndroid Build Coastguard Worker }
9163*3ac0a46fSAndroid Build Coastguard Worker
9164*3ac0a46fSAndroid Build Coastguard Worker if (!opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp), p_j2k->m_tp)) {
9165*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_destroy(p_j2k->m_tcd);
9166*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd = 00;
9167*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
9168*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9169*3ac0a46fSAndroid Build Coastguard Worker }
9170*3ac0a46fSAndroid Build Coastguard Worker
9171*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9172*3ac0a46fSAndroid Build Coastguard Worker }
9173*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_marker_handler(OPJ_UINT32 p_id)9174*3ac0a46fSAndroid Build Coastguard Worker static const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler(
9175*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_id)
9176*3ac0a46fSAndroid Build Coastguard Worker {
9177*3ac0a46fSAndroid Build Coastguard Worker const opj_dec_memory_marker_handler_t *e;
9178*3ac0a46fSAndroid Build Coastguard Worker for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
9179*3ac0a46fSAndroid Build Coastguard Worker if (e->id == p_id) {
9180*3ac0a46fSAndroid Build Coastguard Worker break; /* we find a handler corresponding to the marker ID*/
9181*3ac0a46fSAndroid Build Coastguard Worker }
9182*3ac0a46fSAndroid Build Coastguard Worker }
9183*3ac0a46fSAndroid Build Coastguard Worker return e;
9184*3ac0a46fSAndroid Build Coastguard Worker }
9185*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_destroy(void * j2k)9186*3ac0a46fSAndroid Build Coastguard Worker void opj_j2k_destroy(void *j2k)
9187*3ac0a46fSAndroid Build Coastguard Worker {
9188*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t *p_j2k = (opj_j2k_t*)j2k;
9189*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k == 00) {
9190*3ac0a46fSAndroid Build Coastguard Worker return;
9191*3ac0a46fSAndroid Build Coastguard Worker }
9192*3ac0a46fSAndroid Build Coastguard Worker
9193*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_is_decoder) {
9194*3ac0a46fSAndroid Build Coastguard Worker
9195*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
9196*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
9197*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
9198*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
9199*3ac0a46fSAndroid Build Coastguard Worker }
9200*3ac0a46fSAndroid Build Coastguard Worker
9201*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
9202*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9203*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data = 00;
9204*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9205*3ac0a46fSAndroid Build Coastguard Worker }
9206*3ac0a46fSAndroid Build Coastguard Worker
9207*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
9208*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = 00;
9209*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
9210*3ac0a46fSAndroid Build Coastguard Worker
9211*3ac0a46fSAndroid Build Coastguard Worker } else {
9212*3ac0a46fSAndroid Build Coastguard Worker
9213*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
9214*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
9215*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
9216*3ac0a46fSAndroid Build Coastguard Worker }
9217*3ac0a46fSAndroid Build Coastguard Worker
9218*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
9219*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
9220*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
9221*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
9222*3ac0a46fSAndroid Build Coastguard Worker }
9223*3ac0a46fSAndroid Build Coastguard Worker
9224*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
9225*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
9226*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
9227*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
9228*3ac0a46fSAndroid Build Coastguard Worker }
9229*3ac0a46fSAndroid Build Coastguard Worker }
9230*3ac0a46fSAndroid Build Coastguard Worker
9231*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_destroy(p_j2k->m_tcd);
9232*3ac0a46fSAndroid Build Coastguard Worker
9233*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_cp_destroy(&(p_j2k->m_cp));
9234*3ac0a46fSAndroid Build Coastguard Worker memset(&(p_j2k->m_cp), 0, sizeof(opj_cp_t));
9235*3ac0a46fSAndroid Build Coastguard Worker
9236*3ac0a46fSAndroid Build Coastguard Worker opj_procedure_list_destroy(p_j2k->m_procedure_list);
9237*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_procedure_list = 00;
9238*3ac0a46fSAndroid Build Coastguard Worker
9239*3ac0a46fSAndroid Build Coastguard Worker opj_procedure_list_destroy(p_j2k->m_validation_list);
9240*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_procedure_list = 00;
9241*3ac0a46fSAndroid Build Coastguard Worker
9242*3ac0a46fSAndroid Build Coastguard Worker j2k_destroy_cstr_index(p_j2k->cstr_index);
9243*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index = NULL;
9244*3ac0a46fSAndroid Build Coastguard Worker
9245*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_private_image);
9246*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = NULL;
9247*3ac0a46fSAndroid Build Coastguard Worker
9248*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_output_image);
9249*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image = NULL;
9250*3ac0a46fSAndroid Build Coastguard Worker
9251*3ac0a46fSAndroid Build Coastguard Worker opj_thread_pool_destroy(p_j2k->m_tp);
9252*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tp = NULL;
9253*3ac0a46fSAndroid Build Coastguard Worker
9254*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k);
9255*3ac0a46fSAndroid Build Coastguard Worker }
9256*3ac0a46fSAndroid Build Coastguard Worker
j2k_destroy_cstr_index(opj_codestream_index_t * p_cstr_ind)9257*3ac0a46fSAndroid Build Coastguard Worker void j2k_destroy_cstr_index(opj_codestream_index_t *p_cstr_ind)
9258*3ac0a46fSAndroid Build Coastguard Worker {
9259*3ac0a46fSAndroid Build Coastguard Worker if (p_cstr_ind) {
9260*3ac0a46fSAndroid Build Coastguard Worker
9261*3ac0a46fSAndroid Build Coastguard Worker if (p_cstr_ind->marker) {
9262*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cstr_ind->marker);
9263*3ac0a46fSAndroid Build Coastguard Worker p_cstr_ind->marker = NULL;
9264*3ac0a46fSAndroid Build Coastguard Worker }
9265*3ac0a46fSAndroid Build Coastguard Worker
9266*3ac0a46fSAndroid Build Coastguard Worker if (p_cstr_ind->tile_index) {
9267*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_tile = 0;
9268*3ac0a46fSAndroid Build Coastguard Worker
9269*3ac0a46fSAndroid Build Coastguard Worker for (it_tile = 0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
9270*3ac0a46fSAndroid Build Coastguard Worker
9271*3ac0a46fSAndroid Build Coastguard Worker if (p_cstr_ind->tile_index[it_tile].packet_index) {
9272*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
9273*3ac0a46fSAndroid Build Coastguard Worker p_cstr_ind->tile_index[it_tile].packet_index = NULL;
9274*3ac0a46fSAndroid Build Coastguard Worker }
9275*3ac0a46fSAndroid Build Coastguard Worker
9276*3ac0a46fSAndroid Build Coastguard Worker if (p_cstr_ind->tile_index[it_tile].tp_index) {
9277*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
9278*3ac0a46fSAndroid Build Coastguard Worker p_cstr_ind->tile_index[it_tile].tp_index = NULL;
9279*3ac0a46fSAndroid Build Coastguard Worker }
9280*3ac0a46fSAndroid Build Coastguard Worker
9281*3ac0a46fSAndroid Build Coastguard Worker if (p_cstr_ind->tile_index[it_tile].marker) {
9282*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cstr_ind->tile_index[it_tile].marker);
9283*3ac0a46fSAndroid Build Coastguard Worker p_cstr_ind->tile_index[it_tile].marker = NULL;
9284*3ac0a46fSAndroid Build Coastguard Worker
9285*3ac0a46fSAndroid Build Coastguard Worker }
9286*3ac0a46fSAndroid Build Coastguard Worker }
9287*3ac0a46fSAndroid Build Coastguard Worker
9288*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cstr_ind->tile_index);
9289*3ac0a46fSAndroid Build Coastguard Worker p_cstr_ind->tile_index = NULL;
9290*3ac0a46fSAndroid Build Coastguard Worker }
9291*3ac0a46fSAndroid Build Coastguard Worker
9292*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cstr_ind);
9293*3ac0a46fSAndroid Build Coastguard Worker }
9294*3ac0a46fSAndroid Build Coastguard Worker }
9295*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_tcp_destroy(opj_tcp_t * p_tcp)9296*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp)
9297*3ac0a46fSAndroid Build Coastguard Worker {
9298*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp == 00) {
9299*3ac0a46fSAndroid Build Coastguard Worker return;
9300*3ac0a46fSAndroid Build Coastguard Worker }
9301*3ac0a46fSAndroid Build Coastguard Worker
9302*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->ppt_markers != 00) {
9303*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
9304*3ac0a46fSAndroid Build Coastguard Worker for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
9305*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->ppt_markers[i].m_data != NULL) {
9306*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->ppt_markers[i].m_data);
9307*3ac0a46fSAndroid Build Coastguard Worker }
9308*3ac0a46fSAndroid Build Coastguard Worker }
9309*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers_count = 0U;
9310*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->ppt_markers);
9311*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_markers = NULL;
9312*3ac0a46fSAndroid Build Coastguard Worker }
9313*3ac0a46fSAndroid Build Coastguard Worker
9314*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->ppt_buffer != 00) {
9315*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->ppt_buffer);
9316*3ac0a46fSAndroid Build Coastguard Worker p_tcp->ppt_buffer = 00;
9317*3ac0a46fSAndroid Build Coastguard Worker }
9318*3ac0a46fSAndroid Build Coastguard Worker
9319*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->tccps != 00) {
9320*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->tccps);
9321*3ac0a46fSAndroid Build Coastguard Worker p_tcp->tccps = 00;
9322*3ac0a46fSAndroid Build Coastguard Worker }
9323*3ac0a46fSAndroid Build Coastguard Worker
9324*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_mct_coding_matrix != 00) {
9325*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->m_mct_coding_matrix);
9326*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_coding_matrix = 00;
9327*3ac0a46fSAndroid Build Coastguard Worker }
9328*3ac0a46fSAndroid Build Coastguard Worker
9329*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_mct_decoding_matrix != 00) {
9330*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->m_mct_decoding_matrix);
9331*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_decoding_matrix = 00;
9332*3ac0a46fSAndroid Build Coastguard Worker }
9333*3ac0a46fSAndroid Build Coastguard Worker
9334*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_mcc_records) {
9335*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->m_mcc_records);
9336*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mcc_records = 00;
9337*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_max_mcc_records = 0;
9338*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_nb_mcc_records = 0;
9339*3ac0a46fSAndroid Build Coastguard Worker }
9340*3ac0a46fSAndroid Build Coastguard Worker
9341*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_mct_records) {
9342*3ac0a46fSAndroid Build Coastguard Worker opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
9343*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
9344*3ac0a46fSAndroid Build Coastguard Worker
9345*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_tcp->m_nb_mct_records; ++i) {
9346*3ac0a46fSAndroid Build Coastguard Worker if (l_mct_data->m_data) {
9347*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_mct_data->m_data);
9348*3ac0a46fSAndroid Build Coastguard Worker l_mct_data->m_data = 00;
9349*3ac0a46fSAndroid Build Coastguard Worker }
9350*3ac0a46fSAndroid Build Coastguard Worker
9351*3ac0a46fSAndroid Build Coastguard Worker ++l_mct_data;
9352*3ac0a46fSAndroid Build Coastguard Worker }
9353*3ac0a46fSAndroid Build Coastguard Worker
9354*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->m_mct_records);
9355*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_mct_records = 00;
9356*3ac0a46fSAndroid Build Coastguard Worker }
9357*3ac0a46fSAndroid Build Coastguard Worker
9358*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->mct_norms != 00) {
9359*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->mct_norms);
9360*3ac0a46fSAndroid Build Coastguard Worker p_tcp->mct_norms = 00;
9361*3ac0a46fSAndroid Build Coastguard Worker }
9362*3ac0a46fSAndroid Build Coastguard Worker
9363*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_data_destroy(p_tcp);
9364*3ac0a46fSAndroid Build Coastguard Worker
9365*3ac0a46fSAndroid Build Coastguard Worker }
9366*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_tcp_data_destroy(opj_tcp_t * p_tcp)9367*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp)
9368*3ac0a46fSAndroid Build Coastguard Worker {
9369*3ac0a46fSAndroid Build Coastguard Worker if (p_tcp->m_data) {
9370*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_tcp->m_data);
9371*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_data = NULL;
9372*3ac0a46fSAndroid Build Coastguard Worker p_tcp->m_data_size = 0;
9373*3ac0a46fSAndroid Build Coastguard Worker }
9374*3ac0a46fSAndroid Build Coastguard Worker }
9375*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_cp_destroy(opj_cp_t * p_cp)9376*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_cp_destroy(opj_cp_t *p_cp)
9377*3ac0a46fSAndroid Build Coastguard Worker {
9378*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
9379*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_current_tile = 00;
9380*3ac0a46fSAndroid Build Coastguard Worker
9381*3ac0a46fSAndroid Build Coastguard Worker if (p_cp == 00) {
9382*3ac0a46fSAndroid Build Coastguard Worker return;
9383*3ac0a46fSAndroid Build Coastguard Worker }
9384*3ac0a46fSAndroid Build Coastguard Worker if (p_cp->tcps != 00) {
9385*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
9386*3ac0a46fSAndroid Build Coastguard Worker l_current_tile = p_cp->tcps;
9387*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = p_cp->th * p_cp->tw;
9388*3ac0a46fSAndroid Build Coastguard Worker
9389*3ac0a46fSAndroid Build Coastguard Worker for (i = 0U; i < l_nb_tiles; ++i) {
9390*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_destroy(l_current_tile);
9391*3ac0a46fSAndroid Build Coastguard Worker ++l_current_tile;
9392*3ac0a46fSAndroid Build Coastguard Worker }
9393*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cp->tcps);
9394*3ac0a46fSAndroid Build Coastguard Worker p_cp->tcps = 00;
9395*3ac0a46fSAndroid Build Coastguard Worker }
9396*3ac0a46fSAndroid Build Coastguard Worker if (p_cp->ppm_markers != 00) {
9397*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
9398*3ac0a46fSAndroid Build Coastguard Worker for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
9399*3ac0a46fSAndroid Build Coastguard Worker if (p_cp->ppm_markers[i].m_data != NULL) {
9400*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cp->ppm_markers[i].m_data);
9401*3ac0a46fSAndroid Build Coastguard Worker }
9402*3ac0a46fSAndroid Build Coastguard Worker }
9403*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_markers_count = 0U;
9404*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cp->ppm_markers);
9405*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_markers = NULL;
9406*3ac0a46fSAndroid Build Coastguard Worker }
9407*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cp->ppm_buffer);
9408*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_buffer = 00;
9409*3ac0a46fSAndroid Build Coastguard Worker p_cp->ppm_data =
9410*3ac0a46fSAndroid Build Coastguard Worker NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
9411*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cp->comment);
9412*3ac0a46fSAndroid Build Coastguard Worker p_cp->comment = 00;
9413*3ac0a46fSAndroid Build Coastguard Worker if (! p_cp->m_is_decoder) {
9414*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_cp->m_specific_param.m_enc.m_matrice);
9415*3ac0a46fSAndroid Build Coastguard Worker p_cp->m_specific_param.m_enc.m_matrice = 00;
9416*3ac0a46fSAndroid Build Coastguard Worker }
9417*3ac0a46fSAndroid Build Coastguard Worker }
9418*3ac0a46fSAndroid Build Coastguard Worker
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)9419*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t
9420*3ac0a46fSAndroid Build Coastguard Worker *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
9421*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
9422*3ac0a46fSAndroid Build Coastguard Worker {
9423*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE l_header_data[10];
9424*3ac0a46fSAndroid Build Coastguard Worker OPJ_OFF_T l_stream_pos_backup;
9425*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_marker;
9426*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_marker_size;
9427*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts;
9428*3ac0a46fSAndroid Build Coastguard Worker
9429*3ac0a46fSAndroid Build Coastguard Worker /* initialize to no correction needed */
9430*3ac0a46fSAndroid Build Coastguard Worker *p_correction_needed = OPJ_FALSE;
9431*3ac0a46fSAndroid Build Coastguard Worker
9432*3ac0a46fSAndroid Build Coastguard Worker if (!opj_stream_has_seek(p_stream)) {
9433*3ac0a46fSAndroid Build Coastguard Worker /* We can't do much in this case, seek is needed */
9434*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9435*3ac0a46fSAndroid Build Coastguard Worker }
9436*3ac0a46fSAndroid Build Coastguard Worker
9437*3ac0a46fSAndroid Build Coastguard Worker l_stream_pos_backup = opj_stream_tell(p_stream);
9438*3ac0a46fSAndroid Build Coastguard Worker if (l_stream_pos_backup == -1) {
9439*3ac0a46fSAndroid Build Coastguard Worker /* let's do nothing */
9440*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9441*3ac0a46fSAndroid Build Coastguard Worker }
9442*3ac0a46fSAndroid Build Coastguard Worker
9443*3ac0a46fSAndroid Build Coastguard Worker for (;;) {
9444*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9445*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
9446*3ac0a46fSAndroid Build Coastguard Worker /* assume all is OK */
9447*3ac0a46fSAndroid Build Coastguard Worker if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9448*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9449*3ac0a46fSAndroid Build Coastguard Worker }
9450*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9451*3ac0a46fSAndroid Build Coastguard Worker }
9452*3ac0a46fSAndroid Build Coastguard Worker
9453*3ac0a46fSAndroid Build Coastguard Worker /* Read 2 bytes from buffer as the new marker ID */
9454*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_header_data, &l_current_marker, 2);
9455*3ac0a46fSAndroid Build Coastguard Worker
9456*3ac0a46fSAndroid Build Coastguard Worker if (l_current_marker != J2K_MS_SOT) {
9457*3ac0a46fSAndroid Build Coastguard Worker /* assume all is OK */
9458*3ac0a46fSAndroid Build Coastguard Worker if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9459*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9460*3ac0a46fSAndroid Build Coastguard Worker }
9461*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9462*3ac0a46fSAndroid Build Coastguard Worker }
9463*3ac0a46fSAndroid Build Coastguard Worker
9464*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9465*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
9466*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9467*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9468*3ac0a46fSAndroid Build Coastguard Worker }
9469*3ac0a46fSAndroid Build Coastguard Worker
9470*3ac0a46fSAndroid Build Coastguard Worker /* Read 2 bytes from the buffer as the marker size */
9471*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_header_data, &l_marker_size, 2);
9472*3ac0a46fSAndroid Build Coastguard Worker
9473*3ac0a46fSAndroid Build Coastguard Worker /* Check marker size for SOT Marker */
9474*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_size != 10) {
9475*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
9476*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9477*3ac0a46fSAndroid Build Coastguard Worker }
9478*3ac0a46fSAndroid Build Coastguard Worker l_marker_size -= 2;
9479*3ac0a46fSAndroid Build Coastguard Worker
9480*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream, l_header_data, l_marker_size,
9481*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_marker_size) {
9482*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9483*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9484*3ac0a46fSAndroid Build Coastguard Worker }
9485*3ac0a46fSAndroid Build Coastguard Worker
9486*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_get_sot_values(l_header_data, l_marker_size, &l_tile_no,
9487*3ac0a46fSAndroid Build Coastguard Worker &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
9488*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9489*3ac0a46fSAndroid Build Coastguard Worker }
9490*3ac0a46fSAndroid Build Coastguard Worker
9491*3ac0a46fSAndroid Build Coastguard Worker if (l_tile_no == tile_no) {
9492*3ac0a46fSAndroid Build Coastguard Worker /* we found what we were looking for */
9493*3ac0a46fSAndroid Build Coastguard Worker break;
9494*3ac0a46fSAndroid Build Coastguard Worker }
9495*3ac0a46fSAndroid Build Coastguard Worker
9496*3ac0a46fSAndroid Build Coastguard Worker if (l_tot_len < 14U) {
9497*3ac0a46fSAndroid Build Coastguard Worker /* last SOT until EOC or invalid Psot value */
9498*3ac0a46fSAndroid Build Coastguard Worker /* assume all is OK */
9499*3ac0a46fSAndroid Build Coastguard Worker if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9500*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9501*3ac0a46fSAndroid Build Coastguard Worker }
9502*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9503*3ac0a46fSAndroid Build Coastguard Worker }
9504*3ac0a46fSAndroid Build Coastguard Worker l_tot_len -= 12U;
9505*3ac0a46fSAndroid Build Coastguard Worker /* look for next SOT marker */
9506*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len),
9507*3ac0a46fSAndroid Build Coastguard Worker p_manager) != (OPJ_OFF_T)(l_tot_len)) {
9508*3ac0a46fSAndroid Build Coastguard Worker /* assume all is OK */
9509*3ac0a46fSAndroid Build Coastguard Worker if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9510*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9511*3ac0a46fSAndroid Build Coastguard Worker }
9512*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9513*3ac0a46fSAndroid Build Coastguard Worker }
9514*3ac0a46fSAndroid Build Coastguard Worker }
9515*3ac0a46fSAndroid Build Coastguard Worker
9516*3ac0a46fSAndroid Build Coastguard Worker /* check for correction */
9517*3ac0a46fSAndroid Build Coastguard Worker if (l_current_part == l_num_parts) {
9518*3ac0a46fSAndroid Build Coastguard Worker *p_correction_needed = OPJ_TRUE;
9519*3ac0a46fSAndroid Build Coastguard Worker }
9520*3ac0a46fSAndroid Build Coastguard Worker
9521*3ac0a46fSAndroid Build Coastguard Worker if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
9522*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9523*3ac0a46fSAndroid Build Coastguard Worker }
9524*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9525*3ac0a46fSAndroid Build Coastguard Worker }
9526*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_tile_header(void * j2k,OPJ_UINT32 * p_tile_index,OPJ_UINT32 * p_data_size,OPJ_INT32 * p_tile_x0,OPJ_INT32 * p_tile_y0,OPJ_INT32 * p_tile_x1,OPJ_INT32 * p_tile_y1,OPJ_UINT32 * p_nb_comps,OPJ_BOOL * p_go_on,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)9527*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_read_tile_header(void * j2k,
9528*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_tile_index,
9529*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_size,
9530*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
9531*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
9532*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_nb_comps,
9533*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL * p_go_on,
9534*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
9535*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
9536*3ac0a46fSAndroid Build Coastguard Worker {
9537*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
9538*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_marker = J2K_MS_SOT;
9539*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_marker_size;
9540*3ac0a46fSAndroid Build Coastguard Worker const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
9541*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = NULL;
9542*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
9543*3ac0a46fSAndroid Build Coastguard Worker
9544*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
9545*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
9546*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
9547*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
9548*3ac0a46fSAndroid Build Coastguard Worker
9549*3ac0a46fSAndroid Build Coastguard Worker /* Reach the End Of Codestream ?*/
9550*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
9551*3ac0a46fSAndroid Build Coastguard Worker l_current_marker = J2K_MS_EOC;
9552*3ac0a46fSAndroid Build Coastguard Worker }
9553*3ac0a46fSAndroid Build Coastguard Worker /* We need to encounter a SOT marker (a new tile-part header) */
9554*3ac0a46fSAndroid Build Coastguard Worker else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
9555*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9556*3ac0a46fSAndroid Build Coastguard Worker }
9557*3ac0a46fSAndroid Build Coastguard Worker
9558*3ac0a46fSAndroid Build Coastguard Worker /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
9559*3ac0a46fSAndroid Build Coastguard Worker while ((!p_j2k->m_specific_param.m_decoder.m_can_decode) &&
9560*3ac0a46fSAndroid Build Coastguard Worker (l_current_marker != J2K_MS_EOC)) {
9561*3ac0a46fSAndroid Build Coastguard Worker
9562*3ac0a46fSAndroid Build Coastguard Worker /* Try to read until the Start Of Data is detected */
9563*3ac0a46fSAndroid Build Coastguard Worker while (l_current_marker != J2K_MS_SOD) {
9564*3ac0a46fSAndroid Build Coastguard Worker
9565*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_get_number_byte_left(p_stream) == 0) {
9566*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9567*3ac0a46fSAndroid Build Coastguard Worker break;
9568*3ac0a46fSAndroid Build Coastguard Worker }
9569*3ac0a46fSAndroid Build Coastguard Worker
9570*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
9571*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
9572*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9573*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9574*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9575*3ac0a46fSAndroid Build Coastguard Worker }
9576*3ac0a46fSAndroid Build Coastguard Worker
9577*3ac0a46fSAndroid Build Coastguard Worker /* Read 2 bytes from the buffer as the marker size */
9578*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
9579*3ac0a46fSAndroid Build Coastguard Worker 2);
9580*3ac0a46fSAndroid Build Coastguard Worker
9581*3ac0a46fSAndroid Build Coastguard Worker /* Check marker size (does not include marker ID but includes marker size) */
9582*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_size < 2) {
9583*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
9584*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9585*3ac0a46fSAndroid Build Coastguard Worker }
9586*3ac0a46fSAndroid Build Coastguard Worker
9587*3ac0a46fSAndroid Build Coastguard Worker /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
9588*3ac0a46fSAndroid Build Coastguard Worker if (l_current_marker == 0x8080 &&
9589*3ac0a46fSAndroid Build Coastguard Worker opj_stream_get_number_byte_left(p_stream) == 0) {
9590*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9591*3ac0a46fSAndroid Build Coastguard Worker break;
9592*3ac0a46fSAndroid Build Coastguard Worker }
9593*3ac0a46fSAndroid Build Coastguard Worker
9594*3ac0a46fSAndroid Build Coastguard Worker /* Why this condition? FIXME */
9595*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH) {
9596*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
9597*3ac0a46fSAndroid Build Coastguard Worker }
9598*3ac0a46fSAndroid Build Coastguard Worker l_marker_size -= 2; /* Subtract the size of the marker ID already read */
9599*3ac0a46fSAndroid Build Coastguard Worker
9600*3ac0a46fSAndroid Build Coastguard Worker /* Get the marker handler from the marker ID */
9601*3ac0a46fSAndroid Build Coastguard Worker l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
9602*3ac0a46fSAndroid Build Coastguard Worker
9603*3ac0a46fSAndroid Build Coastguard Worker /* Check if the marker is known and if it is the right place to find it */
9604*3ac0a46fSAndroid Build Coastguard Worker if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
9605*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
9606*3ac0a46fSAndroid Build Coastguard Worker "Marker is not compliant with its position\n");
9607*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9608*3ac0a46fSAndroid Build Coastguard Worker }
9609*3ac0a46fSAndroid Build Coastguard Worker /* FIXME manage case of unknown marker as in the main header ? */
9610*3ac0a46fSAndroid Build Coastguard Worker
9611*3ac0a46fSAndroid Build Coastguard Worker /* Check if the marker size is compatible with the header data size */
9612*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
9613*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *new_header_data = NULL;
9614*3ac0a46fSAndroid Build Coastguard Worker /* If we are here, this means we consider this marker as known & we will read it */
9615*3ac0a46fSAndroid Build Coastguard Worker /* Check enough bytes left in stream before allocation */
9616*3ac0a46fSAndroid Build Coastguard Worker if ((OPJ_OFF_T)l_marker_size > opj_stream_get_number_byte_left(p_stream)) {
9617*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
9618*3ac0a46fSAndroid Build Coastguard Worker "Marker size inconsistent with stream length\n");
9619*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9620*3ac0a46fSAndroid Build Coastguard Worker }
9621*3ac0a46fSAndroid Build Coastguard Worker new_header_data = (OPJ_BYTE *) opj_realloc(
9622*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
9623*3ac0a46fSAndroid Build Coastguard Worker if (! new_header_data) {
9624*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
9625*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
9626*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
9627*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
9628*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9629*3ac0a46fSAndroid Build Coastguard Worker }
9630*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
9631*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
9632*3ac0a46fSAndroid Build Coastguard Worker }
9633*3ac0a46fSAndroid Build Coastguard Worker
9634*3ac0a46fSAndroid Build Coastguard Worker /* Try to read the rest of the marker segment from stream and copy them into the buffer */
9635*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
9636*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
9637*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_marker_size) {
9638*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9639*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9640*3ac0a46fSAndroid Build Coastguard Worker }
9641*3ac0a46fSAndroid Build Coastguard Worker
9642*3ac0a46fSAndroid Build Coastguard Worker if (!l_marker_handler->handler) {
9643*3ac0a46fSAndroid Build Coastguard Worker /* See issue #175 */
9644*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
9645*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9646*3ac0a46fSAndroid Build Coastguard Worker }
9647*3ac0a46fSAndroid Build Coastguard Worker /* Read the marker segment with the correct marker handler */
9648*3ac0a46fSAndroid Build Coastguard Worker if (!(*(l_marker_handler->handler))(p_j2k,
9649*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
9650*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
9651*3ac0a46fSAndroid Build Coastguard Worker "Fail to read the current marker segment (%#x)\n", l_current_marker);
9652*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9653*3ac0a46fSAndroid Build Coastguard Worker }
9654*3ac0a46fSAndroid Build Coastguard Worker
9655*3ac0a46fSAndroid Build Coastguard Worker /* Add the marker to the codestream index*/
9656*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
9657*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index,
9658*3ac0a46fSAndroid Build Coastguard Worker l_marker_handler->id,
9659*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
9660*3ac0a46fSAndroid Build Coastguard Worker l_marker_size + 4)) {
9661*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
9662*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9663*3ac0a46fSAndroid Build Coastguard Worker }
9664*3ac0a46fSAndroid Build Coastguard Worker
9665*3ac0a46fSAndroid Build Coastguard Worker /* Keep the position of the last SOT marker read */
9666*3ac0a46fSAndroid Build Coastguard Worker if (l_marker_handler->id == J2K_MS_SOT) {
9667*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4
9668*3ac0a46fSAndroid Build Coastguard Worker ;
9669*3ac0a46fSAndroid Build Coastguard Worker if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos) {
9670*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
9671*3ac0a46fSAndroid Build Coastguard Worker }
9672*3ac0a46fSAndroid Build Coastguard Worker }
9673*3ac0a46fSAndroid Build Coastguard Worker
9674*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
9675*3ac0a46fSAndroid Build Coastguard Worker /* Skip the rest of the tile part header*/
9676*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_skip(p_stream, p_j2k->m_specific_param.m_decoder.m_sot_length,
9677*3ac0a46fSAndroid Build Coastguard Worker p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
9678*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9679*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9680*3ac0a46fSAndroid Build Coastguard Worker }
9681*3ac0a46fSAndroid Build Coastguard Worker l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
9682*3ac0a46fSAndroid Build Coastguard Worker } else {
9683*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
9684*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
9685*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9686*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9687*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9688*3ac0a46fSAndroid Build Coastguard Worker }
9689*3ac0a46fSAndroid Build Coastguard Worker /* Read 2 bytes from the buffer as the new marker ID */
9690*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9691*3ac0a46fSAndroid Build Coastguard Worker &l_current_marker, 2);
9692*3ac0a46fSAndroid Build Coastguard Worker }
9693*3ac0a46fSAndroid Build Coastguard Worker }
9694*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_get_number_byte_left(p_stream) == 0
9695*3ac0a46fSAndroid Build Coastguard Worker && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
9696*3ac0a46fSAndroid Build Coastguard Worker break;
9697*3ac0a46fSAndroid Build Coastguard Worker }
9698*3ac0a46fSAndroid Build Coastguard Worker
9699*3ac0a46fSAndroid Build Coastguard Worker /* If we didn't skip data before, we need to read the SOD marker*/
9700*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
9701*3ac0a46fSAndroid Build Coastguard Worker /* Try to read the SOD marker and skip data ? FIXME */
9702*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
9703*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9704*3ac0a46fSAndroid Build Coastguard Worker }
9705*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_can_decode &&
9706*3ac0a46fSAndroid Build Coastguard Worker !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) {
9707*3ac0a46fSAndroid Build Coastguard Worker /* Issue 254 */
9708*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_correction_needed;
9709*3ac0a46fSAndroid Build Coastguard Worker
9710*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
9711*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_need_nb_tile_parts_correction(p_stream,
9712*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
9713*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
9714*3ac0a46fSAndroid Build Coastguard Worker "opj_j2k_apply_nb_tile_parts_correction error\n");
9715*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9716*3ac0a46fSAndroid Build Coastguard Worker }
9717*3ac0a46fSAndroid Build Coastguard Worker if (l_correction_needed) {
9718*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tile_no;
9719*3ac0a46fSAndroid Build Coastguard Worker
9720*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
9721*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1;
9722*3ac0a46fSAndroid Build Coastguard Worker /* correct tiles */
9723*3ac0a46fSAndroid Build Coastguard Worker for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
9724*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) {
9725*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts += 1;
9726*3ac0a46fSAndroid Build Coastguard Worker }
9727*3ac0a46fSAndroid Build Coastguard Worker }
9728*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
9729*3ac0a46fSAndroid Build Coastguard Worker "Non conformant codestream TPsot==TNsot.\n");
9730*3ac0a46fSAndroid Build Coastguard Worker }
9731*3ac0a46fSAndroid Build Coastguard Worker }
9732*3ac0a46fSAndroid Build Coastguard Worker } else {
9733*3ac0a46fSAndroid Build Coastguard Worker /* Indicate we will try to read a new tile-part header*/
9734*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
9735*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
9736*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
9737*3ac0a46fSAndroid Build Coastguard Worker }
9738*3ac0a46fSAndroid Build Coastguard Worker
9739*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
9740*3ac0a46fSAndroid Build Coastguard Worker /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
9741*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream,
9742*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
9743*3ac0a46fSAndroid Build Coastguard Worker
9744*3ac0a46fSAndroid Build Coastguard Worker /* Deal with likely non conformant SPOT6 files, where the last */
9745*3ac0a46fSAndroid Build Coastguard Worker /* row of tiles have TPsot == 0 and TNsot == 0, and missing EOC, */
9746*3ac0a46fSAndroid Build Coastguard Worker /* but no other tile-parts were found. */
9747*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_current_tile_number + 1 == l_nb_tiles) {
9748*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tile_no;
9749*3ac0a46fSAndroid Build Coastguard Worker for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
9750*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.tcps[l_tile_no].m_current_tile_part_number == 0 &&
9751*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts == 0) {
9752*3ac0a46fSAndroid Build Coastguard Worker break;
9753*3ac0a46fSAndroid Build Coastguard Worker }
9754*3ac0a46fSAndroid Build Coastguard Worker }
9755*3ac0a46fSAndroid Build Coastguard Worker if (l_tile_no < l_nb_tiles) {
9756*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO,
9757*3ac0a46fSAndroid Build Coastguard Worker "Tile %u has TPsot == 0 and TNsot == 0, "
9758*3ac0a46fSAndroid Build Coastguard Worker "but no other tile-parts were found. "
9759*3ac0a46fSAndroid Build Coastguard Worker "EOC is also missing.\n",
9760*3ac0a46fSAndroid Build Coastguard Worker l_tile_no);
9761*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number = l_tile_no;
9762*3ac0a46fSAndroid Build Coastguard Worker l_current_marker = J2K_MS_EOC;
9763*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
9764*3ac0a46fSAndroid Build Coastguard Worker break;
9765*3ac0a46fSAndroid Build Coastguard Worker }
9766*3ac0a46fSAndroid Build Coastguard Worker }
9767*3ac0a46fSAndroid Build Coastguard Worker
9768*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
9769*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9770*3ac0a46fSAndroid Build Coastguard Worker }
9771*3ac0a46fSAndroid Build Coastguard Worker
9772*3ac0a46fSAndroid Build Coastguard Worker /* Read 2 bytes from buffer as the new marker ID */
9773*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
9774*3ac0a46fSAndroid Build Coastguard Worker &l_current_marker, 2);
9775*3ac0a46fSAndroid Build Coastguard Worker }
9776*3ac0a46fSAndroid Build Coastguard Worker }
9777*3ac0a46fSAndroid Build Coastguard Worker
9778*3ac0a46fSAndroid Build Coastguard Worker /* Current marker is the EOC marker ?*/
9779*3ac0a46fSAndroid Build Coastguard Worker if (l_current_marker == J2K_MS_EOC) {
9780*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
9781*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number = 0;
9782*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
9783*3ac0a46fSAndroid Build Coastguard Worker }
9784*3ac0a46fSAndroid Build Coastguard Worker }
9785*3ac0a46fSAndroid Build Coastguard Worker
9786*3ac0a46fSAndroid Build Coastguard Worker /* Deal with tiles that have a single tile-part with TPsot == 0 and TNsot == 0 */
9787*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
9788*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
9789*3ac0a46fSAndroid Build Coastguard Worker
9790*3ac0a46fSAndroid Build Coastguard Worker while ((p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00)) {
9791*3ac0a46fSAndroid Build Coastguard Worker ++p_j2k->m_current_tile_number;
9792*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
9793*3ac0a46fSAndroid Build Coastguard Worker }
9794*3ac0a46fSAndroid Build Coastguard Worker
9795*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_current_tile_number == l_nb_tiles) {
9796*3ac0a46fSAndroid Build Coastguard Worker *p_go_on = OPJ_FALSE;
9797*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9798*3ac0a46fSAndroid Build Coastguard Worker }
9799*3ac0a46fSAndroid Build Coastguard Worker }
9800*3ac0a46fSAndroid Build Coastguard Worker
9801*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number,
9802*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
9803*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n");
9804*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9805*3ac0a46fSAndroid Build Coastguard Worker }
9806*3ac0a46fSAndroid Build Coastguard Worker /*FIXME ???*/
9807*3ac0a46fSAndroid Build Coastguard Worker if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
9808*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
9809*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
9810*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9811*3ac0a46fSAndroid Build Coastguard Worker }
9812*3ac0a46fSAndroid Build Coastguard Worker
9813*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
9814*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number + 1, (p_j2k->m_cp.th * p_j2k->m_cp.tw));
9815*3ac0a46fSAndroid Build Coastguard Worker
9816*3ac0a46fSAndroid Build Coastguard Worker *p_tile_index = p_j2k->m_current_tile_number;
9817*3ac0a46fSAndroid Build Coastguard Worker *p_go_on = OPJ_TRUE;
9818*3ac0a46fSAndroid Build Coastguard Worker if (p_data_size) {
9819*3ac0a46fSAndroid Build Coastguard Worker /* For internal use in j2k.c, we don't need this */
9820*3ac0a46fSAndroid Build Coastguard Worker /* This is just needed for folks using the opj_read_tile_header() / opj_decode_tile_data() combo */
9821*3ac0a46fSAndroid Build Coastguard Worker *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd, OPJ_FALSE);
9822*3ac0a46fSAndroid Build Coastguard Worker if (*p_data_size == UINT_MAX) {
9823*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9824*3ac0a46fSAndroid Build Coastguard Worker }
9825*3ac0a46fSAndroid Build Coastguard Worker }
9826*3ac0a46fSAndroid Build Coastguard Worker *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
9827*3ac0a46fSAndroid Build Coastguard Worker *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
9828*3ac0a46fSAndroid Build Coastguard Worker *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
9829*3ac0a46fSAndroid Build Coastguard Worker *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
9830*3ac0a46fSAndroid Build Coastguard Worker *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
9831*3ac0a46fSAndroid Build Coastguard Worker
9832*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
9833*3ac0a46fSAndroid Build Coastguard Worker
9834*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9835*3ac0a46fSAndroid Build Coastguard Worker }
9836*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_decode_tile(void * j2k,OPJ_UINT32 p_tile_index,OPJ_BYTE * p_data,OPJ_UINT32 p_data_size,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)9837*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_decode_tile(void * j2k,
9838*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_index,
9839*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
9840*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_data_size,
9841*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
9842*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
9843*3ac0a46fSAndroid Build Coastguard Worker {
9844*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
9845*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_marker;
9846*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE l_data [2];
9847*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp;
9848*3ac0a46fSAndroid Build Coastguard Worker opj_image_t* l_image_for_bounds;
9849*3ac0a46fSAndroid Build Coastguard Worker
9850*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
9851*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
9852*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
9853*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
9854*3ac0a46fSAndroid Build Coastguard Worker
9855*3ac0a46fSAndroid Build Coastguard Worker if (!(p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_DATA)
9856*3ac0a46fSAndroid Build Coastguard Worker || (p_tile_index != p_j2k->m_current_tile_number)) {
9857*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9858*3ac0a46fSAndroid Build Coastguard Worker }
9859*3ac0a46fSAndroid Build Coastguard Worker
9860*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
9861*3ac0a46fSAndroid Build Coastguard Worker if (! l_tcp->m_data) {
9862*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_destroy(l_tcp);
9863*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9864*3ac0a46fSAndroid Build Coastguard Worker }
9865*3ac0a46fSAndroid Build Coastguard Worker
9866*3ac0a46fSAndroid Build Coastguard Worker /* When using the opj_read_tile_header / opj_decode_tile_data API */
9867*3ac0a46fSAndroid Build Coastguard Worker /* such as in test_tile_decoder, m_output_image is NULL, so fall back */
9868*3ac0a46fSAndroid Build Coastguard Worker /* to the full image dimension. This is a bit surprising that */
9869*3ac0a46fSAndroid Build Coastguard Worker /* opj_set_decode_area() is only used to determine intersecting tiles, */
9870*3ac0a46fSAndroid Build Coastguard Worker /* but full tile decoding is done */
9871*3ac0a46fSAndroid Build Coastguard Worker l_image_for_bounds = p_j2k->m_output_image ? p_j2k->m_output_image :
9872*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image;
9873*3ac0a46fSAndroid Build Coastguard Worker if (! opj_tcd_decode_tile(p_j2k->m_tcd,
9874*3ac0a46fSAndroid Build Coastguard Worker l_image_for_bounds->x0,
9875*3ac0a46fSAndroid Build Coastguard Worker l_image_for_bounds->y0,
9876*3ac0a46fSAndroid Build Coastguard Worker l_image_for_bounds->x1,
9877*3ac0a46fSAndroid Build Coastguard Worker l_image_for_bounds->y1,
9878*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode,
9879*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
9880*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_data,
9881*3ac0a46fSAndroid Build Coastguard Worker l_tcp->m_data_size,
9882*3ac0a46fSAndroid Build Coastguard Worker p_tile_index,
9883*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index, p_manager)) {
9884*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_destroy(l_tcp);
9885*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
9886*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
9887*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9888*3ac0a46fSAndroid Build Coastguard Worker }
9889*3ac0a46fSAndroid Build Coastguard Worker
9890*3ac0a46fSAndroid Build Coastguard Worker /* p_data can be set to NULL when the call will take care of using */
9891*3ac0a46fSAndroid Build Coastguard Worker /* itself the TCD data. This is typically the case for whole single */
9892*3ac0a46fSAndroid Build Coastguard Worker /* tile decoding optimization. */
9893*3ac0a46fSAndroid Build Coastguard Worker if (p_data != NULL) {
9894*3ac0a46fSAndroid Build Coastguard Worker if (! opj_tcd_update_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
9895*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9896*3ac0a46fSAndroid Build Coastguard Worker }
9897*3ac0a46fSAndroid Build Coastguard Worker
9898*3ac0a46fSAndroid Build Coastguard Worker /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
9899*3ac0a46fSAndroid Build Coastguard Worker * we destroy just the data which will be re-read in read_tile_header*/
9900*3ac0a46fSAndroid Build Coastguard Worker /*opj_j2k_tcp_destroy(l_tcp);
9901*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd->tcp = 0;*/
9902*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_data_destroy(l_tcp);
9903*3ac0a46fSAndroid Build Coastguard Worker }
9904*3ac0a46fSAndroid Build Coastguard Worker
9905*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
9906*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state &= (~(OPJ_UINT32)J2K_STATE_DATA);
9907*3ac0a46fSAndroid Build Coastguard Worker
9908*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_get_number_byte_left(p_stream) == 0
9909*3ac0a46fSAndroid Build Coastguard Worker && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
9910*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9911*3ac0a46fSAndroid Build Coastguard Worker }
9912*3ac0a46fSAndroid Build Coastguard Worker
9913*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
9914*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
9915*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, p_j2k->m_cp.strict ? EVT_ERROR : EVT_WARNING,
9916*3ac0a46fSAndroid Build Coastguard Worker "Stream too short\n");
9917*3ac0a46fSAndroid Build Coastguard Worker return p_j2k->m_cp.strict ? OPJ_FALSE : OPJ_TRUE;
9918*3ac0a46fSAndroid Build Coastguard Worker }
9919*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_data, &l_current_marker, 2);
9920*3ac0a46fSAndroid Build Coastguard Worker
9921*3ac0a46fSAndroid Build Coastguard Worker if (l_current_marker == J2K_MS_EOC) {
9922*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number = 0;
9923*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
9924*3ac0a46fSAndroid Build Coastguard Worker } else if (l_current_marker != J2K_MS_SOT) {
9925*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_get_number_byte_left(p_stream) == 0) {
9926*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
9927*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n");
9928*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9929*3ac0a46fSAndroid Build Coastguard Worker }
9930*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
9931*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
9932*3ac0a46fSAndroid Build Coastguard Worker }
9933*3ac0a46fSAndroid Build Coastguard Worker }
9934*3ac0a46fSAndroid Build Coastguard Worker
9935*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
9936*3ac0a46fSAndroid Build Coastguard Worker }
9937*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_update_image_data(opj_tcd_t * p_tcd,opj_image_t * p_output_image)9938*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd,
9939*3ac0a46fSAndroid Build Coastguard Worker opj_image_t* p_output_image)
9940*3ac0a46fSAndroid Build Coastguard Worker {
9941*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
9942*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_width_src, l_height_src;
9943*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_width_dest, l_height_dest;
9944*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
9945*3ac0a46fSAndroid Build Coastguard Worker OPJ_SIZE_T l_start_offset_src;
9946*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_start_x_dest, l_start_y_dest;
9947*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
9948*3ac0a46fSAndroid Build Coastguard Worker OPJ_SIZE_T l_start_offset_dest;
9949*3ac0a46fSAndroid Build Coastguard Worker
9950*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp_src = 00;
9951*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp_dest = 00;
9952*3ac0a46fSAndroid Build Coastguard Worker
9953*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t * l_tilec = 00;
9954*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image_src = 00;
9955*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * l_dest_ptr;
9956*3ac0a46fSAndroid Build Coastguard Worker
9957*3ac0a46fSAndroid Build Coastguard Worker l_tilec = p_tcd->tcd_image->tiles->comps;
9958*3ac0a46fSAndroid Build Coastguard Worker l_image_src = p_tcd->image;
9959*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_src = l_image_src->comps;
9960*3ac0a46fSAndroid Build Coastguard Worker
9961*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_dest = p_output_image->comps;
9962*3ac0a46fSAndroid Build Coastguard Worker
9963*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_image_src->numcomps;
9964*3ac0a46fSAndroid Build Coastguard Worker i++, ++l_img_comp_dest, ++l_img_comp_src, ++l_tilec) {
9965*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 res_x0, res_x1, res_y0, res_y1;
9966*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 src_data_stride;
9967*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32* p_src_data;
9968*3ac0a46fSAndroid Build Coastguard Worker
9969*3ac0a46fSAndroid Build Coastguard Worker /* Copy info from decoded comp image to output image */
9970*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
9971*3ac0a46fSAndroid Build Coastguard Worker
9972*3ac0a46fSAndroid Build Coastguard Worker if (p_tcd->whole_tile_decoding) {
9973*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_resolution_t* l_res = l_tilec->resolutions +
9974*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_src->resno_decoded;
9975*3ac0a46fSAndroid Build Coastguard Worker res_x0 = l_res->x0;
9976*3ac0a46fSAndroid Build Coastguard Worker res_y0 = l_res->y0;
9977*3ac0a46fSAndroid Build Coastguard Worker res_x1 = l_res->x1;
9978*3ac0a46fSAndroid Build Coastguard Worker res_y1 = l_res->y1;
9979*3ac0a46fSAndroid Build Coastguard Worker src_data_stride = (OPJ_UINT32)(
9980*3ac0a46fSAndroid Build Coastguard Worker l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x1 -
9981*3ac0a46fSAndroid Build Coastguard Worker l_tilec->resolutions[l_tilec->minimum_num_resolutions - 1].x0);
9982*3ac0a46fSAndroid Build Coastguard Worker p_src_data = l_tilec->data;
9983*3ac0a46fSAndroid Build Coastguard Worker } else {
9984*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_resolution_t* l_res = l_tilec->resolutions +
9985*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_src->resno_decoded;
9986*3ac0a46fSAndroid Build Coastguard Worker res_x0 = (OPJ_INT32)l_res->win_x0;
9987*3ac0a46fSAndroid Build Coastguard Worker res_y0 = (OPJ_INT32)l_res->win_y0;
9988*3ac0a46fSAndroid Build Coastguard Worker res_x1 = (OPJ_INT32)l_res->win_x1;
9989*3ac0a46fSAndroid Build Coastguard Worker res_y1 = (OPJ_INT32)l_res->win_y1;
9990*3ac0a46fSAndroid Build Coastguard Worker src_data_stride = l_res->win_x1 - l_res->win_x0;
9991*3ac0a46fSAndroid Build Coastguard Worker p_src_data = l_tilec->data_win;
9992*3ac0a46fSAndroid Build Coastguard Worker }
9993*3ac0a46fSAndroid Build Coastguard Worker
9994*3ac0a46fSAndroid Build Coastguard Worker if (p_src_data == NULL) {
9995*3ac0a46fSAndroid Build Coastguard Worker /* Happens for partial component decoding */
9996*3ac0a46fSAndroid Build Coastguard Worker continue;
9997*3ac0a46fSAndroid Build Coastguard Worker }
9998*3ac0a46fSAndroid Build Coastguard Worker
9999*3ac0a46fSAndroid Build Coastguard Worker l_width_src = (OPJ_UINT32)(res_x1 - res_x0);
10000*3ac0a46fSAndroid Build Coastguard Worker l_height_src = (OPJ_UINT32)(res_y1 - res_y0);
10001*3ac0a46fSAndroid Build Coastguard Worker
10002*3ac0a46fSAndroid Build Coastguard Worker
10003*3ac0a46fSAndroid Build Coastguard Worker /* Current tile component size*/
10004*3ac0a46fSAndroid Build Coastguard Worker /*if (i == 0) {
10005*3ac0a46fSAndroid Build Coastguard Worker fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
10006*3ac0a46fSAndroid Build Coastguard Worker res_x0, res_x1, res_y0, res_y1);
10007*3ac0a46fSAndroid Build Coastguard Worker }*/
10008*3ac0a46fSAndroid Build Coastguard Worker
10009*3ac0a46fSAndroid Build Coastguard Worker
10010*3ac0a46fSAndroid Build Coastguard Worker /* Border of the current output component*/
10011*3ac0a46fSAndroid Build Coastguard Worker l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor);
10012*3ac0a46fSAndroid Build Coastguard Worker l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor);
10013*3ac0a46fSAndroid Build Coastguard Worker l_x1_dest = l_x0_dest +
10014*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */
10015*3ac0a46fSAndroid Build Coastguard Worker l_y1_dest = l_y0_dest + l_img_comp_dest->h;
10016*3ac0a46fSAndroid Build Coastguard Worker
10017*3ac0a46fSAndroid Build Coastguard Worker /*if (i == 0) {
10018*3ac0a46fSAndroid Build Coastguard Worker fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
10019*3ac0a46fSAndroid Build Coastguard Worker l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
10020*3ac0a46fSAndroid Build Coastguard Worker }*/
10021*3ac0a46fSAndroid Build Coastguard Worker
10022*3ac0a46fSAndroid Build Coastguard Worker /*-----*/
10023*3ac0a46fSAndroid Build Coastguard Worker /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
10024*3ac0a46fSAndroid Build Coastguard Worker * of the input buffer (decoded tile component) which will be move
10025*3ac0a46fSAndroid Build Coastguard Worker * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
10026*3ac0a46fSAndroid Build Coastguard Worker * l_start_y_dest, l_width_dest, l_height_dest) which will be modified
10027*3ac0a46fSAndroid Build Coastguard Worker * by this input area.
10028*3ac0a46fSAndroid Build Coastguard Worker * */
10029*3ac0a46fSAndroid Build Coastguard Worker assert(res_x0 >= 0);
10030*3ac0a46fSAndroid Build Coastguard Worker assert(res_x1 >= 0);
10031*3ac0a46fSAndroid Build Coastguard Worker
10032*3ac0a46fSAndroid Build Coastguard Worker /* Prevent bad casting to unsigned values in the subsequent lines. */
10033*3ac0a46fSAndroid Build Coastguard Worker if ( res_x0 < 0 || res_x1 < 0 || res_y0 < 0 || res_y1 < 0 ) {
10034*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10035*3ac0a46fSAndroid Build Coastguard Worker }
10036*3ac0a46fSAndroid Build Coastguard Worker
10037*3ac0a46fSAndroid Build Coastguard Worker if (l_x0_dest < (OPJ_UINT32)res_x0) {
10038*3ac0a46fSAndroid Build Coastguard Worker l_start_x_dest = (OPJ_UINT32)res_x0 - l_x0_dest;
10039*3ac0a46fSAndroid Build Coastguard Worker l_offset_x0_src = 0;
10040*3ac0a46fSAndroid Build Coastguard Worker
10041*3ac0a46fSAndroid Build Coastguard Worker if (l_x1_dest >= (OPJ_UINT32)res_x1) {
10042*3ac0a46fSAndroid Build Coastguard Worker l_width_dest = l_width_src;
10043*3ac0a46fSAndroid Build Coastguard Worker l_offset_x1_src = 0;
10044*3ac0a46fSAndroid Build Coastguard Worker } else {
10045*3ac0a46fSAndroid Build Coastguard Worker l_width_dest = l_x1_dest - (OPJ_UINT32)res_x0 ;
10046*3ac0a46fSAndroid Build Coastguard Worker l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
10047*3ac0a46fSAndroid Build Coastguard Worker }
10048*3ac0a46fSAndroid Build Coastguard Worker } else {
10049*3ac0a46fSAndroid Build Coastguard Worker l_start_x_dest = 0U;
10050*3ac0a46fSAndroid Build Coastguard Worker l_offset_x0_src = (OPJ_INT32)l_x0_dest - res_x0;
10051*3ac0a46fSAndroid Build Coastguard Worker
10052*3ac0a46fSAndroid Build Coastguard Worker if (l_x1_dest >= (OPJ_UINT32)res_x1) {
10053*3ac0a46fSAndroid Build Coastguard Worker l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
10054*3ac0a46fSAndroid Build Coastguard Worker l_offset_x1_src = 0;
10055*3ac0a46fSAndroid Build Coastguard Worker } else {
10056*3ac0a46fSAndroid Build Coastguard Worker l_width_dest = l_img_comp_dest->w ;
10057*3ac0a46fSAndroid Build Coastguard Worker l_offset_x1_src = res_x1 - (OPJ_INT32)l_x1_dest;
10058*3ac0a46fSAndroid Build Coastguard Worker }
10059*3ac0a46fSAndroid Build Coastguard Worker }
10060*3ac0a46fSAndroid Build Coastguard Worker
10061*3ac0a46fSAndroid Build Coastguard Worker if (l_y0_dest < (OPJ_UINT32)res_y0) {
10062*3ac0a46fSAndroid Build Coastguard Worker l_start_y_dest = (OPJ_UINT32)res_y0 - l_y0_dest;
10063*3ac0a46fSAndroid Build Coastguard Worker l_offset_y0_src = 0;
10064*3ac0a46fSAndroid Build Coastguard Worker
10065*3ac0a46fSAndroid Build Coastguard Worker if (l_y1_dest >= (OPJ_UINT32)res_y1) {
10066*3ac0a46fSAndroid Build Coastguard Worker l_height_dest = l_height_src;
10067*3ac0a46fSAndroid Build Coastguard Worker l_offset_y1_src = 0;
10068*3ac0a46fSAndroid Build Coastguard Worker } else {
10069*3ac0a46fSAndroid Build Coastguard Worker l_height_dest = l_y1_dest - (OPJ_UINT32)res_y0 ;
10070*3ac0a46fSAndroid Build Coastguard Worker l_offset_y1_src = (OPJ_INT32)(l_height_src - l_height_dest);
10071*3ac0a46fSAndroid Build Coastguard Worker }
10072*3ac0a46fSAndroid Build Coastguard Worker } else {
10073*3ac0a46fSAndroid Build Coastguard Worker l_start_y_dest = 0U;
10074*3ac0a46fSAndroid Build Coastguard Worker l_offset_y0_src = (OPJ_INT32)l_y0_dest - res_y0;
10075*3ac0a46fSAndroid Build Coastguard Worker
10076*3ac0a46fSAndroid Build Coastguard Worker if (l_y1_dest >= (OPJ_UINT32)res_y1) {
10077*3ac0a46fSAndroid Build Coastguard Worker l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
10078*3ac0a46fSAndroid Build Coastguard Worker l_offset_y1_src = 0;
10079*3ac0a46fSAndroid Build Coastguard Worker } else {
10080*3ac0a46fSAndroid Build Coastguard Worker l_height_dest = l_img_comp_dest->h ;
10081*3ac0a46fSAndroid Build Coastguard Worker l_offset_y1_src = res_y1 - (OPJ_INT32)l_y1_dest;
10082*3ac0a46fSAndroid Build Coastguard Worker }
10083*3ac0a46fSAndroid Build Coastguard Worker }
10084*3ac0a46fSAndroid Build Coastguard Worker
10085*3ac0a46fSAndroid Build Coastguard Worker if ((l_offset_x0_src < 0) || (l_offset_y0_src < 0) || (l_offset_x1_src < 0) ||
10086*3ac0a46fSAndroid Build Coastguard Worker (l_offset_y1_src < 0)) {
10087*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10088*3ac0a46fSAndroid Build Coastguard Worker }
10089*3ac0a46fSAndroid Build Coastguard Worker /* testcase 2977.pdf.asan.67.2198 */
10090*3ac0a46fSAndroid Build Coastguard Worker if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
10091*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10092*3ac0a46fSAndroid Build Coastguard Worker }
10093*3ac0a46fSAndroid Build Coastguard Worker /*-----*/
10094*3ac0a46fSAndroid Build Coastguard Worker
10095*3ac0a46fSAndroid Build Coastguard Worker /* Compute the input buffer offset */
10096*3ac0a46fSAndroid Build Coastguard Worker l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src
10097*3ac0a46fSAndroid Build Coastguard Worker * (OPJ_SIZE_T)src_data_stride;
10098*3ac0a46fSAndroid Build Coastguard Worker
10099*3ac0a46fSAndroid Build Coastguard Worker /* Compute the output buffer offset */
10100*3ac0a46fSAndroid Build Coastguard Worker l_start_offset_dest = (OPJ_SIZE_T)l_start_x_dest + (OPJ_SIZE_T)l_start_y_dest
10101*3ac0a46fSAndroid Build Coastguard Worker * (OPJ_SIZE_T)l_img_comp_dest->w;
10102*3ac0a46fSAndroid Build Coastguard Worker
10103*3ac0a46fSAndroid Build Coastguard Worker /* Allocate output component buffer if necessary */
10104*3ac0a46fSAndroid Build Coastguard Worker if (l_img_comp_dest->data == NULL &&
10105*3ac0a46fSAndroid Build Coastguard Worker l_start_offset_src == 0 && l_start_offset_dest == 0 &&
10106*3ac0a46fSAndroid Build Coastguard Worker src_data_stride == l_img_comp_dest->w &&
10107*3ac0a46fSAndroid Build Coastguard Worker l_width_dest == l_img_comp_dest->w &&
10108*3ac0a46fSAndroid Build Coastguard Worker l_height_dest == l_img_comp_dest->h) {
10109*3ac0a46fSAndroid Build Coastguard Worker /* If the final image matches the tile buffer, then borrow it */
10110*3ac0a46fSAndroid Build Coastguard Worker /* directly to save a copy */
10111*3ac0a46fSAndroid Build Coastguard Worker if (p_tcd->whole_tile_decoding) {
10112*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_dest->data = l_tilec->data;
10113*3ac0a46fSAndroid Build Coastguard Worker l_tilec->data = NULL;
10114*3ac0a46fSAndroid Build Coastguard Worker } else {
10115*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_dest->data = l_tilec->data_win;
10116*3ac0a46fSAndroid Build Coastguard Worker l_tilec->data_win = NULL;
10117*3ac0a46fSAndroid Build Coastguard Worker }
10118*3ac0a46fSAndroid Build Coastguard Worker continue;
10119*3ac0a46fSAndroid Build Coastguard Worker } else if (l_img_comp_dest->data == NULL) {
10120*3ac0a46fSAndroid Build Coastguard Worker OPJ_SIZE_T l_width = l_img_comp_dest->w;
10121*3ac0a46fSAndroid Build Coastguard Worker OPJ_SIZE_T l_height = l_img_comp_dest->h;
10122*3ac0a46fSAndroid Build Coastguard Worker
10123*3ac0a46fSAndroid Build Coastguard Worker if ((l_height == 0U) || (l_width > (SIZE_MAX / l_height)) ||
10124*3ac0a46fSAndroid Build Coastguard Worker l_width * l_height > SIZE_MAX / sizeof(OPJ_INT32)) {
10125*3ac0a46fSAndroid Build Coastguard Worker /* would overflow */
10126*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10127*3ac0a46fSAndroid Build Coastguard Worker }
10128*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_dest->data = (OPJ_INT32*) opj_image_data_alloc(l_width * l_height *
10129*3ac0a46fSAndroid Build Coastguard Worker sizeof(OPJ_INT32));
10130*3ac0a46fSAndroid Build Coastguard Worker if (! l_img_comp_dest->data) {
10131*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10132*3ac0a46fSAndroid Build Coastguard Worker }
10133*3ac0a46fSAndroid Build Coastguard Worker
10134*3ac0a46fSAndroid Build Coastguard Worker if (l_img_comp_dest->w != l_width_dest ||
10135*3ac0a46fSAndroid Build Coastguard Worker l_img_comp_dest->h != l_height_dest) {
10136*3ac0a46fSAndroid Build Coastguard Worker memset(l_img_comp_dest->data, 0,
10137*3ac0a46fSAndroid Build Coastguard Worker (OPJ_SIZE_T)l_img_comp_dest->w * l_img_comp_dest->h * sizeof(OPJ_INT32));
10138*3ac0a46fSAndroid Build Coastguard Worker }
10139*3ac0a46fSAndroid Build Coastguard Worker }
10140*3ac0a46fSAndroid Build Coastguard Worker
10141*3ac0a46fSAndroid Build Coastguard Worker /* Move the output buffer to the first place where we will write*/
10142*3ac0a46fSAndroid Build Coastguard Worker l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
10143*3ac0a46fSAndroid Build Coastguard Worker
10144*3ac0a46fSAndroid Build Coastguard Worker {
10145*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32 * l_src_ptr = p_src_data;
10146*3ac0a46fSAndroid Build Coastguard Worker l_src_ptr += l_start_offset_src;
10147*3ac0a46fSAndroid Build Coastguard Worker
10148*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_height_dest; ++j) {
10149*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_dest_ptr, l_src_ptr, l_width_dest * sizeof(OPJ_INT32));
10150*3ac0a46fSAndroid Build Coastguard Worker l_dest_ptr += l_img_comp_dest->w;
10151*3ac0a46fSAndroid Build Coastguard Worker l_src_ptr += src_data_stride;
10152*3ac0a46fSAndroid Build Coastguard Worker }
10153*3ac0a46fSAndroid Build Coastguard Worker }
10154*3ac0a46fSAndroid Build Coastguard Worker
10155*3ac0a46fSAndroid Build Coastguard Worker
10156*3ac0a46fSAndroid Build Coastguard Worker }
10157*3ac0a46fSAndroid Build Coastguard Worker
10158*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
10159*3ac0a46fSAndroid Build Coastguard Worker }
10160*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_update_image_dimensions(opj_image_t * p_image,opj_event_mgr_t * p_manager)10161*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_update_image_dimensions(opj_image_t* p_image,
10162*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
10163*3ac0a46fSAndroid Build Coastguard Worker {
10164*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_comp;
10165*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 l_comp_x1, l_comp_y1;
10166*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t* l_img_comp = NULL;
10167*3ac0a46fSAndroid Build Coastguard Worker
10168*3ac0a46fSAndroid Build Coastguard Worker l_img_comp = p_image->comps;
10169*3ac0a46fSAndroid Build Coastguard Worker for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
10170*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 l_h, l_w;
10171*3ac0a46fSAndroid Build Coastguard Worker if (p_image->x0 > (OPJ_UINT32)INT_MAX ||
10172*3ac0a46fSAndroid Build Coastguard Worker p_image->y0 > (OPJ_UINT32)INT_MAX ||
10173*3ac0a46fSAndroid Build Coastguard Worker p_image->x1 > (OPJ_UINT32)INT_MAX ||
10174*3ac0a46fSAndroid Build Coastguard Worker p_image->y1 > (OPJ_UINT32)INT_MAX) {
10175*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10176*3ac0a46fSAndroid Build Coastguard Worker "Image coordinates above INT_MAX are not supported\n");
10177*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10178*3ac0a46fSAndroid Build Coastguard Worker }
10179*3ac0a46fSAndroid Build Coastguard Worker
10180*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
10181*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
10182*3ac0a46fSAndroid Build Coastguard Worker l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
10183*3ac0a46fSAndroid Build Coastguard Worker l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
10184*3ac0a46fSAndroid Build Coastguard Worker
10185*3ac0a46fSAndroid Build Coastguard Worker l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
10186*3ac0a46fSAndroid Build Coastguard Worker - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
10187*3ac0a46fSAndroid Build Coastguard Worker if (l_w < 0) {
10188*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10189*3ac0a46fSAndroid Build Coastguard Worker "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
10190*3ac0a46fSAndroid Build Coastguard Worker it_comp, l_w);
10191*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10192*3ac0a46fSAndroid Build Coastguard Worker }
10193*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->w = (OPJ_UINT32)l_w;
10194*3ac0a46fSAndroid Build Coastguard Worker
10195*3ac0a46fSAndroid Build Coastguard Worker l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
10196*3ac0a46fSAndroid Build Coastguard Worker - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
10197*3ac0a46fSAndroid Build Coastguard Worker if (l_h < 0) {
10198*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10199*3ac0a46fSAndroid Build Coastguard Worker "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
10200*3ac0a46fSAndroid Build Coastguard Worker it_comp, l_h);
10201*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10202*3ac0a46fSAndroid Build Coastguard Worker }
10203*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->h = (OPJ_UINT32)l_h;
10204*3ac0a46fSAndroid Build Coastguard Worker
10205*3ac0a46fSAndroid Build Coastguard Worker l_img_comp++;
10206*3ac0a46fSAndroid Build Coastguard Worker }
10207*3ac0a46fSAndroid Build Coastguard Worker
10208*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
10209*3ac0a46fSAndroid Build Coastguard Worker }
10210*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_set_decoded_components(void * j2k,OPJ_UINT32 numcomps,const OPJ_UINT32 * comps_indices,opj_event_mgr_t * p_manager)10211*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_set_decoded_components(void *j2k,
10212*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 numcomps,
10213*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32* comps_indices,
10214*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
10215*3ac0a46fSAndroid Build Coastguard Worker {
10216*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
10217*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
10218*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL* already_mapped;
10219*3ac0a46fSAndroid Build Coastguard Worker
10220*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_private_image == NULL) {
10221*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10222*3ac0a46fSAndroid Build Coastguard Worker "opj_read_header() should be called before "
10223*3ac0a46fSAndroid Build Coastguard Worker "opj_set_decoded_components().\n");
10224*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10225*3ac0a46fSAndroid Build Coastguard Worker }
10226*3ac0a46fSAndroid Build Coastguard Worker
10227*3ac0a46fSAndroid Build Coastguard Worker already_mapped = (OPJ_BOOL*) opj_calloc(sizeof(OPJ_BOOL),
10228*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image->numcomps);
10229*3ac0a46fSAndroid Build Coastguard Worker if (already_mapped == NULL) {
10230*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10231*3ac0a46fSAndroid Build Coastguard Worker }
10232*3ac0a46fSAndroid Build Coastguard Worker
10233*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < numcomps; i++) {
10234*3ac0a46fSAndroid Build Coastguard Worker if (comps_indices[i] >= p_j2k->m_private_image->numcomps) {
10235*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10236*3ac0a46fSAndroid Build Coastguard Worker "Invalid component index: %u\n",
10237*3ac0a46fSAndroid Build Coastguard Worker comps_indices[i]);
10238*3ac0a46fSAndroid Build Coastguard Worker opj_free(already_mapped);
10239*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10240*3ac0a46fSAndroid Build Coastguard Worker }
10241*3ac0a46fSAndroid Build Coastguard Worker if (already_mapped[comps_indices[i]]) {
10242*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10243*3ac0a46fSAndroid Build Coastguard Worker "Component index %u used several times\n",
10244*3ac0a46fSAndroid Build Coastguard Worker comps_indices[i]);
10245*3ac0a46fSAndroid Build Coastguard Worker opj_free(already_mapped);
10246*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10247*3ac0a46fSAndroid Build Coastguard Worker }
10248*3ac0a46fSAndroid Build Coastguard Worker already_mapped[comps_indices[i]] = OPJ_TRUE;
10249*3ac0a46fSAndroid Build Coastguard Worker }
10250*3ac0a46fSAndroid Build Coastguard Worker opj_free(already_mapped);
10251*3ac0a46fSAndroid Build Coastguard Worker
10252*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode);
10253*3ac0a46fSAndroid Build Coastguard Worker if (numcomps) {
10254*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode =
10255*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32*) opj_malloc(numcomps * sizeof(OPJ_UINT32));
10256*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode == NULL) {
10257*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = 0;
10258*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10259*3ac0a46fSAndroid Build Coastguard Worker }
10260*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode,
10261*3ac0a46fSAndroid Build Coastguard Worker comps_indices,
10262*3ac0a46fSAndroid Build Coastguard Worker numcomps * sizeof(OPJ_UINT32));
10263*3ac0a46fSAndroid Build Coastguard Worker } else {
10264*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode = NULL;
10265*3ac0a46fSAndroid Build Coastguard Worker }
10266*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode = numcomps;
10267*3ac0a46fSAndroid Build Coastguard Worker
10268*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
10269*3ac0a46fSAndroid Build Coastguard Worker }
10270*3ac0a46fSAndroid Build Coastguard Worker
10271*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_set_decode_area(void * j2k,opj_image_t * p_image,OPJ_INT32 p_start_x,OPJ_INT32 p_start_y,OPJ_INT32 p_end_x,OPJ_INT32 p_end_y,opj_event_mgr_t * p_manager)10272*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_set_decode_area(void *j2k,
10273*3ac0a46fSAndroid Build Coastguard Worker opj_image_t* p_image,
10274*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
10275*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
10276*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
10277*3ac0a46fSAndroid Build Coastguard Worker {
10278*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
10279*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t * l_cp = &(p_j2k->m_cp);
10280*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image = p_j2k->m_private_image;
10281*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL ret;
10282*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_comp;
10283*3ac0a46fSAndroid Build Coastguard Worker
10284*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
10285*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.tcps[0].m_data != NULL) {
10286*3ac0a46fSAndroid Build Coastguard Worker /* In the case of a single-tiled image whose codestream we have already */
10287*3ac0a46fSAndroid Build Coastguard Worker /* ingested, go on */
10288*3ac0a46fSAndroid Build Coastguard Worker }
10289*3ac0a46fSAndroid Build Coastguard Worker /* Check if we are read the main header */
10290*3ac0a46fSAndroid Build Coastguard Worker else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
10291*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10292*3ac0a46fSAndroid Build Coastguard Worker "Need to decode the main header before begin to decode the remaining codestream.\n");
10293*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10294*3ac0a46fSAndroid Build Coastguard Worker }
10295*3ac0a46fSAndroid Build Coastguard Worker
10296*3ac0a46fSAndroid Build Coastguard Worker /* Update the comps[].factor member of the output image with the one */
10297*3ac0a46fSAndroid Build Coastguard Worker /* of m_reduce */
10298*3ac0a46fSAndroid Build Coastguard Worker for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
10299*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
10300*3ac0a46fSAndroid Build Coastguard Worker }
10301*3ac0a46fSAndroid Build Coastguard Worker
10302*3ac0a46fSAndroid Build Coastguard Worker if (!p_start_x && !p_start_y && !p_end_x && !p_end_y) {
10303*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO,
10304*3ac0a46fSAndroid Build Coastguard Worker "No decoded area parameters, set the decoded area to the whole image\n");
10305*3ac0a46fSAndroid Build Coastguard Worker
10306*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
10307*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
10308*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
10309*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
10310*3ac0a46fSAndroid Build Coastguard Worker
10311*3ac0a46fSAndroid Build Coastguard Worker p_image->x0 = l_image->x0;
10312*3ac0a46fSAndroid Build Coastguard Worker p_image->y0 = l_image->y0;
10313*3ac0a46fSAndroid Build Coastguard Worker p_image->x1 = l_image->x1;
10314*3ac0a46fSAndroid Build Coastguard Worker p_image->y1 = l_image->y1;
10315*3ac0a46fSAndroid Build Coastguard Worker
10316*3ac0a46fSAndroid Build Coastguard Worker return opj_j2k_update_image_dimensions(p_image, p_manager);
10317*3ac0a46fSAndroid Build Coastguard Worker }
10318*3ac0a46fSAndroid Build Coastguard Worker
10319*3ac0a46fSAndroid Build Coastguard Worker /* ----- */
10320*3ac0a46fSAndroid Build Coastguard Worker /* Check if the positions provided by the user are correct */
10321*3ac0a46fSAndroid Build Coastguard Worker
10322*3ac0a46fSAndroid Build Coastguard Worker /* Left */
10323*3ac0a46fSAndroid Build Coastguard Worker if (p_start_x < 0) {
10324*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10325*3ac0a46fSAndroid Build Coastguard Worker "Left position of the decoded area (region_x0=%d) should be >= 0.\n",
10326*3ac0a46fSAndroid Build Coastguard Worker p_start_x);
10327*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10328*3ac0a46fSAndroid Build Coastguard Worker } else if ((OPJ_UINT32)p_start_x > l_image->x1) {
10329*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10330*3ac0a46fSAndroid Build Coastguard Worker "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
10331*3ac0a46fSAndroid Build Coastguard Worker p_start_x, l_image->x1);
10332*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10333*3ac0a46fSAndroid Build Coastguard Worker } else if ((OPJ_UINT32)p_start_x < l_image->x0) {
10334*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
10335*3ac0a46fSAndroid Build Coastguard Worker "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
10336*3ac0a46fSAndroid Build Coastguard Worker p_start_x, l_image->x0);
10337*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
10338*3ac0a46fSAndroid Build Coastguard Worker p_image->x0 = l_image->x0;
10339*3ac0a46fSAndroid Build Coastguard Worker } else {
10340*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x -
10341*3ac0a46fSAndroid Build Coastguard Worker l_cp->tx0) / l_cp->tdx;
10342*3ac0a46fSAndroid Build Coastguard Worker p_image->x0 = (OPJ_UINT32)p_start_x;
10343*3ac0a46fSAndroid Build Coastguard Worker }
10344*3ac0a46fSAndroid Build Coastguard Worker
10345*3ac0a46fSAndroid Build Coastguard Worker /* Up */
10346*3ac0a46fSAndroid Build Coastguard Worker if (p_start_y < 0) {
10347*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10348*3ac0a46fSAndroid Build Coastguard Worker "Up position of the decoded area (region_y0=%d) should be >= 0.\n",
10349*3ac0a46fSAndroid Build Coastguard Worker p_start_y);
10350*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10351*3ac0a46fSAndroid Build Coastguard Worker } else if ((OPJ_UINT32)p_start_y > l_image->y1) {
10352*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10353*3ac0a46fSAndroid Build Coastguard Worker "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
10354*3ac0a46fSAndroid Build Coastguard Worker p_start_y, l_image->y1);
10355*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10356*3ac0a46fSAndroid Build Coastguard Worker } else if ((OPJ_UINT32)p_start_y < l_image->y0) {
10357*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
10358*3ac0a46fSAndroid Build Coastguard Worker "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
10359*3ac0a46fSAndroid Build Coastguard Worker p_start_y, l_image->y0);
10360*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
10361*3ac0a46fSAndroid Build Coastguard Worker p_image->y0 = l_image->y0;
10362*3ac0a46fSAndroid Build Coastguard Worker } else {
10363*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y -
10364*3ac0a46fSAndroid Build Coastguard Worker l_cp->ty0) / l_cp->tdy;
10365*3ac0a46fSAndroid Build Coastguard Worker p_image->y0 = (OPJ_UINT32)p_start_y;
10366*3ac0a46fSAndroid Build Coastguard Worker }
10367*3ac0a46fSAndroid Build Coastguard Worker
10368*3ac0a46fSAndroid Build Coastguard Worker /* Right */
10369*3ac0a46fSAndroid Build Coastguard Worker if (p_end_x <= 0) {
10370*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10371*3ac0a46fSAndroid Build Coastguard Worker "Right position of the decoded area (region_x1=%d) should be > 0.\n",
10372*3ac0a46fSAndroid Build Coastguard Worker p_end_x);
10373*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10374*3ac0a46fSAndroid Build Coastguard Worker } else if ((OPJ_UINT32)p_end_x < l_image->x0) {
10375*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10376*3ac0a46fSAndroid Build Coastguard Worker "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
10377*3ac0a46fSAndroid Build Coastguard Worker p_end_x, l_image->x0);
10378*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10379*3ac0a46fSAndroid Build Coastguard Worker } else if ((OPJ_UINT32)p_end_x > l_image->x1) {
10380*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
10381*3ac0a46fSAndroid Build Coastguard Worker "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
10382*3ac0a46fSAndroid Build Coastguard Worker p_end_x, l_image->x1);
10383*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
10384*3ac0a46fSAndroid Build Coastguard Worker p_image->x1 = l_image->x1;
10385*3ac0a46fSAndroid Build Coastguard Worker } else {
10386*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv(
10387*3ac0a46fSAndroid Build Coastguard Worker p_end_x - (OPJ_INT32)l_cp->tx0, (OPJ_INT32)l_cp->tdx);
10388*3ac0a46fSAndroid Build Coastguard Worker p_image->x1 = (OPJ_UINT32)p_end_x;
10389*3ac0a46fSAndroid Build Coastguard Worker }
10390*3ac0a46fSAndroid Build Coastguard Worker
10391*3ac0a46fSAndroid Build Coastguard Worker /* Bottom */
10392*3ac0a46fSAndroid Build Coastguard Worker if (p_end_y <= 0) {
10393*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10394*3ac0a46fSAndroid Build Coastguard Worker "Bottom position of the decoded area (region_y1=%d) should be > 0.\n",
10395*3ac0a46fSAndroid Build Coastguard Worker p_end_y);
10396*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10397*3ac0a46fSAndroid Build Coastguard Worker } else if ((OPJ_UINT32)p_end_y < l_image->y0) {
10398*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10399*3ac0a46fSAndroid Build Coastguard Worker "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
10400*3ac0a46fSAndroid Build Coastguard Worker p_end_y, l_image->y0);
10401*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10402*3ac0a46fSAndroid Build Coastguard Worker }
10403*3ac0a46fSAndroid Build Coastguard Worker if ((OPJ_UINT32)p_end_y > l_image->y1) {
10404*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
10405*3ac0a46fSAndroid Build Coastguard Worker "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
10406*3ac0a46fSAndroid Build Coastguard Worker p_end_y, l_image->y1);
10407*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
10408*3ac0a46fSAndroid Build Coastguard Worker p_image->y1 = l_image->y1;
10409*3ac0a46fSAndroid Build Coastguard Worker } else {
10410*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv(
10411*3ac0a46fSAndroid Build Coastguard Worker p_end_y - (OPJ_INT32)l_cp->ty0, (OPJ_INT32)l_cp->tdy);
10412*3ac0a46fSAndroid Build Coastguard Worker p_image->y1 = (OPJ_UINT32)p_end_y;
10413*3ac0a46fSAndroid Build Coastguard Worker }
10414*3ac0a46fSAndroid Build Coastguard Worker /* ----- */
10415*3ac0a46fSAndroid Build Coastguard Worker
10416*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
10417*3ac0a46fSAndroid Build Coastguard Worker
10418*3ac0a46fSAndroid Build Coastguard Worker ret = opj_j2k_update_image_dimensions(p_image, p_manager);
10419*3ac0a46fSAndroid Build Coastguard Worker
10420*3ac0a46fSAndroid Build Coastguard Worker if (ret) {
10421*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO, "Setting decoding area to %d,%d,%d,%d\n",
10422*3ac0a46fSAndroid Build Coastguard Worker p_image->x0, p_image->y0, p_image->x1, p_image->y1);
10423*3ac0a46fSAndroid Build Coastguard Worker }
10424*3ac0a46fSAndroid Build Coastguard Worker
10425*3ac0a46fSAndroid Build Coastguard Worker return ret;
10426*3ac0a46fSAndroid Build Coastguard Worker }
10427*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_create_decompress(void)10428*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* opj_j2k_create_decompress(void)
10429*3ac0a46fSAndroid Build Coastguard Worker {
10430*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
10431*3ac0a46fSAndroid Build Coastguard Worker if (!l_j2k) {
10432*3ac0a46fSAndroid Build Coastguard Worker return 00;
10433*3ac0a46fSAndroid Build Coastguard Worker }
10434*3ac0a46fSAndroid Build Coastguard Worker
10435*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_is_decoder = 1;
10436*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_cp.m_is_decoder = 1;
10437*3ac0a46fSAndroid Build Coastguard Worker /* in the absence of JP2 boxes, consider different bit depth / sign */
10438*3ac0a46fSAndroid Build Coastguard Worker /* per component is allowed */
10439*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_cp.allow_different_bit_depth_sign = 1;
10440*3ac0a46fSAndroid Build Coastguard Worker
10441*3ac0a46fSAndroid Build Coastguard Worker /* Default to using strict mode. */
10442*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_cp.strict = OPJ_TRUE;
10443*3ac0a46fSAndroid Build Coastguard Worker
10444*3ac0a46fSAndroid Build Coastguard Worker #ifdef OPJ_DISABLE_TPSOT_FIX
10445*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
10446*3ac0a46fSAndroid Build Coastguard Worker #endif
10447*3ac0a46fSAndroid Build Coastguard Worker
10448*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,
10449*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_tcp_t));
10450*3ac0a46fSAndroid Build Coastguard Worker if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
10451*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
10452*3ac0a46fSAndroid Build Coastguard Worker return 00;
10453*3ac0a46fSAndroid Build Coastguard Worker }
10454*3ac0a46fSAndroid Build Coastguard Worker
10455*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,
10456*3ac0a46fSAndroid Build Coastguard Worker OPJ_J2K_DEFAULT_HEADER_SIZE);
10457*3ac0a46fSAndroid Build Coastguard Worker if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
10458*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
10459*3ac0a46fSAndroid Build Coastguard Worker return 00;
10460*3ac0a46fSAndroid Build Coastguard Worker }
10461*3ac0a46fSAndroid Build Coastguard Worker
10462*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_specific_param.m_decoder.m_header_data_size =
10463*3ac0a46fSAndroid Build Coastguard Worker OPJ_J2K_DEFAULT_HEADER_SIZE;
10464*3ac0a46fSAndroid Build Coastguard Worker
10465*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
10466*3ac0a46fSAndroid Build Coastguard Worker
10467*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
10468*3ac0a46fSAndroid Build Coastguard Worker
10469*3ac0a46fSAndroid Build Coastguard Worker /* codestream index creation */
10470*3ac0a46fSAndroid Build Coastguard Worker l_j2k->cstr_index = opj_j2k_create_cstr_index();
10471*3ac0a46fSAndroid Build Coastguard Worker if (!l_j2k->cstr_index) {
10472*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
10473*3ac0a46fSAndroid Build Coastguard Worker return 00;
10474*3ac0a46fSAndroid Build Coastguard Worker }
10475*3ac0a46fSAndroid Build Coastguard Worker
10476*3ac0a46fSAndroid Build Coastguard Worker /* validation list creation */
10477*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_validation_list = opj_procedure_list_create();
10478*3ac0a46fSAndroid Build Coastguard Worker if (! l_j2k->m_validation_list) {
10479*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
10480*3ac0a46fSAndroid Build Coastguard Worker return 00;
10481*3ac0a46fSAndroid Build Coastguard Worker }
10482*3ac0a46fSAndroid Build Coastguard Worker
10483*3ac0a46fSAndroid Build Coastguard Worker /* execution list creation */
10484*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_procedure_list = opj_procedure_list_create();
10485*3ac0a46fSAndroid Build Coastguard Worker if (! l_j2k->m_procedure_list) {
10486*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
10487*3ac0a46fSAndroid Build Coastguard Worker return 00;
10488*3ac0a46fSAndroid Build Coastguard Worker }
10489*3ac0a46fSAndroid Build Coastguard Worker
10490*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
10491*3ac0a46fSAndroid Build Coastguard Worker if (!l_j2k->m_tp) {
10492*3ac0a46fSAndroid Build Coastguard Worker l_j2k->m_tp = opj_thread_pool_create(0);
10493*3ac0a46fSAndroid Build Coastguard Worker }
10494*3ac0a46fSAndroid Build Coastguard Worker if (!l_j2k->m_tp) {
10495*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_destroy(l_j2k);
10496*3ac0a46fSAndroid Build Coastguard Worker return NULL;
10497*3ac0a46fSAndroid Build Coastguard Worker }
10498*3ac0a46fSAndroid Build Coastguard Worker
10499*3ac0a46fSAndroid Build Coastguard Worker return l_j2k;
10500*3ac0a46fSAndroid Build Coastguard Worker }
10501*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_create_cstr_index(void)10502*3ac0a46fSAndroid Build Coastguard Worker static opj_codestream_index_t* opj_j2k_create_cstr_index(void)
10503*3ac0a46fSAndroid Build Coastguard Worker {
10504*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
10505*3ac0a46fSAndroid Build Coastguard Worker opj_calloc(1, sizeof(opj_codestream_index_t));
10506*3ac0a46fSAndroid Build Coastguard Worker if (!cstr_index) {
10507*3ac0a46fSAndroid Build Coastguard Worker return NULL;
10508*3ac0a46fSAndroid Build Coastguard Worker }
10509*3ac0a46fSAndroid Build Coastguard Worker
10510*3ac0a46fSAndroid Build Coastguard Worker cstr_index->maxmarknum = 100;
10511*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marknum = 0;
10512*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker = (opj_marker_info_t*)
10513*3ac0a46fSAndroid Build Coastguard Worker opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
10514*3ac0a46fSAndroid Build Coastguard Worker if (!cstr_index-> marker) {
10515*3ac0a46fSAndroid Build Coastguard Worker opj_free(cstr_index);
10516*3ac0a46fSAndroid Build Coastguard Worker return NULL;
10517*3ac0a46fSAndroid Build Coastguard Worker }
10518*3ac0a46fSAndroid Build Coastguard Worker
10519*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index = NULL;
10520*3ac0a46fSAndroid Build Coastguard Worker
10521*3ac0a46fSAndroid Build Coastguard Worker return cstr_index;
10522*3ac0a46fSAndroid Build Coastguard Worker }
10523*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_no,OPJ_UINT32 p_comp_no)10524*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t *p_j2k,
10525*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
10526*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no)
10527*3ac0a46fSAndroid Build Coastguard Worker {
10528*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
10529*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
10530*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = 00;
10531*3ac0a46fSAndroid Build Coastguard Worker
10532*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
10533*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
10534*3ac0a46fSAndroid Build Coastguard Worker
10535*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
10536*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_tile_no];
10537*3ac0a46fSAndroid Build Coastguard Worker l_tccp = &l_tcp->tccps[p_comp_no];
10538*3ac0a46fSAndroid Build Coastguard Worker
10539*3ac0a46fSAndroid Build Coastguard Worker /* preconditions again */
10540*3ac0a46fSAndroid Build Coastguard Worker assert(p_tile_no < (l_cp->tw * l_cp->th));
10541*3ac0a46fSAndroid Build Coastguard Worker assert(p_comp_no < p_j2k->m_private_image->numcomps);
10542*3ac0a46fSAndroid Build Coastguard Worker
10543*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10544*3ac0a46fSAndroid Build Coastguard Worker return 5 + l_tccp->numresolutions;
10545*3ac0a46fSAndroid Build Coastguard Worker } else {
10546*3ac0a46fSAndroid Build Coastguard Worker return 5;
10547*3ac0a46fSAndroid Build Coastguard Worker }
10548*3ac0a46fSAndroid Build Coastguard Worker }
10549*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_compare_SPCod_SPCoc(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_no,OPJ_UINT32 p_first_comp_no,OPJ_UINT32 p_second_comp_no)10550*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_compare_SPCod_SPCoc(opj_j2k_t *p_j2k,
10551*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
10552*3ac0a46fSAndroid Build Coastguard Worker {
10553*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
10554*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = NULL;
10555*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = NULL;
10556*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp0 = NULL;
10557*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp1 = NULL;
10558*3ac0a46fSAndroid Build Coastguard Worker
10559*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
10560*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
10561*3ac0a46fSAndroid Build Coastguard Worker
10562*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
10563*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_tile_no];
10564*3ac0a46fSAndroid Build Coastguard Worker l_tccp0 = &l_tcp->tccps[p_first_comp_no];
10565*3ac0a46fSAndroid Build Coastguard Worker l_tccp1 = &l_tcp->tccps[p_second_comp_no];
10566*3ac0a46fSAndroid Build Coastguard Worker
10567*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->numresolutions != l_tccp1->numresolutions) {
10568*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10569*3ac0a46fSAndroid Build Coastguard Worker }
10570*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->cblkw != l_tccp1->cblkw) {
10571*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10572*3ac0a46fSAndroid Build Coastguard Worker }
10573*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->cblkh != l_tccp1->cblkh) {
10574*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10575*3ac0a46fSAndroid Build Coastguard Worker }
10576*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->cblksty != l_tccp1->cblksty) {
10577*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10578*3ac0a46fSAndroid Build Coastguard Worker }
10579*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->qmfbid != l_tccp1->qmfbid) {
10580*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10581*3ac0a46fSAndroid Build Coastguard Worker }
10582*3ac0a46fSAndroid Build Coastguard Worker if ((l_tccp0->csty & J2K_CCP_CSTY_PRT) != (l_tccp1->csty & J2K_CCP_CSTY_PRT)) {
10583*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10584*3ac0a46fSAndroid Build Coastguard Worker }
10585*3ac0a46fSAndroid Build Coastguard Worker
10586*3ac0a46fSAndroid Build Coastguard Worker for (i = 0U; i < l_tccp0->numresolutions; ++i) {
10587*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->prcw[i] != l_tccp1->prcw[i]) {
10588*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10589*3ac0a46fSAndroid Build Coastguard Worker }
10590*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->prch[i] != l_tccp1->prch[i]) {
10591*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10592*3ac0a46fSAndroid Build Coastguard Worker }
10593*3ac0a46fSAndroid Build Coastguard Worker }
10594*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
10595*3ac0a46fSAndroid Build Coastguard Worker }
10596*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_SPCod_SPCoc(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_no,OPJ_UINT32 p_comp_no,OPJ_BYTE * p_data,OPJ_UINT32 * p_header_size,struct opj_event_mgr * p_manager)10597*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(opj_j2k_t *p_j2k,
10598*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
10599*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
10600*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
10601*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_header_size,
10602*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
10603*3ac0a46fSAndroid Build Coastguard Worker {
10604*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
10605*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
10606*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
10607*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = 00;
10608*3ac0a46fSAndroid Build Coastguard Worker
10609*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
10610*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
10611*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_size != 00);
10612*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
10613*3ac0a46fSAndroid Build Coastguard Worker assert(p_data != 00);
10614*3ac0a46fSAndroid Build Coastguard Worker
10615*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
10616*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_tile_no];
10617*3ac0a46fSAndroid Build Coastguard Worker l_tccp = &l_tcp->tccps[p_comp_no];
10618*3ac0a46fSAndroid Build Coastguard Worker
10619*3ac0a46fSAndroid Build Coastguard Worker /* preconditions again */
10620*3ac0a46fSAndroid Build Coastguard Worker assert(p_tile_no < (l_cp->tw * l_cp->th));
10621*3ac0a46fSAndroid Build Coastguard Worker assert(p_comp_no < (p_j2k->m_private_image->numcomps));
10622*3ac0a46fSAndroid Build Coastguard Worker
10623*3ac0a46fSAndroid Build Coastguard Worker if (*p_header_size < 5) {
10624*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
10625*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10626*3ac0a46fSAndroid Build Coastguard Worker }
10627*3ac0a46fSAndroid Build Coastguard Worker
10628*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_tccp->numresolutions - 1, 1); /* SPcoc (D) */
10629*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10630*3ac0a46fSAndroid Build Coastguard Worker
10631*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_tccp->cblkw - 2, 1); /* SPcoc (E) */
10632*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10633*3ac0a46fSAndroid Build Coastguard Worker
10634*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_tccp->cblkh - 2, 1); /* SPcoc (F) */
10635*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10636*3ac0a46fSAndroid Build Coastguard Worker
10637*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_tccp->cblksty,
10638*3ac0a46fSAndroid Build Coastguard Worker 1); /* SPcoc (G) */
10639*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10640*3ac0a46fSAndroid Build Coastguard Worker
10641*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_tccp->qmfbid,
10642*3ac0a46fSAndroid Build Coastguard Worker 1); /* SPcoc (H) */
10643*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10644*3ac0a46fSAndroid Build Coastguard Worker
10645*3ac0a46fSAndroid Build Coastguard Worker *p_header_size = *p_header_size - 5;
10646*3ac0a46fSAndroid Build Coastguard Worker
10647*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10648*3ac0a46fSAndroid Build Coastguard Worker
10649*3ac0a46fSAndroid Build Coastguard Worker if (*p_header_size < l_tccp->numresolutions) {
10650*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
10651*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10652*3ac0a46fSAndroid Build Coastguard Worker }
10653*3ac0a46fSAndroid Build Coastguard Worker
10654*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tccp->numresolutions; ++i) {
10655*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_tccp->prcw[i] + (l_tccp->prch[i] << 4),
10656*3ac0a46fSAndroid Build Coastguard Worker 1); /* SPcoc (I_i) */
10657*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10658*3ac0a46fSAndroid Build Coastguard Worker }
10659*3ac0a46fSAndroid Build Coastguard Worker
10660*3ac0a46fSAndroid Build Coastguard Worker *p_header_size = *p_header_size - l_tccp->numresolutions;
10661*3ac0a46fSAndroid Build Coastguard Worker }
10662*3ac0a46fSAndroid Build Coastguard Worker
10663*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
10664*3ac0a46fSAndroid Build Coastguard Worker }
10665*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_SPCod_SPCoc(opj_j2k_t * p_j2k,OPJ_UINT32 compno,OPJ_BYTE * p_header_data,OPJ_UINT32 * p_header_size,opj_event_mgr_t * p_manager)10666*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
10667*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno,
10668*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_header_data,
10669*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_header_size,
10670*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
10671*3ac0a46fSAndroid Build Coastguard Worker {
10672*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, l_tmp;
10673*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = NULL;
10674*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = NULL;
10675*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = NULL;
10676*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_ptr = NULL;
10677*3ac0a46fSAndroid Build Coastguard Worker
10678*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
10679*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
10680*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
10681*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
10682*3ac0a46fSAndroid Build Coastguard Worker
10683*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
10684*3ac0a46fSAndroid Build Coastguard Worker l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
10685*3ac0a46fSAndroid Build Coastguard Worker &l_cp->tcps[p_j2k->m_current_tile_number] :
10686*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
10687*3ac0a46fSAndroid Build Coastguard Worker
10688*3ac0a46fSAndroid Build Coastguard Worker /* precondition again */
10689*3ac0a46fSAndroid Build Coastguard Worker if (compno >= p_j2k->m_private_image->numcomps) {
10690*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10691*3ac0a46fSAndroid Build Coastguard Worker }
10692*3ac0a46fSAndroid Build Coastguard Worker
10693*3ac0a46fSAndroid Build Coastguard Worker assert(compno < p_j2k->m_private_image->numcomps);
10694*3ac0a46fSAndroid Build Coastguard Worker
10695*3ac0a46fSAndroid Build Coastguard Worker l_tccp = &l_tcp->tccps[compno];
10696*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr = p_header_data;
10697*3ac0a46fSAndroid Build Coastguard Worker
10698*3ac0a46fSAndroid Build Coastguard Worker /* make sure room is sufficient */
10699*3ac0a46fSAndroid Build Coastguard Worker if (*p_header_size < 5) {
10700*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
10701*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10702*3ac0a46fSAndroid Build Coastguard Worker }
10703*3ac0a46fSAndroid Build Coastguard Worker
10704*3ac0a46fSAndroid Build Coastguard Worker /* SPcod (D) / SPcoc (A) */
10705*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tccp->numresolutions, 1);
10706*3ac0a46fSAndroid Build Coastguard Worker ++l_tccp->numresolutions; /* tccp->numresolutions = read() + 1 */
10707*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
10708*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10709*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
10710*3ac0a46fSAndroid Build Coastguard Worker l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
10711*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10712*3ac0a46fSAndroid Build Coastguard Worker }
10713*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
10714*3ac0a46fSAndroid Build Coastguard Worker
10715*3ac0a46fSAndroid Build Coastguard Worker /* If user wants to remove more resolutions than the codestream contains, return error */
10716*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
10717*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10718*3ac0a46fSAndroid Build Coastguard Worker "Error decoding component %d.\nThe number of resolutions "
10719*3ac0a46fSAndroid Build Coastguard Worker "to remove (%d) is greater or equal than the number "
10720*3ac0a46fSAndroid Build Coastguard Worker "of resolutions of this component (%d)\nModify the cp_reduce parameter.\n\n",
10721*3ac0a46fSAndroid Build Coastguard Worker compno, l_cp->m_specific_param.m_dec.m_reduce, l_tccp->numresolutions);
10722*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state |=
10723*3ac0a46fSAndroid Build Coastguard Worker 0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
10724*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10725*3ac0a46fSAndroid Build Coastguard Worker }
10726*3ac0a46fSAndroid Build Coastguard Worker
10727*3ac0a46fSAndroid Build Coastguard Worker /* SPcod (E) / SPcoc (B) */
10728*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tccp->cblkw, 1);
10729*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
10730*3ac0a46fSAndroid Build Coastguard Worker l_tccp->cblkw += 2;
10731*3ac0a46fSAndroid Build Coastguard Worker
10732*3ac0a46fSAndroid Build Coastguard Worker /* SPcod (F) / SPcoc (C) */
10733*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tccp->cblkh, 1);
10734*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
10735*3ac0a46fSAndroid Build Coastguard Worker l_tccp->cblkh += 2;
10736*3ac0a46fSAndroid Build Coastguard Worker
10737*3ac0a46fSAndroid Build Coastguard Worker if ((l_tccp->cblkw > 10) || (l_tccp->cblkh > 10) ||
10738*3ac0a46fSAndroid Build Coastguard Worker ((l_tccp->cblkw + l_tccp->cblkh) > 12)) {
10739*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10740*3ac0a46fSAndroid Build Coastguard Worker "Error reading SPCod SPCoc element, Invalid cblkw/cblkh combination\n");
10741*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10742*3ac0a46fSAndroid Build Coastguard Worker }
10743*3ac0a46fSAndroid Build Coastguard Worker
10744*3ac0a46fSAndroid Build Coastguard Worker /* SPcod (G) / SPcoc (D) */
10745*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tccp->cblksty, 1);
10746*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
10747*3ac0a46fSAndroid Build Coastguard Worker if ((l_tccp->cblksty & J2K_CCP_CBLKSTY_HTMIXED) != 0) {
10748*3ac0a46fSAndroid Build Coastguard Worker /* We do not support HT mixed mode yet. For conformance, it should be supported.*/
10749*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10750*3ac0a46fSAndroid Build Coastguard Worker "Error reading SPCod SPCoc element. Unsupported Mixed HT code-block style found\n");
10751*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10752*3ac0a46fSAndroid Build Coastguard Worker }
10753*3ac0a46fSAndroid Build Coastguard Worker
10754*3ac0a46fSAndroid Build Coastguard Worker /* SPcod (H) / SPcoc (E) */
10755*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tccp->qmfbid, 1);
10756*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
10757*3ac0a46fSAndroid Build Coastguard Worker
10758*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->qmfbid > 1) {
10759*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
10760*3ac0a46fSAndroid Build Coastguard Worker "Error reading SPCod SPCoc element, Invalid transformation found\n");
10761*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10762*3ac0a46fSAndroid Build Coastguard Worker }
10763*3ac0a46fSAndroid Build Coastguard Worker
10764*3ac0a46fSAndroid Build Coastguard Worker *p_header_size = *p_header_size - 5;
10765*3ac0a46fSAndroid Build Coastguard Worker
10766*3ac0a46fSAndroid Build Coastguard Worker /* use custom precinct size ? */
10767*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
10768*3ac0a46fSAndroid Build Coastguard Worker if (*p_header_size < l_tccp->numresolutions) {
10769*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
10770*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10771*3ac0a46fSAndroid Build Coastguard Worker }
10772*3ac0a46fSAndroid Build Coastguard Worker
10773*3ac0a46fSAndroid Build Coastguard Worker /* SPcod (I_i) / SPcoc (F_i) */
10774*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tccp->numresolutions; ++i) {
10775*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tmp, 1);
10776*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
10777*3ac0a46fSAndroid Build Coastguard Worker /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */
10778*3ac0a46fSAndroid Build Coastguard Worker if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) {
10779*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n");
10780*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10781*3ac0a46fSAndroid Build Coastguard Worker }
10782*3ac0a46fSAndroid Build Coastguard Worker l_tccp->prcw[i] = l_tmp & 0xf;
10783*3ac0a46fSAndroid Build Coastguard Worker l_tccp->prch[i] = l_tmp >> 4;
10784*3ac0a46fSAndroid Build Coastguard Worker }
10785*3ac0a46fSAndroid Build Coastguard Worker
10786*3ac0a46fSAndroid Build Coastguard Worker *p_header_size = *p_header_size - l_tccp->numresolutions;
10787*3ac0a46fSAndroid Build Coastguard Worker } else {
10788*3ac0a46fSAndroid Build Coastguard Worker /* set default size for the precinct width and height */
10789*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_tccp->numresolutions; ++i) {
10790*3ac0a46fSAndroid Build Coastguard Worker l_tccp->prcw[i] = 15;
10791*3ac0a46fSAndroid Build Coastguard Worker l_tccp->prch[i] = 15;
10792*3ac0a46fSAndroid Build Coastguard Worker }
10793*3ac0a46fSAndroid Build Coastguard Worker }
10794*3ac0a46fSAndroid Build Coastguard Worker
10795*3ac0a46fSAndroid Build Coastguard Worker #ifdef WIP_REMOVE_MSD
10796*3ac0a46fSAndroid Build Coastguard Worker /* INDEX >> */
10797*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_info && compno == 0) {
10798*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
10799*3ac0a46fSAndroid Build Coastguard Worker
10800*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh =
10801*3ac0a46fSAndroid Build Coastguard Worker l_tccp->cblkh;
10802*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw =
10803*3ac0a46fSAndroid Build Coastguard Worker l_tccp->cblkw;
10804*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions
10805*3ac0a46fSAndroid Build Coastguard Worker = l_tccp->numresolutions;
10806*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty =
10807*3ac0a46fSAndroid Build Coastguard Worker l_tccp->cblksty;
10808*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid =
10809*3ac0a46fSAndroid Build Coastguard Worker l_tccp->qmfbid;
10810*3ac0a46fSAndroid Build Coastguard Worker
10811*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx, l_tccp->prcw,
10812*3ac0a46fSAndroid Build Coastguard Worker l_data_size);
10813*3ac0a46fSAndroid Build Coastguard Worker memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy, l_tccp->prch,
10814*3ac0a46fSAndroid Build Coastguard Worker l_data_size);
10815*3ac0a46fSAndroid Build Coastguard Worker }
10816*3ac0a46fSAndroid Build Coastguard Worker /* << INDEX */
10817*3ac0a46fSAndroid Build Coastguard Worker #endif
10818*3ac0a46fSAndroid Build Coastguard Worker
10819*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
10820*3ac0a46fSAndroid Build Coastguard Worker }
10821*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_copy_tile_component_parameters(opj_j2k_t * p_j2k)10822*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k)
10823*3ac0a46fSAndroid Build Coastguard Worker {
10824*3ac0a46fSAndroid Build Coastguard Worker /* loop */
10825*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
10826*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = NULL;
10827*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = NULL;
10828*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
10829*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_prc_size;
10830*3ac0a46fSAndroid Build Coastguard Worker
10831*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
10832*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
10833*3ac0a46fSAndroid Build Coastguard Worker
10834*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
10835*3ac0a46fSAndroid Build Coastguard Worker l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
10836*3ac0a46fSAndroid Build Coastguard Worker ?
10837*3ac0a46fSAndroid Build Coastguard Worker &l_cp->tcps[p_j2k->m_current_tile_number] :
10838*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
10839*3ac0a46fSAndroid Build Coastguard Worker
10840*3ac0a46fSAndroid Build Coastguard Worker l_ref_tccp = &l_tcp->tccps[0];
10841*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp = l_ref_tccp + 1;
10842*3ac0a46fSAndroid Build Coastguard Worker l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
10843*3ac0a46fSAndroid Build Coastguard Worker
10844*3ac0a46fSAndroid Build Coastguard Worker for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
10845*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
10846*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp->cblkw = l_ref_tccp->cblkw;
10847*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp->cblkh = l_ref_tccp->cblkh;
10848*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp->cblksty = l_ref_tccp->cblksty;
10849*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
10850*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_copied_tccp->prcw, l_ref_tccp->prcw, l_prc_size);
10851*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_copied_tccp->prch, l_ref_tccp->prch, l_prc_size);
10852*3ac0a46fSAndroid Build Coastguard Worker ++l_copied_tccp;
10853*3ac0a46fSAndroid Build Coastguard Worker }
10854*3ac0a46fSAndroid Build Coastguard Worker }
10855*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_SQcd_SQcc_size(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_no,OPJ_UINT32 p_comp_no)10856*3ac0a46fSAndroid Build Coastguard Worker static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size(opj_j2k_t *p_j2k,
10857*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
10858*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no)
10859*3ac0a46fSAndroid Build Coastguard Worker {
10860*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_num_bands;
10861*3ac0a46fSAndroid Build Coastguard Worker
10862*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
10863*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
10864*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = 00;
10865*3ac0a46fSAndroid Build Coastguard Worker
10866*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
10867*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
10868*3ac0a46fSAndroid Build Coastguard Worker
10869*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
10870*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_tile_no];
10871*3ac0a46fSAndroid Build Coastguard Worker l_tccp = &l_tcp->tccps[p_comp_no];
10872*3ac0a46fSAndroid Build Coastguard Worker
10873*3ac0a46fSAndroid Build Coastguard Worker /* preconditions again */
10874*3ac0a46fSAndroid Build Coastguard Worker assert(p_tile_no < l_cp->tw * l_cp->th);
10875*3ac0a46fSAndroid Build Coastguard Worker assert(p_comp_no < p_j2k->m_private_image->numcomps);
10876*3ac0a46fSAndroid Build Coastguard Worker
10877*3ac0a46fSAndroid Build Coastguard Worker l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
10878*3ac0a46fSAndroid Build Coastguard Worker (l_tccp->numresolutions * 3 - 2);
10879*3ac0a46fSAndroid Build Coastguard Worker
10880*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
10881*3ac0a46fSAndroid Build Coastguard Worker return 1 + l_num_bands;
10882*3ac0a46fSAndroid Build Coastguard Worker } else {
10883*3ac0a46fSAndroid Build Coastguard Worker return 1 + 2 * l_num_bands;
10884*3ac0a46fSAndroid Build Coastguard Worker }
10885*3ac0a46fSAndroid Build Coastguard Worker }
10886*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_compare_SQcd_SQcc(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_no,OPJ_UINT32 p_first_comp_no,OPJ_UINT32 p_second_comp_no)10887*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_compare_SQcd_SQcc(opj_j2k_t *p_j2k,
10888*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
10889*3ac0a46fSAndroid Build Coastguard Worker {
10890*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = NULL;
10891*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = NULL;
10892*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp0 = NULL;
10893*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp1 = NULL;
10894*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_band_no, l_num_bands;
10895*3ac0a46fSAndroid Build Coastguard Worker
10896*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
10897*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
10898*3ac0a46fSAndroid Build Coastguard Worker
10899*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
10900*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_tile_no];
10901*3ac0a46fSAndroid Build Coastguard Worker l_tccp0 = &l_tcp->tccps[p_first_comp_no];
10902*3ac0a46fSAndroid Build Coastguard Worker l_tccp1 = &l_tcp->tccps[p_second_comp_no];
10903*3ac0a46fSAndroid Build Coastguard Worker
10904*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->qntsty != l_tccp1->qntsty) {
10905*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10906*3ac0a46fSAndroid Build Coastguard Worker }
10907*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->numgbits != l_tccp1->numgbits) {
10908*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10909*3ac0a46fSAndroid Build Coastguard Worker }
10910*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->qntsty == J2K_CCP_QNTSTY_SIQNT) {
10911*3ac0a46fSAndroid Build Coastguard Worker l_num_bands = 1U;
10912*3ac0a46fSAndroid Build Coastguard Worker } else {
10913*3ac0a46fSAndroid Build Coastguard Worker l_num_bands = l_tccp0->numresolutions * 3U - 2U;
10914*3ac0a46fSAndroid Build Coastguard Worker if (l_num_bands != (l_tccp1->numresolutions * 3U - 2U)) {
10915*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10916*3ac0a46fSAndroid Build Coastguard Worker }
10917*3ac0a46fSAndroid Build Coastguard Worker }
10918*3ac0a46fSAndroid Build Coastguard Worker
10919*3ac0a46fSAndroid Build Coastguard Worker for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
10920*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->stepsizes[l_band_no].expn != l_tccp1->stepsizes[l_band_no].expn) {
10921*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10922*3ac0a46fSAndroid Build Coastguard Worker }
10923*3ac0a46fSAndroid Build Coastguard Worker }
10924*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->qntsty != J2K_CCP_QNTSTY_NOQNT) {
10925*3ac0a46fSAndroid Build Coastguard Worker for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
10926*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp0->stepsizes[l_band_no].mant != l_tccp1->stepsizes[l_band_no].mant) {
10927*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10928*3ac0a46fSAndroid Build Coastguard Worker }
10929*3ac0a46fSAndroid Build Coastguard Worker }
10930*3ac0a46fSAndroid Build Coastguard Worker }
10931*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
10932*3ac0a46fSAndroid Build Coastguard Worker }
10933*3ac0a46fSAndroid Build Coastguard Worker
10934*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_SQcd_SQcc(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_no,OPJ_UINT32 p_comp_no,OPJ_BYTE * p_data,OPJ_UINT32 * p_header_size,struct opj_event_mgr * p_manager)10935*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
10936*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_no,
10937*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
10938*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
10939*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_header_size,
10940*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
10941*3ac0a46fSAndroid Build Coastguard Worker {
10942*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_header_size;
10943*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_band_no, l_num_bands;
10944*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_expn, l_mant;
10945*3ac0a46fSAndroid Build Coastguard Worker
10946*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
10947*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
10948*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = 00;
10949*3ac0a46fSAndroid Build Coastguard Worker
10950*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
10951*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
10952*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_size != 00);
10953*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
10954*3ac0a46fSAndroid Build Coastguard Worker assert(p_data != 00);
10955*3ac0a46fSAndroid Build Coastguard Worker
10956*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
10957*3ac0a46fSAndroid Build Coastguard Worker l_tcp = &l_cp->tcps[p_tile_no];
10958*3ac0a46fSAndroid Build Coastguard Worker l_tccp = &l_tcp->tccps[p_comp_no];
10959*3ac0a46fSAndroid Build Coastguard Worker
10960*3ac0a46fSAndroid Build Coastguard Worker /* preconditions again */
10961*3ac0a46fSAndroid Build Coastguard Worker assert(p_tile_no < l_cp->tw * l_cp->th);
10962*3ac0a46fSAndroid Build Coastguard Worker assert(p_comp_no < p_j2k->m_private_image->numcomps);
10963*3ac0a46fSAndroid Build Coastguard Worker
10964*3ac0a46fSAndroid Build Coastguard Worker l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
10965*3ac0a46fSAndroid Build Coastguard Worker (l_tccp->numresolutions * 3 - 2);
10966*3ac0a46fSAndroid Build Coastguard Worker
10967*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
10968*3ac0a46fSAndroid Build Coastguard Worker l_header_size = 1 + l_num_bands;
10969*3ac0a46fSAndroid Build Coastguard Worker
10970*3ac0a46fSAndroid Build Coastguard Worker if (*p_header_size < l_header_size) {
10971*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
10972*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10973*3ac0a46fSAndroid Build Coastguard Worker }
10974*3ac0a46fSAndroid Build Coastguard Worker
10975*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
10976*3ac0a46fSAndroid Build Coastguard Worker 1); /* Sqcx */
10977*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10978*3ac0a46fSAndroid Build Coastguard Worker
10979*3ac0a46fSAndroid Build Coastguard Worker for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
10980*3ac0a46fSAndroid Build Coastguard Worker l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
10981*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_expn << 3, 1); /* SPqcx_i */
10982*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10983*3ac0a46fSAndroid Build Coastguard Worker }
10984*3ac0a46fSAndroid Build Coastguard Worker } else {
10985*3ac0a46fSAndroid Build Coastguard Worker l_header_size = 1 + 2 * l_num_bands;
10986*3ac0a46fSAndroid Build Coastguard Worker
10987*3ac0a46fSAndroid Build Coastguard Worker if (*p_header_size < l_header_size) {
10988*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
10989*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
10990*3ac0a46fSAndroid Build Coastguard Worker }
10991*3ac0a46fSAndroid Build Coastguard Worker
10992*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
10993*3ac0a46fSAndroid Build Coastguard Worker 1); /* Sqcx */
10994*3ac0a46fSAndroid Build Coastguard Worker ++p_data;
10995*3ac0a46fSAndroid Build Coastguard Worker
10996*3ac0a46fSAndroid Build Coastguard Worker for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
10997*3ac0a46fSAndroid Build Coastguard Worker l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
10998*3ac0a46fSAndroid Build Coastguard Worker l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
10999*3ac0a46fSAndroid Build Coastguard Worker
11000*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2); /* SPqcx_i */
11001*3ac0a46fSAndroid Build Coastguard Worker p_data += 2;
11002*3ac0a46fSAndroid Build Coastguard Worker }
11003*3ac0a46fSAndroid Build Coastguard Worker }
11004*3ac0a46fSAndroid Build Coastguard Worker
11005*3ac0a46fSAndroid Build Coastguard Worker *p_header_size = *p_header_size - l_header_size;
11006*3ac0a46fSAndroid Build Coastguard Worker
11007*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11008*3ac0a46fSAndroid Build Coastguard Worker }
11009*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_read_SQcd_SQcc(opj_j2k_t * p_j2k,OPJ_UINT32 p_comp_no,OPJ_BYTE * p_header_data,OPJ_UINT32 * p_header_size,opj_event_mgr_t * p_manager)11010*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
11011*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_comp_no,
11012*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE* p_header_data,
11013*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_header_size,
11014*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
11015*3ac0a46fSAndroid Build Coastguard Worker )
11016*3ac0a46fSAndroid Build Coastguard Worker {
11017*3ac0a46fSAndroid Build Coastguard Worker /* loop*/
11018*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_band_no;
11019*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = 00;
11020*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
11021*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = 00;
11022*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_ptr = 00;
11023*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tmp, l_num_band;
11024*3ac0a46fSAndroid Build Coastguard Worker
11025*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
11026*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
11027*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
11028*3ac0a46fSAndroid Build Coastguard Worker assert(p_header_data != 00);
11029*3ac0a46fSAndroid Build Coastguard Worker
11030*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
11031*3ac0a46fSAndroid Build Coastguard Worker /* come from tile part header or main header ?*/
11032*3ac0a46fSAndroid Build Coastguard Worker l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
11033*3ac0a46fSAndroid Build Coastguard Worker ?
11034*3ac0a46fSAndroid Build Coastguard Worker &l_cp->tcps[p_j2k->m_current_tile_number] :
11035*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
11036*3ac0a46fSAndroid Build Coastguard Worker
11037*3ac0a46fSAndroid Build Coastguard Worker /* precondition again*/
11038*3ac0a46fSAndroid Build Coastguard Worker if (p_comp_no >= p_j2k->m_private_image->numcomps) {
11039*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11040*3ac0a46fSAndroid Build Coastguard Worker }
11041*3ac0a46fSAndroid Build Coastguard Worker
11042*3ac0a46fSAndroid Build Coastguard Worker l_tccp = &l_tcp->tccps[p_comp_no];
11043*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr = p_header_data;
11044*3ac0a46fSAndroid Build Coastguard Worker
11045*3ac0a46fSAndroid Build Coastguard Worker if (*p_header_size < 1) {
11046*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
11047*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11048*3ac0a46fSAndroid Build Coastguard Worker }
11049*3ac0a46fSAndroid Build Coastguard Worker *p_header_size -= 1;
11050*3ac0a46fSAndroid Build Coastguard Worker
11051*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tmp, 1); /* Sqcx */
11052*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
11053*3ac0a46fSAndroid Build Coastguard Worker
11054*3ac0a46fSAndroid Build Coastguard Worker l_tccp->qntsty = l_tmp & 0x1f;
11055*3ac0a46fSAndroid Build Coastguard Worker l_tccp->numgbits = l_tmp >> 5;
11056*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11057*3ac0a46fSAndroid Build Coastguard Worker l_num_band = 1;
11058*3ac0a46fSAndroid Build Coastguard Worker } else {
11059*3ac0a46fSAndroid Build Coastguard Worker l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
11060*3ac0a46fSAndroid Build Coastguard Worker (*p_header_size) :
11061*3ac0a46fSAndroid Build Coastguard Worker (*p_header_size) / 2;
11062*3ac0a46fSAndroid Build Coastguard Worker
11063*3ac0a46fSAndroid Build Coastguard Worker if (l_num_band > OPJ_J2K_MAXBANDS) {
11064*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
11065*3ac0a46fSAndroid Build Coastguard Worker "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
11066*3ac0a46fSAndroid Build Coastguard Worker "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
11067*3ac0a46fSAndroid Build Coastguard Worker "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS,
11068*3ac0a46fSAndroid Build Coastguard Worker OPJ_J2K_MAXBANDS);
11069*3ac0a46fSAndroid Build Coastguard Worker /*return OPJ_FALSE;*/
11070*3ac0a46fSAndroid Build Coastguard Worker }
11071*3ac0a46fSAndroid Build Coastguard Worker }
11072*3ac0a46fSAndroid Build Coastguard Worker
11073*3ac0a46fSAndroid Build Coastguard Worker #ifdef USE_JPWL
11074*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->correct) {
11075*3ac0a46fSAndroid Build Coastguard Worker
11076*3ac0a46fSAndroid Build Coastguard Worker /* if JPWL is on, we check whether there are too many subbands */
11077*3ac0a46fSAndroid Build Coastguard Worker if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
11078*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
11079*3ac0a46fSAndroid Build Coastguard Worker "JPWL: bad number of subbands in Sqcx (%d)\n",
11080*3ac0a46fSAndroid Build Coastguard Worker l_num_band);
11081*3ac0a46fSAndroid Build Coastguard Worker if (!JPWL_ASSUME) {
11082*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
11083*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11084*3ac0a46fSAndroid Build Coastguard Worker }
11085*3ac0a46fSAndroid Build Coastguard Worker /* we try to correct */
11086*3ac0a46fSAndroid Build Coastguard Worker l_num_band = 1;
11087*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
11088*3ac0a46fSAndroid Build Coastguard Worker "- setting number of bands to %d => HYPOTHESIS!!!\n",
11089*3ac0a46fSAndroid Build Coastguard Worker l_num_band);
11090*3ac0a46fSAndroid Build Coastguard Worker };
11091*3ac0a46fSAndroid Build Coastguard Worker
11092*3ac0a46fSAndroid Build Coastguard Worker };
11093*3ac0a46fSAndroid Build Coastguard Worker #endif /* USE_JPWL */
11094*3ac0a46fSAndroid Build Coastguard Worker
11095*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
11096*3ac0a46fSAndroid Build Coastguard Worker for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
11097*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tmp, 1); /* SPqcx_i */
11098*3ac0a46fSAndroid Build Coastguard Worker ++l_current_ptr;
11099*3ac0a46fSAndroid Build Coastguard Worker if (l_band_no < OPJ_J2K_MAXBANDS) {
11100*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
11101*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[l_band_no].mant = 0;
11102*3ac0a46fSAndroid Build Coastguard Worker }
11103*3ac0a46fSAndroid Build Coastguard Worker }
11104*3ac0a46fSAndroid Build Coastguard Worker *p_header_size = *p_header_size - l_num_band;
11105*3ac0a46fSAndroid Build Coastguard Worker } else {
11106*3ac0a46fSAndroid Build Coastguard Worker for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
11107*3ac0a46fSAndroid Build Coastguard Worker opj_read_bytes(l_current_ptr, &l_tmp, 2); /* SPqcx_i */
11108*3ac0a46fSAndroid Build Coastguard Worker l_current_ptr += 2;
11109*3ac0a46fSAndroid Build Coastguard Worker if (l_band_no < OPJ_J2K_MAXBANDS) {
11110*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
11111*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
11112*3ac0a46fSAndroid Build Coastguard Worker }
11113*3ac0a46fSAndroid Build Coastguard Worker }
11114*3ac0a46fSAndroid Build Coastguard Worker *p_header_size = *p_header_size - 2 * l_num_band;
11115*3ac0a46fSAndroid Build Coastguard Worker }
11116*3ac0a46fSAndroid Build Coastguard Worker
11117*3ac0a46fSAndroid Build Coastguard Worker /* Add Antonin : if scalar_derived -> compute other stepsizes */
11118*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
11119*3ac0a46fSAndroid Build Coastguard Worker for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
11120*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[l_band_no].expn =
11121*3ac0a46fSAndroid Build Coastguard Worker ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0)
11122*3ac0a46fSAndroid Build Coastguard Worker ?
11123*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
11124*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
11125*3ac0a46fSAndroid Build Coastguard Worker }
11126*3ac0a46fSAndroid Build Coastguard Worker }
11127*3ac0a46fSAndroid Build Coastguard Worker
11128*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11129*3ac0a46fSAndroid Build Coastguard Worker }
11130*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_copy_tile_quantization_parameters(opj_j2k_t * p_j2k)11131*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k)
11132*3ac0a46fSAndroid Build Coastguard Worker {
11133*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
11134*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *l_cp = NULL;
11135*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = NULL;
11136*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_ref_tccp = NULL;
11137*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_copied_tccp = NULL;
11138*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_size;
11139*3ac0a46fSAndroid Build Coastguard Worker
11140*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
11141*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
11142*3ac0a46fSAndroid Build Coastguard Worker
11143*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
11144*3ac0a46fSAndroid Build Coastguard Worker l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
11145*3ac0a46fSAndroid Build Coastguard Worker &l_cp->tcps[p_j2k->m_current_tile_number] :
11146*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp;
11147*3ac0a46fSAndroid Build Coastguard Worker
11148*3ac0a46fSAndroid Build Coastguard Worker l_ref_tccp = &l_tcp->tccps[0];
11149*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp = l_ref_tccp + 1;
11150*3ac0a46fSAndroid Build Coastguard Worker l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
11151*3ac0a46fSAndroid Build Coastguard Worker
11152*3ac0a46fSAndroid Build Coastguard Worker for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
11153*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp->qntsty = l_ref_tccp->qntsty;
11154*3ac0a46fSAndroid Build Coastguard Worker l_copied_tccp->numgbits = l_ref_tccp->numgbits;
11155*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_copied_tccp->stepsizes, l_ref_tccp->stepsizes, l_size);
11156*3ac0a46fSAndroid Build Coastguard Worker ++l_copied_tccp;
11157*3ac0a46fSAndroid Build Coastguard Worker }
11158*3ac0a46fSAndroid Build Coastguard Worker }
11159*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_dump_tile_info(opj_tcp_t * l_default_tile,OPJ_INT32 numcomps,FILE * out_stream)11160*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_dump_tile_info(opj_tcp_t * l_default_tile,
11161*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 numcomps, FILE* out_stream)
11162*3ac0a46fSAndroid Build Coastguard Worker {
11163*3ac0a46fSAndroid Build Coastguard Worker if (l_default_tile) {
11164*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 compno;
11165*3ac0a46fSAndroid Build Coastguard Worker
11166*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t default tile {\n");
11167*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
11168*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
11169*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
11170*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
11171*3ac0a46fSAndroid Build Coastguard Worker
11172*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < numcomps; compno++) {
11173*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
11174*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 resno;
11175*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bandno, numbands;
11176*3ac0a46fSAndroid Build Coastguard Worker
11177*3ac0a46fSAndroid Build Coastguard Worker /* coding style*/
11178*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t comp %d {\n", compno);
11179*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
11180*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
11181*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
11182*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
11183*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
11184*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
11185*3ac0a46fSAndroid Build Coastguard Worker
11186*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
11187*3ac0a46fSAndroid Build Coastguard Worker for (resno = 0; resno < l_tccp->numresolutions; resno++) {
11188*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
11189*3ac0a46fSAndroid Build Coastguard Worker }
11190*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\n");
11191*3ac0a46fSAndroid Build Coastguard Worker
11192*3ac0a46fSAndroid Build Coastguard Worker /* quantization style*/
11193*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
11194*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
11195*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
11196*3ac0a46fSAndroid Build Coastguard Worker numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11197*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
11198*3ac0a46fSAndroid Build Coastguard Worker for (bandno = 0; bandno < numbands; bandno++) {
11199*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
11200*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[bandno].expn);
11201*3ac0a46fSAndroid Build Coastguard Worker }
11202*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\n");
11203*3ac0a46fSAndroid Build Coastguard Worker
11204*3ac0a46fSAndroid Build Coastguard Worker /* RGN value*/
11205*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
11206*3ac0a46fSAndroid Build Coastguard Worker
11207*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t }\n");
11208*3ac0a46fSAndroid Build Coastguard Worker } /*end of component of default tile*/
11209*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t }\n"); /*end of default tile*/
11210*3ac0a46fSAndroid Build Coastguard Worker }
11211*3ac0a46fSAndroid Build Coastguard Worker }
11212*3ac0a46fSAndroid Build Coastguard Worker
j2k_dump(void * j2k,OPJ_INT32 flag,FILE * out_stream)11213*3ac0a46fSAndroid Build Coastguard Worker void j2k_dump(void* j2k, OPJ_INT32 flag, FILE* out_stream)
11214*3ac0a46fSAndroid Build Coastguard Worker {
11215*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
11216*3ac0a46fSAndroid Build Coastguard Worker /* Check if the flag is compatible with j2k file*/
11217*3ac0a46fSAndroid Build Coastguard Worker if ((flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)) {
11218*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "Wrong flag\n");
11219*3ac0a46fSAndroid Build Coastguard Worker return;
11220*3ac0a46fSAndroid Build Coastguard Worker }
11221*3ac0a46fSAndroid Build Coastguard Worker
11222*3ac0a46fSAndroid Build Coastguard Worker /* Dump the image_header */
11223*3ac0a46fSAndroid Build Coastguard Worker if (flag & OPJ_IMG_INFO) {
11224*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_private_image) {
11225*3ac0a46fSAndroid Build Coastguard Worker j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
11226*3ac0a46fSAndroid Build Coastguard Worker }
11227*3ac0a46fSAndroid Build Coastguard Worker }
11228*3ac0a46fSAndroid Build Coastguard Worker
11229*3ac0a46fSAndroid Build Coastguard Worker /* Dump the codestream info from main header */
11230*3ac0a46fSAndroid Build Coastguard Worker if (flag & OPJ_J2K_MH_INFO) {
11231*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_private_image) {
11232*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_dump_MH_info(p_j2k, out_stream);
11233*3ac0a46fSAndroid Build Coastguard Worker }
11234*3ac0a46fSAndroid Build Coastguard Worker }
11235*3ac0a46fSAndroid Build Coastguard Worker /* Dump all tile/codestream info */
11236*3ac0a46fSAndroid Build Coastguard Worker if (flag & OPJ_J2K_TCH_INFO) {
11237*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
11238*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
11239*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
11240*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_private_image) {
11241*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
11242*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_dump_tile_info(l_tcp, (OPJ_INT32)p_j2k->m_private_image->numcomps,
11243*3ac0a46fSAndroid Build Coastguard Worker out_stream);
11244*3ac0a46fSAndroid Build Coastguard Worker ++l_tcp;
11245*3ac0a46fSAndroid Build Coastguard Worker }
11246*3ac0a46fSAndroid Build Coastguard Worker }
11247*3ac0a46fSAndroid Build Coastguard Worker }
11248*3ac0a46fSAndroid Build Coastguard Worker
11249*3ac0a46fSAndroid Build Coastguard Worker /* Dump the codestream info of the current tile */
11250*3ac0a46fSAndroid Build Coastguard Worker if (flag & OPJ_J2K_TH_INFO) {
11251*3ac0a46fSAndroid Build Coastguard Worker
11252*3ac0a46fSAndroid Build Coastguard Worker }
11253*3ac0a46fSAndroid Build Coastguard Worker
11254*3ac0a46fSAndroid Build Coastguard Worker /* Dump the codestream index from main header */
11255*3ac0a46fSAndroid Build Coastguard Worker if (flag & OPJ_J2K_MH_IND) {
11256*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_dump_MH_index(p_j2k, out_stream);
11257*3ac0a46fSAndroid Build Coastguard Worker }
11258*3ac0a46fSAndroid Build Coastguard Worker
11259*3ac0a46fSAndroid Build Coastguard Worker /* Dump the codestream index of the current tile */
11260*3ac0a46fSAndroid Build Coastguard Worker if (flag & OPJ_J2K_TH_IND) {
11261*3ac0a46fSAndroid Build Coastguard Worker
11262*3ac0a46fSAndroid Build Coastguard Worker }
11263*3ac0a46fSAndroid Build Coastguard Worker
11264*3ac0a46fSAndroid Build Coastguard Worker }
11265*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_dump_MH_index(opj_j2k_t * p_j2k,FILE * out_stream)11266*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)
11267*3ac0a46fSAndroid Build Coastguard Worker {
11268*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
11269*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_marker, it_tile, it_tile_part;
11270*3ac0a46fSAndroid Build Coastguard Worker
11271*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "Codestream index from main header: {\n");
11272*3ac0a46fSAndroid Build Coastguard Worker
11273*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
11274*3ac0a46fSAndroid Build Coastguard Worker "\t Main header end position=%" PRIi64 "\n",
11275*3ac0a46fSAndroid Build Coastguard Worker cstr_index->main_head_start, cstr_index->main_head_end);
11276*3ac0a46fSAndroid Build Coastguard Worker
11277*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t Marker list: {\n");
11278*3ac0a46fSAndroid Build Coastguard Worker
11279*3ac0a46fSAndroid Build Coastguard Worker if (cstr_index->marker) {
11280*3ac0a46fSAndroid Build Coastguard Worker for (it_marker = 0; it_marker < cstr_index->marknum ; it_marker++) {
11281*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
11282*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker[it_marker].type,
11283*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker[it_marker].pos,
11284*3ac0a46fSAndroid Build Coastguard Worker cstr_index->marker[it_marker].len);
11285*3ac0a46fSAndroid Build Coastguard Worker }
11286*3ac0a46fSAndroid Build Coastguard Worker }
11287*3ac0a46fSAndroid Build Coastguard Worker
11288*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t }\n");
11289*3ac0a46fSAndroid Build Coastguard Worker
11290*3ac0a46fSAndroid Build Coastguard Worker if (cstr_index->tile_index) {
11291*3ac0a46fSAndroid Build Coastguard Worker
11292*3ac0a46fSAndroid Build Coastguard Worker /* Simple test to avoid to write empty information*/
11293*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_acc_nb_of_tile_part = 0;
11294*3ac0a46fSAndroid Build Coastguard Worker for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
11295*3ac0a46fSAndroid Build Coastguard Worker l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
11296*3ac0a46fSAndroid Build Coastguard Worker }
11297*3ac0a46fSAndroid Build Coastguard Worker
11298*3ac0a46fSAndroid Build Coastguard Worker if (l_acc_nb_of_tile_part) {
11299*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t Tile index: {\n");
11300*3ac0a46fSAndroid Build Coastguard Worker
11301*3ac0a46fSAndroid Build Coastguard Worker for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
11302*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
11303*3ac0a46fSAndroid Build Coastguard Worker
11304*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile,
11305*3ac0a46fSAndroid Build Coastguard Worker nb_of_tile_part);
11306*3ac0a46fSAndroid Build Coastguard Worker
11307*3ac0a46fSAndroid Build Coastguard Worker if (cstr_index->tile_index[it_tile].tp_index) {
11308*3ac0a46fSAndroid Build Coastguard Worker for (it_tile_part = 0; it_tile_part < nb_of_tile_part; it_tile_part++) {
11309*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%"
11310*3ac0a46fSAndroid Build Coastguard Worker PRIi64 ", end_pos=%" PRIi64 ".\n",
11311*3ac0a46fSAndroid Build Coastguard Worker it_tile_part,
11312*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
11313*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
11314*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
11315*3ac0a46fSAndroid Build Coastguard Worker }
11316*3ac0a46fSAndroid Build Coastguard Worker }
11317*3ac0a46fSAndroid Build Coastguard Worker
11318*3ac0a46fSAndroid Build Coastguard Worker if (cstr_index->tile_index[it_tile].marker) {
11319*3ac0a46fSAndroid Build Coastguard Worker for (it_marker = 0; it_marker < cstr_index->tile_index[it_tile].marknum ;
11320*3ac0a46fSAndroid Build Coastguard Worker it_marker++) {
11321*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
11322*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[it_tile].marker[it_marker].type,
11323*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[it_tile].marker[it_marker].pos,
11324*3ac0a46fSAndroid Build Coastguard Worker cstr_index->tile_index[it_tile].marker[it_marker].len);
11325*3ac0a46fSAndroid Build Coastguard Worker }
11326*3ac0a46fSAndroid Build Coastguard Worker }
11327*3ac0a46fSAndroid Build Coastguard Worker }
11328*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t }\n");
11329*3ac0a46fSAndroid Build Coastguard Worker }
11330*3ac0a46fSAndroid Build Coastguard Worker }
11331*3ac0a46fSAndroid Build Coastguard Worker
11332*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "}\n");
11333*3ac0a46fSAndroid Build Coastguard Worker
11334*3ac0a46fSAndroid Build Coastguard Worker }
11335*3ac0a46fSAndroid Build Coastguard Worker
11336*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_dump_MH_info(opj_j2k_t * p_j2k,FILE * out_stream)11337*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)
11338*3ac0a46fSAndroid Build Coastguard Worker {
11339*3ac0a46fSAndroid Build Coastguard Worker
11340*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "Codestream info from main header: {\n");
11341*3ac0a46fSAndroid Build Coastguard Worker
11342*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t tx0=%d, ty0=%d\n", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0);
11343*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t tdx=%d, tdy=%d\n", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy);
11344*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "\t tw=%d, th=%d\n", p_j2k->m_cp.tw, p_j2k->m_cp.th);
11345*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,
11346*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
11347*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "}\n");
11348*3ac0a46fSAndroid Build Coastguard Worker }
11349*3ac0a46fSAndroid Build Coastguard Worker
j2k_dump_image_header(opj_image_t * img_header,OPJ_BOOL dev_dump_flag,FILE * out_stream)11350*3ac0a46fSAndroid Build Coastguard Worker void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag,
11351*3ac0a46fSAndroid Build Coastguard Worker FILE* out_stream)
11352*3ac0a46fSAndroid Build Coastguard Worker {
11353*3ac0a46fSAndroid Build Coastguard Worker char tab[2];
11354*3ac0a46fSAndroid Build Coastguard Worker
11355*3ac0a46fSAndroid Build Coastguard Worker if (dev_dump_flag) {
11356*3ac0a46fSAndroid Build Coastguard Worker fprintf(stdout, "[DEV] Dump an image_header struct {\n");
11357*3ac0a46fSAndroid Build Coastguard Worker tab[0] = '\0';
11358*3ac0a46fSAndroid Build Coastguard Worker } else {
11359*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "Image info {\n");
11360*3ac0a46fSAndroid Build Coastguard Worker tab[0] = '\t';
11361*3ac0a46fSAndroid Build Coastguard Worker tab[1] = '\0';
11362*3ac0a46fSAndroid Build Coastguard Worker }
11363*3ac0a46fSAndroid Build Coastguard Worker
11364*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
11365*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "%s x1=%d, y1=%d\n", tab, img_header->x1,
11366*3ac0a46fSAndroid Build Coastguard Worker img_header->y1);
11367*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
11368*3ac0a46fSAndroid Build Coastguard Worker
11369*3ac0a46fSAndroid Build Coastguard Worker if (img_header->comps) {
11370*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
11371*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < img_header->numcomps; compno++) {
11372*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "%s\t component %d {\n", tab, compno);
11373*3ac0a46fSAndroid Build Coastguard Worker j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag,
11374*3ac0a46fSAndroid Build Coastguard Worker out_stream);
11375*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "%s}\n", tab);
11376*3ac0a46fSAndroid Build Coastguard Worker }
11377*3ac0a46fSAndroid Build Coastguard Worker }
11378*3ac0a46fSAndroid Build Coastguard Worker
11379*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "}\n");
11380*3ac0a46fSAndroid Build Coastguard Worker }
11381*3ac0a46fSAndroid Build Coastguard Worker
j2k_dump_image_comp_header(opj_image_comp_t * comp_header,OPJ_BOOL dev_dump_flag,FILE * out_stream)11382*3ac0a46fSAndroid Build Coastguard Worker void j2k_dump_image_comp_header(opj_image_comp_t* comp_header,
11383*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL dev_dump_flag, FILE* out_stream)
11384*3ac0a46fSAndroid Build Coastguard Worker {
11385*3ac0a46fSAndroid Build Coastguard Worker char tab[3];
11386*3ac0a46fSAndroid Build Coastguard Worker
11387*3ac0a46fSAndroid Build Coastguard Worker if (dev_dump_flag) {
11388*3ac0a46fSAndroid Build Coastguard Worker fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
11389*3ac0a46fSAndroid Build Coastguard Worker tab[0] = '\0';
11390*3ac0a46fSAndroid Build Coastguard Worker } else {
11391*3ac0a46fSAndroid Build Coastguard Worker tab[0] = '\t';
11392*3ac0a46fSAndroid Build Coastguard Worker tab[1] = '\t';
11393*3ac0a46fSAndroid Build Coastguard Worker tab[2] = '\0';
11394*3ac0a46fSAndroid Build Coastguard Worker }
11395*3ac0a46fSAndroid Build Coastguard Worker
11396*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
11397*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
11398*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
11399*3ac0a46fSAndroid Build Coastguard Worker
11400*3ac0a46fSAndroid Build Coastguard Worker if (dev_dump_flag) {
11401*3ac0a46fSAndroid Build Coastguard Worker fprintf(out_stream, "}\n");
11402*3ac0a46fSAndroid Build Coastguard Worker }
11403*3ac0a46fSAndroid Build Coastguard Worker }
11404*3ac0a46fSAndroid Build Coastguard Worker
j2k_get_cstr_info(void * j2k)11405*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_info_v2_t* j2k_get_cstr_info(void* j2k)
11406*3ac0a46fSAndroid Build Coastguard Worker {
11407*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
11408*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
11409*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
11410*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_default_tile;
11411*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,
11412*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_codestream_info_v2_t));
11413*3ac0a46fSAndroid Build Coastguard Worker if (!cstr_info) {
11414*3ac0a46fSAndroid Build Coastguard Worker return NULL;
11415*3ac0a46fSAndroid Build Coastguard Worker }
11416*3ac0a46fSAndroid Build Coastguard Worker
11417*3ac0a46fSAndroid Build Coastguard Worker cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
11418*3ac0a46fSAndroid Build Coastguard Worker
11419*3ac0a46fSAndroid Build Coastguard Worker cstr_info->tx0 = p_j2k->m_cp.tx0;
11420*3ac0a46fSAndroid Build Coastguard Worker cstr_info->ty0 = p_j2k->m_cp.ty0;
11421*3ac0a46fSAndroid Build Coastguard Worker cstr_info->tdx = p_j2k->m_cp.tdx;
11422*3ac0a46fSAndroid Build Coastguard Worker cstr_info->tdy = p_j2k->m_cp.tdy;
11423*3ac0a46fSAndroid Build Coastguard Worker cstr_info->tw = p_j2k->m_cp.tw;
11424*3ac0a46fSAndroid Build Coastguard Worker cstr_info->th = p_j2k->m_cp.th;
11425*3ac0a46fSAndroid Build Coastguard Worker
11426*3ac0a46fSAndroid Build Coastguard Worker cstr_info->tile_info = NULL; /* Not fill from the main header*/
11427*3ac0a46fSAndroid Build Coastguard Worker
11428*3ac0a46fSAndroid Build Coastguard Worker l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
11429*3ac0a46fSAndroid Build Coastguard Worker
11430*3ac0a46fSAndroid Build Coastguard Worker cstr_info->m_default_tile_info.csty = l_default_tile->csty;
11431*3ac0a46fSAndroid Build Coastguard Worker cstr_info->m_default_tile_info.prg = l_default_tile->prg;
11432*3ac0a46fSAndroid Build Coastguard Worker cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
11433*3ac0a46fSAndroid Build Coastguard Worker cstr_info->m_default_tile_info.mct = l_default_tile->mct;
11434*3ac0a46fSAndroid Build Coastguard Worker
11435*3ac0a46fSAndroid Build Coastguard Worker cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(
11436*3ac0a46fSAndroid Build Coastguard Worker cstr_info->nbcomps, sizeof(opj_tccp_info_t));
11437*3ac0a46fSAndroid Build Coastguard Worker if (!cstr_info->m_default_tile_info.tccp_info) {
11438*3ac0a46fSAndroid Build Coastguard Worker opj_destroy_cstr_info(&cstr_info);
11439*3ac0a46fSAndroid Build Coastguard Worker return NULL;
11440*3ac0a46fSAndroid Build Coastguard Worker }
11441*3ac0a46fSAndroid Build Coastguard Worker
11442*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < numcomps; compno++) {
11443*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
11444*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_info_t *l_tccp_info = &
11445*3ac0a46fSAndroid Build Coastguard Worker (cstr_info->m_default_tile_info.tccp_info[compno]);
11446*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bandno, numbands;
11447*3ac0a46fSAndroid Build Coastguard Worker
11448*3ac0a46fSAndroid Build Coastguard Worker /* coding style*/
11449*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->csty = l_tccp->csty;
11450*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->numresolutions = l_tccp->numresolutions;
11451*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->cblkw = l_tccp->cblkw;
11452*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->cblkh = l_tccp->cblkh;
11453*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->cblksty = l_tccp->cblksty;
11454*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->qmfbid = l_tccp->qmfbid;
11455*3ac0a46fSAndroid Build Coastguard Worker if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS) {
11456*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
11457*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
11458*3ac0a46fSAndroid Build Coastguard Worker }
11459*3ac0a46fSAndroid Build Coastguard Worker
11460*3ac0a46fSAndroid Build Coastguard Worker /* quantization style*/
11461*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->qntsty = l_tccp->qntsty;
11462*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->numgbits = l_tccp->numgbits;
11463*3ac0a46fSAndroid Build Coastguard Worker
11464*3ac0a46fSAndroid Build Coastguard Worker numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
11465*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
11466*3ac0a46fSAndroid Build Coastguard Worker if (numbands < OPJ_J2K_MAXBANDS) {
11467*3ac0a46fSAndroid Build Coastguard Worker for (bandno = 0; bandno < numbands; bandno++) {
11468*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)
11469*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[bandno].mant;
11470*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)
11471*3ac0a46fSAndroid Build Coastguard Worker l_tccp->stepsizes[bandno].expn;
11472*3ac0a46fSAndroid Build Coastguard Worker }
11473*3ac0a46fSAndroid Build Coastguard Worker }
11474*3ac0a46fSAndroid Build Coastguard Worker
11475*3ac0a46fSAndroid Build Coastguard Worker /* RGN value*/
11476*3ac0a46fSAndroid Build Coastguard Worker l_tccp_info->roishift = l_tccp->roishift;
11477*3ac0a46fSAndroid Build Coastguard Worker }
11478*3ac0a46fSAndroid Build Coastguard Worker
11479*3ac0a46fSAndroid Build Coastguard Worker return cstr_info;
11480*3ac0a46fSAndroid Build Coastguard Worker }
11481*3ac0a46fSAndroid Build Coastguard Worker
j2k_get_cstr_index(void * j2k)11482*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_index_t* j2k_get_cstr_index(void* j2k)
11483*3ac0a46fSAndroid Build Coastguard Worker {
11484*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
11485*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
11486*3ac0a46fSAndroid Build Coastguard Worker opj_calloc(1, sizeof(opj_codestream_index_t));
11487*3ac0a46fSAndroid Build Coastguard Worker if (!l_cstr_index) {
11488*3ac0a46fSAndroid Build Coastguard Worker return NULL;
11489*3ac0a46fSAndroid Build Coastguard Worker }
11490*3ac0a46fSAndroid Build Coastguard Worker
11491*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
11492*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
11493*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
11494*3ac0a46fSAndroid Build Coastguard Worker
11495*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->marknum = p_j2k->cstr_index->marknum;
11496*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum *
11497*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_marker_info_t));
11498*3ac0a46fSAndroid Build Coastguard Worker if (!l_cstr_index->marker) {
11499*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index);
11500*3ac0a46fSAndroid Build Coastguard Worker return NULL;
11501*3ac0a46fSAndroid Build Coastguard Worker }
11502*3ac0a46fSAndroid Build Coastguard Worker
11503*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_index->marker) {
11504*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker,
11505*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->marknum * sizeof(opj_marker_info_t));
11506*3ac0a46fSAndroid Build Coastguard Worker } else {
11507*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->marker);
11508*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->marker = NULL;
11509*3ac0a46fSAndroid Build Coastguard Worker }
11510*3ac0a46fSAndroid Build Coastguard Worker
11511*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
11512*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
11513*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
11514*3ac0a46fSAndroid Build Coastguard Worker if (!l_cstr_index->tile_index) {
11515*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->marker);
11516*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index);
11517*3ac0a46fSAndroid Build Coastguard Worker return NULL;
11518*3ac0a46fSAndroid Build Coastguard Worker }
11519*3ac0a46fSAndroid Build Coastguard Worker
11520*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_index->tile_index) {
11521*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->tile_index);
11522*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index = NULL;
11523*3ac0a46fSAndroid Build Coastguard Worker } else {
11524*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_tile = 0;
11525*3ac0a46fSAndroid Build Coastguard Worker for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++) {
11526*3ac0a46fSAndroid Build Coastguard Worker
11527*3ac0a46fSAndroid Build Coastguard Worker /* Tile Marker*/
11528*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].marknum =
11529*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[it_tile].marknum;
11530*3ac0a46fSAndroid Build Coastguard Worker
11531*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].marker =
11532*3ac0a46fSAndroid Build Coastguard Worker (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum *
11533*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_marker_info_t));
11534*3ac0a46fSAndroid Build Coastguard Worker
11535*3ac0a46fSAndroid Build Coastguard Worker if (!l_cstr_index->tile_index[it_tile].marker) {
11536*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_tile_free;
11537*3ac0a46fSAndroid Build Coastguard Worker
11538*3ac0a46fSAndroid Build Coastguard Worker for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
11539*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->tile_index[it_tile_free].marker);
11540*3ac0a46fSAndroid Build Coastguard Worker }
11541*3ac0a46fSAndroid Build Coastguard Worker
11542*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->tile_index);
11543*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->marker);
11544*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index);
11545*3ac0a46fSAndroid Build Coastguard Worker return NULL;
11546*3ac0a46fSAndroid Build Coastguard Worker }
11547*3ac0a46fSAndroid Build Coastguard Worker
11548*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_index->tile_index[it_tile].marker)
11549*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_cstr_index->tile_index[it_tile].marker,
11550*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[it_tile].marker,
11551*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t));
11552*3ac0a46fSAndroid Build Coastguard Worker else {
11553*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->tile_index[it_tile].marker);
11554*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].marker = NULL;
11555*3ac0a46fSAndroid Build Coastguard Worker }
11556*3ac0a46fSAndroid Build Coastguard Worker
11557*3ac0a46fSAndroid Build Coastguard Worker /* Tile part index*/
11558*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].nb_tps =
11559*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[it_tile].nb_tps;
11560*3ac0a46fSAndroid Build Coastguard Worker
11561*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].tp_index =
11562*3ac0a46fSAndroid Build Coastguard Worker (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps * sizeof(
11563*3ac0a46fSAndroid Build Coastguard Worker opj_tp_index_t));
11564*3ac0a46fSAndroid Build Coastguard Worker
11565*3ac0a46fSAndroid Build Coastguard Worker if (!l_cstr_index->tile_index[it_tile].tp_index) {
11566*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_tile_free;
11567*3ac0a46fSAndroid Build Coastguard Worker
11568*3ac0a46fSAndroid Build Coastguard Worker for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
11569*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->tile_index[it_tile_free].marker);
11570*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
11571*3ac0a46fSAndroid Build Coastguard Worker }
11572*3ac0a46fSAndroid Build Coastguard Worker
11573*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->tile_index);
11574*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->marker);
11575*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index);
11576*3ac0a46fSAndroid Build Coastguard Worker return NULL;
11577*3ac0a46fSAndroid Build Coastguard Worker }
11578*3ac0a46fSAndroid Build Coastguard Worker
11579*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_index->tile_index[it_tile].tp_index) {
11580*3ac0a46fSAndroid Build Coastguard Worker memcpy(l_cstr_index->tile_index[it_tile].tp_index,
11581*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[it_tile].tp_index,
11582*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t));
11583*3ac0a46fSAndroid Build Coastguard Worker } else {
11584*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_cstr_index->tile_index[it_tile].tp_index);
11585*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].tp_index = NULL;
11586*3ac0a46fSAndroid Build Coastguard Worker }
11587*3ac0a46fSAndroid Build Coastguard Worker
11588*3ac0a46fSAndroid Build Coastguard Worker /* Packet index (NOT USED)*/
11589*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].nb_packet = 0;
11590*3ac0a46fSAndroid Build Coastguard Worker l_cstr_index->tile_index[it_tile].packet_index = NULL;
11591*3ac0a46fSAndroid Build Coastguard Worker
11592*3ac0a46fSAndroid Build Coastguard Worker }
11593*3ac0a46fSAndroid Build Coastguard Worker }
11594*3ac0a46fSAndroid Build Coastguard Worker
11595*3ac0a46fSAndroid Build Coastguard Worker return l_cstr_index;
11596*3ac0a46fSAndroid Build Coastguard Worker }
11597*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t * p_j2k)11598*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
11599*3ac0a46fSAndroid Build Coastguard Worker {
11600*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_tile = 0;
11601*3ac0a46fSAndroid Build Coastguard Worker
11602*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
11603*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
11604*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
11605*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_index->tile_index) {
11606*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11607*3ac0a46fSAndroid Build Coastguard Worker }
11608*3ac0a46fSAndroid Build Coastguard Worker
11609*3ac0a46fSAndroid Build Coastguard Worker for (it_tile = 0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++) {
11610*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
11611*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
11612*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
11613*3ac0a46fSAndroid Build Coastguard Worker opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum,
11614*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_marker_info_t));
11615*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_index->tile_index[it_tile].marker) {
11616*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11617*3ac0a46fSAndroid Build Coastguard Worker }
11618*3ac0a46fSAndroid Build Coastguard Worker }
11619*3ac0a46fSAndroid Build Coastguard Worker
11620*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11621*3ac0a46fSAndroid Build Coastguard Worker }
11622*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_are_all_used_components_decoded(opj_j2k_t * p_j2k,opj_event_mgr_t * p_manager)11623*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_are_all_used_components_decoded(opj_j2k_t *p_j2k,
11624*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
11625*3ac0a46fSAndroid Build Coastguard Worker {
11626*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
11627*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL decoded_all_used_components = OPJ_TRUE;
11628*3ac0a46fSAndroid Build Coastguard Worker
11629*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode) {
11630*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0;
11631*3ac0a46fSAndroid Build Coastguard Worker compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
11632*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 dec_compno =
11633*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
11634*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_output_image->comps[dec_compno].data == NULL) {
11635*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
11636*3ac0a46fSAndroid Build Coastguard Worker dec_compno);
11637*3ac0a46fSAndroid Build Coastguard Worker decoded_all_used_components = OPJ_FALSE;
11638*3ac0a46fSAndroid Build Coastguard Worker }
11639*3ac0a46fSAndroid Build Coastguard Worker }
11640*3ac0a46fSAndroid Build Coastguard Worker } else {
11641*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < p_j2k->m_output_image->numcomps; compno++) {
11642*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_output_image->comps[compno].data == NULL) {
11643*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING, "Failed to decode component %d\n",
11644*3ac0a46fSAndroid Build Coastguard Worker compno);
11645*3ac0a46fSAndroid Build Coastguard Worker decoded_all_used_components = OPJ_FALSE;
11646*3ac0a46fSAndroid Build Coastguard Worker }
11647*3ac0a46fSAndroid Build Coastguard Worker }
11648*3ac0a46fSAndroid Build Coastguard Worker }
11649*3ac0a46fSAndroid Build Coastguard Worker
11650*3ac0a46fSAndroid Build Coastguard Worker if (decoded_all_used_components == OPJ_FALSE) {
11651*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Failed to decode all used components\n");
11652*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11653*3ac0a46fSAndroid Build Coastguard Worker }
11654*3ac0a46fSAndroid Build Coastguard Worker
11655*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11656*3ac0a46fSAndroid Build Coastguard Worker }
11657*3ac0a46fSAndroid Build Coastguard Worker
11658*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_decode_tiles(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)11659*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
11660*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
11661*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
11662*3ac0a46fSAndroid Build Coastguard Worker {
11663*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_go_on = OPJ_TRUE;
11664*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_tile_no;
11665*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
11666*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comps;
11667*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 nr_tiles = 0;
11668*3ac0a46fSAndroid Build Coastguard Worker
11669*3ac0a46fSAndroid Build Coastguard Worker /* Particular case for whole single tile decoding */
11670*3ac0a46fSAndroid Build Coastguard Worker /* We can avoid allocating intermediate tile buffers */
11671*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
11672*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.tx0 == 0 && p_j2k->m_cp.ty0 == 0 &&
11673*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->x0 == 0 &&
11674*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->y0 == 0 &&
11675*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->x1 == p_j2k->m_cp.tdx &&
11676*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->y1 == p_j2k->m_cp.tdy) {
11677*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
11678*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_tile_header(p_j2k,
11679*3ac0a46fSAndroid Build Coastguard Worker &l_current_tile_no,
11680*3ac0a46fSAndroid Build Coastguard Worker NULL,
11681*3ac0a46fSAndroid Build Coastguard Worker &l_tile_x0, &l_tile_y0,
11682*3ac0a46fSAndroid Build Coastguard Worker &l_tile_x1, &l_tile_y1,
11683*3ac0a46fSAndroid Build Coastguard Worker &l_nb_comps,
11684*3ac0a46fSAndroid Build Coastguard Worker &l_go_on,
11685*3ac0a46fSAndroid Build Coastguard Worker p_stream,
11686*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
11687*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11688*3ac0a46fSAndroid Build Coastguard Worker }
11689*3ac0a46fSAndroid Build Coastguard Worker
11690*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
11691*3ac0a46fSAndroid Build Coastguard Worker p_stream, p_manager)) {
11692*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile 1/1\n");
11693*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11694*3ac0a46fSAndroid Build Coastguard Worker }
11695*3ac0a46fSAndroid Build Coastguard Worker
11696*3ac0a46fSAndroid Build Coastguard Worker /* Transfer TCD data to output image data */
11697*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_j2k->m_output_image->numcomps; i++) {
11698*3ac0a46fSAndroid Build Coastguard Worker opj_image_data_free(p_j2k->m_output_image->comps[i].data);
11699*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->comps[i].data =
11700*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd->tcd_image->tiles->comps[i].data;
11701*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->comps[i].resno_decoded =
11702*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd->image->comps[i].resno_decoded;
11703*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd->tcd_image->tiles->comps[i].data = NULL;
11704*3ac0a46fSAndroid Build Coastguard Worker }
11705*3ac0a46fSAndroid Build Coastguard Worker
11706*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11707*3ac0a46fSAndroid Build Coastguard Worker }
11708*3ac0a46fSAndroid Build Coastguard Worker
11709*3ac0a46fSAndroid Build Coastguard Worker for (;;) {
11710*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
11711*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.tcps[0].m_data != NULL) {
11712*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_no = 0;
11713*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number = 0;
11714*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
11715*3ac0a46fSAndroid Build Coastguard Worker } else {
11716*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_tile_header(p_j2k,
11717*3ac0a46fSAndroid Build Coastguard Worker &l_current_tile_no,
11718*3ac0a46fSAndroid Build Coastguard Worker NULL,
11719*3ac0a46fSAndroid Build Coastguard Worker &l_tile_x0, &l_tile_y0,
11720*3ac0a46fSAndroid Build Coastguard Worker &l_tile_x1, &l_tile_y1,
11721*3ac0a46fSAndroid Build Coastguard Worker &l_nb_comps,
11722*3ac0a46fSAndroid Build Coastguard Worker &l_go_on,
11723*3ac0a46fSAndroid Build Coastguard Worker p_stream,
11724*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
11725*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11726*3ac0a46fSAndroid Build Coastguard Worker }
11727*3ac0a46fSAndroid Build Coastguard Worker
11728*3ac0a46fSAndroid Build Coastguard Worker if (! l_go_on) {
11729*3ac0a46fSAndroid Build Coastguard Worker break;
11730*3ac0a46fSAndroid Build Coastguard Worker }
11731*3ac0a46fSAndroid Build Coastguard Worker }
11732*3ac0a46fSAndroid Build Coastguard Worker
11733*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
11734*3ac0a46fSAndroid Build Coastguard Worker p_stream, p_manager)) {
11735*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n",
11736*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
11737*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11738*3ac0a46fSAndroid Build Coastguard Worker }
11739*3ac0a46fSAndroid Build Coastguard Worker
11740*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
11741*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
11742*3ac0a46fSAndroid Build Coastguard Worker
11743*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_update_image_data(p_j2k->m_tcd,
11744*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image)) {
11745*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11746*3ac0a46fSAndroid Build Coastguard Worker }
11747*3ac0a46fSAndroid Build Coastguard Worker
11748*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
11749*3ac0a46fSAndroid Build Coastguard Worker !(p_j2k->m_output_image->x0 == p_j2k->m_private_image->x0 &&
11750*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->y0 == p_j2k->m_private_image->y0 &&
11751*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->x1 == p_j2k->m_private_image->x1 &&
11752*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->y1 == p_j2k->m_private_image->y1)) {
11753*3ac0a46fSAndroid Build Coastguard Worker /* Keep current tcp data */
11754*3ac0a46fSAndroid Build Coastguard Worker } else {
11755*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
11756*3ac0a46fSAndroid Build Coastguard Worker }
11757*3ac0a46fSAndroid Build Coastguard Worker
11758*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO,
11759*3ac0a46fSAndroid Build Coastguard Worker "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
11760*3ac0a46fSAndroid Build Coastguard Worker
11761*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_get_number_byte_left(p_stream) == 0
11762*3ac0a46fSAndroid Build Coastguard Worker && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
11763*3ac0a46fSAndroid Build Coastguard Worker break;
11764*3ac0a46fSAndroid Build Coastguard Worker }
11765*3ac0a46fSAndroid Build Coastguard Worker if (++nr_tiles == p_j2k->m_cp.th * p_j2k->m_cp.tw) {
11766*3ac0a46fSAndroid Build Coastguard Worker break;
11767*3ac0a46fSAndroid Build Coastguard Worker }
11768*3ac0a46fSAndroid Build Coastguard Worker }
11769*3ac0a46fSAndroid Build Coastguard Worker
11770*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
11771*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11772*3ac0a46fSAndroid Build Coastguard Worker }
11773*3ac0a46fSAndroid Build Coastguard Worker
11774*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11775*3ac0a46fSAndroid Build Coastguard Worker }
11776*3ac0a46fSAndroid Build Coastguard Worker
11777*3ac0a46fSAndroid Build Coastguard Worker /**
11778*3ac0a46fSAndroid Build Coastguard Worker * Sets up the procedures to do on decoding data. Developers wanting to extend the library can add their own reading procedures.
11779*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_setup_decoding(opj_j2k_t * p_j2k,opj_event_mgr_t * p_manager)11780*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_decoding(opj_j2k_t *p_j2k,
11781*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
11782*3ac0a46fSAndroid Build Coastguard Worker {
11783*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
11784*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
11785*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
11786*3ac0a46fSAndroid Build Coastguard Worker
11787*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11788*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_decode_tiles, p_manager)) {
11789*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11790*3ac0a46fSAndroid Build Coastguard Worker }
11791*3ac0a46fSAndroid Build Coastguard Worker /* DEVELOPER CORNER, add your custom procedures */
11792*3ac0a46fSAndroid Build Coastguard Worker
11793*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11794*3ac0a46fSAndroid Build Coastguard Worker }
11795*3ac0a46fSAndroid Build Coastguard Worker
11796*3ac0a46fSAndroid Build Coastguard Worker /*
11797*3ac0a46fSAndroid Build Coastguard Worker * Read and decode one tile.
11798*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_decode_one_tile(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)11799*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_decode_one_tile(opj_j2k_t *p_j2k,
11800*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
11801*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
11802*3ac0a46fSAndroid Build Coastguard Worker {
11803*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_go_on = OPJ_TRUE;
11804*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_tile_no;
11805*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tile_no_to_dec;
11806*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
11807*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_comps;
11808*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
11809*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
11810*3ac0a46fSAndroid Build Coastguard Worker
11811*3ac0a46fSAndroid Build Coastguard Worker /*Allocate and initialize some elements of codestrem index if not already done*/
11812*3ac0a46fSAndroid Build Coastguard Worker if (!p_j2k->cstr_index->tile_index) {
11813*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
11814*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11815*3ac0a46fSAndroid Build Coastguard Worker }
11816*3ac0a46fSAndroid Build Coastguard Worker }
11817*3ac0a46fSAndroid Build Coastguard Worker /* Move into the codestream to the first SOT used to decode the desired tile */
11818*3ac0a46fSAndroid Build Coastguard Worker l_tile_no_to_dec = (OPJ_UINT32)
11819*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
11820*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_index->tile_index)
11821*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_index->tile_index->tp_index) {
11822*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
11823*3ac0a46fSAndroid Build Coastguard Worker /* the index for this tile has not been built,
11824*3ac0a46fSAndroid Build Coastguard Worker * so move to the last SOT read */
11825*3ac0a46fSAndroid Build Coastguard Worker if (!(opj_stream_read_seek(p_stream,
11826*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos + 2, p_manager))) {
11827*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
11828*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11829*3ac0a46fSAndroid Build Coastguard Worker }
11830*3ac0a46fSAndroid Build Coastguard Worker } else {
11831*3ac0a46fSAndroid Build Coastguard Worker if (!(opj_stream_read_seek(p_stream,
11832*3ac0a46fSAndroid Build Coastguard Worker p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos + 2,
11833*3ac0a46fSAndroid Build Coastguard Worker p_manager))) {
11834*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
11835*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11836*3ac0a46fSAndroid Build Coastguard Worker }
11837*3ac0a46fSAndroid Build Coastguard Worker }
11838*3ac0a46fSAndroid Build Coastguard Worker /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
11839*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
11840*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
11841*3ac0a46fSAndroid Build Coastguard Worker }
11842*3ac0a46fSAndroid Build Coastguard Worker }
11843*3ac0a46fSAndroid Build Coastguard Worker
11844*3ac0a46fSAndroid Build Coastguard Worker /* Reset current tile part number for all tiles, and not only the one */
11845*3ac0a46fSAndroid Build Coastguard Worker /* of interest. */
11846*3ac0a46fSAndroid Build Coastguard Worker /* Not completely sure this is always correct but required for */
11847*3ac0a46fSAndroid Build Coastguard Worker /* ./build/bin/j2k_random_tile_access ./build/tests/tte1.j2k */
11848*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
11849*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
11850*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.tcps[i].m_current_tile_part_number = -1;
11851*3ac0a46fSAndroid Build Coastguard Worker }
11852*3ac0a46fSAndroid Build Coastguard Worker
11853*3ac0a46fSAndroid Build Coastguard Worker for (;;) {
11854*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_read_tile_header(p_j2k,
11855*3ac0a46fSAndroid Build Coastguard Worker &l_current_tile_no,
11856*3ac0a46fSAndroid Build Coastguard Worker NULL,
11857*3ac0a46fSAndroid Build Coastguard Worker &l_tile_x0, &l_tile_y0,
11858*3ac0a46fSAndroid Build Coastguard Worker &l_tile_x1, &l_tile_y1,
11859*3ac0a46fSAndroid Build Coastguard Worker &l_nb_comps,
11860*3ac0a46fSAndroid Build Coastguard Worker &l_go_on,
11861*3ac0a46fSAndroid Build Coastguard Worker p_stream,
11862*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
11863*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11864*3ac0a46fSAndroid Build Coastguard Worker }
11865*3ac0a46fSAndroid Build Coastguard Worker
11866*3ac0a46fSAndroid Build Coastguard Worker if (! l_go_on) {
11867*3ac0a46fSAndroid Build Coastguard Worker break;
11868*3ac0a46fSAndroid Build Coastguard Worker }
11869*3ac0a46fSAndroid Build Coastguard Worker
11870*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
11871*3ac0a46fSAndroid Build Coastguard Worker p_stream, p_manager)) {
11872*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11873*3ac0a46fSAndroid Build Coastguard Worker }
11874*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
11875*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
11876*3ac0a46fSAndroid Build Coastguard Worker
11877*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_update_image_data(p_j2k->m_tcd,
11878*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image)) {
11879*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11880*3ac0a46fSAndroid Build Coastguard Worker }
11881*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_tcp_data_destroy(&p_j2k->m_cp.tcps[l_current_tile_no]);
11882*3ac0a46fSAndroid Build Coastguard Worker
11883*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO,
11884*3ac0a46fSAndroid Build Coastguard Worker "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
11885*3ac0a46fSAndroid Build Coastguard Worker
11886*3ac0a46fSAndroid Build Coastguard Worker if (l_current_tile_no == l_tile_no_to_dec) {
11887*3ac0a46fSAndroid Build Coastguard Worker /* move into the codestream to the first SOT (FIXME or not move?)*/
11888*3ac0a46fSAndroid Build Coastguard Worker if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2,
11889*3ac0a46fSAndroid Build Coastguard Worker p_manager))) {
11890*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
11891*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11892*3ac0a46fSAndroid Build Coastguard Worker }
11893*3ac0a46fSAndroid Build Coastguard Worker break;
11894*3ac0a46fSAndroid Build Coastguard Worker } else {
11895*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
11896*3ac0a46fSAndroid Build Coastguard Worker "Tile read, decoded and updated is not the desired one (%d vs %d).\n",
11897*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_no + 1, l_tile_no_to_dec + 1);
11898*3ac0a46fSAndroid Build Coastguard Worker }
11899*3ac0a46fSAndroid Build Coastguard Worker
11900*3ac0a46fSAndroid Build Coastguard Worker }
11901*3ac0a46fSAndroid Build Coastguard Worker
11902*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_are_all_used_components_decoded(p_j2k, p_manager)) {
11903*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11904*3ac0a46fSAndroid Build Coastguard Worker }
11905*3ac0a46fSAndroid Build Coastguard Worker
11906*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11907*3ac0a46fSAndroid Build Coastguard Worker }
11908*3ac0a46fSAndroid Build Coastguard Worker
11909*3ac0a46fSAndroid Build Coastguard Worker /**
11910*3ac0a46fSAndroid Build Coastguard Worker * Sets up the procedures to do on decoding one tile. Developers wanting to extend the library can add their own reading procedures.
11911*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_setup_decoding_tile(opj_j2k_t * p_j2k,opj_event_mgr_t * p_manager)11912*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_decoding_tile(opj_j2k_t *p_j2k,
11913*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
11914*3ac0a46fSAndroid Build Coastguard Worker {
11915*3ac0a46fSAndroid Build Coastguard Worker /* preconditions*/
11916*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
11917*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
11918*3ac0a46fSAndroid Build Coastguard Worker
11919*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
11920*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_decode_one_tile, p_manager)) {
11921*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11922*3ac0a46fSAndroid Build Coastguard Worker }
11923*3ac0a46fSAndroid Build Coastguard Worker /* DEVELOPER CORNER, add your custom procedures */
11924*3ac0a46fSAndroid Build Coastguard Worker
11925*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11926*3ac0a46fSAndroid Build Coastguard Worker }
11927*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_move_data_from_codec_to_output_image(opj_j2k_t * p_j2k,opj_image_t * p_image)11928*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_move_data_from_codec_to_output_image(opj_j2k_t * p_j2k,
11929*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * p_image)
11930*3ac0a46fSAndroid Build Coastguard Worker {
11931*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
11932*3ac0a46fSAndroid Build Coastguard Worker
11933*3ac0a46fSAndroid Build Coastguard Worker /* Move data and copy one information from codec to output image*/
11934*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode > 0) {
11935*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t* newcomps =
11936*3ac0a46fSAndroid Build Coastguard Worker (opj_image_comp_t*) opj_malloc(
11937*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode *
11938*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_image_comp_t));
11939*3ac0a46fSAndroid Build Coastguard Worker if (newcomps == NULL) {
11940*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_private_image);
11941*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = NULL;
11942*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11943*3ac0a46fSAndroid Build Coastguard Worker }
11944*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < p_image->numcomps; compno++) {
11945*3ac0a46fSAndroid Build Coastguard Worker opj_image_data_free(p_image->comps[compno].data);
11946*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[compno].data = NULL;
11947*3ac0a46fSAndroid Build Coastguard Worker }
11948*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0;
11949*3ac0a46fSAndroid Build Coastguard Worker compno < p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode; compno++) {
11950*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 src_compno =
11951*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_comps_indices_to_decode[compno];
11952*3ac0a46fSAndroid Build Coastguard Worker memcpy(&(newcomps[compno]),
11953*3ac0a46fSAndroid Build Coastguard Worker &(p_j2k->m_output_image->comps[src_compno]),
11954*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_image_comp_t));
11955*3ac0a46fSAndroid Build Coastguard Worker newcomps[compno].resno_decoded =
11956*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->comps[src_compno].resno_decoded;
11957*3ac0a46fSAndroid Build Coastguard Worker newcomps[compno].data = p_j2k->m_output_image->comps[src_compno].data;
11958*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->comps[src_compno].data = NULL;
11959*3ac0a46fSAndroid Build Coastguard Worker }
11960*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < p_image->numcomps; compno++) {
11961*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k->m_output_image->comps[compno].data == NULL);
11962*3ac0a46fSAndroid Build Coastguard Worker opj_image_data_free(p_j2k->m_output_image->comps[compno].data);
11963*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->comps[compno].data = NULL;
11964*3ac0a46fSAndroid Build Coastguard Worker }
11965*3ac0a46fSAndroid Build Coastguard Worker p_image->numcomps = p_j2k->m_specific_param.m_decoder.m_numcomps_to_decode;
11966*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_image->comps);
11967*3ac0a46fSAndroid Build Coastguard Worker p_image->comps = newcomps;
11968*3ac0a46fSAndroid Build Coastguard Worker } else {
11969*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < p_image->numcomps; compno++) {
11970*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[compno].resno_decoded =
11971*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->comps[compno].resno_decoded;
11972*3ac0a46fSAndroid Build Coastguard Worker opj_image_data_free(p_image->comps[compno].data);
11973*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
11974*3ac0a46fSAndroid Build Coastguard Worker #if 0
11975*3ac0a46fSAndroid Build Coastguard Worker char fn[256];
11976*3ac0a46fSAndroid Build Coastguard Worker snprintf(fn, sizeof fn, "/tmp/%d.raw", compno);
11977*3ac0a46fSAndroid Build Coastguard Worker FILE *debug = fopen(fn, "wb");
11978*3ac0a46fSAndroid Build Coastguard Worker fwrite(p_image->comps[compno].data, sizeof(OPJ_INT32),
11979*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[compno].w * p_image->comps[compno].h, debug);
11980*3ac0a46fSAndroid Build Coastguard Worker fclose(debug);
11981*3ac0a46fSAndroid Build Coastguard Worker #endif
11982*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image->comps[compno].data = NULL;
11983*3ac0a46fSAndroid Build Coastguard Worker }
11984*3ac0a46fSAndroid Build Coastguard Worker }
11985*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
11986*3ac0a46fSAndroid Build Coastguard Worker }
11987*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_decode(void * j2k,opj_stream_private_t * p_stream,opj_image_t * p_image,opj_event_mgr_t * p_manager)11988*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_decode(void * j2k,
11989*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t * p_stream,
11990*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * p_image,
11991*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
11992*3ac0a46fSAndroid Build Coastguard Worker {
11993*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
11994*3ac0a46fSAndroid Build Coastguard Worker if (!p_image) {
11995*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
11996*3ac0a46fSAndroid Build Coastguard Worker }
11997*3ac0a46fSAndroid Build Coastguard Worker
11998*3ac0a46fSAndroid Build Coastguard Worker /* Heuristics to detect sequence opj_read_header(), opj_set_decoded_resolution_factor() */
11999*3ac0a46fSAndroid Build Coastguard Worker /* and finally opj_decode_image() without manual setting of comps[].factor */
12000*3ac0a46fSAndroid Build Coastguard Worker /* We could potentially always execute it, if we don't allow people to do */
12001*3ac0a46fSAndroid Build Coastguard Worker /* opj_read_header(), modify x0,y0,x1,y1 of returned image an call opj_decode_image() */
12002*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.m_specific_param.m_dec.m_reduce > 0 &&
12003*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image != NULL &&
12004*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image->numcomps > 0 &&
12005*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image->comps[0].factor ==
12006*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.m_specific_param.m_dec.m_reduce &&
12007*3ac0a46fSAndroid Build Coastguard Worker p_image->numcomps > 0 &&
12008*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[0].factor == 0 &&
12009*3ac0a46fSAndroid Build Coastguard Worker /* Don't mess with image dimension if the user has allocated it */
12010*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[0].data == NULL) {
12011*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_comp;
12012*3ac0a46fSAndroid Build Coastguard Worker
12013*3ac0a46fSAndroid Build Coastguard Worker /* Update the comps[].factor member of the output image with the one */
12014*3ac0a46fSAndroid Build Coastguard Worker /* of m_reduce */
12015*3ac0a46fSAndroid Build Coastguard Worker for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
12016*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[it_comp].factor = p_j2k->m_cp.m_specific_param.m_dec.m_reduce;
12017*3ac0a46fSAndroid Build Coastguard Worker }
12018*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_update_image_dimensions(p_image, p_manager)) {
12019*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12020*3ac0a46fSAndroid Build Coastguard Worker }
12021*3ac0a46fSAndroid Build Coastguard Worker }
12022*3ac0a46fSAndroid Build Coastguard Worker
12023*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_output_image == NULL) {
12024*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image = opj_image_create0();
12025*3ac0a46fSAndroid Build Coastguard Worker if (!(p_j2k->m_output_image)) {
12026*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12027*3ac0a46fSAndroid Build Coastguard Worker }
12028*3ac0a46fSAndroid Build Coastguard Worker }
12029*3ac0a46fSAndroid Build Coastguard Worker opj_copy_image_header(p_image, p_j2k->m_output_image);
12030*3ac0a46fSAndroid Build Coastguard Worker
12031*3ac0a46fSAndroid Build Coastguard Worker /* customization of the decoding */
12032*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_setup_decoding(p_j2k, p_manager)) {
12033*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12034*3ac0a46fSAndroid Build Coastguard Worker }
12035*3ac0a46fSAndroid Build Coastguard Worker
12036*3ac0a46fSAndroid Build Coastguard Worker /* Decode the codestream */
12037*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12038*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_private_image);
12039*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = NULL;
12040*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12041*3ac0a46fSAndroid Build Coastguard Worker }
12042*3ac0a46fSAndroid Build Coastguard Worker
12043*3ac0a46fSAndroid Build Coastguard Worker /* Move data and copy one information from codec to output image*/
12044*3ac0a46fSAndroid Build Coastguard Worker return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
12045*3ac0a46fSAndroid Build Coastguard Worker }
12046*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_tile(void * j2k,opj_stream_private_t * p_stream,opj_image_t * p_image,opj_event_mgr_t * p_manager,OPJ_UINT32 tile_index)12047*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_get_tile(void *j2k,
12048*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
12049*3ac0a46fSAndroid Build Coastguard Worker opj_image_t* p_image,
12050*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager,
12051*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tile_index)
12052*3ac0a46fSAndroid Build Coastguard Worker {
12053*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
12054*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
12055*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tile_x, l_tile_y;
12056*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t* l_img_comp;
12057*3ac0a46fSAndroid Build Coastguard Worker
12058*3ac0a46fSAndroid Build Coastguard Worker if (!p_image) {
12059*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
12060*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12061*3ac0a46fSAndroid Build Coastguard Worker }
12062*3ac0a46fSAndroid Build Coastguard Worker
12063*3ac0a46fSAndroid Build Coastguard Worker if (p_image->numcomps < p_j2k->m_private_image->numcomps) {
12064*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
12065*3ac0a46fSAndroid Build Coastguard Worker "Image has less components than codestream.\n");
12066*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12067*3ac0a46fSAndroid Build Coastguard Worker }
12068*3ac0a46fSAndroid Build Coastguard Worker
12069*3ac0a46fSAndroid Build Coastguard Worker if (/*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th)) {
12070*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
12071*3ac0a46fSAndroid Build Coastguard Worker "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index,
12072*3ac0a46fSAndroid Build Coastguard Worker (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
12073*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12074*3ac0a46fSAndroid Build Coastguard Worker }
12075*3ac0a46fSAndroid Build Coastguard Worker
12076*3ac0a46fSAndroid Build Coastguard Worker /* Compute the dimension of the desired tile*/
12077*3ac0a46fSAndroid Build Coastguard Worker l_tile_x = tile_index % p_j2k->m_cp.tw;
12078*3ac0a46fSAndroid Build Coastguard Worker l_tile_y = tile_index / p_j2k->m_cp.tw;
12079*3ac0a46fSAndroid Build Coastguard Worker
12080*3ac0a46fSAndroid Build Coastguard Worker p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
12081*3ac0a46fSAndroid Build Coastguard Worker if (p_image->x0 < p_j2k->m_private_image->x0) {
12082*3ac0a46fSAndroid Build Coastguard Worker p_image->x0 = p_j2k->m_private_image->x0;
12083*3ac0a46fSAndroid Build Coastguard Worker }
12084*3ac0a46fSAndroid Build Coastguard Worker p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
12085*3ac0a46fSAndroid Build Coastguard Worker if (p_image->x1 > p_j2k->m_private_image->x1) {
12086*3ac0a46fSAndroid Build Coastguard Worker p_image->x1 = p_j2k->m_private_image->x1;
12087*3ac0a46fSAndroid Build Coastguard Worker }
12088*3ac0a46fSAndroid Build Coastguard Worker
12089*3ac0a46fSAndroid Build Coastguard Worker p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
12090*3ac0a46fSAndroid Build Coastguard Worker if (p_image->y0 < p_j2k->m_private_image->y0) {
12091*3ac0a46fSAndroid Build Coastguard Worker p_image->y0 = p_j2k->m_private_image->y0;
12092*3ac0a46fSAndroid Build Coastguard Worker }
12093*3ac0a46fSAndroid Build Coastguard Worker p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
12094*3ac0a46fSAndroid Build Coastguard Worker if (p_image->y1 > p_j2k->m_private_image->y1) {
12095*3ac0a46fSAndroid Build Coastguard Worker p_image->y1 = p_j2k->m_private_image->y1;
12096*3ac0a46fSAndroid Build Coastguard Worker }
12097*3ac0a46fSAndroid Build Coastguard Worker
12098*3ac0a46fSAndroid Build Coastguard Worker l_img_comp = p_image->comps;
12099*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) {
12100*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 l_comp_x1, l_comp_y1;
12101*3ac0a46fSAndroid Build Coastguard Worker
12102*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
12103*3ac0a46fSAndroid Build Coastguard Worker
12104*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
12105*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
12106*3ac0a46fSAndroid Build Coastguard Worker l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
12107*3ac0a46fSAndroid Build Coastguard Worker l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
12108*3ac0a46fSAndroid Build Coastguard Worker
12109*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1,
12110*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0,
12111*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_img_comp->factor));
12112*3ac0a46fSAndroid Build Coastguard Worker l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1,
12113*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0,
12114*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_img_comp->factor));
12115*3ac0a46fSAndroid Build Coastguard Worker
12116*3ac0a46fSAndroid Build Coastguard Worker l_img_comp++;
12117*3ac0a46fSAndroid Build Coastguard Worker }
12118*3ac0a46fSAndroid Build Coastguard Worker
12119*3ac0a46fSAndroid Build Coastguard Worker if (p_image->numcomps > p_j2k->m_private_image->numcomps) {
12120*3ac0a46fSAndroid Build Coastguard Worker /* Can happen when calling repeatdly opj_get_decoded_tile() on an
12121*3ac0a46fSAndroid Build Coastguard Worker * image with a color palette, where color palette expansion is done
12122*3ac0a46fSAndroid Build Coastguard Worker * later in jp2.c */
12123*3ac0a46fSAndroid Build Coastguard Worker for (compno = p_j2k->m_private_image->numcomps; compno < p_image->numcomps;
12124*3ac0a46fSAndroid Build Coastguard Worker ++compno) {
12125*3ac0a46fSAndroid Build Coastguard Worker opj_image_data_free(p_image->comps[compno].data);
12126*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[compno].data = NULL;
12127*3ac0a46fSAndroid Build Coastguard Worker }
12128*3ac0a46fSAndroid Build Coastguard Worker p_image->numcomps = p_j2k->m_private_image->numcomps;
12129*3ac0a46fSAndroid Build Coastguard Worker }
12130*3ac0a46fSAndroid Build Coastguard Worker
12131*3ac0a46fSAndroid Build Coastguard Worker /* Destroy the previous output image*/
12132*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_output_image) {
12133*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_output_image);
12134*3ac0a46fSAndroid Build Coastguard Worker }
12135*3ac0a46fSAndroid Build Coastguard Worker
12136*3ac0a46fSAndroid Build Coastguard Worker /* Create the output image from the information previously computed*/
12137*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_output_image = opj_image_create0();
12138*3ac0a46fSAndroid Build Coastguard Worker if (!(p_j2k->m_output_image)) {
12139*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12140*3ac0a46fSAndroid Build Coastguard Worker }
12141*3ac0a46fSAndroid Build Coastguard Worker opj_copy_image_header(p_image, p_j2k->m_output_image);
12142*3ac0a46fSAndroid Build Coastguard Worker
12143*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
12144*3ac0a46fSAndroid Build Coastguard Worker
12145*3ac0a46fSAndroid Build Coastguard Worker /* customization of the decoding */
12146*3ac0a46fSAndroid Build Coastguard Worker if (!opj_j2k_setup_decoding_tile(p_j2k, p_manager)) {
12147*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12148*3ac0a46fSAndroid Build Coastguard Worker }
12149*3ac0a46fSAndroid Build Coastguard Worker
12150*3ac0a46fSAndroid Build Coastguard Worker /* Decode the codestream */
12151*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12152*3ac0a46fSAndroid Build Coastguard Worker opj_image_destroy(p_j2k->m_private_image);
12153*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = NULL;
12154*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12155*3ac0a46fSAndroid Build Coastguard Worker }
12156*3ac0a46fSAndroid Build Coastguard Worker
12157*3ac0a46fSAndroid Build Coastguard Worker /* Move data and copy one information from codec to output image*/
12158*3ac0a46fSAndroid Build Coastguard Worker return opj_j2k_move_data_from_codec_to_output_image(p_j2k, p_image);
12159*3ac0a46fSAndroid Build Coastguard Worker }
12160*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_set_decoded_resolution_factor(void * j2k,OPJ_UINT32 res_factor,opj_event_mgr_t * p_manager)12161*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_set_decoded_resolution_factor(void *j2k,
12162*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 res_factor,
12163*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12164*3ac0a46fSAndroid Build Coastguard Worker {
12165*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
12166*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_comp;
12167*3ac0a46fSAndroid Build Coastguard Worker
12168*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
12169*3ac0a46fSAndroid Build Coastguard Worker
12170*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_private_image) {
12171*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_private_image->comps) {
12172*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
12173*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
12174*3ac0a46fSAndroid Build Coastguard Worker for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
12175*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 max_res =
12176*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
12177*3ac0a46fSAndroid Build Coastguard Worker if (res_factor >= max_res) {
12178*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
12179*3ac0a46fSAndroid Build Coastguard Worker "Resolution factor is greater than the maximum resolution in the component.\n");
12180*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12181*3ac0a46fSAndroid Build Coastguard Worker }
12182*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image->comps[it_comp].factor = res_factor;
12183*3ac0a46fSAndroid Build Coastguard Worker }
12184*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12185*3ac0a46fSAndroid Build Coastguard Worker }
12186*3ac0a46fSAndroid Build Coastguard Worker }
12187*3ac0a46fSAndroid Build Coastguard Worker }
12188*3ac0a46fSAndroid Build Coastguard Worker }
12189*3ac0a46fSAndroid Build Coastguard Worker
12190*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12191*3ac0a46fSAndroid Build Coastguard Worker }
12192*3ac0a46fSAndroid Build Coastguard Worker
12193*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
12194*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_encoder_set_extra_options(void * j2k,const char * const * p_options,opj_event_mgr_t * p_manager)12195*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_encoder_set_extra_options(
12196*3ac0a46fSAndroid Build Coastguard Worker void *j2k,
12197*3ac0a46fSAndroid Build Coastguard Worker const char* const* p_options,
12198*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12199*3ac0a46fSAndroid Build Coastguard Worker {
12200*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
12201*3ac0a46fSAndroid Build Coastguard Worker const char* const* p_option_iter;
12202*3ac0a46fSAndroid Build Coastguard Worker
12203*3ac0a46fSAndroid Build Coastguard Worker if (p_options == NULL) {
12204*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12205*3ac0a46fSAndroid Build Coastguard Worker }
12206*3ac0a46fSAndroid Build Coastguard Worker
12207*3ac0a46fSAndroid Build Coastguard Worker for (p_option_iter = p_options; *p_option_iter != NULL; ++p_option_iter) {
12208*3ac0a46fSAndroid Build Coastguard Worker if (strncmp(*p_option_iter, "PLT=", 4) == 0) {
12209*3ac0a46fSAndroid Build Coastguard Worker if (strcmp(*p_option_iter, "PLT=YES") == 0) {
12210*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_PLT = OPJ_TRUE;
12211*3ac0a46fSAndroid Build Coastguard Worker } else if (strcmp(*p_option_iter, "PLT=NO") == 0) {
12212*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_PLT = OPJ_FALSE;
12213*3ac0a46fSAndroid Build Coastguard Worker } else {
12214*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
12215*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for option: %s.\n", *p_option_iter);
12216*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12217*3ac0a46fSAndroid Build Coastguard Worker }
12218*3ac0a46fSAndroid Build Coastguard Worker } else if (strncmp(*p_option_iter, "TLM=", 4) == 0) {
12219*3ac0a46fSAndroid Build Coastguard Worker if (strcmp(*p_option_iter, "TLM=YES") == 0) {
12220*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_TRUE;
12221*3ac0a46fSAndroid Build Coastguard Worker } else if (strcmp(*p_option_iter, "TLM=NO") == 0) {
12222*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_TLM = OPJ_FALSE;
12223*3ac0a46fSAndroid Build Coastguard Worker } else {
12224*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
12225*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for option: %s.\n", *p_option_iter);
12226*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12227*3ac0a46fSAndroid Build Coastguard Worker }
12228*3ac0a46fSAndroid Build Coastguard Worker } else if (strncmp(*p_option_iter, "GUARD_BITS=", strlen("GUARD_BITS=")) == 0) {
12229*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tileno;
12230*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t *cp = cp = &(p_j2k->m_cp);
12231*3ac0a46fSAndroid Build Coastguard Worker
12232*3ac0a46fSAndroid Build Coastguard Worker int numgbits = atoi(*p_option_iter + strlen("GUARD_BITS="));
12233*3ac0a46fSAndroid Build Coastguard Worker if (numgbits < 0 || numgbits > 7) {
12234*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
12235*3ac0a46fSAndroid Build Coastguard Worker "Invalid value for option: %s. Should be in [0,7]\n", *p_option_iter);
12236*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12237*3ac0a46fSAndroid Build Coastguard Worker }
12238*3ac0a46fSAndroid Build Coastguard Worker
12239*3ac0a46fSAndroid Build Coastguard Worker for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
12240*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
12241*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *tcp = &cp->tcps[tileno];
12242*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_j2k->m_specific_param.m_encoder.m_nb_comps; i++) {
12243*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t *tccp = &tcp->tccps[i];
12244*3ac0a46fSAndroid Build Coastguard Worker tccp->numgbits = (OPJ_UINT32)numgbits;
12245*3ac0a46fSAndroid Build Coastguard Worker }
12246*3ac0a46fSAndroid Build Coastguard Worker }
12247*3ac0a46fSAndroid Build Coastguard Worker } else {
12248*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
12249*3ac0a46fSAndroid Build Coastguard Worker "Invalid option: %s.\n", *p_option_iter);
12250*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12251*3ac0a46fSAndroid Build Coastguard Worker }
12252*3ac0a46fSAndroid Build Coastguard Worker }
12253*3ac0a46fSAndroid Build Coastguard Worker
12254*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12255*3ac0a46fSAndroid Build Coastguard Worker }
12256*3ac0a46fSAndroid Build Coastguard Worker
12257*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
12258*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_encode(void * j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)12259*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_encode(void * j2k,
12260*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
12261*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12262*3ac0a46fSAndroid Build Coastguard Worker {
12263*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
12264*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
12265*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_tiles;
12266*3ac0a46fSAndroid Build Coastguard Worker OPJ_SIZE_T l_max_tile_size = 0, l_current_tile_size;
12267*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
12268*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL l_reuse_data = OPJ_FALSE;
12269*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_t* p_tcd = 00;
12270*3ac0a46fSAndroid Build Coastguard Worker
12271*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
12272*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
12273*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
12274*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
12275*3ac0a46fSAndroid Build Coastguard Worker
12276*3ac0a46fSAndroid Build Coastguard Worker p_tcd = p_j2k->m_tcd;
12277*3ac0a46fSAndroid Build Coastguard Worker
12278*3ac0a46fSAndroid Build Coastguard Worker l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
12279*3ac0a46fSAndroid Build Coastguard Worker if (l_nb_tiles == 1) {
12280*3ac0a46fSAndroid Build Coastguard Worker l_reuse_data = OPJ_TRUE;
12281*3ac0a46fSAndroid Build Coastguard Worker #ifdef __SSE__
12282*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12283*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
12284*3ac0a46fSAndroid Build Coastguard Worker if (((size_t)l_img_comp->data & 0xFU) !=
12285*3ac0a46fSAndroid Build Coastguard Worker 0U) { /* tile data shall be aligned on 16 bytes */
12286*3ac0a46fSAndroid Build Coastguard Worker l_reuse_data = OPJ_FALSE;
12287*3ac0a46fSAndroid Build Coastguard Worker }
12288*3ac0a46fSAndroid Build Coastguard Worker }
12289*3ac0a46fSAndroid Build Coastguard Worker #endif
12290*3ac0a46fSAndroid Build Coastguard Worker }
12291*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_nb_tiles; ++i) {
12292*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_pre_write_tile(p_j2k, i, p_stream, p_manager)) {
12293*3ac0a46fSAndroid Build Coastguard Worker if (l_current_data) {
12294*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_current_data);
12295*3ac0a46fSAndroid Build Coastguard Worker }
12296*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12297*3ac0a46fSAndroid Build Coastguard Worker }
12298*3ac0a46fSAndroid Build Coastguard Worker
12299*3ac0a46fSAndroid Build Coastguard Worker /* if we only have one tile, then simply set tile component data equal to image component data */
12300*3ac0a46fSAndroid Build Coastguard Worker /* otherwise, allocate the data */
12301*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
12302*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j;
12303*3ac0a46fSAndroid Build Coastguard Worker if (l_reuse_data) {
12304*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
12305*3ac0a46fSAndroid Build Coastguard Worker l_tilec->data = l_img_comp->data;
12306*3ac0a46fSAndroid Build Coastguard Worker l_tilec->ownsData = OPJ_FALSE;
12307*3ac0a46fSAndroid Build Coastguard Worker } else {
12308*3ac0a46fSAndroid Build Coastguard Worker if (! opj_alloc_tile_component_data(l_tilec)) {
12309*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
12310*3ac0a46fSAndroid Build Coastguard Worker if (l_current_data) {
12311*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_current_data);
12312*3ac0a46fSAndroid Build Coastguard Worker }
12313*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12314*3ac0a46fSAndroid Build Coastguard Worker }
12315*3ac0a46fSAndroid Build Coastguard Worker }
12316*3ac0a46fSAndroid Build Coastguard Worker }
12317*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_size = opj_tcd_get_encoder_input_buffer_size(p_j2k->m_tcd);
12318*3ac0a46fSAndroid Build Coastguard Worker if (!l_reuse_data) {
12319*3ac0a46fSAndroid Build Coastguard Worker if (l_current_tile_size > l_max_tile_size) {
12320*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data,
12321*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_size);
12322*3ac0a46fSAndroid Build Coastguard Worker if (! l_new_current_data) {
12323*3ac0a46fSAndroid Build Coastguard Worker if (l_current_data) {
12324*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_current_data);
12325*3ac0a46fSAndroid Build Coastguard Worker }
12326*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
12327*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12328*3ac0a46fSAndroid Build Coastguard Worker }
12329*3ac0a46fSAndroid Build Coastguard Worker l_current_data = l_new_current_data;
12330*3ac0a46fSAndroid Build Coastguard Worker l_max_tile_size = l_current_tile_size;
12331*3ac0a46fSAndroid Build Coastguard Worker }
12332*3ac0a46fSAndroid Build Coastguard Worker if (l_current_data == NULL) {
12333*3ac0a46fSAndroid Build Coastguard Worker /* Should not happen in practice, but will avoid Coverity to */
12334*3ac0a46fSAndroid Build Coastguard Worker /* complain about a null pointer dereference */
12335*3ac0a46fSAndroid Build Coastguard Worker assert(0);
12336*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12337*3ac0a46fSAndroid Build Coastguard Worker }
12338*3ac0a46fSAndroid Build Coastguard Worker
12339*3ac0a46fSAndroid Build Coastguard Worker /* copy image data (32 bit) to l_current_data as contiguous, all-component, zero offset buffer */
12340*3ac0a46fSAndroid Build Coastguard Worker /* 32 bit components @ 8 bit precision get converted to 8 bit */
12341*3ac0a46fSAndroid Build Coastguard Worker /* 32 bit components @ 16 bit precision get converted to 16 bit */
12342*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_get_tile_data(p_j2k->m_tcd, l_current_data);
12343*3ac0a46fSAndroid Build Coastguard Worker
12344*3ac0a46fSAndroid Build Coastguard Worker /* now copy this data into the tile component */
12345*3ac0a46fSAndroid Build Coastguard Worker if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, l_current_data,
12346*3ac0a46fSAndroid Build Coastguard Worker l_current_tile_size)) {
12347*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
12348*3ac0a46fSAndroid Build Coastguard Worker "Size mismatch between tile data and sent data.");
12349*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_current_data);
12350*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12351*3ac0a46fSAndroid Build Coastguard Worker }
12352*3ac0a46fSAndroid Build Coastguard Worker }
12353*3ac0a46fSAndroid Build Coastguard Worker
12354*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
12355*3ac0a46fSAndroid Build Coastguard Worker if (l_current_data) {
12356*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_current_data);
12357*3ac0a46fSAndroid Build Coastguard Worker }
12358*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12359*3ac0a46fSAndroid Build Coastguard Worker }
12360*3ac0a46fSAndroid Build Coastguard Worker }
12361*3ac0a46fSAndroid Build Coastguard Worker
12362*3ac0a46fSAndroid Build Coastguard Worker if (l_current_data) {
12363*3ac0a46fSAndroid Build Coastguard Worker opj_free(l_current_data);
12364*3ac0a46fSAndroid Build Coastguard Worker }
12365*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12366*3ac0a46fSAndroid Build Coastguard Worker }
12367*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_end_compress(void * j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)12368*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_end_compress(void *j2k,
12369*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
12370*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12371*3ac0a46fSAndroid Build Coastguard Worker {
12372*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
12373*3ac0a46fSAndroid Build Coastguard Worker /* customization of the encoding */
12374*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) {
12375*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12376*3ac0a46fSAndroid Build Coastguard Worker }
12377*3ac0a46fSAndroid Build Coastguard Worker
12378*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12379*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12380*3ac0a46fSAndroid Build Coastguard Worker }
12381*3ac0a46fSAndroid Build Coastguard Worker
12382*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12383*3ac0a46fSAndroid Build Coastguard Worker }
12384*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_start_compress(void * j2k,opj_stream_private_t * p_stream,opj_image_t * p_image,opj_event_mgr_t * p_manager)12385*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_start_compress(void *j2k,
12386*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
12387*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * p_image,
12388*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12389*3ac0a46fSAndroid Build Coastguard Worker {
12390*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
12391*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
12392*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
12393*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
12394*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
12395*3ac0a46fSAndroid Build Coastguard Worker
12396*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image = opj_image_create0();
12397*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_private_image) {
12398*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header.");
12399*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12400*3ac0a46fSAndroid Build Coastguard Worker }
12401*3ac0a46fSAndroid Build Coastguard Worker opj_copy_image_header(p_image, p_j2k->m_private_image);
12402*3ac0a46fSAndroid Build Coastguard Worker
12403*3ac0a46fSAndroid Build Coastguard Worker /* TODO_MSD: Find a better way */
12404*3ac0a46fSAndroid Build Coastguard Worker if (p_image->comps) {
12405*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 it_comp;
12406*3ac0a46fSAndroid Build Coastguard Worker for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
12407*3ac0a46fSAndroid Build Coastguard Worker if (p_image->comps[it_comp].data) {
12408*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_private_image->comps[it_comp].data = p_image->comps[it_comp].data;
12409*3ac0a46fSAndroid Build Coastguard Worker p_image->comps[it_comp].data = NULL;
12410*3ac0a46fSAndroid Build Coastguard Worker
12411*3ac0a46fSAndroid Build Coastguard Worker }
12412*3ac0a46fSAndroid Build Coastguard Worker }
12413*3ac0a46fSAndroid Build Coastguard Worker }
12414*3ac0a46fSAndroid Build Coastguard Worker
12415*3ac0a46fSAndroid Build Coastguard Worker /* customization of the validation */
12416*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_setup_encoding_validation(p_j2k, p_manager)) {
12417*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12418*3ac0a46fSAndroid Build Coastguard Worker }
12419*3ac0a46fSAndroid Build Coastguard Worker
12420*3ac0a46fSAndroid Build Coastguard Worker /* validation of the parameters codec */
12421*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
12422*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12423*3ac0a46fSAndroid Build Coastguard Worker }
12424*3ac0a46fSAndroid Build Coastguard Worker
12425*3ac0a46fSAndroid Build Coastguard Worker /* customization of the encoding */
12426*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) {
12427*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12428*3ac0a46fSAndroid Build Coastguard Worker }
12429*3ac0a46fSAndroid Build Coastguard Worker
12430*3ac0a46fSAndroid Build Coastguard Worker /* write header */
12431*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
12432*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12433*3ac0a46fSAndroid Build Coastguard Worker }
12434*3ac0a46fSAndroid Build Coastguard Worker
12435*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12436*3ac0a46fSAndroid Build Coastguard Worker }
12437*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,OPJ_UINT32 p_tile_index,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)12438*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,
12439*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_index,
12440*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
12441*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12442*3ac0a46fSAndroid Build Coastguard Worker {
12443*3ac0a46fSAndroid Build Coastguard Worker (void)p_stream;
12444*3ac0a46fSAndroid Build Coastguard Worker if (p_tile_index != p_j2k->m_current_tile_number) {
12445*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match.");
12446*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12447*3ac0a46fSAndroid Build Coastguard Worker }
12448*3ac0a46fSAndroid Build Coastguard Worker
12449*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n",
12450*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
12451*3ac0a46fSAndroid Build Coastguard Worker
12452*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
12453*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
12454*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
12455*3ac0a46fSAndroid Build Coastguard Worker
12456*3ac0a46fSAndroid Build Coastguard Worker /* initialisation before tile encoding */
12457*3ac0a46fSAndroid Build Coastguard Worker if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
12458*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
12459*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12460*3ac0a46fSAndroid Build Coastguard Worker }
12461*3ac0a46fSAndroid Build Coastguard Worker
12462*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12463*3ac0a46fSAndroid Build Coastguard Worker }
12464*3ac0a46fSAndroid Build Coastguard Worker
opj_get_tile_dimensions(opj_image_t * l_image,opj_tcd_tilecomp_t * l_tilec,opj_image_comp_t * l_img_comp,OPJ_UINT32 * l_size_comp,OPJ_UINT32 * l_width,OPJ_UINT32 * l_height,OPJ_UINT32 * l_offset_x,OPJ_UINT32 * l_offset_y,OPJ_UINT32 * l_image_width,OPJ_UINT32 * l_stride,OPJ_UINT32 * l_tile_offset)12465*3ac0a46fSAndroid Build Coastguard Worker static void opj_get_tile_dimensions(opj_image_t * l_image,
12466*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t * l_tilec,
12467*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp,
12468*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_size_comp,
12469*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_width,
12470*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_height,
12471*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_offset_x,
12472*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_offset_y,
12473*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_image_width,
12474*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_stride,
12475*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* l_tile_offset)
12476*3ac0a46fSAndroid Build Coastguard Worker {
12477*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_remaining;
12478*3ac0a46fSAndroid Build Coastguard Worker *l_size_comp = l_img_comp->prec >> 3; /* (/8) */
12479*3ac0a46fSAndroid Build Coastguard Worker l_remaining = l_img_comp->prec & 7; /* (%8) */
12480*3ac0a46fSAndroid Build Coastguard Worker if (l_remaining) {
12481*3ac0a46fSAndroid Build Coastguard Worker *l_size_comp += 1;
12482*3ac0a46fSAndroid Build Coastguard Worker }
12483*3ac0a46fSAndroid Build Coastguard Worker
12484*3ac0a46fSAndroid Build Coastguard Worker if (*l_size_comp == 3) {
12485*3ac0a46fSAndroid Build Coastguard Worker *l_size_comp = 4;
12486*3ac0a46fSAndroid Build Coastguard Worker }
12487*3ac0a46fSAndroid Build Coastguard Worker
12488*3ac0a46fSAndroid Build Coastguard Worker *l_width = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
12489*3ac0a46fSAndroid Build Coastguard Worker *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
12490*3ac0a46fSAndroid Build Coastguard Worker *l_offset_x = opj_uint_ceildiv(l_image->x0, l_img_comp->dx);
12491*3ac0a46fSAndroid Build Coastguard Worker *l_offset_y = opj_uint_ceildiv(l_image->y0, l_img_comp->dy);
12492*3ac0a46fSAndroid Build Coastguard Worker *l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 -
12493*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
12494*3ac0a46fSAndroid Build Coastguard Worker *l_stride = *l_image_width - *l_width;
12495*3ac0a46fSAndroid Build Coastguard Worker *l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((
12496*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width;
12497*3ac0a46fSAndroid Build Coastguard Worker }
12498*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_get_tile_data(opj_tcd_t * p_tcd,OPJ_BYTE * p_data)12499*3ac0a46fSAndroid Build Coastguard Worker static void opj_j2k_get_tile_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
12500*3ac0a46fSAndroid Build Coastguard Worker {
12501*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j, k = 0;
12502*3ac0a46fSAndroid Build Coastguard Worker
12503*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < p_tcd->image->numcomps; ++i) {
12504*3ac0a46fSAndroid Build Coastguard Worker opj_image_t * l_image = p_tcd->image;
12505*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * l_src_ptr;
12506*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t * l_tilec = p_tcd->tcd_image->tiles->comps + i;
12507*3ac0a46fSAndroid Build Coastguard Worker opj_image_comp_t * l_img_comp = l_image->comps + i;
12508*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_size_comp, l_width, l_height, l_offset_x, l_offset_y,
12509*3ac0a46fSAndroid Build Coastguard Worker l_image_width, l_stride, l_tile_offset;
12510*3ac0a46fSAndroid Build Coastguard Worker
12511*3ac0a46fSAndroid Build Coastguard Worker opj_get_tile_dimensions(l_image,
12512*3ac0a46fSAndroid Build Coastguard Worker l_tilec,
12513*3ac0a46fSAndroid Build Coastguard Worker l_img_comp,
12514*3ac0a46fSAndroid Build Coastguard Worker &l_size_comp,
12515*3ac0a46fSAndroid Build Coastguard Worker &l_width,
12516*3ac0a46fSAndroid Build Coastguard Worker &l_height,
12517*3ac0a46fSAndroid Build Coastguard Worker &l_offset_x,
12518*3ac0a46fSAndroid Build Coastguard Worker &l_offset_y,
12519*3ac0a46fSAndroid Build Coastguard Worker &l_image_width,
12520*3ac0a46fSAndroid Build Coastguard Worker &l_stride,
12521*3ac0a46fSAndroid Build Coastguard Worker &l_tile_offset);
12522*3ac0a46fSAndroid Build Coastguard Worker
12523*3ac0a46fSAndroid Build Coastguard Worker l_src_ptr = l_img_comp->data + l_tile_offset;
12524*3ac0a46fSAndroid Build Coastguard Worker
12525*3ac0a46fSAndroid Build Coastguard Worker switch (l_size_comp) {
12526*3ac0a46fSAndroid Build Coastguard Worker case 1: {
12527*3ac0a46fSAndroid Build Coastguard Worker OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
12528*3ac0a46fSAndroid Build Coastguard Worker if (l_img_comp->sgnd) {
12529*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_height; ++j) {
12530*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < l_width; ++k) {
12531*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_ptr) = (OPJ_CHAR)(*l_src_ptr);
12532*3ac0a46fSAndroid Build Coastguard Worker ++l_dest_ptr;
12533*3ac0a46fSAndroid Build Coastguard Worker ++l_src_ptr;
12534*3ac0a46fSAndroid Build Coastguard Worker }
12535*3ac0a46fSAndroid Build Coastguard Worker l_src_ptr += l_stride;
12536*3ac0a46fSAndroid Build Coastguard Worker }
12537*3ac0a46fSAndroid Build Coastguard Worker } else {
12538*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_height; ++j) {
12539*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < l_width; ++k) {
12540*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr) & 0xff);
12541*3ac0a46fSAndroid Build Coastguard Worker ++l_dest_ptr;
12542*3ac0a46fSAndroid Build Coastguard Worker ++l_src_ptr;
12543*3ac0a46fSAndroid Build Coastguard Worker }
12544*3ac0a46fSAndroid Build Coastguard Worker l_src_ptr += l_stride;
12545*3ac0a46fSAndroid Build Coastguard Worker }
12546*3ac0a46fSAndroid Build Coastguard Worker }
12547*3ac0a46fSAndroid Build Coastguard Worker
12548*3ac0a46fSAndroid Build Coastguard Worker p_data = (OPJ_BYTE*) l_dest_ptr;
12549*3ac0a46fSAndroid Build Coastguard Worker }
12550*3ac0a46fSAndroid Build Coastguard Worker break;
12551*3ac0a46fSAndroid Build Coastguard Worker case 2: {
12552*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
12553*3ac0a46fSAndroid Build Coastguard Worker if (l_img_comp->sgnd) {
12554*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_height; ++j) {
12555*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < l_width; ++k) {
12556*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_ptr++) = (OPJ_INT16)(*(l_src_ptr++));
12557*3ac0a46fSAndroid Build Coastguard Worker }
12558*3ac0a46fSAndroid Build Coastguard Worker l_src_ptr += l_stride;
12559*3ac0a46fSAndroid Build Coastguard Worker }
12560*3ac0a46fSAndroid Build Coastguard Worker } else {
12561*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_height; ++j) {
12562*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < l_width; ++k) {
12563*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
12564*3ac0a46fSAndroid Build Coastguard Worker }
12565*3ac0a46fSAndroid Build Coastguard Worker l_src_ptr += l_stride;
12566*3ac0a46fSAndroid Build Coastguard Worker }
12567*3ac0a46fSAndroid Build Coastguard Worker }
12568*3ac0a46fSAndroid Build Coastguard Worker
12569*3ac0a46fSAndroid Build Coastguard Worker p_data = (OPJ_BYTE*) l_dest_ptr;
12570*3ac0a46fSAndroid Build Coastguard Worker }
12571*3ac0a46fSAndroid Build Coastguard Worker break;
12572*3ac0a46fSAndroid Build Coastguard Worker case 4: {
12573*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
12574*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < l_height; ++j) {
12575*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < l_width; ++k) {
12576*3ac0a46fSAndroid Build Coastguard Worker *(l_dest_ptr++) = *(l_src_ptr++);
12577*3ac0a46fSAndroid Build Coastguard Worker }
12578*3ac0a46fSAndroid Build Coastguard Worker l_src_ptr += l_stride;
12579*3ac0a46fSAndroid Build Coastguard Worker }
12580*3ac0a46fSAndroid Build Coastguard Worker
12581*3ac0a46fSAndroid Build Coastguard Worker p_data = (OPJ_BYTE*) l_dest_ptr;
12582*3ac0a46fSAndroid Build Coastguard Worker }
12583*3ac0a46fSAndroid Build Coastguard Worker break;
12584*3ac0a46fSAndroid Build Coastguard Worker }
12585*3ac0a46fSAndroid Build Coastguard Worker }
12586*3ac0a46fSAndroid Build Coastguard Worker }
12587*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_post_write_tile(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)12588*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_post_write_tile(opj_j2k_t * p_j2k,
12589*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
12590*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12591*3ac0a46fSAndroid Build Coastguard Worker {
12592*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_bytes_written;
12593*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_current_data = 00;
12594*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tile_size = 0;
12595*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_available_data;
12596*3ac0a46fSAndroid Build Coastguard Worker
12597*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
12598*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
12599*3ac0a46fSAndroid Build Coastguard Worker
12600*3ac0a46fSAndroid Build Coastguard Worker l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
12601*3ac0a46fSAndroid Build Coastguard Worker l_available_data = l_tile_size;
12602*3ac0a46fSAndroid Build Coastguard Worker l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
12603*3ac0a46fSAndroid Build Coastguard Worker
12604*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written = 0;
12605*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_first_tile_part(p_j2k, l_current_data, &l_nb_bytes_written,
12606*3ac0a46fSAndroid Build Coastguard Worker l_available_data, p_stream, p_manager)) {
12607*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12608*3ac0a46fSAndroid Build Coastguard Worker }
12609*3ac0a46fSAndroid Build Coastguard Worker l_current_data += l_nb_bytes_written;
12610*3ac0a46fSAndroid Build Coastguard Worker l_available_data -= l_nb_bytes_written;
12611*3ac0a46fSAndroid Build Coastguard Worker
12612*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written = 0;
12613*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_all_tile_parts(p_j2k, l_current_data, &l_nb_bytes_written,
12614*3ac0a46fSAndroid Build Coastguard Worker l_available_data, p_stream, p_manager)) {
12615*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12616*3ac0a46fSAndroid Build Coastguard Worker }
12617*3ac0a46fSAndroid Build Coastguard Worker
12618*3ac0a46fSAndroid Build Coastguard Worker l_available_data -= l_nb_bytes_written;
12619*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written = l_tile_size - l_available_data;
12620*3ac0a46fSAndroid Build Coastguard Worker
12621*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
12622*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
12623*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written, p_manager) != l_nb_bytes_written) {
12624*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12625*3ac0a46fSAndroid Build Coastguard Worker }
12626*3ac0a46fSAndroid Build Coastguard Worker
12627*3ac0a46fSAndroid Build Coastguard Worker ++p_j2k->m_current_tile_number;
12628*3ac0a46fSAndroid Build Coastguard Worker
12629*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12630*3ac0a46fSAndroid Build Coastguard Worker }
12631*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_setup_end_compress(opj_j2k_t * p_j2k,opj_event_mgr_t * p_manager)12632*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
12633*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12634*3ac0a46fSAndroid Build Coastguard Worker {
12635*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
12636*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
12637*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
12638*3ac0a46fSAndroid Build Coastguard Worker
12639*3ac0a46fSAndroid Build Coastguard Worker /* DEVELOPER CORNER, insert your custom procedures */
12640*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12641*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_eoc, p_manager)) {
12642*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12643*3ac0a46fSAndroid Build Coastguard Worker }
12644*3ac0a46fSAndroid Build Coastguard Worker
12645*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_TLM) {
12646*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12647*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_updated_tlm, p_manager)) {
12648*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12649*3ac0a46fSAndroid Build Coastguard Worker }
12650*3ac0a46fSAndroid Build Coastguard Worker }
12651*3ac0a46fSAndroid Build Coastguard Worker
12652*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12653*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_epc, p_manager)) {
12654*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12655*3ac0a46fSAndroid Build Coastguard Worker }
12656*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12657*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_end_encoding, p_manager)) {
12658*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12659*3ac0a46fSAndroid Build Coastguard Worker }
12660*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12661*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_destroy_header_memory, p_manager)) {
12662*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12663*3ac0a46fSAndroid Build Coastguard Worker }
12664*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12665*3ac0a46fSAndroid Build Coastguard Worker }
12666*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_setup_encoding_validation(opj_j2k_t * p_j2k,opj_event_mgr_t * p_manager)12667*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
12668*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12669*3ac0a46fSAndroid Build Coastguard Worker {
12670*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
12671*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
12672*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
12673*3ac0a46fSAndroid Build Coastguard Worker
12674*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
12675*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_build_encoder, p_manager)) {
12676*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12677*3ac0a46fSAndroid Build Coastguard Worker }
12678*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
12679*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_encoding_validation, p_manager)) {
12680*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12681*3ac0a46fSAndroid Build Coastguard Worker }
12682*3ac0a46fSAndroid Build Coastguard Worker
12683*3ac0a46fSAndroid Build Coastguard Worker /* DEVELOPER CORNER, add your custom validation procedure */
12684*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
12685*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_mct_validation, p_manager)) {
12686*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12687*3ac0a46fSAndroid Build Coastguard Worker }
12688*3ac0a46fSAndroid Build Coastguard Worker
12689*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12690*3ac0a46fSAndroid Build Coastguard Worker }
12691*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_setup_header_writing(opj_j2k_t * p_j2k,opj_event_mgr_t * p_manager)12692*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
12693*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
12694*3ac0a46fSAndroid Build Coastguard Worker {
12695*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
12696*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
12697*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
12698*3ac0a46fSAndroid Build Coastguard Worker
12699*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12700*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_init_info, p_manager)) {
12701*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12702*3ac0a46fSAndroid Build Coastguard Worker }
12703*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12704*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_soc, p_manager)) {
12705*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12706*3ac0a46fSAndroid Build Coastguard Worker }
12707*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12708*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_siz, p_manager)) {
12709*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12710*3ac0a46fSAndroid Build Coastguard Worker }
12711*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12712*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_cod, p_manager)) {
12713*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12714*3ac0a46fSAndroid Build Coastguard Worker }
12715*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12716*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_qcd, p_manager)) {
12717*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12718*3ac0a46fSAndroid Build Coastguard Worker }
12719*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12720*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_all_coc, p_manager)) {
12721*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12722*3ac0a46fSAndroid Build Coastguard Worker }
12723*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12724*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_all_qcc, p_manager)) {
12725*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12726*3ac0a46fSAndroid Build Coastguard Worker }
12727*3ac0a46fSAndroid Build Coastguard Worker
12728*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_TLM) {
12729*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12730*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_tlm, p_manager)) {
12731*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12732*3ac0a46fSAndroid Build Coastguard Worker }
12733*3ac0a46fSAndroid Build Coastguard Worker
12734*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) {
12735*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12736*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_poc, p_manager)) {
12737*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12738*3ac0a46fSAndroid Build Coastguard Worker }
12739*3ac0a46fSAndroid Build Coastguard Worker }
12740*3ac0a46fSAndroid Build Coastguard Worker }
12741*3ac0a46fSAndroid Build Coastguard Worker
12742*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12743*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_regions, p_manager)) {
12744*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12745*3ac0a46fSAndroid Build Coastguard Worker }
12746*3ac0a46fSAndroid Build Coastguard Worker
12747*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_cp.comment != 00) {
12748*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12749*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_com, p_manager)) {
12750*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12751*3ac0a46fSAndroid Build Coastguard Worker }
12752*3ac0a46fSAndroid Build Coastguard Worker }
12753*3ac0a46fSAndroid Build Coastguard Worker
12754*3ac0a46fSAndroid Build Coastguard Worker /* DEVELOPER CORNER, insert your custom procedures */
12755*3ac0a46fSAndroid Build Coastguard Worker if ((p_j2k->m_cp.rsiz & (OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT)) ==
12756*3ac0a46fSAndroid Build Coastguard Worker (OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT)) {
12757*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12758*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_write_mct_data_group, p_manager)) {
12759*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12760*3ac0a46fSAndroid Build Coastguard Worker }
12761*3ac0a46fSAndroid Build Coastguard Worker }
12762*3ac0a46fSAndroid Build Coastguard Worker /* End of Developer Corner */
12763*3ac0a46fSAndroid Build Coastguard Worker
12764*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->cstr_index) {
12765*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12766*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_get_end_header, p_manager)) {
12767*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12768*3ac0a46fSAndroid Build Coastguard Worker }
12769*3ac0a46fSAndroid Build Coastguard Worker }
12770*3ac0a46fSAndroid Build Coastguard Worker
12771*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12772*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_create_tcd, p_manager)) {
12773*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12774*3ac0a46fSAndroid Build Coastguard Worker }
12775*3ac0a46fSAndroid Build Coastguard Worker if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
12776*3ac0a46fSAndroid Build Coastguard Worker (opj_procedure)opj_j2k_update_rates, p_manager)) {
12777*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12778*3ac0a46fSAndroid Build Coastguard Worker }
12779*3ac0a46fSAndroid Build Coastguard Worker
12780*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12781*3ac0a46fSAndroid Build Coastguard Worker }
12782*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_first_tile_part(opj_j2k_t * p_j2k,OPJ_BYTE * p_data,OPJ_UINT32 * p_data_written,OPJ_UINT32 total_data_size,opj_stream_private_t * p_stream,struct opj_event_mgr * p_manager)12783*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_first_tile_part(opj_j2k_t *p_j2k,
12784*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
12785*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
12786*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 total_data_size,
12787*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
12788*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
12789*3ac0a46fSAndroid Build Coastguard Worker {
12790*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_bytes_written = 0;
12791*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_nb_bytes_written;
12792*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_begin_data = 00;
12793*3ac0a46fSAndroid Build Coastguard Worker
12794*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_t * l_tcd = 00;
12795*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t * l_cp = 00;
12796*3ac0a46fSAndroid Build Coastguard Worker
12797*3ac0a46fSAndroid Build Coastguard Worker l_tcd = p_j2k->m_tcd;
12798*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
12799*3ac0a46fSAndroid Build Coastguard Worker
12800*3ac0a46fSAndroid Build Coastguard Worker l_tcd->cur_pino = 0;
12801*3ac0a46fSAndroid Build Coastguard Worker
12802*3ac0a46fSAndroid Build Coastguard Worker /*Get number of tile parts*/
12803*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
12804*3ac0a46fSAndroid Build Coastguard Worker
12805*3ac0a46fSAndroid Build Coastguard Worker /* INDEX >> */
12806*3ac0a46fSAndroid Build Coastguard Worker /* << INDEX */
12807*3ac0a46fSAndroid Build Coastguard Worker
12808*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12809*3ac0a46fSAndroid Build Coastguard Worker l_begin_data = p_data;
12810*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_sot(p_j2k, p_data, total_data_size,
12811*3ac0a46fSAndroid Build Coastguard Worker &l_current_nb_bytes_written, p_stream,
12812*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
12813*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12814*3ac0a46fSAndroid Build Coastguard Worker }
12815*3ac0a46fSAndroid Build Coastguard Worker
12816*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12817*3ac0a46fSAndroid Build Coastguard Worker p_data += l_current_nb_bytes_written;
12818*3ac0a46fSAndroid Build Coastguard Worker total_data_size -= l_current_nb_bytes_written;
12819*3ac0a46fSAndroid Build Coastguard Worker
12820*3ac0a46fSAndroid Build Coastguard Worker if (!OPJ_IS_CINEMA(l_cp->rsiz)) {
12821*3ac0a46fSAndroid Build Coastguard Worker #if 0
12822*3ac0a46fSAndroid Build Coastguard Worker for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
12823*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12824*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_coc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
12825*3ac0a46fSAndroid Build Coastguard Worker p_manager);
12826*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12827*3ac0a46fSAndroid Build Coastguard Worker p_data += l_current_nb_bytes_written;
12828*3ac0a46fSAndroid Build Coastguard Worker total_data_size -= l_current_nb_bytes_written;
12829*3ac0a46fSAndroid Build Coastguard Worker
12830*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12831*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_qcc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
12832*3ac0a46fSAndroid Build Coastguard Worker p_manager);
12833*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12834*3ac0a46fSAndroid Build Coastguard Worker p_data += l_current_nb_bytes_written;
12835*3ac0a46fSAndroid Build Coastguard Worker total_data_size -= l_current_nb_bytes_written;
12836*3ac0a46fSAndroid Build Coastguard Worker }
12837*3ac0a46fSAndroid Build Coastguard Worker #endif
12838*3ac0a46fSAndroid Build Coastguard Worker if (l_cp->tcps[p_j2k->m_current_tile_number].POC) {
12839*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12840*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_write_poc_in_memory(p_j2k, p_data, &l_current_nb_bytes_written,
12841*3ac0a46fSAndroid Build Coastguard Worker p_manager);
12842*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12843*3ac0a46fSAndroid Build Coastguard Worker p_data += l_current_nb_bytes_written;
12844*3ac0a46fSAndroid Build Coastguard Worker total_data_size -= l_current_nb_bytes_written;
12845*3ac0a46fSAndroid Build Coastguard Worker }
12846*3ac0a46fSAndroid Build Coastguard Worker }
12847*3ac0a46fSAndroid Build Coastguard Worker
12848*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12849*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
12850*3ac0a46fSAndroid Build Coastguard Worker total_data_size, p_stream, p_manager)) {
12851*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12852*3ac0a46fSAndroid Build Coastguard Worker }
12853*3ac0a46fSAndroid Build Coastguard Worker
12854*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12855*3ac0a46fSAndroid Build Coastguard Worker * p_data_written = l_nb_bytes_written;
12856*3ac0a46fSAndroid Build Coastguard Worker
12857*3ac0a46fSAndroid Build Coastguard Worker /* Writing Psot in SOT marker */
12858*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_begin_data + 6, l_nb_bytes_written,
12859*3ac0a46fSAndroid Build Coastguard Worker 4); /* PSOT */
12860*3ac0a46fSAndroid Build Coastguard Worker
12861*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_TLM) {
12862*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_update_tlm(p_j2k, l_nb_bytes_written);
12863*3ac0a46fSAndroid Build Coastguard Worker }
12864*3ac0a46fSAndroid Build Coastguard Worker
12865*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12866*3ac0a46fSAndroid Build Coastguard Worker }
12867*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_all_tile_parts(opj_j2k_t * p_j2k,OPJ_BYTE * p_data,OPJ_UINT32 * p_data_written,OPJ_UINT32 total_data_size,opj_stream_private_t * p_stream,struct opj_event_mgr * p_manager)12868*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_all_tile_parts(opj_j2k_t *p_j2k,
12869*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
12870*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 * p_data_written,
12871*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 total_data_size,
12872*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
12873*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager
12874*3ac0a46fSAndroid Build Coastguard Worker )
12875*3ac0a46fSAndroid Build Coastguard Worker {
12876*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tilepartno = 0;
12877*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_nb_bytes_written = 0;
12878*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_current_nb_bytes_written;
12879*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_part_tile_size;
12880*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tot_num_tp;
12881*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 pino;
12882*3ac0a46fSAndroid Build Coastguard Worker
12883*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * l_begin_data;
12884*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *l_tcp = 00;
12885*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_t * l_tcd = 00;
12886*3ac0a46fSAndroid Build Coastguard Worker opj_cp_t * l_cp = 00;
12887*3ac0a46fSAndroid Build Coastguard Worker
12888*3ac0a46fSAndroid Build Coastguard Worker l_tcd = p_j2k->m_tcd;
12889*3ac0a46fSAndroid Build Coastguard Worker l_cp = &(p_j2k->m_cp);
12890*3ac0a46fSAndroid Build Coastguard Worker l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
12891*3ac0a46fSAndroid Build Coastguard Worker
12892*3ac0a46fSAndroid Build Coastguard Worker /*Get number of tile parts*/
12893*3ac0a46fSAndroid Build Coastguard Worker tot_num_tp = opj_j2k_get_num_tp(l_cp, 0, p_j2k->m_current_tile_number);
12894*3ac0a46fSAndroid Build Coastguard Worker
12895*3ac0a46fSAndroid Build Coastguard Worker /* start writing remaining tile parts */
12896*3ac0a46fSAndroid Build Coastguard Worker ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
12897*3ac0a46fSAndroid Build Coastguard Worker for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
12898*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
12899*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12900*3ac0a46fSAndroid Build Coastguard Worker l_part_tile_size = 0;
12901*3ac0a46fSAndroid Build Coastguard Worker l_begin_data = p_data;
12902*3ac0a46fSAndroid Build Coastguard Worker
12903*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_sot(p_j2k, p_data,
12904*3ac0a46fSAndroid Build Coastguard Worker total_data_size,
12905*3ac0a46fSAndroid Build Coastguard Worker &l_current_nb_bytes_written,
12906*3ac0a46fSAndroid Build Coastguard Worker p_stream,
12907*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
12908*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12909*3ac0a46fSAndroid Build Coastguard Worker }
12910*3ac0a46fSAndroid Build Coastguard Worker
12911*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12912*3ac0a46fSAndroid Build Coastguard Worker p_data += l_current_nb_bytes_written;
12913*3ac0a46fSAndroid Build Coastguard Worker total_data_size -= l_current_nb_bytes_written;
12914*3ac0a46fSAndroid Build Coastguard Worker l_part_tile_size += l_current_nb_bytes_written;
12915*3ac0a46fSAndroid Build Coastguard Worker
12916*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12917*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
12918*3ac0a46fSAndroid Build Coastguard Worker total_data_size, p_stream, p_manager)) {
12919*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12920*3ac0a46fSAndroid Build Coastguard Worker }
12921*3ac0a46fSAndroid Build Coastguard Worker
12922*3ac0a46fSAndroid Build Coastguard Worker p_data += l_current_nb_bytes_written;
12923*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12924*3ac0a46fSAndroid Build Coastguard Worker total_data_size -= l_current_nb_bytes_written;
12925*3ac0a46fSAndroid Build Coastguard Worker l_part_tile_size += l_current_nb_bytes_written;
12926*3ac0a46fSAndroid Build Coastguard Worker
12927*3ac0a46fSAndroid Build Coastguard Worker /* Writing Psot in SOT marker */
12928*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_begin_data + 6, l_part_tile_size,
12929*3ac0a46fSAndroid Build Coastguard Worker 4); /* PSOT */
12930*3ac0a46fSAndroid Build Coastguard Worker
12931*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_TLM) {
12932*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_update_tlm(p_j2k, l_part_tile_size);
12933*3ac0a46fSAndroid Build Coastguard Worker }
12934*3ac0a46fSAndroid Build Coastguard Worker
12935*3ac0a46fSAndroid Build Coastguard Worker ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
12936*3ac0a46fSAndroid Build Coastguard Worker }
12937*3ac0a46fSAndroid Build Coastguard Worker
12938*3ac0a46fSAndroid Build Coastguard Worker for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
12939*3ac0a46fSAndroid Build Coastguard Worker l_tcd->cur_pino = pino;
12940*3ac0a46fSAndroid Build Coastguard Worker
12941*3ac0a46fSAndroid Build Coastguard Worker /*Get number of tile parts*/
12942*3ac0a46fSAndroid Build Coastguard Worker tot_num_tp = opj_j2k_get_num_tp(l_cp, pino, p_j2k->m_current_tile_number);
12943*3ac0a46fSAndroid Build Coastguard Worker for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
12944*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
12945*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12946*3ac0a46fSAndroid Build Coastguard Worker l_part_tile_size = 0;
12947*3ac0a46fSAndroid Build Coastguard Worker l_begin_data = p_data;
12948*3ac0a46fSAndroid Build Coastguard Worker
12949*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_sot(p_j2k, p_data,
12950*3ac0a46fSAndroid Build Coastguard Worker total_data_size,
12951*3ac0a46fSAndroid Build Coastguard Worker &l_current_nb_bytes_written, p_stream,
12952*3ac0a46fSAndroid Build Coastguard Worker p_manager)) {
12953*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12954*3ac0a46fSAndroid Build Coastguard Worker }
12955*3ac0a46fSAndroid Build Coastguard Worker
12956*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12957*3ac0a46fSAndroid Build Coastguard Worker p_data += l_current_nb_bytes_written;
12958*3ac0a46fSAndroid Build Coastguard Worker total_data_size -= l_current_nb_bytes_written;
12959*3ac0a46fSAndroid Build Coastguard Worker l_part_tile_size += l_current_nb_bytes_written;
12960*3ac0a46fSAndroid Build Coastguard Worker
12961*3ac0a46fSAndroid Build Coastguard Worker l_current_nb_bytes_written = 0;
12962*3ac0a46fSAndroid Build Coastguard Worker
12963*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
12964*3ac0a46fSAndroid Build Coastguard Worker total_data_size, p_stream, p_manager)) {
12965*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
12966*3ac0a46fSAndroid Build Coastguard Worker }
12967*3ac0a46fSAndroid Build Coastguard Worker
12968*3ac0a46fSAndroid Build Coastguard Worker l_nb_bytes_written += l_current_nb_bytes_written;
12969*3ac0a46fSAndroid Build Coastguard Worker p_data += l_current_nb_bytes_written;
12970*3ac0a46fSAndroid Build Coastguard Worker total_data_size -= l_current_nb_bytes_written;
12971*3ac0a46fSAndroid Build Coastguard Worker l_part_tile_size += l_current_nb_bytes_written;
12972*3ac0a46fSAndroid Build Coastguard Worker
12973*3ac0a46fSAndroid Build Coastguard Worker /* Writing Psot in SOT marker */
12974*3ac0a46fSAndroid Build Coastguard Worker opj_write_bytes(l_begin_data + 6, l_part_tile_size,
12975*3ac0a46fSAndroid Build Coastguard Worker 4); /* PSOT */
12976*3ac0a46fSAndroid Build Coastguard Worker
12977*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_TLM) {
12978*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_update_tlm(p_j2k, l_part_tile_size);
12979*3ac0a46fSAndroid Build Coastguard Worker }
12980*3ac0a46fSAndroid Build Coastguard Worker
12981*3ac0a46fSAndroid Build Coastguard Worker ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
12982*3ac0a46fSAndroid Build Coastguard Worker }
12983*3ac0a46fSAndroid Build Coastguard Worker }
12984*3ac0a46fSAndroid Build Coastguard Worker
12985*3ac0a46fSAndroid Build Coastguard Worker *p_data_written = l_nb_bytes_written;
12986*3ac0a46fSAndroid Build Coastguard Worker
12987*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
12988*3ac0a46fSAndroid Build Coastguard Worker }
12989*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_updated_tlm(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)12990*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_write_updated_tlm(opj_j2k_t *p_j2k,
12991*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
12992*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
12993*3ac0a46fSAndroid Build Coastguard Worker {
12994*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l_tlm_size;
12995*3ac0a46fSAndroid Build Coastguard Worker OPJ_OFF_T l_tlm_position, l_current_position;
12996*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 size_per_tile_part;
12997*3ac0a46fSAndroid Build Coastguard Worker
12998*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
12999*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
13000*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
13001*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
13002*3ac0a46fSAndroid Build Coastguard Worker
13003*3ac0a46fSAndroid Build Coastguard Worker size_per_tile_part = p_j2k->m_specific_param.m_encoder.m_Ttlmi_is_byte ? 5 : 6;
13004*3ac0a46fSAndroid Build Coastguard Worker l_tlm_size = size_per_tile_part *
13005*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
13006*3ac0a46fSAndroid Build Coastguard Worker l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
13007*3ac0a46fSAndroid Build Coastguard Worker l_current_position = opj_stream_tell(p_stream);
13008*3ac0a46fSAndroid Build Coastguard Worker
13009*3ac0a46fSAndroid Build Coastguard Worker if (! opj_stream_seek(p_stream, l_tlm_position, p_manager)) {
13010*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13011*3ac0a46fSAndroid Build Coastguard Worker }
13012*3ac0a46fSAndroid Build Coastguard Worker
13013*3ac0a46fSAndroid Build Coastguard Worker if (opj_stream_write_data(p_stream,
13014*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer, l_tlm_size,
13015*3ac0a46fSAndroid Build Coastguard Worker p_manager) != l_tlm_size) {
13016*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13017*3ac0a46fSAndroid Build Coastguard Worker }
13018*3ac0a46fSAndroid Build Coastguard Worker
13019*3ac0a46fSAndroid Build Coastguard Worker if (! opj_stream_seek(p_stream, l_current_position, p_manager)) {
13020*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13021*3ac0a46fSAndroid Build Coastguard Worker }
13022*3ac0a46fSAndroid Build Coastguard Worker
13023*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
13024*3ac0a46fSAndroid Build Coastguard Worker }
13025*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_end_encoding(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)13026*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
13027*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
13028*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
13029*3ac0a46fSAndroid Build Coastguard Worker {
13030*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
13031*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
13032*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
13033*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
13034*3ac0a46fSAndroid Build Coastguard Worker
13035*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
13036*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
13037*3ac0a46fSAndroid Build Coastguard Worker
13038*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_destroy(p_j2k->m_tcd);
13039*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd = 00;
13040*3ac0a46fSAndroid Build Coastguard Worker
13041*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
13042*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
13043*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
13044*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
13045*3ac0a46fSAndroid Build Coastguard Worker }
13046*3ac0a46fSAndroid Build Coastguard Worker
13047*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
13048*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
13049*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
13050*3ac0a46fSAndroid Build Coastguard Worker }
13051*3ac0a46fSAndroid Build Coastguard Worker
13052*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
13053*3ac0a46fSAndroid Build Coastguard Worker
13054*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
13055*3ac0a46fSAndroid Build Coastguard Worker }
13056*3ac0a46fSAndroid Build Coastguard Worker
13057*3ac0a46fSAndroid Build Coastguard Worker /**
13058*3ac0a46fSAndroid Build Coastguard Worker * Destroys the memory associated with the decoding of headers.
13059*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)13060*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,
13061*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
13062*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
13063*3ac0a46fSAndroid Build Coastguard Worker )
13064*3ac0a46fSAndroid Build Coastguard Worker {
13065*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
13066*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
13067*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
13068*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
13069*3ac0a46fSAndroid Build Coastguard Worker
13070*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
13071*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_manager);
13072*3ac0a46fSAndroid Build Coastguard Worker
13073*3ac0a46fSAndroid Build Coastguard Worker if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
13074*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
13075*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
13076*3ac0a46fSAndroid Build Coastguard Worker }
13077*3ac0a46fSAndroid Build Coastguard Worker
13078*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
13079*3ac0a46fSAndroid Build Coastguard Worker
13080*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
13081*3ac0a46fSAndroid Build Coastguard Worker }
13082*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_init_info(opj_j2k_t * p_j2k,struct opj_stream_private * p_stream,struct opj_event_mgr * p_manager)13083*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
13084*3ac0a46fSAndroid Build Coastguard Worker struct opj_stream_private *p_stream,
13085*3ac0a46fSAndroid Build Coastguard Worker struct opj_event_mgr * p_manager)
13086*3ac0a46fSAndroid Build Coastguard Worker {
13087*3ac0a46fSAndroid Build Coastguard Worker opj_codestream_info_t * l_cstr_info = 00;
13088*3ac0a46fSAndroid Build Coastguard Worker
13089*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
13090*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
13091*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
13092*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
13093*3ac0a46fSAndroid Build Coastguard Worker (void)l_cstr_info;
13094*3ac0a46fSAndroid Build Coastguard Worker
13095*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
13096*3ac0a46fSAndroid Build Coastguard Worker
13097*3ac0a46fSAndroid Build Coastguard Worker /* TODO mergeV2: check this part which use cstr_info */
13098*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_info = p_j2k->cstr_info;
13099*3ac0a46fSAndroid Build Coastguard Worker
13100*3ac0a46fSAndroid Build Coastguard Worker if (l_cstr_info) {
13101*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
13102*3ac0a46fSAndroid Build Coastguard Worker 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));
13103*3ac0a46fSAndroid Build Coastguard Worker
13104*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
13105*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
13106*3ac0a46fSAndroid Build Coastguard Worker
13107*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
13108*3ac0a46fSAndroid Build Coastguard Worker
13109*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->tw = p_j2k->m_cp.tw;
13110*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->th = p_j2k->m_cp.th;
13111*3ac0a46fSAndroid Build Coastguard Worker
13112*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/ /* new version parser */
13113*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/ /* new version parser */
13114*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/ /* new version parser */
13115*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/ /* new version parser */
13116*3ac0a46fSAndroid Build Coastguard Worker
13117*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
13118*3ac0a46fSAndroid Build Coastguard Worker
13119*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
13120*3ac0a46fSAndroid Build Coastguard Worker
13121*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
13122*3ac0a46fSAndroid Build Coastguard Worker
13123*3ac0a46fSAndroid Build Coastguard Worker for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
13124*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
13125*3ac0a46fSAndroid Build Coastguard Worker }
13126*3ac0a46fSAndroid Build Coastguard Worker
13127*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->D_max = 0.0; */ /* ADD Marcela */
13128*3ac0a46fSAndroid Build Coastguard Worker
13129*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
13130*3ac0a46fSAndroid Build Coastguard Worker
13131*3ac0a46fSAndroid Build Coastguard Worker /*l_cstr_info->maxmarknum = 100;
13132*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
13133*3ac0a46fSAndroid Build Coastguard Worker l_cstr_info->marknum = 0;
13134*3ac0a46fSAndroid Build Coastguard Worker }*/
13135*3ac0a46fSAndroid Build Coastguard Worker
13136*3ac0a46fSAndroid Build Coastguard Worker return opj_j2k_calculate_tp(p_j2k, &(p_j2k->m_cp),
13137*3ac0a46fSAndroid Build Coastguard Worker &p_j2k->m_specific_param.m_encoder.m_total_tile_parts, p_j2k->m_private_image,
13138*3ac0a46fSAndroid Build Coastguard Worker p_manager);
13139*3ac0a46fSAndroid Build Coastguard Worker }
13140*3ac0a46fSAndroid Build Coastguard Worker
13141*3ac0a46fSAndroid Build Coastguard Worker /**
13142*3ac0a46fSAndroid Build Coastguard Worker * Creates a tile-coder encoder.
13143*3ac0a46fSAndroid Build Coastguard Worker *
13144*3ac0a46fSAndroid Build Coastguard Worker * @param p_stream the stream to write data to.
13145*3ac0a46fSAndroid Build Coastguard Worker * @param p_j2k J2K codec.
13146*3ac0a46fSAndroid Build Coastguard Worker * @param p_manager the user event manager.
13147*3ac0a46fSAndroid Build Coastguard Worker */
opj_j2k_create_tcd(opj_j2k_t * p_j2k,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)13148*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_j2k_create_tcd(opj_j2k_t *p_j2k,
13149*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
13150*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager
13151*3ac0a46fSAndroid Build Coastguard Worker )
13152*3ac0a46fSAndroid Build Coastguard Worker {
13153*3ac0a46fSAndroid Build Coastguard Worker /* preconditions */
13154*3ac0a46fSAndroid Build Coastguard Worker assert(p_j2k != 00);
13155*3ac0a46fSAndroid Build Coastguard Worker assert(p_manager != 00);
13156*3ac0a46fSAndroid Build Coastguard Worker assert(p_stream != 00);
13157*3ac0a46fSAndroid Build Coastguard Worker
13158*3ac0a46fSAndroid Build Coastguard Worker OPJ_UNUSED(p_stream);
13159*3ac0a46fSAndroid Build Coastguard Worker
13160*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
13161*3ac0a46fSAndroid Build Coastguard Worker
13162*3ac0a46fSAndroid Build Coastguard Worker if (! p_j2k->m_tcd) {
13163*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
13164*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13165*3ac0a46fSAndroid Build Coastguard Worker }
13166*3ac0a46fSAndroid Build Coastguard Worker
13167*3ac0a46fSAndroid Build Coastguard Worker if (!opj_tcd_init(p_j2k->m_tcd, p_j2k->m_private_image, &p_j2k->m_cp,
13168*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tp)) {
13169*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_destroy(p_j2k->m_tcd);
13170*3ac0a46fSAndroid Build Coastguard Worker p_j2k->m_tcd = 00;
13171*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13172*3ac0a46fSAndroid Build Coastguard Worker }
13173*3ac0a46fSAndroid Build Coastguard Worker
13174*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
13175*3ac0a46fSAndroid Build Coastguard Worker }
13176*3ac0a46fSAndroid Build Coastguard Worker
opj_j2k_write_tile(void * j2k,OPJ_UINT32 p_tile_index,OPJ_BYTE * p_data,OPJ_UINT32 p_data_size,opj_stream_private_t * p_stream,opj_event_mgr_t * p_manager)13177*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_j2k_write_tile(void * j2k,
13178*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_tile_index,
13179*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE * p_data,
13180*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 p_data_size,
13181*3ac0a46fSAndroid Build Coastguard Worker opj_stream_private_t *p_stream,
13182*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t * p_manager)
13183*3ac0a46fSAndroid Build Coastguard Worker {
13184*3ac0a46fSAndroid Build Coastguard Worker opj_j2k_t* p_j2k = (opj_j2k_t*)j2k;
13185*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_pre_write_tile(p_j2k, p_tile_index, p_stream, p_manager)) {
13186*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
13187*3ac0a46fSAndroid Build Coastguard Worker "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
13188*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13189*3ac0a46fSAndroid Build Coastguard Worker } else {
13190*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 j;
13191*3ac0a46fSAndroid Build Coastguard Worker /* Allocate data */
13192*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
13193*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t* l_tilec = p_j2k->m_tcd->tcd_image->tiles->comps + j;
13194*3ac0a46fSAndroid Build Coastguard Worker
13195*3ac0a46fSAndroid Build Coastguard Worker if (! opj_alloc_tile_component_data(l_tilec)) {
13196*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
13197*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13198*3ac0a46fSAndroid Build Coastguard Worker }
13199*3ac0a46fSAndroid Build Coastguard Worker }
13200*3ac0a46fSAndroid Build Coastguard Worker
13201*3ac0a46fSAndroid Build Coastguard Worker /* now copy data into the tile component */
13202*3ac0a46fSAndroid Build Coastguard Worker if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
13203*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
13204*3ac0a46fSAndroid Build Coastguard Worker "Size mismatch between tile data and sent data.");
13205*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13206*3ac0a46fSAndroid Build Coastguard Worker }
13207*3ac0a46fSAndroid Build Coastguard Worker if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
13208*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_ERROR,
13209*3ac0a46fSAndroid Build Coastguard Worker "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
13210*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
13211*3ac0a46fSAndroid Build Coastguard Worker }
13212*3ac0a46fSAndroid Build Coastguard Worker }
13213*3ac0a46fSAndroid Build Coastguard Worker
13214*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
13215*3ac0a46fSAndroid Build Coastguard Worker }
13216