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