/src/freeimage-svn/FreeImage/trunk/Source/LibOpenJPEG/t1.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium |
3 | | * Copyright (c) 2002-2007, Professor Benoit Macq |
4 | | * Copyright (c) 2001-2003, David Janssens |
5 | | * Copyright (c) 2002-2003, Yannick Verschueren |
6 | | * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe |
7 | | * Copyright (c) 2005, Herve Drolon, FreeImage Team |
8 | | * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com> |
9 | | * All rights reserved. |
10 | | * |
11 | | * Redistribution and use in source and binary forms, with or without |
12 | | * modification, are permitted provided that the following conditions |
13 | | * are met: |
14 | | * 1. Redistributions of source code must retain the above copyright |
15 | | * notice, this list of conditions and the following disclaimer. |
16 | | * 2. Redistributions in binary form must reproduce the above copyright |
17 | | * notice, this list of conditions and the following disclaimer in the |
18 | | * documentation and/or other materials provided with the distribution. |
19 | | * |
20 | | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' |
21 | | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
22 | | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
23 | | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
24 | | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
25 | | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
26 | | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
27 | | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
28 | | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
29 | | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
30 | | * POSSIBILITY OF SUCH DAMAGE. |
31 | | */ |
32 | | |
33 | | #include "opj_includes.h" |
34 | | #include "t1_luts.h" |
35 | | |
36 | | /** @defgroup T1 T1 - Implementation of the tier-1 coding */ |
37 | | /*@{*/ |
38 | | |
39 | | /** @name Local static functions */ |
40 | | /*@{*/ |
41 | | |
42 | | static INLINE OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient); |
43 | | static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f); |
44 | | static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f); |
45 | | static OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f); |
46 | | static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos); |
47 | | static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos); |
48 | | static void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride); |
49 | | /** |
50 | | Encode significant pass |
51 | | */ |
52 | | static void opj_t1_enc_sigpass_step(opj_t1_t *t1, |
53 | | opj_flag_t *flagsp, |
54 | | OPJ_INT32 *datap, |
55 | | OPJ_UINT32 orient, |
56 | | OPJ_INT32 bpno, |
57 | | OPJ_INT32 one, |
58 | | OPJ_INT32 *nmsedec, |
59 | | OPJ_BYTE type, |
60 | | OPJ_UINT32 vsc); |
61 | | |
62 | | /** |
63 | | Decode significant pass |
64 | | */ |
65 | | #if 0 |
66 | | static void opj_t1_dec_sigpass_step(opj_t1_t *t1, |
67 | | opj_flag_t *flagsp, |
68 | | OPJ_INT32 *datap, |
69 | | OPJ_UINT32 orient, |
70 | | OPJ_INT32 oneplushalf, |
71 | | OPJ_BYTE type, |
72 | | OPJ_UINT32 vsc); |
73 | | #endif |
74 | | |
75 | | static INLINE void opj_t1_dec_sigpass_step_raw( |
76 | | opj_t1_t *t1, |
77 | | opj_flag_t *flagsp, |
78 | | OPJ_INT32 *datap, |
79 | | OPJ_INT32 orient, |
80 | | OPJ_INT32 oneplushalf, |
81 | | OPJ_INT32 vsc); |
82 | | static INLINE void opj_t1_dec_sigpass_step_mqc( |
83 | | opj_t1_t *t1, |
84 | | opj_flag_t *flagsp, |
85 | | OPJ_INT32 *datap, |
86 | | OPJ_INT32 orient, |
87 | | OPJ_INT32 oneplushalf); |
88 | | static INLINE void opj_t1_dec_sigpass_step_mqc_vsc( |
89 | | opj_t1_t *t1, |
90 | | opj_flag_t *flagsp, |
91 | | OPJ_INT32 *datap, |
92 | | OPJ_INT32 orient, |
93 | | OPJ_INT32 oneplushalf, |
94 | | OPJ_INT32 vsc); |
95 | | |
96 | | |
97 | | /** |
98 | | Encode significant pass |
99 | | */ |
100 | | static void opj_t1_enc_sigpass( opj_t1_t *t1, |
101 | | OPJ_INT32 bpno, |
102 | | OPJ_UINT32 orient, |
103 | | OPJ_INT32 *nmsedec, |
104 | | OPJ_BYTE type, |
105 | | OPJ_UINT32 cblksty); |
106 | | |
107 | | /** |
108 | | Decode significant pass |
109 | | */ |
110 | | static void opj_t1_dec_sigpass_raw( |
111 | | opj_t1_t *t1, |
112 | | OPJ_INT32 bpno, |
113 | | OPJ_INT32 orient, |
114 | | OPJ_INT32 cblksty); |
115 | | static void opj_t1_dec_sigpass_mqc( |
116 | | opj_t1_t *t1, |
117 | | OPJ_INT32 bpno, |
118 | | OPJ_INT32 orient); |
119 | | static void opj_t1_dec_sigpass_mqc_vsc( |
120 | | opj_t1_t *t1, |
121 | | OPJ_INT32 bpno, |
122 | | OPJ_INT32 orient); |
123 | | |
124 | | |
125 | | |
126 | | /** |
127 | | Encode refinement pass |
128 | | */ |
129 | | static void opj_t1_enc_refpass_step(opj_t1_t *t1, |
130 | | opj_flag_t *flagsp, |
131 | | OPJ_INT32 *datap, |
132 | | OPJ_INT32 bpno, |
133 | | OPJ_INT32 one, |
134 | | OPJ_INT32 *nmsedec, |
135 | | OPJ_BYTE type, |
136 | | OPJ_UINT32 vsc); |
137 | | |
138 | | |
139 | | /** |
140 | | Encode refinement pass |
141 | | */ |
142 | | static void opj_t1_enc_refpass( opj_t1_t *t1, |
143 | | OPJ_INT32 bpno, |
144 | | OPJ_INT32 *nmsedec, |
145 | | OPJ_BYTE type, |
146 | | OPJ_UINT32 cblksty); |
147 | | |
148 | | /** |
149 | | Decode refinement pass |
150 | | */ |
151 | | static void opj_t1_dec_refpass_raw( |
152 | | opj_t1_t *t1, |
153 | | OPJ_INT32 bpno, |
154 | | OPJ_INT32 cblksty); |
155 | | static void opj_t1_dec_refpass_mqc( |
156 | | opj_t1_t *t1, |
157 | | OPJ_INT32 bpno); |
158 | | static void opj_t1_dec_refpass_mqc_vsc( |
159 | | opj_t1_t *t1, |
160 | | OPJ_INT32 bpno); |
161 | | |
162 | | |
163 | | /** |
164 | | Decode refinement pass |
165 | | */ |
166 | | #if 0 |
167 | | static void opj_t1_dec_refpass_step(opj_t1_t *t1, |
168 | | opj_flag_t *flagsp, |
169 | | OPJ_INT32 *datap, |
170 | | OPJ_INT32 poshalf, |
171 | | OPJ_INT32 neghalf, |
172 | | OPJ_BYTE type, |
173 | | OPJ_UINT32 vsc); |
174 | | #endif |
175 | | |
176 | | static INLINE void opj_t1_dec_refpass_step_raw( |
177 | | opj_t1_t *t1, |
178 | | opj_flag_t *flagsp, |
179 | | OPJ_INT32 *datap, |
180 | | OPJ_INT32 poshalf, |
181 | | OPJ_INT32 neghalf, |
182 | | OPJ_INT32 vsc); |
183 | | static INLINE void opj_t1_dec_refpass_step_mqc( |
184 | | opj_t1_t *t1, |
185 | | opj_flag_t *flagsp, |
186 | | OPJ_INT32 *datap, |
187 | | OPJ_INT32 poshalf, |
188 | | OPJ_INT32 neghalf); |
189 | | static INLINE void opj_t1_dec_refpass_step_mqc_vsc( |
190 | | opj_t1_t *t1, |
191 | | opj_flag_t *flagsp, |
192 | | OPJ_INT32 *datap, |
193 | | OPJ_INT32 poshalf, |
194 | | OPJ_INT32 neghalf, |
195 | | OPJ_INT32 vsc); |
196 | | |
197 | | |
198 | | |
199 | | /** |
200 | | Encode clean-up pass |
201 | | */ |
202 | | static void opj_t1_enc_clnpass_step( |
203 | | opj_t1_t *t1, |
204 | | opj_flag_t *flagsp, |
205 | | OPJ_INT32 *datap, |
206 | | OPJ_UINT32 orient, |
207 | | OPJ_INT32 bpno, |
208 | | OPJ_INT32 one, |
209 | | OPJ_INT32 *nmsedec, |
210 | | OPJ_UINT32 partial, |
211 | | OPJ_UINT32 vsc); |
212 | | /** |
213 | | Decode clean-up pass |
214 | | */ |
215 | | static void opj_t1_dec_clnpass_step_partial( |
216 | | opj_t1_t *t1, |
217 | | opj_flag_t *flagsp, |
218 | | OPJ_INT32 *datap, |
219 | | OPJ_INT32 orient, |
220 | | OPJ_INT32 oneplushalf); |
221 | | static void opj_t1_dec_clnpass_step( |
222 | | opj_t1_t *t1, |
223 | | opj_flag_t *flagsp, |
224 | | OPJ_INT32 *datap, |
225 | | OPJ_INT32 orient, |
226 | | OPJ_INT32 oneplushalf); |
227 | | static void opj_t1_dec_clnpass_step_vsc( |
228 | | opj_t1_t *t1, |
229 | | opj_flag_t *flagsp, |
230 | | OPJ_INT32 *datap, |
231 | | OPJ_INT32 orient, |
232 | | OPJ_INT32 oneplushalf, |
233 | | OPJ_INT32 partial, |
234 | | OPJ_INT32 vsc); |
235 | | /** |
236 | | Encode clean-up pass |
237 | | */ |
238 | | static void opj_t1_enc_clnpass( |
239 | | opj_t1_t *t1, |
240 | | OPJ_INT32 bpno, |
241 | | OPJ_UINT32 orient, |
242 | | OPJ_INT32 *nmsedec, |
243 | | OPJ_UINT32 cblksty); |
244 | | /** |
245 | | Decode clean-up pass |
246 | | */ |
247 | | static void opj_t1_dec_clnpass( |
248 | | opj_t1_t *t1, |
249 | | OPJ_INT32 bpno, |
250 | | OPJ_INT32 orient, |
251 | | OPJ_INT32 cblksty); |
252 | | |
253 | | static OPJ_FLOAT64 opj_t1_getwmsedec( |
254 | | OPJ_INT32 nmsedec, |
255 | | OPJ_UINT32 compno, |
256 | | OPJ_UINT32 level, |
257 | | OPJ_UINT32 orient, |
258 | | OPJ_INT32 bpno, |
259 | | OPJ_UINT32 qmfbid, |
260 | | OPJ_FLOAT64 stepsize, |
261 | | OPJ_UINT32 numcomps, |
262 | | const OPJ_FLOAT64 * mct_norms); |
263 | | |
264 | | static void opj_t1_encode_cblk( opj_t1_t *t1, |
265 | | opj_tcd_cblk_enc_t* cblk, |
266 | | OPJ_UINT32 orient, |
267 | | OPJ_UINT32 compno, |
268 | | OPJ_UINT32 level, |
269 | | OPJ_UINT32 qmfbid, |
270 | | OPJ_FLOAT64 stepsize, |
271 | | OPJ_UINT32 cblksty, |
272 | | OPJ_UINT32 numcomps, |
273 | | opj_tcd_tile_t * tile, |
274 | | const OPJ_FLOAT64 * mct_norms); |
275 | | |
276 | | /** |
277 | | Decode 1 code-block |
278 | | @param t1 T1 handle |
279 | | @param cblk Code-block coding parameters |
280 | | @param orient |
281 | | @param roishift Region of interest shifting value |
282 | | @param cblksty Code-block style |
283 | | */ |
284 | | static OPJ_BOOL opj_t1_decode_cblk( opj_t1_t *t1, |
285 | | opj_tcd_cblk_dec_t* cblk, |
286 | | OPJ_UINT32 orient, |
287 | | OPJ_UINT32 roishift, |
288 | | OPJ_UINT32 cblksty); |
289 | | |
290 | | OPJ_BOOL opj_t1_allocate_buffers( opj_t1_t *t1, |
291 | | OPJ_UINT32 w, |
292 | | OPJ_UINT32 h); |
293 | | |
294 | | /*@}*/ |
295 | | |
296 | | /*@}*/ |
297 | | |
298 | | /* ----------------------------------------------------------------------- */ |
299 | | |
300 | 0 | OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient) { |
301 | 0 | return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; |
302 | 0 | } |
303 | | |
304 | 0 | OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f) { |
305 | 0 | return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; |
306 | 0 | } |
307 | | |
308 | 0 | OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f) { |
309 | 0 | OPJ_UINT32 tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG; |
310 | 0 | OPJ_UINT32 tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1; |
311 | 0 | return (tmp2); |
312 | 0 | } |
313 | | |
314 | 0 | OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f) { |
315 | 0 | return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; |
316 | 0 | } |
317 | | |
318 | 0 | OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos) { |
319 | 0 | if (bitpos > T1_NMSEDEC_FRACBITS) { |
320 | 0 | return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; |
321 | 0 | } |
322 | | |
323 | 0 | return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; |
324 | 0 | } |
325 | | |
326 | 0 | OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos) { |
327 | 0 | if (bitpos > T1_NMSEDEC_FRACBITS) { |
328 | 0 | return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; |
329 | 0 | } |
330 | | |
331 | 0 | return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; |
332 | 0 | } |
333 | | |
334 | 0 | void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride) { |
335 | 0 | opj_flag_t *np = flagsp - stride; |
336 | 0 | opj_flag_t *sp = flagsp + stride; |
337 | |
|
338 | 0 | static const opj_flag_t mod[] = { |
339 | 0 | T1_SIG_S, T1_SIG_S|T1_SGN_S, |
340 | 0 | T1_SIG_E, T1_SIG_E|T1_SGN_E, |
341 | 0 | T1_SIG_W, T1_SIG_W|T1_SGN_W, |
342 | 0 | T1_SIG_N, T1_SIG_N|T1_SGN_N |
343 | 0 | }; |
344 | |
|
345 | 0 | np[-1] |= T1_SIG_SE; |
346 | 0 | np[0] |= mod[s]; |
347 | 0 | np[1] |= T1_SIG_SW; |
348 | |
|
349 | 0 | flagsp[-1] |= mod[s+2]; |
350 | 0 | flagsp[0] |= T1_SIG; |
351 | 0 | flagsp[1] |= mod[s+4]; |
352 | |
|
353 | 0 | sp[-1] |= T1_SIG_NE; |
354 | 0 | sp[0] |= mod[s+6]; |
355 | 0 | sp[1] |= T1_SIG_NW; |
356 | 0 | } |
357 | | |
358 | | void opj_t1_enc_sigpass_step( opj_t1_t *t1, |
359 | | opj_flag_t *flagsp, |
360 | | OPJ_INT32 *datap, |
361 | | OPJ_UINT32 orient, |
362 | | OPJ_INT32 bpno, |
363 | | OPJ_INT32 one, |
364 | | OPJ_INT32 *nmsedec, |
365 | | OPJ_BYTE type, |
366 | | OPJ_UINT32 vsc |
367 | | ) |
368 | 0 | { |
369 | 0 | OPJ_INT32 v; |
370 | 0 | OPJ_UINT32 flag; |
371 | | |
372 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
373 | | |
374 | 0 | flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp); |
375 | 0 | if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { |
376 | 0 | v = opj_int_abs(*datap) & one ? 1 : 0; |
377 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient)); /* ESSAI */ |
378 | 0 | if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ |
379 | 0 | opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v); |
380 | 0 | } else { |
381 | 0 | opj_mqc_encode(mqc, (OPJ_UINT32)v); |
382 | 0 | } |
383 | 0 | if (v) { |
384 | 0 | v = *datap < 0 ? 1 : 0; |
385 | 0 | *nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS)); |
386 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag)); /* ESSAI */ |
387 | 0 | if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ |
388 | 0 | opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v); |
389 | 0 | } else { |
390 | 0 | opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag))); |
391 | 0 | } |
392 | 0 | opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride); |
393 | 0 | } |
394 | 0 | *flagsp |= T1_VISIT; |
395 | 0 | } |
396 | 0 | } |
397 | | |
398 | | |
399 | | static INLINE void opj_t1_dec_sigpass_step_raw( |
400 | | opj_t1_t *t1, |
401 | | opj_flag_t *flagsp, |
402 | | OPJ_INT32 *datap, |
403 | | OPJ_INT32 orient, |
404 | | OPJ_INT32 oneplushalf, |
405 | | OPJ_INT32 vsc) |
406 | 0 | { |
407 | 0 | OPJ_INT32 v, flag; |
408 | 0 | opj_raw_t *raw = t1->raw; /* RAW component */ |
409 | 0 | OPJ_ARG_NOT_USED(orient); |
410 | | |
411 | 0 | flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); |
412 | 0 | if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { |
413 | 0 | if (opj_raw_decode(raw)) { |
414 | 0 | v = (OPJ_INT32)opj_raw_decode(raw); /* ESSAI */ |
415 | 0 | *datap = v ? -oneplushalf : oneplushalf; |
416 | 0 | opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride); |
417 | 0 | } |
418 | 0 | *flagsp |= T1_VISIT; |
419 | 0 | } |
420 | 0 | } |
421 | | |
422 | | INLINE void opj_t1_dec_sigpass_step_mqc( |
423 | | opj_t1_t *t1, |
424 | | opj_flag_t *flagsp, |
425 | | OPJ_INT32 *datap, |
426 | | OPJ_INT32 orient, |
427 | | OPJ_INT32 oneplushalf) |
428 | 0 | { |
429 | 0 | OPJ_INT32 v, flag; |
430 | | |
431 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
432 | | |
433 | 0 | flag = *flagsp; |
434 | 0 | if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { |
435 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); |
436 | 0 | if (opj_mqc_decode(mqc)) { |
437 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); |
438 | 0 | v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); |
439 | 0 | *datap = v ? -oneplushalf : oneplushalf; |
440 | 0 | opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride); |
441 | 0 | } |
442 | 0 | *flagsp |= T1_VISIT; |
443 | 0 | } |
444 | 0 | } /* VSC and BYPASS by Antonin */ |
445 | | |
446 | | INLINE void opj_t1_dec_sigpass_step_mqc_vsc( |
447 | | opj_t1_t *t1, |
448 | | opj_flag_t *flagsp, |
449 | | OPJ_INT32 *datap, |
450 | | OPJ_INT32 orient, |
451 | | OPJ_INT32 oneplushalf, |
452 | | OPJ_INT32 vsc) |
453 | 0 | { |
454 | 0 | OPJ_INT32 v, flag; |
455 | | |
456 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
457 | | |
458 | 0 | flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); |
459 | 0 | if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { |
460 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); |
461 | 0 | if (opj_mqc_decode(mqc)) { |
462 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); |
463 | 0 | v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); |
464 | 0 | *datap = v ? -oneplushalf : oneplushalf; |
465 | 0 | opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride); |
466 | 0 | } |
467 | 0 | *flagsp |= T1_VISIT; |
468 | 0 | } |
469 | 0 | } /* VSC and BYPASS by Antonin */ |
470 | | |
471 | | |
472 | | |
473 | | void opj_t1_enc_sigpass(opj_t1_t *t1, |
474 | | OPJ_INT32 bpno, |
475 | | OPJ_UINT32 orient, |
476 | | OPJ_INT32 *nmsedec, |
477 | | OPJ_BYTE type, |
478 | | OPJ_UINT32 cblksty |
479 | | ) |
480 | 0 | { |
481 | 0 | OPJ_UINT32 i, j, k, vsc; |
482 | 0 | OPJ_INT32 one; |
483 | |
|
484 | 0 | *nmsedec = 0; |
485 | 0 | one = 1 << (bpno + T1_NMSEDEC_FRACBITS); |
486 | 0 | for (k = 0; k < t1->h; k += 4) { |
487 | 0 | for (i = 0; i < t1->w; ++i) { |
488 | 0 | for (j = k; j < k + 4 && j < t1->h; ++j) { |
489 | 0 | vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; |
490 | 0 | opj_t1_enc_sigpass_step( |
491 | 0 | t1, |
492 | 0 | &t1->flags[((j+1) * t1->flags_stride) + i + 1], |
493 | 0 | &t1->data[(j * t1->w) + i], |
494 | 0 | orient, |
495 | 0 | bpno, |
496 | 0 | one, |
497 | 0 | nmsedec, |
498 | 0 | type, |
499 | 0 | vsc); |
500 | 0 | } |
501 | 0 | } |
502 | 0 | } |
503 | 0 | } |
504 | | |
505 | | void opj_t1_dec_sigpass_raw( |
506 | | opj_t1_t *t1, |
507 | | OPJ_INT32 bpno, |
508 | | OPJ_INT32 orient, |
509 | | OPJ_INT32 cblksty) |
510 | 0 | { |
511 | 0 | OPJ_INT32 one, half, oneplushalf, vsc; |
512 | 0 | OPJ_UINT32 i, j, k; |
513 | 0 | one = 1 << bpno; |
514 | 0 | half = one >> 1; |
515 | 0 | oneplushalf = one | half; |
516 | 0 | for (k = 0; k < t1->h; k += 4) { |
517 | 0 | for (i = 0; i < t1->w; ++i) { |
518 | 0 | for (j = k; j < k + 4 && j < t1->h; ++j) { |
519 | 0 | vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; |
520 | 0 | opj_t1_dec_sigpass_step_raw( |
521 | 0 | t1, |
522 | 0 | &t1->flags[((j+1) * t1->flags_stride) + i + 1], |
523 | 0 | &t1->data[(j * t1->w) + i], |
524 | 0 | orient, |
525 | 0 | oneplushalf, |
526 | 0 | vsc); |
527 | 0 | } |
528 | 0 | } |
529 | 0 | } |
530 | 0 | } /* VSC and BYPASS by Antonin */ |
531 | | |
532 | | void opj_t1_dec_sigpass_mqc( |
533 | | opj_t1_t *t1, |
534 | | OPJ_INT32 bpno, |
535 | | OPJ_INT32 orient) |
536 | 0 | { |
537 | 0 | OPJ_INT32 one, half, oneplushalf; |
538 | 0 | OPJ_UINT32 i, j, k; |
539 | 0 | OPJ_INT32 *data1 = t1->data; |
540 | 0 | opj_flag_t *flags1 = &t1->flags[1]; |
541 | 0 | one = 1 << bpno; |
542 | 0 | half = one >> 1; |
543 | 0 | oneplushalf = one | half; |
544 | 0 | for (k = 0; k < (t1->h & ~3u); k += 4) { |
545 | 0 | for (i = 0; i < t1->w; ++i) { |
546 | 0 | OPJ_INT32 *data2 = data1 + i; |
547 | 0 | opj_flag_t *flags2 = flags1 + i; |
548 | 0 | flags2 += t1->flags_stride; |
549 | 0 | opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); |
550 | 0 | data2 += t1->w; |
551 | 0 | flags2 += t1->flags_stride; |
552 | 0 | opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); |
553 | 0 | data2 += t1->w; |
554 | 0 | flags2 += t1->flags_stride; |
555 | 0 | opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); |
556 | 0 | data2 += t1->w; |
557 | 0 | flags2 += t1->flags_stride; |
558 | 0 | opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); |
559 | 0 | data2 += t1->w; |
560 | 0 | } |
561 | 0 | data1 += t1->w << 2; |
562 | 0 | flags1 += t1->flags_stride << 2; |
563 | 0 | } |
564 | 0 | for (i = 0; i < t1->w; ++i) { |
565 | 0 | OPJ_INT32 *data2 = data1 + i; |
566 | 0 | opj_flag_t *flags2 = flags1 + i; |
567 | 0 | for (j = k; j < t1->h; ++j) { |
568 | 0 | flags2 += t1->flags_stride; |
569 | 0 | opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); |
570 | 0 | data2 += t1->w; |
571 | 0 | } |
572 | 0 | } |
573 | 0 | } /* VSC and BYPASS by Antonin */ |
574 | | |
575 | | void opj_t1_dec_sigpass_mqc_vsc( |
576 | | opj_t1_t *t1, |
577 | | OPJ_INT32 bpno, |
578 | | OPJ_INT32 orient) |
579 | 0 | { |
580 | 0 | OPJ_INT32 one, half, oneplushalf, vsc; |
581 | 0 | OPJ_UINT32 i, j, k; |
582 | 0 | one = 1 << bpno; |
583 | 0 | half = one >> 1; |
584 | 0 | oneplushalf = one | half; |
585 | 0 | for (k = 0; k < t1->h; k += 4) { |
586 | 0 | for (i = 0; i < t1->w; ++i) { |
587 | 0 | for (j = k; j < k + 4 && j < t1->h; ++j) { |
588 | 0 | vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; |
589 | 0 | opj_t1_dec_sigpass_step_mqc_vsc( |
590 | 0 | t1, |
591 | 0 | &t1->flags[((j+1) * t1->flags_stride) + i + 1], |
592 | 0 | &t1->data[(j * t1->w) + i], |
593 | 0 | orient, |
594 | 0 | oneplushalf, |
595 | 0 | vsc); |
596 | 0 | } |
597 | 0 | } |
598 | 0 | } |
599 | 0 | } /* VSC and BYPASS by Antonin */ |
600 | | |
601 | | |
602 | | |
603 | | void opj_t1_enc_refpass_step( opj_t1_t *t1, |
604 | | opj_flag_t *flagsp, |
605 | | OPJ_INT32 *datap, |
606 | | OPJ_INT32 bpno, |
607 | | OPJ_INT32 one, |
608 | | OPJ_INT32 *nmsedec, |
609 | | OPJ_BYTE type, |
610 | | OPJ_UINT32 vsc) |
611 | 0 | { |
612 | 0 | OPJ_INT32 v; |
613 | 0 | OPJ_UINT32 flag; |
614 | | |
615 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
616 | | |
617 | 0 | flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp); |
618 | 0 | if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { |
619 | 0 | *nmsedec += opj_t1_getnmsedec_ref((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS)); |
620 | 0 | v = opj_int_abs(*datap) & one ? 1 : 0; |
621 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag)); /* ESSAI */ |
622 | 0 | if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ |
623 | 0 | opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v); |
624 | 0 | } else { |
625 | 0 | opj_mqc_encode(mqc, (OPJ_UINT32)v); |
626 | 0 | } |
627 | 0 | *flagsp |= T1_REFINE; |
628 | 0 | } |
629 | 0 | } |
630 | | |
631 | | INLINE void opj_t1_dec_refpass_step_raw( |
632 | | opj_t1_t *t1, |
633 | | opj_flag_t *flagsp, |
634 | | OPJ_INT32 *datap, |
635 | | OPJ_INT32 poshalf, |
636 | | OPJ_INT32 neghalf, |
637 | | OPJ_INT32 vsc) |
638 | 0 | { |
639 | 0 | OPJ_INT32 v, t, flag; |
640 | | |
641 | 0 | opj_raw_t *raw = t1->raw; /* RAW component */ |
642 | | |
643 | 0 | flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); |
644 | 0 | if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { |
645 | 0 | v = (OPJ_INT32)opj_raw_decode(raw); |
646 | 0 | t = v ? poshalf : neghalf; |
647 | 0 | *datap += *datap < 0 ? -t : t; |
648 | 0 | *flagsp |= T1_REFINE; |
649 | 0 | } |
650 | 0 | } /* VSC and BYPASS by Antonin */ |
651 | | |
652 | | INLINE void opj_t1_dec_refpass_step_mqc( |
653 | | opj_t1_t *t1, |
654 | | opj_flag_t *flagsp, |
655 | | OPJ_INT32 *datap, |
656 | | OPJ_INT32 poshalf, |
657 | | OPJ_INT32 neghalf) |
658 | 0 | { |
659 | 0 | OPJ_INT32 v, t, flag; |
660 | | |
661 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
662 | | |
663 | 0 | flag = *flagsp; |
664 | 0 | if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { |
665 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag)); /* ESSAI */ |
666 | 0 | v = opj_mqc_decode(mqc); |
667 | 0 | t = v ? poshalf : neghalf; |
668 | 0 | *datap += *datap < 0 ? -t : t; |
669 | 0 | *flagsp |= T1_REFINE; |
670 | 0 | } |
671 | 0 | } /* VSC and BYPASS by Antonin */ |
672 | | |
673 | | INLINE void opj_t1_dec_refpass_step_mqc_vsc( |
674 | | opj_t1_t *t1, |
675 | | opj_flag_t *flagsp, |
676 | | OPJ_INT32 *datap, |
677 | | OPJ_INT32 poshalf, |
678 | | OPJ_INT32 neghalf, |
679 | | OPJ_INT32 vsc) |
680 | 0 | { |
681 | 0 | OPJ_INT32 v, t, flag; |
682 | | |
683 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
684 | | |
685 | 0 | flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); |
686 | 0 | if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { |
687 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag)); /* ESSAI */ |
688 | 0 | v = opj_mqc_decode(mqc); |
689 | 0 | t = v ? poshalf : neghalf; |
690 | 0 | *datap += *datap < 0 ? -t : t; |
691 | 0 | *flagsp |= T1_REFINE; |
692 | 0 | } |
693 | 0 | } /* VSC and BYPASS by Antonin */ |
694 | | |
695 | | |
696 | | void opj_t1_enc_refpass( |
697 | | opj_t1_t *t1, |
698 | | OPJ_INT32 bpno, |
699 | | OPJ_INT32 *nmsedec, |
700 | | OPJ_BYTE type, |
701 | | OPJ_UINT32 cblksty) |
702 | 0 | { |
703 | 0 | OPJ_UINT32 i, j, k, vsc; |
704 | 0 | OPJ_INT32 one; |
705 | |
|
706 | 0 | *nmsedec = 0; |
707 | 0 | one = 1 << (bpno + T1_NMSEDEC_FRACBITS); |
708 | 0 | for (k = 0; k < t1->h; k += 4) { |
709 | 0 | for (i = 0; i < t1->w; ++i) { |
710 | 0 | for (j = k; j < k + 4 && j < t1->h; ++j) { |
711 | 0 | vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; |
712 | 0 | opj_t1_enc_refpass_step( |
713 | 0 | t1, |
714 | 0 | &t1->flags[((j+1) * t1->flags_stride) + i + 1], |
715 | 0 | &t1->data[(j * t1->w) + i], |
716 | 0 | bpno, |
717 | 0 | one, |
718 | 0 | nmsedec, |
719 | 0 | type, |
720 | 0 | vsc); |
721 | 0 | } |
722 | 0 | } |
723 | 0 | } |
724 | 0 | } |
725 | | |
726 | | void opj_t1_dec_refpass_raw( |
727 | | opj_t1_t *t1, |
728 | | OPJ_INT32 bpno, |
729 | | OPJ_INT32 cblksty) |
730 | 0 | { |
731 | 0 | OPJ_INT32 one, poshalf, neghalf; |
732 | 0 | OPJ_UINT32 i, j, k; |
733 | 0 | OPJ_INT32 vsc; |
734 | 0 | one = 1 << bpno; |
735 | 0 | poshalf = one >> 1; |
736 | 0 | neghalf = bpno > 0 ? -poshalf : -1; |
737 | 0 | for (k = 0; k < t1->h; k += 4) { |
738 | 0 | for (i = 0; i < t1->w; ++i) { |
739 | 0 | for (j = k; j < k + 4 && j < t1->h; ++j) { |
740 | 0 | vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; |
741 | 0 | opj_t1_dec_refpass_step_raw( |
742 | 0 | t1, |
743 | 0 | &t1->flags[((j+1) * t1->flags_stride) + i + 1], |
744 | 0 | &t1->data[(j * t1->w) + i], |
745 | 0 | poshalf, |
746 | 0 | neghalf, |
747 | 0 | vsc); |
748 | 0 | } |
749 | 0 | } |
750 | 0 | } |
751 | 0 | } /* VSC and BYPASS by Antonin */ |
752 | | |
753 | | void opj_t1_dec_refpass_mqc( |
754 | | opj_t1_t *t1, |
755 | | OPJ_INT32 bpno) |
756 | 0 | { |
757 | 0 | OPJ_INT32 one, poshalf, neghalf; |
758 | 0 | OPJ_UINT32 i, j, k; |
759 | 0 | OPJ_INT32 *data1 = t1->data; |
760 | 0 | opj_flag_t *flags1 = &t1->flags[1]; |
761 | 0 | one = 1 << bpno; |
762 | 0 | poshalf = one >> 1; |
763 | 0 | neghalf = bpno > 0 ? -poshalf : -1; |
764 | 0 | for (k = 0; k < (t1->h & ~3u); k += 4) { |
765 | 0 | for (i = 0; i < t1->w; ++i) { |
766 | 0 | OPJ_INT32 *data2 = data1 + i; |
767 | 0 | opj_flag_t *flags2 = flags1 + i; |
768 | 0 | flags2 += t1->flags_stride; |
769 | 0 | opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); |
770 | 0 | data2 += t1->w; |
771 | 0 | flags2 += t1->flags_stride; |
772 | 0 | opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); |
773 | 0 | data2 += t1->w; |
774 | 0 | flags2 += t1->flags_stride; |
775 | 0 | opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); |
776 | 0 | data2 += t1->w; |
777 | 0 | flags2 += t1->flags_stride; |
778 | 0 | opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); |
779 | 0 | data2 += t1->w; |
780 | 0 | } |
781 | 0 | data1 += t1->w << 2; |
782 | 0 | flags1 += t1->flags_stride << 2; |
783 | 0 | } |
784 | 0 | for (i = 0; i < t1->w; ++i) { |
785 | 0 | OPJ_INT32 *data2 = data1 + i; |
786 | 0 | opj_flag_t *flags2 = flags1 + i; |
787 | 0 | for (j = k; j < t1->h; ++j) { |
788 | 0 | flags2 += t1->flags_stride; |
789 | 0 | opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); |
790 | 0 | data2 += t1->w; |
791 | 0 | } |
792 | 0 | } |
793 | 0 | } /* VSC and BYPASS by Antonin */ |
794 | | |
795 | | void opj_t1_dec_refpass_mqc_vsc( |
796 | | opj_t1_t *t1, |
797 | | OPJ_INT32 bpno) |
798 | 0 | { |
799 | 0 | OPJ_INT32 one, poshalf, neghalf; |
800 | 0 | OPJ_UINT32 i, j, k; |
801 | 0 | OPJ_INT32 vsc; |
802 | 0 | one = 1 << bpno; |
803 | 0 | poshalf = one >> 1; |
804 | 0 | neghalf = bpno > 0 ? -poshalf : -1; |
805 | 0 | for (k = 0; k < t1->h; k += 4) { |
806 | 0 | for (i = 0; i < t1->w; ++i) { |
807 | 0 | for (j = k; j < k + 4 && j < t1->h; ++j) { |
808 | 0 | vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0; |
809 | 0 | opj_t1_dec_refpass_step_mqc_vsc( |
810 | 0 | t1, |
811 | 0 | &t1->flags[((j+1) * t1->flags_stride) + i + 1], |
812 | 0 | &t1->data[(j * t1->w) + i], |
813 | 0 | poshalf, |
814 | 0 | neghalf, |
815 | 0 | vsc); |
816 | 0 | } |
817 | 0 | } |
818 | 0 | } |
819 | 0 | } /* VSC and BYPASS by Antonin */ |
820 | | |
821 | | |
822 | | void opj_t1_enc_clnpass_step( |
823 | | opj_t1_t *t1, |
824 | | opj_flag_t *flagsp, |
825 | | OPJ_INT32 *datap, |
826 | | OPJ_UINT32 orient, |
827 | | OPJ_INT32 bpno, |
828 | | OPJ_INT32 one, |
829 | | OPJ_INT32 *nmsedec, |
830 | | OPJ_UINT32 partial, |
831 | | OPJ_UINT32 vsc) |
832 | 0 | { |
833 | 0 | OPJ_INT32 v; |
834 | 0 | OPJ_UINT32 flag; |
835 | | |
836 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
837 | | |
838 | 0 | flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp); |
839 | 0 | if (partial) { |
840 | 0 | goto LABEL_PARTIAL; |
841 | 0 | } |
842 | 0 | if (!(*flagsp & (T1_SIG | T1_VISIT))) { |
843 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient)); |
844 | 0 | v = opj_int_abs(*datap) & one ? 1 : 0; |
845 | 0 | opj_mqc_encode(mqc, (OPJ_UINT32)v); |
846 | 0 | if (v) { |
847 | 0 | LABEL_PARTIAL: |
848 | 0 | *nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS)); |
849 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag)); |
850 | 0 | v = *datap < 0 ? 1 : 0; |
851 | 0 | opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag))); |
852 | 0 | opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride); |
853 | 0 | } |
854 | 0 | } |
855 | 0 | *flagsp &= ~T1_VISIT; |
856 | 0 | } |
857 | | |
858 | | static void opj_t1_dec_clnpass_step_partial( |
859 | | opj_t1_t *t1, |
860 | | opj_flag_t *flagsp, |
861 | | OPJ_INT32 *datap, |
862 | | OPJ_INT32 orient, |
863 | | OPJ_INT32 oneplushalf) |
864 | 0 | { |
865 | 0 | OPJ_INT32 v, flag; |
866 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
867 | | |
868 | 0 | OPJ_ARG_NOT_USED(orient); |
869 | | |
870 | 0 | flag = *flagsp; |
871 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); |
872 | 0 | v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); |
873 | 0 | *datap = v ? -oneplushalf : oneplushalf; |
874 | 0 | opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride); |
875 | 0 | *flagsp &= ~T1_VISIT; |
876 | 0 | } /* VSC and BYPASS by Antonin */ |
877 | | |
878 | | static void opj_t1_dec_clnpass_step( |
879 | | opj_t1_t *t1, |
880 | | opj_flag_t *flagsp, |
881 | | OPJ_INT32 *datap, |
882 | | OPJ_INT32 orient, |
883 | | OPJ_INT32 oneplushalf) |
884 | 0 | { |
885 | 0 | OPJ_INT32 v, flag; |
886 | | |
887 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
888 | | |
889 | 0 | flag = *flagsp; |
890 | 0 | if (!(flag & (T1_SIG | T1_VISIT))) { |
891 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); |
892 | 0 | if (opj_mqc_decode(mqc)) { |
893 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); |
894 | 0 | v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); |
895 | 0 | *datap = v ? -oneplushalf : oneplushalf; |
896 | 0 | opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride); |
897 | 0 | } |
898 | 0 | } |
899 | 0 | *flagsp &= ~T1_VISIT; |
900 | 0 | } /* VSC and BYPASS by Antonin */ |
901 | | |
902 | | static void opj_t1_dec_clnpass_step_vsc( |
903 | | opj_t1_t *t1, |
904 | | opj_flag_t *flagsp, |
905 | | OPJ_INT32 *datap, |
906 | | OPJ_INT32 orient, |
907 | | OPJ_INT32 oneplushalf, |
908 | | OPJ_INT32 partial, |
909 | | OPJ_INT32 vsc) |
910 | 0 | { |
911 | 0 | OPJ_INT32 v, flag; |
912 | | |
913 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
914 | | |
915 | 0 | flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); |
916 | 0 | if (partial) { |
917 | 0 | goto LABEL_PARTIAL; |
918 | 0 | } |
919 | 0 | if (!(flag & (T1_SIG | T1_VISIT))) { |
920 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); |
921 | 0 | if (opj_mqc_decode(mqc)) { |
922 | 0 | LABEL_PARTIAL: |
923 | 0 | opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); |
924 | 0 | v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); |
925 | 0 | *datap = v ? -oneplushalf : oneplushalf; |
926 | 0 | opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride); |
927 | 0 | } |
928 | 0 | } |
929 | 0 | *flagsp &= ~T1_VISIT; |
930 | 0 | } |
931 | | |
932 | | void opj_t1_enc_clnpass( |
933 | | opj_t1_t *t1, |
934 | | OPJ_INT32 bpno, |
935 | | OPJ_UINT32 orient, |
936 | | OPJ_INT32 *nmsedec, |
937 | | OPJ_UINT32 cblksty) |
938 | 0 | { |
939 | 0 | OPJ_UINT32 i, j, k; |
940 | 0 | OPJ_INT32 one; |
941 | 0 | OPJ_UINT32 agg, runlen, vsc; |
942 | | |
943 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
944 | | |
945 | 0 | *nmsedec = 0; |
946 | 0 | one = 1 << (bpno + T1_NMSEDEC_FRACBITS); |
947 | 0 | for (k = 0; k < t1->h; k += 4) { |
948 | 0 | for (i = 0; i < t1->w; ++i) { |
949 | 0 | if (k + 3 < t1->h) { |
950 | 0 | if (cblksty & J2K_CCP_CBLKSTY_VSC) { |
951 | 0 | agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
952 | 0 | || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
953 | 0 | || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
954 | 0 | || (MACRO_t1_flags(1 + k + 3,1 + i) |
955 | 0 | & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); |
956 | 0 | } else { |
957 | 0 | agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
958 | 0 | || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
959 | 0 | || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
960 | 0 | || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); |
961 | 0 | } |
962 | 0 | } else { |
963 | 0 | agg = 0; |
964 | 0 | } |
965 | 0 | if (agg) { |
966 | 0 | for (runlen = 0; runlen < 4; ++runlen) { |
967 | 0 | if (opj_int_abs(t1->data[((k + runlen)*t1->w) + i]) & one) |
968 | 0 | break; |
969 | 0 | } |
970 | 0 | opj_mqc_setcurctx(mqc, T1_CTXNO_AGG); |
971 | 0 | opj_mqc_encode(mqc, runlen != 4); |
972 | 0 | if (runlen == 4) { |
973 | 0 | continue; |
974 | 0 | } |
975 | 0 | opj_mqc_setcurctx(mqc, T1_CTXNO_UNI); |
976 | 0 | opj_mqc_encode(mqc, runlen >> 1); |
977 | 0 | opj_mqc_encode(mqc, runlen & 1); |
978 | 0 | } else { |
979 | 0 | runlen = 0; |
980 | 0 | } |
981 | 0 | for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { |
982 | 0 | vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; |
983 | 0 | opj_t1_enc_clnpass_step( |
984 | 0 | t1, |
985 | 0 | &t1->flags[((j+1) * t1->flags_stride) + i + 1], |
986 | 0 | &t1->data[(j * t1->w) + i], |
987 | 0 | orient, |
988 | 0 | bpno, |
989 | 0 | one, |
990 | 0 | nmsedec, |
991 | 0 | agg && (j == k + runlen), |
992 | 0 | vsc); |
993 | 0 | } |
994 | 0 | } |
995 | 0 | } |
996 | 0 | } |
997 | | |
998 | | static void opj_t1_dec_clnpass( |
999 | | opj_t1_t *t1, |
1000 | | OPJ_INT32 bpno, |
1001 | | OPJ_INT32 orient, |
1002 | | OPJ_INT32 cblksty) |
1003 | 0 | { |
1004 | 0 | OPJ_INT32 one, half, oneplushalf, agg, runlen, vsc; |
1005 | 0 | OPJ_UINT32 i, j, k; |
1006 | 0 | OPJ_INT32 segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM; |
1007 | | |
1008 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
1009 | | |
1010 | 0 | one = 1 << bpno; |
1011 | 0 | half = one >> 1; |
1012 | 0 | oneplushalf = one | half; |
1013 | 0 | if (cblksty & J2K_CCP_CBLKSTY_VSC) { |
1014 | 0 | for (k = 0; k < t1->h; k += 4) { |
1015 | 0 | for (i = 0; i < t1->w; ++i) { |
1016 | 0 | if (k + 3 < t1->h) { |
1017 | 0 | agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
1018 | 0 | || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
1019 | 0 | || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
1020 | 0 | || (MACRO_t1_flags(1 + k + 3,1 + i) |
1021 | 0 | & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); |
1022 | 0 | } else { |
1023 | 0 | agg = 0; |
1024 | 0 | } |
1025 | 0 | if (agg) { |
1026 | 0 | opj_mqc_setcurctx(mqc, T1_CTXNO_AGG); |
1027 | 0 | if (!opj_mqc_decode(mqc)) { |
1028 | 0 | continue; |
1029 | 0 | } |
1030 | 0 | opj_mqc_setcurctx(mqc, T1_CTXNO_UNI); |
1031 | 0 | runlen = opj_mqc_decode(mqc); |
1032 | 0 | runlen = (runlen << 1) | opj_mqc_decode(mqc); |
1033 | 0 | } else { |
1034 | 0 | runlen = 0; |
1035 | 0 | } |
1036 | 0 | for (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) { |
1037 | 0 | vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; |
1038 | 0 | opj_t1_dec_clnpass_step_vsc( |
1039 | 0 | t1, |
1040 | 0 | &t1->flags[((j+1) * t1->flags_stride) + i + 1], |
1041 | 0 | &t1->data[(j * t1->w) + i], |
1042 | 0 | orient, |
1043 | 0 | oneplushalf, |
1044 | 0 | agg && (j == k + (OPJ_UINT32)runlen), |
1045 | 0 | vsc); |
1046 | 0 | } |
1047 | 0 | } |
1048 | 0 | } |
1049 | 0 | } else { |
1050 | 0 | OPJ_INT32 *data1 = t1->data; |
1051 | 0 | opj_flag_t *flags1 = &t1->flags[1]; |
1052 | 0 | for (k = 0; k < (t1->h & ~3u); k += 4) { |
1053 | 0 | for (i = 0; i < t1->w; ++i) { |
1054 | 0 | OPJ_INT32 *data2 = data1 + i; |
1055 | 0 | opj_flag_t *flags2 = flags1 + i; |
1056 | 0 | agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
1057 | 0 | || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
1058 | 0 | || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) |
1059 | 0 | || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); |
1060 | 0 | if (agg) { |
1061 | 0 | opj_mqc_setcurctx(mqc, T1_CTXNO_AGG); |
1062 | 0 | if (!opj_mqc_decode(mqc)) { |
1063 | 0 | continue; |
1064 | 0 | } |
1065 | 0 | opj_mqc_setcurctx(mqc, T1_CTXNO_UNI); |
1066 | 0 | runlen = opj_mqc_decode(mqc); |
1067 | 0 | runlen = (runlen << 1) | opj_mqc_decode(mqc); |
1068 | 0 | flags2 += (OPJ_UINT32)runlen * t1->flags_stride; |
1069 | 0 | data2 += (OPJ_UINT32)runlen * t1->w; |
1070 | 0 | for (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) { |
1071 | 0 | flags2 += t1->flags_stride; |
1072 | 0 | if (agg && (j == k + (OPJ_UINT32)runlen)) { |
1073 | 0 | opj_t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf); |
1074 | 0 | } else { |
1075 | 0 | opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); |
1076 | 0 | } |
1077 | 0 | data2 += t1->w; |
1078 | 0 | } |
1079 | 0 | } else { |
1080 | 0 | flags2 += t1->flags_stride; |
1081 | 0 | opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); |
1082 | 0 | data2 += t1->w; |
1083 | 0 | flags2 += t1->flags_stride; |
1084 | 0 | opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); |
1085 | 0 | data2 += t1->w; |
1086 | 0 | flags2 += t1->flags_stride; |
1087 | 0 | opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); |
1088 | 0 | data2 += t1->w; |
1089 | 0 | flags2 += t1->flags_stride; |
1090 | 0 | opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); |
1091 | 0 | data2 += t1->w; |
1092 | 0 | } |
1093 | 0 | } |
1094 | 0 | data1 += t1->w << 2; |
1095 | 0 | flags1 += t1->flags_stride << 2; |
1096 | 0 | } |
1097 | 0 | for (i = 0; i < t1->w; ++i) { |
1098 | 0 | OPJ_INT32 *data2 = data1 + i; |
1099 | 0 | opj_flag_t *flags2 = flags1 + i; |
1100 | 0 | for (j = k; j < t1->h; ++j) { |
1101 | 0 | flags2 += t1->flags_stride; |
1102 | 0 | opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); |
1103 | 0 | data2 += t1->w; |
1104 | 0 | } |
1105 | 0 | } |
1106 | 0 | } |
1107 | |
|
1108 | 0 | if (segsym) { |
1109 | 0 | OPJ_INT32 v = 0; |
1110 | 0 | opj_mqc_setcurctx(mqc, T1_CTXNO_UNI); |
1111 | 0 | v = opj_mqc_decode(mqc); |
1112 | 0 | v = (v << 1) | opj_mqc_decode(mqc); |
1113 | 0 | v = (v << 1) | opj_mqc_decode(mqc); |
1114 | 0 | v = (v << 1) | opj_mqc_decode(mqc); |
1115 | | /* |
1116 | | if (v!=0xa) { |
1117 | | opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); |
1118 | | } |
1119 | | */ |
1120 | 0 | } |
1121 | 0 | } /* VSC and BYPASS by Antonin */ |
1122 | | |
1123 | | |
1124 | | /** mod fixed_quality */ |
1125 | | static OPJ_FLOAT64 opj_t1_getwmsedec( |
1126 | | OPJ_INT32 nmsedec, |
1127 | | OPJ_UINT32 compno, |
1128 | | OPJ_UINT32 level, |
1129 | | OPJ_UINT32 orient, |
1130 | | OPJ_INT32 bpno, |
1131 | | OPJ_UINT32 qmfbid, |
1132 | | OPJ_FLOAT64 stepsize, |
1133 | | OPJ_UINT32 numcomps, |
1134 | | const OPJ_FLOAT64 * mct_norms) |
1135 | 0 | { |
1136 | 0 | OPJ_FLOAT64 w1 = 1, w2, wmsedec; |
1137 | 0 | OPJ_ARG_NOT_USED(numcomps); |
1138 | |
|
1139 | 0 | if (mct_norms) { |
1140 | 0 | w1 = mct_norms[compno]; |
1141 | 0 | } |
1142 | |
|
1143 | 0 | if (qmfbid == 1) { |
1144 | 0 | w2 = opj_dwt_getnorm(level, orient); |
1145 | 0 | } else { /* if (qmfbid == 0) */ |
1146 | 0 | w2 = opj_dwt_getnorm_real(level, orient); |
1147 | 0 | } |
1148 | |
|
1149 | 0 | wmsedec = w1 * w2 * stepsize * (1 << bpno); |
1150 | 0 | wmsedec *= wmsedec * nmsedec / 8192.0; |
1151 | |
|
1152 | 0 | return wmsedec; |
1153 | 0 | } |
1154 | | |
1155 | | OPJ_BOOL opj_t1_allocate_buffers( |
1156 | | opj_t1_t *t1, |
1157 | | OPJ_UINT32 w, |
1158 | | OPJ_UINT32 h) |
1159 | 0 | { |
1160 | 0 | OPJ_UINT32 datasize=w * h; |
1161 | 0 | OPJ_UINT32 flagssize; |
1162 | |
|
1163 | 0 | if(datasize > t1->datasize){ |
1164 | 0 | opj_aligned_free(t1->data); |
1165 | 0 | t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32)); |
1166 | 0 | if(!t1->data){ |
1167 | 0 | return OPJ_FALSE; |
1168 | 0 | } |
1169 | 0 | t1->datasize=datasize; |
1170 | 0 | } |
1171 | 0 | memset(t1->data,0,datasize * sizeof(OPJ_INT32)); |
1172 | |
|
1173 | 0 | t1->flags_stride=w+2; |
1174 | 0 | flagssize=t1->flags_stride * (h+2); |
1175 | |
|
1176 | 0 | if(flagssize > t1->flagssize){ |
1177 | 0 | opj_aligned_free(t1->flags); |
1178 | 0 | t1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(opj_flag_t)); |
1179 | 0 | if(!t1->flags){ |
1180 | 0 | return OPJ_FALSE; |
1181 | 0 | } |
1182 | 0 | t1->flagssize=flagssize; |
1183 | 0 | } |
1184 | 0 | memset(t1->flags,0,flagssize * sizeof(opj_flag_t)); |
1185 | |
|
1186 | 0 | t1->w=w; |
1187 | 0 | t1->h=h; |
1188 | |
|
1189 | 0 | return OPJ_TRUE; |
1190 | 0 | } |
1191 | | |
1192 | | /* ----------------------------------------------------------------------- */ |
1193 | | |
1194 | | /* ----------------------------------------------------------------------- */ |
1195 | | /** |
1196 | | * Creates a new Tier 1 handle |
1197 | | * and initializes the look-up tables of the Tier-1 coder/decoder |
1198 | | * @return a new T1 handle if successful, returns NULL otherwise |
1199 | | */ |
1200 | | opj_t1_t* opj_t1_create() |
1201 | 0 | { |
1202 | 0 | opj_t1_t *l_t1 = 00; |
1203 | |
|
1204 | 0 | l_t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t)); |
1205 | 0 | if (!l_t1) { |
1206 | 0 | return 00; |
1207 | 0 | } |
1208 | 0 | memset(l_t1,0,sizeof(opj_t1_t)); |
1209 | | |
1210 | | /* create MQC and RAW handles */ |
1211 | 0 | l_t1->mqc = opj_mqc_create(); |
1212 | 0 | if (! l_t1->mqc) { |
1213 | 0 | opj_t1_destroy(l_t1); |
1214 | 0 | return 00; |
1215 | 0 | } |
1216 | | |
1217 | 0 | l_t1->raw = opj_raw_create(); |
1218 | 0 | if (! l_t1->raw) { |
1219 | 0 | opj_t1_destroy(l_t1); |
1220 | 0 | return 00; |
1221 | 0 | } |
1222 | | |
1223 | 0 | return l_t1; |
1224 | 0 | } |
1225 | | |
1226 | | |
1227 | | /** |
1228 | | * Destroys a previously created T1 handle |
1229 | | * |
1230 | | * @param p_t1 Tier 1 handle to destroy |
1231 | | */ |
1232 | | void opj_t1_destroy(opj_t1_t *p_t1) |
1233 | 0 | { |
1234 | 0 | if (! p_t1) { |
1235 | 0 | return; |
1236 | 0 | } |
1237 | | |
1238 | | /* destroy MQC and RAW handles */ |
1239 | 0 | opj_mqc_destroy(p_t1->mqc); |
1240 | 0 | p_t1->mqc = 00; |
1241 | 0 | opj_raw_destroy(p_t1->raw); |
1242 | 0 | p_t1->raw = 00; |
1243 | | |
1244 | 0 | if (p_t1->data) { |
1245 | 0 | opj_aligned_free(p_t1->data); |
1246 | 0 | p_t1->data = 00; |
1247 | 0 | } |
1248 | |
|
1249 | 0 | if (p_t1->flags) { |
1250 | 0 | opj_aligned_free(p_t1->flags); |
1251 | 0 | p_t1->flags = 00; |
1252 | 0 | } |
1253 | |
|
1254 | 0 | opj_free(p_t1); |
1255 | 0 | } |
1256 | | |
1257 | | OPJ_BOOL opj_t1_decode_cblks( opj_t1_t* t1, |
1258 | | opj_tcd_tilecomp_t* tilec, |
1259 | | opj_tccp_t* tccp |
1260 | | ) |
1261 | 0 | { |
1262 | 0 | OPJ_UINT32 resno, bandno, precno, cblkno; |
1263 | 0 | OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0); |
1264 | |
|
1265 | 0 | for (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) { |
1266 | 0 | opj_tcd_resolution_t* res = &tilec->resolutions[resno]; |
1267 | |
|
1268 | 0 | for (bandno = 0; bandno < res->numbands; ++bandno) { |
1269 | 0 | opj_tcd_band_t* restrict band = &res->bands[bandno]; |
1270 | |
|
1271 | 0 | for (precno = 0; precno < res->pw * res->ph; ++precno) { |
1272 | 0 | opj_tcd_precinct_t* precinct = &band->precincts[precno]; |
1273 | |
|
1274 | 0 | for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) { |
1275 | 0 | opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno]; |
1276 | 0 | OPJ_INT32* restrict datap; |
1277 | | /*void* restrict tiledp;*/ |
1278 | 0 | OPJ_UINT32 cblk_w, cblk_h; |
1279 | 0 | OPJ_INT32 x, y; |
1280 | 0 | OPJ_UINT32 i, j; |
1281 | |
|
1282 | 0 | if (OPJ_FALSE == opj_t1_decode_cblk( |
1283 | 0 | t1, |
1284 | 0 | cblk, |
1285 | 0 | band->bandno, |
1286 | 0 | (OPJ_UINT32)tccp->roishift, |
1287 | 0 | tccp->cblksty)) { |
1288 | 0 | return OPJ_FALSE; |
1289 | 0 | } |
1290 | | |
1291 | 0 | x = cblk->x0 - band->x0; |
1292 | 0 | y = cblk->y0 - band->y0; |
1293 | 0 | if (band->bandno & 1) { |
1294 | 0 | opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; |
1295 | 0 | x += pres->x1 - pres->x0; |
1296 | 0 | } |
1297 | 0 | if (band->bandno & 2) { |
1298 | 0 | opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; |
1299 | 0 | y += pres->y1 - pres->y0; |
1300 | 0 | } |
1301 | |
|
1302 | 0 | datap=t1->data; |
1303 | 0 | cblk_w = t1->w; |
1304 | 0 | cblk_h = t1->h; |
1305 | |
|
1306 | 0 | if (tccp->roishift) { |
1307 | 0 | OPJ_INT32 thresh = 1 << tccp->roishift; |
1308 | 0 | for (j = 0; j < cblk_h; ++j) { |
1309 | 0 | for (i = 0; i < cblk_w; ++i) { |
1310 | 0 | OPJ_INT32 val = datap[(j * cblk_w) + i]; |
1311 | 0 | OPJ_INT32 mag = abs(val); |
1312 | 0 | if (mag >= thresh) { |
1313 | 0 | mag >>= tccp->roishift; |
1314 | 0 | datap[(j * cblk_w) + i] = val < 0 ? -mag : mag; |
1315 | 0 | } |
1316 | 0 | } |
1317 | 0 | } |
1318 | 0 | } |
1319 | | |
1320 | | /*tiledp=(void*)&tilec->data[(y * tile_w) + x];*/ |
1321 | 0 | if (tccp->qmfbid == 1) { |
1322 | 0 | OPJ_INT32* restrict tiledp = &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x]; |
1323 | 0 | for (j = 0; j < cblk_h; ++j) { |
1324 | 0 | for (i = 0; i < cblk_w; ++i) { |
1325 | 0 | OPJ_INT32 tmp = datap[(j * cblk_w) + i]; |
1326 | 0 | ((OPJ_INT32*)tiledp)[(j * tile_w) + i] = tmp / 2; |
1327 | 0 | } |
1328 | 0 | } |
1329 | 0 | } else { /* if (tccp->qmfbid == 0) */ |
1330 | 0 | OPJ_FLOAT32* restrict tiledp = (OPJ_FLOAT32*) &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x]; |
1331 | 0 | for (j = 0; j < cblk_h; ++j) { |
1332 | 0 | OPJ_FLOAT32* restrict tiledp2 = tiledp; |
1333 | 0 | for (i = 0; i < cblk_w; ++i) { |
1334 | 0 | OPJ_FLOAT32 tmp = (OPJ_FLOAT32)*datap * band->stepsize; |
1335 | 0 | *tiledp2 = tmp; |
1336 | 0 | datap++; |
1337 | 0 | tiledp2++; |
1338 | | /*float tmp = datap[(j * cblk_w) + i] * band->stepsize; |
1339 | | ((float*)tiledp)[(j * tile_w) + i] = tmp;*/ |
1340 | |
|
1341 | 0 | } |
1342 | 0 | tiledp += tile_w; |
1343 | 0 | } |
1344 | 0 | } |
1345 | | /*opj_free(cblk->data); |
1346 | | opj_free(cblk->segs);*/ |
1347 | | /*cblk->segs = 00;*/ |
1348 | 0 | } /* cblkno */ |
1349 | | /*opj_free(precinct->cblks.dec);*/ |
1350 | 0 | } /* precno */ |
1351 | 0 | } /* bandno */ |
1352 | 0 | } /* resno */ |
1353 | 0 | return OPJ_TRUE; |
1354 | 0 | } |
1355 | | |
1356 | | |
1357 | | OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1, |
1358 | | opj_tcd_cblk_dec_t* cblk, |
1359 | | OPJ_UINT32 orient, |
1360 | | OPJ_UINT32 roishift, |
1361 | | OPJ_UINT32 cblksty) |
1362 | 0 | { |
1363 | 0 | opj_raw_t *raw = t1->raw; /* RAW component */ |
1364 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
1365 | |
|
1366 | 0 | OPJ_INT32 bpno; |
1367 | 0 | OPJ_UINT32 passtype; |
1368 | 0 | OPJ_UINT32 segno, passno; |
1369 | 0 | OPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */ |
1370 | |
|
1371 | 0 | if(!opj_t1_allocate_buffers( |
1372 | 0 | t1, |
1373 | 0 | (OPJ_UINT32)(cblk->x1 - cblk->x0), |
1374 | 0 | (OPJ_UINT32)(cblk->y1 - cblk->y0))) |
1375 | 0 | { |
1376 | 0 | return OPJ_FALSE; |
1377 | 0 | } |
1378 | | |
1379 | 0 | bpno = (OPJ_INT32)(roishift + cblk->numbps - 1); |
1380 | 0 | passtype = 2; |
1381 | |
|
1382 | 0 | opj_mqc_resetstates(mqc); |
1383 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); |
1384 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); |
1385 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); |
1386 | |
|
1387 | 0 | for (segno = 0; segno < cblk->real_num_segs; ++segno) { |
1388 | 0 | opj_tcd_seg_t *seg = &cblk->segs[segno]; |
1389 | | |
1390 | | /* BYPASS mode */ |
1391 | 0 | type = ((bpno <= ((OPJ_INT32) (cblk->numbps) - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; |
1392 | | /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */ |
1393 | 0 | if(seg->data == 00){ |
1394 | 0 | continue; |
1395 | 0 | } |
1396 | 0 | if (type == T1_TYPE_RAW) { |
1397 | 0 | opj_raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len); |
1398 | 0 | } else { |
1399 | 0 | if (OPJ_FALSE == opj_mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len)) { |
1400 | 0 | return OPJ_FALSE; |
1401 | 0 | } |
1402 | 0 | } |
1403 | | |
1404 | 0 | for (passno = 0; passno < seg->real_num_passes; ++passno) { |
1405 | 0 | switch (passtype) { |
1406 | 0 | case 0: |
1407 | 0 | if (type == T1_TYPE_RAW) { |
1408 | 0 | opj_t1_dec_sigpass_raw(t1, bpno+1, (OPJ_INT32)orient, (OPJ_INT32)cblksty); |
1409 | 0 | } else { |
1410 | 0 | if (cblksty & J2K_CCP_CBLKSTY_VSC) { |
1411 | 0 | opj_t1_dec_sigpass_mqc_vsc(t1, bpno+1, (OPJ_INT32)orient); |
1412 | 0 | } else { |
1413 | 0 | opj_t1_dec_sigpass_mqc(t1, bpno+1, (OPJ_INT32)orient); |
1414 | 0 | } |
1415 | 0 | } |
1416 | 0 | break; |
1417 | 0 | case 1: |
1418 | 0 | if (type == T1_TYPE_RAW) { |
1419 | 0 | opj_t1_dec_refpass_raw(t1, bpno+1, (OPJ_INT32)cblksty); |
1420 | 0 | } else { |
1421 | 0 | if (cblksty & J2K_CCP_CBLKSTY_VSC) { |
1422 | 0 | opj_t1_dec_refpass_mqc_vsc(t1, bpno+1); |
1423 | 0 | } else { |
1424 | 0 | opj_t1_dec_refpass_mqc(t1, bpno+1); |
1425 | 0 | } |
1426 | 0 | } |
1427 | 0 | break; |
1428 | 0 | case 2: |
1429 | 0 | opj_t1_dec_clnpass(t1, bpno+1, (OPJ_INT32)orient, (OPJ_INT32)cblksty); |
1430 | 0 | break; |
1431 | 0 | } |
1432 | | |
1433 | 0 | if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { |
1434 | 0 | opj_mqc_resetstates(mqc); |
1435 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); |
1436 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); |
1437 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); |
1438 | 0 | } |
1439 | 0 | if (++passtype == 3) { |
1440 | 0 | passtype = 0; |
1441 | 0 | bpno--; |
1442 | 0 | } |
1443 | 0 | } |
1444 | 0 | } |
1445 | 0 | return OPJ_TRUE; |
1446 | 0 | } |
1447 | | |
1448 | | |
1449 | | |
1450 | | |
1451 | | OPJ_BOOL opj_t1_encode_cblks( opj_t1_t *t1, |
1452 | | opj_tcd_tile_t *tile, |
1453 | | opj_tcp_t *tcp, |
1454 | | const OPJ_FLOAT64 * mct_norms |
1455 | | ) |
1456 | 0 | { |
1457 | 0 | OPJ_UINT32 compno, resno, bandno, precno, cblkno; |
1458 | |
|
1459 | 0 | tile->distotile = 0; /* fixed_quality */ |
1460 | |
|
1461 | 0 | for (compno = 0; compno < tile->numcomps; ++compno) { |
1462 | 0 | opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; |
1463 | 0 | opj_tccp_t* tccp = &tcp->tccps[compno]; |
1464 | 0 | OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0); |
1465 | |
|
1466 | 0 | for (resno = 0; resno < tilec->numresolutions; ++resno) { |
1467 | 0 | opj_tcd_resolution_t *res = &tilec->resolutions[resno]; |
1468 | |
|
1469 | 0 | for (bandno = 0; bandno < res->numbands; ++bandno) { |
1470 | 0 | opj_tcd_band_t* restrict band = &res->bands[bandno]; |
1471 | 0 | OPJ_INT32 bandconst = 8192 * 8192 / ((OPJ_INT32) floor(band->stepsize * 8192)); |
1472 | |
|
1473 | 0 | for (precno = 0; precno < res->pw * res->ph; ++precno) { |
1474 | 0 | opj_tcd_precinct_t *prc = &band->precincts[precno]; |
1475 | |
|
1476 | 0 | for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) { |
1477 | 0 | opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; |
1478 | 0 | OPJ_INT32 * restrict datap; |
1479 | 0 | OPJ_INT32* restrict tiledp; |
1480 | 0 | OPJ_UINT32 cblk_w; |
1481 | 0 | OPJ_UINT32 cblk_h; |
1482 | 0 | OPJ_UINT32 i, j; |
1483 | |
|
1484 | 0 | OPJ_INT32 x = cblk->x0 - band->x0; |
1485 | 0 | OPJ_INT32 y = cblk->y0 - band->y0; |
1486 | 0 | if (band->bandno & 1) { |
1487 | 0 | opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; |
1488 | 0 | x += pres->x1 - pres->x0; |
1489 | 0 | } |
1490 | 0 | if (band->bandno & 2) { |
1491 | 0 | opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; |
1492 | 0 | y += pres->y1 - pres->y0; |
1493 | 0 | } |
1494 | |
|
1495 | 0 | if(!opj_t1_allocate_buffers( |
1496 | 0 | t1, |
1497 | 0 | (OPJ_UINT32)(cblk->x1 - cblk->x0), |
1498 | 0 | (OPJ_UINT32)(cblk->y1 - cblk->y0))) |
1499 | 0 | { |
1500 | 0 | return OPJ_FALSE; |
1501 | 0 | } |
1502 | | |
1503 | 0 | datap=t1->data; |
1504 | 0 | cblk_w = t1->w; |
1505 | 0 | cblk_h = t1->h; |
1506 | |
|
1507 | 0 | tiledp=&tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x]; |
1508 | 0 | if (tccp->qmfbid == 1) { |
1509 | 0 | for (j = 0; j < cblk_h; ++j) { |
1510 | 0 | for (i = 0; i < cblk_w; ++i) { |
1511 | 0 | OPJ_INT32 tmp = tiledp[(j * tile_w) + i]; |
1512 | 0 | datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS; |
1513 | 0 | } |
1514 | 0 | } |
1515 | 0 | } else { /* if (tccp->qmfbid == 0) */ |
1516 | 0 | for (j = 0; j < cblk_h; ++j) { |
1517 | 0 | for (i = 0; i < cblk_w; ++i) { |
1518 | 0 | OPJ_INT32 tmp = tiledp[(j * tile_w) + i]; |
1519 | 0 | datap[(j * cblk_w) + i] = |
1520 | 0 | opj_int_fix_mul( |
1521 | 0 | tmp, |
1522 | 0 | bandconst) >> (11 - T1_NMSEDEC_FRACBITS); |
1523 | 0 | } |
1524 | 0 | } |
1525 | 0 | } |
1526 | |
|
1527 | 0 | opj_t1_encode_cblk( |
1528 | 0 | t1, |
1529 | 0 | cblk, |
1530 | 0 | band->bandno, |
1531 | 0 | compno, |
1532 | 0 | tilec->numresolutions - 1 - resno, |
1533 | 0 | tccp->qmfbid, |
1534 | 0 | band->stepsize, |
1535 | 0 | tccp->cblksty, |
1536 | 0 | tile->numcomps, |
1537 | 0 | tile, |
1538 | 0 | mct_norms); |
1539 | |
|
1540 | 0 | } /* cblkno */ |
1541 | 0 | } /* precno */ |
1542 | 0 | } /* bandno */ |
1543 | 0 | } /* resno */ |
1544 | 0 | } /* compno */ |
1545 | 0 | return OPJ_TRUE; |
1546 | 0 | } |
1547 | | |
1548 | | /** mod fixed_quality */ |
1549 | | void opj_t1_encode_cblk(opj_t1_t *t1, |
1550 | | opj_tcd_cblk_enc_t* cblk, |
1551 | | OPJ_UINT32 orient, |
1552 | | OPJ_UINT32 compno, |
1553 | | OPJ_UINT32 level, |
1554 | | OPJ_UINT32 qmfbid, |
1555 | | OPJ_FLOAT64 stepsize, |
1556 | | OPJ_UINT32 cblksty, |
1557 | | OPJ_UINT32 numcomps, |
1558 | | opj_tcd_tile_t * tile, |
1559 | | const OPJ_FLOAT64 * mct_norms) |
1560 | 0 | { |
1561 | 0 | OPJ_FLOAT64 cumwmsedec = 0.0; |
1562 | |
|
1563 | 0 | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
1564 | |
|
1565 | 0 | OPJ_UINT32 passno; |
1566 | 0 | OPJ_INT32 bpno; |
1567 | 0 | OPJ_UINT32 passtype; |
1568 | 0 | OPJ_INT32 nmsedec = 0; |
1569 | 0 | OPJ_INT32 max; |
1570 | 0 | OPJ_UINT32 i; |
1571 | 0 | OPJ_BYTE type = T1_TYPE_MQ; |
1572 | 0 | OPJ_FLOAT64 tempwmsedec; |
1573 | |
|
1574 | 0 | max = 0; |
1575 | 0 | for (i = 0; i < t1->w * t1->h; ++i) { |
1576 | 0 | OPJ_INT32 tmp = abs(t1->data[i]); |
1577 | 0 | max = opj_int_max(max, tmp); |
1578 | 0 | } |
1579 | |
|
1580 | 0 | cblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS) : 0; |
1581 | |
|
1582 | 0 | bpno = (OPJ_INT32)(cblk->numbps - 1); |
1583 | 0 | passtype = 2; |
1584 | |
|
1585 | 0 | opj_mqc_resetstates(mqc); |
1586 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); |
1587 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); |
1588 | 0 | opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); |
1589 | 0 | opj_mqc_init_enc(mqc, cblk->data); |
1590 | |
|
1591 | 0 | for (passno = 0; bpno >= 0; ++passno) { |
1592 | 0 | opj_tcd_pass_t *pass = &cblk->passes[passno]; |
1593 | 0 | OPJ_UINT32 correction = 3; |
1594 | 0 | type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; |
1595 | |
|
1596 | 0 | switch (passtype) { |
1597 | 0 | case 0: |
1598 | 0 | opj_t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty); |
1599 | 0 | break; |
1600 | 0 | case 1: |
1601 | 0 | opj_t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty); |
1602 | 0 | break; |
1603 | 0 | case 2: |
1604 | 0 | opj_t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty); |
1605 | | /* code switch SEGMARK (i.e. SEGSYM) */ |
1606 | 0 | if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) |
1607 | 0 | opj_mqc_segmark_enc(mqc); |
1608 | 0 | break; |
1609 | 0 | } |
1610 | | |
1611 | | /* fixed_quality */ |
1612 | 0 | tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps,mct_norms) ; |
1613 | 0 | cumwmsedec += tempwmsedec; |
1614 | 0 | tile->distotile += tempwmsedec; |
1615 | | |
1616 | | /* Code switch "RESTART" (i.e. TERMALL) */ |
1617 | 0 | if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) { |
1618 | 0 | if (type == T1_TYPE_RAW) { |
1619 | 0 | opj_mqc_flush(mqc); |
1620 | 0 | correction = 1; |
1621 | | /* correction = mqc_bypass_flush_enc(); */ |
1622 | 0 | } else { /* correction = mqc_restart_enc(); */ |
1623 | 0 | opj_mqc_flush(mqc); |
1624 | 0 | correction = 1; |
1625 | 0 | } |
1626 | 0 | pass->term = 1; |
1627 | 0 | } else { |
1628 | 0 | if (((bpno < ((OPJ_INT32) (cblk->numbps) - 4) && (passtype > 0)) |
1629 | 0 | || ((bpno == ((OPJ_INT32)cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) { |
1630 | 0 | if (type == T1_TYPE_RAW) { |
1631 | 0 | opj_mqc_flush(mqc); |
1632 | 0 | correction = 1; |
1633 | | /* correction = mqc_bypass_flush_enc(); */ |
1634 | 0 | } else { /* correction = mqc_restart_enc(); */ |
1635 | 0 | opj_mqc_flush(mqc); |
1636 | 0 | correction = 1; |
1637 | 0 | } |
1638 | 0 | pass->term = 1; |
1639 | 0 | } else { |
1640 | 0 | pass->term = 0; |
1641 | 0 | } |
1642 | 0 | } |
1643 | |
|
1644 | 0 | if (++passtype == 3) { |
1645 | 0 | passtype = 0; |
1646 | 0 | bpno--; |
1647 | 0 | } |
1648 | |
|
1649 | 0 | if (pass->term && bpno > 0) { |
1650 | 0 | type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; |
1651 | 0 | if (type == T1_TYPE_RAW) |
1652 | 0 | opj_mqc_bypass_init_enc(mqc); |
1653 | 0 | else |
1654 | 0 | opj_mqc_restart_init_enc(mqc); |
1655 | 0 | } |
1656 | |
|
1657 | 0 | pass->distortiondec = cumwmsedec; |
1658 | 0 | pass->rate = opj_mqc_numbytes(mqc) + correction; /* FIXME */ |
1659 | | |
1660 | | /* Code-switch "RESET" */ |
1661 | 0 | if (cblksty & J2K_CCP_CBLKSTY_RESET) |
1662 | 0 | opj_mqc_reset_enc(mqc); |
1663 | 0 | } |
1664 | | |
1665 | | /* Code switch "ERTERM" (i.e. PTERM) */ |
1666 | 0 | if (cblksty & J2K_CCP_CBLKSTY_PTERM) |
1667 | 0 | opj_mqc_erterm_enc(mqc); |
1668 | 0 | else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) |
1669 | 0 | opj_mqc_flush(mqc); |
1670 | |
|
1671 | 0 | cblk->totalpasses = passno; |
1672 | |
|
1673 | 0 | for (passno = 0; passno<cblk->totalpasses; passno++) { |
1674 | 0 | opj_tcd_pass_t *pass = &cblk->passes[passno]; |
1675 | 0 | if (pass->rate > opj_mqc_numbytes(mqc)) |
1676 | 0 | pass->rate = opj_mqc_numbytes(mqc); |
1677 | | /*Preventing generation of FF as last data byte of a pass*/ |
1678 | 0 | if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){ |
1679 | 0 | pass->rate--; |
1680 | 0 | } |
1681 | 0 | pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); |
1682 | 0 | } |
1683 | 0 | } |
1684 | | |
1685 | | #if 0 |
1686 | | void opj_t1_dec_refpass_step( opj_t1_t *t1, |
1687 | | opj_flag_t *flagsp, |
1688 | | OPJ_INT32 *datap, |
1689 | | OPJ_INT32 poshalf, |
1690 | | OPJ_INT32 neghalf, |
1691 | | OPJ_BYTE type, |
1692 | | OPJ_UINT32 vsc) |
1693 | | { |
1694 | | OPJ_INT32 t; |
1695 | | OPJ_UINT32 v,flag; |
1696 | | |
1697 | | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
1698 | | opj_raw_t *raw = t1->raw; /* RAW component */ |
1699 | | |
1700 | | flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); |
1701 | | if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { |
1702 | | opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag)); /* ESSAI */ |
1703 | | if (type == T1_TYPE_RAW) { |
1704 | | v = opj_raw_decode(raw); |
1705 | | } else { |
1706 | | v = opj_mqc_decode(mqc); |
1707 | | } |
1708 | | t = v ? poshalf : neghalf; |
1709 | | *datap += *datap < 0 ? -t : t; |
1710 | | *flagsp |= T1_REFINE; |
1711 | | } |
1712 | | } /* VSC and BYPASS by Antonin */ |
1713 | | #endif |
1714 | | |
1715 | | |
1716 | | |
1717 | | #if 0 |
1718 | | void opj_t1_dec_sigpass_step( opj_t1_t *t1, |
1719 | | opj_flag_t *flagsp, |
1720 | | OPJ_INT32 *datap, |
1721 | | OPJ_UINT32 orient, |
1722 | | OPJ_INT32 oneplushalf, |
1723 | | OPJ_BYTE type, |
1724 | | OPJ_UINT32 vsc) |
1725 | | { |
1726 | | OPJ_UINT32 v, flag; |
1727 | | |
1728 | | opj_raw_t *raw = t1->raw; /* RAW component */ |
1729 | | opj_mqc_t *mqc = t1->mqc; /* MQC component */ |
1730 | | |
1731 | | flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); |
1732 | | if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { |
1733 | | if (type == T1_TYPE_RAW) { |
1734 | | if (opj_raw_decode(raw)) { |
1735 | | v = opj_raw_decode(raw); /* ESSAI */ |
1736 | | *datap = v ? -oneplushalf : oneplushalf; |
1737 | | opj_t1_updateflags(flagsp, v, t1->flags_stride); |
1738 | | } |
1739 | | } else { |
1740 | | opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient)); |
1741 | | if (opj_mqc_decode(mqc)) { |
1742 | | opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag)); |
1743 | | v = opj_mqc_decode(mqc) ^ opj_t1_getspb(flag); |
1744 | | *datap = v ? -oneplushalf : oneplushalf; |
1745 | | opj_t1_updateflags(flagsp, v, t1->flags_stride); |
1746 | | } |
1747 | | } |
1748 | | *flagsp |= T1_VISIT; |
1749 | | } |
1750 | | } /* VSC and BYPASS by Antonin */ |
1751 | | #endif |