FFmpeg
vvc_ps.c
Go to the documentation of this file.
1 /*
2  * VVC parameter set parser
3  *
4  * Copyright (C) 2023 Nuo Mi
5  * Copyright (C) 2022 Xu Mu
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include "libavcodec/cbs_h266.h"
25 #include "libavutil/mem.h"
26 #include "libavutil/pixdesc.h"
27 #include "libavcodec/refstruct.h"
28 #include "vvc_data.h"
29 #include "vvc_ps.h"
30 #include "vvcdec.h"
31 
32 static int sps_map_pixel_format(VVCSPS *sps, void *log_ctx)
33 {
34  const H266RawSPS *r = sps->r;
35  const AVPixFmtDescriptor *desc;
36 
37  switch (sps->bit_depth) {
38  case 8:
39  if (r->sps_chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY8;
40  if (r->sps_chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P;
41  if (r->sps_chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P;
42  if (r->sps_chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P;
43  break;
44  case 10:
45  if (r->sps_chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY10;
46  if (r->sps_chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P10;
47  if (r->sps_chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P10;
48  if (r->sps_chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P10;
49  break;
50  case 12:
51  if (r->sps_chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY12;
52  if (r->sps_chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P12;
53  if (r->sps_chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P12;
54  if (r->sps_chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P12;
55  break;
56  default:
57  av_log(log_ctx, AV_LOG_ERROR,
58  "The following bit-depths are currently specified: 8, 10, 12 bits, "
59  "chroma_format_idc is %d, depth is %d\n",
60  r->sps_chroma_format_idc, sps->bit_depth);
61  return AVERROR_INVALIDDATA;
62  }
63 
64  desc = av_pix_fmt_desc_get(sps->pix_fmt);
65  if (!desc)
66  return AVERROR(EINVAL);
67 
68  sps->hshift[0] = sps->vshift[0] = 0;
69  sps->hshift[2] = sps->hshift[1] = desc->log2_chroma_w;
70  sps->vshift[2] = sps->vshift[1] = desc->log2_chroma_h;
71 
72  sps->pixel_shift = sps->bit_depth > 8;
73 
74  return 0;
75 }
76 
77 static int sps_bit_depth(VVCSPS *sps, void *log_ctx)
78 {
79  const H266RawSPS *r = sps->r;
80 
81  sps->bit_depth = r->sps_bitdepth_minus8 + 8;
82  sps->qp_bd_offset = 6 * (sps->bit_depth - 8);
83  sps->log2_transform_range =
84  r->sps_extended_precision_flag ? FFMAX(15, FFMIN(20, sps->bit_depth + 6)) : 15;
85  return sps_map_pixel_format(sps, log_ctx);
86 }
87 
89 {
90  const H266RawSPS *r = sps->r;
91  const int num_qp_tables = r->sps_same_qp_table_for_chroma_flag ?
92  1 : (r->sps_joint_cbcr_enabled_flag ? 3 : 2);
93 
94  for (int i = 0; i < num_qp_tables; i++) {
95  int num_points_in_qp_table;
97  unsigned int delta_qp_in[VVC_MAX_POINTS_IN_QP_TABLE];
98  int off = sps->qp_bd_offset;
99 
100  num_points_in_qp_table = r->sps_num_points_in_qp_table_minus1[i] + 1;
101 
102  qp_out[0] = qp_in[0] = r->sps_qp_table_start_minus26[i] + 26;
103  for (int j = 0; j < num_points_in_qp_table; j++ ) {
104  delta_qp_in[j] = r->sps_delta_qp_in_val_minus1[i][j] + 1;
105  qp_in[j+1] = qp_in[j] + delta_qp_in[j];
106  qp_out[j+1] = qp_out[j] + (r->sps_delta_qp_in_val_minus1[i][j] ^ r->sps_delta_qp_diff_val[i][j]);
107  }
108  sps->chroma_qp_table[i][qp_in[0] + off] = qp_out[0];
109  for (int k = qp_in[0] - 1 + off; k >= 0; k--)
110  sps->chroma_qp_table[i][k] = av_clip(sps->chroma_qp_table[i][k+1]-1, -off, 63);
111 
112  for (int j = 0; j < num_points_in_qp_table; j++) {
113  int sh = delta_qp_in[j] >> 1;
114  for (int k = qp_in[j] + 1 + off, m = 1; k <= qp_in[j+1] + off; k++, m++) {
115  sps->chroma_qp_table[i][k] = sps->chroma_qp_table[i][qp_in[j] + off] +
116  ((qp_out[j+1] - qp_out[j]) * m + sh) / delta_qp_in[j];
117  }
118  }
119  for (int k = qp_in[num_points_in_qp_table] + 1 + off; k <= 63 + off; k++)
120  sps->chroma_qp_table[i][k] = av_clip(sps->chroma_qp_table[i][k-1] + 1, -sps->qp_bd_offset, 63);
121  }
122  if (r->sps_same_qp_table_for_chroma_flag) {
123  memcpy(&sps->chroma_qp_table[1], &sps->chroma_qp_table[0], sizeof(sps->chroma_qp_table[0]));
124  memcpy(&sps->chroma_qp_table[2], &sps->chroma_qp_table[0], sizeof(sps->chroma_qp_table[0]));
125  }
126 
127  return 0;
128 }
129 
130 static void sps_poc(VVCSPS *sps)
131 {
132  sps->max_pic_order_cnt_lsb = 1 << (sps->r->sps_log2_max_pic_order_cnt_lsb_minus4 + 4);
133 }
134 
135 static void sps_inter(VVCSPS *sps)
136 {
137  const H266RawSPS *r = sps->r;
138 
139  sps->max_num_merge_cand = 6 - r->sps_six_minus_max_num_merge_cand;
140  sps->max_num_ibc_merge_cand = 6 - r->sps_six_minus_max_num_ibc_merge_cand;
141 
142  if (sps->r->sps_gpm_enabled_flag) {
143  sps->max_num_gpm_merge_cand = 2;
144  if (sps->max_num_merge_cand >= 3)
145  sps->max_num_gpm_merge_cand = sps->max_num_merge_cand - r->sps_max_num_merge_cand_minus_max_num_gpm_cand;
146  }
147 
148  sps->log2_parallel_merge_level = r->sps_log2_parallel_merge_level_minus2 + 2;
149 }
150 
152 {
153  const H266RawSPS *r = sps->r;
154 
155  sps->ctb_log2_size_y = r->sps_log2_ctu_size_minus5 + 5;
156  sps->ctb_size_y = 1 << sps->ctb_log2_size_y;
157  sps->min_cb_log2_size_y = r->sps_log2_min_luma_coding_block_size_minus2 + 2;
158  sps->min_cb_size_y = 1 << sps->min_cb_log2_size_y;
159  sps->max_tb_size_y = 1 << (r->sps_max_luma_transform_size_64_flag ? 6 : 5);
160  sps->max_ts_size = 1 << (r->sps_log2_transform_skip_max_size_minus2 + 2);
161 }
162 
163 static void sps_ladf(VVCSPS* sps)
164 {
165  const H266RawSPS *r = sps->r;
166 
167  if (r->sps_ladf_enabled_flag) {
168  sps->num_ladf_intervals = r->sps_num_ladf_intervals_minus2 + 2;
169  sps->ladf_interval_lower_bound[0] = 0;
170  for (int i = 0; i < sps->num_ladf_intervals - 1; i++) {
171  sps->ladf_interval_lower_bound[i + 1] =
172  sps->ladf_interval_lower_bound[i] + r->sps_ladf_delta_threshold_minus1[i] + 1;
173  }
174  }
175 }
176 
177 static int sps_derive(VVCSPS *sps, void *log_ctx)
178 {
179  int ret;
180  const H266RawSPS *r = sps->r;
181 
182  ret = sps_bit_depth(sps, log_ctx);
183  if (ret < 0)
184  return ret;
185  sps_poc(sps);
186  sps_inter(sps);
188  sps_ladf(sps);
189  if (r->sps_chroma_format_idc != 0)
191 
192  return 0;
193 }
194 
195 static void sps_free(FFRefStructOpaque opaque, void *obj)
196 {
197  VVCSPS *sps = obj;
198  ff_refstruct_unref(&sps->r);
199 }
200 
201 static const VVCSPS *sps_alloc(const H266RawSPS *rsps, void *log_ctx)
202 {
203  int ret;
204  VVCSPS *sps = ff_refstruct_alloc_ext(sizeof(*sps), 0, NULL, sps_free);
205 
206  if (!sps)
207  return NULL;
208 
209  ff_refstruct_replace(&sps->r, rsps);
210 
211  ret = sps_derive(sps, log_ctx);
212  if (ret < 0)
213  goto fail;
214 
215  return sps;
216 
217 fail:
219  return NULL;
220 }
221 
222 static int decode_sps(VVCParamSets *ps, const H266RawSPS *rsps, void *log_ctx)
223 {
224  const int sps_id = rsps->sps_seq_parameter_set_id;
225  const VVCSPS *old_sps = ps->sps_list[sps_id];
226  const VVCSPS *sps;
227 
228  if (old_sps && old_sps->r == rsps)
229  return 0;
230 
231  sps = sps_alloc(rsps, log_ctx);
232  if (!sps)
233  return AVERROR(ENOMEM);
234 
235  ff_refstruct_unref(&ps->sps_list[sps_id]);
236  ps->sps_list[sps_id] = sps;
237 
238  return 0;
239 }
240 
242 {
243  pps->chroma_qp_offset[CB - 1] = pps->r->pps_cb_qp_offset;
244  pps->chroma_qp_offset[CR - 1] = pps->r->pps_cr_qp_offset;
245  pps->chroma_qp_offset[JCBCR - 1]= pps->r->pps_joint_cbcr_qp_offset_value;
246  for (int i = 0; i < 6; i++) {
247  pps->chroma_qp_offset_list[i][CB - 1] = pps->r->pps_cb_qp_offset_list[i];
248  pps->chroma_qp_offset_list[i][CR - 1] = pps->r->pps_cr_qp_offset_list[i];
249  pps->chroma_qp_offset_list[i][JCBCR - 1]= pps->r->pps_joint_cbcr_qp_offset_list[i];
250  }
251 }
252 
253 static void pps_width_height(VVCPPS *pps, const VVCSPS *sps)
254 {
255  const H266RawPPS *r = pps->r;
256 
257  pps->width = r->pps_pic_width_in_luma_samples;
258  pps->height = r->pps_pic_height_in_luma_samples;
259 
260  pps->ctb_width = AV_CEIL_RSHIFT(pps->width, sps->ctb_log2_size_y);
261  pps->ctb_height = AV_CEIL_RSHIFT(pps->height, sps->ctb_log2_size_y);
262  pps->ctb_count = pps->ctb_width * pps->ctb_height;
263 
264  pps->min_cb_width = pps->width >> sps->min_cb_log2_size_y;
265  pps->min_cb_height = pps->height >> sps->min_cb_log2_size_y;
266 
267  pps->min_pu_width = pps->width >> MIN_PU_LOG2;
268  pps->min_pu_height = pps->height >> MIN_PU_LOG2;
269  pps->min_tu_width = pps->width >> MIN_TU_LOG2;
270  pps->min_tu_height = pps->height >> MIN_TU_LOG2;
271 
272  pps->width32 = AV_CEIL_RSHIFT(pps->width, 5);
273  pps->height32 = AV_CEIL_RSHIFT(pps->height, 5);
274  pps->width64 = AV_CEIL_RSHIFT(pps->width, 6);
275  pps->height64 = AV_CEIL_RSHIFT(pps->height, 6);
276 }
277 
278 static int pps_bd(VVCPPS *pps)
279 {
280  const H266RawPPS *r = pps->r;
281 
282  pps->col_bd = av_calloc(r->num_tile_columns + 1, sizeof(*pps->col_bd));
283  pps->row_bd = av_calloc(r->num_tile_rows + 1, sizeof(*pps->row_bd));
284  pps->ctb_to_col_bd = av_calloc(pps->ctb_width + 1, sizeof(*pps->ctb_to_col_bd));
285  pps->ctb_to_row_bd = av_calloc(pps->ctb_height + 1, sizeof(*pps->ctb_to_col_bd));
286  if (!pps->col_bd || !pps->row_bd || !pps->ctb_to_col_bd || !pps->ctb_to_row_bd)
287  return AVERROR(ENOMEM);
288 
289  for (int i = 0, j = 0; i < r->num_tile_columns; i++) {
290  pps->col_bd[i] = j;
291  j += r->col_width_val[i];
292  for (int k = pps->col_bd[i]; k < j; k++)
293  pps->ctb_to_col_bd[k] = pps->col_bd[i];
294  }
295  pps->col_bd[r->num_tile_columns] = pps->ctb_to_col_bd[pps->ctb_width] = pps->ctb_width;
296 
297  for (int i = 0, j = 0; i < r->num_tile_rows; i++) {
298  pps->row_bd[i] = j;
299  j += r->row_height_val[i];
300  for (int k = pps->row_bd[i]; k < j; k++)
301  pps->ctb_to_row_bd[k] = pps->row_bd[i];
302  }
303  pps->row_bd[r->num_tile_rows] = pps->ctb_to_row_bd[pps->ctb_height] = pps->ctb_height;
304 
305  return 0;
306 }
307 
308 
309 static int next_tile_idx(int tile_idx, const int i, const H266RawPPS *r)
310 {
311  if (r->pps_tile_idx_delta_present_flag) {
312  tile_idx += r->pps_tile_idx_delta_val[i];
313  } else {
314  tile_idx += r->pps_slice_width_in_tiles_minus1[i] + 1;
315  if (tile_idx % r->num_tile_columns == 0)
316  tile_idx += (r->pps_slice_height_in_tiles_minus1[i]) * r->num_tile_columns;
317  }
318  return tile_idx;
319 }
320 
321 static void tile_xy(int *tile_x, int *tile_y, const int tile_idx, const VVCPPS *pps)
322 {
323  *tile_x = tile_idx % pps->r->num_tile_columns;
324  *tile_y = tile_idx / pps->r->num_tile_columns;
325 }
326 
327 static void ctu_xy(int *rx, int *ry, const int tile_x, const int tile_y, const VVCPPS *pps)
328 {
329  *rx = pps->col_bd[tile_x];
330  *ry = pps->row_bd[tile_y];
331 }
332 
333 static int ctu_rs(const int rx, const int ry, const VVCPPS *pps)
334 {
335  return pps->ctb_width * ry + rx;
336 }
337 
338 static int pps_add_ctus(VVCPPS *pps, int *off, const int rx, const int ry,
339  const int w, const int h)
340 {
341  int start = *off;
342  for (int y = 0; y < h; y++) {
343  for (int x = 0; x < w; x++) {
344  pps->ctb_addr_in_slice[*off] = ctu_rs(rx + x, ry + y, pps);
345  (*off)++;
346  }
347  }
348  return *off - start;
349 }
350 
351 static void pps_single_slice_picture(VVCPPS *pps, int *off)
352 {
353  for (int j = 0; j < pps->r->num_tile_rows; j++) {
354  for (int i = 0; i < pps->r->num_tile_columns; i++) {
355  pps->num_ctus_in_slice[0] = pps_add_ctus(pps, off,
356  pps->col_bd[i], pps->row_bd[j],
357  pps->r->col_width_val[i], pps->r->row_height_val[j]);
358  }
359  }
360 }
361 
362 static void subpic_tiles(int *tile_x, int *tile_y, int *tile_x_end, int *tile_y_end,
363  const VVCSPS *sps, const VVCPPS *pps, const int i)
364 {
365  const int rx = sps->r->sps_subpic_ctu_top_left_x[i];
366  const int ry = sps->r->sps_subpic_ctu_top_left_y[i];
367 
368  *tile_x = *tile_y = 0;
369 
370  while (pps->col_bd[*tile_x] != rx)
371  (*tile_x)++;
372 
373  while (pps->row_bd[*tile_y] != ry)
374  (*tile_y)++;
375 
376  *tile_x_end = (*tile_x);
377  *tile_y_end = (*tile_y);
378 
379  while (pps->col_bd[*tile_x_end] < rx + sps->r->sps_subpic_width_minus1[i] + 1)
380  (*tile_x_end)++;
381 
382  while (pps->row_bd[*tile_y_end] < ry + sps->r->sps_subpic_height_minus1[i] + 1)
383  (*tile_y_end)++;
384 }
385 
386 static void pps_subpic_less_than_one_tile_slice(VVCPPS *pps, const VVCSPS *sps, const int i, const int tx, const int ty, int *off)
387 {
388  pps->num_ctus_in_slice[i] = pps_add_ctus(pps, off,
389  pps->col_bd[tx], pps->row_bd[ty],
390  pps->r->col_width_val[tx], sps->r->sps_subpic_height_minus1[i] + 1);
391 }
392 
393 static void pps_subpic_one_or_more_tiles_slice(VVCPPS *pps, const int tile_x, const int tile_y, const int x_end, const int y_end, const int i, int *off)
394 {
395  for (int ty = tile_y; ty < y_end; ty++) {
396  for (int tx = tile_x; tx < x_end; tx++) {
397  pps->num_ctus_in_slice[i] += pps_add_ctus(pps, off,
398  pps->col_bd[tx], pps->row_bd[ty],
399  pps->r->col_width_val[tx], pps->r->row_height_val[ty]);
400  }
401  }
402 }
403 
404 static void pps_subpic_slice(VVCPPS *pps, const VVCSPS *sps, const int i, int *off)
405 {
406  int tx, ty, x_end, y_end;
407 
408  pps->slice_start_offset[i] = *off;
409  pps->num_ctus_in_slice[i] = 0;
410 
411  subpic_tiles(&tx, &ty, &x_end, &y_end, sps, pps, i);
412  if (ty + 1 == y_end && sps->r->sps_subpic_height_minus1[i] + 1 < pps->r->row_height_val[ty])
414  else
415  pps_subpic_one_or_more_tiles_slice(pps, tx, ty, x_end, y_end, i, off);
416 }
417 
418 static void pps_single_slice_per_subpic(VVCPPS *pps, const VVCSPS *sps, int *off)
419 {
420  if (!sps->r->sps_subpic_info_present_flag) {
422  } else {
423  for (int i = 0; i < pps->r->pps_num_slices_in_pic_minus1 + 1; i++)
424  pps_subpic_slice(pps, sps, i, off);
425  }
426 }
427 
428 static int pps_one_tile_slices(VVCPPS *pps, const int tile_idx, int i, int *off)
429 {
430  const H266RawPPS *r = pps->r;
431  int rx, ry, ctu_y_end, tile_x, tile_y;
432 
433  tile_xy(&tile_x, &tile_y, tile_idx, pps);
434  ctu_xy(&rx, &ry, tile_x, tile_y, pps);
435  ctu_y_end = ry + r->row_height_val[tile_y];
436  while (ry < ctu_y_end) {
437  pps->slice_start_offset[i] = *off;
438  pps->num_ctus_in_slice[i] = pps_add_ctus(pps, off, rx, ry,
439  r->col_width_val[tile_x], r->slice_height_in_ctus[i]);
440  ry += r->slice_height_in_ctus[i++];
441  }
442  i--;
443  return i;
444 }
445 
446 static void pps_multi_tiles_slice(VVCPPS *pps, const int tile_idx, const int i, int *off)
447 {
448  const H266RawPPS *r = pps->r;
449  int rx, ry, tile_x, tile_y;
450 
451  tile_xy(&tile_x, &tile_y, tile_idx, pps);
452  pps->slice_start_offset[i] = *off;
453  pps->num_ctus_in_slice[i] = 0;
454  for (int ty = tile_y; ty <= tile_y + r->pps_slice_height_in_tiles_minus1[i]; ty++) {
455  for (int tx = tile_x; tx <= tile_x + r->pps_slice_width_in_tiles_minus1[i]; tx++) {
456  ctu_xy(&rx, &ry, tx, ty, pps);
457  pps->num_ctus_in_slice[i] += pps_add_ctus(pps, off, rx, ry,
458  r->col_width_val[tx], r->row_height_val[ty]);
459  }
460  }
461 }
462 
463 static void pps_rect_slice(VVCPPS *pps, const VVCSPS *sps)
464 {
465  const H266RawPPS *r = pps->r;
466  int tile_idx = 0, off = 0;
467 
468  if (r->pps_single_slice_per_subpic_flag) {
470  return;
471  }
472 
473  for (int i = 0; i < r->pps_num_slices_in_pic_minus1 + 1; i++) {
474  if (!r->pps_slice_width_in_tiles_minus1[i] &&
475  !r->pps_slice_height_in_tiles_minus1[i]) {
476  i = pps_one_tile_slices(pps, tile_idx, i, &off);
477  } else {
478  pps_multi_tiles_slice(pps, tile_idx, i, &off);
479  }
480  tile_idx = next_tile_idx(tile_idx, i, r);
481  }
482 }
483 
485 {
486  const H266RawPPS* r = pps->r;
487  int rx, ry, off = 0;
488 
489  for (int tile_y = 0; tile_y < r->num_tile_rows; tile_y++) {
490  for (int tile_x = 0; tile_x < r->num_tile_columns; tile_x++) {
491  ctu_xy(&rx, &ry, tile_x, tile_y, pps);
492  pps_add_ctus(pps, &off, rx, ry, r->col_width_val[tile_x], r->row_height_val[tile_y]);
493  }
494  }
495 }
496 
497 static int pps_slice_map(VVCPPS *pps, const VVCSPS *sps)
498 {
499  pps->ctb_addr_in_slice = av_calloc(pps->ctb_count, sizeof(*pps->ctb_addr_in_slice));
500  if (!pps->ctb_addr_in_slice)
501  return AVERROR(ENOMEM);
502 
503  if (pps->r->pps_rect_slice_flag)
505  else
507 
508  return 0;
509 }
510 
512 {
513  const H266RawPPS *r = pps->r;
514 
515  if (r->pps_ref_wraparound_enabled_flag)
516  pps->ref_wraparound_offset = (pps->width / sps->min_cb_size_y) - r->pps_pic_width_minus_wraparound_offset;
517 }
518 
519 static void pps_subpic(VVCPPS *pps, const VVCSPS *sps)
520 {
521  const H266RawSPS *rsps = sps->r;
522  for (int i = 0; i < rsps->sps_num_subpics_minus1 + 1; i++) {
523  if (rsps->sps_subpic_treated_as_pic_flag[i]) {
524  pps->subpic_x[i] = rsps->sps_subpic_ctu_top_left_x[i] << sps->ctb_log2_size_y;
525  pps->subpic_y[i] = rsps->sps_subpic_ctu_top_left_y[i] << sps->ctb_log2_size_y;
526  pps->subpic_width[i] = FFMIN(pps->width - pps->subpic_x[i], (rsps->sps_subpic_width_minus1[i] + 1) << sps->ctb_log2_size_y);
527  pps->subpic_height[i] = FFMIN(pps->height - pps->subpic_y[i], (rsps->sps_subpic_height_minus1[i] + 1) << sps->ctb_log2_size_y);
528  } else {
529  pps->subpic_x[i] = 0;
530  pps->subpic_y[i] = 0;
531  pps->subpic_width[i] = pps->width;
532  pps->subpic_height[i] = pps->height;
533  }
534  }
535 }
536 
537 static int pps_derive(VVCPPS *pps, const VVCSPS *sps)
538 {
539  int ret;
540 
543 
544  ret = pps_bd(pps);
545  if (ret < 0)
546  return ret;
547 
548  ret = pps_slice_map(pps, sps);
549  if (ret < 0)
550  return ret;
551 
553  pps_subpic(pps, sps);
554 
555  return 0;
556 }
557 
558 static void pps_free(FFRefStructOpaque opaque, void *obj)
559 {
560  VVCPPS *pps = obj;
561 
562  ff_refstruct_unref(&pps->r);
563 
564  av_freep(&pps->col_bd);
565  av_freep(&pps->row_bd);
566  av_freep(&pps->ctb_to_col_bd);
567  av_freep(&pps->ctb_to_row_bd);
568  av_freep(&pps->ctb_addr_in_slice);
569 }
570 
571 static const VVCPPS *pps_alloc(const H266RawPPS *rpps, const VVCSPS *sps)
572 {
573  int ret;
574  VVCPPS *pps = ff_refstruct_alloc_ext(sizeof(*pps), 0, NULL, pps_free);
575 
576  if (!pps)
577  return NULL;
578 
579  ff_refstruct_replace(&pps->r, rpps);
580 
581  ret = pps_derive(pps, sps);
582  if (ret < 0)
583  goto fail;
584 
585  return pps;
586 
587 fail:
589  return NULL;
590 }
591 
592 static int decode_pps(VVCParamSets *ps, const H266RawPPS *rpps)
593 {
594  int ret = 0;
595  const int pps_id = rpps->pps_pic_parameter_set_id;
596  const int sps_id = rpps->pps_seq_parameter_set_id;
597  const VVCPPS *old_pps = ps->pps_list[pps_id];
598  const VVCPPS *pps;
599 
600  if (old_pps && old_pps->r == rpps)
601  return 0;
602 
603  pps = pps_alloc(rpps, ps->sps_list[sps_id]);
604  if (!pps)
605  return AVERROR(ENOMEM);
606 
607  ff_refstruct_unref(&ps->pps_list[pps_id]);
608  ps->pps_list[pps_id] = pps;
609 
610  return ret;
611 }
612 
613 static int decode_ps(VVCParamSets *ps, const CodedBitstreamH266Context *h266, void *log_ctx)
614 {
615  const H266RawPictureHeader *ph = h266->ph;
616  const H266RawPPS *rpps;
617  const H266RawSPS *rsps;
618  int ret;
619 
620  if (!ph)
621  return AVERROR_INVALIDDATA;
622 
623  rpps = h266->pps[ph->ph_pic_parameter_set_id];
624  if (!rpps)
625  return AVERROR_INVALIDDATA;
626 
627  rsps = h266->sps[rpps->pps_seq_parameter_set_id];
628  if (!rsps)
629  return AVERROR_INVALIDDATA;
630 
631  ret = decode_sps(ps, rsps, log_ctx);
632  if (ret < 0)
633  return ret;
634 
635  ret = decode_pps(ps, rpps);
636  if (ret < 0)
637  return ret;
638 
639  return 0;
640 }
641 
642 #define WEIGHT_TABLE(x) \
643  w->nb_weights[L##x] = r->num_weights_l##x; \
644  for (int i = 0; i < w->nb_weights[L##x]; i++) { \
645  w->weight_flag[L##x][LUMA][i] = r->luma_weight_l##x##_flag[i]; \
646  w->weight_flag[L##x][CHROMA][i] = r->chroma_weight_l##x##_flag[i]; \
647  w->weight[L##x][LUMA][i] = denom[LUMA] + r->delta_luma_weight_l##x[i]; \
648  w->offset[L##x][LUMA][i] = r->luma_offset_l##x[i]; \
649  for (int j = CB; j <= CR; j++) { \
650  w->weight[L##x][j][i] = denom[CHROMA] + r->delta_chroma_weight_l##x[i][j - 1]; \
651  w->offset[L##x][j][i] = 128 + r->delta_chroma_offset_l##x[i][j - 1]; \
652  w->offset[L##x][j][i] -= (128 * w->weight[L##x][j][i]) >> w->log2_denom[CHROMA]; \
653  w->offset[L##x][j][i] = av_clip_intp2(w->offset[L##x][j][i], 7); \
654  } \
655  } \
656 
658 {
659  int denom[2];
660 
661  w->log2_denom[LUMA] = r->luma_log2_weight_denom;
662  w->log2_denom[CHROMA] = w->log2_denom[LUMA] + r->delta_chroma_log2_weight_denom;
663  denom[LUMA] = 1 << w->log2_denom[LUMA];
664  denom[CHROMA] = 1 << w->log2_denom[CHROMA];
665  WEIGHT_TABLE(0)
666  WEIGHT_TABLE(1)
667 }
668 
669 // 8.3.1 Decoding process for picture order count
670 static int ph_compute_poc(const H266RawPictureHeader *ph, const H266RawSPS *sps, const int poc_tid0, const int is_clvss)
671 {
672  const int max_poc_lsb = 1 << (sps->sps_log2_max_pic_order_cnt_lsb_minus4 + 4);
673  const int prev_poc_lsb = poc_tid0 % max_poc_lsb;
674  const int prev_poc_msb = poc_tid0 - prev_poc_lsb;
675  const int poc_lsb = ph->ph_pic_order_cnt_lsb;
676  int poc_msb;
677 
678  if (ph->ph_poc_msb_cycle_present_flag) {
679  poc_msb = ph->ph_poc_msb_cycle_val * max_poc_lsb;
680  } else if (is_clvss) {
681  poc_msb = 0;
682  } else {
683  if (poc_lsb < prev_poc_lsb && prev_poc_lsb - poc_lsb >= max_poc_lsb / 2)
684  poc_msb = prev_poc_msb + max_poc_lsb;
685  else if (poc_lsb > prev_poc_lsb && poc_lsb - prev_poc_lsb > max_poc_lsb / 2)
686  poc_msb = prev_poc_msb - max_poc_lsb;
687  else
688  poc_msb = prev_poc_msb;
689  }
690 
691  return poc_msb + poc_lsb;
692 }
693 
695  uint16_t *pivot1, uint16_t *pivot2, uint16_t *scale_coeff, const int idx, const int max)
696 {
697  const int lut_sample =
698  pivot1[idx] + ((scale_coeff[idx] * (sample - pivot2[idx]) + (1<< 10)) >> 11);
699  return av_clip(lut_sample, 0, max - 1);
700 }
701 
702 //8.8.2.2 Inverse mapping process for a luma sample
703 static int lmcs_derive_lut(VVCLMCS *lmcs, const H266RawAPS *rlmcs, const H266RawSPS *sps)
704 {
705  const int bit_depth = (sps->sps_bitdepth_minus8 + 8);
706  const int max = (1 << bit_depth);
707  const int org_cw = max / LMCS_MAX_BIN_SIZE;
708  const int shift = av_log2(org_cw);
709  const int off = 1 << (shift - 1);
710  int cw[LMCS_MAX_BIN_SIZE];
711  uint16_t input_pivot[LMCS_MAX_BIN_SIZE];
712  uint16_t scale_coeff[LMCS_MAX_BIN_SIZE];
713  uint16_t inv_scale_coeff[LMCS_MAX_BIN_SIZE];
714  int i, delta_crs;
716  return AVERROR_PATCHWELCOME;
717 
718  if (!rlmcs)
719  return AVERROR_INVALIDDATA;
720 
721  lmcs->min_bin_idx = rlmcs->lmcs_min_bin_idx;
722  lmcs->max_bin_idx = LMCS_MAX_BIN_SIZE - 1 - rlmcs->lmcs_min_bin_idx;
723 
724  memset(cw, 0, sizeof(cw));
725  for (int i = lmcs->min_bin_idx; i <= lmcs->max_bin_idx; i++)
726  cw[i] = org_cw + (1 - 2 * rlmcs->lmcs_delta_sign_cw_flag[i]) * rlmcs->lmcs_delta_abs_cw[i];
727 
728  delta_crs = (1 - 2 * rlmcs->lmcs_delta_sign_crs_flag) * rlmcs->lmcs_delta_abs_crs;
729 
730  lmcs->pivot[0] = 0;
731  for (i = 0; i < LMCS_MAX_BIN_SIZE; i++) {
732  input_pivot[i] = i * org_cw;
733  lmcs->pivot[i + 1] = lmcs->pivot[i] + cw[i];
734  scale_coeff[i] = (cw[i] * (1 << 11) + off) >> shift;
735  if (cw[i] == 0) {
736  inv_scale_coeff[i] = 0;
737  lmcs->chroma_scale_coeff[i] = (1 << 11);
738  } else {
739  inv_scale_coeff[i] = org_cw * (1 << 11) / cw[i];
740  lmcs->chroma_scale_coeff[i] = org_cw * (1 << 11) / (cw[i] + delta_crs);
741  }
742  }
743 
744  //derive lmcs_fwd_lut
745  for (uint16_t sample = 0; sample < max; sample++) {
746  const int idx_y = sample / org_cw;
747  const uint16_t fwd_sample = lmcs_derive_lut_sample(sample, lmcs->pivot,
748  input_pivot, scale_coeff, idx_y, max);
749  if (bit_depth > 8)
750  lmcs->fwd_lut.u16[sample] = fwd_sample;
751  else
752  lmcs->fwd_lut.u8 [sample] = fwd_sample;
753 
754  }
755 
756  //derive lmcs_inv_lut
757  i = lmcs->min_bin_idx;
758  for (uint16_t sample = 0; sample < max; sample++) {
759  uint16_t inv_sample;
760  while (i <= lmcs->max_bin_idx && sample >= lmcs->pivot[i + 1])
761  i++;
762 
763  inv_sample = lmcs_derive_lut_sample(sample, input_pivot, lmcs->pivot,
764  inv_scale_coeff, i, max);
765 
766  if (bit_depth > 8)
767  lmcs->inv_lut.u16[sample] = inv_sample;
768  else
769  lmcs->inv_lut.u8 [sample] = inv_sample;
770  }
771 
772  return 0;
773 }
774 
776 {
777  if (sps->sps_affine_enabled_flag)
778  return 5 - sps->sps_five_minus_max_num_subblock_merge_cand;
779  return sps->sps_sbtmvp_enabled_flag && ph->ph_temporal_mvp_enabled_flag;
780 }
781 
782 static int ph_derive(VVCPH *ph, const H266RawSPS *sps, const H266RawPPS *pps, const int poc_tid0, const int is_clvss)
783 {
784  ph->max_num_subblock_merge_cand = ph_max_num_subblock_merge_cand(sps, ph->r);
785 
786  ph->poc = ph_compute_poc(ph->r, sps, poc_tid0, is_clvss);
787 
788  if (pps->pps_wp_info_in_ph_flag)
789  pred_weight_table(&ph->pwt, &ph->r->ph_pred_weight_table);
790 
791  return 0;
792 }
793 
794 static int decode_ph(VVCFrameParamSets *fps, const H266RawPictureHeader *rph, void *rph_ref,
795  const int poc_tid0, const int is_clvss)
796 {
797  int ret;
798  VVCPH *ph = &fps->ph;
799  const H266RawSPS *sps = fps->sps->r;
800  const H266RawPPS *pps = fps->pps->r;
801 
802  ph->r = rph;
803  ff_refstruct_replace(&ph->rref, rph_ref);
804  ret = ph_derive(ph, sps, pps, poc_tid0, is_clvss);
805  if (ret < 0)
806  return ret;
807 
808  return 0;
809 }
810 
811 static int decode_frame_ps(VVCFrameParamSets *fps, const VVCParamSets *ps,
812  const CodedBitstreamH266Context *h266, const int poc_tid0, const int is_clvss)
813 {
814  const H266RawPictureHeader *ph = h266->ph;
815  const H266RawPPS *rpps;
816  int ret;
817 
818  if (!ph)
819  return AVERROR_INVALIDDATA;
820 
821  rpps = h266->pps[ph->ph_pic_parameter_set_id];
822  if (!rpps)
823  return AVERROR_INVALIDDATA;
824 
827 
828  ret = decode_ph(fps, ph, h266->ph_ref, poc_tid0, is_clvss);
829  if (ret < 0)
830  return ret;
831 
832  if (ph->ph_explicit_scaling_list_enabled_flag)
833  ff_refstruct_replace(&fps->sl, ps->scaling_list[ph->ph_scaling_list_aps_id]);
834 
835  if (ph->ph_lmcs_enabled_flag) {
836  ret = lmcs_derive_lut(&fps->lmcs, ps->lmcs_list[ph->ph_lmcs_aps_id], fps->sps->r);
837  if (ret < 0)
838  return ret;
839  }
840 
841  for (int i = 0; i < FF_ARRAY_ELEMS(fps->alf_list); i++)
842  ff_refstruct_replace(&fps->alf_list[i], ps->alf_list[i]);
843 
844  return 0;
845 }
846 
848 {
849  if (IS_IDR(s))
850  s->no_output_before_recovery_flag = 1;
851  else if (IS_CRA(s) || IS_GDR(s))
852  s->no_output_before_recovery_flag = s->last_eos;
853 }
854 
855 static void decode_recovery_poc(VVCContext *s, const VVCPH *ph)
856 {
857  if (s->no_output_before_recovery_flag) {
858  if (IS_GDR(s))
859  s->gdr_recovery_point_poc = ph->poc + ph->r->ph_recovery_poc_cnt;
860  if (!GDR_IS_RECOVERED(s) && s->gdr_recovery_point_poc <= ph->poc)
862  }
863 }
864 
866 {
867  int ret = 0;
868  VVCParamSets *ps = &s->ps;
869  const CodedBitstreamH266Context *h266 = s->cbc->priv_data;
870 
871  ret = decode_ps(ps, h266, s->avctx);
872  if (ret < 0)
873  return ret;
874 
876  ret = decode_frame_ps(fps, ps, h266, s->poc_tid0, IS_CLVSS(s));
877  decode_recovery_poc(s, &fps->ph);
878  return ret;
879 }
880 
882 {
883  ff_refstruct_unref(&fps->sps);
884  ff_refstruct_unref(&fps->pps);
885  ff_refstruct_unref(&fps->ph.rref);
886  ff_refstruct_unref(&fps->sl);
887  for (int i = 0; i < FF_ARRAY_ELEMS(fps->alf_list); i++)
888  ff_refstruct_unref(&fps->alf_list[i]);
889 }
890 
892 {
893  for (int i = 0; i < FF_ARRAY_ELEMS(ps->scaling_list); i++)
895  for (int i = 0; i < FF_ARRAY_ELEMS(ps->lmcs_list); i++)
897  for (int i = 0; i < FF_ARRAY_ELEMS(ps->alf_list); i++)
899  for (int i = 0; i < FF_ARRAY_ELEMS(ps->sps_list); i++)
901  for (int i = 0; i < FF_ARRAY_ELEMS(ps->pps_list); i++)
903 }
904 
905 static void alf_coeff(int16_t *coeff,
906  const uint8_t *abs, const uint8_t *sign, const int size)
907 {
908  for (int i = 0; i < size; i++)
909  coeff[i] = (1 - 2 * sign[i]) * abs[i];
910 }
911 
912 static void alf_coeff_cc(int16_t *coeff,
913  const uint8_t *mapped_abs, const uint8_t *sign)
914 {
915  for (int i = 0; i < ALF_NUM_COEFF_CC; i++) {
916  int c = mapped_abs[i];
917  if (c)
918  c = (1 - 2 * sign[i]) * (1 << (c - 1));
919  coeff[i] = c;
920  }
921 }
922 
923 static void alf_luma(VVCALF *alf, const H266RawAPS *aps)
924 {
925  if (!aps->alf_luma_filter_signal_flag)
926  return;
927 
928  for (int i = 0; i < ALF_NUM_FILTERS_LUMA; i++) {
929  const int ref = aps->alf_luma_coeff_delta_idx[i];
930  const uint8_t *abs = aps->alf_luma_coeff_abs[ref];
931  const uint8_t *sign = aps->alf_luma_coeff_sign[ref];
932 
934  memcpy(alf->luma_clip_idx[i], aps->alf_luma_clip_idx[ref],
935  sizeof(alf->luma_clip_idx[i]));
936  }
937 }
938 
939 static void alf_chroma(VVCALF *alf, const H266RawAPS *aps)
940 {
941  if (!aps->alf_chroma_filter_signal_flag)
942  return;
943 
944  alf->num_chroma_filters = aps->alf_chroma_num_alt_filters_minus1 + 1;
945  for (int i = 0; i < alf->num_chroma_filters; i++) {
946  const uint8_t *abs = aps->alf_chroma_coeff_abs[i];
947  const uint8_t *sign = aps->alf_chroma_coeff_sign[i];
948 
950  memcpy(alf->chroma_clip_idx[i], aps->alf_chroma_clip_idx[i],
951  sizeof(alf->chroma_clip_idx[i]));
952  }
953 }
954 
955 static void alf_cc(VVCALF *alf, const H266RawAPS *aps)
956 {
957  const uint8_t (*abs[])[ALF_NUM_COEFF_CC] =
958  { aps->alf_cc_cb_mapped_coeff_abs, aps->alf_cc_cr_mapped_coeff_abs };
959  const uint8_t (*sign[])[ALF_NUM_COEFF_CC] =
960  {aps->alf_cc_cb_coeff_sign, aps->alf_cc_cr_coeff_sign };
961  const int signaled[] = { aps->alf_cc_cb_filter_signal_flag, aps->alf_cc_cr_filter_signal_flag};
962 
963  alf->num_cc_filters[0] = aps->alf_cc_cb_filters_signalled_minus1 + 1;
964  alf->num_cc_filters[1] = aps->alf_cc_cr_filters_signalled_minus1 + 1;
965 
966  for (int idx = 0; idx < 2; idx++) {
967  if (signaled[idx]) {
968  for (int i = 0; i < alf->num_cc_filters[idx]; i++)
969  alf_coeff_cc(alf->cc_coeff[idx][i], abs[idx][i], sign[idx][i]);
970  }
971  }
972 }
973 
974 static void alf_derive(VVCALF *alf, const H266RawAPS *aps)
975 {
976  alf_luma(alf, aps);
977  alf_chroma(alf, aps);
978  alf_cc(alf, aps);
979 }
980 
981 static int aps_decode_alf(const VVCALF **alf, const H266RawAPS *aps)
982 {
983  VVCALF *a = ff_refstruct_allocz(sizeof(*a));
984  if (!a)
985  return AVERROR(ENOMEM);
986 
987  alf_derive(a, aps);
988  ff_refstruct_replace(alf, a);
990 
991  return 0;
992 }
993 
994 static int is_luma_list(const int id)
995 {
996  return id % VVC_MAX_SAMPLE_ARRAYS == SL_START_4x4 || id == SL_START_64x64 + 1;
997 }
998 
999 static int derive_matrix_size(const int id)
1000 {
1001  return id < SL_START_4x4 ? 2 : (id < SL_START_8x8 ? 4 : 8);
1002 }
1003 
1004 // 7.4.3.20 Scaling list data semantics
1006 {
1007  for (int id = 0; id < SL_MAX_ID; id++) {
1008  const int matrix_size = derive_matrix_size(id);
1009  const int log2_size = av_log2(matrix_size);
1010  const int list_size = matrix_size * matrix_size;
1012  const uint8_t *pred;
1013  const int *scaling_list;
1014  int dc = 0;
1015 
1016  if (aps->aps_chroma_present_flag || is_luma_list(id)) {
1017  if (!aps->scaling_list_copy_mode_flag[id]) {
1018  int next_coef = 0;
1019 
1020  if (id >= SL_START_16x16)
1021  dc = next_coef = aps->scaling_list_dc_coef[id - SL_START_16x16];
1022 
1023  for (int i = 0; i < list_size; i++) {
1024  const int x = ff_vvc_diag_scan_x[3][3][i];
1025  const int y = ff_vvc_diag_scan_y[3][3][i];
1026 
1027  if (!(id >= SL_START_64x64 && x >= 4 && y >= 4))
1028  next_coef += aps->scaling_list_delta_coef[id][i];
1029  coeff[i] = next_coef;
1030  }
1031  }
1032  }
1033 
1034  //dc
1035  if (id >= SL_START_16x16) {
1036  if (!aps->scaling_list_copy_mode_flag[id] && !aps->scaling_list_pred_mode_flag[id]) {
1037  sl->scaling_matrix_dc_rec[id - SL_START_16x16] = 8;
1038  } else if (!aps->scaling_list_pred_id_delta[id]) {
1039  sl->scaling_matrix_dc_rec[id - SL_START_16x16] = 16;
1040  } else {
1041  const int ref_id = id - aps->scaling_list_pred_id_delta[id];
1042  if (ref_id >= SL_START_16x16)
1043  dc += sl->scaling_matrix_dc_rec[ref_id - SL_START_16x16];
1044  else
1045  dc += sl->scaling_matrix_rec[ref_id][0];
1046  sl->scaling_matrix_dc_rec[id - SL_START_16x16] = dc & 255;
1047  }
1048  }
1049 
1050  //ac
1051  scaling_list = aps->scaling_list_copy_mode_flag[id] ? ff_vvc_scaling_list0 : coeff;
1052  if (!aps->scaling_list_copy_mode_flag[id] && !aps->scaling_list_pred_mode_flag[id])
1054  else if (!aps->scaling_list_pred_id_delta[id])
1056  else
1057  pred = sl->scaling_matrix_rec[id - aps->scaling_list_pred_id_delta[id]];
1058  for (int i = 0; i < list_size; i++) {
1059  const int x = ff_vvc_diag_scan_x[log2_size][log2_size][i];
1060  const int y = ff_vvc_diag_scan_y[log2_size][log2_size][i];
1061  const int off = y * matrix_size + x;
1062  sl->scaling_matrix_rec[id][off] = (pred[off] + scaling_list[i]) & 255;
1063  }
1064  }
1065 }
1066 
1067 static int aps_decode_scaling(const VVCScalingList **scaling, const H266RawAPS *aps)
1068 {
1069  VVCScalingList *sl = ff_refstruct_allocz(sizeof(*sl));
1070  if (!sl)
1071  return AVERROR(ENOMEM);
1072 
1073  scaling_derive(sl, aps);
1074  ff_refstruct_replace(scaling, sl);
1075  ff_refstruct_unref(&sl);
1076 
1077  return 0;
1078 }
1079 
1081 {
1082  const H266RawAPS *aps = unit->content_ref;
1083  int ret = 0;
1084 
1085  if (!aps)
1086  return AVERROR_INVALIDDATA;
1087 
1088  switch (aps->aps_params_type) {
1089  case VVC_ASP_TYPE_ALF:
1090  ret = aps_decode_alf(&ps->alf_list[aps->aps_adaptation_parameter_set_id], aps);
1091  break;
1092  case VVC_ASP_TYPE_LMCS:
1093  ff_refstruct_replace(&ps->lmcs_list[aps->aps_adaptation_parameter_set_id], aps);
1094  break;
1095  case VVC_ASP_TYPE_SCALING:
1096  ret = aps_decode_scaling(&ps->scaling_list[aps->aps_adaptation_parameter_set_id], aps);
1097  break;
1098  }
1099 
1100  return ret;
1101 }
1102 
1103 static int sh_alf_aps(const VVCSH *sh, const VVCFrameParamSets *fps)
1104 {
1105  if (!sh->r->sh_alf_enabled_flag)
1106  return 0;
1107 
1108  for (int i = 0; i < sh->r->sh_num_alf_aps_ids_luma; i++) {
1109  const VVCALF *alf_aps_luma = fps->alf_list[sh->r->sh_alf_aps_id_luma[i]];
1110  if (!alf_aps_luma)
1111  return AVERROR_INVALIDDATA;
1112  }
1113 
1114  if (sh->r->sh_alf_cb_enabled_flag || sh->r->sh_alf_cr_enabled_flag) {
1115  const VVCALF *alf_aps_chroma = fps->alf_list[sh->r->sh_alf_aps_id_chroma];
1116  if (!alf_aps_chroma)
1117  return AVERROR_INVALIDDATA;
1118  }
1119 
1120  if (fps->sps->r->sps_ccalf_enabled_flag) {
1121  if (sh->r->sh_alf_cc_cb_enabled_flag) {
1122  const VVCALF *alf_aps_cc_cr = fps->alf_list[sh->r->sh_alf_cc_cb_aps_id];
1123  if (!alf_aps_cc_cr)
1124  return AVERROR_INVALIDDATA;
1125  }
1126  if (sh->r->sh_alf_cc_cr_enabled_flag) {
1127  const VVCALF *alf_aps_cc_cr = fps->alf_list[sh->r->sh_alf_cc_cr_aps_id];
1128  if (!alf_aps_cc_cr)
1129  return AVERROR_INVALIDDATA;
1130  }
1131  }
1132 
1133  return 0;
1134 }
1135 
1136 static void sh_slice_address(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps)
1137 {
1138  const int slice_address = sh->r->sh_slice_address;
1139 
1140  if (pps->r->pps_rect_slice_flag) {
1141  int pic_level_slice_idx = slice_address;
1142  for (int j = 0; j < sh->r->curr_subpic_idx; j++)
1143  pic_level_slice_idx += pps->r->num_slices_in_subpic[j];
1144  sh->ctb_addr_in_curr_slice = pps->ctb_addr_in_slice + pps->slice_start_offset[pic_level_slice_idx];
1145  sh->num_ctus_in_curr_slice = pps->num_ctus_in_slice[pic_level_slice_idx];
1146  } else {
1147  int tile_x = slice_address % pps->r->num_tile_columns;
1148  int tile_y = slice_address / pps->r->num_tile_columns;
1149  const int slice_start_ctb = pps->row_bd[tile_y] * pps->ctb_width + pps->col_bd[tile_x] * pps->r->row_height_val[tile_y];
1150 
1151  sh->ctb_addr_in_curr_slice = pps->ctb_addr_in_slice + slice_start_ctb;
1152 
1153  sh->num_ctus_in_curr_slice = 0;
1154  for (int tile_idx = slice_address; tile_idx <= slice_address + sh->r->sh_num_tiles_in_slice_minus1; tile_idx++) {
1155  tile_x = tile_idx % pps->r->num_tile_columns;
1156  tile_y = tile_idx / pps->r->num_tile_columns;
1157  sh->num_ctus_in_curr_slice += pps->r->row_height_val[tile_y] * pps->r->col_width_val[tile_x];
1158  }
1159  }
1160 }
1161 
1162 static void sh_qp_y(VVCSH *sh, const H266RawPPS *pps, const H266RawPictureHeader *ph)
1163 {
1164  const int init_qp = pps->pps_init_qp_minus26 + 26;
1165 
1166  if (!pps->pps_qp_delta_info_in_ph_flag)
1167  sh->slice_qp_y = init_qp + sh->r->sh_qp_delta;
1168  else
1169  sh->slice_qp_y = init_qp + ph->ph_qp_delta;
1170 }
1171 
1172 static void sh_inter(VVCSH *sh, const H266RawSPS *sps, const H266RawPPS *pps)
1173 {
1174  const H266RawSliceHeader *rsh = sh->r;
1175 
1176  if (!pps->pps_wp_info_in_ph_flag &&
1177  ((pps->pps_weighted_pred_flag && IS_P(rsh)) ||
1178  (pps->pps_weighted_bipred_flag && IS_B(rsh))))
1180 }
1181 
1182 static void sh_deblock_offsets(VVCSH *sh)
1183 {
1184  const H266RawSliceHeader *r = sh->r;
1185 
1186  if (!r->sh_deblocking_filter_disabled_flag) {
1187  sh->deblock.beta_offset[LUMA] = r->sh_luma_beta_offset_div2 << 1;
1188  sh->deblock.tc_offset[LUMA] = r->sh_luma_tc_offset_div2 << 1;
1189  sh->deblock.beta_offset[CB] = r->sh_cb_beta_offset_div2 << 1;
1190  sh->deblock.tc_offset[CB] = r->sh_cb_tc_offset_div2 << 1;
1191  sh->deblock.beta_offset[CR] = r->sh_cr_beta_offset_div2 << 1;
1192  sh->deblock.tc_offset[CR] = r->sh_cr_tc_offset_div2 << 1;
1193  }
1194 }
1195 
1197 {
1198  const int min_cb_log2_size_y = sps->sps_log2_min_luma_coding_block_size_minus2 + 2;
1199  int min_qt_log2_size_y[2];
1200 
1201  if (IS_I(sh->r)) {
1202  min_qt_log2_size_y[LUMA] = (min_cb_log2_size_y + ph->ph_log2_diff_min_qt_min_cb_intra_slice_luma);
1203  min_qt_log2_size_y[CHROMA] = (min_cb_log2_size_y + ph->ph_log2_diff_min_qt_min_cb_intra_slice_chroma);
1204 
1205  sh->max_bt_size[LUMA] = 1 << (min_qt_log2_size_y[LUMA] + ph->ph_log2_diff_max_bt_min_qt_intra_slice_luma);
1206  sh->max_bt_size[CHROMA] = 1 << (min_qt_log2_size_y[CHROMA]+ ph->ph_log2_diff_max_bt_min_qt_intra_slice_chroma);
1207 
1208  sh->max_tt_size[LUMA] = 1 << (min_qt_log2_size_y[LUMA] + ph->ph_log2_diff_max_tt_min_qt_intra_slice_luma);
1209  sh->max_tt_size[CHROMA] = 1 << (min_qt_log2_size_y[CHROMA]+ ph->ph_log2_diff_max_tt_min_qt_intra_slice_chroma);
1210 
1211  sh->max_mtt_depth[LUMA] = ph->ph_max_mtt_hierarchy_depth_intra_slice_luma;
1212  sh->max_mtt_depth[CHROMA] = ph->ph_max_mtt_hierarchy_depth_intra_slice_chroma;
1213 
1214  sh->cu_qp_delta_subdiv = ph->ph_cu_qp_delta_subdiv_intra_slice;
1215  sh->cu_chroma_qp_offset_subdiv = ph->ph_cu_chroma_qp_offset_subdiv_intra_slice;
1216  } else {
1217  for (int i = LUMA; i <= CHROMA; i++) {
1218  min_qt_log2_size_y[i] = (min_cb_log2_size_y + ph->ph_log2_diff_min_qt_min_cb_inter_slice);
1219  sh->max_bt_size[i] = 1 << (min_qt_log2_size_y[i] + ph->ph_log2_diff_max_bt_min_qt_inter_slice);
1220  sh->max_tt_size[i] = 1 << (min_qt_log2_size_y[i] + ph->ph_log2_diff_max_tt_min_qt_inter_slice);
1221  sh->max_mtt_depth[i] = ph->ph_max_mtt_hierarchy_depth_inter_slice;
1222  }
1223 
1224  sh->cu_qp_delta_subdiv = ph->ph_cu_qp_delta_subdiv_inter_slice;
1225  sh->cu_chroma_qp_offset_subdiv = ph->ph_cu_chroma_qp_offset_subdiv_inter_slice;
1226  }
1227 
1228  sh->min_qt_size[LUMA] = 1 << min_qt_log2_size_y[LUMA];
1229  sh->min_qt_size[CHROMA] = 1 << min_qt_log2_size_y[CHROMA];
1230 }
1231 
1232 static void sh_entry_points(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps)
1233 {
1234  if (sps->sps_entry_point_offsets_present_flag) {
1235  for (int i = 1, j = 0; i < sh->num_ctus_in_curr_slice; i++) {
1236  const int pre_ctb_addr_x = sh->ctb_addr_in_curr_slice[i - 1] % pps->ctb_width;
1237  const int pre_ctb_addr_y = sh->ctb_addr_in_curr_slice[i - 1] / pps->ctb_width;
1238  const int ctb_addr_x = sh->ctb_addr_in_curr_slice[i] % pps->ctb_width;
1239  const int ctb_addr_y = sh->ctb_addr_in_curr_slice[i] / pps->ctb_width;
1240  if (pps->ctb_to_row_bd[ctb_addr_y] != pps->ctb_to_row_bd[pre_ctb_addr_y] ||
1241  pps->ctb_to_col_bd[ctb_addr_x] != pps->ctb_to_col_bd[pre_ctb_addr_x] ||
1242  (ctb_addr_y != pre_ctb_addr_y && sps->sps_entropy_coding_sync_enabled_flag)) {
1243  sh->entry_point_start_ctu[j++] = i;
1244  }
1245  }
1246  }
1247 }
1248 
1249 static int sh_derive(VVCSH *sh, const VVCFrameParamSets *fps)
1250 {
1251  const H266RawSPS *sps = fps->sps->r;
1252  const H266RawPPS *pps = fps->pps->r;
1253  const H266RawPictureHeader *ph = fps->ph.r;
1254  int ret;
1255 
1256  sh_slice_address(sh, sps, fps->pps);
1257  ret = sh_alf_aps(sh, fps);
1258  if (ret < 0)
1259  return ret;
1260  sh_inter(sh, sps, pps);
1261  sh_qp_y(sh, pps, ph);
1262  sh_deblock_offsets(sh);
1264  sh_entry_points(sh, sps, fps->pps);
1265 
1266  return 0;
1267 }
1268 
1270 {
1271  int ret;
1272 
1273  if (!fps->sps || !fps->pps)
1274  return AVERROR_INVALIDDATA;
1275 
1276  ff_refstruct_replace(&sh->r, unit->content_ref);
1277 
1278  ret = sh_derive(sh, fps);
1279  if (ret < 0)
1280  return ret;
1281 
1282  return 0;
1283 }
CB
#define CB
Definition: hevc_filter.c:32
VVCSPS
Definition: vvc_ps.h:58
MIN_TU_LOG2
#define MIN_TU_LOG2
MinTbLog2SizeY.
Definition: vvcdec.h:39
ph_derive
static int ph_derive(VVCPH *ph, const H266RawSPS *sps, const H266RawPPS *pps, const int poc_tid0, const int is_clvss)
Definition: vvc_ps.c:782
H266RawSPS::sps_subpic_height_minus1
uint16_t sps_subpic_height_minus1[VVC_MAX_SLICES]
Definition: cbs_h266.h:338
pps_bd
static int pps_bd(VVCPPS *pps)
Definition: vvc_ps.c:278
aps_decode_scaling
static int aps_decode_scaling(const VVCScalingList **scaling, const H266RawAPS *aps)
Definition: vvc_ps.c:1067
pps_subpic
static void pps_subpic(VVCPPS *pps, const VVCSPS *sps)
Definition: vvc_ps.c:519
VVCSH::cu_qp_delta_subdiv
uint8_t cu_qp_delta_subdiv
CuQpDeltaSubdiv.
Definition: vvc_ps.h:251
H266RawSliceHeader::sh_alf_cc_cr_enabled_flag
uint8_t sh_alf_cc_cr_enabled_flag
Definition: cbs_h266.h:789
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:233
VVCPH
Definition: vvc_ps.h:147
ctu_rs
static int ctu_rs(const int rx, const int ry, const VVCPPS *pps)
Definition: vvc_ps.c:333
sps_alloc
static const VVCSPS * sps_alloc(const H266RawSPS *rsps, void *log_ctx)
Definition: vvc_ps.c:201
VVCPPS
Definition: vvc_ps.h:92
av_clip
#define av_clip
Definition: common.h:99
decode_frame_ps
static int decode_frame_ps(VVCFrameParamSets *fps, const VVCParamSets *ps, const CodedBitstreamH266Context *h266, const int poc_tid0, const int is_clvss)
Definition: vvc_ps.c:811
ctu_xy
static void ctu_xy(int *rx, int *ry, const int tile_x, const int tile_y, const VVCPPS *pps)
Definition: vvc_ps.c:327
VVCLMCS::min_bin_idx
uint8_t min_bin_idx
Definition: vvc_ps.h:195
cbs_h266.h
sh_qp_y
static void sh_qp_y(VVCSH *sh, const H266RawPPS *pps, const H266RawPictureHeader *ph)
Definition: vvc_ps.c:1162
r
const char * r
Definition: vf_curves.c:127
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
LMCS_MAX_BIT_DEPTH
#define LMCS_MAX_BIT_DEPTH
Definition: vvc_ps.h:46
IS_GDR
#define IS_GDR(s)
Definition: vvc_ps.h:32
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:255
VVCPPS::r
const H266RawPPS * r
RefStruct reference.
Definition: vvc_ps.h:93
pps_subpic_slice
static void pps_subpic_slice(VVCPPS *pps, const VVCSPS *sps, const int i, int *off)
Definition: vvc_ps.c:404
sh_partition_constraints
static void sh_partition_constraints(VVCSH *sh, const H266RawSPS *sps, const H266RawPictureHeader *ph)
Definition: vvc_ps.c:1196
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2962
VVCSH::cu_chroma_qp_offset_subdiv
uint8_t cu_chroma_qp_offset_subdiv
CuChromaQpOffsetSubdiv.
Definition: vvc_ps.h:252
subpic_tiles
static void subpic_tiles(int *tile_x, int *tile_y, int *tile_x_end, int *tile_y_end, const VVCSPS *sps, const VVCPPS *pps, const int i)
Definition: vvc_ps.c:362
ff_refstruct_alloc_ext
static void * ff_refstruct_alloc_ext(size_t size, unsigned flags, void *opaque, void(*free_cb)(FFRefStructOpaque opaque, void *obj))
A wrapper around ff_refstruct_alloc_ext_c() for the common case of a non-const qualified opaque.
Definition: refstruct.h:94
sps_map_pixel_format
static int sps_map_pixel_format(VVCSPS *sps, void *log_ctx)
Definition: vvc_ps.c:32
MIN_PU_LOG2
#define MIN_PU_LOG2
Definition: vvcdec.h:40
WEIGHT_TABLE
#define WEIGHT_TABLE(x)
Definition: vvc_ps.c:642
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3003
pixdesc.h
w
uint8_t w
Definition: llviddspenc.c:38
H266RawSPS::sps_subpic_ctu_top_left_y
uint16_t sps_subpic_ctu_top_left_y[VVC_MAX_SLICES]
Definition: cbs_h266.h:336
pps_subpic_less_than_one_tile_slice
static void pps_subpic_less_than_one_tile_slice(VVCPPS *pps, const VVCSPS *sps, const int i, const int tx, const int ty, int *off)
Definition: vvc_ps.c:386
VVCLMCS::max_bin_idx
uint8_t max_bin_idx
Definition: vvc_ps.h:196
H266RawAPS::lmcs_delta_abs_crs
uint8_t lmcs_delta_abs_crs
Definition: cbs_h266.h:637
H266RawSPS::sps_ccalf_enabled_flag
uint8_t sps_ccalf_enabled_flag
Definition: cbs_h266.h:404
H266RawSliceHeader::sh_qp_delta
int8_t sh_qp_delta
Definition: cbs_h266.h:805
pps_ref_wraparound_offset
static void pps_ref_wraparound_offset(VVCPPS *pps, const VVCSPS *sps)
Definition: vvc_ps.c:511
pps_multi_tiles_slice
static void pps_multi_tiles_slice(VVCPPS *pps, const int tile_idx, const int i, int *off)
Definition: vvc_ps.c:446
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:478
VVCSH::r
const H266RawSliceHeader * r
RefStruct reference.
Definition: vvc_ps.h:229
ff_vvc_decode_aps
int ff_vvc_decode_aps(VVCParamSets *ps, const CodedBitstreamUnit *unit)
Definition: vvc_ps.c:1080
max
#define max(a, b)
Definition: cuda_runtime.h:33
FFRefStructOpaque
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition: refstruct.h:58
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
H266RawPPS::pps_seq_parameter_set_id
uint8_t pps_seq_parameter_set_id
Definition: cbs_h266.h:500
VVCLMCS
Definition: vvc_ps.h:194
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
sps_partition_constraints
static void sps_partition_constraints(VVCSPS *sps)
Definition: vvc_ps.c:151
VVCALF::num_chroma_filters
uint8_t num_chroma_filters
Definition: vvc_ps.h:169
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:70
VVCLMCS::chroma_scale_coeff
uint16_t chroma_scale_coeff[LMCS_MAX_BIN_SIZE]
Definition: vvc_ps.h:204
CodedBitstreamH266Context::pps
H266RawPPS * pps[VVC_MAX_PPS_COUNT]
RefStruct references.
Definition: cbs_h266.h:874
H266RawSliceHeader::sh_alf_cc_cr_aps_id
uint8_t sh_alf_cc_cr_aps_id
Definition: cbs_h266.h:790
pps_chroma_qp_offset
static void pps_chroma_qp_offset(VVCPPS *pps)
Definition: vvc_ps.c:241
VVCFrameParamSets::sps
const VVCSPS * sps
RefStruct reference.
Definition: vvc_ps.h:220
alf_coeff
static void alf_coeff(int16_t *coeff, const uint8_t *abs, const uint8_t *sign, const int size)
Definition: vvc_ps.c:905
VVC_ASP_TYPE_ALF
@ VVC_ASP_TYPE_ALF
Definition: vvc.h:70
vvc_data.h
VVCFrameParamSets
Definition: vvc_ps.h:219
fail
#define fail()
Definition: checkasm.h:179
VVCSH::pwt
PredWeightTable pwt
Definition: vvc_ps.h:237
H266RawSPS::sps_subpic_width_minus1
uint16_t sps_subpic_width_minus1[VVC_MAX_SLICES]
Definition: cbs_h266.h:337
H266RawAPS
Definition: cbs_h266.h:598
VVCParamSets::pps_list
const VVCPPS * pps_list[VVC_MAX_PPS_COUNT]
RefStruct reference.
Definition: vvc_ps.h:213
scaling_derive
static void scaling_derive(VVCScalingList *sl, const H266RawAPS *aps)
Definition: vvc_ps.c:1005
VVCALF::cc_coeff
int16_t cc_coeff[2][ALF_NUM_FILTERS_CC][ALF_NUM_COEFF_CC]
Definition: vvc_ps.h:174
ph_compute_poc
static int ph_compute_poc(const H266RawPictureHeader *ph, const H266RawSPS *sps, const int poc_tid0, const int is_clvss)
Definition: vvc_ps.c:670
VVCFrameParamSets::sl
const VVCScalingList * sl
RefStruct reference.
Definition: vvc_ps.h:225
VVCALF
Definition: vvc_ps.h:165
sps_free
static void sps_free(FFRefStructOpaque opaque, void *obj)
Definition: vvc_ps.c:195
H266RawSliceHeader::sh_alf_enabled_flag
uint8_t sh_alf_enabled_flag
Definition: cbs_h266.h:781
refstruct.h
pps_alloc
static const VVCPPS * pps_alloc(const H266RawPPS *rpps, const VVCSPS *sps)
Definition: vvc_ps.c:571
VVCALF::chroma_clip_idx
uint8_t chroma_clip_idx[ALF_NUM_FILTERS_CHROMA][ALF_NUM_COEFF_CHROMA]
Definition: vvc_ps.h:171
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:481
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
H266RawAPS::lmcs_delta_abs_cw
uint16_t lmcs_delta_abs_cw[16]
Definition: cbs_h266.h:635
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
DBParams::beta_offset
int beta_offset
Definition: hevcdec.h:342
DBParams::tc_offset
int tc_offset
Definition: hevcdec.h:343
pps_no_rect_slice
static void pps_no_rect_slice(VVCPPS *pps)
Definition: vvc_ps.c:484
pps_one_tile_slices
static int pps_one_tile_slices(VVCPPS *pps, const int tile_idx, int i, int *off)
Definition: vvc_ps.c:428
H266RawSPS::sps_seq_parameter_set_id
uint8_t sps_seq_parameter_set_id
Definition: cbs_h266.h:311
s
#define s(width, name)
Definition: cbs_vp9.c:198
H266RawSliceHeader::sh_slice_address
uint16_t sh_slice_address
Definition: cbs_h266.h:775
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:59
SL_START_8x8
@ SL_START_8x8
Definition: vvc_ps.h:180
derive_matrix_size
static int derive_matrix_size(const int id)
Definition: vvc_ps.c:999
sh_inter
static void sh_inter(VVCSH *sh, const H266RawSPS *sps, const H266RawPPS *pps)
Definition: vvc_ps.c:1172
ff_vvc_diag_scan_y
const uint8_t ff_vvc_diag_scan_y[5][5][16 *16]
Definition: vvc_data.c:152
VVCFrameParamSets::lmcs
VVCLMCS lmcs
Definition: vvc_ps.h:224
lmcs_derive_lut_sample
static av_always_inline uint16_t lmcs_derive_lut_sample(uint16_t sample, uint16_t *pivot1, uint16_t *pivot2, uint16_t *scale_coeff, const int idx, const int max)
Definition: vvc_ps.c:694
VVCSH
Definition: vvc_ps.h:228
IS_IDR
#define IS_IDR(s)
Definition: hevcdec.h:75
PredWeightTable
Definition: vvc_ps.h:137
VVCFrameParamSets::ph
VVCPH ph
Definition: vvc_ps.h:222
vvcdec.h
ALF_NUM_COEFF_CHROMA
#define ALF_NUM_COEFF_CHROMA
Definition: vvc_ps.h:162
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
pps_width_height
static void pps_width_height(VVCPPS *pps, const VVCSPS *sps)
Definition: vvc_ps.c:253
VVCLMCS::inv_lut
union VVCLMCS::@226 inv_lut
VVCParamSets::sps_list
const VVCSPS * sps_list[VVC_MAX_SPS_COUNT]
RefStruct reference.
Definition: vvc_ps.h:212
ff_vvc_decode_frame_ps
int ff_vvc_decode_frame_ps(VVCFrameParamSets *fps, struct VVCContext *s)
Definition: vvc_ps.c:865
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:459
H266RawSPS
Definition: cbs_h266.h:308
H266RawPPS
Definition: cbs_h266.h:496
lmcs_derive_lut
static int lmcs_derive_lut(VVCLMCS *lmcs, const H266RawAPS *rlmcs, const H266RawSPS *sps)
Definition: vvc_ps.c:703
alf_derive
static void alf_derive(VVCALF *alf, const H266RawAPS *aps)
Definition: vvc_ps.c:974
aps
static int FUNC() aps(CodedBitstreamContext *ctx, RWContext *rw, H266RawAPS *current, int prefix)
Definition: cbs_h266_syntax_template.c:2461
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:1269
NULL
#define NULL
Definition: coverity.c:32
H266RawPictureHeader
Definition: cbs_h266.h:674
pps_derive
static int pps_derive(VVCPPS *pps, const VVCSPS *sps)
Definition: vvc_ps.c:537
ALF_NUM_COEFF_CC
#define ALF_NUM_COEFF_CC
Definition: vvc_ps.h:163
pred_weight_table
static void pred_weight_table(PredWeightTable *w, const H266RawPredWeightTable *r)
Definition: vvc_ps.c:657
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
H266RawPPS::pps_pic_parameter_set_id
uint8_t pps_pic_parameter_set_id
Definition: cbs_h266.h:499
H266RawSliceHeader::curr_subpic_idx
uint16_t curr_subpic_idx
CurrSubpicIdx.
Definition: cbs_h266.h:835
VVCFrameParamSets::alf_list
const VVCALF * alf_list[VVC_MAX_ALF_COUNT]
RefStruct reference.
Definition: vvc_ps.h:223
ff_vvc_frame_ps_free
void ff_vvc_frame_ps_free(VVCFrameParamSets *fps)
Definition: vvc_ps.c:881
pps_slice_map
static int pps_slice_map(VVCPPS *pps, const VVCSPS *sps)
Definition: vvc_ps.c:497
H266RawAPS::lmcs_delta_sign_cw_flag
uint8_t lmcs_delta_sign_cw_flag[16]
Definition: cbs_h266.h:636
sh_alf_aps
static int sh_alf_aps(const VVCSH *sh, const VVCFrameParamSets *fps)
Definition: vvc_ps.c:1103
H266RawPredWeightTable
Definition: cbs_h266.h:650
VVCSH::max_tt_size
uint8_t max_tt_size[2]
MaxTtSizeY, MaxTtSizeC.
Definition: vvc_ps.h:249
decode_ps
static int decode_ps(VVCParamSets *ps, const CodedBitstreamH266Context *h266, void *log_ctx)
Definition: vvc_ps.c:613
sps_ladf
static void sps_ladf(VVCSPS *sps)
Definition: vvc_ps.c:163
VVC_ASP_TYPE_LMCS
@ VVC_ASP_TYPE_LMCS
Definition: vvc.h:71
SL_MAX_MATRIX_SIZE
#define SL_MAX_MATRIX_SIZE
Definition: vvc_ps.h:187
ff_refstruct_allocz
static void * ff_refstruct_allocz(size_t size)
Equivalent to ff_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition: refstruct.h:105
VVCParamSets::scaling_list
const VVCScalingList * scaling_list[VVC_MAX_SL_COUNT]
RefStruct reference.
Definition: vvc_ps.h:216
H266RawSliceHeader::sh_num_tiles_in_slice_minus1
uint8_t sh_num_tiles_in_slice_minus1
Definition: cbs_h266.h:777
abs
#define abs(x)
Definition: cuda_runtime.h:35
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:479
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
ff_vvc_scaling_pred_8
const uint8_t ff_vvc_scaling_pred_8[8 *8]
Definition: vvc_data.c:277
aps_decode_alf
static int aps_decode_alf(const VVCALF **alf, const H266RawAPS *aps)
Definition: vvc_ps.c:981
VVCPH::r
const H266RawPictureHeader * r
Definition: vvc_ps.h:148
JCBCR
#define JCBCR
Definition: vvcdec.h:37
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
VVCALF::luma_coeff
int16_t luma_coeff[ALF_NUM_FILTERS_LUMA][ALF_NUM_COEFF_LUMA]
Definition: vvc_ps.h:166
ff_vvc_ps_uninit
void ff_vvc_ps_uninit(VVCParamSets *ps)
Definition: vvc_ps.c:891
VVCFrameParamSets::pps
const VVCPPS * pps
RefStruct reference.
Definition: vvc_ps.h:221
SL_START_64x64
@ SL_START_64x64
Definition: vvc_ps.h:183
decode_recovery_poc
static void decode_recovery_poc(VVCContext *s, const VVCPH *ph)
Definition: vvc_ps.c:855
VVCSH::max_mtt_depth
uint8_t max_mtt_depth[2]
MaxMttDepthY, MaxMttDepthC.
Definition: vvc_ps.h:250
VVCScalingList
Definition: vvc_ps.h:189
SL_START_16x16
@ SL_START_16x16
Definition: vvc_ps.h:181
H266RawSPS::sps_subpic_ctu_top_left_x
uint16_t sps_subpic_ctu_top_left_x[VVC_MAX_SLICES]
Definition: cbs_h266.h:335
dc
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
Definition: snow.txt:400
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
shift
static int shift(int a, int b)
Definition: bonk.c:261
alf_luma
static void alf_luma(VVCALF *alf, const H266RawAPS *aps)
Definition: vvc_ps.c:923
VVCLMCS::fwd_lut
union VVCLMCS::@226 fwd_lut
sh_slice_address
static void sh_slice_address(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps)
Definition: vvc_ps.c:1136
CodedBitstreamH266Context::ph
H266RawPictureHeader * ph
Definition: cbs_h266.h:875
ALF_NUM_COEFF_LUMA
#define ALF_NUM_COEFF_LUMA
Definition: vvc_ps.h:161
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:483
decode_sps
static int decode_sps(VVCParamSets *ps, const H266RawSPS *rsps, void *log_ctx)
Definition: vvc_ps.c:222
sample
#define sample
Definition: flacdsp_template.c:44
size
int size
Definition: twinvq_data.h:10344
sh_derive
static int sh_derive(VVCSH *sh, const VVCFrameParamSets *fps)
Definition: vvc_ps.c:1249
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:485
CR
#define CR
Definition: hevc_filter.c:33
decode_ph
static int decode_ph(VVCFrameParamSets *fps, const H266RawPictureHeader *rph, void *rph_ref, const int poc_tid0, const int is_clvss)
Definition: vvc_ps.c:794
H266RawAPS::lmcs_min_bin_idx
uint8_t lmcs_min_bin_idx
Definition: cbs_h266.h:632
pps_add_ctus
static int pps_add_ctus(VVCPPS *pps, int *off, const int rx, const int ry, const int w, const int h)
Definition: vvc_ps.c:338
is_luma_list
static int is_luma_list(const int id)
Definition: vvc_ps.c:994
H266RawSliceHeader::sh_alf_aps_id_chroma
uint8_t sh_alf_aps_id_chroma
Definition: cbs_h266.h:786
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
CodedBitstreamH266Context
Definition: cbs_h266.h:866
VVCSH::deblock
DBParams deblock
Definition: vvc_ps.h:244
VVCSH::ctb_addr_in_curr_slice
const uint32_t * ctb_addr_in_curr_slice
CtbAddrInCurrSlice.
Definition: vvc_ps.h:234
VVCScalingList::scaling_matrix_dc_rec
uint8_t scaling_matrix_dc_rec[SL_MAX_ID - SL_START_16x16]
ScalingMatrixDcRec[refId − 14].
Definition: vvc_ps.h:191
ALF_NUM_FILTERS_LUMA
#define ALF_NUM_FILTERS_LUMA
Definition: vvc_ps.h:157
H266RawSliceHeader::sh_alf_cb_enabled_flag
uint8_t sh_alf_cb_enabled_flag
Definition: cbs_h266.h:784
SL_START_4x4
@ SL_START_4x4
Definition: vvc_ps.h:179
decode_pps
static int decode_pps(VVCParamSets *ps, const H266RawPPS *rpps)
Definition: vvc_ps.c:592
ff_vvc_diag_scan_x
const uint8_t ff_vvc_diag_scan_x[5][5][16 *16]
Definition: vvc_data.c:27
H266RawSliceHeader::sh_pred_weight_table
H266RawPredWeightTable sh_pred_weight_table
Definition: cbs_h266.h:803
H266RawSliceHeader
Definition: cbs_h266.h:769
sps_derive
static int sps_derive(VVCSPS *sps, void *log_ctx)
Definition: vvc_ps.c:177
VVCLMCS::pivot
uint16_t pivot[LMCS_MAX_BIN_SIZE+1]
Definition: vvc_ps.h:203
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
H266RawSliceHeader::sh_alf_aps_id_luma
uint8_t sh_alf_aps_id_luma[8]
Definition: cbs_h266.h:783
tile_xy
static void tile_xy(int *tile_x, int *tile_y, const int tile_idx, const VVCPPS *pps)
Definition: vvc_ps.c:321
CodedBitstreamH266Context::sps
H266RawSPS * sps[VVC_MAX_SPS_COUNT]
RefStruct references.
Definition: cbs_h266.h:873
IS_B
#define IS_B(rsh)
Definition: vvc_ps.h:40
VVCPH::rref
void * rref
RefStruct reference, backing ph above.
Definition: vvc_ps.h:149
av_always_inline
#define av_always_inline
Definition: attributes.h:49
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
VVCLMCS::u16
uint16_t u16[LMCS_MAX_LUT_SIZE]
for high bit-depth
Definition: vvc_ps.h:200
alf_cc
static void alf_cc(VVCALF *alf, const H266RawAPS *aps)
Definition: vvc_ps.c:955
GDR_IS_RECOVERED
#define GDR_IS_RECOVERED(s)
Definition: vvc_ps.h:43
H266RawSliceHeader::sh_alf_cc_cb_aps_id
uint8_t sh_alf_cc_cb_aps_id
Definition: cbs_h266.h:788
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
H266RawAPS::lmcs_delta_sign_crs_flag
uint8_t lmcs_delta_sign_crs_flag
Definition: cbs_h266.h:638
alf_chroma
static void alf_chroma(VVCALF *alf, const H266RawAPS *aps)
Definition: vvc_ps.c:939
SL_MAX_ID
@ SL_MAX_ID
Definition: vvc_ps.h:184
sps_bit_depth
static int sps_bit_depth(VVCSPS *sps, void *log_ctx)
Definition: vvc_ps.c:77
ret
ret
Definition: filter_design.txt:187
pred
static const float pred[4]
Definition: siprdata.h:259
ff_vvc_scaling_pred_16
const uint8_t ff_vvc_scaling_pred_16[8 *8]
Definition: vvc_data.c:288
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
H266RawSliceHeader::sh_alf_cc_cb_enabled_flag
uint8_t sh_alf_cc_cb_enabled_flag
Definition: cbs_h266.h:787
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
LMCS_MAX_BIN_SIZE
#define LMCS_MAX_BIN_SIZE
Definition: vvc_ps.h:48
VVC_MAX_POINTS_IN_QP_TABLE
@ VVC_MAX_POINTS_IN_QP_TABLE
Definition: vvc.h:121
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:482
id
enum AVCodecID id
Definition: dts2pts.c:365
sh_deblock_offsets
static void sh_deblock_offsets(VVCSH *sh)
Definition: vvc_ps.c:1182
sps_poc
static void sps_poc(VVCSPS *sps)
Definition: vvc_ps.c:130
decode_recovery_flag
static void decode_recovery_flag(VVCContext *s)
Definition: vvc_ps.c:847
IS_P
#define IS_P(rsh)
Definition: vvc_ps.h:39
IS_CRA
#define IS_CRA(s)
Definition: vvc_ps.h:30
alf_coeff_cc
static void alf_coeff_cc(int16_t *coeff, const uint8_t *mapped_abs, const uint8_t *sign)
Definition: vvc_ps.c:912
VVCParamSets::alf_list
const VVCALF * alf_list[VVC_MAX_ALF_COUNT]
RefStruct reference.
Definition: vvc_ps.h:214
sh_entry_points
static void sh_entry_points(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps)
Definition: vvc_ps.c:1232
VVCSH::slice_qp_y
int8_t slice_qp_y
SliceQpY.
Definition: vvc_ps.h:241
H266RawSPS::sps_num_subpics_minus1
uint16_t sps_num_subpics_minus1
Definition: cbs_h266.h:332
VVC_ASP_TYPE_SCALING
@ VVC_ASP_TYPE_SCALING
Definition: vvc.h:72
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:112
scaling_list
static int FUNC() scaling_list(CodedBitstreamContext *ctx, RWContext *rw, H264RawScalingList *current, int size_of_scaling_list)
Definition: cbs_h264_syntax_template.c:71
next_tile_idx
static int next_tile_idx(int tile_idx, const int i, const H266RawPPS *r)
Definition: vvc_ps.c:309
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
sps_inter
static void sps_inter(VVCSPS *sps)
Definition: vvc_ps.c:135
pps_free
static void pps_free(FFRefStructOpaque opaque, void *obj)
Definition: vvc_ps.c:558
VVCLMCS::u8
uint8_t u8[LMCS_MAX_LUT_SIZE]
Definition: vvc_ps.h:199
IS_I
#define IS_I(rsh)
Definition: vvc_ps.h:38
desc
const char * desc
Definition: libsvtav1.c:75
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
mem.h
VVCALF::luma_clip_idx
uint8_t luma_clip_idx[ALF_NUM_FILTERS_LUMA][ALF_NUM_COEFF_LUMA]
Definition: vvc_ps.h:167
sps_chroma_qp_table
static int sps_chroma_qp_table(VVCSPS *sps)
Definition: vvc_ps.c:88
VVCParamSets
Definition: vvc_ps.h:211
VVCSH::max_bt_size
uint8_t max_bt_size[2]
MaxBtSizeY, MaxBtSizeC.
Definition: vvc_ps.h:248
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
VVC_MAX_SAMPLE_ARRAYS
@ VVC_MAX_SAMPLE_ARRAYS
Definition: vvc.h:77
pps_single_slice_picture
static void pps_single_slice_picture(VVCPPS *pps, int *off)
Definition: vvc_ps.c:351
VVCSPS::r
const H266RawSPS * r
RefStruct reference.
Definition: vvc_ps.h:59
VVCALF::num_cc_filters
uint8_t num_cc_filters[2]
alf_cc_cb_filters_signalled_minus1 + 1, alf_cc_cr_filters_signalled_minus1 + 1
Definition: vvc_ps.h:173
H266RawSliceHeader::sh_num_alf_aps_ids_luma
uint8_t sh_num_alf_aps_ids_luma
Definition: cbs_h266.h:782
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
CodedBitstreamH266Context::ph_ref
void * ph_ref
RefStruct reference backing ph above.
Definition: cbs_h266.h:876
coeff
static const double coeff[2][5]
Definition: vf_owdenoise.c:80
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
VVCSH::min_qt_size
uint8_t min_qt_size[2]
MinQtSizeY, MinQtSizeC.
Definition: vvc_ps.h:247
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
h
h
Definition: vp9dsp_template.c:2038
IS_CLVSS
#define IS_CLVSS(s)
Definition: vvc_ps.h:34
pps_subpic_one_or_more_tiles_slice
static void pps_subpic_one_or_more_tiles_slice(VVCPPS *pps, const int tile_x, const int tile_y, const int x_end, const int y_end, const int i, int *off)
Definition: vvc_ps.c:393
ff_vvc_scaling_list0
const int ff_vvc_scaling_list0[8 *8]
Definition: vvc_data.c:299
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:460
scale_coeff
static av_always_inline int scale_coeff(const TransformBlock *tb, int coeff, const int scale, const int scale_m, const int log2_transform_range)
Definition: vvc_intra.c:416
H266RawSliceHeader::sh_alf_cr_enabled_flag
uint8_t sh_alf_cr_enabled_flag
Definition: cbs_h266.h:785
pps_single_slice_per_subpic
static void pps_single_slice_per_subpic(VVCPPS *pps, const VVCSPS *sps, int *off)
Definition: vvc_ps.c:418
ph_max_num_subblock_merge_cand
static int ph_max_num_subblock_merge_cand(const H266RawSPS *sps, const H266RawPictureHeader *ph)
Definition: vvc_ps.c:775
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
VVCALF::chroma_coeff
int16_t chroma_coeff[ALF_NUM_FILTERS_CHROMA][ALF_NUM_COEFF_CHROMA]
Definition: vvc_ps.h:170
H266RawSPS::sps_subpic_treated_as_pic_flag
uint8_t sps_subpic_treated_as_pic_flag[VVC_MAX_SLICES]
Definition: cbs_h266.h:339
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
pps_rect_slice
static void pps_rect_slice(VVCPPS *pps, const VVCSPS *sps)
Definition: vvc_ps.c:463
LUMA
#define LUMA
Definition: hevc_filter.c:31
VVCParamSets::lmcs_list
const H266RawAPS * lmcs_list[VVC_MAX_LMCS_COUNT]
RefStruct reference.
Definition: vvc_ps.h:215
VVCContext
Definition: vvcdec.h:195
VVCScalingList::scaling_matrix_rec
uint8_t scaling_matrix_rec[SL_MAX_ID][SL_MAX_MATRIX_SIZE *SL_MAX_MATRIX_SIZE]
ScalingMatrixRec.
Definition: vvc_ps.h:190
vvc_ps.h