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