diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2016-05-21 15:52:02 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2016-05-21 15:52:02 +0200 |
| commit | d8fef96f23ea8b12226d7326118f2ffd91da28ac (patch) | |
| tree | da3d31df8d2b3527beccc9f551ee120134b1d0dc /src/lib | |
| parent | c539808d097945866c0f7120ccdea28921a011a2 (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.c | 47 |
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; } } |
