Coverage Report

Created: 2025-12-31 07:57

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