Coverage Report

Created: 2025-11-16 07:20

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