Reduce number of occurrences of orient function argument

This is essentially used to shift inside the lut_ctxno_zc, which we
can precompute at the beginning of opj_t1_decode_cblk() /
opj_t1_encode_cblk()
This commit is contained in:
Even Rouault 2016-05-22 00:50:34 +02:00
parent 23a01dfdef
commit ba1edf6cd4
2 changed files with 47 additions and 81 deletions

View File

@ -77,6 +77,7 @@ typedef struct opj_mqc {
OPJ_BYTE *end; OPJ_BYTE *end;
opj_mqc_state_t *ctxs[MQC_NUMCTXS]; opj_mqc_state_t *ctxs[MQC_NUMCTXS];
opj_mqc_state_t **curctx; opj_mqc_state_t **curctx;
const OPJ_BYTE *lut_ctxno_zc_orient; /* lut_ctxno_zc shifted by 256 * bandno */
#ifdef MQC_PERF_OPT #ifdef MQC_PERF_OPT
unsigned char *buffer; unsigned char *buffer;
#endif #endif

View File

@ -45,7 +45,7 @@
/** @name Local static functions */ /** @name Local static functions */
/*@{*/ /*@{*/
static INLINE OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient); static INLINE OPJ_BYTE opj_t1_getctxno_zc(opj_mqc_t *mqc, OPJ_UINT32 f);
static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f); static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f);
static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f); static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f);
static OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f); static OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f);
@ -58,7 +58,6 @@ Encode significant pass
static void opj_t1_enc_sigpass_step(opj_t1_t *t1, static void opj_t1_enc_sigpass_step(opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_UINT32 orient,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 one, OPJ_INT32 one,
OPJ_INT32 *nmsedec, OPJ_INT32 *nmsedec,
@ -82,20 +81,17 @@ static INLINE void opj_t1_dec_sigpass_step_raw(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf, OPJ_INT32 oneplushalf,
OPJ_INT32 vsc); OPJ_INT32 vsc);
static INLINE void opj_t1_dec_sigpass_step_mqc( static INLINE void opj_t1_dec_sigpass_step_mqc(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf); OPJ_INT32 oneplushalf);
static INLINE void opj_t1_dec_sigpass_step_mqc_vsc( static INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf, OPJ_INT32 oneplushalf,
OPJ_INT32 vsc); OPJ_INT32 vsc);
@ -105,7 +101,6 @@ Encode significant pass
*/ */
static void opj_t1_enc_sigpass( opj_t1_t *t1, static void opj_t1_enc_sigpass( opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_UINT32 orient,
OPJ_INT32 *nmsedec, OPJ_INT32 *nmsedec,
OPJ_BYTE type, OPJ_BYTE type,
OPJ_UINT32 cblksty); OPJ_UINT32 cblksty);
@ -116,12 +111,10 @@ Decode significant pass
static void opj_t1_dec_sigpass_raw( static void opj_t1_dec_sigpass_raw(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 orient,
OPJ_INT32 cblksty); OPJ_INT32 cblksty);
static void opj_t1_dec_sigpass_mqc_vsc( static void opj_t1_dec_sigpass_mqc_vsc(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno);
OPJ_INT32 orient);
@ -202,7 +195,6 @@ static void opj_t1_enc_clnpass_step(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_UINT32 orient,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 one, OPJ_INT32 one,
OPJ_INT32 *nmsedec, OPJ_INT32 *nmsedec,
@ -215,19 +207,16 @@ static void opj_t1_dec_clnpass_step_partial(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf); OPJ_INT32 oneplushalf);
static void opj_t1_dec_clnpass_step( static void opj_t1_dec_clnpass_step(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf); OPJ_INT32 oneplushalf);
static void opj_t1_dec_clnpass_step_vsc( static void opj_t1_dec_clnpass_step_vsc(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf, OPJ_INT32 oneplushalf,
OPJ_INT32 partial, OPJ_INT32 partial,
OPJ_INT32 vsc); OPJ_INT32 vsc);
@ -237,7 +226,6 @@ Encode clean-up pass
static void opj_t1_enc_clnpass( static void opj_t1_enc_clnpass(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_UINT32 orient,
OPJ_INT32 *nmsedec, OPJ_INT32 *nmsedec,
OPJ_UINT32 cblksty); OPJ_UINT32 cblksty);
/** /**
@ -246,7 +234,6 @@ Decode clean-up pass
static void opj_t1_dec_clnpass( static void opj_t1_dec_clnpass(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 orient,
OPJ_INT32 cblksty); OPJ_INT32 cblksty);
static OPJ_FLOAT64 opj_t1_getwmsedec( static OPJ_FLOAT64 opj_t1_getwmsedec(
@ -298,8 +285,8 @@ static OPJ_BOOL opj_t1_allocate_buffers( opj_t1_t *t1,
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient) { static OPJ_BYTE opj_t1_getctxno_zc(opj_mqc_t *mqc, OPJ_UINT32 f) {
return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; return mqc->lut_ctxno_zc_orient[(f & T1_SIG_OTH)];
} }
static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f) { static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f) {
@ -358,7 +345,6 @@ static void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stri
static void opj_t1_enc_sigpass_step( opj_t1_t *t1, static void opj_t1_enc_sigpass_step( opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_UINT32 orient,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 one, OPJ_INT32 one,
OPJ_INT32 *nmsedec, OPJ_INT32 *nmsedec,
@ -374,7 +360,7 @@ static void opj_t1_enc_sigpass_step( opj_t1_t *t1,
flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp); flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
v = (opj_int_abs(*datap) & one) ? 1 : 0; v = (opj_int_abs(*datap) & one) ? 1 : 0;
opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient)); /* ESSAI */ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(mqc, flag)); /* ESSAI */
if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v); opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
} else { } else {
@ -400,13 +386,11 @@ static INLINE void opj_t1_dec_sigpass_step_raw(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf, OPJ_INT32 oneplushalf,
OPJ_INT32 vsc) OPJ_INT32 vsc)
{ {
OPJ_INT32 v, flag; OPJ_INT32 v, flag;
opj_raw_t *raw = t1->raw; /* RAW component */ opj_raw_t *raw = t1->raw; /* RAW component */
OPJ_ARG_NOT_USED(orient);
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
@ -423,7 +407,6 @@ static INLINE void opj_t1_dec_sigpass_step_mqc(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf) OPJ_INT32 oneplushalf)
{ {
OPJ_INT32 v, flag; OPJ_INT32 v, flag;
@ -432,7 +415,7 @@ static INLINE void opj_t1_dec_sigpass_step_mqc(
flag = *flagsp; flag = *flagsp;
if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(mqc, (OPJ_UINT32)flag));
if (opj_mqc_decode(mqc)) { if (opj_mqc_decode(mqc)) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
@ -447,7 +430,6 @@ static INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf, OPJ_INT32 oneplushalf,
OPJ_INT32 vsc) OPJ_INT32 vsc)
{ {
@ -457,7 +439,7 @@ static INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(mqc, (OPJ_UINT32)flag));
if (opj_mqc_decode(mqc)) { if (opj_mqc_decode(mqc)) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
@ -472,7 +454,6 @@ static INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
static void opj_t1_enc_sigpass(opj_t1_t *t1, static void opj_t1_enc_sigpass(opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_UINT32 orient,
OPJ_INT32 *nmsedec, OPJ_INT32 *nmsedec,
OPJ_BYTE type, OPJ_BYTE type,
OPJ_UINT32 cblksty OPJ_UINT32 cblksty
@ -491,7 +472,6 @@ static void opj_t1_enc_sigpass(opj_t1_t *t1,
t1, t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->data_stride) + i], &t1->data[(j * t1->data_stride) + i],
orient,
bpno, bpno,
one, one,
nmsedec, nmsedec,
@ -505,7 +485,6 @@ static void opj_t1_enc_sigpass(opj_t1_t *t1,
static void opj_t1_dec_sigpass_raw( static void opj_t1_dec_sigpass_raw(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 orient,
OPJ_INT32 cblksty) OPJ_INT32 cblksty)
{ {
OPJ_INT32 one, half, oneplushalf, vsc; OPJ_INT32 one, half, oneplushalf, vsc;
@ -521,7 +500,6 @@ static void opj_t1_dec_sigpass_raw(
t1, t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i], &t1->data[(j * t1->w) + i],
orient,
oneplushalf, oneplushalf,
vsc); vsc);
} }
@ -529,7 +507,7 @@ static void opj_t1_dec_sigpass_raw(
} }
} /* VSC and BYPASS by Antonin */ } /* VSC and BYPASS by Antonin */
#define opj_t1_dec_sigpass_mqc_internal(t1, bpno, orient, w, h, flags_stride) \ #define opj_t1_dec_sigpass_mqc_internal(t1, bpno, w, h, flags_stride) \
{ \ { \
OPJ_INT32 one, half, oneplushalf; \ OPJ_INT32 one, half, oneplushalf; \
OPJ_UINT32 i, j, k; \ OPJ_UINT32 i, j, k; \
@ -543,16 +521,16 @@ static void opj_t1_dec_sigpass_raw(
OPJ_INT32 *data2 = data1 + i; \ OPJ_INT32 *data2 = data1 + i; \
opj_flag_t *flags2 = flags1 + i; \ opj_flag_t *flags2 = flags1 + i; \
flags2 += flags_stride; \ flags2 += flags_stride; \
opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, oneplushalf); \
data2 += w; \ data2 += w; \
flags2 += flags_stride; \ flags2 += flags_stride; \
opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, oneplushalf); \
data2 += w; \ data2 += w; \
flags2 += flags_stride; \ flags2 += flags_stride; \
opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, oneplushalf); \
data2 += w; \ data2 += w; \
flags2 += flags_stride; \ flags2 += flags_stride; \
opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, oneplushalf); \
data2 += w; \ data2 += w; \
} \ } \
data1 += w << 2; \ data1 += w << 2; \
@ -563,7 +541,7 @@ static void opj_t1_dec_sigpass_raw(
opj_flag_t *flags2 = flags1 + i; \ opj_flag_t *flags2 = flags1 + i; \
for (j = k; j < h; ++j) { \ for (j = k; j < h; ++j) { \
flags2 += flags_stride; \ flags2 += flags_stride; \
opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, oneplushalf); \
data2 += w; \ data2 += w; \
} \ } \
} \ } \
@ -571,25 +549,22 @@ static void opj_t1_dec_sigpass_raw(
static void opj_t1_dec_sigpass_mqc_64x64( static void opj_t1_dec_sigpass_mqc_64x64(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno)
OPJ_INT32 orient)
{ {
opj_t1_dec_sigpass_mqc_internal(t1, bpno, orient, 64, 64, 66); opj_t1_dec_sigpass_mqc_internal(t1, bpno, 64, 64, 66);
} }
static void opj_t1_dec_sigpass_mqc_generic( static void opj_t1_dec_sigpass_mqc_generic(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno)
OPJ_INT32 orient)
{ {
opj_t1_dec_sigpass_mqc_internal(t1, bpno, orient, t1->w, t1->h, t1->flags_stride); opj_t1_dec_sigpass_mqc_internal(t1, bpno, t1->w, t1->h, t1->flags_stride);
} }
/* VSC and BYPASS by Antonin */ /* VSC and BYPASS by Antonin */
static void opj_t1_dec_sigpass_mqc_vsc( static void opj_t1_dec_sigpass_mqc_vsc(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno)
OPJ_INT32 orient)
{ {
OPJ_INT32 one, half, oneplushalf, vsc; OPJ_INT32 one, half, oneplushalf, vsc;
OPJ_UINT32 i, j, k; OPJ_UINT32 i, j, k;
@ -604,7 +579,6 @@ static void opj_t1_dec_sigpass_mqc_vsc(
t1, t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->w) + i], &t1->data[(j * t1->w) + i],
orient,
oneplushalf, oneplushalf,
vsc); vsc);
} }
@ -850,7 +824,6 @@ static void opj_t1_enc_clnpass_step(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_UINT32 orient,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 one, OPJ_INT32 one,
OPJ_INT32 *nmsedec, OPJ_INT32 *nmsedec,
@ -867,7 +840,7 @@ static void opj_t1_enc_clnpass_step(
goto LABEL_PARTIAL; goto LABEL_PARTIAL;
} }
if (!(*flagsp & (T1_SIG | T1_VISIT))) { if (!(*flagsp & (T1_SIG | T1_VISIT))) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(mqc, flag));
v = (opj_int_abs(*datap) & one) ? 1 : 0; v = (opj_int_abs(*datap) & one) ? 1 : 0;
opj_mqc_encode(mqc, (OPJ_UINT32)v); opj_mqc_encode(mqc, (OPJ_UINT32)v);
if (v) { if (v) {
@ -886,14 +859,11 @@ static void opj_t1_dec_clnpass_step_partial(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf) OPJ_INT32 oneplushalf)
{ {
OPJ_INT32 v, flag; OPJ_INT32 v, flag;
opj_mqc_t *mqc = t1->mqc; /* MQC component */ opj_mqc_t *mqc = t1->mqc; /* MQC component */
OPJ_ARG_NOT_USED(orient);
flag = *flagsp; flag = *flagsp;
opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
@ -906,7 +876,6 @@ static void opj_t1_dec_clnpass_step(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf) OPJ_INT32 oneplushalf)
{ {
OPJ_INT32 v, flag; OPJ_INT32 v, flag;
@ -915,7 +884,7 @@ static void opj_t1_dec_clnpass_step(
flag = *flagsp; flag = *flagsp;
if (!(flag & (T1_SIG | T1_VISIT))) { if (!(flag & (T1_SIG | T1_VISIT))) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(mqc, (OPJ_UINT32)flag));
if (opj_mqc_decode(mqc)) { if (opj_mqc_decode(mqc)) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
@ -930,7 +899,6 @@ static void opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf) OPJ_INT32 oneplushalf)
{ {
OPJ_INT32 v; OPJ_INT32 v;
@ -941,7 +909,7 @@ static void opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(
flag = *flagsp; flag = *flagsp;
/*if (!(flag & (T1_SIG | T1_VISIT)))*/ /*if (!(flag & (T1_SIG | T1_VISIT)))*/
{ {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(mqc, (OPJ_UINT32)flag));
if (opj_mqc_decode(mqc)) { if (opj_mqc_decode(mqc)) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag); v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
@ -956,7 +924,6 @@ static void opj_t1_dec_clnpass_step_vsc(
opj_t1_t *t1, opj_t1_t *t1,
opj_flag_t *flagsp, opj_flag_t *flagsp,
OPJ_INT32 *datap, OPJ_INT32 *datap,
OPJ_INT32 orient,
OPJ_INT32 oneplushalf, OPJ_INT32 oneplushalf,
OPJ_INT32 partial, OPJ_INT32 partial,
OPJ_INT32 vsc) OPJ_INT32 vsc)
@ -970,7 +937,7 @@ static void opj_t1_dec_clnpass_step_vsc(
goto LABEL_PARTIAL; goto LABEL_PARTIAL;
} }
if (!(flag & (T1_SIG | T1_VISIT))) { if (!(flag & (T1_SIG | T1_VISIT))) {
opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(mqc, (OPJ_UINT32)flag));
if (opj_mqc_decode(mqc)) { if (opj_mqc_decode(mqc)) {
LABEL_PARTIAL: LABEL_PARTIAL:
opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag)); opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
@ -985,7 +952,6 @@ LABEL_PARTIAL:
static void opj_t1_enc_clnpass( static void opj_t1_enc_clnpass(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_UINT32 orient,
OPJ_INT32 *nmsedec, OPJ_INT32 *nmsedec,
OPJ_UINT32 cblksty) OPJ_UINT32 cblksty)
{ {
@ -1037,7 +1003,6 @@ static void opj_t1_enc_clnpass(
t1, t1,
&t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->flags[((j+1) * t1->flags_stride) + i + 1],
&t1->data[(j * t1->data_stride) + i], &t1->data[(j * t1->data_stride) + i],
orient,
bpno, bpno,
one, one,
nmsedec, nmsedec,
@ -1050,7 +1015,7 @@ static void opj_t1_enc_clnpass(
#define MACRO_t1_flags_internal(x,y,flags_stride) t1->flags[((x)*(flags_stride))+(y)] #define MACRO_t1_flags_internal(x,y,flags_stride) t1->flags[((x)*(flags_stride))+(y)]
#define opj_t1_dec_clnpass_internal(t1, bpno, orient, cblksty, w, h, flags_stride) \ #define opj_t1_dec_clnpass_internal(t1, bpno, cblksty, w, h, flags_stride) \
{ \ { \
OPJ_INT32 one, half, oneplushalf, agg, runlen, vsc; \ OPJ_INT32 one, half, oneplushalf, agg, runlen, vsc; \
OPJ_UINT32 i, j, k; \ OPJ_UINT32 i, j, k; \
@ -1090,7 +1055,6 @@ static void opj_t1_enc_clnpass(
t1, \ t1, \
&t1->flags[((j+1) * flags_stride) + i + 1], \ &t1->flags[((j+1) * flags_stride) + i + 1], \
&t1->data[(j * w) + i], \ &t1->data[(j * w) + i], \
orient, \
oneplushalf, \ oneplushalf, \
agg && (j == k + (OPJ_UINT32)runlen), \ agg && (j == k + (OPJ_UINT32)runlen), \
vsc); \ vsc); \
@ -1121,9 +1085,9 @@ static void opj_t1_enc_clnpass(
for (j = (OPJ_UINT32)runlen; j < 4 && j < h; ++j) { \ for (j = (OPJ_UINT32)runlen; j < 4 && j < h; ++j) { \
flags2 += flags_stride; \ flags2 += flags_stride; \
if (agg && (j == (OPJ_UINT32)runlen)) { \ if (agg && (j == (OPJ_UINT32)runlen)) { \
opj_t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_clnpass_step_partial(t1, flags2, data2, oneplushalf); \
} else { \ } else { \
opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_clnpass_step(t1, flags2, data2, oneplushalf); \
} \ } \
data2 += w; \ data2 += w; \
} \ } \
@ -1132,25 +1096,25 @@ static void opj_t1_enc_clnpass(
flags2 += flags_stride; \ flags2 += flags_stride; \
flag = *flags2; \ flag = *flags2; \
if (!(flag & (T1_SIG | T1_VISIT))) \ if (!(flag & (T1_SIG | T1_VISIT))) \
opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, oneplushalf); \
*flags2 &= ~T1_VISIT; \ *flags2 &= ~T1_VISIT; \
data2 += w; \ data2 += w; \
flags2 += flags_stride; \ flags2 += flags_stride; \
flag = *flags2; \ flag = *flags2; \
if (!(flag & (T1_SIG | T1_VISIT))) \ if (!(flag & (T1_SIG | T1_VISIT))) \
opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, oneplushalf); \
*flags2 &= ~T1_VISIT; \ *flags2 &= ~T1_VISIT; \
data2 += w; \ data2 += w; \
flags2 += flags_stride; \ flags2 += flags_stride; \
flag = *flags2; \ flag = *flags2; \
if (!(flag & (T1_SIG | T1_VISIT))) \ if (!(flag & (T1_SIG | T1_VISIT))) \
opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, oneplushalf); \
*flags2 &= ~T1_VISIT; \ *flags2 &= ~T1_VISIT; \
data2 += w; \ data2 += w; \
flags2 += flags_stride; \ flags2 += flags_stride; \
flag = *flags2; \ flag = *flags2; \
if (!(flag & (T1_SIG | T1_VISIT))) \ if (!(flag & (T1_SIG | T1_VISIT))) \
opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, oneplushalf); \
*flags2 &= ~T1_VISIT; \ *flags2 &= ~T1_VISIT; \
data2 += w; \ data2 += w; \
} \ } \
@ -1163,7 +1127,7 @@ static void opj_t1_enc_clnpass(
opj_flag_t *flags2 = flags1 + i; \ opj_flag_t *flags2 = flags1 + i; \
for (j = k; j < h; ++j) { \ for (j = k; j < h; ++j) { \
flags2 += flags_stride; \ flags2 += flags_stride; \
opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); \ opj_t1_dec_clnpass_step(t1, flags2, data2, oneplushalf); \
data2 += w; \ data2 += w; \
} \ } \
} \ } \
@ -1187,19 +1151,17 @@ static void opj_t1_enc_clnpass(
static void opj_t1_dec_clnpass_64x64( static void opj_t1_dec_clnpass_64x64(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 orient,
OPJ_INT32 cblksty) OPJ_INT32 cblksty)
{ {
opj_t1_dec_clnpass_internal(t1, bpno, orient, cblksty, 64, 64, 66); opj_t1_dec_clnpass_internal(t1, bpno, cblksty, 64, 64, 66);
} }
static void opj_t1_dec_clnpass_generic( static void opj_t1_dec_clnpass_generic(
opj_t1_t *t1, opj_t1_t *t1,
OPJ_INT32 bpno, OPJ_INT32 bpno,
OPJ_INT32 orient,
OPJ_INT32 cblksty) OPJ_INT32 cblksty)
{ {
opj_t1_dec_clnpass_internal(t1, bpno, orient, cblksty, t1->w, t1->h, t1->flags_stride); opj_t1_dec_clnpass_internal(t1, bpno, cblksty, t1->w, t1->h, t1->flags_stride);
} }
@ -1444,6 +1406,8 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
opj_raw_t *raw = t1->raw; /* RAW component */ opj_raw_t *raw = t1->raw; /* RAW component */
opj_mqc_t *mqc = t1->mqc; /* MQC component */ opj_mqc_t *mqc = t1->mqc; /* MQC component */
mqc->lut_ctxno_zc_orient = lut_ctxno_zc + orient * 256;
OPJ_INT32 bpno_plus_one; OPJ_INT32 bpno_plus_one;
OPJ_UINT32 passtype; OPJ_UINT32 passtype;
OPJ_UINT32 segno, passno; OPJ_UINT32 segno, passno;
@ -1488,12 +1452,12 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
switch (passtype) { switch (passtype) {
case 0: case 0:
if (type == T1_TYPE_RAW) { if (type == T1_TYPE_RAW) {
opj_t1_dec_sigpass_raw(t1, bpno_plus_one, (OPJ_INT32)orient, (OPJ_INT32)cblksty); opj_t1_dec_sigpass_raw(t1, bpno_plus_one, (OPJ_INT32)cblksty);
} else { } else {
if (cblksty & J2K_CCP_CBLKSTY_VSC) { if (cblksty & J2K_CCP_CBLKSTY_VSC) {
opj_t1_dec_sigpass_mqc_vsc(t1, bpno_plus_one, (OPJ_INT32)orient); opj_t1_dec_sigpass_mqc_vsc(t1, bpno_plus_one);
} else { } else {
opj_t1_dec_sigpass_mqc_64x64(t1, bpno_plus_one, (OPJ_INT32)orient); opj_t1_dec_sigpass_mqc_64x64(t1, bpno_plus_one);
} }
} }
break; break;
@ -1509,7 +1473,7 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
} }
break; break;
case 2: case 2:
opj_t1_dec_clnpass_64x64(t1, bpno_plus_one, (OPJ_INT32)orient, (OPJ_INT32)cblksty); opj_t1_dec_clnpass_64x64(t1, bpno_plus_one, (OPJ_INT32)cblksty);
break; break;
} }
@ -1531,12 +1495,12 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
switch (passtype) { switch (passtype) {
case 0: case 0:
if (type == T1_TYPE_RAW) { if (type == T1_TYPE_RAW) {
opj_t1_dec_sigpass_raw(t1, bpno_plus_one, (OPJ_INT32)orient, (OPJ_INT32)cblksty); opj_t1_dec_sigpass_raw(t1, bpno_plus_one, (OPJ_INT32)cblksty);
} else { } else {
if (cblksty & J2K_CCP_CBLKSTY_VSC) { if (cblksty & J2K_CCP_CBLKSTY_VSC) {
opj_t1_dec_sigpass_mqc_vsc(t1, bpno_plus_one, (OPJ_INT32)orient); opj_t1_dec_sigpass_mqc_vsc(t1, bpno_plus_one);
} else { } else {
opj_t1_dec_sigpass_mqc_generic(t1, bpno_plus_one, (OPJ_INT32)orient); opj_t1_dec_sigpass_mqc_generic(t1, bpno_plus_one);
} }
} }
break; break;
@ -1552,7 +1516,7 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
} }
break; break;
case 2: case 2:
opj_t1_dec_clnpass_generic(t1, bpno_plus_one, (OPJ_INT32)orient, (OPJ_INT32)cblksty); opj_t1_dec_clnpass_generic(t1, bpno_plus_one, (OPJ_INT32)cblksty);
break; break;
} }
@ -1695,6 +1659,7 @@ static void opj_t1_encode_cblk(opj_t1_t *t1,
OPJ_FLOAT64 cumwmsedec = 0.0; OPJ_FLOAT64 cumwmsedec = 0.0;
opj_mqc_t *mqc = t1->mqc; /* MQC component */ opj_mqc_t *mqc = t1->mqc; /* MQC component */
mqc->lut_ctxno_zc_orient = lut_ctxno_zc + orient * 256;
OPJ_UINT32 passno; OPJ_UINT32 passno;
OPJ_INT32 bpno; OPJ_INT32 bpno;
@ -1731,13 +1696,13 @@ static void opj_t1_encode_cblk(opj_t1_t *t1,
switch (passtype) { switch (passtype) {
case 0: case 0:
opj_t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty); opj_t1_enc_sigpass(t1, bpno, &nmsedec, type, cblksty);
break; break;
case 1: case 1:
opj_t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty); opj_t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
break; break;
case 2: case 2:
opj_t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty); opj_t1_enc_clnpass(t1, bpno, &nmsedec, cblksty);
/* code switch SEGMARK (i.e. SEGSYM) */ /* code switch SEGMARK (i.e. SEGSYM) */
if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
opj_mqc_segmark_enc(mqc); opj_mqc_segmark_enc(mqc);