FFmpeg
Loading...
Searching...
No Matches
jpegxl_parser.c
Go to the documentation of this file.
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
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#define JXL_FLAG_USE_LF_FRAME 32
48#define JXL_FLAG_SKIP_ADAPTIVE_LF_SMOOTH 128
49
50#define MAX_PREFIX_ALPHABET_SIZE (1u << 15)
51
52#define clog1p(x) (ff_log2(x) + !!(x))
53#define unpack_signed(x) (((x) & 1 ? -(x)-1 : (x))/2)
54#define div_ceil(x, y) (((x) - 1) / (y) + 1)
55#define vlm(a,b) {.sym = (a), .len = (b)}
56
62
63typedef struct JXLSymbolDistribution {
66 /* this is the actual size of the alphabet */
68 /* ceil(log(alphabet_size)) */
70
71 /* for prefix code distributions */
73 /* in case bits == 0 */
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 */
92
93typedef struct JXLDistributionBundle {
94 /* lz77 flags */
99
100 /* one entry for each distribution */
101 uint8_t *cluster_map;
102 /* length of cluster_map */
104
105 /* one for each cluster */
108
109 /* whether to use brotli prefixes or ans */
111 /* bundle log alphabet size, dist ones may be smaller */
114
115typedef struct JXLEntropyDecoder {
116
117 /* state is a positive 32-bit integer, or -1 if unset */
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 */
132
133 /* for av_log */
134 void *logctx;
136
147
152
168
169/* used for reading brotli prefixes */
170static 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 */
176static 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
195static 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 */
204{
205 int n;
206 if (!get_bits1(gb))
207 return 0;
208 n = get_bits(gb, 3);
209
210 return get_bitsz(gb, n) | (1 << n);
211}
212
213/* read a U32(c_i + u(u_i)) */
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{
218 const uint32_t constants[4] = {c0, c1, c2, c3};
219 const uint32_t ubits [4] = {u0, u1, u2, u3};
220 uint32_t ret, choice = get_bits(gb, 2);
221
222 ret = constants[choice];
223 if (ubits[choice])
224 ret += get_bits_long(gb, ubits[choice]);
225
226 return ret;
227}
228
229/* read a U64() */
230static uint64_t jxl_u64(GetBitContext *gb)
231{
232 uint64_t shift = 12, ret;
233
234 switch (get_bits(gb, 2)) {
235 case 1:
236 ret = 1 + get_bits(gb, 4);
237 break;
238 case 2:
239 ret = 17 + get_bits(gb, 8);
240 break;
241 case 3:
242 ret = get_bits(gb, 12);
243 while (get_bits1(gb)) {
244 if (shift < 60) {
245 ret |= (uint64_t)get_bits(gb, 8) << shift;
246 shift += 8;
247 } else {
248 ret |= (uint64_t)get_bits(gb, 4) << shift;
249 break;
250 }
251 }
252 break;
253 default:
254 ret = 0;
255 }
256
257 return ret;
258}
259
260static int read_hybrid_uint_conf(GetBitContext *gb, JXLHybridUintConf *conf, int log_alphabet_size)
261{
262 conf->split_exponent = get_bitsz(gb, clog1p(log_alphabet_size));
263 if (conf->split_exponent == log_alphabet_size) {
264 conf->msb_in_token = conf->lsb_in_token = 0;
265 return 0;
266 }
267
268 conf->msb_in_token = get_bitsz(gb, clog1p(conf->split_exponent));
269 if (conf->msb_in_token > conf->split_exponent)
270 return AVERROR_INVALIDDATA;
271 conf->lsb_in_token = get_bitsz(gb, clog1p(conf->split_exponent - conf->msb_in_token));
272 if (conf->msb_in_token + conf->lsb_in_token > conf->split_exponent)
273 return AVERROR_INVALIDDATA;
274
275 return 0;
276}
277
278static int read_hybrid_uint(GetBitContext *gb, const JXLHybridUintConf *conf, uint32_t token, uint32_t *hybrid_uint)
279{
280 uint32_t n, low, split = 1 << conf->split_exponent;
281
282 if (token < split) {
283 *hybrid_uint = token;
284 return 0;
285 }
286
287 n = conf->split_exponent - conf->lsb_in_token - conf->msb_in_token +
288 ((token - split) >> (conf->msb_in_token + conf->lsb_in_token));
289 if (n >= 32)
290 return AVERROR_INVALIDDATA;
291 low = token & ((1 << conf->lsb_in_token) - 1);
292 token >>= conf->lsb_in_token;
293 token &= (1 << conf->msb_in_token) - 1;
294 token |= 1 << conf->msb_in_token;
295 *hybrid_uint = (((token << n) | get_bits_long(gb, n)) << conf->lsb_in_token ) | low;
296
297 return 0;
298}
299
300static inline uint32_t read_prefix_symbol(GetBitContext *gb, const JXLSymbolDistribution *dist)
301{
302 if (!dist->vlc.bits)
303 return dist->default_symbol;
304
305 return get_vlc2(gb, dist->vlc.table, dist->vlc.bits, 1);
306}
307
309{
310 uint32_t index, i, pos, symbol, offset;
311
312 if (dec->state < 0)
313 dec->state = get_bits_long(gb, 32);
314
315 index = dec->state & 0xFFF;
316 i = index >> dist->log_bucket_size;
317 pos = index & ((1 << dist->log_bucket_size) - 1);
318 symbol = pos >= dist->cutoffs[i] ? dist->symbols[i] : i;
319 offset = pos >= dist->cutoffs[i] ? dist->offsets[i] + pos : pos;
320 dec->state = dist->freq[symbol] * (dec->state >> 12) + offset;
321 if (dec->state < (1 << 16))
322 dec->state = (dec->state << 16) | get_bits(gb, 16);
323 dec->state &= 0xFFFFFFFF;
324
325 return symbol;
326}
327
329 const JXLDistributionBundle *bundle,
330 uint32_t context, uint32_t *hybrid_uint)
331{
332 int ret;
333 uint32_t token, distance;
334 const JXLSymbolDistribution *dist;
335
336 if (dec->num_to_copy > 0) {
337 *hybrid_uint = dec->window[dec->copy_pos++ & 0xFFFFF];
338 dec->num_to_copy--;
339 dec->window[dec->num_decoded++ & 0xFFFFF] = *hybrid_uint;
340 return 0;
341 }
342
343 if (context >= bundle->num_dist)
344 return AVERROR(EINVAL);
345 if (bundle->cluster_map[context] >= bundle->num_clusters)
346 return AVERROR_INVALIDDATA;
347
348 dist = &bundle->dists[bundle->cluster_map[context]];
349 if (bundle->use_prefix_code)
350 token = read_prefix_symbol(gb, dist);
351 else
352 token = read_ans_symbol(gb, dec, dist);
353
354 if (bundle->lz77_enabled && token >= bundle->lz77_min_symbol) {
355 const JXLSymbolDistribution *lz77dist = &bundle->dists[bundle->cluster_map[bundle->num_dist - 1]];
356 if (!dec->num_decoded)
357 return AVERROR_INVALIDDATA;
358 ret = read_hybrid_uint(gb, &bundle->lz_len_conf, token - bundle->lz77_min_symbol, &dec->num_to_copy);
359 if (ret < 0)
360 return ret;
361 dec->num_to_copy += bundle->lz77_min_length;
362 if (bundle->use_prefix_code)
363 token = read_prefix_symbol(gb, lz77dist);
364 else
365 token = read_ans_symbol(gb, dec, lz77dist);
366 ret = read_hybrid_uint(gb, &lz77dist->config, token, &distance);
367 if (ret < 0)
368 return ret;
369 distance++;
370 distance = FFMIN3(distance, dec->num_decoded, 1 << 20);
371 dec->copy_pos = dec->num_decoded - distance;
372 return decode_hybrid_varlen_uint(gb, dec, bundle, context, hybrid_uint);
373 }
374 ret = read_hybrid_uint(gb, &dist->config, token, hybrid_uint);
375 if (ret < 0)
376 return ret;
377 if (bundle->lz77_enabled)
378 dec->window[dec->num_decoded++ & 0xFFFFF] = *hybrid_uint;
379
380 return 0;
381}
382
383static int populate_distribution(GetBitContext *gb, JXLSymbolDistribution *dist, int log_alphabet_size)
384{
385 int len = 0, shift, omit_log = -1, omit_pos = -1;
386 int prev = 0, num_same = 0;
387 uint32_t total_count = 0;
388 uint8_t logcounts[258] = { 0 };
389 uint8_t same[258] = { 0 };
390 const int table_size = 1 << log_alphabet_size;
391 dist->uniq_pos = -1;
392
393 if (get_bits1(gb)) {
394 /* simple code */
395 if (get_bits1(gb)) {
396 uint8_t v1 = jxl_u8(gb);
397 uint8_t v2 = jxl_u8(gb);
398 if (v1 == v2)
399 return AVERROR_INVALIDDATA;
400 dist->freq[v1] = get_bits(gb, 12);
401 dist->freq[v2] = (1 << 12) - dist->freq[v1];
402 if (!dist->freq[v1])
403 dist->uniq_pos = v2;
404 dist->alphabet_size = 1 + FFMAX(v1, v2);
405 } else {
406 uint8_t x = jxl_u8(gb);
407 dist->freq[x] = 1 << 12;
408 dist->uniq_pos = x;
409 dist->alphabet_size = 1 + x;
410 }
411 if (dist->alphabet_size > table_size)
412 return AVERROR_INVALIDDATA;
413
414 return 0;
415 }
416
417 if (get_bits1(gb)) {
418 /* flat code */
419 dist->alphabet_size = jxl_u8(gb) + 1;
420 if (dist->alphabet_size > table_size)
421 return AVERROR_INVALIDDATA;
422 for (int i = 0; i < dist->alphabet_size; i++)
423 dist->freq[i] = (1 << 12) / dist->alphabet_size;
424 for (int i = 0; i < (1 << 12) % dist->alphabet_size; i++)
425 dist->freq[i]++;
426 return 0;
427 }
428
429 do {
430 if (!get_bits1(gb))
431 break;
432 } while (++len < 3);
433
434 shift = (get_bitsz(gb, len) | (1 << len)) - 1;
435 if (shift > 13)
436 return AVERROR_INVALIDDATA;
437
438 dist->alphabet_size = jxl_u8(gb) + 3;
439 if (dist->alphabet_size > table_size)
440 return AVERROR_INVALIDDATA;
441
442 for (int i = 0; i < dist->alphabet_size; i++) {
443 logcounts[i] = get_vlc2(gb, dist_prefix_table, 7, 1);
444 if (logcounts[i] == 13) {
445 int rle = jxl_u8(gb);
446 same[i] = rle + 5;
447 i += rle + 3;
448 continue;
449 }
450 if (logcounts[i] > omit_log) {
451 omit_log = logcounts[i];
452 omit_pos = i;
453 }
454 }
455 if (omit_pos < 0 || omit_pos + 1 < dist->alphabet_size && logcounts[omit_pos + 1] == 13)
456 return AVERROR_INVALIDDATA;
457
458 for (int i = 0; i < dist->alphabet_size; i++) {
459 if (same[i]) {
460 num_same = same[i] - 1;
461 prev = i > 0 ? dist->freq[i - 1] : 0;
462 }
463 if (num_same) {
464 dist->freq[i] = prev;
465 num_same--;
466 } else {
467 if (i == omit_pos || !logcounts[i])
468 continue;
469 if (logcounts[i] == 1) {
470 dist->freq[i] = 1;
471 } else {
472 int bitcount = FFMIN(FFMAX(0, shift - ((12 - logcounts[i] + 1) >> 1)), logcounts[i] - 1);
473 dist->freq[i] = (1 << (logcounts[i] - 1)) + (get_bitsz(gb, bitcount) << (logcounts[i] - 1 - bitcount));
474 }
475 }
476 total_count += dist->freq[i];
477 }
478 dist->freq[omit_pos] = (1 << 12) - total_count;
479
480 return 0;
481}
482
484{
485 if (bundle->use_prefix_code && bundle->dists)
486 for (int i = 0; i < bundle->num_clusters; i++)
487 ff_vlc_free(&bundle->dists[i].vlc);
488 av_freep(&bundle->dists);
489 av_freep(&bundle->cluster_map);
490}
491
492
494 JXLDistributionBundle *bundle, int num_dist, int disallow_lz77);
495
497{
498 int ret;
499
500 bundle->cluster_map = av_malloc(bundle->num_dist);
501 if (!bundle->cluster_map)
502 return AVERROR(ENOMEM);
503
504 if (bundle->num_dist == 1) {
505 bundle->cluster_map[0] = 0;
506 bundle->num_clusters = 1;
507 return 0;
508 }
509
510 if (get_bits1(gb)) {
511 /* simple clustering */
512 uint32_t nbits = get_bits(gb, 2);
513 for (int i = 0; i < bundle->num_dist; i++)
514 bundle->cluster_map[i] = get_bitsz(gb, nbits);
515 } else {
516 /* complex clustering */
517 int use_mtf = get_bits1(gb);
518 JXLDistributionBundle nested = { 0 };
519 /* num_dist == 1 prevents this from recursing again */
520 ret = read_distribution_bundle(gb, dec, &nested, 1, bundle->num_dist <= 2);
521 if (ret < 0) {
522 dist_bundle_close(&nested);
523 return ret;
524 }
525 for (int i = 0; i < bundle->num_dist; i++) {
526 uint32_t clust;
527 ret = decode_hybrid_varlen_uint(gb, dec, &nested, 0, &clust);
528 if (ret < 0) {
529 dist_bundle_close(&nested);
530 return ret;
531 }
532 bundle->cluster_map[i] = clust;
533 }
534 dec->state = -1;
535 /* it's not going to necessarily be zero after reading */
536 dec->num_to_copy = 0;
537 dec->num_decoded = 0;
538 dist_bundle_close(&nested);
539 if (use_mtf) {
540 uint8_t mtf[256];
541 for (int i = 0; i < 256; i++)
542 mtf[i] = i;
543 for (int i = 0; i < bundle->num_dist; i++) {
544 int index = bundle->cluster_map[i];
545 bundle->cluster_map[i] = mtf[index];
546 if (index) {
547 int value = mtf[index];
548 for (int j = index; j > 0; j--)
549 mtf[j] = mtf[j - 1];
550 mtf[0] = value;
551 }
552 }
553 }
554 }
555 for (int i = 0; i < bundle->num_dist; i++) {
556 if (bundle->cluster_map[i] >= bundle->num_clusters)
557 bundle->num_clusters = bundle->cluster_map[i] + 1;
558 }
559
560 if (bundle->num_clusters > bundle->num_dist)
561 return AVERROR_INVALIDDATA;
562
563 return 0;
564}
565
566static int gen_alias_map(JXLEntropyDecoder *dec, JXLSymbolDistribution *dist, int log_alphabet_size)
567{
568 uint32_t bucket_size, table_size;
569 uint8_t overfull[256], underfull[256];
570 int overfull_pos = 0, underfull_pos = 0;
571 dist->log_bucket_size = 12 - log_alphabet_size;
572 bucket_size = 1 << dist->log_bucket_size;
573 table_size = 1 << log_alphabet_size;
574
575 if (dist->uniq_pos >= 0) {
576 for (int i = 0; i < table_size; i++) {
577 dist->symbols[i] = dist->uniq_pos;
578 dist->offsets[i] = bucket_size * i;
579 dist->cutoffs[i] = 0;
580 }
581 return 0;
582 }
583
584 for (int i = 0; i < dist->alphabet_size; i++) {
585 dist->cutoffs[i] = dist->freq[i];
586 dist->symbols[i] = i;
587 if (dist->cutoffs[i] > bucket_size)
588 overfull[overfull_pos++] = i;
589 else if (dist->cutoffs[i] < bucket_size)
590 underfull[underfull_pos++] = i;
591 }
592
593 for (int i = dist->alphabet_size; i < table_size; i++) {
594 dist->cutoffs[i] = 0;
595 underfull[underfull_pos++] = i;
596 }
597
598 while (overfull_pos) {
599 int o, u, by;
600 /* this should be impossible */
601 if (!underfull_pos)
602 return AVERROR_INVALIDDATA;
603 u = underfull[--underfull_pos];
604 o = overfull[--overfull_pos];
605 by = bucket_size - dist->cutoffs[u];
606 dist->cutoffs[o] -= by;
607 dist->symbols[u] = o;
608 dist->offsets[u] = dist->cutoffs[o];
609 if (dist->cutoffs[o] < bucket_size)
610 underfull[underfull_pos++] = o;
611 else if (dist->cutoffs[o] > bucket_size)
612 overfull[overfull_pos++] = o;
613 }
614
615 for (int i = 0; i < table_size; i++) {
616 if (dist->cutoffs[i] == bucket_size) {
617 dist->symbols[i] = i;
618 dist->offsets[i] = 0;
619 dist->cutoffs[i] = 0;
620 } else {
621 dist->offsets[i] -= dist->cutoffs[i];
622 }
623 }
624
625 return 0;
626}
627
629{
630 int nsym, tree_select, bits;
631
632 int8_t lens[4];
633 int16_t symbols[4];
634
635 nsym = 1 + get_bits(gb, 2);
636 for (int i = 0; i < nsym; i++)
637 symbols[i] = get_bitsz(gb, dist->log_alphabet_size);
638 if (nsym == 4)
639 tree_select = get_bits1(gb);
640 switch (nsym) {
641 case 1:
642 dist->vlc.bits = 0;
643 dist->default_symbol = symbols[0];
644 return 0;
645 case 2:
646 bits = 1;
647 lens[0] = 1, lens[1] = 1, lens[2] = 0, lens[3] = 0;
648 if (symbols[1] < symbols[0])
649 FFSWAP(int16_t, symbols[0], symbols[1]);
650 break;
651 case 3:
652 bits = 2;
653 lens[0] = 1, lens[1] = 2, lens[2] = 2, lens[3] = 0;
654 if (symbols[2] < symbols[1])
655 FFSWAP(int16_t, symbols[1], symbols[2]);
656 break;
657 case 4:
658 if (tree_select) {
659 bits = 3;
660 lens[0] = 1, lens[1] = 2, lens[2] = 3, lens[3] = 3;
661 if (symbols[3] < symbols[2])
662 FFSWAP(int16_t, symbols[2], symbols[3]);
663 } else {
664 bits = 2;
665 lens[0] = 2, lens[1] = 2, lens[2] = 2, lens[3] = 2;
666 while (1) {
667 if (symbols[1] < symbols[0])
668 FFSWAP(int16_t, symbols[0], symbols[1]);
669 if (symbols[3] < symbols[2])
670 FFSWAP(int16_t, symbols[2], symbols[3]);
671 if (symbols[1] <= symbols[2])
672 break;
673 FFSWAP(int16_t, symbols[1], symbols[2]);
674 }
675 }
676 break;
677 default:
678 // Challenge Complete! How did we get here?
679 return AVERROR_BUG;
680 }
681
682 return ff_vlc_init_from_lengths(&dist->vlc, bits, nsym, lens, 1, symbols,
683 2, 2, 0, VLC_INIT_LE, dec->logctx);
684}
685
687{
688 int8_t level1_lens[18] = { 0 };
689 int8_t level1_lens_s[18] = { 0 };
690 int16_t level1_syms[18] = { 0 };
691 uint32_t level1_codecounts[19] = { 0 };
692 uint8_t *buf = NULL;
693 int8_t *level2_lens, *level2_lens_s;
694 int16_t *level2_syms;
695 uint32_t *level2_codecounts;
696
697 int repeat_count_prev = 0, repeat_count_zero = 0, prev = 8;
698 int total_code = 0, len, hskip, num_codes = 0, ret;
699
700 VLC level1_vlc = { 0 };
701
702 if (dist->alphabet_size == 1) {
703 dist->vlc.bits = 0;
704 dist->default_symbol = 0;
705 return 0;
706 }
707
708 hskip = get_bits(gb, 2);
709 if (hskip == 1)
710 return read_simple_vlc_prefix(gb, dec, dist);
711
712 level1_codecounts[0] = hskip;
713 for (int i = hskip; i < 18; i++) {
714 len = level1_lens[prefix_codelen_map[i]] = get_vlc2(gb, level0_table, 4, 1);
715 if (len < 0) {
717 goto end;
718 }
719 level1_codecounts[len]++;
720 if (len) {
721 total_code += (32 >> len);
722 num_codes++;
723 }
724 if (total_code >= 32) {
725 level1_codecounts[0] += 18 - i - 1;
726 break;
727 }
728 }
729
730 if (total_code != 32 && num_codes >= 2 || num_codes < 1) {
732 goto end;
733 }
734
735 for (int i = 1; i < 19; i++)
736 level1_codecounts[i] += level1_codecounts[i - 1];
737
738 for (int i = 17; i >= 0; i--) {
739 int idx = --level1_codecounts[level1_lens[i]];
740 level1_lens_s[idx] = level1_lens[i];
741 level1_syms[idx] = i;
742 }
743
744 ret = ff_vlc_init_from_lengths(&level1_vlc, 5, 18, level1_lens_s, 1, level1_syms, 2, 2,
745 0, VLC_INIT_LE, dec->logctx);
746 if (ret < 0)
747 goto end;
748
749 buf = av_mallocz(MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t) + sizeof(int16_t) + sizeof(uint32_t))
750 + sizeof(uint32_t));
751 if (!buf) {
752 ret = AVERROR(ENOMEM);
753 goto end;
754 }
755
756 level2_lens = (int8_t *)buf;
757 level2_lens_s = (int8_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * sizeof(int8_t));
758 level2_syms = (int16_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t)));
759 level2_codecounts = (uint32_t *)(buf + MAX_PREFIX_ALPHABET_SIZE * (2 * sizeof(int8_t) + sizeof(int16_t)));
760
761 total_code = 0;
762 for (int i = 0; i < dist->alphabet_size; i++) {
763 len = get_vlc2(gb, level1_vlc.table, 5, 1);
764 if (len < 0) {
766 goto end;
767 }
768 if (get_bits_left(gb) < 0) {
770 goto end;
771 }
772 if (len == 16) {
773 int extra = 3 + get_bits(gb, 2);
774 if (repeat_count_prev)
775 extra += 4 * (repeat_count_prev - 2) - repeat_count_prev;
776 extra = FFMIN(extra, dist->alphabet_size - i);
777 for (int j = 0; j < extra; j++)
778 level2_lens[i + j] = prev;
779 total_code += (32768 >> prev) * extra;
780 i += extra - 1;
781 repeat_count_prev += extra;
782 repeat_count_zero = 0;
783 level2_codecounts[prev] += extra;
784 } else if (len == 17) {
785 int extra = 3 + get_bits(gb, 3);
786 if (repeat_count_zero > 0)
787 extra += 8 * (repeat_count_zero - 2) - repeat_count_zero;
788 extra = FFMIN(extra, dist->alphabet_size - i);
789 i += extra - 1;
790 repeat_count_prev = 0;
791 repeat_count_zero += extra;
792 level2_codecounts[0] += extra;
793 } else {
794 level2_lens[i] = len;
795 repeat_count_prev = repeat_count_zero = 0;
796 if (len) {
797 total_code += (32768 >> len);
798 prev = len;
799 }
800 level2_codecounts[len]++;
801 }
802 if (total_code >= 32768) {
803 level2_codecounts[0] += dist->alphabet_size - i - 1;
804 break;
805 }
806 }
807
808 if (total_code != 32768 && level2_codecounts[0] < dist->alphabet_size - 1) {
810 goto end;
811 }
812
813 for (int i = 1; i < dist->alphabet_size + 1; i++)
814 level2_codecounts[i] += level2_codecounts[i - 1];
815
816 for (int i = dist->alphabet_size - 1; i >= 0; i--) {
817 int idx = --level2_codecounts[level2_lens[i]];
818 level2_lens_s[idx] = level2_lens[i];
819 level2_syms[idx] = i;
820 }
821
822 ret = ff_vlc_init_from_lengths(&dist->vlc, 15, dist->alphabet_size, level2_lens_s,
823 1, level2_syms, 2, 2, 0, VLC_INIT_LE, dec->logctx);
824
825end:
826 av_freep(&buf);
827 ff_vlc_free(&level1_vlc);
828
829 return ret;
830}
831
833 JXLDistributionBundle *bundle, int num_dist, int disallow_lz77)
834{
835 int ret;
836
837 if (num_dist <= 0)
838 return AVERROR(EINVAL);
839
840 bundle->num_dist = num_dist;
841 bundle->lz77_enabled = get_bits1(gb);
842 if (bundle->lz77_enabled) {
843 if (disallow_lz77)
844 return AVERROR_INVALIDDATA;
845 bundle->lz77_min_symbol = jxl_u32(gb, 224, 512, 4096, 8, 0, 0, 0, 15);
846 bundle->lz77_min_length = jxl_u32(gb, 3, 4, 5, 9, 0, 0, 2, 8);
847 bundle->num_dist++;
848 ret = read_hybrid_uint_conf(gb, &bundle->lz_len_conf, 8);
849 if (ret < 0)
850 return ret;
851 }
852
853 if (bundle->lz77_enabled && !dec->window) {
854 dec->window = av_malloc_array(1 << 20, sizeof(uint32_t));
855 if (!dec->window)
856 return AVERROR(ENOMEM);
857 }
858
859 ret = read_dist_clustering(gb, dec, bundle);
860 if (ret < 0)
861 return ret;
862 if (get_bits_left(gb) < 0)
864
865 bundle->dists = av_calloc(bundle->num_clusters, sizeof(JXLSymbolDistribution));
866 if (!bundle->dists)
867 return AVERROR(ENOMEM);
868
869 bundle->use_prefix_code = get_bits1(gb);
870 bundle->log_alphabet_size = bundle->use_prefix_code ? 15 : 5 + get_bits(gb, 2);
871
872 for (int i = 0; i < bundle->num_clusters; i++) {
873 ret = read_hybrid_uint_conf(gb, &bundle->dists[i].config, bundle->log_alphabet_size);
874 if (ret < 0)
875 return ret;
876 if (get_bits_left(gb) < 0)
878 }
879
880 if (bundle->use_prefix_code) {
881 for (int i = 0; i < bundle->num_clusters; i++) {
882 JXLSymbolDistribution *dist = &bundle->dists[i];
883 if (get_bits1(gb)) {
884 int n = get_bits(gb, 4);
885 dist->alphabet_size = 1 + (1 << n) + get_bitsz(gb, n);
887 return AVERROR_INVALIDDATA;
888 } else {
889 dist->alphabet_size = 1;
890 }
891 dist->log_alphabet_size = clog1p(dist->alphabet_size - 1);
892 }
893 for (int i = 0; i < bundle->num_clusters; i++) {
894 ret = read_vlc_prefix(gb, dec, &bundle->dists[i]);
895 if (ret < 0)
896 return ret;
897 if (get_bits_left(gb) < 0)
899 }
900 } else {
901 for (int i = 0; i < bundle->num_clusters; i++) {
902 ret = populate_distribution(gb, &bundle->dists[i], bundle->log_alphabet_size);
903 if (ret < 0)
904 return ret;
905 if (get_bits_left(gb) < 0)
907 }
908 for (int i = 0; i < bundle->num_clusters; i++) {
909 ret = gen_alias_map(dec, &bundle->dists[i], bundle->log_alphabet_size);
910 if (ret < 0)
911 return ret;
912 }
913 }
914
915 return 0;
916}
917
919{
920 if (!dec)
921 return;
922 av_freep(&dec->window);
924}
925
926static int entropy_decoder_init(void *avctx, GetBitContext *gb, JXLEntropyDecoder *dec, int num_dist)
927{
928 int ret;
929
930 memset(dec, 0, sizeof(*dec));
931 dec->logctx = avctx;
932 dec->state = -1;
933
934 ret = read_distribution_bundle(gb, dec, &dec->bundle, num_dist, 0);
935 if (ret < 0) {
937 return ret;
938 }
939
940 return 0;
941}
942
944{
945 int ret;
946 uint32_t hybrid_uint;
947
948 ret = decode_hybrid_varlen_uint(gb, dec, &dec->bundle, context, &hybrid_uint);
949 if (ret < 0)
950 return ret;
951
952 return hybrid_uint;
953}
954
955static inline uint32_t icc_context(uint64_t i, uint32_t b1, uint32_t b2)
956{
957 uint32_t p1, p2;
958 if (i <= 128)
959 return 0;
960 if (b1 >= 'a' && b1 <= 'z' || b1 >= 'A' && b1 <= 'Z')
961 p1 = 0;
962 else if (b1 >= '0' && b1 <= '9' || b1 == '.' || b1 == ',')
963 p1 = 1;
964 else if (b1 <= 1)
965 p1 = b1 + 2;
966 else if (b1 > 1 && b1 < 16)
967 p1 = 4;
968 else if (b1 > 240 && b1 < 255)
969 p1 = 5;
970 else if (b1 == 255)
971 p1 = 6;
972 else
973 p1 = 7;
974
975 if (b2 >= 'a' && b2 <= 'z' || b2 >= 'A' && b2 <= 'Z')
976 p2 = 0;
977 else if (b2 >= '0' && b2 <= '9' || b2 == '.' || b2 == ',')
978 p2 = 1;
979 else if (b2 < 16)
980 p2 = 2;
981 else if (b2 > 240)
982 p2 = 3;
983 else
984 p2 = 4;
985
986 return 1 + p1 + p2 * 8;
987}
988
989static inline uint32_t toc_context(uint32_t x)
990{
991 return FFMIN(7, clog1p(x));
992}
993
995{
996 s->width = meta->width;
997 s->height = meta->height;
998
999 switch (meta->csp) {
1000 case JPEGXL_CS_RGB:
1001 case JPEGXL_CS_XYB:
1002 avctx->colorspace = AVCOL_SPC_RGB;
1003 break;
1004 default:
1006 }
1007
1008 if (meta->wp == JPEGXL_WP_D65) {
1009 switch (meta->primaries) {
1010 case JPEGXL_PR_SRGB:
1012 break;
1013 case JPEGXL_PR_P3:
1015 break;
1016 case JPEGXL_PR_2100:
1018 break;
1019 default:
1021 }
1022 } else if (meta->wp == JPEGXL_WP_DCI && meta->primaries == JPEGXL_PR_P3) {
1024 } else {
1026 }
1027
1028 if (meta->trc > JPEGXL_TR_GAMMA) {
1030 switch (trc) {
1031 case JPEGXL_TR_BT709:
1032 avctx->color_trc = AVCOL_TRC_BT709;
1033 break;
1034 case JPEGXL_TR_LINEAR:
1035 avctx->color_trc = AVCOL_TRC_LINEAR;
1036 break;
1037 case JPEGXL_TR_SRGB:
1039 break;
1040 case JPEGXL_TR_PQ:
1042 break;
1043 case JPEGXL_TR_DCI:
1045 break;
1046 case JPEGXL_TR_HLG:
1048 break;
1049 default:
1051 }
1052 } else if (meta->trc > 0) {
1053 if (meta->trc > 45355 && meta->trc < 45555)
1055 else if (meta->trc > 35614 && meta->trc < 35814)
1057 else
1059 } else {
1061 }
1062
1063 if (meta->csp == JPEGXL_CS_GRAY) {
1064 if (meta->bit_depth <= 8)
1065 s->format = meta->have_alpha ? AV_PIX_FMT_YA8 : AV_PIX_FMT_GRAY8;
1066 else if (meta->bit_depth <= 16)
1067 s->format = meta->have_alpha ? AV_PIX_FMT_YA16 : AV_PIX_FMT_GRAY16;
1068 else
1069 s->format = meta->have_alpha ? AV_PIX_FMT_NONE : AV_PIX_FMT_GRAYF32;
1070 } else {
1071 if (meta->bit_depth <= 8)
1072 s->format = meta->have_alpha ? AV_PIX_FMT_RGBA : AV_PIX_FMT_RGB24;
1073 else if (meta->bit_depth <= 16)
1074 s->format = meta->have_alpha ? AV_PIX_FMT_RGBA64 : AV_PIX_FMT_RGB48;
1075 else
1077 }
1078
1079 if (meta->have_alpha) {
1082 }
1083}
1084
1086{
1087 int64_t ret;
1088 uint32_t last = 0, last2 = 0;
1089 JXLEntropyDecoder dec = { 0 };
1090 uint64_t enc_size = jxl_u64(gb);
1091 uint64_t output_size = 0;
1092 int out_size_shift = 0;
1093
1094 if (!enc_size || enc_size > (1 << 22))
1095 return AVERROR_INVALIDDATA;
1096
1097 ret = entropy_decoder_init(avctx, gb, &dec, 41);
1098 if (ret < 0)
1099 goto end;
1100
1101 if (get_bits_left(gb) < 0) {
1103 goto end;
1104 }
1105
1106 for (uint64_t read = 0; read < enc_size; read++) {
1107 ret = entropy_decoder_read_symbol(gb, &dec, icc_context(read, last, last2));
1108 if (ret < 0)
1109 goto end;
1110 if (ret > 255) {
1111 ret = AVERROR_INVALIDDATA;
1112 goto end;
1113 }
1114 if (get_bits_left(gb) < 0) {
1116 goto end;
1117 }
1118 last2 = last;
1119 last = ret;
1120 if (out_size_shift < 63) {
1121 output_size += (ret & UINT64_C(0x7F)) << out_size_shift;
1122 if (!(ret & 0x80)) {
1123 out_size_shift = 63;
1124 } else {
1125 out_size_shift += 7;
1126 if (out_size_shift > 56) {
1127 ret = AVERROR_INVALIDDATA;
1128 goto end;
1129 }
1130 }
1131 } else if (output_size < 132) {
1132 ret = AVERROR_INVALIDDATA;
1133 goto end;
1134 }
1135 }
1136
1137 ret = 0;
1138
1139end:
1141
1142 return ret;
1143}
1144
1146{
1147 uint64_t extensions = jxl_u64(gb), extensions_len = 0;
1148
1149 if (get_bits_left(gb) < 0)
1151
1152 if (!extensions)
1153 return 0;
1154
1155 for (int i = 0; i < 64; i++) {
1156 if (extensions & (UINT64_C(1) << i))
1157 extensions_len += jxl_u64(gb);
1158 if (get_bits_left(gb) < 0)
1160 }
1161
1162 if (extensions_len > INT_MAX || get_bits_left(gb) < extensions_len)
1164
1165 skip_bits_long(gb, extensions_len);
1166
1167 return 0;
1168}
1169
1171{
1172 int all_default, do_yCbCr = 0, num_passes = 1, ret;
1173 int group_size_shift = 1, lf_level = 0, save_as_ref = 0;
1174 int have_crop = 0, full_frame = 1, resets_canvas = 1, upsampling = 1;
1175 JXLFrame *frame = &ctx->codestream.frame;
1176 const FFJXLMetadata *meta = &ctx->codestream.meta;
1177 int32_t x0 = 0, y0 = 0;
1178 uint32_t duration = 0, width = meta->coded_width, height = meta->coded_height;
1179 uint32_t name_len, num_groups, num_lf_groups, group_dim, lf_group_dim, toc_count;
1180 uint64_t flags = 0;
1181 int start_len = get_bits_count(gb);
1182
1183 memset(frame, 0, sizeof(*frame));
1184 frame->is_last = 1;
1185
1186 all_default = get_bits1(gb);
1187 if (!all_default) {
1188 frame->type = get_bits(gb, 2);
1189 frame->encoding = get_bits1(gb);
1190 flags = jxl_u64(gb);
1191 if (!meta->xyb_encoded)
1192 do_yCbCr = get_bits1(gb);
1193 if (!(flags & JXL_FLAG_USE_LF_FRAME)) {
1194 if (do_yCbCr)
1195 skip_bits(gb, 6); // jpeg upsampling
1196 upsampling = jxl_u32(gb, 1, 2, 4, 8, 0, 0, 0, 0);
1197 skip_bits_long(gb, 2 * meta->num_extra_channels);
1198 if (get_bits_left(gb) < 0)
1200 }
1201 if (frame->encoding == JPEGXL_ENC_MODULAR)
1202 group_size_shift = get_bits(gb, 2);
1203 else if (meta->xyb_encoded)
1204 skip_bits(gb, 6); // xqm and bqm scales
1205 if (frame->type != JPEGXL_FRAME_REFERENCE_ONLY) {
1206 num_passes = jxl_u32(gb, 1, 2, 3, 4, 0, 0, 0, 3);
1207 if (num_passes != 1) {
1208 int num_ds = jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 1);
1209 skip_bits(gb, 2 * (num_passes - 1)); // shift
1210 skip_bits(gb, 2 * num_ds); // downsample
1211 for (int i = 0; i < num_ds; i++)
1212 jxl_u32(gb, 0, 1, 2, 0, 0, 0, 0, 3);
1213 }
1214 }
1215 if (frame->type == JPEGXL_FRAME_LF)
1216 lf_level = 1 + get_bits(gb, 2);
1217 else
1218 have_crop = get_bits1(gb);
1219 if (have_crop) {
1220 if (frame->type != JPEGXL_FRAME_REFERENCE_ONLY) {
1221 uint32_t ux0 = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1222 uint32_t uy0 = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1223 x0 = unpack_signed(ux0);
1224 y0 = unpack_signed(uy0);
1225 }
1226 width = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1227 height = jxl_u32(gb, 0, 256, 2304, 18688, 8, 11, 14, 30);
1228 full_frame = x0 <= 0 && y0 <= 0 && width + x0 >= meta->coded_width
1229 && height + y0 >= meta->coded_height;
1230 }
1231 if (get_bits_left(gb) < 0)
1234 for (int i = 0; i <= meta->num_extra_channels; i++) {
1235 int mode = jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1237 jxl_u32(gb, 0, 1, 2, 3, 0, 0, 0, 2);
1239 || mode == JPEGXL_BM_MUL))
1240 skip_bits1(gb);
1241 if (!i)
1242 resets_canvas = mode == JPEGXL_BM_REPLACE && full_frame;
1243 if (!resets_canvas)
1244 skip_bits(gb, 2);
1245 if (get_bits_left(gb) < 0)
1247 }
1248 if (meta->animation_offset)
1249 duration = jxl_u32(gb, 0, 1, 0, 0, 0, 0, 8, 32);
1250 if (meta->have_timecodes)
1251 skip_bits_long(gb, 32);
1252 frame->is_last = get_bits1(gb);
1253 } else {
1254 frame->is_last = 0;
1255 }
1256 if (frame->type != JPEGXL_FRAME_LF && !frame->is_last)
1257 save_as_ref = get_bits(gb, 2);
1258 if (frame->type == JPEGXL_FRAME_REFERENCE_ONLY ||
1259 (resets_canvas && !frame->is_last && (!duration || save_as_ref)
1260 && frame->type != JPEGXL_FRAME_LF))
1261 skip_bits1(gb); // save before color transform
1262 name_len = 8 * jxl_u32(gb, 0, 0, 16, 48, 0, 4, 5, 10);
1263 if (get_bits_left(gb) < name_len)
1265 skip_bits_long(gb, name_len);
1266 }
1267
1268 if (!all_default) {
1269 int restd = get_bits1(gb), gab = 1;
1270 if (!restd)
1271 gab = get_bits1(gb);
1272 if (gab && !restd && get_bits1(gb))
1273 // gab custom
1274 skip_bits_long(gb, 16 * 6);
1275 if (get_bits_left(gb) < 0)
1277 if (!restd) {
1278 int epf = get_bits(gb, 2);
1279 if (epf) {
1280 if (frame->encoding == JPEGXL_ENC_VARDCT && get_bits1(gb)) {
1281 skip_bits_long(gb, 16 * 8); // custom epf sharpness
1282 if (get_bits_left(gb) < 0)
1284 }
1285 if (get_bits1(gb)) {
1286 skip_bits_long(gb, 3 * 16 + 32); // custom epf weight
1287 if (get_bits_left(gb) < 0)
1289 }
1290 if (get_bits1(gb)) { // custom epf sigma
1291 if (frame->encoding == JPEGXL_ENC_VARDCT)
1292 skip_bits(gb, 16);
1293 skip_bits_long(gb, 16 * 3);
1294 if (get_bits_left(gb) < 0)
1296 }
1297 if (frame->encoding == JPEGXL_ENC_MODULAR)
1298 skip_bits(gb, 16);
1299 }
1300 ret = skip_extensions(gb);
1301 if (ret < 0)
1302 return ret;
1303 }
1304 ret = skip_extensions(gb);
1305 if (ret < 0)
1306 return ret;
1307 }
1308
1309 width = div_ceil(div_ceil(width, upsampling), 1 << (3 * lf_level));
1310 height = div_ceil(div_ceil(height, upsampling), 1 << (3 * lf_level));
1311 group_dim = 128 << group_size_shift;
1312 lf_group_dim = group_dim << 3;
1313 num_groups = div_ceil(width, group_dim) * div_ceil(height, group_dim);
1314 num_lf_groups = div_ceil(width, lf_group_dim) * div_ceil(height, lf_group_dim);
1315 if (num_groups == 1 && num_passes == 1)
1316 toc_count = 1;
1317 else
1318 toc_count = 2 + num_lf_groups + num_groups * num_passes;
1319
1320 // permuted toc
1321 if (get_bits1(gb)) {
1323 int64_t end, lehmer = 0;
1324 /* parser sanity check to prevent TOC perm from spinning cpu */
1325 if (width > meta->coded_width * 8 || height > meta->coded_height * 8) {
1326 av_log(avctx, AV_LOG_WARNING, "frame of size %" PRIu32 "x%" PRIu32
1327 " exceeds max size of %" PRIu32 "x%" PRIu32 ", aborting parser\n",
1328 width, height, meta->coded_width * 8, meta->coded_height * 8);
1329 return AVERROR_INVALIDDATA;
1330 }
1331 ret = entropy_decoder_init(avctx, gb, &dec, 8);
1332 if (ret < 0)
1333 return ret;
1334 if (get_bits_left(gb) < 0) {
1337 }
1338 end = entropy_decoder_read_symbol(gb, &dec, toc_context(toc_count));
1339 if (end < 0 || end > toc_count) {
1341 return AVERROR_INVALIDDATA;
1342 }
1343 for (uint32_t i = 0; i < end; i++) {
1344 lehmer = entropy_decoder_read_symbol(gb, &dec, toc_context(lehmer));
1345 if (lehmer < 0 || get_bits_left(gb) < 0) {
1347 return lehmer < 0 ? lehmer : AVERROR_BUFFER_TOO_SMALL;
1348 }
1349 }
1351 }
1352 align_get_bits(gb);
1353
1354 for (uint32_t i = 0; i < toc_count; i++) {
1355 frame->body_length += 8 * jxl_u32(gb, 0, 1024, 17408, 4211712, 10, 14, 22, 30);
1356 if (get_bits_left(gb) < 0)
1358 }
1359 align_get_bits(gb);
1360
1361 frame->total_length = frame->body_length + get_bits_count(gb) - start_len;
1362
1363 return 0;
1364}
1365
1366static int skip_boxes(JXLParseContext *ctx, const uint8_t *buf, int buf_size)
1367{
1368 GetByteContext gb;
1369
1370 if (ctx->skip > buf_size)
1372
1373 buf += ctx->skip;
1374 buf_size -= ctx->skip;
1375 bytestream2_init(&gb, buf, buf_size);
1376
1377 while (1) {
1378 uint64_t size;
1379 int head_size = 8;
1380
1381 if (bytestream2_peek_le16(&gb) == FF_JPEGXL_CODESTREAM_SIGNATURE_LE)
1382 break;
1383 if (bytestream2_peek_le64(&gb) == FF_JPEGXL_CONTAINER_SIGNATURE_LE)
1384 break;
1385
1386 if (bytestream2_get_bytes_left(&gb) < 8)
1388
1389 size = bytestream2_get_be32(&gb);
1390 bytestream2_skip(&gb, 4); // tag
1391 if (size == 1) {
1392 if (bytestream2_get_bytes_left(&gb) < 8)
1394 size = bytestream2_get_be64(&gb);
1395 head_size = 16;
1396 }
1397 if (!size)
1398 return AVERROR_INVALIDDATA;
1399 /* invalid ISOBMFF size */
1400 if (size <= head_size || size > INT_MAX - ctx->skip)
1401 return AVERROR_INVALIDDATA;
1402
1403 ctx->skip += size;
1404 bytestream2_skip(&gb, size - head_size);
1405 if (bytestream2_get_bytes_left(&gb) <= 0)
1407 }
1408
1409 return 0;
1410}
1411
1413 const uint8_t *buf, int buf_size)
1414{
1415 int ret, cs_buflen, header_skip;
1416 const uint8_t *cs_buffer;
1417 GetBitContext gb;
1418
1419 if (ctx->skip > buf_size)
1421
1422 buf += ctx->skip;
1423 buf_size -= ctx->skip;
1424
1425 if (ctx->container || AV_RL64(buf) == FF_JPEGXL_CONTAINER_SIGNATURE_LE) {
1426 ctx->container = 1;
1427 ret = ff_jpegxl_collect_codestream_header(buf, buf_size, ctx->cs_buffer,
1428 sizeof(ctx->cs_buffer) - AV_INPUT_BUFFER_PADDING_SIZE, &ctx->copied);
1429 if (ret < 0)
1430 return ret;
1431 ctx->collected_size = ret;
1432 if (!ctx->copied) {
1433 ctx->skip += ret;
1435 }
1436 cs_buffer = ctx->cs_buffer;
1437 cs_buflen = FFMIN(sizeof(ctx->cs_buffer) - AV_INPUT_BUFFER_PADDING_SIZE, ctx->copied);
1438 } else {
1439 cs_buffer = buf;
1440 cs_buflen = buf_size;
1441 }
1442
1443 if (!ctx->codestream_length) {
1444 header_skip = ff_jpegxl_parse_codestream_header(cs_buffer, cs_buflen, &ctx->codestream.meta, 0);
1445 if (header_skip < 0)
1446 return header_skip;
1447 ctx->codestream_length = header_skip;
1448 populate_fields(s, avctx, &ctx->codestream.meta);
1449 }
1450
1451 if (ctx->container)
1452 return ctx->collected_size;
1453
1454 ret = init_get_bits8(&gb, cs_buffer, cs_buflen);
1455 if (ret < 0)
1456 return ret;
1457
1458 skip_bits_long(&gb, ctx->codestream_length);
1459
1460 if (!ctx->skipped_icc && ctx->codestream.meta.have_icc_profile) {
1461 ret = skip_icc_profile(avctx, ctx, &gb);
1462 if (ret < 0)
1463 return ret;
1464 ctx->skipped_icc = 1;
1465 align_get_bits(&gb);
1466 ctx->codestream_length = get_bits_count(&gb);
1467 }
1468
1469 if (get_bits_left(&gb) <= 0)
1471
1472 while (1) {
1473 ret = parse_frame_header(avctx, ctx, &gb);
1474 if (ret < 0)
1475 return ret;
1476 ctx->codestream_length += ctx->codestream.frame.total_length;
1477 if (ctx->codestream.frame.is_last)
1478 return ctx->codestream_length / 8;
1479 if (get_bits_left(&gb) <= ctx->codestream.frame.body_length)
1481 skip_bits_long(&gb, ctx->codestream.frame.body_length);
1482 }
1483}
1484
1486 const uint8_t **poutbuf, int *poutbuf_size,
1487 const uint8_t *buf, int buf_size)
1488{
1489 JXLParseContext *ctx = s->priv_data;
1490 int next = END_NOT_FOUND, ret;
1491 const uint8_t *pbuf = ctx->pc.buffer;
1492 int pindex = ctx->pc.index;
1493
1494 *poutbuf_size = 0;
1495 *poutbuf = NULL;
1496
1497 if (!ctx->pc.index) {
1498 if (ctx->pc.overread)
1499 goto flush;
1500 pbuf = buf;
1501 pindex = buf_size;
1502 }
1503
1504 if ((!ctx->container || !ctx->codestream_length) && !ctx->next) {
1505 int64_t ret64 = try_parse(s, avctx, ctx, pbuf, pindex);
1506 if (ret64 < 0)
1507 goto flush;
1508 ctx->next = ret64;
1509 if (ctx->container)
1510 ctx->skip += ctx->next;
1511 }
1512
1513 if (ctx->container && ctx->next >= 0) {
1514 ret = skip_boxes(ctx, pbuf, pindex);
1515 if (ret < 0) {
1516 if (ret == AVERROR_INVALIDDATA)
1517 ctx->next = -1;
1518 goto flush;
1519 }
1520 ctx->next = ret + ctx->skip;
1521 }
1522
1523 if (ctx->next >= 0)
1524 next = ctx->next - ctx->pc.index;
1525
1526flush:
1527 if (next > buf_size)
1528 next = END_NOT_FOUND;
1529
1530 ret = ff_combine_frame(&ctx->pc, next, &buf, &buf_size);
1531 if (ret < 0)
1532 return buf_size;
1533
1534 *poutbuf = buf;
1535 *poutbuf_size = buf_size;
1536
1537 ctx->codestream_length = 0;
1538 ctx->collected_size = 0;
1539 ctx->container = 0;
1540 ctx->copied = 0;
1541 ctx->skip = 0;
1542 ctx->skipped_icc = 0;
1543 ctx->next = 0;
1544 memset(&ctx->codestream, 0, sizeof(ctx->codestream));
1545
1546 return next;
1547}
1548
static char * split(char *message, char delim)
static AVFormatContext * ctx
static int parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition apv_parser.c:92
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
int32_t
static uint32_t BS_FUNC read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition bytestream.h:158
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition bytestream.h:137
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition bytestream.h:168
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static AVFrame * frame
void(* flush)(AVBSFContext *ctx)
Definition dts2pts.c:610
error code definitions
static const struct @033145243110221005363036244076252070150076110330 constants[]
double value
Definition eval.c:102
static int rle(uint8_t *dst, const uint8_t *src, int compressed_size, int uncompressed_size)
Definition exr.c:217
static const uint8_t bits[8]
Definition fastaudio.c:100
static int64_t duration
Definition ffplay.c:330
bitstream reader API header.
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition get_bits.h:424
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition get_bits.h:645
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition get_bits.h:280
static unsigned int get_bits1(GetBitContext *s)
Definition get_bits.h:391
static void skip_bits(GetBitContext *s, int n)
Definition get_bits.h:383
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition get_bits.h:544
static const uint8_t * align_get_bits(GetBitContext *s)
Definition get_bits.h:560
static int get_bits_count(const GetBitContext *s)
Definition get_bits.h:254
static void skip_bits1(GetBitContext *s)
Definition get_bits.h:416
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
static av_always_inline int get_bitsz(GetBitContext *s, int n)
Read 0-25 bits.
Definition get_bits.h:353
@ AV_CODEC_ID_JPEGXL_ANIM
Definition codec_id.h:322
@ AV_CODEC_ID_JPEGXL
Definition codec_id.h:308
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
#define AVERROR_BUFFER_TOO_SMALL
Buffer too small.
Definition error.h:53
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition error.h:52
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
int index
Definition gxfenc.c:90
#define AV_RL64(p)
@ JPEGXL_WP_DCI
Definition jpegxl.h:73
@ JPEGXL_WP_D65
Definition jpegxl.h:70
@ JPEGXL_BM_MUL
Definition jpegxl.h:47
@ JPEGXL_BM_REPLACE
Definition jpegxl.h:43
@ JPEGXL_BM_BLEND
Definition jpegxl.h:45
@ JPEGXL_BM_MULADD
Definition jpegxl.h:46
#define FF_JPEGXL_CONTAINER_SIGNATURE_LE
Definition jpegxl.h:26
FFJXLFrameEncoding
Definition jpegxl.h:30
@ JPEGXL_ENC_VARDCT
Definition jpegxl.h:31
@ JPEGXL_ENC_MODULAR
Definition jpegxl.h:32
@ JPEGXL_PR_SRGB
Definition jpegxl.h:77
@ JPEGXL_PR_P3
Definition jpegxl.h:80
@ JPEGXL_PR_2100
Definition jpegxl.h:79
@ JPEGXL_CS_RGB
Definition jpegxl.h:63
@ JPEGXL_CS_GRAY
Definition jpegxl.h:64
@ JPEGXL_CS_XYB
Definition jpegxl.h:65
FFJXLFrameType
Definition jpegxl.h:35
@ JPEGXL_FRAME_LF
Definition jpegxl.h:37
@ JPEGXL_FRAME_SKIP_PROGRESSIVE
Definition jpegxl.h:39
@ JPEGXL_FRAME_REGULAR
Definition jpegxl.h:36
@ JPEGXL_FRAME_REFERENCE_ONLY
Definition jpegxl.h:38
FFJXLTransferCharacteristic
Definition jpegxl.h:83
@ JPEGXL_TR_PQ
Definition jpegxl.h:88
@ JPEGXL_TR_SRGB
Definition jpegxl.h:87
@ JPEGXL_TR_DCI
Definition jpegxl.h:89
@ JPEGXL_TR_BT709
Definition jpegxl.h:84
@ JPEGXL_TR_GAMMA
Definition jpegxl.h:91
@ JPEGXL_TR_HLG
Definition jpegxl.h:90
@ JPEGXL_TR_LINEAR
Definition jpegxl.h:86
#define FF_JPEGXL_CODESTREAM_SIGNATURE_LE
Definition jpegxl.h:25
static uint32_t read_ans_symbol(GetBitContext *gb, JXLEntropyDecoder *dec, const JXLSymbolDistribution *dist)
static int jpegxl_parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
static uint32_t toc_context(uint32_t x)
static int skip_boxes(JXLParseContext *ctx, const uint8_t *buf, int buf_size)
static void populate_fields(AVCodecParserContext *s, AVCodecContext *avctx, const FFJXLMetadata *meta)
static int skip_icc_profile(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
static int64_t entropy_decoder_read_symbol(GetBitContext *gb, JXLEntropyDecoder *dec, uint32_t context)
#define div_ceil(x, y)
static const uint8_t prefix_codelen_map[18]
#define clog1p(x)
static int read_dist_clustering(GetBitContext *gb, JXLEntropyDecoder *dec, JXLDistributionBundle *bundle)
#define unpack_signed(x)
static av_always_inline uint32_t jxl_u32(GetBitContext *gb, uint32_t c0, uint32_t c1, uint32_t c2, uint32_t c3, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3)
static int parse_frame_header(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
static int read_hybrid_uint_conf(GetBitContext *gb, JXLHybridUintConf *conf, int log_alphabet_size)
static int read_simple_vlc_prefix(GetBitContext *gb, JXLEntropyDecoder *dec, JXLSymbolDistribution *dist)
const FFCodecParser ff_jpegxl_parser
static void entropy_decoder_close(JXLEntropyDecoder *dec)
static const VLCElem dist_prefix_table[128]
static const VLCElem level0_table[16]
static int gen_alias_map(JXLEntropyDecoder *dec, JXLSymbolDistribution *dist, int log_alphabet_size)
static void dist_bundle_close(JXLDistributionBundle *bundle)
static uint64_t jxl_u64(GetBitContext *gb)
#define vlm(a, b)
static int decode_hybrid_varlen_uint(GetBitContext *gb, JXLEntropyDecoder *dec, const JXLDistributionBundle *bundle, uint32_t context, uint32_t *hybrid_uint)
static int entropy_decoder_init(void *avctx, GetBitContext *gb, JXLEntropyDecoder *dec, int num_dist)
static int read_hybrid_uint(GetBitContext *gb, const JXLHybridUintConf *conf, uint32_t token, uint32_t *hybrid_uint)
static int read_vlc_prefix(GetBitContext *gb, JXLEntropyDecoder *dec, JXLSymbolDistribution *dist)
#define MAX_PREFIX_ALPHABET_SIZE
static av_always_inline uint8_t jxl_u8(GetBitContext *gb)
Read a variable-length 8-bit integer.
static int populate_distribution(GetBitContext *gb, JXLSymbolDistribution *dist, int log_alphabet_size)
static int64_t try_parse(AVCodecParserContext *s, AVCodecContext *avctx, JXLParseContext *ctx, const uint8_t *buf, int buf_size)
static uint32_t read_prefix_symbol(GetBitContext *gb, const JXLSymbolDistribution *dist)
static int read_distribution_bundle(GetBitContext *gb, JXLEntropyDecoder *dec, JXLDistributionBundle *bundle, int num_dist, int disallow_lz77)
#define JXL_FLAG_USE_LF_FRAME
static uint32_t icc_context(uint64_t i, uint32_t b1, uint32_t b2)
static int skip_extensions(GetBitContext *gb)
unsigned offset
Definition libaomenc.c:763
static int shift(int a, int b)
Definition bonk.c:261
#define u(width, name, range_min, range_max)
Definition cbs_apv.c:68
int ff_jpegxl_collect_codestream_header(const uint8_t *input_buffer, int input_len, uint8_t *buffer, int buflen, int *copied)
int ff_jpegxl_parse_codestream_header(const uint8_t *buf, int buflen, FFJXLMetadata *meta, int validate)
Macro definitions for various function/variable attributes.
#define av_always_inline
Definition attributes.h:72
Utility Preprocessor macros.
#define FFSWAP(type, a, b)
Definition macros.h:52
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
#define FFMIN3(a, b, c)
Definition macros.h:50
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:264
Memory handling functions.
static const uint64_t c2
Definition murmur3.c:53
static const uint64_t c1
Definition murmur3.c:52
static float distance(float x, float y, int band)
#define av_malloc(s)
Definition ops_static.c:52
av_cold void ff_parse_close(AVCodecParserContext *s)
Definition parser.c:300
int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size)
Combine the (truncated) bitstream to a complete frame.
Definition parser.c:213
#define END_NOT_FOUND
Definition parser.h:40
#define PARSER_CODEC_LIST(...)
pixel format definitions
#define AV_PIX_FMT_RGBF32
Definition pixfmt.h:632
#define AV_PIX_FMT_RGBAF32
Definition pixfmt.h:633
#define AV_PIX_FMT_YA16
Definition pixfmt.h:530
@ AVALPHA_MODE_STRAIGHT
Alpha channel is independent of color values.
Definition pixfmt.h:819
@ AVALPHA_MODE_PREMULTIPLIED
Alpha channel is multiplied into color values.
Definition pixfmt.h:818
#define AV_PIX_FMT_RGBA64
Definition pixfmt.h:535
#define AV_PIX_FMT_RGB48
Definition pixfmt.h:531
#define AV_PIX_FMT_GRAYF32
Definition pixfmt.h:588
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition pixfmt.h:75
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition pixfmt.h:100
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition pixfmt.h:140
#define AV_PIX_FMT_GRAY16
Definition pixfmt.h:528
@ AVCOL_PRI_SMPTE432
SMPTE ST 432-1 (2010) / P3 D65 / Display P3.
Definition pixfmt.h:657
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition pixfmt.h:644
@ AVCOL_PRI_UNSPECIFIED
Definition pixfmt.h:645
@ AVCOL_PRI_SMPTE431
SMPTE ST 431-2 (2011) / DCI P3.
Definition pixfmt.h:656
@ AVCOL_PRI_BT2020
ITU-R BT2020.
Definition pixfmt.h:653
@ AVCOL_TRC_SMPTEST2084
Definition pixfmt.h:690
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
Definition pixfmt.h:677
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition pixfmt.h:681
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition pixfmt.h:678
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
Definition pixfmt.h:693
@ AVCOL_TRC_SMPTE428
SMPTE ST 428-1.
Definition pixfmt.h:691
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition pixfmt.h:686
@ AVCOL_TRC_UNSPECIFIED
Definition pixfmt.h:675
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition pixfmt.h:674
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition pixfmt.h:707
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
unsigned int pos
Definition spdifenc.c:431
main external API structure.
Definition avcodec.h:443
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:657
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:671
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:664
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition avcodec.h:1937
uint32_t height
uint32_t coded_width
uint32_t num_extra_channels
uint32_t width
FFJXLWhitePoint wp
FFJXLPrimaries primaries
uint32_t coded_height
FFJXLTransferCharacteristic trc
FFJXLColorSpace csp
FFJXLMetadata meta
JXLHybridUintConf lz_len_conf
JXLSymbolDistribution * dists
JXLDistributionBundle bundle
FFJXLFrameType type
FFJXLFrameEncoding encoding
uint32_t body_length
uint32_t total_length
int64_t codestream_length
uint8_t cs_buffer[4096+AV_INPUT_BUFFER_PADDING_SIZE]
ParseContext pc
JXLCodestream codestream
uint16_t symbols[258]
JXLHybridUintConf config
uint16_t offsets[258]
uint16_t cutoffs[258]
Definition vlc.h:32
Definition vlc.h:50
VLCElem * table
Definition vlc.h:52
int bits
Definition vlc.h:51
Definition swscale.c:71
#define av_malloc_array(a, b)
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
int size
static double b1(void *priv, double x, double y)
Definition vf_xfade.c:2034
static double b2(void *priv, double x, double y)
Definition vf_xfade.c:2035
int ff_vlc_init_from_lengths(VLC *vlc, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
Definition vlc.c:306
void ff_vlc_free(VLC *vlc)
Definition vlc.c:580
#define VLC_INIT_LE
Definition vlc.h:197
int len