FFmpeg
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 
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 #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 
57 typedef struct JXLHybridUintConf {
59  uint32_t msb_in_token;
60  uint32_t lsb_in_token;
62 
63 typedef 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 */
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;
92 
93 typedef struct JXLDistributionBundle {
94  /* lz77 flags */
96  uint32_t lz77_min_symbol;
97  uint32_t lz77_min_length;
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 */
108 
109  /* whether to use brotli prefixes or ans */
111  /* bundle log alphabet size, dist ones may be smaller */
114 
115 typedef 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 
137 typedef struct JXLFrame {
140 
141  int is_last;
143 
144  uint32_t total_length;
145  uint32_t body_length;
146 } JXLFrame;
147 
148 typedef struct JXLCodestream {
151 } JXLCodestream;
152 
153 typedef struct JXLParseContext {
156 
157  /* using ISOBMFF-based container */
160  int copied;
165 
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  */
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() */
230 static 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 
260 static 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 
278 static 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 
300 static 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 
383 static 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 
566 static 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 
825 end:
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);
923  dist_bundle_close(&dec->bundle);
924 }
925 
926 static 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 
955 static 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 
989 static 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:
1044  avctx->color_trc = AVCOL_TRC_SMPTE428;
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)
1054  avctx->color_trc = AVCOL_TRC_GAMMA22;
1055  else if (meta->trc > 35614 && meta->trc < 35814)
1056  avctx->color_trc = AVCOL_TRC_GAMMA28;
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
1076  s->format = meta->have_alpha ? AV_PIX_FMT_RGBAF32 : AV_PIX_FMT_RGBF32;
1077  }
1078 
1079  if (meta->have_alpha) {
1082  }
1083 }
1084 
1085 static int skip_icc_profile(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
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) {
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) {
1128  goto end;
1129  }
1130  }
1131  } else if (output_size < 132) {
1133  goto end;
1134  }
1135  }
1136 
1137  ret = 0;
1138 
1139 end:
1140  entropy_decoder_close(&dec);
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)
1150  return AVERROR_BUFFER_TOO_SMALL;
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)
1159  return AVERROR_BUFFER_TOO_SMALL;
1160  }
1161 
1162  if (extensions_len > INT_MAX || get_bits_left(gb) < extensions_len)
1163  return AVERROR_BUFFER_TOO_SMALL;
1164 
1165  skip_bits_long(gb, extensions_len);
1166 
1167  return 0;
1168 }
1169 
1170 static int parse_frame_header(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
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)
1199  return AVERROR_BUFFER_TOO_SMALL;
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)
1232  return AVERROR_BUFFER_TOO_SMALL;
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)
1246  return AVERROR_BUFFER_TOO_SMALL;
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)
1264  return AVERROR_BUFFER_TOO_SMALL;
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)
1276  return AVERROR_BUFFER_TOO_SMALL;
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)
1283  return AVERROR_BUFFER_TOO_SMALL;
1284  }
1285  if (get_bits1(gb)) {
1286  skip_bits_long(gb, 3 * 16 + 32); // custom epf weight
1287  if (get_bits_left(gb) < 0)
1288  return AVERROR_BUFFER_TOO_SMALL;
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)
1295  return AVERROR_BUFFER_TOO_SMALL;
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)) {
1322  JXLEntropyDecoder dec;
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) {
1335  entropy_decoder_close(&dec);
1336  return AVERROR_BUFFER_TOO_SMALL;
1337  }
1338  end = entropy_decoder_read_symbol(gb, &dec, toc_context(toc_count));
1339  if (end < 0 || end > toc_count) {
1340  entropy_decoder_close(&dec);
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) {
1346  entropy_decoder_close(&dec);
1347  return lehmer < 0 ? lehmer : AVERROR_BUFFER_TOO_SMALL;
1348  }
1349  }
1350  entropy_decoder_close(&dec);
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)
1357  return AVERROR_BUFFER_TOO_SMALL;
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 
1366 static int skip_boxes(JXLParseContext *ctx, const uint8_t *buf, int buf_size)
1367 {
1368  GetByteContext gb;
1369 
1370  if (ctx->skip > buf_size)
1371  return AVERROR_BUFFER_TOO_SMALL;
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)
1387  return AVERROR_BUFFER_TOO_SMALL;
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)
1393  return AVERROR_BUFFER_TOO_SMALL;
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)
1406  return AVERROR_BUFFER_TOO_SMALL;
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)
1420  return AVERROR_BUFFER_TOO_SMALL;
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;
1434  return AVERROR_BUFFER_TOO_SMALL;
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)
1470  return AVERROR_BUFFER_TOO_SMALL;
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)
1480  return AVERROR_BUFFER_TOO_SMALL;
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 
1526 flush:
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 
1551  .priv_data_size = sizeof(JXLParseContext),
1552  .parse = jpegxl_parse,
1553  .close = ff_parse_close,
1554 };
flags
const SwsFlags flags[]
Definition: swscale.c:61
JPEGXL_BM_REPLACE
@ JPEGXL_BM_REPLACE
Definition: jpegxl.h:43
skip_extensions
static int skip_extensions(GetBitContext *gb)
Definition: jpegxl_parser.c:1145
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:280
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
ff_vlc_init_from_lengths
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
AV_CODEC_ID_JPEGXL_ANIM
@ AV_CODEC_ID_JPEGXL_ANIM
Definition: codec_id.h:331
gen_alias_map
static int gen_alias_map(JXLEntropyDecoder *dec, JXLSymbolDistribution *dist, int log_alphabet_size)
Definition: jpegxl_parser.c:566
AVCodecContext::alpha_mode
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition: avcodec.h:1932
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:694
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AV_PIX_FMT_YA8
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition: pixfmt.h:140
AVALPHA_MODE_STRAIGHT
@ AVALPHA_MODE_STRAIGHT
Alpha channel is independent of color values.
Definition: pixfmt.h:813
AVALPHA_MODE_PREMULTIPLIED
@ AVALPHA_MODE_PREMULTIPLIED
Alpha channel is multiplied into color values.
Definition: pixfmt.h:812
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:659
JXLHybridUintConf::lsb_in_token
uint32_t lsb_in_token
Definition: jpegxl_parser.c:60
JXLParseContext::container
int container
Definition: jpegxl_parser.c:158
ff_jpegxl_parse_codestream_header
int ff_jpegxl_parse_codestream_header(const uint8_t *buf, int buflen, FFJXLMetadata *meta, int validate)
Definition: jpegxl_parse.c:258
GetByteContext
Definition: bytestream.h:33
JXLParseContext::cs_buffer
uint8_t cs_buffer[4096+AV_INPUT_BUFFER_PADDING_SIZE]
Definition: jpegxl_parser.c:166
constants
static const struct @493 constants[]
AV_RL64
uint64_t_TMPL AV_RL64
Definition: bytestream.h:91
FFJXLMetadata::coded_width
uint32_t coded_width
Definition: jpegxl_parse.h:34
AVCOL_TRC_LINEAR
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition: pixfmt.h:675
ff_parse_close
av_cold void ff_parse_close(AVCodecParserContext *s)
Definition: parser.c:298
JXLSymbolDistribution::symbols
uint16_t symbols[258]
Definition: jpegxl_parser.c:85
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:424
JXLDistributionBundle::lz77_min_length
uint32_t lz77_min_length
Definition: jpegxl_parser.c:97
JXLParseContext::codestream
JXLCodestream codestream
Definition: jpegxl_parser.c:155
int64_t
long long int64_t
Definition: coverity.c:34
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:254
populate_distribution
static int populate_distribution(GetBitContext *gb, JXLSymbolDistribution *dist, int log_alphabet_size)
Definition: jpegxl_parser.c:383
FFJXLMetadata::alpha_associated
int alpha_associated
Definition: jpegxl_parse.h:38
read_distribution_bundle
static int read_distribution_bundle(GetBitContext *gb, JXLEntropyDecoder *dec, JXLDistributionBundle *bundle, int num_dist, int disallow_lz77)
Definition: jpegxl_parser.c:832
parser_internal.h
JXLSymbolDistribution::cutoffs
uint16_t cutoffs[258]
Definition: jpegxl_parser.c:83
mode
Definition: swscale.c:56
read_hybrid_uint
static int read_hybrid_uint(GetBitContext *gb, const JXLHybridUintConf *conf, uint32_t token, uint32_t *hybrid_uint)
Definition: jpegxl_parser.c:278
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:652
JPEGXL_BM_MULADD
@ JPEGXL_BM_MULADD
Definition: jpegxl.h:46
u
#define u(width, name, range_min, range_max)
Definition: cbs_apv.c:68
JXLFrame::is_last
int is_last
Definition: jpegxl_parser.c:141
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:669
jpegxl_parse
static int jpegxl_parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition: jpegxl_parser.c:1485
jxl_u64
static uint64_t jxl_u64(GetBitContext *gb)
Definition: jpegxl_parser.c:230
FFJXLMetadata::have_timecodes
int have_timecodes
Definition: jpegxl_parse.h:53
JXLEntropyDecoder::num_to_copy
uint32_t num_to_copy
Definition: jpegxl_parser.c:121
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition: pixfmt.h:701
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
JPEGXL_CS_RGB
@ JPEGXL_CS_RGB
Definition: jpegxl.h:63
c1
static const uint64_t c1
Definition: murmur3.c:52
jxl_u8
static av_always_inline uint8_t jxl_u8(GetBitContext *gb)
Read a variable-length 8-bit integer.
Definition: jpegxl_parser.c:203
unpack_signed
#define unpack_signed(x)
Definition: jpegxl_parser.c:53
JPEGXL_PR_SRGB
@ JPEGXL_PR_SRGB
Definition: jpegxl.h:77
entropy_decoder_read_symbol
static int64_t entropy_decoder_read_symbol(GetBitContext *gb, JXLEntropyDecoder *dec, uint32_t context)
Definition: jpegxl_parser.c:943
rle
static int rle(uint8_t *dst, const uint8_t *src, int compressed_size, int uncompressed_size)
Definition: exr.c:225
clog1p
#define clog1p(x)
Definition: jpegxl_parser.c:52
JPEGXL_FRAME_REGULAR
@ JPEGXL_FRAME_REGULAR
Definition: jpegxl.h:36
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
FFJXLMetadata::primaries
FFJXLPrimaries primaries
Definition: jpegxl_parse.h:47
FFJXLMetadata
Definition: jpegxl_parse.h:31
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:383
FFJXLFrameEncoding
FFJXLFrameEncoding
Definition: jpegxl.h:30
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:136
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
JPEGXL_WP_DCI
@ JPEGXL_WP_DCI
Definition: jpegxl.h:73
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
JXLFrame::body_length
uint32_t body_length
Definition: jpegxl_parser.c:145
FF_JPEGXL_CONTAINER_SIGNATURE_LE
#define FF_JPEGXL_CONTAINER_SIGNATURE_LE
Definition: jpegxl.h:26
ParseContext
Definition: parser.h:28
JXLDistributionBundle::cluster_map
uint8_t * cluster_map
Definition: jpegxl_parser.c:101
AVCOL_TRC_IEC61966_2_1
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:680
b1
static double b1(void *priv, double x, double y)
Definition: vf_xfade.c:2034
JXLFrame::encoding
FFJXLFrameEncoding encoding
Definition: jpegxl_parser.c:139
macros.h
JXLSymbolDistribution
Definition: jpegxl_parser.c:63
GetBitContext
Definition: get_bits.h:109
AVCOL_TRC_GAMMA28
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition: pixfmt.h:672
read_hybrid_uint_conf
static int read_hybrid_uint_conf(GetBitContext *gb, JXLHybridUintConf *conf, int log_alphabet_size)
Definition: jpegxl_parser.c:260
JPEGXL_TR_BT709
@ JPEGXL_TR_BT709
Definition: jpegxl.h:84
AVERROR_BUFFER_TOO_SMALL
#define AVERROR_BUFFER_TOO_SMALL
Buffer too small.
Definition: error.h:53
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:522
FFJXLMetadata::num_extra_channels
uint32_t num_extra_channels
Definition: jpegxl_parse.h:54
JXLDistributionBundle::lz77_enabled
int lz77_enabled
Definition: jpegxl_parser.c:95
JXLDistributionBundle::lz77_min_symbol
uint32_t lz77_min_symbol
Definition: jpegxl_parser.c:96
JXLDistributionBundle::num_dist
int num_dist
Definition: jpegxl_parser.c:103
JXLEntropyDecoder::num_decoded
uint32_t num_decoded
Definition: jpegxl_parser.c:123
AVCOL_TRC_GAMMA22
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
Definition: pixfmt.h:671
JXLCodestream::frame
JXLFrame frame
Definition: jpegxl_parser.c:150
JXLSymbolDistribution::uniq_pos
int uniq_pos
Definition: jpegxl_parser.c:90
JXLSymbolDistribution::vlc
VLC vlc
Definition: jpegxl_parser.c:72
JXLCodestream
Definition: jpegxl_parser.c:148
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:645
JXLFrame
Definition: jpegxl_parser.c:137
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:544
dist_bundle_close
static void dist_bundle_close(JXLDistributionBundle *bundle)
Definition: jpegxl_parser.c:483
codec_id.h
JPEGXL_CS_GRAY
@ JPEGXL_CS_GRAY
Definition: jpegxl.h:64
duration
int64_t duration
Definition: movenc.c:65
populate_fields
static void populate_fields(AVCodecParserContext *s, AVCodecContext *avctx, const FFJXLMetadata *meta)
Definition: jpegxl_parser.c:994
JXLParseContext::pc
ParseContext pc
Definition: jpegxl_parser.c:154
JXLCodestream::meta
FFJXLMetadata meta
Definition: jpegxl_parser.c:149
JPEGXL_ENC_VARDCT
@ JPEGXL_ENC_VARDCT
Definition: jpegxl.h:31
s
#define s(width, name)
Definition: cbs_vp9.c:198
VLC_INIT_LE
#define VLC_INIT_LE
Definition: vlc.h:197
JXLHybridUintConf::msb_in_token
uint32_t msb_in_token
Definition: jpegxl_parser.c:59
FFJXLMetadata::height
uint32_t height
Definition: jpegxl_parse.h:33
FFJXLFrameType
FFJXLFrameType
Definition: jpegxl.h:35
bits
uint8_t bits
Definition: vp3data.h:128
JPEGXL_FRAME_LF
@ JPEGXL_FRAME_LF
Definition: jpegxl.h:37
JXLFrame::type
FFJXLFrameType type
Definition: jpegxl_parser.c:138
div_ceil
#define div_ceil(x, y)
Definition: jpegxl_parser.c:54
FFJXLTransferCharacteristic
FFJXLTransferCharacteristic
Definition: jpegxl.h:83
ctx
AVFormatContext * ctx
Definition: movenc.c:49
FFJXLMetadata::coded_height
uint32_t coded_height
Definition: jpegxl_parse.h:35
get_bits.h
JXLParseContext::copied
int copied
Definition: jpegxl_parser.c:160
jpegxl.h
AV_PIX_FMT_RGBF32
#define AV_PIX_FMT_RGBF32
Definition: pixfmt.h:626
JXLParseContext::skipped_icc
int skipped_icc
Definition: jpegxl_parser.c:163
AV_PIX_FMT_GRAYF32
#define AV_PIX_FMT_GRAYF32
Definition: pixfmt.h:582
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:639
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:100
JXLSymbolDistribution::freq
uint32_t freq[258]
Definition: jpegxl_parser.c:81
if
if(ret)
Definition: filter_design.txt:179
JXLDistributionBundle
Definition: jpegxl_parser.c:93
context
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your context
Definition: writing_filters.txt:91
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:529
JXLEntropyDecoder::bundle
JXLDistributionBundle bundle
Definition: jpegxl_parser.c:131
NULL
#define NULL
Definition: coverity.c:32
JXLSymbolDistribution::default_symbol
uint32_t default_symbol
Definition: jpegxl_parser.c:74
JPEGXL_FRAME_SKIP_PROGRESSIVE
@ JPEGXL_FRAME_SKIP_PROGRESSIVE
Definition: jpegxl.h:39
JPEGXL_TR_DCI
@ JPEGXL_TR_DCI
Definition: jpegxl.h:89
dist_prefix_table
static const VLCElem dist_prefix_table[128]
Definition: jpegxl_parser.c:176
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition: pixfmt.h:638
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:391
JPEGXL_TR_LINEAR
@ JPEGXL_TR_LINEAR
Definition: jpegxl.h:86
JXLSymbolDistribution::config
JXLHybridUintConf config
Definition: jpegxl_parser.c:64
jxl_u32
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)
Definition: jpegxl_parser.c:214
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:552
icc_context
static uint32_t icc_context(uint64_t i, uint32_t b1, uint32_t b2)
Definition: jpegxl_parser.c:955
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
JXLHybridUintConf::split_exponent
int split_exponent
Definition: jpegxl_parser.c:58
get_vlc2
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:651
parse
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:46
JXL_FLAG_USE_LF_FRAME
#define JXL_FLAG_USE_LF_FRAME
Definition: jpegxl_parser.c:47
JXLFrame::full_frame
int full_frame
Definition: jpegxl_parser.c:142
JXLEntropyDecoder::state
int64_t state
Definition: jpegxl_parser.c:118
index
int index
Definition: gxfenc.c:90
error.h
AVCOL_PRI_BT2020
@ AVCOL_PRI_BT2020
ITU-R BT2020.
Definition: pixfmt.h:647
JPEGXL_BM_MUL
@ JPEGXL_BM_MUL
Definition: jpegxl.h:47
AVCOL_PRI_SMPTE431
@ AVCOL_PRI_SMPTE431
SMPTE ST 431-2 (2011) / DCI P3.
Definition: pixfmt.h:650
JPEGXL_PR_2100
@ JPEGXL_PR_2100
Definition: jpegxl.h:79
JPEGXL_TR_HLG
@ JPEGXL_TR_HLG
Definition: jpegxl.h:90
read_ans_symbol
static uint32_t read_ans_symbol(GetBitContext *gb, JXLEntropyDecoder *dec, const JXLSymbolDistribution *dist)
Definition: jpegxl_parser.c:308
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:75
decode_hybrid_varlen_uint
static int decode_hybrid_varlen_uint(GetBitContext *gb, JXLEntropyDecoder *dec, const JXLDistributionBundle *bundle, uint32_t context, uint32_t *hybrid_uint)
Definition: jpegxl_parser.c:328
try_parse
static int64_t try_parse(AVCodecParserContext *s, AVCodecContext *avctx, JXLParseContext *ctx, const uint8_t *buf, int buf_size)
Definition: jpegxl_parser.c:1412
toc_context
static uint32_t toc_context(uint32_t x)
Definition: jpegxl_parser.c:989
height
#define height
Definition: dsp.h:89
JPEGXL_TR_SRGB
@ JPEGXL_TR_SRGB
Definition: jpegxl.h:87
shift
static int shift(int a, int b)
Definition: bonk.c:261
FFJXLMetadata::xyb_encoded
int xyb_encoded
Definition: jpegxl_parse.h:51
AVCOL_TRC_SMPTEST2084
@ AVCOL_TRC_SMPTEST2084
Definition: pixfmt.h:684
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:525
size
int size
Definition: twinvq_data.h:10344
JXLParseContext::skip
int64_t skip
Definition: jpegxl_parser.c:159
VLCElem
Definition: vlc.h:32
JXLEntropyDecoder
Definition: jpegxl_parser.c:115
FFJXLMetadata::animation_offset
int animation_offset
Definition: jpegxl_parse.h:43
JXLDistributionBundle::use_prefix_code
int use_prefix_code
Definition: jpegxl_parser.c:110
split
static char * split(char *message, char delim)
Definition: af_channelmap.c:89
b2
static double b2(void *priv, double x, double y)
Definition: vf_xfade.c:2035
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
attributes.h
FFJXLMetadata::csp
FFJXLColorSpace csp
Definition: jpegxl_parse.h:45
JXLSymbolDistribution::alphabet_size
int alphabet_size
Definition: jpegxl_parser.c:67
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:416
prefix_codelen_map
static const uint8_t prefix_codelen_map[18]
Definition: jpegxl_parser.c:195
FFJXLMetadata::width
uint32_t width
Definition: jpegxl_parse.h:32
ff_combine_frame
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:211
FFCodecParser
Definition: parser_internal.h:29
AVCOL_TRC_BT709
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition: pixfmt.h:668
skip_icc_profile
static int skip_icc_profile(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
Definition: jpegxl_parser.c:1085
JXLDistributionBundle::lz_len_conf
JXLHybridUintConf lz_len_conf
Definition: jpegxl_parser.c:98
JXLFrame::total_length
uint32_t total_length
Definition: jpegxl_parser.c:144
JXLParseContext
Definition: jpegxl_parser.c:153
entropy_decoder_init
static int entropy_decoder_init(void *avctx, GetBitContext *gb, JXLEntropyDecoder *dec, int num_dist)
Definition: jpegxl_parser.c:926
skip_boxes
static int skip_boxes(JXLParseContext *ctx, const uint8_t *buf, int buf_size)
Definition: jpegxl_parser.c:1366
AV_PIX_FMT_YA16
#define AV_PIX_FMT_YA16
Definition: pixfmt.h:524
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
JXLSymbolDistribution::log_bucket_size
int log_bucket_size
Definition: jpegxl_parser.c:65
FFMIN3
#define FFMIN3(a, b, c)
Definition: macros.h:50
vlm
#define vlm(a, b)
Definition: jpegxl_parser.c:55
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
FF_JPEGXL_CODESTREAM_SIGNATURE_LE
#define FF_JPEGXL_CODESTREAM_SIGNATURE_LE
Definition: jpegxl.h:25
av_always_inline
#define av_always_inline
Definition: attributes.h:63
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
AV_CODEC_ID_JPEGXL
@ AV_CODEC_ID_JPEGXL
Definition: codec_id.h:317
JXLHybridUintConf
Definition: jpegxl_parser.c:57
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
JPEGXL_FRAME_REFERENCE_ONLY
@ JPEGXL_FRAME_REFERENCE_ONLY
Definition: jpegxl.h:38
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
parser.h
len
int len
Definition: vorbis_enc_data.h:426
JXLDistributionBundle::dists
JXLSymbolDistribution * dists
Definition: jpegxl_parser.c:106
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:703
entropy_decoder_close
static void entropy_decoder_close(JXLEntropyDecoder *dec)
Definition: jpegxl_parser.c:918
PARSER_CODEC_LIST
#define PARSER_CODEC_LIST(...)
Definition: parser_internal.h:76
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
JXLDistributionBundle::num_clusters
int num_clusters
Definition: jpegxl_parser.c:107
AVCodecParserContext
Definition: avcodec.h:2575
JPEGXL_WP_D65
@ JPEGXL_WP_D65
Definition: jpegxl.h:70
VLC::bits
int bits
Definition: vlc.h:51
FFJXLMetadata::wp
FFJXLWhitePoint wp
Definition: jpegxl_parse.h:46
ff_vlc_free
void ff_vlc_free(VLC *vlc)
Definition: vlc.c:580
ret
ret
Definition: filter_design.txt:187
pixfmt.h
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
JXLSymbolDistribution::log_alphabet_size
int log_alphabet_size
Definition: jpegxl_parser.c:69
align_get_bits
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:560
pos
unsigned int pos
Definition: spdifenc.c:414
read_simple_vlc_prefix
static int read_simple_vlc_prefix(GetBitContext *gb, JXLEntropyDecoder *dec, JXLSymbolDistribution *dist)
Definition: jpegxl_parser.c:628
FFJXLMetadata::have_alpha
int have_alpha
Definition: jpegxl_parse.h:37
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
JPEGXL_PR_P3
@ JPEGXL_PR_P3
Definition: jpegxl.h:80
JPEGXL_TR_GAMMA
@ JPEGXL_TR_GAMMA
Definition: jpegxl.h:91
AVCodecContext
main external API structure.
Definition: avcodec.h:431
c2
static const uint64_t c2
Definition: murmur3.c:53
AVCOL_TRC_ARIB_STD_B67
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
Definition: pixfmt.h:687
JXLDistributionBundle::log_alphabet_size
int log_alphabet_size
Definition: jpegxl_parser.c:112
JXLParseContext::collected_size
int64_t collected_size
Definition: jpegxl_parser.c:161
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
VLC
Definition: vlc.h:50
JPEGXL_ENC_MODULAR
@ JPEGXL_ENC_MODULAR
Definition: jpegxl.h:32
parse_frame_header
static int parse_frame_header(void *avctx, JXLParseContext *ctx, GetBitContext *gb)
Definition: jpegxl_parser.c:1170
JXLSymbolDistribution::offsets
uint16_t offsets[258]
Definition: jpegxl_parser.c:87
JXLEntropyDecoder::window
uint32_t * window
Definition: jpegxl_parser.c:128
VLC::table
VLCElem * table
Definition: vlc.h:52
AV_PIX_FMT_RGBAF32
#define AV_PIX_FMT_RGBAF32
Definition: pixfmt.h:627
level0_table
static const VLCElem level0_table[16]
Definition: jpegxl_parser.c:170
JXLEntropyDecoder::logctx
void * logctx
Definition: jpegxl_parser.c:134
mem.h
get_bitsz
static av_always_inline int get_bitsz(GetBitContext *s, int n)
Read 0-25 bits.
Definition: get_bits.h:353
MAX_PREFIX_ALPHABET_SIZE
#define MAX_PREFIX_ALPHABET_SIZE
Definition: jpegxl_parser.c:50
JPEGXL_BM_BLEND
@ JPEGXL_BM_BLEND
Definition: jpegxl.h:45
AVCOL_PRI_SMPTE432
@ AVCOL_PRI_SMPTE432
SMPTE ST 432-1 (2010) / P3 D65 / Display P3.
Definition: pixfmt.h:651
JPEGXL_TR_PQ
@ JPEGXL_TR_PQ
Definition: jpegxl.h:88
read_dist_clustering
static int read_dist_clustering(GetBitContext *gb, JXLEntropyDecoder *dec, JXLDistributionBundle *bundle)
Definition: jpegxl_parser.c:496
END_NOT_FOUND
#define END_NOT_FOUND
Definition: parser.h:40
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
vlc.h
FFJXLMetadata::bit_depth
int bit_depth
Definition: jpegxl_parse.h:36
read_vlc_prefix
static int read_vlc_prefix(GetBitContext *gb, JXLEntropyDecoder *dec, JXLSymbolDistribution *dist)
Definition: jpegxl_parser.c:686
JXLParseContext::codestream_length
int64_t codestream_length
Definition: jpegxl_parser.c:162
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
distance
static float distance(float x, float y, int band)
Definition: nellymoserenc.c:231
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
jpegxl_parse.h
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
AVCOL_TRC_SMPTE428
@ AVCOL_TRC_SMPTE428
SMPTE ST 428-1.
Definition: pixfmt.h:685
FFJXLMetadata::trc
FFJXLTransferCharacteristic trc
Definition: jpegxl_parse.h:48
JXLEntropyDecoder::copy_pos
uint32_t copy_pos
Definition: jpegxl_parser.c:122
width
#define width
Definition: dsp.h:89
ff_jpegxl_parser
const FFCodecParser ff_jpegxl_parser
Definition: jpegxl_parser.c:1549
JPEGXL_CS_XYB
@ JPEGXL_CS_XYB
Definition: jpegxl.h:65
JXLParseContext::next
int64_t next
Definition: jpegxl_parser.c:164
ff_jpegxl_collect_codestream_header
int ff_jpegxl_collect_codestream_header(const uint8_t *input_buffer, int input_len, uint8_t *buffer, int buflen, int *copied)
Definition: jpegxl_parse.c:452
read
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.
Definition: bitstream_template.h:239
read_prefix_symbol
static uint32_t read_prefix_symbol(GetBitContext *gb, const JXLSymbolDistribution *dist)
Definition: jpegxl_parser.c:300
intmath.h