Home | History | Annotate | Download | only in libopenjpeg20
      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 (at) haxxed.com>
     15  * Copyright (c) 2012, Carl Hetherington
     16  * Copyright (c) 2017, IntoPIX SA <support (at) 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 
     67 static INLINE OPJ_BYTE opj_t1_getctxno_zc(opj_mqc_t *mqc, OPJ_UINT32 f);
     68 static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f);
     69 static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos);
     70 static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos);
     71 static 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 /**
     77 Decode significant pass
     78 */
     79 
     80 static 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);
     87 static 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 /**
     97 Encode significant pass
     98 */
     99 static 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 /**
    106 Decode significant pass
    107 */
    108 static void opj_t1_dec_sigpass_raw(
    109     opj_t1_t *t1,
    110     OPJ_INT32 bpno,
    111     OPJ_INT32 cblksty);
    112 
    113 /**
    114 Encode refinement pass
    115 */
    116 static void opj_t1_enc_refpass(opj_t1_t *t1,
    117                                OPJ_INT32 bpno,
    118                                OPJ_INT32 *nmsedec,
    119                                OPJ_BYTE type);
    120 
    121 /**
    122 Decode refinement pass
    123 */
    124 static void opj_t1_dec_refpass_raw(
    125     opj_t1_t *t1,
    126     OPJ_INT32 bpno);
    127 
    128 
    129 /**
    130 Decode refinement pass
    131 */
    132 
    133 static 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);
    139 static 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 /**
    148 Decode clean-up pass
    149 */
    150 
    151 static 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 /**
    160 Encode clean-up pass
    161 */
    162 static void opj_t1_enc_clnpass(
    163     opj_t1_t *t1,
    164     OPJ_INT32 bpno,
    165     OPJ_INT32 *nmsedec,
    166     OPJ_UINT32 cblksty);
    167 
    168 static 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 
    180 static 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 /**
    194 Decode 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 */
    204 static 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 
    213 static 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 
    223 static 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 
    228 static 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 
    258 static INLINE OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 lu)
    259 {
    260     return lut_ctxno_sc[lu];
    261 }
    262 
    263 static 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 
    270 static INLINE OPJ_BYTE opj_t1_getspb(OPJ_UINT32 lu)
    271 {
    272     return lut_spb[lu];
    273 }
    274 
    275 static 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 
    284 static 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 
    322 static 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 /**
    330 Encode significant pass
    331 */
    332 static 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 
    389 static 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 
    439 static 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 
    456 static 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 
    557 static 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 
    665 static 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 
    672 static 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 
    679 static 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 
    687 static 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 
    695 static 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 /**
    716 Encode refinement pass step
    717 */
    718 static 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 
    753 static 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 
    785 static 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 
    800 static 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 
    907 static 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 
   1005 static 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 
   1012 static 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 
   1019 static 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 /**
   1031 Encode clean-up pass step
   1032 */
   1033 static 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;
   1087 LABEL_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 
   1143 static 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 
   1160 static 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 
   1333 static 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 
   1354 static 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 
   1361 static 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 
   1368 static 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 
   1376 static 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 
   1384 static 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 */
   1407 static 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 
   1438 static 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 */
   1537 opj_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 */
   1557 void 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 
   1579 typedef 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 
   1593 static void opj_t1_destroy_wrapper(void* t1)
   1594 {
   1595     opj_t1_destroy((opj_t1_t*) t1);
   1596 }
   1597 
   1598 static 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 
   1794 void 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 
   1920 static 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 
   2105 OPJ_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 */
   2215 static 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 */
   2246 static 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