Coverage Report

Created: 2026-01-16 07:48

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.55M
#define JXL_FLAG_USE_LF_FRAME 32
48
#define JXL_FLAG_SKIP_ADAPTIVE_LF_SMOOTH 128
49
50
34.9k
#define MAX_PREFIX_ALPHABET_SIZE (1u << 15)
51
52
377k
#define clog1p(x) (ff_log2(x) + !!(x))
53
8.77k
#define unpack_signed(x) (((x) & 1 ? -(x)-1 : (x))/2)
54
15.3M
#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
73.2k
{
205
73.2k
    int n;
206
73.2k
    if (!get_bits1(gb))
207
45.1k
        return 0;
208
28.0k
    n = get_bits(gb, 3);
209
210
28.0k
    return get_bitsz(gb, n) | (1 << n);
211
73.2k
}
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
140M
{
218
140M
    const uint32_t constants[4] = {c0, c1, c2, c3};
219
140M
    const uint32_t ubits    [4] = {u0, u1, u2, u3};
220
140M
    uint32_t ret, choice = get_bits(gb, 2);
221
222
140M
    ret = constants[choice];
223
140M
    if (ubits[choice])
224
122M
        ret += get_bits_long(gb, ubits[choice]);
225
226
140M
    return ret;
227
140M
}
228
229
/* read a U64() */
230
static uint64_t jxl_u64(GetBitContext *gb)
231
7.78M
{
232
7.78M
    uint64_t shift = 12, ret;
233
234
7.78M
    switch (get_bits(gb, 2)) {
235
28.3k
    case 1:
236
28.3k
        ret = 1 + get_bits(gb, 4);
237
28.3k
        break;
238
30.1k
    case 2:
239
30.1k
        ret = 17 + get_bits(gb, 8);
240
30.1k
        break;
241
41.8k
    case 3:
242
41.8k
        ret = get_bits(gb, 12);
243
110k
        while (get_bits1(gb)) {
244
75.2k
            if (shift < 60) {
245
68.8k
                ret |= (uint64_t)get_bits(gb, 8) << shift;
246
68.8k
                shift += 8;
247
68.8k
            } else {
248
6.47k
                ret |= (uint64_t)get_bits(gb, 4) << shift;
249
6.47k
                break;
250
6.47k
            }
251
75.2k
        }
252
41.8k
        break;
253
7.68M
    default:
254
7.68M
        ret = 0;
255
7.78M
    }
256
257
7.78M
    return ret;
258
7.78M
}
259
260
static int read_hybrid_uint_conf(GetBitContext *gb, JXLHybridUintConf *conf, int log_alphabet_size)
261
122k
{
262
122k
    conf->split_exponent = get_bitsz(gb, clog1p(log_alphabet_size));
263
122k
    if (conf->split_exponent == log_alphabet_size) {
264
10.5k
        conf->msb_in_token = conf->lsb_in_token = 0;
265
10.5k
        return 0;
266
10.5k
    }
267
268
112k
    conf->msb_in_token = get_bitsz(gb, clog1p(conf->split_exponent));
269
112k
    if (conf->msb_in_token > conf->split_exponent)
270
1.31k
        return AVERROR_INVALIDDATA;
271
111k
    conf->lsb_in_token = get_bitsz(gb, clog1p(conf->split_exponent - conf->msb_in_token));
272
111k
    if (conf->msb_in_token + conf->lsb_in_token > conf->split_exponent)
273
1.23k
        return AVERROR_INVALIDDATA;
274
275
109k
    return 0;
276
111k
}
277
278
static int read_hybrid_uint(GetBitContext *gb, const JXLHybridUintConf *conf, uint32_t token, uint32_t *hybrid_uint)
279
854k
{
280
854k
    uint32_t n, low, split = 1 << conf->split_exponent;
281
282
854k
    if (token < split) {
283
791k
        *hybrid_uint = token;
284
791k
        return 0;
285
791k
    }
286
287
62.1k
    n = conf->split_exponent - conf->lsb_in_token - conf->msb_in_token +
288
62.1k
        ((token - split) >> (conf->msb_in_token + conf->lsb_in_token));
289
62.1k
    if (n >= 32)
290
687
        return AVERROR_INVALIDDATA;
291
61.4k
    low = token & ((1 << conf->lsb_in_token) - 1);
292
61.4k
    token >>= conf->lsb_in_token;
293
61.4k
    token &= (1 << conf->msb_in_token) - 1;
294
61.4k
    token |= 1 << conf->msb_in_token;
295
61.4k
    *hybrid_uint = (((token << n) | get_bits_long(gb, n)) << conf->lsb_in_token ) | low;
296
297
61.4k
    return 0;
298
62.1k
}
299
300
static inline uint32_t read_prefix_symbol(GetBitContext *gb, const JXLSymbolDistribution *dist)
301
58.5k
{
302
58.5k
    if (!dist->vlc.bits)
303
42.9k
        return dist->default_symbol;
304
305
15.6k
    return get_vlc2(gb, dist->vlc.table, dist->vlc.bits, 1);
306
58.5k
}
307
308
static uint32_t read_ans_symbol(GetBitContext *gb, JXLEntropyDecoder *dec, const JXLSymbolDistribution *dist)
309
795k
{
310
795k
    uint32_t index, i, pos, symbol, offset;
311
312
795k
    if (dec->state < 0)
313
14.7k
        dec->state = get_bits_long(gb, 32);
314
315
795k
    index = dec->state & 0xFFF;
316
795k
    i = index >> dist->log_bucket_size;
317
795k
    pos = index & ((1 << dist->log_bucket_size) - 1);
318
795k
    symbol = pos >= dist->cutoffs[i] ? dist->symbols[i] : i;
319
795k
    offset = pos >= dist->cutoffs[i] ? dist->offsets[i] + pos : pos;
320
795k
    dec->state = dist->freq[symbol] * (dec->state >> 12) + offset;
321
795k
    if (dec->state < (1 << 16))
322
37.7k
        dec->state = (dec->state << 16) | get_bits(gb, 16);
323
795k
    dec->state &= 0xFFFFFFFF;
324
325
795k
    return symbol;
326
795k
}
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
859k
{
332
859k
    int ret;
333
859k
    uint32_t token, distance;
334
859k
    const JXLSymbolDistribution *dist;
335
336
859k
    if (dec->num_to_copy > 0) {
337
5.41k
        *hybrid_uint = dec->window[dec->copy_pos++ & 0xFFFFF];
338
5.41k
        dec->num_to_copy--;
339
5.41k
        dec->window[dec->num_decoded++ & 0xFFFFF] = *hybrid_uint;
340
5.41k
        return 0;
341
5.41k
    }
342
343
854k
    if (context >= bundle->num_dist)
344
0
        return AVERROR(EINVAL);
345
854k
    if (bundle->cluster_map[context] >= bundle->num_clusters)
346
0
        return AVERROR_INVALIDDATA;
347
348
854k
    dist = &bundle->dists[bundle->cluster_map[context]];
349
854k
    if (bundle->use_prefix_code)
350
58.3k
        token = read_prefix_symbol(gb, dist);
351
795k
    else
352
795k
        token = read_ans_symbol(gb, dec, dist);
353
354
854k
    if (bundle->lz77_enabled && token >= bundle->lz77_min_symbol) {
355
746
        const JXLSymbolDistribution *lz77dist = &bundle->dists[bundle->cluster_map[bundle->num_dist - 1]];
356
746
        if (!dec->num_decoded)
357
397
            return AVERROR_INVALIDDATA;
358
349
        ret = read_hybrid_uint(gb, &bundle->lz_len_conf, token - bundle->lz77_min_symbol, &dec->num_to_copy);
359
349
        if (ret < 0)
360
88
            return ret;
361
261
        dec->num_to_copy += bundle->lz77_min_length;
362
261
        if (bundle->use_prefix_code)
363
217
            token = read_prefix_symbol(gb, lz77dist);
364
44
        else
365
44
            token = read_ans_symbol(gb, dec, lz77dist);
366
261
        ret = read_hybrid_uint(gb, &lz77dist->config, token, &distance);
367
261
        if (ret < 0)
368
20
            return ret;
369
241
        distance++;
370
241
        distance = FFMIN3(distance, dec->num_decoded, 1 << 20);
371
241
        dec->copy_pos = dec->num_decoded - distance;
372
241
        return decode_hybrid_varlen_uint(gb, dec, bundle, context, hybrid_uint);
373
261
    }
374
853k
    ret = read_hybrid_uint(gb, &dist->config, token, hybrid_uint);
375
853k
    if (ret < 0)
376
579
        return ret;
377
852k
    if (bundle->lz77_enabled)
378
53.8k
        dec->window[dec->num_decoded++ & 0xFFFFF] = *hybrid_uint;
379
380
852k
    return 0;
381
853k
}
382
383
static int populate_distribution(GetBitContext *gb, JXLSymbolDistribution *dist, int log_alphabet_size)
384
63.4k
{
385
63.4k
    int len = 0, shift, omit_log = -1, omit_pos = -1;
386
63.4k
    int prev = 0, num_same = 0;
387
63.4k
    uint32_t total_count = 0;
388
63.4k
    uint8_t logcounts[258] = { 0 };
389
63.4k
    uint8_t same[258] = { 0 };
390
63.4k
    const int table_size = 1 << log_alphabet_size;
391
63.4k
    dist->uniq_pos = -1;
392
393
63.4k
    if (get_bits1(gb)) {
394
        /* simple code */
395
15.9k
        if (get_bits1(gb)) {
396
7.53k
            uint8_t v1 = jxl_u8(gb);
397
7.53k
            uint8_t v2 = jxl_u8(gb);
398
7.53k
            if (v1 == v2)
399
544
                return AVERROR_INVALIDDATA;
400
6.98k
            dist->freq[v1] = get_bits(gb, 12);
401
6.98k
            dist->freq[v2] = (1 << 12) - dist->freq[v1];
402
6.98k
            if (!dist->freq[v1])
403
518
                dist->uniq_pos = v2;
404
6.98k
            dist->alphabet_size = 1 + FFMAX(v1, v2);
405
8.40k
        } else {
406
8.40k
            uint8_t x = jxl_u8(gb);
407
8.40k
            dist->freq[x] = 1 << 12;
408
8.40k
            dist->uniq_pos = x;
409
8.40k
            dist->alphabet_size = 1 + x;
410
8.40k
        }
411
15.3k
        if (dist->alphabet_size > table_size)
412
1.21k
            return AVERROR_INVALIDDATA;
413
414
14.1k
        return 0;
415
15.3k
    }
416
417
47.4k
    if (get_bits1(gb)) {
418
        /* flat code */
419
15.5k
        dist->alphabet_size = jxl_u8(gb) + 1;
420
15.5k
        if (dist->alphabet_size > table_size)
421
270
            return AVERROR_INVALIDDATA;
422
128k
        for (int i = 0; i < dist->alphabet_size; i++)
423
113k
            dist->freq[i] = (1 << 12) / dist->alphabet_size;
424
33.3k
        for (int i = 0; i < (1 << 12) % dist->alphabet_size; i++)
425
18.1k
            dist->freq[i]++;
426
15.2k
        return 0;
427
15.5k
    }
428
429
41.1k
    do {
430
41.1k
        if (!get_bits1(gb))
431
29.8k
            break;
432
41.1k
    } while (++len < 3);
433
434
31.9k
    shift = (get_bitsz(gb, len) | (1 << len)) - 1;
435
31.9k
    if (shift > 13)
436
170
        return AVERROR_INVALIDDATA;
437
438
31.8k
    dist->alphabet_size = jxl_u8(gb) + 3;
439
31.8k
    if (dist->alphabet_size > table_size)
440
606
        return AVERROR_INVALIDDATA;
441
442
240k
    for (int i = 0; i < dist->alphabet_size; i++) {
443
209k
        logcounts[i] = get_vlc2(gb, dist_prefix_table, 7, 1);
444
209k
        if (logcounts[i] == 13) {
445
2.41k
            int rle = jxl_u8(gb);
446
2.41k
            same[i] = rle + 5;
447
2.41k
            i += rle + 3;
448
2.41k
            continue;
449
2.41k
        }
450
206k
        if (logcounts[i] > omit_log) {
451
47.5k
            omit_log = logcounts[i];
452
47.5k
            omit_pos = i;
453
47.5k
        }
454
206k
    }
455
31.2k
    if (omit_pos < 0 || omit_pos + 1 < dist->alphabet_size && logcounts[omit_pos + 1] == 13)
456
451
        return AVERROR_INVALIDDATA;
457
458
246k
    for (int i = 0; i < dist->alphabet_size; i++) {
459
215k
        if (same[i]) {
460
1.96k
            num_same = same[i] - 1;
461
1.96k
            prev = i > 0 ? dist->freq[i - 1] : 0;
462
1.96k
        }
463
215k
        if (num_same) {
464
9.34k
            dist->freq[i] = prev;
465
9.34k
            num_same--;
466
206k
        } else {
467
206k
            if (i == omit_pos || !logcounts[i])
468
34.5k
                continue;
469
171k
            if (logcounts[i] == 1) {
470
7.41k
                dist->freq[i] = 1;
471
164k
            } else {
472
164k
                int bitcount = FFMIN(FFMAX(0, shift - ((12 - logcounts[i] + 1) >> 1)), logcounts[i] - 1);
473
164k
                dist->freq[i] = (1 << (logcounts[i] - 1)) + (get_bitsz(gb, bitcount) << (logcounts[i] - 1 - bitcount));
474
164k
            }
475
171k
        }
476
181k
        total_count += dist->freq[i];
477
181k
    }
478
30.7k
    dist->freq[omit_pos] = (1 << 12) - total_count;
479
480
30.7k
    return 0;
481
31.2k
}
482
483
static void dist_bundle_close(JXLDistributionBundle *bundle)
484
41.8k
{
485
41.8k
    if (bundle->use_prefix_code && bundle->dists)
486
49.2k
        for (int i = 0; i < bundle->num_clusters; i++)
487
37.5k
            ff_vlc_free(&bundle->dists[i].vlc);
488
41.8k
    av_freep(&bundle->dists);
489
41.8k
    av_freep(&bundle->cluster_map);
490
41.8k
}
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
38.4k
{
498
38.4k
    int ret;
499
500
38.4k
    bundle->cluster_map = av_malloc(bundle->num_dist);
501
38.4k
    if (!bundle->cluster_map)
502
0
        return AVERROR(ENOMEM);
503
504
38.4k
    if (bundle->num_dist == 1) {
505
11.7k
        bundle->cluster_map[0] = 0;
506
11.7k
        bundle->num_clusters = 1;
507
11.7k
        return 0;
508
11.7k
    }
509
510
26.7k
    if (get_bits1(gb)) {
511
        /* simple clustering */
512
9.75k
        uint32_t nbits = get_bits(gb, 2);
513
122k
        for (int i = 0; i < bundle->num_dist; i++)
514
112k
            bundle->cluster_map[i] = get_bitsz(gb, nbits);
515
16.9k
    } else {
516
        /* complex clustering */
517
16.9k
        int use_mtf = get_bits1(gb);
518
16.9k
        JXLDistributionBundle nested = { 0 };
519
        /* num_dist == 1 prevents this from recursing again */
520
16.9k
        ret = read_distribution_bundle(gb, dec, &nested, 1, bundle->num_dist <= 2);
521
16.9k
        if (ret < 0) {
522
5.02k
            dist_bundle_close(&nested);
523
5.02k
            return ret;
524
5.02k
        }
525
166k
        for (int i = 0; i < bundle->num_dist; i++) {
526
155k
            uint32_t clust;
527
155k
            ret = decode_hybrid_varlen_uint(gb, dec, &nested, 0, &clust);
528
155k
            if (ret < 0) {
529
605
                dist_bundle_close(&nested);
530
605
                return ret;
531
605
            }
532
154k
            bundle->cluster_map[i] = clust;
533
154k
        }
534
11.3k
        dec->state = -1;
535
        /* it's not going to necessarily be zero after reading */
536
11.3k
        dec->num_to_copy = 0;
537
11.3k
        dec->num_decoded = 0;
538
11.3k
        dist_bundle_close(&nested);
539
11.3k
        if (use_mtf) {
540
3.47k
            uint8_t mtf[256];
541
893k
            for (int i = 0; i < 256; i++)
542
890k
                mtf[i] = i;
543
78.3k
            for (int i = 0; i < bundle->num_dist; i++) {
544
74.8k
                int index = bundle->cluster_map[i];
545
74.8k
                bundle->cluster_map[i] = mtf[index];
546
74.8k
                if (index) {
547
48.5k
                    int value = mtf[index];
548
1.76M
                    for (int j = index; j > 0; j--)
549
1.71M
                        mtf[j] = mtf[j - 1];
550
48.5k
                    mtf[0] = value;
551
48.5k
                }
552
74.8k
            }
553
3.47k
        }
554
11.3k
    }
555
288k
    for (int i = 0; i < bundle->num_dist; i++) {
556
266k
        if (bundle->cluster_map[i] >= bundle->num_clusters)
557
33.9k
            bundle->num_clusters = bundle->cluster_map[i] + 1;
558
266k
    }
559
560
21.0k
    if (bundle->num_clusters > bundle->num_dist)
561
1.11k
        return AVERROR_INVALIDDATA;
562
563
19.9k
    return 0;
564
21.0k
}
565
566
static int gen_alias_map(JXLEntropyDecoder *dec, JXLSymbolDistribution *dist, int log_alphabet_size)
567
45.3k
{
568
45.3k
    uint32_t bucket_size, table_size;
569
45.3k
    uint8_t overfull[256], underfull[256];
570
45.3k
    int overfull_pos = 0, underfull_pos = 0;
571
45.3k
    dist->log_bucket_size = 12 - log_alphabet_size;
572
45.3k
    bucket_size = 1 << dist->log_bucket_size;
573
45.3k
    table_size = 1 << log_alphabet_size;
574
575
45.3k
    if (dist->uniq_pos >= 0) {
576
761k
        for (int i = 0; i < table_size; i++) {
577
756k
            dist->symbols[i] = dist->uniq_pos;
578
756k
            dist->offsets[i] = bucket_size * i;
579
756k
            dist->cutoffs[i] = 0;
580
756k
        }
581
5.58k
        return 0;
582
5.58k
    }
583
584
531k
    for (int i = 0; i < dist->alphabet_size; i++) {
585
491k
        dist->cutoffs[i] = dist->freq[i];
586
491k
        dist->symbols[i] = i;
587
491k
        if (dist->cutoffs[i] > bucket_size)
588
172k
            overfull[overfull_pos++] = i;
589
318k
        else if (dist->cutoffs[i] < bucket_size)
590
291k
            underfull[underfull_pos++] = i;
591
491k
    }
592
593
2.65M
    for (int i = dist->alphabet_size; i < table_size; i++) {
594
2.61M
        dist->cutoffs[i] = 0;
595
2.61M
        underfull[underfull_pos++] = i;
596
2.61M
    }
597
598
3.00M
    while (overfull_pos) {
599
2.96M
        int o, u, by;
600
        /* this should be impossible */
601
2.96M
        if (!underfull_pos)
602
692
            return AVERROR_INVALIDDATA;
603
2.96M
        u = underfull[--underfull_pos];
604
2.96M
        o = overfull[--overfull_pos];
605
2.96M
        by = bucket_size - dist->cutoffs[u];
606
2.96M
        dist->cutoffs[o] -= by;
607
2.96M
        dist->symbols[u] = o;
608
2.96M
        dist->offsets[u] = dist->cutoffs[o];
609
2.96M
        if (dist->cutoffs[o] < bucket_size)
610
54.7k
            underfull[underfull_pos++] = o;
611
2.90M
        else if (dist->cutoffs[o] > bucket_size)
612
2.81M
            overfull[overfull_pos++] = o;
613
2.96M
    }
614
615
3.03M
    for (int i = 0; i < table_size; i++) {
616
2.99M
        if (dist->cutoffs[i] == bucket_size) {
617
108k
            dist->symbols[i] = i;
618
108k
            dist->offsets[i] = 0;
619
108k
            dist->cutoffs[i] = 0;
620
2.89M
        } else {
621
2.89M
            dist->offsets[i] -= dist->cutoffs[i];
622
2.89M
        }
623
2.99M
    }
624
625
39.0k
    return 0;
626
39.7k
}
627
628
static int read_simple_vlc_prefix(GetBitContext *gb, JXLEntropyDecoder *dec, JXLSymbolDistribution *dist)
629
4.70k
{
630
4.70k
    int nsym, tree_select, bits;
631
632
4.70k
    int8_t lens[4];
633
4.70k
    int16_t symbols[4];
634
635
4.70k
    nsym = 1 + get_bits(gb, 2);
636
17.0k
    for (int i = 0; i < nsym; i++)
637
12.3k
        symbols[i] = get_bitsz(gb, dist->log_alphabet_size);
638
4.70k
    if (nsym == 4)
639
1.73k
        tree_select = get_bits1(gb);
640
4.70k
    switch (nsym) {
641
1.14k
    case 1:
642
1.14k
        dist->vlc.bits = 0;
643
1.14k
        dist->default_symbol = symbols[0];
644
1.14k
        return 0;
645
1.26k
    case 2:
646
1.26k
        bits = 1;
647
1.26k
        lens[0] = 1, lens[1] = 1, lens[2] = 0, lens[3] = 0;
648
1.26k
        if (symbols[1] < symbols[0])
649
478
            FFSWAP(int16_t, symbols[0], symbols[1]);
650
1.26k
        break;
651
560
    case 3:
652
560
        bits = 2;
653
560
        lens[0] = 1, lens[1] = 2, lens[2] = 2, lens[3] = 0;
654
560
        if (symbols[2] < symbols[1])
655
130
            FFSWAP(int16_t, symbols[1], symbols[2]);
656
560
        break;
657
1.73k
    case 4:
658
1.73k
        if (tree_select) {
659
880
            bits = 3;
660
880
            lens[0] = 1, lens[1] = 2, lens[2] = 3, lens[3] = 3;
661
880
            if (symbols[3] < symbols[2])
662
442
                FFSWAP(int16_t, symbols[2], symbols[3]);
663
880
        } else {
664
859
            bits = 2;
665
859
            lens[0] = 2, lens[1] = 2, lens[2] = 2, lens[3] = 2;
666
1.68k
            while (1) {
667
1.68k
                if (symbols[1] < symbols[0])
668
772
                    FFSWAP(int16_t, symbols[0], symbols[1]);
669
1.68k
                if (symbols[3] < symbols[2])
670
872
                    FFSWAP(int16_t, symbols[2], symbols[3]);
671
1.68k
                if (symbols[1] <= symbols[2])
672
859
                    break;
673
830
                FFSWAP(int16_t, symbols[1], symbols[2]);
674
830
            }
675
859
        }
676
1.73k
        break;
677
0
    default:
678
        // Challenge Complete! How did we get here?
679
0
        return AVERROR_BUG;
680
4.70k
    }
681
682
3.56k
    return ff_vlc_init_from_lengths(&dist->vlc, bits, nsym, lens, 1, symbols,
683
3.56k
                                    2, 2, 0, VLC_INIT_LE, dec->logctx);
684
4.70k
}
685
686
static int read_vlc_prefix(GetBitContext *gb, JXLEntropyDecoder *dec, JXLSymbolDistribution *dist)
687
18.9k
{
688
18.9k
    int8_t level1_lens[18] = { 0 };
689
18.9k
    int8_t level1_lens_s[18] = { 0 };
690
18.9k
    int16_t level1_syms[18] = { 0 };
691
18.9k
    uint32_t level1_codecounts[19] = { 0 };
692
18.9k
    uint8_t *buf = NULL;
693
18.9k
    int8_t *level2_lens, *level2_lens_s;
694
18.9k
    int16_t *level2_syms;
695
18.9k
    uint32_t *level2_codecounts;
696
697
18.9k
    int repeat_count_prev = 0, repeat_count_zero = 0, prev = 8;
698
18.9k
    int total_code = 0, len, hskip, num_codes = 0, ret;
699
700
18.9k
    VLC level1_vlc = { 0 };
701
702
18.9k
    if (dist->alphabet_size == 1) {
703
7.87k
        dist->vlc.bits = 0;
704
7.87k
        dist->default_symbol = 0;
705
7.87k
        return 0;
706
7.87k
    }
707
708
11.0k
    hskip = get_bits(gb, 2);
709
11.0k
    if (hskip == 1)
710
4.70k
        return read_simple_vlc_prefix(gb, dec, dist);
711
712
6.36k
    level1_codecounts[0] = hskip;
713
81.3k
    for (int i = hskip; i < 18; i++) {
714
79.4k
        len = level1_lens[prefix_codelen_map[i]] = get_vlc2(gb, level0_table, 4, 1);
715
79.4k
        if (len < 0) {
716
0
            ret = AVERROR_INVALIDDATA;
717
0
            goto end;
718
0
        }
719
79.4k
        level1_codecounts[len]++;
720
79.4k
        if (len) {
721
41.8k
            total_code += (32 >> len);
722
41.8k
            num_codes++;
723
41.8k
        }
724
79.4k
        if (total_code >= 32) {
725
4.51k
            level1_codecounts[0] += 18 - i - 1;
726
4.51k
            break;
727
4.51k
        }
728
79.4k
    }
729
730
6.36k
    if (total_code != 32 && num_codes >= 2 || num_codes < 1) {
731
2.52k
        ret = AVERROR_INVALIDDATA;
732
2.52k
        goto end;
733
2.52k
    }
734
735
73.0k
    for (int i = 1; i < 19; i++)
736
69.2k
         level1_codecounts[i] += level1_codecounts[i - 1];
737
738
73.0k
    for (int i = 17; i >= 0; i--) {
739
69.2k
        int idx = --level1_codecounts[level1_lens[i]];
740
69.2k
        level1_lens_s[idx] = level1_lens[i];
741
69.2k
        level1_syms[idx] = i;
742
69.2k
    }
743
744
3.84k
    ret = ff_vlc_init_from_lengths(&level1_vlc, 5, 18, level1_lens_s, 1, level1_syms, 2, 2,
745
3.84k
        0, VLC_INIT_LE, dec->logctx);
746
3.84k
    if (ret < 0)
747
0
        goto end;
748
749
3.84k
    buf = av_mallocz(MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t) + sizeof(int16_t) + sizeof(uint32_t))
750
3.84k
                     + sizeof(uint32_t));
751
3.84k
    if (!buf) {
752
0
        ret = AVERROR(ENOMEM);
753
0
        goto end;
754
0
    }
755
756
3.84k
    level2_lens = (int8_t *)buf;
757
3.84k
    level2_lens_s = (int8_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * sizeof(int8_t));
758
3.84k
    level2_syms = (int16_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t)));
759
3.84k
    level2_codecounts = (uint32_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t) + sizeof(int16_t)));
760
761
3.84k
    total_code = 0;
762
82.2k
    for (int i = 0; i < dist->alphabet_size; i++) {
763
80.3k
        len = get_vlc2(gb, level1_vlc.table, 5, 1);
764
80.3k
        if (len < 0) {
765
223
            ret = AVERROR_INVALIDDATA;
766
223
            goto end;
767
223
        }
768
80.1k
        if (get_bits_left(gb) < 0) {
769
41
            ret = AVERROR_BUFFER_TOO_SMALL;
770
41
            goto end;
771
41
        }
772
80.1k
        if (len == 16) {
773
4.15k
            int extra = 3 + get_bits(gb, 2);
774
4.15k
            if (repeat_count_prev)
775
1.04k
                extra += 4 * (repeat_count_prev - 2) - repeat_count_prev;
776
4.15k
            extra = FFMIN(extra, dist->alphabet_size - i);
777
52.0k
            for (int j = 0; j < extra; j++)
778
47.8k
                level2_lens[i + j] = prev;
779
4.15k
            total_code += (32768 >> prev) * extra;
780
4.15k
            i += extra - 1;
781
4.15k
            repeat_count_prev += extra;
782
4.15k
            repeat_count_zero = 0;
783
4.15k
            level2_codecounts[prev] += extra;
784
75.9k
        } else if (len == 17) {
785
7.80k
            int extra = 3 + get_bits(gb, 3);
786
7.80k
            if (repeat_count_zero > 0)
787
2.61k
                extra += 8 * (repeat_count_zero - 2) - repeat_count_zero;
788
7.80k
            extra = FFMIN(extra, dist->alphabet_size - i);
789
7.80k
            i += extra - 1;
790
7.80k
            repeat_count_prev = 0;
791
7.80k
            repeat_count_zero += extra;
792
7.80k
            level2_codecounts[0] += extra;
793
68.1k
        } else {
794
68.1k
            level2_lens[i] = len;
795
68.1k
            repeat_count_prev = repeat_count_zero = 0;
796
68.1k
            if (len) {
797
57.9k
                total_code += (32768 >> len);
798
57.9k
                prev = len;
799
57.9k
            }
800
68.1k
            level2_codecounts[len]++;
801
68.1k
        }
802
80.1k
        if (total_code >= 32768) {
803
1.70k
            level2_codecounts[0] += dist->alphabet_size - i - 1;
804
1.70k
            break;
805
1.70k
        }
806
80.1k
    }
807
808
3.58k
    if (total_code != 32768 && level2_codecounts[0] < dist->alphabet_size - 1) {
809
2.15k
        ret = AVERROR_INVALIDDATA;
810
2.15k
        goto end;
811
2.15k
    }
812
813
5.54M
    for (int i = 1; i < dist->alphabet_size + 1; i++)
814
5.54M
        level2_codecounts[i] += level2_codecounts[i - 1];
815
816
5.54M
    for (int i = dist->alphabet_size - 1; i >= 0; i--) {
817
5.54M
        int idx = --level2_codecounts[level2_lens[i]];
818
5.54M
        level2_lens_s[idx] = level2_lens[i];
819
5.54M
        level2_syms[idx] = i;
820
5.54M
    }
821
822
1.42k
    ret = ff_vlc_init_from_lengths(&dist->vlc, 15, dist->alphabet_size, level2_lens_s,
823
1.42k
                                    1, level2_syms, 2, 2, 0, VLC_INIT_LE, dec->logctx);
824
825
6.36k
end:
826
6.36k
    av_freep(&buf);
827
6.36k
    ff_vlc_free(&level1_vlc);
828
829
6.36k
    return ret;
830
1.42k
}
831
832
static int read_distribution_bundle(GetBitContext *gb, JXLEntropyDecoder *dec,
833
                                    JXLDistributionBundle *bundle, int num_dist, int disallow_lz77)
834
39.8k
{
835
39.8k
    int ret;
836
837
39.8k
    if (num_dist <= 0)
838
0
        return AVERROR(EINVAL);
839
840
39.8k
    bundle->num_dist = num_dist;
841
39.8k
    bundle->lz77_enabled = get_bits1(gb);
842
39.8k
    if (bundle->lz77_enabled) {
843
15.3k
        if (disallow_lz77)
844
763
            return AVERROR_INVALIDDATA;
845
14.5k
        bundle->lz77_min_symbol = jxl_u32(gb, 224, 512, 4096, 8, 0, 0, 0, 15);
846
14.5k
        bundle->lz77_min_length = jxl_u32(gb, 3, 4, 5, 9, 0, 0, 2, 8);
847
14.5k
        bundle->num_dist++;
848
14.5k
        ret = read_hybrid_uint_conf(gb, &bundle->lz_len_conf, 8);
849
14.5k
        if (ret < 0)
850
694
            return ret;
851
14.5k
    }
852
853
38.4k
    if (bundle->lz77_enabled && !dec->window) {
854
12.0k
        dec->window = av_malloc_array(1 << 20, sizeof(uint32_t));
855
12.0k
        if (!dec->window)
856
0
            return AVERROR(ENOMEM);
857
12.0k
    }
858
859
38.4k
    ret = read_dist_clustering(gb, dec, bundle);
860
38.4k
    if (ret < 0)
861
6.74k
        return ret;
862
31.6k
    if (get_bits_left(gb) < 0)
863
181
        return AVERROR_BUFFER_TOO_SMALL;
864
865
31.5k
    bundle->dists = av_calloc(bundle->num_clusters, sizeof(JXLSymbolDistribution));
866
31.5k
    if (!bundle->dists)
867
0
        return AVERROR(ENOMEM);
868
869
31.5k
    bundle->use_prefix_code = get_bits1(gb);
870
31.5k
    bundle->log_alphabet_size = bundle->use_prefix_code ? 15 : 5 + get_bits(gb, 2);
871
872
137k
    for (int i = 0; i < bundle->num_clusters; i++) {
873
108k
        ret = read_hybrid_uint_conf(gb, &bundle->dists[i].config, bundle->log_alphabet_size);
874
108k
        if (ret < 0)
875
1.85k
            return ret;
876
106k
        if (get_bits_left(gb) < 0)
877
62
            return AVERROR_BUFFER_TOO_SMALL;
878
106k
    }
879
880
29.5k
    if (bundle->use_prefix_code) {
881
41.7k
        for (int i = 0; i < bundle->num_clusters; i++) {
882
31.4k
            JXLSymbolDistribution *dist = &bundle->dists[i];
883
31.4k
            if (get_bits1(gb)) {
884
19.5k
                int n = get_bits(gb, 4);
885
19.5k
                dist->alphabet_size = 1 + (1 << n) + get_bitsz(gb, n);
886
19.5k
                if (dist->alphabet_size > MAX_PREFIX_ALPHABET_SIZE)
887
554
                    return AVERROR_INVALIDDATA;
888
19.5k
            } else {
889
11.9k
                dist->alphabet_size = 1;
890
11.9k
            }
891
30.9k
            dist->log_alphabet_size = clog1p(dist->alphabet_size - 1);
892
30.9k
        }
893
24.1k
        for (int i = 0; i < bundle->num_clusters; i++) {
894
18.9k
            ret = read_vlc_prefix(gb, dec, &bundle->dists[i]);
895
18.9k
            if (ret < 0)
896
4.94k
                return ret;
897
14.0k
            if (get_bits_left(gb) < 0)
898
49
                return AVERROR_BUFFER_TOO_SMALL;
899
14.0k
        }
900
18.8k
    } else {
901
78.8k
        for (int i = 0; i < bundle->num_clusters; i++) {
902
63.4k
            ret = populate_distribution(gb, &bundle->dists[i], bundle->log_alphabet_size);
903
63.4k
            if (ret < 0)
904
3.25k
                return ret;
905
60.1k
            if (get_bits_left(gb) < 0)
906
168
                return AVERROR_BUFFER_TOO_SMALL;
907
60.1k
        }
908
60.0k
        for (int i = 0; i < bundle->num_clusters; i++) {
909
45.3k
            ret = gen_alias_map(dec, &bundle->dists[i], bundle->log_alphabet_size);
910
45.3k
            if (ret < 0)
911
692
                return ret;
912
45.3k
        }
913
15.3k
    }
914
915
19.9k
    return 0;
916
29.5k
}
917
918
static void entropy_decoder_close(JXLEntropyDecoder *dec)
919
24.8k
{
920
24.8k
    if (!dec)
921
0
        return;
922
24.8k
    av_freep(&dec->window);
923
24.8k
    dist_bundle_close(&dec->bundle);
924
24.8k
}
925
926
static int entropy_decoder_init(void *avctx, GetBitContext *gb, JXLEntropyDecoder *dec, int num_dist)
927
22.9k
{
928
22.9k
    int ret;
929
930
22.9k
    memset(dec, 0, sizeof(*dec));
931
22.9k
    dec->logctx = avctx;
932
22.9k
    dec->state = -1;
933
934
22.9k
    ret = read_distribution_bundle(gb, dec, &dec->bundle, num_dist, 0);
935
22.9k
    if (ret < 0) {
936
14.9k
        entropy_decoder_close(dec);
937
14.9k
        return ret;
938
14.9k
    }
939
940
7.99k
    return 0;
941
22.9k
}
942
943
static int64_t entropy_decoder_read_symbol(GetBitContext *gb, JXLEntropyDecoder *dec, uint32_t context)
944
703k
{
945
703k
    int ret;
946
703k
    uint32_t hybrid_uint;
947
948
703k
    ret = decode_hybrid_varlen_uint(gb, dec, &dec->bundle, context, &hybrid_uint);
949
703k
    if (ret < 0)
950
479
        return ret;
951
952
703k
    return hybrid_uint;
953
703k
}
954
955
static inline uint32_t icc_context(uint64_t i, uint32_t b1, uint32_t b2)
956
671k
{
957
671k
    uint32_t p1, p2;
958
671k
    if (i <= 128)
959
29.4k
        return 0;
960
642k
    if (b1 >= 'a' && b1 <= 'z' || b1 >= 'A' && b1 <= 'Z')
961
4.00k
        p1 = 0;
962
638k
    else if (b1 >= '0' && b1 <= '9' || b1 == '.' || b1 == ',')
963
925
        p1 = 1;
964
637k
    else if (b1 <= 1)
965
6.88k
        p1 = b1 + 2;
966
630k
    else if (b1 > 1 && b1 < 16)
967
571k
        p1 = 4;
968
58.5k
    else if (b1 > 240 && b1 < 255)
969
3.27k
        p1 = 5;
970
55.2k
    else if (b1 == 255)
971
3.03k
        p1 = 6;
972
52.2k
    else
973
52.2k
        p1 = 7;
974
975
642k
    if (b2 >= 'a' && b2 <= 'z' || b2 >= 'A' && b2 <= 'Z')
976
4.01k
        p2 = 0;
977
638k
    else if (b2 >= '0' && b2 <= '9' || b2 == '.' || b2 == ',')
978
923
        p2 = 1;
979
637k
    else if (b2 < 16)
980
578k
        p2 = 2;
981
58.5k
    else if (b2 > 240)
982
6.32k
        p2 = 3;
983
52.2k
    else
984
52.2k
        p2 = 4;
985
986
642k
    return 1 + p1 + p2 * 8;
987
671k
}
988
989
static inline uint32_t toc_context(uint32_t x)
990
32.4k
{
991
32.4k
    return FFMIN(7, clog1p(x));
992
32.4k
}
993
994
static void populate_fields(AVCodecParserContext *s, AVCodecContext *avctx, const FFJXLMetadata *meta)
995
4.59k
{
996
4.59k
    s->width = meta->width;
997
4.59k
    s->height = meta->height;
998
999
4.59k
    switch (meta->csp) {
1000
4.00k
    case JPEGXL_CS_RGB:
1001
4.03k
    case JPEGXL_CS_XYB:
1002
4.03k
        avctx->colorspace = AVCOL_SPC_RGB;
1003
4.03k
        break;
1004
563
    default:
1005
563
        avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
1006
4.59k
    }
1007
1008
4.59k
    if (meta->wp == JPEGXL_WP_D65) {
1009
3.35k
        switch (meta->primaries) {
1010
3.29k
        case JPEGXL_PR_SRGB:
1011
3.29k
            avctx->color_primaries = AVCOL_PRI_BT709;
1012
3.29k
            break;
1013
2
        case JPEGXL_PR_P3:
1014
2
            avctx->color_primaries = AVCOL_PRI_SMPTE432;
1015
2
            break;
1016
2
        case JPEGXL_PR_2100:
1017
2
            avctx->color_primaries = AVCOL_PRI_BT2020;
1018
2
            break;
1019
56
        default:
1020
56
            avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
1021
3.35k
        }
1022
3.35k
    } else if (meta->wp == JPEGXL_WP_DCI && meta->primaries == JPEGXL_PR_P3) {
1023
1
        avctx->color_primaries = AVCOL_PRI_SMPTE431;
1024
1.24k
    } else {
1025
1.24k
        avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
1026
1.24k
    }
1027
1028
4.59k
    if (meta->trc > JPEGXL_TR_GAMMA) {
1029
3.36k
        FFJXLTransferCharacteristic trc = meta->trc - JPEGXL_TR_GAMMA;
1030
3.36k
        switch (trc) {
1031
72
        case JPEGXL_TR_BT709:
1032
72
            avctx->color_trc = AVCOL_TRC_BT709;
1033
72
            break;
1034
5
        case JPEGXL_TR_LINEAR:
1035
5
            avctx->color_trc = AVCOL_TRC_LINEAR;
1036
5
            break;
1037
3.23k
        case JPEGXL_TR_SRGB:
1038
3.23k
            avctx->color_trc = AVCOL_TRC_IEC61966_2_1;
1039
3.23k
            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
6
        case JPEGXL_TR_HLG:
1047
6
            avctx->color_trc = AVCOL_TRC_ARIB_STD_B67;
1048
6
            break;
1049
37
        default:
1050
37
            avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
1051
3.36k
        }
1052
3.36k
    } else if (meta->trc > 0) {
1053
1.21k
        if (meta->trc > 45355 && meta->trc < 45555)
1054
0
            avctx->color_trc = AVCOL_TRC_GAMMA22;
1055
1.21k
        else if (meta->trc > 35614 && meta->trc < 35814)
1056
0
            avctx->color_trc = AVCOL_TRC_GAMMA28;
1057
1.21k
        else
1058
1.21k
            avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
1059
1.21k
    } else {
1060
17
        avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
1061
17
    }
1062
1063
4.59k
    if (meta->csp == JPEGXL_CS_GRAY) {
1064
259
        if (meta->bit_depth <= 8)
1065
108
            s->format = meta->have_alpha ? AV_PIX_FMT_YA8 : AV_PIX_FMT_GRAY8;
1066
151
        else if (meta->bit_depth <= 16)
1067
96
            s->format = meta->have_alpha ? AV_PIX_FMT_YA16 : AV_PIX_FMT_GRAY16;
1068
55
        else
1069
55
            s->format = meta->have_alpha ? AV_PIX_FMT_NONE : AV_PIX_FMT_GRAYF32;
1070
4.33k
    } else {
1071
4.33k
        if (meta->bit_depth <= 8)
1072
3.21k
            s->format = meta->have_alpha ? AV_PIX_FMT_RGBA : AV_PIX_FMT_RGB24;
1073
1.11k
        else if (meta->bit_depth <= 16)
1074
733
            s->format = meta->have_alpha ? AV_PIX_FMT_RGBA64 : AV_PIX_FMT_RGB48;
1075
386
        else
1076
386
            s->format = meta->have_alpha ? AV_PIX_FMT_RGBAF32 : AV_PIX_FMT_RGBF32;
1077
4.33k
    }
1078
1079
4.59k
    if (meta->have_alpha) {
1080
987
        avctx->alpha_mode = meta->alpha_associated ? AVALPHA_MODE_PREMULTIPLIED
1081
987
                                                   : AVALPHA_MODE_STRAIGHT;
1082
987
    }
1083
4.59k
}
1084
1085
static int skip_icc_profile(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
1086
4.68k
{
1087
4.68k
    int64_t ret;
1088
4.68k
    uint32_t last = 0, last2 = 0;
1089
4.68k
    JXLEntropyDecoder dec = { 0 };
1090
4.68k
    uint64_t enc_size = jxl_u64(gb);
1091
4.68k
    uint64_t output_size = 0;
1092
4.68k
    int out_size_shift = 0;
1093
1094
4.68k
    if (!enc_size || enc_size > (1 << 22))
1095
858
        return AVERROR_INVALIDDATA;
1096
1097
3.82k
    ret = entropy_decoder_init(avctx, gb, &dec, 41);
1098
3.82k
    if (ret < 0)
1099
1.93k
        goto end;
1100
1101
1.88k
    if (get_bits_left(gb) < 0) {
1102
0
        ret = AVERROR_BUFFER_TOO_SMALL;
1103
0
        goto end;
1104
0
    }
1105
1106
671k
    for (uint64_t read = 0; read < enc_size; read++) {
1107
671k
        ret = entropy_decoder_read_symbol(gb, &dec, icc_context(read, last, last2));
1108
671k
        if (ret < 0)
1109
72
            goto end;
1110
671k
        if (ret > 255) {
1111
341
            ret = AVERROR_INVALIDDATA;
1112
341
            goto end;
1113
341
        }
1114
671k
        if (get_bits_left(gb) < 0) {
1115
91
            ret = AVERROR_BUFFER_TOO_SMALL;
1116
91
            goto end;
1117
91
        }
1118
670k
        last2 = last;
1119
670k
        last = ret;
1120
670k
        if (out_size_shift < 63) {
1121
2.90k
            output_size += (ret & UINT64_C(0x7F)) << out_size_shift;
1122
2.90k
            if (!(ret & 0x80)) {
1123
1.42k
                out_size_shift = 63;
1124
1.48k
            } else {
1125
1.48k
                out_size_shift += 7;
1126
1.48k
                if (out_size_shift > 56) {
1127
75
                    ret = AVERROR_INVALIDDATA;
1128
75
                    goto end;
1129
75
                }
1130
1.48k
            }
1131
668k
        } else if (output_size < 132) {
1132
1.18k
            ret = AVERROR_INVALIDDATA;
1133
1.18k
            goto end;
1134
1.18k
        }
1135
670k
    }
1136
1137
123
    ret = 0;
1138
1139
3.82k
end:
1140
3.82k
    entropy_decoder_close(&dec);
1141
1142
3.82k
    return ret;
1143
123
}
1144
1145
static int skip_extensions(GetBitContext *gb)
1146
5.10M
{
1147
5.10M
    uint64_t extensions = jxl_u64(gb), extensions_len = 0;
1148
1149
5.10M
    if (get_bits_left(gb) < 0)
1150
282
        return AVERROR_BUFFER_TOO_SMALL;
1151
1152
5.10M
    if (!extensions)
1153
5.08M
        return 0;
1154
1155
1.08M
    for (int i = 0; i < 64; i++) {
1156
1.06M
        if (extensions & (UINT64_C(1) << i))
1157
117k
            extensions_len += jxl_u64(gb);
1158
1.06M
        if (get_bits_left(gb) < 0)
1159
126
            return AVERROR_BUFFER_TOO_SMALL;
1160
1.06M
    }
1161
1162
16.6k
    if (extensions_len > INT_MAX || get_bits_left(gb) < extensions_len)
1163
3.88k
        return AVERROR_BUFFER_TOO_SMALL;
1164
1165
12.7k
    skip_bits_long(gb, extensions_len);
1166
1167
12.7k
    return 0;
1168
16.6k
}
1169
1170
static int parse_frame_header(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
1171
2.56M
{
1172
2.56M
    int all_default, do_yCbCr = 0, num_passes = 1, ret;
1173
2.56M
    int group_size_shift = 1, lf_level = 0, save_as_ref = 0;
1174
2.56M
    int have_crop = 0, full_frame = 1, resets_canvas = 1, upsampling = 1;
1175
2.56M
    JXLFrame *frame = &ctx->codestream.frame;
1176
2.56M
    const FFJXLMetadata *meta = &ctx->codestream.meta;
1177
2.56M
    int32_t x0 = 0, y0 = 0;
1178
2.56M
    uint32_t duration = 0, width = meta->coded_width, height = meta->coded_height;
1179
2.56M
    uint32_t name_len, num_groups, num_lf_groups, group_dim, lf_group_dim, toc_count;
1180
2.56M
    uint64_t flags = 0;
1181
2.56M
    int start_len = get_bits_count(gb);
1182
1183
2.56M
    memset(frame, 0, sizeof(*frame));
1184
2.56M
    frame->is_last = 1;
1185
1186
2.56M
    all_default = get_bits1(gb);
1187
2.56M
    if (!all_default) {
1188
2.55M
        frame->type = get_bits(gb, 2);
1189
2.55M
        frame->encoding = get_bits1(gb);
1190
2.55M
        flags = jxl_u64(gb);
1191
2.55M
        if (!meta->xyb_encoded)
1192
2.31M
            do_yCbCr = get_bits1(gb);
1193
2.55M
        if (!(flags & JXL_FLAG_USE_LF_FRAME)) {
1194
2.55M
            if (do_yCbCr)
1195
1.09k
                skip_bits(gb, 6); // jpeg upsampling
1196
2.55M
            upsampling = jxl_u32(gb, 1, 2, 4, 8, 0, 0, 0, 0);
1197
2.55M
            skip_bits_long(gb, 2 * meta->num_extra_channels);
1198
2.55M
            if (get_bits_left(gb) < 0)
1199
475
                return AVERROR_BUFFER_TOO_SMALL;
1200
2.55M
        }
1201
2.55M
        if (frame->encoding == JPEGXL_ENC_MODULAR)
1202
5.09k
            group_size_shift = get_bits(gb, 2);
1203
2.55M
        else if (meta->xyb_encoded)
1204
237k
            skip_bits(gb, 6); // xqm and bqm scales
1205
2.55M
        if (frame->type != JPEGXL_FRAME_REFERENCE_ONLY) {
1206
2.55M
            num_passes = jxl_u32(gb, 1, 2, 3, 4, 0, 0, 0, 3);
1207
2.55M
            if (num_passes != 1) {
1208
6.40k
                int num_ds = jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 1);
1209
6.40k
                skip_bits(gb, 2 * (num_passes - 1)); // shift
1210
6.40k
                skip_bits(gb, 2 * num_ds); // downsample
1211
15.5k
                for (int i = 0; i < num_ds; i++)
1212
9.10k
                    jxl_u32(gb, 0, 1, 2, 0, 0, 0, 0, 3);
1213
6.40k
            }
1214
2.55M
        }
1215
2.55M
        if (frame->type == JPEGXL_FRAME_LF)
1216
2.89k
            lf_level = 1 + get_bits(gb, 2);
1217
2.55M
        else
1218
2.55M
            have_crop = get_bits1(gb);
1219
2.55M
        if (have_crop) {
1220
5.46k
            if (frame->type != JPEGXL_FRAME_REFERENCE_ONLY) {
1221
4.38k
                uint32_t ux0 = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1222
4.38k
                uint32_t uy0 = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1223
4.38k
                x0 = unpack_signed(ux0);
1224
4.38k
                y0 = unpack_signed(uy0);
1225
4.38k
            }
1226
5.46k
            width = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1227
5.46k
            height = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1228
5.46k
            full_frame = x0 <= 0 && y0 <= 0 && width + x0 >= meta->coded_width
1229
754
                                            && height + y0 >= meta->coded_height;
1230
5.46k
        }
1231
2.55M
        if (get_bits_left(gb) < 0)
1232
278
            return AVERROR_BUFFER_TOO_SMALL;
1233
2.55M
        if (frame->type == JPEGXL_FRAME_REGULAR || frame->type == JPEGXL_FRAME_SKIP_PROGRESSIVE) {
1234
13.3M
            for (int i = 0; i <= meta->num_extra_channels; i++) {
1235
10.8M
                int mode = jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1236
10.8M
                if (meta->num_extra_channels && (mode == JPEGXL_BM_BLEND || mode == JPEGXL_BM_MULADD))
1237
701k
                    jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1238
10.8M
                if (meta->num_extra_channels && (mode == JPEGXL_BM_BLEND || mode == JPEGXL_BM_MULADD
1239
7.71M
                                              || mode == JPEGXL_BM_MUL))
1240
843k
                    skip_bits1(gb);
1241
10.8M
                if (!i)
1242
2.55M
                    resets_canvas = mode == JPEGXL_BM_REPLACE && full_frame;
1243
10.8M
                if (!resets_canvas)
1244
1.75M
                    skip_bits(gb, 2);
1245
10.8M
                if (get_bits_left(gb) < 0)
1246
272
                    return AVERROR_BUFFER_TOO_SMALL;
1247
10.8M
            }
1248
2.55M
            if (meta->animation_offset)
1249
20.9k
                duration = jxl_u32(gb, 0, 1, 0, 0, 0, 0, 8, 32);
1250
2.55M
            if (meta->have_timecodes)
1251
19.5k
                skip_bits_long(gb, 32);
1252
2.55M
            frame->is_last = get_bits1(gb);
1253
2.55M
        } else {
1254
4.82k
            frame->is_last = 0;
1255
4.82k
        }
1256
2.55M
        if (frame->type != JPEGXL_FRAME_LF && !frame->is_last)
1257
2.55M
            save_as_ref = get_bits(gb, 2);
1258
2.55M
        if (frame->type == JPEGXL_FRAME_REFERENCE_ONLY ||
1259
2.55M
                (resets_canvas && !frame->is_last && (!duration || save_as_ref)
1260
2.54M
                && frame->type != JPEGXL_FRAME_LF))
1261
2.54M
            skip_bits1(gb); // save before color transform
1262
2.55M
        name_len = 8 * jxl_u32(gb, 0, 0, 16, 48, 0, 4, 5, 10);
1263
2.55M
        if (get_bits_left(gb) < name_len)
1264
131
            return AVERROR_BUFFER_TOO_SMALL;
1265
2.55M
        skip_bits_long(gb, name_len);
1266
2.55M
    }
1267
1268
2.56M
    if (!all_default) {
1269
2.55M
        int restd = get_bits1(gb), gab = 1;
1270
2.55M
        if (!restd)
1271
2.55M
            gab = get_bits1(gb);
1272
2.55M
        if (gab && !restd && get_bits1(gb))
1273
            // gab custom
1274
1.86k
            skip_bits_long(gb, 16 * 6);
1275
2.55M
        if (get_bits_left(gb) < 0)
1276
400
            return AVERROR_BUFFER_TOO_SMALL;
1277
2.55M
        if (!restd) {
1278
2.55M
            int epf = get_bits(gb, 2);
1279
2.55M
            if (epf) {
1280
8.41k
                if (frame->encoding == JPEGXL_ENC_VARDCT && get_bits1(gb)) {
1281
1.84k
                    skip_bits_long(gb, 16 * 8); // custom epf sharpness
1282
1.84k
                    if (get_bits_left(gb) < 0)
1283
19
                        return AVERROR_BUFFER_TOO_SMALL;
1284
1.84k
                }
1285
8.39k
                if (get_bits1(gb)) {
1286
2.04k
                    skip_bits_long(gb, 3 * 16 + 32); // custom epf weight
1287
2.04k
                    if (get_bits_left(gb) < 0)
1288
12
                        return AVERROR_BUFFER_TOO_SMALL;
1289
2.04k
                }
1290
8.37k
                if (get_bits1(gb)) { // custom epf sigma
1291
3.07k
                    if (frame->encoding == JPEGXL_ENC_VARDCT)
1292
1.96k
                        skip_bits(gb, 16);
1293
3.07k
                    skip_bits_long(gb, 16 * 3);
1294
3.07k
                    if (get_bits_left(gb) < 0)
1295
16
                        return AVERROR_BUFFER_TOO_SMALL;
1296
3.07k
                }
1297
8.36k
                if (frame->encoding == JPEGXL_ENC_MODULAR)
1298
1.75k
                    skip_bits(gb, 16);
1299
8.36k
            }
1300
2.55M
            ret = skip_extensions(gb);
1301
2.55M
            if (ret < 0)
1302
2.31k
                return ret;
1303
2.55M
        }
1304
2.55M
        ret = skip_extensions(gb);
1305
2.55M
        if (ret < 0)
1306
1.97k
            return ret;
1307
2.55M
    }
1308
1309
2.56M
    width = div_ceil(div_ceil(width, upsampling), 1 << (3 * lf_level));
1310
2.56M
    height = div_ceil(div_ceil(height, upsampling), 1 << (3 * lf_level));
1311
2.56M
    group_dim = 128 << group_size_shift;
1312
2.56M
    lf_group_dim = group_dim << 3;
1313
2.56M
    num_groups = div_ceil(width, group_dim) * div_ceil(height, group_dim);
1314
2.56M
    num_lf_groups = div_ceil(width, lf_group_dim) * div_ceil(height, lf_group_dim);
1315
2.56M
    if (num_groups == 1 && num_passes == 1)
1316
2.26M
        toc_count = 1;
1317
293k
    else
1318
293k
        toc_count = 2 + num_lf_groups + num_groups * num_passes;
1319
1320
    // permuted toc
1321
2.56M
    if (get_bits1(gb)) {
1322
20.4k
        JXLEntropyDecoder dec;
1323
20.4k
        int64_t end, lehmer = 0;
1324
        /* parser sanity check to prevent TOC perm from spinning cpu */
1325
20.4k
        if (width > meta->coded_width * 8 || height > meta->coded_height * 8) {
1326
1.30k
            av_log(avctx, AV_LOG_WARNING, "frame of size %" PRIu32 "x%" PRIu32
1327
1.30k
                " exceeds max size of %" PRIu32 "x%" PRIu32 ", aborting parser\n",
1328
1.30k
                width, height, meta->coded_width * 8, meta->coded_height * 8);
1329
1.30k
            return AVERROR_INVALIDDATA;
1330
1.30k
        }
1331
19.1k
        ret = entropy_decoder_init(avctx, gb, &dec, 8);
1332
19.1k
        if (ret < 0)
1333
13.0k
            return ret;
1334
6.10k
        if (get_bits_left(gb) < 0) {
1335
0
            entropy_decoder_close(&dec);
1336
0
            return AVERROR_BUFFER_TOO_SMALL;
1337
0
        }
1338
6.10k
        end = entropy_decoder_read_symbol(gb, &dec, toc_context(toc_count));
1339
6.10k
        if (end < 0 || end > toc_count) {
1340
1.19k
            entropy_decoder_close(&dec);
1341
1.19k
            return AVERROR_INVALIDDATA;
1342
1.19k
        }
1343
31.1k
        for (uint32_t i = 0; i < end; i++) {
1344
26.2k
            lehmer = entropy_decoder_read_symbol(gb, &dec, toc_context(lehmer));
1345
26.2k
            if (lehmer < 0 || get_bits_left(gb) < 0) {
1346
42
                entropy_decoder_close(&dec);
1347
42
                return lehmer < 0 ? lehmer : AVERROR_BUFFER_TOO_SMALL;
1348
42
            }
1349
26.2k
        }
1350
4.86k
        entropy_decoder_close(&dec);
1351
4.86k
    }
1352
2.54M
    align_get_bits(gb);
1353
1354
123M
    for (uint32_t i = 0; i < toc_count; i++) {
1355
121M
        frame->body_length += 8 * jxl_u32(gb, 0, 1024, 17408, 4211712, 10, 14, 22, 30);
1356
121M
        if (get_bits_left(gb) < 0)
1357
2.92k
            return AVERROR_BUFFER_TOO_SMALL;
1358
121M
    }
1359
2.54M
    align_get_bits(gb);
1360
1361
2.54M
    frame->total_length = frame->body_length + get_bits_count(gb) - start_len;
1362
1363
2.54M
    return 0;
1364
2.54M
}
1365
1366
static int skip_boxes(JXLParseContext *ctx, const uint8_t *buf, int buf_size)
1367
539
{
1368
539
    GetByteContext gb;
1369
1370
539
    if (ctx->skip > buf_size)
1371
465
        return AVERROR_BUFFER_TOO_SMALL;
1372
1373
74
    buf += ctx->skip;
1374
74
    buf_size -= ctx->skip;
1375
74
    bytestream2_init(&gb, buf, buf_size);
1376
1377
96
    while (1) {
1378
96
        uint64_t size;
1379
96
        int head_size = 8;
1380
1381
96
        if (bytestream2_peek_le16(&gb) == FF_JPEGXL_CODESTREAM_SIGNATURE_LE)
1382
1
            break;
1383
95
        if (bytestream2_peek_le64(&gb) == FF_JPEGXL_CONTAINER_SIGNATURE_LE)
1384
13
            break;
1385
1386
82
        if (bytestream2_get_bytes_left(&gb) < 8)
1387
10
            return AVERROR_BUFFER_TOO_SMALL;
1388
1389
72
        size = bytestream2_get_be32(&gb);
1390
72
        bytestream2_skip(&gb, 4); // tag
1391
72
        if (size == 1) {
1392
5
            if (bytestream2_get_bytes_left(&gb) < 8)
1393
0
                return AVERROR_BUFFER_TOO_SMALL;
1394
5
            size = bytestream2_get_be64(&gb);
1395
5
            head_size = 16;
1396
5
        }
1397
72
        if (!size)
1398
12
            return AVERROR_INVALIDDATA;
1399
        /* invalid ISOBMFF size */
1400
60
        if (size <= head_size || size > INT_MAX - ctx->skip)
1401
17
            return AVERROR_INVALIDDATA;
1402
1403
43
        ctx->skip += size;
1404
43
        bytestream2_skip(&gb, size - head_size);
1405
43
        if (bytestream2_get_bytes_left(&gb) <= 0)
1406
21
            return AVERROR_BUFFER_TOO_SMALL;
1407
43
    }
1408
1409
14
    return 0;
1410
74
}
1411
1412
static int64_t try_parse(AVCodecParserContext *s, AVCodecContext *avctx, JXLParseContext *ctx,
1413
                     const uint8_t *buf, int buf_size)
1414
52.8k
{
1415
52.8k
    int ret, cs_buflen, header_skip;
1416
52.8k
    const uint8_t *cs_buffer;
1417
52.8k
    GetBitContext gb;
1418
1419
52.8k
    if (ctx->skip > buf_size)
1420
636
        return AVERROR_BUFFER_TOO_SMALL;
1421
1422
52.1k
    buf += ctx->skip;
1423
52.1k
    buf_size -= ctx->skip;
1424
1425
52.1k
    if (ctx->container || AV_RL64(buf) == FF_JPEGXL_CONTAINER_SIGNATURE_LE) {
1426
1.30k
        ctx->container = 1;
1427
1.30k
        ret = ff_jpegxl_collect_codestream_header(buf, buf_size, ctx->cs_buffer,
1428
1.30k
                                                  sizeof(ctx->cs_buffer) - AV_INPUT_BUFFER_PADDING_SIZE, &ctx->copied);
1429
1.30k
        if (ret < 0)
1430
320
            return ret;
1431
989
        ctx->collected_size = ret;
1432
989
        if (!ctx->copied) {
1433
268
            ctx->skip += ret;
1434
268
            return AVERROR_BUFFER_TOO_SMALL;
1435
268
        }
1436
721
        cs_buffer = ctx->cs_buffer;
1437
721
        cs_buflen = FFMIN(sizeof(ctx->cs_buffer) - AV_INPUT_BUFFER_PADDING_SIZE, ctx->copied);
1438
50.8k
    } else {
1439
50.8k
        cs_buffer = buf;
1440
50.8k
        cs_buflen = buf_size;
1441
50.8k
    }
1442
1443
51.5k
    if (!ctx->codestream_length) {
1444
22.7k
        header_skip = ff_jpegxl_parse_codestream_header(cs_buffer, cs_buflen, &ctx->codestream.meta, 0);
1445
22.7k
        if (header_skip < 0)
1446
18.1k
            return header_skip;
1447
4.59k
        ctx->codestream_length = header_skip;
1448
4.59k
        populate_fields(s, avctx, &ctx->codestream.meta);
1449
4.59k
    }
1450
1451
33.4k
    if (ctx->container)
1452
103
        return ctx->collected_size;
1453
1454
33.3k
    ret = init_get_bits8(&gb, cs_buffer, cs_buflen);
1455
33.3k
    if (ret < 0)
1456
0
        return ret;
1457
1458
33.3k
    skip_bits_long(&gb, ctx->codestream_length);
1459
1460
33.3k
    if (!ctx->skipped_icc && ctx->codestream.meta.have_icc_profile) {
1461
4.68k
        ret = skip_icc_profile(avctx, ctx, &gb);
1462
4.68k
        if (ret < 0)
1463
4.55k
            return ret;
1464
123
        ctx->skipped_icc = 1;
1465
123
        align_get_bits(&gb);
1466
123
        ctx->codestream_length = get_bits_count(&gb);
1467
123
    }
1468
1469
28.7k
    if (get_bits_left(&gb) <= 0)
1470
1.21k
        return AVERROR_BUFFER_TOO_SMALL;
1471
1472
2.56M
    while (1) {
1473
2.56M
        ret = parse_frame_header(avctx, ctx, &gb);
1474
2.56M
        if (ret < 0)
1475
24.3k
            return ret;
1476
2.54M
        ctx->codestream_length += ctx->codestream.frame.total_length;
1477
2.54M
        if (ctx->codestream.frame.is_last)
1478
2.06k
            return ctx->codestream_length / 8;
1479
2.54M
        if (get_bits_left(&gb) <= ctx->codestream.frame.body_length)
1480
1.10k
            return AVERROR_BUFFER_TOO_SMALL;
1481
2.53M
        skip_bits_long(&gb, ctx->codestream.frame.body_length);
1482
2.53M
    }
1483
27.5k
}
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
56.0k
{
1489
56.0k
    JXLParseContext *ctx = s->priv_data;
1490
56.0k
    int next = END_NOT_FOUND, ret;
1491
56.0k
    const uint8_t *pbuf = ctx->pc.buffer;
1492
56.0k
    int pindex = ctx->pc.index;
1493
1494
56.0k
    *poutbuf_size = 0;
1495
56.0k
    *poutbuf = NULL;
1496
1497
56.0k
    if (!ctx->pc.index) {
1498
8.92k
        if (ctx->pc.overread)
1499
176
            goto flush;
1500
8.74k
        pbuf = buf;
1501
8.74k
        pindex = buf_size;
1502
8.74k
    }
1503
1504
55.8k
    if ((!ctx->container || !ctx->codestream_length) && !ctx->next) {
1505
52.8k
        int64_t ret64 = try_parse(s, avctx, ctx, pbuf, pindex);
1506
52.8k
        if (ret64 < 0)
1507
50.6k
            goto flush;
1508
2.16k
        ctx->next = ret64;
1509
2.16k
        if (ctx->container)
1510
103
            ctx->skip += ctx->next;
1511
2.16k
    }
1512
1513
5.18k
    if (ctx->container && ctx->next >= 0) {
1514
539
        ret = skip_boxes(ctx, pbuf, pindex);
1515
539
        if (ret < 0) {
1516
525
            if (ret == AVERROR_INVALIDDATA)
1517
29
                ctx->next = -1;
1518
525
            goto flush;
1519
525
        }
1520
14
        ctx->next = ret + ctx->skip;
1521
14
    }
1522
1523
4.65k
    if (ctx->next >= 0)
1524
4.06k
        next = ctx->next - ctx->pc.index;
1525
1526
56.0k
flush:
1527
56.0k
    if (next > buf_size)
1528
2.19k
        next = END_NOT_FOUND;
1529
1530
56.0k
    ret = ff_combine_frame(&ctx->pc, next, &buf, &buf_size);
1531
56.0k
    if (ret < 0)
1532
47.0k
        return buf_size;
1533
1534
8.92k
    *poutbuf      = buf;
1535
8.92k
    *poutbuf_size = buf_size;
1536
1537
8.92k
    ctx->codestream_length = 0;
1538
8.92k
    ctx->collected_size = 0;
1539
8.92k
    ctx->container = 0;
1540
8.92k
    ctx->copied = 0;
1541
8.92k
    ctx->skip = 0;
1542
8.92k
    ctx->skipped_icc = 0;
1543
8.92k
    ctx->next = 0;
1544
8.92k
    memset(&ctx->codestream, 0, sizeof(ctx->codestream));
1545
1546
8.92k
    return next;
1547
56.0k
}
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
};