deb6b98a8637c1614a845bbee3ea761449179629
[openjpeg.git] / libopenjpeg / t1.c
1 /*
2  * Copyright (c) 2001-2002, David Janssens
3  * Copyright (c) 2002-2003, Yannick Verschueren
4  * Copyright (c) 2002-2003,  Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "t1.h"
30 #include "j2k.h"
31 #include "mqc.h"
32 #include "raw.h"                /* Antonin */
33 #include "int.h"
34 #include "mct.h"
35 #include "dwt.h"
36 #include "fix.h"
37 #include <stdio.h>
38 #include <math.h>
39 #include <stdlib.h>
40
41 #define T1_MAXCBLKW 1024
42 #define T1_MAXCBLKH 1024
43
44 #define T1_SIG_NE 0x0001
45 #define T1_SIG_SE 0x0002
46 #define T1_SIG_SW 0x0004
47 #define T1_SIG_NW 0x0008
48 #define T1_SIG_N 0x0010
49 #define T1_SIG_E 0x0020
50 #define T1_SIG_S 0x0040
51 #define T1_SIG_W 0x0080
52 #define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
53 #define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
54
55 #define T1_SGN_N 0x0100
56 #define T1_SGN_E 0x0200
57 #define T1_SGN_S 0x0400
58 #define T1_SGN_W 0x0800
59 #define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
60
61 #define T1_SIG 0x1000
62 #define T1_REFINE 0x2000
63 #define T1_VISIT 0x4000
64
65 #define T1_NUMCTXS_AGG 1
66 #define T1_NUMCTXS_ZC 9
67 #define T1_NUMCTXS_MAG 3
68 #define T1_NUMCTXS_SC 5
69 #define T1_NUMCTXS_UNI 1
70
71 #define T1_CTXNO_AGG 0
72 #define T1_CTXNO_ZC (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
73 #define T1_CTXNO_MAG (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
74 #define T1_CTXNO_SC (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
75 #define T1_CTXNO_UNI (T1_CTXNO_SC+T1_NUMCTXS_SC)
76 #define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
77
78 #define T1_NMSEDEC_BITS 7
79 #define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
80
81 /* add TONY */
82 #define T1_TYPE_MQ 0
83 #define T1_TYPE_RAW 1
84 /* dda */
85
86 static int t1_lut_ctxno_zc[1024];
87 static int t1_lut_ctxno_sc[256];
88 static int t1_lut_ctxno_mag[4096];
89 static int t1_lut_spb[256];
90 static int t1_lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
91 static int t1_lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
92 static int t1_lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
93 static int t1_lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
94
95 static int t1_data[T1_MAXCBLKH][T1_MAXCBLKH];
96 static int t1_flags[T1_MAXCBLKH + 2][T1_MAXCBLKH + 2];
97
98 int t1_getctxno_zc(int f, int orient)
99 {
100   return t1_lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
101 }
102
103 int t1_getctxno_sc(int f)
104 {
105   return t1_lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
106 }
107
108 int t1_getctxno_mag(int f)
109 {
110   return t1_lut_ctxno_mag[(f & T1_SIG_OTH) |
111                           (((f & T1_REFINE) != 0) << 11)];
112 }
113
114 int t1_getspb(int f)
115 {
116   return t1_lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
117 }
118
119 int t1_getnmsedec_sig(int x, int bitpos)
120 {
121   if (bitpos > T1_NMSEDEC_FRACBITS)
122     return t1_lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) &
123                               ((1 << T1_NMSEDEC_BITS) - 1)];
124   else
125     return t1_lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
126 }
127
128 int t1_getnmsedec_ref(int x, int bitpos)
129 {
130   if (bitpos > T1_NMSEDEC_FRACBITS)
131     return t1_lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) &
132                               ((1 << T1_NMSEDEC_BITS) - 1)];
133   else
134     return t1_lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
135 }
136
137 void t1_updateflags(int *fp, int s)
138 {
139   int *np = fp - (T1_MAXCBLKW + 2);
140   int *sp = fp + (T1_MAXCBLKW + 2);
141   np[-1] |= T1_SIG_SE;
142   np[1] |= T1_SIG_SW;
143   sp[-1] |= T1_SIG_NE;
144   sp[1] |= T1_SIG_NW;
145   *np |= T1_SIG_S;
146   *sp |= T1_SIG_N;
147   fp[-1] |= T1_SIG_E;
148   fp[1] |= T1_SIG_W;
149   if (s) {
150     *np |= T1_SGN_S;
151     *sp |= T1_SGN_N;
152     fp[-1] |= T1_SGN_E;
153     fp[1] |= T1_SGN_W;
154   }
155 }
156
157 void t1_enc_sigpass_step(int *fp, int *dp, int orient, int bpno, int one,
158                          int *nmsedec, char type, int vsc)
159 {
160   int v, flag;
161   flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
162     : (*fp);
163   if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
164     v = int_abs(*dp) & one ? 1 : 0;
165     if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */
166       mqc_setcurctx(t1_getctxno_zc(flag, orient));      /* ESSAI */
167       mqc_bypass_enc(v);
168     } else {
169       mqc_setcurctx(t1_getctxno_zc(flag, orient));
170       mqc_encode(v);
171     }
172     if (v) {
173       v = *dp < 0 ? 1 : 0;
174       *nmsedec +=
175         t1_getnmsedec_sig(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
176       if (type == T1_TYPE_RAW) {        /* BYPASS/LAZY MODE */
177         mqc_setcurctx(t1_getctxno_sc(flag));    /* ESSAI */
178         mqc_bypass_enc(v);
179       } else {
180         mqc_setcurctx(t1_getctxno_sc(flag));
181         mqc_encode(v ^ t1_getspb(flag));
182       }
183       t1_updateflags(fp, v);
184       *fp |= T1_SIG;
185     }
186     *fp |= T1_VISIT;
187   }
188 }
189
190 void t1_dec_sigpass_step(int *fp, int *dp, int orient, int oneplushalf,
191                          char type, int vsc)
192 {
193   int v, flag;
194   flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
195     : (*fp);
196   if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
197     if (type == T1_TYPE_RAW) {
198       if (raw_decode()) {
199         v = raw_decode();       /* ESSAI */
200         *dp = v ? -oneplushalf : oneplushalf;
201         t1_updateflags(fp, v);
202         *fp |= T1_SIG;
203       }
204     } else {
205       mqc_setcurctx(t1_getctxno_zc(flag, orient));
206       if (mqc_decode()) {
207         mqc_setcurctx(t1_getctxno_sc(flag));
208         v = mqc_decode() ^ t1_getspb(flag);
209         *dp = v ? -oneplushalf : oneplushalf;
210         t1_updateflags(fp, v);
211         *fp |= T1_SIG;
212       }
213     }
214     *fp |= T1_VISIT;
215   }
216 }                               /* VSC and  BYPASS by Antonin */
217
218 void t1_enc_sigpass(int w, int h, int bpno, int orient, int *nmsedec,
219                     char type, int cblksty)
220 {
221   int i, j, k, one, vsc;
222   *nmsedec = 0;
223   one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
224   for (k = 0; k < h; k += 4) {
225     for (i = 0; i < w; i++) {
226       for (j = k; j < k + 4 && j < h; j++) {
227         vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
228                && (j == k + 3 || j == h - 1)) ? 1 : 0;
229         t1_enc_sigpass_step(&t1_flags[1 + j][1 + i],
230                             &t1_data[j][i], orient, bpno, one,
231                             nmsedec, type, vsc);
232       }
233     }
234   }
235 }
236
237 void t1_dec_sigpass(int w, int h, int bpno, int orient, char type,
238                     int cblksty)
239 {
240   int i, j, k, one, half, oneplushalf, vsc;
241   one = 1 << bpno;
242   half = one >> 1;
243   oneplushalf = one | half;
244   for (k = 0; k < h; k += 4) {
245     for (i = 0; i < w; i++) {
246       for (j = k; j < k + 4 && j < h; j++) {
247         vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
248                && (j == k + 3 || j == h - 1)) ? 1 : 0;
249         t1_dec_sigpass_step(&t1_flags[1 + j][1 + i],
250                             &t1_data[j][i], orient, oneplushalf,
251                             type, vsc);
252       }
253     }
254   }
255 }                               /* VSC and  BYPASS by Antonin */
256
257 void t1_enc_refpass_step(int *fp, int *dp, int bpno, int one, int *nmsedec,
258                          char type, int vsc)
259 {
260   int v, flag;
261   flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
262     : (*fp);
263   if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
264     *nmsedec +=
265       t1_getnmsedec_ref(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
266     v = int_abs(*dp) & one ? 1 : 0;
267     if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */
268       mqc_setcurctx(t1_getctxno_mag(flag));     /* ESSAI */
269       mqc_bypass_enc(v);
270     } else {
271       mqc_setcurctx(t1_getctxno_mag(flag));
272       mqc_encode(v);
273     }
274     *fp |= T1_REFINE;
275   }
276 }
277
278 void t1_dec_refpass_step(int *fp, int *dp, int poshalf, int neghalf,
279                          char type, int vsc)
280 {
281   int v, t, flag;
282   flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
283     : (*fp);
284   if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
285     if (type == T1_TYPE_RAW) {
286       mqc_setcurctx(t1_getctxno_mag(flag));     /* ESSAI */
287       v = raw_decode();
288     } else {
289       mqc_setcurctx(t1_getctxno_mag(flag));
290       v = mqc_decode();
291     }
292     t = v ? poshalf : neghalf;
293     *dp += *dp < 0 ? -t : t;
294     *fp |= T1_REFINE;
295   }
296 }                               /* VSC and  BYPASS by Antonin  */
297
298 void t1_enc_refpass(int w, int h, int bpno, int *nmsedec, char type,
299                     int cblksty)
300 {
301   int i, j, k, one, vsc;
302   *nmsedec = 0;
303   one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
304   for (k = 0; k < h; k += 4) {
305     for (i = 0; i < w; i++) {
306       for (j = k; j < k + 4 && j < h; j++) {
307         vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
308                && (j == k + 3 || j == h - 1)) ? 1 : 0;
309         t1_enc_refpass_step(&t1_flags[1 + j][1 + i],
310                             &t1_data[j][i], bpno, one, nmsedec, type, vsc);
311       }
312     }
313   }
314 }
315
316 void t1_dec_refpass(int w, int h, int bpno, char type, int cblksty)
317 {
318   int i, j, k, one, poshalf, neghalf;
319   int vsc;
320   one = 1 << bpno;
321   poshalf = one >> 1;
322   neghalf = bpno > 0 ? -poshalf : -1;
323   for (k = 0; k < h; k += 4) {
324     for (i = 0; i < w; i++) {
325       for (j = k; j < k + 4 && j < h; j++) {
326         vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
327                && (j == k + 3 || j == h - 1)) ? 1 : 0;
328         t1_dec_refpass_step(&t1_flags[1 + j][1 + i],
329                             &t1_data[j][i], poshalf, neghalf, type, vsc);
330       }
331     }
332   }
333 }                               /* VSC and  BYPASS by Antonin */
334
335 void t1_enc_clnpass_step(int *fp, int *dp, int orient, int bpno, int one,
336                          int *nmsedec, int partial, int vsc)
337 {
338   int v, flag;
339   flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
340     : (*fp);
341   if (partial)
342     goto label_partial;
343   if (!(*fp & (T1_SIG | T1_VISIT))) {
344     mqc_setcurctx(t1_getctxno_zc(flag, orient));
345     v = int_abs(*dp) & one ? 1 : 0;
346     mqc_encode(v);
347     if (v) {
348     label_partial:
349       *nmsedec +=
350         t1_getnmsedec_sig(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
351       mqc_setcurctx(t1_getctxno_sc(flag));
352       v = *dp < 0 ? 1 : 0;
353       mqc_encode(v ^ t1_getspb(flag));
354       t1_updateflags(fp, v);
355       *fp |= T1_SIG;
356     }
357   }
358   *fp &= ~T1_VISIT;
359 }
360
361 void t1_dec_clnpass_step(int *fp, int *dp, int orient, int oneplushalf,
362                          int partial, int vsc)
363 {
364   int v, flag;
365   flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
366     : (*fp);
367   if (partial)
368     goto label_partial;
369   if (!(flag & (T1_SIG | T1_VISIT))) {
370     mqc_setcurctx(t1_getctxno_zc(flag, orient));
371     if (mqc_decode()) {
372     label_partial:
373       mqc_setcurctx(t1_getctxno_sc(flag));
374       v = mqc_decode() ^ t1_getspb(flag);
375       *dp = v ? -oneplushalf : oneplushalf;
376       t1_updateflags(fp, v);
377       *fp |= T1_SIG;
378     }
379   }
380   *fp &= ~T1_VISIT;
381 }                               /* VSC and  BYPASS by Antonin */
382
383 void t1_enc_clnpass(int w, int h, int bpno, int orient, int *nmsedec,
384                     int cblksty)
385 {
386   int i, j, k, one, agg, runlen, vsc;
387   *nmsedec = 0;
388   one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
389   for (k = 0; k < h; k += 4) {
390     for (i = 0; i < w; i++) {
391       if (k + 3 < h) {
392         if (cblksty & J2K_CCP_CBLKSTY_VSC) {
393           agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
394                   || t1_flags[1 + k + 1][1 +
395                                          i] & (T1_SIG | T1_VISIT |
396                                                T1_SIG_OTH)
397                   || t1_flags[1 + k + 2][1 +
398                                          i] & (T1_SIG | T1_VISIT |
399                                                T1_SIG_OTH)
400                   || (t1_flags[1 + k + 3][1 + i] &
401                       (~
402                        (T1_SIG_S | T1_SIG_SE | T1_SIG_SW |
403                         T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
404         } else {
405           agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
406                   || t1_flags[1 + k + 1][1 +
407                                          i] & (T1_SIG | T1_VISIT |
408                                                T1_SIG_OTH)
409                   || t1_flags[1 + k + 2][1 +
410                                          i] & (T1_SIG | T1_VISIT |
411                                                T1_SIG_OTH)
412                   || t1_flags[1 + k + 3][1 +
413                                          i] & (T1_SIG | T1_VISIT |
414                                                T1_SIG_OTH));
415         }
416       } else {
417         agg = 0;
418       }
419       if (agg) {
420         for (runlen = 0; runlen < 4; runlen++) {
421           if (int_abs(t1_data[k + runlen][i]) & one)
422             break;
423         }
424         mqc_setcurctx(T1_CTXNO_AGG);
425         mqc_encode(runlen != 4);
426         if (runlen == 4) {
427           continue;
428         }
429         mqc_setcurctx(T1_CTXNO_UNI);
430         mqc_encode(runlen >> 1);
431         mqc_encode(runlen & 1);
432       } else {
433         runlen = 0;
434       }
435       for (j = k + runlen; j < k + 4 && j < h; j++) {
436         vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
437                && (j == k + 3 || j == h - 1)) ? 1 : 0;
438         t1_enc_clnpass_step(&t1_flags[1 + j][1 + i],
439                             &t1_data[j][i], orient, bpno, one,
440                             nmsedec, agg && (j == k + runlen), vsc);
441       }
442     }
443   }
444 }
445
446 void t1_dec_clnpass(int w, int h, int bpno, int orient, int cblksty)
447 {
448   int i, j, k, one, half, oneplushalf, agg, runlen, vsc;
449   int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
450   one = 1 << bpno;
451   half = one >> 1;
452   oneplushalf = one | half;
453   for (k = 0; k < h; k += 4) {
454     for (i = 0; i < w; i++) {
455       if (k + 3 < h) {
456         if (cblksty & J2K_CCP_CBLKSTY_VSC) {
457           agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
458                   || t1_flags[1 + k + 1][1 +
459                                          i] & (T1_SIG | T1_VISIT |
460                                                T1_SIG_OTH)
461                   || t1_flags[1 + k + 2][1 +
462                                          i] & (T1_SIG | T1_VISIT |
463                                                T1_SIG_OTH)
464                   || (t1_flags[1 + k + 3][1 + i] &
465                       (~
466                        (T1_SIG_S | T1_SIG_SE | T1_SIG_SW |
467                         T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
468         } else {
469           agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
470                   || t1_flags[1 + k + 1][1 +
471                                          i] & (T1_SIG | T1_VISIT |
472                                                T1_SIG_OTH)
473                   || t1_flags[1 + k + 2][1 +
474                                          i] & (T1_SIG | T1_VISIT |
475                                                T1_SIG_OTH)
476                   || t1_flags[1 + k + 3][1 +
477                                          i] & (T1_SIG | T1_VISIT |
478                                                T1_SIG_OTH));
479         }
480       } else {
481         agg = 0;
482       }
483       if (agg) {
484         mqc_setcurctx(T1_CTXNO_AGG);
485         if (!mqc_decode()) {
486           continue;
487         }
488         mqc_setcurctx(T1_CTXNO_UNI);
489         runlen = mqc_decode();
490         runlen = (runlen << 1) | mqc_decode();
491       } else {
492         runlen = 0;
493       }
494       for (j = k + runlen; j < k + 4 && j < h; j++) {
495         vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
496                && (j == k + 3 || j == h - 1)) ? 1 : 0;
497         t1_dec_clnpass_step(&t1_flags[1 + j][1 + i],
498                             &t1_data[j][i], orient, oneplushalf,
499                             agg && (j == k + runlen), vsc);
500       }
501     }
502   }
503   if (segsym) {
504     int v = 0;
505     mqc_setcurctx(T1_CTXNO_UNI);
506     v = mqc_decode();
507     v = (v << 1) | mqc_decode();
508     v = (v << 1) | mqc_decode();
509     v = (v << 1) | mqc_decode();
510     /*  if (v!=0xa) 
511        {
512        fprintf(stderr, "warning: bad segmentation symbol %x\n",v);
513        } */
514   }
515 }                               /* VSC and  BYPASS by Antonin */
516
517 double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize, int numcomps)       //mod fixed_quality
518 {
519   double w1, w2, wmsedec;
520   if (qmfbid == 1) {
521     w1 = (numcomps > 1) ? mct_getnorm(compno) : 1;
522     w2 = dwt_getnorm(level, orient);
523   } else {                      /* if (qmfbid == 0) */
524     w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1;
525     w2 = dwt_getnorm_real(level, orient);
526   }
527   wmsedec = w1 * w2 * (stepsize / 8192.0) * (1 << bpno);
528   wmsedec *= wmsedec * nmsedec / 8192.0;
529   return wmsedec;
530 }
531
532 void t1_encode_cblk(tcd_cblk_t * cblk, int orient, int compno, int level, int qmfbid, double stepsize, int cblksty, int numcomps, tcd_tile_t * tile)    //mod fixed_quality
533 {
534   int i, j;
535   int w, h;
536   int passno;
537   int bpno, passtype;
538   int max;
539   int nmsedec;
540   double cumwmsedec = 0;
541   char type = T1_TYPE_MQ;
542
543   w = cblk->x1 - cblk->x0;
544   h = cblk->y1 - cblk->y0;
545
546   max = 0;
547   for (j = 0; j < h; j++) {
548     for (i = 0; i < w; i++) {
549       max = int_max(max, int_abs(t1_data[j][i]));
550     }
551   }
552
553   cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
554
555   for (i = 0; i < sizeof(t1_flags) / sizeof(int); i++)
556     ((int *) t1_flags)[i] = 0;
557   bpno = cblk->numbps - 1;
558   passtype = 2;
559
560   mqc_resetstates();
561   mqc_setstate(T1_CTXNO_UNI, 0, 46);
562   mqc_setstate(T1_CTXNO_AGG, 0, 3);
563   mqc_setstate(T1_CTXNO_ZC, 0, 4);
564   mqc_init_enc(cblk->data);
565
566   for (passno = 0; bpno >= 0; passno++) {
567     tcd_pass_t *pass = &cblk->passes[passno];
568     int correction = 3;
569     type = ((bpno < (cblk->numbps - 4)) && (passtype < 2)
570             && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW :
571       T1_TYPE_MQ;
572
573     switch (passtype) {
574     case 0:
575       t1_enc_sigpass(w, h, bpno, orient, &nmsedec, type, cblksty);
576       break;
577     case 1:
578       t1_enc_refpass(w, h, bpno, &nmsedec, type, cblksty);
579       break;
580     case 2:
581       t1_enc_clnpass(w, h, bpno, orient, &nmsedec, cblksty);
582       /* code switch SEGMARK (i.e. SEGSYM) */
583       if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
584         mqc_segmark_enc();
585       break;
586     }
587
588     cumwmsedec += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps);      //mod fixed_quality
589     tile->distotile += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps); //add antonin quality
590
591
592     /* Code switch "RESTART" (i.e. TERMALL) */
593     if ((cblksty & J2K_CCP_CBLKSTY_TERMALL)
594         && !((passtype == 2) && (bpno - 1 < 0))) {
595       if (type == T1_TYPE_RAW) {
596         mqc_flush();
597         correction = 1;
598         /* correction = mqc_bypass_flush_enc(); */
599       } else {                  /* correction = mqc_restart_enc(); */
600         mqc_flush();
601         correction = 1;
602       }
603       pass->term = 1;
604     } else {
605       if (((bpno < (cblk->numbps - 4) && (passtype > 0))
606            || ((bpno == (cblk->numbps - 4)) && (passtype == 2)))
607           && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
608         if (type == T1_TYPE_RAW) {
609           mqc_flush();
610           correction = 1;
611           /* correction = mqc_bypass_flush_enc(); */
612         } else {                /* correction = mqc_restart_enc(); */
613           mqc_flush();
614           correction = 1;
615         }
616         pass->term = 1;
617       } else {
618         pass->term = 0;
619       }
620     }
621
622     if (++passtype == 3) {
623       passtype = 0;
624       bpno--;
625     }
626
627     if (pass->term && bpno > 0) {
628       type = ((bpno < (cblk->numbps - 4)) && (passtype < 2)
629               && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW :
630         T1_TYPE_MQ;
631       if (type == T1_TYPE_RAW)
632         mqc_bypass_init_enc();
633       else
634         mqc_restart_init_enc();
635     }
636
637     pass->distortiondec = cumwmsedec;
638     pass->rate = mqc_numbytes() + correction;   /* FIXME */
639     pass->len =
640       pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
641
642     /* Code-switch "RESET" */
643     if (cblksty & J2K_CCP_CBLKSTY_RESET)
644       mqc_reset_enc();
645   }
646
647   /* Code switch "ERTERM" (i.e. PTERM) */
648   if (cblksty & J2K_CCP_CBLKSTY_PTERM)
649     mqc_erterm_enc();
650   else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
651     mqc_flush();
652
653   cblk->totalpasses = passno;
654 }
655
656 void t1_decode_cblk(tcd_cblk_t * cblk, int orient, int roishift,
657                     int cblksty)
658 {
659   int i;
660   int w, h;
661   int bpno, passtype;
662   int segno, passno;
663   /* add TONY */
664   char type = T1_TYPE_MQ;
665   /* dda */
666
667   for (i = 0; i < sizeof(t1_data) / sizeof(int); i++)
668     ((int *) t1_data)[i] = 0;
669   for (i = 0; i < sizeof(t1_flags) / sizeof(int); i++)
670     ((int *) t1_flags)[i] = 0;
671
672   w = cblk->x1 - cblk->x0;
673   h = cblk->y1 - cblk->y0;
674   bpno = roishift + cblk->numbps - 1;
675   passtype = 2;
676
677   mqc_resetstates();
678   mqc_setstate(T1_CTXNO_UNI, 0, 46);
679   mqc_setstate(T1_CTXNO_AGG, 0, 3);
680   mqc_setstate(T1_CTXNO_ZC, 0, 4);
681
682   for (segno = 0; segno < cblk->numsegs; segno++) {
683     tcd_seg_t *seg = &cblk->segs[segno];
684
685     /* add TONY */
686     type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2)
687             && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW :
688       T1_TYPE_MQ;
689     if (type == T1_TYPE_RAW)
690       raw_init_dec(seg->data, seg->len);
691     else
692       mqc_init_dec(seg->data, seg->len);
693     /* dda */
694
695     for (passno = 0; passno < seg->numpasses; passno++) {
696       switch (passtype) {
697       case 0:
698         t1_dec_sigpass(w, h, bpno, orient, type, cblksty);
699         break;
700       case 1:
701         t1_dec_refpass(w, h, bpno, type, cblksty);
702         break;
703       case 2:
704         t1_dec_clnpass(w, h, bpno, orient, cblksty);
705         break;
706       }
707
708       if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ)
709         mqc_reset_enc();
710
711       if (++passtype == 3) {
712         passtype = 0;
713         bpno--;
714       }
715     }
716   }
717 }
718
719 void t1_encode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp)
720 {
721   int compno, resno, bandno, precno, cblkno;
722   int x, y, i, j, orient;
723   tcd_tilecomp_t *tilec;
724   tcd_resolution_t *res;
725   tcd_band_t *band;
726   tcd_precinct_t *prc;
727   tcd_cblk_t *cblk;
728
729   tile->distotile = 0;          //add fixed_quality
730
731   for (compno = 0; compno < tile->numcomps; compno++) {
732     tilec = &tile->comps[compno];
733     for (resno = 0; resno < tilec->numresolutions; resno++) {
734       res = &tilec->resolutions[resno];
735       for (bandno = 0; bandno < res->numbands; bandno++) {
736         band = &res->bands[bandno];
737         for (precno = 0; precno < res->pw * res->ph; precno++) {
738           prc = &band->precincts[precno];
739           for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
740             cblk = &prc->cblks[cblkno];
741
742             if (band->bandno == 0) {
743               x = cblk->x0 - band->x0;
744               y = cblk->y0 - band->y0;
745             } else if (band->bandno == 1) {
746               tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
747               x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
748               y = cblk->y0 - band->y0;
749             } else if (band->bandno == 2) {
750               tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
751               x = cblk->x0 - band->x0;
752               y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
753             } else {            /* if (band->bandno == 3) */
754               tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
755               x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
756               y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
757             }
758
759             if (tcp->tccps[compno].qmfbid == 1) {
760
761               for (j = 0; j < cblk->y1 - cblk->y0; j++) {
762                 for (i = 0; i < cblk->x1 - cblk->x0; i++) {
763                   t1_data[j][i] =
764                     tilec->data[(x + i) +
765                                 (y + j) * (tilec->x1 -
766                                            tilec->
767                                            x0)] << T1_NMSEDEC_FRACBITS;
768                 }
769               }
770             } else if (tcp->tccps[compno].qmfbid == 0) {
771               for (j = 0; j < cblk->y1 - cblk->y0; j++) {
772                 for (i = 0; i < cblk->x1 - cblk->x0; i++) {
773                   t1_data[j][i] =
774                     fix_mul(tilec->
775                             data[x + i +
776                                  (y + j) * (tilec->x1 -
777                                             tilec->
778                                             x0)],
779                             8192 * 8192 /
780                             band->stepsize) >> (13 - T1_NMSEDEC_FRACBITS);
781                 }
782               }
783             }
784             orient = band->bandno;      /* FIXME */
785             if (orient == 2) {
786               orient = 1;
787             } else if (orient == 1) {
788               orient = 2;
789             }
790             t1_encode_cblk(cblk, orient, compno, tilec->numresolutions - 1 - resno, tcp->tccps[compno].qmfbid, band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile);       //mod fixed_quality
791           }                     /* cblkno */
792         }                       /* precno */
793       }                         /* bandno */
794     }                           /* resno  */
795   }                             /* compo  */
796 }
797
798
799 void t1_decode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp)
800 {
801   int compno, resno, bandno, precno, cblkno;
802
803   for (compno = 0; compno < tile->numcomps; compno++) {
804     tcd_tilecomp_t *tilec = &tile->comps[compno];
805     for (resno = 0; resno < tilec->numresolutions; resno++) {
806       tcd_resolution_t *res = &tilec->resolutions[resno];
807       for (bandno = 0; bandno < res->numbands; bandno++) {
808         tcd_band_t *band = &res->bands[bandno];
809         for (precno = 0; precno < res->pw * res->ph; precno++) {
810           tcd_precinct_t *prc = &band->precincts[precno];
811           for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
812             int x, y, i, j, orient;
813             tcd_cblk_t *cblk = &prc->cblks[cblkno];
814             orient = band->bandno;      /* FIXME */
815             if (orient == 2)
816               orient = 1;
817             else if (orient == 1)
818               orient = 2;
819             t1_decode_cblk(cblk, orient,
820                            tcp->tccps[compno].roishift,
821                            tcp->tccps[compno].cblksty);
822             if (band->bandno == 0) {
823               x = cblk->x0 - band->x0;
824               y = cblk->y0 - band->y0;
825             } else if (band->bandno == 1) {
826               tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
827               x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
828               y = cblk->y0 - band->y0;
829             } else if (band->bandno == 2) {
830               tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
831               x = cblk->x0 - band->x0;
832               y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
833             } else {            /* if (band->bandno == 3) */
834               tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
835               x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
836               y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
837             }
838
839             if (tcp->tccps[compno].roishift) {
840               int thresh, val, mag;
841               thresh = 1 << tcp->tccps[compno].roishift;
842               for (j = 0; j < cblk->y1 - cblk->y0; j++) {
843                 for (i = 0; i < cblk->x1 - cblk->x0; i++) {
844                   val = t1_data[j][i];
845                   mag = int_abs(val);
846                   if (mag >= thresh) {
847                     mag >>= tcp->tccps[compno].roishift;
848                     t1_data[j][i] = val < 0 ? -mag : mag;
849                   }
850                 }
851               }
852             }
853
854             if (tcp->tccps[compno].qmfbid == 1) {
855               for (j = 0; j < cblk->y1 - cblk->y0; j++) {
856                 for (i = 0; i < cblk->x1 - cblk->x0; i++) {
857                   tilec->data[x + i +
858                               (y + j) * (tilec->x1 -
859                                          tilec->x0)] = t1_data[j][i];
860                 }
861               }
862             } else {            /* if (tcp->tccps[compno].qmfbid == 0) */
863
864               for (j = 0; j < cblk->y1 - cblk->y0; j++) {
865                 for (i = 0; i < cblk->x1 - cblk->x0; i++) {
866                   if (t1_data[j][i] == 0) {
867                     tilec->data[x + i +
868                                 (y + j) * (tilec->x1 - tilec->x0)] = 0;
869                   } else {
870                     tilec->data[x + i +
871                                 (y + j) * (tilec->x1 -
872                                            tilec->
873                                            x0)] =
874                       fix_mul(t1_data[j][i] << 13, band->stepsize);
875                   }
876                 }
877               }
878             }
879           }
880         }
881       }
882     }
883   }
884 }
885
886 int t1_init_ctxno_zc(int f, int orient)
887 {
888   int h, v, d, n, t, hv;
889   n = 0;
890   h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
891   v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
892   d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) !=
893                                 0) + ((f & T1_SIG_SE) !=
894                                       0) + ((f & T1_SIG_SW) != 0);
895   switch (orient) {
896   case 2:
897     t = h;
898     h = v;
899     v = t;
900   case 0:
901   case 1:
902     if (!h) {
903       if (!v) {
904         if (!d)
905           n = 0;
906         else if (d == 1)
907           n = 1;
908         else
909           n = 2;
910       } else if (v == 1)
911         n = 3;
912       else
913         n = 4;
914     } else if (h == 1) {
915       if (!v) {
916         if (!d)
917           n = 5;
918         else
919           n = 6;
920       } else
921         n = 7;
922     } else
923       n = 8;
924     break;
925   case 3:
926     hv = h + v;
927     if (!d) {
928       if (!hv)
929         n = 0;
930       else if (hv == 1)
931         n = 1;
932       else
933         n = 2;
934     } else if (d == 1) {
935       if (!hv)
936         n = 3;
937       else if (hv == 1)
938         n = 4;
939       else
940         n = 5;
941     } else if (d == 2) {
942       if (!hv)
943         n = 6;
944       else
945         n = 7;
946     } else
947       n = 8;
948     break;
949   }
950   return T1_CTXNO_ZC + n;
951 }
952
953 int t1_init_ctxno_sc(int f)
954 {
955   int hc, vc, n;
956   n = 0;
957   hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
958                 T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
959                1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
960                              (T1_SIG_E | T1_SGN_E)) +
961                             ((f & (T1_SIG_W | T1_SGN_W)) ==
962                              (T1_SIG_W | T1_SGN_W)), 1);
963   vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
964                 T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
965                1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
966                              (T1_SIG_N | T1_SGN_N)) +
967                             ((f & (T1_SIG_S | T1_SGN_S)) ==
968                              (T1_SIG_S | T1_SGN_S)), 1);
969   if (hc < 0) {
970     hc = -hc;
971     vc = -vc;
972   }
973   if (!hc) {
974     if (vc == -1)
975       n = 1;
976     else if (!vc)
977       n = 0;
978     else
979       n = 1;
980   } else if (hc == 1) {
981     if (vc == -1)
982       n = 2;
983     else if (!vc)
984       n = 3;
985     else
986       n = 4;
987   }
988   return T1_CTXNO_SC + n;
989 }
990
991 int t1_init_ctxno_mag(int f)
992 {
993   int n;
994   if (!(f & T1_REFINE))
995     n = (f & (T1_SIG_OTH)) ? 1 : 0;
996   else
997     n = 2;
998   return T1_CTXNO_MAG + n;
999 }
1000
1001 int t1_init_spb(int f)
1002 {
1003   int hc, vc, n;
1004   hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
1005                 T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
1006                1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
1007                              (T1_SIG_E | T1_SGN_E)) +
1008                             ((f & (T1_SIG_W | T1_SGN_W)) ==
1009                              (T1_SIG_W | T1_SGN_W)), 1);
1010   vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
1011                 T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
1012                1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
1013                              (T1_SIG_N | T1_SGN_N)) +
1014                             ((f & (T1_SIG_S | T1_SGN_S)) ==
1015                              (T1_SIG_S | T1_SGN_S)), 1);
1016   if (!hc && !vc)
1017     n = 0;
1018   else
1019     n = (!(hc > 0 || (!hc && vc > 0)));
1020   return n;
1021 }
1022
1023 void t1_init_luts()
1024 {
1025   int i, j;
1026   double u, v, t;
1027   for (j = 0; j < 4; j++) {
1028     for (i = 0; i < 256; ++i) {
1029       t1_lut_ctxno_zc[(j << 8) | i] = t1_init_ctxno_zc(i, j);
1030     }
1031   }
1032   for (i = 0; i < 256; i++) {
1033     t1_lut_ctxno_sc[i] = t1_init_ctxno_sc(i << 4);
1034   }
1035   for (j = 0; j < 2; j++) {
1036     for (i = 0; i < 2048; ++i) {
1037       t1_lut_ctxno_mag[(j << 11) + i] =
1038         t1_init_ctxno_mag((j ? T1_REFINE : 0) | i);
1039     }
1040   }
1041   for (i = 0; i < 256; ++i) {
1042     t1_lut_spb[i] = t1_init_spb(i << 4);
1043   }
1044   /* FIXME FIXME FIXME */
1045   /* printf("nmsedec luts:\n"); */
1046   for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) {
1047     t = i / pow(2, T1_NMSEDEC_FRACBITS);
1048     u = t;
1049     v = t - 1.5;
1050     t1_lut_nmsedec_sig[i] =
1051       int_max(0,
1052               (int) (floor
1053                      ((u * u - v * v) * pow(2,
1054                                             T1_NMSEDEC_FRACBITS) +
1055                       0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
1056     t1_lut_nmsedec_sig0[i] =
1057       int_max(0,
1058               (int) (floor
1059                      ((u * u) * pow(2, T1_NMSEDEC_FRACBITS) +
1060                       0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
1061     u = t - 1.0;
1062     if (i & (1 << (T1_NMSEDEC_BITS - 1))) {
1063       v = t - 1.5;
1064     } else {
1065       v = t - 0.5;
1066     }
1067     t1_lut_nmsedec_ref[i] =
1068       int_max(0,
1069               (int) (floor
1070                      ((u * u - v * v) * pow(2,
1071                                             T1_NMSEDEC_FRACBITS) +
1072                       0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
1073     t1_lut_nmsedec_ref0[i] =
1074       int_max(0,
1075               (int) (floor
1076                      ((u * u) * pow(2, T1_NMSEDEC_FRACBITS) +
1077                       0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
1078   }
1079 }