/src/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 | 658M | #define opj_mqc_mpsexchange_macro(d, curctx, a) \ |
44 | 658M | { \ |
45 | 658M | if (a < (*curctx)->qeval) { \ |
46 | 104M | d = !((*curctx)->mps); \ |
47 | 104M | *curctx = (*curctx)->nlps; \ |
48 | 554M | } else { \ |
49 | 554M | d = (*curctx)->mps; \ |
50 | 554M | *curctx = (*curctx)->nmps; \ |
51 | 554M | } \ |
52 | 658M | } |
53 | | |
54 | | /* For internal use of opj_mqc_decode_macro() */ |
55 | 615M | #define opj_mqc_lpsexchange_macro(d, curctx, a) \ |
56 | 615M | { \ |
57 | 615M | if (a < (*curctx)->qeval) { \ |
58 | 127M | a = (*curctx)->qeval; \ |
59 | 127M | d = (*curctx)->mps; \ |
60 | 127M | *curctx = (*curctx)->nmps; \ |
61 | 487M | } else { \ |
62 | 487M | a = (*curctx)->qeval; \ |
63 | 487M | d = !((*curctx)->mps); \ |
64 | 487M | *curctx = (*curctx)->nlps; \ |
65 | 487M | } \ |
66 | 615M | } |
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 | 50.8M | { |
76 | 50.8M | OPJ_UINT32 d; |
77 | 50.8M | 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 | 6.37M | if (mqc->c == 0xff) { |
81 | 6.21M | if (*mqc->bp > 0x8f) { |
82 | 6.17M | mqc->c = 0xff; |
83 | 6.17M | mqc->ct = 8; |
84 | 6.17M | } else { |
85 | 40.8k | mqc->c = *mqc->bp; |
86 | 40.8k | mqc->bp ++; |
87 | 40.8k | mqc->ct = 7; |
88 | 40.8k | } |
89 | 6.21M | } else { |
90 | 155k | mqc->c = *mqc->bp; |
91 | 155k | mqc->bp ++; |
92 | 155k | mqc->ct = 8; |
93 | 155k | } |
94 | 6.37M | } |
95 | 50.8M | mqc->ct--; |
96 | 50.8M | d = ((OPJ_UINT32)mqc->c >> mqc->ct) & 0x01U; |
97 | | |
98 | 50.8M | return d; |
99 | 50.8M | } 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: jp2.c:opj_mqc_raw_decode Unexecuted instantiation: j2k.c:opj_mqc_raw_decode Unexecuted instantiation: thread.c:opj_mqc_raw_decode Unexecuted instantiation: invert.c:opj_mqc_raw_decode Unexecuted instantiation: mct.c:opj_mqc_raw_decode Unexecuted instantiation: dwt.c:opj_mqc_raw_decode Unexecuted instantiation: pi.c:opj_mqc_raw_decode Unexecuted instantiation: tcd.c:opj_mqc_raw_decode Line | Count | Source | 75 | 50.8M | { | 76 | 50.8M | OPJ_UINT32 d; | 77 | 50.8M | 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 | 6.37M | if (mqc->c == 0xff) { | 81 | 6.21M | if (*mqc->bp > 0x8f) { | 82 | 6.17M | mqc->c = 0xff; | 83 | 6.17M | mqc->ct = 8; | 84 | 6.17M | } else { | 85 | 40.8k | mqc->c = *mqc->bp; | 86 | 40.8k | mqc->bp ++; | 87 | 40.8k | mqc->ct = 7; | 88 | 40.8k | } | 89 | 6.21M | } else { | 90 | 155k | mqc->c = *mqc->bp; | 91 | 155k | mqc->bp ++; | 92 | 155k | mqc->ct = 8; | 93 | 155k | } | 94 | 6.37M | } | 95 | 50.8M | mqc->ct--; | 96 | 50.8M | d = ((OPJ_UINT32)mqc->c >> mqc->ct) & 0x01U; | 97 | | | 98 | 50.8M | return d; | 99 | 50.8M | } |
Unexecuted instantiation: ht_dec.c:opj_mqc_raw_decode Unexecuted instantiation: mqc.c:opj_mqc_raw_decode Unexecuted instantiation: t2.c:opj_mqc_raw_decode Unexecuted instantiation: bio.c:opj_mqc_raw_decode Unexecuted instantiation: tgt.c:opj_mqc_raw_decode Unexecuted instantiation: function_list.c:opj_mqc_raw_decode Unexecuted instantiation: opj_malloc.c:opj_mqc_raw_decode Unexecuted instantiation: sparse_array.c:opj_mqc_raw_decode |
100 | | |
101 | | |
102 | 215M | #define opj_mqc_bytein_macro(mqc, c, ct) \ |
103 | 215M | { \ |
104 | 215M | OPJ_UINT32 l_c; \ |
105 | 215M | /* Given opj_mqc_init_dec() we know that at some point we will */ \ |
106 | 215M | /* have a 0xFF 0xFF artificial marker */ \ |
107 | 215M | l_c = *(mqc->bp + 1); \ |
108 | 215M | if (*mqc->bp == 0xff) { \ |
109 | 210M | if (l_c > 0x8f) { \ |
110 | 209M | c += 0xff00; \ |
111 | 209M | ct = 8; \ |
112 | 209M | mqc->end_of_byte_stream_counter ++; \ |
113 | 209M | } else { \ |
114 | 1.55M | mqc->bp++; \ |
115 | 1.55M | c += l_c << 9; \ |
116 | 1.55M | ct = 7; \ |
117 | 1.55M | } \ |
118 | 210M | } else { \ |
119 | 4.66M | mqc->bp++; \ |
120 | 4.66M | c += l_c << 8; \ |
121 | 4.66M | ct = 8; \ |
122 | 4.66M | } \ |
123 | 215M | } |
124 | | |
125 | | /* For internal use of opj_mqc_decode_macro() */ |
126 | 1.27G | #define opj_mqc_renormd_macro(mqc, a, c, ct) \ |
127 | 1.27G | { \ |
128 | 1.71G | do { \ |
129 | 1.71G | if (ct == 0) { \ |
130 | 214M | opj_mqc_bytein_macro(mqc, c, ct); \ |
131 | 214M | } \ |
132 | 1.71G | a <<= 1; \ |
133 | 1.71G | c <<= 1; \ |
134 | 1.71G | ct--; \ |
135 | 1.71G | } while (a < 0x8000); \ |
136 | 1.27G | } |
137 | | |
138 | 3.30G | #define opj_mqc_decode_macro(d, mqc, curctx, a, c, ct) \ |
139 | 3.30G | { \ |
140 | 3.30G | /* Implements ISO 15444-1 C.3.2 Decoding a decision (DECODE) */ \ |
141 | 3.30G | /* Note: alternate "J.2 - Decoding an MPS or an LPS in the */ \ |
142 | 3.30G | /* software-conventions decoder" has been tried, but does not bring any */ \ |
143 | 3.30G | /* improvement. See https://github.com/uclouvain/openjpeg/issues/921 */ \ |
144 | 3.30G | a -= (*curctx)->qeval; \ |
145 | 3.30G | if ((c >> 16) < (*curctx)->qeval) { \ |
146 | 615M | opj_mqc_lpsexchange_macro(d, curctx, a); \ |
147 | 615M | opj_mqc_renormd_macro(mqc, a, c, ct); \ |
148 | 2.69G | } else { \ |
149 | 2.69G | c -= (*curctx)->qeval << 16; \ |
150 | 2.69G | if ((a & 0x8000) == 0) { \ |
151 | 658M | opj_mqc_mpsexchange_macro(d, curctx, a); \ |
152 | 658M | opj_mqc_renormd_macro(mqc, a, c, ct); \ |
153 | 2.03G | } else { \ |
154 | 2.03G | d = (*curctx)->mps; \ |
155 | 2.03G | } \ |
156 | 2.69G | } \ |
157 | 3.30G | } |
158 | | |
159 | | #define DOWNLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct) \ |
160 | 33.7M | register const opj_mqc_state_t **curctx = mqc->curctx; \ |
161 | 33.7M | register OPJ_UINT32 c = mqc->c; \ |
162 | 33.7M | register OPJ_UINT32 a = mqc->a; \ |
163 | 33.7M | register OPJ_UINT32 ct = mqc->ct |
164 | | |
165 | | #define UPLOAD_MQC_VARIABLES(mqc, curctx, a, c, ct) \ |
166 | 33.7M | mqc->curctx = curctx; \ |
167 | 33.7M | mqc->c = c; \ |
168 | 33.7M | mqc->a = a; \ |
169 | 33.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 | 591k | { |
177 | 591k | opj_mqc_bytein_macro(mqc, mqc->c, mqc->ct); |
178 | 591k | } 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: jp2.c:opj_mqc_bytein Unexecuted instantiation: j2k.c:opj_mqc_bytein Unexecuted instantiation: thread.c:opj_mqc_bytein Unexecuted instantiation: invert.c:opj_mqc_bytein Unexecuted instantiation: mct.c:opj_mqc_bytein Unexecuted instantiation: dwt.c:opj_mqc_bytein Unexecuted instantiation: pi.c:opj_mqc_bytein Unexecuted instantiation: tcd.c:opj_mqc_bytein Unexecuted instantiation: t1.c:opj_mqc_bytein Unexecuted instantiation: ht_dec.c:opj_mqc_bytein Line | Count | Source | 176 | 591k | { | 177 | 591k | opj_mqc_bytein_macro(mqc, mqc->c, mqc->ct); | 178 | 591k | } |
Unexecuted instantiation: t2.c:opj_mqc_bytein Unexecuted instantiation: bio.c:opj_mqc_bytein Unexecuted instantiation: tgt.c:opj_mqc_bytein Unexecuted instantiation: function_list.c:opj_mqc_bytein Unexecuted instantiation: opj_malloc.c:opj_mqc_bytein Unexecuted instantiation: sparse_array.c:opj_mqc_bytein |
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 | 5.85M | 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 | 6.16G | #define opj_mqc_renorme_macro(mqc, a_, c_, ct_) \ |
211 | 6.16G | { \ |
212 | 7.79G | do { \ |
213 | 7.79G | a_ <<= 1; \ |
214 | 7.79G | c_ <<= 1; \ |
215 | 7.79G | ct_--; \ |
216 | 7.79G | if (ct_ == 0) { \ |
217 | 974M | mqc->c = c_; \ |
218 | 974M | opj_mqc_byteout(mqc); \ |
219 | 974M | c_ = mqc->c; \ |
220 | 974M | ct_ = mqc->ct; \ |
221 | 974M | } \ |
222 | 7.79G | } while( (a_ & 0x8000) == 0); \ |
223 | 6.16G | } |
224 | | |
225 | 10.0G | #define opj_mqc_codemps_macro(mqc, curctx, a, c, ct) \ |
226 | 10.0G | { \ |
227 | 10.0G | a -= (*curctx)->qeval; \ |
228 | 10.0G | if ((a & 0x8000) == 0) { \ |
229 | 2.94G | if (a < (*curctx)->qeval) { \ |
230 | 888M | a = (*curctx)->qeval; \ |
231 | 2.05G | } else { \ |
232 | 2.05G | c += (*curctx)->qeval; \ |
233 | 2.05G | } \ |
234 | 2.94G | *curctx = (*curctx)->nmps; \ |
235 | 2.94G | opj_mqc_renorme_macro(mqc, a, c, ct); \ |
236 | 7.12G | } else { \ |
237 | 7.12G | c += (*curctx)->qeval; \ |
238 | 7.12G | } \ |
239 | 10.0G | } |
240 | | |
241 | 3.21G | #define opj_mqc_codelps_macro(mqc, curctx, a, c, ct) \ |
242 | 3.21G | { \ |
243 | 3.21G | a -= (*curctx)->qeval; \ |
244 | 3.21G | if (a < (*curctx)->qeval) { \ |
245 | 845M | c += (*curctx)->qeval; \ |
246 | 2.37G | } else { \ |
247 | 2.37G | a = (*curctx)->qeval; \ |
248 | 2.37G | } \ |
249 | 3.21G | *curctx = (*curctx)->nlps; \ |
250 | 3.21G | opj_mqc_renorme_macro(mqc, a, c, ct); \ |
251 | 3.21G | } |
252 | | |
253 | 13.2G | #define opj_mqc_encode_macro(mqc, curctx, a, c, ct, d) \ |
254 | 13.2G | { \ |
255 | 13.2G | if ((*curctx)->mps == (d)) { \ |
256 | 10.0G | opj_mqc_codemps_macro(mqc, curctx, a, c, ct); \ |
257 | 10.0G | } else { \ |
258 | 3.21G | opj_mqc_codelps_macro(mqc, curctx, a, c, ct); \ |
259 | 3.21G | } \ |
260 | 13.2G | } |
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 */ |