summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2016-05-21 15:52:02 +0200
committerEven Rouault <even.rouault@spatialys.com>2016-05-21 15:52:02 +0200
commitd8fef96f23ea8b12226d7326118f2ffd91da28ac (patch)
treeda3d31df8d2b3527beccc9f551ee120134b1d0dc /src/lib
parentc539808d097945866c0f7120ccdea28921a011a2 (diff)
Improve code generation in opj_t1_dec_clnpass()
Add a opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit() method that does the job of opj_t1_dec_clnpass_step_only() assuming the conditions are met. And use it in opj_t1_dec_clnpass(). The compiler generates more efficient code.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/openjp2/t1.c47
1 files changed, 43 insertions, 4 deletions
diff --git a/src/lib/openjp2/t1.c b/src/lib/openjp2/t1.c
index 37fc4fc1..124d68ea 100644
--- a/src/lib/openjp2/t1.c
+++ b/src/lib/openjp2/t1.c
@@ -906,6 +906,32 @@ static void opj_t1_dec_clnpass_step(
*flagsp &= ~T1_VISIT;
} /* VSC and BYPASS by Antonin */
+static void opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf)
+{
+ OPJ_INT32 v;
+ OPJ_INT32 flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = *flagsp;
+ /*if (!(flag & (T1_SIG | T1_VISIT)))*/
+ {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+ if (opj_mqc_decode(mqc)) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+ v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, v, t1->flags_stride);
+ }
+ }
+ /*flagsp &= ~T1_VISIT;*/
+}
+
static void opj_t1_dec_clnpass_step_vsc(
opj_t1_t *t1,
opj_flag_t *flagsp,
@@ -1084,17 +1110,30 @@ static void opj_t1_dec_clnpass(
data2 += t1->w;
}
} else {
+ opj_flag_t flag;
flags2 += t1->flags_stride;
- opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ flag = *flags2;
+ if (!(flag & (T1_SIG | T1_VISIT)))
+ opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, orient, oneplushalf);
+ *flags2 &= ~T1_VISIT;
data2 += t1->w;
flags2 += t1->flags_stride;
- opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ flag = *flags2;
+ if (!(flag & (T1_SIG | T1_VISIT)))
+ opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, orient, oneplushalf);
+ *flags2 &= ~T1_VISIT;
data2 += t1->w;
flags2 += t1->flags_stride;
- opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ flag = *flags2;
+ if (!(flag & (T1_SIG | T1_VISIT)))
+ opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, orient, oneplushalf);
+ *flags2 &= ~T1_VISIT;
data2 += t1->w;
flags2 += t1->flags_stride;
- opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ flag = *flags2;
+ if (!(flag & (T1_SIG | T1_VISIT)))
+ opj_t1_dec_clnpass_step_only_if_flag_not_sig_visit(t1, flags2, data2, orient, oneplushalf);
+ *flags2 &= ~T1_VISIT;
data2 += t1->w;
}
}