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  */
24 #include "libavcodec/decode.h"
26 #include "libavcodec/hwconfig.h"
27 #include "libavcodec/profiles.h"
28 #include "libavcodec/refstruct.h"
29 #include "libavutil/cpu.h"
30 #include "libavutil/mem.h"
31 #include "libavutil/thread.h"
32 
33 #include "dec.h"
34 #include "ctu.h"
35 #include "data.h"
36 #include "refs.h"
37 #include "thread.h"
38 #include "config_components.h"
39 
40 #define TAB_MAX 32
41 
42 typedef struct Tab {
43  void **tab;
44  size_t size;
45 } Tab;
46 
47 typedef struct TabList {
49  int nb_tabs;
50 
51  int zero;
52  int realloc;
53 } TabList;
54 
55 #define TL_ADD(t, s) do { \
56  av_assert0(l->nb_tabs < TAB_MAX); \
57  l->tabs[l->nb_tabs].tab = (void**)&fc->tab.t; \
58  l->tabs[l->nb_tabs].size = sizeof(*fc->tab.t) * (s); \
59  l->nb_tabs++; \
60 } while (0)
61 
62 static void tl_init(TabList *l, const int zero, const int realloc)
63 {
64  l->nb_tabs = 0;
65  l->zero = zero;
66  l->realloc = realloc;
67 }
68 
69 static int tl_free(TabList *l)
70 {
71  for (int i = 0; i < l->nb_tabs; i++)
72  av_freep(l->tabs[i].tab);
73 
74  return 0;
75 }
76 
77 static int tl_create(TabList *l)
78 {
79  if (l->realloc) {
80  tl_free(l);
81 
82  for (int i = 0; i < l->nb_tabs; i++) {
83  Tab *t = l->tabs + i;
84  *t->tab = l->zero ? av_mallocz(t->size) : av_malloc(t->size);
85  if (!*t->tab)
86  return AVERROR(ENOMEM);
87  }
88  }
89  return 0;
90 }
91 
92 static int tl_zero(TabList *l)
93 {
94  if (l->zero) {
95  for (int i = 0; i < l->nb_tabs; i++) {
96  Tab *t = l->tabs + i;
97  memset(*t->tab, 0, t->size);
98  }
99  }
100  return 0;
101 }
102 
104 {
105  const VVCSPS *sps = fc->ps.sps;
106  const VVCPPS *pps = fc->ps.pps;
107  const int ctu_size = sps ? (1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y) : 0;
108  const int ctu_count = pps ? pps->ctb_count : 0;
109  const int changed = fc->tab.sz.ctu_count != ctu_count || fc->tab.sz.ctu_size != ctu_size;
110 
111  tl_init(l, 0, changed);
112 
113  TL_ADD(cus, ctu_count);
114  TL_ADD(ctus, ctu_count);
115  TL_ADD(deblock, ctu_count);
116  TL_ADD(sao, ctu_count);
117  TL_ADD(alf, ctu_count);
118  TL_ADD(slice_idx, ctu_count);
119  TL_ADD(coeffs, ctu_count * ctu_size * VVC_MAX_SAMPLE_ARRAYS);
120 }
121 
123 {
124  const VVCPPS *pps = fc->ps.pps;
125  const int pic_size_in_min_cb = pps ? pps->min_cb_width * pps->min_cb_height : 0;
126  const int changed = fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
127 
128  tl_init(l, 1, changed);
129 
130  TL_ADD(imf, pic_size_in_min_cb);
131  TL_ADD(imm, pic_size_in_min_cb);
132 
133  for (int i = LUMA; i <= CHROMA; i++)
134  TL_ADD(cb_width[i], pic_size_in_min_cb); //is_a0_available requires this
135 }
136 
138 {
139  const VVCPPS *pps = fc->ps.pps;
140  const int pic_size_in_min_cb = pps ? pps->min_cb_width * pps->min_cb_height : 0;
141  const int changed = fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
142 
143  tl_init(l, 0, changed);
144 
145  TL_ADD(skip, pic_size_in_min_cb);
146  TL_ADD(imtf, pic_size_in_min_cb);
147  TL_ADD(ipm, pic_size_in_min_cb);
148 
149  for (int i = LUMA; i <= CHROMA; i++) {
150  TL_ADD(cqt_depth[i], pic_size_in_min_cb);
151  TL_ADD(cb_pos_x[i], pic_size_in_min_cb);
152  TL_ADD(cb_pos_y[i], pic_size_in_min_cb);
153  TL_ADD(cb_height[i], pic_size_in_min_cb);
154  TL_ADD(cp_mv[i], pic_size_in_min_cb * MAX_CONTROL_POINTS);
155  TL_ADD(cpm[i], pic_size_in_min_cb);
156  TL_ADD(pcmf[i], pic_size_in_min_cb);
157  }
158  // For luma, qp can only change at the CU level, so the qp tab size is related to the CU.
159  TL_ADD(qp[LUMA], pic_size_in_min_cb);
160 }
161 
163 {
164  const VVCPPS *pps = fc->ps.pps;
165  const int pic_size_in_min_pu = pps ? pps->min_pu_width * pps->min_pu_height : 0;
166  const int changed = fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
167 
168  tl_init(l, 1, changed);
169 
170  TL_ADD(iaf, pic_size_in_min_pu);
171 }
172 
174 {
175  const VVCPPS *pps = fc->ps.pps;
176  const int pic_size_in_min_pu = pps ? pps->min_pu_width * pps->min_pu_height : 0;
177  const int changed = fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
178 
179  tl_init(l, 0, changed);
180 
181  TL_ADD(msf, pic_size_in_min_pu);
182  TL_ADD(mmi, pic_size_in_min_pu);
183  TL_ADD(mvf, pic_size_in_min_pu);
184 }
185 
187 {
188  const VVCPPS *pps = fc->ps.pps;
189  const int pic_size_in_min_tu = pps ? pps->min_tu_width * pps->min_tu_height : 0;
190  const int changed = fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
191 
192  tl_init(l, 1, changed);
193 
194  TL_ADD(tu_joint_cbcr_residual_flag, pic_size_in_min_tu);
195 
196  for (int i = 0; i < VVC_MAX_SAMPLE_ARRAYS; i++) {
197  TL_ADD(tu_coded_flag[i], pic_size_in_min_tu);
198 
199  for (int vertical = 0; vertical < 2; vertical++)
200  TL_ADD(bs[vertical][i], pic_size_in_min_tu);
201  }
202 }
203 
205 {
206  const VVCPPS *pps = fc->ps.pps;
207  const int pic_size_in_min_tu = pps ? pps->min_tu_width * pps->min_tu_height : 0;
208  const int changed = fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
209 
210  tl_init(l, 0, changed);
211 
212  for (int i = LUMA; i <= CHROMA; i++) {
213  TL_ADD(tb_width[i], pic_size_in_min_tu);
214  TL_ADD(tb_height[i], pic_size_in_min_tu);
215  }
216 
217  for (int vertical = 0; vertical < 2; vertical++) {
218  TL_ADD(max_len_p[vertical], pic_size_in_min_tu);
219  TL_ADD(max_len_q[vertical], pic_size_in_min_tu);
220  }
221 
222  // For chroma, considering the joint CbCr, the QP tab size is related to the TU.
223  for (int i = CB; i < VVC_MAX_SAMPLE_ARRAYS; i++)
224  TL_ADD(qp[i], pic_size_in_min_tu);
225 }
226 
228 {
229  const VVCSPS *sps = fc->ps.sps;
230  const VVCPPS *pps = fc->ps.pps;
231  const int width = pps ? pps->width : 0;
232  const int height = pps ? pps->height : 0;
233  const int ctu_width = pps ? pps->ctb_width : 0;
234  const int ctu_height = pps ? pps->ctb_height : 0;
235  const int chroma_idc = sps ? sps->r->sps_chroma_format_idc : 0;
236  const int ps = sps ? sps->pixel_shift : 0;
237  const int c_end = chroma_idc ? VVC_MAX_SAMPLE_ARRAYS : 1;
238  const int changed = fc->tab.sz.chroma_format_idc != chroma_idc ||
239  fc->tab.sz.width != width || fc->tab.sz.height != height ||
240  fc->tab.sz.ctu_width != ctu_width || fc->tab.sz.ctu_height != ctu_height ||
241  fc->tab.sz.pixel_shift != ps;
242 
243  tl_init(l, 0, changed);
244 
245  for (int c_idx = 0; c_idx < c_end; c_idx++) {
246  const int w = width >> (sps ? sps->hshift[c_idx] : 0);
247  const int h = height >> (sps ? sps->vshift[c_idx] : 0);
248  TL_ADD(sao_pixel_buffer_h[c_idx], (w * 2 * ctu_height) << ps);
249  TL_ADD(sao_pixel_buffer_v[c_idx], (h * 2 * ctu_width) << ps);
250  }
251 
252  for (int c_idx = 0; c_idx < c_end; c_idx++) {
253  const int w = width >> (sps ? sps->hshift[c_idx] : 0);
254  const int h = height >> (sps ? sps->vshift[c_idx] : 0);
255  const int border_pixels = c_idx ? ALF_BORDER_CHROMA : ALF_BORDER_LUMA;
256  for (int i = 0; i < 2; i++) {
257  TL_ADD(alf_pixel_buffer_h[c_idx][i], (w * border_pixels * ctu_height) << ps);
258  TL_ADD(alf_pixel_buffer_v[c_idx][i], h * ALF_PADDING_SIZE * ctu_width);
259  }
260  }
261 }
262 
264 {
265  const VVCPPS *pps = fc->ps.pps;
266  const int w32 = pps ? AV_CEIL_RSHIFT(pps->width, 5) : 0;
267  const int h32 = pps ? AV_CEIL_RSHIFT(pps->height, 5) : 0;
268  const int changed = AV_CEIL_RSHIFT(fc->tab.sz.width, 5) != w32 ||
269  AV_CEIL_RSHIFT(fc->tab.sz.height, 5) != h32;
270 
271  tl_init(l, 1, changed);
272 
273  for (int i = LUMA; i <= CHROMA; i++)
274  TL_ADD(msm[i], w32 * h32);
275 }
276 
278 {
279  const VVCPPS *pps = fc->ps.pps;
280  const int w64 = pps ? AV_CEIL_RSHIFT(pps->width, 6) : 0;
281  const int h64 = pps ? AV_CEIL_RSHIFT(pps->height, 6) : 0;
282  const int changed = AV_CEIL_RSHIFT(fc->tab.sz.width, 6) != w64 ||
283  AV_CEIL_RSHIFT(fc->tab.sz.height, 6) != h64;
284 
285  tl_init(l, 1, changed);
286 
287  TL_ADD(ispmf, w64 * h64);
288 }
289 
291 {
292  const VVCSPS *sps = fc->ps.sps;
293  const VVCPPS *pps = fc->ps.pps;
294  const int ctu_height = pps ? pps->ctb_height : 0;
295  const int ctu_size = sps ? sps->ctb_size_y : 0;
296  const int ps = sps ? sps->pixel_shift : 0;
297  const int chroma_idc = sps ? sps->r->sps_chroma_format_idc : 0;
298  const int has_ibc = sps ? sps->r->sps_ibc_enabled_flag : 0;
299  const int changed = fc->tab.sz.chroma_format_idc != chroma_idc ||
300  fc->tab.sz.ctu_height != ctu_height ||
301  fc->tab.sz.ctu_size != ctu_size ||
302  fc->tab.sz.pixel_shift != ps;
303 
304  fc->tab.sz.ibc_buffer_width = ctu_size ? 2 * MAX_CTU_SIZE * MAX_CTU_SIZE / ctu_size : 0;
305 
306  tl_init(l, has_ibc, changed);
307 
308  for (int i = LUMA; i < VVC_MAX_SAMPLE_ARRAYS; i++) {
309  const int hs = sps ? sps->hshift[i] : 0;
310  const int vs = sps ? sps->vshift[i] : 0;
311  TL_ADD(ibc_vir_buf[i], fc->tab.sz.ibc_buffer_width * ctu_size * ctu_height << ps >> hs >> vs);
312  }
313 }
314 
315 typedef void (*tl_init_fn)(TabList *l, VVCFrameContext *fc);
316 
317 static int frame_context_for_each_tl(VVCFrameContext *fc, int (*unary_fn)(TabList *l))
318 {
319  const tl_init_fn init[] = {
328  msm_tl_init,
330  ibc_tl_init,
331  };
332 
333  for (int i = 0; i < FF_ARRAY_ELEMS(init); i++) {
334  TabList l;
335  int ret;
336 
337  init[i](&l, fc);
338  ret = unary_fn(&l);
339  if (ret < 0)
340  return ret;
341  }
342  return 0;
343 }
344 
346 {
347  if (fc->tab.cus) {
348  for (int i = 0; i < fc->tab.sz.ctu_count; i++)
349  ff_vvc_ctu_free_cus(fc->tab.cus + i);
350  }
351 }
352 
354 {
355  free_cus(fc);
357  ff_refstruct_pool_uninit(&fc->rpl_tab_pool);
358  ff_refstruct_pool_uninit(&fc->tab_dmvr_mvf_pool);
359 
360  memset(&fc->tab.sz, 0, sizeof(fc->tab.sz));
361 }
362 
364 {
365  const VVCSPS *sps = fc->ps.sps;
366  const VVCPPS *pps = fc->ps.pps;
367  const int ctu_count = pps->ctb_count;
368  const int pic_size_in_min_pu = pps->min_pu_width * pps->min_pu_height;
369  int ret;
370 
371  free_cus(fc);
372 
374  if (ret < 0)
375  return ret;
376 
377  // for error handling case, we may call free_cus before VVC_TASK_STAGE_INIT, so we need to set cus to 0 here
378  memset(fc->tab.cus, 0, sizeof(*fc->tab.cus) * ctu_count);
379 
380  memset(fc->tab.slice_idx, -1, sizeof(*fc->tab.slice_idx) * ctu_count);
381 
382  if (fc->tab.sz.ctu_count != ctu_count) {
383  ff_refstruct_pool_uninit(&fc->rpl_tab_pool);
384  fc->rpl_tab_pool = ff_refstruct_pool_alloc(ctu_count * sizeof(RefPicListTab), 0);
385  if (!fc->rpl_tab_pool)
386  return AVERROR(ENOMEM);
387  }
388 
389  if (fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu) {
390  ff_refstruct_pool_uninit(&fc->tab_dmvr_mvf_pool);
391  fc->tab_dmvr_mvf_pool = ff_refstruct_pool_alloc(
392  pic_size_in_min_pu * sizeof(MvField), FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME);
393  if (!fc->tab_dmvr_mvf_pool)
394  return AVERROR(ENOMEM);
395  }
396 
397  fc->tab.sz.ctu_count = pps->ctb_count;
398  fc->tab.sz.ctu_size = 1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y;
399  fc->tab.sz.pic_size_in_min_cb = pps->min_cb_width * pps->min_cb_height;
400  fc->tab.sz.pic_size_in_min_pu = pic_size_in_min_pu;
401  fc->tab.sz.pic_size_in_min_tu = pps->min_tu_width * pps->min_tu_height;
402  fc->tab.sz.width = pps->width;
403  fc->tab.sz.height = pps->height;
404  fc->tab.sz.ctu_width = pps->ctb_width;
405  fc->tab.sz.ctu_height = pps->ctb_height;
406  fc->tab.sz.chroma_format_idc = sps->r->sps_chroma_format_idc;
407  fc->tab.sz.pixel_shift = sps->pixel_shift;
408 
409  return 0;
410 }
411 
413 {
415 }
416 
417 static int min_positive(const int idx, const int diff, const int min_diff)
418 {
419  return diff > 0 && (idx < 0 || diff < min_diff);
420 }
421 
422 static int max_negtive(const int idx, const int diff, const int max_diff)
423 {
424  return diff < 0 && (idx < 0 || diff > max_diff);
425 }
426 
427 typedef int (*smvd_find_fxn)(const int idx, const int diff, const int old_diff);
428 
429 static int8_t smvd_find(const VVCFrameContext *fc, const SliceContext *sc, int lx, smvd_find_fxn find)
430 {
431  const H266RawSliceHeader *rsh = sc->sh.r;
432  const RefPicList *rpl = sc->rpl + lx;
433  const int poc = fc->ref->poc;
434  int8_t idx = -1;
435  int old_diff = -1;
436  for (int i = 0; i < rsh->num_ref_idx_active[lx]; i++) {
437  if (!rpl->refs[i].is_lt) {
438  int diff = poc - rpl->refs[i].poc;
439  if (find(idx, diff, old_diff)) {
440  idx = i;
441  old_diff = diff;
442  }
443  }
444  }
445  return idx;
446 }
447 
448 static void smvd_ref_idx(const VVCFrameContext *fc, SliceContext *sc)
449 {
450  VVCSH *sh = &sc->sh;
451  if (IS_B(sh->r)) {
452  sh->ref_idx_sym[0] = smvd_find(fc, sc, 0, min_positive);
453  sh->ref_idx_sym[1] = smvd_find(fc, sc, 1, max_negtive);
454  if (sh->ref_idx_sym[0] == -1 || sh->ref_idx_sym[1] == -1) {
455  sh->ref_idx_sym[0] = smvd_find(fc, sc, 0, max_negtive);
456  sh->ref_idx_sym[1] = smvd_find(fc, sc, 1, min_positive);
457  }
458  }
459 }
460 
461 static void eps_free(SliceContext *slice)
462 {
463  av_freep(&slice->eps);
464  slice->nb_eps = 0;
465 }
466 
468 {
469  if (fc->slices) {
470  for (int i = 0; i < fc->nb_slices_allocated; i++) {
471  SliceContext *slice = fc->slices[i];
472  if (slice) {
473  ff_refstruct_unref(&slice->ref);
474  ff_refstruct_unref(&slice->sh.r);
475  eps_free(slice);
476  av_free(slice);
477  }
478  }
479  av_freep(&fc->slices);
480  }
481  fc->nb_slices_allocated = 0;
482  fc->nb_slices = 0;
483 }
484 
486 {
487  void *p;
488  const int size = (fc->nb_slices_allocated + 1) * 3 / 2;
489 
490  if (fc->nb_slices < fc->nb_slices_allocated)
491  return 0;
492 
493  p = av_realloc_array(fc->slices, size, sizeof(*fc->slices));
494  if (!p)
495  return AVERROR(ENOMEM);
496 
497  fc->slices = p;
498  for (int i = fc->nb_slices_allocated; i < size; i++) {
499  fc->slices[i] = av_mallocz(sizeof(*fc->slices[0]));
500  if (!fc->slices[i]) {
501  fc->nb_slices_allocated = i;
502  return AVERROR(ENOMEM);
503  }
504  fc->slices[i]->slice_idx = i;
505  }
506  fc->nb_slices_allocated = size;
507 
508  return 0;
509 }
510 
511 static int ep_init_cabac_decoder(SliceContext *sc, const int index,
512  const H2645NAL *nal, GetBitContext *gb, const CodedBitstreamUnit *unit)
513 {
514  const H266RawSlice *slice = unit->content_ref;
515  const H266RawSliceHeader *rsh = sc->sh.r;
516  EntryPoint *ep = sc->eps + index;
517  int size;
518  int ret;
519 
520  if (index < rsh->num_entry_points) {
521  int skipped = 0;
522  int64_t start = (gb->index >> 3);
523  int64_t end = start + rsh->sh_entry_point_offset_minus1[index] + 1;
524  while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= start + slice->header_size) {
525  skipped++;
526  }
527  while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= end + slice->header_size) {
528  end--;
529  skipped++;
530  }
531  size = end - start;
532  size = av_clip(size, 0, get_bits_left(gb) / 8);
533  } else {
534  size = get_bits_left(gb) / 8;
535  }
536  av_assert0(gb->buffer + get_bits_count(gb) / 8 + size <= gb->buffer_end);
537  ret = ff_init_cabac_decoder (&ep->cc, gb->buffer + get_bits_count(gb) / 8, size);
538  if (ret < 0)
539  return ret;
540  skip_bits(gb, size * 8);
541  return 0;
542 }
543 
545  VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
546 {
547  const VVCSH *sh = &sc->sh;
548  const H266RawSlice *slice = unit->content_ref;
549  int nb_eps = sh->r->num_entry_points + 1;
550  int ctu_addr = 0;
551  GetBitContext gb;
552  int ret;
553 
554  if (sc->nb_eps != nb_eps) {
555  eps_free(sc);
556  sc->eps = av_calloc(nb_eps, sizeof(*sc->eps));
557  if (!sc->eps)
558  return AVERROR(ENOMEM);
559  sc->nb_eps = nb_eps;
560  }
561 
562  ret = init_get_bits8(&gb, slice->data, slice->data_size);
563  if (ret < 0)
564  return ret;
565  for (int i = 0; i < sc->nb_eps; i++)
566  {
567  EntryPoint *ep = sc->eps + i;
568 
569  ep->ctu_start = ctu_addr;
570  ep->ctu_end = (i + 1 == sc->nb_eps ? sh->num_ctus_in_curr_slice : sh->entry_point_start_ctu[i]);
571 
572  for (int j = ep->ctu_start; j < ep->ctu_end; j++) {
573  const int rs = sc->sh.ctb_addr_in_curr_slice[j];
574  fc->tab.slice_idx[rs] = sc->slice_idx;
575  }
576 
577  ret = ep_init_cabac_decoder(sc, i, nal, &gb, unit);
578  if (ret < 0)
579  return ret;
580 
581  if (i + 1 < sc->nb_eps)
582  ctu_addr = sh->entry_point_start_ctu[i];
583  }
584 
585  return 0;
586 }
587 
589 {
590  const int size = s->nb_fcs;
591  const int idx = (fc - s->fcs + delta + size) % size;
592  return s->fcs + idx;
593 }
594 
595 static int ref_frame(VVCFrame *dst, const VVCFrame *src)
596 {
597  int ret;
598 
599  ret = av_frame_ref(dst->frame, src->frame);
600  if (ret < 0)
601  return ret;
602 
603  ff_refstruct_replace(&dst->sps, src->sps);
604  ff_refstruct_replace(&dst->pps, src->pps);
605 
606  ff_refstruct_replace(&dst->progress, src->progress);
607 
608  ff_refstruct_replace(&dst->tab_dmvr_mvf, src->tab_dmvr_mvf);
609 
610  ff_refstruct_replace(&dst->rpl_tab, src->rpl_tab);
611  ff_refstruct_replace(&dst->rpl, src->rpl);
612  ff_refstruct_replace(&dst->hwaccel_picture_private,
613  src->hwaccel_picture_private);
614  dst->nb_rpl_elems = src->nb_rpl_elems;
615 
616  dst->poc = src->poc;
617  dst->ctb_count = src->ctb_count;
618 
619  dst->scaling_win = src->scaling_win;
620  dst->ref_width = src->ref_width;
621  dst->ref_height = src->ref_height;
622 
623  dst->flags = src->flags;
624  dst->sequence = src->sequence;
625 
626  return 0;
627 }
628 
630 {
631  slices_free(fc);
632 
633  ff_refstruct_pool_uninit(&fc->tu_pool);
634  ff_refstruct_pool_uninit(&fc->cu_pool);
635 
636  for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) {
637  ff_vvc_unref_frame(fc, &fc->DPB[i], ~0);
638  av_frame_free(&fc->DPB[i].frame);
639  }
640 
643  av_frame_free(&fc->output_frame);
644  ff_vvc_frame_ps_free(&fc->ps);
645 }
646 
648 {
649 
650  fc->log_ctx = avctx;
651 
652  fc->output_frame = av_frame_alloc();
653  if (!fc->output_frame)
654  return AVERROR(ENOMEM);
655 
656  for (int j = 0; j < FF_ARRAY_ELEMS(fc->DPB); j++) {
657  fc->DPB[j].frame = av_frame_alloc();
658  if (!fc->DPB[j].frame)
659  return AVERROR(ENOMEM);
660  }
661  fc->cu_pool = ff_refstruct_pool_alloc(sizeof(CodingUnit), 0);
662  if (!fc->cu_pool)
663  return AVERROR(ENOMEM);
664 
665  fc->tu_pool = ff_refstruct_pool_alloc(sizeof(TransformUnit), 0);
666  if (!fc->tu_pool)
667  return AVERROR(ENOMEM);
668 
669  return 0;
670 }
671 
673 {
674  int ret;
675 
676  fc->ref = NULL;
677 
678  // copy refs from the last frame
679  if (s->nb_frames && s->nb_fcs > 1) {
680  VVCFrameContext *prev = get_frame_context(s, fc, -1);
681  for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) {
682  ff_vvc_unref_frame(fc, &fc->DPB[i], ~0);
683  if (prev->DPB[i].frame->buf[0]) {
684  ret = ref_frame(&fc->DPB[i], &prev->DPB[i]);
685  if (ret < 0)
686  return ret;
687  }
688  }
689  }
690 
691  if (IS_IDR(s)) {
692  s->seq_decode = (s->seq_decode + 1) & 0xff;
694  }
695 
696  ret = pic_arrays_init(s, fc);
697  if (ret < 0)
698  return ret;
699  ff_vvc_dsp_init(&fc->vvcdsp, fc->ps.sps->bit_depth);
700  ff_videodsp_init(&fc->vdsp, fc->ps.sps->bit_depth);
701  return 0;
702 }
703 
705 {
706  const VVCPH *ph = &fc->ps.ph;
707  const H266RawSliceHeader *rsh = sc->sh.r;
708  int ret;
709 
710  // 8.3.1 Decoding process for picture order count
711  if (!s->temporal_id && !ph->r->ph_non_ref_pic_flag && !(IS_RASL(s) || IS_RADL(s)))
712  s->poc_tid0 = ph->poc;
713 
714  if ((ret = ff_vvc_set_new_ref(s, fc, &fc->frame)) < 0)
715  goto fail;
716 
717  if (!IS_IDR(s))
719 
720  av_frame_unref(fc->output_frame);
721 
722  if ((ret = ff_vvc_output_frame(s, fc, fc->output_frame,rsh->sh_no_output_of_prior_pics_flag, 0)) < 0)
723  goto fail;
724 
725  if ((ret = ff_vvc_frame_rpl(s, fc, sc)) < 0)
726  goto fail;
727 
728  if ((ret = ff_vvc_frame_thread_init(fc)) < 0)
729  goto fail;
730  return 0;
731 fail:
732  if (fc->ref)
733  ff_vvc_unref_frame(fc, fc->ref, ~0);
734  fc->ref = NULL;
735  return ret;
736 }
737 
739  const CodedBitstreamUnit *unit, const int is_first_slice)
740 {
741  VVCSH *sh = &sc->sh;
742  int ret;
743 
744  ret = ff_vvc_decode_sh(sh, &fc->ps, unit);
745  if (ret < 0)
746  return ret;
747 
748  ff_refstruct_replace(&sc->ref, unit->content_ref);
749 
750  if (is_first_slice) {
751  ret = frame_start(s, fc, sc);
752  if (ret < 0)
753  return ret;
754  } else if (fc->ref) {
755  if (!IS_I(sh->r)) {
756  ret = ff_vvc_slice_rpl(s, fc, sc);
757  if (ret < 0) {
758  av_log(fc->log_ctx, AV_LOG_WARNING,
759  "Error constructing the reference lists for the current slice.\n");
760  return ret;
761  }
762  }
763  } else {
764  av_log(fc->log_ctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
765  return ret;
766  }
767 
768  if (!IS_I(sh->r))
769  smvd_ref_idx(fc, sc);
770 
771  return 0;
772 }
773 
774 static enum AVPixelFormat get_format(AVCodecContext *avctx, const VVCSPS *sps)
775 {
776 #define HWACCEL_MAX CONFIG_VVC_VAAPI_HWACCEL
777 
778  enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
779 
780  switch (sps->pix_fmt) {
781  case AV_PIX_FMT_YUV420P:
782 #if CONFIG_VVC_VAAPI_HWACCEL
783  *fmt++ = AV_PIX_FMT_VAAPI;
784 #endif
785  break;
787 #if CONFIG_VVC_VAAPI_HWACCEL
788  *fmt++ = AV_PIX_FMT_VAAPI;
789 #endif
790  break;
791  }
792 
793  *fmt++ = sps->pix_fmt;
794  *fmt = AV_PIX_FMT_NONE;
795 
796  return ff_get_format(avctx, pix_fmts);
797 }
798 
800 {
801  AVCodecContext *c = s->avctx;
802  const VVCSPS *sps = fc->ps.sps;
803  const VVCPPS *pps = fc->ps.pps;
804  int ret;
805 
806  // Reset HW config if pix_fmt/w/h change.
807  if (s->pix_fmt != sps->pix_fmt || c->coded_width != pps->width || c->coded_height != pps->height) {
808  c->coded_width = pps->width;
809  c->coded_height = pps->height;
810  ret = get_format(c, sps);
811  if (ret < 0)
812  return ret;
813 
814  c->pix_fmt = ret;
815  s->pix_fmt = sps->pix_fmt;
816  }
817 
818  c->width = pps->width - ((pps->r->pps_conf_win_left_offset + pps->r->pps_conf_win_right_offset) << sps->hshift[CHROMA]);
819  c->height = pps->height - ((pps->r->pps_conf_win_top_offset + pps->r->pps_conf_win_bottom_offset) << sps->vshift[CHROMA]);
820  c->has_b_frames = sps->r->sps_dpb_params.dpb_max_num_reorder_pics[sps->r->sps_max_sublayers_minus1];
821 
822  return 0;
823 }
824 
826 {
827  int ret = ff_vvc_decode_frame_ps(&fc->ps, s);
828  if (ret < 0)
829  return ret;
830 
832  if (ret < 0)
833  return ret;
834 
836  if (ret < 0)
837  return ret;
838 
839  return 0;
840 }
841 
842 static int decode_slice(VVCContext *s, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
843 {
844  int ret;
845  SliceContext *sc;
846  const int is_first_slice = !fc->nb_slices;
847 
848  ret = slices_realloc(fc);
849  if (ret < 0)
850  return ret;
851 
852  sc = fc->slices[fc->nb_slices];
853 
854  s->vcl_unit_type = nal->type;
855  if (is_first_slice) {
856  ret = frame_setup(fc, s);
857  if (ret < 0)
858  return ret;
859  }
860 
861  ret = slice_start(sc, s, fc, unit, is_first_slice);
862  if (ret < 0)
863  return ret;
864 
865  ret = slice_init_entry_points(sc, fc, nal, unit);
866  if (ret < 0)
867  return ret;
868 
869  if (s->avctx->hwaccel) {
870  if (is_first_slice) {
871  ret = FF_HW_CALL(s->avctx, start_frame, NULL, 0);
872  if (ret < 0)
873  return ret;
874  }
875 
876  ret = FF_HW_CALL(s->avctx, decode_slice,
877  nal->raw_data, nal->raw_size);
878  if (ret < 0)
879  return ret;
880  }
881 
882  fc->nb_slices++;
883 
884  return 0;
885 }
886 
888 {
889  int ret;
890 
891  s->temporal_id = nal->temporal_id;
892 
893  if (nal->nuh_layer_id > 0) {
895  "Decoding of multilayer bitstreams");
896  return AVERROR_PATCHWELCOME;
897  }
898 
899  switch (unit->type) {
900  case VVC_VPS_NUT:
901  case VVC_SPS_NUT:
902  case VVC_PPS_NUT:
903  /* vps, sps, sps cached by s->cbc */
904  break;
905  case VVC_TRAIL_NUT:
906  case VVC_STSA_NUT:
907  case VVC_RADL_NUT:
908  case VVC_RASL_NUT:
909  case VVC_IDR_W_RADL:
910  case VVC_IDR_N_LP:
911  case VVC_CRA_NUT:
912  case VVC_GDR_NUT:
913  ret = decode_slice(s, fc, nal, unit);
914  if (ret < 0)
915  return ret;
916  break;
917  case VVC_PREFIX_APS_NUT:
918  case VVC_SUFFIX_APS_NUT:
919  ret = ff_vvc_decode_aps(&s->ps, unit);
920  if (ret < 0)
921  return ret;
922  break;
923  }
924 
925  return 0;
926 }
927 
929 {
930  const CodedBitstreamH266Context *h266 = s->cbc->priv_data;
931  CodedBitstreamFragment *frame = &s->current_frame;
932  int ret = 0;
933  s->last_eos = s->eos;
934  s->eos = 0;
935 
937  ret = ff_cbs_read_packet(s->cbc, frame, avpkt);
938  if (ret < 0) {
939  av_log(s->avctx, AV_LOG_ERROR, "Failed to read packet.\n");
940  return ret;
941  }
942  /* decode the NAL units */
943  for (int i = 0; i < frame->nb_units; i++) {
944  const H2645NAL *nal = h266->common.read_packet.nals + i;
945  const CodedBitstreamUnit *unit = frame->units + i;
946 
947  if (unit->type == VVC_EOB_NUT || unit->type == VVC_EOS_NUT) {
948  s->last_eos = 1;
949  } else {
950  ret = decode_nal_unit(s, fc, nal, unit);
951  if (ret < 0) {
952  av_log(s->avctx, AV_LOG_WARNING,
953  "Error parsing NAL unit #%d.\n", i);
954  goto fail;
955  }
956  }
957  }
958  return 0;
959 
960 fail:
961  if (fc->ref)
963  return ret;
964 }
965 
966 static int set_output_format(const VVCContext *s, const AVFrame *output)
967 {
968  AVCodecContext *c = s->avctx;
969  int ret;
970 
971  if (output->width != c->width || output->height != c->height) {
972  if ((ret = ff_set_dimensions(c, output->width, output->height)) < 0)
973  return ret;
974  }
975  c->pix_fmt = output->format;
976  return 0;
977 }
978 
979 static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output)
980 {
981  VVCFrameContext *delayed = get_frame_context(s, s->fcs, s->nb_frames - s->nb_delayed);
982  int ret = ff_vvc_frame_wait(s, delayed);
983 
984  if (!ret && delayed->output_frame->buf[0] && output) {
987  if (!ret)
988  *got_output = 1;
989  }
990  s->nb_delayed--;
991 
992  return ret;
993 }
994 
995 static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output)
996 {
997  int ret;
998 
999  if (s->avctx->hwaccel) {
1000  if (ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame) < 0) {
1001  av_log(s->avctx, AV_LOG_ERROR,
1002  "Hardware accelerator failed to decode picture\n");
1003  ff_vvc_unref_frame(fc, fc->ref, ~0);
1004  return ret;
1005  }
1006  } else {
1007  if (ret = ff_vvc_frame_submit(s, fc) < 0) {
1009  return ret;
1010  }
1011  }
1012 
1013  s->nb_frames++;
1014  s->nb_delayed++;
1015 
1016  if (s->nb_delayed >= s->nb_fcs || s->avctx->hwaccel) {
1017  if ((ret = wait_delayed_frame(s, output, got_output)) < 0)
1018  return ret;
1019  }
1020  return 0;
1021 }
1022 
1023 static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
1024 {
1025  int ret;
1026  while (s->nb_delayed) {
1027  if ((ret = wait_delayed_frame(s, output, got_output)) < 0)
1028  return ret;
1029  if (*got_output)
1030  return 0;
1031  }
1032  if (s->nb_frames) {
1033  //we still have frames cached in dpb.
1034  VVCFrameContext *last = get_frame_context(s, s->fcs, s->nb_frames - 1);
1035 
1036  ret = ff_vvc_output_frame(s, last, output, 0, 1);
1037  if (ret < 0)
1038  return ret;
1039  if (ret) {
1040  *got_output = ret;
1041  if ((ret = set_output_format(s, output)) < 0)
1042  return ret;
1043  }
1044  }
1045  return 0;
1046 }
1047 
1049  int *got_output, AVPacket *avpkt)
1050 {
1051  VVCContext *s = avctx->priv_data;
1053  int ret;
1054 
1055  if (!avpkt->size)
1056  return get_decoded_frame(s, output, got_output);
1057 
1058  fc = get_frame_context(s, s->fcs, s->nb_frames);
1059 
1060  fc->nb_slices = 0;
1061  fc->decode_order = s->nb_frames;
1062 
1063  ret = decode_nal_units(s, fc, avpkt);
1064  if (ret < 0)
1065  return ret;
1066 
1067  if (!fc->ft || !fc->ref)
1068  return avpkt->size;
1069 
1070  ret = submit_frame(s, fc, output, got_output);
1071  if (ret < 0)
1072  return ret;
1073 
1074  return avpkt->size;
1075 }
1076 
1078 {
1079  VVCContext *s = avctx->priv_data;
1080  int got_output = 0;
1081 
1082  while (s->nb_delayed)
1083  wait_delayed_frame(s, NULL, &got_output);
1084 
1085  if (s->fcs) {
1086  VVCFrameContext *last = get_frame_context(s, s->fcs, s->nb_frames - 1);
1087  ff_vvc_flush_dpb(last);
1088  }
1089 
1090  s->ps.sps_id_used = 0;
1091 
1092  s->eos = 1;
1093 }
1094 
1096 {
1097  VVCContext *s = avctx->priv_data;
1098 
1099  ff_cbs_fragment_free(&s->current_frame);
1100  vvc_decode_flush(avctx);
1101  ff_vvc_executor_free(&s->executor);
1102  if (s->fcs) {
1103  for (int i = 0; i < s->nb_fcs; i++)
1104  frame_context_free(s->fcs + i);
1105  av_free(s->fcs);
1106  }
1107  ff_vvc_ps_uninit(&s->ps);
1108  ff_cbs_close(&s->cbc);
1109 
1110  return 0;
1111 }
1112 
1114 {
1115  memset(&ff_vvc_default_scale_m, 16, sizeof(ff_vvc_default_scale_m));
1116 }
1117 
1118 #define VVC_MAX_DELAYED_FRAMES 16
1120 {
1121  VVCContext *s = avctx->priv_data;
1122  static AVOnce init_static_once = AV_ONCE_INIT;
1123  const int cpu_count = av_cpu_count();
1124  const int delayed = FFMIN(cpu_count, VVC_MAX_DELAYED_FRAMES);
1125  int thread_count = avctx->thread_count ? avctx->thread_count : delayed;
1126  int ret;
1127 
1128  s->avctx = avctx;
1129 
1130  ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_VVC, avctx);
1131  if (ret)
1132  return ret;
1133 
1134  if (avctx->extradata_size > 0 && avctx->extradata) {
1135  ret = ff_cbs_read_extradata_from_codec(s->cbc, &s->current_frame, avctx);
1136  if (ret < 0)
1137  return ret;
1138  }
1139 
1140  s->nb_fcs = (avctx->flags & AV_CODEC_FLAG_LOW_DELAY) ? 1 : delayed;
1141  s->fcs = av_calloc(s->nb_fcs, sizeof(*s->fcs));
1142  if (!s->fcs)
1143  return AVERROR(ENOMEM);
1144 
1145  for (int i = 0; i < s->nb_fcs; i++) {
1146  VVCFrameContext *fc = s->fcs + i;
1147  ret = frame_context_init(fc, avctx);
1148  if (ret < 0)
1149  return ret;
1150  }
1151 
1152  if (thread_count == 1)
1153  thread_count = 0;
1154  s->executor = ff_vvc_executor_alloc(s, thread_count);
1155  if (!s->executor)
1156  return AVERROR(ENOMEM);
1157 
1158  s->eos = 1;
1160  ff_thread_once(&init_static_once, init_default_scale_m);
1161 
1162  s->pix_fmt = AV_PIX_FMT_NONE;
1163 
1164  return 0;
1165 }
1166 
1168  .p.name = "vvc",
1169  .p.long_name = NULL_IF_CONFIG_SMALL("VVC (Versatile Video Coding)"),
1170  .p.type = AVMEDIA_TYPE_VIDEO,
1171  .p.id = AV_CODEC_ID_VVC,
1172  .priv_data_size = sizeof(VVCContext),
1173  .init = vvc_decode_init,
1174  .close = vvc_decode_free,
1176  .flush = vvc_decode_flush,
1180  .p.profiles = NULL_IF_CONFIG_SMALL(ff_vvc_profiles),
1181  .hw_configs = (const AVCodecHWConfigInternal *const []) {
1182 #if CONFIG_VVC_VAAPI_HWACCEL
1183  HWACCEL_VAAPI(vvc),
1184 #endif
1185  NULL
1186  },
1187 };
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:215
ALF_BORDER_LUMA
#define ALF_BORDER_LUMA
Definition: ctu.h:78
CodedBitstreamUnit::content_ref
void * content_ref
If content is reference counted, a RefStruct reference backing content.
Definition: cbs.h:112
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:124
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:1118
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:43
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:695
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:122
ff_vvc_decode_frame_ps
int ff_vvc_decode_frame_ps(VVCFrameParamSets *fps, struct VVCContext *s)
Definition: ps.c:927
smvd_ref_idx
static void smvd_ref_idx(const VVCFrameContext *fc, SliceContext *sc)
Definition: dec.c:448
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:1277
ff_refstruct_pool_alloc
FFRefStructPool * ff_refstruct_pool_alloc(size_t size, unsigned flags)
Equivalent to ff_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
Definition: refstruct.c:335
tl_create
static int tl_create(TabList *l)
Definition: dec.c:77
slices_realloc
static int slices_realloc(VVCFrameContext *fc)
Definition: dec.c:485
deblock
static void deblock(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int size, int dpos)
Definition: rv60dec.c:2159
CB
#define CB
Definition: filter.c:32
ff_cbs_fragment_free
av_cold void ff_cbs_fragment_free(CodedBitstreamFragment *frag)
Free the units array of a fragment in addition to what ff_cbs_fragment_reset does.
Definition: cbs.c:186
thread.h
ff_vvc_report_frame_finished
void ff_vvc_report_frame_finished(VVCFrame *frame)
Definition: refs.c:547
CodingUnit
Definition: hevcdec.h:288
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:121
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:266
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:162
data.h
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3042
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:389
w
uint8_t w
Definition: llviddspenc.c:38
ff_cbs_fragment_reset
void ff_cbs_fragment_reset(CodedBitstreamFragment *frag)
Free the units contained in a fragment as well as the fragment's own data buffer, but not the units a...
Definition: cbs.c:172
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:502
free_cus
static void free_cus(VVCFrameContext *fc)
Definition: dec.c:345
tl_init_fn
void(* tl_init_fn)(TabList *l, VVCFrameContext *fc)
Definition: dec.c:315
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:263
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:74
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:472
FF_HW_SIMPLE_CALL
#define FF_HW_SIMPLE_CALL(avctx, function)
Definition: hwaccel_internal.h:174
ctu_nz_tl_init
static void ctu_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition: dec.c:103
ff_vvc_slice_rpl
int ff_vvc_slice_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition: refs.c:464
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:602
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:94
H2645NAL::temporal_id
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
Definition: h2645_parse.h:62
RefPicList
Definition: hevcdec.h:192
min_pu_tl_init
static void min_pu_tl_init(TabList *l, VVCFrameContext *fc)
Definition: dec.c:162
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:70
ff_cbs_close
av_cold void ff_cbs_close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
Definition: cbs.c:142
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:381
pixel_buffer_nz_tl_init
static void pixel_buffer_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition: dec.c:227
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:928
fail
#define fail()
Definition: checkasm.h:188
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1593
ff_refstruct_pool_uninit
static void ff_refstruct_pool_uninit(FFRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition: refstruct.h:292
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:1342
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:508
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:334
SliceContext::rpl
RefPicList * rpl
Definition: dec.h:113
tl_zero
static int tl_zero(TabList *l)
Definition: dec.c:92
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:946
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:672
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:150
VVC_MAX_SAMPLE_ARRAYS
@ VVC_MAX_SAMPLE_ARRAYS
Definition: vvc.h:77
vvc_decode_frame
static int vvc_decode_frame(AVCodecContext *avctx, AVFrame *output, int *got_output, AVPacket *avpkt)
Definition: dec.c:1048
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:209
H266RawSlice::data
uint8_t * data
Definition: cbs_h266.h:846
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:1119
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:545
RefPicList::refs
VVCRefPic refs[VVC_MAX_REF_ENTRIES]
Definition: dec.h:56
smvd_find_fxn
int(* smvd_find_fxn)(const int idx, const int diff, const int old_diff)
Definition: dec.c:427
ff_vvc_unref_frame
void ff_vvc_unref_frame(VVCFrameContext *fc, VVCFrame *frame, int flags)
Definition: refs.c:43
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:530
ff_vvc_frame_wait
int ff_vvc_frame_wait(VVCContext *s, VVCFrameContext *fc)
Definition: thread.c:830
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:122
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:311
s
#define s(width, name)
Definition: cbs_vp9.c:198
ff_vvc_decoder
const FFCodec ff_vvc_decoder
Definition: dec.c:1167
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
SliceContext::slice_idx
int slice_idx
Definition: dec.h:109
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:317
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:124
pic_arrays_init
static int pic_arrays_init(VVCContext *s, VVCFrameContext *fc)
Definition: dec.c:363
vvc_decode_free
static av_cold int vvc_decode_free(AVCodecContext *avctx)
Definition: dec.c:1095
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:304
pic_arrays_free
static void pic_arrays_free(VVCFrameContext *fc)
Definition: dec.c:353
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:544
ff_vvc_clear_refs
void ff_vvc_clear_refs(VVCFrameContext *fc)
Definition: refs.c:77
decode.h
IS_IDR
#define IS_IDR(s)
Definition: hevcdec.h:76
H2645NAL::skipped_bytes_pos
int * skipped_bytes_pos
Definition: h2645_parse.h:71
TabList::tabs
Tab tabs[TAB_MAX]
Definition: dec.c:48
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
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:186
get_frame_context
static VVCFrameContext * get_frame_context(const VVCContext *s, const VVCFrameContext *fc, const int delta)
Definition: dec.c:588
frame_context_free
static av_cold void frame_context_free(VVCFrameContext *fc)
Definition: dec.c:629
GetBitContext::buffer
const uint8_t * buffer
Definition: get_bits.h:109
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
TabList
Definition: dec.c:47
hwaccel_internal.h
VVCSH::ref_idx_sym
int8_t ref_idx_sym[2]
RefIdxSymL0, RefIdxSymL1.
Definition: ps.h:248
decode_nal_unit
static int decode_nal_unit(VVCContext *s, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition: dec.c:887
HWACCEL_MAX
#define HWACCEL_MAX
frame_setup
static int frame_setup(VVCFrameContext *fc, VVCContext *s)
Definition: dec.c:825
SliceContext::eps
struct EntryPoint * eps
Definition: dec.h:111
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:199
MAX_CTU_SIZE
#define MAX_CTU_SIZE
Definition: ctu.h:33
VVCRefPic::is_lt
int is_lt
Definition: dec.h:48
TL_ADD
#define TL_ADD(t, s)
Definition: dec.c:55
AVOnce
#define AVOnce
Definition: thread.h:202
index
int index
Definition: gxfenc.c:90
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
TransformUnit
Definition: hevcdec.h:331
TAB_MAX
#define TAB_MAX
Definition: dec.c:40
SliceContext
Definition: mss12.h:70
av_cpu_count
int av_cpu_count(void)
Definition: cpu.c:217
decode_slice
static int decode_slice(VVCContext *s, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition: dec.c:842
ff_vvc_flush_dpb
void ff_vvc_flush_dpb(VVCFrameContext *fc)
Definition: refs.c:84
export_frame_params
static int export_frame_params(VVCContext *s, const VVCFrameContext *fc)
Definition: dec.c:799
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:49
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:540
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:137
height
#define height
Definition: dsp.h:85
Tab
Definition: dec.c:42
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:388
codec_internal.h
VVC_VPS_NUT
@ VVC_VPS_NUT
Definition: vvc.h:43
ALF_PADDING_SIZE
#define ALF_PADDING_SIZE
Definition: ctu.h:75
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
cpu.h
ep_init_cabac_decoder
static int ep_init_cabac_decoder(SliceContext *sc, const int index, const H2645NAL *nal, GetBitContext *gb, const CodedBitstreamUnit *unit)
Definition: dec.c:511
vvc_decode_flush
static av_cold void vvc_decode_flush(AVCodecContext *avctx)
Definition: dec.c:1077
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:61
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:360
EntryPoint::ctu_end
int ctu_end
Definition: ctu.h:363
max_negtive
static int max_negtive(const int idx, const int diff, const int max_diff)
Definition: dec.c:422
ref_frame
static int ref_frame(VVCFrame *dst, const VVCFrame *src)
Definition: dec.c:595
get_decoded_frame
static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
Definition: dec.c:1023
min_tu_nz_tl_init
static void min_tu_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition: dec.c:204
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:47
GetBitContext::index
int index
Definition: get_bits.h:110
SliceContext::ref
void * ref
RefStruct reference, backing slice data.
Definition: dec.h:114
AVCodecHWConfigInternal
Definition: hwconfig.h:25
MvField
Definition: hevcdec.h:306
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:71
ff_vvc_dsp_init
void ff_vvc_dsp_init(VVCDSPContext *vvcdsp, int bit_depth)
Definition: dsp.c:77
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:66
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:704
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_cbs_read_extradata_from_codec
int ff_cbs_read_extradata_from_codec(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVCodecContext *avctx)
Definition: cbs.c:295
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:213
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
H266RawSliceHeader
Definition: cbs_h266.h:771
H266RawSliceHeader::num_entry_points
uint32_t num_entry_points
NumEntryPoints.
Definition: cbs_h266.h:838
FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME
#define FF_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
TabList::realloc
int realloc
Definition: dec.c:52
SliceContext::nb_eps
int nb_eps
Definition: dec.h:112
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:529
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:1153
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:637
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:610
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:354
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
set_output_format
static int set_output_format(const VVCContext *s, const AVFrame *output)
Definition: dec.c:966
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
slice_start
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
Definition: dec.c:738
ff_vvc_ps_uninit
void ff_vvc_ps_uninit(VVCParamSets *ps)
Definition: ps.c:956
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:72
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:290
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
ff_refstruct_replace
void ff_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition: refstruct.c:160
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:277
slices_free
static void slices_free(VVCFrameContext *fc)
Definition: dec.c:467
AVCodecContext
main external API structure.
Definition: avcodec.h:451
eps_free
static void eps_free(SliceContext *slice)
Definition: dec.c:461
VVC_PREFIX_APS_NUT
@ VVC_PREFIX_APS_NUT
Definition: vvc.h:46
TabList::zero
int zero
Definition: dec.c:51
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:171
VVC_SUFFIX_APS_NUT
@ VVC_SUFFIX_APS_NUT
Definition: vvc.h:47
Tab::size
size_t size
Definition: dec.c:44
pps
uint64_t pps
Definition: dovi_rpuenc.c:35
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:774
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:171
ff_cbs_read_packet
int ff_cbs_read_packet(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVPacket *pkt)
Read the data bitstream from a packet into a fragment, then split into units and decompose.
Definition: cbs.c:304
wait_delayed_frame
static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output)
Definition: dec.c:979
frame_context_init
static av_cold int frame_context_init(VVCFrameContext *fc, AVCodecContext *avctx)
Definition: dec.c:647
ALF_BORDER_CHROMA
#define ALF_BORDER_CHROMA
Definition: ctu.h:79
ff_vvc_frame_rpl
int ff_vvc_frame_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition: refs.c:523
ff_vvc_profiles
const AVProfile ff_vvc_profiles[]
Definition: profiles.c:91
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
init_default_scale_m
static av_cold void init_default_scale_m(void)
Definition: dec.c:1113
FF_CODEC_CAP_AUTO_THREADS
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
Definition: codec_internal.h:73
ff_cbs_init
av_cold int ff_cbs_init(CodedBitstreamContext **ctx_ptr, enum AVCodecID codec_id, void *log_ctx)
Create and initialise a new context for the given codec.
Definition: cbs.c:90
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
min_pu_nz_tl_init
static void min_pu_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition: dec.c:173
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:478
AVPacket
This structure stores compressed data.
Definition: packet.h:516
SliceContext::sh
VVCSH sh
Definition: dec.h:110
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
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:995
VVCFrameContext
Definition: dec.h:117
EntryPoint::ctu_start
int ctu_start
Definition: ctu.h:362
IS_I
#define IS_I(rsh)
Definition: ps.h:38
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
thread.h
tl_free
static int tl_free(TabList *l)
Definition: dec.c:69
tl_init
static void tl_init(TabList *l, const int zero, const int realloc)
Definition: dec.c:62
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:412
width
#define width
Definition: dsp.h:85
min_positive
static int min_positive(const int idx, const int diff, const int min_diff)
Definition: dec.c:417
ff_refstruct_unref
void ff_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition: refstruct.c:120
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
smvd_find
static int8_t smvd_find(const VVCFrameContext *fc, const SliceContext *sc, int lx, smvd_find_fxn find)
Definition: dec.c:429
ff_vvc_bump_frame
void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc)
Definition: refs.c:272
H266RawSlice
Definition: cbs_h266.h:843
VVCContext
Definition: dec.h:214
dec.h
Tab::tab
void ** tab
Definition: dec.c:43
ff_vvc_ctu_free_cus
void ff_vvc_ctu_free_cus(CodingUnit **cus)
Definition: ctu.c:2534