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) 2007, Callum Lerwick <[email protected]>
15*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2012, Carl Hetherington
16*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2017, IntoPIX SA <[email protected]>
17*3ac0a46fSAndroid Build Coastguard Worker * All rights reserved.
18*3ac0a46fSAndroid Build Coastguard Worker *
19*3ac0a46fSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
20*3ac0a46fSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
21*3ac0a46fSAndroid Build Coastguard Worker * are met:
22*3ac0a46fSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
23*3ac0a46fSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
24*3ac0a46fSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
25*3ac0a46fSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
26*3ac0a46fSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
27*3ac0a46fSAndroid Build Coastguard Worker *
28*3ac0a46fSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
29*3ac0a46fSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30*3ac0a46fSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31*3ac0a46fSAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
32*3ac0a46fSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33*3ac0a46fSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34*3ac0a46fSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35*3ac0a46fSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36*3ac0a46fSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37*3ac0a46fSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38*3ac0a46fSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
39*3ac0a46fSAndroid Build Coastguard Worker */
40*3ac0a46fSAndroid Build Coastguard Worker
41*3ac0a46fSAndroid Build Coastguard Worker #define OPJ_SKIP_POISON
42*3ac0a46fSAndroid Build Coastguard Worker #include "opj_includes.h"
43*3ac0a46fSAndroid Build Coastguard Worker
44*3ac0a46fSAndroid Build Coastguard Worker #ifdef __SSE__
45*3ac0a46fSAndroid Build Coastguard Worker #include <xmmintrin.h>
46*3ac0a46fSAndroid Build Coastguard Worker #endif
47*3ac0a46fSAndroid Build Coastguard Worker #ifdef __SSE2__
48*3ac0a46fSAndroid Build Coastguard Worker #include <emmintrin.h>
49*3ac0a46fSAndroid Build Coastguard Worker #endif
50*3ac0a46fSAndroid Build Coastguard Worker
51*3ac0a46fSAndroid Build Coastguard Worker #if defined(__GNUC__)
52*3ac0a46fSAndroid Build Coastguard Worker #pragma GCC poison malloc calloc realloc free
53*3ac0a46fSAndroid Build Coastguard Worker #endif
54*3ac0a46fSAndroid Build Coastguard Worker
55*3ac0a46fSAndroid Build Coastguard Worker #include "t1_luts.h"
56*3ac0a46fSAndroid Build Coastguard Worker
57*3ac0a46fSAndroid Build Coastguard Worker /** @defgroup T1 T1 - Implementation of the tier-1 coding */
58*3ac0a46fSAndroid Build Coastguard Worker /*@{*/
59*3ac0a46fSAndroid Build Coastguard Worker
60*3ac0a46fSAndroid Build Coastguard Worker #define T1_FLAGS(x, y) (t1->flags[x + 1 + ((y / 4) + 1) * (t1->w+2)])
61*3ac0a46fSAndroid Build Coastguard Worker
62*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_setcurctx(curctx, ctxno) curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
63*3ac0a46fSAndroid Build Coastguard Worker
64*3ac0a46fSAndroid Build Coastguard Worker /* Macros to deal with signed integer with just MSB bit set for
65*3ac0a46fSAndroid Build Coastguard Worker * negative values (smr = signed magnitude representation) */
66*3ac0a46fSAndroid Build Coastguard Worker #define opj_smr_abs(x) (((OPJ_UINT32)(x)) & 0x7FFFFFFFU)
67*3ac0a46fSAndroid Build Coastguard Worker #define opj_smr_sign(x) (((OPJ_UINT32)(x)) >> 31)
68*3ac0a46fSAndroid Build Coastguard Worker #define opj_to_smr(x) ((x) >= 0 ? (OPJ_UINT32)(x) : ((OPJ_UINT32)(-x) | 0x80000000U))
69*3ac0a46fSAndroid Build Coastguard Worker
70*3ac0a46fSAndroid Build Coastguard Worker
71*3ac0a46fSAndroid Build Coastguard Worker /** @name Local static functions */
72*3ac0a46fSAndroid Build Coastguard Worker /*@{*/
73*3ac0a46fSAndroid Build Coastguard Worker
74*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_BYTE opj_t1_getctxno_zc(opj_mqc_t *mqc, OPJ_UINT32 f);
75*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f);
76*3ac0a46fSAndroid Build Coastguard Worker static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos);
77*3ac0a46fSAndroid Build Coastguard Worker static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos);
78*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_update_flags(opj_flag_t *flagsp, OPJ_UINT32 ci,
79*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 s, OPJ_UINT32 stride,
80*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc);
81*3ac0a46fSAndroid Build Coastguard Worker
82*3ac0a46fSAndroid Build Coastguard Worker
83*3ac0a46fSAndroid Build Coastguard Worker /**
84*3ac0a46fSAndroid Build Coastguard Worker Decode significant pass
85*3ac0a46fSAndroid Build Coastguard Worker */
86*3ac0a46fSAndroid Build Coastguard Worker
87*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_dec_sigpass_step_raw(
88*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
89*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
90*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
91*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 oneplushalf,
92*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc,
93*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 row);
94*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_dec_sigpass_step_mqc(
95*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
96*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
97*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
98*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 oneplushalf,
99*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 row,
100*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 flags_stride,
101*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc);
102*3ac0a46fSAndroid Build Coastguard Worker
103*3ac0a46fSAndroid Build Coastguard Worker /**
104*3ac0a46fSAndroid Build Coastguard Worker Encode significant pass
105*3ac0a46fSAndroid Build Coastguard Worker */
106*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_enc_sigpass(opj_t1_t *t1,
107*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
108*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *nmsedec,
109*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE type,
110*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty);
111*3ac0a46fSAndroid Build Coastguard Worker
112*3ac0a46fSAndroid Build Coastguard Worker /**
113*3ac0a46fSAndroid Build Coastguard Worker Decode significant pass
114*3ac0a46fSAndroid Build Coastguard Worker */
115*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_sigpass_raw(
116*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
117*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
118*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 cblksty);
119*3ac0a46fSAndroid Build Coastguard Worker
120*3ac0a46fSAndroid Build Coastguard Worker /**
121*3ac0a46fSAndroid Build Coastguard Worker Encode refinement pass
122*3ac0a46fSAndroid Build Coastguard Worker */
123*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_enc_refpass(opj_t1_t *t1,
124*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
125*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *nmsedec,
126*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE type);
127*3ac0a46fSAndroid Build Coastguard Worker
128*3ac0a46fSAndroid Build Coastguard Worker /**
129*3ac0a46fSAndroid Build Coastguard Worker Decode refinement pass
130*3ac0a46fSAndroid Build Coastguard Worker */
131*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_refpass_raw(
132*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
133*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno);
134*3ac0a46fSAndroid Build Coastguard Worker
135*3ac0a46fSAndroid Build Coastguard Worker
136*3ac0a46fSAndroid Build Coastguard Worker /**
137*3ac0a46fSAndroid Build Coastguard Worker Decode refinement pass
138*3ac0a46fSAndroid Build Coastguard Worker */
139*3ac0a46fSAndroid Build Coastguard Worker
140*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_dec_refpass_step_raw(
141*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
142*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
143*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
144*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 poshalf,
145*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 row);
146*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_dec_refpass_step_mqc(
147*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
148*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
149*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
150*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 poshalf,
151*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 row);
152*3ac0a46fSAndroid Build Coastguard Worker
153*3ac0a46fSAndroid Build Coastguard Worker
154*3ac0a46fSAndroid Build Coastguard Worker /**
155*3ac0a46fSAndroid Build Coastguard Worker Decode clean-up pass
156*3ac0a46fSAndroid Build Coastguard Worker */
157*3ac0a46fSAndroid Build Coastguard Worker
158*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_clnpass_step(
159*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
160*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
161*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
162*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 oneplushalf,
163*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 row,
164*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc);
165*3ac0a46fSAndroid Build Coastguard Worker
166*3ac0a46fSAndroid Build Coastguard Worker /**
167*3ac0a46fSAndroid Build Coastguard Worker Encode clean-up pass
168*3ac0a46fSAndroid Build Coastguard Worker */
169*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_enc_clnpass(
170*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
171*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
172*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *nmsedec,
173*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty);
174*3ac0a46fSAndroid Build Coastguard Worker
175*3ac0a46fSAndroid Build Coastguard Worker static OPJ_FLOAT64 opj_t1_getwmsedec(
176*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 nmsedec,
177*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno,
178*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 level,
179*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 orient,
180*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
181*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 qmfbid,
182*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 stepsize,
183*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 numcomps,
184*3ac0a46fSAndroid Build Coastguard Worker const OPJ_FLOAT64 * mct_norms,
185*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 mct_numcomps);
186*3ac0a46fSAndroid Build Coastguard Worker
187*3ac0a46fSAndroid Build Coastguard Worker /** Return "cumwmsedec" that should be used to increase tile->distotile */
188*3ac0a46fSAndroid Build Coastguard Worker static double opj_t1_encode_cblk(opj_t1_t *t1,
189*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_enc_t* cblk,
190*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 orient,
191*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno,
192*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 level,
193*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 qmfbid,
194*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 stepsize,
195*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty,
196*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 numcomps,
197*3ac0a46fSAndroid Build Coastguard Worker const OPJ_FLOAT64 * mct_norms,
198*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 mct_numcomps);
199*3ac0a46fSAndroid Build Coastguard Worker
200*3ac0a46fSAndroid Build Coastguard Worker /**
201*3ac0a46fSAndroid Build Coastguard Worker Decode 1 code-block
202*3ac0a46fSAndroid Build Coastguard Worker @param t1 T1 handle
203*3ac0a46fSAndroid Build Coastguard Worker @param cblk Code-block coding parameters
204*3ac0a46fSAndroid Build Coastguard Worker @param orient
205*3ac0a46fSAndroid Build Coastguard Worker @param roishift Region of interest shifting value
206*3ac0a46fSAndroid Build Coastguard Worker @param cblksty Code-block style
207*3ac0a46fSAndroid Build Coastguard Worker @param p_manager the event manager
208*3ac0a46fSAndroid Build Coastguard Worker @param p_manager_mutex mutex for the event manager
209*3ac0a46fSAndroid Build Coastguard Worker @param check_pterm whether PTERM correct termination should be checked
210*3ac0a46fSAndroid Build Coastguard Worker */
211*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
212*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_dec_t* cblk,
213*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 orient,
214*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 roishift,
215*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty,
216*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager,
217*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_t* p_manager_mutex,
218*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL check_pterm);
219*3ac0a46fSAndroid Build Coastguard Worker
220*3ac0a46fSAndroid Build Coastguard Worker /**
221*3ac0a46fSAndroid Build Coastguard Worker Decode 1 HT code-block
222*3ac0a46fSAndroid Build Coastguard Worker @param t1 T1 handle
223*3ac0a46fSAndroid Build Coastguard Worker @param cblk Code-block coding parameters
224*3ac0a46fSAndroid Build Coastguard Worker @param orient
225*3ac0a46fSAndroid Build Coastguard Worker @param roishift Region of interest shifting value
226*3ac0a46fSAndroid Build Coastguard Worker @param cblksty Code-block style
227*3ac0a46fSAndroid Build Coastguard Worker @param p_manager the event manager
228*3ac0a46fSAndroid Build Coastguard Worker @param p_manager_mutex mutex for the event manager
229*3ac0a46fSAndroid Build Coastguard Worker @param check_pterm whether PTERM correct termination should be checked
230*3ac0a46fSAndroid Build Coastguard Worker */
231*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_t1_ht_decode_cblk(opj_t1_t *t1,
232*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_dec_t* cblk,
233*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 orient,
234*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 roishift,
235*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty,
236*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager,
237*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_t* p_manager_mutex,
238*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL check_pterm);
239*3ac0a46fSAndroid Build Coastguard Worker
240*3ac0a46fSAndroid Build Coastguard Worker
241*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_t1_allocate_buffers(opj_t1_t *t1,
242*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 w,
243*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 h);
244*3ac0a46fSAndroid Build Coastguard Worker
245*3ac0a46fSAndroid Build Coastguard Worker /*@}*/
246*3ac0a46fSAndroid Build Coastguard Worker
247*3ac0a46fSAndroid Build Coastguard Worker /*@}*/
248*3ac0a46fSAndroid Build Coastguard Worker
249*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
250*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_getctxno_zc(opj_mqc_t * mqc,OPJ_UINT32 f)251*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_BYTE opj_t1_getctxno_zc(opj_mqc_t *mqc, OPJ_UINT32 f)
252*3ac0a46fSAndroid Build Coastguard Worker {
253*3ac0a46fSAndroid Build Coastguard Worker return mqc->lut_ctxno_zc_orient[(f & T1_SIGMA_NEIGHBOURS)];
254*3ac0a46fSAndroid Build Coastguard Worker }
255*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_getctxtno_sc_or_spb_index(OPJ_UINT32 fX,OPJ_UINT32 pfX,OPJ_UINT32 nfX,OPJ_UINT32 ci)256*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_t1_getctxtno_sc_or_spb_index(OPJ_UINT32 fX,
257*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 pfX,
258*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 nfX,
259*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ci)
260*3ac0a46fSAndroid Build Coastguard Worker {
261*3ac0a46fSAndroid Build Coastguard Worker /*
262*3ac0a46fSAndroid Build Coastguard Worker 0 pfX T1_CHI_THIS T1_LUT_SGN_W
263*3ac0a46fSAndroid Build Coastguard Worker 1 tfX T1_SIGMA_1 T1_LUT_SIG_N
264*3ac0a46fSAndroid Build Coastguard Worker 2 nfX T1_CHI_THIS T1_LUT_SGN_E
265*3ac0a46fSAndroid Build Coastguard Worker 3 tfX T1_SIGMA_3 T1_LUT_SIG_W
266*3ac0a46fSAndroid Build Coastguard Worker 4 fX T1_CHI_(THIS - 1) T1_LUT_SGN_N
267*3ac0a46fSAndroid Build Coastguard Worker 5 tfX T1_SIGMA_5 T1_LUT_SIG_E
268*3ac0a46fSAndroid Build Coastguard Worker 6 fX T1_CHI_(THIS + 1) T1_LUT_SGN_S
269*3ac0a46fSAndroid Build Coastguard Worker 7 tfX T1_SIGMA_7 T1_LUT_SIG_S
270*3ac0a46fSAndroid Build Coastguard Worker */
271*3ac0a46fSAndroid Build Coastguard Worker
272*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 lu = (fX >> (ci * 3U)) & (T1_SIGMA_1 | T1_SIGMA_3 | T1_SIGMA_5 |
273*3ac0a46fSAndroid Build Coastguard Worker T1_SIGMA_7);
274*3ac0a46fSAndroid Build Coastguard Worker
275*3ac0a46fSAndroid Build Coastguard Worker lu |= (pfX >> (T1_CHI_THIS_I + (ci * 3U))) & (1U << 0);
276*3ac0a46fSAndroid Build Coastguard Worker lu |= (nfX >> (T1_CHI_THIS_I - 2U + (ci * 3U))) & (1U << 2);
277*3ac0a46fSAndroid Build Coastguard Worker if (ci == 0U) {
278*3ac0a46fSAndroid Build Coastguard Worker lu |= (fX >> (T1_CHI_0_I - 4U)) & (1U << 4);
279*3ac0a46fSAndroid Build Coastguard Worker } else {
280*3ac0a46fSAndroid Build Coastguard Worker lu |= (fX >> (T1_CHI_1_I - 4U + ((ci - 1U) * 3U))) & (1U << 4);
281*3ac0a46fSAndroid Build Coastguard Worker }
282*3ac0a46fSAndroid Build Coastguard Worker lu |= (fX >> (T1_CHI_2_I - 6U + (ci * 3U))) & (1U << 6);
283*3ac0a46fSAndroid Build Coastguard Worker return lu;
284*3ac0a46fSAndroid Build Coastguard Worker }
285*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_getctxno_sc(OPJ_UINT32 lu)286*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 lu)
287*3ac0a46fSAndroid Build Coastguard Worker {
288*3ac0a46fSAndroid Build Coastguard Worker return lut_ctxno_sc[lu];
289*3ac0a46fSAndroid Build Coastguard Worker }
290*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_getctxno_mag(OPJ_UINT32 f)291*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f)
292*3ac0a46fSAndroid Build Coastguard Worker {
293*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tmp = (f & T1_SIGMA_NEIGHBOURS) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
294*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tmp2 = (f & T1_MU_0) ? T1_CTXNO_MAG + 2 : tmp;
295*3ac0a46fSAndroid Build Coastguard Worker return tmp2;
296*3ac0a46fSAndroid Build Coastguard Worker }
297*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_getspb(OPJ_UINT32 lu)298*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_BYTE opj_t1_getspb(OPJ_UINT32 lu)
299*3ac0a46fSAndroid Build Coastguard Worker {
300*3ac0a46fSAndroid Build Coastguard Worker return lut_spb[lu];
301*3ac0a46fSAndroid Build Coastguard Worker }
302*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_getnmsedec_sig(OPJ_UINT32 x,OPJ_UINT32 bitpos)303*3ac0a46fSAndroid Build Coastguard Worker static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos)
304*3ac0a46fSAndroid Build Coastguard Worker {
305*3ac0a46fSAndroid Build Coastguard Worker if (bitpos > 0) {
306*3ac0a46fSAndroid Build Coastguard Worker return lut_nmsedec_sig[(x >> (bitpos)) & ((1 << T1_NMSEDEC_BITS) - 1)];
307*3ac0a46fSAndroid Build Coastguard Worker }
308*3ac0a46fSAndroid Build Coastguard Worker
309*3ac0a46fSAndroid Build Coastguard Worker return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
310*3ac0a46fSAndroid Build Coastguard Worker }
311*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_getnmsedec_ref(OPJ_UINT32 x,OPJ_UINT32 bitpos)312*3ac0a46fSAndroid Build Coastguard Worker static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos)
313*3ac0a46fSAndroid Build Coastguard Worker {
314*3ac0a46fSAndroid Build Coastguard Worker if (bitpos > 0) {
315*3ac0a46fSAndroid Build Coastguard Worker return lut_nmsedec_ref[(x >> (bitpos)) & ((1 << T1_NMSEDEC_BITS) - 1)];
316*3ac0a46fSAndroid Build Coastguard Worker }
317*3ac0a46fSAndroid Build Coastguard Worker
318*3ac0a46fSAndroid Build Coastguard Worker return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
319*3ac0a46fSAndroid Build Coastguard Worker }
320*3ac0a46fSAndroid Build Coastguard Worker
321*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_update_flags_macro(flags, flagsp, ci, s, stride, vsc) \
322*3ac0a46fSAndroid Build Coastguard Worker { \
323*3ac0a46fSAndroid Build Coastguard Worker /* east */ \
324*3ac0a46fSAndroid Build Coastguard Worker flagsp[-1] |= T1_SIGMA_5 << (3U * ci); \
325*3ac0a46fSAndroid Build Coastguard Worker \
326*3ac0a46fSAndroid Build Coastguard Worker /* mark target as significant */ \
327*3ac0a46fSAndroid Build Coastguard Worker flags |= ((s << T1_CHI_1_I) | T1_SIGMA_4) << (3U * ci); \
328*3ac0a46fSAndroid Build Coastguard Worker \
329*3ac0a46fSAndroid Build Coastguard Worker /* west */ \
330*3ac0a46fSAndroid Build Coastguard Worker flagsp[1] |= T1_SIGMA_3 << (3U * ci); \
331*3ac0a46fSAndroid Build Coastguard Worker \
332*3ac0a46fSAndroid Build Coastguard Worker /* north-west, north, north-east */ \
333*3ac0a46fSAndroid Build Coastguard Worker if (ci == 0U && !(vsc)) { \
334*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t* north = flagsp - (stride); \
335*3ac0a46fSAndroid Build Coastguard Worker *north |= (s << T1_CHI_5_I) | T1_SIGMA_16; \
336*3ac0a46fSAndroid Build Coastguard Worker north[-1] |= T1_SIGMA_17; \
337*3ac0a46fSAndroid Build Coastguard Worker north[1] |= T1_SIGMA_15; \
338*3ac0a46fSAndroid Build Coastguard Worker } \
339*3ac0a46fSAndroid Build Coastguard Worker \
340*3ac0a46fSAndroid Build Coastguard Worker /* south-west, south, south-east */ \
341*3ac0a46fSAndroid Build Coastguard Worker if (ci == 3U) { \
342*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t* south = flagsp + (stride); \
343*3ac0a46fSAndroid Build Coastguard Worker *south |= (s << T1_CHI_0_I) | T1_SIGMA_1; \
344*3ac0a46fSAndroid Build Coastguard Worker south[-1] |= T1_SIGMA_2; \
345*3ac0a46fSAndroid Build Coastguard Worker south[1] |= T1_SIGMA_0; \
346*3ac0a46fSAndroid Build Coastguard Worker } \
347*3ac0a46fSAndroid Build Coastguard Worker }
348*3ac0a46fSAndroid Build Coastguard Worker
349*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_update_flags(opj_flag_t * flagsp,OPJ_UINT32 ci,OPJ_UINT32 s,OPJ_UINT32 stride,OPJ_UINT32 vsc)350*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_update_flags(opj_flag_t *flagsp, OPJ_UINT32 ci,
351*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 s, OPJ_UINT32 stride,
352*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc)
353*3ac0a46fSAndroid Build Coastguard Worker {
354*3ac0a46fSAndroid Build Coastguard Worker opj_t1_update_flags_macro(*flagsp, flagsp, ci, s, stride, vsc);
355*3ac0a46fSAndroid Build Coastguard Worker }
356*3ac0a46fSAndroid Build Coastguard Worker
357*3ac0a46fSAndroid Build Coastguard Worker /**
358*3ac0a46fSAndroid Build Coastguard Worker Encode significant pass
359*3ac0a46fSAndroid Build Coastguard Worker */
360*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_enc_sigpass_step_macro(mqc, curctx, a, c, ct, flagspIn, datapIn, bpno, one, nmsedec, type, ciIn, vscIn) \
361*3ac0a46fSAndroid Build Coastguard Worker { \
362*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v; \
363*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 ci = (ciIn); \
364*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 vsc = (vscIn); \
365*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32* l_datap = (datapIn); \
366*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t* flagsp = (flagspIn); \
367*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 const flags = *flagsp; \
368*3ac0a46fSAndroid Build Coastguard Worker if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) == 0U && \
369*3ac0a46fSAndroid Build Coastguard Worker (flags & (T1_SIGMA_NEIGHBOURS << (ci * 3U))) != 0U) { \
370*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt1 = opj_t1_getctxno_zc(mqc, flags >> (ci * 3U)); \
371*3ac0a46fSAndroid Build Coastguard Worker v = (opj_smr_abs(*l_datap) & (OPJ_UINT32)one) ? 1 : 0; \
372*3ac0a46fSAndroid Build Coastguard Worker /* #ifdef DEBUG_ENC_SIG */ \
373*3ac0a46fSAndroid Build Coastguard Worker /* fprintf(stderr, " ctxt1=%d\n", ctxt1); */ \
374*3ac0a46fSAndroid Build Coastguard Worker /* #endif */ \
375*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt1); \
376*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ \
377*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_bypass_enc_macro(mqc, c, ct, v); \
378*3ac0a46fSAndroid Build Coastguard Worker } else { \
379*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_encode_macro(mqc, curctx, a, c, ct, v); \
380*3ac0a46fSAndroid Build Coastguard Worker } \
381*3ac0a46fSAndroid Build Coastguard Worker if (v) { \
382*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 lu = opj_t1_getctxtno_sc_or_spb_index( \
383*3ac0a46fSAndroid Build Coastguard Worker *flagsp, \
384*3ac0a46fSAndroid Build Coastguard Worker flagsp[-1], flagsp[1], \
385*3ac0a46fSAndroid Build Coastguard Worker ci); \
386*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt2 = opj_t1_getctxno_sc(lu); \
387*3ac0a46fSAndroid Build Coastguard Worker v = opj_smr_sign(*l_datap); \
388*3ac0a46fSAndroid Build Coastguard Worker *nmsedec += opj_t1_getnmsedec_sig(opj_smr_abs(*l_datap), \
389*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)bpno); \
390*3ac0a46fSAndroid Build Coastguard Worker /* #ifdef DEBUG_ENC_SIG */ \
391*3ac0a46fSAndroid Build Coastguard Worker /* fprintf(stderr, " ctxt2=%d\n", ctxt2); */ \
392*3ac0a46fSAndroid Build Coastguard Worker /* #endif */ \
393*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt2); \
394*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ \
395*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_bypass_enc_macro(mqc, c, ct, v); \
396*3ac0a46fSAndroid Build Coastguard Worker } else { \
397*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 spb = opj_t1_getspb(lu); \
398*3ac0a46fSAndroid Build Coastguard Worker /* #ifdef DEBUG_ENC_SIG */ \
399*3ac0a46fSAndroid Build Coastguard Worker /* fprintf(stderr, " spb=%d\n", spb); */ \
400*3ac0a46fSAndroid Build Coastguard Worker /* #endif */ \
401*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_encode_macro(mqc, curctx, a, c, ct, v ^ spb); \
402*3ac0a46fSAndroid Build Coastguard Worker } \
403*3ac0a46fSAndroid Build Coastguard Worker opj_t1_update_flags(flagsp, ci, v, t1->w + 2, vsc); \
404*3ac0a46fSAndroid Build Coastguard Worker } \
405*3ac0a46fSAndroid Build Coastguard Worker *flagsp |= T1_PI_THIS << (ci * 3U); \
406*3ac0a46fSAndroid Build Coastguard Worker } \
407*3ac0a46fSAndroid Build Coastguard Worker }
408*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_sigpass_step_raw(opj_t1_t * t1,opj_flag_t * flagsp,OPJ_INT32 * datap,OPJ_INT32 oneplushalf,OPJ_UINT32 vsc,OPJ_UINT32 ci)409*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_dec_sigpass_step_raw(
410*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
411*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
412*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
413*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 oneplushalf,
414*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc,
415*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ci)
416*3ac0a46fSAndroid Build Coastguard Worker {
417*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v;
418*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t *mqc = &(t1->mqc); /* RAW component */
419*3ac0a46fSAndroid Build Coastguard Worker
420*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 const flags = *flagsp;
421*3ac0a46fSAndroid Build Coastguard Worker
422*3ac0a46fSAndroid Build Coastguard Worker if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) == 0U &&
423*3ac0a46fSAndroid Build Coastguard Worker (flags & (T1_SIGMA_NEIGHBOURS << (ci * 3U))) != 0U) {
424*3ac0a46fSAndroid Build Coastguard Worker if (opj_mqc_raw_decode(mqc)) {
425*3ac0a46fSAndroid Build Coastguard Worker v = opj_mqc_raw_decode(mqc);
426*3ac0a46fSAndroid Build Coastguard Worker *datap = v ? -oneplushalf : oneplushalf;
427*3ac0a46fSAndroid Build Coastguard Worker opj_t1_update_flags(flagsp, ci, v, t1->w + 2, vsc);
428*3ac0a46fSAndroid Build Coastguard Worker }
429*3ac0a46fSAndroid Build Coastguard Worker *flagsp |= T1_PI_THIS << (ci * 3U);
430*3ac0a46fSAndroid Build Coastguard Worker }
431*3ac0a46fSAndroid Build Coastguard Worker }
432*3ac0a46fSAndroid Build Coastguard Worker
433*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_dec_sigpass_step_mqc_macro(flags, flagsp, flags_stride, data, \
434*3ac0a46fSAndroid Build Coastguard Worker data_stride, ci, mqc, curctx, \
435*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, vsc) \
436*3ac0a46fSAndroid Build Coastguard Worker { \
437*3ac0a46fSAndroid Build Coastguard Worker if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) == 0U && \
438*3ac0a46fSAndroid Build Coastguard Worker (flags & (T1_SIGMA_NEIGHBOURS << (ci * 3U))) != 0U) { \
439*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt1 = opj_t1_getctxno_zc(mqc, flags >> (ci * 3U)); \
440*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt1); \
441*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
442*3ac0a46fSAndroid Build Coastguard Worker if (v) { \
443*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 lu = opj_t1_getctxtno_sc_or_spb_index( \
444*3ac0a46fSAndroid Build Coastguard Worker flags, \
445*3ac0a46fSAndroid Build Coastguard Worker flagsp[-1], flagsp[1], \
446*3ac0a46fSAndroid Build Coastguard Worker ci); \
447*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt2 = opj_t1_getctxno_sc(lu); \
448*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 spb = opj_t1_getspb(lu); \
449*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt2); \
450*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
451*3ac0a46fSAndroid Build Coastguard Worker v = v ^ spb; \
452*3ac0a46fSAndroid Build Coastguard Worker data[ci*data_stride] = v ? -oneplushalf : oneplushalf; \
453*3ac0a46fSAndroid Build Coastguard Worker opj_t1_update_flags_macro(flags, flagsp, ci, v, flags_stride, vsc); \
454*3ac0a46fSAndroid Build Coastguard Worker } \
455*3ac0a46fSAndroid Build Coastguard Worker flags |= T1_PI_THIS << (ci * 3U); \
456*3ac0a46fSAndroid Build Coastguard Worker } \
457*3ac0a46fSAndroid Build Coastguard Worker }
458*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_sigpass_step_mqc(opj_t1_t * t1,opj_flag_t * flagsp,OPJ_INT32 * datap,OPJ_INT32 oneplushalf,OPJ_UINT32 ci,OPJ_UINT32 flags_stride,OPJ_UINT32 vsc)459*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_dec_sigpass_step_mqc(
460*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
461*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
462*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
463*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 oneplushalf,
464*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ci,
465*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 flags_stride,
466*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc)
467*3ac0a46fSAndroid Build Coastguard Worker {
468*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v;
469*3ac0a46fSAndroid Build Coastguard Worker
470*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t *mqc = &(t1->mqc); /* MQC component */
471*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_mqc_macro(*flagsp, flagsp, flags_stride, datap,
472*3ac0a46fSAndroid Build Coastguard Worker 0, ci, mqc, mqc->curctx,
473*3ac0a46fSAndroid Build Coastguard Worker v, mqc->a, mqc->c, mqc->ct, oneplushalf, vsc);
474*3ac0a46fSAndroid Build Coastguard Worker }
475*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_enc_sigpass(opj_t1_t * t1,OPJ_INT32 bpno,OPJ_INT32 * nmsedec,OPJ_BYTE type,OPJ_UINT32 cblksty)476*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_enc_sigpass(opj_t1_t *t1,
477*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
478*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *nmsedec,
479*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE type,
480*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty
481*3ac0a46fSAndroid Build Coastguard Worker )
482*3ac0a46fSAndroid Build Coastguard Worker {
483*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, k;
484*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 const one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
485*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t* f = &T1_FLAGS(0, 0);
486*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 const extra = 2;
487*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t* mqc = &(t1->mqc);
488*3ac0a46fSAndroid Build Coastguard Worker DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct);
489*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32* datap = t1->data;
490*3ac0a46fSAndroid Build Coastguard Worker
491*3ac0a46fSAndroid Build Coastguard Worker *nmsedec = 0;
492*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_SIG
493*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, "enc_sigpass: bpno=%d\n", bpno);
494*3ac0a46fSAndroid Build Coastguard Worker #endif
495*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < (t1->h & ~3U); k += 4, f += extra) {
496*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 w = t1->w;
497*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_SIG
498*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, " k=%d\n", k);
499*3ac0a46fSAndroid Build Coastguard Worker #endif
500*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < w; ++i, ++f, datap += 4) {
501*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_SIG
502*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, " i=%d\n", i);
503*3ac0a46fSAndroid Build Coastguard Worker #endif
504*3ac0a46fSAndroid Build Coastguard Worker if (*f == 0U) {
505*3ac0a46fSAndroid Build Coastguard Worker /* Nothing to do for any of the 4 data points */
506*3ac0a46fSAndroid Build Coastguard Worker continue;
507*3ac0a46fSAndroid Build Coastguard Worker }
508*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_sigpass_step_macro(
509*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
510*3ac0a46fSAndroid Build Coastguard Worker f,
511*3ac0a46fSAndroid Build Coastguard Worker &datap[0],
512*3ac0a46fSAndroid Build Coastguard Worker bpno,
513*3ac0a46fSAndroid Build Coastguard Worker one,
514*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
515*3ac0a46fSAndroid Build Coastguard Worker type,
516*3ac0a46fSAndroid Build Coastguard Worker 0, cblksty & J2K_CCP_CBLKSTY_VSC);
517*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_sigpass_step_macro(
518*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
519*3ac0a46fSAndroid Build Coastguard Worker f,
520*3ac0a46fSAndroid Build Coastguard Worker &datap[1],
521*3ac0a46fSAndroid Build Coastguard Worker bpno,
522*3ac0a46fSAndroid Build Coastguard Worker one,
523*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
524*3ac0a46fSAndroid Build Coastguard Worker type,
525*3ac0a46fSAndroid Build Coastguard Worker 1, 0);
526*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_sigpass_step_macro(
527*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
528*3ac0a46fSAndroid Build Coastguard Worker f,
529*3ac0a46fSAndroid Build Coastguard Worker &datap[2],
530*3ac0a46fSAndroid Build Coastguard Worker bpno,
531*3ac0a46fSAndroid Build Coastguard Worker one,
532*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
533*3ac0a46fSAndroid Build Coastguard Worker type,
534*3ac0a46fSAndroid Build Coastguard Worker 2, 0);
535*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_sigpass_step_macro(
536*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
537*3ac0a46fSAndroid Build Coastguard Worker f,
538*3ac0a46fSAndroid Build Coastguard Worker &datap[3],
539*3ac0a46fSAndroid Build Coastguard Worker bpno,
540*3ac0a46fSAndroid Build Coastguard Worker one,
541*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
542*3ac0a46fSAndroid Build Coastguard Worker type,
543*3ac0a46fSAndroid Build Coastguard Worker 3, 0);
544*3ac0a46fSAndroid Build Coastguard Worker }
545*3ac0a46fSAndroid Build Coastguard Worker }
546*3ac0a46fSAndroid Build Coastguard Worker
547*3ac0a46fSAndroid Build Coastguard Worker if (k < t1->h) {
548*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 j;
549*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_SIG
550*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, " k=%d\n", k);
551*3ac0a46fSAndroid Build Coastguard Worker #endif
552*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < t1->w; ++i, ++f) {
553*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_SIG
554*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, " i=%d\n", i);
555*3ac0a46fSAndroid Build Coastguard Worker #endif
556*3ac0a46fSAndroid Build Coastguard Worker if (*f == 0U) {
557*3ac0a46fSAndroid Build Coastguard Worker /* Nothing to do for any of the 4 data points */
558*3ac0a46fSAndroid Build Coastguard Worker datap += (t1->h - k);
559*3ac0a46fSAndroid Build Coastguard Worker continue;
560*3ac0a46fSAndroid Build Coastguard Worker }
561*3ac0a46fSAndroid Build Coastguard Worker for (j = k; j < t1->h; ++j, ++datap) {
562*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_sigpass_step_macro(
563*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
564*3ac0a46fSAndroid Build Coastguard Worker f,
565*3ac0a46fSAndroid Build Coastguard Worker &datap[0],
566*3ac0a46fSAndroid Build Coastguard Worker bpno,
567*3ac0a46fSAndroid Build Coastguard Worker one,
568*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
569*3ac0a46fSAndroid Build Coastguard Worker type,
570*3ac0a46fSAndroid Build Coastguard Worker j - k,
571*3ac0a46fSAndroid Build Coastguard Worker (j == k && (cblksty & J2K_CCP_CBLKSTY_VSC) != 0));
572*3ac0a46fSAndroid Build Coastguard Worker }
573*3ac0a46fSAndroid Build Coastguard Worker }
574*3ac0a46fSAndroid Build Coastguard Worker }
575*3ac0a46fSAndroid Build Coastguard Worker
576*3ac0a46fSAndroid Build Coastguard Worker UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct);
577*3ac0a46fSAndroid Build Coastguard Worker }
578*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_sigpass_raw(opj_t1_t * t1,OPJ_INT32 bpno,OPJ_INT32 cblksty)579*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_sigpass_raw(
580*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
581*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
582*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 cblksty)
583*3ac0a46fSAndroid Build Coastguard Worker {
584*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 one, half, oneplushalf;
585*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j, k;
586*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *data = t1->data;
587*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp = &T1_FLAGS(0, 0);
588*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 l_w = t1->w;
589*3ac0a46fSAndroid Build Coastguard Worker one = 1 << bpno;
590*3ac0a46fSAndroid Build Coastguard Worker half = one >> 1;
591*3ac0a46fSAndroid Build Coastguard Worker oneplushalf = one | half;
592*3ac0a46fSAndroid Build Coastguard Worker
593*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < (t1->h & ~3U); k += 4, flagsp += 2, data += 3 * l_w) {
594*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++flagsp, ++data) {
595*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t flags = *flagsp;
596*3ac0a46fSAndroid Build Coastguard Worker if (flags != 0) {
597*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_raw(
598*3ac0a46fSAndroid Build Coastguard Worker t1,
599*3ac0a46fSAndroid Build Coastguard Worker flagsp,
600*3ac0a46fSAndroid Build Coastguard Worker data,
601*3ac0a46fSAndroid Build Coastguard Worker oneplushalf,
602*3ac0a46fSAndroid Build Coastguard Worker cblksty & J2K_CCP_CBLKSTY_VSC, /* vsc */
603*3ac0a46fSAndroid Build Coastguard Worker 0U);
604*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_raw(
605*3ac0a46fSAndroid Build Coastguard Worker t1,
606*3ac0a46fSAndroid Build Coastguard Worker flagsp,
607*3ac0a46fSAndroid Build Coastguard Worker data + l_w,
608*3ac0a46fSAndroid Build Coastguard Worker oneplushalf,
609*3ac0a46fSAndroid Build Coastguard Worker OPJ_FALSE, /* vsc */
610*3ac0a46fSAndroid Build Coastguard Worker 1U);
611*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_raw(
612*3ac0a46fSAndroid Build Coastguard Worker t1,
613*3ac0a46fSAndroid Build Coastguard Worker flagsp,
614*3ac0a46fSAndroid Build Coastguard Worker data + 2 * l_w,
615*3ac0a46fSAndroid Build Coastguard Worker oneplushalf,
616*3ac0a46fSAndroid Build Coastguard Worker OPJ_FALSE, /* vsc */
617*3ac0a46fSAndroid Build Coastguard Worker 2U);
618*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_raw(
619*3ac0a46fSAndroid Build Coastguard Worker t1,
620*3ac0a46fSAndroid Build Coastguard Worker flagsp,
621*3ac0a46fSAndroid Build Coastguard Worker data + 3 * l_w,
622*3ac0a46fSAndroid Build Coastguard Worker oneplushalf,
623*3ac0a46fSAndroid Build Coastguard Worker OPJ_FALSE, /* vsc */
624*3ac0a46fSAndroid Build Coastguard Worker 3U);
625*3ac0a46fSAndroid Build Coastguard Worker }
626*3ac0a46fSAndroid Build Coastguard Worker }
627*3ac0a46fSAndroid Build Coastguard Worker }
628*3ac0a46fSAndroid Build Coastguard Worker if (k < t1->h) {
629*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++flagsp, ++data) {
630*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < t1->h - k; ++j) {
631*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_raw(
632*3ac0a46fSAndroid Build Coastguard Worker t1,
633*3ac0a46fSAndroid Build Coastguard Worker flagsp,
634*3ac0a46fSAndroid Build Coastguard Worker data + j * l_w,
635*3ac0a46fSAndroid Build Coastguard Worker oneplushalf,
636*3ac0a46fSAndroid Build Coastguard Worker cblksty & J2K_CCP_CBLKSTY_VSC, /* vsc */
637*3ac0a46fSAndroid Build Coastguard Worker j);
638*3ac0a46fSAndroid Build Coastguard Worker }
639*3ac0a46fSAndroid Build Coastguard Worker }
640*3ac0a46fSAndroid Build Coastguard Worker }
641*3ac0a46fSAndroid Build Coastguard Worker }
642*3ac0a46fSAndroid Build Coastguard Worker
643*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_dec_sigpass_mqc_internal(t1, bpno, vsc, w, h, flags_stride) \
644*3ac0a46fSAndroid Build Coastguard Worker { \
645*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 one, half, oneplushalf; \
646*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j, k; \
647*3ac0a46fSAndroid Build Coastguard Worker register OPJ_INT32 *data = t1->data; \
648*3ac0a46fSAndroid Build Coastguard Worker register opj_flag_t *flagsp = &t1->flags[(flags_stride) + 1]; \
649*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 l_w = w; \
650*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t* mqc = &(t1->mqc); \
651*3ac0a46fSAndroid Build Coastguard Worker DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct); \
652*3ac0a46fSAndroid Build Coastguard Worker register OPJ_UINT32 v; \
653*3ac0a46fSAndroid Build Coastguard Worker one = 1 << bpno; \
654*3ac0a46fSAndroid Build Coastguard Worker half = one >> 1; \
655*3ac0a46fSAndroid Build Coastguard Worker oneplushalf = one | half; \
656*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < (h & ~3u); k += 4, data += 3*l_w, flagsp += 2) { \
657*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
658*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t flags = *flagsp; \
659*3ac0a46fSAndroid Build Coastguard Worker if( flags != 0 ) { \
660*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_mqc_macro( \
661*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
662*3ac0a46fSAndroid Build Coastguard Worker l_w, 0, mqc, curctx, v, a, c, ct, oneplushalf, vsc); \
663*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_mqc_macro( \
664*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
665*3ac0a46fSAndroid Build Coastguard Worker l_w, 1, mqc, curctx, v, a, c, ct, oneplushalf, OPJ_FALSE); \
666*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_mqc_macro( \
667*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
668*3ac0a46fSAndroid Build Coastguard Worker l_w, 2, mqc, curctx, v, a, c, ct, oneplushalf, OPJ_FALSE); \
669*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_mqc_macro( \
670*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
671*3ac0a46fSAndroid Build Coastguard Worker l_w, 3, mqc, curctx, v, a, c, ct, oneplushalf, OPJ_FALSE); \
672*3ac0a46fSAndroid Build Coastguard Worker *flagsp = flags; \
673*3ac0a46fSAndroid Build Coastguard Worker } \
674*3ac0a46fSAndroid Build Coastguard Worker } \
675*3ac0a46fSAndroid Build Coastguard Worker } \
676*3ac0a46fSAndroid Build Coastguard Worker UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct); \
677*3ac0a46fSAndroid Build Coastguard Worker if( k < h ) { \
678*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
679*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < h - k; ++j) { \
680*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_step_mqc(t1, flagsp, \
681*3ac0a46fSAndroid Build Coastguard Worker data + j * l_w, oneplushalf, j, flags_stride, vsc); \
682*3ac0a46fSAndroid Build Coastguard Worker } \
683*3ac0a46fSAndroid Build Coastguard Worker } \
684*3ac0a46fSAndroid Build Coastguard Worker } \
685*3ac0a46fSAndroid Build Coastguard Worker }
686*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_sigpass_mqc_64x64_novsc(opj_t1_t * t1,OPJ_INT32 bpno)687*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_sigpass_mqc_64x64_novsc(
688*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
689*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
690*3ac0a46fSAndroid Build Coastguard Worker {
691*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc_internal(t1, bpno, OPJ_FALSE, 64, 64, 66);
692*3ac0a46fSAndroid Build Coastguard Worker }
693*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_sigpass_mqc_64x64_vsc(opj_t1_t * t1,OPJ_INT32 bpno)694*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_sigpass_mqc_64x64_vsc(
695*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
696*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
697*3ac0a46fSAndroid Build Coastguard Worker {
698*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc_internal(t1, bpno, OPJ_TRUE, 64, 64, 66);
699*3ac0a46fSAndroid Build Coastguard Worker }
700*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_sigpass_mqc_generic_novsc(opj_t1_t * t1,OPJ_INT32 bpno)701*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_sigpass_mqc_generic_novsc(
702*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
703*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
704*3ac0a46fSAndroid Build Coastguard Worker {
705*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc_internal(t1, bpno, OPJ_FALSE, t1->w, t1->h,
706*3ac0a46fSAndroid Build Coastguard Worker t1->w + 2U);
707*3ac0a46fSAndroid Build Coastguard Worker }
708*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_sigpass_mqc_generic_vsc(opj_t1_t * t1,OPJ_INT32 bpno)709*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_sigpass_mqc_generic_vsc(
710*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
711*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
712*3ac0a46fSAndroid Build Coastguard Worker {
713*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc_internal(t1, bpno, OPJ_TRUE, t1->w, t1->h,
714*3ac0a46fSAndroid Build Coastguard Worker t1->w + 2U);
715*3ac0a46fSAndroid Build Coastguard Worker }
716*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_sigpass_mqc(opj_t1_t * t1,OPJ_INT32 bpno,OPJ_INT32 cblksty)717*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_sigpass_mqc(
718*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
719*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
720*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 cblksty)
721*3ac0a46fSAndroid Build Coastguard Worker {
722*3ac0a46fSAndroid Build Coastguard Worker if (t1->w == 64 && t1->h == 64) {
723*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_VSC) {
724*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc_64x64_vsc(t1, bpno);
725*3ac0a46fSAndroid Build Coastguard Worker } else {
726*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc_64x64_novsc(t1, bpno);
727*3ac0a46fSAndroid Build Coastguard Worker }
728*3ac0a46fSAndroid Build Coastguard Worker } else {
729*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_VSC) {
730*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc_generic_vsc(t1, bpno);
731*3ac0a46fSAndroid Build Coastguard Worker } else {
732*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc_generic_novsc(t1, bpno);
733*3ac0a46fSAndroid Build Coastguard Worker }
734*3ac0a46fSAndroid Build Coastguard Worker }
735*3ac0a46fSAndroid Build Coastguard Worker }
736*3ac0a46fSAndroid Build Coastguard Worker
737*3ac0a46fSAndroid Build Coastguard Worker /**
738*3ac0a46fSAndroid Build Coastguard Worker Encode refinement pass step
739*3ac0a46fSAndroid Build Coastguard Worker */
740*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_enc_refpass_step_macro(mqc, curctx, a, c, ct, flags, flagsUpdated, datap, bpno, one, nmsedec, type, ci) \
741*3ac0a46fSAndroid Build Coastguard Worker {\
742*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v; \
743*3ac0a46fSAndroid Build Coastguard Worker if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << ((ci) * 3U))) == (T1_SIGMA_THIS << ((ci) * 3U))) { \
744*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 shift_flags = (flags >> ((ci) * 3U)); \
745*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt = opj_t1_getctxno_mag(shift_flags); \
746*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 abs_data = opj_smr_abs(*datap); \
747*3ac0a46fSAndroid Build Coastguard Worker *nmsedec += opj_t1_getnmsedec_ref(abs_data, \
748*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)bpno); \
749*3ac0a46fSAndroid Build Coastguard Worker v = ((OPJ_INT32)abs_data & one) ? 1 : 0; \
750*3ac0a46fSAndroid Build Coastguard Worker /* #ifdef DEBUG_ENC_REF */ \
751*3ac0a46fSAndroid Build Coastguard Worker /* fprintf(stderr, " ctxt=%d\n", ctxt); */ \
752*3ac0a46fSAndroid Build Coastguard Worker /* #endif */ \
753*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt); \
754*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ \
755*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_bypass_enc_macro(mqc, c, ct, v); \
756*3ac0a46fSAndroid Build Coastguard Worker } else { \
757*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_encode_macro(mqc, curctx, a, c, ct, v); \
758*3ac0a46fSAndroid Build Coastguard Worker } \
759*3ac0a46fSAndroid Build Coastguard Worker flagsUpdated |= T1_MU_THIS << ((ci) * 3U); \
760*3ac0a46fSAndroid Build Coastguard Worker } \
761*3ac0a46fSAndroid Build Coastguard Worker }
762*3ac0a46fSAndroid Build Coastguard Worker
763*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_refpass_step_raw(opj_t1_t * t1,opj_flag_t * flagsp,OPJ_INT32 * datap,OPJ_INT32 poshalf,OPJ_UINT32 ci)764*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_dec_refpass_step_raw(
765*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
766*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
767*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
768*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 poshalf,
769*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ci)
770*3ac0a46fSAndroid Build Coastguard Worker {
771*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v;
772*3ac0a46fSAndroid Build Coastguard Worker
773*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t *mqc = &(t1->mqc); /* RAW component */
774*3ac0a46fSAndroid Build Coastguard Worker
775*3ac0a46fSAndroid Build Coastguard Worker if ((*flagsp & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) ==
776*3ac0a46fSAndroid Build Coastguard Worker (T1_SIGMA_THIS << (ci * 3U))) {
777*3ac0a46fSAndroid Build Coastguard Worker v = opj_mqc_raw_decode(mqc);
778*3ac0a46fSAndroid Build Coastguard Worker *datap += (v ^ (*datap < 0)) ? poshalf : -poshalf;
779*3ac0a46fSAndroid Build Coastguard Worker *flagsp |= T1_MU_THIS << (ci * 3U);
780*3ac0a46fSAndroid Build Coastguard Worker }
781*3ac0a46fSAndroid Build Coastguard Worker }
782*3ac0a46fSAndroid Build Coastguard Worker
783*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_dec_refpass_step_mqc_macro(flags, data, data_stride, ci, \
784*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, v, a, c, ct, poshalf) \
785*3ac0a46fSAndroid Build Coastguard Worker { \
786*3ac0a46fSAndroid Build Coastguard Worker if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) == \
787*3ac0a46fSAndroid Build Coastguard Worker (T1_SIGMA_THIS << (ci * 3U))) { \
788*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt = opj_t1_getctxno_mag(flags >> (ci * 3U)); \
789*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt); \
790*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
791*3ac0a46fSAndroid Build Coastguard Worker data[ci*data_stride] += (v ^ (data[ci*data_stride] < 0)) ? poshalf : -poshalf; \
792*3ac0a46fSAndroid Build Coastguard Worker flags |= T1_MU_THIS << (ci * 3U); \
793*3ac0a46fSAndroid Build Coastguard Worker } \
794*3ac0a46fSAndroid Build Coastguard Worker }
795*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_refpass_step_mqc(opj_t1_t * t1,opj_flag_t * flagsp,OPJ_INT32 * datap,OPJ_INT32 poshalf,OPJ_UINT32 ci)796*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_t1_dec_refpass_step_mqc(
797*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
798*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
799*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
800*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 poshalf,
801*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ci)
802*3ac0a46fSAndroid Build Coastguard Worker {
803*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v;
804*3ac0a46fSAndroid Build Coastguard Worker
805*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t *mqc = &(t1->mqc); /* MQC component */
806*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_mqc_macro(*flagsp, datap, 0, ci,
807*3ac0a46fSAndroid Build Coastguard Worker mqc, mqc->curctx, v, mqc->a, mqc->c,
808*3ac0a46fSAndroid Build Coastguard Worker mqc->ct, poshalf);
809*3ac0a46fSAndroid Build Coastguard Worker }
810*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_enc_refpass(opj_t1_t * t1,OPJ_INT32 bpno,OPJ_INT32 * nmsedec,OPJ_BYTE type)811*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_enc_refpass(
812*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
813*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
814*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *nmsedec,
815*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE type)
816*3ac0a46fSAndroid Build Coastguard Worker {
817*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, k;
818*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
819*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t* f = &T1_FLAGS(0, 0);
820*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 extra = 2U;
821*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t* mqc = &(t1->mqc);
822*3ac0a46fSAndroid Build Coastguard Worker DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct);
823*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32* datap = t1->data;
824*3ac0a46fSAndroid Build Coastguard Worker
825*3ac0a46fSAndroid Build Coastguard Worker *nmsedec = 0;
826*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_REF
827*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, "enc_refpass: bpno=%d\n", bpno);
828*3ac0a46fSAndroid Build Coastguard Worker #endif
829*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < (t1->h & ~3U); k += 4, f += extra) {
830*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_REF
831*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, " k=%d\n", k);
832*3ac0a46fSAndroid Build Coastguard Worker #endif
833*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < t1->w; ++i, f++, datap += 4) {
834*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 flags = *f;
835*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 flagsUpdated = flags;
836*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_REF
837*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, " i=%d\n", i);
838*3ac0a46fSAndroid Build Coastguard Worker #endif
839*3ac0a46fSAndroid Build Coastguard Worker if ((flags & (T1_SIGMA_4 | T1_SIGMA_7 | T1_SIGMA_10 | T1_SIGMA_13)) == 0) {
840*3ac0a46fSAndroid Build Coastguard Worker /* none significant */
841*3ac0a46fSAndroid Build Coastguard Worker continue;
842*3ac0a46fSAndroid Build Coastguard Worker }
843*3ac0a46fSAndroid Build Coastguard Worker if ((flags & (T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3)) ==
844*3ac0a46fSAndroid Build Coastguard Worker (T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3)) {
845*3ac0a46fSAndroid Build Coastguard Worker /* all processed by sigpass */
846*3ac0a46fSAndroid Build Coastguard Worker continue;
847*3ac0a46fSAndroid Build Coastguard Worker }
848*3ac0a46fSAndroid Build Coastguard Worker
849*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_refpass_step_macro(
850*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
851*3ac0a46fSAndroid Build Coastguard Worker flags, flagsUpdated,
852*3ac0a46fSAndroid Build Coastguard Worker &datap[0],
853*3ac0a46fSAndroid Build Coastguard Worker bpno,
854*3ac0a46fSAndroid Build Coastguard Worker one,
855*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
856*3ac0a46fSAndroid Build Coastguard Worker type,
857*3ac0a46fSAndroid Build Coastguard Worker 0);
858*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_refpass_step_macro(
859*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
860*3ac0a46fSAndroid Build Coastguard Worker flags, flagsUpdated,
861*3ac0a46fSAndroid Build Coastguard Worker &datap[1],
862*3ac0a46fSAndroid Build Coastguard Worker bpno,
863*3ac0a46fSAndroid Build Coastguard Worker one,
864*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
865*3ac0a46fSAndroid Build Coastguard Worker type,
866*3ac0a46fSAndroid Build Coastguard Worker 1);
867*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_refpass_step_macro(
868*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
869*3ac0a46fSAndroid Build Coastguard Worker flags, flagsUpdated,
870*3ac0a46fSAndroid Build Coastguard Worker &datap[2],
871*3ac0a46fSAndroid Build Coastguard Worker bpno,
872*3ac0a46fSAndroid Build Coastguard Worker one,
873*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
874*3ac0a46fSAndroid Build Coastguard Worker type,
875*3ac0a46fSAndroid Build Coastguard Worker 2);
876*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_refpass_step_macro(
877*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
878*3ac0a46fSAndroid Build Coastguard Worker flags, flagsUpdated,
879*3ac0a46fSAndroid Build Coastguard Worker &datap[3],
880*3ac0a46fSAndroid Build Coastguard Worker bpno,
881*3ac0a46fSAndroid Build Coastguard Worker one,
882*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
883*3ac0a46fSAndroid Build Coastguard Worker type,
884*3ac0a46fSAndroid Build Coastguard Worker 3);
885*3ac0a46fSAndroid Build Coastguard Worker *f = flagsUpdated;
886*3ac0a46fSAndroid Build Coastguard Worker }
887*3ac0a46fSAndroid Build Coastguard Worker }
888*3ac0a46fSAndroid Build Coastguard Worker
889*3ac0a46fSAndroid Build Coastguard Worker if (k < t1->h) {
890*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 j;
891*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 remaining_lines = t1->h - k;
892*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_REF
893*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, " k=%d\n", k);
894*3ac0a46fSAndroid Build Coastguard Worker #endif
895*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < t1->w; ++i, ++f) {
896*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_REF
897*3ac0a46fSAndroid Build Coastguard Worker fprintf(stderr, " i=%d\n", i);
898*3ac0a46fSAndroid Build Coastguard Worker #endif
899*3ac0a46fSAndroid Build Coastguard Worker if ((*f & (T1_SIGMA_4 | T1_SIGMA_7 | T1_SIGMA_10 | T1_SIGMA_13)) == 0) {
900*3ac0a46fSAndroid Build Coastguard Worker /* none significant */
901*3ac0a46fSAndroid Build Coastguard Worker datap += remaining_lines;
902*3ac0a46fSAndroid Build Coastguard Worker continue;
903*3ac0a46fSAndroid Build Coastguard Worker }
904*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < remaining_lines; ++j, datap ++) {
905*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_refpass_step_macro(
906*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
907*3ac0a46fSAndroid Build Coastguard Worker *f, *f,
908*3ac0a46fSAndroid Build Coastguard Worker &datap[0],
909*3ac0a46fSAndroid Build Coastguard Worker bpno,
910*3ac0a46fSAndroid Build Coastguard Worker one,
911*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
912*3ac0a46fSAndroid Build Coastguard Worker type,
913*3ac0a46fSAndroid Build Coastguard Worker j);
914*3ac0a46fSAndroid Build Coastguard Worker }
915*3ac0a46fSAndroid Build Coastguard Worker }
916*3ac0a46fSAndroid Build Coastguard Worker }
917*3ac0a46fSAndroid Build Coastguard Worker
918*3ac0a46fSAndroid Build Coastguard Worker UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct);
919*3ac0a46fSAndroid Build Coastguard Worker }
920*3ac0a46fSAndroid Build Coastguard Worker
921*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_refpass_raw(opj_t1_t * t1,OPJ_INT32 bpno)922*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_refpass_raw(
923*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
924*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
925*3ac0a46fSAndroid Build Coastguard Worker {
926*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 one, poshalf;
927*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j, k;
928*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *data = t1->data;
929*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp = &T1_FLAGS(0, 0);
930*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 l_w = t1->w;
931*3ac0a46fSAndroid Build Coastguard Worker one = 1 << bpno;
932*3ac0a46fSAndroid Build Coastguard Worker poshalf = one >> 1;
933*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < (t1->h & ~3U); k += 4, flagsp += 2, data += 3 * l_w) {
934*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++flagsp, ++data) {
935*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t flags = *flagsp;
936*3ac0a46fSAndroid Build Coastguard Worker if (flags != 0) {
937*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_raw(
938*3ac0a46fSAndroid Build Coastguard Worker t1,
939*3ac0a46fSAndroid Build Coastguard Worker flagsp,
940*3ac0a46fSAndroid Build Coastguard Worker data,
941*3ac0a46fSAndroid Build Coastguard Worker poshalf,
942*3ac0a46fSAndroid Build Coastguard Worker 0U);
943*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_raw(
944*3ac0a46fSAndroid Build Coastguard Worker t1,
945*3ac0a46fSAndroid Build Coastguard Worker flagsp,
946*3ac0a46fSAndroid Build Coastguard Worker data + l_w,
947*3ac0a46fSAndroid Build Coastguard Worker poshalf,
948*3ac0a46fSAndroid Build Coastguard Worker 1U);
949*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_raw(
950*3ac0a46fSAndroid Build Coastguard Worker t1,
951*3ac0a46fSAndroid Build Coastguard Worker flagsp,
952*3ac0a46fSAndroid Build Coastguard Worker data + 2 * l_w,
953*3ac0a46fSAndroid Build Coastguard Worker poshalf,
954*3ac0a46fSAndroid Build Coastguard Worker 2U);
955*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_raw(
956*3ac0a46fSAndroid Build Coastguard Worker t1,
957*3ac0a46fSAndroid Build Coastguard Worker flagsp,
958*3ac0a46fSAndroid Build Coastguard Worker data + 3 * l_w,
959*3ac0a46fSAndroid Build Coastguard Worker poshalf,
960*3ac0a46fSAndroid Build Coastguard Worker 3U);
961*3ac0a46fSAndroid Build Coastguard Worker }
962*3ac0a46fSAndroid Build Coastguard Worker }
963*3ac0a46fSAndroid Build Coastguard Worker }
964*3ac0a46fSAndroid Build Coastguard Worker if (k < t1->h) {
965*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++flagsp, ++data) {
966*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < t1->h - k; ++j) {
967*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_raw(
968*3ac0a46fSAndroid Build Coastguard Worker t1,
969*3ac0a46fSAndroid Build Coastguard Worker flagsp,
970*3ac0a46fSAndroid Build Coastguard Worker data + j * l_w,
971*3ac0a46fSAndroid Build Coastguard Worker poshalf,
972*3ac0a46fSAndroid Build Coastguard Worker j);
973*3ac0a46fSAndroid Build Coastguard Worker }
974*3ac0a46fSAndroid Build Coastguard Worker }
975*3ac0a46fSAndroid Build Coastguard Worker }
976*3ac0a46fSAndroid Build Coastguard Worker }
977*3ac0a46fSAndroid Build Coastguard Worker
978*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_dec_refpass_mqc_internal(t1, bpno, w, h, flags_stride) \
979*3ac0a46fSAndroid Build Coastguard Worker { \
980*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 one, poshalf; \
981*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j, k; \
982*3ac0a46fSAndroid Build Coastguard Worker register OPJ_INT32 *data = t1->data; \
983*3ac0a46fSAndroid Build Coastguard Worker register opj_flag_t *flagsp = &t1->flags[flags_stride + 1]; \
984*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 l_w = w; \
985*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t* mqc = &(t1->mqc); \
986*3ac0a46fSAndroid Build Coastguard Worker DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct); \
987*3ac0a46fSAndroid Build Coastguard Worker register OPJ_UINT32 v; \
988*3ac0a46fSAndroid Build Coastguard Worker one = 1 << bpno; \
989*3ac0a46fSAndroid Build Coastguard Worker poshalf = one >> 1; \
990*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < (h & ~3u); k += 4, data += 3*l_w, flagsp += 2) { \
991*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
992*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t flags = *flagsp; \
993*3ac0a46fSAndroid Build Coastguard Worker if( flags != 0 ) { \
994*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_mqc_macro( \
995*3ac0a46fSAndroid Build Coastguard Worker flags, data, l_w, 0, \
996*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, v, a, c, ct, poshalf); \
997*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_mqc_macro( \
998*3ac0a46fSAndroid Build Coastguard Worker flags, data, l_w, 1, \
999*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, v, a, c, ct, poshalf); \
1000*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_mqc_macro( \
1001*3ac0a46fSAndroid Build Coastguard Worker flags, data, l_w, 2, \
1002*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, v, a, c, ct, poshalf); \
1003*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_mqc_macro( \
1004*3ac0a46fSAndroid Build Coastguard Worker flags, data, l_w, 3, \
1005*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, v, a, c, ct, poshalf); \
1006*3ac0a46fSAndroid Build Coastguard Worker *flagsp = flags; \
1007*3ac0a46fSAndroid Build Coastguard Worker } \
1008*3ac0a46fSAndroid Build Coastguard Worker } \
1009*3ac0a46fSAndroid Build Coastguard Worker } \
1010*3ac0a46fSAndroid Build Coastguard Worker UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct); \
1011*3ac0a46fSAndroid Build Coastguard Worker if( k < h ) { \
1012*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
1013*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < h - k; ++j) { \
1014*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_step_mqc(t1, flagsp, data + j * l_w, poshalf, j); \
1015*3ac0a46fSAndroid Build Coastguard Worker } \
1016*3ac0a46fSAndroid Build Coastguard Worker } \
1017*3ac0a46fSAndroid Build Coastguard Worker } \
1018*3ac0a46fSAndroid Build Coastguard Worker }
1019*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_refpass_mqc_64x64(opj_t1_t * t1,OPJ_INT32 bpno)1020*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_refpass_mqc_64x64(
1021*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1022*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
1023*3ac0a46fSAndroid Build Coastguard Worker {
1024*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_mqc_internal(t1, bpno, 64, 64, 66);
1025*3ac0a46fSAndroid Build Coastguard Worker }
1026*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_refpass_mqc_generic(opj_t1_t * t1,OPJ_INT32 bpno)1027*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_refpass_mqc_generic(
1028*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1029*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
1030*3ac0a46fSAndroid Build Coastguard Worker {
1031*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_mqc_internal(t1, bpno, t1->w, t1->h, t1->w + 2U);
1032*3ac0a46fSAndroid Build Coastguard Worker }
1033*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_refpass_mqc(opj_t1_t * t1,OPJ_INT32 bpno)1034*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_refpass_mqc(
1035*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1036*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
1037*3ac0a46fSAndroid Build Coastguard Worker {
1038*3ac0a46fSAndroid Build Coastguard Worker if (t1->w == 64 && t1->h == 64) {
1039*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_mqc_64x64(t1, bpno);
1040*3ac0a46fSAndroid Build Coastguard Worker } else {
1041*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_mqc_generic(t1, bpno);
1042*3ac0a46fSAndroid Build Coastguard Worker }
1043*3ac0a46fSAndroid Build Coastguard Worker }
1044*3ac0a46fSAndroid Build Coastguard Worker
1045*3ac0a46fSAndroid Build Coastguard Worker /**
1046*3ac0a46fSAndroid Build Coastguard Worker Encode clean-up pass step
1047*3ac0a46fSAndroid Build Coastguard Worker */
1048*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_enc_clnpass_step_macro(mqc, curctx, a, c, ct, flagspIn, datapIn, bpno, one, nmsedec, agg, runlen, lim, cblksty) \
1049*3ac0a46fSAndroid Build Coastguard Worker { \
1050*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v; \
1051*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ci; \
1052*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t* const flagsp = (flagspIn); \
1053*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32* l_datap = (datapIn); \
1054*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 check = (T1_SIGMA_4 | T1_SIGMA_7 | T1_SIGMA_10 | T1_SIGMA_13 | \
1055*3ac0a46fSAndroid Build Coastguard Worker T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3); \
1056*3ac0a46fSAndroid Build Coastguard Worker \
1057*3ac0a46fSAndroid Build Coastguard Worker if ((*flagsp & check) == check) { \
1058*3ac0a46fSAndroid Build Coastguard Worker if (runlen == 0) { \
1059*3ac0a46fSAndroid Build Coastguard Worker *flagsp &= ~(T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3); \
1060*3ac0a46fSAndroid Build Coastguard Worker } else if (runlen == 1) { \
1061*3ac0a46fSAndroid Build Coastguard Worker *flagsp &= ~(T1_PI_1 | T1_PI_2 | T1_PI_3); \
1062*3ac0a46fSAndroid Build Coastguard Worker } else if (runlen == 2) { \
1063*3ac0a46fSAndroid Build Coastguard Worker *flagsp &= ~(T1_PI_2 | T1_PI_3); \
1064*3ac0a46fSAndroid Build Coastguard Worker } else if (runlen == 3) { \
1065*3ac0a46fSAndroid Build Coastguard Worker *flagsp &= ~(T1_PI_3); \
1066*3ac0a46fSAndroid Build Coastguard Worker } \
1067*3ac0a46fSAndroid Build Coastguard Worker } \
1068*3ac0a46fSAndroid Build Coastguard Worker else \
1069*3ac0a46fSAndroid Build Coastguard Worker for (ci = runlen; ci < lim; ++ci) { \
1070*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL goto_PARTIAL = OPJ_FALSE; \
1071*3ac0a46fSAndroid Build Coastguard Worker if ((agg != 0) && (ci == runlen)) { \
1072*3ac0a46fSAndroid Build Coastguard Worker goto_PARTIAL = OPJ_TRUE; \
1073*3ac0a46fSAndroid Build Coastguard Worker } \
1074*3ac0a46fSAndroid Build Coastguard Worker else if (!(*flagsp & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U)))) { \
1075*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt1 = opj_t1_getctxno_zc(mqc, *flagsp >> (ci * 3U)); \
1076*3ac0a46fSAndroid Build Coastguard Worker /* #ifdef DEBUG_ENC_CLN */ \
1077*3ac0a46fSAndroid Build Coastguard Worker /* printf(" ctxt1=%d\n", ctxt1); */ \
1078*3ac0a46fSAndroid Build Coastguard Worker /* #endif */ \
1079*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt1); \
1080*3ac0a46fSAndroid Build Coastguard Worker v = (opj_smr_abs(*l_datap) & (OPJ_UINT32)one) ? 1 : 0; \
1081*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_encode_macro(mqc, curctx, a, c, ct, v); \
1082*3ac0a46fSAndroid Build Coastguard Worker if (v) { \
1083*3ac0a46fSAndroid Build Coastguard Worker goto_PARTIAL = OPJ_TRUE; \
1084*3ac0a46fSAndroid Build Coastguard Worker } \
1085*3ac0a46fSAndroid Build Coastguard Worker } \
1086*3ac0a46fSAndroid Build Coastguard Worker if( goto_PARTIAL ) { \
1087*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc; \
1088*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt2, spb; \
1089*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 lu = opj_t1_getctxtno_sc_or_spb_index( \
1090*3ac0a46fSAndroid Build Coastguard Worker *flagsp, \
1091*3ac0a46fSAndroid Build Coastguard Worker flagsp[-1], flagsp[1], \
1092*3ac0a46fSAndroid Build Coastguard Worker ci); \
1093*3ac0a46fSAndroid Build Coastguard Worker *nmsedec += opj_t1_getnmsedec_sig(opj_smr_abs(*l_datap), \
1094*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)bpno); \
1095*3ac0a46fSAndroid Build Coastguard Worker ctxt2 = opj_t1_getctxno_sc(lu); \
1096*3ac0a46fSAndroid Build Coastguard Worker /* #ifdef DEBUG_ENC_CLN */ \
1097*3ac0a46fSAndroid Build Coastguard Worker /* printf(" ctxt2=%d\n", ctxt2); */ \
1098*3ac0a46fSAndroid Build Coastguard Worker /* #endif */ \
1099*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt2); \
1100*3ac0a46fSAndroid Build Coastguard Worker \
1101*3ac0a46fSAndroid Build Coastguard Worker v = opj_smr_sign(*l_datap); \
1102*3ac0a46fSAndroid Build Coastguard Worker spb = opj_t1_getspb(lu); \
1103*3ac0a46fSAndroid Build Coastguard Worker /* #ifdef DEBUG_ENC_CLN */ \
1104*3ac0a46fSAndroid Build Coastguard Worker /* printf(" spb=%d\n", spb); */\
1105*3ac0a46fSAndroid Build Coastguard Worker /* #endif */ \
1106*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_encode_macro(mqc, curctx, a, c, ct, v ^ spb); \
1107*3ac0a46fSAndroid Build Coastguard Worker vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (ci == 0)) ? 1 : 0; \
1108*3ac0a46fSAndroid Build Coastguard Worker opj_t1_update_flags(flagsp, ci, v, t1->w + 2U, vsc); \
1109*3ac0a46fSAndroid Build Coastguard Worker } \
1110*3ac0a46fSAndroid Build Coastguard Worker *flagsp &= ~(T1_PI_THIS << (3U * ci)); \
1111*3ac0a46fSAndroid Build Coastguard Worker l_datap ++; \
1112*3ac0a46fSAndroid Build Coastguard Worker } \
1113*3ac0a46fSAndroid Build Coastguard Worker }
1114*3ac0a46fSAndroid Build Coastguard Worker
1115*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_dec_clnpass_step_macro(check_flags, partial, \
1116*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1117*3ac0a46fSAndroid Build Coastguard Worker data_stride, ci, mqc, curctx, \
1118*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, vsc) \
1119*3ac0a46fSAndroid Build Coastguard Worker { \
1120*3ac0a46fSAndroid Build Coastguard Worker if ( !check_flags || !(flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U)))) {\
1121*3ac0a46fSAndroid Build Coastguard Worker do { \
1122*3ac0a46fSAndroid Build Coastguard Worker if( !partial ) { \
1123*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ctxt1 = opj_t1_getctxno_zc(mqc, flags >> (ci * 3U)); \
1124*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, ctxt1); \
1125*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
1126*3ac0a46fSAndroid Build Coastguard Worker if( !v ) \
1127*3ac0a46fSAndroid Build Coastguard Worker break; \
1128*3ac0a46fSAndroid Build Coastguard Worker } \
1129*3ac0a46fSAndroid Build Coastguard Worker { \
1130*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 lu = opj_t1_getctxtno_sc_or_spb_index( \
1131*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp[-1], flagsp[1], \
1132*3ac0a46fSAndroid Build Coastguard Worker ci); \
1133*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, opj_t1_getctxno_sc(lu)); \
1134*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
1135*3ac0a46fSAndroid Build Coastguard Worker v = v ^ opj_t1_getspb(lu); \
1136*3ac0a46fSAndroid Build Coastguard Worker data[ci*data_stride] = v ? -oneplushalf : oneplushalf; \
1137*3ac0a46fSAndroid Build Coastguard Worker opj_t1_update_flags_macro(flags, flagsp, ci, v, flags_stride, vsc); \
1138*3ac0a46fSAndroid Build Coastguard Worker } \
1139*3ac0a46fSAndroid Build Coastguard Worker } while(0); \
1140*3ac0a46fSAndroid Build Coastguard Worker } \
1141*3ac0a46fSAndroid Build Coastguard Worker }
1142*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_clnpass_step(opj_t1_t * t1,opj_flag_t * flagsp,OPJ_INT32 * datap,OPJ_INT32 oneplushalf,OPJ_UINT32 ci,OPJ_UINT32 vsc)1143*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_clnpass_step(
1144*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1145*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *flagsp,
1146*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *datap,
1147*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 oneplushalf,
1148*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ci,
1149*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 vsc)
1150*3ac0a46fSAndroid Build Coastguard Worker {
1151*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v;
1152*3ac0a46fSAndroid Build Coastguard Worker
1153*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t *mqc = &(t1->mqc); /* MQC component */
1154*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE,
1155*3ac0a46fSAndroid Build Coastguard Worker *flagsp, flagsp, t1->w + 2U, datap,
1156*3ac0a46fSAndroid Build Coastguard Worker 0, ci, mqc, mqc->curctx,
1157*3ac0a46fSAndroid Build Coastguard Worker v, mqc->a, mqc->c, mqc->ct, oneplushalf, vsc);
1158*3ac0a46fSAndroid Build Coastguard Worker }
1159*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_enc_clnpass(opj_t1_t * t1,OPJ_INT32 bpno,OPJ_INT32 * nmsedec,OPJ_UINT32 cblksty)1160*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_enc_clnpass(
1161*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1162*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
1163*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 *nmsedec,
1164*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty)
1165*3ac0a46fSAndroid Build Coastguard Worker {
1166*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, k;
1167*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
1168*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t* mqc = &(t1->mqc);
1169*3ac0a46fSAndroid Build Coastguard Worker DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct);
1170*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32* datap = t1->data;
1171*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t *f = &T1_FLAGS(0, 0);
1172*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 extra = 2U;
1173*3ac0a46fSAndroid Build Coastguard Worker
1174*3ac0a46fSAndroid Build Coastguard Worker *nmsedec = 0;
1175*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_CLN
1176*3ac0a46fSAndroid Build Coastguard Worker printf("enc_clnpass: bpno=%d\n", bpno);
1177*3ac0a46fSAndroid Build Coastguard Worker #endif
1178*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < (t1->h & ~3U); k += 4, f += extra) {
1179*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_CLN
1180*3ac0a46fSAndroid Build Coastguard Worker printf(" k=%d\n", k);
1181*3ac0a46fSAndroid Build Coastguard Worker #endif
1182*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < t1->w; ++i, f++) {
1183*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 agg, runlen;
1184*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_CLN
1185*3ac0a46fSAndroid Build Coastguard Worker printf(" i=%d\n", i);
1186*3ac0a46fSAndroid Build Coastguard Worker #endif
1187*3ac0a46fSAndroid Build Coastguard Worker agg = !*f;
1188*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_CLN
1189*3ac0a46fSAndroid Build Coastguard Worker printf(" agg=%d\n", agg);
1190*3ac0a46fSAndroid Build Coastguard Worker #endif
1191*3ac0a46fSAndroid Build Coastguard Worker if (agg) {
1192*3ac0a46fSAndroid Build Coastguard Worker for (runlen = 0; runlen < 4; ++runlen, ++datap) {
1193*3ac0a46fSAndroid Build Coastguard Worker if (opj_smr_abs(*datap) & (OPJ_UINT32)one) {
1194*3ac0a46fSAndroid Build Coastguard Worker break;
1195*3ac0a46fSAndroid Build Coastguard Worker }
1196*3ac0a46fSAndroid Build Coastguard Worker }
1197*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, T1_CTXNO_AGG);
1198*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_encode_macro(mqc, curctx, a, c, ct, runlen != 4);
1199*3ac0a46fSAndroid Build Coastguard Worker if (runlen == 4) {
1200*3ac0a46fSAndroid Build Coastguard Worker continue;
1201*3ac0a46fSAndroid Build Coastguard Worker }
1202*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, T1_CTXNO_UNI);
1203*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_encode_macro(mqc, curctx, a, c, ct, runlen >> 1);
1204*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_encode_macro(mqc, curctx, a, c, ct, runlen & 1);
1205*3ac0a46fSAndroid Build Coastguard Worker } else {
1206*3ac0a46fSAndroid Build Coastguard Worker runlen = 0;
1207*3ac0a46fSAndroid Build Coastguard Worker }
1208*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_clnpass_step_macro(
1209*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
1210*3ac0a46fSAndroid Build Coastguard Worker f,
1211*3ac0a46fSAndroid Build Coastguard Worker datap,
1212*3ac0a46fSAndroid Build Coastguard Worker bpno,
1213*3ac0a46fSAndroid Build Coastguard Worker one,
1214*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
1215*3ac0a46fSAndroid Build Coastguard Worker agg,
1216*3ac0a46fSAndroid Build Coastguard Worker runlen,
1217*3ac0a46fSAndroid Build Coastguard Worker 4U,
1218*3ac0a46fSAndroid Build Coastguard Worker cblksty);
1219*3ac0a46fSAndroid Build Coastguard Worker datap += 4 - runlen;
1220*3ac0a46fSAndroid Build Coastguard Worker }
1221*3ac0a46fSAndroid Build Coastguard Worker }
1222*3ac0a46fSAndroid Build Coastguard Worker if (k < t1->h) {
1223*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 agg = 0;
1224*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 runlen = 0;
1225*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_CLN
1226*3ac0a46fSAndroid Build Coastguard Worker printf(" k=%d\n", k);
1227*3ac0a46fSAndroid Build Coastguard Worker #endif
1228*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < t1->w; ++i, f++) {
1229*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_ENC_CLN
1230*3ac0a46fSAndroid Build Coastguard Worker printf(" i=%d\n", i);
1231*3ac0a46fSAndroid Build Coastguard Worker printf(" agg=%d\n", agg);
1232*3ac0a46fSAndroid Build Coastguard Worker #endif
1233*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_clnpass_step_macro(
1234*3ac0a46fSAndroid Build Coastguard Worker mqc, curctx, a, c, ct,
1235*3ac0a46fSAndroid Build Coastguard Worker f,
1236*3ac0a46fSAndroid Build Coastguard Worker datap,
1237*3ac0a46fSAndroid Build Coastguard Worker bpno,
1238*3ac0a46fSAndroid Build Coastguard Worker one,
1239*3ac0a46fSAndroid Build Coastguard Worker nmsedec,
1240*3ac0a46fSAndroid Build Coastguard Worker agg,
1241*3ac0a46fSAndroid Build Coastguard Worker runlen,
1242*3ac0a46fSAndroid Build Coastguard Worker t1->h - k,
1243*3ac0a46fSAndroid Build Coastguard Worker cblksty);
1244*3ac0a46fSAndroid Build Coastguard Worker datap += t1->h - k;
1245*3ac0a46fSAndroid Build Coastguard Worker }
1246*3ac0a46fSAndroid Build Coastguard Worker }
1247*3ac0a46fSAndroid Build Coastguard Worker
1248*3ac0a46fSAndroid Build Coastguard Worker UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct);
1249*3ac0a46fSAndroid Build Coastguard Worker }
1250*3ac0a46fSAndroid Build Coastguard Worker
1251*3ac0a46fSAndroid Build Coastguard Worker #define opj_t1_dec_clnpass_internal(t1, bpno, vsc, w, h, flags_stride) \
1252*3ac0a46fSAndroid Build Coastguard Worker { \
1253*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 one, half, oneplushalf; \
1254*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 runlen; \
1255*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j, k; \
1256*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 l_w = w; \
1257*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t* mqc = &(t1->mqc); \
1258*3ac0a46fSAndroid Build Coastguard Worker register OPJ_INT32 *data = t1->data; \
1259*3ac0a46fSAndroid Build Coastguard Worker register opj_flag_t *flagsp = &t1->flags[flags_stride + 1]; \
1260*3ac0a46fSAndroid Build Coastguard Worker DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct); \
1261*3ac0a46fSAndroid Build Coastguard Worker register OPJ_UINT32 v; \
1262*3ac0a46fSAndroid Build Coastguard Worker one = 1 << bpno; \
1263*3ac0a46fSAndroid Build Coastguard Worker half = one >> 1; \
1264*3ac0a46fSAndroid Build Coastguard Worker oneplushalf = one | half; \
1265*3ac0a46fSAndroid Build Coastguard Worker for (k = 0; k < (h & ~3u); k += 4, data += 3*l_w, flagsp += 2) { \
1266*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
1267*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t flags = *flagsp; \
1268*3ac0a46fSAndroid Build Coastguard Worker if (flags == 0) { \
1269*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 partial = OPJ_TRUE; \
1270*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, T1_CTXNO_AGG); \
1271*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
1272*3ac0a46fSAndroid Build Coastguard Worker if (!v) { \
1273*3ac0a46fSAndroid Build Coastguard Worker continue; \
1274*3ac0a46fSAndroid Build Coastguard Worker } \
1275*3ac0a46fSAndroid Build Coastguard Worker opj_t1_setcurctx(curctx, T1_CTXNO_UNI); \
1276*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode_macro(runlen, mqc, curctx, a, c, ct); \
1277*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
1278*3ac0a46fSAndroid Build Coastguard Worker runlen = (runlen << 1) | v; \
1279*3ac0a46fSAndroid Build Coastguard Worker switch(runlen) { \
1280*3ac0a46fSAndroid Build Coastguard Worker case 0: \
1281*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_FALSE, OPJ_TRUE,\
1282*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1283*3ac0a46fSAndroid Build Coastguard Worker l_w, 0, mqc, curctx, \
1284*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, vsc); \
1285*3ac0a46fSAndroid Build Coastguard Worker partial = OPJ_FALSE; \
1286*3ac0a46fSAndroid Build Coastguard Worker /* FALLTHRU */ \
1287*3ac0a46fSAndroid Build Coastguard Worker case 1: \
1288*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_FALSE, partial,\
1289*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1290*3ac0a46fSAndroid Build Coastguard Worker l_w, 1, mqc, curctx, \
1291*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, OPJ_FALSE); \
1292*3ac0a46fSAndroid Build Coastguard Worker partial = OPJ_FALSE; \
1293*3ac0a46fSAndroid Build Coastguard Worker /* FALLTHRU */ \
1294*3ac0a46fSAndroid Build Coastguard Worker case 2: \
1295*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_FALSE, partial,\
1296*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1297*3ac0a46fSAndroid Build Coastguard Worker l_w, 2, mqc, curctx, \
1298*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, OPJ_FALSE); \
1299*3ac0a46fSAndroid Build Coastguard Worker partial = OPJ_FALSE; \
1300*3ac0a46fSAndroid Build Coastguard Worker /* FALLTHRU */ \
1301*3ac0a46fSAndroid Build Coastguard Worker case 3: \
1302*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_FALSE, partial,\
1303*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1304*3ac0a46fSAndroid Build Coastguard Worker l_w, 3, mqc, curctx, \
1305*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, OPJ_FALSE); \
1306*3ac0a46fSAndroid Build Coastguard Worker break; \
1307*3ac0a46fSAndroid Build Coastguard Worker } \
1308*3ac0a46fSAndroid Build Coastguard Worker } else { \
1309*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE, \
1310*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1311*3ac0a46fSAndroid Build Coastguard Worker l_w, 0, mqc, curctx, \
1312*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, vsc); \
1313*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE, \
1314*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1315*3ac0a46fSAndroid Build Coastguard Worker l_w, 1, mqc, curctx, \
1316*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, OPJ_FALSE); \
1317*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE, \
1318*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1319*3ac0a46fSAndroid Build Coastguard Worker l_w, 2, mqc, curctx, \
1320*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, OPJ_FALSE); \
1321*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE, \
1322*3ac0a46fSAndroid Build Coastguard Worker flags, flagsp, flags_stride, data, \
1323*3ac0a46fSAndroid Build Coastguard Worker l_w, 3, mqc, curctx, \
1324*3ac0a46fSAndroid Build Coastguard Worker v, a, c, ct, oneplushalf, OPJ_FALSE); \
1325*3ac0a46fSAndroid Build Coastguard Worker } \
1326*3ac0a46fSAndroid Build Coastguard Worker *flagsp = flags & ~(T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3); \
1327*3ac0a46fSAndroid Build Coastguard Worker } \
1328*3ac0a46fSAndroid Build Coastguard Worker } \
1329*3ac0a46fSAndroid Build Coastguard Worker UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct); \
1330*3ac0a46fSAndroid Build Coastguard Worker if( k < h ) { \
1331*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < l_w; ++i, ++flagsp, ++data) { \
1332*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < h - k; ++j) { \
1333*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_step(t1, flagsp, data + j * l_w, oneplushalf, j, vsc); \
1334*3ac0a46fSAndroid Build Coastguard Worker } \
1335*3ac0a46fSAndroid Build Coastguard Worker *flagsp &= ~(T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3); \
1336*3ac0a46fSAndroid Build Coastguard Worker } \
1337*3ac0a46fSAndroid Build Coastguard Worker } \
1338*3ac0a46fSAndroid Build Coastguard Worker }
1339*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_clnpass_check_segsym(opj_t1_t * t1,OPJ_INT32 cblksty)1340*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_clnpass_check_segsym(opj_t1_t *t1, OPJ_INT32 cblksty)
1341*3ac0a46fSAndroid Build Coastguard Worker {
1342*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) {
1343*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t* mqc = &(t1->mqc);
1344*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v, v2;
1345*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
1346*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode(v, mqc);
1347*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode(v2, mqc);
1348*3ac0a46fSAndroid Build Coastguard Worker v = (v << 1) | v2;
1349*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode(v2, mqc);
1350*3ac0a46fSAndroid Build Coastguard Worker v = (v << 1) | v2;
1351*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_decode(v2, mqc);
1352*3ac0a46fSAndroid Build Coastguard Worker v = (v << 1) | v2;
1353*3ac0a46fSAndroid Build Coastguard Worker /*
1354*3ac0a46fSAndroid Build Coastguard Worker if (v!=0xa) {
1355*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
1356*3ac0a46fSAndroid Build Coastguard Worker }
1357*3ac0a46fSAndroid Build Coastguard Worker */
1358*3ac0a46fSAndroid Build Coastguard Worker }
1359*3ac0a46fSAndroid Build Coastguard Worker }
1360*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_clnpass_64x64_novsc(opj_t1_t * t1,OPJ_INT32 bpno)1361*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_clnpass_64x64_novsc(
1362*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1363*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
1364*3ac0a46fSAndroid Build Coastguard Worker {
1365*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_internal(t1, bpno, OPJ_FALSE, 64, 64, 66);
1366*3ac0a46fSAndroid Build Coastguard Worker }
1367*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_clnpass_64x64_vsc(opj_t1_t * t1,OPJ_INT32 bpno)1368*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_clnpass_64x64_vsc(
1369*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1370*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
1371*3ac0a46fSAndroid Build Coastguard Worker {
1372*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_internal(t1, bpno, OPJ_TRUE, 64, 64, 66);
1373*3ac0a46fSAndroid Build Coastguard Worker }
1374*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_clnpass_generic_novsc(opj_t1_t * t1,OPJ_INT32 bpno)1375*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_clnpass_generic_novsc(
1376*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1377*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
1378*3ac0a46fSAndroid Build Coastguard Worker {
1379*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_internal(t1, bpno, OPJ_FALSE, t1->w, t1->h,
1380*3ac0a46fSAndroid Build Coastguard Worker t1->w + 2U);
1381*3ac0a46fSAndroid Build Coastguard Worker }
1382*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_clnpass_generic_vsc(opj_t1_t * t1,OPJ_INT32 bpno)1383*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_clnpass_generic_vsc(
1384*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1385*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno)
1386*3ac0a46fSAndroid Build Coastguard Worker {
1387*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_internal(t1, bpno, OPJ_TRUE, t1->w, t1->h,
1388*3ac0a46fSAndroid Build Coastguard Worker t1->w + 2U);
1389*3ac0a46fSAndroid Build Coastguard Worker }
1390*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_dec_clnpass(opj_t1_t * t1,OPJ_INT32 bpno,OPJ_INT32 cblksty)1391*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_dec_clnpass(
1392*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1393*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
1394*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 cblksty)
1395*3ac0a46fSAndroid Build Coastguard Worker {
1396*3ac0a46fSAndroid Build Coastguard Worker if (t1->w == 64 && t1->h == 64) {
1397*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1398*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_64x64_vsc(t1, bpno);
1399*3ac0a46fSAndroid Build Coastguard Worker } else {
1400*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_64x64_novsc(t1, bpno);
1401*3ac0a46fSAndroid Build Coastguard Worker }
1402*3ac0a46fSAndroid Build Coastguard Worker } else {
1403*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1404*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_generic_vsc(t1, bpno);
1405*3ac0a46fSAndroid Build Coastguard Worker } else {
1406*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_generic_novsc(t1, bpno);
1407*3ac0a46fSAndroid Build Coastguard Worker }
1408*3ac0a46fSAndroid Build Coastguard Worker }
1409*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass_check_segsym(t1, cblksty);
1410*3ac0a46fSAndroid Build Coastguard Worker }
1411*3ac0a46fSAndroid Build Coastguard Worker
1412*3ac0a46fSAndroid Build Coastguard Worker
1413*3ac0a46fSAndroid Build Coastguard Worker /** mod fixed_quality */
opj_t1_getwmsedec(OPJ_INT32 nmsedec,OPJ_UINT32 compno,OPJ_UINT32 level,OPJ_UINT32 orient,OPJ_INT32 bpno,OPJ_UINT32 qmfbid,OPJ_FLOAT64 stepsize,OPJ_UINT32 numcomps,const OPJ_FLOAT64 * mct_norms,OPJ_UINT32 mct_numcomps)1414*3ac0a46fSAndroid Build Coastguard Worker static OPJ_FLOAT64 opj_t1_getwmsedec(
1415*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 nmsedec,
1416*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno,
1417*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 level,
1418*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 orient,
1419*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
1420*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 qmfbid,
1421*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 stepsize,
1422*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 numcomps,
1423*3ac0a46fSAndroid Build Coastguard Worker const OPJ_FLOAT64 * mct_norms,
1424*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 mct_numcomps)
1425*3ac0a46fSAndroid Build Coastguard Worker {
1426*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 w1 = 1, w2, wmsedec;
1427*3ac0a46fSAndroid Build Coastguard Worker OPJ_ARG_NOT_USED(numcomps);
1428*3ac0a46fSAndroid Build Coastguard Worker
1429*3ac0a46fSAndroid Build Coastguard Worker if (mct_norms && (compno < mct_numcomps)) {
1430*3ac0a46fSAndroid Build Coastguard Worker w1 = mct_norms[compno];
1431*3ac0a46fSAndroid Build Coastguard Worker }
1432*3ac0a46fSAndroid Build Coastguard Worker
1433*3ac0a46fSAndroid Build Coastguard Worker if (qmfbid == 1) {
1434*3ac0a46fSAndroid Build Coastguard Worker w2 = opj_dwt_getnorm(level, orient);
1435*3ac0a46fSAndroid Build Coastguard Worker } else { /* if (qmfbid == 0) */
1436*3ac0a46fSAndroid Build Coastguard Worker const OPJ_INT32 log2_gain = (orient == 0) ? 0 :
1437*3ac0a46fSAndroid Build Coastguard Worker (orient == 3) ? 2 : 1;
1438*3ac0a46fSAndroid Build Coastguard Worker w2 = opj_dwt_getnorm_real(level, orient);
1439*3ac0a46fSAndroid Build Coastguard Worker /* Not sure this is right. But preserves past behaviour */
1440*3ac0a46fSAndroid Build Coastguard Worker stepsize /= (1 << log2_gain);
1441*3ac0a46fSAndroid Build Coastguard Worker }
1442*3ac0a46fSAndroid Build Coastguard Worker
1443*3ac0a46fSAndroid Build Coastguard Worker wmsedec = w1 * w2 * stepsize * (1 << bpno);
1444*3ac0a46fSAndroid Build Coastguard Worker wmsedec *= wmsedec * nmsedec / 8192.0;
1445*3ac0a46fSAndroid Build Coastguard Worker
1446*3ac0a46fSAndroid Build Coastguard Worker return wmsedec;
1447*3ac0a46fSAndroid Build Coastguard Worker }
1448*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_allocate_buffers(opj_t1_t * t1,OPJ_UINT32 w,OPJ_UINT32 h)1449*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_t1_allocate_buffers(
1450*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *t1,
1451*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 w,
1452*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 h)
1453*3ac0a46fSAndroid Build Coastguard Worker {
1454*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 flagssize;
1455*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 flags_stride;
1456*3ac0a46fSAndroid Build Coastguard Worker
1457*3ac0a46fSAndroid Build Coastguard Worker /* No risk of overflow. Prior checks ensure those assert are met */
1458*3ac0a46fSAndroid Build Coastguard Worker /* They are per the specification */
1459*3ac0a46fSAndroid Build Coastguard Worker assert(w <= 1024);
1460*3ac0a46fSAndroid Build Coastguard Worker assert(h <= 1024);
1461*3ac0a46fSAndroid Build Coastguard Worker assert(w * h <= 4096);
1462*3ac0a46fSAndroid Build Coastguard Worker
1463*3ac0a46fSAndroid Build Coastguard Worker /* encoder uses tile buffer, so no need to allocate */
1464*3ac0a46fSAndroid Build Coastguard Worker {
1465*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 datasize = w * h;
1466*3ac0a46fSAndroid Build Coastguard Worker
1467*3ac0a46fSAndroid Build Coastguard Worker if (datasize > t1->datasize) {
1468*3ac0a46fSAndroid Build Coastguard Worker opj_aligned_free(t1->data);
1469*3ac0a46fSAndroid Build Coastguard Worker t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
1470*3ac0a46fSAndroid Build Coastguard Worker if (!t1->data) {
1471*3ac0a46fSAndroid Build Coastguard Worker /* FIXME event manager error callback */
1472*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1473*3ac0a46fSAndroid Build Coastguard Worker }
1474*3ac0a46fSAndroid Build Coastguard Worker t1->datasize = datasize;
1475*3ac0a46fSAndroid Build Coastguard Worker }
1476*3ac0a46fSAndroid Build Coastguard Worker /* memset first arg is declared to never be null by gcc */
1477*3ac0a46fSAndroid Build Coastguard Worker if (t1->data != NULL) {
1478*3ac0a46fSAndroid Build Coastguard Worker memset(t1->data, 0, datasize * sizeof(OPJ_INT32));
1479*3ac0a46fSAndroid Build Coastguard Worker }
1480*3ac0a46fSAndroid Build Coastguard Worker }
1481*3ac0a46fSAndroid Build Coastguard Worker
1482*3ac0a46fSAndroid Build Coastguard Worker flags_stride = w + 2U; /* can't be 0U */
1483*3ac0a46fSAndroid Build Coastguard Worker
1484*3ac0a46fSAndroid Build Coastguard Worker flagssize = (h + 3U) / 4U + 2U;
1485*3ac0a46fSAndroid Build Coastguard Worker
1486*3ac0a46fSAndroid Build Coastguard Worker flagssize *= flags_stride;
1487*3ac0a46fSAndroid Build Coastguard Worker {
1488*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t* p;
1489*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 x;
1490*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 flags_height = (h + 3U) / 4U;
1491*3ac0a46fSAndroid Build Coastguard Worker
1492*3ac0a46fSAndroid Build Coastguard Worker if (flagssize > t1->flagssize) {
1493*3ac0a46fSAndroid Build Coastguard Worker
1494*3ac0a46fSAndroid Build Coastguard Worker opj_aligned_free(t1->flags);
1495*3ac0a46fSAndroid Build Coastguard Worker t1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(
1496*3ac0a46fSAndroid Build Coastguard Worker opj_flag_t));
1497*3ac0a46fSAndroid Build Coastguard Worker if (!t1->flags) {
1498*3ac0a46fSAndroid Build Coastguard Worker /* FIXME event manager error callback */
1499*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1500*3ac0a46fSAndroid Build Coastguard Worker }
1501*3ac0a46fSAndroid Build Coastguard Worker }
1502*3ac0a46fSAndroid Build Coastguard Worker t1->flagssize = flagssize;
1503*3ac0a46fSAndroid Build Coastguard Worker
1504*3ac0a46fSAndroid Build Coastguard Worker memset(t1->flags, 0, flagssize * sizeof(opj_flag_t));
1505*3ac0a46fSAndroid Build Coastguard Worker
1506*3ac0a46fSAndroid Build Coastguard Worker p = &t1->flags[0];
1507*3ac0a46fSAndroid Build Coastguard Worker for (x = 0; x < flags_stride; ++x) {
1508*3ac0a46fSAndroid Build Coastguard Worker /* magic value to hopefully stop any passes being interested in this entry */
1509*3ac0a46fSAndroid Build Coastguard Worker *p++ = (T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3);
1510*3ac0a46fSAndroid Build Coastguard Worker }
1511*3ac0a46fSAndroid Build Coastguard Worker
1512*3ac0a46fSAndroid Build Coastguard Worker p = &t1->flags[((flags_height + 1) * flags_stride)];
1513*3ac0a46fSAndroid Build Coastguard Worker for (x = 0; x < flags_stride; ++x) {
1514*3ac0a46fSAndroid Build Coastguard Worker /* magic value to hopefully stop any passes being interested in this entry */
1515*3ac0a46fSAndroid Build Coastguard Worker *p++ = (T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3);
1516*3ac0a46fSAndroid Build Coastguard Worker }
1517*3ac0a46fSAndroid Build Coastguard Worker
1518*3ac0a46fSAndroid Build Coastguard Worker if (h % 4) {
1519*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 v = 0;
1520*3ac0a46fSAndroid Build Coastguard Worker p = &t1->flags[((flags_height) * flags_stride)];
1521*3ac0a46fSAndroid Build Coastguard Worker if (h % 4 == 1) {
1522*3ac0a46fSAndroid Build Coastguard Worker v |= T1_PI_1 | T1_PI_2 | T1_PI_3;
1523*3ac0a46fSAndroid Build Coastguard Worker } else if (h % 4 == 2) {
1524*3ac0a46fSAndroid Build Coastguard Worker v |= T1_PI_2 | T1_PI_3;
1525*3ac0a46fSAndroid Build Coastguard Worker } else if (h % 4 == 3) {
1526*3ac0a46fSAndroid Build Coastguard Worker v |= T1_PI_3;
1527*3ac0a46fSAndroid Build Coastguard Worker }
1528*3ac0a46fSAndroid Build Coastguard Worker for (x = 0; x < flags_stride; ++x) {
1529*3ac0a46fSAndroid Build Coastguard Worker *p++ = v;
1530*3ac0a46fSAndroid Build Coastguard Worker }
1531*3ac0a46fSAndroid Build Coastguard Worker }
1532*3ac0a46fSAndroid Build Coastguard Worker }
1533*3ac0a46fSAndroid Build Coastguard Worker
1534*3ac0a46fSAndroid Build Coastguard Worker t1->w = w;
1535*3ac0a46fSAndroid Build Coastguard Worker t1->h = h;
1536*3ac0a46fSAndroid Build Coastguard Worker
1537*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
1538*3ac0a46fSAndroid Build Coastguard Worker }
1539*3ac0a46fSAndroid Build Coastguard Worker
1540*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
1541*3ac0a46fSAndroid Build Coastguard Worker
1542*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
1543*3ac0a46fSAndroid Build Coastguard Worker /**
1544*3ac0a46fSAndroid Build Coastguard Worker * Creates a new Tier 1 handle
1545*3ac0a46fSAndroid Build Coastguard Worker * and initializes the look-up tables of the Tier-1 coder/decoder
1546*3ac0a46fSAndroid Build Coastguard Worker * @return a new T1 handle if successful, returns NULL otherwise
1547*3ac0a46fSAndroid Build Coastguard Worker */
opj_t1_create(OPJ_BOOL isEncoder)1548*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t* opj_t1_create(OPJ_BOOL isEncoder)
1549*3ac0a46fSAndroid Build Coastguard Worker {
1550*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t *l_t1 = 00;
1551*3ac0a46fSAndroid Build Coastguard Worker
1552*3ac0a46fSAndroid Build Coastguard Worker l_t1 = (opj_t1_t*) opj_calloc(1, sizeof(opj_t1_t));
1553*3ac0a46fSAndroid Build Coastguard Worker if (!l_t1) {
1554*3ac0a46fSAndroid Build Coastguard Worker return 00;
1555*3ac0a46fSAndroid Build Coastguard Worker }
1556*3ac0a46fSAndroid Build Coastguard Worker
1557*3ac0a46fSAndroid Build Coastguard Worker l_t1->encoder = isEncoder;
1558*3ac0a46fSAndroid Build Coastguard Worker
1559*3ac0a46fSAndroid Build Coastguard Worker return l_t1;
1560*3ac0a46fSAndroid Build Coastguard Worker }
1561*3ac0a46fSAndroid Build Coastguard Worker
1562*3ac0a46fSAndroid Build Coastguard Worker
1563*3ac0a46fSAndroid Build Coastguard Worker /**
1564*3ac0a46fSAndroid Build Coastguard Worker * Destroys a previously created T1 handle
1565*3ac0a46fSAndroid Build Coastguard Worker *
1566*3ac0a46fSAndroid Build Coastguard Worker * @param p_t1 Tier 1 handle to destroy
1567*3ac0a46fSAndroid Build Coastguard Worker */
opj_t1_destroy(opj_t1_t * p_t1)1568*3ac0a46fSAndroid Build Coastguard Worker void opj_t1_destroy(opj_t1_t *p_t1)
1569*3ac0a46fSAndroid Build Coastguard Worker {
1570*3ac0a46fSAndroid Build Coastguard Worker if (! p_t1) {
1571*3ac0a46fSAndroid Build Coastguard Worker return;
1572*3ac0a46fSAndroid Build Coastguard Worker }
1573*3ac0a46fSAndroid Build Coastguard Worker
1574*3ac0a46fSAndroid Build Coastguard Worker if (p_t1->data) {
1575*3ac0a46fSAndroid Build Coastguard Worker opj_aligned_free(p_t1->data);
1576*3ac0a46fSAndroid Build Coastguard Worker p_t1->data = 00;
1577*3ac0a46fSAndroid Build Coastguard Worker }
1578*3ac0a46fSAndroid Build Coastguard Worker
1579*3ac0a46fSAndroid Build Coastguard Worker if (p_t1->flags) {
1580*3ac0a46fSAndroid Build Coastguard Worker opj_aligned_free(p_t1->flags);
1581*3ac0a46fSAndroid Build Coastguard Worker p_t1->flags = 00;
1582*3ac0a46fSAndroid Build Coastguard Worker }
1583*3ac0a46fSAndroid Build Coastguard Worker
1584*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_t1->cblkdatabuffer);
1585*3ac0a46fSAndroid Build Coastguard Worker
1586*3ac0a46fSAndroid Build Coastguard Worker opj_free(p_t1);
1587*3ac0a46fSAndroid Build Coastguard Worker }
1588*3ac0a46fSAndroid Build Coastguard Worker
1589*3ac0a46fSAndroid Build Coastguard Worker typedef struct {
1590*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL whole_tile_decoding;
1591*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 resno;
1592*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_dec_t* cblk;
1593*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_band_t* band;
1594*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t* tilec;
1595*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t* tccp;
1596*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL mustuse_cblkdatabuffer;
1597*3ac0a46fSAndroid Build Coastguard Worker volatile OPJ_BOOL* pret;
1598*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager;
1599*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_t* p_manager_mutex;
1600*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL check_pterm;
1601*3ac0a46fSAndroid Build Coastguard Worker } opj_t1_cblk_decode_processing_job_t;
1602*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_destroy_wrapper(void * t1)1603*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_destroy_wrapper(void* t1)
1604*3ac0a46fSAndroid Build Coastguard Worker {
1605*3ac0a46fSAndroid Build Coastguard Worker opj_t1_destroy((opj_t1_t*) t1);
1606*3ac0a46fSAndroid Build Coastguard Worker }
1607*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_clbl_decode_processor(void * user_data,opj_tls_t * tls)1608*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_clbl_decode_processor(void* user_data, opj_tls_t* tls)
1609*3ac0a46fSAndroid Build Coastguard Worker {
1610*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_dec_t* cblk;
1611*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_band_t* band;
1612*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t* tilec;
1613*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t* tccp;
1614*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32* OPJ_RESTRICT datap;
1615*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblk_w, cblk_h;
1616*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 x, y;
1617*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
1618*3ac0a46fSAndroid Build Coastguard Worker opj_t1_cblk_decode_processing_job_t* job;
1619*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t* t1;
1620*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 resno;
1621*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tile_w;
1622*3ac0a46fSAndroid Build Coastguard Worker
1623*3ac0a46fSAndroid Build Coastguard Worker job = (opj_t1_cblk_decode_processing_job_t*) user_data;
1624*3ac0a46fSAndroid Build Coastguard Worker
1625*3ac0a46fSAndroid Build Coastguard Worker cblk = job->cblk;
1626*3ac0a46fSAndroid Build Coastguard Worker
1627*3ac0a46fSAndroid Build Coastguard Worker if (!job->whole_tile_decoding) {
1628*3ac0a46fSAndroid Build Coastguard Worker cblk_w = (OPJ_UINT32)(cblk->x1 - cblk->x0);
1629*3ac0a46fSAndroid Build Coastguard Worker cblk_h = (OPJ_UINT32)(cblk->y1 - cblk->y0);
1630*3ac0a46fSAndroid Build Coastguard Worker
1631*3ac0a46fSAndroid Build Coastguard Worker cblk->decoded_data = (OPJ_INT32*)opj_aligned_malloc(sizeof(OPJ_INT32) *
1632*3ac0a46fSAndroid Build Coastguard Worker cblk_w * cblk_h);
1633*3ac0a46fSAndroid Build Coastguard Worker if (cblk->decoded_data == NULL) {
1634*3ac0a46fSAndroid Build Coastguard Worker if (job->p_manager_mutex) {
1635*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_lock(job->p_manager_mutex);
1636*3ac0a46fSAndroid Build Coastguard Worker }
1637*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(job->p_manager, EVT_ERROR,
1638*3ac0a46fSAndroid Build Coastguard Worker "Cannot allocate cblk->decoded_data\n");
1639*3ac0a46fSAndroid Build Coastguard Worker if (job->p_manager_mutex) {
1640*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_unlock(job->p_manager_mutex);
1641*3ac0a46fSAndroid Build Coastguard Worker }
1642*3ac0a46fSAndroid Build Coastguard Worker *(job->pret) = OPJ_FALSE;
1643*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
1644*3ac0a46fSAndroid Build Coastguard Worker return;
1645*3ac0a46fSAndroid Build Coastguard Worker }
1646*3ac0a46fSAndroid Build Coastguard Worker /* Zero-init required */
1647*3ac0a46fSAndroid Build Coastguard Worker memset(cblk->decoded_data, 0, sizeof(OPJ_INT32) * cblk_w * cblk_h);
1648*3ac0a46fSAndroid Build Coastguard Worker } else if (cblk->decoded_data) {
1649*3ac0a46fSAndroid Build Coastguard Worker /* Not sure if that code path can happen, but better be */
1650*3ac0a46fSAndroid Build Coastguard Worker /* safe than sorry */
1651*3ac0a46fSAndroid Build Coastguard Worker opj_aligned_free(cblk->decoded_data);
1652*3ac0a46fSAndroid Build Coastguard Worker cblk->decoded_data = NULL;
1653*3ac0a46fSAndroid Build Coastguard Worker }
1654*3ac0a46fSAndroid Build Coastguard Worker
1655*3ac0a46fSAndroid Build Coastguard Worker resno = job->resno;
1656*3ac0a46fSAndroid Build Coastguard Worker band = job->band;
1657*3ac0a46fSAndroid Build Coastguard Worker tilec = job->tilec;
1658*3ac0a46fSAndroid Build Coastguard Worker tccp = job->tccp;
1659*3ac0a46fSAndroid Build Coastguard Worker tile_w = (OPJ_UINT32)(tilec->resolutions[tilec->minimum_num_resolutions - 1].x1
1660*3ac0a46fSAndroid Build Coastguard Worker -
1661*3ac0a46fSAndroid Build Coastguard Worker tilec->resolutions[tilec->minimum_num_resolutions - 1].x0);
1662*3ac0a46fSAndroid Build Coastguard Worker
1663*3ac0a46fSAndroid Build Coastguard Worker if (!*(job->pret)) {
1664*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
1665*3ac0a46fSAndroid Build Coastguard Worker return;
1666*3ac0a46fSAndroid Build Coastguard Worker }
1667*3ac0a46fSAndroid Build Coastguard Worker
1668*3ac0a46fSAndroid Build Coastguard Worker t1 = (opj_t1_t*) opj_tls_get(tls, OPJ_TLS_KEY_T1);
1669*3ac0a46fSAndroid Build Coastguard Worker if (t1 == NULL) {
1670*3ac0a46fSAndroid Build Coastguard Worker t1 = opj_t1_create(OPJ_FALSE);
1671*3ac0a46fSAndroid Build Coastguard Worker if (t1 == NULL) {
1672*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(job->p_manager, EVT_ERROR,
1673*3ac0a46fSAndroid Build Coastguard Worker "Cannot allocate Tier 1 handle\n");
1674*3ac0a46fSAndroid Build Coastguard Worker *(job->pret) = OPJ_FALSE;
1675*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
1676*3ac0a46fSAndroid Build Coastguard Worker return;
1677*3ac0a46fSAndroid Build Coastguard Worker }
1678*3ac0a46fSAndroid Build Coastguard Worker if (!opj_tls_set(tls, OPJ_TLS_KEY_T1, t1, opj_t1_destroy_wrapper)) {
1679*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(job->p_manager, EVT_ERROR,
1680*3ac0a46fSAndroid Build Coastguard Worker "Unable to set t1 handle as TLS\n");
1681*3ac0a46fSAndroid Build Coastguard Worker opj_t1_destroy(t1);
1682*3ac0a46fSAndroid Build Coastguard Worker *(job->pret) = OPJ_FALSE;
1683*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
1684*3ac0a46fSAndroid Build Coastguard Worker return;
1685*3ac0a46fSAndroid Build Coastguard Worker }
1686*3ac0a46fSAndroid Build Coastguard Worker }
1687*3ac0a46fSAndroid Build Coastguard Worker t1->mustuse_cblkdatabuffer = job->mustuse_cblkdatabuffer;
1688*3ac0a46fSAndroid Build Coastguard Worker
1689*3ac0a46fSAndroid Build Coastguard Worker if ((tccp->cblksty & J2K_CCP_CBLKSTY_HT) != 0) {
1690*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_FALSE == opj_t1_ht_decode_cblk(
1691*3ac0a46fSAndroid Build Coastguard Worker t1,
1692*3ac0a46fSAndroid Build Coastguard Worker cblk,
1693*3ac0a46fSAndroid Build Coastguard Worker band->bandno,
1694*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)tccp->roishift,
1695*3ac0a46fSAndroid Build Coastguard Worker tccp->cblksty,
1696*3ac0a46fSAndroid Build Coastguard Worker job->p_manager,
1697*3ac0a46fSAndroid Build Coastguard Worker job->p_manager_mutex,
1698*3ac0a46fSAndroid Build Coastguard Worker job->check_pterm)) {
1699*3ac0a46fSAndroid Build Coastguard Worker *(job->pret) = OPJ_FALSE;
1700*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
1701*3ac0a46fSAndroid Build Coastguard Worker return;
1702*3ac0a46fSAndroid Build Coastguard Worker }
1703*3ac0a46fSAndroid Build Coastguard Worker } else {
1704*3ac0a46fSAndroid Build Coastguard Worker if (OPJ_FALSE == opj_t1_decode_cblk(
1705*3ac0a46fSAndroid Build Coastguard Worker t1,
1706*3ac0a46fSAndroid Build Coastguard Worker cblk,
1707*3ac0a46fSAndroid Build Coastguard Worker band->bandno,
1708*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)tccp->roishift,
1709*3ac0a46fSAndroid Build Coastguard Worker tccp->cblksty,
1710*3ac0a46fSAndroid Build Coastguard Worker job->p_manager,
1711*3ac0a46fSAndroid Build Coastguard Worker job->p_manager_mutex,
1712*3ac0a46fSAndroid Build Coastguard Worker job->check_pterm)) {
1713*3ac0a46fSAndroid Build Coastguard Worker *(job->pret) = OPJ_FALSE;
1714*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
1715*3ac0a46fSAndroid Build Coastguard Worker return;
1716*3ac0a46fSAndroid Build Coastguard Worker }
1717*3ac0a46fSAndroid Build Coastguard Worker }
1718*3ac0a46fSAndroid Build Coastguard Worker
1719*3ac0a46fSAndroid Build Coastguard Worker x = cblk->x0 - band->x0;
1720*3ac0a46fSAndroid Build Coastguard Worker y = cblk->y0 - band->y0;
1721*3ac0a46fSAndroid Build Coastguard Worker if (band->bandno & 1) {
1722*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
1723*3ac0a46fSAndroid Build Coastguard Worker x += pres->x1 - pres->x0;
1724*3ac0a46fSAndroid Build Coastguard Worker }
1725*3ac0a46fSAndroid Build Coastguard Worker if (band->bandno & 2) {
1726*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
1727*3ac0a46fSAndroid Build Coastguard Worker y += pres->y1 - pres->y0;
1728*3ac0a46fSAndroid Build Coastguard Worker }
1729*3ac0a46fSAndroid Build Coastguard Worker
1730*3ac0a46fSAndroid Build Coastguard Worker datap = cblk->decoded_data ? cblk->decoded_data : t1->data;
1731*3ac0a46fSAndroid Build Coastguard Worker cblk_w = t1->w;
1732*3ac0a46fSAndroid Build Coastguard Worker cblk_h = t1->h;
1733*3ac0a46fSAndroid Build Coastguard Worker
1734*3ac0a46fSAndroid Build Coastguard Worker if (tccp->roishift) {
1735*3ac0a46fSAndroid Build Coastguard Worker if (tccp->roishift >= 31) {
1736*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < cblk_h; ++j) {
1737*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk_w; ++i) {
1738*3ac0a46fSAndroid Build Coastguard Worker datap[(j * cblk_w) + i] = 0;
1739*3ac0a46fSAndroid Build Coastguard Worker }
1740*3ac0a46fSAndroid Build Coastguard Worker }
1741*3ac0a46fSAndroid Build Coastguard Worker } else {
1742*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 thresh = 1 << tccp->roishift;
1743*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < cblk_h; ++j) {
1744*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk_w; ++i) {
1745*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 val = datap[(j * cblk_w) + i];
1746*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 mag = abs(val);
1747*3ac0a46fSAndroid Build Coastguard Worker if (mag >= thresh) {
1748*3ac0a46fSAndroid Build Coastguard Worker mag >>= tccp->roishift;
1749*3ac0a46fSAndroid Build Coastguard Worker datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
1750*3ac0a46fSAndroid Build Coastguard Worker }
1751*3ac0a46fSAndroid Build Coastguard Worker }
1752*3ac0a46fSAndroid Build Coastguard Worker }
1753*3ac0a46fSAndroid Build Coastguard Worker }
1754*3ac0a46fSAndroid Build Coastguard Worker }
1755*3ac0a46fSAndroid Build Coastguard Worker
1756*3ac0a46fSAndroid Build Coastguard Worker /* Both can be non NULL if for example decoding a full tile and then */
1757*3ac0a46fSAndroid Build Coastguard Worker /* partially a tile. In which case partial decoding should be the */
1758*3ac0a46fSAndroid Build Coastguard Worker /* priority */
1759*3ac0a46fSAndroid Build Coastguard Worker assert((cblk->decoded_data != NULL) || (tilec->data != NULL));
1760*3ac0a46fSAndroid Build Coastguard Worker
1761*3ac0a46fSAndroid Build Coastguard Worker if (cblk->decoded_data) {
1762*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblk_size = cblk_w * cblk_h;
1763*3ac0a46fSAndroid Build Coastguard Worker if (tccp->qmfbid == 1) {
1764*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk_size; ++i) {
1765*3ac0a46fSAndroid Build Coastguard Worker datap[i] /= 2;
1766*3ac0a46fSAndroid Build Coastguard Worker }
1767*3ac0a46fSAndroid Build Coastguard Worker } else { /* if (tccp->qmfbid == 0) */
1768*3ac0a46fSAndroid Build Coastguard Worker const float stepsize = 0.5f * band->stepsize;
1769*3ac0a46fSAndroid Build Coastguard Worker i = 0;
1770*3ac0a46fSAndroid Build Coastguard Worker #ifdef __SSE2__
1771*3ac0a46fSAndroid Build Coastguard Worker {
1772*3ac0a46fSAndroid Build Coastguard Worker const __m128 xmm_stepsize = _mm_set1_ps(stepsize);
1773*3ac0a46fSAndroid Build Coastguard Worker for (; i < (cblk_size & ~15U); i += 16) {
1774*3ac0a46fSAndroid Build Coastguard Worker __m128 xmm0_data = _mm_cvtepi32_ps(_mm_load_si128((__m128i * const)(
1775*3ac0a46fSAndroid Build Coastguard Worker datap + 0)));
1776*3ac0a46fSAndroid Build Coastguard Worker __m128 xmm1_data = _mm_cvtepi32_ps(_mm_load_si128((__m128i * const)(
1777*3ac0a46fSAndroid Build Coastguard Worker datap + 4)));
1778*3ac0a46fSAndroid Build Coastguard Worker __m128 xmm2_data = _mm_cvtepi32_ps(_mm_load_si128((__m128i * const)(
1779*3ac0a46fSAndroid Build Coastguard Worker datap + 8)));
1780*3ac0a46fSAndroid Build Coastguard Worker __m128 xmm3_data = _mm_cvtepi32_ps(_mm_load_si128((__m128i * const)(
1781*3ac0a46fSAndroid Build Coastguard Worker datap + 12)));
1782*3ac0a46fSAndroid Build Coastguard Worker _mm_store_ps((float*)(datap + 0), _mm_mul_ps(xmm0_data, xmm_stepsize));
1783*3ac0a46fSAndroid Build Coastguard Worker _mm_store_ps((float*)(datap + 4), _mm_mul_ps(xmm1_data, xmm_stepsize));
1784*3ac0a46fSAndroid Build Coastguard Worker _mm_store_ps((float*)(datap + 8), _mm_mul_ps(xmm2_data, xmm_stepsize));
1785*3ac0a46fSAndroid Build Coastguard Worker _mm_store_ps((float*)(datap + 12), _mm_mul_ps(xmm3_data, xmm_stepsize));
1786*3ac0a46fSAndroid Build Coastguard Worker datap += 16;
1787*3ac0a46fSAndroid Build Coastguard Worker }
1788*3ac0a46fSAndroid Build Coastguard Worker }
1789*3ac0a46fSAndroid Build Coastguard Worker #endif
1790*3ac0a46fSAndroid Build Coastguard Worker for (; i < cblk_size; ++i) {
1791*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 tmp = ((OPJ_FLOAT32)(*datap)) * stepsize;
1792*3ac0a46fSAndroid Build Coastguard Worker memcpy(datap, &tmp, sizeof(tmp));
1793*3ac0a46fSAndroid Build Coastguard Worker datap++;
1794*3ac0a46fSAndroid Build Coastguard Worker }
1795*3ac0a46fSAndroid Build Coastguard Worker }
1796*3ac0a46fSAndroid Build Coastguard Worker } else if (tccp->qmfbid == 1) {
1797*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32* OPJ_RESTRICT tiledp = &tilec->data[(OPJ_SIZE_T)y * tile_w +
1798*3ac0a46fSAndroid Build Coastguard Worker (OPJ_SIZE_T)x];
1799*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < cblk_h; ++j) {
1800*3ac0a46fSAndroid Build Coastguard Worker i = 0;
1801*3ac0a46fSAndroid Build Coastguard Worker for (; i < (cblk_w & ~(OPJ_UINT32)3U); i += 4U) {
1802*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 tmp0 = datap[(j * cblk_w) + i + 0U];
1803*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 tmp1 = datap[(j * cblk_w) + i + 1U];
1804*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 tmp2 = datap[(j * cblk_w) + i + 2U];
1805*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 tmp3 = datap[(j * cblk_w) + i + 3U];
1806*3ac0a46fSAndroid Build Coastguard Worker ((OPJ_INT32*)tiledp)[(j * (OPJ_SIZE_T)tile_w) + i + 0U] = tmp0 / 2;
1807*3ac0a46fSAndroid Build Coastguard Worker ((OPJ_INT32*)tiledp)[(j * (OPJ_SIZE_T)tile_w) + i + 1U] = tmp1 / 2;
1808*3ac0a46fSAndroid Build Coastguard Worker ((OPJ_INT32*)tiledp)[(j * (OPJ_SIZE_T)tile_w) + i + 2U] = tmp2 / 2;
1809*3ac0a46fSAndroid Build Coastguard Worker ((OPJ_INT32*)tiledp)[(j * (OPJ_SIZE_T)tile_w) + i + 3U] = tmp3 / 2;
1810*3ac0a46fSAndroid Build Coastguard Worker }
1811*3ac0a46fSAndroid Build Coastguard Worker for (; i < cblk_w; ++i) {
1812*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 tmp = datap[(j * cblk_w) + i];
1813*3ac0a46fSAndroid Build Coastguard Worker ((OPJ_INT32*)tiledp)[(j * (OPJ_SIZE_T)tile_w) + i] = tmp / 2;
1814*3ac0a46fSAndroid Build Coastguard Worker }
1815*3ac0a46fSAndroid Build Coastguard Worker }
1816*3ac0a46fSAndroid Build Coastguard Worker } else { /* if (tccp->qmfbid == 0) */
1817*3ac0a46fSAndroid Build Coastguard Worker const float stepsize = 0.5f * band->stepsize;
1818*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32* OPJ_RESTRICT tiledp = (OPJ_FLOAT32*) &tilec->data[(OPJ_SIZE_T)y *
1819*3ac0a46fSAndroid Build Coastguard Worker tile_w + (OPJ_SIZE_T)x];
1820*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < cblk_h; ++j) {
1821*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32* OPJ_RESTRICT tiledp2 = tiledp;
1822*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk_w; ++i) {
1823*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32 tmp = (OPJ_FLOAT32) * datap * stepsize;
1824*3ac0a46fSAndroid Build Coastguard Worker *tiledp2 = tmp;
1825*3ac0a46fSAndroid Build Coastguard Worker datap++;
1826*3ac0a46fSAndroid Build Coastguard Worker tiledp2++;
1827*3ac0a46fSAndroid Build Coastguard Worker }
1828*3ac0a46fSAndroid Build Coastguard Worker tiledp += tile_w;
1829*3ac0a46fSAndroid Build Coastguard Worker }
1830*3ac0a46fSAndroid Build Coastguard Worker }
1831*3ac0a46fSAndroid Build Coastguard Worker
1832*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
1833*3ac0a46fSAndroid Build Coastguard Worker }
1834*3ac0a46fSAndroid Build Coastguard Worker
1835*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_decode_cblks(opj_tcd_t * tcd,volatile OPJ_BOOL * pret,opj_tcd_tilecomp_t * tilec,opj_tccp_t * tccp,opj_event_mgr_t * p_manager,opj_mutex_t * p_manager_mutex,OPJ_BOOL check_pterm)1836*3ac0a46fSAndroid Build Coastguard Worker void opj_t1_decode_cblks(opj_tcd_t* tcd,
1837*3ac0a46fSAndroid Build Coastguard Worker volatile OPJ_BOOL* pret,
1838*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t* tilec,
1839*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t* tccp,
1840*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager,
1841*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_t* p_manager_mutex,
1842*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL check_pterm
1843*3ac0a46fSAndroid Build Coastguard Worker )
1844*3ac0a46fSAndroid Build Coastguard Worker {
1845*3ac0a46fSAndroid Build Coastguard Worker opj_thread_pool_t* tp = tcd->thread_pool;
1846*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 resno, bandno, precno, cblkno;
1847*3ac0a46fSAndroid Build Coastguard Worker
1848*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
1849*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 codeblocks_decoded = 0;
1850*3ac0a46fSAndroid Build Coastguard Worker printf("Enter opj_t1_decode_cblks()\n");
1851*3ac0a46fSAndroid Build Coastguard Worker #endif
1852*3ac0a46fSAndroid Build Coastguard Worker
1853*3ac0a46fSAndroid Build Coastguard Worker for (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) {
1854*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_resolution_t* res = &tilec->resolutions[resno];
1855*3ac0a46fSAndroid Build Coastguard Worker
1856*3ac0a46fSAndroid Build Coastguard Worker for (bandno = 0; bandno < res->numbands; ++bandno) {
1857*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_band_t* OPJ_RESTRICT band = &res->bands[bandno];
1858*3ac0a46fSAndroid Build Coastguard Worker
1859*3ac0a46fSAndroid Build Coastguard Worker for (precno = 0; precno < res->pw * res->ph; ++precno) {
1860*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_precinct_t* precinct = &band->precincts[precno];
1861*3ac0a46fSAndroid Build Coastguard Worker
1862*3ac0a46fSAndroid Build Coastguard Worker if (!opj_tcd_is_subband_area_of_interest(tcd,
1863*3ac0a46fSAndroid Build Coastguard Worker tilec->compno,
1864*3ac0a46fSAndroid Build Coastguard Worker resno,
1865*3ac0a46fSAndroid Build Coastguard Worker band->bandno,
1866*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)precinct->x0,
1867*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)precinct->y0,
1868*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)precinct->x1,
1869*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)precinct->y1)) {
1870*3ac0a46fSAndroid Build Coastguard Worker for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
1871*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
1872*3ac0a46fSAndroid Build Coastguard Worker if (cblk->decoded_data) {
1873*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
1874*3ac0a46fSAndroid Build Coastguard Worker printf("Discarding codeblock %d,%d at resno=%d, bandno=%d\n",
1875*3ac0a46fSAndroid Build Coastguard Worker cblk->x0, cblk->y0, resno, bandno);
1876*3ac0a46fSAndroid Build Coastguard Worker #endif
1877*3ac0a46fSAndroid Build Coastguard Worker opj_aligned_free(cblk->decoded_data);
1878*3ac0a46fSAndroid Build Coastguard Worker cblk->decoded_data = NULL;
1879*3ac0a46fSAndroid Build Coastguard Worker }
1880*3ac0a46fSAndroid Build Coastguard Worker }
1881*3ac0a46fSAndroid Build Coastguard Worker continue;
1882*3ac0a46fSAndroid Build Coastguard Worker }
1883*3ac0a46fSAndroid Build Coastguard Worker
1884*3ac0a46fSAndroid Build Coastguard Worker for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
1885*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
1886*3ac0a46fSAndroid Build Coastguard Worker opj_t1_cblk_decode_processing_job_t* job;
1887*3ac0a46fSAndroid Build Coastguard Worker
1888*3ac0a46fSAndroid Build Coastguard Worker if (!opj_tcd_is_subband_area_of_interest(tcd,
1889*3ac0a46fSAndroid Build Coastguard Worker tilec->compno,
1890*3ac0a46fSAndroid Build Coastguard Worker resno,
1891*3ac0a46fSAndroid Build Coastguard Worker band->bandno,
1892*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)cblk->x0,
1893*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)cblk->y0,
1894*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)cblk->x1,
1895*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)cblk->y1)) {
1896*3ac0a46fSAndroid Build Coastguard Worker if (cblk->decoded_data) {
1897*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
1898*3ac0a46fSAndroid Build Coastguard Worker printf("Discarding codeblock %d,%d at resno=%d, bandno=%d\n",
1899*3ac0a46fSAndroid Build Coastguard Worker cblk->x0, cblk->y0, resno, bandno);
1900*3ac0a46fSAndroid Build Coastguard Worker #endif
1901*3ac0a46fSAndroid Build Coastguard Worker opj_aligned_free(cblk->decoded_data);
1902*3ac0a46fSAndroid Build Coastguard Worker cblk->decoded_data = NULL;
1903*3ac0a46fSAndroid Build Coastguard Worker }
1904*3ac0a46fSAndroid Build Coastguard Worker continue;
1905*3ac0a46fSAndroid Build Coastguard Worker }
1906*3ac0a46fSAndroid Build Coastguard Worker
1907*3ac0a46fSAndroid Build Coastguard Worker if (!tcd->whole_tile_decoding) {
1908*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblk_w = (OPJ_UINT32)(cblk->x1 - cblk->x0);
1909*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblk_h = (OPJ_UINT32)(cblk->y1 - cblk->y0);
1910*3ac0a46fSAndroid Build Coastguard Worker if (cblk->decoded_data != NULL) {
1911*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
1912*3ac0a46fSAndroid Build Coastguard Worker printf("Reusing codeblock %d,%d at resno=%d, bandno=%d\n",
1913*3ac0a46fSAndroid Build Coastguard Worker cblk->x0, cblk->y0, resno, bandno);
1914*3ac0a46fSAndroid Build Coastguard Worker #endif
1915*3ac0a46fSAndroid Build Coastguard Worker continue;
1916*3ac0a46fSAndroid Build Coastguard Worker }
1917*3ac0a46fSAndroid Build Coastguard Worker if (cblk_w == 0 || cblk_h == 0) {
1918*3ac0a46fSAndroid Build Coastguard Worker continue;
1919*3ac0a46fSAndroid Build Coastguard Worker }
1920*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
1921*3ac0a46fSAndroid Build Coastguard Worker printf("Decoding codeblock %d,%d at resno=%d, bandno=%d\n",
1922*3ac0a46fSAndroid Build Coastguard Worker cblk->x0, cblk->y0, resno, bandno);
1923*3ac0a46fSAndroid Build Coastguard Worker #endif
1924*3ac0a46fSAndroid Build Coastguard Worker }
1925*3ac0a46fSAndroid Build Coastguard Worker
1926*3ac0a46fSAndroid Build Coastguard Worker job = (opj_t1_cblk_decode_processing_job_t*) opj_calloc(1,
1927*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_t1_cblk_decode_processing_job_t));
1928*3ac0a46fSAndroid Build Coastguard Worker if (!job) {
1929*3ac0a46fSAndroid Build Coastguard Worker *pret = OPJ_FALSE;
1930*3ac0a46fSAndroid Build Coastguard Worker return;
1931*3ac0a46fSAndroid Build Coastguard Worker }
1932*3ac0a46fSAndroid Build Coastguard Worker job->whole_tile_decoding = tcd->whole_tile_decoding;
1933*3ac0a46fSAndroid Build Coastguard Worker job->resno = resno;
1934*3ac0a46fSAndroid Build Coastguard Worker job->cblk = cblk;
1935*3ac0a46fSAndroid Build Coastguard Worker job->band = band;
1936*3ac0a46fSAndroid Build Coastguard Worker job->tilec = tilec;
1937*3ac0a46fSAndroid Build Coastguard Worker job->tccp = tccp;
1938*3ac0a46fSAndroid Build Coastguard Worker job->pret = pret;
1939*3ac0a46fSAndroid Build Coastguard Worker job->p_manager_mutex = p_manager_mutex;
1940*3ac0a46fSAndroid Build Coastguard Worker job->p_manager = p_manager;
1941*3ac0a46fSAndroid Build Coastguard Worker job->check_pterm = check_pterm;
1942*3ac0a46fSAndroid Build Coastguard Worker job->mustuse_cblkdatabuffer = opj_thread_pool_get_thread_count(tp) > 1;
1943*3ac0a46fSAndroid Build Coastguard Worker opj_thread_pool_submit_job(tp, opj_t1_clbl_decode_processor, job);
1944*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
1945*3ac0a46fSAndroid Build Coastguard Worker codeblocks_decoded ++;
1946*3ac0a46fSAndroid Build Coastguard Worker #endif
1947*3ac0a46fSAndroid Build Coastguard Worker if (!(*pret)) {
1948*3ac0a46fSAndroid Build Coastguard Worker return;
1949*3ac0a46fSAndroid Build Coastguard Worker }
1950*3ac0a46fSAndroid Build Coastguard Worker } /* cblkno */
1951*3ac0a46fSAndroid Build Coastguard Worker } /* precno */
1952*3ac0a46fSAndroid Build Coastguard Worker } /* bandno */
1953*3ac0a46fSAndroid Build Coastguard Worker } /* resno */
1954*3ac0a46fSAndroid Build Coastguard Worker
1955*3ac0a46fSAndroid Build Coastguard Worker #ifdef DEBUG_VERBOSE
1956*3ac0a46fSAndroid Build Coastguard Worker printf("Leave opj_t1_decode_cblks(). Number decoded: %d\n", codeblocks_decoded);
1957*3ac0a46fSAndroid Build Coastguard Worker #endif
1958*3ac0a46fSAndroid Build Coastguard Worker return;
1959*3ac0a46fSAndroid Build Coastguard Worker }
1960*3ac0a46fSAndroid Build Coastguard Worker
1961*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_decode_cblk(opj_t1_t * t1,opj_tcd_cblk_dec_t * cblk,OPJ_UINT32 orient,OPJ_UINT32 roishift,OPJ_UINT32 cblksty,opj_event_mgr_t * p_manager,opj_mutex_t * p_manager_mutex,OPJ_BOOL check_pterm)1962*3ac0a46fSAndroid Build Coastguard Worker static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
1963*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_dec_t* cblk,
1964*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 orient,
1965*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 roishift,
1966*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty,
1967*3ac0a46fSAndroid Build Coastguard Worker opj_event_mgr_t *p_manager,
1968*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_t* p_manager_mutex,
1969*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL check_pterm)
1970*3ac0a46fSAndroid Build Coastguard Worker {
1971*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t *mqc = &(t1->mqc); /* MQC component */
1972*3ac0a46fSAndroid Build Coastguard Worker
1973*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno_plus_one;
1974*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 passtype;
1975*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 segno, passno;
1976*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE* cblkdata = NULL;
1977*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblkdataindex = 0;
1978*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */
1979*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32* original_t1_data = NULL;
1980*3ac0a46fSAndroid Build Coastguard Worker
1981*3ac0a46fSAndroid Build Coastguard Worker mqc->lut_ctxno_zc_orient = lut_ctxno_zc + (orient << 9);
1982*3ac0a46fSAndroid Build Coastguard Worker
1983*3ac0a46fSAndroid Build Coastguard Worker if (!opj_t1_allocate_buffers(
1984*3ac0a46fSAndroid Build Coastguard Worker t1,
1985*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)(cblk->x1 - cblk->x0),
1986*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)(cblk->y1 - cblk->y0))) {
1987*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
1988*3ac0a46fSAndroid Build Coastguard Worker }
1989*3ac0a46fSAndroid Build Coastguard Worker
1990*3ac0a46fSAndroid Build Coastguard Worker bpno_plus_one = (OPJ_INT32)(roishift + cblk->numbps);
1991*3ac0a46fSAndroid Build Coastguard Worker if (bpno_plus_one >= 31) {
1992*3ac0a46fSAndroid Build Coastguard Worker if (p_manager_mutex) {
1993*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_lock(p_manager_mutex);
1994*3ac0a46fSAndroid Build Coastguard Worker }
1995*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
1996*3ac0a46fSAndroid Build Coastguard Worker "opj_t1_decode_cblk(): unsupported bpno_plus_one = %d >= 31\n",
1997*3ac0a46fSAndroid Build Coastguard Worker bpno_plus_one);
1998*3ac0a46fSAndroid Build Coastguard Worker if (p_manager_mutex) {
1999*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_unlock(p_manager_mutex);
2000*3ac0a46fSAndroid Build Coastguard Worker }
2001*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2002*3ac0a46fSAndroid Build Coastguard Worker }
2003*3ac0a46fSAndroid Build Coastguard Worker passtype = 2;
2004*3ac0a46fSAndroid Build Coastguard Worker
2005*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_resetstates(mqc);
2006*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
2007*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
2008*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
2009*3ac0a46fSAndroid Build Coastguard Worker
2010*3ac0a46fSAndroid Build Coastguard Worker /* Even if we have a single chunk, in multi-threaded decoding */
2011*3ac0a46fSAndroid Build Coastguard Worker /* the insertion of our synthetic marker might potentially override */
2012*3ac0a46fSAndroid Build Coastguard Worker /* valid codestream of other codeblocks decoded in parallel. */
2013*3ac0a46fSAndroid Build Coastguard Worker if (cblk->numchunks > 1 || t1->mustuse_cblkdatabuffer) {
2014*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
2015*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblk_len;
2016*3ac0a46fSAndroid Build Coastguard Worker
2017*3ac0a46fSAndroid Build Coastguard Worker /* Compute whole codeblock length from chunk lengths */
2018*3ac0a46fSAndroid Build Coastguard Worker cblk_len = 0;
2019*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk->numchunks; i++) {
2020*3ac0a46fSAndroid Build Coastguard Worker cblk_len += cblk->chunks[i].len;
2021*3ac0a46fSAndroid Build Coastguard Worker }
2022*3ac0a46fSAndroid Build Coastguard Worker
2023*3ac0a46fSAndroid Build Coastguard Worker /* Allocate temporary memory if needed */
2024*3ac0a46fSAndroid Build Coastguard Worker if (cblk_len + OPJ_COMMON_CBLK_DATA_EXTRA > t1->cblkdatabuffersize) {
2025*3ac0a46fSAndroid Build Coastguard Worker cblkdata = (OPJ_BYTE*)opj_realloc(t1->cblkdatabuffer,
2026*3ac0a46fSAndroid Build Coastguard Worker cblk_len + OPJ_COMMON_CBLK_DATA_EXTRA);
2027*3ac0a46fSAndroid Build Coastguard Worker if (cblkdata == NULL) {
2028*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2029*3ac0a46fSAndroid Build Coastguard Worker }
2030*3ac0a46fSAndroid Build Coastguard Worker t1->cblkdatabuffer = cblkdata;
2031*3ac0a46fSAndroid Build Coastguard Worker memset(t1->cblkdatabuffer + cblk_len, 0, OPJ_COMMON_CBLK_DATA_EXTRA);
2032*3ac0a46fSAndroid Build Coastguard Worker t1->cblkdatabuffersize = cblk_len + OPJ_COMMON_CBLK_DATA_EXTRA;
2033*3ac0a46fSAndroid Build Coastguard Worker }
2034*3ac0a46fSAndroid Build Coastguard Worker
2035*3ac0a46fSAndroid Build Coastguard Worker /* Concatenate all chunks */
2036*3ac0a46fSAndroid Build Coastguard Worker cblkdata = t1->cblkdatabuffer;
2037*3ac0a46fSAndroid Build Coastguard Worker cblk_len = 0;
2038*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk->numchunks; i++) {
2039*3ac0a46fSAndroid Build Coastguard Worker memcpy(cblkdata + cblk_len, cblk->chunks[i].data, cblk->chunks[i].len);
2040*3ac0a46fSAndroid Build Coastguard Worker cblk_len += cblk->chunks[i].len;
2041*3ac0a46fSAndroid Build Coastguard Worker }
2042*3ac0a46fSAndroid Build Coastguard Worker } else if (cblk->numchunks == 1) {
2043*3ac0a46fSAndroid Build Coastguard Worker cblkdata = cblk->chunks[0].data;
2044*3ac0a46fSAndroid Build Coastguard Worker } else {
2045*3ac0a46fSAndroid Build Coastguard Worker /* Not sure if that can happen in practice, but avoid Coverity to */
2046*3ac0a46fSAndroid Build Coastguard Worker /* think we will dereference a null cblkdta pointer */
2047*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2048*3ac0a46fSAndroid Build Coastguard Worker }
2049*3ac0a46fSAndroid Build Coastguard Worker
2050*3ac0a46fSAndroid Build Coastguard Worker /* For subtile decoding, directly decode in the decoded_data buffer of */
2051*3ac0a46fSAndroid Build Coastguard Worker /* the code-block. Hack t1->data to point to it, and restore it later */
2052*3ac0a46fSAndroid Build Coastguard Worker if (cblk->decoded_data) {
2053*3ac0a46fSAndroid Build Coastguard Worker original_t1_data = t1->data;
2054*3ac0a46fSAndroid Build Coastguard Worker t1->data = cblk->decoded_data;
2055*3ac0a46fSAndroid Build Coastguard Worker }
2056*3ac0a46fSAndroid Build Coastguard Worker
2057*3ac0a46fSAndroid Build Coastguard Worker for (segno = 0; segno < cblk->real_num_segs; ++segno) {
2058*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_seg_t *seg = &cblk->segs[segno];
2059*3ac0a46fSAndroid Build Coastguard Worker
2060*3ac0a46fSAndroid Build Coastguard Worker /* BYPASS mode */
2061*3ac0a46fSAndroid Build Coastguard Worker type = ((bpno_plus_one <= ((OPJ_INT32)(cblk->numbps)) - 4) && (passtype < 2) &&
2062*3ac0a46fSAndroid Build Coastguard Worker (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
2063*3ac0a46fSAndroid Build Coastguard Worker
2064*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) {
2065*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_raw_init_dec(mqc, cblkdata + cblkdataindex, seg->len,
2066*3ac0a46fSAndroid Build Coastguard Worker OPJ_COMMON_CBLK_DATA_EXTRA);
2067*3ac0a46fSAndroid Build Coastguard Worker } else {
2068*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_init_dec(mqc, cblkdata + cblkdataindex, seg->len,
2069*3ac0a46fSAndroid Build Coastguard Worker OPJ_COMMON_CBLK_DATA_EXTRA);
2070*3ac0a46fSAndroid Build Coastguard Worker }
2071*3ac0a46fSAndroid Build Coastguard Worker cblkdataindex += seg->len;
2072*3ac0a46fSAndroid Build Coastguard Worker
2073*3ac0a46fSAndroid Build Coastguard Worker for (passno = 0; (passno < seg->real_num_passes) &&
2074*3ac0a46fSAndroid Build Coastguard Worker (bpno_plus_one >= 1); ++passno) {
2075*3ac0a46fSAndroid Build Coastguard Worker switch (passtype) {
2076*3ac0a46fSAndroid Build Coastguard Worker case 0:
2077*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) {
2078*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_raw(t1, bpno_plus_one, (OPJ_INT32)cblksty);
2079*3ac0a46fSAndroid Build Coastguard Worker } else {
2080*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_sigpass_mqc(t1, bpno_plus_one, (OPJ_INT32)cblksty);
2081*3ac0a46fSAndroid Build Coastguard Worker }
2082*3ac0a46fSAndroid Build Coastguard Worker break;
2083*3ac0a46fSAndroid Build Coastguard Worker case 1:
2084*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) {
2085*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_raw(t1, bpno_plus_one);
2086*3ac0a46fSAndroid Build Coastguard Worker } else {
2087*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_refpass_mqc(t1, bpno_plus_one);
2088*3ac0a46fSAndroid Build Coastguard Worker }
2089*3ac0a46fSAndroid Build Coastguard Worker break;
2090*3ac0a46fSAndroid Build Coastguard Worker case 2:
2091*3ac0a46fSAndroid Build Coastguard Worker opj_t1_dec_clnpass(t1, bpno_plus_one, (OPJ_INT32)cblksty);
2092*3ac0a46fSAndroid Build Coastguard Worker break;
2093*3ac0a46fSAndroid Build Coastguard Worker }
2094*3ac0a46fSAndroid Build Coastguard Worker
2095*3ac0a46fSAndroid Build Coastguard Worker if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
2096*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_resetstates(mqc);
2097*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
2098*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
2099*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
2100*3ac0a46fSAndroid Build Coastguard Worker }
2101*3ac0a46fSAndroid Build Coastguard Worker if (++passtype == 3) {
2102*3ac0a46fSAndroid Build Coastguard Worker passtype = 0;
2103*3ac0a46fSAndroid Build Coastguard Worker bpno_plus_one--;
2104*3ac0a46fSAndroid Build Coastguard Worker }
2105*3ac0a46fSAndroid Build Coastguard Worker }
2106*3ac0a46fSAndroid Build Coastguard Worker
2107*3ac0a46fSAndroid Build Coastguard Worker opq_mqc_finish_dec(mqc);
2108*3ac0a46fSAndroid Build Coastguard Worker }
2109*3ac0a46fSAndroid Build Coastguard Worker
2110*3ac0a46fSAndroid Build Coastguard Worker if (check_pterm) {
2111*3ac0a46fSAndroid Build Coastguard Worker if (mqc->bp + 2 < mqc->end) {
2112*3ac0a46fSAndroid Build Coastguard Worker if (p_manager_mutex) {
2113*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_lock(p_manager_mutex);
2114*3ac0a46fSAndroid Build Coastguard Worker }
2115*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2116*3ac0a46fSAndroid Build Coastguard Worker "PTERM check failure: %d remaining bytes in code block (%d used / %d)\n",
2117*3ac0a46fSAndroid Build Coastguard Worker (int)(mqc->end - mqc->bp) - 2,
2118*3ac0a46fSAndroid Build Coastguard Worker (int)(mqc->bp - mqc->start),
2119*3ac0a46fSAndroid Build Coastguard Worker (int)(mqc->end - mqc->start));
2120*3ac0a46fSAndroid Build Coastguard Worker if (p_manager_mutex) {
2121*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_unlock(p_manager_mutex);
2122*3ac0a46fSAndroid Build Coastguard Worker }
2123*3ac0a46fSAndroid Build Coastguard Worker } else if (mqc->end_of_byte_stream_counter > 2) {
2124*3ac0a46fSAndroid Build Coastguard Worker if (p_manager_mutex) {
2125*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_lock(p_manager_mutex);
2126*3ac0a46fSAndroid Build Coastguard Worker }
2127*3ac0a46fSAndroid Build Coastguard Worker opj_event_msg(p_manager, EVT_WARNING,
2128*3ac0a46fSAndroid Build Coastguard Worker "PTERM check failure: %d synthetized 0xFF markers read\n",
2129*3ac0a46fSAndroid Build Coastguard Worker mqc->end_of_byte_stream_counter);
2130*3ac0a46fSAndroid Build Coastguard Worker if (p_manager_mutex) {
2131*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_unlock(p_manager_mutex);
2132*3ac0a46fSAndroid Build Coastguard Worker }
2133*3ac0a46fSAndroid Build Coastguard Worker }
2134*3ac0a46fSAndroid Build Coastguard Worker }
2135*3ac0a46fSAndroid Build Coastguard Worker
2136*3ac0a46fSAndroid Build Coastguard Worker /* Restore original t1->data is needed */
2137*3ac0a46fSAndroid Build Coastguard Worker if (cblk->decoded_data) {
2138*3ac0a46fSAndroid Build Coastguard Worker t1->data = original_t1_data;
2139*3ac0a46fSAndroid Build Coastguard Worker }
2140*3ac0a46fSAndroid Build Coastguard Worker
2141*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2142*3ac0a46fSAndroid Build Coastguard Worker }
2143*3ac0a46fSAndroid Build Coastguard Worker
2144*3ac0a46fSAndroid Build Coastguard Worker
2145*3ac0a46fSAndroid Build Coastguard Worker typedef struct {
2146*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno;
2147*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 resno;
2148*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_enc_t* cblk;
2149*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tile_t *tile;
2150*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_band_t* band;
2151*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t* tilec;
2152*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t* tccp;
2153*3ac0a46fSAndroid Build Coastguard Worker const OPJ_FLOAT64 * mct_norms;
2154*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 mct_numcomps;
2155*3ac0a46fSAndroid Build Coastguard Worker volatile OPJ_BOOL* pret;
2156*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_t* mutex;
2157*3ac0a46fSAndroid Build Coastguard Worker } opj_t1_cblk_encode_processing_job_t;
2158*3ac0a46fSAndroid Build Coastguard Worker
2159*3ac0a46fSAndroid Build Coastguard Worker /** Procedure to deal with a asynchronous code-block encoding job.
2160*3ac0a46fSAndroid Build Coastguard Worker *
2161*3ac0a46fSAndroid Build Coastguard Worker * @param user_data Pointer to a opj_t1_cblk_encode_processing_job_t* structure
2162*3ac0a46fSAndroid Build Coastguard Worker * @param tls TLS handle.
2163*3ac0a46fSAndroid Build Coastguard Worker */
opj_t1_cblk_encode_processor(void * user_data,opj_tls_t * tls)2164*3ac0a46fSAndroid Build Coastguard Worker static void opj_t1_cblk_encode_processor(void* user_data, opj_tls_t* tls)
2165*3ac0a46fSAndroid Build Coastguard Worker {
2166*3ac0a46fSAndroid Build Coastguard Worker opj_t1_cblk_encode_processing_job_t* job =
2167*3ac0a46fSAndroid Build Coastguard Worker (opj_t1_cblk_encode_processing_job_t*)user_data;
2168*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_enc_t* cblk = job->cblk;
2169*3ac0a46fSAndroid Build Coastguard Worker const opj_tcd_band_t* band = job->band;
2170*3ac0a46fSAndroid Build Coastguard Worker const opj_tcd_tilecomp_t* tilec = job->tilec;
2171*3ac0a46fSAndroid Build Coastguard Worker const opj_tccp_t* tccp = job->tccp;
2172*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 resno = job->resno;
2173*3ac0a46fSAndroid Build Coastguard Worker opj_t1_t* t1;
2174*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
2175*3ac0a46fSAndroid Build Coastguard Worker
2176*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32* OPJ_RESTRICT tiledp;
2177*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblk_w;
2178*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblk_h;
2179*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
2180*3ac0a46fSAndroid Build Coastguard Worker
2181*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 x = cblk->x0 - band->x0;
2182*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 y = cblk->y0 - band->y0;
2183*3ac0a46fSAndroid Build Coastguard Worker
2184*3ac0a46fSAndroid Build Coastguard Worker if (!*(job->pret)) {
2185*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
2186*3ac0a46fSAndroid Build Coastguard Worker return;
2187*3ac0a46fSAndroid Build Coastguard Worker }
2188*3ac0a46fSAndroid Build Coastguard Worker
2189*3ac0a46fSAndroid Build Coastguard Worker t1 = (opj_t1_t*) opj_tls_get(tls, OPJ_TLS_KEY_T1);
2190*3ac0a46fSAndroid Build Coastguard Worker if (t1 == NULL) {
2191*3ac0a46fSAndroid Build Coastguard Worker t1 = opj_t1_create(OPJ_TRUE); /* OPJ_TRUE == T1 for encoding */
2192*3ac0a46fSAndroid Build Coastguard Worker opj_tls_set(tls, OPJ_TLS_KEY_T1, t1, opj_t1_destroy_wrapper);
2193*3ac0a46fSAndroid Build Coastguard Worker }
2194*3ac0a46fSAndroid Build Coastguard Worker
2195*3ac0a46fSAndroid Build Coastguard Worker if (band->bandno & 1) {
2196*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
2197*3ac0a46fSAndroid Build Coastguard Worker x += pres->x1 - pres->x0;
2198*3ac0a46fSAndroid Build Coastguard Worker }
2199*3ac0a46fSAndroid Build Coastguard Worker if (band->bandno & 2) {
2200*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
2201*3ac0a46fSAndroid Build Coastguard Worker y += pres->y1 - pres->y0;
2202*3ac0a46fSAndroid Build Coastguard Worker }
2203*3ac0a46fSAndroid Build Coastguard Worker
2204*3ac0a46fSAndroid Build Coastguard Worker if (!opj_t1_allocate_buffers(
2205*3ac0a46fSAndroid Build Coastguard Worker t1,
2206*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)(cblk->x1 - cblk->x0),
2207*3ac0a46fSAndroid Build Coastguard Worker (OPJ_UINT32)(cblk->y1 - cblk->y0))) {
2208*3ac0a46fSAndroid Build Coastguard Worker *(job->pret) = OPJ_FALSE;
2209*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
2210*3ac0a46fSAndroid Build Coastguard Worker return;
2211*3ac0a46fSAndroid Build Coastguard Worker }
2212*3ac0a46fSAndroid Build Coastguard Worker
2213*3ac0a46fSAndroid Build Coastguard Worker cblk_w = t1->w;
2214*3ac0a46fSAndroid Build Coastguard Worker cblk_h = t1->h;
2215*3ac0a46fSAndroid Build Coastguard Worker
2216*3ac0a46fSAndroid Build Coastguard Worker tiledp = &tilec->data[(OPJ_SIZE_T)y * tile_w + (OPJ_SIZE_T)x];
2217*3ac0a46fSAndroid Build Coastguard Worker
2218*3ac0a46fSAndroid Build Coastguard Worker if (tccp->qmfbid == 1) {
2219*3ac0a46fSAndroid Build Coastguard Worker /* Do multiplication on unsigned type, even if the
2220*3ac0a46fSAndroid Build Coastguard Worker * underlying type is signed, to avoid potential
2221*3ac0a46fSAndroid Build Coastguard Worker * int overflow on large value (the output will be
2222*3ac0a46fSAndroid Build Coastguard Worker * incorrect in such situation, but whatever...)
2223*3ac0a46fSAndroid Build Coastguard Worker * This assumes complement-to-2 signed integer
2224*3ac0a46fSAndroid Build Coastguard Worker * representation
2225*3ac0a46fSAndroid Build Coastguard Worker * Fixes https://github.com/uclouvain/openjpeg/issues/1053
2226*3ac0a46fSAndroid Build Coastguard Worker */
2227*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* OPJ_RESTRICT tiledp_u = (OPJ_UINT32*) tiledp;
2228*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* OPJ_RESTRICT t1data = (OPJ_UINT32*) t1->data;
2229*3ac0a46fSAndroid Build Coastguard Worker /* Change from "natural" order to "zigzag" order of T1 passes */
2230*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < (cblk_h & ~3U); j += 4) {
2231*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk_w; ++i) {
2232*3ac0a46fSAndroid Build Coastguard Worker t1data[0] = tiledp_u[(j + 0) * tile_w + i] << T1_NMSEDEC_FRACBITS;
2233*3ac0a46fSAndroid Build Coastguard Worker t1data[1] = tiledp_u[(j + 1) * tile_w + i] << T1_NMSEDEC_FRACBITS;
2234*3ac0a46fSAndroid Build Coastguard Worker t1data[2] = tiledp_u[(j + 2) * tile_w + i] << T1_NMSEDEC_FRACBITS;
2235*3ac0a46fSAndroid Build Coastguard Worker t1data[3] = tiledp_u[(j + 3) * tile_w + i] << T1_NMSEDEC_FRACBITS;
2236*3ac0a46fSAndroid Build Coastguard Worker t1data += 4;
2237*3ac0a46fSAndroid Build Coastguard Worker }
2238*3ac0a46fSAndroid Build Coastguard Worker }
2239*3ac0a46fSAndroid Build Coastguard Worker if (j < cblk_h) {
2240*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk_w; ++i) {
2241*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 k;
2242*3ac0a46fSAndroid Build Coastguard Worker for (k = j; k < cblk_h; k++) {
2243*3ac0a46fSAndroid Build Coastguard Worker t1data[0] = tiledp_u[k * tile_w + i] << T1_NMSEDEC_FRACBITS;
2244*3ac0a46fSAndroid Build Coastguard Worker t1data ++;
2245*3ac0a46fSAndroid Build Coastguard Worker }
2246*3ac0a46fSAndroid Build Coastguard Worker }
2247*3ac0a46fSAndroid Build Coastguard Worker }
2248*3ac0a46fSAndroid Build Coastguard Worker } else { /* if (tccp->qmfbid == 0) */
2249*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT32* OPJ_RESTRICT tiledp_f = (OPJ_FLOAT32*) tiledp;
2250*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32* OPJ_RESTRICT t1data = t1->data;
2251*3ac0a46fSAndroid Build Coastguard Worker /* Change from "natural" order to "zigzag" order of T1 passes */
2252*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < (cblk_h & ~3U); j += 4) {
2253*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk_w; ++i) {
2254*3ac0a46fSAndroid Build Coastguard Worker t1data[0] = (OPJ_INT32)opj_lrintf((tiledp_f[(j + 0) * tile_w + i] /
2255*3ac0a46fSAndroid Build Coastguard Worker band->stepsize) * (1 << T1_NMSEDEC_FRACBITS));
2256*3ac0a46fSAndroid Build Coastguard Worker t1data[1] = (OPJ_INT32)opj_lrintf((tiledp_f[(j + 1) * tile_w + i] /
2257*3ac0a46fSAndroid Build Coastguard Worker band->stepsize) * (1 << T1_NMSEDEC_FRACBITS));
2258*3ac0a46fSAndroid Build Coastguard Worker t1data[2] = (OPJ_INT32)opj_lrintf((tiledp_f[(j + 2) * tile_w + i] /
2259*3ac0a46fSAndroid Build Coastguard Worker band->stepsize) * (1 << T1_NMSEDEC_FRACBITS));
2260*3ac0a46fSAndroid Build Coastguard Worker t1data[3] = (OPJ_INT32)opj_lrintf((tiledp_f[(j + 3) * tile_w + i] /
2261*3ac0a46fSAndroid Build Coastguard Worker band->stepsize) * (1 << T1_NMSEDEC_FRACBITS));
2262*3ac0a46fSAndroid Build Coastguard Worker t1data += 4;
2263*3ac0a46fSAndroid Build Coastguard Worker }
2264*3ac0a46fSAndroid Build Coastguard Worker }
2265*3ac0a46fSAndroid Build Coastguard Worker if (j < cblk_h) {
2266*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < cblk_w; ++i) {
2267*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 k;
2268*3ac0a46fSAndroid Build Coastguard Worker for (k = j; k < cblk_h; k++) {
2269*3ac0a46fSAndroid Build Coastguard Worker t1data[0] = (OPJ_INT32)opj_lrintf((tiledp_f[k * tile_w + i] / band->stepsize)
2270*3ac0a46fSAndroid Build Coastguard Worker * (1 << T1_NMSEDEC_FRACBITS));
2271*3ac0a46fSAndroid Build Coastguard Worker t1data ++;
2272*3ac0a46fSAndroid Build Coastguard Worker }
2273*3ac0a46fSAndroid Build Coastguard Worker }
2274*3ac0a46fSAndroid Build Coastguard Worker }
2275*3ac0a46fSAndroid Build Coastguard Worker }
2276*3ac0a46fSAndroid Build Coastguard Worker
2277*3ac0a46fSAndroid Build Coastguard Worker {
2278*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 cumwmsedec =
2279*3ac0a46fSAndroid Build Coastguard Worker opj_t1_encode_cblk(
2280*3ac0a46fSAndroid Build Coastguard Worker t1,
2281*3ac0a46fSAndroid Build Coastguard Worker cblk,
2282*3ac0a46fSAndroid Build Coastguard Worker band->bandno,
2283*3ac0a46fSAndroid Build Coastguard Worker job->compno,
2284*3ac0a46fSAndroid Build Coastguard Worker tilec->numresolutions - 1 - resno,
2285*3ac0a46fSAndroid Build Coastguard Worker tccp->qmfbid,
2286*3ac0a46fSAndroid Build Coastguard Worker band->stepsize,
2287*3ac0a46fSAndroid Build Coastguard Worker tccp->cblksty,
2288*3ac0a46fSAndroid Build Coastguard Worker job->tile->numcomps,
2289*3ac0a46fSAndroid Build Coastguard Worker job->mct_norms,
2290*3ac0a46fSAndroid Build Coastguard Worker job->mct_numcomps);
2291*3ac0a46fSAndroid Build Coastguard Worker if (job->mutex) {
2292*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_lock(job->mutex);
2293*3ac0a46fSAndroid Build Coastguard Worker }
2294*3ac0a46fSAndroid Build Coastguard Worker job->tile->distotile += cumwmsedec;
2295*3ac0a46fSAndroid Build Coastguard Worker if (job->mutex) {
2296*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_unlock(job->mutex);
2297*3ac0a46fSAndroid Build Coastguard Worker }
2298*3ac0a46fSAndroid Build Coastguard Worker }
2299*3ac0a46fSAndroid Build Coastguard Worker
2300*3ac0a46fSAndroid Build Coastguard Worker opj_free(job);
2301*3ac0a46fSAndroid Build Coastguard Worker }
2302*3ac0a46fSAndroid Build Coastguard Worker
2303*3ac0a46fSAndroid Build Coastguard Worker
opj_t1_encode_cblks(opj_tcd_t * tcd,opj_tcd_tile_t * tile,opj_tcp_t * tcp,const OPJ_FLOAT64 * mct_norms,OPJ_UINT32 mct_numcomps)2304*3ac0a46fSAndroid Build Coastguard Worker OPJ_BOOL opj_t1_encode_cblks(opj_tcd_t* tcd,
2305*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tile_t *tile,
2306*3ac0a46fSAndroid Build Coastguard Worker opj_tcp_t *tcp,
2307*3ac0a46fSAndroid Build Coastguard Worker const OPJ_FLOAT64 * mct_norms,
2308*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 mct_numcomps
2309*3ac0a46fSAndroid Build Coastguard Worker )
2310*3ac0a46fSAndroid Build Coastguard Worker {
2311*3ac0a46fSAndroid Build Coastguard Worker volatile OPJ_BOOL ret = OPJ_TRUE;
2312*3ac0a46fSAndroid Build Coastguard Worker opj_thread_pool_t* tp = tcd->thread_pool;
2313*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno, resno, bandno, precno, cblkno;
2314*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_t* mutex = opj_mutex_create();
2315*3ac0a46fSAndroid Build Coastguard Worker
2316*3ac0a46fSAndroid Build Coastguard Worker tile->distotile = 0; /* fixed_quality */
2317*3ac0a46fSAndroid Build Coastguard Worker
2318*3ac0a46fSAndroid Build Coastguard Worker for (compno = 0; compno < tile->numcomps; ++compno) {
2319*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
2320*3ac0a46fSAndroid Build Coastguard Worker opj_tccp_t* tccp = &tcp->tccps[compno];
2321*3ac0a46fSAndroid Build Coastguard Worker
2322*3ac0a46fSAndroid Build Coastguard Worker for (resno = 0; resno < tilec->numresolutions; ++resno) {
2323*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_resolution_t *res = &tilec->resolutions[resno];
2324*3ac0a46fSAndroid Build Coastguard Worker
2325*3ac0a46fSAndroid Build Coastguard Worker for (bandno = 0; bandno < res->numbands; ++bandno) {
2326*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_band_t* OPJ_RESTRICT band = &res->bands[bandno];
2327*3ac0a46fSAndroid Build Coastguard Worker
2328*3ac0a46fSAndroid Build Coastguard Worker /* Skip empty bands */
2329*3ac0a46fSAndroid Build Coastguard Worker if (opj_tcd_is_band_empty(band)) {
2330*3ac0a46fSAndroid Build Coastguard Worker continue;
2331*3ac0a46fSAndroid Build Coastguard Worker }
2332*3ac0a46fSAndroid Build Coastguard Worker for (precno = 0; precno < res->pw * res->ph; ++precno) {
2333*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_precinct_t *prc = &band->precincts[precno];
2334*3ac0a46fSAndroid Build Coastguard Worker
2335*3ac0a46fSAndroid Build Coastguard Worker for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
2336*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
2337*3ac0a46fSAndroid Build Coastguard Worker
2338*3ac0a46fSAndroid Build Coastguard Worker opj_t1_cblk_encode_processing_job_t* job =
2339*3ac0a46fSAndroid Build Coastguard Worker (opj_t1_cblk_encode_processing_job_t*) opj_calloc(1,
2340*3ac0a46fSAndroid Build Coastguard Worker sizeof(opj_t1_cblk_encode_processing_job_t));
2341*3ac0a46fSAndroid Build Coastguard Worker if (!job) {
2342*3ac0a46fSAndroid Build Coastguard Worker ret = OPJ_FALSE;
2343*3ac0a46fSAndroid Build Coastguard Worker goto end;
2344*3ac0a46fSAndroid Build Coastguard Worker }
2345*3ac0a46fSAndroid Build Coastguard Worker job->compno = compno;
2346*3ac0a46fSAndroid Build Coastguard Worker job->tile = tile;
2347*3ac0a46fSAndroid Build Coastguard Worker job->resno = resno;
2348*3ac0a46fSAndroid Build Coastguard Worker job->cblk = cblk;
2349*3ac0a46fSAndroid Build Coastguard Worker job->band = band;
2350*3ac0a46fSAndroid Build Coastguard Worker job->tilec = tilec;
2351*3ac0a46fSAndroid Build Coastguard Worker job->tccp = tccp;
2352*3ac0a46fSAndroid Build Coastguard Worker job->mct_norms = mct_norms;
2353*3ac0a46fSAndroid Build Coastguard Worker job->mct_numcomps = mct_numcomps;
2354*3ac0a46fSAndroid Build Coastguard Worker job->pret = &ret;
2355*3ac0a46fSAndroid Build Coastguard Worker job->mutex = mutex;
2356*3ac0a46fSAndroid Build Coastguard Worker opj_thread_pool_submit_job(tp, opj_t1_cblk_encode_processor, job);
2357*3ac0a46fSAndroid Build Coastguard Worker
2358*3ac0a46fSAndroid Build Coastguard Worker } /* cblkno */
2359*3ac0a46fSAndroid Build Coastguard Worker } /* precno */
2360*3ac0a46fSAndroid Build Coastguard Worker } /* bandno */
2361*3ac0a46fSAndroid Build Coastguard Worker } /* resno */
2362*3ac0a46fSAndroid Build Coastguard Worker } /* compno */
2363*3ac0a46fSAndroid Build Coastguard Worker
2364*3ac0a46fSAndroid Build Coastguard Worker end:
2365*3ac0a46fSAndroid Build Coastguard Worker opj_thread_pool_wait_completion(tcd->thread_pool, 0);
2366*3ac0a46fSAndroid Build Coastguard Worker if (mutex) {
2367*3ac0a46fSAndroid Build Coastguard Worker opj_mutex_destroy(mutex);
2368*3ac0a46fSAndroid Build Coastguard Worker }
2369*3ac0a46fSAndroid Build Coastguard Worker
2370*3ac0a46fSAndroid Build Coastguard Worker return ret;
2371*3ac0a46fSAndroid Build Coastguard Worker }
2372*3ac0a46fSAndroid Build Coastguard Worker
2373*3ac0a46fSAndroid Build Coastguard Worker /* Returns whether the pass (bpno, passtype) is terminated */
opj_t1_enc_is_term_pass(opj_tcd_cblk_enc_t * cblk,OPJ_UINT32 cblksty,OPJ_INT32 bpno,OPJ_UINT32 passtype)2374*3ac0a46fSAndroid Build Coastguard Worker static int opj_t1_enc_is_term_pass(opj_tcd_cblk_enc_t* cblk,
2375*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty,
2376*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno,
2377*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 passtype)
2378*3ac0a46fSAndroid Build Coastguard Worker {
2379*3ac0a46fSAndroid Build Coastguard Worker /* Is it the last cleanup pass ? */
2380*3ac0a46fSAndroid Build Coastguard Worker if (passtype == 2 && bpno == 0) {
2381*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2382*3ac0a46fSAndroid Build Coastguard Worker }
2383*3ac0a46fSAndroid Build Coastguard Worker
2384*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
2385*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2386*3ac0a46fSAndroid Build Coastguard Worker }
2387*3ac0a46fSAndroid Build Coastguard Worker
2388*3ac0a46fSAndroid Build Coastguard Worker if ((cblksty & J2K_CCP_CBLKSTY_LAZY)) {
2389*3ac0a46fSAndroid Build Coastguard Worker /* For bypass arithmetic bypass, terminate the 4th cleanup pass */
2390*3ac0a46fSAndroid Build Coastguard Worker if ((bpno == ((OPJ_INT32)cblk->numbps - 4)) && (passtype == 2)) {
2391*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2392*3ac0a46fSAndroid Build Coastguard Worker }
2393*3ac0a46fSAndroid Build Coastguard Worker /* and beyond terminate all the magnitude refinement passes (in raw) */
2394*3ac0a46fSAndroid Build Coastguard Worker /* and cleanup passes (in MQC) */
2395*3ac0a46fSAndroid Build Coastguard Worker if ((bpno < ((OPJ_INT32)(cblk->numbps) - 4)) && (passtype > 0)) {
2396*3ac0a46fSAndroid Build Coastguard Worker return OPJ_TRUE;
2397*3ac0a46fSAndroid Build Coastguard Worker }
2398*3ac0a46fSAndroid Build Coastguard Worker }
2399*3ac0a46fSAndroid Build Coastguard Worker
2400*3ac0a46fSAndroid Build Coastguard Worker return OPJ_FALSE;
2401*3ac0a46fSAndroid Build Coastguard Worker }
2402*3ac0a46fSAndroid Build Coastguard Worker
2403*3ac0a46fSAndroid Build Coastguard Worker
2404*3ac0a46fSAndroid Build Coastguard Worker /** mod fixed_quality */
opj_t1_encode_cblk(opj_t1_t * t1,opj_tcd_cblk_enc_t * cblk,OPJ_UINT32 orient,OPJ_UINT32 compno,OPJ_UINT32 level,OPJ_UINT32 qmfbid,OPJ_FLOAT64 stepsize,OPJ_UINT32 cblksty,OPJ_UINT32 numcomps,const OPJ_FLOAT64 * mct_norms,OPJ_UINT32 mct_numcomps)2405*3ac0a46fSAndroid Build Coastguard Worker static OPJ_FLOAT64 opj_t1_encode_cblk(opj_t1_t *t1,
2406*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_cblk_enc_t* cblk,
2407*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 orient,
2408*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 compno,
2409*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 level,
2410*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 qmfbid,
2411*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 stepsize,
2412*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 cblksty,
2413*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 numcomps,
2414*3ac0a46fSAndroid Build Coastguard Worker const OPJ_FLOAT64 * mct_norms,
2415*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 mct_numcomps)
2416*3ac0a46fSAndroid Build Coastguard Worker {
2417*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 cumwmsedec = 0.0;
2418*3ac0a46fSAndroid Build Coastguard Worker
2419*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_t *mqc = &(t1->mqc); /* MQC component */
2420*3ac0a46fSAndroid Build Coastguard Worker
2421*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 passno;
2422*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 bpno;
2423*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 passtype;
2424*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 nmsedec = 0;
2425*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 max;
2426*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i, j;
2427*3ac0a46fSAndroid Build Coastguard Worker OPJ_BYTE type = T1_TYPE_MQ;
2428*3ac0a46fSAndroid Build Coastguard Worker OPJ_FLOAT64 tempwmsedec;
2429*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32* datap;
2430*3ac0a46fSAndroid Build Coastguard Worker
2431*3ac0a46fSAndroid Build Coastguard Worker #ifdef EXTRA_DEBUG
2432*3ac0a46fSAndroid Build Coastguard Worker printf("encode_cblk(x=%d,y=%d,x1=%d,y1=%d,orient=%d,compno=%d,level=%d\n",
2433*3ac0a46fSAndroid Build Coastguard Worker cblk->x0, cblk->y0, cblk->x1, cblk->y1, orient, compno, level);
2434*3ac0a46fSAndroid Build Coastguard Worker #endif
2435*3ac0a46fSAndroid Build Coastguard Worker
2436*3ac0a46fSAndroid Build Coastguard Worker mqc->lut_ctxno_zc_orient = lut_ctxno_zc + (orient << 9);
2437*3ac0a46fSAndroid Build Coastguard Worker
2438*3ac0a46fSAndroid Build Coastguard Worker max = 0;
2439*3ac0a46fSAndroid Build Coastguard Worker datap = t1->data;
2440*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < t1->h; ++j) {
2441*3ac0a46fSAndroid Build Coastguard Worker const OPJ_UINT32 w = t1->w;
2442*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < w; ++i, ++datap) {
2443*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 tmp = *datap;
2444*3ac0a46fSAndroid Build Coastguard Worker if (tmp < 0) {
2445*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 tmp_unsigned;
2446*3ac0a46fSAndroid Build Coastguard Worker max = opj_int_max(max, -tmp);
2447*3ac0a46fSAndroid Build Coastguard Worker tmp_unsigned = opj_to_smr(tmp);
2448*3ac0a46fSAndroid Build Coastguard Worker memcpy(datap, &tmp_unsigned, sizeof(OPJ_INT32));
2449*3ac0a46fSAndroid Build Coastguard Worker } else {
2450*3ac0a46fSAndroid Build Coastguard Worker max = opj_int_max(max, tmp);
2451*3ac0a46fSAndroid Build Coastguard Worker }
2452*3ac0a46fSAndroid Build Coastguard Worker }
2453*3ac0a46fSAndroid Build Coastguard Worker }
2454*3ac0a46fSAndroid Build Coastguard Worker
2455*3ac0a46fSAndroid Build Coastguard Worker cblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) -
2456*3ac0a46fSAndroid Build Coastguard Worker T1_NMSEDEC_FRACBITS) : 0;
2457*3ac0a46fSAndroid Build Coastguard Worker if (cblk->numbps == 0) {
2458*3ac0a46fSAndroid Build Coastguard Worker cblk->totalpasses = 0;
2459*3ac0a46fSAndroid Build Coastguard Worker return cumwmsedec;
2460*3ac0a46fSAndroid Build Coastguard Worker }
2461*3ac0a46fSAndroid Build Coastguard Worker
2462*3ac0a46fSAndroid Build Coastguard Worker bpno = (OPJ_INT32)(cblk->numbps - 1);
2463*3ac0a46fSAndroid Build Coastguard Worker passtype = 2;
2464*3ac0a46fSAndroid Build Coastguard Worker
2465*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_resetstates(mqc);
2466*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
2467*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
2468*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
2469*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_init_enc(mqc, cblk->data);
2470*3ac0a46fSAndroid Build Coastguard Worker
2471*3ac0a46fSAndroid Build Coastguard Worker for (passno = 0; bpno >= 0; ++passno) {
2472*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_pass_t *pass = &cblk->passes[passno];
2473*3ac0a46fSAndroid Build Coastguard Worker type = ((bpno < ((OPJ_INT32)(cblk->numbps) - 4)) && (passtype < 2) &&
2474*3ac0a46fSAndroid Build Coastguard Worker (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
2475*3ac0a46fSAndroid Build Coastguard Worker
2476*3ac0a46fSAndroid Build Coastguard Worker /* If the previous pass was terminating, we need to reset the encoder */
2477*3ac0a46fSAndroid Build Coastguard Worker if (passno > 0 && cblk->passes[passno - 1].term) {
2478*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) {
2479*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_bypass_init_enc(mqc);
2480*3ac0a46fSAndroid Build Coastguard Worker } else {
2481*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_restart_init_enc(mqc);
2482*3ac0a46fSAndroid Build Coastguard Worker }
2483*3ac0a46fSAndroid Build Coastguard Worker }
2484*3ac0a46fSAndroid Build Coastguard Worker
2485*3ac0a46fSAndroid Build Coastguard Worker switch (passtype) {
2486*3ac0a46fSAndroid Build Coastguard Worker case 0:
2487*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_sigpass(t1, bpno, &nmsedec, type, cblksty);
2488*3ac0a46fSAndroid Build Coastguard Worker break;
2489*3ac0a46fSAndroid Build Coastguard Worker case 1:
2490*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_refpass(t1, bpno, &nmsedec, type);
2491*3ac0a46fSAndroid Build Coastguard Worker break;
2492*3ac0a46fSAndroid Build Coastguard Worker case 2:
2493*3ac0a46fSAndroid Build Coastguard Worker opj_t1_enc_clnpass(t1, bpno, &nmsedec, cblksty);
2494*3ac0a46fSAndroid Build Coastguard Worker /* code switch SEGMARK (i.e. SEGSYM) */
2495*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) {
2496*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_segmark_enc(mqc);
2497*3ac0a46fSAndroid Build Coastguard Worker }
2498*3ac0a46fSAndroid Build Coastguard Worker break;
2499*3ac0a46fSAndroid Build Coastguard Worker }
2500*3ac0a46fSAndroid Build Coastguard Worker
2501*3ac0a46fSAndroid Build Coastguard Worker /* fixed_quality */
2502*3ac0a46fSAndroid Build Coastguard Worker tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid,
2503*3ac0a46fSAndroid Build Coastguard Worker stepsize, numcomps, mct_norms, mct_numcomps) ;
2504*3ac0a46fSAndroid Build Coastguard Worker cumwmsedec += tempwmsedec;
2505*3ac0a46fSAndroid Build Coastguard Worker pass->distortiondec = cumwmsedec;
2506*3ac0a46fSAndroid Build Coastguard Worker
2507*3ac0a46fSAndroid Build Coastguard Worker if (opj_t1_enc_is_term_pass(cblk, cblksty, bpno, passtype)) {
2508*3ac0a46fSAndroid Build Coastguard Worker /* If it is a terminated pass, terminate it */
2509*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) {
2510*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_bypass_flush_enc(mqc, cblksty & J2K_CCP_CBLKSTY_PTERM);
2511*3ac0a46fSAndroid Build Coastguard Worker } else {
2512*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_PTERM) {
2513*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_erterm_enc(mqc);
2514*3ac0a46fSAndroid Build Coastguard Worker } else {
2515*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_flush(mqc);
2516*3ac0a46fSAndroid Build Coastguard Worker }
2517*3ac0a46fSAndroid Build Coastguard Worker }
2518*3ac0a46fSAndroid Build Coastguard Worker pass->term = 1;
2519*3ac0a46fSAndroid Build Coastguard Worker pass->rate = opj_mqc_numbytes(mqc);
2520*3ac0a46fSAndroid Build Coastguard Worker } else {
2521*3ac0a46fSAndroid Build Coastguard Worker /* Non terminated pass */
2522*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 rate_extra_bytes;
2523*3ac0a46fSAndroid Build Coastguard Worker if (type == T1_TYPE_RAW) {
2524*3ac0a46fSAndroid Build Coastguard Worker rate_extra_bytes = opj_mqc_bypass_get_extra_bytes(
2525*3ac0a46fSAndroid Build Coastguard Worker mqc, (cblksty & J2K_CCP_CBLKSTY_PTERM));
2526*3ac0a46fSAndroid Build Coastguard Worker } else {
2527*3ac0a46fSAndroid Build Coastguard Worker rate_extra_bytes = 3;
2528*3ac0a46fSAndroid Build Coastguard Worker }
2529*3ac0a46fSAndroid Build Coastguard Worker pass->term = 0;
2530*3ac0a46fSAndroid Build Coastguard Worker pass->rate = opj_mqc_numbytes(mqc) + rate_extra_bytes;
2531*3ac0a46fSAndroid Build Coastguard Worker }
2532*3ac0a46fSAndroid Build Coastguard Worker
2533*3ac0a46fSAndroid Build Coastguard Worker if (++passtype == 3) {
2534*3ac0a46fSAndroid Build Coastguard Worker passtype = 0;
2535*3ac0a46fSAndroid Build Coastguard Worker bpno--;
2536*3ac0a46fSAndroid Build Coastguard Worker }
2537*3ac0a46fSAndroid Build Coastguard Worker
2538*3ac0a46fSAndroid Build Coastguard Worker /* Code-switch "RESET" */
2539*3ac0a46fSAndroid Build Coastguard Worker if (cblksty & J2K_CCP_CBLKSTY_RESET) {
2540*3ac0a46fSAndroid Build Coastguard Worker opj_mqc_reset_enc(mqc);
2541*3ac0a46fSAndroid Build Coastguard Worker }
2542*3ac0a46fSAndroid Build Coastguard Worker }
2543*3ac0a46fSAndroid Build Coastguard Worker
2544*3ac0a46fSAndroid Build Coastguard Worker cblk->totalpasses = passno;
2545*3ac0a46fSAndroid Build Coastguard Worker
2546*3ac0a46fSAndroid Build Coastguard Worker if (cblk->totalpasses) {
2547*3ac0a46fSAndroid Build Coastguard Worker /* Make sure that pass rates are increasing */
2548*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 last_pass_rate = opj_mqc_numbytes(mqc);
2549*3ac0a46fSAndroid Build Coastguard Worker for (passno = cblk->totalpasses; passno > 0;) {
2550*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_pass_t *pass = &cblk->passes[--passno];
2551*3ac0a46fSAndroid Build Coastguard Worker if (pass->rate > last_pass_rate) {
2552*3ac0a46fSAndroid Build Coastguard Worker pass->rate = last_pass_rate;
2553*3ac0a46fSAndroid Build Coastguard Worker } else {
2554*3ac0a46fSAndroid Build Coastguard Worker last_pass_rate = pass->rate;
2555*3ac0a46fSAndroid Build Coastguard Worker }
2556*3ac0a46fSAndroid Build Coastguard Worker }
2557*3ac0a46fSAndroid Build Coastguard Worker }
2558*3ac0a46fSAndroid Build Coastguard Worker
2559*3ac0a46fSAndroid Build Coastguard Worker for (passno = 0; passno < cblk->totalpasses; passno++) {
2560*3ac0a46fSAndroid Build Coastguard Worker opj_tcd_pass_t *pass = &cblk->passes[passno];
2561*3ac0a46fSAndroid Build Coastguard Worker
2562*3ac0a46fSAndroid Build Coastguard Worker /* Prevent generation of FF as last data byte of a pass*/
2563*3ac0a46fSAndroid Build Coastguard Worker /* For terminating passes, the flushing procedure ensured this already */
2564*3ac0a46fSAndroid Build Coastguard Worker assert(pass->rate > 0);
2565*3ac0a46fSAndroid Build Coastguard Worker if (cblk->data[pass->rate - 1] == 0xFF) {
2566*3ac0a46fSAndroid Build Coastguard Worker pass->rate--;
2567*3ac0a46fSAndroid Build Coastguard Worker }
2568*3ac0a46fSAndroid Build Coastguard Worker pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
2569*3ac0a46fSAndroid Build Coastguard Worker }
2570*3ac0a46fSAndroid Build Coastguard Worker
2571*3ac0a46fSAndroid Build Coastguard Worker #ifdef EXTRA_DEBUG
2572*3ac0a46fSAndroid Build Coastguard Worker printf(" len=%d\n", (cblk->totalpasses) ? opj_mqc_numbytes(mqc) : 0);
2573*3ac0a46fSAndroid Build Coastguard Worker
2574*3ac0a46fSAndroid Build Coastguard Worker /* Check that there not 0xff >=0x90 sequences */
2575*3ac0a46fSAndroid Build Coastguard Worker if (cblk->totalpasses) {
2576*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 i;
2577*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 len = opj_mqc_numbytes(mqc);
2578*3ac0a46fSAndroid Build Coastguard Worker for (i = 1; i < len; ++i) {
2579*3ac0a46fSAndroid Build Coastguard Worker if (cblk->data[i - 1] == 0xff && cblk->data[i] >= 0x90) {
2580*3ac0a46fSAndroid Build Coastguard Worker printf("0xff %02x at offset %d\n", cblk->data[i], i - 1);
2581*3ac0a46fSAndroid Build Coastguard Worker abort();
2582*3ac0a46fSAndroid Build Coastguard Worker }
2583*3ac0a46fSAndroid Build Coastguard Worker }
2584*3ac0a46fSAndroid Build Coastguard Worker }
2585*3ac0a46fSAndroid Build Coastguard Worker #endif
2586*3ac0a46fSAndroid Build Coastguard Worker
2587*3ac0a46fSAndroid Build Coastguard Worker return cumwmsedec;
2588*3ac0a46fSAndroid Build Coastguard Worker }
2589