FFmpeg
Loading...
Searching...
No Matches
dec.c
Go to the documentation of this file.
1/*
2 * VVC video decoder
3 *
4 * Copyright (C) 2021 Nuo Mi
5 * Copyright (C) 2022 Xu Mu
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
26#include "libavcodec/decode.h"
28#include "libavcodec/hwconfig.h"
29#include "libavcodec/profiles.h"
30#include "libavutil/refstruct.h"
32#include "libavcodec/thread.h"
33#include "libavutil/cpu.h"
34#include "libavutil/mem.h"
35#include "libavutil/thread.h"
37
38#include "dec.h"
39#include "ctu.h"
40#include "data.h"
41#include "refs.h"
42#include "thread.h"
43#include "config_components.h"
44
45#define TAB_MAX 32
46
47typedef struct Tab {
48 void **tab;
49 size_t size;
50} Tab;
51
52typedef struct TabList {
55
56 int zero;
58} TabList;
59
60#define TL_ADD(t, s) do { \
61 av_assert0(l->nb_tabs < TAB_MAX); \
62 l->tabs[l->nb_tabs].tab = (void**)&fc->tab.t; \
63 l->tabs[l->nb_tabs].size = sizeof(*fc->tab.t) * (s); \
64 l->nb_tabs++; \
65} while (0)
66
67static void tl_init(TabList *l, const int zero, const int realloc)
68{
69 l->nb_tabs = 0;
70 l->zero = zero;
71 l->realloc = realloc;
72}
73
74static int tl_free(TabList *l)
75{
76 for (int i = 0; i < l->nb_tabs; i++)
77 av_freep(l->tabs[i].tab);
78
79 return 0;
80}
81
82static int tl_create(TabList *l)
83{
84 if (l->realloc) {
85 tl_free(l);
86
87 for (int i = 0; i < l->nb_tabs; i++) {
88 Tab *t = l->tabs + i;
89 if (!t->size)
90 continue;
91 *t->tab = l->zero ? av_mallocz(t->size) : av_malloc(t->size);
92 if (!*t->tab)
93 return AVERROR(ENOMEM);
94 }
95 }
96 return 0;
97}
98
99static int tl_zero(TabList *l)
100{
101 if (l->zero) {
102 for (int i = 0; i < l->nb_tabs; i++) {
103 Tab *t = l->tabs + i;
104 memset(*t->tab, 0, t->size);
105 }
106 }
107 return 0;
108}
109
111{
112 const VVCSPS *sps = fc->ps.sps;
113 const VVCPPS *pps = fc->ps.pps;
114 const int ctu_size = sps ? (1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y) : 0;
115 const int ctu_count = pps ? pps->ctb_count : 0;
116 const int changed = fc->tab.sz.ctu_count != ctu_count || fc->tab.sz.ctu_size != ctu_size;
117
118 tl_init(l, 0, changed);
119
120 TL_ADD(cus, ctu_count);
121 TL_ADD(ctus, ctu_count);
122 TL_ADD(deblock, ctu_count);
123 TL_ADD(sao, ctu_count);
124 TL_ADD(alf, ctu_count);
125 TL_ADD(slice_idx, ctu_count);
126 TL_ADD(coeffs, ctu_count * ctu_size * VVC_MAX_SAMPLE_ARRAYS);
127}
128
130{
131 const VVCPPS *pps = fc->ps.pps;
132 const int pic_size_in_min_cb = pps ? pps->min_cb_width * pps->min_cb_height : 0;
133 const int changed = fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
134
135 tl_init(l, 1, changed);
136
137 TL_ADD(imf, pic_size_in_min_cb);
138
139 for (int i = LUMA; i <= CHROMA; i++)
140 TL_ADD(cb_width[i], pic_size_in_min_cb); //is_a0_available requires this
141}
142
144{
145 const VVCPPS *pps = fc->ps.pps;
146 const int pic_size_in_min_cb = pps ? pps->min_cb_width * pps->min_cb_height : 0;
147 const int changed = fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
148
149 tl_init(l, 0, changed);
150
151 TL_ADD(skip, pic_size_in_min_cb);
152 TL_ADD(ipm, pic_size_in_min_cb);
153
154 for (int i = LUMA; i <= CHROMA; i++) {
155 TL_ADD(cqt_depth[i], pic_size_in_min_cb);
156 TL_ADD(cb_pos_x[i], pic_size_in_min_cb);
157 TL_ADD(cb_pos_y[i], pic_size_in_min_cb);
158 TL_ADD(cb_height[i], pic_size_in_min_cb);
159 TL_ADD(cp_mv[i], pic_size_in_min_cb * MAX_CONTROL_POINTS);
160 TL_ADD(cpm[i], pic_size_in_min_cb);
161 TL_ADD(pcmf[i], pic_size_in_min_cb);
162 }
163 // For luma, qp can only change at the CU level, so the qp tab size is related to the CU.
164 TL_ADD(qp[LUMA], pic_size_in_min_cb);
165}
166
168{
169 const VVCPPS *pps = fc->ps.pps;
170 const int pic_size_in_min_pu = pps ? pps->min_pu_width * pps->min_pu_height : 0;
171 const int changed = fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
172
173 tl_init(l, 1, changed);
174
175 TL_ADD(iaf, pic_size_in_min_pu);
176}
177
179{
180 const VVCPPS *pps = fc->ps.pps;
181 const int pic_size_in_min_pu = pps ? pps->min_pu_width * pps->min_pu_height : 0;
182 const int changed = fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
183
184 tl_init(l, 0, changed);
185
186 TL_ADD(msf, pic_size_in_min_pu);
187 TL_ADD(mmi, pic_size_in_min_pu);
188 TL_ADD(mvf, pic_size_in_min_pu);
189}
190
192{
193 const VVCPPS *pps = fc->ps.pps;
194 const int pic_size_in_min_tu = pps ? pps->min_tu_width * pps->min_tu_height : 0;
195 const int changed = fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
196
197 tl_init(l, 1, changed);
198
199 TL_ADD(tu_joint_cbcr_residual_flag, pic_size_in_min_tu);
200
201 for (int i = 0; i < VVC_MAX_SAMPLE_ARRAYS; i++) {
202 TL_ADD(tu_coded_flag[i], pic_size_in_min_tu);
203
204 for (int vertical = 0; vertical < 2; vertical++)
205 TL_ADD(bs[vertical][i], pic_size_in_min_tu);
206 }
207}
208
210{
211 const VVCPPS *pps = fc->ps.pps;
212 const int pic_size_in_min_tu = pps ? pps->min_tu_width * pps->min_tu_height : 0;
213 const int changed = fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
214
215 tl_init(l, 0, changed);
216
217 for (int i = LUMA; i <= CHROMA; i++) {
218 TL_ADD(tb_width[i], pic_size_in_min_tu);
219 TL_ADD(tb_height[i], pic_size_in_min_tu);
220 }
221
222 for (int vertical = 0; vertical < 2; vertical++) {
223 TL_ADD(max_len_p[vertical], pic_size_in_min_tu);
224 TL_ADD(max_len_q[vertical], pic_size_in_min_tu);
225 }
226
227 // For chroma, considering the joint CbCr, the QP tab size is related to the TU.
228 for (int i = CB; i < VVC_MAX_SAMPLE_ARRAYS; i++)
229 TL_ADD(qp[i], pic_size_in_min_tu);
230}
231
233{
234 const VVCSPS *sps = fc->ps.sps;
235 const VVCPPS *pps = fc->ps.pps;
236 const int width = pps ? pps->width : 0;
237 const int height = pps ? pps->height : 0;
238 const int ctu_width = pps ? pps->ctb_width : 0;
239 const int ctu_height = pps ? pps->ctb_height : 0;
240 const int chroma_idc = sps ? sps->r->sps_chroma_format_idc : 0;
241 const int ps = sps ? sps->pixel_shift : 0;
242 const int c_end = chroma_idc ? VVC_MAX_SAMPLE_ARRAYS : 1;
243 const int changed = fc->tab.sz.chroma_format_idc != chroma_idc ||
244 fc->tab.sz.width != width || fc->tab.sz.height != height ||
245 fc->tab.sz.ctu_width != ctu_width || fc->tab.sz.ctu_height != ctu_height ||
246 fc->tab.sz.pixel_shift != ps;
247
248 tl_init(l, 0, changed);
249
250 /* Add size 0 tabs for the components beyond c_end, so tl_free() frees
251 * tabs allocated under a previous, larger chroma format. */
252 for (int c_idx = 0; c_idx < VVC_MAX_SAMPLE_ARRAYS; c_idx++) {
253 const int active = c_idx < c_end;
254 const int w = active ? width >> (sps ? sps->hshift[c_idx] : 0) : 0;
255 const int h = active ? height >> (sps ? sps->vshift[c_idx] : 0) : 0;
256 const int border_pixels = c_idx ? ALF_BORDER_CHROMA : ALF_BORDER_LUMA;
257 TL_ADD(sao_pixel_buffer_h[c_idx], (w * 2 * ctu_height) << ps);
258 TL_ADD(sao_pixel_buffer_v[c_idx], (h * 2 * ctu_width) << ps);
259 for (int i = 0; i < 2; i++) {
260 TL_ADD(alf_pixel_buffer_h[c_idx][i], (w * border_pixels * ctu_height) << ps);
261 TL_ADD(alf_pixel_buffer_v[c_idx][i], h * ALF_PADDING_SIZE * ctu_width);
262 }
263 }
264}
265
267{
268 const VVCPPS *pps = fc->ps.pps;
269 const int w32 = pps ? AV_CEIL_RSHIFT(pps->width, 5) : 0;
270 const int h32 = pps ? AV_CEIL_RSHIFT(pps->height, 5) : 0;
271 const int changed = AV_CEIL_RSHIFT(fc->tab.sz.width, 5) != w32 ||
272 AV_CEIL_RSHIFT(fc->tab.sz.height, 5) != h32;
273
274 tl_init(l, 1, changed);
275
276 for (int i = LUMA; i <= CHROMA; i++)
277 TL_ADD(msm[i], w32 * h32);
278}
279
281{
282 const VVCPPS *pps = fc->ps.pps;
283 const int w64 = pps ? AV_CEIL_RSHIFT(pps->width, 6) : 0;
284 const int h64 = pps ? AV_CEIL_RSHIFT(pps->height, 6) : 0;
285 const int changed = AV_CEIL_RSHIFT(fc->tab.sz.width, 6) != w64 ||
286 AV_CEIL_RSHIFT(fc->tab.sz.height, 6) != h64;
287
288 tl_init(l, 1, changed);
289
290 TL_ADD(ispmf, w64 * h64);
291}
292
294{
295 const VVCSPS *sps = fc->ps.sps;
296 const VVCPPS *pps = fc->ps.pps;
297 const int ctu_height = pps ? pps->ctb_height : 0;
298 const int ctu_size = sps ? sps->ctb_size_y : 0;
299 const int ps = sps ? sps->pixel_shift : 0;
300 const int chroma_idc = sps ? sps->r->sps_chroma_format_idc : 0;
301 const int has_ibc = sps ? sps->r->sps_ibc_enabled_flag : 0;
302 const int changed = fc->tab.sz.chroma_format_idc != chroma_idc ||
303 fc->tab.sz.ctu_height != ctu_height ||
304 fc->tab.sz.ctu_size != ctu_size ||
305 fc->tab.sz.pixel_shift != ps;
306
307 fc->tab.sz.ibc_buffer_width = ctu_size ? 2 * MAX_CTU_SIZE * MAX_CTU_SIZE / ctu_size : 0;
308
309 tl_init(l, has_ibc, changed);
310
311 for (int i = LUMA; i < VVC_MAX_SAMPLE_ARRAYS; i++) {
312 const int hs = sps ? sps->hshift[i] : 0;
313 const int vs = sps ? sps->vshift[i] : 0;
314 TL_ADD(ibc_vir_buf[i], fc->tab.sz.ibc_buffer_width * ctu_size * ctu_height << ps >> hs >> vs);
315 }
316}
317
318typedef void (*tl_init_fn)(TabList *l, VVCFrameContext *fc);
319
320static int frame_context_for_each_tl(VVCFrameContext *fc, int (*unary_fn)(TabList *l))
321{
322 const tl_init_fn init[] = {
334 };
335
336 for (int i = 0; i < FF_ARRAY_ELEMS(init); i++) {
337 TabList l;
338 int ret;
339
340 init[i](&l, fc);
341 ret = unary_fn(&l);
342 if (ret < 0)
343 return ret;
344 }
345 return 0;
346}
347
349{
350 if (fc->tab.cus) {
351 for (int i = 0; i < fc->tab.sz.ctu_count; i++)
352 ff_vvc_ctu_free_cus(fc->tab.cus + i);
353 }
354}
355
357{
358 free_cus(fc);
360 av_refstruct_pool_uninit(&fc->rpl_tab_pool);
361 av_refstruct_pool_uninit(&fc->tab_dmvr_mvf_pool);
362
363 memset(&fc->tab.sz, 0, sizeof(fc->tab.sz));
364}
365
367{
368 const VVCSPS *sps = fc->ps.sps;
369 const VVCPPS *pps = fc->ps.pps;
370 const int ctu_count = pps->ctb_count;
371 const int pic_size_in_min_pu = pps->min_pu_width * pps->min_pu_height;
372 int ret;
373
374 free_cus(fc);
375
377 if (ret < 0)
378 return ret;
379
380 // for error handling case, we may call free_cus before VVC_TASK_STAGE_INIT, so we need to set cus to 0 here
381 memset(fc->tab.cus, 0, sizeof(*fc->tab.cus) * ctu_count);
382
383 memset(fc->tab.slice_idx, -1, sizeof(*fc->tab.slice_idx) * ctu_count);
384
385 if (fc->tab.sz.ctu_count != ctu_count) {
386 av_refstruct_pool_uninit(&fc->rpl_tab_pool);
387 fc->rpl_tab_pool = av_refstruct_pool_alloc(ctu_count * sizeof(RefPicListTab), 0);
388 if (!fc->rpl_tab_pool)
389 return AVERROR(ENOMEM);
390 }
391
392 if (fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu) {
393 av_refstruct_pool_uninit(&fc->tab_dmvr_mvf_pool);
394 fc->tab_dmvr_mvf_pool = av_refstruct_pool_alloc(
395 pic_size_in_min_pu * sizeof(MvField), AV_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME);
396 if (!fc->tab_dmvr_mvf_pool)
397 return AVERROR(ENOMEM);
398 }
399
400 fc->tab.sz.ctu_count = pps->ctb_count;
401 fc->tab.sz.ctu_size = 1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y;
402 fc->tab.sz.pic_size_in_min_cb = pps->min_cb_width * pps->min_cb_height;
403 fc->tab.sz.pic_size_in_min_pu = pic_size_in_min_pu;
404 fc->tab.sz.pic_size_in_min_tu = pps->min_tu_width * pps->min_tu_height;
405 fc->tab.sz.width = pps->width;
406 fc->tab.sz.height = pps->height;
407 fc->tab.sz.ctu_width = pps->ctb_width;
408 fc->tab.sz.ctu_height = pps->ctb_height;
409 fc->tab.sz.chroma_format_idc = sps->r->sps_chroma_format_idc;
410 fc->tab.sz.pixel_shift = sps->pixel_shift;
411
412 return 0;
413}
414
419
420static int min_positive(const int idx, const int diff, const int min_diff)
421{
422 return diff > 0 && (idx < 0 || diff < min_diff);
423}
424
425static int max_negtive(const int idx, const int diff, const int max_diff)
426{
427 return diff < 0 && (idx < 0 || diff > max_diff);
428}
429
430typedef int (*smvd_find_fxn)(const int idx, const int diff, const int old_diff);
431
432static int8_t smvd_find(const VVCFrameContext *fc, const SliceContext *sc, int lx, smvd_find_fxn find)
433{
434 const H266RawSliceHeader *rsh = sc->sh.r;
435 const RefPicList *rpl = sc->rpl + lx;
436 const int poc = fc->ref->poc;
437 int8_t idx = -1;
438 int old_diff = -1;
439 for (int i = 0; i < rsh->num_ref_idx_active[lx]; i++) {
440 if (!rpl->refs[i].is_lt) {
441 int diff = poc - rpl->refs[i].poc;
442 if (find(idx, diff, old_diff)) {
443 idx = i;
444 old_diff = diff;
445 }
446 }
447 }
448 return idx;
449}
450
452{
453 VVCSH *sh = &sc->sh;
454 if (IS_B(sh->r)) {
455 sh->ref_idx_sym[0] = smvd_find(fc, sc, 0, min_positive);
456 sh->ref_idx_sym[1] = smvd_find(fc, sc, 1, max_negtive);
457 if (sh->ref_idx_sym[0] == -1 || sh->ref_idx_sym[1] == -1) {
458 sh->ref_idx_sym[0] = smvd_find(fc, sc, 0, max_negtive);
459 sh->ref_idx_sym[1] = smvd_find(fc, sc, 1, min_positive);
460 }
461 }
462}
463
464static void eps_free(SliceContext *slice)
465{
466 av_freep(&slice->eps);
467 slice->nb_eps = 0;
468}
469
471{
472 if (fc->slices) {
473 for (int i = 0; i < fc->nb_slices_allocated; i++) {
474 SliceContext *slice = fc->slices[i];
475 if (slice) {
476 av_refstruct_unref(&slice->ref);
477 av_refstruct_unref(&slice->sh.r);
478 eps_free(slice);
479 av_free(slice);
480 }
481 }
482 av_freep(&fc->slices);
483 }
484 fc->nb_slices_allocated = 0;
485 fc->nb_slices = 0;
486}
487
489{
490 void *p;
491 const int size = (fc->nb_slices_allocated + 1) * 3 / 2;
492
493 if (fc->nb_slices < fc->nb_slices_allocated)
494 return 0;
495
496 p = av_realloc_array(fc->slices, size, sizeof(*fc->slices));
497 if (!p)
498 return AVERROR(ENOMEM);
499
500 fc->slices = p;
501 for (int i = fc->nb_slices_allocated; i < size; i++) {
502 fc->slices[i] = av_mallocz(sizeof(*fc->slices[0]));
503 if (!fc->slices[i]) {
504 fc->nb_slices_allocated = i;
505 return AVERROR(ENOMEM);
506 }
507 fc->slices[i]->slice_idx = i;
508 }
509 fc->nb_slices_allocated = size;
510
511 return 0;
512}
513
514static int get_ep_size(const H266RawSliceHeader *rsh, const GetByteContext *gb,
515 const H2645NAL *nal, const int header_size, const int ep_index)
516{
517 int size;
518
519 if (ep_index < rsh->num_entry_points) {
520 int skipped = 0;
521 int64_t start = bytestream2_tell(gb);
522 int64_t end = start + rsh->sh_entry_point_offset_minus1[ep_index] + 1;
523 while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= start + header_size) {
524 skipped++;
525 }
526 while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= end + header_size) {
527 end--;
528 skipped++;
529 }
530 size = end - start;
532 } else {
534 }
535 return size;
536}
537
539{
540 int ret;
541
543 ret = ff_init_cabac_decoder(&ep->cc, gb->buffer, size);
544 if (ret < 0)
545 return ret;
547 return 0;
548}
549
550static int ep_init(EntryPoint *ep, const int ctu_addr, const int ctu_end,
551 GetByteContext *gb, const int size)
552{
553 const int ret = ep_init_cabac_decoder(ep, gb, size);
554
555 if (ret < 0)
556 return ret;
557
558 ep->ctu_start = ctu_addr;
559 ep->ctu_end = ctu_end;
560
561 for (int c_idx = LUMA; c_idx <= CR; c_idx++)
562 ep->pp[c_idx].size = 0;
563
564 return 0;
565}
566
568 VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
569{
570 const VVCSH *sh = &sc->sh;
571 const H266RawSlice *slice = unit->content_ref;
572 int nb_eps = sh->r->num_entry_points + 1;
573 int ctu_addr = 0;
575 int ret;
576
577 if (sc->nb_eps != nb_eps) {
578 eps_free(sc);
579 sc->eps = av_calloc(nb_eps, sizeof(*sc->eps));
580 if (!sc->eps)
581 return AVERROR(ENOMEM);
582 sc->nb_eps = nb_eps;
583 }
584
585 bytestream2_init(&gb, slice->data, slice->data_size);
586
587 for (int i = 0; i < sc->nb_eps; i++)
588 {
589 const int size = get_ep_size(sc->sh.r, &gb, nal, slice->header_size, i);
590 const int ctu_end = (i + 1 == sc->nb_eps ? sh->num_ctus_in_curr_slice : sh->entry_point_start_ctu[i]);
591 EntryPoint *ep = sc->eps + i;
592
593 ret = ep_init(ep, ctu_addr, ctu_end, &gb, size);
594 if (ret < 0)
595 return ret;
596
597 for (int j = ep->ctu_start; j < ep->ctu_end; j++) {
598 const int rs = sc->sh.ctb_addr_in_curr_slice[j];
599 fc->tab.slice_idx[rs] = sc->slice_idx;
600 }
601
602 if (i + 1 < sc->nb_eps)
603 ctu_addr = sh->entry_point_start_ctu[i];
604 }
605
606 return 0;
607}
608
610{
611 const int size = s->nb_fcs;
612 const int idx = (fc - s->fcs + delta + size) % size;
613 return s->fcs + idx;
614}
615
616static int ref_frame(VVCFrame *dst, const VVCFrame *src)
617{
618 int ret;
619
620 ret = av_frame_ref(dst->frame, src->frame);
621 if (ret < 0)
622 return ret;
623
624 av_refstruct_replace(&dst->sps, src->sps);
625 av_refstruct_replace(&dst->pps, src->pps);
626
627 if (src->needs_fg) {
628 ret = av_frame_ref(dst->frame_grain, src->frame_grain);
629 if (ret < 0)
630 return ret;
631
632 dst->needs_fg = src->needs_fg;
633 }
634
635 av_refstruct_replace(&dst->progress, src->progress);
636
637 av_refstruct_replace(&dst->tab_dmvr_mvf, src->tab_dmvr_mvf);
638
639 av_refstruct_replace(&dst->rpl_tab, src->rpl_tab);
640 av_refstruct_replace(&dst->rpl, src->rpl);
641 av_refstruct_replace(&dst->hwaccel_picture_private,
642 src->hwaccel_picture_private);
643 dst->nb_rpl_elems = src->nb_rpl_elems;
644
645 dst->poc = src->poc;
646 dst->ctb_count = src->ctb_count;
647
648 dst->scaling_win = src->scaling_win;
649 dst->ref_width = src->ref_width;
650 dst->ref_height = src->ref_height;
651
652 dst->flags = src->flags;
653 dst->sequence = src->sequence;
654
655 return 0;
656}
657
659{
661
662 av_refstruct_pool_uninit(&fc->tu_pool);
663 av_refstruct_pool_uninit(&fc->cu_pool);
664
665 for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) {
666 ff_vvc_unref_frame(fc, &fc->DPB[i], ~0);
667 av_frame_free(&fc->DPB[i].frame);
668 av_frame_free(&fc->DPB[i].frame_grain);
669 }
670
673 av_frame_free(&fc->output_frame);
675 ff_vvc_sei_reset(&fc->sei);
676}
677
679{
680
681 fc->log_ctx = avctx;
682
683 fc->output_frame = av_frame_alloc();
684 if (!fc->output_frame)
685 return AVERROR(ENOMEM);
686
687 for (int j = 0; j < FF_ARRAY_ELEMS(fc->DPB); j++) {
688 fc->DPB[j].frame = av_frame_alloc();
689 if (!fc->DPB[j].frame)
690 return AVERROR(ENOMEM);
691
692 fc->DPB[j].frame_grain = av_frame_alloc();
693 if (!fc->DPB[j].frame_grain)
694 return AVERROR(ENOMEM);
695 }
696 fc->cu_pool = av_refstruct_pool_alloc(sizeof(CodingUnit), 0);
697 if (!fc->cu_pool)
698 return AVERROR(ENOMEM);
699
700 fc->tu_pool = av_refstruct_pool_alloc(sizeof(TransformUnit), 0);
701 if (!fc->tu_pool)
702 return AVERROR(ENOMEM);
703
704 return 0;
705}
706
708{
709 int ret;
710
711 // copy refs from the last frame
712 if (s->nb_frames && s->nb_fcs > 1) {
714 for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) {
715 ff_vvc_unref_frame(fc, &fc->DPB[i], ~0);
716 if (prev->DPB[i].frame->buf[0]) {
717 ret = ref_frame(&fc->DPB[i], &prev->DPB[i]);
718 if (ret < 0)
719 return ret;
720 }
721 }
722
723 ret = ff_vvc_sei_replace(&fc->sei, &prev->sei);
724 if (ret < 0)
725 return ret;
726 }
727
728 if (IS_IDR(s)) {
730 }
731
732 ret = pic_arrays_init(s, fc);
733 if (ret < 0)
734 return ret;
735 ff_vvc_dsp_init(&fc->vvcdsp, fc->ps.sps->bit_depth);
736 ff_videodsp_init(&fc->vdsp, fc->ps.sps->bit_depth);
737 return 0;
738}
739
740/* SEI does not affect decoding, so we ignore the return value */
742{
743 CodedBitstreamFragment *frame = &s->current_frame;
744
745 for (int i = 0; i < frame->nb_units; i++) {
746 const CodedBitstreamUnit *unit = frame->units + i;
747
748 if (unit->type == VVC_PREFIX_SEI_NUT) {
749 int ret = ff_vvc_sei_decode(&fc->sei, unit->content_ref, fc);
750 if (ret < 0)
751 return;
752 }
753 }
754}
755
757{
758 AVFrame *out = fc->ref->frame;
759
760 return ff_h2645_sei_to_frame(out, &fc->sei.common, AV_CODEC_ID_VVC, s->avctx,
761 NULL, fc->ps.sps->bit_depth, fc->ps.sps->bit_depth, fc->ref->poc);
762}
763
765{
766 int ret;
767
768 fc->ref->needs_fg = (fc->sei.common.film_grain_characteristics &&
769 fc->sei.common.film_grain_characteristics->present ||
770 fc->sei.common.itut_t35.aom_film_grain.enable) &&
771 !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
772 !s->avctx->hwaccel;
773
774 if (fc->ref->needs_fg &&
775 (fc->sei.common.film_grain_characteristics &&
776 fc->sei.common.film_grain_characteristics->present &&
777 !ff_h274_film_grain_params_supported(fc->sei.common.film_grain_characteristics->model_id,
778 fc->ref->frame->format) ||
779 !av_film_grain_params_select(fc->ref->frame))) {
780 av_log_once(s->avctx, AV_LOG_WARNING, AV_LOG_DEBUG, &s->film_grain_warning_shown,
781 "Unsupported film grain parameters. Ignoring film grain.\n");
782 fc->ref->needs_fg = 0;
783 }
784
785 if (fc->ref->needs_fg) {
786 fc->ref->frame_grain->format = fc->ref->frame->format;
787 fc->ref->frame_grain->width = fc->ref->frame->width;
788 fc->ref->frame_grain->height = fc->ref->frame->height;
789
790 ret = ff_thread_get_buffer(s->avctx, fc->ref->frame_grain, 0);
791 if (ret < 0)
792 return ret;
793
794 return av_frame_copy_props(fc->ref->frame_grain, fc->ref->frame);
795 }
796
797 return 0;
798}
799
801{
802 const VVCPH *ph = &fc->ps.ph;
803 const H266RawSliceHeader *rsh = sc->sh.r;
804 int ret;
805
806 // 8.3.1 Decoding process for picture order count
807 if (!s->temporal_id && !ph->r->ph_non_ref_pic_flag && !(IS_RASL(s) || IS_RADL(s)))
808 s->poc_tid0 = ph->poc;
809
811
812 if ((ret = ff_vvc_set_new_ref(s, fc, &fc->frame)) < 0)
813 goto fail;
814
815 ret = set_side_data(s, fc);
816 if (ret < 0)
817 goto fail;
818
819 ret = check_film_grain(s, fc);
820 if (ret < 0)
821 goto fail;
822
823 if (!IS_IDR(s))
825
826 av_frame_unref(fc->output_frame);
827
828 if ((ret = ff_vvc_output_frame(s, fc, fc->output_frame,rsh->sh_no_output_of_prior_pics_flag, 0)) < 0)
829 goto fail;
830
831 if ((ret = ff_vvc_frame_rpl(s, fc, sc)) < 0)
832 goto fail;
833
834 if ((ret = ff_vvc_frame_thread_init(fc)) < 0)
835 goto fail;
836 return 0;
837fail:
838 if (fc->ref)
839 ff_vvc_unref_frame(fc, fc->ref, ~0);
840 fc->ref = NULL;
841 return ret;
842}
843
845 const CodedBitstreamUnit *unit, const int is_first_slice)
846{
847 VVCSH *sh = &sc->sh;
848 int ret;
849
850 ret = ff_vvc_decode_sh(sh, &fc->ps, unit);
851 if (ret < 0)
852 return ret;
853
854 if (is_first_slice) {
855 ret = frame_start(s, fc, sc);
856 if (ret < 0)
857 return ret;
858 } else if (fc->ref) {
859 if (!IS_I(sh->r)) {
860 ret = ff_vvc_slice_rpl(s, fc, sc);
861 if (ret < 0) {
862 av_log(fc->log_ctx, AV_LOG_WARNING,
863 "Error constructing the reference lists for the current slice.\n");
864 return ret;
865 }
866 }
867 } else {
868 av_log(fc->log_ctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
869 return ret;
870 }
871
872 if (!IS_I(sh->r))
873 smvd_ref_idx(fc, sc);
874
875 return 0;
876}
877
879{
880#define HWACCEL_MAX CONFIG_VVC_VAAPI_HWACCEL
881
882 enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
883
884 switch (sps->pix_fmt) {
886#if CONFIG_VVC_VAAPI_HWACCEL
887 *fmt++ = AV_PIX_FMT_VAAPI;
888#endif
889 break;
891#if CONFIG_VVC_VAAPI_HWACCEL
892 *fmt++ = AV_PIX_FMT_VAAPI;
893#endif
894 break;
895 }
896
897 *fmt++ = sps->pix_fmt;
898 *fmt = AV_PIX_FMT_NONE;
899
900 return ff_get_format(avctx, pix_fmts);
901}
902
904{
905 AVCodecContext *c = s->avctx;
906 const VVCSPS *sps = fc->ps.sps;
907 const VVCPPS *pps = fc->ps.pps;
908
909 // Reset the format if pix_fmt/w/h change.
910 if (c->sw_pix_fmt != sps->pix_fmt || c->coded_width != pps->width || c->coded_height != pps->height) {
911 c->coded_width = pps->width;
912 c->coded_height = pps->height;
913 c->sw_pix_fmt = sps->pix_fmt;
914 c->pix_fmt = get_format(c, sps);
915 if (c->pix_fmt < 0)
916 return AVERROR_INVALIDDATA;
917 }
918
919 c->width = pps->width - ((pps->r->pps_conf_win_left_offset + pps->r->pps_conf_win_right_offset) << sps->hshift[CHROMA]);
920 c->height = pps->height - ((pps->r->pps_conf_win_top_offset + pps->r->pps_conf_win_bottom_offset) << sps->vshift[CHROMA]);
921
922 return 0;
923}
924
926{
927 int ret = ff_vvc_decode_frame_ps(fc, s);
928 if (ret < 0)
929 return ret;
930
931 ret = frame_context_setup(fc, s);
932 if (ret < 0)
933 return ret;
934
935 ret = export_frame_params(s, fc);
936 if (ret < 0)
937 return ret;
938
939 return 0;
940}
941
943 const H2645NAL *nal, const CodedBitstreamUnit *unit)
944{
945 int ret;
946 SliceContext *sc;
947 const int is_first_slice = !fc->nb_slices;
948
949 ret = slices_realloc(fc);
950 if (ret < 0)
951 return ret;
952
953 sc = fc->slices[fc->nb_slices];
955
956 s->vcl_unit_type = nal->type;
957 if (is_first_slice) {
958 ret = frame_setup(fc, s);
959 if (ret < 0)
960 return ret;
961 }
962
963 ret = slice_start(sc, s, fc, unit, is_first_slice);
964 if (ret < 0)
965 return ret;
966
967 ret = slice_init_entry_points(sc, fc, nal, unit);
968 if (ret < 0)
969 return ret;
970
971 if (s->avctx->hwaccel) {
972 if (is_first_slice) {
973 ret = FF_HW_CALL(s->avctx, start_frame, buf_ref, NULL, 0);
974 if (ret < 0)
975 return ret;
976 }
977
978 ret = FF_HW_CALL(s->avctx, decode_slice,
979 nal->raw_data, nal->raw_size);
980 if (ret < 0)
981 return ret;
982 }
983
984 fc->nb_slices++;
985
986 return 0;
987}
988
990 const H2645NAL *nal, const CodedBitstreamUnit *unit)
991{
992 int ret;
993
994 s->temporal_id = nal->temporal_id;
995
996 if (nal->nuh_layer_id > 0) {
998 "Decoding of multilayer bitstreams");
1000 }
1001
1002 switch (unit->type) {
1003 case VVC_VPS_NUT:
1004 case VVC_SPS_NUT:
1005 case VVC_PPS_NUT:
1006 /* vps, sps, sps cached by s->cbc */
1007 break;
1008 case VVC_TRAIL_NUT:
1009 case VVC_STSA_NUT:
1010 case VVC_RADL_NUT:
1011 case VVC_RASL_NUT:
1012 case VVC_IDR_W_RADL:
1013 case VVC_IDR_N_LP:
1014 case VVC_CRA_NUT:
1015 case VVC_GDR_NUT:
1016 ret = decode_slice(s, fc, buf_ref, nal, unit);
1017 if (ret < 0)
1018 return ret;
1019 break;
1020 case VVC_PREFIX_APS_NUT:
1021 case VVC_SUFFIX_APS_NUT:
1022 ret = ff_vvc_decode_aps(&s->ps, unit);
1023 if (ret < 0)
1024 return ret;
1025 break;
1026 case VVC_PREFIX_SEI_NUT:
1027 /* handle by decode_prefix_sei() */
1028 break;
1029
1030 case VVC_SUFFIX_SEI_NUT:
1031 /* SEI does not affect decoding, so we ignore the return value*/
1032 if (fc)
1033 ff_vvc_sei_decode(&fc->sei, unit->content_ref, fc);
1034 break;
1035 }
1036
1037 return 0;
1038}
1039
1041{
1042 const CodedBitstreamH266Context *h266 = s->cbc->priv_data;
1043 CodedBitstreamFragment *frame = &s->current_frame;
1044 int ret = 0;
1045 s->last_eos = s->eos;
1046 s->eos = 0;
1047 fc->ref = NULL;
1048
1049 ff_cbs_fragment_reset(frame);
1050 ret = ff_cbs_read_packet(s->cbc, frame, avpkt);
1051 if (ret < 0) {
1052 av_log(s->avctx, AV_LOG_ERROR, "Failed to read packet.\n");
1053 return ret;
1054 }
1055 /* decode the NAL units */
1056 for (int i = 0; i < frame->nb_units; i++) {
1057 const H2645NAL *nal = h266->common.read_packet.nals + i;
1058 const CodedBitstreamUnit *unit = frame->units + i;
1059
1060 if (unit->type == VVC_EOB_NUT || unit->type == VVC_EOS_NUT) {
1061 s->last_eos = 1;
1062 } else {
1063 ret = decode_nal_unit(s, fc, avpkt->buf, nal, unit);
1064 if (ret < 0) {
1065 av_log(s->avctx, AV_LOG_WARNING,
1066 "Error parsing NAL unit #%d.\n", i);
1067 goto fail;
1068 }
1069 }
1070 }
1071 return 0;
1072
1073fail:
1074 if (fc->ref)
1076 return ret;
1077}
1078
1080{
1081 const AVFilmGrainParams *fgp;
1082 int ret;
1083
1084 if (fc->ref->needs_fg) {
1085 av_assert0(fc->ref->frame_grain->buf[0]);
1086 fgp = av_film_grain_params_select(fc->ref->frame);
1087 switch (fgp->type) {
1089 av_assert0(0);
1090 return AVERROR_BUG;
1092 ret = ff_h274_apply_film_grain(fc->ref->frame_grain, fc->ref->frame, fgp);
1093 if (ret < 0)
1094 return ret;
1095 break;
1097 ret = ff_aom_apply_film_grain(fc->ref->frame_grain, fc->ref->frame, fgp);
1098 if (ret < 0)
1099 return ret;
1100 break;
1101 }
1102 }
1103
1104 if (!s->avctx->hwaccel && s->avctx->err_recognition & AV_EF_CRCCHECK) {
1105 VVCSEI *sei = &fc->sei;
1106 if (sei->picture_hash.present) {
1107 ret = ff_h274_hash_init(&s->hash_ctx, sei->picture_hash.hash_type);
1108 if (ret < 0)
1109 return ret;
1110
1111 ret = ff_h274_hash_verify(s->hash_ctx, &sei->picture_hash, fc->ref->frame, fc->ps.pps->width, fc->ps.pps->height);
1112 av_log(s->avctx, ret < 0 ? AV_LOG_ERROR : AV_LOG_DEBUG,
1113 "Verifying checksum for frame with decode_order %d: %s\n",
1114 (int)fc->decode_order, ret < 0 ? "incorrect": "correct");
1115 if (ret < 0 && (s->avctx->err_recognition & AV_EF_EXPLODE))
1116 return ret;
1117 }
1118 }
1119
1120 return 0;
1121}
1122
1123static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output)
1124{
1125 VVCFrameContext *delayed = get_frame_context(s, s->fcs, s->nb_frames - s->nb_delayed);
1126 int ret = ff_vvc_frame_wait(s, delayed);
1127
1128 if (!ret) {
1129 ret = frame_end(s, delayed);
1130 if (ret >= 0 && delayed->output_frame->buf[0] && output) {
1131 av_frame_move_ref(output, delayed->output_frame);
1132 *got_output = 1;
1133 }
1134 }
1135 s->nb_delayed--;
1136
1137 return ret;
1138}
1139
1140static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output)
1141{
1142 int ret;
1143
1144 if (s->avctx->hwaccel) {
1145 if (ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame) < 0) {
1146 av_log(s->avctx, AV_LOG_ERROR,
1147 "Hardware accelerator failed to decode picture\n");
1148 ff_vvc_unref_frame(fc, fc->ref, ~0);
1149 return ret;
1150 }
1151 } else {
1152 if (ret = ff_vvc_frame_submit(s, fc) < 0) {
1154 return ret;
1155 }
1156 }
1157
1158 s->nb_frames++;
1159 s->nb_delayed++;
1160
1161 if (s->nb_delayed >= s->nb_fcs || s->avctx->hwaccel) {
1162 if ((ret = wait_delayed_frame(s, output, got_output)) < 0)
1163 return ret;
1164 }
1165 return 0;
1166}
1167
1168static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
1169{
1170 int ret;
1171 while (s->nb_delayed) {
1172 if ((ret = wait_delayed_frame(s, output, got_output)) < 0)
1173 return ret;
1174 if (*got_output)
1175 return 0;
1176 }
1177 if (s->nb_frames) {
1178 //we still have frames cached in dpb.
1179 VVCFrameContext *last = get_frame_context(s, s->fcs, s->nb_frames - 1);
1180
1181 ret = ff_vvc_output_frame(s, last, output, 0, 1);
1182 if (ret < 0)
1183 return ret;
1184 *got_output = ret;
1185 }
1186 return 0;
1187}
1188
1189static int vvc_decode_frame(AVCodecContext *avctx, AVFrame *output,
1190 int *got_output, AVPacket *avpkt)
1191{
1192 VVCContext *s = avctx->priv_data;
1194 int ret;
1195
1196 if (!avpkt->size)
1197 return get_decoded_frame(s, output, got_output);
1198
1199 fc = get_frame_context(s, s->fcs, s->nb_frames);
1200
1201 fc->nb_slices = 0;
1202 fc->decode_order = s->nb_frames;
1203
1204 ret = decode_nal_units(s, fc, avpkt);
1205 if (ret < 0)
1206 return ret;
1207
1208 if (!fc->ft || !fc->ref)
1209 return avpkt->size;
1210
1211 ret = submit_frame(s, fc, output, got_output);
1212 if (ret < 0)
1213 return ret;
1214
1215 return avpkt->size;
1216}
1217
1219{
1220 VVCContext *s = avctx->priv_data;
1221 int got_output = 0;
1222
1223 while (s->nb_delayed)
1224 wait_delayed_frame(s, NULL, &got_output);
1225
1226 if (s->fcs) {
1227 VVCFrameContext *last = get_frame_context(s, s->fcs, s->nb_frames - 1);
1228 ff_vvc_sei_reset(&last->sei);
1229 ff_vvc_flush_dpb(last);
1230 }
1231
1232 s->ps.sps_id_used = 0;
1233
1234 s->eos = 1;
1235}
1236
1238{
1239 VVCContext *s = avctx->priv_data;
1240
1241 ff_cbs_fragment_free(&s->current_frame);
1242 vvc_decode_flush(avctx);
1243 ff_vvc_executor_free(&s->executor);
1244 if (s->fcs) {
1245 for (int i = 0; i < s->nb_fcs; i++)
1246 frame_context_free(s->fcs + i);
1247 av_free(s->fcs);
1248 }
1249 ff_h274_hash_freep(&s->hash_ctx);
1250 ff_vvc_ps_uninit(&s->ps);
1251 ff_cbs_close(&s->cbc);
1252
1253 return 0;
1254}
1255
1257{
1258 memset(&ff_vvc_default_scale_m, 16, sizeof(ff_vvc_default_scale_m));
1259}
1260
1261#define VVC_MAX_DELAYED_FRAMES 16
1263{
1264 VVCContext *s = avctx->priv_data;
1265 static AVOnce init_static_once = AV_ONCE_INIT;
1266 const int cpu_count = av_cpu_count();
1267 const int delayed = FFMIN(cpu_count, VVC_MAX_DELAYED_FRAMES);
1268 int thread_count = avctx->thread_count ? avctx->thread_count : delayed;
1269 int ret;
1270
1271 s->avctx = avctx;
1272
1273 ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_VVC, avctx);
1274 if (ret)
1275 return ret;
1276
1277 if (avctx->extradata_size > 0 && avctx->extradata) {
1278 ret = ff_cbs_read_extradata_from_codec(s->cbc, &s->current_frame, avctx);
1279 if (ret < 0)
1280 return ret;
1281 }
1282
1283 s->nb_fcs = (avctx->flags & AV_CODEC_FLAG_LOW_DELAY) ? 1 : delayed;
1284 s->fcs = av_calloc(s->nb_fcs, sizeof(*s->fcs));
1285 if (!s->fcs)
1286 return AVERROR(ENOMEM);
1287
1288 for (int i = 0; i < s->nb_fcs; i++) {
1289 VVCFrameContext *fc = s->fcs + i;
1290 ret = frame_context_init(fc, avctx);
1291 if (ret < 0)
1292 return ret;
1293 }
1294
1295 if (thread_count == 1)
1296 thread_count = 0;
1297 s->executor = ff_vvc_executor_alloc(s, thread_count);
1298 if (!s->executor)
1299 return AVERROR(ENOMEM);
1300
1301 s->eos = 1;
1303 ff_thread_once(&init_static_once, init_default_scale_m);
1304
1305 return 0;
1306}
1307
1309 .p.name = "vvc",
1310 .p.long_name = NULL_IF_CONFIG_SMALL("VVC (Versatile Video Coding)"),
1311 .p.type = AVMEDIA_TYPE_VIDEO,
1312 .p.id = AV_CODEC_ID_VVC,
1313 .priv_data_size = sizeof(VVCContext),
1317 .flush = vvc_decode_flush,
1322 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1323#if CONFIG_VVC_VAAPI_HWACCEL
1324 HWACCEL_VAAPI(vvc),
1325#endif
1326 NULL
1327 },
1328};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
const FFCodec ff_vvc_decoder
Definition dec.c:1308
int ff_aom_apply_film_grain(AVFrame *out, const AVFrame *in, const AVFilmGrainParams *params)
AOM film grain synthesis.
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
static void BS_FUNC skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
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
int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size)
Definition cabac.c:162
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int FUNC sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
static int FUNC ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
static int FUNC nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
#define FF_CODEC_DECODE_CB(func)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
#define AV_CEIL_RSHIFT(a, b)
Definition common.h:60
#define av_clip
Definition common.h:100
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
void ff_vvc_ctu_free_cus(CodingUnit **cus)
Definition ctu.c:2887
#define ALF_BORDER_CHROMA
Definition ctu.h:80
#define ALF_BORDER_LUMA
Definition ctu.h:79
#define MAX_CONTROL_POINTS
Definition ctu.h:67
#define ALF_PADDING_SIZE
Definition ctu.h:76
#define MAX_CTU_SIZE
Definition ctu.h:33
static const uint16_t fc[]
Definition dcaenc.h:43
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition decode.c:1229
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
Definition defs.h:48
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition defs.h:51
static AVFrame * frame
uint64_t pps
Definition dovi_rpuenc.c:36
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
static int decode_slice(AVCodecContext *c, void *arg)
Definition ffv1dec.c:449
const AVFilmGrainParams * av_film_grain_params_select(const AVFrame *frame)
Select the most appropriate film grain parameters set for the frame, taking into account the frame's ...
@ AV_FILM_GRAIN_PARAMS_H274
The union is valid when interpreted as AVFilmGrainH274Params (codec.h274)
@ AV_FILM_GRAIN_PARAMS_AV1
The union is valid when interpreted as AVFilmGrainAOMParams (codec.aom)
@ AV_FILM_GRAIN_PARAMS_NONE
#define fail
Definition test.h:479
#define AV_CODEC_CAP_OTHER_THREADS
Codec supports multithreading through a method other than slice- or frame-level multithreading.
Definition codec.h:112
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#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_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
Definition avcodec.h:404
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
Definition avcodec.h:314
@ AV_CODEC_ID_VVC
Definition codec_id.h:247
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition error.h:52
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition frame.c:523
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
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition frame.c:599
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
#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
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition mem.c:217
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, enum AVCodecID codec_id, AVCodecContext *avctx, const H2645VUI *vui, unsigned bit_depth_luma, unsigned bit_depth_chroma, int seed)
Definition h2645_sei.c:518
#define CHROMA(h)
Definition h264dec.h:88
int ff_h274_hash_init(H274HashContext **ctx, const int type)
Definition h274.c:929
void ff_h274_hash_freep(H274HashContext **ctx)
Definition h274.c:916
int ff_h274_hash_verify(H274HashContext *c, const H274SEIPictureHash *hash, const AVFrame *frame, const int coded_width, const int coded_height)
Definition h274.c:964
int ff_h274_apply_film_grain(AVFrame *out_frame, const AVFrame *in_frame, const AVFilmGrainParams *params)
Definition h274.c:245
static int ff_h274_film_grain_params_supported(int model_id, enum AVPixelFormat pix_fmt)
Check whether ff_h274_apply_film_grain() supports the given parameter combination.
Definition h274.h:39
#define LUMA
Definition filter.c:31
#define CR
Definition filter.c:33
#define CB
Definition filter.c:32
#define IS_IDR(s)
Definition hevcdec.h:74
#define FF_HW_SIMPLE_CALL(avctx, function)
#define FF_HW_CALL(avctx, function,...)
#define HWACCEL_VAAPI(codec)
Definition hwconfig.h:72
static int zero(InterplayACMContext *s, unsigned ind, unsigned col)
#define HWACCEL_MAX
Multithreading API for decoders.
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
Definition videodsp.c:39
@ VVC_MAX_SAMPLE_ARRAYS
Definition vvc.h:77
@ VVC_RASL_NUT
Definition vvc.h:32
@ VVC_SPS_NUT
Definition vvc.h:44
@ VVC_PREFIX_SEI_NUT
Definition vvc.h:52
@ VVC_EOS_NUT
Definition vvc.h:50
@ VVC_CRA_NUT
Definition vvc.h:38
@ VVC_IDR_N_LP
Definition vvc.h:37
@ VVC_TRAIL_NUT
Definition vvc.h:29
@ VVC_EOB_NUT
Definition vvc.h:51
@ VVC_SUFFIX_SEI_NUT
Definition vvc.h:53
@ VVC_RADL_NUT
Definition vvc.h:31
@ VVC_VPS_NUT
Definition vvc.h:43
@ VVC_IDR_W_RADL
Definition vvc.h:36
@ VVC_STSA_NUT
Definition vvc.h:30
@ VVC_GDR_NUT
Definition vvc.h:39
@ VVC_PREFIX_APS_NUT
Definition vvc.h:46
@ VVC_PPS_NUT
Definition vvc.h:45
@ VVC_SUFFIX_APS_NUT
Definition vvc.h:47
#define av_cold
Definition attributes.h:117
static atomic_int cpu_count
Definition cpu.c:57
int av_cpu_count(void)
Definition cpu.c:228
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
uint8_t w
Definition llvidencdsp.c:39
void av_log_once(void *avcl, int initial_level, int subsequent_level, int *state, const char *fmt,...)
Definition log.c:450
#define FFMIN(a, b)
Definition macros.h:49
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:264
Memory handling functions.
#define av_malloc(s)
Definition ops_static.c:52
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ 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_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition pixfmt.h:126
const AVProfile ff_vvc_profiles[]
Definition profiles.c:91
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
AVRefStructPool * av_refstruct_pool_alloc(size_t size, unsigned flags)
Equivalent to av_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
Definition refstruct.c:335
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
#define AV_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME
If this flag is set, the entries will be zeroed before being returned to the user (after the init or ...
Definition refstruct.h:221
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition refstruct.h:292
static void deblock(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int size, int dpos)
Definition rv60dec.c:2154
#define FF_ARRAY_ELEMS(a)
A reference to a data buffer.
Definition buffer.h:82
main external API structure.
Definition avcodec.h:443
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition avcodec.h:1579
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
int extradata_size
Definition avcodec.h:527
void * priv_data
Definition avcodec.h:470
This structure describes how to handle film grain synthesis in video for specific codecs.
enum AVFilmGrainParamsType type
Specifies the codec for which this structure is valid.
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition frame.h:649
This structure stores compressed data.
Definition packet.h:580
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition packet.h:586
int size
Definition packet.h:604
Coded bitstream fragment structure, combining one or more units.
Definition cbs.h:129
CodedBitstreamH2645Context common
Definition cbs_h266.h:865
Coded bitstream unit structure.
Definition cbs.h:77
void * content_ref
If content is reference counted, a RefStruct reference backing content.
Definition cbs.h:119
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition cbs.h:81
CABACContext cc
Definition ctu.h:375
int ctu_end
Definition ctu.h:371
int ctu_start
Definition ctu.h:370
Palette pp[VVC_MAX_SAMPLE_ARRAYS]
Definition ctu.h:378
const uint8_t * buffer
Definition bytestream.h:34
H2645NAL * nals
Definition h2645_parse.h:83
uint32_t sh_entry_point_offset_minus1[VVC_MAX_ENTRY_POINTS]
Definition cbs_h266.h:834
uint8_t sh_no_output_of_prior_pics_flag
Definition cbs_h266.h:781
uint32_t num_entry_points
NumEntryPoints.
Definition cbs_h266.h:838
uint8_t num_ref_idx_active[2]
NumRefIdxActive[].
Definition cbs_h266.h:839
uint8_t * data
Definition cbs_h266.h:846
size_t header_size
Definition cbs_h266.h:848
size_t data_size
Definition cbs_h266.h:849
uint8_t size
Definition ctu.h:285
VVCRefPic refs[VVC_MAX_REF_ENTRIES]
Definition dec.h:58
VVCSH sh
Definition dec.h:115
int slice_idx
Definition dec.h:114
int nb_eps
Definition dec.h:117
void * ref
RefStruct reference, backing slice data.
Definition dec.h:119
struct EntryPoint * eps
Definition dec.h:116
RefPicList * rpl
Definition dec.h:118
Definition dec.c:52
Tab tabs[TAB_MAX]
Definition dec.c:53
int realloc
Definition dec.c:57
int nb_tabs
Definition dec.c:54
int zero
Definition dec.c:56
Definition dec.c:47
size_t size
Definition dec.c:49
void ** tab
Definition dec.c:48
VVCFrame DPB[VVC_MAX_DPB_SIZE+1]
Definition dec.h:126
struct AVFrame * output_frame
Definition dec.h:129
VVCSEI sei
Definition dec.h:132
Definition dec.h:73
struct AVFrame * frame
Definition dec.h:74
Definition ps.h:147
Definition ps.h:92
int is_lt
Definition dec.h:50
int poc
Definition dec.h:49
Definition sei.h:36
Definition ps.h:238
const H266RawSliceHeader * r
RefStruct reference.
Definition ps.h:239
uint32_t entry_point_start_ctu[VVC_MAX_ENTRY_POINTS]
entry point start in ctu_addr
Definition ps.h:265
const uint32_t * ctb_addr_in_curr_slice
CtbAddrInCurrSlice.
Definition ps.h:244
uint32_t num_ctus_in_curr_slice
NumCtusInCurrSlice.
Definition ps.h:243
int8_t ref_idx_sym[2]
RefIdxSymL0, RefIdxSymL1.
Definition ps.h:248
Definition ps.h:58
#define av_free(p)
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
#define src
Definition vp8dsp.c:248
static FILE * out
Definition movenc.c:55
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
void ff_vvc_frame_thread_free(VVCFrameContext *fc)
Definition thread.c:703
int ff_vvc_frame_thread_init(VVCFrameContext *fc)
Definition thread.c:743
av_cold FFExecutor * ff_vvc_executor_alloc(VVCContext *s, const int thread_count)
Definition thread.c:687
int ff_vvc_frame_wait(VVCContext *s, VVCFrameContext *fc)
Definition thread.c:837
int ff_vvc_frame_submit(VVCContext *s, VVCFrameContext *fc)
Definition thread.c:808
av_cold void ff_vvc_executor_free(FFExecutor **e)
Definition thread.c:698
int size
#define imf
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
float delta
static double c[64]
uint8_t ff_vvc_default_scale_m[64 *64]
Definition data.c:1641
static int slice_init_entry_points(SliceContext *sc, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition dec.c:567
static void ibc_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:293
static av_cold int vvc_decode_init(AVCodecContext *avctx)
Definition dec.c:1262
static int check_film_grain(VVCContext *s, VVCFrameContext *fc)
Definition dec.c:764
static int8_t smvd_find(const VVCFrameContext *fc, const SliceContext *sc, int lx, smvd_find_fxn find)
Definition dec.c:432
static int export_frame_params(VVCContext *s, const VVCFrameContext *fc)
Definition dec.c:903
static void tl_init(TabList *l, const int zero, const int realloc)
Definition dec.c:67
static void min_cb_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:143
static void min_tu_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:209
static void pic_arrays_free(VVCFrameContext *fc)
Definition dec.c:356
static int slices_realloc(VVCFrameContext *fc)
Definition dec.c:488
static void min_cb_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:129
static VVCFrameContext * get_frame_context(const VVCContext *s, const VVCFrameContext *fc, const int delta)
Definition dec.c:609
static int ref_frame(VVCFrame *dst, const VVCFrame *src)
Definition dec.c:616
static int tl_zero(TabList *l)
Definition dec.c:99
static av_cold int vvc_decode_free(AVCodecContext *avctx)
Definition dec.c:1237
void(* tl_init_fn)(TabList *l, VVCFrameContext *fc)
Definition dec.c:318
static void msm_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:266
static enum AVPixelFormat get_format(AVCodecContext *avctx, const VVCSPS *sps)
Definition dec.c:878
#define TAB_MAX
Definition dec.c:45
static int pic_arrays_init(VVCContext *s, VVCFrameContext *fc)
Definition dec.c:366
static int min_positive(const int idx, const int diff, const int min_diff)
Definition dec.c:420
static void smvd_ref_idx(const VVCFrameContext *fc, SliceContext *sc)
Definition dec.c:451
static void ispmf_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:280
static int ep_init(EntryPoint *ep, const int ctu_addr, const int ctu_end, GetByteContext *gb, const int size)
Definition dec.c:550
static int tl_free(TabList *l)
Definition dec.c:74
static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output)
Definition dec.c:1140
static av_cold void vvc_decode_flush(AVCodecContext *avctx)
Definition dec.c:1218
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
Definition dec.c:844
static void ctu_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:110
static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output)
Definition dec.c:1123
static int decode_nal_unit(VVCContext *s, VVCFrameContext *fc, AVBufferRef *buf_ref, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition dec.c:989
static void eps_free(SliceContext *slice)
Definition dec.c:464
static void free_cus(VVCFrameContext *fc)
Definition dec.c:348
static int ep_init_cabac_decoder(EntryPoint *ep, GetByteContext *gb, const int size)
Definition dec.c:538
static av_cold void frame_context_free(VVCFrameContext *fc)
Definition dec.c:658
static int vvc_decode_frame(AVCodecContext *avctx, AVFrame *output, int *got_output, AVPacket *avpkt)
Definition dec.c:1189
static int frame_context_setup(VVCFrameContext *fc, VVCContext *s)
Definition dec.c:707
static int get_ep_size(const H266RawSliceHeader *rsh, const GetByteContext *gb, const H2645NAL *nal, const int header_size, const int ep_index)
Definition dec.c:514
static void min_tu_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:191
static void min_pu_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:178
static int max_negtive(const int idx, const int diff, const int max_diff)
Definition dec.c:425
static int frame_setup(VVCFrameContext *fc, VVCContext *s)
Definition dec.c:925
static void decode_prefix_sei(VVCFrameContext *fc, VVCContext *s)
Definition dec.c:741
#define TL_ADD(t, s)
Definition dec.c:60
static av_cold int frame_context_init(VVCFrameContext *fc, AVCodecContext *avctx)
Definition dec.c:678
int(* smvd_find_fxn)(const int idx, const int diff, const int old_diff)
Definition dec.c:430
static int frame_start(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition dec.c:800
int ff_vvc_per_frame_init(VVCFrameContext *fc)
Definition dec.c:415
static void min_pu_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:167
static int decode_nal_units(VVCContext *s, VVCFrameContext *fc, AVPacket *avpkt)
Definition dec.c:1040
static int tl_create(TabList *l)
Definition dec.c:82
static av_cold void init_default_scale_m(void)
Definition dec.c:1256
static void pixel_buffer_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition dec.c:232
static int frame_end(VVCContext *s, VVCFrameContext *fc)
Definition dec.c:1079
static int set_side_data(VVCContext *s, VVCFrameContext *fc)
Definition dec.c:756
static int decode_slice(VVCContext *s, VVCFrameContext *fc, AVBufferRef *buf_ref, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition dec.c:942
static int frame_context_for_each_tl(VVCFrameContext *fc, int(*unary_fn)(TabList *l))
Definition dec.c:320
#define VVC_MAX_DELAYED_FRAMES
Definition dec.c:1261
static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
Definition dec.c:1168
static void slices_free(VVCFrameContext *fc)
Definition dec.c:470
void ff_vvc_dsp_init(VVCDSPContext *vvcdsp, int bit_depth)
Definition dsp.c:86
int ff_vvc_decode_aps(VVCParamSets *ps, const CodedBitstreamUnit *unit)
Definition ps.c:1285
int ff_vvc_decode_frame_ps(struct VVCFrameContext *fc, struct VVCContext *s)
Definition ps.c:1058
void ff_vvc_ps_uninit(VVCParamSets *ps)
Definition ps.c:1088
void ff_vvc_frame_ps_free(VVCFrameParamSets *fps)
Definition ps.c:1078
int ff_vvc_decode_sh(VVCSH *sh, const VVCFrameParamSets *fps, const CodedBitstreamUnit *unit)
Definition ps.c:1481
#define IS_RASL(s)
Definition ps.h:35
#define GDR_SET_RECOVERED(s)
Definition ps.h:44
#define IS_I(rsh)
Definition ps.h:38
#define IS_RADL(s)
Definition ps.h:36
#define IS_B(rsh)
Definition ps.h:40
void ff_vvc_clear_refs(VVCFrameContext *fc)
Definition refs.c:86
int ff_vvc_frame_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition refs.c:601
void ff_vvc_unref_frame(VVCFrameContext *fc, VVCFrame *frame, int flags)
Definition refs.c:44
void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc)
Definition refs.c:336
void ff_vvc_report_frame_finished(VVCFrame *frame)
Definition refs.c:625
int ff_vvc_output_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *out, const int no_output_of_prior_pics_flag, int flush)
Definition refs.c:269
int ff_vvc_slice_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition refs.c:542
int ff_vvc_set_new_ref(VVCContext *s, VVCFrameContext *fc, AVFrame **frame)
Definition refs.c:226
void ff_vvc_flush_dpb(VVCFrameContext *fc)
Definition refs.c:93
void ff_vvc_sei_reset(VVCSEI *s)
Definition sei.c:279
int ff_vvc_sei_decode(VVCSEI *s, const H266RawSEI *sei, const struct VVCFrameContext *fc)
Definition sei.c:201
int ff_vvc_sei_replace(VVCSEI *dst, const VVCSEI *src)
Definition sei.c:272