2 * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
3 * Copyright (c) 2002-2007, Professor Benoit Macq
4 * Copyright (c) 2001-2003, David Janssens
5 * Copyright (c) 2002-2003, Yannick Verschueren
6 * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7 * Copyright (c) 2005, Herve Drolon, FreeImage Team
8 * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
33 #include "opj_includes.h"
36 /** @defgroup T1 T1 - Implementation of the tier-1 coding */
39 /** @name Local static functions */
42 static INLINE char t1_getctxno_zc(int f, int orient);
43 static char t1_getctxno_sc(int f);
44 static INLINE int t1_getctxno_mag(int f);
45 static char t1_getspb(int f);
46 static short t1_getnmsedec_sig(int x, int bitpos);
47 static short t1_getnmsedec_ref(int x, int bitpos);
48 static void t1_updateflags(flag_t *flagsp, int s, int stride);
50 Encode significant pass
52 static void t1_enc_sigpass_step(
64 Decode significant pass
66 static void t1_dec_sigpass_step(
71 OPJ_INT32 oneplushalf,
75 Decode significant pass
77 static INLINE void t1_dec_sigpass_step_raw(
84 static INLINE void t1_dec_sigpass_step_mqc(
90 static INLINE void t1_dec_sigpass_step_mqc_vsc(
98 Encode significant pass
100 static void t1_enc_sigpass(
109 Decode significant pass
111 static void t1_dec_sigpass(
119 Decode significant pass
121 static void t1_dec_sigpass_raw(
126 static void t1_dec_sigpass_mqc(
130 static void t1_dec_sigpass_mqc_vsc(
135 Encode refinement pass
137 static void t1_enc_refpass_step(
147 Decode refinement pass
149 static void INLINE t1_dec_refpass_step_raw(
156 static void INLINE t1_dec_refpass_step_mqc(
162 static void INLINE t1_dec_refpass_step_mqc_vsc(
171 Encode refinement pass
173 static void t1_enc_refpass(
181 Decode refinement pass
183 static void t1_dec_refpass(
190 Decode refinement pass
192 static void t1_dec_refpass_step(
202 Decode refinement pass
204 static void t1_dec_refpass_raw(
208 static void t1_dec_refpass_mqc(
211 static void t1_dec_refpass_mqc_vsc(
217 static void t1_enc_clnpass_step(
230 static void t1_dec_clnpass_step_partial(
236 static void t1_dec_clnpass_step(
242 static void t1_dec_clnpass_step_vsc(
253 static void t1_enc_clnpass(
262 static void t1_dec_clnpass(
267 static double t1_getwmsedec(
280 @param cblk Code-block coding parameters
282 @param compno Component number
286 @param cblksty Code-block style
291 static void t1_encode_cblk(
293 opj_tcd_cblk_enc_t* cblk,
302 opj_tcd_tile_t * tile);
306 @param cblk Code-block coding parameters
308 @param roishift Region of interest shifting value
309 @param cblksty Code-block style
311 static void t1_decode_cblk(
313 opj_tcd_cblk_dec_t* cblk,
321 @param cblk Code-block coding parameters
323 @param roishift Region of interest shifting value
324 @param cblksty Code-block style
326 static void t1_decode_cblk_v2(
328 opj_tcd_cblk_dec_v2_t* cblk,
337 /* ----------------------------------------------------------------------- */
339 static char t1_getctxno_zc(int f, int orient) {
340 return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
343 static char t1_getctxno_sc(int f) {
344 return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
347 static int t1_getctxno_mag(int f) {
348 int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
349 int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
353 static char t1_getspb(int f) {
354 return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
357 static short t1_getnmsedec_sig(int x, int bitpos) {
358 if (bitpos > T1_NMSEDEC_FRACBITS) {
359 return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
362 return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
365 static short t1_getnmsedec_ref(int x, int bitpos) {
366 if (bitpos > T1_NMSEDEC_FRACBITS) {
367 return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
370 return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
373 static void t1_updateflags(flag_t *flagsp, int s, int stride) {
374 flag_t *np = flagsp - stride;
375 flag_t *sp = flagsp + stride;
377 static const flag_t mod[] = {
378 T1_SIG_S, T1_SIG_S|T1_SGN_S,
379 T1_SIG_E, T1_SIG_E|T1_SGN_E,
380 T1_SIG_W, T1_SIG_W|T1_SGN_W,
381 T1_SIG_N, T1_SIG_N|T1_SGN_N
388 flagsp[-1] |= mod[s+2];
390 flagsp[1] |= mod[s+4];
397 static void t1_enc_sigpass_step(
410 opj_mqc_t *mqc = t1->mqc; /* MQC component */
412 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
413 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
414 v = int_abs(*datap) & one ? 1 : 0;
415 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */
416 if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
417 mqc_bypass_enc(mqc, v);
422 v = *datap < 0 ? 1 : 0;
423 *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
424 mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */
425 if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
426 mqc_bypass_enc(mqc, v);
428 mqc_encode(mqc, v ^ t1_getspb(flag));
430 t1_updateflags(flagsp, v, t1->flags_stride);
436 static INLINE void t1_dec_sigpass_step_raw(
445 opj_raw_t *raw = t1->raw; /* RAW component */
447 OPJ_ARG_NOT_USED(orient);
449 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
450 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
451 if (raw_decode(raw)) {
452 v = raw_decode(raw); /* ESSAI */
453 *datap = v ? -oneplushalf : oneplushalf;
454 t1_updateflags(flagsp, v, t1->flags_stride);
458 } /* VSC and BYPASS by Antonin */
460 static INLINE void t1_dec_sigpass_step_mqc(
469 opj_mqc_t *mqc = t1->mqc; /* MQC component */
472 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
473 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
474 if (mqc_decode(mqc)) {
475 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
476 v = mqc_decode(mqc) ^ t1_getspb(flag);
477 *datap = v ? -oneplushalf : oneplushalf;
478 t1_updateflags(flagsp, v, t1->flags_stride);
482 } /* VSC and BYPASS by Antonin */
484 static INLINE void t1_dec_sigpass_step_mqc_vsc(
494 opj_mqc_t *mqc = t1->mqc; /* MQC component */
496 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
497 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
498 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
499 if (mqc_decode(mqc)) {
500 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
501 v = mqc_decode(mqc) ^ t1_getspb(flag);
502 *datap = v ? -oneplushalf : oneplushalf;
503 t1_updateflags(flagsp, v, t1->flags_stride);
507 } /* VSC and BYPASS by Antonin */
509 static void t1_enc_sigpass(
517 int i, j, k, one, vsc;
519 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
520 for (k = 0; k < t1->h; k += 4) {
521 for (i = 0; i < t1->w; ++i) {
522 for (j = k; j < k + 4 && j < t1->h; ++j) {
523 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
526 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
527 &t1->data[(j * t1->w) + i],
539 static void t1_dec_sigpass_raw(
545 int i, j, k, one, half, oneplushalf, vsc;
548 oneplushalf = one | half;
549 for (k = 0; k < t1->h; k += 4) {
550 for (i = 0; i < t1->w; ++i) {
551 for (j = k; j < k + 4 && j < t1->h; ++j) {
552 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
553 t1_dec_sigpass_step_raw(
555 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
556 &t1->data[(j * t1->w) + i],
563 } /* VSC and BYPASS by Antonin */
565 static void t1_dec_sigpass_mqc(
570 int i, j, k, one, half, oneplushalf;
571 int *data1 = t1->data;
572 flag_t *flags1 = &t1->flags[1];
575 oneplushalf = one | half;
576 for (k = 0; k < (t1->h & ~3); k += 4) {
577 for (i = 0; i < t1->w; ++i) {
578 int *data2 = data1 + i;
579 flag_t *flags2 = flags1 + i;
580 flags2 += t1->flags_stride;
581 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
583 flags2 += t1->flags_stride;
584 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
586 flags2 += t1->flags_stride;
587 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
589 flags2 += t1->flags_stride;
590 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
594 flags1 += t1->flags_stride << 2;
596 for (i = 0; i < t1->w; ++i) {
597 int *data2 = data1 + i;
598 flag_t *flags2 = flags1 + i;
599 for (j = k; j < t1->h; ++j) {
600 flags2 += t1->flags_stride;
601 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
605 } /* VSC and BYPASS by Antonin */
607 static void t1_dec_sigpass_mqc_vsc(
612 int i, j, k, one, half, oneplushalf, vsc;
615 oneplushalf = one | half;
616 for (k = 0; k < t1->h; k += 4) {
617 for (i = 0; i < t1->w; ++i) {
618 for (j = k; j < k + 4 && j < t1->h; ++j) {
619 vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
620 t1_dec_sigpass_step_mqc_vsc(
622 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
623 &t1->data[(j * t1->w) + i],
630 } /* VSC and BYPASS by Antonin */
632 static void t1_enc_refpass_step(
644 opj_mqc_t *mqc = t1->mqc; /* MQC component */
646 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
647 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
648 *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
649 v = int_abs(*datap) & one ? 1 : 0;
650 mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
651 if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
652 mqc_bypass_enc(mqc, v);
656 *flagsp |= T1_REFINE;
660 static INLINE void t1_dec_refpass_step_raw(
670 opj_raw_t *raw = t1->raw; /* RAW component */
672 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
673 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
675 t = v ? poshalf : neghalf;
676 *datap += *datap < 0 ? -t : t;
677 *flagsp |= T1_REFINE;
679 } /* VSC and BYPASS by Antonin */
681 static INLINE void t1_dec_refpass_step_mqc(
690 opj_mqc_t *mqc = t1->mqc; /* MQC component */
693 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
694 mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
696 t = v ? poshalf : neghalf;
697 *datap += *datap < 0 ? -t : t;
698 *flagsp |= T1_REFINE;
700 } /* VSC and BYPASS by Antonin */
702 static INLINE void t1_dec_refpass_step_mqc_vsc(
712 opj_mqc_t *mqc = t1->mqc; /* MQC component */
714 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
715 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
716 mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
718 t = v ? poshalf : neghalf;
719 *datap += *datap < 0 ? -t : t;
720 *flagsp |= T1_REFINE;
722 } /* VSC and BYPASS by Antonin */
724 static void t1_enc_refpass(
731 int i, j, k, one, vsc;
733 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
734 for (k = 0; k < t1->h; k += 4) {
735 for (i = 0; i < t1->w; ++i) {
736 for (j = k; j < k + 4 && j < t1->h; ++j) {
737 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
740 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
741 &t1->data[(j * t1->w) + i],
752 static void t1_dec_refpass_raw(
757 int i, j, k, one, poshalf, neghalf;
761 neghalf = bpno > 0 ? -poshalf : -1;
762 for (k = 0; k < t1->h; k += 4) {
763 for (i = 0; i < t1->w; ++i) {
764 for (j = k; j < k + 4 && j < t1->h; ++j) {
765 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
766 t1_dec_refpass_step_raw(
768 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
769 &t1->data[(j * t1->w) + i],
776 } /* VSC and BYPASS by Antonin */
778 static void t1_dec_refpass_mqc(
782 int i, j, k, one, poshalf, neghalf;
783 int *data1 = t1->data;
784 flag_t *flags1 = &t1->flags[1];
787 neghalf = bpno > 0 ? -poshalf : -1;
788 for (k = 0; k < (t1->h & ~3); k += 4) {
789 for (i = 0; i < t1->w; ++i) {
790 int *data2 = data1 + i;
791 flag_t *flags2 = flags1 + i;
792 flags2 += t1->flags_stride;
793 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
795 flags2 += t1->flags_stride;
796 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
798 flags2 += t1->flags_stride;
799 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
801 flags2 += t1->flags_stride;
802 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
806 flags1 += t1->flags_stride << 2;
808 for (i = 0; i < t1->w; ++i) {
809 int *data2 = data1 + i;
810 flag_t *flags2 = flags1 + i;
811 for (j = k; j < t1->h; ++j) {
812 flags2 += t1->flags_stride;
813 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
817 } /* VSC and BYPASS by Antonin */
819 static void t1_dec_refpass_mqc_vsc(
823 int i, j, k, one, poshalf, neghalf;
827 neghalf = bpno > 0 ? -poshalf : -1;
828 for (k = 0; k < t1->h; k += 4) {
829 for (i = 0; i < t1->w; ++i) {
830 for (j = k; j < k + 4 && j < t1->h; ++j) {
831 vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
832 t1_dec_refpass_step_mqc_vsc(
834 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
835 &t1->data[(j * t1->w) + i],
842 } /* VSC and BYPASS by Antonin */
844 static void t1_enc_clnpass_step(
857 opj_mqc_t *mqc = t1->mqc; /* MQC component */
859 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
863 if (!(*flagsp & (T1_SIG | T1_VISIT))) {
864 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
865 v = int_abs(*datap) & one ? 1 : 0;
869 *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
870 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
871 v = *datap < 0 ? 1 : 0;
872 mqc_encode(mqc, v ^ t1_getspb(flag));
873 t1_updateflags(flagsp, v, t1->flags_stride);
876 *flagsp &= ~T1_VISIT;
879 static void t1_dec_clnpass_step_partial(
887 opj_mqc_t *mqc = t1->mqc; /* MQC component */
889 OPJ_ARG_NOT_USED(orient);
892 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
893 v = mqc_decode(mqc) ^ t1_getspb(flag);
894 *datap = v ? -oneplushalf : oneplushalf;
895 t1_updateflags(flagsp, v, t1->flags_stride);
896 *flagsp &= ~T1_VISIT;
897 } /* VSC and BYPASS by Antonin */
899 static void t1_dec_clnpass_step(
908 opj_mqc_t *mqc = t1->mqc; /* MQC component */
911 if (!(flag & (T1_SIG | T1_VISIT))) {
912 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
913 if (mqc_decode(mqc)) {
914 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
915 v = mqc_decode(mqc) ^ t1_getspb(flag);
916 *datap = v ? -oneplushalf : oneplushalf;
917 t1_updateflags(flagsp, v, t1->flags_stride);
920 *flagsp &= ~T1_VISIT;
921 } /* VSC and BYPASS by Antonin */
923 static void t1_dec_clnpass_step_vsc(
934 opj_mqc_t *mqc = t1->mqc; /* MQC component */
936 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
940 if (!(flag & (T1_SIG | T1_VISIT))) {
941 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
942 if (mqc_decode(mqc)) {
944 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
945 v = mqc_decode(mqc) ^ t1_getspb(flag);
946 *datap = v ? -oneplushalf : oneplushalf;
947 t1_updateflags(flagsp, v, t1->flags_stride);
950 *flagsp &= ~T1_VISIT;
953 static void t1_enc_clnpass(
960 int i, j, k, one, agg, runlen, vsc;
962 opj_mqc_t *mqc = t1->mqc; /* MQC component */
965 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
966 for (k = 0; k < t1->h; k += 4) {
967 for (i = 0; i < t1->w; ++i) {
969 if (cblksty & J2K_CCP_CBLKSTY_VSC) {
970 agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
971 || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
972 || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
973 || (MACRO_t1_flags(1 + k + 3,1 + i)
974 & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
976 agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
977 || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
978 || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
979 || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
985 for (runlen = 0; runlen < 4; ++runlen) {
986 if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one)
989 mqc_setcurctx(mqc, T1_CTXNO_AGG);
990 mqc_encode(mqc, runlen != 4);
994 mqc_setcurctx(mqc, T1_CTXNO_UNI);
995 mqc_encode(mqc, runlen >> 1);
996 mqc_encode(mqc, runlen & 1);
1000 for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
1001 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
1002 t1_enc_clnpass_step(
1004 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
1005 &t1->data[(j * t1->w) + i],
1010 agg && (j == k + runlen),
1017 static void t1_dec_clnpass(
1023 int i, j, k, one, half, oneplushalf, agg, runlen, vsc;
1024 int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
1026 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1030 oneplushalf = one | half;
1031 if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1032 for (k = 0; k < t1->h; k += 4) {
1033 for (i = 0; i < t1->w; ++i) {
1034 if (k + 3 < t1->h) {
1035 agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1036 || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1037 || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1038 || (MACRO_t1_flags(1 + k + 3,1 + i)
1039 & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
1044 mqc_setcurctx(mqc, T1_CTXNO_AGG);
1045 if (!mqc_decode(mqc)) {
1048 mqc_setcurctx(mqc, T1_CTXNO_UNI);
1049 runlen = mqc_decode(mqc);
1050 runlen = (runlen << 1) | mqc_decode(mqc);
1054 for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
1055 vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
1056 t1_dec_clnpass_step_vsc(
1058 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
1059 &t1->data[(j * t1->w) + i],
1062 agg && (j == k + runlen),
1068 int *data1 = t1->data;
1069 flag_t *flags1 = &t1->flags[1];
1070 for (k = 0; k < (t1->h & ~3); k += 4) {
1071 for (i = 0; i < t1->w; ++i) {
1072 int *data2 = data1 + i;
1073 flag_t *flags2 = flags1 + i;
1074 agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1075 || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1076 || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1077 || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
1079 mqc_setcurctx(mqc, T1_CTXNO_AGG);
1080 if (!mqc_decode(mqc)) {
1083 mqc_setcurctx(mqc, T1_CTXNO_UNI);
1084 runlen = mqc_decode(mqc);
1085 runlen = (runlen << 1) | mqc_decode(mqc);
1086 flags2 += runlen * t1->flags_stride;
1087 data2 += runlen * t1->w;
1088 for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
1089 flags2 += t1->flags_stride;
1090 if (agg && (j == k + runlen)) {
1091 t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
1093 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1098 flags2 += t1->flags_stride;
1099 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1101 flags2 += t1->flags_stride;
1102 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1104 flags2 += t1->flags_stride;
1105 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1107 flags2 += t1->flags_stride;
1108 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1112 data1 += t1->w << 2;
1113 flags1 += t1->flags_stride << 2;
1115 for (i = 0; i < t1->w; ++i) {
1116 int *data2 = data1 + i;
1117 flag_t *flags2 = flags1 + i;
1118 for (j = k; j < t1->h; ++j) {
1119 flags2 += t1->flags_stride;
1120 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1128 mqc_setcurctx(mqc, T1_CTXNO_UNI);
1129 v = mqc_decode(mqc);
1130 v = (v << 1) | mqc_decode(mqc);
1131 v = (v << 1) | mqc_decode(mqc);
1132 v = (v << 1) | mqc_decode(mqc);
1135 opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
1139 } /* VSC and BYPASS by Antonin */
1142 /** mod fixed_quality */
1143 static double t1_getwmsedec(
1154 double w1, w2, wmsedec;
1156 w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0;
1157 w2 = dwt_getnorm(level, orient);
1158 } else { /* if (qmfbid == 0) */
1159 w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0;
1160 w2 = dwt_getnorm_real(level, orient);
1162 wmsedec = w1 * w2 * stepsize * (1 << bpno);
1163 wmsedec *= wmsedec * nmsedec / 8192.0;
1168 static opj_bool allocate_buffers(
1176 if(datasize > t1->datasize){
1177 opj_aligned_free(t1->data);
1178 t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int));
1182 t1->datasize=datasize;
1184 memset(t1->data,0,datasize * sizeof(int));
1186 t1->flags_stride=w+2;
1187 flagssize=t1->flags_stride * (h+2);
1189 if(flagssize > t1->flagssize){
1190 opj_aligned_free(t1->flags);
1191 t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t));
1195 t1->flagssize=flagssize;
1197 memset(t1->flags,0,flagssize * sizeof(flag_t));
1205 /** mod fixed_quality */
1206 static void t1_encode_cblk(
1208 opj_tcd_cblk_enc_t* cblk,
1217 opj_tcd_tile_t * tile)
1219 double cumwmsedec = 0.0;
1221 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1223 int passno, bpno, passtype;
1226 char type = T1_TYPE_MQ;
1230 for (i = 0; i < t1->w * t1->h; ++i) {
1231 int tmp = abs(t1->data[i]);
1232 max = int_max(max, tmp);
1235 cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
1237 bpno = cblk->numbps - 1;
1240 mqc_resetstates(mqc);
1241 mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1242 mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1243 mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1244 mqc_init_enc(mqc, cblk->data);
1246 for (passno = 0; bpno >= 0; ++passno) {
1247 opj_tcd_pass_t *pass = &cblk->passes[passno];
1249 type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1253 t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
1256 t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
1259 t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
1260 /* code switch SEGMARK (i.e. SEGSYM) */
1261 if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
1262 mqc_segmark_enc(mqc);
1267 tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps, mct);
1268 cumwmsedec += tempwmsedec;
1269 tile->distotile += tempwmsedec;
1271 /* Code switch "RESTART" (i.e. TERMALL) */
1272 if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) {
1273 if (type == T1_TYPE_RAW) {
1276 /* correction = mqc_bypass_flush_enc(); */
1277 } else { /* correction = mqc_restart_enc(); */
1283 if (((bpno < (cblk->numbps - 4) && (passtype > 0))
1284 || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
1285 if (type == T1_TYPE_RAW) {
1288 /* correction = mqc_bypass_flush_enc(); */
1289 } else { /* correction = mqc_restart_enc(); */
1299 if (++passtype == 3) {
1304 if (pass->term && bpno > 0) {
1305 type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1306 if (type == T1_TYPE_RAW)
1307 mqc_bypass_init_enc(mqc);
1309 mqc_restart_init_enc(mqc);
1312 pass->distortiondec = cumwmsedec;
1313 pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */
1315 /* Code-switch "RESET" */
1316 if (cblksty & J2K_CCP_CBLKSTY_RESET)
1320 /* Code switch "ERTERM" (i.e. PTERM) */
1321 if (cblksty & J2K_CCP_CBLKSTY_PTERM)
1322 mqc_erterm_enc(mqc);
1323 else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
1326 cblk->totalpasses = passno;
1328 for (passno = 0; passno<cblk->totalpasses; passno++) {
1329 opj_tcd_pass_t *pass = &cblk->passes[passno];
1330 if (pass->rate > mqc_numbytes(mqc))
1331 pass->rate = mqc_numbytes(mqc);
1332 /*Preventing generation of FF as last data byte of a pass*/
1333 if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){
1336 pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
1340 static void t1_decode_cblk(
1342 opj_tcd_cblk_dec_t* cblk,
1347 opj_raw_t *raw = t1->raw; /* RAW component */
1348 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1352 char type = T1_TYPE_MQ; /* BYPASS mode */
1354 if(!allocate_buffers(
1356 cblk->x1 - cblk->x0,
1357 cblk->y1 - cblk->y0))
1362 bpno = roishift + cblk->numbps - 1;
1365 mqc_resetstates(mqc);
1366 mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1367 mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1368 mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1370 for (segno = 0; segno < cblk->numsegs; ++segno) {
1371 opj_tcd_seg_t *seg = &cblk->segs[segno];
1374 type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1375 /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
1376 if(seg->data == NULL){
1379 if (type == T1_TYPE_RAW) {
1380 raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
1382 mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len);
1385 for (passno = 0; passno < seg->numpasses; ++passno) {
1388 if (type == T1_TYPE_RAW) {
1389 t1_dec_sigpass_raw(t1, bpno+1, orient, cblksty);
1391 if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1392 t1_dec_sigpass_mqc_vsc(t1, bpno+1, orient);
1394 t1_dec_sigpass_mqc(t1, bpno+1, orient);
1399 if (type == T1_TYPE_RAW) {
1400 t1_dec_refpass_raw(t1, bpno+1, cblksty);
1402 if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1403 t1_dec_refpass_mqc_vsc(t1, bpno+1);
1405 t1_dec_refpass_mqc(t1, bpno+1);
1410 t1_dec_clnpass(t1, bpno+1, orient, cblksty);
1414 if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
1415 mqc_resetstates(mqc);
1416 mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1417 mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1418 mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1420 if (++passtype == 3) {
1428 /* ----------------------------------------------------------------------- */
1430 opj_t1_t* t1_create(opj_common_ptr cinfo) {
1431 opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));
1436 /* create MQC and RAW handles */
1437 t1->mqc = mqc_create();
1438 t1->raw = raw_create();
1448 void t1_destroy(opj_t1_t *t1) {
1450 /* destroy MQC and RAW handles */
1451 mqc_destroy(t1->mqc);
1452 raw_destroy(t1->raw);
1453 opj_aligned_free(t1->data);
1454 opj_aligned_free(t1->flags);
1459 void t1_encode_cblks(
1461 opj_tcd_tile_t *tile,
1464 int compno, resno, bandno, precno, cblkno;
1466 tile->distotile = 0; /* fixed_quality */
1468 for (compno = 0; compno < tile->numcomps; ++compno) {
1469 opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
1470 opj_tccp_t* tccp = &tcp->tccps[compno];
1471 int tile_w = tilec->x1 - tilec->x0;
1473 for (resno = 0; resno < tilec->numresolutions; ++resno) {
1474 opj_tcd_resolution_t *res = &tilec->resolutions[resno];
1476 for (bandno = 0; bandno < res->numbands; ++bandno) {
1477 opj_tcd_band_t* restrict band = &res->bands[bandno];
1478 int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192));
1480 for (precno = 0; precno < res->pw * res->ph; ++precno) {
1481 opj_tcd_precinct_t *prc = &band->precincts[precno];
1483 for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
1484 opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
1485 int* restrict datap;
1486 int* restrict tiledp;
1491 int x = cblk->x0 - band->x0;
1492 int y = cblk->y0 - band->y0;
1493 if (band->bandno & 1) {
1494 opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
1495 x += pres->x1 - pres->x0;
1497 if (band->bandno & 2) {
1498 opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
1499 y += pres->y1 - pres->y0;
1502 if(!allocate_buffers(
1504 cblk->x1 - cblk->x0,
1505 cblk->y1 - cblk->y0))
1514 tiledp=&tilec->data[(y * tile_w) + x];
1515 if (tccp->qmfbid == 1) {
1516 for (j = 0; j < cblk_h; ++j) {
1517 for (i = 0; i < cblk_w; ++i) {
1518 int tmp = tiledp[(j * tile_w) + i];
1519 datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
1522 } else { /* if (tccp->qmfbid == 0) */
1523 for (j = 0; j < cblk_h; ++j) {
1524 for (i = 0; i < cblk_w; ++i) {
1525 int tmp = tiledp[(j * tile_w) + i];
1526 datap[(j * cblk_w) + i] =
1529 bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
1539 tilec->numresolutions - 1 - resno,
1554 void t1_decode_cblks(
1556 opj_tcd_tilecomp_t* tilec,
1559 int resno, bandno, precno, cblkno;
1561 int tile_w = tilec->x1 - tilec->x0;
1563 for (resno = 0; resno < tilec->numresolutions; ++resno) {
1564 opj_tcd_resolution_t* res = &tilec->resolutions[resno];
1566 for (bandno = 0; bandno < res->numbands; ++bandno) {
1567 opj_tcd_band_t* restrict band = &res->bands[bandno];
1569 for (precno = 0; precno < res->pw * res->ph; ++precno) {
1570 opj_tcd_precinct_t* precinct = &band->precincts[precno];
1572 for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
1573 opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
1574 int* restrict datap;
1586 x = cblk->x0 - band->x0;
1587 y = cblk->y0 - band->y0;
1588 if (band->bandno & 1) {
1589 opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
1590 x += pres->x1 - pres->x0;
1592 if (band->bandno & 2) {
1593 opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
1594 y += pres->y1 - pres->y0;
1601 if (tccp->roishift) {
1602 int thresh = 1 << tccp->roishift;
1603 for (j = 0; j < cblk_h; ++j) {
1604 for (i = 0; i < cblk_w; ++i) {
1605 int val = datap[(j * cblk_w) + i];
1607 if (mag >= thresh) {
1608 mag >>= tccp->roishift;
1609 datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
1615 if (tccp->qmfbid == 1) {
1616 int* restrict tiledp = &tilec->data[(y * tile_w) + x];
1617 for (j = 0; j < cblk_h; ++j) {
1618 for (i = 0; i < cblk_w; ++i) {
1619 int tmp = datap[(j * cblk_w) + i];
1620 ((int*)tiledp)[(j * tile_w) + i] = tmp / 2;
1623 } else { /* if (tccp->qmfbid == 0) */
1624 float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x];
1625 for (j = 0; j < cblk_h; ++j) {
1626 float* restrict tiledp2 = tiledp;
1627 for (i = 0; i < cblk_w; ++i) {
1628 float tmp = *datap * band->stepsize;
1636 opj_free(cblk->data);
1637 opj_free(cblk->segs);
1639 opj_free(precinct->cblks.dec);
1647 /* ----------------------------------------------------------------------- */
1649 * Creates a new Tier 1 handle
1650 * and initializes the look-up tables of the Tier-1 coder/decoder
1651 * @return a new T1 handle if successful, returns NULL otherwise
1653 opj_t1_t* t1_create_v2()
1655 opj_t1_t *l_t1 = 00;
1657 l_t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));
1663 memset(l_t1,0,sizeof(opj_t1_t));
1665 /* create MQC and RAW handles */
1666 l_t1->mqc = mqc_create();
1673 l_t1->raw = raw_create();
1685 * Destroys a previously created T1 handle
1687 * @param p_t1 Tier 1 handle to destroy
1689 void t1_destroy_v2(opj_t1_t *p_t1)
1697 /* destroy MQC and RAW handles */
1698 mqc_destroy(p_t1->mqc);
1700 raw_destroy(p_t1->raw);
1705 opj_aligned_free(p_t1->data);
1711 opj_aligned_free(p_t1->flags);
1717 void t1_decode_cblks_v2(
1719 opj_tcd_tilecomp_v2_t* tilec,
1722 OPJ_UINT32 resno, bandno, precno, cblkno;
1723 OPJ_UINT32 tile_w = tilec->x1 - tilec->x0;
1725 for (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) {
1726 opj_tcd_resolution_v2_t* res = &tilec->resolutions[resno];
1728 for (bandno = 0; bandno < res->numbands; ++bandno) {
1729 opj_tcd_band_v2_t* restrict band = &res->bands[bandno];
1731 for (precno = 0; precno < res->pw * res->ph; ++precno) {
1732 opj_tcd_precinct_v2_t* precinct = &band->precincts[precno];
1734 for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
1735 opj_tcd_cblk_dec_v2_t* cblk = &precinct->cblks.dec[cblkno];
1736 OPJ_INT32* restrict datap;
1737 void* restrict tiledp;
1738 OPJ_UINT32 cblk_w, cblk_h;
1749 x = cblk->x0 - band->x0;
1750 y = cblk->y0 - band->y0;
1751 if (band->bandno & 1) {
1752 opj_tcd_resolution_v2_t* pres = &tilec->resolutions[resno - 1];
1753 x += pres->x1 - pres->x0;
1755 if (band->bandno & 2) {
1756 opj_tcd_resolution_v2_t* pres = &tilec->resolutions[resno - 1];
1757 y += pres->y1 - pres->y0;
1764 if (tccp->roishift) {
1765 OPJ_INT32 thresh = 1 << tccp->roishift;
1766 for (j = 0; j < cblk_h; ++j) {
1767 for (i = 0; i < cblk_w; ++i) {
1768 OPJ_INT32 val = datap[(j * cblk_w) + i];
1769 OPJ_INT32 mag = abs(val);
1770 if (mag >= thresh) {
1771 mag >>= tccp->roishift;
1772 datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
1778 tiledp=(void*)&tilec->data[(y * tile_w) + x];
1779 if (tccp->qmfbid == 1) {
1780 for (j = 0; j < cblk_h; ++j) {
1781 for (i = 0; i < cblk_w; ++i) {
1782 OPJ_INT32 tmp = datap[(j * cblk_w) + i];
1783 ((OPJ_INT32*)tiledp)[(j * tile_w) + i] = tmp / 2;
1786 } else { /* if (tccp->qmfbid == 0) */
1787 for (j = 0; j < cblk_h; ++j) {
1788 for (i = 0; i < cblk_w; ++i) {
1789 float tmp = datap[(j * cblk_w) + i] * band->stepsize;
1790 ((float*)tiledp)[(j * tile_w) + i] = tmp;
1794 //opj_free(cblk->segs);
1803 static void t1_decode_cblk_v2(
1805 opj_tcd_cblk_dec_v2_t* cblk,
1807 OPJ_UINT32 roishift,
1810 opj_raw_t *raw = t1->raw; /* RAW component */
1811 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1814 OPJ_UINT32 passtype;
1815 OPJ_UINT32 segno, passno;
1816 OPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */
1818 if(!allocate_buffers(
1820 cblk->x1 - cblk->x0,
1821 cblk->y1 - cblk->y0))
1826 bpno = roishift + cblk->numbps - 1;
1829 mqc_resetstates(mqc);
1830 mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1831 mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1832 mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1834 for (segno = 0; segno < cblk->real_num_segs; ++segno) {
1835 opj_tcd_seg_t *seg = &cblk->segs[segno];
1838 type = ((bpno <= ((OPJ_INT32) (cblk->numbps) - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1839 /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
1840 if(seg->data == 00){
1843 if (type == T1_TYPE_RAW) {
1844 raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
1846 mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len);
1849 for (passno = 0; passno < seg->real_num_passes; ++passno) {
1852 t1_dec_sigpass(t1, bpno+1, orient, type, cblksty);
1855 t1_dec_refpass(t1, bpno+1, type, cblksty);
1858 t1_dec_clnpass(t1, bpno+1, orient, cblksty);
1862 if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
1863 mqc_resetstates(mqc);
1864 mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1865 mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1866 mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1868 if (++passtype == 3) {
1876 static void t1_dec_refpass(
1883 OPJ_INT32 one, poshalf, neghalf;
1887 neghalf = bpno > 0 ? -poshalf : -1;
1888 for (k = 0; k < t1->h; k += 4) {
1889 for (i = 0; i < t1->w; ++i) {
1890 for (j = k; j < k + 4 && j < t1->h; ++j) {
1891 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
1892 t1_dec_refpass_step(
1894 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
1895 &t1->data[(j * t1->w) + i],
1903 } /* VSC and BYPASS by Antonin */
1906 static void t1_dec_refpass_step(
1918 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1919 opj_raw_t *raw = t1->raw; /* RAW component */
1921 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
1922 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
1923 mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
1924 if (type == T1_TYPE_RAW) {
1925 v = raw_decode(raw);
1927 v = mqc_decode(mqc);
1929 t = v ? poshalf : neghalf;
1930 *datap += *datap < 0 ? -t : t;
1931 *flagsp |= T1_REFINE;
1933 } /* VSC and BYPASS by Antonin */
1935 static void t1_dec_sigpass(
1942 OPJ_UINT32 i, j, k, vsc;
1943 OPJ_INT32 one, half, oneplushalf;
1946 oneplushalf = one | half;
1947 for (k = 0; k < t1->h; k += 4) {
1948 for (i = 0; i < t1->w; ++i) {
1949 for (j = k; j < k + 4 && j < t1->h; ++j) {
1950 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
1951 t1_dec_sigpass_step(
1953 &t1->flags[((j+1) * t1->flags_stride) + i + 1],
1954 &t1->data[(j * t1->w) + i],
1962 } /* VSC and BYPASS by Antonin */
1964 static void t1_dec_sigpass_step(
1969 OPJ_INT32 oneplushalf,
1975 opj_raw_t *raw = t1->raw; /* RAW component */
1976 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1978 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
1979 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
1980 if (type == T1_TYPE_RAW) {
1981 if (raw_decode(raw)) {
1982 v = raw_decode(raw); /* ESSAI */
1983 *datap = v ? -oneplushalf : oneplushalf;
1984 t1_updateflags(flagsp, v, t1->flags_stride);
1987 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
1988 if (mqc_decode(mqc)) {
1989 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
1990 v = mqc_decode(mqc) ^ t1_getspb(flag);
1991 *datap = v ? -oneplushalf : oneplushalf;
1992 t1_updateflags(flagsp, v, t1->flags_stride);
1995 *flagsp |= T1_VISIT;
1997 } /* VSC and BYPASS by Antonin */