FFmpeg
vvcdec.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"
25 #include "libavcodec/profiles.h"
26 #include "libavcodec/refstruct.h"
27 #include "libavutil/cpu.h"
28 #include "libavutil/thread.h"
29 
30 #include "vvcdec.h"
31 #include "vvc_ctu.h"
32 #include "vvc_data.h"
33 #include "vvc_refs.h"
34 #include "vvc_thread.h"
35 
36 #define TAB_MAX 32
37 
38 typedef struct Tab {
39  void **tab;
40  size_t size;
41 } Tab;
42 
43 typedef struct TabList {
45  int nb_tabs;
46 
47  int zero;
48  int realloc;
49 } TabList;
50 
51 #define TL_ADD(t, s) do { \
52  av_assert0(l->nb_tabs < TAB_MAX); \
53  l->tabs[l->nb_tabs].tab = (void**)&fc->tab.t; \
54  l->tabs[l->nb_tabs].size = sizeof(*fc->tab.t) * (s); \
55  l->nb_tabs++; \
56 } while (0)
57 
58 static void tl_init(TabList *l, const int zero, const int realloc)
59 {
60  l->nb_tabs = 0;
61  l->zero = zero;
62  l->realloc = realloc;
63 }
64 
65 static int tl_free(TabList *l)
66 {
67  for (int i = 0; i < l->nb_tabs; i++)
68  av_freep(l->tabs[i].tab);
69 
70  return 0;
71 }
72 
73 static int tl_create(TabList *l)
74 {
75  if (l->realloc) {
76  tl_free(l);
77 
78  for (int i = 0; i < l->nb_tabs; i++) {
79  Tab *t = l->tabs + i;
80  *t->tab = l->zero ? av_mallocz(t->size) : av_malloc(t->size);
81  if (!*t->tab)
82  return AVERROR(ENOMEM);
83  }
84  } else if (l->zero) {
85  for (int i = 0; i < l->nb_tabs; i++) {
86  Tab *t = l->tabs + i;
87  memset(*t->tab, 0, t->size);
88  }
89  }
90  return 0;
91 }
92 
94 {
95  const VVCPPS *pps = fc->ps.pps;
96  const int ctu_count = pps ? pps->ctb_count : 0;
97  const int changed = fc->tab.sz.ctu_count != ctu_count;
98 
99  tl_init(l, 1, changed);
100 
101  TL_ADD(deblock, ctu_count);
102  TL_ADD(sao, ctu_count);
103  TL_ADD(alf, ctu_count);
104  TL_ADD(ctus, ctu_count);
105 }
106 
108 {
109  const VVCSPS *sps = fc->ps.sps;
110  const VVCPPS *pps = fc->ps.pps;
111  const int ctu_size = sps ? (1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y) : 0;
112  const int ctu_count = pps ? pps->ctb_count : 0;
113  const int changed = fc->tab.sz.ctu_count != ctu_count || fc->tab.sz.ctu_size != ctu_size;
114 
115  tl_init(l, 0, changed);
116  TL_ADD(slice_idx, ctu_count);
117  TL_ADD(coeffs, ctu_count * ctu_size * VVC_MAX_SAMPLE_ARRAYS);
118 }
119 
121 {
122  const VVCPPS *pps = fc->ps.pps;
123  const int pic_size_in_min_cb = pps ? pps->min_cb_width * pps->min_cb_height : 0;
124  const int changed = fc->tab.sz.pic_size_in_min_cb != pic_size_in_min_cb;
125 
126  tl_init(l, 1, changed);
127 
128  TL_ADD(skip, pic_size_in_min_cb);
129  TL_ADD(imf, pic_size_in_min_cb);
130  TL_ADD(imtf, pic_size_in_min_cb);
131  TL_ADD(imm, pic_size_in_min_cb);
132  TL_ADD(ipm, pic_size_in_min_cb);
133 
134  for (int i = LUMA; i <= CHROMA; i++) {
135  TL_ADD(cb_pos_x[i], pic_size_in_min_cb);
136  TL_ADD(cb_pos_y[i], pic_size_in_min_cb);
137  TL_ADD(cb_width[i], pic_size_in_min_cb);
138  TL_ADD(cb_height[i], pic_size_in_min_cb);
139  TL_ADD(cqt_depth[i], pic_size_in_min_cb);
140  TL_ADD(cpm[i], pic_size_in_min_cb);
141  TL_ADD(cp_mv[i], pic_size_in_min_cb * MAX_CONTROL_POINTS);
142  };
143 }
144 
146 {
147  const VVCPPS *pps = fc->ps.pps;
148  const int pic_size_in_min_pu = pps ? pps->min_pu_width * pps->min_pu_height : 0;
149  const int changed = fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu;
150 
151  tl_init(l, 1, changed);
152 
153  TL_ADD(msf, pic_size_in_min_pu);
154  TL_ADD(iaf, pic_size_in_min_pu);
155  TL_ADD(mmi, pic_size_in_min_pu);
156  TL_ADD(mvf, pic_size_in_min_pu);
157 }
158 
160 {
161  const VVCPPS *pps = fc->ps.pps;
162  const int pic_size_in_min_tu = pps ? pps->min_tu_width * pps->min_tu_height : 0;
163  const int changed = fc->tab.sz.pic_size_in_min_tu != pic_size_in_min_tu;
164 
165  tl_init(l, 1, changed);
166 
167  TL_ADD(tu_joint_cbcr_residual_flag, pic_size_in_min_tu);
168  for (int i = LUMA; i <= CHROMA; i++) {
169  TL_ADD(tb_pos_x0[i], pic_size_in_min_tu);
170  TL_ADD(tb_pos_y0[i], pic_size_in_min_tu);
171  TL_ADD(tb_width[i], pic_size_in_min_tu);
172  TL_ADD(tb_height[i], pic_size_in_min_tu);
173  TL_ADD(pcmf[i], pic_size_in_min_tu);
174  }
175 
176  for (int i = 0; i < VVC_MAX_SAMPLE_ARRAYS; i++) {
177  TL_ADD(tu_coded_flag[i], pic_size_in_min_tu);
178  TL_ADD(qp[i], pic_size_in_min_tu);
179  }
180 }
181 
183 {
184  const VVCPPS *pps = fc->ps.pps;
185  const int bs_width = pps ? (pps->width >> 2) + 1 : 0;
186  const int bs_height = pps ? (pps->height >> 2) + 1 : 0;
187  const int bs_count = bs_width * bs_height;
188  const int changed = fc->tab.sz.bs_width != bs_width ||
189  fc->tab.sz.bs_height != bs_height;
190 
191  tl_init(l, 1, changed);
192 
193  for (int i = 0; i < VVC_MAX_SAMPLE_ARRAYS; i++) {
194  TL_ADD(horizontal_bs[i], bs_count);
195  TL_ADD(vertical_bs[i], bs_count);
196  }
197  TL_ADD(horizontal_q, bs_count);
198  TL_ADD(horizontal_p, bs_count);
199  TL_ADD(vertical_p, bs_count);
200  TL_ADD(vertical_q, bs_count);
201 }
202 
204 {
205  const VVCSPS *sps = fc->ps.sps;
206  const VVCPPS *pps = fc->ps.pps;
207  const int width = pps ? pps->width : 0;
208  const int height = pps ? pps->height : 0;
209  const int ctu_width = pps ? pps->ctb_width : 0;
210  const int ctu_height = pps ? pps->ctb_height : 0;
211  const int chroma_idc = sps ? sps->r->sps_chroma_format_idc : 0;
212  const int ps = sps ? sps->pixel_shift : 0;
213  const int c_end = chroma_idc ? VVC_MAX_SAMPLE_ARRAYS : 1;
214  const int changed = fc->tab.sz.chroma_format_idc != chroma_idc ||
215  fc->tab.sz.width != width || fc->tab.sz.height != height ||
216  fc->tab.sz.ctu_width != ctu_width || fc->tab.sz.ctu_height != ctu_height;
217 
218  tl_init(l, 0, changed);
219 
220  for (int c_idx = 0; c_idx < c_end; c_idx++) {
221  const int w = width >> (sps ? sps->hshift[c_idx] : 0);
222  const int h = height >> (sps ? sps->vshift[c_idx] : 0);
223  TL_ADD(sao_pixel_buffer_h[c_idx], (w * 2 * ctu_height) << ps);
224  TL_ADD(sao_pixel_buffer_v[c_idx], (h * 2 * ctu_width) << ps);
225  }
226 
227  for (int c_idx = 0; c_idx < c_end; c_idx++) {
228  const int w = width >> (sps ? sps->hshift[c_idx] : 0);
229  const int h = height >> (sps ? sps->vshift[c_idx] : 0);
230  const int border_pixels = c_idx ? ALF_BORDER_CHROMA : ALF_BORDER_LUMA;
231  for (int i = 0; i < 2; i++) {
232  TL_ADD(alf_pixel_buffer_h[c_idx][i], (w * border_pixels * ctu_height) << ps);
233  TL_ADD(alf_pixel_buffer_v[c_idx][i], h * ALF_PADDING_SIZE * ctu_width);
234  }
235  }
236 }
237 
239 {
240  const VVCPPS *pps = fc->ps.pps;
241  const int w32 = pps ? AV_CEIL_RSHIFT(pps->width, 5) : 0;
242  const int h32 = pps ? AV_CEIL_RSHIFT(pps->height, 5) : 0;
243  const int changed = AV_CEIL_RSHIFT(fc->tab.sz.width, 5) != w32 ||
244  AV_CEIL_RSHIFT(fc->tab.sz.height, 5) != h32;
245 
246  tl_init(l, 1, changed);
247 
248  for (int i = LUMA; i <= CHROMA; i++)
249  TL_ADD(msm[i], w32 * h32);
250 }
251 
253 {
254  const VVCPPS *pps = fc->ps.pps;
255  const int w64 = pps ? AV_CEIL_RSHIFT(pps->width, 6) : 0;
256  const int h64 = pps ? AV_CEIL_RSHIFT(pps->height, 6) : 0;
257  const int changed = AV_CEIL_RSHIFT(fc->tab.sz.width, 6) != w64 ||
258  AV_CEIL_RSHIFT(fc->tab.sz.height, 6) != h64;
259 
260  tl_init(l, 1, changed);
261 
262  TL_ADD(ispmf, w64 * h64);
263 }
264 
266 {
267  const VVCSPS *sps = fc->ps.sps;
268  const VVCPPS *pps = fc->ps.pps;
269  const int ctu_height = pps ? pps->ctb_height : 0;
270  const int ctu_size = sps ? sps->ctb_size_y : 0;
271  const int ps = sps ? sps->pixel_shift : 0;
272  const int chroma_idc = sps ? sps->r->sps_chroma_format_idc : 0;
273  const int has_ibc = sps ? sps->r->sps_ibc_enabled_flag : 0;
274  const int changed = fc->tab.sz.chroma_format_idc != chroma_idc ||
275  fc->tab.sz.ctu_height != ctu_height ||
276  fc->tab.sz.ctu_size != ctu_size ||
277  fc->tab.sz.pixel_shift != ps;
278 
279  fc->tab.sz.ibc_buffer_width = ctu_size ? 2 * MAX_CTU_SIZE * MAX_CTU_SIZE / ctu_size : 0;
280 
281  tl_init(l, has_ibc, changed);
282 
283  for (int i = LUMA; i < VVC_MAX_SAMPLE_ARRAYS; i++) {
284  const int hs = sps ? sps->hshift[i] : 0;
285  const int vs = sps ? sps->vshift[i] : 0;
286  TL_ADD(ibc_vir_buf[i], fc->tab.sz.ibc_buffer_width * ctu_size * ctu_height << ps >> hs >> vs);
287  }
288 }
289 
290 typedef void (*tl_init_fn)(TabList *l, VVCFrameContext *fc);
291 
292 static int frame_context_for_each_tl(VVCFrameContext *fc, int (*unary_fn)(TabList *l))
293 {
294  const tl_init_fn init[] = {
295  ctu_tl_init,
300  bs_tl_init,
302  msm_tl_init,
304  ibc_tl_init,
305  };
306 
307  for (int i = 0; i < FF_ARRAY_ELEMS(init); i++) {
308  TabList l;
309  int ret;
310 
311  init[i](&l, fc);
312  ret = unary_fn(&l);
313  if (ret < 0)
314  return ret;
315  }
316  return 0;
317 }
318 
320 {
321  if (fc->tab.ctus) {
322  for (int i = 0; i < fc->tab.sz.ctu_count; i++)
323  ff_vvc_ctu_free_cus(fc->tab.ctus + i);
324  }
325 }
326 
328 {
329  free_cus(fc);
331  ff_refstruct_pool_uninit(&fc->rpl_tab_pool);
332  ff_refstruct_pool_uninit(&fc->tab_dmvr_mvf_pool);
333 
334  memset(&fc->tab.sz, 0, sizeof(fc->tab.sz));
335 }
336 
338 {
339  const VVCSPS *sps = fc->ps.sps;
340  const VVCPPS *pps = fc->ps.pps;
341  const int ctu_count = pps->ctb_count;
342  const int pic_size_in_min_pu = pps->min_pu_width * pps->min_pu_height;
343  int ret;
344 
345  free_cus(fc);
346 
348  if (ret < 0)
349  return ret;
350 
351  memset(fc->tab.slice_idx, -1, sizeof(*fc->tab.slice_idx) * ctu_count);
352 
353  if (fc->tab.sz.ctu_count != ctu_count) {
354  ff_refstruct_pool_uninit(&fc->rpl_tab_pool);
355  fc->rpl_tab_pool = ff_refstruct_pool_alloc(ctu_count * sizeof(RefPicListTab), 0);
356  if (!fc->rpl_tab_pool)
357  return AVERROR(ENOMEM);
358  }
359 
360  if (fc->tab.sz.pic_size_in_min_pu != pic_size_in_min_pu) {
361  ff_refstruct_pool_uninit(&fc->tab_dmvr_mvf_pool);
362  fc->tab_dmvr_mvf_pool = ff_refstruct_pool_alloc(
363  pic_size_in_min_pu * sizeof(MvField), FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME);
364  if (!fc->tab_dmvr_mvf_pool)
365  return AVERROR(ENOMEM);
366  }
367 
368  fc->tab.sz.ctu_count = pps->ctb_count;
369  fc->tab.sz.ctu_size = 1 << sps->ctb_log2_size_y << sps->ctb_log2_size_y;
370  fc->tab.sz.pic_size_in_min_cb = pps->min_cb_width * pps->min_cb_height;
371  fc->tab.sz.pic_size_in_min_pu = pic_size_in_min_pu;
372  fc->tab.sz.pic_size_in_min_tu = pps->min_tu_width * pps->min_tu_height;
373  fc->tab.sz.width = pps->width;
374  fc->tab.sz.height = pps->height;
375  fc->tab.sz.ctu_width = pps->ctb_width;
376  fc->tab.sz.ctu_height = pps->ctb_height;
377  fc->tab.sz.chroma_format_idc = sps->r->sps_chroma_format_idc;
378  fc->tab.sz.pixel_shift = sps->pixel_shift;
379  fc->tab.sz.bs_width = (fc->ps.pps->width >> 2) + 1;
380  fc->tab.sz.bs_height = (fc->ps.pps->height >> 2) + 1;
381 
382  return 0;
383 }
384 
385 static int min_positive(const int idx, const int diff, const int min_diff)
386 {
387  return diff > 0 && (idx < 0 || diff < min_diff);
388 }
389 
390 static int max_negtive(const int idx, const int diff, const int max_diff)
391 {
392  return diff < 0 && (idx < 0 || diff > max_diff);
393 }
394 
395 typedef int (*smvd_find_fxn)(const int idx, const int diff, const int old_diff);
396 
397 static int8_t smvd_find(const VVCFrameContext *fc, const SliceContext *sc, int lx, smvd_find_fxn find)
398 {
399  const H266RawSliceHeader *rsh = sc->sh.r;
400  const RefPicList *rpl = sc->rpl + lx;
401  const int poc = fc->ref->poc;
402  int8_t idx = -1;
403  int old_diff = -1;
404  for (int i = 0; i < rsh->num_ref_idx_active[lx]; i++) {
405  if (!rpl->isLongTerm[i]) {
406  int diff = poc - rpl->list[i];
407  if (find(idx, diff, old_diff)) {
408  idx = i;
409  old_diff = diff;
410  }
411  }
412  }
413  return idx;
414 }
415 
416 static void smvd_ref_idx(const VVCFrameContext *fc, SliceContext *sc)
417 {
418  VVCSH *sh = &sc->sh;
419  if (IS_B(sh->r)) {
420  sh->ref_idx_sym[0] = smvd_find(fc, sc, 0, min_positive);
421  sh->ref_idx_sym[1] = smvd_find(fc, sc, 1, max_negtive);
422  if (sh->ref_idx_sym[0] == -1 || sh->ref_idx_sym[1] == -1) {
423  sh->ref_idx_sym[0] = smvd_find(fc, sc, 0, max_negtive);
424  sh->ref_idx_sym[1] = smvd_find(fc, sc, 1, min_positive);
425  }
426  }
427 }
428 
429 static void eps_free(SliceContext *slice)
430 {
431  av_freep(&slice->eps);
432  slice->nb_eps = 0;
433 }
434 
436 {
437  if (fc->slices) {
438  for (int i = 0; i < fc->nb_slices_allocated; i++) {
439  SliceContext *slice = fc->slices[i];
440  if (slice) {
441  ff_refstruct_unref(&slice->ref);
442  ff_refstruct_unref(&slice->sh.r);
443  eps_free(slice);
444  av_free(slice);
445  }
446  }
447  av_freep(&fc->slices);
448  }
449  fc->nb_slices_allocated = 0;
450  fc->nb_slices = 0;
451 }
452 
454 {
455  void *p;
456  const int size = (fc->nb_slices_allocated + 1) * 3 / 2;
457 
458  if (fc->nb_slices < fc->nb_slices_allocated)
459  return 0;
460 
461  p = av_realloc_array(fc->slices, size, sizeof(*fc->slices));
462  if (!p)
463  return AVERROR(ENOMEM);
464 
465  fc->slices = p;
466  for (int i = fc->nb_slices_allocated; i < size; i++) {
467  fc->slices[i] = av_mallocz(sizeof(*fc->slices[0]));
468  if (!fc->slices[i]) {
469  fc->nb_slices_allocated = i;
470  return AVERROR(ENOMEM);
471  }
472  fc->slices[i]->slice_idx = i;
473  }
474  fc->nb_slices_allocated = size;
475 
476  return 0;
477 }
478 
479 static int ep_init_cabac_decoder(SliceContext *sc, const int index,
480  const H2645NAL *nal, GetBitContext *gb, const CodedBitstreamUnit *unit)
481 {
482  const H266RawSlice *slice = unit->content_ref;
483  const H266RawSliceHeader *rsh = sc->sh.r;
484  EntryPoint *ep = sc->eps + index;
485  int size;
486  int ret;
487 
488  if (index < rsh->num_entry_points) {
489  int skipped = 0;
490  int64_t start = (gb->index >> 3);
491  int64_t end = start + rsh->sh_entry_point_offset_minus1[index] + 1;
492  while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= start + slice->header_size) {
493  skipped++;
494  }
495  while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= end + slice->header_size) {
496  end--;
497  skipped++;
498  }
499  size = end - start;
500  } else {
501  size = get_bits_left(gb) / 8;
502  }
503  ret = ff_init_cabac_decoder (&ep->cc, gb->buffer + get_bits_count(gb) / 8, size);
504  if (ret < 0)
505  return ret;
506  skip_bits(gb, size * 8);
507  return 0;
508 }
509 
511  VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
512 {
513  const VVCSH *sh = &sc->sh;
514  const H266RawSlice *slice = unit->content_ref;
515  int nb_eps = sh->r->num_entry_points + 1;
516  int ctu_addr = 0;
517  GetBitContext gb;
518  int ret;
519 
520  if (sc->nb_eps != nb_eps) {
521  eps_free(sc);
522  sc->eps = av_calloc(nb_eps, sizeof(*sc->eps));
523  if (!sc->eps)
524  return AVERROR(ENOMEM);
525  sc->nb_eps = nb_eps;
526  }
527 
528  ret = init_get_bits8(&gb, slice->data, slice->data_size);
529  if (ret < 0)
530  return ret;
531  for (int i = 0; i < sc->nb_eps; i++)
532  {
533  EntryPoint *ep = sc->eps + i;
534 
535  ep->ctu_start = ctu_addr;
536  ep->ctu_end = (i + 1 == sc->nb_eps ? sh->num_ctus_in_curr_slice : sh->entry_point_start_ctu[i]);
537 
538  for (int j = ep->ctu_start; j < ep->ctu_end; j++) {
539  const int rs = sc->sh.ctb_addr_in_curr_slice[j];
540  fc->tab.slice_idx[rs] = sc->slice_idx;
541  }
542 
543  ret = ep_init_cabac_decoder(sc, i, nal, &gb, unit);
544  if (ret < 0)
545  return ret;
546 
547  if (i + 1 < sc->nb_eps)
548  ctu_addr = sh->entry_point_start_ctu[i];
549  }
550 
551  return 0;
552 }
553 
555 {
556  const int size = s->nb_fcs;
557  const int idx = (fc - s->fcs + delta + size) % size;
558  return s->fcs + idx;
559 }
560 
561 static int ref_frame(VVCFrame *dst, const VVCFrame *src)
562 {
563  int ret;
564 
565  ret = av_frame_ref(dst->frame, src->frame);
566  if (ret < 0)
567  return ret;
568 
569  ff_refstruct_replace(&dst->progress, src->progress);
570 
571  ff_refstruct_replace(&dst->tab_dmvr_mvf, src->tab_dmvr_mvf);
572 
573  ff_refstruct_replace(&dst->rpl_tab, src->rpl_tab);
574  ff_refstruct_replace(&dst->rpl, src->rpl);
575  dst->nb_rpl_elems = src->nb_rpl_elems;
576 
577  dst->poc = src->poc;
578  dst->ctb_count = src->ctb_count;
579  dst->flags = src->flags;
580  dst->sequence = src->sequence;
581 
582  return 0;
583 }
584 
586 {
587  slices_free(fc);
588 
589  ff_refstruct_pool_uninit(&fc->tu_pool);
590  ff_refstruct_pool_uninit(&fc->cu_pool);
591 
592  for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) {
593  ff_vvc_unref_frame(fc, &fc->DPB[i], ~0);
594  av_frame_free(&fc->DPB[i].frame);
595  }
596 
599  av_frame_free(&fc->output_frame);
600  ff_vvc_frame_ps_free(&fc->ps);
601 }
602 
604 {
605 
606  fc->log_ctx = avctx;
607 
608  fc->output_frame = av_frame_alloc();
609  if (!fc->output_frame)
610  return AVERROR(ENOMEM);
611 
612  for (int j = 0; j < FF_ARRAY_ELEMS(fc->DPB); j++) {
613  fc->DPB[j].frame = av_frame_alloc();
614  if (!fc->DPB[j].frame)
615  return AVERROR(ENOMEM);
616  }
617  fc->cu_pool = ff_refstruct_pool_alloc(sizeof(CodingUnit), 0);
618  if (!fc->cu_pool)
619  return AVERROR(ENOMEM);
620 
621  fc->tu_pool = ff_refstruct_pool_alloc(sizeof(TransformUnit), 0);
622  if (!fc->tu_pool)
623  return AVERROR(ENOMEM);
624 
625  return 0;
626 }
627 
629 {
630  int ret;
631 
632  fc->ref = NULL;
633 
634  // copy refs from the last frame
635  if (s->nb_frames && s->nb_fcs > 1) {
636  VVCFrameContext *prev = get_frame_context(s, fc, -1);
637  for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) {
638  ff_vvc_unref_frame(fc, &fc->DPB[i], ~0);
639  if (prev->DPB[i].frame->buf[0]) {
640  ret = ref_frame(&fc->DPB[i], &prev->DPB[i]);
641  if (ret < 0)
642  return ret;
643  }
644  }
645  }
646 
647  if (IS_IDR(s)) {
648  s->seq_decode = (s->seq_decode + 1) & 0xff;
650  }
651 
652  ret = pic_arrays_init(s, fc);
653  if (ret < 0)
654  return ret;
655  ff_vvc_dsp_init(&fc->vvcdsp, fc->ps.sps->bit_depth);
656  ff_videodsp_init(&fc->vdsp, fc->ps.sps->bit_depth);
657  return 0;
658 }
659 
661 {
662  const VVCPH *ph = &fc->ps.ph;
663  const H266RawSliceHeader *rsh = sc->sh.r;
664  int ret;
665 
666  // 8.3.1 Decoding process for picture order count
667  if (!s->temporal_id && !ph->r->ph_non_ref_pic_flag && !(IS_RASL(s) || IS_RADL(s)))
668  s->poc_tid0 = ph->poc;
669 
670  if ((ret = ff_vvc_set_new_ref(s, fc, &fc->frame)) < 0)
671  goto fail;
672 
673  if (!IS_IDR(s))
675 
676  av_frame_unref(fc->output_frame);
677 
678  if ((ret = ff_vvc_output_frame(s, fc, fc->output_frame,rsh->sh_no_output_of_prior_pics_flag, 0)) < 0)
679  goto fail;
680 
681  if ((ret = ff_vvc_frame_rpl(s, fc, sc)) < 0)
682  goto fail;
683 
684  if ((ret = ff_vvc_frame_thread_init(fc)) < 0)
685  goto fail;
686  return 0;
687 fail:
688  if (fc->ref)
689  ff_vvc_unref_frame(fc, fc->ref, ~0);
690  fc->ref = NULL;
691  return ret;
692 }
693 
695  const CodedBitstreamUnit *unit, const int is_first_slice)
696 {
697  VVCSH *sh = &sc->sh;
698  int ret;
699 
700  ret = ff_vvc_decode_sh(sh, &fc->ps, unit);
701  if (ret < 0)
702  return ret;
703 
704  ff_refstruct_replace(&sc->ref, unit->content_ref);
705 
706  if (is_first_slice) {
707  ret = frame_start(s, fc, sc);
708  if (ret < 0)
709  return ret;
710  } else if (fc->ref) {
711  if (!IS_I(sh->r)) {
712  ret = ff_vvc_slice_rpl(s, fc, sc);
713  if (ret < 0) {
714  av_log(fc->log_ctx, AV_LOG_WARNING,
715  "Error constructing the reference lists for the current slice.\n");
716  return ret;
717  }
718  }
719  } else {
720  av_log(fc->log_ctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
721  return ret;
722  }
723 
724  if (!IS_I(sh->r))
725  smvd_ref_idx(fc, sc);
726 
727  return 0;
728 }
729 
731 {
732  AVCodecContext *c = s->avctx;
733  const VVCSPS *sps = fc->ps.sps;
734  const VVCPPS *pps = fc->ps.pps;
735 
736  c->pix_fmt = sps->pix_fmt;
737  c->coded_width = pps->width;
738  c->coded_height = pps->height;
739  c->width = pps->width - ((pps->r->pps_conf_win_left_offset + pps->r->pps_conf_win_right_offset) << sps->hshift[CHROMA]);
740  c->height = pps->height - ((pps->r->pps_conf_win_top_offset + pps->r->pps_conf_win_bottom_offset) << sps->vshift[CHROMA]);
741 }
742 
744 {
745  int ret = ff_vvc_decode_frame_ps(&fc->ps, s);
746  if (ret < 0)
747  return ret;
748 
750  if (ret < 0)
751  return ret;
752 
754  return ret;
755 }
756 
757 static int decode_slice(VVCContext *s, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
758 {
759  int ret;
760  SliceContext *sc;
761  const int is_first_slice = !fc->nb_slices;
762 
763  ret = slices_realloc(fc);
764  if (ret < 0)
765  return ret;
766 
767  sc = fc->slices[fc->nb_slices];
768 
769  s->vcl_unit_type = nal->type;
770  if (is_first_slice) {
771  ret = frame_setup(fc, s);
772  if (ret < 0)
773  return ret;
774  }
775 
776  ret = slice_start(sc, s, fc, unit, is_first_slice);
777  if (ret < 0)
778  return ret;
779 
780  ret = slice_init_entry_points(sc, fc, nal, unit);
781  if (ret < 0)
782  return ret;
783  fc->nb_slices++;
784 
785  return 0;
786 }
787 
789 {
790  int ret;
791 
792  s->temporal_id = nal->temporal_id;
793 
794  if (nal->nuh_layer_id > 0) {
796  "Decoding of multilayer bitstreams");
797  return AVERROR_PATCHWELCOME;
798  }
799 
800  switch (unit->type) {
801  case VVC_VPS_NUT:
802  case VVC_SPS_NUT:
803  case VVC_PPS_NUT:
804  /* vps, sps, sps cached by s->cbc */
805  break;
806  case VVC_TRAIL_NUT:
807  case VVC_STSA_NUT:
808  case VVC_RADL_NUT:
809  case VVC_RASL_NUT:
810  case VVC_IDR_W_RADL:
811  case VVC_IDR_N_LP:
812  case VVC_CRA_NUT:
813  case VVC_GDR_NUT:
814  ret = decode_slice(s, fc, nal, unit);
815  if (ret < 0)
816  return ret;
817  break;
818  case VVC_PREFIX_APS_NUT:
819  case VVC_SUFFIX_APS_NUT:
820  ret = ff_vvc_decode_aps(&s->ps, unit);
821  if (ret < 0)
822  return ret;
823  break;
824  }
825 
826  return 0;
827 }
828 
830 {
831  const CodedBitstreamH266Context *h266 = s->cbc->priv_data;
832  CodedBitstreamFragment *frame = &s->current_frame;
833  int ret = 0;
834  s->last_eos = s->eos;
835  s->eos = 0;
836 
838  ret = ff_cbs_read_packet(s->cbc, frame, avpkt);
839  if (ret < 0) {
840  av_log(s->avctx, AV_LOG_ERROR, "Failed to read packet.\n");
841  return ret;
842  }
843  /* decode the NAL units */
844  for (int i = 0; i < frame->nb_units; i++) {
845  const H2645NAL *nal = h266->common.read_packet.nals + i;
846  const CodedBitstreamUnit *unit = frame->units + i;
847 
848  if (unit->type == VVC_EOB_NUT || unit->type == VVC_EOS_NUT) {
849  s->last_eos = 1;
850  } else {
851  ret = decode_nal_unit(s, fc, nal, unit);
852  if (ret < 0) {
853  av_log(s->avctx, AV_LOG_WARNING,
854  "Error parsing NAL unit #%d.\n", i);
855  goto fail;
856  }
857  }
858  }
859  return 0;
860 
861 fail:
862  if (fc->ref)
864  return ret;
865 }
866 
867 static int set_output_format(const VVCContext *s, const AVFrame *output)
868 {
869  AVCodecContext *c = s->avctx;
870  int ret;
871 
872  if (output->width != c->width || output->height != c->height) {
873  if ((ret = ff_set_dimensions(c, output->width, output->height)) < 0)
874  return ret;
875  }
876  c->pix_fmt = output->format;
877  return 0;
878 }
879 
880 static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output)
881 {
882  VVCFrameContext *delayed = get_frame_context(s, s->fcs, s->nb_frames - s->nb_delayed);
883  int ret = ff_vvc_frame_wait(s, delayed);
884 
885  if (!ret && delayed->output_frame->buf[0] && output) {
888  if (!ret)
889  *got_output = 1;
890  }
891  s->nb_delayed--;
892 
893  return ret;
894 }
895 
896 static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output)
897 {
898  int ret;
899  s->nb_frames++;
900  s->nb_delayed++;
902  if (s->nb_delayed >= s->nb_fcs) {
903  if ((ret = wait_delayed_frame(s, output, got_output)) < 0)
904  return ret;
905  }
906  return 0;
907 }
908 
909 static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
910 {
911  int ret;
912  while (s->nb_delayed) {
913  if ((ret = wait_delayed_frame(s, output, got_output)) < 0)
914  return ret;
915  if (*got_output)
916  return 0;
917  }
918  if (s->nb_frames) {
919  //we still have frames cached in dpb.
920  VVCFrameContext *last = get_frame_context(s, s->fcs, s->nb_frames - 1);
921 
922  ret = ff_vvc_output_frame(s, last, output, 0, 1);
923  if (ret < 0)
924  return ret;
925  if (ret) {
926  *got_output = ret;
927  if ((ret = set_output_format(s, output)) < 0)
928  return ret;
929  }
930  }
931  return 0;
932 }
933 
935  int *got_output, AVPacket *avpkt)
936 {
937  VVCContext *s = avctx->priv_data;
939  int ret;
940 
941  if (!avpkt->size)
942  return get_decoded_frame(s, output, got_output);
943 
944  fc = get_frame_context(s, s->fcs, s->nb_frames);
945 
946  fc->nb_slices = 0;
947  fc->decode_order = s->nb_frames;
948 
949  ret = decode_nal_units(s, fc, avpkt);
950  if (ret < 0)
951  return ret;
952 
953  if (!fc->ft)
954  return avpkt->size;
955 
956  ret = submit_frame(s, fc, output, got_output);
957  if (ret < 0)
958  return ret;
959 
960  return avpkt->size;
961 }
962 
964 {
965  VVCContext *s = avctx->priv_data;
966  int got_output = 0;
967 
968  while (s->nb_delayed)
969  wait_delayed_frame(s, NULL, &got_output);
970 
971  if (s->fcs) {
972  VVCFrameContext *last = get_frame_context(s, s->fcs, s->nb_frames - 1);
973  ff_vvc_flush_dpb(last);
974  }
975 
976  s->eos = 1;
977 }
978 
980 {
981  VVCContext *s = avctx->priv_data;
982 
983  ff_cbs_fragment_free(&s->current_frame);
984  vvc_decode_flush(avctx);
985  ff_vvc_executor_free(&s->executor);
986  if (s->fcs) {
987  for (int i = 0; i < s->nb_fcs; i++)
988  frame_context_free(s->fcs + i);
989  av_free(s->fcs);
990  }
991  ff_vvc_ps_uninit(&s->ps);
992  ff_cbs_close(&s->cbc);
993 
994  return 0;
995 }
996 
997 static av_cold void init_default_scale_m(void)
998 {
999  memset(&ff_vvc_default_scale_m, 16, sizeof(ff_vvc_default_scale_m));
1000 }
1001 
1002 #define VVC_MAX_DELAYED_FRAMES 16
1004 {
1005  VVCContext *s = avctx->priv_data;
1006  static AVOnce init_static_once = AV_ONCE_INIT;
1007  const int cpu_count = av_cpu_count();
1008  const int delayed = FFMIN(cpu_count, VVC_MAX_DELAYED_FRAMES);
1009  const int thread_count = avctx->thread_count ? avctx->thread_count : delayed;
1010  int ret;
1011 
1012  s->avctx = avctx;
1013 
1014  ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_VVC, avctx);
1015  if (ret)
1016  return ret;
1017 
1018  if (avctx->extradata_size > 0 && avctx->extradata) {
1019  ret = ff_cbs_read_extradata_from_codec(s->cbc, &s->current_frame, avctx);
1020  if (ret < 0)
1021  return ret;
1022  }
1023 
1024  s->nb_fcs = (avctx->flags & AV_CODEC_FLAG_LOW_DELAY) ? 1 : delayed;
1025  s->fcs = av_calloc(s->nb_fcs, sizeof(*s->fcs));
1026  if (!s->fcs)
1027  return AVERROR(ENOMEM);
1028 
1029  for (int i = 0; i < s->nb_fcs; i++) {
1030  VVCFrameContext *fc = s->fcs + i;
1031  ret = frame_context_init(fc, avctx);
1032  if (ret < 0)
1033  return ret;
1034  }
1035 
1036  s->executor = ff_vvc_executor_alloc(s, thread_count);
1037  if (!s->executor)
1038  return AVERROR(ENOMEM);
1039 
1040  s->eos = 1;
1042  ff_thread_once(&init_static_once, init_default_scale_m);
1043 
1044  return 0;
1045 }
1046 
1048  .p.name = "vvc",
1049  .p.long_name = NULL_IF_CONFIG_SMALL("VVC (Versatile Video Coding)"),
1050  .p.type = AVMEDIA_TYPE_VIDEO,
1051  .p.id = AV_CODEC_ID_VVC,
1052  .priv_data_size = sizeof(VVCContext),
1053  .init = vvc_decode_init,
1054  .close = vvc_decode_free,
1056  .flush = vvc_decode_flush,
1061  .p.profiles = NULL_IF_CONFIG_SMALL(ff_vvc_profiles),
1062 };
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
VVCSPS
Definition: vvc_ps.h:58
smvd_find_fxn
int(* smvd_find_fxn)(const int idx, const int diff, const int old_diff)
Definition: vvcdec.c:395
ALF_BORDER_LUMA
#define ALF_BORDER_LUMA
Definition: vvc_ctu.h:73
vvc_decode_flush
static av_cold void vvc_decode_flush(AVCodecContext *avctx)
Definition: vvcdec.c:963
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
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: vvc_ps.h:229
frame_context_init
static av_cold int frame_context_init(VVCFrameContext *fc, AVCodecContext *avctx)
Definition: vvcdec.c:603
VVCPH
Definition: vvc_ps.h:143
VVCFrameContext::output_frame
struct AVFrame * output_frame
Definition: vvcdec.h:99
bs_tl_init
static void bs_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:182
VVCPPS
Definition: vvc_ps.h:92
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
max_negtive
static int max_negtive(const int idx, const int diff, const int max_diff)
Definition: vvcdec.c:390
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
cpu_count
static atomic_int cpu_count
Definition: cpu.c:53
VVCSH::entry_point_start_ctu
uint32_t entry_point_start_ctu[VVC_MAX_ENTRY_POINTS]
entry point start in ctu_addr
Definition: vvc_ps.h:251
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
ff_vvc_report_frame_finished
void ff_vvc_report_frame_finished(VVCFrame *frame)
Definition: vvc_refs.c:494
frame_setup
static int frame_setup(VVCFrameContext *fc, VVCContext *s)
Definition: vvcdec.c:743
VVC_MAX_SAMPLE_ARRAYS
@ VVC_MAX_SAMPLE_ARRAYS
Definition: vvc.h:77
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:185
thread.h
slice_init_entry_points
static int slice_init_entry_points(SliceContext *sc, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition: vvcdec.c:510
MAX_CTU_SIZE
#define MAX_CTU_SIZE
Definition: vvc_ctu.h:31
CodingUnit
Definition: hevcdec.h:282
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:779
VVCFrameContext::DPB
VVCFrame DPB[VVC_MAX_DPB_SIZE+1]
Definition: vvcdec.h:96
vvc_decode_init
static av_cold int vvc_decode_init(AVCodecContext *avctx)
Definition: vvcdec.c:1003
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:130
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3002
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:344
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:171
decode_slice
static int decode_slice(VVCContext *s, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition: vvcdec.c:757
IS_RADL
#define IS_RADL(s)
Definition: vvc_ps.h:36
tl_init
static void tl_init(TabList *l, const int zero, const int realloc)
Definition: vvcdec.c:58
VVCSH::r
const H266RawSliceHeader * r
RefStruct reference.
Definition: vvc_ps.h:225
FFCodec
Definition: codec_internal.h:127
vvc_decode_frame
static int vvc_decode_frame(AVCodecContext *avctx, AVFrame *output, int *got_output, AVPacket *avpkt)
Definition: vvcdec.c:934
ff_vvc_decode_aps
int ff_vvc_decode_aps(VVCParamSets *ps, const CodedBitstreamUnit *unit)
Definition: vvc_ps.c:975
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:74
ff_vvc_slice_rpl
int ff_vvc_slice_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition: vvc_refs.c:416
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:472
ff_vvc_default_scale_m
uint8_t ff_vvc_default_scale_m[64 *64]
Definition: vvc_data.c:1641
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:557
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
decode_nal_units
static int decode_nal_units(VVCContext *s, VVCFrameContext *fc, AVPacket *avpkt)
Definition: vvcdec.c:829
H2645NAL::temporal_id
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
Definition: h2645_parse.h:62
RefPicList
Definition: hevcdec.h:189
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:141
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
min_tu_tl_init
static void min_tu_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:159
submit_frame
static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output)
Definition: vvcdec.c:896
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:381
msm_tl_init
static void msm_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:238
frame_context_setup
static int frame_context_setup(VVCFrameContext *fc, VVCContext *s)
Definition: vvcdec.c:628
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
vvc_data.h
fail
#define fail()
Definition: checkasm.h:179
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1582
ff_refstruct_pool_uninit
static void ff_refstruct_pool_uninit(FFRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition: refstruct.h:292
VVCFrame::rpl
RefPicListTab * rpl
RefStruct reference.
Definition: vvcdec.h:61
GetBitContext
Definition: get_bits.h:108
vvc_refs.h
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:502
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: vvcdec.h:88
VVC_IDR_W_RADL
@ VVC_IDR_W_RADL
Definition: vvc.h:36
refstruct.h
VVC_EOS_NUT
@ VVC_EOS_NUT
Definition: vvc.h:50
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:118
export_frame_params
static void export_frame_params(VVCContext *s, const VVCFrameContext *fc)
Definition: vvcdec.c:730
H266RawSliceHeader::num_ref_idx_active
uint8_t num_ref_idx_active[2]
NumRefIdxActive[].
Definition: cbs_h266.h:837
slice_start
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
Definition: vvcdec.c:694
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:205
ff_vvc_unref_frame
void ff_vvc_unref_frame(VVCFrameContext *fc, VVCFrame *frame, int flags)
Definition: vvc_refs.c:45
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
H266RawSlice::data
uint8_t * data
Definition: cbs_h266.h:844
AV_CODEC_CAP_EXPERIMENTAL
#define AV_CODEC_CAP_EXPERIMENTAL
Codec is experimental and is thus avoided in favor of non experimental encoders.
Definition: codec.h:102
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:545
VVCFrame::flags
uint8_t flags
A combination of VVC_FRAME_FLAG_*.
Definition: vvcdec.h:80
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:524
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:122
width
#define width
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:287
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:58
SliceContext::slice_idx
int slice_idx
Definition: vvcdec.h:84
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:215
VVC_MAX_DELAYED_FRAMES
#define VVC_MAX_DELAYED_FRAMES
Definition: vvcdec.c:1002
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
VVCSH
Definition: vvc_ps.h:224
ALF_PADDING_SIZE
#define ALF_PADDING_SIZE
Definition: vvc_ctu.h:70
decode.h
IS_IDR
#define IS_IDR(s)
Definition: hevcdec.h:75
smvd_ref_idx
static void smvd_ref_idx(const VVCFrameContext *fc, SliceContext *sc)
Definition: vvcdec.c:416
vvcdec.h
H2645NAL::skipped_bytes_pos
int * skipped_bytes_pos
Definition: h2645_parse.h:71
TabList::tabs
Tab tabs[TAB_MAX]
Definition: vvcdec.c:44
ff_vvc_clear_refs
void ff_vvc_clear_refs(VVCFrameContext *fc)
Definition: vvc_refs.c:76
ff_vvc_frame_wait
int ff_vvc_frame_wait(VVCContext *s, VVCFrameContext *fc)
Definition: vvc_thread.c:812
IS_RASL
#define IS_RASL(s)
Definition: vvc_ps.h:35
eps_free
static void eps_free(SliceContext *slice)
Definition: vvcdec.c:429
H2645NAL::type
int type
NAL unit type.
Definition: h2645_parse.h:52
frame_context_for_each_tl
static int frame_context_for_each_tl(VVCFrameContext *fc, int(*unary_fn)(TabList *l))
Definition: vvcdec.c:292
min_positive
static int min_positive(const int idx, const int diff, const int min_diff)
Definition: vvcdec.c:385
frame
static AVFrame * frame
Definition: demux_decode.c:54
ctu_nz_tl_init
static void ctu_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:107
ff_vvc_decode_frame_ps
int ff_vvc_decode_frame_ps(VVCFrameParamSets *fps, struct VVCContext *s)
Definition: vvc_ps.c:760
ctu_tl_init
static void ctu_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:93
MAX_CONTROL_POINTS
#define MAX_CONTROL_POINTS
Definition: vvc_ctu.h:61
GetBitContext::buffer
const uint8_t * buffer
Definition: get_bits.h:109
ff_vvc_flush_dpb
void ff_vvc_flush_dpb(VVCFrameContext *fc)
Definition: vvc_refs.c:83
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:203
wait_delayed_frame
static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output)
Definition: vvcdec.c:880
GDR_SET_RECOVERED
#define GDR_SET_RECOVERED(s)
Definition: vvc_ps.h:44
ff_vvc_decode_sh
int ff_vvc_decode_sh(VVCSH *sh, const VVCFrameParamSets *fps, const CodedBitstreamUnit *unit)
Definition: vvc_ps.c:1164
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
TabList
Definition: vvcdec.c:43
min_pu_tl_init
static void min_pu_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:145
VVCSH::ref_idx_sym
int8_t ref_idx_sym[2]
RefIdxSymL0, RefIdxSymL1.
Definition: vvc_ps.h:234
ff_vvc_frame_ps_free
void ff_vvc_frame_ps_free(VVCFrameParamSets *fps)
Definition: vvc_ps.c:776
init_default_scale_m
static av_cold void init_default_scale_m(void)
Definition: vvcdec.c:997
SliceContext::eps
struct EntryPoint * eps
Definition: vvcdec.h:86
ff_vvc_decoder
const FFCodec ff_vvc_decoder
Definition: vvcdec.c:1047
ff_vvc_frame_thread_free
void ff_vvc_frame_thread_free(VVCFrameContext *fc)
Definition: vvc_thread.c:662
profiles.h
CodedBitstreamH266Context::common
CodedBitstreamH2645Context common
Definition: cbs_h266.h:868
CodedBitstreamH2645Context::read_packet
H2645Packet read_packet
Definition: cbs_h2645.h:32
RefPicListTab
Definition: hevcdec.h:196
AVOnce
#define AVOnce
Definition: thread.h:202
pic_arrays_free
static void pic_arrays_free(VVCFrameContext *fc)
Definition: vvcdec.c:327
index
int index
Definition: gxfenc.c:89
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
ff_vvc_ctu_free_cus
void ff_vvc_ctu_free_cus(CTU *ctu)
Definition: vvc_ctu.c:2516
ff_vvc_ps_uninit
void ff_vvc_ps_uninit(VVCParamSets *ps)
Definition: vvc_ps.c:786
TransformUnit
Definition: hevcdec.h:325
VVCFrame::sequence
uint16_t sequence
A sequence counter, so that old frames are output first after a POC reset.
Definition: vvcdec.h:76
SliceContext
Definition: mss12.h:70
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: vvc_refs.c:196
pic_arrays_init
static int pic_arrays_init(VVCContext *s, VVCFrameContext *fc)
Definition: vvcdec.c:337
av_cpu_count
int av_cpu_count(void)
Definition: cpu.c:209
H266RawSliceHeader::sh_entry_point_offset_minus1
uint32_t sh_entry_point_offset_minus1[VVC_MAX_ENTRY_POINTS]
Definition: cbs_h266.h:832
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:365
TabList::nb_tabs
int nb_tabs
Definition: vvcdec.c:45
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:523
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:106
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
Tab
Definition: vvcdec.c:38
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:354
codec_internal.h
VVC_VPS_NUT
@ VVC_VPS_NUT
Definition: vvc.h:43
RefPicList::isLongTerm
int isLongTerm[HEVC_MAX_REFS]
Definition: hevcdec.h:192
cpu.h
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
size
int size
Definition: twinvq_data.h:10344
EntryPoint::cc
CABACContext cc
Definition: vvc_ctu.h:355
EntryPoint::ctu_end
int ctu_end
Definition: vvc_ctu.h:358
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
ep_init_cabac_decoder
static int ep_init_cabac_decoder(SliceContext *sc, const int index, const H2645NAL *nal, GetBitContext *gb, const CodedBitstreamUnit *unit)
Definition: vvcdec.c:479
GetBitContext::index
int index
Definition: get_bits.h:110
tl_free
static int tl_free(TabList *l)
Definition: vvcdec.c:65
ibc_tl_init
static void ibc_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:265
SliceContext::ref
void * ref
RefStruct reference, backing slice data.
Definition: vvcdec.h:89
MvField
Definition: hevcdec.h:300
vvc_thread.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:164
ALF_BORDER_CHROMA
#define ALF_BORDER_CHROMA
Definition: vvc_ctu.h:74
VVCFrame
Definition: vvcdec.h:56
ref_frame
static int ref_frame(VVCFrame *dst, const VVCFrame *src)
Definition: vvcdec.c:561
TL_ADD
#define TL_ADD(t, s)
Definition: vvcdec.c:51
height
#define height
VVCFrame::tab_dmvr_mvf
struct MvField * tab_dmvr_mvf
RefStruct reference.
Definition: vvcdec.h:59
CodedBitstreamH266Context
Definition: cbs_h266.h:866
AV_CODEC_ID_VVC
@ AV_CODEC_ID_VVC
Definition: codec_id.h:250
VVCSH::ctb_addr_in_curr_slice
const uint32_t * ctb_addr_in_curr_slice
CtbAddrInCurrSlice.
Definition: vvc_ps.h:230
VVC_TRAIL_NUT
@ VVC_TRAIL_NUT
Definition: vvc.h:29
VVC_SPS_NUT
@ VVC_SPS_NUT
Definition: vvc.h:44
ff_cbs_read_extradata_from_codec
int ff_cbs_read_extradata_from_codec(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVCodecContext *avctx)
Definition: cbs.c:294
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:769
H266RawSliceHeader::num_entry_points
uint32_t num_entry_points
NumEntryPoints.
Definition: cbs_h266.h:836
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
get_decoded_frame
static int get_decoded_frame(VVCContext *s, AVFrame *output, int *got_output)
Definition: vvcdec.c:909
TabList::realloc
int realloc
Definition: vvcdec.c:48
SliceContext::nb_eps
int nb_eps
Definition: vvcdec.h:87
min_cb_tl_init
static void min_cb_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:120
VVCFrame::nb_rpl_elems
int nb_rpl_elems
Definition: vvcdec.h:62
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
ispmf_tl_init
static void ispmf_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:252
pixel_buffer_nz_tl_init
static void pixel_buffer_nz_tl_init(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:203
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:523
vvc_ctu.h
VVCFrame::progress
struct FrameProgress * progress
RefStruct reference.
Definition: vvcdec.h:70
tl_init_fn
void(* tl_init_fn)(TabList *l, VVCFrameContext *fc)
Definition: vvcdec.c:290
ff_vvc_frame_thread_init
int ff_vvc_frame_thread_init(VVCFrameContext *fc)
Definition: vvc_thread.c:702
IS_B
#define IS_B(rsh)
Definition: vvc_ps.h:40
delta
float delta
Definition: vorbis_enc_data.h:430
slices_free
static void slices_free(VVCFrameContext *fc)
Definition: vvcdec.c:435
H266RawSlice::header_size
size_t header_size
Definition: cbs_h266.h:846
ff_vvc_dsp_init
void ff_vvc_dsp_init(VVCDSPContext *vvcdsp, int bit_depth)
Definition: vvcdsp.c:98
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:603
VVC_IDR_N_LP
@ VVC_IDR_N_LP
Definition: vvc.h:37
H266RawSlice::data_size
size_t data_size
Definition: cbs_h266.h:847
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:576
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:254
EntryPoint
Definition: vvc_ctu.h:349
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
vvc_decode_free
static av_cold int vvc_decode_free(AVCodecContext *avctx)
Definition: vvcdec.c:979
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:262
decode_nal_unit
static int decode_nal_unit(VVCContext *s, VVCFrameContext *fc, const H2645NAL *nal, const CodedBitstreamUnit *unit)
Definition: vvcdec.c:788
smvd_find
static int8_t smvd_find(const VVCFrameContext *fc, const SliceContext *sc, int lx, smvd_find_fxn find)
Definition: vvcdec.c:397
ret
ret
Definition: filter_design.txt:187
VVCFrame::frame
struct AVFrame * frame
Definition: vvcdec.h:57
frame_context_free
static av_cold void frame_context_free(VVCFrameContext *fc)
Definition: vvcdec.c:585
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
ff_vvc_executor_free
void ff_vvc_executor_free(AVExecutor **e)
Definition: vvc_thread.c:657
AVCodecContext
main external API structure.
Definition: avcodec.h:445
VVC_PREFIX_APS_NUT
@ VVC_PREFIX_APS_NUT
Definition: vvc.h:46
ff_vvc_frame_submit
void ff_vvc_frame_submit(VVCContext *s, VVCFrameContext *fc)
Definition: vvc_thread.c:792
slices_realloc
static int slices_realloc(VVCFrameContext *fc)
Definition: vvcdec.c:453
VVCFrame::poc
int poc
Definition: vvcdec.h:66
TabList::zero
int zero
Definition: vvcdec.c:47
VVC_SUFFIX_APS_NUT
@ VVC_SUFFIX_APS_NUT
Definition: vvc.h:47
frame_start
static int frame_start(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition: vvcdec.c:660
Tab::size
size_t size
Definition: vvcdec.c:40
get_frame_context
static VVCFrameContext * get_frame_context(const VVCContext *s, const VVCFrameContext *fc, const int delta)
Definition: vvcdec.c:554
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
ff_vvc_frame_rpl
int ff_vvc_frame_rpl(VVCContext *s, VVCFrameContext *fc, SliceContext *sc)
Definition: vvc_refs.c:470
RefPicList::list
int list[HEVC_MAX_REFS]
Definition: hevcdec.h:191
VVC_CRA_NUT
@ VVC_CRA_NUT
Definition: vvc.h:38
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:303
IS_I
#define IS_I(rsh)
Definition: vvc_ps.h:38
ff_vvc_profiles
const AVProfile ff_vvc_profiles[]
Definition: profiles.c:89
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
zero
#define zero
Definition: regdef.h:64
FF_CODEC_CAP_AUTO_THREADS
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
Definition: codec_internal.h:73
tl_create
static int tl_create(TabList *l)
Definition: vvcdec.c: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:89
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:472
AVPacket
This structure stores compressed data.
Definition: packet.h:499
SliceContext::sh
VVCSH sh
Definition: vvcdec.h:85
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
VVCFrameContext
Definition: vvcdec.h:92
EntryPoint::ctu_start
int ctu_start
Definition: vvc_ctu.h:357
set_output_format
static int set_output_format(const VVCContext *s, const AVFrame *output)
Definition: vvcdec.c:867
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
VVC_EOB_NUT
@ VVC_EOB_NUT
Definition: vvc.h:51
h
h
Definition: vp9dsp_template.c:2038
free_cus
static void free_cus(VVCFrameContext *fc)
Definition: vvcdec.c:319
VVCFrame::ctb_count
int ctb_count
Definition: vvcdec.h:64
VVCFrame::rpl_tab
RefPicListTab ** rpl_tab
RefStruct reference.
Definition: vvcdec.h:60
ff_vvc_executor_alloc
AVExecutor * ff_vvc_executor_alloc(VVCContext *s, const int thread_count)
Definition: vvc_thread.c:645
int
int
Definition: ffmpeg_filter.c:409
ff_vvc_set_new_ref
int ff_vvc_set_new_ref(VVCContext *s, VVCFrameContext *fc, AVFrame **frame)
Definition: vvc_refs.c:154
TAB_MAX
#define TAB_MAX
Definition: vvcdec.c:36
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
LUMA
#define LUMA
Definition: hevc_filter.c:31
H266RawSlice
Definition: cbs_h266.h:841
VVCContext
Definition: vvcdec.h:195
Tab::tab
void ** tab
Definition: vvcdec.c:39
ff_vvc_bump_frame
void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc)
Definition: vvc_refs.c:255