mqc.c revision ee451cb395940862dad63c85adfe8f2fd55e864c
1/*
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.
6 *
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) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
15 * All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
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.
25 *
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.
37 */
38
39#include "opj_includes.h"
40
41/** @defgroup MQC MQC - Implementation of an MQ-Coder */
42/*@{*/
43
44/** @name Local static functions */
45/*@{*/
46
47/**
48Output a byte, doing bit-stuffing if necessary.
49After a 0xff byte, the next byte must be smaller than 0x90.
50@param mqc MQC handle
51*/
52static void opj_mqc_byteout(opj_mqc_t *mqc);
53/**
54Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
55@param mqc MQC handle
56*/
57static void opj_mqc_renorme(opj_mqc_t *mqc);
58/**
59Encode the most probable symbol
60@param mqc MQC handle
61*/
62static void opj_mqc_codemps(opj_mqc_t *mqc);
63/**
64Encode the most least symbol
65@param mqc MQC handle
66*/
67static void opj_mqc_codelps(opj_mqc_t *mqc);
68/**
69Fill mqc->c with 1's for flushing
70@param mqc MQC handle
71*/
72static void opj_mqc_setbits(opj_mqc_t *mqc);
73/**
74FIXME DOC
75@param mqc MQC handle
76@return
77*/
78static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc);
79/**
80FIXME DOC
81@param mqc MQC handle
82@return
83*/
84static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc);
85/**
86Input a byte
87@param mqc MQC handle
88*/
89static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc);
90/**
91Renormalize mqc->a and mqc->c while decoding
92@param mqc MQC handle
93*/
94static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc);
95/*@}*/
96
97/*@}*/
98
99/* <summary> */
100/* This array defines all the possible states for a context. */
101/* </summary> */
102static opj_mqc_state_t mqc_states[47 * 2] = {
103	{0x5601, 0, &mqc_states[2], &mqc_states[3]},
104	{0x5601, 1, &mqc_states[3], &mqc_states[2]},
105	{0x3401, 0, &mqc_states[4], &mqc_states[12]},
106	{0x3401, 1, &mqc_states[5], &mqc_states[13]},
107	{0x1801, 0, &mqc_states[6], &mqc_states[18]},
108	{0x1801, 1, &mqc_states[7], &mqc_states[19]},
109	{0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
110	{0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
111	{0x0521, 0, &mqc_states[10], &mqc_states[58]},
112	{0x0521, 1, &mqc_states[11], &mqc_states[59]},
113	{0x0221, 0, &mqc_states[76], &mqc_states[66]},
114	{0x0221, 1, &mqc_states[77], &mqc_states[67]},
115	{0x5601, 0, &mqc_states[14], &mqc_states[13]},
116	{0x5601, 1, &mqc_states[15], &mqc_states[12]},
117	{0x5401, 0, &mqc_states[16], &mqc_states[28]},
118	{0x5401, 1, &mqc_states[17], &mqc_states[29]},
119	{0x4801, 0, &mqc_states[18], &mqc_states[28]},
120	{0x4801, 1, &mqc_states[19], &mqc_states[29]},
121	{0x3801, 0, &mqc_states[20], &mqc_states[28]},
122	{0x3801, 1, &mqc_states[21], &mqc_states[29]},
123	{0x3001, 0, &mqc_states[22], &mqc_states[34]},
124	{0x3001, 1, &mqc_states[23], &mqc_states[35]},
125	{0x2401, 0, &mqc_states[24], &mqc_states[36]},
126	{0x2401, 1, &mqc_states[25], &mqc_states[37]},
127	{0x1c01, 0, &mqc_states[26], &mqc_states[40]},
128	{0x1c01, 1, &mqc_states[27], &mqc_states[41]},
129	{0x1601, 0, &mqc_states[58], &mqc_states[42]},
130	{0x1601, 1, &mqc_states[59], &mqc_states[43]},
131	{0x5601, 0, &mqc_states[30], &mqc_states[29]},
132	{0x5601, 1, &mqc_states[31], &mqc_states[28]},
133	{0x5401, 0, &mqc_states[32], &mqc_states[28]},
134	{0x5401, 1, &mqc_states[33], &mqc_states[29]},
135	{0x5101, 0, &mqc_states[34], &mqc_states[30]},
136	{0x5101, 1, &mqc_states[35], &mqc_states[31]},
137	{0x4801, 0, &mqc_states[36], &mqc_states[32]},
138	{0x4801, 1, &mqc_states[37], &mqc_states[33]},
139	{0x3801, 0, &mqc_states[38], &mqc_states[34]},
140	{0x3801, 1, &mqc_states[39], &mqc_states[35]},
141	{0x3401, 0, &mqc_states[40], &mqc_states[36]},
142	{0x3401, 1, &mqc_states[41], &mqc_states[37]},
143	{0x3001, 0, &mqc_states[42], &mqc_states[38]},
144	{0x3001, 1, &mqc_states[43], &mqc_states[39]},
145	{0x2801, 0, &mqc_states[44], &mqc_states[38]},
146	{0x2801, 1, &mqc_states[45], &mqc_states[39]},
147	{0x2401, 0, &mqc_states[46], &mqc_states[40]},
148	{0x2401, 1, &mqc_states[47], &mqc_states[41]},
149	{0x2201, 0, &mqc_states[48], &mqc_states[42]},
150	{0x2201, 1, &mqc_states[49], &mqc_states[43]},
151	{0x1c01, 0, &mqc_states[50], &mqc_states[44]},
152	{0x1c01, 1, &mqc_states[51], &mqc_states[45]},
153	{0x1801, 0, &mqc_states[52], &mqc_states[46]},
154	{0x1801, 1, &mqc_states[53], &mqc_states[47]},
155	{0x1601, 0, &mqc_states[54], &mqc_states[48]},
156	{0x1601, 1, &mqc_states[55], &mqc_states[49]},
157	{0x1401, 0, &mqc_states[56], &mqc_states[50]},
158	{0x1401, 1, &mqc_states[57], &mqc_states[51]},
159	{0x1201, 0, &mqc_states[58], &mqc_states[52]},
160	{0x1201, 1, &mqc_states[59], &mqc_states[53]},
161	{0x1101, 0, &mqc_states[60], &mqc_states[54]},
162	{0x1101, 1, &mqc_states[61], &mqc_states[55]},
163	{0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
164	{0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
165	{0x09c1, 0, &mqc_states[64], &mqc_states[58]},
166	{0x09c1, 1, &mqc_states[65], &mqc_states[59]},
167	{0x08a1, 0, &mqc_states[66], &mqc_states[60]},
168	{0x08a1, 1, &mqc_states[67], &mqc_states[61]},
169	{0x0521, 0, &mqc_states[68], &mqc_states[62]},
170	{0x0521, 1, &mqc_states[69], &mqc_states[63]},
171	{0x0441, 0, &mqc_states[70], &mqc_states[64]},
172	{0x0441, 1, &mqc_states[71], &mqc_states[65]},
173	{0x02a1, 0, &mqc_states[72], &mqc_states[66]},
174	{0x02a1, 1, &mqc_states[73], &mqc_states[67]},
175	{0x0221, 0, &mqc_states[74], &mqc_states[68]},
176	{0x0221, 1, &mqc_states[75], &mqc_states[69]},
177	{0x0141, 0, &mqc_states[76], &mqc_states[70]},
178	{0x0141, 1, &mqc_states[77], &mqc_states[71]},
179	{0x0111, 0, &mqc_states[78], &mqc_states[72]},
180	{0x0111, 1, &mqc_states[79], &mqc_states[73]},
181	{0x0085, 0, &mqc_states[80], &mqc_states[74]},
182	{0x0085, 1, &mqc_states[81], &mqc_states[75]},
183	{0x0049, 0, &mqc_states[82], &mqc_states[76]},
184	{0x0049, 1, &mqc_states[83], &mqc_states[77]},
185	{0x0025, 0, &mqc_states[84], &mqc_states[78]},
186	{0x0025, 1, &mqc_states[85], &mqc_states[79]},
187	{0x0015, 0, &mqc_states[86], &mqc_states[80]},
188	{0x0015, 1, &mqc_states[87], &mqc_states[81]},
189	{0x0009, 0, &mqc_states[88], &mqc_states[82]},
190	{0x0009, 1, &mqc_states[89], &mqc_states[83]},
191	{0x0005, 0, &mqc_states[90], &mqc_states[84]},
192	{0x0005, 1, &mqc_states[91], &mqc_states[85]},
193	{0x0001, 0, &mqc_states[90], &mqc_states[86]},
194	{0x0001, 1, &mqc_states[91], &mqc_states[87]},
195	{0x5601, 0, &mqc_states[92], &mqc_states[92]},
196	{0x5601, 1, &mqc_states[93], &mqc_states[93]},
197};
198
199/*
200==========================================================
201   local functions
202==========================================================
203*/
204
205void opj_mqc_byteout(opj_mqc_t *mqc) {
206	if (*mqc->bp == 0xff) {
207		mqc->bp++;
208		*mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
209		mqc->c &= 0xfffff;
210		mqc->ct = 7;
211	} else {
212		if ((mqc->c & 0x8000000) == 0) {	/* ((mqc->c&0x8000000)==0) CHANGE */
213			mqc->bp++;
214			*mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
215			mqc->c &= 0x7ffff;
216			mqc->ct = 8;
217		} else {
218			(*mqc->bp)++;
219			if (*mqc->bp == 0xff) {
220				mqc->c &= 0x7ffffff;
221				mqc->bp++;
222				*mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
223				mqc->c &= 0xfffff;
224				mqc->ct = 7;
225			} else {
226				mqc->bp++;
227				*mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
228				mqc->c &= 0x7ffff;
229				mqc->ct = 8;
230			}
231		}
232	}
233}
234
235void opj_mqc_renorme(opj_mqc_t *mqc) {
236	do {
237		mqc->a <<= 1;
238		mqc->c <<= 1;
239		mqc->ct--;
240		if (mqc->ct == 0) {
241			opj_mqc_byteout(mqc);
242		}
243	} while ((mqc->a & 0x8000) == 0);
244}
245
246void opj_mqc_codemps(opj_mqc_t *mqc) {
247	mqc->a -= (*mqc->curctx)->qeval;
248	if ((mqc->a & 0x8000) == 0) {
249		if (mqc->a < (*mqc->curctx)->qeval) {
250			mqc->a = (*mqc->curctx)->qeval;
251		} else {
252			mqc->c += (*mqc->curctx)->qeval;
253		}
254		*mqc->curctx = (*mqc->curctx)->nmps;
255		opj_mqc_renorme(mqc);
256	} else {
257		mqc->c += (*mqc->curctx)->qeval;
258	}
259}
260
261void opj_mqc_codelps(opj_mqc_t *mqc) {
262	mqc->a -= (*mqc->curctx)->qeval;
263	if (mqc->a < (*mqc->curctx)->qeval) {
264		mqc->c += (*mqc->curctx)->qeval;
265	} else {
266		mqc->a = (*mqc->curctx)->qeval;
267	}
268	*mqc->curctx = (*mqc->curctx)->nlps;
269	opj_mqc_renorme(mqc);
270}
271
272void opj_mqc_setbits(opj_mqc_t *mqc) {
273	OPJ_UINT32 tempc = mqc->c + mqc->a;
274	mqc->c |= 0xffff;
275	if (mqc->c >= tempc) {
276		mqc->c -= 0x8000;
277	}
278}
279
280static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc) {
281	OPJ_INT32 d;
282	if (mqc->a < (*mqc->curctx)->qeval) {
283		d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
284		*mqc->curctx = (*mqc->curctx)->nlps;
285	} else {
286		d = (OPJ_INT32)(*mqc->curctx)->mps;
287		*mqc->curctx = (*mqc->curctx)->nmps;
288	}
289
290	return d;
291}
292
293static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc) {
294	OPJ_INT32 d;
295	if (mqc->a < (*mqc->curctx)->qeval) {
296		mqc->a = (*mqc->curctx)->qeval;
297		d = (OPJ_INT32)(*mqc->curctx)->mps;
298		*mqc->curctx = (*mqc->curctx)->nmps;
299	} else {
300		mqc->a = (*mqc->curctx)->qeval;
301		d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
302		*mqc->curctx = (*mqc->curctx)->nlps;
303	}
304
305	return d;
306}
307
308#ifdef MQC_PERF_OPT
309static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) {
310	unsigned int i = *((unsigned int *) mqc->bp);
311	mqc->c += i & 0xffff00;
312	mqc->ct = i & 0x0f;
313	mqc->bp += (i >> 2) & 0x04;
314}
315#else
316static void opj_mqc_bytein(opj_mqc_t *const mqc) {
317	if (mqc->bp != mqc->end) {
318		OPJ_UINT32 c;
319		if (mqc->bp + 1 != mqc->end) {
320			c = *(mqc->bp + 1);
321		} else {
322			c = 0xff;
323		}
324		if (*mqc->bp == 0xff) {
325			if (c > 0x8f) {
326				mqc->c += 0xff00;
327				mqc->ct = 8;
328			} else {
329				mqc->bp++;
330				mqc->c += c << 9;
331				mqc->ct = 7;
332			}
333		} else {
334			mqc->bp++;
335			mqc->c += c << 8;
336			mqc->ct = 8;
337		}
338	} else {
339		mqc->c += 0xff00;
340		mqc->ct = 8;
341	}
342}
343#endif
344
345static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc) {
346	do {
347		if (mqc->ct == 0) {
348			opj_mqc_bytein(mqc);
349		}
350		mqc->a <<= 1;
351		mqc->c <<= 1;
352		mqc->ct--;
353	} while (mqc->a < 0x8000);
354}
355
356/*
357==========================================================
358   MQ-Coder interface
359==========================================================
360*/
361
362opj_mqc_t* opj_mqc_create(void) {
363	opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
364#ifdef MQC_PERF_OPT
365	mqc->buffer = NULL;
366#endif
367	return mqc;
368}
369
370void opj_mqc_destroy(opj_mqc_t *mqc) {
371	if(mqc) {
372#ifdef MQC_PERF_OPT
373		opj_free(mqc->buffer);
374#endif
375		opj_free(mqc);
376	}
377}
378
379OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc) {
380	const ptrdiff_t diff = mqc->bp - mqc->start;
381#if 0
382  assert( diff <= 0xffffffff && diff >= 0 ); /* UINT32_MAX */
383#endif
384	return (OPJ_UINT32)diff;
385}
386
387void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp) {
388    /* TODO MSD: need to take a look to the v2 version */
389	opj_mqc_setcurctx(mqc, 0);
390	mqc->a = 0x8000;
391	mqc->c = 0;
392	mqc->bp = bp - 1;
393	mqc->ct = 12;
394	if (*mqc->bp == 0xff) {
395		mqc->ct = 13;
396	}
397	mqc->start = bp;
398}
399
400void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d) {
401	if ((*mqc->curctx)->mps == d) {
402		opj_mqc_codemps(mqc);
403	} else {
404		opj_mqc_codelps(mqc);
405	}
406}
407
408void opj_mqc_flush(opj_mqc_t *mqc) {
409	opj_mqc_setbits(mqc);
410	mqc->c <<= mqc->ct;
411	opj_mqc_byteout(mqc);
412	mqc->c <<= mqc->ct;
413	opj_mqc_byteout(mqc);
414
415	if (*mqc->bp != 0xff) {
416		mqc->bp++;
417	}
418}
419
420void opj_mqc_bypass_init_enc(opj_mqc_t *mqc) {
421	mqc->c = 0;
422	mqc->ct = 8;
423	/*if (*mqc->bp == 0xff) {
424	mqc->ct = 7;
425     } */
426}
427
428void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d) {
429	mqc->ct--;
430	mqc->c = mqc->c + (d << mqc->ct);
431	if (mqc->ct == 0) {
432		mqc->bp++;
433		*mqc->bp = (OPJ_BYTE)mqc->c;
434		mqc->ct = 8;
435		if (*mqc->bp == 0xff) {
436			mqc->ct = 7;
437		}
438		mqc->c = 0;
439	}
440}
441
442OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc) {
443	OPJ_BYTE bit_padding;
444
445	bit_padding = 0;
446
447	if (mqc->ct != 0) {
448		while (mqc->ct > 0) {
449			mqc->ct--;
450			mqc->c += (OPJ_UINT32)(bit_padding << mqc->ct);
451			bit_padding = (bit_padding + 1) & 0x01;
452		}
453		mqc->bp++;
454		*mqc->bp = (OPJ_BYTE)mqc->c;
455		mqc->ct = 8;
456		mqc->c = 0;
457	}
458
459	return 1;
460}
461
462void opj_mqc_reset_enc(opj_mqc_t *mqc) {
463	opj_mqc_resetstates(mqc);
464	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
465	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
466	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
467}
468
469OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc) {
470	OPJ_UINT32 correction = 1;
471
472	/* <flush part> */
473	OPJ_INT32 n = (OPJ_INT32)(27 - 15 - mqc->ct);
474	mqc->c <<= mqc->ct;
475	while (n > 0) {
476		opj_mqc_byteout(mqc);
477		n -= (OPJ_INT32)mqc->ct;
478		mqc->c <<= mqc->ct;
479	}
480	opj_mqc_byteout(mqc);
481
482	return correction;
483}
484
485void opj_mqc_restart_init_enc(opj_mqc_t *mqc) {
486	/* <Re-init part> */
487	opj_mqc_setcurctx(mqc, 0);
488	mqc->a = 0x8000;
489	mqc->c = 0;
490	mqc->ct = 12;
491	mqc->bp--;
492	if (*mqc->bp == 0xff) {
493		mqc->ct = 13;
494	}
495}
496
497void opj_mqc_erterm_enc(opj_mqc_t *mqc) {
498	OPJ_INT32 k = (OPJ_INT32)(11 - mqc->ct + 1);
499
500	while (k > 0) {
501		mqc->c <<= mqc->ct;
502		mqc->ct = 0;
503		opj_mqc_byteout(mqc);
504		k -= (OPJ_INT32)mqc->ct;
505	}
506
507	if (*mqc->bp != 0xff) {
508		opj_mqc_byteout(mqc);
509	}
510}
511
512void opj_mqc_segmark_enc(opj_mqc_t *mqc) {
513	OPJ_UINT32 i;
514	opj_mqc_setcurctx(mqc, 18);
515
516	for (i = 1; i < 5; i++) {
517		opj_mqc_encode(mqc, i % 2);
518	}
519}
520
521OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len) {
522	opj_mqc_setcurctx(mqc, 0);
523	mqc->start = bp;
524	mqc->end = bp + len;
525	mqc->bp = bp;
526	if (len==0) mqc->c = 0xff << 16;
527	else mqc->c = (OPJ_UINT32)(*mqc->bp << 16);
528
529#ifdef MQC_PERF_OPT /* TODO_MSD: check this option and put in experimental */
530	{
531        OPJ_UINT32 c;
532		OPJ_UINT32 *ip;
533		OPJ_BYTE *end = mqc->end - 1;
534        void* new_buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(OPJ_UINT32));
535        if (! new_buffer) {
536            opj_free(mqc->buffer);
537            mqc->buffer = NULL;
538            return OPJ_FALSE;
539        }
540        mqc->buffer = new_buffer;
541
542        ip = (OPJ_UINT32 *) mqc->buffer;
543
544		while (bp < end) {
545			c = *(bp + 1);
546			if (*bp == 0xff) {
547				if (c > 0x8f) {
548					break;
549				} else {
550					*ip = 0x00000017 | (c << 9);
551				}
552			} else {
553				*ip = 0x00000018 | (c << 8);
554			}
555			bp++;
556			ip++;
557		}
558
559		/* Handle last byte of data */
560		c = 0xff;
561		if (*bp == 0xff) {
562			*ip = 0x0000ff18;
563		} else {
564			bp++;
565			*ip = 0x00000018 | (c << 8);
566		}
567		ip++;
568
569		*ip = 0x0000ff08;
570		mqc->bp = mqc->buffer;
571	}
572#endif
573	opj_mqc_bytein(mqc);
574	mqc->c <<= 7;
575	mqc->ct -= 7;
576	mqc->a = 0x8000;
577        return OPJ_TRUE;
578}
579
580OPJ_INT32 opj_mqc_decode(opj_mqc_t *const mqc) {
581	OPJ_INT32 d;
582	mqc->a -= (*mqc->curctx)->qeval;
583	if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
584		d = opj_mqc_lpsexchange(mqc);
585		opj_mqc_renormd(mqc);
586	} else {
587		mqc->c -= (*mqc->curctx)->qeval << 16;
588		if ((mqc->a & 0x8000) == 0) {
589			d = opj_mqc_mpsexchange(mqc);
590			opj_mqc_renormd(mqc);
591		} else {
592			d = (OPJ_INT32)(*mqc->curctx)->mps;
593		}
594	}
595
596	return d;
597}
598
599void opj_mqc_resetstates(opj_mqc_t *mqc) {
600	OPJ_UINT32 i;
601	for (i = 0; i < MQC_NUMCTXS; i++) {
602		mqc->ctxs[i] = mqc_states;
603	}
604}
605
606void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob) {
607	mqc->ctxs[ctxno] = &mqc_states[msb + (OPJ_UINT32)(prob << 1)];
608}
609
610
611