2 * Copyright (c) 2001-2003, David Janssens
\r
3 * Copyright (c) 2002-2003, Yannick Verschueren
\r
4 * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
\r
5 * Copyright (c) 2005, Hervé Drolon, FreeImage Team
\r
6 * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
\r
7 * All rights reserved.
\r
9 * Redistribution and use in source and binary forms, with or without
\r
10 * modification, are permitted provided that the following conditions
\r
12 * 1. Redistributions of source code must retain the above copyright
\r
13 * notice, this list of conditions and the following disclaimer.
\r
14 * 2. Redistributions in binary form must reproduce the above copyright
\r
15 * notice, this list of conditions and the following disclaimer in the
\r
16 * documentation and/or other materials provided with the distribution.
\r
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
\r
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
\r
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
\r
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
\r
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
\r
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
\r
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
\r
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
\r
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
\r
28 * POSSIBILITY OF SUCH DAMAGE.
\r
31 #include "opj_includes.h"
\r
33 /** @defgroup MQC MQC - Implementation of an MQ-Coder */
\r
36 /** @name Local static functions */
\r
40 Output a byte, doing bit-stuffing if necessary.
\r
41 After a 0xff byte, the next byte must be smaller than 0x90.
\r
42 @param mqc MQC handle
\r
44 static void mqc_byteout(opj_mqc_t *mqc);
\r
46 Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
\r
47 @param mqc MQC handle
\r
49 static void mqc_renorme(opj_mqc_t *mqc);
\r
51 Encode the most probable symbol
\r
52 @param mqc MQC handle
\r
54 static void mqc_codemps(opj_mqc_t *mqc);
\r
56 Encode the most least symbol
\r
57 @param mqc MQC handle
\r
59 static void mqc_codelps(opj_mqc_t *mqc);
\r
61 Fill mqc->c with 1's for flushing
\r
62 @param mqc MQC handle
\r
64 static void mqc_setbits(opj_mqc_t *mqc);
\r
66 FIXME: documentation ???
\r
67 @param mqc MQC handle
\r
70 static int mqc_mpsexchange(opj_mqc_t *mqc);
\r
72 FIXME: documentation ???
\r
73 @param mqc MQC handle
\r
76 static int mqc_lpsexchange(opj_mqc_t *mqc);
\r
79 @param mqc MQC handle
\r
81 static void mqc_bytein(opj_mqc_t *mqc);
\r
83 Renormalize mqc->a and mqc->c while decoding
\r
84 @param mqc MQC handle
\r
86 static void mqc_renormd(opj_mqc_t *mqc);
\r
93 /* This array defines all the possible states for a context. */
\r
95 static opj_mqc_state_t mqc_states[47 * 2] = {
\r
96 {0x5601, 0, &mqc_states[2], &mqc_states[3]},
\r
97 {0x5601, 1, &mqc_states[3], &mqc_states[2]},
\r
98 {0x3401, 0, &mqc_states[4], &mqc_states[12]},
\r
99 {0x3401, 1, &mqc_states[5], &mqc_states[13]},
\r
100 {0x1801, 0, &mqc_states[6], &mqc_states[18]},
\r
101 {0x1801, 1, &mqc_states[7], &mqc_states[19]},
\r
102 {0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
\r
103 {0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
\r
104 {0x0521, 0, &mqc_states[10], &mqc_states[58]},
\r
105 {0x0521, 1, &mqc_states[11], &mqc_states[59]},
\r
106 {0x0221, 0, &mqc_states[76], &mqc_states[66]},
\r
107 {0x0221, 1, &mqc_states[77], &mqc_states[67]},
\r
108 {0x5601, 0, &mqc_states[14], &mqc_states[13]},
\r
109 {0x5601, 1, &mqc_states[15], &mqc_states[12]},
\r
110 {0x5401, 0, &mqc_states[16], &mqc_states[28]},
\r
111 {0x5401, 1, &mqc_states[17], &mqc_states[29]},
\r
112 {0x4801, 0, &mqc_states[18], &mqc_states[28]},
\r
113 {0x4801, 1, &mqc_states[19], &mqc_states[29]},
\r
114 {0x3801, 0, &mqc_states[20], &mqc_states[28]},
\r
115 {0x3801, 1, &mqc_states[21], &mqc_states[29]},
\r
116 {0x3001, 0, &mqc_states[22], &mqc_states[34]},
\r
117 {0x3001, 1, &mqc_states[23], &mqc_states[35]},
\r
118 {0x2401, 0, &mqc_states[24], &mqc_states[36]},
\r
119 {0x2401, 1, &mqc_states[25], &mqc_states[37]},
\r
120 {0x1c01, 0, &mqc_states[26], &mqc_states[40]},
\r
121 {0x1c01, 1, &mqc_states[27], &mqc_states[41]},
\r
122 {0x1601, 0, &mqc_states[58], &mqc_states[42]},
\r
123 {0x1601, 1, &mqc_states[59], &mqc_states[43]},
\r
124 {0x5601, 0, &mqc_states[30], &mqc_states[29]},
\r
125 {0x5601, 1, &mqc_states[31], &mqc_states[28]},
\r
126 {0x5401, 0, &mqc_states[32], &mqc_states[28]},
\r
127 {0x5401, 1, &mqc_states[33], &mqc_states[29]},
\r
128 {0x5101, 0, &mqc_states[34], &mqc_states[30]},
\r
129 {0x5101, 1, &mqc_states[35], &mqc_states[31]},
\r
130 {0x4801, 0, &mqc_states[36], &mqc_states[32]},
\r
131 {0x4801, 1, &mqc_states[37], &mqc_states[33]},
\r
132 {0x3801, 0, &mqc_states[38], &mqc_states[34]},
\r
133 {0x3801, 1, &mqc_states[39], &mqc_states[35]},
\r
134 {0x3401, 0, &mqc_states[40], &mqc_states[36]},
\r
135 {0x3401, 1, &mqc_states[41], &mqc_states[37]},
\r
136 {0x3001, 0, &mqc_states[42], &mqc_states[38]},
\r
137 {0x3001, 1, &mqc_states[43], &mqc_states[39]},
\r
138 {0x2801, 0, &mqc_states[44], &mqc_states[38]},
\r
139 {0x2801, 1, &mqc_states[45], &mqc_states[39]},
\r
140 {0x2401, 0, &mqc_states[46], &mqc_states[40]},
\r
141 {0x2401, 1, &mqc_states[47], &mqc_states[41]},
\r
142 {0x2201, 0, &mqc_states[48], &mqc_states[42]},
\r
143 {0x2201, 1, &mqc_states[49], &mqc_states[43]},
\r
144 {0x1c01, 0, &mqc_states[50], &mqc_states[44]},
\r
145 {0x1c01, 1, &mqc_states[51], &mqc_states[45]},
\r
146 {0x1801, 0, &mqc_states[52], &mqc_states[46]},
\r
147 {0x1801, 1, &mqc_states[53], &mqc_states[47]},
\r
148 {0x1601, 0, &mqc_states[54], &mqc_states[48]},
\r
149 {0x1601, 1, &mqc_states[55], &mqc_states[49]},
\r
150 {0x1401, 0, &mqc_states[56], &mqc_states[50]},
\r
151 {0x1401, 1, &mqc_states[57], &mqc_states[51]},
\r
152 {0x1201, 0, &mqc_states[58], &mqc_states[52]},
\r
153 {0x1201, 1, &mqc_states[59], &mqc_states[53]},
\r
154 {0x1101, 0, &mqc_states[60], &mqc_states[54]},
\r
155 {0x1101, 1, &mqc_states[61], &mqc_states[55]},
\r
156 {0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
\r
157 {0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
\r
158 {0x09c1, 0, &mqc_states[64], &mqc_states[58]},
\r
159 {0x09c1, 1, &mqc_states[65], &mqc_states[59]},
\r
160 {0x08a1, 0, &mqc_states[66], &mqc_states[60]},
\r
161 {0x08a1, 1, &mqc_states[67], &mqc_states[61]},
\r
162 {0x0521, 0, &mqc_states[68], &mqc_states[62]},
\r
163 {0x0521, 1, &mqc_states[69], &mqc_states[63]},
\r
164 {0x0441, 0, &mqc_states[70], &mqc_states[64]},
\r
165 {0x0441, 1, &mqc_states[71], &mqc_states[65]},
\r
166 {0x02a1, 0, &mqc_states[72], &mqc_states[66]},
\r
167 {0x02a1, 1, &mqc_states[73], &mqc_states[67]},
\r
168 {0x0221, 0, &mqc_states[74], &mqc_states[68]},
\r
169 {0x0221, 1, &mqc_states[75], &mqc_states[69]},
\r
170 {0x0141, 0, &mqc_states[76], &mqc_states[70]},
\r
171 {0x0141, 1, &mqc_states[77], &mqc_states[71]},
\r
172 {0x0111, 0, &mqc_states[78], &mqc_states[72]},
\r
173 {0x0111, 1, &mqc_states[79], &mqc_states[73]},
\r
174 {0x0085, 0, &mqc_states[80], &mqc_states[74]},
\r
175 {0x0085, 1, &mqc_states[81], &mqc_states[75]},
\r
176 {0x0049, 0, &mqc_states[82], &mqc_states[76]},
\r
177 {0x0049, 1, &mqc_states[83], &mqc_states[77]},
\r
178 {0x0025, 0, &mqc_states[84], &mqc_states[78]},
\r
179 {0x0025, 1, &mqc_states[85], &mqc_states[79]},
\r
180 {0x0015, 0, &mqc_states[86], &mqc_states[80]},
\r
181 {0x0015, 1, &mqc_states[87], &mqc_states[81]},
\r
182 {0x0009, 0, &mqc_states[88], &mqc_states[82]},
\r
183 {0x0009, 1, &mqc_states[89], &mqc_states[83]},
\r
184 {0x0005, 0, &mqc_states[90], &mqc_states[84]},
\r
185 {0x0005, 1, &mqc_states[91], &mqc_states[85]},
\r
186 {0x0001, 0, &mqc_states[90], &mqc_states[86]},
\r
187 {0x0001, 1, &mqc_states[91], &mqc_states[87]},
\r
188 {0x5601, 0, &mqc_states[92], &mqc_states[92]},
\r
189 {0x5601, 1, &mqc_states[93], &mqc_states[93]},
\r
193 ==========================================================
\r
195 ==========================================================
\r
198 static void mqc_byteout(opj_mqc_t *mqc) {
\r
199 if (*mqc->bp == 0xff) {
\r
201 *mqc->bp = mqc->c >> 20;
\r
205 if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */
\r
207 *mqc->bp = mqc->c >> 19;
\r
212 if (*mqc->bp == 0xff) {
\r
213 mqc->c &= 0x7ffffff;
\r
215 *mqc->bp = mqc->c >> 20;
\r
220 *mqc->bp = mqc->c >> 19;
\r
228 static void mqc_renorme(opj_mqc_t *mqc) {
\r
233 if (mqc->ct == 0) {
\r
236 } while ((mqc->a & 0x8000) == 0);
\r
239 static void mqc_codemps(opj_mqc_t *mqc) {
\r
240 mqc->a -= (*mqc->curctx)->qeval;
\r
241 if ((mqc->a & 0x8000) == 0) {
\r
242 if (mqc->a < (*mqc->curctx)->qeval) {
\r
243 mqc->a = (*mqc->curctx)->qeval;
\r
245 mqc->c += (*mqc->curctx)->qeval;
\r
247 *mqc->curctx = (*mqc->curctx)->nmps;
\r
250 mqc->c += (*mqc->curctx)->qeval;
\r
254 static void mqc_codelps(opj_mqc_t *mqc) {
\r
255 mqc->a -= (*mqc->curctx)->qeval;
\r
256 if (mqc->a < (*mqc->curctx)->qeval) {
\r
257 mqc->c += (*mqc->curctx)->qeval;
\r
259 mqc->a = (*mqc->curctx)->qeval;
\r
261 *mqc->curctx = (*mqc->curctx)->nlps;
\r
265 static void mqc_setbits(opj_mqc_t *mqc) {
\r
266 unsigned int tempc = mqc->c + mqc->a;
\r
268 if (mqc->c >= tempc) {
\r
273 static int mqc_mpsexchange(opj_mqc_t *mqc) {
\r
275 if (mqc->a < (*mqc->curctx)->qeval) {
\r
276 d = 1 - (*mqc->curctx)->mps;
\r
277 *mqc->curctx = (*mqc->curctx)->nlps;
\r
279 d = (*mqc->curctx)->mps;
\r
280 *mqc->curctx = (*mqc->curctx)->nmps;
\r
286 static int mqc_lpsexchange(opj_mqc_t *mqc) {
\r
288 if (mqc->a < (*mqc->curctx)->qeval) {
\r
289 mqc->a = (*mqc->curctx)->qeval;
\r
290 d = (*mqc->curctx)->mps;
\r
291 *mqc->curctx = (*mqc->curctx)->nmps;
\r
293 mqc->a = (*mqc->curctx)->qeval;
\r
294 d = 1 - (*mqc->curctx)->mps;
\r
295 *mqc->curctx = (*mqc->curctx)->nlps;
\r
301 static void mqc_bytein(opj_mqc_t *mqc) {
\r
302 if (mqc->bp != mqc->end) {
\r
304 if (mqc->bp + 1 != mqc->end) {
\r
305 c = *(mqc->bp + 1);
\r
309 if (*mqc->bp == 0xff) {
\r
329 static void mqc_renormd(opj_mqc_t *mqc) {
\r
331 if (mqc->ct == 0) {
\r
337 } while (mqc->a < 0x8000);
\r
341 ==========================================================
\r
343 ==========================================================
\r
346 opj_mqc_t* mqc_create() {
\r
347 opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
\r
351 void mqc_destroy(opj_mqc_t *mqc) {
\r
357 int mqc_numbytes(opj_mqc_t *mqc) {
\r
358 return mqc->bp - mqc->start;
\r
361 void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) {
\r
362 mqc_setcurctx(mqc, 0);
\r
367 if (*mqc->bp == 0xff) {
\r
373 void mqc_setcurctx(opj_mqc_t *mqc, int ctxno) {
\r
374 mqc->curctx = &mqc->ctxs[ctxno];
\r
377 void mqc_encode(opj_mqc_t *mqc, int d) {
\r
378 if ((*mqc->curctx)->mps == d) {
\r
385 void mqc_flush(opj_mqc_t *mqc) {
\r
387 mqc->c <<= mqc->ct;
\r
389 mqc->c <<= mqc->ct;
\r
392 if (*mqc->bp != 0xff) {
\r
397 void mqc_bypass_init_enc(opj_mqc_t *mqc) {
\r
400 /*if (*mqc->bp == 0xff) {
\r
405 void mqc_bypass_enc(opj_mqc_t *mqc, int d) {
\r
407 mqc->c = mqc->c + (d << mqc->ct);
\r
408 if (mqc->ct == 0) {
\r
412 if (*mqc->bp == 0xff) {
\r
419 int mqc_bypass_flush_enc(opj_mqc_t *mqc) {
\r
420 unsigned char bit_padding;
\r
424 if (mqc->ct != 0) {
\r
425 while (mqc->ct > 0) {
\r
427 mqc->c += bit_padding << mqc->ct;
\r
428 bit_padding = (bit_padding + 1) & 0x01;
\r
439 void mqc_reset_enc(opj_mqc_t *mqc) {
\r
440 mqc_resetstates(mqc);
\r
441 mqc_setstate(mqc, 18, 0, 46);
\r
442 mqc_setstate(mqc, 0, 0, 3);
\r
443 mqc_setstate(mqc, 1, 0, 4);
\r
446 int mqc_restart_enc(opj_mqc_t *mqc) {
\r
447 int correction = 1;
\r
450 int n = 27 - 15 - mqc->ct;
\r
451 mqc->c <<= mqc->ct;
\r
455 mqc->c <<= mqc->ct;
\r
462 void mqc_restart_init_enc(opj_mqc_t *mqc) {
\r
463 /* <Re-init part> */
\r
464 mqc_setcurctx(mqc, 0);
\r
469 if (*mqc->bp == 0xff) {
\r
474 void mqc_erterm_enc(opj_mqc_t *mqc) {
\r
475 int k = 11 - mqc->ct + 1;
\r
478 mqc->c <<= mqc->ct;
\r
484 if (*mqc->bp != 0xff) {
\r
489 void mqc_segmark_enc(opj_mqc_t *mqc) {
\r
491 mqc_setcurctx(mqc, 18);
\r
493 for (i = 1; i < 5; i++) {
\r
494 mqc_encode(mqc, i % 2);
\r
498 void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {
\r
499 mqc_setcurctx(mqc, 0);
\r
501 mqc->end = bp + len;
\r
503 if (len==0) mqc->c = 0xff << 16;
\r
504 else mqc->c = *mqc->bp << 16;
\r
511 int mqc_decode(opj_mqc_t *mqc) {
\r
513 mqc->a -= (*mqc->curctx)->qeval;
\r
514 if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
\r
515 d = mqc_lpsexchange(mqc);
\r
518 mqc->c -= (*mqc->curctx)->qeval << 16;
\r
519 if ((mqc->a & 0x8000) == 0) {
\r
520 d = mqc_mpsexchange(mqc);
\r
523 d = (*mqc->curctx)->mps;
\r
530 void mqc_resetstates(opj_mqc_t *mqc) {
\r
532 for (i = 0; i < MQC_NUMCTXS; i++) {
\r
533 mqc->ctxs[i] = mqc_states;
\r
537 void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) {
\r
538 mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
\r