Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/jpegxl_parser.c
Line
Count
Source
1
/**
2
 * JPEG XL parser
3
 * Copyright (c) 2023 Leo Izen <leo.izen@gmail.com>
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
22
#include <errno.h>
23
#include <stdint.h>
24
#include <string.h>
25
26
#include "libavutil/attributes.h"
27
#include "libavutil/error.h"
28
#include "libavutil/intmath.h"
29
#include "libavutil/macros.h"
30
#include "libavutil/mem.h"
31
#include "libavutil/pixfmt.h"
32
33
#include "bytestream.h"
34
#include "codec_id.h"
35
#include "parser_internal.h"
36
#define UNCHECKED_BITSTREAM_READER 0
37
#define BITSTREAM_READER_LE
38
#include "get_bits.h"
39
#include "jpegxl.h"
40
#include "jpegxl_parse.h"
41
#include "parser.h"
42
#include "vlc.h"
43
44
#define JXL_FLAG_NOISE 1
45
#define JXL_FLAG_PATCHES 2
46
#define JXL_FLAG_SPLINES 16
47
2.96M
#define JXL_FLAG_USE_LF_FRAME 32
48
#define JXL_FLAG_SKIP_ADAPTIVE_LF_SMOOTH 128
49
50
32.2k
#define MAX_PREFIX_ALPHABET_SIZE (1u << 15)
51
52
306k
#define clog1p(x) (ff_log2(x) + !!(x))
53
8.67k
#define unpack_signed(x) (((x) & 1 ? -(x)-1 : (x))/2)
54
17.7M
#define div_ceil(x, y) (((x) - 1) / (y) + 1)
55
#define vlm(a,b) {.sym = (a), .len = (b)}
56
57
typedef struct JXLHybridUintConf {
58
    int split_exponent;
59
    uint32_t msb_in_token;
60
    uint32_t lsb_in_token;
61
} JXLHybridUintConf;
62
63
typedef struct JXLSymbolDistribution {
64
    JXLHybridUintConf config;
65
    int log_bucket_size;
66
    /* this is the actual size of the alphabet */
67
    int alphabet_size;
68
    /* ceil(log(alphabet_size)) */
69
    int log_alphabet_size;
70
71
    /* for prefix code distributions */
72
    VLC vlc;
73
    /* in case bits == 0 */
74
    uint32_t default_symbol;
75
76
    /*
77
     * each (1 << log_alphabet_size) length
78
     * with log_alphabet_size <= 8
79
     */
80
    /* frequencies associated with this Distribution */
81
    uint32_t freq[258];
82
    /* cutoffs for using the symbol table */
83
    uint16_t cutoffs[258];
84
    /* the symbol table for this distribution */
85
    uint16_t symbols[258];
86
    /* the offset for symbols */
87
    uint16_t offsets[258];
88
89
    /* if this distribution contains only one symbol this is its index */
90
    int uniq_pos;
91
} JXLSymbolDistribution;
92
93
typedef struct JXLDistributionBundle {
94
    /* lz77 flags */
95
    int lz77_enabled;
96
    uint32_t lz77_min_symbol;
97
    uint32_t lz77_min_length;
98
    JXLHybridUintConf lz_len_conf;
99
100
    /* one entry for each distribution */
101
    uint8_t *cluster_map;
102
    /* length of cluster_map */
103
    int num_dist;
104
105
    /* one for each cluster */
106
    JXLSymbolDistribution *dists;
107
    int num_clusters;
108
109
    /* whether to use brotli prefixes or ans */
110
    int use_prefix_code;
111
    /* bundle log alphabet size, dist ones may be smaller */
112
    int log_alphabet_size;
113
} JXLDistributionBundle;
114
115
typedef struct JXLEntropyDecoder {
116
117
    /* state is a positive 32-bit integer, or -1 if unset */
118
    int64_t state;
119
120
    /* lz77 values */
121
    uint32_t num_to_copy;
122
    uint32_t copy_pos;
123
    uint32_t num_decoded;
124
125
    /* length is (1 << 20) */
126
    /* if lz77 is enabled for this bundle */
127
    /* if lz77 is disabled it's NULL */
128
    uint32_t *window;
129
130
    /* primary bundle associated with this distribution */
131
    JXLDistributionBundle bundle;
132
133
    /* for av_log */
134
    void *logctx;
135
} JXLEntropyDecoder;
136
137
typedef struct JXLFrame {
138
    FFJXLFrameType type;
139
    FFJXLFrameEncoding encoding;
140
141
    int is_last;
142
    int full_frame;
143
144
    uint32_t total_length;
145
    uint32_t body_length;
146
} JXLFrame;
147
148
typedef struct JXLCodestream {
149
    FFJXLMetadata meta;
150
    JXLFrame frame;
151
} JXLCodestream;
152
153
typedef struct JXLParseContext {
154
    ParseContext pc;
155
    JXLCodestream codestream;
156
157
    /* using ISOBMFF-based container */
158
    int container;
159
    int64_t skip;
160
    int copied;
161
    int64_t collected_size;
162
    int64_t codestream_length;
163
    int skipped_icc;
164
    int64_t next;
165
166
    uint8_t cs_buffer[4096 + AV_INPUT_BUFFER_PADDING_SIZE];
167
} JXLParseContext;
168
169
/* used for reading brotli prefixes */
170
static const VLCElem level0_table[16] = {
171
    vlm(0, 2), vlm(4, 2), vlm(3, 2), vlm(2, 3), vlm(0, 2), vlm(4, 2), vlm(3, 2), vlm(1, 4),
172
    vlm(0, 2), vlm(4, 2), vlm(3, 2), vlm(2, 3), vlm(0, 2), vlm(4, 2), vlm(3, 2), vlm(5, 4),
173
};
174
175
/* prefix table for populating ANS distribution */
176
static const VLCElem dist_prefix_table[128] = {
177
    vlm(10, 3), vlm(12, 7), vlm(7, 3), vlm(3, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(5, 4),
178
    vlm(10, 3), vlm(4, 4),  vlm(7, 3), vlm(1, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(2, 4),
179
    vlm(10, 3), vlm(0, 5),  vlm(7, 3), vlm(3, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(5, 4),
180
    vlm(10, 3), vlm(4, 4),  vlm(7, 3), vlm(1, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(2, 4),
181
    vlm(10, 3), vlm(11, 6), vlm(7, 3), vlm(3, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(5, 4),
182
    vlm(10, 3), vlm(4, 4),  vlm(7, 3), vlm(1, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(2, 4),
183
    vlm(10, 3), vlm(0, 5),  vlm(7, 3), vlm(3, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(5, 4),
184
    vlm(10, 3), vlm(4, 4),  vlm(7, 3), vlm(1, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(2, 4),
185
    vlm(10, 3), vlm(13, 7), vlm(7, 3), vlm(3, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(5, 4),
186
    vlm(10, 3), vlm(4, 4),  vlm(7, 3), vlm(1, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(2, 4),
187
    vlm(10, 3), vlm(0, 5),  vlm(7, 3), vlm(3, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(5, 4),
188
    vlm(10, 3), vlm(4, 4),  vlm(7, 3), vlm(1, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(2, 4),
189
    vlm(10, 3), vlm(11, 6), vlm(7, 3), vlm(3, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(5, 4),
190
    vlm(10, 3), vlm(4, 4),  vlm(7, 3), vlm(1, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(2, 4),
191
    vlm(10, 3), vlm(0, 5),  vlm(7, 3), vlm(3, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(5, 4),
192
    vlm(10, 3), vlm(4, 4),  vlm(7, 3), vlm(1, 4), vlm(6, 3), vlm(8, 3), vlm(9, 3), vlm(2, 4),
193
};
194
195
static const uint8_t prefix_codelen_map[18] = {
196
    1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
197
};
198
199
/**
200
 * Read a variable-length 8-bit integer.
201
 * Used when populating the ANS frequency tables.
202
 */
203
static av_always_inline uint8_t jxl_u8(GetBitContext *gb)
204
53.8k
{
205
53.8k
    int n;
206
53.8k
    if (!get_bits1(gb))
207
29.5k
        return 0;
208
24.2k
    n = get_bits(gb, 3);
209
210
24.2k
    return get_bitsz(gb, n) | (1 << n);
211
53.8k
}
212
213
/* read a U32(c_i + u(u_i)) */
214
static av_always_inline uint32_t jxl_u32(GetBitContext *gb,
215
                        uint32_t c0, uint32_t c1, uint32_t c2, uint32_t c3,
216
                        uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3)
217
148M
{
218
148M
    const uint32_t constants[4] = {c0, c1, c2, c3};
219
148M
    const uint32_t ubits    [4] = {u0, u1, u2, u3};
220
148M
    uint32_t ret, choice = get_bits(gb, 2);
221
222
148M
    ret = constants[choice];
223
148M
    if (ubits[choice])
224
127M
        ret += get_bits_long(gb, ubits[choice]);
225
226
148M
    return ret;
227
148M
}
228
229
/* read a U64() */
230
static uint64_t jxl_u64(GetBitContext *gb)
231
8.97M
{
232
8.97M
    uint64_t shift = 12, ret;
233
234
8.97M
    switch (get_bits(gb, 2)) {
235
24.2k
    case 1:
236
24.2k
        ret = 1 + get_bits(gb, 4);
237
24.2k
        break;
238
25.3k
    case 2:
239
25.3k
        ret = 17 + get_bits(gb, 8);
240
25.3k
        break;
241
34.9k
    case 3:
242
34.9k
        ret = get_bits(gb, 12);
243
83.7k
        while (get_bits1(gb)) {
244
52.8k
            if (shift < 60) {
245
48.8k
                ret |= (uint64_t)get_bits(gb, 8) << shift;
246
48.8k
                shift += 8;
247
48.8k
            } else {
248
3.99k
                ret |= (uint64_t)get_bits(gb, 4) << shift;
249
3.99k
                break;
250
3.99k
            }
251
52.8k
        }
252
34.9k
        break;
253
8.89M
    default:
254
8.89M
        ret = 0;
255
8.97M
    }
256
257
8.97M
    return ret;
258
8.97M
}
259
260
static int read_hybrid_uint_conf(GetBitContext *gb, JXLHybridUintConf *conf, int log_alphabet_size)
261
99.6k
{
262
99.6k
    conf->split_exponent = get_bitsz(gb, clog1p(log_alphabet_size));
263
99.6k
    if (conf->split_exponent == log_alphabet_size) {
264
10.0k
        conf->msb_in_token = conf->lsb_in_token = 0;
265
10.0k
        return 0;
266
10.0k
    }
267
268
89.6k
    conf->msb_in_token = get_bitsz(gb, clog1p(conf->split_exponent));
269
89.6k
    if (conf->msb_in_token > conf->split_exponent)
270
1.33k
        return AVERROR_INVALIDDATA;
271
88.3k
    conf->lsb_in_token = get_bitsz(gb, clog1p(conf->split_exponent - conf->msb_in_token));
272
88.3k
    if (conf->msb_in_token + conf->lsb_in_token > conf->split_exponent)
273
861
        return AVERROR_INVALIDDATA;
274
275
87.4k
    return 0;
276
88.3k
}
277
278
static int read_hybrid_uint(GetBitContext *gb, const JXLHybridUintConf *conf, uint32_t token, uint32_t *hybrid_uint)
279
6.30M
{
280
6.30M
    uint32_t n, low, split = 1 << conf->split_exponent;
281
282
6.30M
    if (token < split) {
283
6.07M
        *hybrid_uint = token;
284
6.07M
        return 0;
285
6.07M
    }
286
287
227k
    n = conf->split_exponent - conf->lsb_in_token - conf->msb_in_token +
288
227k
        ((token - split) >> (conf->msb_in_token + conf->lsb_in_token));
289
227k
    if (n >= 32)
290
707
        return AVERROR_INVALIDDATA;
291
226k
    low = token & ((1 << conf->lsb_in_token) - 1);
292
226k
    token >>= conf->lsb_in_token;
293
226k
    token &= (1 << conf->msb_in_token) - 1;
294
226k
    token |= 1 << conf->msb_in_token;
295
226k
    *hybrid_uint = (((token << n) | get_bits_long(gb, n)) << conf->lsb_in_token ) | low;
296
297
226k
    return 0;
298
227k
}
299
300
static inline uint32_t read_prefix_symbol(GetBitContext *gb, const JXLSymbolDistribution *dist)
301
54.2k
{
302
54.2k
    if (!dist->vlc.bits)
303
38.7k
        return dist->default_symbol;
304
305
15.5k
    return get_vlc2(gb, dist->vlc.table, dist->vlc.bits, 1);
306
54.2k
}
307
308
static uint32_t read_ans_symbol(GetBitContext *gb, JXLEntropyDecoder *dec, const JXLSymbolDistribution *dist)
309
6.24M
{
310
6.24M
    uint32_t index, i, pos, symbol, offset;
311
312
6.24M
    if (dec->state < 0)
313
9.73k
        dec->state = get_bits_long(gb, 32);
314
315
6.24M
    index = dec->state & 0xFFF;
316
6.24M
    i = index >> dist->log_bucket_size;
317
6.24M
    pos = index & ((1 << dist->log_bucket_size) - 1);
318
6.24M
    symbol = pos >= dist->cutoffs[i] ? dist->symbols[i] : i;
319
6.24M
    offset = pos >= dist->cutoffs[i] ? dist->offsets[i] + pos : pos;
320
6.24M
    dec->state = dist->freq[symbol] * (dec->state >> 12) + offset;
321
6.24M
    if (dec->state < (1 << 16))
322
350k
        dec->state = (dec->state << 16) | get_bits(gb, 16);
323
6.24M
    dec->state &= 0xFFFFFFFF;
324
325
6.24M
    return symbol;
326
6.24M
}
327
328
static int decode_hybrid_varlen_uint(GetBitContext *gb, JXLEntropyDecoder *dec,
329
                                     const JXLDistributionBundle *bundle,
330
                                     uint32_t context, uint32_t *hybrid_uint)
331
6.30M
{
332
6.30M
    int ret;
333
6.30M
    uint32_t token, distance;
334
6.30M
    const JXLSymbolDistribution *dist;
335
336
6.30M
    if (dec->num_to_copy > 0) {
337
9.15k
        *hybrid_uint = dec->window[dec->copy_pos++ & 0xFFFFF];
338
9.15k
        dec->num_to_copy--;
339
9.15k
        dec->window[dec->num_decoded++ & 0xFFFFF] = *hybrid_uint;
340
9.15k
        return 0;
341
9.15k
    }
342
343
6.30M
    if (context >= bundle->num_dist)
344
0
        return AVERROR(EINVAL);
345
6.30M
    if (bundle->cluster_map[context] >= bundle->num_clusters)
346
0
        return AVERROR_INVALIDDATA;
347
348
6.30M
    dist = &bundle->dists[bundle->cluster_map[context]];
349
6.30M
    if (bundle->use_prefix_code)
350
54.0k
        token = read_prefix_symbol(gb, dist);
351
6.24M
    else
352
6.24M
        token = read_ans_symbol(gb, dec, dist);
353
354
6.30M
    if (bundle->lz77_enabled && token >= bundle->lz77_min_symbol) {
355
676
        const JXLSymbolDistribution *lz77dist = &bundle->dists[bundle->cluster_map[bundle->num_dist - 1]];
356
676
        if (!dec->num_decoded)
357
395
            return AVERROR_INVALIDDATA;
358
281
        ret = read_hybrid_uint(gb, &bundle->lz_len_conf, token - bundle->lz77_min_symbol, &dec->num_to_copy);
359
281
        if (ret < 0)
360
40
            return ret;
361
241
        dec->num_to_copy += bundle->lz77_min_length;
362
241
        if (bundle->use_prefix_code)
363
193
            token = read_prefix_symbol(gb, lz77dist);
364
48
        else
365
48
            token = read_ans_symbol(gb, dec, lz77dist);
366
241
        ret = read_hybrid_uint(gb, &lz77dist->config, token, &distance);
367
241
        if (ret < 0)
368
65
            return ret;
369
176
        distance++;
370
176
        distance = FFMIN3(distance, dec->num_decoded, 1 << 20);
371
176
        dec->copy_pos = dec->num_decoded - distance;
372
176
        return decode_hybrid_varlen_uint(gb, dec, bundle, context, hybrid_uint);
373
241
    }
374
6.29M
    ret = read_hybrid_uint(gb, &dist->config, token, hybrid_uint);
375
6.29M
    if (ret < 0)
376
602
        return ret;
377
6.29M
    if (bundle->lz77_enabled)
378
52.2k
        dec->window[dec->num_decoded++ & 0xFFFFF] = *hybrid_uint;
379
380
6.29M
    return 0;
381
6.29M
}
382
383
static int populate_distribution(GetBitContext *gb, JXLSymbolDistribution *dist, int log_alphabet_size)
384
44.3k
{
385
44.3k
    int len = 0, shift, omit_log = -1, omit_pos = -1;
386
44.3k
    int prev = 0, num_same = 0;
387
44.3k
    uint32_t total_count = 0;
388
44.3k
    uint8_t logcounts[258] = { 0 };
389
44.3k
    uint8_t same[258] = { 0 };
390
44.3k
    const int table_size = 1 << log_alphabet_size;
391
44.3k
    dist->uniq_pos = -1;
392
393
44.3k
    if (get_bits1(gb)) {
394
        /* simple code */
395
15.1k
        if (get_bits1(gb)) {
396
7.19k
            uint8_t v1 = jxl_u8(gb);
397
7.19k
            uint8_t v2 = jxl_u8(gb);
398
7.19k
            if (v1 == v2)
399
511
                return AVERROR_INVALIDDATA;
400
6.68k
            dist->freq[v1] = get_bits(gb, 12);
401
6.68k
            dist->freq[v2] = (1 << 12) - dist->freq[v1];
402
6.68k
            if (!dist->freq[v1])
403
491
                dist->uniq_pos = v2;
404
6.68k
            dist->alphabet_size = 1 + FFMAX(v1, v2);
405
7.99k
        } else {
406
7.99k
            uint8_t x = jxl_u8(gb);
407
7.99k
            dist->freq[x] = 1 << 12;
408
7.99k
            dist->uniq_pos = x;
409
7.99k
            dist->alphabet_size = 1 + x;
410
7.99k
        }
411
14.6k
        if (dist->alphabet_size > table_size)
412
1.12k
            return AVERROR_INVALIDDATA;
413
414
13.5k
        return 0;
415
14.6k
    }
416
417
29.1k
    if (get_bits1(gb)) {
418
        /* flat code */
419
8.18k
        dist->alphabet_size = jxl_u8(gb) + 1;
420
8.18k
        if (dist->alphabet_size > table_size)
421
262
            return AVERROR_INVALIDDATA;
422
129k
        for (int i = 0; i < dist->alphabet_size; i++)
423
121k
            dist->freq[i] = (1 << 12) / dist->alphabet_size;
424
25.7k
        for (int i = 0; i < (1 << 12) % dist->alphabet_size; i++)
425
17.8k
            dist->freq[i]++;
426
7.92k
        return 0;
427
8.18k
    }
428
429
29.3k
    do {
430
29.3k
        if (!get_bits1(gb))
431
19.0k
            break;
432
29.3k
    } while (++len < 3);
433
434
20.9k
    shift = (get_bitsz(gb, len) | (1 << len)) - 1;
435
20.9k
    if (shift > 13)
436
113
        return AVERROR_INVALIDDATA;
437
438
20.8k
    dist->alphabet_size = jxl_u8(gb) + 3;
439
20.8k
    if (dist->alphabet_size > table_size)
440
594
        return AVERROR_INVALIDDATA;
441
442
174k
    for (int i = 0; i < dist->alphabet_size; i++) {
443
153k
        logcounts[i] = get_vlc2(gb, dist_prefix_table, 7, 1);
444
153k
        if (logcounts[i] == 13) {
445
2.35k
            int rle = jxl_u8(gb);
446
2.35k
            same[i] = rle + 5;
447
2.35k
            i += rle + 3;
448
2.35k
            continue;
449
2.35k
        }
450
151k
        if (logcounts[i] > omit_log) {
451
30.2k
            omit_log = logcounts[i];
452
30.2k
            omit_pos = i;
453
30.2k
        }
454
151k
    }
455
20.2k
    if (omit_pos < 0 || omit_pos + 1 < dist->alphabet_size && logcounts[omit_pos + 1] == 13)
456
444
        return AVERROR_INVALIDDATA;
457
458
182k
    for (int i = 0; i < dist->alphabet_size; i++) {
459
162k
        if (same[i]) {
460
1.90k
            num_same = same[i] - 1;
461
1.90k
            prev = i > 0 ? dist->freq[i - 1] : 0;
462
1.90k
        }
463
162k
        if (num_same) {
464
11.0k
            dist->freq[i] = prev;
465
11.0k
            num_same--;
466
151k
        } else {
467
151k
            if (i == omit_pos || !logcounts[i])
468
23.0k
                continue;
469
128k
            if (logcounts[i] == 1) {
470
6.37k
                dist->freq[i] = 1;
471
121k
            } else {
472
121k
                int bitcount = FFMIN(FFMAX(0, shift - ((12 - logcounts[i] + 1) >> 1)), logcounts[i] - 1);
473
121k
                dist->freq[i] = (1 << (logcounts[i] - 1)) + (get_bitsz(gb, bitcount) << (logcounts[i] - 1 - bitcount));
474
121k
            }
475
128k
        }
476
139k
        total_count += dist->freq[i];
477
139k
    }
478
19.8k
    dist->freq[omit_pos] = (1 << 12) - total_count;
479
480
19.8k
    return 0;
481
20.2k
}
482
483
static void dist_bundle_close(JXLDistributionBundle *bundle)
484
33.5k
{
485
33.5k
    if (bundle->use_prefix_code && bundle->dists)
486
44.9k
        for (int i = 0; i < bundle->num_clusters; i++)
487
35.0k
            ff_vlc_free(&bundle->dists[i].vlc);
488
33.5k
    av_freep(&bundle->dists);
489
33.5k
    av_freep(&bundle->cluster_map);
490
33.5k
}
491
492
493
static int read_distribution_bundle(GetBitContext *gb, JXLEntropyDecoder *dec,
494
                                    JXLDistributionBundle *bundle, int num_dist, int disallow_lz77);
495
496
static int read_dist_clustering(GetBitContext *gb, JXLEntropyDecoder *dec, JXLDistributionBundle *bundle)
497
30.5k
{
498
30.5k
    int ret;
499
500
30.5k
    bundle->cluster_map = av_malloc(bundle->num_dist);
501
30.5k
    if (!bundle->cluster_map)
502
0
        return AVERROR(ENOMEM);
503
504
30.5k
    if (bundle->num_dist == 1) {
505
8.39k
        bundle->cluster_map[0] = 0;
506
8.39k
        bundle->num_clusters = 1;
507
8.39k
        return 0;
508
8.39k
    }
509
510
22.1k
    if (get_bits1(gb)) {
511
        /* simple clustering */
512
8.81k
        uint32_t nbits = get_bits(gb, 2);
513
108k
        for (int i = 0; i < bundle->num_dist; i++)
514
100k
            bundle->cluster_map[i] = get_bitsz(gb, nbits);
515
13.3k
    } else {
516
        /* complex clustering */
517
13.3k
        int use_mtf = get_bits1(gb);
518
13.3k
        JXLDistributionBundle nested = { 0 };
519
        /* num_dist == 1 prevents this from recursing again */
520
13.3k
        ret = read_distribution_bundle(gb, dec, &nested, 1, bundle->num_dist <= 2);
521
13.3k
        if (ret < 0) {
522
4.25k
            dist_bundle_close(&nested);
523
4.25k
            return ret;
524
4.25k
        }
525
142k
        for (int i = 0; i < bundle->num_dist; i++) {
526
134k
            uint32_t clust;
527
134k
            ret = decode_hybrid_varlen_uint(gb, dec, &nested, 0, &clust);
528
134k
            if (ret < 0) {
529
456
                dist_bundle_close(&nested);
530
456
                return ret;
531
456
            }
532
133k
            bundle->cluster_map[i] = clust;
533
133k
        }
534
8.59k
        dec->state = -1;
535
        /* it's not going to necessarily be zero after reading */
536
8.59k
        dec->num_to_copy = 0;
537
8.59k
        dec->num_decoded = 0;
538
8.59k
        dist_bundle_close(&nested);
539
8.59k
        if (use_mtf) {
540
3.55k
            uint8_t mtf[256];
541
913k
            for (int i = 0; i < 256; i++)
542
909k
                mtf[i] = i;
543
78.6k
            for (int i = 0; i < bundle->num_dist; i++) {
544
75.1k
                int index = bundle->cluster_map[i];
545
75.1k
                bundle->cluster_map[i] = mtf[index];
546
75.1k
                if (index) {
547
44.7k
                    int value = mtf[index];
548
1.57M
                    for (int j = index; j > 0; j--)
549
1.53M
                        mtf[j] = mtf[j - 1];
550
44.7k
                    mtf[0] = value;
551
44.7k
                }
552
75.1k
            }
553
3.55k
        }
554
8.59k
    }
555
250k
    for (int i = 0; i < bundle->num_dist; i++) {
556
233k
        if (bundle->cluster_map[i] >= bundle->num_clusters)
557
28.0k
            bundle->num_clusters = bundle->cluster_map[i] + 1;
558
233k
    }
559
560
17.4k
    if (bundle->num_clusters > bundle->num_dist)
561
1.37k
        return AVERROR_INVALIDDATA;
562
563
16.0k
    return 0;
564
17.4k
}
565
566
static int gen_alias_map(JXLEntropyDecoder *dec, JXLSymbolDistribution *dist, int log_alphabet_size)
567
28.2k
{
568
28.2k
    uint32_t bucket_size, table_size;
569
28.2k
    uint8_t overfull[256], underfull[256];
570
28.2k
    int overfull_pos = 0, underfull_pos = 0;
571
28.2k
    dist->log_bucket_size = 12 - log_alphabet_size;
572
28.2k
    bucket_size = 1 << dist->log_bucket_size;
573
28.2k
    table_size = 1 << log_alphabet_size;
574
575
28.2k
    if (dist->uniq_pos >= 0) {
576
690k
        for (int i = 0; i < table_size; i++) {
577
684k
            dist->symbols[i] = dist->uniq_pos;
578
684k
            dist->offsets[i] = bucket_size * i;
579
684k
            dist->cutoffs[i] = 0;
580
684k
        }
581
5.32k
        return 0;
582
5.32k
    }
583
584
459k
    for (int i = 0; i < dist->alphabet_size; i++) {
585
436k
        dist->cutoffs[i] = dist->freq[i];
586
436k
        dist->symbols[i] = i;
587
436k
        if (dist->cutoffs[i] > bucket_size)
588
133k
            overfull[overfull_pos++] = i;
589
303k
        else if (dist->cutoffs[i] < bucket_size)
590
257k
            underfull[underfull_pos++] = i;
591
436k
    }
592
593
1.86M
    for (int i = dist->alphabet_size; i < table_size; i++) {
594
1.84M
        dist->cutoffs[i] = 0;
595
1.84M
        underfull[underfull_pos++] = i;
596
1.84M
    }
597
598
2.17M
    while (overfull_pos) {
599
2.15M
        int o, u, by;
600
        /* this should be impossible */
601
2.15M
        if (!underfull_pos)
602
589
            return AVERROR_INVALIDDATA;
603
2.15M
        u = underfull[--underfull_pos];
604
2.15M
        o = overfull[--overfull_pos];
605
2.15M
        by = bucket_size - dist->cutoffs[u];
606
2.15M
        dist->cutoffs[o] -= by;
607
2.15M
        dist->symbols[u] = o;
608
2.15M
        dist->offsets[u] = dist->cutoffs[o];
609
2.15M
        if (dist->cutoffs[o] < bucket_size)
610
51.9k
            underfull[underfull_pos++] = o;
611
2.10M
        else if (dist->cutoffs[o] > bucket_size)
612
2.04M
            overfull[overfull_pos++] = o;
613
2.15M
    }
614
615
2.20M
    for (int i = 0; i < table_size; i++) {
616
2.18M
        if (dist->cutoffs[i] == bucket_size) {
617
95.0k
            dist->symbols[i] = i;
618
95.0k
            dist->offsets[i] = 0;
619
95.0k
            dist->cutoffs[i] = 0;
620
2.08M
        } else {
621
2.08M
            dist->offsets[i] -= dist->cutoffs[i];
622
2.08M
        }
623
2.18M
    }
624
625
22.3k
    return 0;
626
22.9k
}
627
628
static int read_simple_vlc_prefix(GetBitContext *gb, JXLEntropyDecoder *dec, JXLSymbolDistribution *dist)
629
4.43k
{
630
4.43k
    int nsym, tree_select, bits;
631
632
4.43k
    int8_t lens[4];
633
4.43k
    int16_t symbols[4];
634
635
4.43k
    nsym = 1 + get_bits(gb, 2);
636
15.9k
    for (int i = 0; i < nsym; i++)
637
11.5k
        symbols[i] = get_bitsz(gb, dist->log_alphabet_size);
638
4.43k
    if (nsym == 4)
639
1.56k
        tree_select = get_bits1(gb);
640
4.43k
    switch (nsym) {
641
1.02k
    case 1:
642
1.02k
        dist->vlc.bits = 0;
643
1.02k
        dist->default_symbol = symbols[0];
644
1.02k
        return 0;
645
1.31k
    case 2:
646
1.31k
        bits = 1;
647
1.31k
        lens[0] = 1, lens[1] = 1, lens[2] = 0, lens[3] = 0;
648
1.31k
        if (symbols[1] < symbols[0])
649
502
            FFSWAP(int16_t, symbols[0], symbols[1]);
650
1.31k
        break;
651
542
    case 3:
652
542
        bits = 2;
653
542
        lens[0] = 1, lens[1] = 2, lens[2] = 2, lens[3] = 0;
654
542
        if (symbols[2] < symbols[1])
655
127
            FFSWAP(int16_t, symbols[1], symbols[2]);
656
542
        break;
657
1.56k
    case 4:
658
1.56k
        if (tree_select) {
659
778
            bits = 3;
660
778
            lens[0] = 1, lens[1] = 2, lens[2] = 3, lens[3] = 3;
661
778
            if (symbols[3] < symbols[2])
662
413
                FFSWAP(int16_t, symbols[2], symbols[3]);
663
786
        } else {
664
786
            bits = 2;
665
786
            lens[0] = 2, lens[1] = 2, lens[2] = 2, lens[3] = 2;
666
1.57k
            while (1) {
667
1.57k
                if (symbols[1] < symbols[0])
668
559
                    FFSWAP(int16_t, symbols[0], symbols[1]);
669
1.57k
                if (symbols[3] < symbols[2])
670
805
                    FFSWAP(int16_t, symbols[2], symbols[3]);
671
1.57k
                if (symbols[1] <= symbols[2])
672
786
                    break;
673
788
                FFSWAP(int16_t, symbols[1], symbols[2]);
674
788
            }
675
786
        }
676
1.56k
        break;
677
0
    default:
678
        // Challenge Complete! How did we get here?
679
0
        return AVERROR_BUG;
680
4.43k
    }
681
682
3.41k
    return ff_vlc_init_from_lengths(&dist->vlc, bits, nsym, lens, 1, symbols,
683
3.41k
                                    2, 2, 0, VLC_INIT_LE, dec->logctx);
684
4.43k
}
685
686
static int read_vlc_prefix(GetBitContext *gb, JXLEntropyDecoder *dec, JXLSymbolDistribution *dist)
687
17.5k
{
688
17.5k
    int8_t level1_lens[18] = { 0 };
689
17.5k
    int8_t level1_lens_s[18] = { 0 };
690
17.5k
    int16_t level1_syms[18] = { 0 };
691
17.5k
    uint32_t level1_codecounts[19] = { 0 };
692
17.5k
    uint8_t *buf = NULL;
693
17.5k
    int8_t *level2_lens, *level2_lens_s;
694
17.5k
    int16_t *level2_syms;
695
17.5k
    uint32_t *level2_codecounts;
696
697
17.5k
    int repeat_count_prev = 0, repeat_count_zero = 0, prev = 8;
698
17.5k
    int total_code = 0, len, hskip, num_codes = 0, ret;
699
700
17.5k
    VLC level1_vlc = { 0 };
701
702
17.5k
    if (dist->alphabet_size == 1) {
703
7.16k
        dist->vlc.bits = 0;
704
7.16k
        dist->default_symbol = 0;
705
7.16k
        return 0;
706
7.16k
    }
707
708
10.3k
    hskip = get_bits(gb, 2);
709
10.3k
    if (hskip == 1)
710
4.43k
        return read_simple_vlc_prefix(gb, dec, dist);
711
712
5.91k
    level1_codecounts[0] = hskip;
713
77.2k
    for (int i = hskip; i < 18; i++) {
714
75.4k
        len = level1_lens[prefix_codelen_map[i]] = get_vlc2(gb, level0_table, 4, 1);
715
75.4k
        if (len < 0) {
716
0
            ret = AVERROR_INVALIDDATA;
717
0
            goto end;
718
0
        }
719
75.4k
        level1_codecounts[len]++;
720
75.4k
        if (len) {
721
39.6k
            total_code += (32 >> len);
722
39.6k
            num_codes++;
723
39.6k
        }
724
75.4k
        if (total_code >= 32) {
725
4.12k
            level1_codecounts[0] += 18 - i - 1;
726
4.12k
            break;
727
4.12k
        }
728
75.4k
    }
729
730
5.91k
    if (total_code != 32 && num_codes >= 2 || num_codes < 1) {
731
2.45k
        ret = AVERROR_INVALIDDATA;
732
2.45k
        goto end;
733
2.45k
    }
734
735
65.7k
    for (int i = 1; i < 19; i++)
736
62.2k
         level1_codecounts[i] += level1_codecounts[i - 1];
737
738
65.7k
    for (int i = 17; i >= 0; i--) {
739
62.2k
        int idx = --level1_codecounts[level1_lens[i]];
740
62.2k
        level1_lens_s[idx] = level1_lens[i];
741
62.2k
        level1_syms[idx] = i;
742
62.2k
    }
743
744
3.46k
    ret = ff_vlc_init_from_lengths(&level1_vlc, 5, 18, level1_lens_s, 1, level1_syms, 2, 2,
745
3.46k
        0, VLC_INIT_LE, dec->logctx);
746
3.46k
    if (ret < 0)
747
0
        goto end;
748
749
3.46k
    buf = av_mallocz(MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t) + sizeof(int16_t) + sizeof(uint32_t))
750
3.46k
                     + sizeof(uint32_t));
751
3.46k
    if (!buf) {
752
0
        ret = AVERROR(ENOMEM);
753
0
        goto end;
754
0
    }
755
756
3.46k
    level2_lens = (int8_t *)buf;
757
3.46k
    level2_lens_s = (int8_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * sizeof(int8_t));
758
3.46k
    level2_syms = (int16_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t)));
759
3.46k
    level2_codecounts = (uint32_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t) + sizeof(int16_t)));
760
761
3.46k
    total_code = 0;
762
93.7k
    for (int i = 0; i < dist->alphabet_size; i++) {
763
92.4k
        len = get_vlc2(gb, level1_vlc.table, 5, 1);
764
92.4k
        if (len < 0) {
765
203
            ret = AVERROR_INVALIDDATA;
766
203
            goto end;
767
203
        }
768
92.2k
        if (get_bits_left(gb) < 0) {
769
45
            ret = AVERROR_BUFFER_TOO_SMALL;
770
45
            goto end;
771
45
        }
772
92.2k
        if (len == 16) {
773
4.67k
            int extra = 3 + get_bits(gb, 2);
774
4.67k
            if (repeat_count_prev)
775
1.31k
                extra += 4 * (repeat_count_prev - 2) - repeat_count_prev;
776
4.67k
            extra = FFMIN(extra, dist->alphabet_size - i);
777
59.9k
            for (int j = 0; j < extra; j++)
778
55.2k
                level2_lens[i + j] = prev;
779
4.67k
            total_code += (32768 >> prev) * extra;
780
4.67k
            i += extra - 1;
781
4.67k
            repeat_count_prev += extra;
782
4.67k
            repeat_count_zero = 0;
783
4.67k
            level2_codecounts[prev] += extra;
784
87.5k
        } else if (len == 17) {
785
8.88k
            int extra = 3 + get_bits(gb, 3);
786
8.88k
            if (repeat_count_zero > 0)
787
3.21k
                extra += 8 * (repeat_count_zero - 2) - repeat_count_zero;
788
8.88k
            extra = FFMIN(extra, dist->alphabet_size - i);
789
8.88k
            i += extra - 1;
790
8.88k
            repeat_count_prev = 0;
791
8.88k
            repeat_count_zero += extra;
792
8.88k
            level2_codecounts[0] += extra;
793
78.6k
        } else {
794
78.6k
            level2_lens[i] = len;
795
78.6k
            repeat_count_prev = repeat_count_zero = 0;
796
78.6k
            if (len) {
797
67.3k
                total_code += (32768 >> len);
798
67.3k
                prev = len;
799
67.3k
            }
800
78.6k
            level2_codecounts[len]++;
801
78.6k
        }
802
92.2k
        if (total_code >= 32768) {
803
1.97k
            level2_codecounts[0] += dist->alphabet_size - i - 1;
804
1.97k
            break;
805
1.97k
        }
806
92.2k
    }
807
808
3.21k
    if (total_code != 32768 && level2_codecounts[0] < dist->alphabet_size - 1) {
809
1.39k
        ret = AVERROR_INVALIDDATA;
810
1.39k
        goto end;
811
1.39k
    }
812
813
8.05M
    for (int i = 1; i < dist->alphabet_size + 1; i++)
814
8.05M
        level2_codecounts[i] += level2_codecounts[i - 1];
815
816
8.05M
    for (int i = dist->alphabet_size - 1; i >= 0; i--) {
817
8.05M
        int idx = --level2_codecounts[level2_lens[i]];
818
8.05M
        level2_lens_s[idx] = level2_lens[i];
819
8.05M
        level2_syms[idx] = i;
820
8.05M
    }
821
822
1.81k
    ret = ff_vlc_init_from_lengths(&dist->vlc, 15, dist->alphabet_size, level2_lens_s,
823
1.81k
                                    1, level2_syms, 2, 2, 0, VLC_INIT_LE, dec->logctx);
824
825
5.91k
end:
826
5.91k
    av_freep(&buf);
827
5.91k
    ff_vlc_free(&level1_vlc);
828
829
5.91k
    return ret;
830
1.81k
}
831
832
static int read_distribution_bundle(GetBitContext *gb, JXLEntropyDecoder *dec,
833
                                    JXLDistributionBundle *bundle, int num_dist, int disallow_lz77)
834
31.8k
{
835
31.8k
    int ret;
836
837
31.8k
    if (num_dist <= 0)
838
0
        return AVERROR(EINVAL);
839
840
31.8k
    bundle->num_dist = num_dist;
841
31.8k
    bundle->lz77_enabled = get_bits1(gb);
842
31.8k
    if (bundle->lz77_enabled) {
843
13.7k
        if (disallow_lz77)
844
647
            return AVERROR_INVALIDDATA;
845
13.0k
        bundle->lz77_min_symbol = jxl_u32(gb, 224, 512, 4096, 8, 0, 0, 0, 15);
846
13.0k
        bundle->lz77_min_length = jxl_u32(gb, 3, 4, 5, 9, 0, 0, 2, 8);
847
13.0k
        bundle->num_dist++;
848
13.0k
        ret = read_hybrid_uint_conf(gb, &bundle->lz_len_conf, 8);
849
13.0k
        if (ret < 0)
850
643
            return ret;
851
13.0k
    }
852
853
30.5k
    if (bundle->lz77_enabled && !dec->window) {
854
10.5k
        dec->window = av_malloc_array(1 << 20, sizeof(uint32_t));
855
10.5k
        if (!dec->window)
856
0
            return AVERROR(ENOMEM);
857
10.5k
    }
858
859
30.5k
    ret = read_dist_clustering(gb, dec, bundle);
860
30.5k
    if (ret < 0)
861
6.08k
        return ret;
862
24.4k
    if (get_bits_left(gb) < 0)
863
167
        return AVERROR_BUFFER_TOO_SMALL;
864
865
24.2k
    bundle->dists = av_calloc(bundle->num_clusters, sizeof(JXLSymbolDistribution));
866
24.2k
    if (!bundle->dists)
867
0
        return AVERROR(ENOMEM);
868
869
24.2k
    bundle->use_prefix_code = get_bits1(gb);
870
24.2k
    bundle->log_alphabet_size = bundle->use_prefix_code ? 15 : 5 + get_bits(gb, 2);
871
872
109k
    for (int i = 0; i < bundle->num_clusters; i++) {
873
86.5k
        ret = read_hybrid_uint_conf(gb, &bundle->dists[i].config, bundle->log_alphabet_size);
874
86.5k
        if (ret < 0)
875
1.55k
            return ret;
876
85.0k
        if (get_bits_left(gb) < 0)
877
57
            return AVERROR_BUFFER_TOO_SMALL;
878
85.0k
    }
879
880
22.6k
    if (bundle->use_prefix_code) {
881
38.4k
        for (int i = 0; i < bundle->num_clusters; i++) {
882
29.7k
            JXLSymbolDistribution *dist = &bundle->dists[i];
883
29.7k
            if (get_bits1(gb)) {
884
18.3k
                int n = get_bits(gb, 4);
885
18.3k
                dist->alphabet_size = 1 + (1 << n) + get_bitsz(gb, n);
886
18.3k
                if (dist->alphabet_size > MAX_PREFIX_ALPHABET_SIZE)
887
491
                    return AVERROR_INVALIDDATA;
888
18.3k
            } else {
889
11.4k
                dist->alphabet_size = 1;
890
11.4k
            }
891
29.2k
            dist->log_alphabet_size = clog1p(dist->alphabet_size - 1);
892
29.2k
        }
893
22.0k
        for (int i = 0; i < bundle->num_clusters; i++) {
894
17.5k
            ret = read_vlc_prefix(gb, dec, &bundle->dists[i]);
895
17.5k
            if (ret < 0)
896
4.09k
                return ret;
897
13.4k
            if (get_bits_left(gb) < 0)
898
51
                return AVERROR_BUFFER_TOO_SMALL;
899
13.4k
        }
900
13.5k
    } else {
901
54.6k
        for (int i = 0; i < bundle->num_clusters; i++) {
902
44.3k
            ret = populate_distribution(gb, &bundle->dists[i], bundle->log_alphabet_size);
903
44.3k
            if (ret < 0)
904
3.04k
                return ret;
905
41.3k
            if (get_bits_left(gb) < 0)
906
158
                return AVERROR_BUFFER_TOO_SMALL;
907
41.3k
        }
908
37.9k
        for (int i = 0; i < bundle->num_clusters; i++) {
909
28.2k
            ret = gen_alias_map(dec, &bundle->dists[i], bundle->log_alphabet_size);
910
28.2k
            if (ret < 0)
911
589
                return ret;
912
28.2k
        }
913
10.3k
    }
914
915
14.2k
    return 0;
916
22.6k
}
917
918
static void entropy_decoder_close(JXLEntropyDecoder *dec)
919
20.2k
{
920
20.2k
    if (!dec)
921
0
        return;
922
20.2k
    av_freep(&dec->window);
923
20.2k
    dist_bundle_close(&dec->bundle);
924
20.2k
}
925
926
static int entropy_decoder_init(void *avctx, GetBitContext *gb, JXLEntropyDecoder *dec, int num_dist)
927
18.4k
{
928
18.4k
    int ret;
929
930
18.4k
    memset(dec, 0, sizeof(*dec));
931
18.4k
    dec->logctx = avctx;
932
18.4k
    dec->state = -1;
933
934
18.4k
    ret = read_distribution_bundle(gb, dec, &dec->bundle, num_dist, 0);
935
18.4k
    if (ret < 0) {
936
13.3k
        entropy_decoder_close(dec);
937
13.3k
        return ret;
938
13.3k
    }
939
940
5.16k
    return 0;
941
18.4k
}
942
943
static int64_t entropy_decoder_read_symbol(GetBitContext *gb, JXLEntropyDecoder *dec, uint32_t context)
944
6.17M
{
945
6.17M
    int ret;
946
6.17M
    uint32_t hybrid_uint;
947
948
6.17M
    ret = decode_hybrid_varlen_uint(gb, dec, &dec->bundle, context, &hybrid_uint);
949
6.17M
    if (ret < 0)
950
646
        return ret;
951
952
6.17M
    return hybrid_uint;
953
6.17M
}
954
955
static inline uint32_t icc_context(uint64_t i, uint32_t b1, uint32_t b2)
956
6.14M
{
957
6.14M
    uint32_t p1, p2;
958
6.14M
    if (i <= 128)
959
30.6k
        return 0;
960
6.11M
    if (b1 >= 'a' && b1 <= 'z' || b1 >= 'A' && b1 <= 'Z')
961
14.8k
        p1 = 0;
962
6.09M
    else if (b1 >= '0' && b1 <= '9' || b1 == '.' || b1 == ',')
963
5.65k
        p1 = 1;
964
6.09M
    else if (b1 <= 1)
965
1.43M
        p1 = b1 + 2;
966
4.65M
    else if (b1 > 1 && b1 < 16)
967
354k
        p1 = 4;
968
4.29M
    else if (b1 > 240 && b1 < 255)
969
3.27k
        p1 = 5;
970
4.29M
    else if (b1 == 255)
971
2.46k
        p1 = 6;
972
4.29M
    else
973
4.29M
        p1 = 7;
974
975
6.11M
    if (b2 >= 'a' && b2 <= 'z' || b2 >= 'A' && b2 <= 'Z')
976
14.8k
        p2 = 0;
977
6.09M
    else if (b2 >= '0' && b2 <= '9' || b2 == '.' || b2 == ',')
978
5.65k
        p2 = 1;
979
6.09M
    else if (b2 < 16)
980
1.79M
        p2 = 2;
981
4.29M
    else if (b2 > 240)
982
5.74k
        p2 = 3;
983
4.29M
    else
984
4.29M
        p2 = 4;
985
986
6.11M
    return 1 + p1 + p2 * 8;
987
6.14M
}
988
989
static inline uint32_t toc_context(uint32_t x)
990
30.0k
{
991
30.0k
    return FFMIN(7, clog1p(x));
992
30.0k
}
993
994
static void populate_fields(AVCodecParserContext *s, AVCodecContext *avctx, const FFJXLMetadata *meta)
995
4.15k
{
996
4.15k
    s->width = meta->width;
997
4.15k
    s->height = meta->height;
998
999
4.15k
    switch (meta->csp) {
1000
3.60k
    case JPEGXL_CS_RGB:
1001
3.62k
    case JPEGXL_CS_XYB:
1002
3.62k
        avctx->colorspace = AVCOL_SPC_RGB;
1003
3.62k
        break;
1004
524
    default:
1005
524
        avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
1006
4.15k
    }
1007
1008
4.15k
    if (meta->wp == JPEGXL_WP_D65) {
1009
3.05k
        switch (meta->primaries) {
1010
2.99k
        case JPEGXL_PR_SRGB:
1011
2.99k
            avctx->color_primaries = AVCOL_PRI_BT709;
1012
2.99k
            break;
1013
2
        case JPEGXL_PR_P3:
1014
2
            avctx->color_primaries = AVCOL_PRI_SMPTE432;
1015
2
            break;
1016
3
        case JPEGXL_PR_2100:
1017
3
            avctx->color_primaries = AVCOL_PRI_BT2020;
1018
3
            break;
1019
56
        default:
1020
56
            avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
1021
3.05k
        }
1022
3.05k
    } else if (meta->wp == JPEGXL_WP_DCI && meta->primaries == JPEGXL_PR_P3) {
1023
1
        avctx->color_primaries = AVCOL_PRI_SMPTE431;
1024
1.09k
    } else {
1025
1.09k
        avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
1026
1.09k
    }
1027
1028
4.15k
    if (meta->trc > JPEGXL_TR_GAMMA) {
1029
3.05k
        FFJXLTransferCharacteristic trc = meta->trc - JPEGXL_TR_GAMMA;
1030
3.05k
        switch (trc) {
1031
65
        case JPEGXL_TR_BT709:
1032
65
            avctx->color_trc = AVCOL_TRC_BT709;
1033
65
            break;
1034
4
        case JPEGXL_TR_LINEAR:
1035
4
            avctx->color_trc = AVCOL_TRC_LINEAR;
1036
4
            break;
1037
2.94k
        case JPEGXL_TR_SRGB:
1038
2.94k
            avctx->color_trc = AVCOL_TRC_IEC61966_2_1;
1039
2.94k
            break;
1040
3
        case JPEGXL_TR_PQ:
1041
3
            avctx->color_trc = AVCOL_TRC_SMPTEST2084;
1042
3
            break;
1043
5
        case JPEGXL_TR_DCI:
1044
5
            avctx->color_trc = AVCOL_TRC_SMPTE428;
1045
5
            break;
1046
5
        case JPEGXL_TR_HLG:
1047
5
            avctx->color_trc = AVCOL_TRC_ARIB_STD_B67;
1048
5
            break;
1049
28
        default:
1050
28
            avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
1051
3.05k
        }
1052
3.05k
    } else if (meta->trc > 0) {
1053
1.07k
        if (meta->trc > 45355 && meta->trc < 45555)
1054
0
            avctx->color_trc = AVCOL_TRC_GAMMA22;
1055
1.07k
        else if (meta->trc > 35614 && meta->trc < 35814)
1056
0
            avctx->color_trc = AVCOL_TRC_GAMMA28;
1057
1.07k
        else
1058
1.07k
            avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
1059
1.07k
    } else {
1060
27
        avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
1061
27
    }
1062
1063
4.15k
    if (meta->csp == JPEGXL_CS_GRAY) {
1064
248
        if (meta->bit_depth <= 8)
1065
99
            s->format = meta->have_alpha ? AV_PIX_FMT_YA8 : AV_PIX_FMT_GRAY8;
1066
149
        else if (meta->bit_depth <= 16)
1067
97
            s->format = meta->have_alpha ? AV_PIX_FMT_YA16 : AV_PIX_FMT_GRAY16;
1068
52
        else
1069
52
            s->format = meta->have_alpha ? AV_PIX_FMT_NONE : AV_PIX_FMT_GRAYF32;
1070
3.90k
    } else {
1071
3.90k
        if (meta->bit_depth <= 8)
1072
2.86k
            s->format = meta->have_alpha ? AV_PIX_FMT_RGBA : AV_PIX_FMT_RGB24;
1073
1.03k
        else if (meta->bit_depth <= 16)
1074
689
            s->format = meta->have_alpha ? AV_PIX_FMT_RGBA64 : AV_PIX_FMT_RGB48;
1075
346
        else
1076
346
            s->format = meta->have_alpha ? AV_PIX_FMT_RGBAF32 : AV_PIX_FMT_RGBF32;
1077
3.90k
    }
1078
1079
4.15k
    if (meta->have_alpha) {
1080
872
        avctx->alpha_mode = meta->alpha_associated ? AVALPHA_MODE_PREMULTIPLIED
1081
872
                                                   : AVALPHA_MODE_STRAIGHT;
1082
872
    }
1083
4.15k
}
1084
1085
static int skip_icc_profile(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
1086
4.42k
{
1087
4.42k
    int64_t ret;
1088
4.42k
    uint32_t last = 0, last2 = 0;
1089
4.42k
    JXLEntropyDecoder dec = { 0 };
1090
4.42k
    uint64_t enc_size = jxl_u64(gb);
1091
4.42k
    uint64_t output_size = 0;
1092
4.42k
    int out_size_shift = 0;
1093
1094
4.42k
    if (!enc_size || enc_size > (1 << 22))
1095
664
        return AVERROR_INVALIDDATA;
1096
1097
3.76k
    ret = entropy_decoder_init(avctx, gb, &dec, 41);
1098
3.76k
    if (ret < 0)
1099
1.79k
        goto end;
1100
1101
1.97k
    if (get_bits_left(gb) < 0) {
1102
0
        ret = AVERROR_BUFFER_TOO_SMALL;
1103
0
        goto end;
1104
0
    }
1105
1106
6.14M
    for (uint64_t read = 0; read < enc_size; read++) {
1107
6.14M
        ret = entropy_decoder_read_symbol(gb, &dec, icc_context(read, last, last2));
1108
6.14M
        if (ret < 0)
1109
265
            goto end;
1110
6.14M
        if (ret > 255) {
1111
271
            ret = AVERROR_INVALIDDATA;
1112
271
            goto end;
1113
271
        }
1114
6.14M
        if (get_bits_left(gb) < 0) {
1115
134
            ret = AVERROR_BUFFER_TOO_SMALL;
1116
134
            goto end;
1117
134
        }
1118
6.14M
        last2 = last;
1119
6.14M
        last = ret;
1120
6.14M
        if (out_size_shift < 63) {
1121
2.66k
            output_size += (ret & UINT64_C(0x7F)) << out_size_shift;
1122
2.66k
            if (!(ret & 0x80)) {
1123
1.39k
                out_size_shift = 63;
1124
1.39k
            } else {
1125
1.26k
                out_size_shift += 7;
1126
1.26k
                if (out_size_shift > 56) {
1127
58
                    ret = AVERROR_INVALIDDATA;
1128
58
                    goto end;
1129
58
                }
1130
1.26k
            }
1131
6.14M
        } else if (output_size < 132) {
1132
1.14k
            ret = AVERROR_INVALIDDATA;
1133
1.14k
            goto end;
1134
1.14k
        }
1135
6.14M
    }
1136
1137
99
    ret = 0;
1138
1139
3.76k
end:
1140
3.76k
    entropy_decoder_close(&dec);
1141
1142
3.76k
    return ret;
1143
99
}
1144
1145
static int skip_extensions(GetBitContext *gb)
1146
5.91M
{
1147
5.91M
    uint64_t extensions = jxl_u64(gb), extensions_len = 0;
1148
1149
5.91M
    if (get_bits_left(gb) < 0)
1150
445
        return AVERROR_BUFFER_TOO_SMALL;
1151
1152
5.91M
    if (!extensions)
1153
5.89M
        return 0;
1154
1155
974k
    for (int i = 0; i < 64; i++) {
1156
959k
        if (extensions & (UINT64_C(1) << i))
1157
97.8k
            extensions_len += jxl_u64(gb);
1158
959k
        if (get_bits_left(gb) < 0)
1159
124
            return AVERROR_BUFFER_TOO_SMALL;
1160
959k
    }
1161
1162
14.9k
    if (extensions_len > INT_MAX || get_bits_left(gb) < extensions_len)
1163
3.54k
        return AVERROR_BUFFER_TOO_SMALL;
1164
1165
11.4k
    skip_bits_long(gb, extensions_len);
1166
1167
11.4k
    return 0;
1168
14.9k
}
1169
1170
static int parse_frame_header(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
1171
2.97M
{
1172
2.97M
    int all_default, do_yCbCr = 0, num_passes = 1, ret;
1173
2.97M
    int group_size_shift = 1, lf_level = 0, save_as_ref = 0;
1174
2.97M
    int have_crop = 0, full_frame = 1, resets_canvas = 1, upsampling = 1;
1175
2.97M
    JXLFrame *frame = &ctx->codestream.frame;
1176
2.97M
    const FFJXLMetadata *meta = &ctx->codestream.meta;
1177
2.97M
    int32_t x0 = 0, y0 = 0;
1178
2.97M
    uint32_t duration = 0, width = meta->coded_width, height = meta->coded_height;
1179
2.97M
    uint32_t name_len, num_groups, num_lf_groups, group_dim, lf_group_dim, toc_count;
1180
2.97M
    uint64_t flags = 0;
1181
2.97M
    int start_len = get_bits_count(gb);
1182
1183
2.97M
    memset(frame, 0, sizeof(*frame));
1184
2.97M
    frame->is_last = 1;
1185
1186
2.97M
    all_default = get_bits1(gb);
1187
2.97M
    if (!all_default) {
1188
2.96M
        frame->type = get_bits(gb, 2);
1189
2.96M
        frame->encoding = get_bits1(gb);
1190
2.96M
        flags = jxl_u64(gb);
1191
2.96M
        if (!meta->xyb_encoded)
1192
2.56M
            do_yCbCr = get_bits1(gb);
1193
2.96M
        if (!(flags & JXL_FLAG_USE_LF_FRAME)) {
1194
2.96M
            if (do_yCbCr)
1195
899
                skip_bits(gb, 6); // jpeg upsampling
1196
2.96M
            upsampling = jxl_u32(gb, 1, 2, 4, 8, 0, 0, 0, 0);
1197
2.96M
            skip_bits_long(gb, 2 * meta->num_extra_channels);
1198
2.96M
            if (get_bits_left(gb) < 0)
1199
664
                return AVERROR_BUFFER_TOO_SMALL;
1200
2.96M
        }
1201
2.96M
        if (frame->encoding == JPEGXL_ENC_MODULAR)
1202
4.42k
            group_size_shift = get_bits(gb, 2);
1203
2.95M
        else if (meta->xyb_encoded)
1204
397k
            skip_bits(gb, 6); // xqm and bqm scales
1205
2.96M
        if (frame->type != JPEGXL_FRAME_REFERENCE_ONLY) {
1206
2.95M
            num_passes = jxl_u32(gb, 1, 2, 3, 4, 0, 0, 0, 3);
1207
2.95M
            if (num_passes != 1) {
1208
6.01k
                int num_ds = jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 1);
1209
6.01k
                skip_bits(gb, 2 * (num_passes - 1)); // shift
1210
6.01k
                skip_bits(gb, 2 * num_ds); // downsample
1211
14.1k
                for (int i = 0; i < num_ds; i++)
1212
8.17k
                    jxl_u32(gb, 0, 1, 2, 0, 0, 0, 0, 3);
1213
6.01k
            }
1214
2.95M
        }
1215
2.96M
        if (frame->type == JPEGXL_FRAME_LF)
1216
2.46k
            lf_level = 1 + get_bits(gb, 2);
1217
2.95M
        else
1218
2.95M
            have_crop = get_bits1(gb);
1219
2.96M
        if (have_crop) {
1220
5.37k
            if (frame->type != JPEGXL_FRAME_REFERENCE_ONLY) {
1221
4.33k
                uint32_t ux0 = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1222
4.33k
                uint32_t uy0 = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1223
4.33k
                x0 = unpack_signed(ux0);
1224
4.33k
                y0 = unpack_signed(uy0);
1225
4.33k
            }
1226
5.37k
            width = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1227
5.37k
            height = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1228
5.37k
            full_frame = x0 <= 0 && y0 <= 0 && width + x0 >= meta->coded_width
1229
719
                                            && height + y0 >= meta->coded_height;
1230
5.37k
        }
1231
2.96M
        if (get_bits_left(gb) < 0)
1232
352
            return AVERROR_BUFFER_TOO_SMALL;
1233
2.96M
        if (frame->type == JPEGXL_FRAME_REGULAR || frame->type == JPEGXL_FRAME_SKIP_PROGRESSIVE) {
1234
15.2M
            for (int i = 0; i <= meta->num_extra_channels; i++) {
1235
12.3M
                int mode = jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1236
12.3M
                if (meta->num_extra_channels && (mode == JPEGXL_BM_BLEND || mode == JPEGXL_BM_MULADD))
1237
700k
                    jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1238
12.3M
                if (meta->num_extra_channels && (mode == JPEGXL_BM_BLEND || mode == JPEGXL_BM_MULADD
1239
8.81M
                                              || mode == JPEGXL_BM_MUL))
1240
842k
                    skip_bits1(gb);
1241
12.3M
                if (!i)
1242
2.95M
                    resets_canvas = mode == JPEGXL_BM_REPLACE && full_frame;
1243
12.3M
                if (!resets_canvas)
1244
1.80M
                    skip_bits(gb, 2);
1245
12.3M
                if (get_bits_left(gb) < 0)
1246
323
                    return AVERROR_BUFFER_TOO_SMALL;
1247
12.3M
            }
1248
2.95M
            if (meta->animation_offset)
1249
14.6k
                duration = jxl_u32(gb, 0, 1, 0, 0, 0, 0, 8, 32);
1250
2.95M
            if (meta->have_timecodes)
1251
13.2k
                skip_bits_long(gb, 32);
1252
2.95M
            frame->is_last = get_bits1(gb);
1253
2.95M
        } else {
1254
4.31k
            frame->is_last = 0;
1255
4.31k
        }
1256
2.96M
        if (frame->type != JPEGXL_FRAME_LF && !frame->is_last)
1257
2.95M
            save_as_ref = get_bits(gb, 2);
1258
2.96M
        if (frame->type == JPEGXL_FRAME_REFERENCE_ONLY ||
1259
2.95M
                (resets_canvas && !frame->is_last && (!duration || save_as_ref)
1260
2.95M
                && frame->type != JPEGXL_FRAME_LF))
1261
2.95M
            skip_bits1(gb); // save before color transform
1262
2.96M
        name_len = 8 * jxl_u32(gb, 0, 0, 16, 48, 0, 4, 5, 10);
1263
2.96M
        if (get_bits_left(gb) < name_len)
1264
117
            return AVERROR_BUFFER_TOO_SMALL;
1265
2.96M
        skip_bits_long(gb, name_len);
1266
2.96M
    }
1267
1268
2.96M
    if (!all_default) {
1269
2.96M
        int restd = get_bits1(gb), gab = 1;
1270
2.96M
        if (!restd)
1271
2.95M
            gab = get_bits1(gb);
1272
2.96M
        if (gab && !restd && get_bits1(gb))
1273
            // gab custom
1274
1.79k
            skip_bits_long(gb, 16 * 6);
1275
2.96M
        if (get_bits_left(gb) < 0)
1276
406
            return AVERROR_BUFFER_TOO_SMALL;
1277
2.96M
        if (!restd) {
1278
2.95M
            int epf = get_bits(gb, 2);
1279
2.95M
            if (epf) {
1280
6.14k
                if (frame->encoding == JPEGXL_ENC_VARDCT && get_bits1(gb)) {
1281
2.01k
                    skip_bits_long(gb, 16 * 8); // custom epf sharpness
1282
2.01k
                    if (get_bits_left(gb) < 0)
1283
13
                        return AVERROR_BUFFER_TOO_SMALL;
1284
2.01k
                }
1285
6.13k
                if (get_bits1(gb)) {
1286
1.98k
                    skip_bits_long(gb, 3 * 16 + 32); // custom epf weight
1287
1.98k
                    if (get_bits_left(gb) < 0)
1288
12
                        return AVERROR_BUFFER_TOO_SMALL;
1289
1.98k
                }
1290
6.11k
                if (get_bits1(gb)) { // custom epf sigma
1291
2.91k
                    if (frame->encoding == JPEGXL_ENC_VARDCT)
1292
1.67k
                        skip_bits(gb, 16);
1293
2.91k
                    skip_bits_long(gb, 16 * 3);
1294
2.91k
                    if (get_bits_left(gb) < 0)
1295
16
                        return AVERROR_BUFFER_TOO_SMALL;
1296
2.91k
                }
1297
6.10k
                if (frame->encoding == JPEGXL_ENC_MODULAR)
1298
1.95k
                    skip_bits(gb, 16);
1299
6.10k
            }
1300
2.95M
            ret = skip_extensions(gb);
1301
2.95M
            if (ret < 0)
1302
2.27k
                return ret;
1303
2.95M
        }
1304
2.95M
        ret = skip_extensions(gb);
1305
2.95M
        if (ret < 0)
1306
1.83k
            return ret;
1307
2.95M
    }
1308
1309
2.96M
    width = div_ceil(div_ceil(width, upsampling), 1 << (3 * lf_level));
1310
2.96M
    height = div_ceil(div_ceil(height, upsampling), 1 << (3 * lf_level));
1311
2.96M
    group_dim = 128 << group_size_shift;
1312
2.96M
    lf_group_dim = group_dim << 3;
1313
2.96M
    num_groups = div_ceil(width, group_dim) * div_ceil(height, group_dim);
1314
2.96M
    num_lf_groups = div_ceil(width, lf_group_dim) * div_ceil(height, lf_group_dim);
1315
2.96M
    if (num_groups == 1 && num_passes == 1)
1316
2.66M
        toc_count = 1;
1317
302k
    else
1318
302k
        toc_count = 2 + num_lf_groups + num_groups * num_passes;
1319
1320
    // permuted toc
1321
2.96M
    if (get_bits1(gb)) {
1322
15.9k
        JXLEntropyDecoder dec;
1323
15.9k
        int64_t end, lehmer = 0;
1324
        /* parser sanity check to prevent TOC perm from spinning cpu */
1325
15.9k
        if (width > meta->coded_width * 8 || height > meta->coded_height * 8) {
1326
1.17k
            av_log(avctx, AV_LOG_WARNING, "frame of size %" PRIu32 "x%" PRIu32
1327
1.17k
                " exceeds max size of %" PRIu32 "x%" PRIu32 ", aborting parser\n",
1328
1.17k
                width, height, meta->coded_width * 8, meta->coded_height * 8);
1329
1.17k
            return AVERROR_INVALIDDATA;
1330
1.17k
        }
1331
14.7k
        ret = entropy_decoder_init(avctx, gb, &dec, 8);
1332
14.7k
        if (ret < 0)
1333
11.5k
            return ret;
1334
3.18k
        if (get_bits_left(gb) < 0) {
1335
0
            entropy_decoder_close(&dec);
1336
0
            return AVERROR_BUFFER_TOO_SMALL;
1337
0
        }
1338
3.18k
        end = entropy_decoder_read_symbol(gb, &dec, toc_context(toc_count));
1339
3.18k
        if (end < 0 || end > toc_count) {
1340
898
            entropy_decoder_close(&dec);
1341
898
            return AVERROR_INVALIDDATA;
1342
898
        }
1343
29.0k
        for (uint32_t i = 0; i < end; i++) {
1344
26.8k
            lehmer = entropy_decoder_read_symbol(gb, &dec, toc_context(lehmer));
1345
26.8k
            if (lehmer < 0 || get_bits_left(gb) < 0) {
1346
78
                entropy_decoder_close(&dec);
1347
78
                return lehmer < 0 ? lehmer : AVERROR_BUFFER_TOO_SMALL;
1348
78
            }
1349
26.8k
        }
1350
2.21k
        entropy_decoder_close(&dec);
1351
2.21k
    }
1352
2.95M
    align_get_bits(gb);
1353
1354
129M
    for (uint32_t i = 0; i < toc_count; i++) {
1355
126M
        frame->body_length += 8 * jxl_u32(gb, 0, 1024, 17408, 4211712, 10, 14, 22, 30);
1356
126M
        if (get_bits_left(gb) < 0)
1357
3.13k
            return AVERROR_BUFFER_TOO_SMALL;
1358
126M
    }
1359
2.94M
    align_get_bits(gb);
1360
1361
2.94M
    frame->total_length = frame->body_length + get_bits_count(gb) - start_len;
1362
1363
2.94M
    return 0;
1364
2.95M
}
1365
1366
static int skip_boxes(JXLParseContext *ctx, const uint8_t *buf, int buf_size)
1367
510
{
1368
510
    GetByteContext gb;
1369
1370
510
    if (ctx->skip > buf_size)
1371
453
        return AVERROR_BUFFER_TOO_SMALL;
1372
1373
57
    buf += ctx->skip;
1374
57
    buf_size -= ctx->skip;
1375
57
    bytestream2_init(&gb, buf, buf_size);
1376
1377
80
    while (1) {
1378
80
        uint64_t size;
1379
80
        int head_size = 8;
1380
1381
80
        if (bytestream2_peek_le16(&gb) == FF_JPEGXL_CODESTREAM_SIGNATURE_LE)
1382
2
            break;
1383
78
        if (bytestream2_peek_le64(&gb) == FF_JPEGXL_CONTAINER_SIGNATURE_LE)
1384
15
            break;
1385
1386
63
        if (bytestream2_get_bytes_left(&gb) < 8)
1387
6
            return AVERROR_BUFFER_TOO_SMALL;
1388
1389
57
        size = bytestream2_get_be32(&gb);
1390
57
        bytestream2_skip(&gb, 4); // tag
1391
57
        if (size == 1) {
1392
6
            if (bytestream2_get_bytes_left(&gb) < 8)
1393
0
                return AVERROR_BUFFER_TOO_SMALL;
1394
6
            size = bytestream2_get_be64(&gb);
1395
6
            head_size = 16;
1396
6
        }
1397
57
        if (!size)
1398
3
            return AVERROR_INVALIDDATA;
1399
        /* invalid ISOBMFF size */
1400
54
        if (size <= head_size || size > INT_MAX - ctx->skip)
1401
15
            return AVERROR_INVALIDDATA;
1402
1403
39
        ctx->skip += size;
1404
39
        bytestream2_skip(&gb, size - head_size);
1405
39
        if (bytestream2_get_bytes_left(&gb) <= 0)
1406
16
            return AVERROR_BUFFER_TOO_SMALL;
1407
39
    }
1408
1409
17
    return 0;
1410
57
}
1411
1412
static int64_t try_parse(AVCodecParserContext *s, AVCodecContext *avctx, JXLParseContext *ctx,
1413
                     const uint8_t *buf, int buf_size)
1414
49.2k
{
1415
49.2k
    int ret, cs_buflen, header_skip;
1416
49.2k
    const uint8_t *cs_buffer;
1417
49.2k
    GetBitContext gb;
1418
1419
49.2k
    if (ctx->skip > buf_size)
1420
553
        return AVERROR_BUFFER_TOO_SMALL;
1421
1422
48.7k
    buf += ctx->skip;
1423
48.7k
    buf_size -= ctx->skip;
1424
1425
48.7k
    if (ctx->container || AV_RL64(buf) == FF_JPEGXL_CONTAINER_SIGNATURE_LE) {
1426
1.66k
        ctx->container = 1;
1427
1.66k
        ret = ff_jpegxl_collect_codestream_header(buf, buf_size, ctx->cs_buffer,
1428
1.66k
                                                  sizeof(ctx->cs_buffer) - AV_INPUT_BUFFER_PADDING_SIZE, &ctx->copied);
1429
1.66k
        if (ret < 0)
1430
501
            return ret;
1431
1.16k
        ctx->collected_size = ret;
1432
1.16k
        if (!ctx->copied) {
1433
244
            ctx->skip += ret;
1434
244
            return AVERROR_BUFFER_TOO_SMALL;
1435
244
        }
1436
920
        cs_buffer = ctx->cs_buffer;
1437
920
        cs_buflen = FFMIN(sizeof(ctx->cs_buffer) - AV_INPUT_BUFFER_PADDING_SIZE, ctx->copied);
1438
47.0k
    } else {
1439
47.0k
        cs_buffer = buf;
1440
47.0k
        cs_buflen = buf_size;
1441
47.0k
    }
1442
1443
47.9k
    if (!ctx->codestream_length) {
1444
20.7k
        header_skip = ff_jpegxl_parse_codestream_header(cs_buffer, cs_buflen, &ctx->codestream.meta, 0);
1445
20.7k
        if (header_skip < 0)
1446
16.6k
            return header_skip;
1447
4.15k
        ctx->codestream_length = header_skip;
1448
4.15k
        populate_fields(s, avctx, &ctx->codestream.meta);
1449
4.15k
    }
1450
1451
31.3k
    if (ctx->container)
1452
85
        return ctx->collected_size;
1453
1454
31.2k
    ret = init_get_bits8(&gb, cs_buffer, cs_buflen);
1455
31.2k
    if (ret < 0)
1456
0
        return ret;
1457
1458
31.2k
    skip_bits_long(&gb, ctx->codestream_length);
1459
1460
31.2k
    if (!ctx->skipped_icc && ctx->codestream.meta.have_icc_profile) {
1461
4.42k
        ret = skip_icc_profile(avctx, ctx, &gb);
1462
4.42k
        if (ret < 0)
1463
4.33k
            return ret;
1464
99
        ctx->skipped_icc = 1;
1465
99
        align_get_bits(&gb);
1466
99
        ctx->codestream_length = get_bits_count(&gb);
1467
99
    }
1468
1469
26.9k
    if (get_bits_left(&gb) <= 0)
1470
1.14k
        return AVERROR_BUFFER_TOO_SMALL;
1471
1472
2.97M
    while (1) {
1473
2.97M
        ret = parse_frame_header(avctx, ctx, &gb);
1474
2.97M
        if (ret < 0)
1475
22.8k
            return ret;
1476
2.94M
        ctx->codestream_length += ctx->codestream.frame.total_length;
1477
2.94M
        if (ctx->codestream.frame.is_last)
1478
1.84k
            return ctx->codestream_length / 8;
1479
2.94M
        if (get_bits_left(&gb) <= ctx->codestream.frame.body_length)
1480
1.11k
            return AVERROR_BUFFER_TOO_SMALL;
1481
2.94M
        skip_bits_long(&gb, ctx->codestream.frame.body_length);
1482
2.94M
    }
1483
25.8k
}
1484
1485
static int jpegxl_parse(AVCodecParserContext *s, AVCodecContext *avctx,
1486
                        const uint8_t **poutbuf, int *poutbuf_size,
1487
                        const uint8_t *buf, int buf_size)
1488
51.9k
{
1489
51.9k
    JXLParseContext *ctx = s->priv_data;
1490
51.9k
    int next = END_NOT_FOUND, ret;
1491
51.9k
    const uint8_t *pbuf = ctx->pc.buffer;
1492
51.9k
    int pindex = ctx->pc.index;
1493
1494
51.9k
    *poutbuf_size = 0;
1495
51.9k
    *poutbuf = NULL;
1496
1497
51.9k
    if (!ctx->pc.index) {
1498
8.04k
        if (ctx->pc.overread)
1499
173
            goto flush;
1500
7.87k
        pbuf = buf;
1501
7.87k
        pindex = buf_size;
1502
7.87k
    }
1503
1504
51.8k
    if ((!ctx->container || !ctx->codestream_length) && !ctx->next) {
1505
49.2k
        int64_t ret64 = try_parse(s, avctx, ctx, pbuf, pindex);
1506
49.2k
        if (ret64 < 0)
1507
47.3k
            goto flush;
1508
1.92k
        ctx->next = ret64;
1509
1.92k
        if (ctx->container)
1510
85
            ctx->skip += ctx->next;
1511
1.92k
    }
1512
1513
4.46k
    if (ctx->container && ctx->next >= 0) {
1514
510
        ret = skip_boxes(ctx, pbuf, pindex);
1515
510
        if (ret < 0) {
1516
493
            if (ret == AVERROR_INVALIDDATA)
1517
18
                ctx->next = -1;
1518
493
            goto flush;
1519
493
        }
1520
17
        ctx->next = ret + ctx->skip;
1521
17
    }
1522
1523
3.97k
    if (ctx->next >= 0)
1524
3.47k
        next = ctx->next - ctx->pc.index;
1525
1526
51.9k
flush:
1527
51.9k
    if (next > buf_size)
1528
1.80k
        next = END_NOT_FOUND;
1529
1530
51.9k
    ret = ff_combine_frame(&ctx->pc, next, &buf, &buf_size);
1531
51.9k
    if (ret < 0)
1532
43.9k
        return buf_size;
1533
1534
8.04k
    *poutbuf      = buf;
1535
8.04k
    *poutbuf_size = buf_size;
1536
1537
8.04k
    ctx->codestream_length = 0;
1538
8.04k
    ctx->collected_size = 0;
1539
8.04k
    ctx->container = 0;
1540
8.04k
    ctx->copied = 0;
1541
8.04k
    ctx->skip = 0;
1542
8.04k
    ctx->skipped_icc = 0;
1543
8.04k
    ctx->next = 0;
1544
8.04k
    memset(&ctx->codestream, 0, sizeof(ctx->codestream));
1545
1546
8.04k
    return next;
1547
51.9k
}
1548
1549
const FFCodecParser ff_jpegxl_parser = {
1550
    PARSER_CODEC_LIST(AV_CODEC_ID_JPEGXL, AV_CODEC_ID_JPEGXL_ANIM),
1551
    .priv_data_size = sizeof(JXLParseContext),
1552
    .parse          = jpegxl_parse,
1553
    .close          = ff_parse_close,
1554
};