FFmpeg
Loading...
Searching...
No Matches
av1dec.c
Go to the documentation of this file.
1/*
2 * AV1 video decoder
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include "config_components.h"
22
27#include "libavutil/mem.h"
28#include "libavutil/pixdesc.h"
29#include "libavutil/opt.h"
30#include "avcodec.h"
31#include "av1_parse.h"
32#include "av1dec.h"
33#include "atsc_a53.h"
34#include "bytestream.h"
35#include "codec_internal.h"
36#include "decode.h"
37#include "hwaccel_internal.h"
38#include "internal.h"
39#include "itut35.h"
40#include "hwconfig.h"
41#include "profiles.h"
42#include "progressframe.h"
43#include "libavutil/refstruct.h"
44
45/** same with Div_Lut defined in spec 7.11.3.7 */
46static const uint16_t div_lut[AV1_DIV_LUT_NUM] = {
47 16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768,
48 15709, 15650, 15592, 15534, 15477, 15420, 15364, 15308, 15252, 15197, 15142,
49 15087, 15033, 14980, 14926, 14873, 14821, 14769, 14717, 14665, 14614, 14564,
50 14513, 14463, 14413, 14364, 14315, 14266, 14218, 14170, 14122, 14075, 14028,
51 13981, 13935, 13888, 13843, 13797, 13752, 13707, 13662, 13618, 13574, 13530,
52 13487, 13443, 13400, 13358, 13315, 13273, 13231, 13190, 13148, 13107, 13066,
53 13026, 12985, 12945, 12906, 12866, 12827, 12788, 12749, 12710, 12672, 12633,
54 12596, 12558, 12520, 12483, 12446, 12409, 12373, 12336, 12300, 12264, 12228,
55 12193, 12157, 12122, 12087, 12053, 12018, 11984, 11950, 11916, 11882, 11848,
56 11815, 11782, 11749, 11716, 11683, 11651, 11619, 11586, 11555, 11523, 11491,
57 11460, 11429, 11398, 11367, 11336, 11305, 11275, 11245, 11215, 11185, 11155,
58 11125, 11096, 11067, 11038, 11009, 10980, 10951, 10923, 10894, 10866, 10838,
59 10810, 10782, 10755, 10727, 10700, 10673, 10645, 10618, 10592, 10565, 10538,
60 10512, 10486, 10460, 10434, 10408, 10382, 10356, 10331, 10305, 10280, 10255,
61 10230, 10205, 10180, 10156, 10131, 10107, 10082, 10058, 10034, 10010, 9986,
62 9963, 9939, 9916, 9892, 9869, 9846, 9823, 9800, 9777, 9754, 9732,
63 9709, 9687, 9664, 9642, 9620, 9598, 9576, 9554, 9533, 9511, 9489,
64 9468, 9447, 9425, 9404, 9383, 9362, 9341, 9321, 9300, 9279, 9259,
65 9239, 9218, 9198, 9178, 9158, 9138, 9118, 9098, 9079, 9059, 9039,
66 9020, 9001, 8981, 8962, 8943, 8924, 8905, 8886, 8867, 8849, 8830,
67 8812, 8793, 8775, 8756, 8738, 8720, 8702, 8684, 8666, 8648, 8630,
68 8613, 8595, 8577, 8560, 8542, 8525, 8508, 8490, 8473, 8456, 8439,
69 8422, 8405, 8389, 8372, 8355, 8339, 8322, 8306, 8289, 8273, 8257,
70 8240, 8224, 8208, 8192
71};
72
73static uint32_t inverse_recenter(int r, uint32_t v)
74{
75 if (v > 2 * r)
76 return v;
77 else if (v & 1)
78 return r - ((v + 1) >> 1);
79 else
80 return r + (v >> 1);
81}
82
83static uint32_t decode_unsigned_subexp_with_ref(uint32_t sub_exp,
84 int mx, int r)
85{
86 if ((r << 1) <= mx) {
87 return inverse_recenter(r, sub_exp);
88 } else {
89 return mx - 1 - inverse_recenter(mx - 1 - r, sub_exp);
90 }
91}
92
93static int32_t decode_signed_subexp_with_ref(uint32_t sub_exp, int low,
94 int high, int r)
95{
96 int32_t x = decode_unsigned_subexp_with_ref(sub_exp, high - low, r - low);
97 return x + low;
98}
99
100static void read_global_param(AV1DecContext *s, int type, int ref, int idx)
101{
102 int primary_frame;
103 uint32_t abs_bits, prec_bits, round, prec_diff, sub, mx;
104 int32_t r, prev_gm_param;
105
106 primary_frame = s->raw_frame_header->primary_ref_frame;
107 abs_bits = AV1_GM_ABS_ALPHA_BITS;
108 prec_bits = AV1_GM_ALPHA_PREC_BITS;
109
110 /* setup_past_independence() sets PrevGmParams to default values. We can
111 * simply point to the current's frame gm_params as they will be initialized
112 * with defaults at this point.
113 */
114 if (s->raw_frame_header->primary_ref_frame == AV1_PRIMARY_REF_NONE)
115 prev_gm_param = s->cur_frame.gm_params[ref][idx];
116 else {
117 int prev_frame = s->raw_frame_header->ref_frame_idx[primary_frame];
118 prev_gm_param = s->ref[prev_frame].gm_params[ref][idx];
119 }
120
121 if (idx < 2) {
123 abs_bits = AV1_GM_ABS_TRANS_ONLY_BITS -
124 !s->raw_frame_header->allow_high_precision_mv;
125 prec_bits = AV1_GM_TRANS_ONLY_PREC_BITS -
126 !s->raw_frame_header->allow_high_precision_mv;
127 } else {
128 abs_bits = AV1_GM_ABS_TRANS_BITS;
129 prec_bits = AV1_GM_TRANS_PREC_BITS;
130 }
131 }
132 round = (idx % 3) == 2 ? (1 << AV1_WARPEDMODEL_PREC_BITS) : 0;
133 prec_diff = AV1_WARPEDMODEL_PREC_BITS - prec_bits;
134 sub = (idx % 3) == 2 ? (1 << prec_bits) : 0;
135 mx = 1 << abs_bits;
136 r = (prev_gm_param >> prec_diff) - sub;
137
138 s->cur_frame.gm_params[ref][idx] =
139 (decode_signed_subexp_with_ref(s->raw_frame_header->gm_params[ref][idx],
140 -mx, mx + 1, r) << prec_diff) + round;
141}
142
143static uint64_t round_two(uint64_t x, uint16_t n)
144{
145 if (n == 0)
146 return x;
147 return ((x + ((uint64_t)1 << (n - 1))) >> n);
148}
149
150static int64_t round_two_signed(int64_t x, uint16_t n)
151{
152 return ((x<0) ? -((int64_t)round_two(-x, n)) : (int64_t)round_two(x, n));
153}
154
155/**
156 * Resolve divisor process.
157 * see spec 7.11.3.7
158 */
159static int16_t resolve_divisor(uint32_t d, uint16_t *shift)
160{
161 int32_t e, f;
162
163 *shift = av_log2(d);
164 e = d - (1 << (*shift));
165 if (*shift > AV1_DIV_LUT_BITS)
167 else
168 f = e << (AV1_DIV_LUT_BITS - (*shift));
169
171
172 return div_lut[f];
173}
174
175/**
176 * check if global motion params is valid.
177 * see spec 7.11.3.6
178 */
179static uint8_t get_shear_params_valid(AV1DecContext *s, int idx)
180{
181 int16_t alpha, beta, gamma, delta, divf, divs;
182 int64_t v, w;
183 int32_t *param = &s->cur_frame.gm_params[idx][0];
184 if (param[2] <= 0)
185 return 0;
186
187 alpha = av_clip_int16(param[2] - (1 << AV1_WARPEDMODEL_PREC_BITS));
188 beta = av_clip_int16(param[3]);
189 divf = resolve_divisor(abs(param[2]), &divs);
190 v = (int64_t)param[4] * (1 << AV1_WARPEDMODEL_PREC_BITS);
191 w = (int64_t)param[3] * param[4];
192 gamma = av_clip_int16((int)round_two_signed((v * divf), divs));
193 delta = av_clip_int16(param[5] - (int)round_two_signed((w * divf), divs) - (1 << AV1_WARPEDMODEL_PREC_BITS));
194
199
200 if ((4 * abs(alpha) + 7 * abs(beta)) >= (1 << AV1_WARPEDMODEL_PREC_BITS) ||
201 (4 * abs(gamma) + 4 * abs(delta)) >= (1 << AV1_WARPEDMODEL_PREC_BITS))
202 return 0;
203
204 return 1;
205}
206
207/**
208* update gm type/params, since cbs already implemented part of this function,
209* so we don't need to full implement spec.
210*/
212{
213 const AV1RawFrameHeader *header = s->raw_frame_header;
214 int type, ref;
215
217 s->cur_frame.gm_type[ref] = AV1_WARP_MODEL_IDENTITY;
218 for (int i = 0; i < 6; i++)
219 s->cur_frame.gm_params[ref][i] = (i % 3 == 2) ?
221 }
222 if (header->frame_type == AV1_FRAME_KEY ||
223 header->frame_type == AV1_FRAME_INTRA_ONLY)
224 return;
225
227 if (header->is_global[ref]) {
228 if (header->is_rot_zoom[ref]) {
230 } else {
231 type = header->is_translation[ref] ? AV1_WARP_MODEL_TRANSLATION
233 }
234 } else {
236 }
237 s->cur_frame.gm_type[ref] = type;
238
245 } else {
246 s->cur_frame.gm_params[ref][4] = -s->cur_frame.gm_params[ref][3];
247 s->cur_frame.gm_params[ref][5] = s->cur_frame.gm_params[ref][2];
248 }
249 }
253 }
255 s->cur_frame.gm_invalid[ref] = !get_shear_params_valid(s, ref);
256 }
257 }
258}
259
261 unsigned int a, unsigned int b)
262{
263 unsigned int diff = a - b;
264 unsigned int m = 1 << seq->order_hint_bits_minus_1;
265 return (diff & (m - 1)) - (diff & m);
266}
267
269{
270 const AV1RawFrameHeader *header = s->raw_frame_header;
271 const AV1RawSequenceHeader *seq = s->raw_seq;
272
273 int forward_idx, backward_idx;
274 int forward_hint, backward_hint;
275 int second_forward_idx, second_forward_hint;
276 int ref_hint, dist, i;
277
278 if (header->frame_type == AV1_FRAME_KEY ||
279 header->frame_type == AV1_FRAME_INTRA_ONLY ||
280 !header->reference_select || !seq->enable_order_hint)
281 return;
282
283 forward_idx = -1;
284 backward_idx = -1;
285 for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
286 if (!s->ref[header->ref_frame_idx[i]].raw_frame_header)
287 return;
288 ref_hint = s->ref[header->ref_frame_idx[i]].raw_frame_header->order_hint;
289 dist = get_relative_dist(seq, ref_hint, header->order_hint);
290 if (dist < 0) {
291 if (forward_idx < 0 ||
292 get_relative_dist(seq, ref_hint, forward_hint) > 0) {
293 forward_idx = i;
294 forward_hint = ref_hint;
295 }
296 } else if (dist > 0) {
297 if (backward_idx < 0 ||
298 get_relative_dist(seq, ref_hint, backward_hint) < 0) {
299 backward_idx = i;
300 backward_hint = ref_hint;
301 }
302 }
303 }
304
305 if (forward_idx < 0) {
306 return;
307 } else if (backward_idx >= 0) {
308 s->cur_frame.skip_mode_frame_idx[0] =
309 AV1_REF_FRAME_LAST + FFMIN(forward_idx, backward_idx);
310 s->cur_frame.skip_mode_frame_idx[1] =
311 AV1_REF_FRAME_LAST + FFMAX(forward_idx, backward_idx);
312 return;
313 }
314
315 second_forward_idx = -1;
316 for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
317 ref_hint = s->ref[header->ref_frame_idx[i]].raw_frame_header->order_hint;
318 if (get_relative_dist(seq, ref_hint, forward_hint) < 0) {
319 if (second_forward_idx < 0 ||
320 get_relative_dist(seq, ref_hint, second_forward_hint) > 0) {
321 second_forward_idx = i;
322 second_forward_hint = ref_hint;
323 }
324 }
325 }
326
327 if (second_forward_idx < 0)
328 return;
329
330 s->cur_frame.skip_mode_frame_idx[0] =
331 AV1_REF_FRAME_LAST + FFMIN(forward_idx, second_forward_idx);
332 s->cur_frame.skip_mode_frame_idx[1] =
333 AV1_REF_FRAME_LAST + FFMAX(forward_idx, second_forward_idx);
334}
335
337{
338 const AV1RawFrameHeader *header = s->raw_frame_header;
339 int i;
340
341 if (header->delta_q_y_dc || header->delta_q_u_ac ||
342 header->delta_q_u_dc || header->delta_q_v_ac ||
343 header->delta_q_v_dc) {
344 s->cur_frame.coded_lossless = 0;
345 return;
346 }
347
348 s->cur_frame.coded_lossless = 1;
349 for (i = 0; i < AV1_MAX_SEGMENTS; i++) {
350 int qindex;
351 if (header->feature_enabled[i][AV1_SEG_LVL_ALT_Q]) {
352 qindex = (header->base_q_idx +
353 header->feature_value[i][AV1_SEG_LVL_ALT_Q]);
354 } else {
355 qindex = header->base_q_idx;
356 }
357 qindex = av_clip_uintp2(qindex, 8);
358
359 if (qindex) {
360 s->cur_frame.coded_lossless = 0;
361 return;
362 }
363 }
364}
365
367{
368 const AV1RawFrameHeader *header = s->raw_frame_header;
369 const AV1RawSequenceHeader *seq = s->raw_seq;
370 AV1Frame *frame = &s->cur_frame;
371
372 frame->order_hint = header->order_hint;
373
374 for (int i = 0; i < AV1_REFS_PER_FRAME; i++) {
375 int ref_name = i + AV1_REF_FRAME_LAST;
376 int ref_slot = header->ref_frame_idx[i];
377 int ref_order_hint = s->ref[ref_slot].order_hint;
378
379 frame->order_hints[ref_name] = ref_order_hint;
380 if (!seq->enable_order_hint) {
381 frame->ref_frame_sign_bias[ref_name] = 0;
382 } else {
383 frame->ref_frame_sign_bias[ref_name] =
384 get_relative_dist(seq, ref_order_hint,
385 frame->order_hint) > 0;
386 }
387 }
388}
389
391{
392 const AV1RawFrameHeader *header = s->raw_frame_header;
393 const AV1RawFilmGrainParams *film_grain = &header->film_grain, *src;
394 AV1RawFilmGrainParams *dst = &s->cur_frame.film_grain;
395
396 if (!film_grain->apply_grain)
397 return;
398
399 if (film_grain->update_grain) {
400 memcpy(dst, film_grain, sizeof(*dst));
401 return;
402 }
403
404 src = &s->ref[film_grain->film_grain_params_ref_idx].film_grain;
405
406 memcpy(dst, src, sizeof(*dst));
407 dst->grain_seed = film_grain->grain_seed;
408}
409
411
412{
413 int cur_tile_num =
414 s->raw_frame_header->tile_cols * s->raw_frame_header->tile_rows;
415 if (s->tile_num < cur_tile_num) {
416 int ret = av_reallocp_array(&s->tile_group_info, cur_tile_num,
417 sizeof(TileGroupInfo));
418 if (ret < 0) {
419 s->tile_num = 0;
420 return ret;
421 }
422 }
423 s->tile_num = cur_tile_num;
424
425 return 0;
426}
427
428static int get_tiles_info(AVCodecContext *avctx, const AV1RawTileGroup *tile_group)
429{
430 AV1DecContext *s = avctx->priv_data;
432 uint16_t tile_num, tile_row, tile_col;
433 uint32_t size = 0, size_bytes = 0;
434
435 bytestream2_init(&gb, tile_group->tile_data.data,
436 tile_group->tile_data.data_size);
437 s->tg_start = tile_group->tg_start;
438 s->tg_end = tile_group->tg_end;
439
440 for (tile_num = tile_group->tg_start; tile_num <= tile_group->tg_end; tile_num++) {
441 tile_row = tile_num / s->raw_frame_header->tile_cols;
442 tile_col = tile_num % s->raw_frame_header->tile_cols;
443
444 if (tile_num == tile_group->tg_end) {
445 s->tile_group_info[tile_num].tile_size = bytestream2_get_bytes_left(&gb);
446 s->tile_group_info[tile_num].tile_offset = bytestream2_tell(&gb);
447 s->tile_group_info[tile_num].tile_row = tile_row;
448 s->tile_group_info[tile_num].tile_column = tile_col;
449 return 0;
450 }
451 size_bytes = s->raw_frame_header->tile_size_bytes_minus1 + 1;
452 if (bytestream2_get_bytes_left(&gb) < size_bytes)
453 return AVERROR_INVALIDDATA;
454 size = 0;
455 for (int i = 0; i < size_bytes; i++)
456 size |= bytestream2_get_byteu(&gb) << 8 * i;
458 return AVERROR_INVALIDDATA;
459 size++;
460
461 s->tile_group_info[tile_num].tile_size = size;
462 s->tile_group_info[tile_num].tile_offset = bytestream2_tell(&gb);
463 s->tile_group_info[tile_num].tile_row = tile_row;
464 s->tile_group_info[tile_num].tile_column = tile_col;
465
467 }
468
469 return 0;
470
471}
472
473static enum AVPixelFormat get_sw_pixel_format(void *logctx,
474 const AV1RawSequenceHeader *seq)
475{
476 int bit_depth;
478
479 if (seq->seq_profile == 2 && seq->color_config.high_bitdepth)
480 bit_depth = seq->color_config.twelve_bit ? 12 : 10;
481 else if (seq->seq_profile <= 2)
482 bit_depth = seq->color_config.high_bitdepth ? 10 : 8;
483 else {
484 av_log(logctx, AV_LOG_ERROR,
485 "Unknown AV1 profile %d.\n", seq->seq_profile);
486 return AV_PIX_FMT_NONE;
487 }
488
489 if (!seq->color_config.mono_chrome) {
490 // 4:4:4 x:0 y:0, 4:2:2 x:1 y:0, 4:2:0 x:1 y:1
491 if (seq->color_config.subsampling_x == 0 &&
492 seq->color_config.subsampling_y == 0) {
493 if (bit_depth == 8)
495 else if (bit_depth == 10)
497 else if (bit_depth == 12)
499 else
500 av_assert0(0);
501 } else if (seq->color_config.subsampling_x == 1 &&
502 seq->color_config.subsampling_y == 0) {
503 if (bit_depth == 8)
505 else if (bit_depth == 10)
507 else if (bit_depth == 12)
509 else
510 av_assert0(0);
511 } else if (seq->color_config.subsampling_x == 1 &&
512 seq->color_config.subsampling_y == 1) {
513 if (bit_depth == 8)
515 else if (bit_depth == 10)
517 else if (bit_depth == 12)
519 else
520 av_assert0(0);
521 }
522 } else {
523 if (bit_depth == 8)
525 else if (bit_depth == 10)
527 else if (bit_depth == 12)
529 else
530 av_assert0(0);
531 }
532
533 return pix_fmt;
534}
535
537{
538 AV1DecContext *s = avctx->priv_data;
539 const AV1RawSequenceHeader *seq = s->raw_seq;
540 int ret;
541 enum AVPixelFormat pix_fmt = get_sw_pixel_format(avctx, seq);
542#define HWACCEL_MAX (CONFIG_AV1_DXVA2_HWACCEL + \
543 CONFIG_AV1_D3D11VA_HWACCEL * 2 + \
544 CONFIG_AV1_D3D12VA_HWACCEL + \
545 CONFIG_AV1_NVDEC_HWACCEL + \
546 CONFIG_AV1_NVDEC_CUARRAY_HWACCEL + \
547 CONFIG_AV1_VAAPI_HWACCEL + \
548 CONFIG_AV1_VDPAU_HWACCEL + \
549 CONFIG_AV1_VIDEOTOOLBOX_HWACCEL + \
550 CONFIG_AV1_VULKAN_HWACCEL)
551 enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmtp = pix_fmts;
552
554 return -1;
555
556 switch (pix_fmt) {
558#if CONFIG_AV1_DXVA2_HWACCEL
559 *fmtp++ = AV_PIX_FMT_DXVA2_VLD;
560#endif
561#if CONFIG_AV1_D3D11VA_HWACCEL
562 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
563 *fmtp++ = AV_PIX_FMT_D3D11;
564#endif
565#if CONFIG_AV1_D3D12VA_HWACCEL
566 *fmtp++ = AV_PIX_FMT_D3D12;
567#endif
568#if CONFIG_AV1_NVDEC_HWACCEL
569 *fmtp++ = AV_PIX_FMT_CUDA;
570#endif
571#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
572 *fmtp++ = AV_PIX_FMT_CUARRAY;
573#endif
574#if CONFIG_AV1_VAAPI_HWACCEL
575 *fmtp++ = AV_PIX_FMT_VAAPI;
576#endif
577#if CONFIG_AV1_VDPAU_HWACCEL
578 *fmtp++ = AV_PIX_FMT_VDPAU;
579#endif
580#if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
581 *fmtp++ = AV_PIX_FMT_VIDEOTOOLBOX;
582#endif
583#if CONFIG_AV1_VULKAN_HWACCEL
584 *fmtp++ = AV_PIX_FMT_VULKAN;
585#endif
586 break;
588#if CONFIG_AV1_DXVA2_HWACCEL
589 *fmtp++ = AV_PIX_FMT_DXVA2_VLD;
590#endif
591#if CONFIG_AV1_D3D11VA_HWACCEL
592 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
593 *fmtp++ = AV_PIX_FMT_D3D11;
594#endif
595#if CONFIG_AV1_D3D12VA_HWACCEL
596 *fmtp++ = AV_PIX_FMT_D3D12;
597#endif
598#if CONFIG_AV1_NVDEC_HWACCEL
599 *fmtp++ = AV_PIX_FMT_CUDA;
600#endif
601#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
602 *fmtp++ = AV_PIX_FMT_CUARRAY;
603#endif
604#if CONFIG_AV1_VAAPI_HWACCEL
605 *fmtp++ = AV_PIX_FMT_VAAPI;
606#endif
607#if CONFIG_AV1_VDPAU_HWACCEL
608 *fmtp++ = AV_PIX_FMT_VDPAU;
609#endif
610#if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
611 *fmtp++ = AV_PIX_FMT_VIDEOTOOLBOX;
612#endif
613#if CONFIG_AV1_VULKAN_HWACCEL
614 *fmtp++ = AV_PIX_FMT_VULKAN;
615#endif
616 break;
618#if CONFIG_AV1_D3D11VA_HWACCEL
619 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
620 *fmtp++ = AV_PIX_FMT_D3D11;
621#endif
622#if CONFIG_AV1_D3D12VA_HWACCEL
623 *fmtp++ = AV_PIX_FMT_D3D12;
624#endif
625#if CONFIG_AV1_VULKAN_HWACCEL
626 *fmtp++ = AV_PIX_FMT_VULKAN;
627#endif
628 break;
630#if CONFIG_AV1_VULKAN_HWACCEL
631 *fmtp++ = AV_PIX_FMT_VULKAN;
632#endif
633 break;
635#if CONFIG_AV1_VULKAN_HWACCEL
636 *fmtp++ = AV_PIX_FMT_VULKAN;
637#endif
638 break;
640#if CONFIG_AV1_VULKAN_HWACCEL
641 *fmtp++ = AV_PIX_FMT_VULKAN;
642#endif
643 break;
645#if CONFIG_AV1_VULKAN_HWACCEL
646 *fmtp++ = AV_PIX_FMT_VULKAN;
647#endif
648 break;
650#if CONFIG_AV1_VULKAN_HWACCEL
651 *fmtp++ = AV_PIX_FMT_VULKAN;
652#endif
653 break;
655#if CONFIG_AV1_VULKAN_HWACCEL
656 *fmtp++ = AV_PIX_FMT_VULKAN;
657#endif
658 break;
659 case AV_PIX_FMT_GRAY8:
660#if CONFIG_AV1_NVDEC_HWACCEL
661 *fmtp++ = AV_PIX_FMT_CUDA;
662#endif
663#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
664 *fmtp++ = AV_PIX_FMT_CUARRAY;
665#endif
666 break;
668#if CONFIG_AV1_NVDEC_HWACCEL
669 *fmtp++ = AV_PIX_FMT_CUDA;
670#endif
671#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
672 *fmtp++ = AV_PIX_FMT_CUARRAY;
673#endif
674 break;
675 }
676
677 *fmtp++ = pix_fmt;
678 *fmtp = AV_PIX_FMT_NONE;
679
680 for (int i = 0; pix_fmts[i] != pix_fmt; i++)
681 if (pix_fmts[i] == avctx->pix_fmt) {
682 s->pix_fmt = pix_fmt;
683 return 1;
684 }
685
686 ret = ff_get_format(avctx, pix_fmts);
687
688 /**
689 * check if the HW accel is inited correctly. If not, return un-implemented.
690 * Since now the av1 decoder doesn't support native decode, if it will be
691 * implemented in the future, need remove this check.
692 */
693 if (!avctx->hwaccel) {
694 av_log(avctx, AV_LOG_ERROR, "Your platform doesn't support"
695 " hardware accelerated AV1 decoding.\n");
696 avctx->pix_fmt = AV_PIX_FMT_NONE;
697 return AVERROR(ENOSYS);
698 }
699
700 s->pix_fmt = pix_fmt;
701 avctx->pix_fmt = ret;
702
703 av_log(avctx, AV_LOG_DEBUG, "AV1 decode get format: %s.\n",
705
706 return 0;
707}
708
710{
711 av_refstruct_unref(&f->hwaccel_picture_private);
713 av_refstruct_unref(&f->header_ref);
714 f->raw_frame_header = NULL;
715 f->spatial_id = f->temporal_id = 0;
716 memset(f->skip_mode_frame_idx, 0,
717 2 * sizeof(uint8_t));
718 memset(&f->film_grain, 0, sizeof(f->film_grain));
719 f->coded_lossless = 0;
720}
721
723{
724 av_assert1(dst != src);
725
726 av_refstruct_replace(&dst->header_ref, src->header_ref);
727
728 dst->raw_frame_header = src->raw_frame_header;
729
731
732 av_refstruct_replace(&dst->hwaccel_picture_private,
733 src->hwaccel_picture_private);
734
735 dst->spatial_id = src->spatial_id;
736 dst->temporal_id = src->temporal_id;
737 memcpy(dst->gm_invalid,
738 src->gm_invalid,
739 AV1_NUM_REF_FRAMES * sizeof(uint8_t));
740 memcpy(dst->gm_type,
741 src->gm_type,
742 AV1_NUM_REF_FRAMES * sizeof(uint8_t));
743 memcpy(dst->gm_params,
744 src->gm_params,
745 AV1_NUM_REF_FRAMES * 6 * sizeof(int32_t));
746 memcpy(dst->skip_mode_frame_idx,
747 src->skip_mode_frame_idx,
748 2 * sizeof(uint8_t));
749 memcpy(&dst->film_grain,
750 &src->film_grain,
751 sizeof(dst->film_grain));
752 dst->coded_lossless = src->coded_lossless;
753
754 dst->order_hint = src->order_hint;
755 memcpy(dst->ref_frame_sign_bias, src->ref_frame_sign_bias,
756 sizeof(dst->ref_frame_sign_bias));
757 memcpy(dst->order_hints, src->order_hints,
758 sizeof(dst->order_hints));
759
760 dst->force_integer_mv = src->force_integer_mv;
761}
762
764{
765 AV1DecContext *s = avctx->priv_data;
766 AV1RawMetadataITUTT35 itut_t35;
767
768 for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++)
769 av1_frame_unref(&s->ref[i]);
770 av1_frame_unref(&s->cur_frame);
771 av_buffer_unref(&s->seq_data_ref);
772 av_refstruct_unref(&s->seq_ref);
773 av_refstruct_unref(&s->header_ref);
774 av_refstruct_unref(&s->cll_ref);
775 av_refstruct_unref(&s->mdcv_ref);
776 av_freep(&s->tile_group_info);
777
778 while (s->itut_t35_fifo && av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0)
779 av_buffer_unref(&itut_t35.payload_ref);
780 av_fifo_freep2(&s->itut_t35_fifo);
781
782 ff_cbs_fragment_free(&s->current_obu);
783 ff_cbs_close(&s->cbc);
784 ff_dovi_ctx_unref(&s->dovi);
785
786 return 0;
787}
788
790 const AV1RawSequenceHeader *seq)
791{
792 int width = seq->max_frame_width_minus_1 + 1;
793 int height = seq->max_frame_height_minus_1 + 1;
794
795 avctx->profile = seq->seq_profile;
796 avctx->level = seq->seq_level_idx[0];
797
799 avctx->color_range =
804 }
805
807 case AV1_CSP_VERTICAL:
809 break;
812 break;
813 }
814
815 if (avctx->width != width || avctx->height != height) {
816 int ret = ff_set_dimensions(avctx, width, height);
817 if (ret < 0)
818 return ret;
819 }
820
825
826 if (avctx->pix_fmt == AV_PIX_FMT_NONE)
827 avctx->pix_fmt = get_sw_pixel_format(avctx, seq);
828
829 return 0;
830}
831
834{
835 AVRational aspect_ratio;
836 int width = header->frame_width_minus_1 + 1;
837 int height = header->frame_height_minus_1 + 1;
838 int r_width = header->render_width_minus_1 + 1;
839 int r_height = header->render_height_minus_1 + 1;
840 int ret;
841
842 if (avctx->width != width || avctx->height != height) {
843 ret = ff_set_dimensions(avctx, width, height);
844 if (ret < 0)
845 return ret;
846 }
847
848 av_reduce(&aspect_ratio.num, &aspect_ratio.den,
849 (int64_t)height * r_width,
850 (int64_t)width * r_height,
851 INT_MAX);
852
853 if (av_cmp_q(avctx->sample_aspect_ratio, aspect_ratio)) {
854 ret = ff_set_sar(avctx, aspect_ratio);
855 if (ret < 0)
856 return ret;
857 }
858
859 return 0;
860}
861
871
873{
874 AV1DecContext *s = avctx->priv_data;
876 const AVPacketSideData *sd;
877 int ret;
878
879 s->avctx = avctx;
880 s->pkt = avctx->internal->in_pkt;
881 s->pix_fmt = AV_PIX_FMT_NONE;
882
883 ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_AV1, avctx);
884 if (ret < 0)
885 return ret;
886
887 s->cbc->decompose_unit_types = decompose_unit_types;
888 s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types);
889
890 s->itut_t35_fifo = av_fifo_alloc2(1, sizeof(AV1RawMetadataITUTT35),
892 if (!s->itut_t35_fifo)
893 return AVERROR(ENOMEM);
894
895 av_opt_set_int(s->cbc->priv_data, "operating_point", s->operating_point, 0);
896
897 if (avctx->extradata && avctx->extradata_size) {
898 ret = ff_cbs_read_extradata_from_codec(s->cbc,
899 &s->current_obu,
900 avctx);
901 if (ret < 0) {
902 av_log(avctx, AV_LOG_WARNING, "Failed to read extradata.\n");
903 goto end;
904 }
905
906 seq = ((CodedBitstreamAV1Context *)(s->cbc->priv_data))->sequence_header;
907 if (!seq) {
908 if (!(avctx->extradata[0] & 0x80))
909 av_log(avctx, AV_LOG_WARNING, "No sequence header available in extradata.\n");
910 goto end;
911 }
912
913 ret = set_context_with_sequence(avctx, seq);
914 if (ret < 0) {
915 av_log(avctx, AV_LOG_WARNING, "Failed to set decoder context.\n");
916 goto end;
917 }
918
919 end:
920 ff_cbs_fragment_reset(&s->current_obu);
921 }
922
923 s->dovi.logctx = avctx;
924 s->dovi.cfg.dv_profile = 10; // default for AV1
926 if (sd && sd->size >= sizeof(s->dovi.cfg))
927 s->dovi.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data;
928
929 return ret;
930}
931
933{
934 AV1DecContext *s = avctx->priv_data;
935 AV1RawFrameHeader *header= s->raw_frame_header;
936 AVFrame *frame;
937 int ret;
938
940 if (ret < 0) {
941 av_log(avctx, AV_LOG_ERROR, "Failed to update context with frame header\n");
942 return ret;
943 }
944
946 if (ret < 0)
947 goto fail;
948
949 frame = f->f;
950 if (header->frame_type == AV1_FRAME_KEY)
951 frame->flags |= AV_FRAME_FLAG_KEY;
952 else
953 frame->flags &= ~AV_FRAME_FLAG_KEY;
954
955 switch (header->frame_type) {
956 case AV1_FRAME_KEY:
958 frame->pict_type = AV_PICTURE_TYPE_I;
959 break;
960 case AV1_FRAME_INTER:
961 frame->pict_type = AV_PICTURE_TYPE_P;
962 break;
963 case AV1_FRAME_SWITCH:
964 frame->pict_type = AV_PICTURE_TYPE_SP;
965 break;
966 }
967
968 ret = ff_hwaccel_frame_priv_alloc(avctx, &f->hwaccel_picture_private);
969 if (ret < 0)
970 goto fail;
971
972 return 0;
973
974fail:
976 return ret;
977}
978
980 const AV1RawMetadataITUTT35 *itut_t35)
981{
982 AV1DecContext *s = avctx->priv_data;
983 FFITUTT35 itut35 = { .country_code = itut_t35->itu_t_t35_country_code };
984 FFITUTT35Aux aux = { .dovi = &s->dovi };
985 int ret;
986
987 ret = ff_itut_t35_parse_buffer(&itut35, itut_t35->payload, itut_t35->payload_size,
989 if (ret <= 0)
990 return ret;
991
992 ret = ff_itut_t35_parse_payload_to_frame(&itut35, &aux, avctx, frame);
993 if (ret < 0)
994 return ret;
995
996 return 0;
997}
998
1000{
1001 AV1DecContext *s = avctx->priv_data;
1002 AV1RawMetadataITUTT35 itut_t35;
1003 int ret = 0;
1004
1005 if (s->mdcv) {
1006 AVMasteringDisplayMetadata *mastering;
1007
1008 ret = ff_decode_mastering_display_new(avctx, frame, &mastering);
1009 if (ret < 0)
1010 return ret;
1011
1012 if (mastering) {
1013 for (int i = 0; i < 3; i++) {
1014 mastering->display_primaries[i][0] = av_make_q(s->mdcv->primary_chromaticity_x[i], 1 << 16);
1015 mastering->display_primaries[i][1] = av_make_q(s->mdcv->primary_chromaticity_y[i], 1 << 16);
1016 }
1017 mastering->white_point[0] = av_make_q(s->mdcv->white_point_chromaticity_x, 1 << 16);
1018 mastering->white_point[1] = av_make_q(s->mdcv->white_point_chromaticity_y, 1 << 16);
1019
1020 mastering->max_luminance = av_make_q(s->mdcv->luminance_max, 1 << 8);
1021 mastering->min_luminance = av_make_q(s->mdcv->luminance_min, 1 << 14);
1022
1023 mastering->has_primaries = 1;
1024 mastering->has_luminance = 1;
1025 }
1026 }
1027
1028 if (s->cll) {
1030
1031 ret = ff_decode_content_light_new(avctx, frame, &light);
1032 if (ret < 0)
1033 return ret;
1034
1035 if (light) {
1036 light->MaxCLL = s->cll->max_cll;
1037 light->MaxFALL = s->cll->max_fall;
1038 }
1039 }
1040
1041 while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0) {
1042 if (ret >= 0)
1043 ret = export_itut_t35(avctx, frame, &itut_t35);
1044 av_buffer_unref(&itut_t35.payload_ref);
1045 }
1046
1047 return ret;
1048}
1049
1051{
1052 AV1DecContext *s = avctx->priv_data;
1053 const AV1RawFilmGrainParams *film_grain = &s->cur_frame.film_grain;
1054 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(frame->format);
1055 AVFilmGrainParams *fgp;
1057
1058 av_assert0(pixdesc);
1059 if (!film_grain->apply_grain)
1060 return 0;
1061
1063 if (!fgp)
1064 return AVERROR(ENOMEM);
1065
1067 fgp->seed = film_grain->grain_seed;
1068 fgp->width = frame->width;
1069 fgp->height = frame->height;
1070 fgp->color_range = frame->color_range;
1071 fgp->color_primaries = frame->color_primaries;
1072 fgp->color_trc = frame->color_trc;
1073 fgp->color_space = frame->colorspace;
1074 fgp->subsampling_x = pixdesc->log2_chroma_w;
1075 fgp->subsampling_y = pixdesc->log2_chroma_h;
1076
1077 aom = &fgp->codec.aom;
1079 aom->scaling_shift = film_grain->grain_scaling_minus_8 + 8;
1080 aom->ar_coeff_lag = film_grain->ar_coeff_lag;
1081 aom->ar_coeff_shift = film_grain->ar_coeff_shift_minus_6 + 6;
1082 aom->grain_scale_shift = film_grain->grain_scale_shift;
1083 aom->overlap_flag = film_grain->overlap_flag;
1085
1086 aom->num_y_points = film_grain->num_y_points;
1087 for (int i = 0; i < film_grain->num_y_points; i++) {
1088 aom->y_points[i][0] = film_grain->point_y_value[i];
1089 aom->y_points[i][1] = film_grain->point_y_scaling[i];
1090 }
1091 aom->num_uv_points[0] = film_grain->num_cb_points;
1092 for (int i = 0; i < film_grain->num_cb_points; i++) {
1093 aom->uv_points[0][i][0] = film_grain->point_cb_value[i];
1094 aom->uv_points[0][i][1] = film_grain->point_cb_scaling[i];
1095 }
1096 aom->num_uv_points[1] = film_grain->num_cr_points;
1097 for (int i = 0; i < film_grain->num_cr_points; i++) {
1098 aom->uv_points[1][i][0] = film_grain->point_cr_value[i];
1099 aom->uv_points[1][i][1] = film_grain->point_cr_scaling[i];
1100 }
1101
1102 for (int i = 0; i < 24; i++) {
1103 aom->ar_coeffs_y[i] = film_grain->ar_coeffs_y_plus_128[i] - 128;
1104 }
1105 for (int i = 0; i < 25; i++) {
1106 aom->ar_coeffs_uv[0][i] = film_grain->ar_coeffs_cb_plus_128[i] - 128;
1107 aom->ar_coeffs_uv[1][i] = film_grain->ar_coeffs_cr_plus_128[i] - 128;
1108 }
1109
1110 aom->uv_mult[0] = film_grain->cb_mult;
1111 aom->uv_mult[1] = film_grain->cr_mult;
1112 aom->uv_mult_luma[0] = film_grain->cb_luma_mult;
1113 aom->uv_mult_luma[1] = film_grain->cr_luma_mult;
1114 aom->uv_offset[0] = film_grain->cb_offset;
1115 aom->uv_offset[1] = film_grain->cr_offset;
1116
1117 return 0;
1118}
1119
1121{
1122 AV1DecContext *s = avctx->priv_data;
1123 const AVFrame *srcframe = s->cur_frame.f;
1124 AVPacket *pkt = s->pkt;
1125 int ret;
1126
1127 // TODO: all layers
1128 if (s->operating_point_idc &&
1129 av_log2(s->operating_point_idc >> 8) > s->cur_frame.spatial_id)
1130 return 0;
1131
1132 ret = av_frame_ref(frame, srcframe);
1133 if (ret < 0)
1134 return ret;
1135
1136 ret = export_metadata(avctx, frame);
1137 if (ret < 0) {
1139 return ret;
1140 }
1141
1143 ret = export_film_grain(avctx, frame);
1144 if (ret < 0) {
1146 return ret;
1147 }
1148 }
1149
1150 frame->pts = pkt->pts;
1151 frame->pkt_dts = pkt->dts;
1152
1154
1155 return 0;
1156}
1157
1159{
1160 AV1DecContext *s = avctx->priv_data;
1161 const AV1RawFrameHeader *header = s->raw_frame_header;
1162
1163 for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) {
1164 if (header->refresh_frame_flags & (1 << i))
1165 av1_frame_replace(&s->ref[i], &s->cur_frame);
1166 }
1167}
1168
1170{
1171 AV1DecContext *s = avctx->priv_data;
1172 int ret;
1173
1174 av1_frame_unref(&s->cur_frame);
1175
1176 s->cur_frame.header_ref = av_refstruct_ref(s->header_ref);
1177
1178 s->cur_frame.raw_frame_header = s->raw_frame_header;
1179
1180 ret = init_tile_data(s);
1181 if (ret < 0) {
1182 av_log(avctx, AV_LOG_ERROR, "Failed to init tile data.\n");
1183 return ret;
1184 }
1185
1186 if ((avctx->skip_frame >= AVDISCARD_NONINTRA &&
1187 (s->raw_frame_header->frame_type != AV1_FRAME_KEY &&
1188 s->raw_frame_header->frame_type != AV1_FRAME_INTRA_ONLY)) ||
1189 (avctx->skip_frame >= AVDISCARD_NONKEY &&
1190 s->raw_frame_header->frame_type != AV1_FRAME_KEY) ||
1191 avctx->skip_frame >= AVDISCARD_ALL)
1192 return 0;
1193
1194 if (s->pix_fmt == AV_PIX_FMT_NONE) {
1195 ret = get_pixel_format(avctx);
1196 if (ret < 0) {
1197 av_log(avctx, AV_LOG_ERROR, "Failed to get pixel format.\n");
1198 return ret;
1199 }
1200
1201 if (!ret && FF_HW_HAS_CB(avctx, decode_params)) {
1202 ret = FF_HW_CALL(avctx, decode_params, AV1_OBU_SEQUENCE_HEADER,
1203 s->seq_data_ref->data, s->seq_data_ref->size);
1204 if (ret < 0) {
1205 av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n");
1206 return ret;
1207 }
1208 }
1209 }
1210
1211 ret = av1_frame_alloc(avctx, &s->cur_frame);
1212 if (ret < 0) {
1213 av_log(avctx, AV_LOG_ERROR,
1214 "Failed to allocate space for current frame.\n");
1215 return ret;
1216 }
1217
1223
1224 s->cur_frame.force_integer_mv =
1225 s->raw_frame_header->force_integer_mv ||
1226 s->raw_frame_header->frame_type == AV1_FRAME_KEY ||
1227 s->raw_frame_header->frame_type == AV1_FRAME_INTRA_ONLY;
1228
1229 return ret;
1230}
1231
1233{
1234 AV1DecContext *s = avctx->priv_data;
1235 AV1RawTileGroup *raw_tile_group = NULL;
1236 int i = 0, ret;
1237
1238 for (i = s->nb_unit; i < s->current_obu.nb_units; i++) {
1239 CodedBitstreamUnit *unit = &s->current_obu.units[i];
1240 AV1RawOBU *obu = unit->content;
1241 const AV1RawOBUHeader *header;
1242
1243 av_log(avctx, AV_LOG_DEBUG, "OBU idx:%d, type:%d, content available:%d.\n", i, unit->type, !!obu);
1244
1245 if (unit->type == AV1_OBU_TILE_LIST) {
1246 av_log(avctx, AV_LOG_ERROR, "Large scale tile decoding is unsupported.\n");
1248 goto end;
1249 }
1250
1251 if (!obu)
1252 continue;
1253
1254 header = &obu->header;
1255
1256 switch (unit->type) {
1258 ret = av_buffer_replace(&s->seq_data_ref, unit->data_ref);
1259 if (ret < 0)
1260 goto end;
1261
1262 s->seq_data_ref->data = unit->data;
1263 s->seq_data_ref->size = unit->data_size;
1264 av_refstruct_replace(&s->seq_ref, unit->content_ref);
1265
1266 s->raw_seq = &obu->obu.sequence_header;
1267 s->raw_frame_header = NULL;
1268 raw_tile_group = NULL;
1269
1270 ret = set_context_with_sequence(avctx, s->raw_seq);
1271 if (ret < 0) {
1272 av_log(avctx, AV_LOG_ERROR, "Failed to set context.\n");
1273 s->raw_seq = NULL;
1274 goto end;
1275 }
1276
1277 s->operating_point_idc = s->raw_seq->operating_point_idc[s->operating_point];
1278
1279 s->pix_fmt = AV_PIX_FMT_NONE;
1280
1281 if (FF_HW_HAS_CB(avctx, decode_params)) {
1282 ret = FF_HW_CALL(avctx, decode_params, AV1_OBU_SEQUENCE_HEADER,
1283 s->seq_data_ref->data, s->seq_data_ref->size);
1284 if (ret < 0) {
1285 av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n");
1286 return ret;
1287 }
1288 }
1289
1290 break;
1292 if (s->raw_frame_header)
1293 break;
1295 case AV1_OBU_FRAME:
1297 if (!s->raw_seq) {
1298 av_log(avctx, AV_LOG_ERROR, "Missing Sequence Header.\n");
1299 ret = AVERROR_INVALIDDATA;
1300 goto end;
1301 }
1302
1303 av_refstruct_replace(&s->header_ref, unit->content_ref);
1304
1305 raw_tile_group = NULL;
1306
1307 if (unit->type == AV1_OBU_FRAME)
1308 s->raw_frame_header = &obu->obu.frame.header;
1309 else
1310 s->raw_frame_header = &obu->obu.frame_header;
1311
1312 if (s->raw_frame_header->show_existing_frame) {
1313 av1_frame_replace(&s->cur_frame,
1314 &s->ref[s->raw_frame_header->frame_to_show_map_idx]);
1315
1316 update_reference_list(avctx);
1317
1318 if (s->cur_frame.f) {
1319 ret = set_output_frame(avctx, frame);
1320 if (ret < 0) {
1321 av_log(avctx, AV_LOG_ERROR, "Set output frame error.\n");
1322 goto end;
1323 }
1324 }
1325
1326 s->raw_frame_header = NULL;
1327 i++;
1328 ret = 0;
1329
1330 goto end;
1331 }
1332
1333 ret = get_current_frame(avctx);
1334 if (ret < 0) {
1335 av_log(avctx, AV_LOG_ERROR, "Get current frame error\n");
1336 goto end;
1337 }
1338
1339 s->cur_frame.spatial_id = header->spatial_id;
1340 s->cur_frame.temporal_id = header->temporal_id;
1341
1342 if (avctx->hwaccel && s->cur_frame.f) {
1343 ret = FF_HW_CALL(avctx, start_frame, s->pkt->buf,
1344 unit->data, unit->data_size);
1345 if (ret < 0) {
1346 av_log(avctx, AV_LOG_ERROR, "HW accel start frame fail.\n");
1347 goto end;
1348 }
1349 }
1350 if (unit->type != AV1_OBU_FRAME)
1351 break;
1353 case AV1_OBU_TILE_GROUP:
1354 if (!s->raw_frame_header) {
1355 av_log(avctx, AV_LOG_ERROR, "Missing Frame Header.\n");
1356 ret = AVERROR_INVALIDDATA;
1357 goto end;
1358 }
1359
1360 if (unit->type == AV1_OBU_FRAME)
1361 raw_tile_group = &obu->obu.frame.tile_group;
1362 else
1363 raw_tile_group = &obu->obu.tile_group;
1364
1365 ret = get_tiles_info(avctx, raw_tile_group);
1366 if (ret < 0)
1367 goto end;
1368
1369 if (avctx->hwaccel && s->cur_frame.f) {
1370 ret = FF_HW_CALL(avctx, decode_slice, raw_tile_group->tile_data.data,
1371 raw_tile_group->tile_data.data_size);
1372 if (ret < 0) {
1373 av_log(avctx, AV_LOG_ERROR,
1374 "HW accel decode slice fail.\n");
1375 goto end;
1376 }
1377 }
1378 break;
1380 s->raw_frame_header = NULL;
1381 raw_tile_group = NULL;
1382 break;
1383 case AV1_OBU_TILE_LIST:
1384 case AV1_OBU_PADDING:
1385 break;
1386 case AV1_OBU_METADATA:
1387 switch (obu->obu.metadata.metadata_type) {
1389 av_refstruct_replace(&s->cll_ref, unit->content_ref);
1390 s->cll = &obu->obu.metadata.metadata.hdr_cll;
1391 break;
1393 av_refstruct_replace(&s->mdcv_ref, unit->content_ref);
1394 s->mdcv = &obu->obu.metadata.metadata.hdr_mdcv;
1395 break;
1397 AV1RawMetadataITUTT35 itut_t35;
1398 memcpy(&itut_t35, &obu->obu.metadata.metadata.itut_t35, sizeof(itut_t35));
1399 itut_t35.payload_ref = av_buffer_ref(obu->obu.metadata.metadata.itut_t35.payload_ref);
1400 if (!itut_t35.payload_ref) {
1401 ret = AVERROR(ENOMEM);
1402 goto end;
1403 }
1404 ret = av_fifo_write(s->itut_t35_fifo, &itut_t35, 1);
1405 if (ret < 0) {
1406 av_buffer_unref(&itut_t35.payload_ref);
1407 goto end;
1408 }
1409 break;
1410 }
1411 default:
1412 break;
1413 }
1414 break;
1415 default:
1416 av_log(avctx, AV_LOG_DEBUG,
1417 "Unknown obu type: %d (%zu bits).\n",
1418 unit->type, unit->data_size);
1419 }
1420
1421 if (raw_tile_group && (s->tile_num == raw_tile_group->tg_end + 1)) {
1422 int show_frame = s->raw_frame_header->show_frame;
1423 // Set nb_unit to point at the next OBU, to indicate which
1424 // OBUs have been processed for this current frame. (If this
1425 // frame gets output, we set nb_unit to this value later too.)
1426 s->nb_unit = i + 1;
1427 if (avctx->hwaccel && s->cur_frame.f) {
1428 ret = FF_HW_SIMPLE_CALL(avctx, end_frame);
1429 if (ret < 0) {
1430 av_log(avctx, AV_LOG_ERROR, "HW accel end frame fail.\n");
1431 goto end;
1432 }
1433 }
1434
1435 update_reference_list(avctx);
1436
1437 // Set start_unit to indicate the first OBU of the next frame.
1438 s->start_unit = s->nb_unit;
1439 raw_tile_group = NULL;
1440 s->raw_frame_header = NULL;
1441
1442 if (show_frame) {
1443 // cur_frame.f needn't exist due to skip_frame.
1444 if (s->cur_frame.f) {
1445 ret = set_output_frame(avctx, frame);
1446 if (ret < 0) {
1447 av_log(avctx, AV_LOG_ERROR, "Set output frame error\n");
1448 goto end;
1449 }
1450 }
1451 i++;
1452 ret = 0;
1453 goto end;
1454 }
1455 }
1456 }
1457
1458 ret = AVERROR(EAGAIN);
1459end:
1460 av_assert0(i <= s->current_obu.nb_units);
1461 s->nb_unit = i;
1462
1463 if ((ret < 0 && ret != AVERROR(EAGAIN)) || s->current_obu.nb_units == i) {
1464 if (ret < 0)
1465 s->raw_frame_header = NULL;
1466 av_packet_unref(s->pkt);
1467 ff_cbs_fragment_reset(&s->current_obu);
1468 s->nb_unit = s->start_unit = 0;
1469 }
1470 if (!ret && !frame->buf[0])
1471 ret = AVERROR(EAGAIN);
1472
1473 return ret;
1474}
1475
1477{
1478 AV1DecContext *s = avctx->priv_data;
1479 int ret;
1480
1481 do {
1482 if (!s->current_obu.nb_units) {
1483 ret = ff_decode_get_packet(avctx, s->pkt);
1484 if (ret < 0)
1485 return ret;
1486
1487 ret = ff_cbs_read_packet(s->cbc, &s->current_obu, s->pkt);
1488 if (ret < 0) {
1489 ff_cbs_fragment_reset(&s->current_obu);
1490 av_packet_unref(s->pkt);
1491 av_log(avctx, AV_LOG_ERROR, "Failed to read packet.\n");
1492 return ret;
1493 }
1494
1495 s->nb_unit = s->start_unit = 0;
1496 av_log(avctx, AV_LOG_DEBUG, "Total OBUs on this packet: %d.\n",
1497 s->current_obu.nb_units);
1498 }
1499
1500 ret = av1_receive_frame_internal(avctx, frame);
1501 } while (ret == AVERROR(EAGAIN));
1502
1503 return ret;
1504}
1505
1507{
1508 AV1DecContext *s = avctx->priv_data;
1509 AV1RawMetadataITUTT35 itut_t35;
1510
1511 for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++)
1512 av1_frame_unref(&s->ref[i]);
1513
1514 av1_frame_unref(&s->cur_frame);
1515 s->operating_point_idc = 0;
1516 s->nb_unit = s->start_unit = 0;
1517 s->raw_frame_header = NULL;
1518 s->raw_seq = NULL;
1519 s->cll = NULL;
1520 s->mdcv = NULL;
1521 while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0)
1522 av_buffer_unref(&itut_t35.payload_ref);
1523
1524 ff_cbs_fragment_reset(&s->current_obu);
1525 ff_cbs_flush(s->cbc);
1526
1527 if (FF_HW_HAS_CB(avctx, flush))
1528 FF_HW_SIMPLE_CALL(avctx, flush);
1529}
1530
1531#define OFFSET(x) offsetof(AV1DecContext, x)
1532#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1533static const AVOption av1_options[] = {
1534 { "operating_point", "Select an operating point of the scalable bitstream",
1535 OFFSET(operating_point), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, AV1_MAX_OPERATING_POINTS - 1, VD },
1536 { NULL }
1537};
1538
1539static const AVClass av1_class = {
1540 .class_name = "AV1 decoder",
1541 .item_name = av_default_item_name,
1542 .option = av1_options,
1543 .version = LIBAVUTIL_VERSION_INT,
1544};
1545
1547 .p.name = "av1",
1548 CODEC_LONG_NAME("Alliance for Open Media AV1"),
1549 .p.type = AVMEDIA_TYPE_VIDEO,
1550 .p.id = AV_CODEC_ID_AV1,
1551 .priv_data_size = sizeof(AV1DecContext),
1555 .p.capabilities = AV_CODEC_CAP_DR1,
1556 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
1559 .flush = av1_decode_flush,
1561 .p.priv_class = &av1_class,
1562 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1563#if CONFIG_AV1_DXVA2_HWACCEL
1564 HWACCEL_DXVA2(av1),
1565#endif
1566#if CONFIG_AV1_D3D11VA_HWACCEL
1567 HWACCEL_D3D11VA(av1),
1568#endif
1569#if CONFIG_AV1_D3D11VA2_HWACCEL
1570 HWACCEL_D3D11VA2(av1),
1571#endif
1572#if CONFIG_AV1_D3D12VA_HWACCEL
1573 HWACCEL_D3D12VA(av1),
1574#endif
1575#if CONFIG_AV1_NVDEC_HWACCEL
1576 HWACCEL_NVDEC(av1),
1577#endif
1578#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
1580#endif
1581#if CONFIG_AV1_VAAPI_HWACCEL
1582 HWACCEL_VAAPI(av1),
1583#endif
1584#if CONFIG_AV1_VDPAU_HWACCEL
1585 HWACCEL_VDPAU(av1),
1586#endif
1587#if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
1589#endif
1590#if CONFIG_AV1_VULKAN_HWACCEL
1591 HWACCEL_VULKAN(av1),
1592#endif
1593
1594 NULL
1595 },
1596};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition dsp.h:57
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition af_astats.c:246
const FFCodec ff_av1_decoder
Definition av1dec.c:1546
#define VD
Definition amfdec.c:787
static const CodedBitstreamUnitType decompose_unit_types[]
Definition apv_parser.c:178
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
int32_t
AVRational ff_av1_framerate(int64_t ticks_per_frame, int64_t units_per_tick, int64_t time_scale)
Definition av1_parse.c:110
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition bytestream.h:174
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition bytestream.h:158
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition bytestream.h:137
static av_always_inline int bytestream2_tell(const GetByteContext *g)
Definition bytestream.h:192
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define f(width, name)
Definition cbs_vp8.c:236
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CODEC_RECEIVE_FRAME_CB(func)
#define FF_CODEC_CAP_USES_PROGRESSFRAMES
The decoder might make use of the ProgressFrame API.
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define av_clip_int16
Definition common.h:115
#define av_clip_uintp2
Definition common.h:124
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
#define abs(x)
void ff_progress_frame_replace(ProgressFrame *dst, const ProgressFrame *src)
Do nothing if dst and src already refer to the same AVFrame; otherwise unreference dst and if src is ...
Definition decode.c:1969
int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame, AVContentLightMetadata **clm)
Wrapper around av_content_light_metadata_create_side_data(), which rejects side data overridden by th...
Definition decode.c:2308
const AVPacketSideData * ff_get_coded_side_data(const AVCodecContext *avctx, enum AVPacketSideDataType type)
Get side data of the given type from a decoding context.
Definition decode.c:1378
int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame, AVMasteringDisplayMetadata **mdm)
Wrapper around av_mastering_display_metadata_create_side_data(), which rejects side data overridden b...
Definition decode.c:2263
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition decode.c:254
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition decode.c:1229
int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
Allocate a hwaccel frame private data if the provided avctx uses a hwaccel method that needs it.
Definition decode.c:2336
int ff_progress_frame_get_buffer(AVCodecContext *avctx, ProgressFrame *f, int flags)
Wrapper around ff_progress_frame_alloc() and ff_thread_get_buffer().
Definition decode.c:1939
void ff_progress_frame_unref(ProgressFrame *f)
Give up a reference to the underlying frame contained in a ProgressFrame and reset the ProgressFrame,...
Definition decode.c:1962
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition utils.c:106
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Definition utils.c:91
static AVPacket * pkt
static enum AVPixelFormat pix_fmt
static AVFrame * frame
void ff_dovi_ctx_unref(DOVIContext *s)
Completely reset a DOVIContext, preserving only logctx.
Definition dovi_rpu.c:30
int high
Definition dovi_rpuenc.c:39
void(* flush)(AVBSFContext *ctx)
Definition dts2pts.c:610
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
static void show_frame(AVTextFormatContext *tfc, AVFrame *frame, AVStream *stream, AVFormatContext *fmt_ctx)
Definition ffprobe.c:1509
static int decode_slice(AVCodecContext *c, void *arg)
Definition ffv1dec.c:449
AVFilmGrainParams * av_film_grain_params_create_side_data(AVFrame *frame)
Allocate a complete AVFilmGrainParams and add it to the frame.
@ AV_FILM_GRAIN_PARAMS_AV1
The union is valid when interpreted as AVFilmGrainAOMParams (codec.aom)
#define fail
Definition test.h:479
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition avcodec.h:415
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
Definition avcodec.h:404
@ AV_CODEC_ID_AV1
Definition codec_id.h:275
@ AVDISCARD_ALL
discard all
Definition defs.h:232
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition defs.h:231
@ AVDISCARD_NONINTRA
discard all non intra frames
Definition defs.h:230
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
Definition packet.h:280
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition buffer.c:139
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition buffer.c:233
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition buffer.c:103
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
Definition fifo.c:47
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
Definition fifo.c:286
#define AV_FIFO_FLAG_AUTO_GROW
Automatically resize the FIFO on writes, so that the data fits.
Definition fifo.h:63
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
Definition fifo.c:188
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
Definition fifo.c:240
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:687
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:278
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition rational.h:71
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition rational.h:89
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Definition mem.c:225
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
@ AV_PICTURE_TYPE_SP
Switching Predicted.
Definition avutil.h:283
@ AV_PICTURE_TYPE_P
Predicted.
Definition avutil.h:279
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
Definition opt.c:936
int a
#define FF_HW_HAS_CB(avctx, function)
#define FF_HW_SIMPLE_CALL(avctx, function)
#define FF_HW_CALL(avctx, function,...)
#define HWACCEL_NVDEC_CUARRAY(codec)
Definition hwconfig.h:70
#define HWACCEL_DXVA2(codec)
Definition hwconfig.h:64
#define HWACCEL_VDPAU(codec)
Definition hwconfig.h:74
#define HWACCEL_D3D12VA(codec)
Definition hwconfig.h:82
#define HWACCEL_VULKAN(codec)
Definition hwconfig.h:78
#define HWACCEL_NVDEC(codec)
Definition hwconfig.h:68
#define HWACCEL_VAAPI(codec)
Definition hwconfig.h:72
#define HWACCEL_D3D11VA(codec)
Definition hwconfig.h:80
#define HWACCEL_VIDEOTOOLBOX(codec)
Definition hwconfig.h:76
#define HWACCEL_D3D11VA2(codec)
Definition hwconfig.h:66
cl_device_type type
static const int16_t alpha[]
Definition ilbcdata.h:55
#define r
Definition input.c:42
#define b
Definition input.c:43
#define av_log2
Definition intmath.h:84
int ff_itut_t35_parse_buffer(FFITUTT35 *const itut_t35, const uint8_t *buf, size_t buf_size, int flags)
Parse a raw ITU-T T35 buffer to get the country code, provider code, and set them plus the pointer an...
Definition itut35.c:34
int ff_itut_t35_parse_payload_to_frame(FFITUTT35 *const itut_t35, FFITUTT35Aux *const aux, AVCodecContext *const avctx, AVFrame *const frame)
Parse a pre-processed ITU-T T35 payload to fill a frame's side data.
Definition itut35.c:322
#define FF_ITUT_T35_FLAG_COUNTRY_CODE
country_code is assumed to not be the first byte of the buffer and must be set by the caller beforeha...
Definition itut35.h:83
@ AV1_METADATA_TYPE_HDR_MDCV
Definition av1.h:45
@ AV1_METADATA_TYPE_ITUT_T35
Definition av1.h:47
@ AV1_METADATA_TYPE_HDR_CLL
Definition av1.h:44
@ AV1_REF_FRAME_LAST
Definition av1.h:63
@ AV1_REF_FRAME_ALTREF
Definition av1.h:69
@ AV1_OBU_TILE_LIST
Definition av1.h:37
@ AV1_OBU_TEMPORAL_DELIMITER
Definition av1.h:31
@ AV1_OBU_METADATA
Definition av1.h:34
@ AV1_OBU_TILE_GROUP
Definition av1.h:33
@ AV1_OBU_REDUNDANT_FRAME_HEADER
Definition av1.h:36
@ AV1_OBU_FRAME_HEADER
Definition av1.h:32
@ AV1_OBU_PADDING
Definition av1.h:39
@ AV1_OBU_FRAME
Definition av1.h:35
@ AV1_OBU_SEQUENCE_HEADER
Definition av1.h:30
@ AV1_FRAME_KEY
Definition av1.h:53
@ AV1_FRAME_INTER
Definition av1.h:54
@ AV1_FRAME_INTRA_ONLY
Definition av1.h:55
@ AV1_FRAME_SWITCH
Definition av1.h:56
@ AV1_CSP_COLOCATED
Definition av1.h:135
@ AV1_CSP_VERTICAL
Definition av1.h:134
@ AV1_WARP_MODEL_ROTZOOM
Definition av1.h:116
@ AV1_GM_TRANS_ONLY_PREC_BITS
Definition av1.h:109
@ AV1_WARP_MODEL_IDENTITY
Definition av1.h:114
@ AV1_DIV_LUT_PREC_BITS
Definition av1.h:121
@ AV1_PRIMARY_REF_NONE
Definition av1.h:87
@ AV1_DIV_LUT_BITS
Definition av1.h:120
@ AV1_MAX_OPERATING_POINTS
Definition av1.h:74
@ AV1_NUM_REF_FRAMES
Definition av1.h:84
@ AV1_GM_ALPHA_PREC_BITS
Definition av1.h:107
@ AV1_WARPEDMODEL_PREC_BITS
Definition av1.h:112
@ AV1_MAX_SEGMENTS
Definition av1.h:89
@ AV1_WARP_PARAM_REDUCE_BITS
Definition av1.h:118
@ AV1_GM_ABS_ALPHA_BITS
Definition av1.h:106
@ AV1_REFS_PER_FRAME
Definition av1.h:85
@ AV1_DIV_LUT_NUM
Definition av1.h:122
@ AV1_WARP_MODEL_TRANSLATION
Definition av1.h:115
@ AV1_SEG_LVL_ALT_Q
Definition av1.h:92
@ AV1_GM_ABS_TRANS_BITS
Definition av1.h:110
@ AV1_GM_ABS_TRANS_ONLY_BITS
Definition av1.h:108
@ AV1_WARP_MODEL_AFFINE
Definition av1.h:117
@ AV1_GM_TRANS_PREC_BITS
Definition av1.h:111
static int export_metadata(AVCodecContext *avctx, AVFrame *frame)
Definition av1dec.c:999
static void order_hint_info(AV1DecContext *s)
Definition av1dec.c:366
static uint32_t decode_unsigned_subexp_with_ref(uint32_t sub_exp, int mx, int r)
Definition av1dec.c:83
static uint64_t round_two(uint64_t x, uint16_t n)
Definition av1dec.c:143
static enum AVPixelFormat get_sw_pixel_format(void *logctx, const AV1RawSequenceHeader *seq)
Definition av1dec.c:473
static const AVOption av1_options[]
Definition av1dec.c:1533
static void coded_lossless_param(AV1DecContext *s)
Definition av1dec.c:336
static int export_film_grain(AVCodecContext *avctx, AVFrame *frame)
Definition av1dec.c:1050
static int get_relative_dist(const AV1RawSequenceHeader *seq, unsigned int a, unsigned int b)
Definition av1dec.c:260
static uint8_t get_shear_params_valid(AV1DecContext *s, int idx)
check if global motion params is valid.
Definition av1dec.c:179
static int32_t decode_signed_subexp_with_ref(uint32_t sub_exp, int low, int high, int r)
Definition av1dec.c:93
static int init_tile_data(AV1DecContext *s)
Definition av1dec.c:410
static uint32_t inverse_recenter(int r, uint32_t v)
Definition av1dec.c:73
static void skip_mode_params(AV1DecContext *s)
Definition av1dec.c:268
static void read_global_param(AV1DecContext *s, int type, int ref, int idx)
Definition av1dec.c:100
static int set_output_frame(AVCodecContext *avctx, AVFrame *frame)
Definition av1dec.c:1120
static int av1_frame_alloc(AVCodecContext *avctx, AV1Frame *f)
Definition av1dec.c:932
static void global_motion_params(AV1DecContext *s)
update gm type/params, since cbs already implemented part of this function, so we don't need to full ...
Definition av1dec.c:211
static av_cold int av1_decode_init(AVCodecContext *avctx)
Definition av1dec.c:872
#define HWACCEL_MAX
static int get_pixel_format(AVCodecContext *avctx)
Definition av1dec.c:536
static int update_context_with_frame_header(AVCodecContext *avctx, const AV1RawFrameHeader *header)
Definition av1dec.c:832
static int get_current_frame(AVCodecContext *avctx)
Definition av1dec.c:1169
static int av1_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
Definition av1dec.c:1232
static void av1_frame_replace(AV1Frame *dst, const AV1Frame *src)
Definition av1dec.c:722
static int set_context_with_sequence(AVCodecContext *avctx, const AV1RawSequenceHeader *seq)
Definition av1dec.c:789
static const uint16_t div_lut[AV1_DIV_LUT_NUM]
same with Div_Lut defined in spec 7.11.3.7
Definition av1dec.c:46
static void load_grain_params(AV1DecContext *s)
Definition av1dec.c:390
static int get_tiles_info(AVCodecContext *avctx, const AV1RawTileGroup *tile_group)
Definition av1dec.c:428
static const AVClass av1_class
Definition av1dec.c:1539
#define OFFSET(x)
Definition av1dec.c:1531
static int16_t resolve_divisor(uint32_t d, uint16_t *shift)
Resolve divisor process.
Definition av1dec.c:159
static void update_reference_list(AVCodecContext *avctx)
Definition av1dec.c:1158
static int av1_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition av1dec.c:1476
static av_cold void av1_decode_flush(AVCodecContext *avctx)
Definition av1dec.c:1506
static int64_t round_two_signed(int64_t x, uint16_t n)
Definition av1dec.c:150
static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame, const AV1RawMetadataITUTT35 *itut_t35)
Definition av1dec.c:979
static av_cold int av1_decode_free(AVCodecContext *avctx)
Definition av1dec.c:763
static void av1_frame_unref(AV1Frame *f)
Definition av1dec.c:709
static int shift(int a, int b)
Definition bonk.c:261
uint32_t CodedBitstreamUnitType
The codec-specific type of a bitstream unit.
Definition cbs.h:66
common internal api header.
Macro definitions for various function/variable attributes.
#define av_fallthrough
Definition attributes.h:67
#define av_cold
Definition attributes.h:117
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
static av_always_inline av_const double round(double x)
Definition libm.h:446
uint8_t w
Definition llvidencdsp.c:39
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
Memory handling functions.
AVOptions.
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition pixdesc.c:3380
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition pixfmt.h:806
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition pixfmt.h:804
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_GRAY12
Definition pixfmt.h:526
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition pixfmt.h:379
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
Definition pixfmt.h:305
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_D3D12
Hardware surfaces for Direct3D 12.
Definition pixfmt.h:440
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
Definition pixfmt.h:134
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition pixfmt.h:260
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
Definition pixfmt.h:336
@ AV_PIX_FMT_CUARRAY
hardware decoding through openharmony
Definition pixfmt.h:506
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
Definition pixfmt.h:254
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition pixfmt.h:126
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition pixfmt.h:194
#define AV_PIX_FMT_GRAY10
Definition pixfmt.h:525
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
const AVProfile ff_av1_profiles[]
Definition profiles.c:163
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:120
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition refstruct.c:160
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
Definition refstruct.c:140
static const uint8_t header[24]
Definition sdr2.c:68
#define FF_ARRAY_ELEMS(a)
uint8_t twelve_bit
Definition cbs_av1.h:52
uint8_t matrix_coefficients
Definition cbs_av1.h:58
uint8_t subsampling_x
Definition cbs_av1.h:61
uint8_t chroma_sample_position
Definition cbs_av1.h:63
uint8_t high_bitdepth
Definition cbs_av1.h:51
uint8_t color_description_present_flag
Definition cbs_av1.h:55
uint8_t mono_chrome
Definition cbs_av1.h:53
uint8_t color_range
Definition cbs_av1.h:60
uint8_t transfer_characteristics
Definition cbs_av1.h:57
uint8_t subsampling_y
Definition cbs_av1.h:62
uint8_t color_primaries
Definition cbs_av1.h:56
uint8_t ar_coeffs_y_plus_128[24]
Definition cbs_av1.h:159
uint8_t ar_coeff_shift_minus_6
Definition cbs_av1.h:162
uint8_t point_y_value[14]
Definition cbs_av1.h:148
uint8_t grain_scale_shift
Definition cbs_av1.h:163
uint8_t point_cb_scaling[10]
Definition cbs_av1.h:153
uint8_t film_grain_params_ref_idx
Definition cbs_av1.h:146
uint8_t point_cr_scaling[10]
Definition cbs_av1.h:156
uint8_t ar_coeffs_cr_plus_128[25]
Definition cbs_av1.h:161
uint8_t clip_to_restricted_range
Definition cbs_av1.h:171
uint8_t point_cr_value[10]
Definition cbs_av1.h:155
uint8_t point_cb_value[10]
Definition cbs_av1.h:152
uint8_t chroma_scaling_from_luma
Definition cbs_av1.h:150
uint8_t grain_scaling_minus_8
Definition cbs_av1.h:157
uint8_t point_y_scaling[14]
Definition cbs_av1.h:149
uint8_t ar_coeffs_cb_plus_128[25]
Definition cbs_av1.h:160
AV1RawTileGroup tile_group
Definition cbs_av1.h:320
AV1RawFrameHeader header
Definition cbs_av1.h:319
uint8_t itu_t_t35_country_code
Definition cbs_av1.h:364
AVBufferRef * payload_ref
Definition cbs_av1.h:368
AV1RawFrameHeader frame_header
Definition cbs_av1.h:420
AV1RawOBUHeader header
Definition cbs_av1.h:414
AV1RawTileGroup tile_group
Definition cbs_av1.h:422
AV1RawSequenceHeader sequence_header
Definition cbs_av1.h:419
AV1RawFrame frame
Definition cbs_av1.h:421
union AV1RawOBU::@016362317061177152367125047142162076164261250366 obu
uint16_t max_frame_height_minus_1
Definition cbs_av1.h:108
uint8_t timing_info_present_flag
Definition cbs_av1.h:87
uint8_t seq_profile
Definition cbs_av1.h:83
AV1RawColorConfig color_config
Definition cbs_av1.h:137
uint8_t order_hint_bits_minus_1
Definition cbs_av1.h:131
AV1RawTimingInfo timing_info
Definition cbs_av1.h:92
uint8_t seq_level_idx[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:96
uint16_t max_frame_width_minus_1
Definition cbs_av1.h:107
uint8_t enable_order_hint
Definition cbs_av1.h:122
uint8_t * data
Definition cbs_av1.h:301
size_t data_size
Definition cbs_av1.h:303
uint16_t tg_start
Definition cbs_av1.h:312
AV1RawTileData tile_data
Definition cbs_av1.h:315
uint16_t tg_end
Definition cbs_av1.h:313
uint32_t time_scale
Definition cbs_av1.h:69
uint32_t num_units_in_display_tick
Definition cbs_av1.h:68
uint32_t num_ticks_per_picture_minus_1
Definition cbs_av1.h:72
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition avcodec.h:681
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:657
AVRational framerate
Definition avcodec.h:563
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition avcodec.h:628
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition avcodec.h:1423
int level
Encoding level descriptor.
Definition avcodec.h:1646
int profile
profile
Definition avcodec.h:1636
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
Definition avcodec.h:1779
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:671
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:664
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition avcodec.h:688
int extradata_size
Definition avcodec.h:527
struct AVCodecInternal * internal
Private context used for internal data.
Definition avcodec.h:478
void * priv_data
Definition avcodec.h:470
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition avcodec.h:1667
AVPacket * in_pkt
This packet is used to hold the packet given to decoders implementing the .decode API; it is unused b...
Definition internal.h:83
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
unsigned MaxFALL
Max average light level per frame (cd/m^2).
unsigned MaxCLL
Max content light level (cd/m^2).
This structure describes how to handle film grain synthesis for AOM codecs.
int chroma_scaling_from_luma
Signals whether to derive the chroma scaling function from the luma.
int limit_output_range
Signals to clip to limited color levels after film grain application.
int scaling_shift
Specifies the shift applied to the chroma components.
int grain_scale_shift
Signals the down shift applied to the generated gaussian numbers during synthesis.
int num_uv_points[2]
If chroma_scaling_from_luma is set to 0, signals the chroma scaling function parameters.
int overlap_flag
Signals whether to overlap film grain blocks.
int ar_coeff_lag
Specifies the auto-regression lag.
int uv_offset[2]
Offset used for component scaling function.
int ar_coeff_shift
Specifies the range of the auto-regressive coefficients.
uint8_t uv_points[2][10][2]
int8_t ar_coeffs_uv[2][25]
Chroma auto-regression coefficients.
int uv_mult[2]
Specifies the luma/chroma multipliers for the index to the component scaling function.
int8_t ar_coeffs_y[24]
Luma auto-regression coefficients.
int num_y_points
Number of points, and the scale and value for each point of the piecewise linear scaling function for...
This structure describes how to handle film grain synthesis in video for specific codecs.
enum AVColorPrimaries color_primaries
AVFilmGrainAOMParams aom
enum AVColorRange color_range
Intended video signal characteristics.
int subsampling_x
Intended subsampling ratio, or 0 for luma-only streams.
union AVFilmGrainParams::@177057277273004265167152242113040056044005264354 codec
Additional fields may be added both here and in any structure included.
enum AVFilmGrainParamsType type
Specifies the codec for which this structure is valid.
int width
Intended display resolution.
uint64_t seed
Seed to use for the synthesis process, if the codec allows for it.
enum AVColorTransferCharacteristic color_trc
enum AVColorSpace color_space
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
Mastering display metadata capable of representing the color volume of the display used to master the...
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
AVOption.
Definition opt.h:428
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition packet.h:424
uint8_t * data
Definition packet.h:425
This structure stores compressed data.
Definition packet.h:580
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition pixdesc.h:80
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition pixdesc.h:89
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
Coded bitstream unit structure.
Definition cbs.h:77
void * content
Pointer to the decomposed form of this unit.
Definition cbs.h:114
void * content_ref
If content is reference counted, a RefStruct reference backing content.
Definition cbs.h:119
uint8_t * data
Pointer to the directly-parsable bitstream form of this unit.
Definition cbs.h:88
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition cbs.h:81
size_t data_size
The number of bytes in the bitstream (including any padding bits in the final byte).
Definition cbs.h:93
AVBufferRef * data_ref
A reference to the buffer containing data.
Definition cbs.h:105
#define av_freep(p)
#define av_log(a,...)
#define src
Definition vp8dsp.c:248
static int ref[MAX_W *MAX_W]
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
int size
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
float delta