/src/ffmpeg/libavcodec/jpeg2000htdec.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2022 Caleb Etemesi <etemesicaleb@gmail.com> |
3 | | * |
4 | | * This file is part of FFmpeg. |
5 | | * |
6 | | * FFmpeg is free software; you can redistribute it and/or |
7 | | * modify it under the terms of the GNU Lesser General Public |
8 | | * License as published by the Free Software Foundation; either |
9 | | * version 2.1 of the License, or (at your option) any later version. |
10 | | * |
11 | | * FFmpeg is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | | * Lesser General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU Lesser General Public |
17 | | * License along with FFmpeg; if not, write to the Free Software |
18 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | | */ |
20 | | |
21 | | /* |
22 | | * Copyright 2019 - 2021, Osamu Watanabe |
23 | | * |
24 | | * Redistribution and use in source and binary forms, with or without modification, |
25 | | * are permitted provided that the following conditions are met: |
26 | | * |
27 | | * 1. Redistributions of source code must retain the above copyright notice, this |
28 | | * list of conditions and the following disclaimer. |
29 | | * |
30 | | * 2. Redistributions in binary form must reproduce the above copyright notice, |
31 | | * this list of conditions and the following disclaimer in the documentation |
32 | | * and/or other materials provided with the distribution. |
33 | | * |
34 | | * 3. Neither the name of the copyright holder nor the names of its contributors |
35 | | * may be used to endorse or promote products derived from this software without |
36 | | * specific prior written permission. |
37 | | * |
38 | | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND |
39 | | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
40 | | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
41 | | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
42 | | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
43 | | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
44 | | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
45 | | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
46 | | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
47 | | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
48 | | */ |
49 | | |
50 | | #include <stdint.h> |
51 | | #include "libavutil/attributes.h" |
52 | | #include "libavutil/common.h" |
53 | | #include "libavutil/avassert.h" |
54 | | #include "libavutil/mem.h" |
55 | | #include "jpeg2000htdec.h" |
56 | | #include "jpeg2000.h" |
57 | | #include "jpeg2000dec.h" |
58 | | |
59 | 31.1M | #define J2K_Q1 0 |
60 | 28.7M | #define J2K_Q2 1 |
61 | | |
62 | 5.22M | #define HT_SHIFT_SIGMA 0 |
63 | 12.6M | #define HT_SHIFT_SCAN 4 |
64 | 13.6M | #define HT_SHIFT_REF 3 |
65 | 1.22M | #define HT_SHIFT_REF_IND 2 |
66 | | |
67 | | /* See Rec. ITU-T T.800, Table 2 */ |
68 | | const static uint8_t mel_e[13] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5 }; |
69 | | |
70 | | static const uint16_t dec_cxt_vlc_table1[1024]; |
71 | | static const uint16_t dec_cxt_vlc_table0[1024]; |
72 | | |
73 | | typedef struct StateVars { |
74 | | int32_t pos; |
75 | | uint32_t bits; |
76 | | uint32_t tmp; |
77 | | uint32_t last; |
78 | | uint8_t bits_left; |
79 | | uint64_t bit_buf; |
80 | | } StateVars; |
81 | | |
82 | | typedef struct MelDecoderState { |
83 | | uint8_t k; |
84 | | uint8_t run; |
85 | | uint8_t one; |
86 | | } MelDecoderState; |
87 | | |
88 | | /** |
89 | | * Given a precomputed c, checks whether n % d == 0. c is precomputed from d |
90 | | * using precompute_c(). |
91 | | */ |
92 | | av_always_inline |
93 | | static uint32_t is_divisible(uint32_t n, uint64_t c) |
94 | 6.17M | { |
95 | 6.17M | return n * c <= c - 1; |
96 | 6.17M | } |
97 | | |
98 | | /** |
99 | | * Precompute the number c used by is_divisible(). |
100 | | */ |
101 | | av_always_inline |
102 | | static uint64_t precompute_c(uint32_t d) |
103 | 10.8k | { |
104 | 10.8k | return 1 + (0xffffffffffffffffull / d); |
105 | 10.8k | } |
106 | | |
107 | | static void jpeg2000_init_zero(StateVars *s) |
108 | 44.0k | { |
109 | 44.0k | s->bits_left = 0; |
110 | 44.0k | s->bit_buf = 0; |
111 | 44.0k | s->tmp = 0; |
112 | 44.0k | s->bits = 0; |
113 | 44.0k | s->pos = 0; |
114 | 44.0k | s->last = 0; |
115 | 44.0k | } |
116 | | |
117 | | static void jpeg2000_init_mel(StateVars *s, uint32_t Pcup) |
118 | 12.7k | { |
119 | 12.7k | jpeg2000_init_zero(s); |
120 | 12.7k | s->pos = Pcup; |
121 | 12.7k | } |
122 | | |
123 | | static void jpeg2000_init_mag_ref(StateVars *s, uint32_t Lref) |
124 | 3.84k | { |
125 | 3.84k | s->pos = Lref - 1; |
126 | 3.84k | s->bits = 0; |
127 | 3.84k | s->last = 0xFF; |
128 | 3.84k | s->tmp = 0; |
129 | 3.84k | s->bits_left = 0; |
130 | 3.84k | s->bit_buf = 0; |
131 | 3.84k | } |
132 | | |
133 | | static void jpeg2000_init_mel_decoder(MelDecoderState *mel_state) |
134 | 12.7k | { |
135 | 12.7k | mel_state->k = 0; |
136 | 12.7k | mel_state->run = 0; |
137 | 12.7k | mel_state->one = 0; |
138 | 12.7k | } |
139 | | |
140 | | /** |
141 | | * Refill the buffer backwards in little endian while skipping over stuffing |
142 | | * bits. Stuffing bits are those that appear in the position of any byte whose |
143 | | * LSBs are all 1's if the last consumed byte was larger than 0x8F. |
144 | | */ |
145 | | static int jpeg2000_bitbuf_refill_backwards(StateVars *buffer, const uint8_t *array) |
146 | 1.72M | { |
147 | 1.72M | uint64_t tmp = 0; |
148 | 1.72M | uint32_t new_bits = 32; |
149 | | |
150 | 1.72M | buffer->last = array[buffer->pos + 1]; |
151 | | |
152 | 1.72M | if (buffer->bits_left >= 32) |
153 | 1.59M | return 0; // enough data, no need to pull in more bits |
154 | | |
155 | | /** |
156 | | * Unstuff bits. Load a temporary byte, which precedes the position we |
157 | | * currently at, to ensure that we can also un-stuff if the stuffed bit is |
158 | | * the bottom most bits. |
159 | | */ |
160 | | |
161 | 129k | if (buffer->pos >= 3) { // Common case; we have at least 4 bytes available |
162 | 56.0k | tmp = array[buffer->pos - 3]; |
163 | 56.0k | tmp = (tmp << 8) | array[buffer->pos - 2]; |
164 | 56.0k | tmp = (tmp << 8) | array[buffer->pos - 1]; |
165 | 56.0k | tmp = (tmp << 8) | array[buffer->pos]; |
166 | 56.0k | tmp = (tmp << 8) | buffer->last; // For stuffing bit detection |
167 | 56.0k | buffer->pos -= 4; |
168 | 73.0k | } else { |
169 | 73.0k | if (buffer->pos >= 2) |
170 | 638 | tmp = array[buffer->pos - 2]; |
171 | 73.0k | if (buffer->pos >= 1) |
172 | 2.71k | tmp = (tmp << 8) | array[buffer->pos - 1]; |
173 | 73.0k | if (buffer->pos >= 0) |
174 | 67.3k | tmp = (tmp << 8) | array[buffer->pos]; |
175 | 73.0k | buffer->pos = 0; |
176 | 73.0k | tmp = (tmp << 8) | buffer->last; // For stuffing bit detection |
177 | 73.0k | } |
178 | | // Now remove any stuffing bits, shifting things down as we go |
179 | 129k | if ((tmp & 0x7FFF000000) > 0x7F8F000000) { |
180 | 3.54k | tmp &= 0x7FFFFFFFFF; |
181 | 3.54k | new_bits--; |
182 | 3.54k | } |
183 | 129k | if ((tmp & 0x007FFF0000) > 0x007F8F0000) { |
184 | 5.17k | tmp = (tmp & 0x007FFFFFFF) + ((tmp & 0xFF00000000) >> 1); |
185 | 5.17k | new_bits--; |
186 | 5.17k | } |
187 | 129k | if ((tmp & 0x00007FFF00) > 0x00007F8F00) { |
188 | 4.84k | tmp = (tmp & 0x00007FFFFF) + ((tmp & 0xFFFF000000) >> 1); |
189 | 4.84k | new_bits--; |
190 | 4.84k | } |
191 | 129k | if ((tmp & 0x0000007FFF) > 0x0000007F8F) { |
192 | 8.54k | tmp = (tmp & 0x0000007FFF) + ((tmp & 0xFFFFFF0000) >> 1); |
193 | 8.54k | new_bits--; |
194 | 8.54k | } |
195 | 129k | tmp >>= 8; // Shifts away the extra byte we imported |
196 | | |
197 | | /* Add bits to the MSB of the bit buffer */ |
198 | 129k | buffer->bit_buf |= tmp << buffer->bits_left; |
199 | 129k | buffer->bits_left += new_bits; |
200 | 129k | return 0; |
201 | 1.72M | } |
202 | | |
203 | | /** |
204 | | * Refill the bit-buffer reading new bits going forward |
205 | | * in the stream while skipping over stuffed bits. |
206 | | */ |
207 | | static void jpeg2000_bitbuf_refill_forward(StateVars *buffer, const uint8_t *array, |
208 | | uint32_t length) |
209 | 165k | { |
210 | 778k | while (buffer->bits_left < 32) { |
211 | 612k | buffer->tmp = 0xFF; |
212 | 612k | buffer->bits = (buffer->last == 0xFF) ? 7 : 8; |
213 | 612k | if (buffer->pos < length) { |
214 | 215k | buffer->tmp = array[buffer->pos]; |
215 | 215k | buffer->pos += 1; |
216 | 215k | buffer->last = buffer->tmp; |
217 | 215k | } |
218 | 612k | buffer->bit_buf |= ((uint64_t) buffer->tmp) << buffer->bits_left; |
219 | 612k | buffer->bits_left += buffer->bits; |
220 | 612k | } |
221 | 165k | } |
222 | | |
223 | | /** |
224 | | * Drops bits from lower bits in the bit buffer. buf contains the bit buffers. |
225 | | * nbits is the number of bits to remove. |
226 | | */ |
227 | | av_always_inline |
228 | | static void jpeg2000_bitbuf_drop_bits_lsb(StateVars *buf, uint8_t nbits) |
229 | 2.49M | { |
230 | 2.49M | av_assert2(buf->bits_left >= nbits); // cannot read more bits than available |
231 | 2.49M | buf->bit_buf >>= nbits; |
232 | 2.49M | buf->bits_left -= nbits; |
233 | 2.49M | } |
234 | | |
235 | | /** |
236 | | * Get bits from the bit buffer reading them from the least significant bits |
237 | | * moving to the most significant bits. In case there are fewer bits, refill |
238 | | * from buf moving backwards. |
239 | | */ |
240 | | av_always_inline |
241 | | static uint64_t jpeg2000_bitbuf_get_bits_lsb(StateVars *bit_stream, uint8_t nbits, |
242 | | const uint8_t *buf) |
243 | 393k | { |
244 | 393k | uint64_t bits; |
245 | 393k | uint64_t mask = (1ull << nbits) - 1; |
246 | 393k | if (bit_stream->bits_left < nbits) |
247 | 10.2k | jpeg2000_bitbuf_refill_backwards(bit_stream, buf); |
248 | 393k | bits = bit_stream->bit_buf & mask; |
249 | 393k | jpeg2000_bitbuf_drop_bits_lsb(bit_stream, nbits); |
250 | 393k | return bits; |
251 | 393k | } |
252 | | |
253 | | /** |
254 | | * Get bits from the bit buffer reading them from the least significant bits |
255 | | * moving to the most significant bits. In case there are fewer bits, refill from |
256 | | * buf moving forward. |
257 | | */ |
258 | | av_always_inline |
259 | | static uint64_t jpeg2000_bitbuf_get_bits_lsb_forward(StateVars *bit_stream, |
260 | | uint8_t nbits, const uint8_t *buf, |
261 | | uint32_t length) |
262 | 1.09M | { |
263 | 1.09M | uint64_t bits; |
264 | 1.09M | uint64_t mask = (1ull << nbits) - 1; |
265 | | |
266 | 1.09M | if (bit_stream->bits_left <= nbits) |
267 | 153k | jpeg2000_bitbuf_refill_forward(bit_stream, buf, length); |
268 | 1.09M | bits = bit_stream->bit_buf & mask; |
269 | 1.09M | jpeg2000_bitbuf_drop_bits_lsb(bit_stream, nbits); |
270 | 1.09M | return bits; |
271 | 1.09M | } |
272 | | |
273 | | /** |
274 | | * Look ahead bit buffer without discarding bits. |
275 | | */ |
276 | | av_always_inline |
277 | | static uint64_t jpeg2000_bitbuf_peek_bits_lsb(StateVars *stream, uint8_t nbits) |
278 | 208k | { |
279 | 208k | uint64_t mask = (1ull << nbits) - 1; |
280 | 208k | return stream->bit_buf & mask; |
281 | 208k | } |
282 | | |
283 | | static void jpeg2000_init_vlc(StateVars *s, uint32_t Lcup, uint32_t Pcup, |
284 | | const uint8_t *Dcup) |
285 | 12.7k | { |
286 | 12.7k | s->bits_left = 0; |
287 | 12.7k | s->bit_buf = 0; |
288 | 12.7k | s->pos = Lcup - 2 - Pcup; |
289 | 12.7k | s->last = Dcup[Lcup - 2]; |
290 | 12.7k | s->tmp = (s->last) >> 4; |
291 | 12.7k | s->bits = ((s->tmp & 7) < 7) ? 4 : 3; |
292 | | |
293 | 12.7k | jpeg2000_bitbuf_refill_backwards(s, Dcup + Pcup); |
294 | 12.7k | jpeg2000_bitbuf_drop_bits_lsb(s, 4); |
295 | 12.7k | } |
296 | | |
297 | | /** |
298 | | * Decode prefix codes for VLC segment. See Rec. ITU-T T.814, 7.3.5. |
299 | | */ |
300 | | av_always_inline |
301 | | static int jpeg2000_decode_ctx_vlc(const Jpeg2000DecoderContext *s, |
302 | | StateVars *vlc_stream, const uint16_t *table, |
303 | | const uint8_t *Dcup, uint8_t *sig_pat, |
304 | | uint8_t *res_off, uint8_t *emb_pat_k, |
305 | | uint8_t *emb_pat_1, uint8_t pos, |
306 | | uint32_t Pcup, uint16_t context) |
307 | 784k | { |
308 | 784k | uint32_t value; |
309 | 784k | uint8_t len; |
310 | 784k | uint64_t index; |
311 | 784k | uint64_t code_word; |
312 | | |
313 | 784k | jpeg2000_bitbuf_refill_backwards(vlc_stream, Dcup + Pcup); |
314 | | |
315 | 784k | code_word = vlc_stream->bit_buf & 0x7f; |
316 | 784k | index = code_word + (context << 7); |
317 | | |
318 | 784k | av_assert0(index < 1024); // The CxtVLC table has 1024 entries. |
319 | | |
320 | 784k | value = table[index]; |
321 | | |
322 | 784k | len = (value & 0x000F) >> 1; |
323 | | |
324 | 784k | res_off[pos] = (uint8_t) (value & 1); |
325 | 784k | sig_pat[pos] = (uint8_t) ((value & 0x00F0) >> 4); |
326 | 784k | emb_pat_k[pos] = (uint8_t) ((value & 0x0F00) >> 8); |
327 | 784k | emb_pat_1[pos] = (uint8_t) ((value & 0xF000) >> 12); |
328 | | |
329 | 784k | jpeg2000_bitbuf_drop_bits_lsb(vlc_stream, len); |
330 | 784k | return 0; |
331 | 784k | } |
332 | | |
333 | | /** |
334 | | * Decode variable length u-vlc prefix. See decodeUPrefix procedure at Rec. |
335 | | * ITU-T T.814, 7.3.6. |
336 | | */ |
337 | | av_always_inline |
338 | | static uint8_t vlc_decode_u_prefix(StateVars *vlc_stream, const uint8_t *refill_array) |
339 | 131k | { |
340 | 131k | static const uint8_t return_value[8] = { 5, 1, 2, 1, 3, 1, 2, 1 }; |
341 | 131k | static const uint8_t drop_bits[8] = { 3, 1, 2, 1, 3, 1, 2, 1 }; |
342 | | |
343 | 131k | uint8_t bits; |
344 | | |
345 | 131k | if (vlc_stream->bits_left < 3) |
346 | 0 | jpeg2000_bitbuf_refill_backwards(vlc_stream, refill_array); |
347 | | |
348 | 131k | bits = jpeg2000_bitbuf_peek_bits_lsb(vlc_stream, 3); |
349 | | |
350 | 131k | jpeg2000_bitbuf_drop_bits_lsb(vlc_stream, drop_bits[bits]); |
351 | 131k | return return_value[bits]; |
352 | 131k | } |
353 | | |
354 | | /** |
355 | | * Decode variable length u-vlc suffix. See decodeUSuffix procedure at Rec. |
356 | | * ITU-T T.814, 7.3.6. |
357 | | */ |
358 | | av_always_inline |
359 | | static uint8_t vlc_decode_u_suffix(StateVars *vlc_stream, uint8_t suffix, |
360 | | const uint8_t *refill_array) |
361 | 131k | { |
362 | 131k | static const int mask[] = { 1, 31 }; |
363 | 131k | static const int drop_bits[] = { 1, 5 }; |
364 | | |
365 | 131k | uint8_t bits; |
366 | 131k | int cond = suffix != 3; |
367 | 131k | if (suffix < 3) |
368 | 54.6k | return 0; |
369 | | |
370 | 76.9k | if (vlc_stream->bits_left < 5) |
371 | 0 | jpeg2000_bitbuf_refill_backwards(vlc_stream, refill_array); |
372 | | |
373 | 76.9k | bits = jpeg2000_bitbuf_peek_bits_lsb(vlc_stream, 5); |
374 | | |
375 | 76.9k | jpeg2000_bitbuf_drop_bits_lsb(vlc_stream, drop_bits[cond]); |
376 | 76.9k | return bits & mask[cond]; |
377 | 131k | } |
378 | | |
379 | | /** |
380 | | * Decode u-vlc extension values. See decodeUExtension procedure at Rec. ITU-T |
381 | | * T.814, 7.3.6. |
382 | | */ |
383 | | av_always_inline |
384 | | static uint8_t vlc_decode_u_extension(StateVars *vlc_stream, uint8_t suffix, |
385 | | const uint8_t *refill_array) |
386 | 131k | { |
387 | 131k | return jpeg2000_bitbuf_get_bits_lsb(vlc_stream, 4 * (suffix >= 28), refill_array); |
388 | 131k | } |
389 | | |
390 | | /** |
391 | | * Magnitude and Sign decode procedures. See decodeMagSgnValue procedure at Rec. |
392 | | * ITU-T T.814, 7.3.8. |
393 | | */ |
394 | | av_always_inline |
395 | | static int32_t jpeg2000_decode_mag_sgn(StateVars *mag_sgn_stream, int32_t m_n, |
396 | | int32_t i_n, const uint8_t *buf, uint32_t length) |
397 | 7.45M | { |
398 | 7.45M | int32_t val = 0; |
399 | 7.45M | if (m_n > 0) { |
400 | 1.09M | val = jpeg2000_bitbuf_get_bits_lsb_forward(mag_sgn_stream,m_n,buf,length); |
401 | 1.09M | val += (i_n << m_n); |
402 | 1.09M | } |
403 | 7.45M | return val; |
404 | 7.45M | } |
405 | | |
406 | | av_always_inline |
407 | | static void recover_mag_sgn(StateVars *mag_sgn, uint8_t pos, uint16_t q, int32_t m_n[2], |
408 | | int32_t known_1[2], const uint8_t emb_pat_1[2], |
409 | | int32_t v[2][4], int32_t m[2][4], uint8_t *E, |
410 | | uint32_t *mu_n, const uint8_t *Dcup, uint32_t Pcup, |
411 | | uint32_t pLSB) |
412 | 1.86M | { |
413 | 9.31M | for (int i = 0; i < 4; i++) { |
414 | 7.45M | int32_t n = 4 * q + i; |
415 | 7.45M | m_n[pos] = m[pos][i]; |
416 | 7.45M | known_1[pos] = (emb_pat_1[pos] >> i) & 1; |
417 | 7.45M | v[pos][i] = jpeg2000_decode_mag_sgn(mag_sgn, m_n[pos], known_1[pos], Dcup, Pcup); |
418 | | |
419 | 7.45M | if (m_n[pos] != 0) { |
420 | 1.09M | E[n] = 32 - ff_clz(v[pos][i] | 1); |
421 | 1.09M | mu_n[n] = (v[pos][i] >> 1) + 1; |
422 | 1.09M | mu_n[n] <<= pLSB; |
423 | 1.09M | mu_n[n] |= (1 << (pLSB - 1)); // Add 0.5 (reconstruction parameter = 1/2) |
424 | 1.09M | mu_n[n] |= ((uint32_t) (v[pos][i] & 1)) << 31; // sign bit. |
425 | 1.09M | } |
426 | 7.45M | } |
427 | 1.86M | } |
428 | | |
429 | | static int jpeg2000_import_bit(StateVars *stream, const uint8_t *array, uint32_t length) |
430 | 489k | { |
431 | 489k | int cond = stream->pos < length; |
432 | 489k | int pos = FFMIN(stream->pos, length - 1); |
433 | 489k | if (stream->bits == 0) { |
434 | 67.7k | stream->bits = (stream->tmp == 0xFF) ? 7 : 8; |
435 | 67.7k | stream->pos += cond; |
436 | 67.7k | stream->tmp = cond ? array[pos] : 0xFF; |
437 | 67.7k | } |
438 | 489k | stream->bits -= 1; |
439 | 489k | return (stream->tmp >> stream->bits) & 1; |
440 | 489k | } |
441 | | |
442 | | static int jpeg2000_peek_bit(StateVars *stream, const uint8_t *array, uint32_t length) |
443 | 1.05M | { |
444 | 1.05M | uint8_t bit; |
445 | | |
446 | 1.05M | if (stream->bits == 0) { |
447 | 135k | stream->bits = (stream->last == 0xFF) ? 7 : 8; |
448 | 135k | if (stream->pos < length) { |
449 | 39.4k | stream->tmp = array[stream->pos]; |
450 | 39.4k | stream->pos++; |
451 | 95.8k | } else { |
452 | 95.8k | stream->tmp = 0; |
453 | 95.8k | } |
454 | 135k | stream->last = stream->tmp; |
455 | 135k | } |
456 | 1.05M | bit = stream->tmp & 1; |
457 | 1.05M | stream->tmp >>= 1; |
458 | 1.05M | stream->bits--; |
459 | 1.05M | return bit; |
460 | 1.05M | } |
461 | | |
462 | | static int jpeg2000_decode_mel_sym(MelDecoderState *mel_state, |
463 | | StateVars *mel_stream, |
464 | | const uint8_t *Dcup, |
465 | | uint32_t Lcup) |
466 | 1.42M | { |
467 | | |
468 | 1.42M | if (mel_state->run == 0 && mel_state->one == 0) { |
469 | 445k | uint8_t eval; |
470 | 445k | uint8_t bit; |
471 | | |
472 | 445k | eval = mel_e[mel_state->k]; |
473 | 445k | bit = jpeg2000_import_bit(mel_stream, Dcup, Lcup); |
474 | 445k | if (bit == 1) { |
475 | 142k | mel_state->run = 1 << eval; |
476 | 142k | mel_state->k = FFMIN(12, mel_state->k + 1); |
477 | 302k | } else { |
478 | 302k | mel_state->run = 0; |
479 | 346k | while (eval > 0) { |
480 | 43.5k | bit = jpeg2000_import_bit(mel_stream, Dcup, Lcup); |
481 | 43.5k | mel_state->run = (2 * (mel_state->run)) + bit; |
482 | 43.5k | eval -= 1; |
483 | 43.5k | } |
484 | 302k | mel_state->k = FFMAX(0, mel_state->k - 1); |
485 | 302k | mel_state->one = 1; |
486 | 302k | } |
487 | 445k | } |
488 | 1.42M | if (mel_state->run > 0) { |
489 | 1.12M | mel_state->run -= 1; |
490 | 1.12M | return 0; |
491 | 1.12M | } else { |
492 | 302k | mel_state->one = 0; |
493 | 302k | return 1; |
494 | 302k | } |
495 | 1.42M | } |
496 | | |
497 | | /** |
498 | | * Magref decoding procedures. |
499 | | */ |
500 | | av_always_inline |
501 | | static int jpeg2000_import_magref_bit(StateVars *stream, const uint8_t *array, |
502 | | uint32_t length) |
503 | 240k | { |
504 | 240k | return jpeg2000_bitbuf_get_bits_lsb(stream, 1, array); |
505 | 240k | } |
506 | | |
507 | | /** |
508 | | * Signal EMB decode. |
509 | | */ |
510 | | static int jpeg2000_decode_sig_emb(const Jpeg2000DecoderContext *s, MelDecoderState *mel_state, |
511 | | StateVars *mel_stream, StateVars *vlc_stream, |
512 | | const uint16_t *vlc_table, const uint8_t *Dcup, |
513 | | uint8_t *sig_pat, uint8_t *res_off, uint8_t *emb_pat_k, |
514 | | uint8_t *emb_pat_1, uint8_t pos, uint16_t context, |
515 | | uint32_t Lcup, uint32_t Pcup) |
516 | 1.86M | { |
517 | 1.86M | if (context == 0) { |
518 | 1.37M | uint8_t sym; |
519 | 1.37M | sym = jpeg2000_decode_mel_sym(mel_state, mel_stream, Dcup, Lcup); |
520 | 1.37M | if (sym == 0) { |
521 | 1.08M | sig_pat[pos] = 0; |
522 | 1.08M | res_off[pos] = 0; |
523 | 1.08M | emb_pat_k[pos] = 0; |
524 | 1.08M | emb_pat_1[pos] = 0; |
525 | 1.08M | return 0; |
526 | 1.08M | } |
527 | 1.37M | } |
528 | 784k | return jpeg2000_decode_ctx_vlc(s, vlc_stream, vlc_table, Dcup, sig_pat, |
529 | 784k | res_off, emb_pat_k, emb_pat_1, pos, Pcup, |
530 | 784k | context); |
531 | 1.86M | } |
532 | | |
533 | | av_always_inline |
534 | | static int jpeg2000_get_state(int x1, int x2, int stride, int shift_by, |
535 | | const uint8_t *block_states) |
536 | 5.22M | { |
537 | 5.22M | return (block_states[(x1 + 1) * stride + (x2 + 1)] >> shift_by) & 1; |
538 | 5.22M | } |
539 | | |
540 | | av_always_inline |
541 | | static void jpeg2000_modify_state(int x1, int x2, int stride, |
542 | | int value, uint8_t *block_states) |
543 | 10.1M | { |
544 | 10.1M | block_states[(x1 + 1) * stride + (x2 + 1)] |= value; |
545 | 10.1M | } |
546 | | |
547 | | av_always_inline |
548 | | static int jpeg2000_decode_ht_cleanup_segment(const Jpeg2000DecoderContext *s, |
549 | | Jpeg2000Cblk *cblk, Jpeg2000T1Context *t1, |
550 | | MelDecoderState *mel_state, |
551 | | StateVars *mel_stream, StateVars *vlc_stream, |
552 | | StateVars *mag_sgn_stream, const uint8_t *Dcup, |
553 | | uint32_t Lcup, uint32_t Pcup, uint8_t pLSB, |
554 | | int width, int height, const int stride, |
555 | | int32_t *sample_buf, uint8_t *block_states) |
556 | 12.7k | { |
557 | 12.7k | uint16_t q = 0; // Represents current quad position |
558 | 12.7k | uint16_t q1, q2; |
559 | 12.7k | uint16_t context1, context2; |
560 | 12.7k | uint16_t context = 0; |
561 | | |
562 | 12.7k | uint8_t sig_pat[2] = { 0 }; // significance pattern |
563 | 12.7k | uint8_t res_off[2] = { 0 }; // residual offset |
564 | 12.7k | uint8_t emb_pat_k[2] = { 0 }; // exponent Max Bound pattern K |
565 | 12.7k | uint8_t emb_pat_1[2] = { 0 }; // exponent Max Bound pattern 1 |
566 | 12.7k | uint8_t gamma[2] = { 0 }; |
567 | | |
568 | 12.7k | uint8_t E_n[2] = { 0 }; |
569 | 12.7k | uint8_t E_ne[2] = { 0 }; |
570 | 12.7k | uint8_t E_nw[2] = { 0 }; |
571 | 12.7k | uint8_t E_nf[2] = { 0 }; |
572 | | |
573 | 12.7k | uint8_t max_e[2] = { 0 }; |
574 | 12.7k | uint8_t u_pfx[2] = { 0 }; |
575 | 12.7k | uint8_t u_sfx[2] = { 0 }; |
576 | 12.7k | uint8_t u_ext[2] = { 0 }; |
577 | | |
578 | 12.7k | int32_t u[2] = { 0 }; |
579 | 12.7k | int32_t U[2] = { 0 }; // exponent bound |
580 | 12.7k | int32_t m_n[2] = { 0 }; |
581 | 12.7k | int32_t known_1[2] = { 0 }; |
582 | | |
583 | 12.7k | int32_t m[2][4] = { 0 }; |
584 | 12.7k | int32_t v[2][4] = { 0 }; |
585 | | |
586 | 12.7k | uint8_t kappa[2] = { 1, 1 }; |
587 | | |
588 | 12.7k | int ret = 0; |
589 | | |
590 | 12.7k | int sp; |
591 | | |
592 | 12.7k | uint64_t c; |
593 | | |
594 | 12.7k | uint8_t *sigma, *sigma_n, *E; |
595 | 12.7k | uint32_t *mu, *mu_n; |
596 | | |
597 | 12.7k | const uint8_t *vlc_buf = Dcup + Pcup; |
598 | | |
599 | | /* |
600 | | * Bound on the precision needed to process the codeblock. The number of |
601 | | * decoded bit planes is equal to at most cblk->zbp + 2 since S_blk = P if |
602 | | * there are no placeholder passes or HT Sets and P = cblk->zbp. See Rec. |
603 | | * ITU-T T.814, 7.6. |
604 | | */ |
605 | 12.7k | int maxbp = cblk->zbp + 2; |
606 | | |
607 | | /* convert to raster-scan */ |
608 | 12.7k | const uint16_t is_border_x = width % 2; |
609 | 12.7k | const uint16_t is_border_y = height % 2; |
610 | | |
611 | 12.7k | const uint16_t quad_width = ff_jpeg2000_ceildivpow2(width, 1); |
612 | 12.7k | const uint16_t quad_height = ff_jpeg2000_ceildivpow2(height, 1); |
613 | | |
614 | 12.7k | size_t buf_size = 4 * quad_width * quad_height; |
615 | | |
616 | | /* do we have enough precision, assuming a 32-bit decoding path */ |
617 | 12.7k | if (maxbp >= 32) |
618 | 199 | return AVERROR_INVALIDDATA; |
619 | | |
620 | 12.5k | sigma_n = av_calloc(buf_size, sizeof(uint8_t)); |
621 | 12.5k | E = av_calloc(buf_size, sizeof(uint8_t)); |
622 | 12.5k | mu_n = av_calloc(buf_size, sizeof(uint32_t)); |
623 | | |
624 | 12.5k | if (!sigma_n || !E || !mu_n) { |
625 | 0 | ret = AVERROR(ENOMEM); |
626 | 0 | goto free; |
627 | 0 | } |
628 | | |
629 | 12.5k | sigma = sigma_n; |
630 | 12.5k | mu = mu_n; |
631 | | |
632 | 171k | while (q < quad_width - 1) { |
633 | 160k | q1 = q; |
634 | 160k | q2 = q1 + 1; |
635 | | |
636 | 160k | if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream, |
637 | 160k | dec_cxt_vlc_table0, Dcup, sig_pat, res_off, |
638 | 160k | emb_pat_k, emb_pat_1, J2K_Q1, context, Lcup, |
639 | 160k | Pcup)) < 0) |
640 | 0 | goto free; |
641 | | |
642 | 803k | for (int i = 0; i < 4; i++) |
643 | 642k | sigma_n[4 * q1 + i] = (sig_pat[J2K_Q1] >> i) & 1; |
644 | | |
645 | | /* calculate context */ |
646 | 160k | context = sigma_n[4 * q1]; // f |
647 | 160k | context |= sigma_n[4 * q1 + 1]; // sf |
648 | 160k | context += sigma_n[4 * q1 + 2] << 1; // w << 1 |
649 | 160k | context += sigma_n[4 * q1 + 3] << 2; |
650 | | |
651 | 160k | if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream, |
652 | 160k | dec_cxt_vlc_table0, Dcup, sig_pat, res_off, |
653 | 160k | emb_pat_k, emb_pat_1, J2K_Q2, context, Lcup, |
654 | 160k | Pcup)) < 0) |
655 | 0 | goto free; |
656 | | |
657 | 803k | for (int i = 0; i < 4; i++) |
658 | 642k | sigma_n[4 * q2 + i] = (sig_pat[J2K_Q2] >> i) & 1; |
659 | | |
660 | | /* calculate context for the next quad */ |
661 | 160k | context = sigma_n[4 * q2]; // f |
662 | 160k | context |= sigma_n[4 * q2 + 1]; // sf |
663 | 160k | context += sigma_n[4 * q2 + 2] << 1; // w << 1 |
664 | 160k | context += sigma_n[4 * q2 + 3] << 2; // sw << 2 |
665 | | |
666 | 160k | u[0] = 0; |
667 | 160k | u[1] = 0; |
668 | | |
669 | 160k | jpeg2000_bitbuf_refill_backwards(vlc_stream, vlc_buf); |
670 | | |
671 | 160k | if (res_off[J2K_Q1] == 1 && res_off[J2K_Q2] == 1) { |
672 | | |
673 | 44.5k | if (jpeg2000_decode_mel_sym(mel_state, mel_stream, Dcup, Lcup) == 1) { |
674 | | |
675 | 8.59k | u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
676 | 8.59k | u_pfx[J2K_Q2] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
677 | | |
678 | 8.59k | u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf); |
679 | 8.59k | u_sfx[J2K_Q2] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q2], vlc_buf); |
680 | | |
681 | 8.59k | u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf); |
682 | 8.59k | u_ext[J2K_Q2] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q2], vlc_buf); |
683 | | |
684 | 8.59k | u[J2K_Q1] = 2 + u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] * 4); |
685 | 8.59k | u[J2K_Q2] = 2 + u_pfx[J2K_Q2] + u_sfx[J2K_Q2] + (u_ext[J2K_Q2] * 4); |
686 | | |
687 | 35.9k | } else { |
688 | 35.9k | u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
689 | | |
690 | 35.9k | if (u_pfx[J2K_Q1] > 2) { |
691 | 21.5k | u[J2K_Q2] = jpeg2000_bitbuf_get_bits_lsb(vlc_stream, 1, vlc_buf) + 1; |
692 | 21.5k | u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf); |
693 | 21.5k | u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf); |
694 | 21.5k | } else { |
695 | 14.4k | u_pfx[J2K_Q2] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
696 | 14.4k | u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf); |
697 | 14.4k | u_sfx[J2K_Q2] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q2], vlc_buf); |
698 | 14.4k | u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf); |
699 | 14.4k | u_ext[J2K_Q2] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q2], vlc_buf); |
700 | 14.4k | u[J2K_Q2] = u_pfx[J2K_Q2] + u_sfx[J2K_Q2] + (u_ext[J2K_Q2] * 4); |
701 | 14.4k | } |
702 | | /* See Rec. ITU-T T.814, 7.3.6(3) */ |
703 | 35.9k | u[J2K_Q1] = u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] * 4); |
704 | 35.9k | } |
705 | | |
706 | 116k | } else if (res_off[J2K_Q1] == 1 || res_off[J2K_Q2] == 1) { |
707 | 17.0k | uint8_t pos = res_off[J2K_Q1] == 1 ? 0 : 1; |
708 | 17.0k | u_pfx[pos] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
709 | 17.0k | u_sfx[pos] = vlc_decode_u_suffix(vlc_stream, u_pfx[pos], vlc_buf); |
710 | 17.0k | u_ext[pos] = vlc_decode_u_extension(vlc_stream, u_sfx[pos], vlc_buf); |
711 | 17.0k | u[pos] = u_pfx[pos] + u_sfx[pos] + (u_ext[pos] * 4); |
712 | 17.0k | } |
713 | 160k | U[J2K_Q1] = kappa[J2K_Q1] + u[J2K_Q1]; |
714 | 160k | U[J2K_Q2] = kappa[J2K_Q2] + u[J2K_Q2]; |
715 | 160k | if (U[J2K_Q1] > maxbp || U[J2K_Q2] > maxbp) { |
716 | 1.23k | ret = AVERROR_INVALIDDATA; |
717 | 1.23k | goto free; |
718 | 1.23k | } |
719 | | |
720 | 796k | for (int i = 0; i < 4; i++) { |
721 | 637k | m[J2K_Q1][i] = sigma_n[4 * q1 + i] * U[J2K_Q1] - ((emb_pat_k[J2K_Q1] >> i) & 1); |
722 | 637k | m[J2K_Q2][i] = sigma_n[4 * q2 + i] * U[J2K_Q2] - ((emb_pat_k[J2K_Q2] >> i) & 1); |
723 | 637k | } |
724 | | |
725 | 159k | recover_mag_sgn(mag_sgn_stream, J2K_Q1, q1, m_n, known_1, emb_pat_1, v, m, |
726 | 159k | E, mu_n, Dcup, Pcup, pLSB); |
727 | | |
728 | 159k | recover_mag_sgn(mag_sgn_stream, J2K_Q2, q2, m_n, known_1, emb_pat_1, v, m, |
729 | 159k | E, mu_n, Dcup, Pcup, pLSB); |
730 | | |
731 | 159k | q += 2; // Move to the next quad pair |
732 | 159k | } |
733 | | |
734 | 11.2k | if (quad_width % 2 == 1) { |
735 | 5.89k | q1 = q; |
736 | | |
737 | 5.89k | if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream, |
738 | 5.89k | dec_cxt_vlc_table0, Dcup, sig_pat, res_off, |
739 | 5.89k | emb_pat_k, emb_pat_1, J2K_Q1, context, Lcup, |
740 | 5.89k | Pcup)) < 0) |
741 | 0 | goto free; |
742 | | |
743 | 29.4k | for (int i = 0; i < 4; i++) |
744 | 23.5k | sigma_n[4 * q1 + i] = (sig_pat[J2K_Q1] >> i) & 1; |
745 | | |
746 | 5.89k | u[J2K_Q1] = 0; |
747 | | |
748 | 5.89k | if (res_off[J2K_Q1] == 1) { |
749 | 3.89k | u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
750 | 3.89k | u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf); |
751 | 3.89k | u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf); |
752 | 3.89k | u[J2K_Q1] = u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] * 4); |
753 | 3.89k | } |
754 | | |
755 | 5.89k | U[J2K_Q1] = kappa[J2K_Q1] + u[J2K_Q1]; |
756 | 5.89k | if (U[J2K_Q1] > maxbp) { |
757 | 439 | ret = AVERROR_INVALIDDATA; |
758 | 439 | goto free; |
759 | 439 | } |
760 | | |
761 | 27.2k | for (int i = 0; i < 4; i++) |
762 | 21.8k | m[J2K_Q1][i] = sigma_n[4 * q1 + i] * U[J2K_Q1] - ((emb_pat_k[J2K_Q1] >> i) & 1); |
763 | | |
764 | 5.45k | recover_mag_sgn(mag_sgn_stream, J2K_Q1, q1, m_n, known_1, emb_pat_1, v, m, |
765 | 5.45k | E, mu_n, Dcup, Pcup, pLSB); |
766 | | |
767 | 5.45k | q++; // move to next quad pair |
768 | 5.45k | } |
769 | | |
770 | | /** |
771 | | * Initial line pair end. As an optimization, we can replace modulo |
772 | | * operations with checking if a number is divisible , since that's the only |
773 | | * thing we need. This is paired with is_divisible. Credits to Daniel Lemire |
774 | | * blog post [1]. |
775 | | * |
776 | | * [1] |
777 | | * https://lemire.me/blog/2019/02/08/faster-remainders-when-the-divisor-is-a-constant-beating-compilers-and-libdivide/ |
778 | | * |
779 | | * It's UB on zero, but the spec doesn't allow a quad being zero, so we |
780 | | * error out early in case that's the case. |
781 | | */ |
782 | 10.8k | c = precompute_c(quad_width); |
783 | | |
784 | 89.0k | for (int row = 1; row < quad_height; row++) { |
785 | 834k | while ((q - (row * quad_width)) < quad_width - 1 && q < (quad_height * quad_width)) { |
786 | 755k | q1 = q; |
787 | 755k | q2 = q + 1; |
788 | 755k | context1 = sigma_n[4 * (q1 - quad_width) + 1]; |
789 | 755k | context1 += sigma_n[4 * (q1 - quad_width) + 3] << 2; // ne |
790 | | |
791 | 755k | if (!is_divisible(q1, c)) { |
792 | 691k | context1 |= sigma_n[4 * (q1 - quad_width) - 1]; // nw |
793 | 691k | context1 += (sigma_n[4 * q1 - 1] | sigma_n[4 * q1 - 2]) << 1; // sw | q |
794 | 691k | } |
795 | 755k | if (!is_divisible(q1 + 1, c)) |
796 | 755k | context1 |= sigma_n[4 * (q1 - quad_width) + 5] << 2; |
797 | | |
798 | 755k | if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream, |
799 | 755k | dec_cxt_vlc_table1, Dcup, sig_pat, res_off, |
800 | 755k | emb_pat_k, emb_pat_1, J2K_Q1, context1, Lcup, |
801 | 755k | Pcup)) |
802 | 755k | < 0) |
803 | 0 | goto free; |
804 | | |
805 | 3.77M | for (int i = 0; i < 4; i++) |
806 | 3.02M | sigma_n[4 * q1 + i] = (sig_pat[J2K_Q1] >> i) & 1; |
807 | | |
808 | 755k | context2 = sigma_n[4 * (q2 - quad_width) + 1]; |
809 | 755k | context2 += sigma_n[4 * (q2 - quad_width) + 3] << 2; |
810 | | |
811 | 755k | if (!is_divisible(q2, c)) { |
812 | 755k | context2 |= sigma_n[4 * (q2 - quad_width) - 1]; |
813 | 755k | context2 += (sigma_n[4 * q2 - 1] | sigma_n[4 * q2 - 2]) << 1; |
814 | 755k | } |
815 | 755k | if (!is_divisible(q2 + 1, c)) |
816 | 708k | context2 |= sigma_n[4 * (q2 - quad_width) + 5] << 2; |
817 | | |
818 | 755k | if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream, |
819 | 755k | dec_cxt_vlc_table1, Dcup, sig_pat, res_off, |
820 | 755k | emb_pat_k, emb_pat_1, J2K_Q2, context2, Lcup, |
821 | 755k | Pcup)) |
822 | 755k | < 0) |
823 | 0 | goto free; |
824 | | |
825 | 3.77M | for (int i = 0; i < 4; i++) |
826 | 3.02M | sigma_n[4 * q2 + i] = (sig_pat[J2K_Q2] >> i) & 1; |
827 | | |
828 | 755k | u[J2K_Q1] = 0; |
829 | 755k | u[J2K_Q2] = 0; |
830 | | |
831 | 755k | jpeg2000_bitbuf_refill_backwards(vlc_stream, vlc_buf); |
832 | | |
833 | 755k | if (res_off[J2K_Q1] == 1 && res_off[J2K_Q2] == 1) { |
834 | 3.40k | u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
835 | 3.40k | u_pfx[J2K_Q2] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
836 | | |
837 | 3.40k | u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf); |
838 | 3.40k | u_sfx[J2K_Q2] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q2], vlc_buf); |
839 | | |
840 | 3.40k | u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf); |
841 | 3.40k | u_ext[J2K_Q2] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q2], vlc_buf); |
842 | | |
843 | 3.40k | u[J2K_Q1] = u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] << 2); |
844 | 3.40k | u[J2K_Q2] = u_pfx[J2K_Q2] + u_sfx[J2K_Q2] + (u_ext[J2K_Q2] << 2); |
845 | | |
846 | 751k | } else if (res_off[J2K_Q1] == 1 || res_off[J2K_Q2] == 1) { |
847 | 33.9k | uint8_t pos = res_off[J2K_Q1] == 1 ? 0 : 1; |
848 | | |
849 | 33.9k | u_pfx[pos] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
850 | 33.9k | u_sfx[pos] = vlc_decode_u_suffix(vlc_stream, u_pfx[pos], vlc_buf); |
851 | 33.9k | u_ext[pos] = vlc_decode_u_extension(vlc_stream, u_sfx[pos], vlc_buf); |
852 | | |
853 | 33.9k | u[pos] = u_pfx[pos] + u_sfx[pos] + (u_ext[pos] << 2); |
854 | 33.9k | } |
855 | 755k | sp = sig_pat[J2K_Q1]; |
856 | | |
857 | 755k | gamma[J2K_Q1] = 1; |
858 | | |
859 | 755k | if (sp == 0 || sp == 1 || sp == 2 || sp == 4 || sp == 8) |
860 | 693k | gamma[J2K_Q1] = 0; |
861 | | |
862 | 755k | sp = sig_pat[J2K_Q2]; |
863 | | |
864 | 755k | gamma[J2K_Q2] = 1; |
865 | | |
866 | 755k | if (sp == 0 || sp == 1 || sp == 2 || sp == 4 || sp == 8) |
867 | 694k | gamma[J2K_Q2] = 0; |
868 | | |
869 | 755k | E_n[J2K_Q1] = E[4 * (q1 - quad_width) + 1]; |
870 | 755k | E_n[J2K_Q2] = E[4 * (q2 - quad_width) + 1]; |
871 | | |
872 | 755k | E_ne[J2K_Q1] = E[4 * (q1 - quad_width) + 3]; |
873 | 755k | E_ne[J2K_Q2] = E[4 * (q2 - quad_width) + 3]; |
874 | | |
875 | 755k | E_nw[J2K_Q1] = (!is_divisible(q1, c)) * E[FFMAX((4 * (q1 - quad_width) - 1), 0)]; |
876 | 755k | E_nw[J2K_Q2] = (!is_divisible(q2, c)) * E[FFMAX((4 * (q2 - quad_width) - 1), 0)]; |
877 | | |
878 | 755k | E_nf[J2K_Q1] = (!is_divisible(q1 + 1, c)) * E[4 * (q1 - quad_width) + 5]; |
879 | 755k | E_nf[J2K_Q2] = (!is_divisible(q2 + 1, c)) * E[4 * (q2 - quad_width) + 5]; |
880 | | |
881 | 755k | max_e[J2K_Q1] = FFMAX(E_nw[J2K_Q1], FFMAX3(E_n[J2K_Q1], E_ne[J2K_Q1], E_nf[J2K_Q1])); |
882 | 755k | max_e[J2K_Q2] = FFMAX(E_nw[J2K_Q2], FFMAX3(E_n[J2K_Q2], E_ne[J2K_Q2], E_nf[J2K_Q2])); |
883 | | |
884 | 755k | kappa[J2K_Q1] = FFMAX(1, gamma[J2K_Q1] * (max_e[J2K_Q1] - 1)); |
885 | 755k | kappa[J2K_Q2] = FFMAX(1, gamma[J2K_Q2] * (max_e[J2K_Q2] - 1)); |
886 | | |
887 | 755k | U[J2K_Q1] = kappa[J2K_Q1] + u[J2K_Q1]; |
888 | 755k | U[J2K_Q2] = kappa[J2K_Q2] + u[J2K_Q2]; |
889 | 755k | if (U[J2K_Q1] > maxbp || U[J2K_Q2] > maxbp) { |
890 | 1.79k | ret = AVERROR_INVALIDDATA; |
891 | 1.79k | goto free; |
892 | 1.79k | } |
893 | | |
894 | 3.76M | for (int i = 0; i < 4; i++) { |
895 | 3.01M | m[J2K_Q1][i] = sigma_n[4 * q1 + i] * U[J2K_Q1] - ((emb_pat_k[J2K_Q1] >> i) & 1); |
896 | 3.01M | m[J2K_Q2][i] = sigma_n[4 * q2 + i] * U[J2K_Q2] - ((emb_pat_k[J2K_Q2] >> i) & 1); |
897 | 3.01M | } |
898 | 753k | recover_mag_sgn(mag_sgn_stream, J2K_Q1, q1, m_n, known_1, emb_pat_1, v, m, |
899 | 753k | E, mu_n, Dcup, Pcup, pLSB); |
900 | | |
901 | 753k | recover_mag_sgn(mag_sgn_stream, J2K_Q2, q2, m_n, known_1, emb_pat_1, v, m, |
902 | 753k | E, mu_n, Dcup, Pcup, pLSB); |
903 | | |
904 | 753k | q += 2; // Move to the next quad pair |
905 | 753k | } |
906 | | |
907 | 79.0k | if (quad_width % 2 == 1) { |
908 | 32.5k | q1 = q; |
909 | | |
910 | | /* calculate context for current quad */ |
911 | 32.5k | context1 = sigma_n[4 * (q1 - quad_width) + 1]; |
912 | 32.5k | context1 += (sigma_n[4 * (q1 - quad_width) + 3] << 2); |
913 | | |
914 | 32.5k | if (!is_divisible(q1, c)) { |
915 | 15.3k | context1 |= sigma_n[4 * (q1 - quad_width) - 1]; |
916 | 15.3k | context1 += (sigma_n[4 * q1 - 1] | sigma_n[4 * q1 - 2]) << 1; |
917 | 15.3k | } |
918 | 32.5k | if (!is_divisible(q1 + 1, c)) |
919 | 0 | context1 |= sigma_n[4 * (q1 - quad_width) + 5] << 2; |
920 | | |
921 | 32.5k | if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream, |
922 | 32.5k | dec_cxt_vlc_table1, Dcup, sig_pat, res_off, |
923 | 32.5k | emb_pat_k, emb_pat_1, J2K_Q1, context1, Lcup, |
924 | 32.5k | Pcup)) < 0) |
925 | 0 | goto free; |
926 | | |
927 | 162k | for (int i = 0; i < 4; i++) |
928 | 130k | sigma_n[4 * q1 + i] = (sig_pat[J2K_Q1] >> i) & 1; |
929 | | |
930 | 32.5k | u[J2K_Q1] = 0; |
931 | | |
932 | | /* Recover mag_sgn value */ |
933 | 32.5k | if (res_off[J2K_Q1] == 1) { |
934 | 2.40k | u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf); |
935 | 2.40k | u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf); |
936 | 2.40k | u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf); |
937 | | |
938 | 2.40k | u[J2K_Q1] = u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] << 2); |
939 | 2.40k | } |
940 | | |
941 | 32.5k | sp = sig_pat[J2K_Q1]; |
942 | | |
943 | 32.5k | gamma[J2K_Q1] = 1; |
944 | | |
945 | 32.5k | if (sp == 0 || sp == 1 || sp == 2 || sp == 4 || sp == 8) |
946 | 29.5k | gamma[J2K_Q1] = 0; |
947 | | |
948 | 32.5k | E_n[J2K_Q1] = E[4 * (q1 - quad_width) + 1]; |
949 | | |
950 | 32.5k | E_ne[J2K_Q1] = E[4 * (q1 - quad_width) + 3]; |
951 | | |
952 | 32.5k | E_nw[J2K_Q1] = (!is_divisible(q1, c)) * E[FFMAX((4 * (q1 - quad_width) - 1), 0)]; |
953 | | |
954 | 32.5k | E_nf[J2K_Q1] = (!is_divisible(q1 + 1, c)) * E[4 * (q1 - quad_width) + 5]; |
955 | | |
956 | 32.5k | max_e[J2K_Q1] = FFMAX(E_nw[J2K_Q1], FFMAX3(E_n[J2K_Q1], E_ne[J2K_Q1], E_nf[J2K_Q1])); |
957 | | |
958 | 32.5k | kappa[J2K_Q1] = FFMAX(1, gamma[J2K_Q1] * (max_e[J2K_Q1] - 1)); |
959 | | |
960 | 32.5k | U[J2K_Q1] = kappa[J2K_Q1] + u[J2K_Q1]; |
961 | 32.5k | if (U[J2K_Q1] > maxbp) { |
962 | 829 | ret = AVERROR_INVALIDDATA; |
963 | 829 | goto free; |
964 | 829 | } |
965 | | |
966 | 158k | for (int i = 0; i < 4; i++) |
967 | 126k | m[J2K_Q1][i] = sigma_n[4 * q1 + i] * U[J2K_Q1] - ((emb_pat_k[J2K_Q1] >> i) & 1); |
968 | | |
969 | 31.6k | recover_mag_sgn(mag_sgn_stream, J2K_Q1, q1, m_n, known_1, emb_pat_1, v, m, |
970 | 31.6k | E, mu_n, Dcup, Pcup, pLSB); |
971 | 31.6k | q += 1; |
972 | 31.6k | } |
973 | 79.0k | } |
974 | | |
975 | | // convert to raster-scan |
976 | 90.6k | for (int y = 0; y < quad_height; y++) { |
977 | 1.69M | for (int x = 0; x < quad_width; x++) { |
978 | 1.61M | int j1, j2; |
979 | 1.61M | int x1, x2 , x3; |
980 | | |
981 | 1.61M | j1 = 2 * y; |
982 | 1.61M | j2 = 2 * x; |
983 | | |
984 | 1.61M | sample_buf[j2 + (j1 * stride)] = (int32_t)*mu; |
985 | 1.61M | jpeg2000_modify_state(j1, j2, stride, *sigma, block_states); |
986 | 1.61M | sigma += 1; |
987 | 1.61M | mu += 1; |
988 | | |
989 | 1.61M | x1 = y != quad_height - 1 || is_border_y == 0; |
990 | 1.61M | sample_buf[j2 + ((j1 + 1) * stride)] = ((int32_t)*mu) * x1; |
991 | 1.61M | jpeg2000_modify_state(j1 + 1, j2, stride, (*sigma) * x1, block_states); |
992 | 1.61M | sigma += 1; |
993 | 1.61M | mu += 1; |
994 | | |
995 | 1.61M | x2 = x != quad_width - 1 || is_border_x == 0; |
996 | 1.61M | sample_buf[(j2 + 1) + (j1 * stride)] = ((int32_t)*mu) * x2; |
997 | 1.61M | jpeg2000_modify_state(j1, j2 + 1, stride, (*sigma) * x2, block_states); |
998 | 1.61M | sigma += 1; |
999 | 1.61M | mu += 1; |
1000 | | |
1001 | 1.61M | x3 = x1 | x2; |
1002 | 1.61M | sample_buf[(j2 + 1) + (j1 + 1) * stride] = ((int32_t)*mu) * x3; |
1003 | 1.61M | jpeg2000_modify_state(j1 + 1, j2 + 1, stride, (*sigma) * x3, block_states); |
1004 | 1.61M | sigma += 1; |
1005 | 1.61M | mu += 1; |
1006 | 1.61M | } |
1007 | 82.4k | } |
1008 | 8.21k | ret = 1; |
1009 | 12.5k | free: |
1010 | 12.5k | av_freep(&sigma_n); |
1011 | 12.5k | av_freep(&E); |
1012 | 12.5k | av_freep(&mu_n); |
1013 | 12.5k | return ret; |
1014 | 8.21k | } |
1015 | | |
1016 | | static void jpeg2000_calc_mbr(uint8_t *mbr, const uint16_t i, const uint16_t j, |
1017 | | const uint32_t mbr_info, uint8_t causal_cond, |
1018 | | uint8_t *block_states, int stride) |
1019 | 3.06M | { |
1020 | 3.06M | uint8_t *state_p0 = block_states + i * stride + j; |
1021 | 3.06M | uint8_t *state_p1 = block_states + (i + 1) * stride + j; |
1022 | 3.06M | uint8_t *state_p2 = block_states + (i + 2) * stride + j; |
1023 | | |
1024 | 3.06M | uint8_t mbr0 = state_p0[0] | state_p0[1] | state_p0[2]; |
1025 | 3.06M | uint8_t mbr1 = state_p1[0] | state_p1[2]; |
1026 | 3.06M | uint8_t mbr2 = state_p2[0] | state_p2[1] | state_p2[2]; |
1027 | 3.06M | *mbr = mbr0 | mbr1 | (mbr2 & causal_cond); |
1028 | 3.06M | *mbr |= (mbr0 >> HT_SHIFT_REF) & (mbr0 >> HT_SHIFT_SCAN); |
1029 | 3.06M | *mbr |= (mbr1 >> HT_SHIFT_REF) & (mbr1 >> HT_SHIFT_SCAN); |
1030 | 3.06M | *mbr |= (mbr2 >> HT_SHIFT_REF) & (mbr2 >> HT_SHIFT_SCAN) & causal_cond; |
1031 | 3.06M | *mbr &= 1; |
1032 | 3.06M | } |
1033 | | |
1034 | | static void jpeg2000_process_stripes_block(StateVars *sig_prop, int i_s, int j_s, |
1035 | | int width, int height, int stride, int pLSB, |
1036 | | int32_t *sample_buf, uint8_t *block_states, |
1037 | | uint8_t *magref_segment, uint32_t magref_length, |
1038 | | uint8_t is_causal) |
1039 | 299k | { |
1040 | 1.46M | for (int j = j_s; j < j_s + width; j++) { |
1041 | 1.16M | uint32_t mbr_info = 0; |
1042 | 4.59M | for (int i = i_s; i < i_s + height; i++) { |
1043 | 3.42M | int modify_state; |
1044 | 3.42M | uint8_t bit; |
1045 | 3.42M | uint8_t causal_cond = (is_causal == 0) || (i != (i_s + height - 1)); |
1046 | 3.42M | int32_t *sp = &sample_buf[j + (i * (stride))]; |
1047 | 3.42M | uint8_t mbr = 0; |
1048 | | |
1049 | 3.42M | if (jpeg2000_get_state(i, j, stride, HT_SHIFT_SIGMA, block_states) == 0) |
1050 | 3.06M | jpeg2000_calc_mbr(&mbr, i, j, mbr_info & 0x1EF, causal_cond, block_states, stride); |
1051 | 3.42M | mbr_info >>= 3; |
1052 | | |
1053 | 3.42M | modify_state = block_states[(i + 1) * stride + (j + 1)]; |
1054 | 3.42M | modify_state |= 1 << HT_SHIFT_SCAN; |
1055 | 3.42M | if (mbr != 0) { |
1056 | 982k | modify_state |= 1 << HT_SHIFT_REF_IND; |
1057 | 982k | bit = jpeg2000_peek_bit(sig_prop, magref_segment, magref_length); |
1058 | 982k | modify_state |= bit << HT_SHIFT_REF; |
1059 | 982k | *sp |= bit << pLSB; |
1060 | 982k | *sp |= bit << (pLSB - 1); // Add 0.5 (reconstruction parameter = 1/2) |
1061 | 982k | } |
1062 | 3.42M | jpeg2000_modify_state(i, j, stride, modify_state, block_states); |
1063 | 3.42M | } |
1064 | 1.16M | } |
1065 | | // decode sign |
1066 | 1.46M | for (int j = j_s; j < j_s + width; j++) { |
1067 | 4.59M | for (int i = i_s; i < i_s + height; i++) { |
1068 | 3.42M | uint8_t bit; |
1069 | 3.42M | int32_t *sp = &sample_buf[j + (i * (stride))]; |
1070 | 3.42M | uint8_t *state_p = block_states + (i + 1) * stride + (j + 1); |
1071 | 3.42M | if ((state_p[0] >> HT_SHIFT_REF) & 1) { |
1072 | 75.6k | bit = jpeg2000_peek_bit(sig_prop, magref_segment, magref_length); |
1073 | 75.6k | *sp |= (uint32_t)bit << 31; |
1074 | 75.6k | } |
1075 | 3.42M | } |
1076 | 1.16M | } |
1077 | 299k | } |
1078 | | |
1079 | | /** |
1080 | | * See procedure decodeSigPropMag at Rec. ITU-T T.814, 7.4. |
1081 | | */ |
1082 | | av_noinline |
1083 | | static void jpeg2000_decode_sigprop_segment(Jpeg2000Cblk *cblk, uint16_t width, uint16_t height, |
1084 | | const int stride, uint8_t *magref_segment, |
1085 | | uint32_t magref_length, uint8_t pLSB, |
1086 | | int32_t *sample_buf, uint8_t *block_states) |
1087 | 5.93k | { |
1088 | 5.93k | StateVars sp_dec; |
1089 | | |
1090 | 5.93k | const uint16_t num_v_stripe = height / 4; |
1091 | 5.93k | const uint16_t num_h_stripe = width / 4; |
1092 | 5.93k | int b_width = 4; |
1093 | 5.93k | int b_height = 4; |
1094 | | |
1095 | 5.93k | int last_width; |
1096 | 5.93k | uint16_t i = 0, j = 0; |
1097 | 5.93k | uint8_t is_causal = cblk->modes & JPEG2000_CBLK_VSC; |
1098 | | |
1099 | 5.93k | jpeg2000_init_zero(&sp_dec); |
1100 | | |
1101 | 23.8k | for (int n1 = 0; n1 < num_v_stripe; n1++) { |
1102 | 17.9k | j = 0; |
1103 | 210k | for (int n2 = 0; n2 < num_h_stripe; n2++) { |
1104 | 192k | jpeg2000_process_stripes_block(&sp_dec, i, j, b_width, b_height, stride, |
1105 | 192k | pLSB, sample_buf, block_states, magref_segment, |
1106 | 192k | magref_length, is_causal); |
1107 | 192k | j += 4; |
1108 | 192k | } |
1109 | 17.9k | last_width = width % 4; |
1110 | 17.9k | if (last_width) |
1111 | 11.1k | jpeg2000_process_stripes_block(&sp_dec, i, j, last_width, b_height, stride, |
1112 | 11.1k | pLSB, sample_buf, block_states, magref_segment, |
1113 | 11.1k | magref_length, is_causal); |
1114 | 17.9k | i += 4; |
1115 | 17.9k | } |
1116 | | |
1117 | | /* Decode remaining height stripes */ |
1118 | 5.93k | b_height = height % 4; |
1119 | 5.93k | j = 0; |
1120 | 100k | for (int n2 = 0; n2 < num_h_stripe; n2++) { |
1121 | 94.1k | jpeg2000_process_stripes_block(&sp_dec, i, j, b_width, b_height, stride, |
1122 | 94.1k | pLSB, sample_buf, block_states, magref_segment, |
1123 | 94.1k | magref_length, is_causal); |
1124 | 94.1k | j += 4; |
1125 | 94.1k | } |
1126 | 5.93k | last_width = width % 4; |
1127 | 5.93k | if (last_width) |
1128 | 2.50k | jpeg2000_process_stripes_block(&sp_dec, i, j, last_width, b_height, stride, |
1129 | 2.50k | pLSB, sample_buf, block_states, magref_segment, |
1130 | 2.50k | magref_length, is_causal); |
1131 | 5.93k | } |
1132 | | |
1133 | | /** |
1134 | | * See procedure decodeSigPropMag at Rec. ITU-T T.814, 7.5. |
1135 | | */ |
1136 | | static void |
1137 | | jpeg2000_decode_magref_segment( uint16_t width, uint16_t block_height, const int stride, |
1138 | | uint8_t *magref_segment,uint32_t magref_length, |
1139 | | uint8_t pLSB, int32_t *sample_buf, uint8_t *block_states) |
1140 | 3.84k | { |
1141 | | |
1142 | 3.84k | StateVars mag_ref = { 0 }; |
1143 | 3.84k | const uint16_t num_v_stripe = block_height / 4; |
1144 | 3.84k | uint16_t height = 4; |
1145 | 3.84k | uint16_t i_start = 0; |
1146 | 3.84k | int32_t *sp; |
1147 | 3.84k | int32_t bit; |
1148 | 3.84k | int32_t tmp; |
1149 | 3.84k | jpeg2000_init_mag_ref(&mag_ref, magref_length); |
1150 | | |
1151 | 13.2k | for (int n1 = 0; n1 < num_v_stripe; n1++) { |
1152 | 444k | for (int j = 0; j < width; j++) { |
1153 | 2.17M | for (int i = i_start; i < i_start + height; i++) { |
1154 | | /** |
1155 | | * We move column wise, going from one quad to another. See |
1156 | | * Rec. ITU-T T.814, Figure 7. |
1157 | | */ |
1158 | 1.73M | sp = &sample_buf[j + i * stride]; |
1159 | 1.73M | if (jpeg2000_get_state(i, j, stride, HT_SHIFT_SIGMA, block_states) != 0) { |
1160 | 224k | jpeg2000_modify_state(i, j, stride, 1 << HT_SHIFT_REF_IND, block_states); |
1161 | 224k | bit = jpeg2000_import_magref_bit(&mag_ref, magref_segment, magref_length); |
1162 | 224k | tmp = 0xFFFFFFFE | (uint32_t)bit; |
1163 | 224k | tmp = (uint32_t)tmp << pLSB; |
1164 | 224k | sp[0] &= tmp; |
1165 | 224k | sp[0] |= 1 << (pLSB - 1); // Add 0.5 (reconstruction parameter = 1/2) |
1166 | 224k | } |
1167 | 1.73M | } |
1168 | 434k | } |
1169 | 9.39k | i_start += 4; |
1170 | 9.39k | } |
1171 | 3.84k | height = block_height % 4; |
1172 | 134k | for (int j = 0; j < width; j++) { |
1173 | 187k | for (int i = i_start; i < i_start + height; i++) { |
1174 | 56.5k | sp = &sample_buf[j + i * stride]; |
1175 | 56.5k | if (jpeg2000_get_state(i, j, stride, HT_SHIFT_SIGMA, block_states) != 0) { |
1176 | 15.9k | jpeg2000_modify_state(i, j, stride, 1 << HT_SHIFT_REF_IND, block_states); |
1177 | 15.9k | bit = jpeg2000_import_magref_bit(&mag_ref, magref_segment, magref_length); |
1178 | 15.9k | tmp = 0xFFFFFFFE | (uint32_t)bit; |
1179 | 15.9k | tmp = (uint32_t)tmp << pLSB; |
1180 | 15.9k | sp[0] &= tmp; |
1181 | 15.9k | sp[0] |= 1 << (pLSB - 1); // Add 0.5 (reconstruction parameter = 1/2) |
1182 | 15.9k | } |
1183 | 56.5k | } |
1184 | 131k | } |
1185 | 3.84k | } |
1186 | | |
1187 | | |
1188 | | int |
1189 | | ff_jpeg2000_decode_htj2k(const Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty, Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk, |
1190 | | int width, int height, int M_b, uint8_t roi_shift) |
1191 | 554k | { |
1192 | 554k | uint8_t p0 = 0; // 3 * p0 = Number of placeholder passes |
1193 | 554k | uint32_t Lcup; // Length of HT cleanup segment |
1194 | 554k | uint32_t Lref; // Length of Refinement segment |
1195 | 554k | uint32_t Scup; // HT cleanup segment suffix length |
1196 | 554k | uint32_t Pcup; // HT cleanup segment prefix length |
1197 | | |
1198 | 554k | uint8_t S_blk; // Number of skipped magnitude bitplanes |
1199 | 554k | uint8_t pLSB; |
1200 | | |
1201 | 554k | uint8_t *Dcup; // Byte of an HT cleanup segment |
1202 | 554k | uint8_t *Dref; // Byte of an HT refinement segment |
1203 | | |
1204 | 554k | int z_blk; // Number of ht coding pass |
1205 | | |
1206 | 554k | uint8_t num_plhd_passes; // Number of placeholder passes |
1207 | | |
1208 | 554k | StateVars mag_sgn; // Magnitude and Sign |
1209 | 554k | StateVars mel; // Adaptive run-length coding |
1210 | 554k | StateVars vlc; // Variable Length coding |
1211 | 554k | StateVars sig_prop; // Significance propagation |
1212 | | |
1213 | 554k | MelDecoderState mel_state; |
1214 | | |
1215 | 554k | int ret; |
1216 | | |
1217 | | /* Temporary buffers */ |
1218 | 554k | int32_t *sample_buf = NULL; |
1219 | 554k | uint8_t *block_states = NULL; |
1220 | | |
1221 | 554k | int32_t n, val; // Post-processing |
1222 | 554k | const uint32_t mask = UINT32_MAX >> (M_b + 1); // bit mask for ROI detection |
1223 | | |
1224 | 554k | uint8_t num_rempass; |
1225 | | |
1226 | 554k | const int quad_buf_width = width + 4; |
1227 | 554k | const int quad_buf_height = height + 4; |
1228 | | |
1229 | | /* codeblock size as constrained by Rec. ITU-T T.800, Table A.18 */ |
1230 | 554k | av_assert0(width <= 1024U && height <= 1024U); |
1231 | 554k | av_assert0(width * height <= 4096); |
1232 | 554k | av_assert0(width * height > 0); |
1233 | | |
1234 | 554k | memset(t1->data, 0, t1->stride * height * sizeof(*t1->data)); |
1235 | 554k | memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags)); |
1236 | | |
1237 | 554k | if (cblk->npasses == 0) |
1238 | 528k | return 0; |
1239 | | |
1240 | 25.7k | num_rempass = cblk->npasses % 3; // Number of remainder passes |
1241 | 25.7k | num_plhd_passes = num_rempass ? cblk->npasses - num_rempass : cblk->npasses - 3; |
1242 | 25.7k | av_assert0(num_plhd_passes % 3 == 0); |
1243 | 25.7k | p0 = num_plhd_passes / 3; |
1244 | 25.7k | z_blk = cblk->npasses - num_plhd_passes; |
1245 | | |
1246 | 25.7k | if (z_blk <= 0) |
1247 | 0 | return 0; // No passes within this set, continue |
1248 | | |
1249 | 25.7k | Lcup = cblk->pass_lengths[0]; |
1250 | 25.7k | Lref = cblk->pass_lengths[1]; |
1251 | | |
1252 | 25.7k | if (Lcup < 2) { |
1253 | 4.95k | av_log(s->avctx, AV_LOG_ERROR, |
1254 | 4.95k | "Cleanup pass length must be at least 2 bytes in length\n"); |
1255 | 4.95k | return AVERROR_INVALIDDATA; |
1256 | 4.95k | } |
1257 | 20.7k | Dcup = cblk->data; |
1258 | 20.7k | Dref = cblk->data + Lcup; // Dref comes after the refinement segment |
1259 | | |
1260 | 20.7k | cblk->data[cblk->length] = 0xFF; // an extra byte for refinement segment (buffer->last) |
1261 | | |
1262 | 20.7k | S_blk = p0 + cblk->zbp; |
1263 | 20.7k | cblk->zbp = S_blk - 1; |
1264 | 20.7k | pLSB = 30 - S_blk; |
1265 | | |
1266 | 20.7k | Scup = (Dcup[Lcup - 1] << 4) + (Dcup[Lcup - 2] & 0x0F); |
1267 | | |
1268 | 20.7k | if (Scup < 2 || Scup > Lcup || Scup > 4079) { |
1269 | 8.05k | av_log(s->avctx, AV_LOG_ERROR, "Cleanup pass suffix length is invalid %d\n", |
1270 | 8.05k | Scup); |
1271 | 8.05k | ret = AVERROR_INVALIDDATA; |
1272 | 8.05k | goto free; |
1273 | 8.05k | } |
1274 | 12.7k | Pcup = Lcup - Scup; |
1275 | | |
1276 | | /* modDcup shall be done before the creation of vlc instance. */ |
1277 | 12.7k | Dcup[Lcup - 1] = 0xFF; |
1278 | 12.7k | Dcup[Lcup - 2] |= 0x0F; |
1279 | | |
1280 | | /* Magnitude and refinement */ |
1281 | 12.7k | jpeg2000_init_zero(&mag_sgn); |
1282 | 12.7k | jpeg2000_bitbuf_refill_forward(&mag_sgn, Dcup, Pcup); |
1283 | | |
1284 | | /* Significance propagation */ |
1285 | 12.7k | jpeg2000_init_zero(&sig_prop); |
1286 | | |
1287 | | /* Adaptive run length */ |
1288 | 12.7k | jpeg2000_init_mel(&mel, Pcup); |
1289 | | |
1290 | | /* Variable Length coding */ |
1291 | 12.7k | jpeg2000_init_vlc(&vlc, Lcup, Pcup, Dcup); |
1292 | | |
1293 | 12.7k | jpeg2000_init_mel_decoder(&mel_state); |
1294 | | |
1295 | 12.7k | sample_buf = av_calloc(quad_buf_width * quad_buf_height, sizeof(int32_t)); |
1296 | 12.7k | block_states = av_calloc(quad_buf_width * quad_buf_height, sizeof(uint8_t)); |
1297 | | |
1298 | 12.7k | if (!sample_buf || !block_states) { |
1299 | 0 | ret = AVERROR(ENOMEM); |
1300 | 0 | goto free; |
1301 | 0 | } |
1302 | 12.7k | if ((ret = jpeg2000_decode_ht_cleanup_segment(s, cblk, t1, &mel_state, &mel, &vlc, |
1303 | 12.7k | &mag_sgn, Dcup, Lcup, Pcup, pLSB, width, |
1304 | 12.7k | height, quad_buf_width, sample_buf, block_states)) < 0) { |
1305 | 4.49k | av_log(s->avctx, AV_LOG_ERROR, "Bad HT cleanup segment\n"); |
1306 | 4.49k | goto free; |
1307 | 4.49k | } |
1308 | | |
1309 | 8.21k | if (z_blk > 1) |
1310 | 5.93k | jpeg2000_decode_sigprop_segment(cblk, width, height, quad_buf_width, Dref, Lref, |
1311 | 5.93k | pLSB - 1, sample_buf, block_states); |
1312 | | |
1313 | 8.21k | if (z_blk > 2) |
1314 | 3.84k | jpeg2000_decode_magref_segment(width, height, quad_buf_width, Dref, Lref, |
1315 | 3.84k | pLSB - 1, sample_buf, block_states); |
1316 | | |
1317 | | /* Reconstruct the sample values */ |
1318 | 169k | for (int y = 0; y < height; y++) { |
1319 | 6.30M | for (int x = 0; x < width; x++) { |
1320 | 6.14M | int32_t sign; |
1321 | | |
1322 | 6.14M | n = x + (y * t1->stride); |
1323 | 6.14M | val = sample_buf[x + (y * quad_buf_width)]; |
1324 | 6.14M | sign = val & INT32_MIN; |
1325 | 6.14M | val &= INT32_MAX; |
1326 | | /* ROI shift, if necessary */ |
1327 | 6.14M | if (roi_shift && (((uint32_t)val & ~mask) == 0)) |
1328 | 71.6k | val <<= roi_shift; |
1329 | 6.14M | t1->data[n] = val | sign; /* NOTE: Binary point for reconstruction value is located in 31 - M_b */ |
1330 | 6.14M | } |
1331 | 160k | } |
1332 | 20.7k | free: |
1333 | 20.7k | av_freep(&sample_buf); |
1334 | 20.7k | av_freep(&block_states); |
1335 | 20.7k | return ret; |
1336 | 8.21k | } |
1337 | | |
1338 | | /** |
1339 | | * CtxVLC tables (see Rec. ITU-T T.800, Annex C) as found at |
1340 | | * https://github.com/osamu620/OpenHTJ2K (author: Osamu Watanabe) |
1341 | | */ |
1342 | | static const uint16_t dec_cxt_vlc_table1[1024] = { |
1343 | | 0x0016, 0x006A, 0x0046, 0x00DD, 0x0086, 0x888B, 0x0026, 0x444D, 0x0016, 0x00AA, 0x0046, 0x88AD, 0x0086, |
1344 | | 0x003A, 0x0026, 0x00DE, 0x0016, 0x00CA, 0x0046, 0x009D, 0x0086, 0x005A, 0x0026, 0x222D, 0x0016, 0x009A, |
1345 | | 0x0046, 0x007D, 0x0086, 0x01FD, 0x0026, 0x007E, 0x0016, 0x006A, 0x0046, 0x88CD, 0x0086, 0x888B, 0x0026, |
1346 | | 0x111D, 0x0016, 0x00AA, 0x0046, 0x005D, 0x0086, 0x003A, 0x0026, 0x00EE, 0x0016, 0x00CA, 0x0046, 0x00BD, |
1347 | | 0x0086, 0x005A, 0x0026, 0x11FF, 0x0016, 0x009A, 0x0046, 0x003D, 0x0086, 0x04ED, 0x0026, 0x2AAF, 0x0016, |
1348 | | 0x006A, 0x0046, 0x00DD, 0x0086, 0x888B, 0x0026, 0x444D, 0x0016, 0x00AA, 0x0046, 0x88AD, 0x0086, 0x003A, |
1349 | | 0x0026, 0x44EF, 0x0016, 0x00CA, 0x0046, 0x009D, 0x0086, 0x005A, 0x0026, 0x222D, 0x0016, 0x009A, 0x0046, |
1350 | | 0x007D, 0x0086, 0x01FD, 0x0026, 0x00BE, 0x0016, 0x006A, 0x0046, 0x88CD, 0x0086, 0x888B, 0x0026, 0x111D, |
1351 | | 0x0016, 0x00AA, 0x0046, 0x005D, 0x0086, 0x003A, 0x0026, 0x4CCF, 0x0016, 0x00CA, 0x0046, 0x00BD, 0x0086, |
1352 | | 0x005A, 0x0026, 0x00FE, 0x0016, 0x009A, 0x0046, 0x003D, 0x0086, 0x04ED, 0x0026, 0x006F, 0x0002, 0x0088, |
1353 | | 0x0002, 0x005C, 0x0002, 0x0018, 0x0002, 0x00DE, 0x0002, 0x0028, 0x0002, 0x009C, 0x0002, 0x004A, 0x0002, |
1354 | | 0x007E, 0x0002, 0x0088, 0x0002, 0x00CC, 0x0002, 0x0018, 0x0002, 0x888F, 0x0002, 0x0028, 0x0002, 0x00FE, |
1355 | | 0x0002, 0x003A, 0x0002, 0x222F, 0x0002, 0x0088, 0x0002, 0x04FD, 0x0002, 0x0018, 0x0002, 0x00BE, 0x0002, |
1356 | | 0x0028, 0x0002, 0x00BF, 0x0002, 0x004A, 0x0002, 0x006E, 0x0002, 0x0088, 0x0002, 0x00AC, 0x0002, 0x0018, |
1357 | | 0x0002, 0x444F, 0x0002, 0x0028, 0x0002, 0x00EE, 0x0002, 0x003A, 0x0002, 0x113F, 0x0002, 0x0088, 0x0002, |
1358 | | 0x005C, 0x0002, 0x0018, 0x0002, 0x00CF, 0x0002, 0x0028, 0x0002, 0x009C, 0x0002, 0x004A, 0x0002, 0x006F, |
1359 | | 0x0002, 0x0088, 0x0002, 0x00CC, 0x0002, 0x0018, 0x0002, 0x009F, 0x0002, 0x0028, 0x0002, 0x00EF, 0x0002, |
1360 | | 0x003A, 0x0002, 0x233F, 0x0002, 0x0088, 0x0002, 0x04FD, 0x0002, 0x0018, 0x0002, 0x00AF, 0x0002, 0x0028, |
1361 | | 0x0002, 0x44FF, 0x0002, 0x004A, 0x0002, 0x005F, 0x0002, 0x0088, 0x0002, 0x00AC, 0x0002, 0x0018, 0x0002, |
1362 | | 0x007F, 0x0002, 0x0028, 0x0002, 0x00DF, 0x0002, 0x003A, 0x0002, 0x111F, 0x0002, 0x0028, 0x0002, 0x005C, |
1363 | | 0x0002, 0x008A, 0x0002, 0x00BF, 0x0002, 0x0018, 0x0002, 0x00FE, 0x0002, 0x00CC, 0x0002, 0x007E, 0x0002, |
1364 | | 0x0028, 0x0002, 0x8FFF, 0x0002, 0x004A, 0x0002, 0x007F, 0x0002, 0x0018, 0x0002, 0x00DF, 0x0002, 0x00AC, |
1365 | | 0x0002, 0x133F, 0x0002, 0x0028, 0x0002, 0x222D, 0x0002, 0x008A, 0x0002, 0x00BE, 0x0002, 0x0018, 0x0002, |
1366 | | 0x44EF, 0x0002, 0x2AAD, 0x0002, 0x006E, 0x0002, 0x0028, 0x0002, 0x15FF, 0x0002, 0x004A, 0x0002, 0x009E, |
1367 | | 0x0002, 0x0018, 0x0002, 0x00CF, 0x0002, 0x003C, 0x0002, 0x223F, 0x0002, 0x0028, 0x0002, 0x005C, 0x0002, |
1368 | | 0x008A, 0x0002, 0x2BBF, 0x0002, 0x0018, 0x0002, 0x04EF, 0x0002, 0x00CC, 0x0002, 0x006F, 0x0002, 0x0028, |
1369 | | 0x0002, 0x27FF, 0x0002, 0x004A, 0x0002, 0x009F, 0x0002, 0x0018, 0x0002, 0x00DE, 0x0002, 0x00AC, 0x0002, |
1370 | | 0x444F, 0x0002, 0x0028, 0x0002, 0x222D, 0x0002, 0x008A, 0x0002, 0x8AAF, 0x0002, 0x0018, 0x0002, 0x00EE, |
1371 | | 0x0002, 0x2AAD, 0x0002, 0x005F, 0x0002, 0x0028, 0x0002, 0x44FF, 0x0002, 0x004A, 0x0002, 0x888F, 0x0002, |
1372 | | 0x0018, 0x0002, 0xAAAF, 0x0002, 0x003C, 0x0002, 0x111F, 0x0004, 0x8FFD, 0x0028, 0x005C, 0x0004, 0x00BC, |
1373 | | 0x008A, 0x66FF, 0x0004, 0x00CD, 0x0018, 0x111D, 0x0004, 0x009C, 0x003A, 0x8AAF, 0x0004, 0x00FC, 0x0028, |
1374 | | 0x133D, 0x0004, 0x00AC, 0x004A, 0x3BBF, 0x0004, 0x2BBD, 0x0018, 0x5FFF, 0x0004, 0x006C, 0x157D, 0x455F, |
1375 | | 0x0004, 0x2FFD, 0x0028, 0x222D, 0x0004, 0x22AD, 0x008A, 0x44EF, 0x0004, 0x00CC, 0x0018, 0x4FFF, 0x0004, |
1376 | | 0x007C, 0x003A, 0x447F, 0x0004, 0x04DD, 0x0028, 0x233D, 0x0004, 0x009D, 0x004A, 0x00DE, 0x0004, 0x88BD, |
1377 | | 0x0018, 0xAFFF, 0x0004, 0x115D, 0x1FFD, 0x444F, 0x0004, 0x8FFD, 0x0028, 0x005C, 0x0004, 0x00BC, 0x008A, |
1378 | | 0x8CEF, 0x0004, 0x00CD, 0x0018, 0x111D, 0x0004, 0x009C, 0x003A, 0x888F, 0x0004, 0x00FC, 0x0028, 0x133D, |
1379 | | 0x0004, 0x00AC, 0x004A, 0x44DF, 0x0004, 0x2BBD, 0x0018, 0x8AFF, 0x0004, 0x006C, 0x157D, 0x006F, 0x0004, |
1380 | | 0x2FFD, 0x0028, 0x222D, 0x0004, 0x22AD, 0x008A, 0x00EE, 0x0004, 0x00CC, 0x0018, 0x2EEF, 0x0004, 0x007C, |
1381 | | 0x003A, 0x277F, 0x0004, 0x04DD, 0x0028, 0x233D, 0x0004, 0x009D, 0x004A, 0x1BBF, 0x0004, 0x88BD, 0x0018, |
1382 | | 0x37FF, 0x0004, 0x115D, 0x1FFD, 0x333F, 0x0002, 0x0088, 0x0002, 0x02ED, 0x0002, 0x00CA, 0x0002, 0x4CCF, |
1383 | | 0x0002, 0x0048, 0x0002, 0x23FF, 0x0002, 0x001A, 0x0002, 0x888F, 0x0002, 0x0088, 0x0002, 0x006C, 0x0002, |
1384 | | 0x002A, 0x0002, 0x00AF, 0x0002, 0x0048, 0x0002, 0x22EF, 0x0002, 0x00AC, 0x0002, 0x005F, 0x0002, 0x0088, |
1385 | | 0x0002, 0x444D, 0x0002, 0x00CA, 0x0002, 0xCCCF, 0x0002, 0x0048, 0x0002, 0x00FE, 0x0002, 0x001A, 0x0002, |
1386 | | 0x006F, 0x0002, 0x0088, 0x0002, 0x005C, 0x0002, 0x002A, 0x0002, 0x009F, 0x0002, 0x0048, 0x0002, 0x00DF, |
1387 | | 0x0002, 0x03FD, 0x0002, 0x222F, 0x0002, 0x0088, 0x0002, 0x02ED, 0x0002, 0x00CA, 0x0002, 0x8CCF, 0x0002, |
1388 | | 0x0048, 0x0002, 0x11FF, 0x0002, 0x001A, 0x0002, 0x007E, 0x0002, 0x0088, 0x0002, 0x006C, 0x0002, 0x002A, |
1389 | | 0x0002, 0x007F, 0x0002, 0x0048, 0x0002, 0x00EE, 0x0002, 0x00AC, 0x0002, 0x003E, 0x0002, 0x0088, 0x0002, |
1390 | | 0x444D, 0x0002, 0x00CA, 0x0002, 0x00BE, 0x0002, 0x0048, 0x0002, 0x00BF, 0x0002, 0x001A, 0x0002, 0x003F, |
1391 | | 0x0002, 0x0088, 0x0002, 0x005C, 0x0002, 0x002A, 0x0002, 0x009E, 0x0002, 0x0048, 0x0002, 0x00DE, 0x0002, |
1392 | | 0x03FD, 0x0002, 0x111F, 0x0004, 0x8AED, 0x0048, 0x888D, 0x0004, 0x00DC, 0x00CA, 0x3FFF, 0x0004, 0xCFFD, |
1393 | | 0x002A, 0x003D, 0x0004, 0x00BC, 0x005A, 0x8DDF, 0x0004, 0x8FFD, 0x0048, 0x006C, 0x0004, 0x027D, 0x008A, |
1394 | | 0x99FF, 0x0004, 0x00EC, 0x00FA, 0x003C, 0x0004, 0x00AC, 0x001A, 0x009F, 0x0004, 0x2FFD, 0x0048, 0x007C, |
1395 | | 0x0004, 0x44CD, 0x00CA, 0x67FF, 0x0004, 0x1FFD, 0x002A, 0x444D, 0x0004, 0x00AD, 0x005A, 0x8CCF, 0x0004, |
1396 | | 0x4FFD, 0x0048, 0x445D, 0x0004, 0x01BD, 0x008A, 0x4EEF, 0x0004, 0x45DD, 0x00FA, 0x111D, 0x0004, 0x009C, |
1397 | | 0x001A, 0x222F, 0x0004, 0x8AED, 0x0048, 0x888D, 0x0004, 0x00DC, 0x00CA, 0xAFFF, 0x0004, 0xCFFD, 0x002A, |
1398 | | 0x003D, 0x0004, 0x00BC, 0x005A, 0x11BF, 0x0004, 0x8FFD, 0x0048, 0x006C, 0x0004, 0x027D, 0x008A, 0x22EF, |
1399 | | 0x0004, 0x00EC, 0x00FA, 0x003C, 0x0004, 0x00AC, 0x001A, 0x227F, 0x0004, 0x2FFD, 0x0048, 0x007C, 0x0004, |
1400 | | 0x44CD, 0x00CA, 0x5DFF, 0x0004, 0x1FFD, 0x002A, 0x444D, 0x0004, 0x00AD, 0x005A, 0x006F, 0x0004, 0x4FFD, |
1401 | | 0x0048, 0x445D, 0x0004, 0x01BD, 0x008A, 0x11DF, 0x0004, 0x45DD, 0x00FA, 0x111D, 0x0004, 0x009C, 0x001A, |
1402 | | 0x155F, 0x0006, 0x00FC, 0x0018, 0x111D, 0x0048, 0x888D, 0x00AA, 0x4DDF, 0x0006, 0x2AAD, 0x005A, 0x67FF, |
1403 | | 0x0028, 0x223D, 0x00BC, 0xAAAF, 0x0006, 0x00EC, 0x0018, 0x5FFF, 0x0048, 0x006C, 0x008A, 0xCCCF, 0x0006, |
1404 | | 0x009D, 0x00CA, 0x44EF, 0x0028, 0x003C, 0x8FFD, 0x137F, 0x0006, 0x8EED, 0x0018, 0x1FFF, 0x0048, 0x007C, |
1405 | | 0x00AA, 0x4CCF, 0x0006, 0x227D, 0x005A, 0x1DDF, 0x0028, 0x444D, 0x4FFD, 0x155F, 0x0006, 0x00DC, 0x0018, |
1406 | | 0x2EEF, 0x0048, 0x445D, 0x008A, 0x22BF, 0x0006, 0x009C, 0x00CA, 0x8CDF, 0x0028, 0x222D, 0x2FFD, 0x226F, |
1407 | | 0x0006, 0x00FC, 0x0018, 0x111D, 0x0048, 0x888D, 0x00AA, 0x1BBF, 0x0006, 0x2AAD, 0x005A, 0x33FF, 0x0028, |
1408 | | 0x223D, 0x00BC, 0x8AAF, 0x0006, 0x00EC, 0x0018, 0x9BFF, 0x0048, 0x006C, 0x008A, 0x8ABF, 0x0006, 0x009D, |
1409 | | 0x00CA, 0x4EEF, 0x0028, 0x003C, 0x8FFD, 0x466F, 0x0006, 0x8EED, 0x0018, 0xCFFF, 0x0048, 0x007C, 0x00AA, |
1410 | | 0x8CCF, 0x0006, 0x227D, 0x005A, 0xAEEF, 0x0028, 0x444D, 0x4FFD, 0x477F, 0x0006, 0x00DC, 0x0018, 0xAFFF, |
1411 | | 0x0048, 0x445D, 0x008A, 0x2BBF, 0x0006, 0x009C, 0x00CA, 0x44DF, 0x0028, 0x222D, 0x2FFD, 0x133F, 0x00F6, |
1412 | | 0xAFFD, 0x1FFB, 0x003C, 0x0008, 0x23BD, 0x007A, 0x11DF, 0x00F6, 0x45DD, 0x2FFB, 0x4EEF, 0x00DA, 0x177D, |
1413 | | 0xCFFD, 0x377F, 0x00F6, 0x3FFD, 0x8FFB, 0x111D, 0x0008, 0x009C, 0x005A, 0x1BBF, 0x00F6, 0x00CD, 0x00BA, |
1414 | | 0x8DDF, 0x4FFB, 0x006C, 0x9BFD, 0x455F, 0x00F6, 0x67FD, 0x1FFB, 0x002C, 0x0008, 0x00AC, 0x007A, 0x009F, |
1415 | | 0x00F6, 0x00AD, 0x2FFB, 0x7FFF, 0x00DA, 0x004C, 0x5FFD, 0x477F, 0x00F6, 0x00EC, 0x8FFB, 0x001C, 0x0008, |
1416 | | 0x008C, 0x005A, 0x888F, 0x00F6, 0x00CC, 0x00BA, 0x2EEF, 0x4FFB, 0x115D, 0x8AED, 0x113F, 0x00F6, 0xAFFD, |
1417 | | 0x1FFB, 0x003C, 0x0008, 0x23BD, 0x007A, 0x1DDF, 0x00F6, 0x45DD, 0x2FFB, 0xBFFF, 0x00DA, 0x177D, 0xCFFD, |
1418 | | 0x447F, 0x00F6, 0x3FFD, 0x8FFB, 0x111D, 0x0008, 0x009C, 0x005A, 0x277F, 0x00F6, 0x00CD, 0x00BA, 0x22EF, |
1419 | | 0x4FFB, 0x006C, 0x9BFD, 0x444F, 0x00F6, 0x67FD, 0x1FFB, 0x002C, 0x0008, 0x00AC, 0x007A, 0x11BF, 0x00F6, |
1420 | | 0x00AD, 0x2FFB, 0xFFFF, 0x00DA, 0x004C, 0x5FFD, 0x233F, 0x00F6, 0x00EC, 0x8FFB, 0x001C, 0x0008, 0x008C, |
1421 | | 0x005A, 0x006F, 0x00F6, 0x00CC, 0x00BA, 0x8BBF, 0x4FFB, 0x115D, 0x8AED, 0x222F}; |
1422 | | |
1423 | | static const uint16_t dec_cxt_vlc_table0[1024] = { |
1424 | | 0x0026, 0x00AA, 0x0046, 0x006C, 0x0086, 0x8AED, 0x0018, 0x8DDF, 0x0026, 0x01BD, 0x0046, 0x5FFF, 0x0086, |
1425 | | 0x027D, 0x005A, 0x155F, 0x0026, 0x003A, 0x0046, 0x444D, 0x0086, 0x4CCD, 0x0018, 0xCCCF, 0x0026, 0x2EFD, |
1426 | | 0x0046, 0x99FF, 0x0086, 0x009C, 0x00CA, 0x133F, 0x0026, 0x00AA, 0x0046, 0x445D, 0x0086, 0x8CCD, 0x0018, |
1427 | | 0x11DF, 0x0026, 0x4FFD, 0x0046, 0xCFFF, 0x0086, 0x009D, 0x005A, 0x007E, 0x0026, 0x003A, 0x0046, 0x1FFF, |
1428 | | 0x0086, 0x88AD, 0x0018, 0x00BE, 0x0026, 0x8FFD, 0x0046, 0x4EEF, 0x0086, 0x888D, 0x00CA, 0x111F, 0x0026, |
1429 | | 0x00AA, 0x0046, 0x006C, 0x0086, 0x8AED, 0x0018, 0x45DF, 0x0026, 0x01BD, 0x0046, 0x22EF, 0x0086, 0x027D, |
1430 | | 0x005A, 0x227F, 0x0026, 0x003A, 0x0046, 0x444D, 0x0086, 0x4CCD, 0x0018, 0x11BF, 0x0026, 0x2EFD, 0x0046, |
1431 | | 0x00FE, 0x0086, 0x009C, 0x00CA, 0x223F, 0x0026, 0x00AA, 0x0046, 0x445D, 0x0086, 0x8CCD, 0x0018, 0x00DE, |
1432 | | 0x0026, 0x4FFD, 0x0046, 0xABFF, 0x0086, 0x009D, 0x005A, 0x006F, 0x0026, 0x003A, 0x0046, 0x6EFF, 0x0086, |
1433 | | 0x88AD, 0x0018, 0x2AAF, 0x0026, 0x8FFD, 0x0046, 0x00EE, 0x0086, 0x888D, 0x00CA, 0x222F, 0x0004, 0x00CA, |
1434 | | 0x0088, 0x027D, 0x0004, 0x4CCD, 0x0028, 0x00FE, 0x0004, 0x2AFD, 0x0048, 0x005C, 0x0004, 0x009D, 0x0018, |
1435 | | 0x00DE, 0x0004, 0x01BD, 0x0088, 0x006C, 0x0004, 0x88AD, 0x0028, 0x11DF, 0x0004, 0x8AED, 0x0048, 0x003C, |
1436 | | 0x0004, 0x888D, 0x0018, 0x111F, 0x0004, 0x00CA, 0x0088, 0x006D, 0x0004, 0x88CD, 0x0028, 0x88FF, 0x0004, |
1437 | | 0x8BFD, 0x0048, 0x444D, 0x0004, 0x009C, 0x0018, 0x00BE, 0x0004, 0x4EFD, 0x0088, 0x445D, 0x0004, 0x00AC, |
1438 | | 0x0028, 0x00EE, 0x0004, 0x45DD, 0x0048, 0x222D, 0x0004, 0x003D, 0x0018, 0x007E, 0x0004, 0x00CA, 0x0088, |
1439 | | 0x027D, 0x0004, 0x4CCD, 0x0028, 0x1FFF, 0x0004, 0x2AFD, 0x0048, 0x005C, 0x0004, 0x009D, 0x0018, 0x11BF, |
1440 | | 0x0004, 0x01BD, 0x0088, 0x006C, 0x0004, 0x88AD, 0x0028, 0x22EF, 0x0004, 0x8AED, 0x0048, 0x003C, 0x0004, |
1441 | | 0x888D, 0x0018, 0x227F, 0x0004, 0x00CA, 0x0088, 0x006D, 0x0004, 0x88CD, 0x0028, 0x4EEF, 0x0004, 0x8BFD, |
1442 | | 0x0048, 0x444D, 0x0004, 0x009C, 0x0018, 0x2AAF, 0x0004, 0x4EFD, 0x0088, 0x445D, 0x0004, 0x00AC, 0x0028, |
1443 | | 0x8DDF, 0x0004, 0x45DD, 0x0048, 0x222D, 0x0004, 0x003D, 0x0018, 0x155F, 0x0004, 0x005A, 0x0088, 0x006C, |
1444 | | 0x0004, 0x88DD, 0x0028, 0x23FF, 0x0004, 0x11FD, 0x0048, 0x444D, 0x0004, 0x00AD, 0x0018, 0x00BE, 0x0004, |
1445 | | 0x137D, 0x0088, 0x155D, 0x0004, 0x00CC, 0x0028, 0x00DE, 0x0004, 0x02ED, 0x0048, 0x111D, 0x0004, 0x009D, |
1446 | | 0x0018, 0x007E, 0x0004, 0x005A, 0x0088, 0x455D, 0x0004, 0x44CD, 0x0028, 0x00EE, 0x0004, 0x1FFD, 0x0048, |
1447 | | 0x003C, 0x0004, 0x00AC, 0x0018, 0x555F, 0x0004, 0x47FD, 0x0088, 0x113D, 0x0004, 0x02BD, 0x0028, 0x477F, |
1448 | | 0x0004, 0x4CDD, 0x0048, 0x8FFF, 0x0004, 0x009C, 0x0018, 0x222F, 0x0004, 0x005A, 0x0088, 0x006C, 0x0004, |
1449 | | 0x88DD, 0x0028, 0x00FE, 0x0004, 0x11FD, 0x0048, 0x444D, 0x0004, 0x00AD, 0x0018, 0x888F, 0x0004, 0x137D, |
1450 | | 0x0088, 0x155D, 0x0004, 0x00CC, 0x0028, 0x8CCF, 0x0004, 0x02ED, 0x0048, 0x111D, 0x0004, 0x009D, 0x0018, |
1451 | | 0x006F, 0x0004, 0x005A, 0x0088, 0x455D, 0x0004, 0x44CD, 0x0028, 0x1DDF, 0x0004, 0x1FFD, 0x0048, 0x003C, |
1452 | | 0x0004, 0x00AC, 0x0018, 0x227F, 0x0004, 0x47FD, 0x0088, 0x113D, 0x0004, 0x02BD, 0x0028, 0x22BF, 0x0004, |
1453 | | 0x4CDD, 0x0048, 0x22EF, 0x0004, 0x009C, 0x0018, 0x233F, 0x0006, 0x4DDD, 0x4FFB, 0xCFFF, 0x0018, 0x113D, |
1454 | | 0x005A, 0x888F, 0x0006, 0x23BD, 0x008A, 0x00EE, 0x002A, 0x155D, 0xAAFD, 0x277F, 0x0006, 0x44CD, 0x8FFB, |
1455 | | 0x44EF, 0x0018, 0x467D, 0x004A, 0x2AAF, 0x0006, 0x00AC, 0x555B, 0x99DF, 0x1FFB, 0x003C, 0x5FFD, 0x266F, |
1456 | | 0x0006, 0x1DDD, 0x4FFB, 0x6EFF, 0x0018, 0x177D, 0x005A, 0x1BBF, 0x0006, 0x88AD, 0x008A, 0x5DDF, 0x002A, |
1457 | | 0x444D, 0x2FFD, 0x667F, 0x0006, 0x00CC, 0x8FFB, 0x2EEF, 0x0018, 0x455D, 0x004A, 0x119F, 0x0006, 0x009C, |
1458 | | 0x555B, 0x8CCF, 0x1FFB, 0x111D, 0x8CED, 0x006E, 0x0006, 0x4DDD, 0x4FFB, 0x3FFF, 0x0018, 0x113D, 0x005A, |
1459 | | 0x11BF, 0x0006, 0x23BD, 0x008A, 0x8DDF, 0x002A, 0x155D, 0xAAFD, 0x222F, 0x0006, 0x44CD, 0x8FFB, 0x00FE, |
1460 | | 0x0018, 0x467D, 0x004A, 0x899F, 0x0006, 0x00AC, 0x555B, 0x00DE, 0x1FFB, 0x003C, 0x5FFD, 0x446F, 0x0006, |
1461 | | 0x1DDD, 0x4FFB, 0x9BFF, 0x0018, 0x177D, 0x005A, 0x00BE, 0x0006, 0x88AD, 0x008A, 0xCDDF, 0x002A, 0x444D, |
1462 | | 0x2FFD, 0x007E, 0x0006, 0x00CC, 0x8FFB, 0x4EEF, 0x0018, 0x455D, 0x004A, 0x377F, 0x0006, 0x009C, 0x555B, |
1463 | | 0x8BBF, 0x1FFB, 0x111D, 0x8CED, 0x233F, 0x0004, 0x00AA, 0x0088, 0x047D, 0x0004, 0x01DD, 0x0028, 0x11DF, |
1464 | | 0x0004, 0x27FD, 0x0048, 0x005C, 0x0004, 0x8AAD, 0x0018, 0x2BBF, 0x0004, 0x009C, 0x0088, 0x006C, 0x0004, |
1465 | | 0x00CC, 0x0028, 0x00EE, 0x0004, 0x8CED, 0x0048, 0x222D, 0x0004, 0x888D, 0x0018, 0x007E, 0x0004, 0x00AA, |
1466 | | 0x0088, 0x006D, 0x0004, 0x88CD, 0x0028, 0x00FE, 0x0004, 0x19FD, 0x0048, 0x003C, 0x0004, 0x2AAD, 0x0018, |
1467 | | 0xAAAF, 0x0004, 0x8BFD, 0x0088, 0x005D, 0x0004, 0x00BD, 0x0028, 0x4CCF, 0x0004, 0x44ED, 0x0048, 0x4FFF, |
1468 | | 0x0004, 0x223D, 0x0018, 0x111F, 0x0004, 0x00AA, 0x0088, 0x047D, 0x0004, 0x01DD, 0x0028, 0x99FF, 0x0004, |
1469 | | 0x27FD, 0x0048, 0x005C, 0x0004, 0x8AAD, 0x0018, 0x00BE, 0x0004, 0x009C, 0x0088, 0x006C, 0x0004, 0x00CC, |
1470 | | 0x0028, 0x00DE, 0x0004, 0x8CED, 0x0048, 0x222D, 0x0004, 0x888D, 0x0018, 0x444F, 0x0004, 0x00AA, 0x0088, |
1471 | | 0x006D, 0x0004, 0x88CD, 0x0028, 0x2EEF, 0x0004, 0x19FD, 0x0048, 0x003C, 0x0004, 0x2AAD, 0x0018, 0x447F, |
1472 | | 0x0004, 0x8BFD, 0x0088, 0x005D, 0x0004, 0x00BD, 0x0028, 0x009F, 0x0004, 0x44ED, 0x0048, 0x67FF, 0x0004, |
1473 | | 0x223D, 0x0018, 0x133F, 0x0006, 0x00CC, 0x008A, 0x9DFF, 0x2FFB, 0x467D, 0x1FFD, 0x99BF, 0x0006, 0x2AAD, |
1474 | | 0x002A, 0x66EF, 0x4FFB, 0x005C, 0x2EED, 0x377F, 0x0006, 0x89BD, 0x004A, 0x00FE, 0x8FFB, 0x006C, 0x67FD, |
1475 | | 0x889F, 0x0006, 0x888D, 0x001A, 0x5DDF, 0x00AA, 0x222D, 0x89DD, 0x444F, 0x0006, 0x2BBD, 0x008A, 0xCFFF, |
1476 | | 0x2FFB, 0x226D, 0x009C, 0x00BE, 0x0006, 0xAAAD, 0x002A, 0x1DDF, 0x4FFB, 0x003C, 0x4DDD, 0x466F, 0x0006, |
1477 | | 0x8AAD, 0x004A, 0xAEEF, 0x8FFB, 0x445D, 0x8EED, 0x177F, 0x0006, 0x233D, 0x001A, 0x4CCF, 0x00AA, 0xAFFF, |
1478 | | 0x88CD, 0x133F, 0x0006, 0x00CC, 0x008A, 0x77FF, 0x2FFB, 0x467D, 0x1FFD, 0x3BBF, 0x0006, 0x2AAD, 0x002A, |
1479 | | 0x00EE, 0x4FFB, 0x005C, 0x2EED, 0x007E, 0x0006, 0x89BD, 0x004A, 0x4EEF, 0x8FFB, 0x006C, 0x67FD, 0x667F, |
1480 | | 0x0006, 0x888D, 0x001A, 0x00DE, 0x00AA, 0x222D, 0x89DD, 0x333F, 0x0006, 0x2BBD, 0x008A, 0x57FF, 0x2FFB, |
1481 | | 0x226D, 0x009C, 0x199F, 0x0006, 0xAAAD, 0x002A, 0x99DF, 0x4FFB, 0x003C, 0x4DDD, 0x155F, 0x0006, 0x8AAD, |
1482 | | 0x004A, 0xCEEF, 0x8FFB, 0x445D, 0x8EED, 0x277F, 0x0006, 0x233D, 0x001A, 0x1BBF, 0x00AA, 0x3FFF, 0x88CD, |
1483 | | 0x111F, 0x0006, 0x45DD, 0x2FFB, 0x111D, 0x0018, 0x467D, 0x8FFD, 0xCCCF, 0x0006, 0x19BD, 0x004A, 0x22EF, |
1484 | | 0x002A, 0x222D, 0x3FFD, 0x888F, 0x0006, 0x00CC, 0x008A, 0x00FE, 0x0018, 0x115D, 0xCFFD, 0x8AAF, 0x0006, |
1485 | | 0x00AC, 0x003A, 0x8CDF, 0x1FFB, 0x133D, 0x66FD, 0x466F, 0x0006, 0x8CCD, 0x2FFB, 0x5FFF, 0x0018, 0x006C, |
1486 | | 0x4FFD, 0xABBF, 0x0006, 0x22AD, 0x004A, 0x00EE, 0x002A, 0x233D, 0xAEFD, 0x377F, 0x0006, 0x2BBD, 0x008A, |
1487 | | 0x55DF, 0x0018, 0x005C, 0x177D, 0x119F, 0x0006, 0x009C, 0x003A, 0x4CCF, 0x1FFB, 0x333D, 0x8EED, 0x444F, |
1488 | | 0x0006, 0x45DD, 0x2FFB, 0x111D, 0x0018, 0x467D, 0x8FFD, 0x99BF, 0x0006, 0x19BD, 0x004A, 0x2EEF, 0x002A, |
1489 | | 0x222D, 0x3FFD, 0x667F, 0x0006, 0x00CC, 0x008A, 0x4EEF, 0x0018, 0x115D, 0xCFFD, 0x899F, 0x0006, 0x00AC, |
1490 | | 0x003A, 0x00DE, 0x1FFB, 0x133D, 0x66FD, 0x226F, 0x0006, 0x8CCD, 0x2FFB, 0x9BFF, 0x0018, 0x006C, 0x4FFD, |
1491 | | 0x00BE, 0x0006, 0x22AD, 0x004A, 0x1DDF, 0x002A, 0x233D, 0xAEFD, 0x007E, 0x0006, 0x2BBD, 0x008A, 0xCEEF, |
1492 | | 0x0018, 0x005C, 0x177D, 0x277F, 0x0006, 0x009C, 0x003A, 0x8BBF, 0x1FFB, 0x333D, 0x8EED, 0x455F, 0x1FF9, |
1493 | | 0x1DDD, 0xAFFB, 0x00DE, 0x8FF9, 0x001C, 0xFFFB, 0x477F, 0x4FF9, 0x177D, 0x3FFB, 0x3BBF, 0x2FF9, 0xAEEF, |
1494 | | 0x8EED, 0x444F, 0x1FF9, 0x22AD, 0x000A, 0x8BBF, 0x8FF9, 0x00FE, 0xCFFD, 0x007E, 0x4FF9, 0x115D, 0x5FFB, |
1495 | | 0x577F, 0x2FF9, 0x8DDF, 0x2EED, 0x333F, 0x1FF9, 0x2BBD, 0xAFFB, 0x88CF, 0x8FF9, 0xBFFF, 0xFFFB, 0x377F, |
1496 | | 0x4FF9, 0x006D, 0x3FFB, 0x00BE, 0x2FF9, 0x66EF, 0x9FFD, 0x133F, 0x1FF9, 0x009D, 0x000A, 0xABBF, 0x8FF9, |
1497 | | 0xDFFF, 0x6FFD, 0x006E, 0x4FF9, 0x002C, 0x5FFB, 0x888F, 0x2FF9, 0xCDDF, 0x4DDD, 0x222F, 0x1FF9, 0x1DDD, |
1498 | | 0xAFFB, 0x4CCF, 0x8FF9, 0x001C, 0xFFFB, 0x277F, 0x4FF9, 0x177D, 0x3FFB, 0x99BF, 0x2FF9, 0xCEEF, 0x8EED, |
1499 | | 0x004E, 0x1FF9, 0x22AD, 0x000A, 0x00AE, 0x8FF9, 0x7FFF, 0xCFFD, 0x005E, 0x4FF9, 0x115D, 0x5FFB, 0x009E, |
1500 | | 0x2FF9, 0x5DDF, 0x2EED, 0x003E, 0x1FF9, 0x2BBD, 0xAFFB, 0x00CE, 0x8FF9, 0xEFFF, 0xFFFB, 0x667F, 0x4FF9, |
1501 | | 0x006D, 0x3FFB, 0x8AAF, 0x2FF9, 0x00EE, 0x9FFD, 0x233F, 0x1FF9, 0x009D, 0x000A, 0x1BBF, 0x8FF9, 0x4EEF, |
1502 | | 0x6FFD, 0x455F, 0x4FF9, 0x002C, 0x5FFB, 0x008E, 0x2FF9, 0x99DF, 0x4DDD, 0x111F}; |