FFmpeg
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 
24 #include "libavcodec/bytestream.h"
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 
47 typedef struct Tab {
48  void **tab;
49  size_t size;
50 } Tab;
51 
52 typedef struct TabList {
54  int nb_tabs;
55 
56  int zero;
57  int realloc;
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 
67 static 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 
74 static 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 
82 static 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  *t->tab = l->zero ? av_mallocz(t->size) : av_malloc(t->size);
90  if (!*t->tab)
91  return AVERROR(ENOMEM);
92  }
93  }
94  return 0;
95 }
96 
97 static int tl_zero(TabList *l)
98 {
99  if (l->zero) {
100  for (int i = 0; i < l->nb_tabs; i++) {
101  Tab *t = l->tabs + i;
102  memset(*t->tab, 0, t->size);
103  }
104  }
105  return 0;
106 }
107 
109 {
110  const VVCSPS *sps = fc->ps.sps;
111  const VVCPPS *pps = fc->ps.pps;
112  const int ctu_size = sps ? (1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y) : 0;
113  const int ctu_count = pps ? pps->ctb_count : 0;
114  const int changed = fc->tab.sz.ctu_count != ctu_count || fc->tab.sz.ctu_size != ctu_size;
115 
116  tl_init(l, 0, changed);
117 
118  TL_ADD(cus, ctu_count);
119  TL_ADD(ctus, ctu_count);
120  TL_ADD(deblock, ctu_count);
121  TL_ADD(sao, ctu_count);
122  TL_ADD(alf, ctu_count);
123  TL_ADD(slice_idx, ctu_count);
124  TL_ADD(coeffs, ctu_count * ctu_size * VVC_MAX_SAMPLE_ARRAYS);
125 }
126 
128 {
129  const VVCPPS *pps = fc->ps.pps;
130  const int pic_size_in_min_cb = pps ? pps->min_cb_width * pps->min_cb_height : 0;
131  const int changed = fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
132 
133  tl_init(l, 1, changed);
134 
135  TL_ADD(imf, pic_size_in_min_cb);
136 
137  for (int i = LUMA; i <= CHROMA; i++)
138  TL_ADD(cb_width[i], pic_size_in_min_cb); //is_a0_available requires this
139 }
140 
142 {
143  const VVCPPS *pps = fc->ps.pps;
144  const int pic_size_in_min_cb = pps ? pps->min_cb_width * pps->min_cb_height : 0;
145  const int changed = fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
146 
147  tl_init(l, 0, changed);
148 
149  TL_ADD(skip, pic_size_in_min_cb);
150  TL_ADD(ipm, pic_size_in_min_cb);
151 
152  for (int i = LUMA; i <= CHROMA; i++) {
153  TL_ADD(cqt_depth[i], pic_size_in_min_cb);
154  TL_ADD(cb_pos_x[i], pic_size_in_min_cb);
155  TL_ADD(cb_pos_y[i], pic_size_in_min_cb);
156  TL_ADD(cb_height[i], pic_size_in_min_cb);
157  TL_ADD(cp_mv[i], pic_size_in_min_cb * MAX_CONTROL_POINTS);
158  TL_ADD(cpm[i], pic_size_in_min_cb);
159  TL_ADD(pcmf[i], pic_size_in_min_cb);
160  }
161  // For luma, qp can only change at the CU level, so the qp tab size is related to the CU.
162  TL_ADD(qp[LUMA], pic_size_in_min_cb);
163 }
164 
166 {
167  const VVCPPS *pps = fc->ps.pps;
168  const int pic_size_in_min_pu = pps ? pps->min_pu_width * pps->min_pu_height : 0;
169  const int changed = fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
170 
171  tl_init(l, 1, changed);
172 
173  TL_ADD(iaf, pic_size_in_min_pu);
174 }
175 
177 {
178  const VVCPPS *pps = fc->ps.pps;
179  const int pic_size_in_min_pu = pps ? pps->min_pu_width * pps->min_pu_height : 0;
180  const int changed = fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
181 
182  tl_init(l, 0, changed);
183 
184  TL_ADD(msf, pic_size_in_min_pu);
185  TL_ADD(mmi, pic_size_in_min_pu);
186  TL_ADD(mvf, pic_size_in_min_pu);
187 }
188 
190 {
191  const VVCPPS *pps = fc->ps.pps;
192  const int pic_size_in_min_tu = pps ? pps->min_tu_width * pps->min_tu_height : 0;
193  const int changed = fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
194 
195  tl_init(l, 1, changed);
196 
197  TL_ADD(tu_joint_cbcr_residual_flag, pic_size_in_min_tu);
198 
199  for (int i = 0; i < VVC_MAX_SAMPLE_ARRAYS; i++) {
200  TL_ADD(tu_coded_flag[i], pic_size_in_min_tu);
201 
202  for (int vertical = 0; vertical < 2; vertical++)
203  TL_ADD(bs[vertical][i], pic_size_in_min_tu);
204  }
205 }
206 
208 {
209  const VVCPPS *pps = fc->ps.pps;
210  const int pic_size_in_min_tu = pps ? pps->min_tu_width * pps->min_tu_height : 0;
211  const int changed = fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
212 
213  tl_init(l, 0, changed);
214 
215  for (int i = LUMA; i <= CHROMA; i++) {
216  TL_ADD(tb_width[i], pic_size_in_min_tu);
217  TL_ADD(tb_height[i], pic_size_in_min_tu);
218  }
219 
220  for (int vertical = 0; vertical < 2; vertical++) {
221  TL_ADD(max_len_p[vertical], pic_size_in_min_tu);
222  TL_ADD(max_len_q[vertical], pic_size_in_min_tu);
223  }
224 
225  // For chroma, considering the joint CbCr, the QP tab size is related to the TU.
226  for (int i = CB; i < VVC_MAX_SAMPLE_ARRAYS; i++)
227  TL_ADD(qp[i], pic_size_in_min_tu);
228 }
229 
231 {
232  const VVCSPS *sps = fc->ps.sps;
233  const VVCPPS *pps = fc->ps.pps;
234  const int width = pps ? pps->width : 0;
235  const int height = pps ? pps->height : 0;
236  const int ctu_width = pps ? pps->ctb_width : 0;
237  const int ctu_height = pps ? pps->ctb_height : 0;
238  const int chroma_idc = sps ? sps->r->sps_chroma_format_idc : 0;
239  const int ps = sps ? sps->pixel_shift : 0;
240  const int c_end = chroma_idc ? VVC_MAX_SAMPLE_ARRAYS : 1;
241  const int changed = fc->tab.sz.chroma_format_idc != chroma_idc ||
242  fc->tab.sz.width != width || fc->tab.sz.height != height ||
243  fc->tab.sz.ctu_width != ctu_width || fc->tab.sz.ctu_height != ctu_height ||
244  fc->tab.sz.pixel_shift != ps;
245 
246  tl_init(l, 0, changed);
247 
248  for (int c_idx = 0; c_idx < c_end; c_idx++) {
249  const int w = width >> (sps ? sps->hshift[c_idx] : 0);
250  const int h = height >> (sps ? sps->vshift[c_idx] : 0);
251  TL_ADD(sao_pixel_buffer_h[c_idx], (w * 2 * ctu_height) << ps);
252  TL_ADD(sao_pixel_buffer_v[c_idx], (h * 2 * ctu_width) << ps);
253  }
254 
255  for (int c_idx = 0; c_idx < c_end; c_idx++) {
256  const int w = width >> (sps ? sps->hshift[c_idx] : 0);
257  const int h = height >> (sps ? sps->vshift[c_idx] : 0);
258  const int border_pixels = c_idx ? ALF_BORDER_CHROMA : ALF_BORDER_LUMA;
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 
318 typedef void (*tl_init_fn)(TabList *l, VVCFrameContext *fc);
319 
320 static int frame_context_for_each_tl(VVCFrameContext *fc, int (*unary_fn)(TabList *l))
321 {
322  const tl_init_fn init[] = {
331  msm_tl_init,
333  ibc_tl_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 
416 {
418 }
419 
420 static 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 
425 static 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 
430 typedef int (*smvd_find_fxn)(const int idx, const int diff, const int old_diff);
431 
432 static 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 
451 static void smvd_ref_idx(const VVCFrameContext *fc, SliceContext *sc)
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 
464 static 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 
514 static 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 
538 static int ep_init_cabac_decoder(EntryPoint *ep, GetByteContext *gb, const int size)
539 {
540  int ret;
541 
543  ret = ff_init_cabac_decoder(&ep->cc, gb->buffer, size);
544  if (ret < 0)
545  return ret;
546  bytestream2_skipu(gb, size);
547  return 0;
548 }
549 
550 static 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;
574  GetByteContext gb;
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 
616 static 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 {
660  slices_free(fc);
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);
674  ff_vvc_frame_ps_free(&fc->ps);
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) {
713  VVCFrameContext *prev = get_frame_context(s, fc, -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)) {
729  s->seq_decode = (s->seq_decode + 1) & 0xff;
731  }
732 
733  ret = pic_arrays_init(s, fc);
734  if (ret < 0)
735  return ret;
736  ff_vvc_dsp_init(&fc->vvcdsp, fc->ps.sps->bit_depth);
737  ff_videodsp_init(&fc->vdsp, fc->ps.sps->bit_depth);
738  return 0;
739 }
740 
741 /* SEI does not affect decoding, so we ignore the return value */
743 {
744  CodedBitstreamFragment *frame = &s->current_frame;
745 
746  for (int i = 0; i < frame->nb_units; i++) {
747  const CodedBitstreamUnit *unit = frame->units + i;
748 
749  if (unit->type == VVC_PREFIX_SEI_NUT) {
750  int ret = ff_vvc_sei_decode(&fc->sei, unit->content_ref, fc);
751  if (ret < 0)
752  return;
753  }
754  }
755 }
756 
758 {
759  AVFrame *out = fc->ref->frame;
760 
761  return ff_h2645_sei_to_frame(out, &fc->sei.common, AV_CODEC_ID_VVC, s->avctx,
762  NULL, fc->ps.sps->bit_depth, fc->ps.sps->bit_depth, fc->ref->poc);
763 }
764 
766 {
767  int ret;
768 
769  fc->ref->needs_fg = (fc->sei.common.film_grain_characteristics &&
770  fc->sei.common.film_grain_characteristics->present ||
771  fc->sei.common.aom_film_grain.enable) &&
772  !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
773  !s->avctx->hwaccel;
774 
775  if (fc->ref->needs_fg &&
776  (fc->sei.common.film_grain_characteristics &&
777  fc->sei.common.film_grain_characteristics->present &&
778  !ff_h274_film_grain_params_supported(fc->sei.common.film_grain_characteristics->model_id,
779  fc->ref->frame->format) ||
780  !av_film_grain_params_select(fc->ref->frame))) {
781  av_log_once(s->avctx, AV_LOG_WARNING, AV_LOG_DEBUG, &s->film_grain_warning_shown,
782  "Unsupported film grain parameters. Ignoring film grain.\n");
783  fc->ref->needs_fg = 0;
784  }
785 
786  if (fc->ref->needs_fg) {
787  fc->ref->frame_grain->format = fc->ref->frame->format;
788  fc->ref->frame_grain->width = fc->ref->frame->width;
789  fc->ref->frame_grain->height = fc->ref->frame->height;
790 
791  ret = ff_thread_get_buffer(s->avctx, fc->ref->frame_grain, 0);
792  if (ret < 0)
793  return ret;
794 
795  return av_frame_copy_props(fc->ref->frame_grain, fc->ref->frame);
796  }
797 
798  return 0;
799 }
800 
802 {
803  const VVCPH *ph = &fc->ps.ph;
804  const H266RawSliceHeader *rsh = sc->sh.r;
805  int ret;
806 
807  // 8.3.1 Decoding process for picture order count
808  if (!s->temporal_id && !ph->r->ph_non_ref_pic_flag && !(IS_RASL(s) || IS_RADL(s)))
809  s->poc_tid0 = ph->poc;
810 
811  if ((ret = ff_vvc_set_new_ref(s, fc, &fc->frame)) < 0)
812  goto fail;
813 
815 
816  ret = set_side_data(s, fc);
817  if (ret < 0)
818  goto fail;
819 
820  ret = check_film_grain(s, fc);
821  if (ret < 0)
822  goto fail;
823 
824  if (!IS_IDR(s))
826 
827  av_frame_unref(fc->output_frame);
828 
829  if ((ret = ff_vvc_output_frame(s, fc, fc->output_frame,rsh->sh_no_output_of_prior_pics_flag, 0)) < 0)
830  goto fail;
831 
832  if ((ret = ff_vvc_frame_rpl(s, fc, sc)) < 0)
833  goto fail;
834 
835  if ((ret = ff_vvc_frame_thread_init(fc)) < 0)
836  goto fail;
837  return 0;
838 fail:
839  if (fc->ref)
840  ff_vvc_unref_frame(fc, fc->ref, ~0);
841  fc->ref = NULL;
842  return ret;
843 }
844 
846  const CodedBitstreamUnit *unit, const int is_first_slice)
847 {
848  VVCSH *sh = &sc->sh;
849  int ret;
850 
851  ret = ff_vvc_decode_sh(sh, &fc->ps, unit);
852  if (ret < 0)
853  return ret;
854 
855  av_refstruct_replace(&sc->ref, unit->content_ref);
856 
857  if (is_first_slice) {
858  ret = frame_start(s, fc, sc);
859  if (ret < 0)
860  return ret;
861  } else if (fc->ref) {
862  if (!IS_I(sh->r)) {
863  ret = ff_vvc_slice_rpl(s, fc, sc);
864  if (ret < 0) {
865  av_log(fc->log_ctx, AV_LOG_WARNING,
866  "Error constructing the reference lists for the current slice.\n");
867  return ret;
868  }
869  }
870  } else {
871  av_log(fc->log_ctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
872  return ret;
873  }
874 
875  if (!IS_I(sh->r))
876  smvd_ref_idx(fc, sc);
877 
878  return 0;
879 }
880 
881 static enum AVPixelFormat get_format(AVCodecContext *avctx, const VVCSPS *sps)
882 {
883 #define HWACCEL_MAX CONFIG_VVC_VAAPI_HWACCEL
884 
885  enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
886 
887  switch (sps->pix_fmt) {
888  case AV_PIX_FMT_YUV420P:
889 #if CONFIG_VVC_VAAPI_HWACCEL
890  *fmt++ = AV_PIX_FMT_VAAPI;
891 #endif
892  break;
894 #if CONFIG_VVC_VAAPI_HWACCEL
895  *fmt++ = AV_PIX_FMT_VAAPI;
896 #endif
897  break;
898  }
899 
900  *fmt++ = sps->pix_fmt;
901  *fmt = AV_PIX_FMT_NONE;
902 
903  return ff_get_format(avctx, pix_fmts);
904 }
905 
907 {
908  AVCodecContext *c = s->avctx;
909  const VVCSPS *sps = fc->ps.sps;
910  const VVCPPS *pps = fc->ps.pps;
911 
912  // Reset the format if pix_fmt/w/h change.
913  if (c->sw_pix_fmt != sps->pix_fmt || c->coded_width != pps->width || c->coded_height != pps->height) {
914  c->coded_width = pps->width;
915  c->coded_height = pps->height;
916  c->sw_pix_fmt = sps->pix_fmt;
917  c->pix_fmt = get_format(c, sps);
918  if (c->pix_fmt < 0)
919  return AVERROR_INVALIDDATA;
920  }
921 
922  c->width = pps->width - ((pps->r->pps_conf_win_left_offset + pps->r->pps_conf_win_right_offset) << sps->hshift[CHROMA]);
923  c->height = pps->height - ((pps->r->pps_conf_win_top_offset + pps->r->pps_conf_win_bottom_offset) << sps->vshift[CHROMA]);
924 
925  return 0;
926 }
927 
929 {
930  int ret = ff_vvc_decode_frame_ps(&fc->ps, s);
931  if (ret < 0)
932  return ret;
933 
935  if (ret < 0)
936  return ret;
937 
939  if (ret < 0)
940  return ret;
941 
942  return 0;
943 }
944 
946  const H2645NAL *nal, const CodedBitstreamUnit *unit)
947 {
948  int ret;
949  SliceContext *sc;
950  const int is_first_slice = !fc->nb_slices;
951 
952  ret = slices_realloc(fc);
953  if (ret < 0)
954  return ret;
955 
956  sc = fc->slices[fc->nb_slices];
957 
958  s->vcl_unit_type = nal->type;
959  if (is_first_slice) {
960  ret = frame_setup(fc, s);
961  if (ret < 0)
962  return ret;
963  }
964 
965  ret = slice_start(sc, s, fc, unit, is_first_slice);
966  if (ret < 0)
967  return ret;
968 
969  ret = slice_init_entry_points(sc, fc, nal, unit);
970  if (ret < 0)
971  return ret;
972 
973  if (s->avctx->hwaccel) {
974  if (is_first_slice) {
975  ret = FF_HW_CALL(s->avctx, start_frame, buf_ref, NULL, 0);
976  if (ret < 0)
977  return ret;
978  }
979 
980  ret = FF_HW_CALL(s->avctx, decode_slice,
981  nal->raw_data, nal->raw_size);
982  if (ret < 0)
983  return ret;
984  }
985 
986  fc->nb_slices++;
987 
988  return 0;
989 }
990 
992  const H2645NAL *nal, const CodedBitstreamUnit *unit)
993 {
994  int ret;
995 
996  s->temporal_id = nal->temporal_id;
997 
998  if (nal->nuh_layer_id > 0) {
1000  "Decoding of multilayer bitstreams");
1001  return AVERROR_PATCHWELCOME;
1002  }
1003 
1004  switch (unit->type) {
1005  case VVC_VPS_NUT:
1006  case VVC_SPS_NUT:
1007  case VVC_PPS_NUT:
1008  /* vps, sps, sps cached by s->cbc */
1009  break;
1010  case VVC_TRAIL_NUT:
1011  case VVC_STSA_NUT:
1012  case VVC_RADL_NUT:
1013  case VVC_RASL_NUT:
1014  case VVC_IDR_W_RADL:
1015  case VVC_IDR_N_LP:
1016  case VVC_CRA_NUT:
1017  case VVC_GDR_NUT:
1018  ret = decode_slice(s, fc, buf_ref, nal, unit);
1019  if (ret < 0)
1020  return ret;
1021  break;
1022  case VVC_PREFIX_APS_NUT:
1023  case VVC_SUFFIX_APS_NUT:
1024  ret = ff_vvc_decode_aps(&s->ps, unit);
1025  if (ret < 0)
1026  return ret;
1027  break;
1028  case VVC_PREFIX_SEI_NUT:
1029  /* handle by decode_prefix_sei() */
1030  break;
1031 
1032  case VVC_SUFFIX_SEI_NUT:
1033  /* SEI does not affect decoding, so we ignore the return value*/
1034  if (fc)
1035  ff_vvc_sei_decode(&fc->sei, unit->content_ref, fc);
1036  break;
1037  }
1038 
1039  return 0;
1040 }
1041 
1043 {
1044  const CodedBitstreamH266Context *h266 = s->cbc->priv_data;
1045  CodedBitstreamFragment *frame = &s->current_frame;
1046  int ret = 0;
1047  s->last_eos = s->eos;
1048  s->eos = 0;
1049  fc->ref = NULL;
1050 
1051  ff_cbs_fragment_reset(frame);
1052  ret = ff_cbs_read_packet(s->cbc, frame, avpkt);
1053  if (ret < 0) {
1054  av_log(s->avctx, AV_LOG_ERROR, "Failed to read packet.\n");
1055  return ret;
1056  }
1057  /* decode the NAL units */
1058  for (int i = 0; i < frame->nb_units; i++) {
1059  const H2645NAL *nal = h266->common.read_packet.nals + i;
1060  const CodedBitstreamUnit *unit = frame->units + i;
1061 
1062  if (unit->type == VVC_EOB_NUT || unit->type == VVC_EOS_NUT) {
1063  s->last_eos = 1;
1064  } else {
1065  ret = decode_nal_unit(s, fc, avpkt->buf, nal, unit);
1066  if (ret < 0) {
1067  av_log(s->avctx, AV_LOG_WARNING,
1068  "Error parsing NAL unit #%d.\n", i);
1069  goto fail;
1070  }
1071  }
1072  }
1073  return 0;
1074 
1075 fail:
1076  if (fc->ref)
1078  return ret;
1079 }
1080 
1082 {
1083  const AVFilmGrainParams *fgp;
1084  int ret;
1085 
1086  if (fc->ref->needs_fg) {
1087  av_assert0(fc->ref->frame_grain->buf[0]);
1088  fgp = av_film_grain_params_select(fc->ref->frame);
1089  switch (fgp->type) {
1091  av_assert0(0);
1092  return AVERROR_BUG;
1094  ret = ff_h274_apply_film_grain(fc->ref->frame_grain, fc->ref->frame,
1095  &s->h274db, fgp);
1096  if (ret < 0)
1097  return ret;
1098  break;
1100  ret = ff_aom_apply_film_grain(fc->ref->frame_grain, fc->ref->frame, fgp);
1101  if (ret < 0)
1102  return ret;
1103  break;
1104  }
1105  }
1106 
1107  if (!s->avctx->hwaccel && s->avctx->err_recognition & AV_EF_CRCCHECK) {
1108  VVCSEI *sei = &fc->sei;
1109  if (sei->picture_hash.present) {
1110  ret = ff_h274_hash_init(&s->hash_ctx, sei->picture_hash.hash_type);
1111  if (ret < 0)
1112  return ret;
1113 
1114  ret = ff_h274_hash_verify(s->hash_ctx, &sei->picture_hash, fc->ref->frame, fc->ps.pps->width, fc->ps.pps->height);
1115  if (ret < 0) {
1116  av_log(s->avctx, AV_LOG_ERROR,
1117  "Verifying checksum for frame with decoder_order %d: failed\n",
1118  (int)fc->decode_order);
1119  if (s->avctx->err_recognition & AV_EF_EXPLODE)
1120  return ret;
1121  }
1122  }
1123  }
1124 
1125  return 0;
1126 }
1127 
1128 static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output)
1129 {
1130  VVCFrameContext *delayed = get_frame_context(s, s->fcs, s->nb_frames - s->nb_delayed);
1131  int ret = ff_vvc_frame_wait(s, delayed);
1132 
1133  if (!ret) {
1134  ret = frame_end(s, delayed);
1135  if (ret >= 0 && delayed->output_frame->buf[0] && output) {
1137  *got_output = 1;
1138  }
1139  }
1140  s->nb_delayed--;
1141 
1142  return ret;
1143 }
1144 
1145 static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output)
1146 {
1147  int ret;
1148 
1149  if (s->avctx->hwaccel) {
1150  if (ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame) < 0) {
1151  av_log(s->avctx, AV_LOG_ERROR,
1152  "Hardware accelerator failed to decode picture\n");
1153  ff_vvc_unref_frame(fc, fc->ref, ~0);
1154  return ret;
1155  }
1156  } else {
1157  if (ret = ff_vvc_frame_submit(s, fc) < 0) {
1159  return ret;
1160  }
1161  }
1162 
1163  s->nb_frames++;
1164  s->nb_delayed++;
1165 
1166  if (s->nb_delayed >= s->nb_fcs || s->avctx->hwaccel) {
1167  if ((ret = wait_delayed_frame(s, output, got_output)) < 0)
1168  return ret;
1169  }
1170  return 0;
1171 }
1172 
1173 static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
1174 {
1175  int ret;
1176  while (s->nb_delayed) {
1177  if ((ret = wait_delayed_frame(s, output, got_output)) < 0)
1178  return ret;
1179  if (*got_output)
1180  return 0;
1181  }
1182  if (s->nb_frames) {
1183  //we still have frames cached in dpb.
1184  VVCFrameContext *last = get_frame_context(s, s->fcs, s->nb_frames - 1);
1185 
1186  ret = ff_vvc_output_frame(s, last, output, 0, 1);
1187  if (ret < 0)
1188  return ret;
1189  *got_output = ret;
1190  }
1191  return 0;
1192 }
1193 
1195  int *got_output, AVPacket *avpkt)
1196 {
1197  VVCContext *s = avctx->priv_data;
1199  int ret;
1200 
1201  if (!avpkt->size)
1202  return get_decoded_frame(s, output, got_output);
1203 
1204  fc = get_frame_context(s, s->fcs, s->nb_frames);
1205 
1206  fc->nb_slices = 0;
1207  fc->decode_order = s->nb_frames;
1208 
1209  ret = decode_nal_units(s, fc, avpkt);
1210  if (ret < 0)
1211  return ret;
1212 
1213  if (!fc->ft || !fc->ref)
1214  return avpkt->size;
1215 
1216  ret = submit_frame(s, fc, output, got_output);
1217  if (ret < 0)
1218  return ret;
1219 
1220  return avpkt->size;
1221 }
1222 
1224 {
1225  VVCContext *s = avctx->priv_data;
1226  int got_output = 0;
1227 
1228  while (s->nb_delayed)
1229  wait_delayed_frame(s, NULL, &got_output);
1230 
1231  if (s->fcs) {
1232  VVCFrameContext *last = get_frame_context(s, s->fcs, s->nb_frames - 1);
1233  ff_vvc_flush_dpb(last);
1234  }
1235 
1236  s->ps.sps_id_used = 0;
1237 
1238  s->eos = 1;
1239 }
1240 
1242 {
1243  VVCContext *s = avctx->priv_data;
1244 
1245  ff_cbs_fragment_free(&s->current_frame);
1246  vvc_decode_flush(avctx);
1247  ff_vvc_executor_free(&s->executor);
1248  if (s->fcs) {
1249  for (int i = 0; i < s->nb_fcs; i++)
1250  frame_context_free(s->fcs + i);
1251  av_free(s->fcs);
1252  }
1253  ff_h274_hash_freep(&s->hash_ctx);
1254  ff_vvc_ps_uninit(&s->ps);
1255  ff_cbs_close(&s->cbc);
1256 
1257  return 0;
1258 }
1259 
1261 {
1262  memset(&ff_vvc_default_scale_m, 16, sizeof(ff_vvc_default_scale_m));
1263 }
1264 
1265 #define VVC_MAX_DELAYED_FRAMES 16
1267 {
1268  VVCContext *s = avctx->priv_data;
1269  static AVOnce init_static_once = AV_ONCE_INIT;
1270  const int cpu_count = av_cpu_count();
1271  const int delayed = FFMIN(cpu_count, VVC_MAX_DELAYED_FRAMES);
1272  int thread_count = avctx->thread_count ? avctx->thread_count : delayed;
1273  int ret;
1274 
1275  s->avctx = avctx;
1276 
1277  ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_VVC, avctx);
1278  if (ret)
1279  return ret;
1280 
1281  if (avctx->extradata_size > 0 && avctx->extradata) {
1282  ret = ff_cbs_read_extradata_from_codec(s->cbc, &s->current_frame, avctx);
1283  if (ret < 0)
1284  return ret;
1285  }
1286 
1287  s->nb_fcs = (avctx->flags & AV_CODEC_FLAG_LOW_DELAY) ? 1 : delayed;
1288  s->fcs = av_calloc(s->nb_fcs, sizeof(*s->fcs));
1289  if (!s->fcs)
1290  return AVERROR(ENOMEM);
1291 
1292  for (int i = 0; i < s->nb_fcs; i++) {
1293  VVCFrameContext *fc = s->fcs + i;
1294  ret = frame_context_init(fc, avctx);
1295  if (ret < 0)
1296  return ret;
1297  }
1298 
1299  if (thread_count == 1)
1300  thread_count = 0;
1301  s->executor = ff_vvc_executor_alloc(s, thread_count);
1302  if (!s->executor)
1303  return AVERROR(ENOMEM);
1304 
1305  s->eos = 1;
1307  ff_thread_once(&init_static_once, init_default_scale_m);
1308 
1309  return 0;
1310 }
1311 
1313  .p.name = "vvc",
1314  .p.long_name = NULL_IF_CONFIG_SMALL("VVC (Versatile Video Coding)"),
1315  .p.type = AVMEDIA_TYPE_VIDEO,
1316  .p.id = AV_CODEC_ID_VVC,
1317  .priv_data_size = sizeof(VVCContext),
1318  .init = vvc_decode_init,
1321  .flush = vvc_decode_flush,
1325  .p.profiles = NULL_IF_CONFIG_SMALL(ff_vvc_profiles),
1326  .hw_configs = (const AVCodecHWConfigInternal *const []) {
1327 #if CONFIG_VVC_VAAPI_HWACCEL
1328  HWACCEL_VAAPI(vvc),
1329 #endif
1330  NULL
1331  },
1332 };
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
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:1265
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
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:127
ff_vvc_decode_frame_ps
int ff_vvc_decode_frame_ps(VVCFrameParamSets *fps, struct VVCContext *s)
Definition: ps.c:1060
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
smvd_ref_idx
static void smvd_ref_idx(const VVCFrameContext *fc, SliceContext *sc)
Definition: dec.c:451
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:1200
out
FILE * out
Definition: movenc.c:55
tl_create
static int tl_create(TabList *l)
Definition: dec.c:82
slices_realloc
static int slices_realloc(VVCFrameContext *fc)
Definition: dec.c:488
ff_vvc_sei_reset
void ff_vvc_sei_reset(VVCSEI *s)
Definition: sei.c:249
GetByteContext
Definition: bytestream.h:33
deblock
static void deblock(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int size, int dpos)
Definition: rv60dec.c:2149
bytestream2_tell
static av_always_inline int bytestream2_tell(const GetByteContext *g)
Definition: bytestream.h:192
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:616
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
bytestream2_skipu
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition: bytestream.h:174
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:226
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
decode_nal_unit
static int decode_nal_unit(VVCContext *s, VVCFrameContext *fc, AVBufferRef *buf_ref, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition: dec.c:991
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:421
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:945
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:539
free_cus
static void free_cus(VVCFrameContext *fc)
Definition: dec.c:348
tl_init_fn
void(* tl_init_fn)(TabList *l, VVCFrameContext *fc)
Definition: dec.c:318
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:266
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:108
ff_vvc_slice_rpl
int ff_vvc_slice_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition: refs.c:533
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:598
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:165
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:77
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
pixel_buffer_nz_tl_init
static void pixel_buffer_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition: dec.c:230
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:757
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:1042
fail
#define fail()
Definition: checkasm.h:199
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
ep_init
static int ep_init(EntryPoint *ep, const int ctu_addr, const int ctu_end, GetByteContext *gb, const int size)
Definition: dec.c:550
IS_B
#define IS_B(rsh)
Definition: ps.h:40
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:97
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:707
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:1194
H266RawSliceHeader::num_ref_idx_active
uint8_t num_ref_idx_active[2]
NumRefIdxActive[].
Definition: cbs_h266.h:839
VVC_MAX_SAMPLE_ARRAYS
@ VVC_MAX_SAMPLE_ARRAYS
Definition: vvc.h:77
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:1266
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:430
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:1312
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:320
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
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
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:366
vvc_decode_free
static av_cold int vvc_decode_free(AVCodecContext *avctx)
Definition: dec.c:1241
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:356
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:567
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:53
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:189
get_frame_context
static VVCFrameContext * get_frame_context(const VVCContext *s, const VVCFrameContext *fc, const int delta)
Definition: dec.c:609
frame_context_free
static av_cold void frame_context_free(VVCFrameContext *fc)
Definition: dec.c:658
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:535
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:52
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:928
SliceContext::eps
struct EntryPoint * eps
Definition: dec.h:116
frame_end
static int frame_end(VVCContext *s, VVCFrameContext *fc)
Definition: dec.c:1081
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:60
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:765
TransformUnit
Definition: hevcdec.h:335
TAB_MAX
#define TAB_MAX
Definition: dec.c:45
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:906
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:54
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:553
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:141
height
#define height
Definition: dsp.h:89
Tab
Definition: dec.c:47
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:1223
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:425
ref_frame
static int ref_frame(VVCFrame *dst, const VVCFrame *src)
Definition: dec.c:616
get_decoded_frame
static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
Definition: dec.c:1173
min_tu_nz_tl_init
static void min_tu_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition: dec.c:207
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
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:801
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:57
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
ep_init_cabac_decoder
static int ep_init_cabac_decoder(EntryPoint *ep, GetByteContext *gb, const int size)
Definition: dec.c:538
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
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:845
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:265
ibc_tl_init
static void ibc_tl_init(TabList *l, VVCFrameContext *fc)
Definition: dec.c:293
ff_vvc_sei_replace
int ff_vvc_sei_replace(VVCSEI *dst, const VVCSEI *src)
Definition: sei.c:242
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:280
slices_free
static void slices_free(VVCFrameContext *fc)
Definition: dec.c:470
AVCodecContext
main external API structure.
Definition: avcodec.h:431
eps_free
static void eps_free(SliceContext *slice)
Definition: dec.c:464
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:56
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:49
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:881
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:1128
frame_context_init
static av_cold int frame_context_init(VVCFrameContext *fc, AVCodecContext *avctx)
Definition: dec.c:678
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:592
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:1260
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:176
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
AVPacket
This structure stores compressed data.
Definition: packet.h:529
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:1145
VVCFrameContext
Definition: dec.h:122
bytestream.h
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
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
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:74
tl_init
static void tl_init(TabList *l, const int zero, const int realloc)
Definition: dec.c:67
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:415
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:420
decode_prefix_sei
static void decode_prefix_sei(VVCFrameContext *fc, VVCContext *s)
Definition: dec.c:742
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:383
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:432
ff_vvc_bump_frame
void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc)
Definition: refs.c:328
H266RawSlice
Definition: cbs_h266.h:843
VVCContext
Definition: dec.h:218
dec.h
Tab::tab
void ** tab
Definition: dec.c:48
get_ep_size
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
ff_vvc_ctu_free_cus
void ff_vvc_ctu_free_cus(CodingUnit **cus)
Definition: ctu.c:2866