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