/src/ghostpdl/openjpeg/src/lib/openjp2/mqc_inl.h
Line | Count | Source (jump to first uncovered line) |
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 | | #ifndef OPJ_MQC_INL_H |
40 | | #define OPJ_MQC_INL_H |
41 | | |
42 | | /* For internal use of opj_mqc_decode_macro() */ |
43 | 1.58G | #define opj_mqc_mpsexchange_macro(d, curctx, a) \ |
44 | 1.58G | { \ |
45 | 1.58G | if (a < (*curctx)->qeval) { \ |
46 | 326M | d = !((*curctx)->mps); \ |
47 | 326M | *curctx = (*curctx)->nlps; \ |
48 | 1.25G | } else { \ |
49 | 1.25G | d = (*curctx)->mps; \ |
50 | 1.25G | *curctx = (*curctx)->nmps; \ |
51 | 1.25G | } \ |
52 | 1.58G | } |
53 | | |
54 | | /* For internal use of opj_mqc_decode_macro() */ |
55 | 1.62G | #define opj_mqc_lpsexchange_macro(d, curctx, a) \ |
56 | 1.62G | { \ |
57 | 1.62G | if (a < (*curctx)->qeval) { \ |
58 | 366M | a = (*curctx)->qeval; \ |
59 | 366M | d = (*curctx)->mps; \ |
60 | 366M | *curctx = (*curctx)->nmps; \ |
61 | 1.26G | } else { \ |
62 | 1.26G | a = (*curctx)->qeval; \ |
63 | 1.26G | d = !((*curctx)->mps); \ |
64 | 1.26G | *curctx = (*curctx)->nlps; \ |
65 | 1.26G | } \ |
66 | 1.62G | } |
67 | | |
68 | | |
69 | | /** |
70 | | Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN |
71 | | @param mqc MQC handle |
72 | | @return Returns the decoded symbol (0 or 1) |
73 | | */ |
74 | | static INLINE OPJ_UINT32 opj_mqc_raw_decode(opj_mqc_t *mqc) |
75 | 702k | { |
76 | 702k | OPJ_UINT32 d; |
77 | 702k | if (mqc->ct == 0) { |
78 | | /* Given opj_mqc_raw_init_dec() we know that at some point we will */ |
79 | | /* have a 0xFF 0xFF artificial marker */ |
80 | 87.9k | if (mqc->c == 0xff) { |
81 | 79.1k | if (*mqc->bp > 0x8f) { |
82 | 79.1k | mqc->c = 0xff; |
83 | 79.1k | mqc->ct = 8; |
84 | 79.1k | } else { |
85 | 0 | mqc->c = *mqc->bp; |
86 | 0 | mqc->bp ++; |
87 | 0 | mqc->ct = 7; |
88 | 0 | } |
89 | 79.1k | } else { |
90 | 8.76k | mqc->c = *mqc->bp; |
91 | 8.76k | mqc->bp ++; |
92 | 8.76k | mqc->ct = 8; |
93 | 8.76k | } |
94 | 87.9k | } |
95 | 702k | mqc->ct--; |
96 | 702k | d = ((OPJ_UINT32)mqc->c >> mqc->ct) & 0x01U; |
97 | | |
98 | 702k | return d; |
99 | 702k | } Unexecuted instantiation: cio.c:opj_mqc_raw_decode Unexecuted instantiation: event.c:opj_mqc_raw_decode Unexecuted instantiation: image.c:opj_mqc_raw_decode Unexecuted instantiation: openjpeg.c:opj_mqc_raw_decode Unexecuted instantiation: j2k.c:opj_mqc_raw_decode Unexecuted instantiation: jp2.c:opj_mqc_raw_decode Unexecuted instantiation: mct.c:opj_mqc_raw_decode Unexecuted instantiation: pi.c:opj_mqc_raw_decode Unexecuted instantiation: tcd.c:opj_mqc_raw_decode Unexecuted instantiation: tgt.c:opj_mqc_raw_decode Unexecuted instantiation: thread.c:opj_mqc_raw_decode Unexecuted instantiation: bio.c:opj_mqc_raw_decode Unexecuted instantiation: dwt.c:opj_mqc_raw_decode Unexecuted instantiation: function_list.c:opj_mqc_raw_decode Unexecuted instantiation: invert.c:opj_mqc_raw_decode Line | Count | Source | 75 | 702k | { | 76 | 702k | OPJ_UINT32 d; | 77 | 702k | if (mqc->ct == 0) { | 78 | | /* Given opj_mqc_raw_init_dec() we know that at some point we will */ | 79 | | /* have a 0xFF 0xFF artificial marker */ | 80 | 87.9k | if (mqc->c == 0xff) { | 81 | 79.1k | if (*mqc->bp > 0x8f) { | 82 | 79.1k | mqc->c = 0xff; | 83 | 79.1k | mqc->ct = 8; | 84 | 79.1k | } else { | 85 | 0 | mqc->c = *mqc->bp; | 86 | 0 | mqc->bp ++; | 87 | 0 | mqc->ct = 7; | 88 | 0 | } | 89 | 79.1k | } else { | 90 | 8.76k | mqc->c = *mqc->bp; | 91 | 8.76k | mqc->bp ++; | 92 | 8.76k | mqc->ct = 8; | 93 | 8.76k | } | 94 | 87.9k | } | 95 | 702k | mqc->ct--; | 96 | 702k | d = ((OPJ_UINT32)mqc->c >> mqc->ct) & 0x01U; | 97 | | | 98 | 702k | return d; | 99 | 702k | } |
Unexecuted instantiation: t2.c:opj_mqc_raw_decode Unexecuted instantiation: sparse_array.c:opj_mqc_raw_decode Unexecuted instantiation: ht_dec.c:opj_mqc_raw_decode Unexecuted instantiation: mqc.c:opj_mqc_raw_decode |
100 | | |
101 | | |
102 | 533M | #define opj_mqc_bytein_macro(mqc, c, ct) \ |
103 | 533M | { \ |
104 | 533M | OPJ_UINT32 l_c; \ |
105 | 533M | /* Given opj_mqc_init_dec() we know that at some point we will */ \ |
106 | 533M | /* have a 0xFF 0xFF artificial marker */ \ |
107 | 533M | l_c = *(mqc->bp + 1); \ |
108 | 533M | if (*mqc->bp == 0xff) { \ |
109 | 20.1M | if (l_c > 0x8f) { \ |
110 | 17.9M | c += 0xff00; \ |
111 | 17.9M | ct = 8; \ |
112 | 17.9M | mqc->end_of_byte_stream_counter ++; \ |
113 | 17.9M | } else { \ |
114 | 2.14M | mqc->bp++; \ |
115 | 2.14M | c += l_c << 9; \ |
116 | 2.14M | ct = 7; \ |
117 | 2.14M | } \ |
118 | 513M | } else { \ |
119 | 513M | mqc->bp++; \ |
120 | 513M | c += l_c << 8; \ |
121 | 513M | ct = 8; \ |
122 | 513M | } \ |
123 | 533M | } |
124 | | |
125 | | /* For internal use of opj_mqc_decode_macro() */ |
126 | 3.20G | #define opj_mqc_renormd_macro(mqc, a, c, ct) \ |
127 | 3.20G | { \ |
128 | 4.25G | do { \ |
129 | 4.25G | if (ct == 0) { \ |
130 | 532M | opj_mqc_bytein_macro(mqc, c, ct); \ |
131 | 532M | } \ |
132 | 4.25G | a <<= 1; \ |
133 | 4.25G | c <<= 1; \ |
134 | 4.25G | ct--; \ |
135 | 4.25G | } while (a < 0x8000); \ |
136 | 3.20G | } |
137 | | |
138 | 6.33G | #define opj_mqc_decode_macro(d, mqc, curctx, a, c, ct) \ |
139 | 6.33G | { \ |
140 | 6.33G | /* Implements ISO 15444-1 C.3.2 Decoding a decision (DECODE) */ \ |
141 | 6.33G | /* Note: alternate "J.2 - Decoding an MPS or an LPS in the */ \ |
142 | 6.33G | /* software-conventions decoder" has been tried, but does not bring any */ \ |
143 | 6.33G | /* improvement. See https://github.com/uclouvain/openjpeg/issues/921 */ \ |
144 | 6.33G | a -= (*curctx)->qeval; \ |
145 | 6.33G | if ((c >> 16) < (*curctx)->qeval) { \ |
146 | 1.62G | opj_mqc_lpsexchange_macro(d, curctx, a); \ |
147 | 1.62G | opj_mqc_renormd_macro(mqc, a, c, ct); \ |
148 | 4.70G | } else { \ |
149 | 4.70G | c -= (*curctx)->qeval << 16; \ |
150 | 4.70G | if ((a & 0x8000) == 0) { \ |
151 | 1.58G | opj_mqc_mpsexchange_macro(d, curctx, a); \ |
152 | 1.58G | opj_mqc_renormd_macro(mqc, a, c, ct); \ |
153 | 3.12G | } else { \ |
154 | 3.12G | d = (*curctx)->mps; \ |
155 | 3.12G | } \ |
156 | 4.70G | } \ |
157 | 6.33G | } |
158 | | |
159 | | #define DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct) \ |
160 | 11.7M | register const opj_mqc_state_t **curctx = mqc->curctx; \ |
161 | 11.7M | register OPJ_UINT32 c = mqc->c; \ |
162 | 11.7M | register OPJ_UINT32 a = mqc->a; \ |
163 | 11.7M | register OPJ_UINT32 ct = mqc->ct |
164 | | |
165 | | #define UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct) \ |
166 | 11.7M | mqc->curctx = curctx; \ |
167 | 11.7M | mqc->c = c; \ |
168 | 11.7M | mqc->a = a; \ |
169 | 11.7M | mqc->ct = ct; |
170 | | |
171 | | /** |
172 | | Input a byte |
173 | | @param mqc MQC handle |
174 | | */ |
175 | | static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) |
176 | 1.06M | { |
177 | 1.06M | opj_mqc_bytein_macro(mqc, mqc->c, mqc->ct); |
178 | 1.06M | } Unexecuted instantiation: cio.c:opj_mqc_bytein Unexecuted instantiation: event.c:opj_mqc_bytein Unexecuted instantiation: image.c:opj_mqc_bytein Unexecuted instantiation: openjpeg.c:opj_mqc_bytein Unexecuted instantiation: j2k.c:opj_mqc_bytein Unexecuted instantiation: jp2.c:opj_mqc_bytein Unexecuted instantiation: mct.c:opj_mqc_bytein Unexecuted instantiation: pi.c:opj_mqc_bytein Unexecuted instantiation: tcd.c:opj_mqc_bytein Unexecuted instantiation: tgt.c:opj_mqc_bytein Unexecuted instantiation: thread.c:opj_mqc_bytein Unexecuted instantiation: bio.c:opj_mqc_bytein Unexecuted instantiation: dwt.c:opj_mqc_bytein Unexecuted instantiation: function_list.c:opj_mqc_bytein Unexecuted instantiation: invert.c:opj_mqc_bytein Unexecuted instantiation: t1.c:opj_mqc_bytein Unexecuted instantiation: t2.c:opj_mqc_bytein Unexecuted instantiation: sparse_array.c:opj_mqc_bytein Unexecuted instantiation: ht_dec.c:opj_mqc_bytein Line | Count | Source | 176 | 1.06M | { | 177 | 1.06M | opj_mqc_bytein_macro(mqc, mqc->c, mqc->ct); | 178 | 1.06M | } |
|
179 | | |
180 | | /** |
181 | | Renormalize mqc->a and mqc->c while decoding |
182 | | @param mqc MQC handle |
183 | | */ |
184 | | #define opj_mqc_renormd(mqc) \ |
185 | | opj_mqc_renormd_macro(mqc, mqc->a, mqc->c, mqc->ct) |
186 | | |
187 | | /** |
188 | | Decode a symbol |
189 | | @param d OPJ_UINT32 value where to store the decoded symbol |
190 | | @param mqc MQC handle |
191 | | @return Returns the decoded symbol (0 or 1) in d |
192 | | */ |
193 | | #define opj_mqc_decode(d, mqc) \ |
194 | 0 | opj_mqc_decode_macro(d, mqc, mqc->curctx, mqc->a, mqc->c, mqc->ct) |
195 | | |
196 | | /** |
197 | | Output a byte, doing bit-stuffing if necessary. |
198 | | After a 0xff byte, the next byte must be smaller than 0x90. |
199 | | @param mqc MQC handle |
200 | | */ |
201 | | void opj_mqc_byteout(opj_mqc_t *mqc); |
202 | | |
203 | | /** |
204 | | Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000 |
205 | | @param mqc MQC handle |
206 | | @param a_ value of mqc->a |
207 | | @param c_ value of mqc->c_ |
208 | | @param ct_ value of mqc->ct_ |
209 | | */ |
210 | 0 | #define opj_mqc_renorme_macro(mqc, a_, c_, ct_) \ |
211 | 0 | { \ |
212 | 0 | do { \ |
213 | 0 | a_ <<= 1; \ |
214 | 0 | c_ <<= 1; \ |
215 | 0 | ct_--; \ |
216 | 0 | if (ct_ == 0) { \ |
217 | 0 | mqc->c = c_; \ |
218 | 0 | opj_mqc_byteout(mqc); \ |
219 | 0 | c_ = mqc->c; \ |
220 | 0 | ct_ = mqc->ct; \ |
221 | 0 | } \ |
222 | 0 | } while( (a_ & 0x8000) == 0); \ |
223 | 0 | } |
224 | | |
225 | 0 | #define opj_mqc_codemps_macro(mqc, curctx, a, c, ct) \ |
226 | 0 | { \ |
227 | 0 | a -= (*curctx)->qeval; \ |
228 | 0 | if ((a & 0x8000) == 0) { \ |
229 | 0 | if (a < (*curctx)->qeval) { \ |
230 | 0 | a = (*curctx)->qeval; \ |
231 | 0 | } else { \ |
232 | 0 | c += (*curctx)->qeval; \ |
233 | 0 | } \ |
234 | 0 | *curctx = (*curctx)->nmps; \ |
235 | 0 | opj_mqc_renorme_macro(mqc, a, c, ct); \ |
236 | 0 | } else { \ |
237 | 0 | c += (*curctx)->qeval; \ |
238 | 0 | } \ |
239 | 0 | } |
240 | | |
241 | 0 | #define opj_mqc_codelps_macro(mqc, curctx, a, c, ct) \ |
242 | 0 | { \ |
243 | 0 | a -= (*curctx)->qeval; \ |
244 | 0 | if (a < (*curctx)->qeval) { \ |
245 | 0 | c += (*curctx)->qeval; \ |
246 | 0 | } else { \ |
247 | 0 | a = (*curctx)->qeval; \ |
248 | 0 | } \ |
249 | 0 | *curctx = (*curctx)->nlps; \ |
250 | 0 | opj_mqc_renorme_macro(mqc, a, c, ct); \ |
251 | 0 | } |
252 | | |
253 | 0 | #define opj_mqc_encode_macro(mqc, curctx, a, c, ct, d) \ |
254 | 0 | { \ |
255 | 0 | if ((*curctx)->mps == (d)) { \ |
256 | 0 | opj_mqc_codemps_macro(mqc, curctx, a, c, ct); \ |
257 | 0 | } else { \ |
258 | 0 | opj_mqc_codelps_macro(mqc, curctx, a, c, ct); \ |
259 | 0 | } \ |
260 | 0 | } |
261 | | |
262 | | |
263 | 0 | #define opj_mqc_bypass_enc_macro(mqc, c, ct, d) \ |
264 | 0 | {\ |
265 | 0 | if (ct == BYPASS_CT_INIT) {\ |
266 | 0 | ct = 8;\ |
267 | 0 | }\ |
268 | 0 | ct--;\ |
269 | 0 | c = c + ((d) << ct);\ |
270 | 0 | if (ct == 0) {\ |
271 | 0 | *mqc->bp = (OPJ_BYTE)c;\ |
272 | 0 | ct = 8;\ |
273 | 0 | /* If the previous byte was 0xff, make sure that the next msb is 0 */ \ |
274 | 0 | if (*mqc->bp == 0xff) {\ |
275 | 0 | ct = 7;\ |
276 | 0 | }\ |
277 | 0 | mqc->bp++;\ |
278 | 0 | c = 0;\ |
279 | 0 | }\ |
280 | 0 | } |
281 | | |
282 | | #endif /* OPJ_MQC_INL_H */ |