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