Coverage Report

Created: 2026-10-28 08:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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.8M
#define J2K_Q1 0
60
28.5M
#define J2K_Q2 1
61
62
4.80M
#define HT_SHIFT_SIGMA 0
63
11.5M
#define HT_SHIFT_SCAN 4
64
12.4M
#define HT_SHIFT_REF 3
65
1.04M
#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.46M
{
95
6.46M
    return n * c <= c - 1;
96
6.46M
}
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.1k
{
104
10.1k
    return 1 + (0xffffffffffffffffull / d);
105
10.1k
}
106
107
static void jpeg2000_init_zero(StateVars *s)
108
40.3k
{
109
40.3k
    s->bits_left = 0;
110
40.3k
    s->bit_buf   = 0;
111
40.3k
    s->tmp       = 0;
112
40.3k
    s->bits      = 0;
113
40.3k
    s->pos       = 0;
114
40.3k
    s->last      = 0;
115
40.3k
}
116
117
static void jpeg2000_init_mel(StateVars *s, uint32_t Pcup)
118
11.7k
{
119
11.7k
    jpeg2000_init_zero(s);
120
11.7k
    s->pos = Pcup;
121
11.7k
}
122
123
static void jpeg2000_init_mag_ref(StateVars *s, uint32_t Lref)
124
3.03k
{
125
3.03k
    s->pos       = Lref - 1;
126
3.03k
    s->bits      = 0;
127
3.03k
    s->last      = 0xFF;
128
3.03k
    s->tmp       = 0;
129
3.03k
    s->bits_left = 0;
130
3.03k
    s->bit_buf   = 0;
131
3.03k
}
132
133
static void jpeg2000_init_mel_decoder(MelDecoderState *mel_state)
134
11.7k
{
135
11.7k
    mel_state->k   = 0;
136
11.7k
    mel_state->run = 0;
137
11.7k
    mel_state->one = 0;
138
11.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.63M
{
147
1.63M
    uint64_t tmp = 0;
148
1.63M
    uint32_t new_bits = 32;
149
150
1.63M
    buffer->last = array[buffer->pos + 1];
151
152
1.63M
    if (buffer->bits_left >= 32)
153
1.52M
        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
110k
    if (buffer->pos >= 3) {  // Common case; we have at least 4 bytes available
162
42.7k
         tmp = array[buffer->pos - 3];
163
42.7k
         tmp = (tmp << 8) | array[buffer->pos - 2];
164
42.7k
         tmp = (tmp << 8) | array[buffer->pos - 1];
165
42.7k
         tmp = (tmp << 8) | array[buffer->pos];
166
42.7k
         tmp = (tmp << 8) | buffer->last;  // For stuffing bit detection
167
42.7k
         buffer->pos -= 4;
168
67.2k
    } else {
169
67.2k
        if (buffer->pos >= 2)
170
2.11k
            tmp = array[buffer->pos - 2];
171
67.2k
        if (buffer->pos >= 1)
172
3.95k
            tmp = (tmp << 8) | array[buffer->pos - 1];
173
67.2k
        if (buffer->pos >= 0)
174
63.2k
            tmp = (tmp << 8) | array[buffer->pos];
175
67.2k
        buffer->pos = 0;
176
67.2k
        tmp = (tmp << 8) | buffer->last;  // For stuffing bit detection
177
67.2k
    }
178
    // Now remove any stuffing bits, shifting things down as we go
179
110k
    if ((tmp & 0x7FFF000000) > 0x7F8F000000) {
180
2.56k
        tmp &= 0x7FFFFFFFFF;
181
2.56k
        new_bits--;
182
2.56k
    }
183
110k
    if ((tmp & 0x007FFF0000) > 0x007F8F0000) {
184
3.38k
        tmp = (tmp & 0x007FFFFFFF) + ((tmp & 0xFF00000000) >> 1);
185
3.38k
        new_bits--;
186
3.38k
    }
187
110k
    if ((tmp & 0x00007FFF00) > 0x00007F8F00) {
188
3.35k
        tmp = (tmp & 0x00007FFFFF) + ((tmp & 0xFFFF000000) >> 1);
189
3.35k
        new_bits--;
190
3.35k
    }
191
110k
    if ((tmp & 0x0000007FFF) > 0x0000007F8F) {
192
6.80k
        tmp = (tmp & 0x0000007FFF) + ((tmp & 0xFFFFFF0000) >> 1);
193
6.80k
        new_bits--;
194
6.80k
    }
195
110k
    tmp >>= 8;  // Shifts away the extra byte we imported
196
197
    /* Add bits to the MSB of the bit buffer */
198
110k
    buffer->bit_buf |= tmp << buffer->bits_left;
199
110k
    buffer->bits_left += new_bits;
200
110k
    return 0;
201
1.63M
}
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
78.5k
{
210
382k
    while (buffer->bits_left < 32) {
211
304k
        buffer->tmp = 0xFF;
212
304k
        buffer->bits = (buffer->last == 0xFF) ? 7 : 8;
213
304k
        if (buffer->pos < length) {
214
108k
            buffer->tmp = array[buffer->pos];
215
108k
            buffer->pos += 1;
216
108k
            buffer->last = buffer->tmp;
217
108k
        }
218
304k
        buffer->bit_buf |= ((uint64_t) buffer->tmp) << buffer->bits_left;
219
304k
        buffer->bits_left += buffer->bits;
220
304k
    }
221
78.5k
}
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.00M
{
230
2.00M
    av_assert2(buf->bits_left >= nbits); // cannot read more bits than available
231
2.00M
    buf->bit_buf >>= nbits;
232
2.00M
    buf->bits_left -= nbits;
233
2.00M
}
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
307k
{
244
307k
    uint64_t bits;
245
307k
    uint64_t mask = (1ull << nbits) - 1;
246
307k
    if (bit_stream->bits_left < nbits)
247
7.90k
        jpeg2000_bitbuf_refill_backwards(bit_stream, buf);
248
307k
    bits = bit_stream->bit_buf & mask;
249
307k
    jpeg2000_bitbuf_drop_bits_lsb(bit_stream, nbits);
250
307k
    return bits;
251
307k
}
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
820k
{
263
820k
    uint64_t bits;
264
820k
    uint64_t mask = (1ull << nbits) - 1;
265
266
820k
    if (bit_stream->bits_left <= nbits)
267
66.8k
        jpeg2000_bitbuf_refill_forward(bit_stream, buf, length);
268
820k
    bits = bit_stream->bit_buf & mask;
269
820k
    jpeg2000_bitbuf_drop_bits_lsb(bit_stream, nbits);
270
820k
    return bits;
271
820k
}
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
150k
{
279
150k
    uint64_t mask = (1ull << nbits) - 1;
280
150k
    return stream->bit_buf & mask;
281
150k
}
282
283
static void jpeg2000_init_vlc(StateVars *s, uint32_t Lcup, uint32_t Pcup,
284
                              const uint8_t *Dcup)
285
11.7k
{
286
11.7k
    s->bits_left = 0;
287
11.7k
    s->bit_buf   = 0;
288
11.7k
    s->pos       = Lcup - 2 - Pcup;
289
11.7k
    s->last      = Dcup[Lcup - 2];
290
11.7k
    s->tmp       = (s->last) >> 4;
291
11.7k
    s->bits      = ((s->tmp & 7) < 7) ? 4 : 3;
292
293
11.7k
    jpeg2000_bitbuf_refill_backwards(s, Dcup + Pcup);
294
11.7k
    jpeg2000_bitbuf_drop_bits_lsb(s, 4);
295
11.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
719k
{
308
719k
    uint32_t value;
309
719k
    uint8_t len;
310
719k
    uint64_t index;
311
719k
    uint64_t code_word;
312
313
719k
    jpeg2000_bitbuf_refill_backwards(vlc_stream, Dcup + Pcup);
314
315
719k
    code_word = vlc_stream->bit_buf & 0x7f;
316
719k
    index = code_word + (context << 7);
317
318
719k
    av_assert0(index < 1024); // The CxtVLC table has 1024 entries.
319
320
719k
    value = table[index];
321
322
719k
    len = (value & 0x000F) >> 1;
323
324
719k
    res_off[pos] = (uint8_t) (value & 1);
325
719k
    sig_pat[pos] = (uint8_t) ((value & 0x00F0) >> 4);
326
719k
    emb_pat_k[pos] = (uint8_t) ((value & 0x0F00) >> 8);
327
719k
    emb_pat_1[pos] = (uint8_t) ((value & 0xF000) >> 12);
328
329
719k
    jpeg2000_bitbuf_drop_bits_lsb(vlc_stream, len);
330
719k
    return 0;
331
719k
}
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
97.1k
{
340
97.1k
    static const uint8_t return_value[8] = { 5, 1, 2, 1, 3, 1, 2, 1 };
341
97.1k
    static const uint8_t drop_bits[8]    = { 3, 1, 2, 1, 3, 1, 2, 1 };
342
343
97.1k
    uint8_t bits;
344
345
97.1k
    if (vlc_stream->bits_left < 3)
346
0
        jpeg2000_bitbuf_refill_backwards(vlc_stream, refill_array);
347
348
97.1k
    bits = jpeg2000_bitbuf_peek_bits_lsb(vlc_stream, 3);
349
350
97.1k
    jpeg2000_bitbuf_drop_bits_lsb(vlc_stream, drop_bits[bits]);
351
97.1k
    return return_value[bits];
352
97.1k
}
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
97.1k
{
362
97.1k
    static const int mask[]      = { 1, 31 };
363
97.1k
    static const int drop_bits[] = { 1, 5  };
364
365
97.1k
    uint8_t bits;
366
97.1k
    int cond = suffix != 3;
367
97.1k
    if (suffix < 3)
368
43.8k
        return 0;
369
370
53.2k
    if (vlc_stream->bits_left < 5)
371
0
        jpeg2000_bitbuf_refill_backwards(vlc_stream, refill_array);
372
373
53.2k
    bits = jpeg2000_bitbuf_peek_bits_lsb(vlc_stream, 5);
374
375
53.2k
    jpeg2000_bitbuf_drop_bits_lsb(vlc_stream, drop_bits[cond]);
376
53.2k
    return bits & mask[cond];
377
97.1k
}
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
97.1k
{
387
97.1k
    return jpeg2000_bitbuf_get_bits_lsb(vlc_stream, 4 * (suffix >= 28), refill_array);
388
97.1k
}
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.43M
{
398
7.43M
    int32_t val = 0;
399
7.43M
    if (m_n > 0) {
400
820k
        val = jpeg2000_bitbuf_get_bits_lsb_forward(mag_sgn_stream,m_n,buf,length);
401
820k
        val += (i_n << m_n);
402
820k
    }
403
7.43M
    return val;
404
7.43M
}
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.85M
{
413
9.29M
    for (int i = 0; i < 4; i++) {
414
7.43M
        int32_t n = 4 * q + i;
415
7.43M
        m_n[pos] = m[pos][i];
416
7.43M
        known_1[pos] = (emb_pat_1[pos] >> i) & 1;
417
7.43M
        v[pos][i] = jpeg2000_decode_mag_sgn(mag_sgn, m_n[pos], known_1[pos], Dcup, Pcup);
418
419
7.43M
        if (m_n[pos] != 0) {
420
820k
            E[n] = 32 - ff_clz(v[pos][i] | 1);
421
820k
            mu_n[n] = (v[pos][i] >> 1) + 1;
422
820k
            mu_n[n] <<= pLSB;
423
820k
            mu_n[n] |= (1 << (pLSB - 1)); // Add 0.5 (reconstruction parameter = 1/2)
424
820k
            mu_n[n] |= ((uint32_t) (v[pos][i] & 1)) << 31; // sign bit.
425
820k
        }
426
7.43M
    }
427
1.85M
}
428
429
static int jpeg2000_import_bit(StateVars *stream, const uint8_t *array, uint32_t length)
430
462k
{
431
462k
    int cond = stream->pos < length;
432
462k
    int pos = FFMIN(stream->pos, length - 1);
433
462k
    if (stream->bits == 0) {
434
64.4k
        stream->bits = (stream->tmp == 0xFF) ? 7 : 8;
435
64.4k
        stream->pos += cond;
436
64.4k
        stream->tmp = cond ? array[pos] : 0xFF;
437
64.4k
    }
438
462k
    stream->bits -= 1;
439
462k
    return (stream->tmp >> stream->bits) & 1;
440
462k
}
441
442
static int jpeg2000_peek_bit(StateVars *stream, const uint8_t *array, uint32_t length)
443
905k
{
444
905k
    uint8_t bit;
445
446
905k
    if (stream->bits == 0) {
447
115k
        stream->bits = (stream->last == 0xFF) ? 7 : 8;
448
115k
        if (stream->pos < length) {
449
28.7k
            stream->tmp = array[stream->pos];
450
28.7k
            stream->pos++;
451
86.5k
        } else {
452
86.5k
            stream->tmp = 0;
453
86.5k
        }
454
115k
        stream->last = stream->tmp;
455
115k
    }
456
905k
    bit = stream->tmp & 1;
457
905k
    stream->tmp >>= 1;
458
905k
    stream->bits--;
459
905k
    return  bit;
460
905k
}
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.47M
{
467
468
1.47M
    if (mel_state->run == 0 && mel_state->one == 0) {
469
431k
        uint8_t eval;
470
431k
        uint8_t bit;
471
472
431k
        eval = mel_e[mel_state->k];
473
431k
        bit = jpeg2000_import_bit(mel_stream, Dcup, Lcup);
474
431k
        if (bit == 1) {
475
125k
            mel_state->run = 1 << eval;
476
125k
            mel_state->k = FFMIN(12, mel_state->k + 1);
477
305k
        } else {
478
305k
            mel_state->run = 0;
479
336k
            while (eval > 0) {
480
31.2k
                bit = jpeg2000_import_bit(mel_stream, Dcup, Lcup);
481
31.2k
                mel_state->run = (2 * (mel_state->run)) + bit;
482
31.2k
                eval -= 1;
483
31.2k
            }
484
305k
            mel_state->k = FFMAX(0, mel_state->k - 1);
485
305k
            mel_state->one = 1;
486
305k
        }
487
431k
    }
488
1.47M
    if (mel_state->run > 0) {
489
1.17M
        mel_state->run -= 1;
490
1.17M
        return 0;
491
1.17M
    } else {
492
305k
        mel_state->one = 0;
493
305k
        return 1;
494
305k
    }
495
1.47M
}
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
192k
{
504
192k
    return jpeg2000_bitbuf_get_bits_lsb(stream, 1, array);
505
192k
}
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.44M
        uint8_t sym;
519
1.44M
        sym = jpeg2000_decode_mel_sym(mel_state, mel_stream, Dcup, Lcup);
520
1.44M
        if (sym == 0) {
521
1.14M
            sig_pat[pos] = 0;
522
1.14M
            res_off[pos] = 0;
523
1.14M
            emb_pat_k[pos] = 0;
524
1.14M
            emb_pat_1[pos] = 0;
525
1.14M
            return 0;
526
1.14M
        }
527
1.44M
    }
528
719k
    return jpeg2000_decode_ctx_vlc(s, vlc_stream, vlc_table, Dcup, sig_pat,
529
719k
                                   res_off, emb_pat_k, emb_pat_1, pos, Pcup,
530
719k
                                   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
4.80M
{
537
4.80M
    return (block_states[(x1 + 1) * stride + (x2 + 1)] >> shift_by) & 1;
538
4.80M
}
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
9.73M
{
544
9.73M
    block_states[(x1 + 1) * stride + (x2 + 1)] |= value;
545
9.73M
}
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
11.7k
{
557
11.7k
    uint16_t q                      = 0;     // Represents current quad position
558
11.7k
    uint16_t q1, q2;
559
11.7k
    uint16_t context1, context2;
560
11.7k
    uint16_t context                = 0;
561
562
11.7k
    uint8_t sig_pat[2]              = { 0 }; // significance pattern
563
11.7k
    uint8_t res_off[2]              = { 0 }; // residual offset
564
11.7k
    uint8_t emb_pat_k[2]            = { 0 }; // exponent Max Bound pattern K
565
11.7k
    uint8_t emb_pat_1[2]            = { 0 }; // exponent Max Bound pattern 1
566
11.7k
    uint8_t gamma[2]                = { 0 };
567
568
11.7k
    uint8_t E_n[2]                  = { 0 };
569
11.7k
    uint8_t E_ne[2]                 = { 0 };
570
11.7k
    uint8_t E_nw[2]                 = { 0 };
571
11.7k
    uint8_t E_nf[2]                 = { 0 };
572
573
11.7k
    uint8_t max_e[2]                = { 0 };
574
11.7k
    uint8_t u_pfx[2]                = { 0 };
575
11.7k
    uint8_t u_sfx[2]                = { 0 };
576
11.7k
    uint8_t u_ext[2]                = { 0 };
577
578
11.7k
    int32_t u[2]                    = { 0 };
579
11.7k
    int32_t U[2]                    = { 0 }; // exponent bound
580
11.7k
    int32_t m_n[2]                  = { 0 };
581
11.7k
    int32_t known_1[2]              = { 0 };
582
583
11.7k
    int32_t m[2][4]                 = { 0 };
584
11.7k
    int32_t v[2][4]                 = { 0 };
585
586
11.7k
    uint8_t kappa[2]                = { 1, 1 };
587
588
11.7k
    int ret                         = 0;
589
590
11.7k
    int sp;
591
592
11.7k
    uint64_t c;
593
594
11.7k
    uint8_t *sigma, *sigma_n, *E;
595
11.7k
    uint32_t *mu, *mu_n;
596
597
11.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
11.7k
    int maxbp = cblk->zbp + 2;
606
607
    /* convert to raster-scan */
608
11.7k
    const uint16_t is_border_x = width % 2;
609
11.7k
    const uint16_t is_border_y = height % 2;
610
611
11.7k
    const uint16_t quad_width  = ff_jpeg2000_ceildivpow2(width, 1);
612
11.7k
    const uint16_t quad_height = ff_jpeg2000_ceildivpow2(height, 1);
613
614
11.7k
    size_t buf_size = 4 * quad_width * quad_height;
615
616
    /* do we have enough precision, assuming a 32-bit decoding path */
617
11.7k
    if (maxbp >= 32)
618
0
        return AVERROR_INVALIDDATA;
619
620
11.7k
    sigma_n = av_calloc(buf_size, sizeof(uint8_t));
621
11.7k
    E       = av_calloc(buf_size, sizeof(uint8_t));
622
11.7k
    mu_n    = av_calloc(buf_size, sizeof(uint32_t));
623
624
11.7k
    if (!sigma_n || !E || !mu_n) {
625
0
        ret = AVERROR(ENOMEM);
626
0
        goto free;
627
0
    }
628
629
11.7k
    sigma = sigma_n;
630
11.7k
    mu = mu_n;
631
632
131k
    while (q < quad_width - 1) {
633
121k
        q1 = q;
634
121k
        q2 = q1 + 1;
635
636
121k
        if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream,
637
121k
                                           dec_cxt_vlc_table0, Dcup, sig_pat, res_off,
638
121k
                                           emb_pat_k, emb_pat_1, J2K_Q1, context, Lcup,
639
121k
                                           Pcup)) < 0)
640
0
            goto free;
641
642
605k
        for (int i = 0; i < 4; i++)
643
484k
            sigma_n[4 * q1 + i] = (sig_pat[J2K_Q1] >> i) & 1;
644
645
        /* calculate context */
646
121k
        context  = sigma_n[4 * q1];           // f
647
121k
        context |= sigma_n[4 * q1 + 1];       // sf
648
121k
        context += sigma_n[4 * q1 + 2] << 1;  // w << 1
649
121k
        context += sigma_n[4 * q1 + 3] << 2;
650
651
121k
        if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream,
652
121k
                                           dec_cxt_vlc_table0, Dcup, sig_pat, res_off,
653
121k
                                           emb_pat_k, emb_pat_1, J2K_Q2, context, Lcup,
654
121k
                                           Pcup)) < 0)
655
0
            goto free;
656
657
605k
        for (int i = 0; i < 4; i++)
658
484k
            sigma_n[4 * q2 + i] = (sig_pat[J2K_Q2] >> i) & 1;
659
660
        /* calculate context for the next quad */
661
121k
        context  = sigma_n[4 * q2];           // f
662
121k
        context |= sigma_n[4 * q2 + 1];       // sf
663
121k
        context += sigma_n[4 * q2 + 2] << 1;  // w << 1
664
121k
        context += sigma_n[4 * q2 + 3] << 2;  // sw << 2
665
666
121k
        u[0] = 0;
667
121k
        u[1] = 0;
668
669
121k
        jpeg2000_bitbuf_refill_backwards(vlc_stream, vlc_buf);
670
671
121k
        if (res_off[J2K_Q1] == 1 && res_off[J2K_Q2] == 1) {
672
673
31.9k
            if (jpeg2000_decode_mel_sym(mel_state, mel_stream, Dcup, Lcup) == 1) {
674
675
4.53k
                u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
676
4.53k
                u_pfx[J2K_Q2] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
677
678
4.53k
                u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf);
679
4.53k
                u_sfx[J2K_Q2] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q2], vlc_buf);
680
681
4.53k
                u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf);
682
4.53k
                u_ext[J2K_Q2] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q2], vlc_buf);
683
684
4.53k
                u[J2K_Q1] = 2 + u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] * 4);
685
4.53k
                u[J2K_Q2] = 2 + u_pfx[J2K_Q2] + u_sfx[J2K_Q2] + (u_ext[J2K_Q2] * 4);
686
687
27.4k
            } else {
688
27.4k
                u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
689
690
27.4k
                if (u_pfx[J2K_Q1] > 2) {
691
17.2k
                    u[J2K_Q2] = jpeg2000_bitbuf_get_bits_lsb(vlc_stream, 1, vlc_buf) + 1;
692
17.2k
                    u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf);
693
17.2k
                    u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf);
694
17.2k
                } else {
695
10.1k
                    u_pfx[J2K_Q2] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
696
10.1k
                    u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf);
697
10.1k
                    u_sfx[J2K_Q2] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q2], vlc_buf);
698
10.1k
                    u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf);
699
10.1k
                    u_ext[J2K_Q2] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q2], vlc_buf);
700
10.1k
                    u[J2K_Q2] = u_pfx[J2K_Q2] + u_sfx[J2K_Q2] + (u_ext[J2K_Q2] * 4);
701
10.1k
                }
702
                /* See Rec. ITU-T T.814, 7.3.6(3) */
703
27.4k
                u[J2K_Q1] = u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] * 4);
704
27.4k
            }
705
706
89.1k
        } else if (res_off[J2K_Q1] == 1 || res_off[J2K_Q2] == 1) {
707
9.68k
            uint8_t pos = res_off[J2K_Q1] == 1 ? 0 : 1;
708
9.68k
            u_pfx[pos] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
709
9.68k
            u_sfx[pos] = vlc_decode_u_suffix(vlc_stream, u_pfx[pos], vlc_buf);
710
9.68k
            u_ext[pos] = vlc_decode_u_extension(vlc_stream, u_sfx[pos], vlc_buf);
711
9.68k
            u[pos] = u_pfx[pos] + u_sfx[pos] + (u_ext[pos] * 4);
712
9.68k
        }
713
121k
        U[J2K_Q1] = kappa[J2K_Q1] + u[J2K_Q1];
714
121k
        U[J2K_Q2] = kappa[J2K_Q2] + u[J2K_Q2];
715
121k
        if (U[J2K_Q1] > maxbp || U[J2K_Q2] > maxbp) {
716
1.02k
            ret = AVERROR_INVALIDDATA;
717
1.02k
            goto free;
718
1.02k
        }
719
720
600k
        for (int i = 0; i < 4; i++) {
721
480k
            m[J2K_Q1][i] = sigma_n[4 * q1 + i] * U[J2K_Q1] - ((emb_pat_k[J2K_Q1] >> i) & 1);
722
480k
            m[J2K_Q2][i] = sigma_n[4 * q2 + i] * U[J2K_Q2] - ((emb_pat_k[J2K_Q2] >> i) & 1);
723
480k
        }
724
725
120k
        recover_mag_sgn(mag_sgn_stream, J2K_Q1, q1, m_n, known_1, emb_pat_1, v, m,
726
120k
                        E, mu_n, Dcup, Pcup, pLSB);
727
728
120k
        recover_mag_sgn(mag_sgn_stream, J2K_Q2, q2, m_n, known_1, emb_pat_1, v, m,
729
120k
                        E, mu_n, Dcup, Pcup, pLSB);
730
731
120k
        q += 2; // Move to the next quad pair
732
120k
    }
733
734
10.7k
    if (quad_width % 2 == 1) {
735
6.98k
        q1 = q;
736
737
6.98k
        if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream,
738
6.98k
                                           dec_cxt_vlc_table0, Dcup, sig_pat, res_off,
739
6.98k
                                           emb_pat_k, emb_pat_1, J2K_Q1, context, Lcup,
740
6.98k
                                           Pcup)) < 0)
741
0
            goto free;
742
743
34.9k
        for (int i = 0; i < 4; i++)
744
27.9k
            sigma_n[4 * q1 + i] = (sig_pat[J2K_Q1] >> i) & 1;
745
746
6.98k
        u[J2K_Q1] = 0;
747
748
6.98k
        if (res_off[J2K_Q1] == 1) {
749
4.37k
            u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
750
4.37k
            u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf);
751
4.37k
            u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf);
752
4.37k
            u[J2K_Q1] = u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] * 4);
753
4.37k
        }
754
755
6.98k
        U[J2K_Q1] = kappa[J2K_Q1] + u[J2K_Q1];
756
6.98k
        if (U[J2K_Q1] > maxbp) {
757
619
            ret = AVERROR_INVALIDDATA;
758
619
            goto free;
759
619
        }
760
761
31.8k
        for (int i = 0; i < 4; i++)
762
25.4k
            m[J2K_Q1][i] = sigma_n[4 * q1 + i] * U[J2K_Q1] - ((emb_pat_k[J2K_Q1] >> i) & 1);
763
764
6.37k
        recover_mag_sgn(mag_sgn_stream, J2K_Q1, q1, m_n, known_1, emb_pat_1, v, m,
765
6.37k
                        E, mu_n, Dcup, Pcup, pLSB);
766
767
6.37k
        q++; // move to next quad pair
768
6.37k
    }
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.1k
    c = precompute_c(quad_width);
783
784
117k
    for (int row = 1; row < quad_height; row++) {
785
886k
        while ((q - (row * quad_width)) < quad_width - 1 && q < (quad_height * quad_width)) {
786
777k
            q1 = q;
787
777k
            q2 = q + 1;
788
777k
            context1  = sigma_n[4 * (q1 - quad_width) + 1];
789
777k
            context1 += sigma_n[4 * (q1 - quad_width) + 3] << 2;              // ne
790
791
777k
            if (!is_divisible(q1, c)) {
792
716k
                context1 |= sigma_n[4 * (q1 - quad_width) - 1];               // nw
793
716k
                context1 += (sigma_n[4 * q1 - 1] | sigma_n[4 * q1 - 2]) << 1; // sw | q
794
716k
            }
795
777k
            if (!is_divisible(q1 + 1, c))
796
777k
                context1 |= sigma_n[4 * (q1 - quad_width) + 5] << 2;
797
798
777k
            if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream,
799
777k
                                               dec_cxt_vlc_table1, Dcup, sig_pat, res_off,
800
777k
                                               emb_pat_k, emb_pat_1, J2K_Q1, context1, Lcup,
801
777k
                                               Pcup))
802
777k
                < 0)
803
0
                goto free;
804
805
3.88M
            for (int i = 0; i < 4; i++)
806
3.11M
                sigma_n[4 * q1 + i] = (sig_pat[J2K_Q1] >> i) & 1;
807
808
777k
            context2  = sigma_n[4 * (q2 - quad_width) + 1];
809
777k
            context2 += sigma_n[4 * (q2 - quad_width) + 3] << 2;
810
811
777k
            if (!is_divisible(q2, c)) {
812
777k
                context2 |= sigma_n[4 * (q2 - quad_width) - 1];
813
777k
                context2 += (sigma_n[4 * q2 - 1] | sigma_n[4 * q2 - 2]) << 1;
814
777k
            }
815
777k
            if (!is_divisible(q2 + 1, c))
816
728k
                context2 |= sigma_n[4 * (q2 - quad_width) + 5] << 2;
817
818
777k
            if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream,
819
777k
                                               dec_cxt_vlc_table1, Dcup, sig_pat, res_off,
820
777k
                                               emb_pat_k, emb_pat_1, J2K_Q2, context2, Lcup,
821
777k
                                               Pcup))
822
777k
                < 0)
823
0
                goto free;
824
825
3.88M
            for (int i = 0; i < 4; i++)
826
3.11M
                sigma_n[4 * q2 + i] = (sig_pat[J2K_Q2] >> i) & 1;
827
828
777k
            u[J2K_Q1] = 0;
829
777k
            u[J2K_Q2] = 0;
830
831
777k
            jpeg2000_bitbuf_refill_backwards(vlc_stream, vlc_buf);
832
833
777k
            if (res_off[J2K_Q1] == 1 && res_off[J2K_Q2] == 1) {
834
3.91k
                u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
835
3.91k
                u_pfx[J2K_Q2] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
836
837
3.91k
                u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf);
838
3.91k
                u_sfx[J2K_Q2] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q2], vlc_buf);
839
840
3.91k
                u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf);
841
3.91k
                u_ext[J2K_Q2] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q2], vlc_buf);
842
843
3.91k
                u[J2K_Q1] = u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] << 2);
844
3.91k
                u[J2K_Q2] = u_pfx[J2K_Q2] + u_sfx[J2K_Q2] + (u_ext[J2K_Q2] << 2);
845
846
773k
            } else if (res_off[J2K_Q1] == 1 || res_off[J2K_Q2] == 1) {
847
21.9k
                uint8_t pos = res_off[J2K_Q1] == 1 ? 0 : 1;
848
849
21.9k
                u_pfx[pos] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
850
21.9k
                u_sfx[pos] = vlc_decode_u_suffix(vlc_stream, u_pfx[pos], vlc_buf);
851
21.9k
                u_ext[pos] = vlc_decode_u_extension(vlc_stream, u_sfx[pos], vlc_buf);
852
853
21.9k
                u[pos] = u_pfx[pos] + u_sfx[pos] + (u_ext[pos] << 2);
854
21.9k
            }
855
777k
            sp = sig_pat[J2K_Q1];
856
857
777k
            gamma[J2K_Q1] = 1;
858
859
777k
            if (sp == 0 || sp == 1 || sp == 2 || sp == 4 || sp == 8)
860
745k
                gamma[J2K_Q1] = 0;
861
862
777k
            sp = sig_pat[J2K_Q2];
863
864
777k
            gamma[J2K_Q2] = 1;
865
866
777k
            if (sp == 0 || sp == 1 || sp == 2 || sp == 4 || sp == 8)
867
739k
                gamma[J2K_Q2] = 0;
868
869
777k
            E_n[J2K_Q1] = E[4 * (q1 - quad_width) + 1];
870
777k
            E_n[J2K_Q2] = E[4 * (q2 - quad_width) + 1];
871
872
777k
            E_ne[J2K_Q1] = E[4 * (q1 - quad_width) + 3];
873
777k
            E_ne[J2K_Q2] = E[4 * (q2 - quad_width) + 3];
874
875
777k
            E_nw[J2K_Q1] = (!is_divisible(q1, c)) * E[FFMAX((4 * (q1 - quad_width) - 1), 0)];
876
777k
            E_nw[J2K_Q2] = (!is_divisible(q2, c)) * E[FFMAX((4 * (q2 - quad_width) - 1), 0)];
877
878
777k
            E_nf[J2K_Q1] = (!is_divisible(q1 + 1, c)) * E[4 * (q1 - quad_width) + 5];
879
777k
            E_nf[J2K_Q2] = (!is_divisible(q2 + 1, c)) * E[4 * (q2 - quad_width) + 5];
880
881
777k
            max_e[J2K_Q1] = FFMAX(E_nw[J2K_Q1], FFMAX3(E_n[J2K_Q1], E_ne[J2K_Q1], E_nf[J2K_Q1]));
882
777k
            max_e[J2K_Q2] = FFMAX(E_nw[J2K_Q2], FFMAX3(E_n[J2K_Q2], E_ne[J2K_Q2], E_nf[J2K_Q2]));
883
884
777k
            kappa[J2K_Q1] = FFMAX(1, gamma[J2K_Q1] * (max_e[J2K_Q1] - 1));
885
777k
            kappa[J2K_Q2] = FFMAX(1, gamma[J2K_Q2] * (max_e[J2K_Q2] - 1));
886
887
777k
            U[J2K_Q1] = kappa[J2K_Q1] + u[J2K_Q1];
888
777k
            U[J2K_Q2] = kappa[J2K_Q2] + u[J2K_Q2];
889
777k
            if (U[J2K_Q1] > maxbp || U[J2K_Q2] > maxbp) {
890
1.28k
                ret = AVERROR_INVALIDDATA;
891
1.28k
                goto free;
892
1.28k
            }
893
894
3.88M
            for (int i = 0; i < 4; i++) {
895
3.10M
                m[J2K_Q1][i] = sigma_n[4 * q1 + i] * U[J2K_Q1] - ((emb_pat_k[J2K_Q1] >> i) & 1);
896
3.10M
                m[J2K_Q2][i] = sigma_n[4 * q2 + i] * U[J2K_Q2] - ((emb_pat_k[J2K_Q2] >> i) & 1);
897
3.10M
            }
898
776k
            recover_mag_sgn(mag_sgn_stream, J2K_Q1, q1, m_n, known_1, emb_pat_1, v, m,
899
776k
                            E, mu_n, Dcup, Pcup, pLSB);
900
901
776k
            recover_mag_sgn(mag_sgn_stream, J2K_Q2, q2, m_n, known_1, emb_pat_1, v, m,
902
776k
                            E, mu_n, Dcup, Pcup, pLSB);
903
904
776k
            q += 2; // Move to the next quad pair
905
776k
        }
906
907
108k
        if (quad_width % 2 == 1) {
908
59.5k
            q1 = q;
909
910
            /* calculate context for current quad */
911
59.5k
            context1  = sigma_n[4 * (q1 - quad_width) + 1];
912
59.5k
            context1 += (sigma_n[4 * (q1 - quad_width) + 3] << 2);
913
914
59.5k
            if (!is_divisible(q1, c)) {
915
11.2k
                context1 |= sigma_n[4 * (q1 - quad_width) - 1];
916
11.2k
                context1 += (sigma_n[4 * q1 - 1] | sigma_n[4 * q1 - 2]) << 1;
917
11.2k
            }
918
59.5k
            if (!is_divisible(q1 + 1, c))
919
0
                context1 |= sigma_n[4 * (q1 - quad_width) + 5] << 2;
920
921
59.5k
            if ((ret = jpeg2000_decode_sig_emb(s, mel_state, mel_stream, vlc_stream,
922
59.5k
                                               dec_cxt_vlc_table1, Dcup, sig_pat, res_off,
923
59.5k
                                               emb_pat_k, emb_pat_1, J2K_Q1, context1, Lcup,
924
59.5k
                                               Pcup)) < 0)
925
0
                goto free;
926
927
297k
            for (int i = 0; i < 4; i++)
928
238k
                sigma_n[4 * q1 + i] = (sig_pat[J2K_Q1] >> i) & 1;
929
930
59.5k
            u[J2K_Q1] = 0;
931
932
            /* Recover mag_sgn value */
933
59.5k
            if (res_off[J2K_Q1] == 1) {
934
6.67k
                u_pfx[J2K_Q1] = vlc_decode_u_prefix(vlc_stream, vlc_buf);
935
6.67k
                u_sfx[J2K_Q1] = vlc_decode_u_suffix(vlc_stream, u_pfx[J2K_Q1], vlc_buf);
936
6.67k
                u_ext[J2K_Q1] = vlc_decode_u_extension(vlc_stream, u_sfx[J2K_Q1], vlc_buf);
937
938
6.67k
                u[J2K_Q1] = u_pfx[J2K_Q1] + u_sfx[J2K_Q1] + (u_ext[J2K_Q1] << 2);
939
6.67k
            }
940
941
59.5k
            sp = sig_pat[J2K_Q1];
942
943
59.5k
            gamma[J2K_Q1] = 1;
944
945
59.5k
            if (sp == 0 || sp == 1 || sp == 2 || sp == 4 || sp == 8)
946
51.5k
                gamma[J2K_Q1] = 0;
947
948
59.5k
            E_n[J2K_Q1] = E[4 * (q1 - quad_width) + 1];
949
950
59.5k
            E_ne[J2K_Q1] = E[4 * (q1 - quad_width) + 3];
951
952
59.5k
            E_nw[J2K_Q1] = (!is_divisible(q1, c)) * E[FFMAX((4 * (q1 - quad_width) - 1), 0)];
953
954
59.5k
            E_nf[J2K_Q1] = (!is_divisible(q1 + 1, c)) * E[4 * (q1 - quad_width) + 5];
955
956
59.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
59.5k
            kappa[J2K_Q1] = FFMAX(1, gamma[J2K_Q1] * (max_e[J2K_Q1] - 1));
959
960
59.5k
            U[J2K_Q1] = kappa[J2K_Q1] + u[J2K_Q1];
961
59.5k
            if (U[J2K_Q1] > maxbp) {
962
760
                ret = AVERROR_INVALIDDATA;
963
760
                goto free;
964
760
            }
965
966
293k
            for (int i = 0; i < 4; i++)
967
235k
                m[J2K_Q1][i] = sigma_n[4 * q1 + i] * U[J2K_Q1] - ((emb_pat_k[J2K_Q1] >> i) & 1);
968
969
58.7k
            recover_mag_sgn(mag_sgn_stream, J2K_Q1, q1, m_n, known_1, emb_pat_1, v, m,
970
58.7k
                            E, mu_n, Dcup, Pcup, pLSB);
971
58.7k
            q += 1;
972
58.7k
        }
973
108k
    }
974
975
    // convert to raster-scan
976
120k
    for (int y = 0; y < quad_height; y++) {
977
1.72M
        for (int x = 0; x < quad_width; x++) {
978
1.60M
            int j1, j2;
979
1.60M
            int x1, x2 , x3;
980
981
1.60M
            j1 = 2 * y;
982
1.60M
            j2 = 2 * x;
983
984
1.60M
            sample_buf[j2 + (j1 * stride)] = (int32_t)*mu;
985
1.60M
            jpeg2000_modify_state(j1, j2, stride, *sigma, block_states);
986
1.60M
            sigma += 1;
987
1.60M
            mu += 1;
988
989
1.60M
            x1 = y != quad_height - 1 || is_border_y == 0;
990
1.60M
            sample_buf[j2 + ((j1 + 1) * stride)] = ((int32_t)*mu) * x1;
991
1.60M
            jpeg2000_modify_state(j1 + 1, j2, stride, (*sigma) * x1, block_states);
992
1.60M
            sigma += 1;
993
1.60M
            mu += 1;
994
995
1.60M
            x2 = x != quad_width - 1 || is_border_x == 0;
996
1.60M
            sample_buf[(j2 + 1) + (j1 * stride)] = ((int32_t)*mu) * x2;
997
1.60M
            jpeg2000_modify_state(j1, j2 + 1, stride, (*sigma) * x2, block_states);
998
1.60M
            sigma += 1;
999
1.60M
            mu += 1;
1000
1001
1.60M
            x3 = x1 | x2;
1002
1.60M
            sample_buf[(j2 + 1) + (j1 + 1) * stride] = ((int32_t)*mu) * x3;
1003
1.60M
            jpeg2000_modify_state(j1 + 1, j2 + 1, stride, (*sigma) * x3, block_states);
1004
1.60M
            sigma += 1;
1005
1.60M
            mu += 1;
1006
1.60M
        }
1007
112k
    }
1008
8.07k
    ret = 1;
1009
11.7k
free:
1010
11.7k
    av_freep(&sigma_n);
1011
11.7k
    av_freep(&E);
1012
11.7k
    av_freep(&mu_n);
1013
11.7k
    return ret;
1014
8.07k
}
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
2.81M
{
1020
2.81M
    uint8_t *state_p0 = block_states + i * stride + j;
1021
2.81M
    uint8_t *state_p1 = block_states + (i + 1) * stride + j;
1022
2.81M
    uint8_t *state_p2 = block_states + (i + 2) * stride + j;
1023
1024
2.81M
    uint8_t mbr0 = state_p0[0] | state_p0[1] | state_p0[2];
1025
2.81M
    uint8_t mbr1 = state_p1[0] | state_p1[2];
1026
2.81M
    uint8_t mbr2 = state_p2[0] | state_p2[1] | state_p2[2];
1027
2.81M
    *mbr  = mbr0 | mbr1 | (mbr2 & causal_cond);
1028
2.81M
    *mbr |= (mbr0 >> HT_SHIFT_REF) & (mbr0 >> HT_SHIFT_SCAN);
1029
2.81M
    *mbr |= (mbr1 >> HT_SHIFT_REF) & (mbr1 >> HT_SHIFT_SCAN);
1030
2.81M
    *mbr |= (mbr2 >> HT_SHIFT_REF) & (mbr2 >> HT_SHIFT_SCAN) & causal_cond;
1031
2.81M
    *mbr &= 1;
1032
2.81M
}
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
263k
{
1040
1.24M
    for (int j = j_s; j < j_s + width; j++) {
1041
979k
        uint32_t  mbr_info = 0;
1042
4.08M
        for (int i = i_s; i < i_s + height; i++) {
1043
3.10M
            int modify_state;
1044
3.10M
            uint8_t bit;
1045
3.10M
            uint8_t causal_cond = (is_causal == 0) || (i != (i_s + height - 1));
1046
3.10M
            int32_t *sp = &sample_buf[j + (i * (stride))];
1047
3.10M
            uint8_t mbr = 0;
1048
1049
3.10M
            if (jpeg2000_get_state(i, j, stride, HT_SHIFT_SIGMA, block_states) == 0)
1050
2.81M
                jpeg2000_calc_mbr(&mbr, i, j, mbr_info & 0x1EF, causal_cond, block_states, stride);
1051
3.10M
            mbr_info >>= 3;
1052
1053
3.10M
            modify_state = block_states[(i + 1) * stride + (j + 1)];
1054
3.10M
            modify_state |= 1 << HT_SHIFT_SCAN;
1055
3.10M
            if (mbr != 0) {
1056
854k
                modify_state |= 1 << HT_SHIFT_REF_IND;
1057
854k
                bit = jpeg2000_peek_bit(sig_prop, magref_segment, magref_length);
1058
854k
                modify_state |= bit << HT_SHIFT_REF;
1059
854k
                *sp |= bit << pLSB;
1060
854k
                *sp |= bit << (pLSB - 1); // Add 0.5 (reconstruction parameter = 1/2)
1061
854k
            }
1062
3.10M
            jpeg2000_modify_state(i, j, stride, modify_state, block_states);
1063
3.10M
        }
1064
979k
    }
1065
    // decode sign
1066
1.24M
    for (int j = j_s; j < j_s + width; j++) {
1067
4.08M
        for (int i = i_s; i < i_s + height; i++) {
1068
3.10M
            uint8_t bit;
1069
3.10M
            int32_t *sp = &sample_buf[j + (i * (stride))];
1070
3.10M
            uint8_t *state_p = block_states + (i + 1) * stride + (j + 1);
1071
3.10M
            if ((state_p[0] >> HT_SHIFT_REF) & 1) {
1072
50.7k
                bit = jpeg2000_peek_bit(sig_prop, magref_segment, magref_length);
1073
50.7k
                *sp |= (uint32_t)bit << 31;
1074
50.7k
            }
1075
3.10M
        }
1076
979k
    }
1077
263k
}
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.07k
{
1088
5.07k
    StateVars sp_dec;
1089
1090
5.07k
    const uint16_t num_v_stripe = height / 4;
1091
5.07k
    const uint16_t num_h_stripe = width / 4;
1092
5.07k
    int b_width                 = 4;
1093
5.07k
    int b_height                = 4;
1094
1095
5.07k
    int last_width;
1096
5.07k
    uint16_t i = 0, j = 0;
1097
5.07k
    uint8_t is_causal = cblk->modes & JPEG2000_CBLK_VSC;
1098
1099
5.07k
    jpeg2000_init_zero(&sp_dec);
1100
1101
34.0k
    for (int n1 = 0; n1 < num_v_stripe; n1++) {
1102
28.9k
        j = 0;
1103
206k
        for (int n2 = 0; n2 < num_h_stripe; n2++) {
1104
177k
            jpeg2000_process_stripes_block(&sp_dec, i, j, b_width, b_height, stride,
1105
177k
                                           pLSB, sample_buf, block_states, magref_segment,
1106
177k
                                           magref_length, is_causal);
1107
177k
            j += 4;
1108
177k
        }
1109
28.9k
        last_width = width % 4;
1110
28.9k
        if (last_width)
1111
23.2k
            jpeg2000_process_stripes_block(&sp_dec, i, j, last_width, b_height, stride,
1112
23.2k
                                           pLSB, sample_buf, block_states, magref_segment,
1113
23.2k
                                           magref_length, is_causal);
1114
28.9k
        i += 4;
1115
28.9k
    }
1116
1117
    /* Decode remaining height stripes */
1118
5.07k
    b_height = height % 4;
1119
5.07k
    j = 0;
1120
64.2k
    for (int n2 = 0; n2 < num_h_stripe; n2++) {
1121
59.1k
        jpeg2000_process_stripes_block(&sp_dec, i, j, b_width, b_height, stride,
1122
59.1k
                                       pLSB, sample_buf, block_states, magref_segment,
1123
59.1k
                                       magref_length, is_causal);
1124
59.1k
        j += 4;
1125
59.1k
    }
1126
5.07k
    last_width = width % 4;
1127
5.07k
    if (last_width)
1128
3.64k
        jpeg2000_process_stripes_block(&sp_dec, i, j, last_width, b_height, stride,
1129
3.64k
                                       pLSB, sample_buf, block_states, magref_segment,
1130
3.64k
                                       magref_length, is_causal);
1131
5.07k
}
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.03k
{
1141
1142
3.03k
    StateVars mag_ref           = { 0 };
1143
3.03k
    const uint16_t num_v_stripe = block_height / 4;
1144
3.03k
    uint16_t height             = 4;
1145
3.03k
    uint16_t i_start            = 0;
1146
3.03k
    int32_t *sp;
1147
3.03k
    int32_t bit;
1148
3.03k
    int32_t tmp;
1149
3.03k
    jpeg2000_init_mag_ref(&mag_ref, magref_length);
1150
1151
12.7k
    for (int n1 = 0; n1 < num_v_stripe; n1++) {
1152
416k
        for (int j = 0; j < width; j++) {
1153
2.03M
            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.62M
                sp = &sample_buf[j + i * stride];
1159
1.62M
                if (jpeg2000_get_state(i, j, stride, HT_SHIFT_SIGMA, block_states) != 0) {
1160
170k
                    jpeg2000_modify_state(i, j, stride, 1 << HT_SHIFT_REF_IND, block_states);
1161
170k
                    bit = jpeg2000_import_magref_bit(&mag_ref, magref_segment, magref_length);
1162
170k
                    tmp = 0xFFFFFFFE | (uint32_t)bit;
1163
170k
                    tmp = (uint32_t)tmp << pLSB;
1164
170k
                    sp[0] &= tmp;
1165
170k
                    sp[0] |= 1 << (pLSB - 1); // Add 0.5 (reconstruction parameter = 1/2)
1166
170k
                }
1167
1.62M
            }
1168
406k
        }
1169
9.75k
        i_start += 4;
1170
9.75k
    }
1171
3.03k
    height = block_height % 4;
1172
139k
    for (int j = 0; j < width; j++) {
1173
208k
        for (int i = i_start; i < i_start + height; i++) {
1174
72.6k
            sp = &sample_buf[j + i * stride];
1175
72.6k
            if (jpeg2000_get_state(i, j, stride, HT_SHIFT_SIGMA, block_states) != 0) {
1176
21.7k
                jpeg2000_modify_state(i, j, stride, 1 << HT_SHIFT_REF_IND, block_states);
1177
21.7k
                bit = jpeg2000_import_magref_bit(&mag_ref, magref_segment, magref_length);
1178
21.7k
                tmp = 0xFFFFFFFE | (uint32_t)bit;
1179
21.7k
                tmp = (uint32_t)tmp << pLSB;
1180
21.7k
                sp[0] &= tmp;
1181
21.7k
                sp[0] |= 1 << (pLSB - 1); // Add 0.5 (reconstruction parameter = 1/2)
1182
21.7k
            }
1183
72.6k
        }
1184
136k
    }
1185
3.03k
}
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
473k
{
1192
473k
    uint8_t p0 = 0;             // 3 * p0 = Number of placeholder passes
1193
473k
    uint32_t Lcup;              // Length of HT cleanup segment
1194
473k
    uint32_t Lref;              // Length of Refinement segment
1195
473k
    uint32_t Scup;              // HT cleanup segment suffix length
1196
473k
    uint32_t Pcup;              // HT cleanup segment prefix length
1197
1198
473k
    uint8_t S_blk;              // Number of skipped magnitude bitplanes
1199
473k
    uint8_t pLSB;
1200
1201
473k
    uint8_t *Dcup;              // Byte of an HT cleanup segment
1202
473k
    uint8_t *Dref;              // Byte of an HT refinement segment
1203
1204
473k
    int z_blk;                  // Number of ht coding pass
1205
1206
473k
    uint8_t num_plhd_passes;    // Number of placeholder passes
1207
1208
473k
    StateVars mag_sgn;          // Magnitude and Sign
1209
473k
    StateVars mel;              // Adaptive run-length coding
1210
473k
    StateVars vlc;              // Variable Length coding
1211
473k
    StateVars sig_prop;         // Significance propagation
1212
1213
473k
    MelDecoderState mel_state;
1214
1215
473k
    int ret;
1216
1217
    /* Temporary buffers */
1218
473k
    int32_t *sample_buf = NULL;
1219
473k
    uint8_t *block_states = NULL;
1220
1221
473k
    int32_t n, val;             // Post-processing
1222
473k
    const uint32_t mask  = (int64_t)UINT32_MAX >> (M_b + 1); // bit mask for ROI detection
1223
1224
473k
    uint8_t num_rempass;
1225
1226
473k
    const int quad_buf_width = width + 4;
1227
473k
    const int quad_buf_height = height + 4;
1228
1229
    /* codeblock size as constrained by Rec. ITU-T T.800, Table A.18 */
1230
473k
    av_assert0(width <= 1024U && height <= 1024U);
1231
473k
    av_assert0(width * height <= 4096);
1232
473k
    av_assert0(width * height > 0);
1233
1234
473k
    memset(t1->data, 0, t1->stride * height * sizeof(*t1->data));
1235
473k
    memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
1236
1237
473k
    if (cblk->npasses == 0)
1238
447k
        return 0;
1239
1240
26.6k
    num_rempass = cblk->npasses % 3;  // Number of remainder passes
1241
26.6k
    num_plhd_passes = num_rempass ? cblk->npasses - num_rempass : cblk->npasses - 3;
1242
26.6k
    av_assert0(num_plhd_passes % 3 == 0);
1243
26.6k
    p0 = num_plhd_passes / 3;
1244
26.6k
    z_blk = cblk->npasses - num_plhd_passes;
1245
1246
26.6k
    if (z_blk <= 0)
1247
0
        return 0; // No passes within this set, continue
1248
1249
26.6k
    Lcup = cblk->pass_lengths[0];
1250
26.6k
    Lref = cblk->pass_lengths[1];
1251
1252
26.6k
    if (Lcup < 2) {
1253
5.98k
        av_log(s->avctx, AV_LOG_ERROR,
1254
5.98k
               "Cleanup pass length must be at least 2 bytes in length\n");
1255
5.98k
        return AVERROR_INVALIDDATA;
1256
5.98k
    }
1257
    // this might arise either if the codestream is corrupted; or contains multiple HT Sets
1258
    // (see Rec. ITU-T T.814, Annex B.1), which the parser does not currently support
1259
20.6k
    if (Lcup + Lref != cblk->length)
1260
535
        return AVERROR_INVALIDDATA;
1261
1262
20.1k
    Dcup = cblk->data;
1263
20.1k
    Dref  = cblk->data + Lcup; // Dref comes after the refinement segment
1264
1265
20.1k
    cblk->data[cblk->length] = 0xFF; // an extra byte for refinement segment (buffer->last)
1266
1267
20.1k
    S_blk = p0 + cblk->zbp;
1268
20.1k
    cblk->zbp = S_blk - 1;
1269
20.1k
    pLSB  = 30 - S_blk;
1270
1271
20.1k
    if (pLSB <= 1 || pLSB >= 31) {
1272
415
        avpriv_request_sample(s->avctx, "pLSB %d", pLSB);
1273
415
        return AVERROR_PATCHWELCOME;
1274
415
    }
1275
1276
19.6k
    Scup = (Dcup[Lcup - 1] << 4) + (Dcup[Lcup - 2] & 0x0F);
1277
1278
19.6k
    if (Scup < 2 || Scup > Lcup || Scup > 4079) {
1279
7.92k
        av_log(s->avctx, AV_LOG_ERROR, "Cleanup pass suffix length is invalid %d\n",
1280
7.92k
               Scup);
1281
7.92k
        ret = AVERROR_INVALIDDATA;
1282
7.92k
        goto free;
1283
7.92k
    }
1284
11.7k
    Pcup = Lcup - Scup;
1285
1286
    /* modDcup shall be done before the creation of vlc instance. */
1287
11.7k
    Dcup[Lcup - 1] = 0xFF;
1288
11.7k
    Dcup[Lcup - 2] |= 0x0F;
1289
1290
    /* Magnitude and refinement */
1291
11.7k
    jpeg2000_init_zero(&mag_sgn);
1292
11.7k
    jpeg2000_bitbuf_refill_forward(&mag_sgn, Dcup, Pcup);
1293
1294
    /* Significance propagation */
1295
11.7k
    jpeg2000_init_zero(&sig_prop);
1296
1297
    /* Adaptive run length */
1298
11.7k
    jpeg2000_init_mel(&mel, Pcup);
1299
1300
    /* Variable Length coding */
1301
11.7k
    jpeg2000_init_vlc(&vlc, Lcup, Pcup, Dcup);
1302
1303
11.7k
    jpeg2000_init_mel_decoder(&mel_state);
1304
1305
11.7k
    sample_buf = av_calloc(quad_buf_width * quad_buf_height, sizeof(int32_t));
1306
11.7k
    block_states = av_calloc(quad_buf_width * quad_buf_height, sizeof(uint8_t));
1307
1308
11.7k
    if (!sample_buf || !block_states) {
1309
0
        ret = AVERROR(ENOMEM);
1310
0
        goto free;
1311
0
    }
1312
11.7k
    if ((ret = jpeg2000_decode_ht_cleanup_segment(s, cblk, t1, &mel_state, &mel, &vlc,
1313
11.7k
                                                  &mag_sgn, Dcup, Lcup, Pcup, pLSB, width,
1314
11.7k
                                                  height, quad_buf_width, sample_buf, block_states)) < 0) {
1315
3.68k
        av_log(s->avctx, AV_LOG_ERROR, "Bad HT cleanup segment\n");
1316
3.68k
        goto free;
1317
3.68k
    }
1318
1319
8.07k
    if (z_blk > 1)
1320
5.07k
        jpeg2000_decode_sigprop_segment(cblk, width, height, quad_buf_width, Dref, Lref,
1321
5.07k
                                        pLSB - 1, sample_buf, block_states);
1322
1323
8.07k
    if (z_blk > 2)
1324
3.03k
        jpeg2000_decode_magref_segment(width, height, quad_buf_width, Dref, Lref,
1325
3.03k
                                       pLSB - 1, sample_buf, block_states);
1326
1327
    /* Reconstruct the sample values */
1328
221k
    for (int y = 0; y < height; y++) {
1329
6.39M
        for (int x = 0; x < width; x++) {
1330
6.18M
            int32_t sign;
1331
1332
6.18M
            n = x + (y * t1->stride);
1333
6.18M
            val = sample_buf[x + (y * quad_buf_width)];
1334
6.18M
            sign = val & INT32_MIN;
1335
6.18M
            val &= INT32_MAX;
1336
            /* ROI shift, if necessary */
1337
6.18M
            if (roi_shift && (((uint32_t)val & ~mask) == 0)) {
1338
2.28k
                if ((32 - ff_clz(val | 1)) < roi_shift && val <= (INT32_MAX >> roi_shift))
1339
                    // Assuming that the internal precision for codeblock decoding is 32 bits.
1340
1.74k
                    val <<= roi_shift;
1341
536
                else {
1342
536
                    av_log(s->avctx, AV_LOG_ERROR,
1343
536
                        "Pixel precision in ROI is beyond the supported range.\n"
1344
536
                    );
1345
536
                    ret = AVERROR_PATCHWELCOME;
1346
536
                    goto free;
1347
536
                }
1348
1349
2.28k
            }
1350
6.18M
            t1->data[n] = val | sign; /* NOTE: Binary point for reconstruction value is located in 31 - M_b */
1351
6.18M
        }
1352
213k
    }
1353
19.6k
free:
1354
19.6k
    av_freep(&sample_buf);
1355
19.6k
    av_freep(&block_states);
1356
19.6k
    return ret;
1357
8.07k
}
1358
1359
/**
1360
 * CtxVLC tables (see Rec. ITU-T T.800, Annex C) as found at
1361
 * https://github.com/osamu620/OpenHTJ2K (author: Osamu Watanabe)
1362
 */
1363
static const uint16_t dec_cxt_vlc_table1[1024] = {
1364
        0x0016, 0x006A, 0x0046, 0x00DD, 0x0086, 0x888B, 0x0026, 0x444D, 0x0016, 0x00AA, 0x0046, 0x88AD, 0x0086,
1365
        0x003A, 0x0026, 0x00DE, 0x0016, 0x00CA, 0x0046, 0x009D, 0x0086, 0x005A, 0x0026, 0x222D, 0x0016, 0x009A,
1366
        0x0046, 0x007D, 0x0086, 0x01FD, 0x0026, 0x007E, 0x0016, 0x006A, 0x0046, 0x88CD, 0x0086, 0x888B, 0x0026,
1367
        0x111D, 0x0016, 0x00AA, 0x0046, 0x005D, 0x0086, 0x003A, 0x0026, 0x00EE, 0x0016, 0x00CA, 0x0046, 0x00BD,
1368
        0x0086, 0x005A, 0x0026, 0x11FF, 0x0016, 0x009A, 0x0046, 0x003D, 0x0086, 0x04ED, 0x0026, 0x2AAF, 0x0016,
1369
        0x006A, 0x0046, 0x00DD, 0x0086, 0x888B, 0x0026, 0x444D, 0x0016, 0x00AA, 0x0046, 0x88AD, 0x0086, 0x003A,
1370
        0x0026, 0x44EF, 0x0016, 0x00CA, 0x0046, 0x009D, 0x0086, 0x005A, 0x0026, 0x222D, 0x0016, 0x009A, 0x0046,
1371
        0x007D, 0x0086, 0x01FD, 0x0026, 0x00BE, 0x0016, 0x006A, 0x0046, 0x88CD, 0x0086, 0x888B, 0x0026, 0x111D,
1372
        0x0016, 0x00AA, 0x0046, 0x005D, 0x0086, 0x003A, 0x0026, 0x4CCF, 0x0016, 0x00CA, 0x0046, 0x00BD, 0x0086,
1373
        0x005A, 0x0026, 0x00FE, 0x0016, 0x009A, 0x0046, 0x003D, 0x0086, 0x04ED, 0x0026, 0x006F, 0x0002, 0x0088,
1374
        0x0002, 0x005C, 0x0002, 0x0018, 0x0002, 0x00DE, 0x0002, 0x0028, 0x0002, 0x009C, 0x0002, 0x004A, 0x0002,
1375
        0x007E, 0x0002, 0x0088, 0x0002, 0x00CC, 0x0002, 0x0018, 0x0002, 0x888F, 0x0002, 0x0028, 0x0002, 0x00FE,
1376
        0x0002, 0x003A, 0x0002, 0x222F, 0x0002, 0x0088, 0x0002, 0x04FD, 0x0002, 0x0018, 0x0002, 0x00BE, 0x0002,
1377
        0x0028, 0x0002, 0x00BF, 0x0002, 0x004A, 0x0002, 0x006E, 0x0002, 0x0088, 0x0002, 0x00AC, 0x0002, 0x0018,
1378
        0x0002, 0x444F, 0x0002, 0x0028, 0x0002, 0x00EE, 0x0002, 0x003A, 0x0002, 0x113F, 0x0002, 0x0088, 0x0002,
1379
        0x005C, 0x0002, 0x0018, 0x0002, 0x00CF, 0x0002, 0x0028, 0x0002, 0x009C, 0x0002, 0x004A, 0x0002, 0x006F,
1380
        0x0002, 0x0088, 0x0002, 0x00CC, 0x0002, 0x0018, 0x0002, 0x009F, 0x0002, 0x0028, 0x0002, 0x00EF, 0x0002,
1381
        0x003A, 0x0002, 0x233F, 0x0002, 0x0088, 0x0002, 0x04FD, 0x0002, 0x0018, 0x0002, 0x00AF, 0x0002, 0x0028,
1382
        0x0002, 0x44FF, 0x0002, 0x004A, 0x0002, 0x005F, 0x0002, 0x0088, 0x0002, 0x00AC, 0x0002, 0x0018, 0x0002,
1383
        0x007F, 0x0002, 0x0028, 0x0002, 0x00DF, 0x0002, 0x003A, 0x0002, 0x111F, 0x0002, 0x0028, 0x0002, 0x005C,
1384
        0x0002, 0x008A, 0x0002, 0x00BF, 0x0002, 0x0018, 0x0002, 0x00FE, 0x0002, 0x00CC, 0x0002, 0x007E, 0x0002,
1385
        0x0028, 0x0002, 0x8FFF, 0x0002, 0x004A, 0x0002, 0x007F, 0x0002, 0x0018, 0x0002, 0x00DF, 0x0002, 0x00AC,
1386
        0x0002, 0x133F, 0x0002, 0x0028, 0x0002, 0x222D, 0x0002, 0x008A, 0x0002, 0x00BE, 0x0002, 0x0018, 0x0002,
1387
        0x44EF, 0x0002, 0x2AAD, 0x0002, 0x006E, 0x0002, 0x0028, 0x0002, 0x15FF, 0x0002, 0x004A, 0x0002, 0x009E,
1388
        0x0002, 0x0018, 0x0002, 0x00CF, 0x0002, 0x003C, 0x0002, 0x223F, 0x0002, 0x0028, 0x0002, 0x005C, 0x0002,
1389
        0x008A, 0x0002, 0x2BBF, 0x0002, 0x0018, 0x0002, 0x04EF, 0x0002, 0x00CC, 0x0002, 0x006F, 0x0002, 0x0028,
1390
        0x0002, 0x27FF, 0x0002, 0x004A, 0x0002, 0x009F, 0x0002, 0x0018, 0x0002, 0x00DE, 0x0002, 0x00AC, 0x0002,
1391
        0x444F, 0x0002, 0x0028, 0x0002, 0x222D, 0x0002, 0x008A, 0x0002, 0x8AAF, 0x0002, 0x0018, 0x0002, 0x00EE,
1392
        0x0002, 0x2AAD, 0x0002, 0x005F, 0x0002, 0x0028, 0x0002, 0x44FF, 0x0002, 0x004A, 0x0002, 0x888F, 0x0002,
1393
        0x0018, 0x0002, 0xAAAF, 0x0002, 0x003C, 0x0002, 0x111F, 0x0004, 0x8FFD, 0x0028, 0x005C, 0x0004, 0x00BC,
1394
        0x008A, 0x66FF, 0x0004, 0x00CD, 0x0018, 0x111D, 0x0004, 0x009C, 0x003A, 0x8AAF, 0x0004, 0x00FC, 0x0028,
1395
        0x133D, 0x0004, 0x00AC, 0x004A, 0x3BBF, 0x0004, 0x2BBD, 0x0018, 0x5FFF, 0x0004, 0x006C, 0x157D, 0x455F,
1396
        0x0004, 0x2FFD, 0x0028, 0x222D, 0x0004, 0x22AD, 0x008A, 0x44EF, 0x0004, 0x00CC, 0x0018, 0x4FFF, 0x0004,
1397
        0x007C, 0x003A, 0x447F, 0x0004, 0x04DD, 0x0028, 0x233D, 0x0004, 0x009D, 0x004A, 0x00DE, 0x0004, 0x88BD,
1398
        0x0018, 0xAFFF, 0x0004, 0x115D, 0x1FFD, 0x444F, 0x0004, 0x8FFD, 0x0028, 0x005C, 0x0004, 0x00BC, 0x008A,
1399
        0x8CEF, 0x0004, 0x00CD, 0x0018, 0x111D, 0x0004, 0x009C, 0x003A, 0x888F, 0x0004, 0x00FC, 0x0028, 0x133D,
1400
        0x0004, 0x00AC, 0x004A, 0x44DF, 0x0004, 0x2BBD, 0x0018, 0x8AFF, 0x0004, 0x006C, 0x157D, 0x006F, 0x0004,
1401
        0x2FFD, 0x0028, 0x222D, 0x0004, 0x22AD, 0x008A, 0x00EE, 0x0004, 0x00CC, 0x0018, 0x2EEF, 0x0004, 0x007C,
1402
        0x003A, 0x277F, 0x0004, 0x04DD, 0x0028, 0x233D, 0x0004, 0x009D, 0x004A, 0x1BBF, 0x0004, 0x88BD, 0x0018,
1403
        0x37FF, 0x0004, 0x115D, 0x1FFD, 0x333F, 0x0002, 0x0088, 0x0002, 0x02ED, 0x0002, 0x00CA, 0x0002, 0x4CCF,
1404
        0x0002, 0x0048, 0x0002, 0x23FF, 0x0002, 0x001A, 0x0002, 0x888F, 0x0002, 0x0088, 0x0002, 0x006C, 0x0002,
1405
        0x002A, 0x0002, 0x00AF, 0x0002, 0x0048, 0x0002, 0x22EF, 0x0002, 0x00AC, 0x0002, 0x005F, 0x0002, 0x0088,
1406
        0x0002, 0x444D, 0x0002, 0x00CA, 0x0002, 0xCCCF, 0x0002, 0x0048, 0x0002, 0x00FE, 0x0002, 0x001A, 0x0002,
1407
        0x006F, 0x0002, 0x0088, 0x0002, 0x005C, 0x0002, 0x002A, 0x0002, 0x009F, 0x0002, 0x0048, 0x0002, 0x00DF,
1408
        0x0002, 0x03FD, 0x0002, 0x222F, 0x0002, 0x0088, 0x0002, 0x02ED, 0x0002, 0x00CA, 0x0002, 0x8CCF, 0x0002,
1409
        0x0048, 0x0002, 0x11FF, 0x0002, 0x001A, 0x0002, 0x007E, 0x0002, 0x0088, 0x0002, 0x006C, 0x0002, 0x002A,
1410
        0x0002, 0x007F, 0x0002, 0x0048, 0x0002, 0x00EE, 0x0002, 0x00AC, 0x0002, 0x003E, 0x0002, 0x0088, 0x0002,
1411
        0x444D, 0x0002, 0x00CA, 0x0002, 0x00BE, 0x0002, 0x0048, 0x0002, 0x00BF, 0x0002, 0x001A, 0x0002, 0x003F,
1412
        0x0002, 0x0088, 0x0002, 0x005C, 0x0002, 0x002A, 0x0002, 0x009E, 0x0002, 0x0048, 0x0002, 0x00DE, 0x0002,
1413
        0x03FD, 0x0002, 0x111F, 0x0004, 0x8AED, 0x0048, 0x888D, 0x0004, 0x00DC, 0x00CA, 0x3FFF, 0x0004, 0xCFFD,
1414
        0x002A, 0x003D, 0x0004, 0x00BC, 0x005A, 0x8DDF, 0x0004, 0x8FFD, 0x0048, 0x006C, 0x0004, 0x027D, 0x008A,
1415
        0x99FF, 0x0004, 0x00EC, 0x00FA, 0x003C, 0x0004, 0x00AC, 0x001A, 0x009F, 0x0004, 0x2FFD, 0x0048, 0x007C,
1416
        0x0004, 0x44CD, 0x00CA, 0x67FF, 0x0004, 0x1FFD, 0x002A, 0x444D, 0x0004, 0x00AD, 0x005A, 0x8CCF, 0x0004,
1417
        0x4FFD, 0x0048, 0x445D, 0x0004, 0x01BD, 0x008A, 0x4EEF, 0x0004, 0x45DD, 0x00FA, 0x111D, 0x0004, 0x009C,
1418
        0x001A, 0x222F, 0x0004, 0x8AED, 0x0048, 0x888D, 0x0004, 0x00DC, 0x00CA, 0xAFFF, 0x0004, 0xCFFD, 0x002A,
1419
        0x003D, 0x0004, 0x00BC, 0x005A, 0x11BF, 0x0004, 0x8FFD, 0x0048, 0x006C, 0x0004, 0x027D, 0x008A, 0x22EF,
1420
        0x0004, 0x00EC, 0x00FA, 0x003C, 0x0004, 0x00AC, 0x001A, 0x227F, 0x0004, 0x2FFD, 0x0048, 0x007C, 0x0004,
1421
        0x44CD, 0x00CA, 0x5DFF, 0x0004, 0x1FFD, 0x002A, 0x444D, 0x0004, 0x00AD, 0x005A, 0x006F, 0x0004, 0x4FFD,
1422
        0x0048, 0x445D, 0x0004, 0x01BD, 0x008A, 0x11DF, 0x0004, 0x45DD, 0x00FA, 0x111D, 0x0004, 0x009C, 0x001A,
1423
        0x155F, 0x0006, 0x00FC, 0x0018, 0x111D, 0x0048, 0x888D, 0x00AA, 0x4DDF, 0x0006, 0x2AAD, 0x005A, 0x67FF,
1424
        0x0028, 0x223D, 0x00BC, 0xAAAF, 0x0006, 0x00EC, 0x0018, 0x5FFF, 0x0048, 0x006C, 0x008A, 0xCCCF, 0x0006,
1425
        0x009D, 0x00CA, 0x44EF, 0x0028, 0x003C, 0x8FFD, 0x137F, 0x0006, 0x8EED, 0x0018, 0x1FFF, 0x0048, 0x007C,
1426
        0x00AA, 0x4CCF, 0x0006, 0x227D, 0x005A, 0x1DDF, 0x0028, 0x444D, 0x4FFD, 0x155F, 0x0006, 0x00DC, 0x0018,
1427
        0x2EEF, 0x0048, 0x445D, 0x008A, 0x22BF, 0x0006, 0x009C, 0x00CA, 0x8CDF, 0x0028, 0x222D, 0x2FFD, 0x226F,
1428
        0x0006, 0x00FC, 0x0018, 0x111D, 0x0048, 0x888D, 0x00AA, 0x1BBF, 0x0006, 0x2AAD, 0x005A, 0x33FF, 0x0028,
1429
        0x223D, 0x00BC, 0x8AAF, 0x0006, 0x00EC, 0x0018, 0x9BFF, 0x0048, 0x006C, 0x008A, 0x8ABF, 0x0006, 0x009D,
1430
        0x00CA, 0x4EEF, 0x0028, 0x003C, 0x8FFD, 0x466F, 0x0006, 0x8EED, 0x0018, 0xCFFF, 0x0048, 0x007C, 0x00AA,
1431
        0x8CCF, 0x0006, 0x227D, 0x005A, 0xAEEF, 0x0028, 0x444D, 0x4FFD, 0x477F, 0x0006, 0x00DC, 0x0018, 0xAFFF,
1432
        0x0048, 0x445D, 0x008A, 0x2BBF, 0x0006, 0x009C, 0x00CA, 0x44DF, 0x0028, 0x222D, 0x2FFD, 0x133F, 0x00F6,
1433
        0xAFFD, 0x1FFB, 0x003C, 0x0008, 0x23BD, 0x007A, 0x11DF, 0x00F6, 0x45DD, 0x2FFB, 0x4EEF, 0x00DA, 0x177D,
1434
        0xCFFD, 0x377F, 0x00F6, 0x3FFD, 0x8FFB, 0x111D, 0x0008, 0x009C, 0x005A, 0x1BBF, 0x00F6, 0x00CD, 0x00BA,
1435
        0x8DDF, 0x4FFB, 0x006C, 0x9BFD, 0x455F, 0x00F6, 0x67FD, 0x1FFB, 0x002C, 0x0008, 0x00AC, 0x007A, 0x009F,
1436
        0x00F6, 0x00AD, 0x2FFB, 0x7FFF, 0x00DA, 0x004C, 0x5FFD, 0x477F, 0x00F6, 0x00EC, 0x8FFB, 0x001C, 0x0008,
1437
        0x008C, 0x005A, 0x888F, 0x00F6, 0x00CC, 0x00BA, 0x2EEF, 0x4FFB, 0x115D, 0x8AED, 0x113F, 0x00F6, 0xAFFD,
1438
        0x1FFB, 0x003C, 0x0008, 0x23BD, 0x007A, 0x1DDF, 0x00F6, 0x45DD, 0x2FFB, 0xBFFF, 0x00DA, 0x177D, 0xCFFD,
1439
        0x447F, 0x00F6, 0x3FFD, 0x8FFB, 0x111D, 0x0008, 0x009C, 0x005A, 0x277F, 0x00F6, 0x00CD, 0x00BA, 0x22EF,
1440
        0x4FFB, 0x006C, 0x9BFD, 0x444F, 0x00F6, 0x67FD, 0x1FFB, 0x002C, 0x0008, 0x00AC, 0x007A, 0x11BF, 0x00F6,
1441
        0x00AD, 0x2FFB, 0xFFFF, 0x00DA, 0x004C, 0x5FFD, 0x233F, 0x00F6, 0x00EC, 0x8FFB, 0x001C, 0x0008, 0x008C,
1442
        0x005A, 0x006F, 0x00F6, 0x00CC, 0x00BA, 0x8BBF, 0x4FFB, 0x115D, 0x8AED, 0x222F};
1443
1444
static const uint16_t dec_cxt_vlc_table0[1024] = {
1445
        0x0026, 0x00AA, 0x0046, 0x006C, 0x0086, 0x8AED, 0x0018, 0x8DDF, 0x0026, 0x01BD, 0x0046, 0x5FFF, 0x0086,
1446
        0x027D, 0x005A, 0x155F, 0x0026, 0x003A, 0x0046, 0x444D, 0x0086, 0x4CCD, 0x0018, 0xCCCF, 0x0026, 0x2EFD,
1447
        0x0046, 0x99FF, 0x0086, 0x009C, 0x00CA, 0x133F, 0x0026, 0x00AA, 0x0046, 0x445D, 0x0086, 0x8CCD, 0x0018,
1448
        0x11DF, 0x0026, 0x4FFD, 0x0046, 0xCFFF, 0x0086, 0x009D, 0x005A, 0x007E, 0x0026, 0x003A, 0x0046, 0x1FFF,
1449
        0x0086, 0x88AD, 0x0018, 0x00BE, 0x0026, 0x8FFD, 0x0046, 0x4EEF, 0x0086, 0x888D, 0x00CA, 0x111F, 0x0026,
1450
        0x00AA, 0x0046, 0x006C, 0x0086, 0x8AED, 0x0018, 0x45DF, 0x0026, 0x01BD, 0x0046, 0x22EF, 0x0086, 0x027D,
1451
        0x005A, 0x227F, 0x0026, 0x003A, 0x0046, 0x444D, 0x0086, 0x4CCD, 0x0018, 0x11BF, 0x0026, 0x2EFD, 0x0046,
1452
        0x00FE, 0x0086, 0x009C, 0x00CA, 0x223F, 0x0026, 0x00AA, 0x0046, 0x445D, 0x0086, 0x8CCD, 0x0018, 0x00DE,
1453
        0x0026, 0x4FFD, 0x0046, 0xABFF, 0x0086, 0x009D, 0x005A, 0x006F, 0x0026, 0x003A, 0x0046, 0x6EFF, 0x0086,
1454
        0x88AD, 0x0018, 0x2AAF, 0x0026, 0x8FFD, 0x0046, 0x00EE, 0x0086, 0x888D, 0x00CA, 0x222F, 0x0004, 0x00CA,
1455
        0x0088, 0x027D, 0x0004, 0x4CCD, 0x0028, 0x00FE, 0x0004, 0x2AFD, 0x0048, 0x005C, 0x0004, 0x009D, 0x0018,
1456
        0x00DE, 0x0004, 0x01BD, 0x0088, 0x006C, 0x0004, 0x88AD, 0x0028, 0x11DF, 0x0004, 0x8AED, 0x0048, 0x003C,
1457
        0x0004, 0x888D, 0x0018, 0x111F, 0x0004, 0x00CA, 0x0088, 0x006D, 0x0004, 0x88CD, 0x0028, 0x88FF, 0x0004,
1458
        0x8BFD, 0x0048, 0x444D, 0x0004, 0x009C, 0x0018, 0x00BE, 0x0004, 0x4EFD, 0x0088, 0x445D, 0x0004, 0x00AC,
1459
        0x0028, 0x00EE, 0x0004, 0x45DD, 0x0048, 0x222D, 0x0004, 0x003D, 0x0018, 0x007E, 0x0004, 0x00CA, 0x0088,
1460
        0x027D, 0x0004, 0x4CCD, 0x0028, 0x1FFF, 0x0004, 0x2AFD, 0x0048, 0x005C, 0x0004, 0x009D, 0x0018, 0x11BF,
1461
        0x0004, 0x01BD, 0x0088, 0x006C, 0x0004, 0x88AD, 0x0028, 0x22EF, 0x0004, 0x8AED, 0x0048, 0x003C, 0x0004,
1462
        0x888D, 0x0018, 0x227F, 0x0004, 0x00CA, 0x0088, 0x006D, 0x0004, 0x88CD, 0x0028, 0x4EEF, 0x0004, 0x8BFD,
1463
        0x0048, 0x444D, 0x0004, 0x009C, 0x0018, 0x2AAF, 0x0004, 0x4EFD, 0x0088, 0x445D, 0x0004, 0x00AC, 0x0028,
1464
        0x8DDF, 0x0004, 0x45DD, 0x0048, 0x222D, 0x0004, 0x003D, 0x0018, 0x155F, 0x0004, 0x005A, 0x0088, 0x006C,
1465
        0x0004, 0x88DD, 0x0028, 0x23FF, 0x0004, 0x11FD, 0x0048, 0x444D, 0x0004, 0x00AD, 0x0018, 0x00BE, 0x0004,
1466
        0x137D, 0x0088, 0x155D, 0x0004, 0x00CC, 0x0028, 0x00DE, 0x0004, 0x02ED, 0x0048, 0x111D, 0x0004, 0x009D,
1467
        0x0018, 0x007E, 0x0004, 0x005A, 0x0088, 0x455D, 0x0004, 0x44CD, 0x0028, 0x00EE, 0x0004, 0x1FFD, 0x0048,
1468
        0x003C, 0x0004, 0x00AC, 0x0018, 0x555F, 0x0004, 0x47FD, 0x0088, 0x113D, 0x0004, 0x02BD, 0x0028, 0x477F,
1469
        0x0004, 0x4CDD, 0x0048, 0x8FFF, 0x0004, 0x009C, 0x0018, 0x222F, 0x0004, 0x005A, 0x0088, 0x006C, 0x0004,
1470
        0x88DD, 0x0028, 0x00FE, 0x0004, 0x11FD, 0x0048, 0x444D, 0x0004, 0x00AD, 0x0018, 0x888F, 0x0004, 0x137D,
1471
        0x0088, 0x155D, 0x0004, 0x00CC, 0x0028, 0x8CCF, 0x0004, 0x02ED, 0x0048, 0x111D, 0x0004, 0x009D, 0x0018,
1472
        0x006F, 0x0004, 0x005A, 0x0088, 0x455D, 0x0004, 0x44CD, 0x0028, 0x1DDF, 0x0004, 0x1FFD, 0x0048, 0x003C,
1473
        0x0004, 0x00AC, 0x0018, 0x227F, 0x0004, 0x47FD, 0x0088, 0x113D, 0x0004, 0x02BD, 0x0028, 0x22BF, 0x0004,
1474
        0x4CDD, 0x0048, 0x22EF, 0x0004, 0x009C, 0x0018, 0x233F, 0x0006, 0x4DDD, 0x4FFB, 0xCFFF, 0x0018, 0x113D,
1475
        0x005A, 0x888F, 0x0006, 0x23BD, 0x008A, 0x00EE, 0x002A, 0x155D, 0xAAFD, 0x277F, 0x0006, 0x44CD, 0x8FFB,
1476
        0x44EF, 0x0018, 0x467D, 0x004A, 0x2AAF, 0x0006, 0x00AC, 0x555B, 0x99DF, 0x1FFB, 0x003C, 0x5FFD, 0x266F,
1477
        0x0006, 0x1DDD, 0x4FFB, 0x6EFF, 0x0018, 0x177D, 0x005A, 0x1BBF, 0x0006, 0x88AD, 0x008A, 0x5DDF, 0x002A,
1478
        0x444D, 0x2FFD, 0x667F, 0x0006, 0x00CC, 0x8FFB, 0x2EEF, 0x0018, 0x455D, 0x004A, 0x119F, 0x0006, 0x009C,
1479
        0x555B, 0x8CCF, 0x1FFB, 0x111D, 0x8CED, 0x006E, 0x0006, 0x4DDD, 0x4FFB, 0x3FFF, 0x0018, 0x113D, 0x005A,
1480
        0x11BF, 0x0006, 0x23BD, 0x008A, 0x8DDF, 0x002A, 0x155D, 0xAAFD, 0x222F, 0x0006, 0x44CD, 0x8FFB, 0x00FE,
1481
        0x0018, 0x467D, 0x004A, 0x899F, 0x0006, 0x00AC, 0x555B, 0x00DE, 0x1FFB, 0x003C, 0x5FFD, 0x446F, 0x0006,
1482
        0x1DDD, 0x4FFB, 0x9BFF, 0x0018, 0x177D, 0x005A, 0x00BE, 0x0006, 0x88AD, 0x008A, 0xCDDF, 0x002A, 0x444D,
1483
        0x2FFD, 0x007E, 0x0006, 0x00CC, 0x8FFB, 0x4EEF, 0x0018, 0x455D, 0x004A, 0x377F, 0x0006, 0x009C, 0x555B,
1484
        0x8BBF, 0x1FFB, 0x111D, 0x8CED, 0x233F, 0x0004, 0x00AA, 0x0088, 0x047D, 0x0004, 0x01DD, 0x0028, 0x11DF,
1485
        0x0004, 0x27FD, 0x0048, 0x005C, 0x0004, 0x8AAD, 0x0018, 0x2BBF, 0x0004, 0x009C, 0x0088, 0x006C, 0x0004,
1486
        0x00CC, 0x0028, 0x00EE, 0x0004, 0x8CED, 0x0048, 0x222D, 0x0004, 0x888D, 0x0018, 0x007E, 0x0004, 0x00AA,
1487
        0x0088, 0x006D, 0x0004, 0x88CD, 0x0028, 0x00FE, 0x0004, 0x19FD, 0x0048, 0x003C, 0x0004, 0x2AAD, 0x0018,
1488
        0xAAAF, 0x0004, 0x8BFD, 0x0088, 0x005D, 0x0004, 0x00BD, 0x0028, 0x4CCF, 0x0004, 0x44ED, 0x0048, 0x4FFF,
1489
        0x0004, 0x223D, 0x0018, 0x111F, 0x0004, 0x00AA, 0x0088, 0x047D, 0x0004, 0x01DD, 0x0028, 0x99FF, 0x0004,
1490
        0x27FD, 0x0048, 0x005C, 0x0004, 0x8AAD, 0x0018, 0x00BE, 0x0004, 0x009C, 0x0088, 0x006C, 0x0004, 0x00CC,
1491
        0x0028, 0x00DE, 0x0004, 0x8CED, 0x0048, 0x222D, 0x0004, 0x888D, 0x0018, 0x444F, 0x0004, 0x00AA, 0x0088,
1492
        0x006D, 0x0004, 0x88CD, 0x0028, 0x2EEF, 0x0004, 0x19FD, 0x0048, 0x003C, 0x0004, 0x2AAD, 0x0018, 0x447F,
1493
        0x0004, 0x8BFD, 0x0088, 0x005D, 0x0004, 0x00BD, 0x0028, 0x009F, 0x0004, 0x44ED, 0x0048, 0x67FF, 0x0004,
1494
        0x223D, 0x0018, 0x133F, 0x0006, 0x00CC, 0x008A, 0x9DFF, 0x2FFB, 0x467D, 0x1FFD, 0x99BF, 0x0006, 0x2AAD,
1495
        0x002A, 0x66EF, 0x4FFB, 0x005C, 0x2EED, 0x377F, 0x0006, 0x89BD, 0x004A, 0x00FE, 0x8FFB, 0x006C, 0x67FD,
1496
        0x889F, 0x0006, 0x888D, 0x001A, 0x5DDF, 0x00AA, 0x222D, 0x89DD, 0x444F, 0x0006, 0x2BBD, 0x008A, 0xCFFF,
1497
        0x2FFB, 0x226D, 0x009C, 0x00BE, 0x0006, 0xAAAD, 0x002A, 0x1DDF, 0x4FFB, 0x003C, 0x4DDD, 0x466F, 0x0006,
1498
        0x8AAD, 0x004A, 0xAEEF, 0x8FFB, 0x445D, 0x8EED, 0x177F, 0x0006, 0x233D, 0x001A, 0x4CCF, 0x00AA, 0xAFFF,
1499
        0x88CD, 0x133F, 0x0006, 0x00CC, 0x008A, 0x77FF, 0x2FFB, 0x467D, 0x1FFD, 0x3BBF, 0x0006, 0x2AAD, 0x002A,
1500
        0x00EE, 0x4FFB, 0x005C, 0x2EED, 0x007E, 0x0006, 0x89BD, 0x004A, 0x4EEF, 0x8FFB, 0x006C, 0x67FD, 0x667F,
1501
        0x0006, 0x888D, 0x001A, 0x00DE, 0x00AA, 0x222D, 0x89DD, 0x333F, 0x0006, 0x2BBD, 0x008A, 0x57FF, 0x2FFB,
1502
        0x226D, 0x009C, 0x199F, 0x0006, 0xAAAD, 0x002A, 0x99DF, 0x4FFB, 0x003C, 0x4DDD, 0x155F, 0x0006, 0x8AAD,
1503
        0x004A, 0xCEEF, 0x8FFB, 0x445D, 0x8EED, 0x277F, 0x0006, 0x233D, 0x001A, 0x1BBF, 0x00AA, 0x3FFF, 0x88CD,
1504
        0x111F, 0x0006, 0x45DD, 0x2FFB, 0x111D, 0x0018, 0x467D, 0x8FFD, 0xCCCF, 0x0006, 0x19BD, 0x004A, 0x22EF,
1505
        0x002A, 0x222D, 0x3FFD, 0x888F, 0x0006, 0x00CC, 0x008A, 0x00FE, 0x0018, 0x115D, 0xCFFD, 0x8AAF, 0x0006,
1506
        0x00AC, 0x003A, 0x8CDF, 0x1FFB, 0x133D, 0x66FD, 0x466F, 0x0006, 0x8CCD, 0x2FFB, 0x5FFF, 0x0018, 0x006C,
1507
        0x4FFD, 0xABBF, 0x0006, 0x22AD, 0x004A, 0x00EE, 0x002A, 0x233D, 0xAEFD, 0x377F, 0x0006, 0x2BBD, 0x008A,
1508
        0x55DF, 0x0018, 0x005C, 0x177D, 0x119F, 0x0006, 0x009C, 0x003A, 0x4CCF, 0x1FFB, 0x333D, 0x8EED, 0x444F,
1509
        0x0006, 0x45DD, 0x2FFB, 0x111D, 0x0018, 0x467D, 0x8FFD, 0x99BF, 0x0006, 0x19BD, 0x004A, 0x2EEF, 0x002A,
1510
        0x222D, 0x3FFD, 0x667F, 0x0006, 0x00CC, 0x008A, 0x4EEF, 0x0018, 0x115D, 0xCFFD, 0x899F, 0x0006, 0x00AC,
1511
        0x003A, 0x00DE, 0x1FFB, 0x133D, 0x66FD, 0x226F, 0x0006, 0x8CCD, 0x2FFB, 0x9BFF, 0x0018, 0x006C, 0x4FFD,
1512
        0x00BE, 0x0006, 0x22AD, 0x004A, 0x1DDF, 0x002A, 0x233D, 0xAEFD, 0x007E, 0x0006, 0x2BBD, 0x008A, 0xCEEF,
1513
        0x0018, 0x005C, 0x177D, 0x277F, 0x0006, 0x009C, 0x003A, 0x8BBF, 0x1FFB, 0x333D, 0x8EED, 0x455F, 0x1FF9,
1514
        0x1DDD, 0xAFFB, 0x00DE, 0x8FF9, 0x001C, 0xFFFB, 0x477F, 0x4FF9, 0x177D, 0x3FFB, 0x3BBF, 0x2FF9, 0xAEEF,
1515
        0x8EED, 0x444F, 0x1FF9, 0x22AD, 0x000A, 0x8BBF, 0x8FF9, 0x00FE, 0xCFFD, 0x007E, 0x4FF9, 0x115D, 0x5FFB,
1516
        0x577F, 0x2FF9, 0x8DDF, 0x2EED, 0x333F, 0x1FF9, 0x2BBD, 0xAFFB, 0x88CF, 0x8FF9, 0xBFFF, 0xFFFB, 0x377F,
1517
        0x4FF9, 0x006D, 0x3FFB, 0x00BE, 0x2FF9, 0x66EF, 0x9FFD, 0x133F, 0x1FF9, 0x009D, 0x000A, 0xABBF, 0x8FF9,
1518
        0xDFFF, 0x6FFD, 0x006E, 0x4FF9, 0x002C, 0x5FFB, 0x888F, 0x2FF9, 0xCDDF, 0x4DDD, 0x222F, 0x1FF9, 0x1DDD,
1519
        0xAFFB, 0x4CCF, 0x8FF9, 0x001C, 0xFFFB, 0x277F, 0x4FF9, 0x177D, 0x3FFB, 0x99BF, 0x2FF9, 0xCEEF, 0x8EED,
1520
        0x004E, 0x1FF9, 0x22AD, 0x000A, 0x00AE, 0x8FF9, 0x7FFF, 0xCFFD, 0x005E, 0x4FF9, 0x115D, 0x5FFB, 0x009E,
1521
        0x2FF9, 0x5DDF, 0x2EED, 0x003E, 0x1FF9, 0x2BBD, 0xAFFB, 0x00CE, 0x8FF9, 0xEFFF, 0xFFFB, 0x667F, 0x4FF9,
1522
        0x006D, 0x3FFB, 0x8AAF, 0x2FF9, 0x00EE, 0x9FFD, 0x233F, 0x1FF9, 0x009D, 0x000A, 0x1BBF, 0x8FF9, 0x4EEF,
1523
        0x6FFD, 0x455F, 0x4FF9, 0x002C, 0x5FFB, 0x008E, 0x2FF9, 0x99DF, 0x4DDD, 0x111F};