xref: /aosp_15_r20/external/pdfium/third_party/libopenjpeg/mqc_inl.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker  * The copyright in this software is being made available under the 2-clauses
3*3ac0a46fSAndroid Build Coastguard Worker  * BSD License, included below. This software may be subject to other third
4*3ac0a46fSAndroid Build Coastguard Worker  * party and contributor rights, including patent rights, and no such rights
5*3ac0a46fSAndroid Build Coastguard Worker  * are granted under this license.
6*3ac0a46fSAndroid Build Coastguard Worker  *
7*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2002-2014, Professor Benoit Macq
9*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2001-2003, David Janssens
10*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2002-2003, Yannick Verschueren
11*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2003-2007, Francois-Olivier Devaux
12*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2003-2014, Antonin Descampe
13*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2005, Herve Drolon, FreeImage Team
14*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <[email protected]>
15*3ac0a46fSAndroid Build Coastguard Worker  * All rights reserved.
16*3ac0a46fSAndroid Build Coastguard Worker  *
17*3ac0a46fSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
18*3ac0a46fSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
19*3ac0a46fSAndroid Build Coastguard Worker  * are met:
20*3ac0a46fSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
21*3ac0a46fSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
22*3ac0a46fSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
23*3ac0a46fSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
24*3ac0a46fSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
25*3ac0a46fSAndroid Build Coastguard Worker  *
26*3ac0a46fSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
27*3ac0a46fSAndroid Build Coastguard Worker  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28*3ac0a46fSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29*3ac0a46fSAndroid Build Coastguard Worker  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30*3ac0a46fSAndroid Build Coastguard Worker  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31*3ac0a46fSAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32*3ac0a46fSAndroid Build Coastguard Worker  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33*3ac0a46fSAndroid Build Coastguard Worker  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34*3ac0a46fSAndroid Build Coastguard Worker  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35*3ac0a46fSAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36*3ac0a46fSAndroid Build Coastguard Worker  * POSSIBILITY OF SUCH DAMAGE.
37*3ac0a46fSAndroid Build Coastguard Worker  */
38*3ac0a46fSAndroid Build Coastguard Worker 
39*3ac0a46fSAndroid Build Coastguard Worker #ifndef OPJ_MQC_INL_H
40*3ac0a46fSAndroid Build Coastguard Worker #define OPJ_MQC_INL_H
41*3ac0a46fSAndroid Build Coastguard Worker 
42*3ac0a46fSAndroid Build Coastguard Worker /* For internal use of opj_mqc_decode_macro() */
43*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_mpsexchange_macro(d, curctx, a) \
44*3ac0a46fSAndroid Build Coastguard Worker { \
45*3ac0a46fSAndroid Build Coastguard Worker     if (a < (*curctx)->qeval) { \
46*3ac0a46fSAndroid Build Coastguard Worker         d = !((*curctx)->mps); \
47*3ac0a46fSAndroid Build Coastguard Worker         *curctx = (*curctx)->nlps; \
48*3ac0a46fSAndroid Build Coastguard Worker     } else { \
49*3ac0a46fSAndroid Build Coastguard Worker         d = (*curctx)->mps; \
50*3ac0a46fSAndroid Build Coastguard Worker         *curctx = (*curctx)->nmps; \
51*3ac0a46fSAndroid Build Coastguard Worker     } \
52*3ac0a46fSAndroid Build Coastguard Worker }
53*3ac0a46fSAndroid Build Coastguard Worker 
54*3ac0a46fSAndroid Build Coastguard Worker /* For internal use of opj_mqc_decode_macro() */
55*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_lpsexchange_macro(d, curctx, a) \
56*3ac0a46fSAndroid Build Coastguard Worker { \
57*3ac0a46fSAndroid Build Coastguard Worker     if (a < (*curctx)->qeval) { \
58*3ac0a46fSAndroid Build Coastguard Worker         a = (*curctx)->qeval; \
59*3ac0a46fSAndroid Build Coastguard Worker         d = (*curctx)->mps; \
60*3ac0a46fSAndroid Build Coastguard Worker         *curctx = (*curctx)->nmps; \
61*3ac0a46fSAndroid Build Coastguard Worker     } else { \
62*3ac0a46fSAndroid Build Coastguard Worker         a = (*curctx)->qeval; \
63*3ac0a46fSAndroid Build Coastguard Worker         d = !((*curctx)->mps); \
64*3ac0a46fSAndroid Build Coastguard Worker         *curctx = (*curctx)->nlps; \
65*3ac0a46fSAndroid Build Coastguard Worker     } \
66*3ac0a46fSAndroid Build Coastguard Worker }
67*3ac0a46fSAndroid Build Coastguard Worker 
68*3ac0a46fSAndroid Build Coastguard Worker 
69*3ac0a46fSAndroid Build Coastguard Worker /**
70*3ac0a46fSAndroid Build Coastguard Worker Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
71*3ac0a46fSAndroid Build Coastguard Worker @param mqc MQC handle
72*3ac0a46fSAndroid Build Coastguard Worker @return Returns the decoded symbol (0 or 1)
73*3ac0a46fSAndroid Build Coastguard Worker */
opj_mqc_raw_decode(opj_mqc_t * mqc)74*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_mqc_raw_decode(opj_mqc_t *mqc)
75*3ac0a46fSAndroid Build Coastguard Worker {
76*3ac0a46fSAndroid Build Coastguard Worker     OPJ_UINT32 d;
77*3ac0a46fSAndroid Build Coastguard Worker     if (mqc->ct == 0) {
78*3ac0a46fSAndroid Build Coastguard Worker         /* Given opj_mqc_raw_init_dec() we know that at some point we will */
79*3ac0a46fSAndroid Build Coastguard Worker         /* have a 0xFF 0xFF artificial marker */
80*3ac0a46fSAndroid Build Coastguard Worker         if (mqc->c == 0xff) {
81*3ac0a46fSAndroid Build Coastguard Worker             if (*mqc->bp  > 0x8f) {
82*3ac0a46fSAndroid Build Coastguard Worker                 mqc->c = 0xff;
83*3ac0a46fSAndroid Build Coastguard Worker                 mqc->ct = 8;
84*3ac0a46fSAndroid Build Coastguard Worker             } else {
85*3ac0a46fSAndroid Build Coastguard Worker                 mqc->c = *mqc->bp;
86*3ac0a46fSAndroid Build Coastguard Worker                 mqc->bp ++;
87*3ac0a46fSAndroid Build Coastguard Worker                 mqc->ct = 7;
88*3ac0a46fSAndroid Build Coastguard Worker             }
89*3ac0a46fSAndroid Build Coastguard Worker         } else {
90*3ac0a46fSAndroid Build Coastguard Worker             mqc->c = *mqc->bp;
91*3ac0a46fSAndroid Build Coastguard Worker             mqc->bp ++;
92*3ac0a46fSAndroid Build Coastguard Worker             mqc->ct = 8;
93*3ac0a46fSAndroid Build Coastguard Worker         }
94*3ac0a46fSAndroid Build Coastguard Worker     }
95*3ac0a46fSAndroid Build Coastguard Worker     mqc->ct--;
96*3ac0a46fSAndroid Build Coastguard Worker     d = ((OPJ_UINT32)mqc->c >> mqc->ct) & 0x01U;
97*3ac0a46fSAndroid Build Coastguard Worker 
98*3ac0a46fSAndroid Build Coastguard Worker     return d;
99*3ac0a46fSAndroid Build Coastguard Worker }
100*3ac0a46fSAndroid Build Coastguard Worker 
101*3ac0a46fSAndroid Build Coastguard Worker 
102*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_bytein_macro(mqc, c, ct) \
103*3ac0a46fSAndroid Build Coastguard Worker { \
104*3ac0a46fSAndroid Build Coastguard Worker         OPJ_UINT32 l_c;  \
105*3ac0a46fSAndroid Build Coastguard Worker         /* Given opj_mqc_init_dec() we know that at some point we will */ \
106*3ac0a46fSAndroid Build Coastguard Worker         /* have a 0xFF 0xFF artificial marker */ \
107*3ac0a46fSAndroid Build Coastguard Worker         l_c = *(mqc->bp + 1); \
108*3ac0a46fSAndroid Build Coastguard Worker         if (*mqc->bp == 0xff) { \
109*3ac0a46fSAndroid Build Coastguard Worker             if (l_c > 0x8f) { \
110*3ac0a46fSAndroid Build Coastguard Worker                 c += 0xff00; \
111*3ac0a46fSAndroid Build Coastguard Worker                 ct = 8; \
112*3ac0a46fSAndroid Build Coastguard Worker                 mqc->end_of_byte_stream_counter ++; \
113*3ac0a46fSAndroid Build Coastguard Worker             } else { \
114*3ac0a46fSAndroid Build Coastguard Worker                 mqc->bp++; \
115*3ac0a46fSAndroid Build Coastguard Worker                 c += l_c << 9; \
116*3ac0a46fSAndroid Build Coastguard Worker                 ct = 7; \
117*3ac0a46fSAndroid Build Coastguard Worker             } \
118*3ac0a46fSAndroid Build Coastguard Worker         } else { \
119*3ac0a46fSAndroid Build Coastguard Worker             mqc->bp++; \
120*3ac0a46fSAndroid Build Coastguard Worker             c += l_c << 8; \
121*3ac0a46fSAndroid Build Coastguard Worker             ct = 8; \
122*3ac0a46fSAndroid Build Coastguard Worker         } \
123*3ac0a46fSAndroid Build Coastguard Worker }
124*3ac0a46fSAndroid Build Coastguard Worker 
125*3ac0a46fSAndroid Build Coastguard Worker /* For internal use of opj_mqc_decode_macro() */
126*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_renormd_macro(mqc, a, c, ct) \
127*3ac0a46fSAndroid Build Coastguard Worker { \
128*3ac0a46fSAndroid Build Coastguard Worker     do { \
129*3ac0a46fSAndroid Build Coastguard Worker         if (ct == 0) { \
130*3ac0a46fSAndroid Build Coastguard Worker             opj_mqc_bytein_macro(mqc, c, ct); \
131*3ac0a46fSAndroid Build Coastguard Worker         } \
132*3ac0a46fSAndroid Build Coastguard Worker         a <<= 1; \
133*3ac0a46fSAndroid Build Coastguard Worker         c <<= 1; \
134*3ac0a46fSAndroid Build Coastguard Worker         ct--; \
135*3ac0a46fSAndroid Build Coastguard Worker     } while (a < 0x8000); \
136*3ac0a46fSAndroid Build Coastguard Worker }
137*3ac0a46fSAndroid Build Coastguard Worker 
138*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_decode_macro(d, mqc, curctx, a, c, ct) \
139*3ac0a46fSAndroid Build Coastguard Worker { \
140*3ac0a46fSAndroid Build Coastguard Worker     /* Implements ISO 15444-1 C.3.2 Decoding a decision (DECODE) */ \
141*3ac0a46fSAndroid Build Coastguard Worker     /* Note: alternate "J.2 - Decoding an MPS or an LPS in the */ \
142*3ac0a46fSAndroid Build Coastguard Worker     /* software-conventions decoder" has been tried, but does not bring any */ \
143*3ac0a46fSAndroid Build Coastguard Worker     /* improvement. See https://github.com/uclouvain/openjpeg/issues/921 */ \
144*3ac0a46fSAndroid Build Coastguard Worker     a -= (*curctx)->qeval;  \
145*3ac0a46fSAndroid Build Coastguard Worker     if ((c >> 16) < (*curctx)->qeval) {  \
146*3ac0a46fSAndroid Build Coastguard Worker         opj_mqc_lpsexchange_macro(d, curctx, a);  \
147*3ac0a46fSAndroid Build Coastguard Worker         opj_mqc_renormd_macro(mqc, a, c, ct);  \
148*3ac0a46fSAndroid Build Coastguard Worker     } else {  \
149*3ac0a46fSAndroid Build Coastguard Worker         c -= (*curctx)->qeval << 16;  \
150*3ac0a46fSAndroid Build Coastguard Worker         if ((a & 0x8000) == 0) { \
151*3ac0a46fSAndroid Build Coastguard Worker             opj_mqc_mpsexchange_macro(d, curctx, a); \
152*3ac0a46fSAndroid Build Coastguard Worker             opj_mqc_renormd_macro(mqc, a, c, ct); \
153*3ac0a46fSAndroid Build Coastguard Worker         } else { \
154*3ac0a46fSAndroid Build Coastguard Worker             d = (*curctx)->mps; \
155*3ac0a46fSAndroid Build Coastguard Worker         } \
156*3ac0a46fSAndroid Build Coastguard Worker     } \
157*3ac0a46fSAndroid Build Coastguard Worker }
158*3ac0a46fSAndroid Build Coastguard Worker 
159*3ac0a46fSAndroid Build Coastguard Worker #define DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct) \
160*3ac0a46fSAndroid Build Coastguard Worker         register const opj_mqc_state_t **curctx = mqc->curctx; \
161*3ac0a46fSAndroid Build Coastguard Worker         register OPJ_UINT32 c = mqc->c; \
162*3ac0a46fSAndroid Build Coastguard Worker         register OPJ_UINT32 a = mqc->a; \
163*3ac0a46fSAndroid Build Coastguard Worker         register OPJ_UINT32 ct = mqc->ct
164*3ac0a46fSAndroid Build Coastguard Worker 
165*3ac0a46fSAndroid Build Coastguard Worker #define UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct) \
166*3ac0a46fSAndroid Build Coastguard Worker         mqc->curctx = curctx; \
167*3ac0a46fSAndroid Build Coastguard Worker         mqc->c = c; \
168*3ac0a46fSAndroid Build Coastguard Worker         mqc->a = a; \
169*3ac0a46fSAndroid Build Coastguard Worker         mqc->ct = ct;
170*3ac0a46fSAndroid Build Coastguard Worker 
171*3ac0a46fSAndroid Build Coastguard Worker /**
172*3ac0a46fSAndroid Build Coastguard Worker Input a byte
173*3ac0a46fSAndroid Build Coastguard Worker @param mqc MQC handle
174*3ac0a46fSAndroid Build Coastguard Worker */
opj_mqc_bytein(opj_mqc_t * const mqc)175*3ac0a46fSAndroid Build Coastguard Worker static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc)
176*3ac0a46fSAndroid Build Coastguard Worker {
177*3ac0a46fSAndroid Build Coastguard Worker     opj_mqc_bytein_macro(mqc, mqc->c, mqc->ct);
178*3ac0a46fSAndroid Build Coastguard Worker }
179*3ac0a46fSAndroid Build Coastguard Worker 
180*3ac0a46fSAndroid Build Coastguard Worker /**
181*3ac0a46fSAndroid Build Coastguard Worker Renormalize mqc->a and mqc->c while decoding
182*3ac0a46fSAndroid Build Coastguard Worker @param mqc MQC handle
183*3ac0a46fSAndroid Build Coastguard Worker */
184*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_renormd(mqc) \
185*3ac0a46fSAndroid Build Coastguard Worker     opj_mqc_renormd_macro(mqc, mqc->a, mqc->c, mqc->ct)
186*3ac0a46fSAndroid Build Coastguard Worker 
187*3ac0a46fSAndroid Build Coastguard Worker /**
188*3ac0a46fSAndroid Build Coastguard Worker Decode a symbol
189*3ac0a46fSAndroid Build Coastguard Worker @param d OPJ_UINT32 value where to store the decoded symbol
190*3ac0a46fSAndroid Build Coastguard Worker @param mqc MQC handle
191*3ac0a46fSAndroid Build Coastguard Worker @return Returns the decoded symbol (0 or 1) in d
192*3ac0a46fSAndroid Build Coastguard Worker */
193*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_decode(d, mqc) \
194*3ac0a46fSAndroid Build Coastguard Worker     opj_mqc_decode_macro(d, mqc, mqc->curctx, mqc->a, mqc->c, mqc->ct)
195*3ac0a46fSAndroid Build Coastguard Worker 
196*3ac0a46fSAndroid Build Coastguard Worker /**
197*3ac0a46fSAndroid Build Coastguard Worker Output a byte, doing bit-stuffing if necessary.
198*3ac0a46fSAndroid Build Coastguard Worker After a 0xff byte, the next byte must be smaller than 0x90.
199*3ac0a46fSAndroid Build Coastguard Worker @param mqc MQC handle
200*3ac0a46fSAndroid Build Coastguard Worker */
201*3ac0a46fSAndroid Build Coastguard Worker void opj_mqc_byteout(opj_mqc_t *mqc);
202*3ac0a46fSAndroid Build Coastguard Worker 
203*3ac0a46fSAndroid Build Coastguard Worker /**
204*3ac0a46fSAndroid Build Coastguard Worker Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
205*3ac0a46fSAndroid Build Coastguard Worker @param mqc MQC handle
206*3ac0a46fSAndroid Build Coastguard Worker @param a_ value of mqc->a
207*3ac0a46fSAndroid Build Coastguard Worker @param c_ value of mqc->c_
208*3ac0a46fSAndroid Build Coastguard Worker @param ct_ value of mqc->ct_
209*3ac0a46fSAndroid Build Coastguard Worker */
210*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_renorme_macro(mqc, a_, c_, ct_) \
211*3ac0a46fSAndroid Build Coastguard Worker { \
212*3ac0a46fSAndroid Build Coastguard Worker     do { \
213*3ac0a46fSAndroid Build Coastguard Worker         a_ <<= 1; \
214*3ac0a46fSAndroid Build Coastguard Worker         c_ <<= 1; \
215*3ac0a46fSAndroid Build Coastguard Worker         ct_--; \
216*3ac0a46fSAndroid Build Coastguard Worker         if (ct_ == 0) { \
217*3ac0a46fSAndroid Build Coastguard Worker             mqc->c = c_; \
218*3ac0a46fSAndroid Build Coastguard Worker             opj_mqc_byteout(mqc); \
219*3ac0a46fSAndroid Build Coastguard Worker             c_ = mqc->c; \
220*3ac0a46fSAndroid Build Coastguard Worker             ct_ = mqc->ct; \
221*3ac0a46fSAndroid Build Coastguard Worker         } \
222*3ac0a46fSAndroid Build Coastguard Worker     } while( (a_ & 0x8000) == 0); \
223*3ac0a46fSAndroid Build Coastguard Worker }
224*3ac0a46fSAndroid Build Coastguard Worker 
225*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_codemps_macro(mqc, curctx, a, c, ct) \
226*3ac0a46fSAndroid Build Coastguard Worker { \
227*3ac0a46fSAndroid Build Coastguard Worker     a -= (*curctx)->qeval; \
228*3ac0a46fSAndroid Build Coastguard Worker     if ((a & 0x8000) == 0) { \
229*3ac0a46fSAndroid Build Coastguard Worker         if (a < (*curctx)->qeval) { \
230*3ac0a46fSAndroid Build Coastguard Worker             a = (*curctx)->qeval; \
231*3ac0a46fSAndroid Build Coastguard Worker         } else { \
232*3ac0a46fSAndroid Build Coastguard Worker             c += (*curctx)->qeval; \
233*3ac0a46fSAndroid Build Coastguard Worker         } \
234*3ac0a46fSAndroid Build Coastguard Worker         *curctx = (*curctx)->nmps; \
235*3ac0a46fSAndroid Build Coastguard Worker         opj_mqc_renorme_macro(mqc, a, c, ct); \
236*3ac0a46fSAndroid Build Coastguard Worker     } else { \
237*3ac0a46fSAndroid Build Coastguard Worker         c += (*curctx)->qeval; \
238*3ac0a46fSAndroid Build Coastguard Worker     } \
239*3ac0a46fSAndroid Build Coastguard Worker }
240*3ac0a46fSAndroid Build Coastguard Worker 
241*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_codelps_macro(mqc, curctx, a, c, ct) \
242*3ac0a46fSAndroid Build Coastguard Worker { \
243*3ac0a46fSAndroid Build Coastguard Worker     a -= (*curctx)->qeval; \
244*3ac0a46fSAndroid Build Coastguard Worker     if (a < (*curctx)->qeval) { \
245*3ac0a46fSAndroid Build Coastguard Worker         c += (*curctx)->qeval; \
246*3ac0a46fSAndroid Build Coastguard Worker     } else { \
247*3ac0a46fSAndroid Build Coastguard Worker         a = (*curctx)->qeval; \
248*3ac0a46fSAndroid Build Coastguard Worker     } \
249*3ac0a46fSAndroid Build Coastguard Worker     *curctx = (*curctx)->nlps; \
250*3ac0a46fSAndroid Build Coastguard Worker     opj_mqc_renorme_macro(mqc, a, c, ct); \
251*3ac0a46fSAndroid Build Coastguard Worker }
252*3ac0a46fSAndroid Build Coastguard Worker 
253*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_encode_macro(mqc, curctx, a, c, ct, d) \
254*3ac0a46fSAndroid Build Coastguard Worker { \
255*3ac0a46fSAndroid Build Coastguard Worker     if ((*curctx)->mps == (d)) { \
256*3ac0a46fSAndroid Build Coastguard Worker         opj_mqc_codemps_macro(mqc, curctx, a, c, ct); \
257*3ac0a46fSAndroid Build Coastguard Worker     } else { \
258*3ac0a46fSAndroid Build Coastguard Worker         opj_mqc_codelps_macro(mqc, curctx, a, c, ct); \
259*3ac0a46fSAndroid Build Coastguard Worker     } \
260*3ac0a46fSAndroid Build Coastguard Worker }
261*3ac0a46fSAndroid Build Coastguard Worker 
262*3ac0a46fSAndroid Build Coastguard Worker 
263*3ac0a46fSAndroid Build Coastguard Worker #define opj_mqc_bypass_enc_macro(mqc, c, ct, d) \
264*3ac0a46fSAndroid Build Coastguard Worker {\
265*3ac0a46fSAndroid Build Coastguard Worker     if (ct == BYPASS_CT_INIT) {\
266*3ac0a46fSAndroid Build Coastguard Worker         ct = 8;\
267*3ac0a46fSAndroid Build Coastguard Worker     }\
268*3ac0a46fSAndroid Build Coastguard Worker     ct--;\
269*3ac0a46fSAndroid Build Coastguard Worker     c = c + ((d) << ct);\
270*3ac0a46fSAndroid Build Coastguard Worker     if (ct == 0) {\
271*3ac0a46fSAndroid Build Coastguard Worker         *mqc->bp = (OPJ_BYTE)c;\
272*3ac0a46fSAndroid Build Coastguard Worker         ct = 8;\
273*3ac0a46fSAndroid Build Coastguard Worker         /* If the previous byte was 0xff, make sure that the next msb is 0 */ \
274*3ac0a46fSAndroid Build Coastguard Worker         if (*mqc->bp == 0xff) {\
275*3ac0a46fSAndroid Build Coastguard Worker             ct = 7;\
276*3ac0a46fSAndroid Build Coastguard Worker         }\
277*3ac0a46fSAndroid Build Coastguard Worker         mqc->bp++;\
278*3ac0a46fSAndroid Build Coastguard Worker         c = 0;\
279*3ac0a46fSAndroid Build Coastguard Worker     }\
280*3ac0a46fSAndroid Build Coastguard Worker }
281*3ac0a46fSAndroid Build Coastguard Worker 
282*3ac0a46fSAndroid Build Coastguard Worker #endif /* OPJ_MQC_INL_H */
283