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 if (tile_group->tg_end >= s->raw_frame_header->tile_cols * s->raw_frame_header->tile_rows)
441 return AVERROR_INVALIDDATA;
442
443 for (tile_num = tile_group->tg_start; tile_num <= tile_group->tg_end; tile_num++) {
444 tile_row = tile_num / s->raw_frame_header->tile_cols;
445 tile_col = tile_num % s->raw_frame_header->tile_cols;
446
447 if (tile_num == tile_group->tg_end) {
448 s->tile_group_info[tile_num].tile_size = bytestream2_get_bytes_left(&gb);
449 s->tile_group_info[tile_num].tile_offset = bytestream2_tell(&gb);
450 s->tile_group_info[tile_num].tile_row = tile_row;
451 s->tile_group_info[tile_num].tile_column = tile_col;
452 return 0;
453 }
454 size_bytes = s->raw_frame_header->tile_size_bytes_minus1 + 1;
455 if (bytestream2_get_bytes_left(&gb) < size_bytes)
456 return AVERROR_INVALIDDATA;
457 size = 0;
458 for (int i = 0; i < size_bytes; i++)
459 size |= bytestream2_get_byteu(&gb) << 8 * i;
461 return AVERROR_INVALIDDATA;
462 size++;
463
464 s->tile_group_info[tile_num].tile_size = size;
465 s->tile_group_info[tile_num].tile_offset = bytestream2_tell(&gb);
466 s->tile_group_info[tile_num].tile_row = tile_row;
467 s->tile_group_info[tile_num].tile_column = tile_col;
468
470 }
471
472 return 0;
473
474}
475
476static enum AVPixelFormat get_sw_pixel_format(void *logctx,
477 const AV1RawSequenceHeader *seq)
478{
479 int bit_depth;
481
482 if (seq->seq_profile == 2 && seq->color_config.high_bitdepth)
483 bit_depth = seq->color_config.twelve_bit ? 12 : 10;
484 else if (seq->seq_profile <= 2)
485 bit_depth = seq->color_config.high_bitdepth ? 10 : 8;
486 else {
487 av_log(logctx, AV_LOG_ERROR,
488 "Unknown AV1 profile %d.\n", seq->seq_profile);
489 return AV_PIX_FMT_NONE;
490 }
491
492 if (!seq->color_config.mono_chrome) {
493 // 4:4:4 x:0 y:0, 4:2:2 x:1 y:0, 4:2:0 x:1 y:1
494 if (seq->color_config.subsampling_x == 0 &&
495 seq->color_config.subsampling_y == 0) {
496 if (bit_depth == 8)
498 else if (bit_depth == 10)
500 else if (bit_depth == 12)
502 else
503 av_assert0(0);
504 } else if (seq->color_config.subsampling_x == 1 &&
505 seq->color_config.subsampling_y == 0) {
506 if (bit_depth == 8)
508 else if (bit_depth == 10)
510 else if (bit_depth == 12)
512 else
513 av_assert0(0);
514 } else if (seq->color_config.subsampling_x == 1 &&
515 seq->color_config.subsampling_y == 1) {
516 if (bit_depth == 8)
518 else if (bit_depth == 10)
520 else if (bit_depth == 12)
522 else
523 av_assert0(0);
524 }
525 } else {
526 if (bit_depth == 8)
528 else if (bit_depth == 10)
530 else if (bit_depth == 12)
532 else
533 av_assert0(0);
534 }
535
536 return pix_fmt;
537}
538
540{
541 AV1DecContext *s = avctx->priv_data;
542 const AV1RawSequenceHeader *seq = s->raw_seq;
543 int ret;
544 enum AVPixelFormat pix_fmt = get_sw_pixel_format(avctx, seq);
545#define HWACCEL_MAX (CONFIG_AV1_DXVA2_HWACCEL + \
546 CONFIG_AV1_D3D11VA_HWACCEL * 2 + \
547 CONFIG_AV1_D3D12VA_HWACCEL + \
548 CONFIG_AV1_NVDEC_HWACCEL + \
549 CONFIG_AV1_NVDEC_CUARRAY_HWACCEL + \
550 CONFIG_AV1_VAAPI_HWACCEL + \
551 CONFIG_AV1_VDPAU_HWACCEL + \
552 CONFIG_AV1_VIDEOTOOLBOX_HWACCEL + \
553 CONFIG_AV1_VULKAN_HWACCEL)
554 enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmtp = pix_fmts;
555
557 return -1;
558
559 switch (pix_fmt) {
561#if CONFIG_AV1_DXVA2_HWACCEL
562 *fmtp++ = AV_PIX_FMT_DXVA2_VLD;
563#endif
564#if CONFIG_AV1_D3D11VA_HWACCEL
565 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
566 *fmtp++ = AV_PIX_FMT_D3D11;
567#endif
568#if CONFIG_AV1_D3D12VA_HWACCEL
569 *fmtp++ = AV_PIX_FMT_D3D12;
570#endif
571#if CONFIG_AV1_NVDEC_HWACCEL
572 *fmtp++ = AV_PIX_FMT_CUDA;
573#endif
574#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
575 *fmtp++ = AV_PIX_FMT_CUARRAY;
576#endif
577#if CONFIG_AV1_VAAPI_HWACCEL
578 *fmtp++ = AV_PIX_FMT_VAAPI;
579#endif
580#if CONFIG_AV1_VDPAU_HWACCEL
581 *fmtp++ = AV_PIX_FMT_VDPAU;
582#endif
583#if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
584 *fmtp++ = AV_PIX_FMT_VIDEOTOOLBOX;
585#endif
586#if CONFIG_AV1_VULKAN_HWACCEL
587 *fmtp++ = AV_PIX_FMT_VULKAN;
588#endif
589 break;
591#if CONFIG_AV1_DXVA2_HWACCEL
592 *fmtp++ = AV_PIX_FMT_DXVA2_VLD;
593#endif
594#if CONFIG_AV1_D3D11VA_HWACCEL
595 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
596 *fmtp++ = AV_PIX_FMT_D3D11;
597#endif
598#if CONFIG_AV1_D3D12VA_HWACCEL
599 *fmtp++ = AV_PIX_FMT_D3D12;
600#endif
601#if CONFIG_AV1_NVDEC_HWACCEL
602 *fmtp++ = AV_PIX_FMT_CUDA;
603#endif
604#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
605 *fmtp++ = AV_PIX_FMT_CUARRAY;
606#endif
607#if CONFIG_AV1_VAAPI_HWACCEL
608 *fmtp++ = AV_PIX_FMT_VAAPI;
609#endif
610#if CONFIG_AV1_VDPAU_HWACCEL
611 *fmtp++ = AV_PIX_FMT_VDPAU;
612#endif
613#if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
614 *fmtp++ = AV_PIX_FMT_VIDEOTOOLBOX;
615#endif
616#if CONFIG_AV1_VULKAN_HWACCEL
617 *fmtp++ = AV_PIX_FMT_VULKAN;
618#endif
619 break;
621#if CONFIG_AV1_D3D11VA_HWACCEL
622 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
623 *fmtp++ = AV_PIX_FMT_D3D11;
624#endif
625#if CONFIG_AV1_D3D12VA_HWACCEL
626 *fmtp++ = AV_PIX_FMT_D3D12;
627#endif
628#if CONFIG_AV1_VULKAN_HWACCEL
629 *fmtp++ = AV_PIX_FMT_VULKAN;
630#endif
631 break;
633#if CONFIG_AV1_D3D11VA_HWACCEL
634 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
635 *fmtp++ = AV_PIX_FMT_D3D11;
636#endif
637#if CONFIG_AV1_VULKAN_HWACCEL
638 *fmtp++ = AV_PIX_FMT_VULKAN;
639#endif
640 break;
642#if CONFIG_AV1_D3D11VA_HWACCEL
643 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
644 *fmtp++ = AV_PIX_FMT_D3D11;
645#endif
646#if CONFIG_AV1_VULKAN_HWACCEL
647 *fmtp++ = AV_PIX_FMT_VULKAN;
648#endif
649 break;
651#if CONFIG_AV1_VULKAN_HWACCEL
652 *fmtp++ = AV_PIX_FMT_VULKAN;
653#endif
654 break;
656#if CONFIG_AV1_D3D11VA_HWACCEL
657 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
658 *fmtp++ = AV_PIX_FMT_D3D11;
659#endif
660#if CONFIG_AV1_VULKAN_HWACCEL
661 *fmtp++ = AV_PIX_FMT_VULKAN;
662#endif
663 break;
665#if CONFIG_AV1_D3D11VA_HWACCEL
666 *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
667 *fmtp++ = AV_PIX_FMT_D3D11;
668#endif
669#if CONFIG_AV1_VULKAN_HWACCEL
670 *fmtp++ = AV_PIX_FMT_VULKAN;
671#endif
672 break;
674#if CONFIG_AV1_VULKAN_HWACCEL
675 *fmtp++ = AV_PIX_FMT_VULKAN;
676#endif
677 break;
678 case AV_PIX_FMT_GRAY8:
679#if CONFIG_AV1_NVDEC_HWACCEL
680 *fmtp++ = AV_PIX_FMT_CUDA;
681#endif
682#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
683 *fmtp++ = AV_PIX_FMT_CUARRAY;
684#endif
685 break;
687#if CONFIG_AV1_NVDEC_HWACCEL
688 *fmtp++ = AV_PIX_FMT_CUDA;
689#endif
690#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
691 *fmtp++ = AV_PIX_FMT_CUARRAY;
692#endif
693 break;
694 }
695
696 *fmtp++ = pix_fmt;
697 *fmtp = AV_PIX_FMT_NONE;
698
699 /* the negotiated hwaccel can only be kept if the underlying pixel
700 * format did not change, otherwise its surfaces have the wrong format */
701 if (pix_fmt == avctx->sw_pix_fmt)
702 for (int i = 0; pix_fmts[i] != pix_fmt; i++)
703 if (pix_fmts[i] == avctx->pix_fmt) {
704 s->pix_fmt = pix_fmt;
705 return 1;
706 }
707
708 ret = ff_get_format(avctx, pix_fmts);
709
710 /**
711 * check if the HW accel is inited correctly. If not, return un-implemented.
712 * Since now the av1 decoder doesn't support native decode, if it will be
713 * implemented in the future, need remove this check.
714 */
715 if (!avctx->hwaccel) {
716 av_log(avctx, AV_LOG_ERROR, "Your platform doesn't support"
717 " hardware accelerated AV1 decoding.\n");
718 avctx->pix_fmt = AV_PIX_FMT_NONE;
719 return AVERROR(ENOSYS);
720 }
721
722 s->pix_fmt = pix_fmt;
723 avctx->pix_fmt = ret;
724
725 av_log(avctx, AV_LOG_DEBUG, "AV1 decode get format: %s.\n",
727
728 return 0;
729}
730
732{
733 av_refstruct_unref(&f->hwaccel_picture_private);
735 av_refstruct_unref(&f->header_ref);
736 f->raw_frame_header = NULL;
737 f->spatial_id = f->temporal_id = 0;
738 memset(f->skip_mode_frame_idx, 0,
739 2 * sizeof(uint8_t));
740 memset(&f->film_grain, 0, sizeof(f->film_grain));
741 f->coded_lossless = 0;
742}
743
745{
746 av_assert1(dst != src);
747
748 av_refstruct_replace(&dst->header_ref, src->header_ref);
749
750 dst->raw_frame_header = src->raw_frame_header;
751
752 av_refstruct_replace(&dst->hwaccel_picture_private,
753 src->hwaccel_picture_private);
755
756 dst->spatial_id = src->spatial_id;
757 dst->temporal_id = src->temporal_id;
758 memcpy(dst->gm_invalid,
759 src->gm_invalid,
760 AV1_NUM_REF_FRAMES * sizeof(uint8_t));
761 memcpy(dst->gm_type,
762 src->gm_type,
763 AV1_NUM_REF_FRAMES * sizeof(uint8_t));
764 memcpy(dst->gm_params,
765 src->gm_params,
766 AV1_NUM_REF_FRAMES * 6 * sizeof(int32_t));
767 memcpy(dst->skip_mode_frame_idx,
768 src->skip_mode_frame_idx,
769 2 * sizeof(uint8_t));
770 memcpy(&dst->film_grain,
771 &src->film_grain,
772 sizeof(dst->film_grain));
773 dst->coded_lossless = src->coded_lossless;
774
775 dst->order_hint = src->order_hint;
776 memcpy(dst->ref_frame_sign_bias, src->ref_frame_sign_bias,
777 sizeof(dst->ref_frame_sign_bias));
778 memcpy(dst->order_hints, src->order_hints,
779 sizeof(dst->order_hints));
780
781 dst->force_integer_mv = src->force_integer_mv;
782}
783
785{
786 AV1DecContext *s = avctx->priv_data;
787 AV1RawMetadataITUTT35 itut_t35;
788
789 for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++)
790 av1_frame_unref(&s->ref[i]);
791 av1_frame_unref(&s->cur_frame);
792 av_buffer_unref(&s->seq_data_ref);
793 av_refstruct_unref(&s->seq_ref);
794 av_refstruct_unref(&s->header_ref);
795 av_refstruct_unref(&s->cll_ref);
796 av_refstruct_unref(&s->mdcv_ref);
797 av_freep(&s->tile_group_info);
798
799 while (s->itut_t35_fifo && av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0)
800 av_buffer_unref(&itut_t35.payload_ref);
801 av_fifo_freep2(&s->itut_t35_fifo);
802
803 ff_cbs_fragment_free(&s->current_obu);
804 ff_cbs_close(&s->cbc);
805 ff_dovi_ctx_unref(&s->dovi);
806
807 return 0;
808}
809
811 const AV1RawSequenceHeader *seq)
812{
813 int width = seq->max_frame_width_minus_1 + 1;
814 int height = seq->max_frame_height_minus_1 + 1;
815
816 avctx->profile = seq->seq_profile;
817 avctx->level = seq->seq_level_idx[0];
818
820 avctx->color_range =
825 }
826
828 case AV1_CSP_VERTICAL:
830 break;
833 break;
834 }
835
836 if (avctx->width != width || avctx->height != height) {
837 int ret = ff_set_dimensions(avctx, width, height);
838 if (ret < 0)
839 return ret;
840 }
841
846
847 if (avctx->pix_fmt == AV_PIX_FMT_NONE)
848 avctx->pix_fmt = get_sw_pixel_format(avctx, seq);
849
850 return 0;
851}
852
855{
856 AVRational aspect_ratio;
857 int width = header->frame_width_minus_1 + 1;
858 int height = header->frame_height_minus_1 + 1;
859 int r_width = header->render_width_minus_1 + 1;
860 int r_height = header->render_height_minus_1 + 1;
861 int ret;
862
863 if (avctx->width != width || avctx->height != height) {
865 if (ret < 0)
866 return ret;
867 }
868
869 av_reduce(&aspect_ratio.num, &aspect_ratio.den,
870 (int64_t)height * r_width,
871 (int64_t)width * r_height,
872 INT_MAX);
873
874 if (av_cmp_q(avctx->sample_aspect_ratio, aspect_ratio)) {
875 ret = ff_set_sar(avctx, aspect_ratio);
876 if (ret < 0)
877 return ret;
878 }
879
880 return 0;
881}
882
892
894{
895 AV1DecContext *s = avctx->priv_data;
897 const AVPacketSideData *sd;
898 int ret;
899
900 s->avctx = avctx;
901 s->pkt = avctx->internal->in_pkt;
902 s->pix_fmt = AV_PIX_FMT_NONE;
903
904 ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_AV1, avctx);
905 if (ret < 0)
906 return ret;
907
908 s->cbc->decompose_unit_types = decompose_unit_types;
909 s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types);
910
911 s->itut_t35_fifo = av_fifo_alloc2(1, sizeof(AV1RawMetadataITUTT35),
913 if (!s->itut_t35_fifo)
914 return AVERROR(ENOMEM);
915
916 av_opt_set_int(s->cbc->priv_data, "operating_point", s->operating_point, 0);
917
918 if (avctx->extradata && avctx->extradata_size) {
919 ret = ff_cbs_read_extradata_from_codec(s->cbc,
920 &s->current_obu,
921 avctx);
922 if (ret < 0) {
923 av_log(avctx, AV_LOG_WARNING, "Failed to read extradata.\n");
924 goto end;
925 }
926
927 seq = ((CodedBitstreamAV1Context *)(s->cbc->priv_data))->sequence_header;
928 if (!seq) {
929 if (!(avctx->extradata[0] & 0x80))
930 av_log(avctx, AV_LOG_WARNING, "No sequence header available in extradata.\n");
931 goto end;
932 }
933
934 ret = set_context_with_sequence(avctx, seq);
935 if (ret < 0) {
936 av_log(avctx, AV_LOG_WARNING, "Failed to set decoder context.\n");
937 goto end;
938 }
939
940 end:
941 ff_cbs_fragment_reset(&s->current_obu);
942 }
943
944 s->dovi.logctx = avctx;
945 s->dovi.cfg.dv_profile = 10; // default for AV1
947 if (sd && sd->size >= sizeof(s->dovi.cfg))
948 s->dovi.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data;
949
950 return ret;
951}
952
954{
955 AV1DecContext *s = avctx->priv_data;
956 AV1RawFrameHeader *header= s->raw_frame_header;
957 AVFrame *frame;
958 int ret;
959
961 if (ret < 0) {
962 av_log(avctx, AV_LOG_ERROR, "Failed to update context with frame header\n");
963 return ret;
964 }
965
967 if (ret < 0)
968 goto fail;
969
970 frame = f->f;
971 if (header->frame_type == AV1_FRAME_KEY)
972 frame->flags |= AV_FRAME_FLAG_KEY;
973 else
974 frame->flags &= ~AV_FRAME_FLAG_KEY;
975
976 switch (header->frame_type) {
977 case AV1_FRAME_KEY:
979 frame->pict_type = AV_PICTURE_TYPE_I;
980 break;
981 case AV1_FRAME_INTER:
982 frame->pict_type = AV_PICTURE_TYPE_P;
983 break;
984 case AV1_FRAME_SWITCH:
985 frame->pict_type = AV_PICTURE_TYPE_SP;
986 break;
987 }
988
989 ret = ff_hwaccel_frame_priv_alloc(avctx, &f->hwaccel_picture_private);
990 if (ret < 0)
991 goto fail;
992
993 return 0;
994
995fail:
997 return ret;
998}
999
1001 const AV1RawMetadataITUTT35 *itut_t35)
1002{
1003 AV1DecContext *s = avctx->priv_data;
1004 FFITUTT35 itut35 = { .country_code = itut_t35->itu_t_t35_country_code };
1005 FFITUTT35Aux aux = { .dovi = &s->dovi };
1006 int ret;
1007
1008 ret = ff_itut_t35_parse_buffer(&itut35, itut_t35->payload, itut_t35->payload_size,
1010 if (ret <= 0)
1011 return ret;
1012
1013 ret = ff_itut_t35_parse_payload_to_frame(&itut35, &aux, avctx, frame);
1014 if (ret < 0)
1015 return ret;
1016
1017 return 0;
1018}
1019
1021{
1022 AV1DecContext *s = avctx->priv_data;
1023 AV1RawMetadataITUTT35 itut_t35;
1024 int ret = 0;
1025
1026 if (s->mdcv) {
1027 AVMasteringDisplayMetadata *mastering;
1028
1029 ret = ff_decode_mastering_display_new(avctx, frame, &mastering);
1030 if (ret < 0)
1031 return ret;
1032
1033 if (mastering) {
1034 for (int i = 0; i < 3; i++) {
1035 mastering->display_primaries[i][0] = av_make_q(s->mdcv->primary_chromaticity_x[i], 1 << 16);
1036 mastering->display_primaries[i][1] = av_make_q(s->mdcv->primary_chromaticity_y[i], 1 << 16);
1037 }
1038 mastering->white_point[0] = av_make_q(s->mdcv->white_point_chromaticity_x, 1 << 16);
1039 mastering->white_point[1] = av_make_q(s->mdcv->white_point_chromaticity_y, 1 << 16);
1040
1041 mastering->max_luminance = av_make_q(s->mdcv->luminance_max, 1 << 8);
1042 mastering->min_luminance = av_make_q(s->mdcv->luminance_min, 1 << 14);
1043
1044 mastering->has_primaries = 1;
1045 mastering->has_luminance = 1;
1046 }
1047 }
1048
1049 if (s->cll) {
1051
1052 ret = ff_decode_content_light_new(avctx, frame, &light);
1053 if (ret < 0)
1054 return ret;
1055
1056 if (light) {
1057 light->MaxCLL = s->cll->max_cll;
1058 light->MaxFALL = s->cll->max_fall;
1059 }
1060 }
1061
1062 while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0) {
1063 if (ret >= 0)
1064 ret = export_itut_t35(avctx, frame, &itut_t35);
1065 av_buffer_unref(&itut_t35.payload_ref);
1066 }
1067
1068 return ret;
1069}
1070
1072{
1073 AV1DecContext *s = avctx->priv_data;
1074 const AV1RawFilmGrainParams *film_grain = &s->cur_frame.film_grain;
1075 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(frame->format);
1076 AVFilmGrainParams *fgp;
1078
1079 av_assert0(pixdesc);
1080 if (!film_grain->apply_grain)
1081 return 0;
1082
1084 if (!fgp)
1085 return AVERROR(ENOMEM);
1086
1088 fgp->seed = film_grain->grain_seed;
1089 fgp->width = frame->width;
1090 fgp->height = frame->height;
1091 fgp->color_range = frame->color_range;
1092 fgp->color_primaries = frame->color_primaries;
1093 fgp->color_trc = frame->color_trc;
1094 fgp->color_space = frame->colorspace;
1095 fgp->subsampling_x = pixdesc->log2_chroma_w;
1096 fgp->subsampling_y = pixdesc->log2_chroma_h;
1097
1098 aom = &fgp->codec.aom;
1100 aom->scaling_shift = film_grain->grain_scaling_minus_8 + 8;
1101 aom->ar_coeff_lag = film_grain->ar_coeff_lag;
1102 aom->ar_coeff_shift = film_grain->ar_coeff_shift_minus_6 + 6;
1103 aom->grain_scale_shift = film_grain->grain_scale_shift;
1104 aom->overlap_flag = film_grain->overlap_flag;
1106
1107 aom->num_y_points = film_grain->num_y_points;
1108 for (int i = 0; i < film_grain->num_y_points; i++) {
1109 aom->y_points[i][0] = film_grain->point_y_value[i];
1110 aom->y_points[i][1] = film_grain->point_y_scaling[i];
1111 }
1112 aom->num_uv_points[0] = film_grain->num_cb_points;
1113 for (int i = 0; i < film_grain->num_cb_points; i++) {
1114 aom->uv_points[0][i][0] = film_grain->point_cb_value[i];
1115 aom->uv_points[0][i][1] = film_grain->point_cb_scaling[i];
1116 }
1117 aom->num_uv_points[1] = film_grain->num_cr_points;
1118 for (int i = 0; i < film_grain->num_cr_points; i++) {
1119 aom->uv_points[1][i][0] = film_grain->point_cr_value[i];
1120 aom->uv_points[1][i][1] = film_grain->point_cr_scaling[i];
1121 }
1122
1123 for (int i = 0; i < 24; i++) {
1124 aom->ar_coeffs_y[i] = film_grain->ar_coeffs_y_plus_128[i] - 128;
1125 }
1126 for (int i = 0; i < 25; i++) {
1127 aom->ar_coeffs_uv[0][i] = film_grain->ar_coeffs_cb_plus_128[i] - 128;
1128 aom->ar_coeffs_uv[1][i] = film_grain->ar_coeffs_cr_plus_128[i] - 128;
1129 }
1130
1131 aom->uv_mult[0] = film_grain->cb_mult - 128;
1132 aom->uv_mult[1] = film_grain->cr_mult - 128;
1133 aom->uv_mult_luma[0] = film_grain->cb_luma_mult - 128;
1134 aom->uv_mult_luma[1] = film_grain->cr_luma_mult - 128;
1135 aom->uv_offset[0] = film_grain->cb_offset - 256;
1136 aom->uv_offset[1] = film_grain->cr_offset - 256;
1137
1138 return 0;
1139}
1140
1142{
1143 AV1DecContext *s = avctx->priv_data;
1144 const AVFrame *srcframe = s->cur_frame.f;
1145 AVPacket *pkt = s->pkt;
1146 int ret;
1147
1148 // TODO: all layers
1149 if (s->operating_point_idc &&
1150 av_log2(s->operating_point_idc >> 8) > s->cur_frame.spatial_id)
1151 return 0;
1152
1153 ret = av_frame_ref(frame, srcframe);
1154 if (ret < 0)
1155 return ret;
1156
1157 ret = export_metadata(avctx, frame);
1158 if (ret < 0) {
1160 return ret;
1161 }
1162
1164 ret = export_film_grain(avctx, frame);
1165 if (ret < 0) {
1167 return ret;
1168 }
1169 }
1170
1171 frame->pts = pkt->pts;
1172 frame->pkt_dts = pkt->dts;
1173 if (pkt->flags & AV_PKT_FLAG_DISCARD)
1174 frame->flags |= AV_FRAME_FLAG_DISCARD;
1175 else
1176 frame->flags &= ~AV_FRAME_FLAG_DISCARD;
1177
1179
1180 return 0;
1181}
1182
1184{
1185 AV1DecContext *s = avctx->priv_data;
1186 const AV1RawFrameHeader *header = s->raw_frame_header;
1187
1188 for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) {
1189 if (header->refresh_frame_flags & (1 << i))
1190 av1_frame_replace(&s->ref[i], &s->cur_frame);
1191 }
1192}
1193
1195{
1196 AV1DecContext *s = avctx->priv_data;
1197 int ret;
1198
1199 av1_frame_unref(&s->cur_frame);
1200
1201 s->cur_frame.header_ref = av_refstruct_ref(s->header_ref);
1202
1203 s->cur_frame.raw_frame_header = s->raw_frame_header;
1204
1205 ret = init_tile_data(s);
1206 if (ret < 0) {
1207 av_log(avctx, AV_LOG_ERROR, "Failed to init tile data.\n");
1208 return ret;
1209 }
1210
1211 if ((avctx->skip_frame >= AVDISCARD_NONINTRA &&
1212 (s->raw_frame_header->frame_type != AV1_FRAME_KEY &&
1213 s->raw_frame_header->frame_type != AV1_FRAME_INTRA_ONLY)) ||
1214 (avctx->skip_frame >= AVDISCARD_NONKEY &&
1215 s->raw_frame_header->frame_type != AV1_FRAME_KEY) ||
1216 avctx->skip_frame >= AVDISCARD_ALL)
1217 return 0;
1218
1219 if (s->pix_fmt == AV_PIX_FMT_NONE) {
1220 ret = get_pixel_format(avctx);
1221 if (ret < 0) {
1222 av_log(avctx, AV_LOG_ERROR, "Failed to get pixel format.\n");
1223 return ret;
1224 }
1225
1226 if (!ret && FF_HW_HAS_CB(avctx, decode_params)) {
1227 ret = FF_HW_CALL(avctx, decode_params, AV1_OBU_SEQUENCE_HEADER,
1228 s->seq_data_ref->data, s->seq_data_ref->size);
1229 if (ret < 0) {
1230 av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n");
1231 return ret;
1232 }
1233 }
1234 }
1235
1236 ret = av1_frame_alloc(avctx, &s->cur_frame);
1237 if (ret < 0) {
1238 av_log(avctx, AV_LOG_ERROR,
1239 "Failed to allocate space for current frame.\n");
1240 return ret;
1241 }
1242
1248
1249 s->cur_frame.force_integer_mv =
1250 s->raw_frame_header->force_integer_mv ||
1251 s->raw_frame_header->frame_type == AV1_FRAME_KEY ||
1252 s->raw_frame_header->frame_type == AV1_FRAME_INTRA_ONLY;
1253
1254 return ret;
1255}
1256
1258{
1259 AV1DecContext *s = avctx->priv_data;
1260 AV1RawTileGroup *raw_tile_group = NULL;
1261 int i = 0, ret;
1262
1263 for (i = s->nb_unit; i < s->current_obu.nb_units; i++) {
1264 CodedBitstreamUnit *unit = &s->current_obu.units[i];
1265 AV1RawOBU *obu = unit->content;
1266 const AV1RawOBUHeader *header;
1267
1268 av_log(avctx, AV_LOG_DEBUG, "OBU idx:%d, type:%d, content available:%d.\n", i, unit->type, !!obu);
1269
1270 if (unit->type == AV1_OBU_TILE_LIST) {
1271 av_log(avctx, AV_LOG_ERROR, "Large scale tile decoding is unsupported.\n");
1273 goto end;
1274 }
1275
1276 if (!obu)
1277 continue;
1278
1279 header = &obu->header;
1280
1281 switch (unit->type) {
1283 ret = av_buffer_replace(&s->seq_data_ref, unit->data_ref);
1284 if (ret < 0)
1285 goto end;
1286
1287 s->seq_data_ref->data = unit->data;
1288 s->seq_data_ref->size = unit->data_size;
1289 av_refstruct_replace(&s->seq_ref, unit->content_ref);
1290
1291 s->raw_seq = &obu->obu.sequence_header;
1292 s->raw_frame_header = NULL;
1293 raw_tile_group = NULL;
1294
1295 ret = set_context_with_sequence(avctx, s->raw_seq);
1296 if (ret < 0) {
1297 av_log(avctx, AV_LOG_ERROR, "Failed to set context.\n");
1298 s->raw_seq = NULL;
1299 goto end;
1300 }
1301
1302 s->operating_point_idc = s->raw_seq->operating_point_idc[s->operating_point];
1303
1304 s->pix_fmt = AV_PIX_FMT_NONE;
1305
1306 if (FF_HW_HAS_CB(avctx, decode_params)) {
1307 ret = FF_HW_CALL(avctx, decode_params, AV1_OBU_SEQUENCE_HEADER,
1308 s->seq_data_ref->data, s->seq_data_ref->size);
1309 if (ret < 0) {
1310 av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n");
1311 return ret;
1312 }
1313 }
1314
1315 break;
1317 if (s->raw_frame_header)
1318 break;
1320 case AV1_OBU_FRAME:
1322 if (!s->raw_seq) {
1323 av_log(avctx, AV_LOG_ERROR, "Missing Sequence Header.\n");
1325 goto end;
1326 }
1327
1328 av_refstruct_replace(&s->header_ref, unit->content_ref);
1329
1330 raw_tile_group = NULL;
1331
1332 if (unit->type == AV1_OBU_FRAME)
1333 s->raw_frame_header = &obu->obu.frame.header;
1334 else
1335 s->raw_frame_header = &obu->obu.frame_header;
1336
1337 if (s->raw_frame_header->show_existing_frame) {
1338 av1_frame_replace(&s->cur_frame,
1339 &s->ref[s->raw_frame_header->frame_to_show_map_idx]);
1340
1341 update_reference_list(avctx);
1342
1343 if (s->cur_frame.f) {
1344 ret = set_output_frame(avctx, frame);
1345 if (ret < 0) {
1346 av_log(avctx, AV_LOG_ERROR, "Set output frame error.\n");
1347 goto end;
1348 }
1349 }
1350
1351 s->raw_frame_header = NULL;
1352 i++;
1353 ret = 0;
1354
1355 goto end;
1356 }
1357
1358 ret = get_current_frame(avctx);
1359 if (ret < 0) {
1360 av_log(avctx, AV_LOG_ERROR, "Get current frame error\n");
1361 goto end;
1362 }
1363
1364 s->cur_frame.spatial_id = header->spatial_id;
1365 s->cur_frame.temporal_id = header->temporal_id;
1366
1367 if (avctx->hwaccel && s->cur_frame.f) {
1368 ret = FF_HW_CALL(avctx, start_frame, s->pkt->buf,
1369 unit->data, unit->data_size);
1370 if (ret < 0) {
1371 av_log(avctx, AV_LOG_ERROR, "HW accel start frame fail.\n");
1372 goto end;
1373 }
1374 }
1375 if (unit->type != AV1_OBU_FRAME)
1376 break;
1378 case AV1_OBU_TILE_GROUP:
1379 if (!s->raw_frame_header) {
1380 av_log(avctx, AV_LOG_ERROR, "Missing Frame Header.\n");
1382 goto end;
1383 }
1384
1385 if (unit->type == AV1_OBU_FRAME)
1386 raw_tile_group = &obu->obu.frame.tile_group;
1387 else
1388 raw_tile_group = &obu->obu.tile_group;
1389
1390 ret = get_tiles_info(avctx, raw_tile_group);
1391 if (ret < 0)
1392 goto end;
1393
1394 if (avctx->hwaccel && s->cur_frame.f) {
1395 ret = FF_HW_CALL(avctx, decode_slice, raw_tile_group->tile_data.data,
1396 raw_tile_group->tile_data.data_size);
1397 if (ret < 0) {
1398 av_log(avctx, AV_LOG_ERROR,
1399 "HW accel decode slice fail.\n");
1400 goto end;
1401 }
1402 }
1403 break;
1405 s->raw_frame_header = NULL;
1406 raw_tile_group = NULL;
1407 break;
1408 case AV1_OBU_TILE_LIST:
1409 case AV1_OBU_PADDING:
1410 break;
1411 case AV1_OBU_METADATA:
1412 switch (obu->obu.metadata.metadata_type) {
1414 av_refstruct_replace(&s->cll_ref, unit->content_ref);
1415 s->cll = &obu->obu.metadata.metadata.hdr_cll;
1416 break;
1418 av_refstruct_replace(&s->mdcv_ref, unit->content_ref);
1419 s->mdcv = &obu->obu.metadata.metadata.hdr_mdcv;
1420 break;
1422 AV1RawMetadataITUTT35 itut_t35;
1423 memcpy(&itut_t35, &obu->obu.metadata.metadata.itut_t35, sizeof(itut_t35));
1424 itut_t35.payload_ref = av_buffer_ref(obu->obu.metadata.metadata.itut_t35.payload_ref);
1425 if (!itut_t35.payload_ref) {
1426 ret = AVERROR(ENOMEM);
1427 goto end;
1428 }
1429 ret = av_fifo_write(s->itut_t35_fifo, &itut_t35, 1);
1430 if (ret < 0) {
1431 av_buffer_unref(&itut_t35.payload_ref);
1432 goto end;
1433 }
1434 break;
1435 }
1436 default:
1437 break;
1438 }
1439 break;
1440 default:
1441 av_log(avctx, AV_LOG_DEBUG,
1442 "Unknown obu type: %d (%zu bits).\n",
1443 unit->type, unit->data_size);
1444 }
1445
1446 if (raw_tile_group && (s->tile_num == raw_tile_group->tg_end + 1)) {
1447 int show_frame = s->raw_frame_header->show_frame;
1448 // Set nb_unit to point at the next OBU, to indicate which
1449 // OBUs have been processed for this current frame. (If this
1450 // frame gets output, we set nb_unit to this value later too.)
1451 s->nb_unit = i + 1;
1452 if (avctx->hwaccel && s->cur_frame.f) {
1453 ret = FF_HW_SIMPLE_CALL(avctx, end_frame);
1454 if (ret < 0) {
1455 av_log(avctx, AV_LOG_ERROR, "HW accel end frame fail.\n");
1456 goto end;
1457 }
1458 }
1459
1460 update_reference_list(avctx);
1461
1462 // Set start_unit to indicate the first OBU of the next frame.
1463 s->start_unit = s->nb_unit;
1464 raw_tile_group = NULL;
1465 s->raw_frame_header = NULL;
1466
1467 if (show_frame) {
1468 // cur_frame.f needn't exist due to skip_frame.
1469 if (s->cur_frame.f) {
1470 ret = set_output_frame(avctx, frame);
1471 if (ret < 0) {
1472 av_log(avctx, AV_LOG_ERROR, "Set output frame error\n");
1473 goto end;
1474 }
1475 }
1476 i++;
1477 ret = 0;
1478 goto end;
1479 }
1480 }
1481 }
1482
1483 ret = AVERROR(EAGAIN);
1484end:
1485 av_assert0(i <= s->current_obu.nb_units);
1486 s->nb_unit = i;
1487
1488 if ((ret < 0 && ret != AVERROR(EAGAIN)) || s->current_obu.nb_units == i) {
1489 if (ret < 0)
1490 s->raw_frame_header = NULL;
1491 av_packet_unref(s->pkt);
1492 ff_cbs_fragment_reset(&s->current_obu);
1493 s->nb_unit = s->start_unit = 0;
1494 }
1495 if (!ret && !frame->buf[0])
1496 ret = AVERROR(EAGAIN);
1497
1498 return ret;
1499}
1500
1502{
1503 AV1DecContext *s = avctx->priv_data;
1504 int ret;
1505
1506 do {
1507 if (!s->current_obu.nb_units) {
1508 ret = ff_decode_get_packet(avctx, s->pkt);
1509 if (ret < 0)
1510 return ret;
1511
1512 ret = ff_cbs_read_packet(s->cbc, &s->current_obu, s->pkt);
1513 if (ret < 0) {
1514 ff_cbs_fragment_reset(&s->current_obu);
1515 av_packet_unref(s->pkt);
1516 av_log(avctx, AV_LOG_ERROR, "Failed to read packet.\n");
1517 return ret;
1518 }
1519
1520 s->nb_unit = s->start_unit = 0;
1521 av_log(avctx, AV_LOG_DEBUG, "Total OBUs on this packet: %d.\n",
1522 s->current_obu.nb_units);
1523 }
1524
1526 } while (ret == AVERROR(EAGAIN));
1527
1528 return ret;
1529}
1530
1532{
1533 AV1DecContext *s = avctx->priv_data;
1534 AV1RawMetadataITUTT35 itut_t35;
1535
1536 for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++)
1537 av1_frame_unref(&s->ref[i]);
1538
1539 av1_frame_unref(&s->cur_frame);
1540 s->operating_point_idc = 0;
1541 s->nb_unit = s->start_unit = 0;
1542 s->raw_frame_header = NULL;
1543 s->raw_seq = NULL;
1544 s->cll = NULL;
1545 s->mdcv = NULL;
1546 while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0)
1547 av_buffer_unref(&itut_t35.payload_ref);
1548
1549 ff_cbs_fragment_reset(&s->current_obu);
1550 ff_cbs_flush(s->cbc);
1551
1552 if (FF_HW_HAS_CB(avctx, flush))
1553 FF_HW_SIMPLE_CALL(avctx, flush);
1554}
1555
1556#define OFFSET(x) offsetof(AV1DecContext, x)
1557#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1558static const AVOption av1_options[] = {
1559 { "operating_point", "Select an operating point of the scalable bitstream",
1560 OFFSET(operating_point), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, AV1_MAX_OPERATING_POINTS - 1, VD },
1561 { NULL }
1562};
1563
1564static const AVClass av1_class = {
1565 .class_name = "AV1 decoder",
1566 .item_name = av_default_item_name,
1567 .option = av1_options,
1568 .version = LIBAVUTIL_VERSION_INT,
1569};
1570
1572 .p.name = "av1",
1573 CODEC_LONG_NAME("Alliance for Open Media AV1"),
1574 .p.type = AVMEDIA_TYPE_VIDEO,
1575 .p.id = AV_CODEC_ID_AV1,
1576 .priv_data_size = sizeof(AV1DecContext),
1580 .p.capabilities = AV_CODEC_CAP_DR1,
1581 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
1584 .flush = av1_decode_flush,
1586 .p.priv_class = &av1_class,
1587 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1588#if CONFIG_AV1_DXVA2_HWACCEL
1589 HWACCEL_DXVA2(av1),
1590#endif
1591#if CONFIG_AV1_D3D11VA_HWACCEL
1592 HWACCEL_D3D11VA(av1),
1593#endif
1594#if CONFIG_AV1_D3D11VA2_HWACCEL
1595 HWACCEL_D3D11VA2(av1),
1596#endif
1597#if CONFIG_AV1_D3D12VA_HWACCEL
1598 HWACCEL_D3D12VA(av1),
1599#endif
1600#if CONFIG_AV1_NVDEC_HWACCEL
1601 HWACCEL_NVDEC(av1),
1602#endif
1603#if CONFIG_AV1_NVDEC_CUARRAY_HWACCEL
1605#endif
1606#if CONFIG_AV1_VAAPI_HWACCEL
1607 HWACCEL_VAAPI(av1),
1608#endif
1609#if CONFIG_AV1_VDPAU_HWACCEL
1610 HWACCEL_VDPAU(av1),
1611#endif
1612#if CONFIG_AV1_VIDEOTOOLBOX_HWACCEL
1614#endif
1615#if CONFIG_AV1_VULKAN_HWACCEL
1616 HWACCEL_VULKAN(av1),
1617#endif
1618
1619 NULL
1620 },
1621};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition dsp.h:67
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:97
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:1571
#define VD
Definition amfdec.c:787
static const CodedBitstreamUnitType decompose_unit_types[]
Definition apv_parser.c:178
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 if all frames are skipped due to the skip_frame setting...
#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:2006
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:2355
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:1397
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:2310
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition decode.c:255
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition decode.c:1248
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:2383
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:1976
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:1999
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:615
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:613
int ret
Definition ffplay.c:391
static void show_frame(AVTextFormatContext *tfc, AVFrame *frame, AVStream *stream, AVFormatContext *fmt_ctx)
Definition ffprobe.c:1626
static int decode_slice(AVCodecContext *c, void *arg)
Definition ffv1dec.c:451
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:248
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition defs.h:247
@ AVDISCARD_NONINTRA
discard all non intra frames
Definition defs.h:246
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
Definition packet.h:280
#define AV_PKT_FLAG_DISCARD
Flag is used to discard packets which are required to maintain valid decoder state but are not requir...
Definition packet.h:664
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:435
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:140
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition buffer.c:234
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition buffer.c:104
#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_DISCARD
A flag to mark the frames which need to be decoded, but shouldn't be output.
Definition frame.h:698
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:694
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:499
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:281
#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:247
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:326
@ 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:951
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
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
enum MPFType type
Definition jpegmpfenc.c:55
@ 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:1020
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:476
static const AVOption av1_options[]
Definition av1dec.c:1558
static void coded_lossless_param(AV1DecContext *s)
Definition av1dec.c:336
static int export_film_grain(AVCodecContext *avctx, AVFrame *frame)
Definition av1dec.c:1071
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:1141
static int av1_frame_alloc(AVCodecContext *avctx, AV1Frame *f)
Definition av1dec.c:953
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:893
#define HWACCEL_MAX
static int get_pixel_format(AVCodecContext *avctx)
Definition av1dec.c:539
static int update_context_with_frame_header(AVCodecContext *avctx, const AV1RawFrameHeader *header)
Definition av1dec.c:853
static int get_current_frame(AVCodecContext *avctx)
Definition av1dec.c:1194
static int av1_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
Definition av1dec.c:1257
static void av1_frame_replace(AV1Frame *dst, const AV1Frame *src)
Definition av1dec.c:744
static int set_context_with_sequence(AVCodecContext *avctx, const AV1RawSequenceHeader *seq)
Definition av1dec.c:810
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:1564
#define OFFSET(x)
Definition av1dec.c:1556
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:1183
static int av1_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition av1dec.c:1501
static av_cold void av1_decode_flush(AVCodecContext *avctx)
Definition av1dec.c:1531
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:1000
static av_cold int av1_decode_free(AVCodecContext *avctx)
Definition av1dec.c:784
static void av1_frame_unref(AV1Frame *f)
Definition av1dec.c:731
static int shift(int a, int b)
Definition bonk.c:261
av_cold void CBS_FUNC close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
Definition cbs.c:118
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:97
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
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:3404
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3484
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:555
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition pixfmt.h:815
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition pixfmt.h:813
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:548
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:775
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:792
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:552
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:553
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:549
#define AV_PIX_FMT_GRAY12
Definition pixfmt.h:529
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:528
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:551
const AVProfile ff_av1_profiles[]
Definition profiles.c:177
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:121
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition refstruct.c:161
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
Definition refstruct.c:141
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:644
int width
picture width / height.
Definition avcodec.h:605
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:651
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition avcodec.h:685
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:658
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:629
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition avcodec.h:1429
int level
Encoding level descriptor.
Definition avcodec.h:1656
int profile
profile
Definition avcodec.h:1646
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
Definition avcodec.h:1789
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:672
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:665
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:692
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:1677
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:479
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:431
uint8_t * data
Definition packet.h:432
This structure stores compressed data.
Definition packet.h:587
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:99
#define width
Definition dsp.h:99
int size
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
float delta