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.
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@haxxed.com>
15 * All rights reserved.
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
20 * 1. Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in the
24 * documentation and/or other materials provided with the distribution.
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
39 #include "opj_includes.h"
42 /** @defgroup T1 T1 - Implementation of the tier-1 coding */
45 /** @name Local static functions */
48 static INLINE char t1_getctxno_zc(int f, int orient);
49 static char t1_getctxno_sc(int f);
50 static INLINE int t1_getctxno_mag(int f);
51 static char t1_getspb(int f);
52 static short t1_getnmsedec_sig(int x, int bitpos);
53 static short t1_getnmsedec_ref(int x, int bitpos);
54 static void t1_updateflags(flag_t *flagsp, int s, int stride);
56 Encode significant pass
58 static void t1_enc_sigpass_step(
69 Decode significant pass
71 static INLINE void t1_dec_sigpass_step_raw(
78 static INLINE void t1_dec_sigpass_step_mqc(
84 static INLINE void t1_dec_sigpass_step_mqc_vsc(
92 Encode significant pass
94 static void t1_enc_sigpass(
102 Decode significant pass
104 static void t1_dec_sigpass_raw(
109 static void t1_dec_sigpass_mqc(
113 static void t1_dec_sigpass_mqc_vsc(
118 Encode refinement pass
120 static void t1_enc_refpass_step(
130 Decode refinement pass
132 static INLINE void t1_dec_refpass_step_raw(
139 static INLINE void t1_dec_refpass_step_mqc(
145 static INLINE void t1_dec_refpass_step_mqc_vsc(
154 Encode refinement pass
156 static void t1_enc_refpass(
163 Decode refinement pass
165 static void t1_dec_refpass_raw(
169 static void t1_dec_refpass_mqc(
172 static void t1_dec_refpass_mqc_vsc(
178 static void t1_enc_clnpass_step(
191 static void t1_dec_clnpass_step_partial(
197 static void t1_dec_clnpass_step(
203 static void t1_dec_clnpass_step_vsc(
214 static void t1_enc_clnpass(
223 static void t1_dec_clnpass(
228 static double t1_getwmsedec(
241 @param cblk Code-block coding parameters
243 @param compno Component number
247 @param cblksty Code-block style
252 static void t1_encode_cblk(
254 opj_tcd_cblk_enc_t* cblk,
263 opj_tcd_tile_t * tile);
267 @param cblk Code-block coding parameters
269 @param roishift Region of interest shifting value
270 @param cblksty Code-block style
272 static void t1_decode_cblk(
274 opj_tcd_cblk_dec_t* cblk,
283 /* ----------------------------------------------------------------------- */
285 static char t1_getctxno_zc(int f, int orient)
287 return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
290 static char t1_getctxno_sc(int f)
292 return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
295 static int t1_getctxno_mag(int f)
297 int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
298 int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
302 static char t1_getspb(int f)
304 return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
307 static short t1_getnmsedec_sig(int x, int bitpos)
309 if (bitpos > T1_NMSEDEC_FRACBITS) {
310 return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((
311 1 << T1_NMSEDEC_BITS) - 1)];
314 return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
317 static short t1_getnmsedec_ref(int x, int bitpos)
319 if (bitpos > T1_NMSEDEC_FRACBITS) {
320 return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((
321 1 << T1_NMSEDEC_BITS) - 1)];
324 return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
327 static void t1_updateflags(flag_t *flagsp, int s, int stride)
329 flag_t *np = flagsp - stride;
330 flag_t *sp = flagsp + stride;
332 static const flag_t mod[] = {
333 T1_SIG_S, T1_SIG_S | T1_SGN_S,
334 T1_SIG_E, T1_SIG_E | T1_SGN_E,
335 T1_SIG_W, T1_SIG_W | T1_SGN_W,
336 T1_SIG_N, T1_SIG_N | T1_SGN_N
343 flagsp[-1] |= mod[s + 2];
345 flagsp[1] |= mod[s + 4];
352 static void t1_enc_sigpass_step(
365 opj_mqc_t *mqc = t1->mqc; /* MQC component */
367 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
369 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
370 v = int_abs(*datap) & one ? 1 : 0;
371 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */
372 if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
373 mqc_bypass_enc(mqc, v);
378 v = *datap < 0 ? 1 : 0;
379 *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
380 mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */
381 if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
382 mqc_bypass_enc(mqc, v);
384 mqc_encode(mqc, v ^ t1_getspb(flag));
386 t1_updateflags(flagsp, v, t1->flags_stride);
392 static INLINE void t1_dec_sigpass_step_raw(
401 opj_raw_t *raw = t1->raw; /* RAW component */
403 OPJ_ARG_NOT_USED(orient);
405 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
407 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
408 if (raw_decode(raw)) {
409 v = raw_decode(raw); /* ESSAI */
410 *datap = v ? -oneplushalf : oneplushalf;
411 t1_updateflags(flagsp, v, t1->flags_stride);
415 } /* VSC and BYPASS by Antonin */
417 static INLINE void t1_dec_sigpass_step_mqc(
426 opj_mqc_t *mqc = t1->mqc; /* MQC component */
429 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
430 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
431 if (mqc_decode(mqc)) {
432 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
433 v = mqc_decode(mqc) ^ t1_getspb(flag);
434 *datap = v ? -oneplushalf : oneplushalf;
435 t1_updateflags(flagsp, v, t1->flags_stride);
439 } /* VSC and BYPASS by Antonin */
441 static INLINE void t1_dec_sigpass_step_mqc_vsc(
451 opj_mqc_t *mqc = t1->mqc; /* MQC component */
453 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
455 if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
456 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
457 if (mqc_decode(mqc)) {
458 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
459 v = mqc_decode(mqc) ^ t1_getspb(flag);
460 *datap = v ? -oneplushalf : oneplushalf;
461 t1_updateflags(flagsp, v, t1->flags_stride);
465 } /* VSC and BYPASS by Antonin */
467 static void t1_enc_sigpass(
475 int i, j, k, one, vsc;
477 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
478 for (k = 0; k < t1->h; k += 4) {
479 for (i = 0; i < t1->w; ++i) {
480 for (j = k; j < k + 4 && j < t1->h; ++j) {
481 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
482 j == t1->h - 1)) ? 1 : 0;
485 &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
486 &t1->data[(j * t1->w) + i],
498 static void t1_dec_sigpass_raw(
504 int i, j, k, one, half, oneplushalf, vsc;
507 oneplushalf = one | half;
508 for (k = 0; k < t1->h; k += 4) {
509 for (i = 0; i < t1->w; ++i) {
510 for (j = k; j < k + 4 && j < t1->h; ++j) {
511 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
512 j == t1->h - 1)) ? 1 : 0;
513 t1_dec_sigpass_step_raw(
515 &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
516 &t1->data[(j * t1->w) + i],
523 } /* VSC and BYPASS by Antonin */
525 static void t1_dec_sigpass_mqc(
530 int i, j, k, one, half, oneplushalf;
531 int *data1 = t1->data;
532 flag_t *flags1 = &t1->flags[1];
535 oneplushalf = one | half;
536 for (k = 0; k < (t1->h & ~3); k += 4) {
537 for (i = 0; i < t1->w; ++i) {
538 int *data2 = data1 + i;
539 flag_t *flags2 = flags1 + i;
540 flags2 += t1->flags_stride;
541 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
543 flags2 += t1->flags_stride;
544 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
546 flags2 += t1->flags_stride;
547 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
549 flags2 += t1->flags_stride;
550 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
554 flags1 += t1->flags_stride << 2;
556 for (i = 0; i < t1->w; ++i) {
557 int *data2 = data1 + i;
558 flag_t *flags2 = flags1 + i;
559 for (j = k; j < t1->h; ++j) {
560 flags2 += t1->flags_stride;
561 t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
565 } /* VSC and BYPASS by Antonin */
567 static void t1_dec_sigpass_mqc_vsc(
572 int i, j, k, one, half, oneplushalf, vsc;
575 oneplushalf = one | half;
576 for (k = 0; k < t1->h; k += 4) {
577 for (i = 0; i < t1->w; ++i) {
578 for (j = k; j < k + 4 && j < t1->h; ++j) {
579 vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
580 t1_dec_sigpass_step_mqc_vsc(
582 &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
583 &t1->data[(j * t1->w) + i],
590 } /* VSC and BYPASS by Antonin */
592 static void t1_enc_refpass_step(
604 opj_mqc_t *mqc = t1->mqc; /* MQC component */
606 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
608 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
609 *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
610 v = int_abs(*datap) & one ? 1 : 0;
611 mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
612 if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
613 mqc_bypass_enc(mqc, v);
617 *flagsp |= T1_REFINE;
621 static INLINE void t1_dec_refpass_step_raw(
631 opj_raw_t *raw = t1->raw; /* RAW component */
633 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
635 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
637 t = v ? poshalf : neghalf;
638 *datap += *datap < 0 ? -t : t;
639 *flagsp |= T1_REFINE;
641 } /* VSC and BYPASS by Antonin */
643 static INLINE void t1_dec_refpass_step_mqc(
652 opj_mqc_t *mqc = t1->mqc; /* MQC component */
655 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
656 mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
658 t = v ? poshalf : neghalf;
659 *datap += *datap < 0 ? -t : t;
660 *flagsp |= T1_REFINE;
662 } /* VSC and BYPASS by Antonin */
664 static INLINE void t1_dec_refpass_step_mqc_vsc(
674 opj_mqc_t *mqc = t1->mqc; /* MQC component */
676 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
678 if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
679 mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
681 t = v ? poshalf : neghalf;
682 *datap += *datap < 0 ? -t : t;
683 *flagsp |= T1_REFINE;
685 } /* VSC and BYPASS by Antonin */
687 static void t1_enc_refpass(
694 int i, j, k, one, vsc;
696 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
697 for (k = 0; k < t1->h; k += 4) {
698 for (i = 0; i < t1->w; ++i) {
699 for (j = k; j < k + 4 && j < t1->h; ++j) {
700 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
701 j == t1->h - 1)) ? 1 : 0;
704 &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
705 &t1->data[(j * t1->w) + i],
716 static void t1_dec_refpass_raw(
721 int i, j, k, one, poshalf, neghalf;
725 neghalf = bpno > 0 ? -poshalf : -1;
726 for (k = 0; k < t1->h; k += 4) {
727 for (i = 0; i < t1->w; ++i) {
728 for (j = k; j < k + 4 && j < t1->h; ++j) {
729 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
730 j == t1->h - 1)) ? 1 : 0;
731 t1_dec_refpass_step_raw(
733 &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
734 &t1->data[(j * t1->w) + i],
741 } /* VSC and BYPASS by Antonin */
743 static void t1_dec_refpass_mqc(
747 int i, j, k, one, poshalf, neghalf;
748 int *data1 = t1->data;
749 flag_t *flags1 = &t1->flags[1];
752 neghalf = bpno > 0 ? -poshalf : -1;
753 for (k = 0; k < (t1->h & ~3); k += 4) {
754 for (i = 0; i < t1->w; ++i) {
755 int *data2 = data1 + i;
756 flag_t *flags2 = flags1 + i;
757 flags2 += t1->flags_stride;
758 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
760 flags2 += t1->flags_stride;
761 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
763 flags2 += t1->flags_stride;
764 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
766 flags2 += t1->flags_stride;
767 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
771 flags1 += t1->flags_stride << 2;
773 for (i = 0; i < t1->w; ++i) {
774 int *data2 = data1 + i;
775 flag_t *flags2 = flags1 + i;
776 for (j = k; j < t1->h; ++j) {
777 flags2 += t1->flags_stride;
778 t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
782 } /* VSC and BYPASS by Antonin */
784 static void t1_dec_refpass_mqc_vsc(
788 int i, j, k, one, poshalf, neghalf;
792 neghalf = bpno > 0 ? -poshalf : -1;
793 for (k = 0; k < t1->h; k += 4) {
794 for (i = 0; i < t1->w; ++i) {
795 for (j = k; j < k + 4 && j < t1->h; ++j) {
796 vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
797 t1_dec_refpass_step_mqc_vsc(
799 &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
800 &t1->data[(j * t1->w) + i],
807 } /* VSC and BYPASS by Antonin */
809 static void t1_enc_clnpass_step(
822 opj_mqc_t *mqc = t1->mqc; /* MQC component */
824 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
829 if (!(*flagsp & (T1_SIG | T1_VISIT))) {
830 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
831 v = int_abs(*datap) & one ? 1 : 0;
835 *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
836 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
837 v = *datap < 0 ? 1 : 0;
838 mqc_encode(mqc, v ^ t1_getspb(flag));
839 t1_updateflags(flagsp, v, t1->flags_stride);
842 *flagsp &= ~T1_VISIT;
845 static void t1_dec_clnpass_step_partial(
853 opj_mqc_t *mqc = t1->mqc; /* MQC component */
855 OPJ_ARG_NOT_USED(orient);
858 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
859 v = mqc_decode(mqc) ^ t1_getspb(flag);
860 *datap = v ? -oneplushalf : oneplushalf;
861 t1_updateflags(flagsp, v, t1->flags_stride);
862 *flagsp &= ~T1_VISIT;
863 } /* VSC and BYPASS by Antonin */
865 static void t1_dec_clnpass_step(
874 opj_mqc_t *mqc = t1->mqc; /* MQC component */
877 if (!(flag & (T1_SIG | T1_VISIT))) {
878 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
879 if (mqc_decode(mqc)) {
880 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
881 v = mqc_decode(mqc) ^ t1_getspb(flag);
882 *datap = v ? -oneplushalf : oneplushalf;
883 t1_updateflags(flagsp, v, t1->flags_stride);
886 *flagsp &= ~T1_VISIT;
887 } /* VSC and BYPASS by Antonin */
889 static void t1_dec_clnpass_step_vsc(
900 opj_mqc_t *mqc = t1->mqc; /* MQC component */
902 flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
907 if (!(flag & (T1_SIG | T1_VISIT))) {
908 mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
909 if (mqc_decode(mqc)) {
911 mqc_setcurctx(mqc, t1_getctxno_sc(flag));
912 v = mqc_decode(mqc) ^ t1_getspb(flag);
913 *datap = v ? -oneplushalf : oneplushalf;
914 t1_updateflags(flagsp, v, t1->flags_stride);
917 *flagsp &= ~T1_VISIT;
920 static void t1_enc_clnpass(
927 int i, j, k, one, agg, runlen, vsc;
929 opj_mqc_t *mqc = t1->mqc; /* MQC component */
932 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
933 for (k = 0; k < t1->h; k += 4) {
934 for (i = 0; i < t1->w; ++i) {
936 if (cblksty & J2K_CCP_CBLKSTY_VSC) {
937 agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
938 || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
939 || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
940 || (MACRO_t1_flags(1 + k + 3, 1 + i)
941 & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT |
944 agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
945 || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
946 || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
947 || MACRO_t1_flags(1 + k + 3, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
953 for (runlen = 0; runlen < 4; ++runlen) {
954 if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one) {
958 mqc_setcurctx(mqc, T1_CTXNO_AGG);
959 mqc_encode(mqc, runlen != 4);
963 mqc_setcurctx(mqc, T1_CTXNO_UNI);
964 mqc_encode(mqc, runlen >> 1);
965 mqc_encode(mqc, runlen & 1);
969 for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
970 vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
971 j == t1->h - 1)) ? 1 : 0;
974 &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
975 &t1->data[(j * t1->w) + i],
980 agg && (j == k + runlen),
987 static void t1_dec_clnpass(
993 int i, j, k, one, half, oneplushalf, agg, runlen, vsc;
994 int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
996 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1000 oneplushalf = one | half;
1001 if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1002 for (k = 0; k < t1->h; k += 4) {
1003 for (i = 0; i < t1->w; ++i) {
1004 if (k + 3 < t1->h) {
1005 agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1006 || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1007 || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1008 || (MACRO_t1_flags(1 + k + 3, 1 + i)
1009 & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT |
1015 mqc_setcurctx(mqc, T1_CTXNO_AGG);
1016 if (!mqc_decode(mqc)) {
1019 mqc_setcurctx(mqc, T1_CTXNO_UNI);
1020 runlen = mqc_decode(mqc);
1021 runlen = (runlen << 1) | mqc_decode(mqc);
1025 for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
1026 vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
1027 t1_dec_clnpass_step_vsc(
1029 &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
1030 &t1->data[(j * t1->w) + i],
1033 agg && (j == k + runlen),
1039 int *data1 = t1->data;
1040 flag_t *flags1 = &t1->flags[1];
1041 for (k = 0; k < (t1->h & ~3); k += 4) {
1042 for (i = 0; i < t1->w; ++i) {
1043 int *data2 = data1 + i;
1044 flag_t *flags2 = flags1 + i;
1045 agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1046 || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1047 || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
1048 || MACRO_t1_flags(1 + k + 3, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
1050 mqc_setcurctx(mqc, T1_CTXNO_AGG);
1051 if (!mqc_decode(mqc)) {
1054 mqc_setcurctx(mqc, T1_CTXNO_UNI);
1055 runlen = mqc_decode(mqc);
1056 runlen = (runlen << 1) | mqc_decode(mqc);
1057 flags2 += runlen * t1->flags_stride;
1058 data2 += runlen * t1->w;
1059 for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
1060 flags2 += t1->flags_stride;
1061 if (agg && (j == k + runlen)) {
1062 t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
1064 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1069 flags2 += t1->flags_stride;
1070 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1072 flags2 += t1->flags_stride;
1073 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1075 flags2 += t1->flags_stride;
1076 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1078 flags2 += t1->flags_stride;
1079 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1083 data1 += t1->w << 2;
1084 flags1 += t1->flags_stride << 2;
1086 for (i = 0; i < t1->w; ++i) {
1087 int *data2 = data1 + i;
1088 flag_t *flags2 = flags1 + i;
1089 for (j = k; j < t1->h; ++j) {
1090 flags2 += t1->flags_stride;
1091 t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
1099 mqc_setcurctx(mqc, T1_CTXNO_UNI);
1100 v = mqc_decode(mqc);
1101 v = (v << 1) | mqc_decode(mqc);
1102 v = (v << 1) | mqc_decode(mqc);
1103 v = (v << 1) | mqc_decode(mqc);
1106 opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
1110 } /* VSC and BYPASS by Antonin */
1113 /** mod fixed_quality */
1114 static double t1_getwmsedec(
1125 double w1, w2, wmsedec;
1127 w1 = (mct && numcomps == 3) ? mct_getnorm(compno) : 1.0;
1128 w2 = dwt_getnorm(level, orient);
1129 } else { /* if (qmfbid == 0) */
1130 w1 = (mct && numcomps == 3) ? mct_getnorm_real(compno) : 1.0;
1131 w2 = dwt_getnorm_real(level, orient);
1133 wmsedec = w1 * w2 * stepsize * (1 << bpno);
1134 wmsedec *= wmsedec * nmsedec / 8192.0;
1139 static opj_bool allocate_buffers(
1144 int datasize = w * h;
1147 if (datasize > t1->datasize) {
1148 opj_aligned_free(t1->data);
1149 t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int));
1153 t1->datasize = datasize;
1155 memset(t1->data, 0, datasize * sizeof(int));
1157 t1->flags_stride = w + 2;
1158 flagssize = t1->flags_stride * (h + 2);
1160 if (flagssize > t1->flagssize) {
1161 opj_aligned_free(t1->flags);
1162 t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t));
1166 t1->flagssize = flagssize;
1168 memset(t1->flags, 0, flagssize * sizeof(flag_t));
1176 /** mod fixed_quality */
1177 static void t1_encode_cblk(
1179 opj_tcd_cblk_enc_t* cblk,
1188 opj_tcd_tile_t * tile)
1190 double cumwmsedec = 0.0;
1192 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1194 int passno, bpno, passtype;
1197 char type = T1_TYPE_MQ;
1201 for (i = 0; i < t1->w * t1->h; ++i) {
1202 int tmp = abs(t1->data[i]);
1203 max = int_max(max, tmp);
1206 cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
1208 bpno = cblk->numbps - 1;
1211 mqc_resetstates(mqc);
1212 mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1213 mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1214 mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1215 mqc_init_enc(mqc, cblk->data);
1217 for (passno = 0; bpno >= 0; ++passno) {
1218 opj_tcd_pass_t *pass = &cblk->passes[passno];
1220 type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) &&
1221 (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1225 t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
1228 t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
1231 t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
1232 /* code switch SEGMARK (i.e. SEGSYM) */
1233 if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) {
1234 mqc_segmark_enc(mqc);
1240 tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid,
1241 stepsize, numcomps, mct);
1242 cumwmsedec += tempwmsedec;
1243 tile->distotile += tempwmsedec;
1245 /* Code switch "RESTART" (i.e. TERMALL) */
1246 if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) &&
1248 if (type == T1_TYPE_RAW) {
1251 /* correction = mqc_bypass_flush_enc(); */
1252 } else { /* correction = mqc_restart_enc(); */
1258 if (((bpno < (cblk->numbps - 4) && (passtype > 0))
1259 || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) &&
1260 (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
1261 if (type == T1_TYPE_RAW) {
1264 /* correction = mqc_bypass_flush_enc(); */
1265 } else { /* correction = mqc_restart_enc(); */
1275 if (++passtype == 3) {
1280 if (pass->term && bpno > 0) {
1281 type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) &&
1282 (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1283 if (type == T1_TYPE_RAW) {
1284 mqc_bypass_init_enc(mqc);
1286 mqc_restart_init_enc(mqc);
1290 pass->distortiondec = cumwmsedec;
1291 pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */
1293 /* Code-switch "RESET" */
1294 if (cblksty & J2K_CCP_CBLKSTY_RESET) {
1299 /* Code switch "ERTERM" (i.e. PTERM) */
1300 if (cblksty & J2K_CCP_CBLKSTY_PTERM) {
1301 mqc_erterm_enc(mqc);
1302 } else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) {
1306 cblk->totalpasses = passno;
1308 for (passno = 0; passno < cblk->totalpasses; passno++) {
1309 opj_tcd_pass_t *pass = &cblk->passes[passno];
1310 if (pass->rate > mqc_numbytes(mqc)) {
1311 pass->rate = mqc_numbytes(mqc);
1313 /*Preventing generation of FF as last data byte of a pass*/
1314 if ((pass->rate > 1) && (cblk->data[pass->rate - 1] == 0xFF)) {
1317 pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
1321 static void t1_decode_cblk(
1323 opj_tcd_cblk_dec_t* cblk,
1328 opj_raw_t *raw = t1->raw; /* RAW component */
1329 opj_mqc_t *mqc = t1->mqc; /* MQC component */
1333 char type = T1_TYPE_MQ; /* BYPASS mode */
1335 if (!allocate_buffers(
1337 cblk->x1 - cblk->x0,
1338 cblk->y1 - cblk->y0)) {
1342 bpno = roishift + cblk->numbps - 1;
1345 mqc_resetstates(mqc);
1346 mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1347 mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1348 mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1350 for (segno = 0; segno < cblk->numsegs; ++segno) {
1351 opj_tcd_seg_t *seg = &cblk->segs[segno];
1354 type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) &&
1355 (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
1356 /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
1357 if (seg->data == NULL) {
1360 if (type == T1_TYPE_RAW) {
1361 raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
1363 mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len);
1366 for (passno = 0; passno < seg->numpasses; ++passno) {
1369 if (type == T1_TYPE_RAW) {
1370 t1_dec_sigpass_raw(t1, bpno + 1, orient, cblksty);
1372 if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1373 t1_dec_sigpass_mqc_vsc(t1, bpno + 1, orient);
1375 t1_dec_sigpass_mqc(t1, bpno + 1, orient);
1380 if (type == T1_TYPE_RAW) {
1381 t1_dec_refpass_raw(t1, bpno + 1, cblksty);
1383 if (cblksty & J2K_CCP_CBLKSTY_VSC) {
1384 t1_dec_refpass_mqc_vsc(t1, bpno + 1);
1386 t1_dec_refpass_mqc(t1, bpno + 1);
1391 t1_dec_clnpass(t1, bpno + 1, orient, cblksty);
1395 if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
1396 mqc_resetstates(mqc);
1397 mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
1398 mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
1399 mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
1401 if (++passtype == 3) {
1409 /* ----------------------------------------------------------------------- */
1411 opj_t1_t* t1_create(opj_common_ptr cinfo)
1413 opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));
1419 /* create MQC and RAW handles */
1420 t1->mqc = mqc_create();
1421 t1->raw = raw_create();
1431 void t1_destroy(opj_t1_t *t1)
1434 /* destroy MQC and RAW handles */
1435 mqc_destroy(t1->mqc);
1436 raw_destroy(t1->raw);
1437 opj_aligned_free(t1->data);
1438 opj_aligned_free(t1->flags);
1443 void t1_encode_cblks(
1445 opj_tcd_tile_t *tile,
1448 int compno, resno, bandno, precno, cblkno;
1450 tile->distotile = 0; /* fixed_quality */
1452 for (compno = 0; compno < tile->numcomps; ++compno) {
1453 opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
1454 opj_tccp_t* tccp = &tcp->tccps[compno];
1455 int tile_w = tilec->x1 - tilec->x0;
1457 for (resno = 0; resno < tilec->numresolutions; ++resno) {
1458 opj_tcd_resolution_t *res = &tilec->resolutions[resno];
1460 for (bandno = 0; bandno < res->numbands; ++bandno) {
1461 opj_tcd_band_t* restrict band = &res->bands[bandno];
1462 int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192));
1464 for (precno = 0; precno < res->pw * res->ph; ++precno) {
1465 opj_tcd_precinct_t *prc = &band->precincts[precno];
1467 for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
1468 opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
1469 int* restrict datap;
1470 int* restrict tiledp;
1475 int x = cblk->x0 - band->x0;
1476 int y = cblk->y0 - band->y0;
1477 if (band->bandno & 1) {
1478 opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
1479 x += pres->x1 - pres->x0;
1481 if (band->bandno & 2) {
1482 opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
1483 y += pres->y1 - pres->y0;
1486 if (!allocate_buffers(
1488 cblk->x1 - cblk->x0,
1489 cblk->y1 - cblk->y0)) {
1497 tiledp = &tilec->data[(y * tile_w) + x];
1498 if (tccp->qmfbid == 1) {
1499 for (j = 0; j < cblk_h; ++j) {
1500 for (i = 0; i < cblk_w; ++i) {
1501 int tmp = tiledp[(j * tile_w) + i];
1502 datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
1505 } else { /* if (tccp->qmfbid == 0) */
1506 for (j = 0; j < cblk_h; ++j) {
1507 for (i = 0; i < cblk_w; ++i) {
1508 int tmp = tiledp[(j * tile_w) + i];
1509 datap[(j * cblk_w) + i] =
1512 bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
1522 tilec->numresolutions - 1 - resno,
1537 void t1_decode_cblks(
1539 opj_tcd_tilecomp_t* tilec,
1542 int resno, bandno, precno, cblkno;
1544 int tile_w = tilec->x1 - tilec->x0;
1546 for (resno = 0; resno < tilec->numresolutions; ++resno) {
1547 opj_tcd_resolution_t* res = &tilec->resolutions[resno];
1549 for (bandno = 0; bandno < res->numbands; ++bandno) {
1550 opj_tcd_band_t* restrict band = &res->bands[bandno];
1552 for (precno = 0; precno < res->pw * res->ph; ++precno) {
1553 opj_tcd_precinct_t* precinct = &band->precincts[precno];
1555 for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
1556 opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
1557 int* restrict datap;
1569 x = cblk->x0 - band->x0;
1570 y = cblk->y0 - band->y0;
1571 if (band->bandno & 1) {
1572 opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
1573 x += pres->x1 - pres->x0;
1575 if (band->bandno & 2) {
1576 opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
1577 y += pres->y1 - pres->y0;
1584 if (tccp->roishift) {
1585 int thresh = 1 << tccp->roishift;
1586 for (j = 0; j < cblk_h; ++j) {
1587 for (i = 0; i < cblk_w; ++i) {
1588 int val = datap[(j * cblk_w) + i];
1590 if (mag >= thresh) {
1591 mag >>= tccp->roishift;
1592 datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
1598 if (tccp->qmfbid == 1) {
1599 int* restrict tiledp = &tilec->data[(y * tile_w) + x];
1600 for (j = 0; j < cblk_h; ++j) {
1601 for (i = 0; i < cblk_w; ++i) {
1602 int tmp = datap[(j * cblk_w) + i];
1603 ((int*)tiledp)[(j * tile_w) + i] = tmp / 2;
1606 } else { /* if (tccp->qmfbid == 0) */
1607 float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x];
1608 for (j = 0; j < cblk_h; ++j) {
1609 float* restrict tiledp2 = tiledp;
1610 for (i = 0; i < cblk_w; ++i) {
1611 float tmp = *datap * band->stepsize;
1619 opj_free(cblk->data);
1620 opj_free(cblk->segs);
1622 opj_free(precinct->cblks.dec);
1623 precinct->cblks.dec = NULL;