FFmpeg
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 #include <stdbool.h>
24 
25 #include "libavcodec/cbs_h266.h"
26 #include "libavutil/mem.h"
27 #include "libavutil/pixdesc.h"
28 #include "libavutil/refstruct.h"
29 #include "data.h"
30 #include "ps.h"
31 #include "dec.h"
32 
33 static int sps_map_pixel_format(VVCSPS *sps, void *log_ctx)
34 {
35  const H266RawSPS *r = sps->r;
36  const AVPixFmtDescriptor *desc;
37 
38  switch (sps->bit_depth) {
39  case 8:
40  if (r->sps_chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY8;
41  if (r->sps_chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P;
42  if (r->sps_chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P;
43  if (r->sps_chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P;
44  break;
45  case 10:
46  if (r->sps_chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY10;
47  if (r->sps_chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P10;
48  if (r->sps_chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P10;
49  if (r->sps_chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P10;
50  break;
51  case 12:
52  if (r->sps_chroma_format_idc == 0) sps->pix_fmt = AV_PIX_FMT_GRAY12;
53  if (r->sps_chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P12;
54  if (r->sps_chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P12;
55  if (r->sps_chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P12;
56  break;
57  default:
58  av_log(log_ctx, AV_LOG_ERROR,
59  "The following bit-depths are currently specified: 8, 10, 12 bits, "
60  "chroma_format_idc is %d, depth is %d\n",
61  r->sps_chroma_format_idc, sps->bit_depth);
62  return AVERROR_INVALIDDATA;
63  }
64 
65  desc = av_pix_fmt_desc_get(sps->pix_fmt);
66  if (!desc)
67  return AVERROR(EINVAL);
68 
69  sps->hshift[0] = sps->vshift[0] = 0;
70  sps->hshift[2] = sps->hshift[1] = desc->log2_chroma_w;
71  sps->vshift[2] = sps->vshift[1] = desc->log2_chroma_h;
72 
73  sps->pixel_shift = sps->bit_depth > 8;
74 
75  return 0;
76 }
77 
78 static int sps_bit_depth(VVCSPS *sps, void *log_ctx)
79 {
80  const H266RawSPS *r = sps->r;
81 
82  sps->bit_depth = r->sps_bitdepth_minus8 + 8;
83  sps->qp_bd_offset = 6 * (sps->bit_depth - 8);
84  sps->log2_transform_range =
85  r->sps_extended_precision_flag ? FFMAX(15, FFMIN(20, sps->bit_depth + 6)) : 15;
86  return sps_map_pixel_format(sps, log_ctx);
87 }
88 
90 {
91  const H266RawSPS *r = sps->r;
92  const int num_qp_tables = r->sps_same_qp_table_for_chroma_flag ?
93  1 : (r->sps_joint_cbcr_enabled_flag ? 3 : 2);
94 
95  for (int i = 0; i < num_qp_tables; i++) {
96  int num_points_in_qp_table;
98  unsigned int delta_qp_in[VVC_MAX_POINTS_IN_QP_TABLE];
99  int off = sps->qp_bd_offset;
100 
101  num_points_in_qp_table = r->sps_num_points_in_qp_table_minus1[i] + 1;
102 
103  qp_out[0] = qp_in[0] = r->sps_qp_table_start_minus26[i] + 26;
104  for (int j = 0; j < num_points_in_qp_table; j++ ) {
105  const uint8_t delta_qp_out = (r->sps_delta_qp_in_val_minus1[i][j] ^ r->sps_delta_qp_diff_val[i][j]);
106  delta_qp_in[j] = r->sps_delta_qp_in_val_minus1[i][j] + 1;
107  // Note: we cannot check qp_{in,out}[j+1] here as qp_*[j] + delta_qp_*
108  // may not fit in an 8-bit signed integer.
109  if (qp_in[j] + delta_qp_in[j] > 63 || qp_out[j] + delta_qp_out > 63)
110  return AVERROR(EINVAL);
111  qp_in[j+1] = qp_in[j] + delta_qp_in[j];
112  qp_out[j+1] = qp_out[j] + delta_qp_out;
113  }
114  sps->chroma_qp_table[i][qp_in[0] + off] = qp_out[0];
115  for (int k = qp_in[0] - 1 + off; k >= 0; k--)
116  sps->chroma_qp_table[i][k] = av_clip(sps->chroma_qp_table[i][k+1]-1, -off, 63);
117 
118  for (int j = 0; j < num_points_in_qp_table; j++) {
119  int sh = delta_qp_in[j] >> 1;
120  for (int k = qp_in[j] + 1 + off, m = 1; k <= qp_in[j+1] + off; k++, m++) {
121  sps->chroma_qp_table[i][k] = sps->chroma_qp_table[i][qp_in[j] + off] +
122  ((qp_out[j+1] - qp_out[j]) * m + sh) / delta_qp_in[j];
123  }
124  }
125  for (int k = qp_in[num_points_in_qp_table] + 1 + off; k <= 63 + off; k++)
126  sps->chroma_qp_table[i][k] = av_clip(sps->chroma_qp_table[i][k-1] + 1, -sps->qp_bd_offset, 63);
127  }
128  if (r->sps_same_qp_table_for_chroma_flag) {
129  memcpy(&sps->chroma_qp_table[1], &sps->chroma_qp_table[0], sizeof(sps->chroma_qp_table[0]));
130  memcpy(&sps->chroma_qp_table[2], &sps->chroma_qp_table[0], sizeof(sps->chroma_qp_table[0]));
131  }
132 
133  return 0;
134 }
135 
136 static void sps_poc(VVCSPS *sps)
137 {
138  sps->max_pic_order_cnt_lsb = 1 << (sps->r->sps_log2_max_pic_order_cnt_lsb_minus4 + 4);
139 }
140 
141 static void sps_inter(VVCSPS *sps)
142 {
143  const H266RawSPS *r = sps->r;
144 
145  sps->max_num_merge_cand = 6 - r->sps_six_minus_max_num_merge_cand;
146  sps->max_num_ibc_merge_cand = 6 - r->sps_six_minus_max_num_ibc_merge_cand;
147 
148  if (sps->r->sps_gpm_enabled_flag) {
149  sps->max_num_gpm_merge_cand = 2;
150  if (sps->max_num_merge_cand >= 3)
151  sps->max_num_gpm_merge_cand = sps->max_num_merge_cand - r->sps_max_num_merge_cand_minus_max_num_gpm_cand;
152  }
153 
154  sps->log2_parallel_merge_level = r->sps_log2_parallel_merge_level_minus2 + 2;
155 }
156 
158 {
159  const H266RawSPS *r = sps->r;
160 
161  sps->ctb_log2_size_y = r->sps_log2_ctu_size_minus5 + 5;
162  sps->ctb_size_y = 1 << sps->ctb_log2_size_y;
163  sps->min_cb_log2_size_y = r->sps_log2_min_luma_coding_block_size_minus2 + 2;
164  sps->min_cb_size_y = 1 << sps->min_cb_log2_size_y;
165  sps->max_tb_size_y = 1 << (r->sps_max_luma_transform_size_64_flag ? 6 : 5);
166  sps->max_ts_size = 1 << (r->sps_log2_transform_skip_max_size_minus2 + 2);
167 }
168 
169 static void sps_ladf(VVCSPS* sps)
170 {
171  const H266RawSPS *r = sps->r;
172 
173  if (r->sps_ladf_enabled_flag) {
174  sps->num_ladf_intervals = r->sps_num_ladf_intervals_minus2 + 2;
175  sps->ladf_interval_lower_bound[0] = 0;
176  for (int i = 0; i < sps->num_ladf_intervals - 1; i++) {
177  sps->ladf_interval_lower_bound[i + 1] =
178  sps->ladf_interval_lower_bound[i] + r->sps_ladf_delta_threshold_minus1[i] + 1;
179  }
180  }
181 }
182 
183 static int sps_derive(VVCSPS *sps, void *log_ctx)
184 {
185  int ret;
186  const H266RawSPS *r = sps->r;
187 
188  ret = sps_bit_depth(sps, log_ctx);
189  if (ret < 0)
190  return ret;
191  sps_poc(sps);
192  sps_inter(sps);
194  sps_ladf(sps);
195  if (r->sps_chroma_format_idc != 0) {
197  if (ret < 0)
198  return ret;
199  }
200 
201  return 0;
202 }
203 
204 static void sps_free(AVRefStructOpaque opaque, void *obj)
205 {
206  VVCSPS *sps = obj;
207  av_refstruct_unref(&sps->r);
208 }
209 
210 static const VVCSPS *sps_alloc(const H266RawSPS *rsps, void *log_ctx)
211 {
212  int ret;
213  VVCSPS *sps = av_refstruct_alloc_ext(sizeof(*sps), 0, NULL, sps_free);
214 
215  if (!sps)
216  return NULL;
217 
218  av_refstruct_replace(&sps->r, rsps);
219 
220  ret = sps_derive(sps, log_ctx);
221  if (ret < 0)
222  goto fail;
223 
224  return sps;
225 
226 fail:
228  return NULL;
229 }
230 
231 static int decode_sps(VVCParamSets *ps, const H266RawSPS *rsps, void *log_ctx, int is_clvss)
232 {
233  const int sps_id = rsps->sps_seq_parameter_set_id;
234  const VVCSPS *old_sps = ps->sps_list[sps_id];
235  const VVCSPS *sps;
236 
237  if (is_clvss) {
238  ps->sps_id_used = 0;
239  }
240 
241  if (old_sps) {
242  if (old_sps->r == rsps || !memcmp(old_sps->r, rsps, sizeof(*old_sps->r)))
243  return 0;
244  else if (ps->sps_id_used & (1 << sps_id))
245  return AVERROR_INVALIDDATA;
246  }
247 
248  sps = sps_alloc(rsps, log_ctx);
249  if (!sps)
250  return AVERROR(ENOMEM);
251 
253  ps->sps_list[sps_id] = sps;
254  ps->sps_id_used |= (1 << sps_id);
255 
256  return 0;
257 }
258 
260 {
261  pps->chroma_qp_offset[CB - 1] = pps->r->pps_cb_qp_offset;
262  pps->chroma_qp_offset[CR - 1] = pps->r->pps_cr_qp_offset;
263  pps->chroma_qp_offset[JCBCR - 1]= pps->r->pps_joint_cbcr_qp_offset_value;
264  for (int i = 0; i < 6; i++) {
265  pps->chroma_qp_offset_list[i][CB - 1] = pps->r->pps_cb_qp_offset_list[i];
266  pps->chroma_qp_offset_list[i][CR - 1] = pps->r->pps_cr_qp_offset_list[i];
267  pps->chroma_qp_offset_list[i][JCBCR - 1]= pps->r->pps_joint_cbcr_qp_offset_list[i];
268  }
269 }
270 
271 static void pps_width_height(VVCPPS *pps, const VVCSPS *sps)
272 {
273  const H266RawPPS *r = pps->r;
274 
275  pps->width = r->pps_pic_width_in_luma_samples;
276  pps->height = r->pps_pic_height_in_luma_samples;
277 
278  pps->ctb_width = AV_CEIL_RSHIFT(pps->width, sps->ctb_log2_size_y);
279  pps->ctb_height = AV_CEIL_RSHIFT(pps->height, sps->ctb_log2_size_y);
280  pps->ctb_count = pps->ctb_width * pps->ctb_height;
281 
282  pps->min_cb_width = pps->width >> sps->min_cb_log2_size_y;
283  pps->min_cb_height = pps->height >> sps->min_cb_log2_size_y;
284 
285  pps->min_pu_width = pps->width >> MIN_PU_LOG2;
286  pps->min_pu_height = pps->height >> MIN_PU_LOG2;
287  pps->min_tu_width = pps->width >> MIN_TU_LOG2;
288  pps->min_tu_height = pps->height >> MIN_TU_LOG2;
289 
290  pps->width32 = AV_CEIL_RSHIFT(pps->width, 5);
291  pps->height32 = AV_CEIL_RSHIFT(pps->height, 5);
292  pps->width64 = AV_CEIL_RSHIFT(pps->width, 6);
293  pps->height64 = AV_CEIL_RSHIFT(pps->height, 6);
294 }
295 
296 static int pps_bd(VVCPPS *pps)
297 {
298  const H266RawPPS *r = pps->r;
299 
300  pps->col_bd = av_calloc(r->num_tile_columns + 1, sizeof(*pps->col_bd));
301  pps->row_bd = av_calloc(r->num_tile_rows + 1, sizeof(*pps->row_bd));
302  pps->ctb_to_col_bd = av_calloc(pps->ctb_width + 1, sizeof(*pps->ctb_to_col_bd));
303  pps->ctb_to_row_bd = av_calloc(pps->ctb_height + 1, sizeof(*pps->ctb_to_col_bd));
304  if (!pps->col_bd || !pps->row_bd || !pps->ctb_to_col_bd || !pps->ctb_to_row_bd)
305  return AVERROR(ENOMEM);
306 
307  for (int i = 0, j = 0; i < r->num_tile_columns; i++) {
308  pps->col_bd[i] = j;
309  j += r->col_width_val[i];
310  for (int k = pps->col_bd[i]; k < j; k++)
311  pps->ctb_to_col_bd[k] = pps->col_bd[i];
312  }
313  pps->col_bd[r->num_tile_columns] = pps->ctb_to_col_bd[pps->ctb_width] = pps->ctb_width;
314 
315  for (int i = 0, j = 0; i < r->num_tile_rows; i++) {
316  pps->row_bd[i] = j;
317  j += r->row_height_val[i];
318  for (int k = pps->row_bd[i]; k < j; k++)
319  pps->ctb_to_row_bd[k] = pps->row_bd[i];
320  }
321  pps->row_bd[r->num_tile_rows] = pps->ctb_to_row_bd[pps->ctb_height] = pps->ctb_height;
322 
323  return 0;
324 }
325 
326 
327 static int next_tile_idx(int tile_idx, const int i, const H266RawPPS *r)
328 {
329  if (r->pps_tile_idx_delta_present_flag) {
330  tile_idx += r->pps_tile_idx_delta_val[i];
331  } else {
332  tile_idx += r->pps_slice_width_in_tiles_minus1[i] + 1;
333  if (tile_idx % r->num_tile_columns == 0)
334  tile_idx += (r->pps_slice_height_in_tiles_minus1[i]) * r->num_tile_columns;
335  }
336  return tile_idx;
337 }
338 
339 static void tile_xy(int *tile_x, int *tile_y, const int tile_idx, const VVCPPS *pps)
340 {
341  *tile_x = tile_idx % pps->r->num_tile_columns;
342  *tile_y = tile_idx / pps->r->num_tile_columns;
343 }
344 
345 static void ctu_xy(int *rx, int *ry, const int tile_x, const int tile_y, const VVCPPS *pps)
346 {
347  *rx = pps->col_bd[tile_x];
348  *ry = pps->row_bd[tile_y];
349 }
350 
351 static int ctu_rs(const int rx, const int ry, const VVCPPS *pps)
352 {
353  return pps->ctb_width * ry + rx;
354 }
355 
356 static int pps_add_ctus(VVCPPS *pps, int *off, const int rx, const int ry,
357  const int w, const int h)
358 {
359  int start = *off;
360  for (int y = 0; y < h; y++) {
361  for (int x = 0; x < w; x++) {
362  pps->ctb_addr_in_slice[*off] = ctu_rs(rx + x, ry + y, pps);
363  (*off)++;
364  }
365  }
366  return *off - start;
367 }
368 
369 static void pps_single_slice_picture(VVCPPS *pps, int *off)
370 {
371  for (int j = 0; j < pps->r->num_tile_rows; j++) {
372  for (int i = 0; i < pps->r->num_tile_columns; i++) {
373  pps->num_ctus_in_slice[0] = pps_add_ctus(pps, off,
374  pps->col_bd[i], pps->row_bd[j],
375  pps->r->col_width_val[i], pps->r->row_height_val[j]);
376  }
377  }
378 }
379 
380 static void subpic_tiles(int *tile_x, int *tile_y, int *tile_x_end, int *tile_y_end,
381  const VVCSPS *sps, const VVCPPS *pps, const int i)
382 {
383  const int rx = sps->r->sps_subpic_ctu_top_left_x[i];
384  const int ry = sps->r->sps_subpic_ctu_top_left_y[i];
385 
386  *tile_x = *tile_y = 0;
387 
388  while (pps->col_bd[*tile_x] < rx)
389  (*tile_x)++;
390 
391  while (pps->row_bd[*tile_y] < ry)
392  (*tile_y)++;
393 
394  *tile_x_end = (*tile_x);
395  *tile_y_end = (*tile_y);
396 
397  while (pps->col_bd[*tile_x_end] < rx + sps->r->sps_subpic_width_minus1[i] + 1)
398  (*tile_x_end)++;
399 
400  while (pps->row_bd[*tile_y_end] < ry + sps->r->sps_subpic_height_minus1[i] + 1)
401  (*tile_y_end)++;
402 }
403 
404 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)
405 {
406  pps->num_ctus_in_slice[i] = pps_add_ctus(pps, off,
407  pps->col_bd[tx], pps->row_bd[ty],
408  pps->r->col_width_val[tx], sps->r->sps_subpic_height_minus1[i] + 1);
409 }
410 
411 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)
412 {
413  for (int ty = tile_y; ty < y_end; ty++) {
414  for (int tx = tile_x; tx < x_end; tx++) {
415  pps->num_ctus_in_slice[i] += pps_add_ctus(pps, off,
416  pps->col_bd[tx], pps->row_bd[ty],
417  pps->r->col_width_val[tx], pps->r->row_height_val[ty]);
418  }
419  }
420 }
421 
422 static void pps_subpic_slice(VVCPPS *pps, const VVCSPS *sps, const int i, int *off)
423 {
424  int tx, ty, x_end, y_end;
425 
426  pps->slice_start_offset[i] = *off;
427  pps->num_ctus_in_slice[i] = 0;
428 
429  subpic_tiles(&tx, &ty, &x_end, &y_end, sps, pps, i);
430  if (ty + 1 == y_end && sps->r->sps_subpic_height_minus1[i] + 1 < pps->r->row_height_val[ty])
432  else
433  pps_subpic_one_or_more_tiles_slice(pps, tx, ty, x_end, y_end, i, off);
434 }
435 
436 static void pps_single_slice_per_subpic(VVCPPS *pps, const VVCSPS *sps, int *off)
437 {
438  if (!sps->r->sps_subpic_info_present_flag) {
440  } else {
441  for (int i = 0; i < pps->r->pps_num_slices_in_pic_minus1 + 1; i++)
442  pps_subpic_slice(pps, sps, i, off);
443  }
444 }
445 
446 static int pps_one_tile_slices(VVCPPS *pps, const int tile_idx, int i, int *off)
447 {
448  const H266RawPPS *r = pps->r;
449  int rx, ry, ctu_y_end, tile_x, tile_y;
450 
451  tile_xy(&tile_x, &tile_y, tile_idx, pps);
452  ctu_xy(&rx, &ry, tile_x, tile_y, pps);
453  ctu_y_end = ry + r->row_height_val[tile_y];
454  while (ry < ctu_y_end) {
455  pps->slice_start_offset[i] = *off;
456  pps->num_ctus_in_slice[i] = pps_add_ctus(pps, off, rx, ry,
457  r->col_width_val[tile_x], r->slice_height_in_ctus[i]);
458  ry += r->slice_height_in_ctus[i++];
459  }
460  i--;
461  return i;
462 }
463 
464 static int pps_multi_tiles_slice(VVCPPS *pps, const int tile_idx, const int i, int *off, bool *tile_in_slice)
465 {
466  const H266RawPPS *r = pps->r;
467  int rx, ry, tile_x, tile_y;
468 
469  tile_xy(&tile_x, &tile_y, tile_idx, pps);
470  pps->slice_start_offset[i] = *off;
471  pps->num_ctus_in_slice[i] = 0;
472  for (int ty = tile_y; ty <= tile_y + r->pps_slice_height_in_tiles_minus1[i]; ty++) {
473  for (int tx = tile_x; tx <= tile_x + r->pps_slice_width_in_tiles_minus1[i]; tx++) {
474  const int idx = ty * r->num_tile_columns + tx;
475  if (tile_in_slice[idx])
476  return AVERROR_INVALIDDATA;
477  tile_in_slice[idx] = true;
478  ctu_xy(&rx, &ry, tx, ty, pps);
479  pps->num_ctus_in_slice[i] += pps_add_ctus(pps, off, rx, ry,
480  r->col_width_val[tx], r->row_height_val[ty]);
481  }
482  }
483 
484  return 0;
485 }
486 
487 static int pps_rect_slice(VVCPPS *pps, const VVCSPS *sps)
488 {
489  const H266RawPPS *r = pps->r;
490  bool tile_in_slice[VVC_MAX_TILES_PER_AU] = {false};
491  int tile_idx = 0, off = 0;
492 
493  if (r->pps_single_slice_per_subpic_flag) {
495  return 0;
496  }
497 
498  for (int i = 0; i < r->pps_num_slices_in_pic_minus1 + 1; i++) {
499  if (!r->pps_slice_width_in_tiles_minus1[i] &&
500  !r->pps_slice_height_in_tiles_minus1[i]) {
501  if (tile_in_slice[tile_idx])
502  return AVERROR_INVALIDDATA;
503  tile_in_slice[tile_idx] = true;
504  i = pps_one_tile_slices(pps, tile_idx, i, &off);
505  } else {
506  const int ret = pps_multi_tiles_slice(pps, tile_idx, i, &off, tile_in_slice);
507  if (ret < 0)
508  return ret;
509  }
510  tile_idx = next_tile_idx(tile_idx, i, r);
511  }
512 
513  for (int i = 0; i < r->num_tiles_in_pic; i++) {
514  if (!tile_in_slice[i])
515  return AVERROR_INVALIDDATA;
516  }
517 
518  return 0;
519 }
520 
522 {
523  const H266RawPPS* r = pps->r;
524  int rx, ry, off = 0;
525 
526  for (int tile_y = 0; tile_y < r->num_tile_rows; tile_y++) {
527  for (int tile_x = 0; tile_x < r->num_tile_columns; tile_x++) {
528  ctu_xy(&rx, &ry, tile_x, tile_y, pps);
529  pps_add_ctus(pps, &off, rx, ry, r->col_width_val[tile_x], r->row_height_val[tile_y]);
530  }
531  }
532 }
533 
534 static int pps_slice_map(VVCPPS *pps, const VVCSPS *sps)
535 {
536  pps->ctb_addr_in_slice = av_calloc(pps->ctb_count, sizeof(*pps->ctb_addr_in_slice));
537  if (!pps->ctb_addr_in_slice)
538  return AVERROR(ENOMEM);
539 
540  if (pps->r->pps_rect_slice_flag)
541  return pps_rect_slice(pps, sps);
542 
544 
545  return 0;
546 }
547 
549 {
550  const H266RawPPS *r = pps->r;
551 
552  if (r->pps_ref_wraparound_enabled_flag)
553  pps->ref_wraparound_offset = (pps->width / sps->min_cb_size_y) - r->pps_pic_width_minus_wraparound_offset;
554 }
555 
556 static void pps_subpic(VVCPPS *pps, const VVCSPS *sps)
557 {
558  const H266RawSPS *rsps = sps->r;
559  for (int i = 0; i < rsps->sps_num_subpics_minus1 + 1; i++) {
560  if (rsps->sps_subpic_treated_as_pic_flag[i]) {
561  pps->subpic_x[i] = rsps->sps_subpic_ctu_top_left_x[i] << sps->ctb_log2_size_y;
562  pps->subpic_y[i] = rsps->sps_subpic_ctu_top_left_y[i] << sps->ctb_log2_size_y;
563  pps->subpic_width[i] = FFMIN(pps->width - pps->subpic_x[i], (rsps->sps_subpic_width_minus1[i] + 1) << sps->ctb_log2_size_y);
564  pps->subpic_height[i] = FFMIN(pps->height - pps->subpic_y[i], (rsps->sps_subpic_height_minus1[i] + 1) << sps->ctb_log2_size_y);
565  } else {
566  pps->subpic_x[i] = 0;
567  pps->subpic_y[i] = 0;
568  pps->subpic_width[i] = pps->width;
569  pps->subpic_height[i] = pps->height;
570  }
571  }
572 }
573 
574 static int pps_derive(VVCPPS *pps, const VVCSPS *sps)
575 {
576  int ret;
577 
580 
581  ret = pps_bd(pps);
582  if (ret < 0)
583  return ret;
584 
585  ret = pps_slice_map(pps, sps);
586  if (ret < 0)
587  return ret;
588 
590  pps_subpic(pps, sps);
591 
592  return 0;
593 }
594 
595 static void pps_free(AVRefStructOpaque opaque, void *obj)
596 {
597  VVCPPS *pps = obj;
598 
599  av_refstruct_unref(&pps->r);
600 
601  av_freep(&pps->col_bd);
602  av_freep(&pps->row_bd);
603  av_freep(&pps->ctb_to_col_bd);
604  av_freep(&pps->ctb_to_row_bd);
605  av_freep(&pps->ctb_addr_in_slice);
606 }
607 
608 static const VVCPPS *pps_alloc(const H266RawPPS *rpps, const VVCSPS *sps)
609 {
610  int ret;
611  VVCPPS *pps = av_refstruct_alloc_ext(sizeof(*pps), 0, NULL, pps_free);
612 
613  if (!pps)
614  return NULL;
615 
616  av_refstruct_replace(&pps->r, rpps);
617 
618  ret = pps_derive(pps, sps);
619  if (ret < 0)
620  goto fail;
621 
622  return pps;
623 
624 fail:
626  return NULL;
627 }
628 
629 static int decode_pps(VVCParamSets *ps, const H266RawPPS *rpps)
630 {
631  int ret = 0;
632  const int pps_id = rpps->pps_pic_parameter_set_id;
633  const int sps_id = rpps->pps_seq_parameter_set_id;
634  const VVCPPS *old_pps = ps->pps_list[pps_id];
635  const VVCPPS *pps;
636 
637  if (old_pps && old_pps->r == rpps)
638  return 0;
639 
640  pps = pps_alloc(rpps, ps->sps_list[sps_id]);
641  if (!pps)
642  return AVERROR(ENOMEM);
643 
645  ps->pps_list[pps_id] = pps;
646 
647  return ret;
648 }
649 
650 static int decode_ps(VVCParamSets *ps, const CodedBitstreamH266Context *h266, void *log_ctx, int is_clvss)
651 {
652  const H266RawPictureHeader *ph = h266->ph;
653  const H266RawPPS *rpps;
654  const H266RawSPS *rsps;
655  int ret;
656 
657  if (!ph)
658  return AVERROR_INVALIDDATA;
659 
660  rpps = h266->pps[ph->ph_pic_parameter_set_id];
661  if (!rpps)
662  return AVERROR_INVALIDDATA;
663 
664  rsps = h266->sps[rpps->pps_seq_parameter_set_id];
665  if (!rsps)
666  return AVERROR_INVALIDDATA;
667 
668  ret = decode_sps(ps, rsps, log_ctx, is_clvss);
669  if (ret < 0)
670  return ret;
671 
672  if (rsps->sps_log2_ctu_size_minus5 > 2) {
673  // CTU > 128 are reserved in vvc spec v3
674  av_log(log_ctx, AV_LOG_ERROR, "CTU size > 128. \n");
675  return AVERROR_PATCHWELCOME;
676  }
677 
678  ret = decode_pps(ps, rpps);
679  if (ret < 0)
680  return ret;
681 
682  return 0;
683 }
684 
685 #define WEIGHT_TABLE(x) \
686  w->nb_weights[L##x] = r->num_weights_l##x; \
687  for (int i = 0; i < w->nb_weights[L##x]; i++) { \
688  w->weight_flag[L##x][LUMA][i] = r->luma_weight_l##x##_flag[i]; \
689  w->weight_flag[L##x][CHROMA][i] = r->chroma_weight_l##x##_flag[i]; \
690  w->weight[L##x][LUMA][i] = denom[LUMA] + r->delta_luma_weight_l##x[i]; \
691  w->offset[L##x][LUMA][i] = r->luma_offset_l##x[i]; \
692  for (int j = CB; j <= CR; j++) { \
693  w->weight[L##x][j][i] = denom[CHROMA] + r->delta_chroma_weight_l##x[i][j - 1]; \
694  w->offset[L##x][j][i] = 128 + r->delta_chroma_offset_l##x[i][j - 1]; \
695  w->offset[L##x][j][i] -= (128 * w->weight[L##x][j][i]) >> w->log2_denom[CHROMA]; \
696  w->offset[L##x][j][i] = av_clip_intp2(w->offset[L##x][j][i], 7); \
697  } \
698  } \
699 
701 {
702  int denom[2];
703 
704  w->log2_denom[LUMA] = r->luma_log2_weight_denom;
705  w->log2_denom[CHROMA] = w->log2_denom[LUMA] + r->delta_chroma_log2_weight_denom;
706  denom[LUMA] = 1 << w->log2_denom[LUMA];
707  denom[CHROMA] = 1 << w->log2_denom[CHROMA];
708  WEIGHT_TABLE(0)
709  WEIGHT_TABLE(1)
710 }
711 
712 // 8.3.1 Decoding process for picture order count
713 static int ph_compute_poc(const H266RawPictureHeader *ph, const H266RawSPS *sps, const int poc_tid0, const int is_clvss)
714 {
715  const int max_poc_lsb = 1 << (sps->sps_log2_max_pic_order_cnt_lsb_minus4 + 4);
716  const int prev_poc_lsb = poc_tid0 % max_poc_lsb;
717  const int prev_poc_msb = poc_tid0 - prev_poc_lsb;
718  const int poc_lsb = ph->ph_pic_order_cnt_lsb;
719  int poc_msb;
720 
721  if (ph->ph_poc_msb_cycle_present_flag) {
722  poc_msb = ph->ph_poc_msb_cycle_val * max_poc_lsb;
723  } else if (is_clvss) {
724  poc_msb = 0;
725  } else {
726  if (poc_lsb < prev_poc_lsb && prev_poc_lsb - poc_lsb >= max_poc_lsb / 2)
727  poc_msb = prev_poc_msb + max_poc_lsb;
728  else if (poc_lsb > prev_poc_lsb && poc_lsb - prev_poc_lsb > max_poc_lsb / 2)
729  poc_msb = prev_poc_msb - max_poc_lsb;
730  else
731  poc_msb = prev_poc_msb;
732  }
733 
734  return poc_msb + poc_lsb;
735 }
736 
738  uint16_t *pivot1, uint16_t *pivot2, uint16_t *scale_coeff, const int idx, const int max)
739 {
740  const int lut_sample =
741  pivot1[idx] + ((scale_coeff[idx] * (sample - pivot2[idx]) + (1<< 10)) >> 11);
742  return av_clip(lut_sample, 0, max - 1);
743 }
744 
745 //8.8.2.2 Inverse mapping process for a luma sample
746 static int lmcs_derive_lut(VVCLMCS *lmcs, const H266RawAPS *rlmcs, const H266RawSPS *sps)
747 {
748  const int bit_depth = (sps->sps_bitdepth_minus8 + 8);
749  const int max = (1 << bit_depth);
750  const int org_cw = max / LMCS_MAX_BIN_SIZE;
751  const int shift = av_log2(org_cw);
752  const int off = 1 << (shift - 1);
753  int cw[LMCS_MAX_BIN_SIZE];
754  uint16_t input_pivot[LMCS_MAX_BIN_SIZE];
755  uint16_t scale_coeff[LMCS_MAX_BIN_SIZE];
756  uint16_t inv_scale_coeff[LMCS_MAX_BIN_SIZE];
757  int i, delta_crs;
759  return AVERROR_PATCHWELCOME;
760 
761  if (!rlmcs)
762  return AVERROR_INVALIDDATA;
763 
764  lmcs->min_bin_idx = rlmcs->lmcs_min_bin_idx;
766 
767  memset(cw, 0, sizeof(cw));
768  for (int i = lmcs->min_bin_idx; i <= lmcs->max_bin_idx; i++)
769  cw[i] = org_cw + (1 - 2 * rlmcs->lmcs_delta_sign_cw_flag[i]) * rlmcs->lmcs_delta_abs_cw[i];
770 
771  delta_crs = (1 - 2 * rlmcs->lmcs_delta_sign_crs_flag) * rlmcs->lmcs_delta_abs_crs;
772 
773  lmcs->pivot[0] = 0;
774  for (i = 0; i < LMCS_MAX_BIN_SIZE; i++) {
775  input_pivot[i] = i * org_cw;
776  lmcs->pivot[i + 1] = lmcs->pivot[i] + cw[i];
777  scale_coeff[i] = (cw[i] * (1 << 11) + off) >> shift;
778  if (cw[i] == 0) {
779  inv_scale_coeff[i] = 0;
780  lmcs->chroma_scale_coeff[i] = (1 << 11);
781  } else {
782  inv_scale_coeff[i] = org_cw * (1 << 11) / cw[i];
783  lmcs->chroma_scale_coeff[i] = org_cw * (1 << 11) / (cw[i] + delta_crs);
784  }
785  }
786 
787  //derive lmcs_fwd_lut
788  for (uint16_t sample = 0; sample < max; sample++) {
789  const int idx_y = sample / org_cw;
790  const uint16_t fwd_sample = lmcs_derive_lut_sample(sample, lmcs->pivot,
791  input_pivot, scale_coeff, idx_y, max);
792  if (bit_depth > 8)
793  lmcs->fwd_lut.u16[sample] = fwd_sample;
794  else
795  lmcs->fwd_lut.u8 [sample] = fwd_sample;
796 
797  }
798 
799  //derive lmcs_inv_lut
800  i = lmcs->min_bin_idx;
801  for (uint16_t sample = 0; sample < max; sample++) {
802  uint16_t inv_sample;
803  while (i <= lmcs->max_bin_idx && sample >= lmcs->pivot[i + 1])
804  i++;
805 
806  inv_sample = lmcs_derive_lut_sample(sample, input_pivot, lmcs->pivot,
807  inv_scale_coeff, i, max);
808 
809  if (bit_depth > 8)
810  lmcs->inv_lut.u16[sample] = inv_sample;
811  else
812  lmcs->inv_lut.u8 [sample] = inv_sample;
813  }
814 
815  return 0;
816 }
817 
819 {
820  if (sps->sps_affine_enabled_flag)
821  return 5 - sps->sps_five_minus_max_num_subblock_merge_cand;
822  return sps->sps_sbtmvp_enabled_flag && ph->ph_temporal_mvp_enabled_flag;
823 }
824 
825 static int ph_vb_pos(uint16_t *vbs, uint8_t *num_vbs, const uint16_t *pos_minus_1, const uint8_t num_pos, uint16_t max, const int ctb_size_y)
826 {
827  max = FF_CEIL_RSHIFT(max, 3) - 2;
828  for (int i = 0; i < num_pos; i++) {
829  if (pos_minus_1[i] > max)
830  return AVERROR_INVALIDDATA;
831 
832  vbs[i] = (pos_minus_1[i] + 1) << 3;
833 
834  // The distance between any two vertical virtual boundaries shall be greater than or equal to CtbSizeY luma samples
835  if (i && vbs[i] < vbs[i - 1] + ctb_size_y)
836  return AVERROR_INVALIDDATA;
837  }
838  *num_vbs = num_pos;
839 
840  return 0;
841 }
842 
843 #define VBF(f) (sps->sps_virtual_boundaries_present_flag ? sps->sps_##f : ph->r->ph_##f)
844 #define VBFS(c, d) VBF(virtual_boundary_pos_##c##_minus1), VBF(num_##d##_virtual_boundaries)
845 
846 static int ph_vb(VVCPH *ph, const H266RawSPS *sps, const H266RawPPS *pps)
847 {
848  const int ctb_size_y = 1 << (sps->sps_log2_ctu_size_minus5 + 5);
849  int ret;
850 
851  if (!sps->sps_virtual_boundaries_enabled_flag)
852  return 0;
853 
854  ret = ph_vb_pos(ph->vb_pos_x, &ph->num_ver_vbs, VBFS(x, ver), pps->pps_pic_width_in_luma_samples, ctb_size_y);
855  if (ret < 0)
856  return ret;
857 
858  ret = ph_vb_pos(ph->vb_pos_y, &ph->num_hor_vbs, VBFS(y, hor), pps->pps_pic_height_in_luma_samples, ctb_size_y);
859  if (ret < 0)
860  return ret;
861 
862  return 0;
863 }
864 
865 static int ph_derive(VVCPH *ph, const H266RawSPS *sps, const H266RawPPS *pps, const int poc_tid0, const int is_clvss)
866 {
867  int ret;
868  ph->max_num_subblock_merge_cand = ph_max_num_subblock_merge_cand(sps, ph->r);
869 
870  ph->poc = ph_compute_poc(ph->r, sps, poc_tid0, is_clvss);
871 
872  if (pps->pps_wp_info_in_ph_flag)
873  pred_weight_table(&ph->pwt, &ph->r->ph_pred_weight_table);
874 
875  ret = ph_vb(ph, sps, pps);
876  if (ret < 0)
877  return ret;
878 
879  return 0;
880 }
881 
882 static int decode_ph(VVCFrameParamSets *fps, const H266RawPictureHeader *rph, void *rph_ref,
883  const int poc_tid0, const int is_clvss)
884 {
885  int ret;
886  VVCPH *ph = &fps->ph;
887  const H266RawSPS *sps = fps->sps->r;
888  const H266RawPPS *pps = fps->pps->r;
889 
890  ph->r = rph;
891  av_refstruct_replace(&ph->rref, rph_ref);
892  ret = ph_derive(ph, sps, pps, poc_tid0, is_clvss);
893  if (ret < 0)
894  return ret;
895 
896  return 0;
897 }
898 
899 static int decode_frame_ps(VVCFrameParamSets *fps, const VVCParamSets *ps,
900  const CodedBitstreamH266Context *h266, const int poc_tid0, const int is_clvss)
901 {
902  const H266RawPictureHeader *ph = h266->ph;
903  const H266RawPPS *rpps;
904  int ret;
905 
906  if (!ph)
907  return AVERROR_INVALIDDATA;
908 
909  rpps = h266->pps[ph->ph_pic_parameter_set_id];
910  if (!rpps)
911  return AVERROR_INVALIDDATA;
912 
915 
916  ret = decode_ph(fps, ph, h266->ph_ref, poc_tid0, is_clvss);
917  if (ret < 0)
918  return ret;
919 
920  if (ph->ph_explicit_scaling_list_enabled_flag)
921  av_refstruct_replace(&fps->sl, ps->scaling_list[ph->ph_scaling_list_aps_id]);
922 
923  if (ph->ph_lmcs_enabled_flag) {
924  ret = lmcs_derive_lut(&fps->lmcs, ps->lmcs_list[ph->ph_lmcs_aps_id], fps->sps->r);
925  if (ret < 0)
926  return ret;
927  }
928 
929  for (int i = 0; i < FF_ARRAY_ELEMS(fps->alf_list); i++)
930  av_refstruct_replace(&fps->alf_list[i], ps->alf_list[i]);
931 
932  return 0;
933 }
934 
936 {
937  if (IS_IDR(s))
938  s->no_output_before_recovery_flag = 1;
939  else if (IS_CRA(s) || IS_GDR(s))
940  s->no_output_before_recovery_flag = s->last_eos;
941 }
942 
943 static void decode_recovery_poc(VVCContext *s, const VVCPH *ph)
944 {
945  if (s->no_output_before_recovery_flag) {
946  if (IS_GDR(s))
947  s->gdr_recovery_point_poc = ph->poc + ph->r->ph_recovery_poc_cnt;
948  if (!GDR_IS_RECOVERED(s) && s->gdr_recovery_point_poc <= ph->poc)
950  }
951 }
952 
954 {
955  int ret = 0;
956  VVCParamSets *ps = &s->ps;
957  const CodedBitstreamH266Context *h266 = s->cbc->priv_data;
958  int is_clvss;
959 
961  is_clvss = IS_CLVSS(s);
962 
963  ret = decode_ps(ps, h266, s->avctx, is_clvss);
964  if (ret < 0)
965  return ret;
966 
967  ret = decode_frame_ps(fps, ps, h266, s->poc_tid0, is_clvss);
968  decode_recovery_poc(s, &fps->ph);
969  return ret;
970 }
971 
973 {
974  av_refstruct_unref(&fps->sps);
975  av_refstruct_unref(&fps->pps);
976  av_refstruct_unref(&fps->ph.rref);
977  av_refstruct_unref(&fps->sl);
978  for (int i = 0; i < FF_ARRAY_ELEMS(fps->alf_list); i++)
979  av_refstruct_unref(&fps->alf_list[i]);
980 }
981 
983 {
984  for (int i = 0; i < FF_ARRAY_ELEMS(ps->scaling_list); i++)
986  for (int i = 0; i < FF_ARRAY_ELEMS(ps->lmcs_list); i++)
988  for (int i = 0; i < FF_ARRAY_ELEMS(ps->alf_list); i++)
990  for (int i = 0; i < FF_ARRAY_ELEMS(ps->sps_list); i++)
992  for (int i = 0; i < FF_ARRAY_ELEMS(ps->pps_list); i++)
994 }
995 
996 static void alf_coeff(int16_t *coeff,
997  const uint8_t *abs, const uint8_t *sign, const int size)
998 {
999  for (int i = 0; i < size; i++)
1000  coeff[i] = (1 - 2 * sign[i]) * abs[i];
1001 }
1002 
1003 static void alf_coeff_cc(int16_t *coeff,
1004  const uint8_t *mapped_abs, const uint8_t *sign)
1005 {
1006  for (int i = 0; i < ALF_NUM_COEFF_CC; i++) {
1007  int c = mapped_abs[i];
1008  if (c)
1009  c = (1 - 2 * sign[i]) * (1 << (c - 1));
1010  coeff[i] = c;
1011  }
1012 }
1013 
1014 static void alf_luma(VVCALF *alf, const H266RawAPS *aps)
1015 {
1016  if (!aps->alf_luma_filter_signal_flag)
1017  return;
1018 
1019  for (int i = 0; i < ALF_NUM_FILTERS_LUMA; i++) {
1020  const int ref = aps->alf_luma_coeff_delta_idx[i];
1021  const uint8_t *abs = aps->alf_luma_coeff_abs[ref];
1022  const uint8_t *sign = aps->alf_luma_coeff_sign[ref];
1023 
1024  alf_coeff(alf->luma_coeff[i], abs, sign, ALF_NUM_COEFF_LUMA);
1025  memcpy(alf->luma_clip_idx[i], aps->alf_luma_clip_idx[ref],
1026  sizeof(alf->luma_clip_idx[i]));
1027  }
1028 }
1029 
1030 static void alf_chroma(VVCALF *alf, const H266RawAPS *aps)
1031 {
1032  if (!aps->alf_chroma_filter_signal_flag)
1033  return;
1034 
1035  alf->num_chroma_filters = aps->alf_chroma_num_alt_filters_minus1 + 1;
1036  for (int i = 0; i < alf->num_chroma_filters; i++) {
1037  const uint8_t *abs = aps->alf_chroma_coeff_abs[i];
1038  const uint8_t *sign = aps->alf_chroma_coeff_sign[i];
1039 
1041  memcpy(alf->chroma_clip_idx[i], aps->alf_chroma_clip_idx[i],
1042  sizeof(alf->chroma_clip_idx[i]));
1043  }
1044 }
1045 
1046 static void alf_cc(VVCALF *alf, const H266RawAPS *aps)
1047 {
1048  const uint8_t (*abs[])[ALF_NUM_COEFF_CC] =
1049  { aps->alf_cc_cb_mapped_coeff_abs, aps->alf_cc_cr_mapped_coeff_abs };
1050  const uint8_t (*sign[])[ALF_NUM_COEFF_CC] =
1051  {aps->alf_cc_cb_coeff_sign, aps->alf_cc_cr_coeff_sign };
1052  const int signaled[] = { aps->alf_cc_cb_filter_signal_flag, aps->alf_cc_cr_filter_signal_flag};
1053 
1054  alf->num_cc_filters[0] = aps->alf_cc_cb_filters_signalled_minus1 + 1;
1055  alf->num_cc_filters[1] = aps->alf_cc_cr_filters_signalled_minus1 + 1;
1056 
1057  for (int idx = 0; idx < 2; idx++) {
1058  if (signaled[idx]) {
1059  for (int i = 0; i < alf->num_cc_filters[idx]; i++)
1060  alf_coeff_cc(alf->cc_coeff[idx][i], abs[idx][i], sign[idx][i]);
1061  }
1062  }
1063 }
1064 
1065 static void alf_derive(VVCALF *alf, const H266RawAPS *aps)
1066 {
1067  alf_luma(alf, aps);
1068  alf_chroma(alf, aps);
1069  alf_cc(alf, aps);
1070 }
1071 
1072 static void alf_free(AVRefStructOpaque unused, void *obj)
1073 {
1074  VVCALF *alf = obj;
1075 
1076  av_refstruct_unref(&alf->r);
1077 }
1078 
1079 static int aps_decode_alf(const VVCALF **alf, const H266RawAPS *aps)
1080 {
1081  VVCALF *a = av_refstruct_alloc_ext(sizeof(*a), 0, NULL, alf_free);
1082  if (!a)
1083  return AVERROR(ENOMEM);
1084 
1085  alf_derive(a, aps);
1086  av_refstruct_replace(&a->r, aps);
1087  av_refstruct_replace(alf, a);
1089 
1090  return 0;
1091 }
1092 
1093 static int is_luma_list(const int id)
1094 {
1095  return id % VVC_MAX_SAMPLE_ARRAYS == SL_START_4x4 || id == SL_START_64x64 + 1;
1096 }
1097 
1098 static int derive_matrix_size(const int id)
1099 {
1100  return id < SL_START_4x4 ? 2 : (id < SL_START_8x8 ? 4 : 8);
1101 }
1102 
1103 // 7.4.3.20 Scaling list data semantics
1105 {
1106  for (int id = 0; id < SL_MAX_ID; id++) {
1107  const int matrix_size = derive_matrix_size(id);
1108  const int log2_size = av_log2(matrix_size);
1109  const int list_size = matrix_size * matrix_size;
1111  const uint8_t *pred;
1112  const int *scaling_list;
1113  int dc = 0;
1114 
1115  if (aps->aps_chroma_present_flag || is_luma_list(id)) {
1116  if (!aps->scaling_list_copy_mode_flag[id]) {
1117  int next_coef = 0;
1118 
1119  if (id >= SL_START_16x16)
1120  dc = next_coef = aps->scaling_list_dc_coef[id - SL_START_16x16];
1121 
1122  for (int i = 0; i < list_size; i++) {
1123  const int x = ff_vvc_diag_scan_x[3][3][i];
1124  const int y = ff_vvc_diag_scan_y[3][3][i];
1125 
1126  if (!(id >= SL_START_64x64 && x >= 4 && y >= 4))
1127  next_coef += aps->scaling_list_delta_coef[id][i];
1128  coeff[i] = next_coef;
1129  }
1130  }
1131  }
1132 
1133  //dc
1134  if (id >= SL_START_16x16) {
1135  if (!aps->scaling_list_copy_mode_flag[id] && !aps->scaling_list_pred_mode_flag[id]) {
1136  dc += 8;
1137  } else if (!aps->scaling_list_pred_id_delta[id]) {
1138  dc += 16;
1139  } else {
1140  const int ref_id = id - aps->scaling_list_pred_id_delta[id];
1141  if (ref_id >= SL_START_16x16)
1142  dc += sl->scaling_matrix_dc_rec[ref_id - SL_START_16x16];
1143  else
1144  dc += sl->scaling_matrix_rec[ref_id][0];
1145  }
1146  sl->scaling_matrix_dc_rec[id - SL_START_16x16] = dc & 255;
1147  }
1148 
1149  //ac
1150  scaling_list = aps->scaling_list_copy_mode_flag[id] ? ff_vvc_scaling_list0 : coeff;
1151  if (!aps->scaling_list_copy_mode_flag[id] && !aps->scaling_list_pred_mode_flag[id])
1153  else if (!aps->scaling_list_pred_id_delta[id])
1155  else
1156  pred = sl->scaling_matrix_rec[id - aps->scaling_list_pred_id_delta[id]];
1157  for (int i = 0; i < list_size; i++) {
1158  const int x = ff_vvc_diag_scan_x[log2_size][log2_size][i];
1159  const int y = ff_vvc_diag_scan_y[log2_size][log2_size][i];
1160  const int off = y * matrix_size + x;
1161  sl->scaling_matrix_rec[id][off] = (pred[off] + scaling_list[i]) & 255;
1162  }
1163  }
1164 }
1165 
1166 static int aps_decode_scaling(const VVCScalingList **scaling, const H266RawAPS *aps)
1167 {
1168  VVCScalingList *sl = av_refstruct_allocz(sizeof(*sl));
1169  if (!sl)
1170  return AVERROR(ENOMEM);
1171 
1172  scaling_derive(sl, aps);
1173  av_refstruct_replace(scaling, sl);
1174  av_refstruct_unref(&sl);
1175 
1176  return 0;
1177 }
1178 
1180 {
1181  const H266RawAPS *aps = unit->content_ref;
1182  int ret = 0;
1183 
1184  if (!aps)
1185  return AVERROR_INVALIDDATA;
1186 
1187  switch (aps->aps_params_type) {
1188  case VVC_ASP_TYPE_ALF:
1189  ret = aps_decode_alf(&ps->alf_list[aps->aps_adaptation_parameter_set_id], aps);
1190  break;
1191  case VVC_ASP_TYPE_LMCS:
1192  av_refstruct_replace(&ps->lmcs_list[aps->aps_adaptation_parameter_set_id], aps);
1193  break;
1194  case VVC_ASP_TYPE_SCALING:
1195  ret = aps_decode_scaling(&ps->scaling_list[aps->aps_adaptation_parameter_set_id], aps);
1196  break;
1197  }
1198 
1199  return ret;
1200 }
1201 
1202 static int sh_alf_aps(const VVCSH *sh, const VVCFrameParamSets *fps)
1203 {
1204  if (!sh->r->sh_alf_enabled_flag)
1205  return 0;
1206 
1207  for (int i = 0; i < sh->r->sh_num_alf_aps_ids_luma; i++) {
1208  const VVCALF *alf_aps_luma = fps->alf_list[sh->r->sh_alf_aps_id_luma[i]];
1209  if (!alf_aps_luma)
1210  return AVERROR_INVALIDDATA;
1211  }
1212 
1213  if (sh->r->sh_alf_cb_enabled_flag || sh->r->sh_alf_cr_enabled_flag) {
1214  const VVCALF *alf_aps_chroma = fps->alf_list[sh->r->sh_alf_aps_id_chroma];
1215  if (!alf_aps_chroma)
1216  return AVERROR_INVALIDDATA;
1217  }
1218 
1219  if (fps->sps->r->sps_ccalf_enabled_flag) {
1220  if (sh->r->sh_alf_cc_cb_enabled_flag) {
1221  const VVCALF *alf_aps_cc_cr = fps->alf_list[sh->r->sh_alf_cc_cb_aps_id];
1222  if (!alf_aps_cc_cr)
1223  return AVERROR_INVALIDDATA;
1224  }
1225  if (sh->r->sh_alf_cc_cr_enabled_flag) {
1226  const VVCALF *alf_aps_cc_cr = fps->alf_list[sh->r->sh_alf_cc_cr_aps_id];
1227  if (!alf_aps_cc_cr)
1228  return AVERROR_INVALIDDATA;
1229  }
1230  }
1231 
1232  return 0;
1233 }
1234 
1235 static void sh_slice_address(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps)
1236 {
1237  const int slice_address = sh->r->sh_slice_address;
1238 
1239  if (pps->r->pps_rect_slice_flag) {
1240  int pic_level_slice_idx = slice_address;
1241  for (int j = 0; j < sh->r->curr_subpic_idx; j++)
1242  pic_level_slice_idx += pps->r->num_slices_in_subpic[j];
1243  sh->ctb_addr_in_curr_slice = pps->ctb_addr_in_slice + pps->slice_start_offset[pic_level_slice_idx];
1244  sh->num_ctus_in_curr_slice = pps->num_ctus_in_slice[pic_level_slice_idx];
1245  } else {
1246  int tile_x = slice_address % pps->r->num_tile_columns;
1247  int tile_y = slice_address / pps->r->num_tile_columns;
1248  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];
1249 
1250  sh->ctb_addr_in_curr_slice = pps->ctb_addr_in_slice + slice_start_ctb;
1251 
1252  sh->num_ctus_in_curr_slice = 0;
1253  for (int tile_idx = slice_address; tile_idx <= slice_address + sh->r->sh_num_tiles_in_slice_minus1; tile_idx++) {
1254  tile_x = tile_idx % pps->r->num_tile_columns;
1255  tile_y = tile_idx / pps->r->num_tile_columns;
1256  sh->num_ctus_in_curr_slice += pps->r->row_height_val[tile_y] * pps->r->col_width_val[tile_x];
1257  }
1258  }
1259 }
1260 
1261 static void sh_qp_y(VVCSH *sh, const H266RawPPS *pps, const H266RawPictureHeader *ph)
1262 {
1263  const int init_qp = pps->pps_init_qp_minus26 + 26;
1264 
1265  if (!pps->pps_qp_delta_info_in_ph_flag)
1266  sh->slice_qp_y = init_qp + sh->r->sh_qp_delta;
1267  else
1268  sh->slice_qp_y = init_qp + ph->ph_qp_delta;
1269 }
1270 
1271 static void sh_inter(VVCSH *sh, const H266RawSPS *sps, const H266RawPPS *pps)
1272 {
1273  const H266RawSliceHeader *rsh = sh->r;
1274 
1275  if (!pps->pps_wp_info_in_ph_flag &&
1276  ((pps->pps_weighted_pred_flag && IS_P(rsh)) ||
1277  (pps->pps_weighted_bipred_flag && IS_B(rsh))))
1279 }
1280 
1281 static void sh_deblock_offsets(VVCSH *sh)
1282 {
1283  const H266RawSliceHeader *r = sh->r;
1284 
1285  if (!r->sh_deblocking_filter_disabled_flag) {
1286  sh->deblock.beta_offset[LUMA] = r->sh_luma_beta_offset_div2 * 2;
1287  sh->deblock.tc_offset[LUMA] = r->sh_luma_tc_offset_div2 * 2;
1288  sh->deblock.beta_offset[CB] = r->sh_cb_beta_offset_div2 * 2;
1289  sh->deblock.tc_offset[CB] = r->sh_cb_tc_offset_div2 * 2;
1290  sh->deblock.beta_offset[CR] = r->sh_cr_beta_offset_div2 * 2;
1291  sh->deblock.tc_offset[CR] = r->sh_cr_tc_offset_div2 * 2;
1292  }
1293 }
1294 
1296 {
1297  const int min_cb_log2_size_y = sps->sps_log2_min_luma_coding_block_size_minus2 + 2;
1298  int min_qt_log2_size_y[2];
1299 
1300  if (IS_I(sh->r)) {
1301  min_qt_log2_size_y[LUMA] = (min_cb_log2_size_y + ph->ph_log2_diff_min_qt_min_cb_intra_slice_luma);
1302  min_qt_log2_size_y[CHROMA] = (min_cb_log2_size_y + ph->ph_log2_diff_min_qt_min_cb_intra_slice_chroma);
1303 
1304  sh->max_bt_size[LUMA] = 1 << (min_qt_log2_size_y[LUMA] + ph->ph_log2_diff_max_bt_min_qt_intra_slice_luma);
1305  sh->max_bt_size[CHROMA] = 1 << (min_qt_log2_size_y[CHROMA]+ ph->ph_log2_diff_max_bt_min_qt_intra_slice_chroma);
1306 
1307  sh->max_tt_size[LUMA] = 1 << (min_qt_log2_size_y[LUMA] + ph->ph_log2_diff_max_tt_min_qt_intra_slice_luma);
1308  sh->max_tt_size[CHROMA] = 1 << (min_qt_log2_size_y[CHROMA]+ ph->ph_log2_diff_max_tt_min_qt_intra_slice_chroma);
1309 
1310  sh->max_mtt_depth[LUMA] = ph->ph_max_mtt_hierarchy_depth_intra_slice_luma;
1311  sh->max_mtt_depth[CHROMA] = ph->ph_max_mtt_hierarchy_depth_intra_slice_chroma;
1312 
1313  sh->cu_qp_delta_subdiv = ph->ph_cu_qp_delta_subdiv_intra_slice;
1314  sh->cu_chroma_qp_offset_subdiv = ph->ph_cu_chroma_qp_offset_subdiv_intra_slice;
1315  } else {
1316  for (int i = LUMA; i <= CHROMA; i++) {
1317  min_qt_log2_size_y[i] = (min_cb_log2_size_y + ph->ph_log2_diff_min_qt_min_cb_inter_slice);
1318  sh->max_bt_size[i] = 1 << (min_qt_log2_size_y[i] + ph->ph_log2_diff_max_bt_min_qt_inter_slice);
1319  sh->max_tt_size[i] = 1 << (min_qt_log2_size_y[i] + ph->ph_log2_diff_max_tt_min_qt_inter_slice);
1320  sh->max_mtt_depth[i] = ph->ph_max_mtt_hierarchy_depth_inter_slice;
1321  }
1322 
1323  sh->cu_qp_delta_subdiv = ph->ph_cu_qp_delta_subdiv_inter_slice;
1324  sh->cu_chroma_qp_offset_subdiv = ph->ph_cu_chroma_qp_offset_subdiv_inter_slice;
1325  }
1326 
1327  sh->min_qt_size[LUMA] = 1 << min_qt_log2_size_y[LUMA];
1328  sh->min_qt_size[CHROMA] = 1 << min_qt_log2_size_y[CHROMA];
1329 }
1330 
1331 static void sh_entry_points(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps)
1332 {
1333  if (sps->sps_entry_point_offsets_present_flag) {
1334  for (int i = 1, j = 0; i < sh->num_ctus_in_curr_slice; i++) {
1335  const int pre_ctb_addr_x = sh->ctb_addr_in_curr_slice[i - 1] % pps->ctb_width;
1336  const int pre_ctb_addr_y = sh->ctb_addr_in_curr_slice[i - 1] / pps->ctb_width;
1337  const int ctb_addr_x = sh->ctb_addr_in_curr_slice[i] % pps->ctb_width;
1338  const int ctb_addr_y = sh->ctb_addr_in_curr_slice[i] / pps->ctb_width;
1339  if (pps->ctb_to_row_bd[ctb_addr_y] != pps->ctb_to_row_bd[pre_ctb_addr_y] ||
1340  pps->ctb_to_col_bd[ctb_addr_x] != pps->ctb_to_col_bd[pre_ctb_addr_x] ||
1341  (ctb_addr_y != pre_ctb_addr_y && sps->sps_entropy_coding_sync_enabled_flag)) {
1342  sh->entry_point_start_ctu[j++] = i;
1343  }
1344  }
1345  }
1346 }
1347 
1348 static int sh_derive(VVCSH *sh, const VVCFrameParamSets *fps)
1349 {
1350  const H266RawSPS *sps = fps->sps->r;
1351  const H266RawPPS *pps = fps->pps->r;
1352  const H266RawPictureHeader *ph = fps->ph.r;
1353  int ret;
1354 
1355  sh_slice_address(sh, sps, fps->pps);
1356  ret = sh_alf_aps(sh, fps);
1357  if (ret < 0)
1358  return ret;
1359  sh_inter(sh, sps, pps);
1360  sh_qp_y(sh, pps, ph);
1361  sh_deblock_offsets(sh);
1363  sh_entry_points(sh, sps, fps->pps);
1364 
1365  return 0;
1366 }
1367 
1369 {
1370  int ret;
1371 
1372  if (!fps->sps || !fps->pps)
1373  return AVERROR_INVALIDDATA;
1374 
1375  av_refstruct_replace(&sh->r, unit->content_ref);
1376 
1377  ret = sh_derive(sh, fps);
1378  if (ret < 0)
1379  return ret;
1380 
1381  return 0;
1382 }
VVCSPS
Definition: ps.h:58
H266RawSPS::sps_subpic_height_minus1
uint16_t sps_subpic_height_minus1[VVC_MAX_SLICES]
Definition: cbs_h266.h:338
VVCSH::cu_qp_delta_subdiv
uint8_t cu_qp_delta_subdiv
CuQpDeltaSubdiv.
Definition: ps.h:261
H266RawSliceHeader::sh_alf_cc_cr_enabled_flag
uint8_t sh_alf_cc_cr_enabled_flag
Definition: cbs_h266.h:791
CodedBitstreamUnit::content_ref
void * content_ref
If content is reference counted, a RefStruct reference backing content.
Definition: cbs.h:112
VVCSH::num_ctus_in_curr_slice
uint32_t num_ctus_in_curr_slice
NumCtusInCurrSlice.
Definition: ps.h:243
VVCPH
Definition: ps.h:147
VVCPPS
Definition: ps.h:92
av_clip
#define av_clip
Definition: common.h:100
VVCLMCS::min_bin_idx
uint8_t min_bin_idx
Definition: ps.h:202
cbs_h266.h
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
LUMA
#define LUMA
Definition: filter.c:31
H266RawSPS::sps_log2_ctu_size_minus5
uint8_t sps_log2_ctu_size_minus5
Definition: cbs_h266.h:315
ff_vvc_decode_frame_ps
int ff_vvc_decode_frame_ps(VVCFrameParamSets *fps, struct VVCContext *s)
Definition: ps.c:953
VVCSH::entry_point_start_ctu
uint32_t entry_point_start_ctu[VVC_MAX_ENTRY_POINTS]
entry point start in ctu_addr
Definition: ps.h:265
VVCPPS::r
const H266RawPPS * r
RefStruct reference.
Definition: ps.h:93
SL_MAX_MATRIX_SIZE
#define SL_MAX_MATRIX_SIZE
Definition: ps.h:194
SL_MAX_ID
@ SL_MAX_ID
Definition: ps.h:191
CB
#define CB
Definition: filter.c:32
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3244
AVRefStructOpaque
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition: refstruct.h:58
VVCSH::cu_chroma_qp_offset_subdiv
uint8_t cu_chroma_qp_offset_subdiv
CuChromaQpOffsetSubdiv.
Definition: ps.h:262
alf_derive
static void alf_derive(VVCALF *alf, const H266RawAPS *aps)
Definition: ps.c:1065
LMCS_MAX_BIN_SIZE
#define LMCS_MAX_BIN_SIZE
Definition: ps.h:48
IS_P
#define IS_P(rsh)
Definition: ps.h:39
data.h
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: intra.c:418
ph
static int FUNC() ph(CodedBitstreamContext *ctx, RWContext *rw, H266RawPH *current)
Definition: cbs_h266_syntax_template.c:3043
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_single_slice_picture
static void pps_single_slice_picture(VVCPPS *pps, int *off)
Definition: ps.c:369
aps_decode_scaling
static int aps_decode_scaling(const VVCScalingList **scaling, const H266RawAPS *aps)
Definition: ps.c:1166
VVCLMCS::max_bin_idx
uint8_t max_bin_idx
Definition: ps.h:203
H266RawAPS::lmcs_delta_abs_crs
uint8_t lmcs_delta_abs_crs
Definition: cbs_h266.h:639
H266RawSPS::sps_ccalf_enabled_flag
uint8_t sps_ccalf_enabled_flag
Definition: cbs_h266.h:404
VVC_MAX_POINTS_IN_QP_TABLE
@ VVC_MAX_POINTS_IN_QP_TABLE
Definition: vvc.h:121
H266RawSliceHeader::sh_qp_delta
int8_t sh_qp_delta
Definition: cbs_h266.h:807
sh_qp_y
static void sh_qp_y(VVCSH *sh, const H266RawPPS *pps, const H266RawPictureHeader *ph)
Definition: ps.c:1261
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:510
VVCSH::r
const H266RawSliceHeader * r
RefStruct reference.
Definition: ps.h:239
SL_START_8x8
@ SL_START_8x8
Definition: ps.h:187
sps_chroma_qp_table
static int sps_chroma_qp_table(VVCSPS *sps)
Definition: ps.c:89
pps_subpic
static void pps_subpic(VVCPPS *pps, const VVCSPS *sps)
Definition: ps.c:556
decode_ph
static int decode_ph(VVCFrameParamSets *fps, const H266RawPictureHeader *rph, void *rph_ref, const int poc_tid0, const int is_clvss)
Definition: ps.c:882
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: ps.c:356
max
#define max(a, b)
Definition: cuda_runtime.h:33
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: ps.h:201
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
H266RawAPS::lmcs_delta_max_bin_idx
uint8_t lmcs_delta_max_bin_idx
Definition: cbs_h266.h:635
pps_alloc
static const VVCPPS * pps_alloc(const H266RawPPS *rpps, const VVCSPS *sps)
Definition: ps.c:608
VVCALF::num_chroma_filters
uint8_t num_chroma_filters
Definition: ps.h:176
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:70
sh_inter
static void sh_inter(VVCSH *sh, const H266RawSPS *sps, const H266RawPPS *pps)
Definition: ps.c:1271
decode_pps
static int decode_pps(VVCParamSets *ps, const H266RawPPS *rpps)
Definition: ps.c:629
VVCLMCS::chroma_scale_coeff
uint16_t chroma_scale_coeff[LMCS_MAX_BIN_SIZE]
Definition: ps.h:211
JCBCR
#define JCBCR
Definition: dec.h:37
CodedBitstreamH266Context::pps
H266RawPPS * pps[VVC_MAX_PPS_COUNT]
RefStruct references.
Definition: cbs_h266.h:866
MIN_PU_LOG2
#define MIN_PU_LOG2
Definition: dec.h:40
H266RawSliceHeader::sh_alf_cc_cr_aps_id
uint8_t sh_alf_cc_cr_aps_id
Definition: cbs_h266.h:792
ps.h
VVCFrameParamSets::sps
const VVCSPS * sps
RefStruct reference.
Definition: ps.h:230
VVC_ASP_TYPE_ALF
@ VVC_ASP_TYPE_ALF
Definition: vvc.h:70
ALF_NUM_COEFF_CHROMA
#define ALF_NUM_COEFF_CHROMA
Definition: ps.h:168
VVCFrameParamSets
Definition: ps.h:229
pps_slice_map
static int pps_slice_map(VVCPPS *pps, const VVCSPS *sps)
Definition: ps.c:534
fail
#define fail()
Definition: checkasm.h:193
VVCSH::pwt
PredWeightTable pwt
Definition: ps.h:247
H266RawSPS::sps_subpic_width_minus1
uint16_t sps_subpic_width_minus1[VVC_MAX_SLICES]
Definition: cbs_h266.h:337
IS_B
#define IS_B(rsh)
Definition: ps.h:40
H266RawAPS
Definition: cbs_h266.h:600
ff_vvc_decode_sh
int ff_vvc_decode_sh(VVCSH *sh, const VVCFrameParamSets *fps, const CodedBitstreamUnit *unit)
Definition: ps.c:1368
VVCParamSets::pps_list
const VVCPPS * pps_list[VVC_MAX_PPS_COUNT]
RefStruct reference.
Definition: ps.h:220
derive_matrix_size
static int derive_matrix_size(const int id)
Definition: ps.c:1098
VVCALF::cc_coeff
int16_t cc_coeff[2][ALF_NUM_FILTERS_CC][ALF_NUM_COEFF_CC]
Definition: ps.h:181
VVCFrameParamSets::sl
const VVCScalingList * sl
RefStruct reference.
Definition: ps.h:235
VVCALF
Definition: ps.h:171
VVC_MAX_TILES_PER_AU
@ VVC_MAX_TILES_PER_AU
Definition: vvc.h:136
H266RawSliceHeader::sh_alf_enabled_flag
uint8_t sh_alf_enabled_flag
Definition: cbs_h266.h:783
refstruct.h
ff_vvc_scaling_pred_16
const uint8_t ff_vvc_scaling_pred_16[8 *8]
Definition: data.c:288
ff_vvc_frame_ps_free
void ff_vvc_frame_ps_free(VVCFrameParamSets *fps)
Definition: ps.c:972
av_refstruct_allocz
static void * av_refstruct_allocz(size_t size)
Equivalent to av_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition: refstruct.h:105
VVCALF::chroma_clip_idx
uint8_t chroma_clip_idx[ALF_NUM_FILTERS_CHROMA][ALF_NUM_COEFF_CHROMA]
Definition: ps.h:178
GDR_SET_RECOVERED
#define GDR_SET_RECOVERED(s)
Definition: ps.h:44
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:513
sps_ladf
static void sps_ladf(VVCSPS *sps)
Definition: ps.c:169
pps_no_rect_slice
static void pps_no_rect_slice(VVCPPS *pps)
Definition: ps.c:521
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
H266RawAPS::lmcs_delta_abs_cw
uint16_t lmcs_delta_abs_cw[16]
Definition: cbs_h266.h:637
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
DBParams::beta_offset
int beta_offset
Definition: hevcdec.h:348
DBParams::tc_offset
int tc_offset
Definition: hevcdec.h:349
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:777
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
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: ps.c:899
SL_START_64x64
@ SL_START_64x64
Definition: ps.h:190
VVCFrameParamSets::lmcs
VVCLMCS lmcs
Definition: ps.h:234
av_refstruct_alloc_ext
static void * av_refstruct_alloc_ext(size_t size, unsigned flags, void *opaque, void(*free_cb)(AVRefStructOpaque opaque, void *obj))
A wrapper around av_refstruct_alloc_ext_c() for the common case of a non-const qualified opaque.
Definition: refstruct.h:94
VVCSH
Definition: ps.h:238
IS_IDR
#define IS_IDR(s)
Definition: hevcdec.h:76
PredWeightTable
Definition: ps.h:137
VVCFrameParamSets::ph
VVCPH ph
Definition: ps.h:232
ph_vb
static int ph_vb(VVCPH *ph, const H266RawSPS *sps, const H266RawPPS *pps)
Definition: ps.c:846
IS_GDR
#define IS_GDR(s)
Definition: ps.h:32
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
WEIGHT_TABLE
#define WEIGHT_TABLE(x)
Definition: ps.c:685
VVCParamSets::sps_list
const VVCSPS * sps_list[VVC_MAX_SPS_COUNT]
RefStruct reference.
Definition: ps.h:219
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:491
H266RawSPS
Definition: cbs_h266.h:308
FF_CEIL_RSHIFT
#define FF_CEIL_RSHIFT
Definition: common.h:63
pred_weight_table
static void pred_weight_table(PredWeightTable *w, const H266RawPredWeightTable *r)
Definition: ps.c:700
H266RawPPS
Definition: cbs_h266.h:496
aps
static int FUNC() aps(CodedBitstreamContext *ctx, RWContext *rw, H266RawAPS *current, int prefix)
Definition: cbs_h266_syntax_template.c:2501
pps_free
static void pps_free(AVRefStructOpaque opaque, void *obj)
Definition: ps.c:595
alf_coeff_cc
static void alf_coeff_cc(int16_t *coeff, const uint8_t *mapped_abs, const uint8_t *sign)
Definition: ps.c:1003
NULL
#define NULL
Definition: coverity.c:32
H266RawPictureHeader
Definition: cbs_h266.h:676
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
VVC_MAX_SAMPLE_ARRAYS
@ VVC_MAX_SAMPLE_ARRAYS
Definition: vvc.h:77
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: ps.c:737
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:837
VVCFrameParamSets::alf_list
const VVCALF * alf_list[VVC_MAX_ALF_COUNT]
RefStruct reference.
Definition: ps.h:233
H266RawAPS::lmcs_delta_sign_cw_flag
uint8_t lmcs_delta_sign_cw_flag[16]
Definition: cbs_h266.h:638
ph_max_num_subblock_merge_cand
static int ph_max_num_subblock_merge_cand(const H266RawSPS *sps, const H266RawPictureHeader *ph)
Definition: ps.c:818
is_luma_list
static int is_luma_list(const int id)
Definition: ps.c:1093
sh_partition_constraints
static void sh_partition_constraints(VVCSH *sh, const H266RawSPS *sps, const H266RawPictureHeader *ph)
Definition: ps.c:1295
H266RawPredWeightTable
Definition: cbs_h266.h:652
VVCSH::max_tt_size
uint8_t max_tt_size[2]
MaxTtSizeY, MaxTtSizeC.
Definition: ps.h:259
VVC_ASP_TYPE_LMCS
@ VVC_ASP_TYPE_LMCS
Definition: vvc.h:71
VVCParamSets::scaling_list
const VVCScalingList * scaling_list[VVC_MAX_SL_COUNT]
RefStruct reference.
Definition: ps.h:223
H266RawSliceHeader::sh_num_tiles_in_slice_minus1
uint8_t sh_num_tiles_in_slice_minus1
Definition: cbs_h266.h:779
abs
#define abs(x)
Definition: cuda_runtime.h:35
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:511
ph_vb_pos
static int ph_vb_pos(uint16_t *vbs, uint8_t *num_vbs, const uint16_t *pos_minus_1, const uint8_t num_pos, uint16_t max, const int ctb_size_y)
Definition: ps.c:825
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
ff_vvc_scaling_list0
const int ff_vvc_scaling_list0[8 *8]
Definition: data.c:299
alf_free
static void alf_free(AVRefStructOpaque unused, void *obj)
Definition: ps.c:1072
decode_recovery_poc
static void decode_recovery_poc(VVCContext *s, const VVCPH *ph)
Definition: ps.c:943
VVCPH::r
const H266RawPictureHeader * r
Definition: ps.h:148
sps_partition_constraints
static void sps_partition_constraints(VVCSPS *sps)
Definition: ps.c:157
ff_vvc_diag_scan_y
const uint8_t ff_vvc_diag_scan_y[5][5][16 *16]
Definition: data.c:152
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
decode_sps
static int decode_sps(VVCParamSets *ps, const H266RawSPS *rsps, void *log_ctx, int is_clvss)
Definition: ps.c:231
VVCALF::luma_coeff
int16_t luma_coeff[ALF_NUM_FILTERS_LUMA][ALF_NUM_COEFF_LUMA]
Definition: ps.h:173
pps_ref_wraparound_offset
static void pps_ref_wraparound_offset(VVCPPS *pps, const VVCSPS *sps)
Definition: ps.c:548
VVCFrameParamSets::pps
const VVCPPS * pps
RefStruct reference.
Definition: ps.h:231
VVCSH::max_mtt_depth
uint8_t max_mtt_depth[2]
MaxMttDepthY, MaxMttDepthC.
Definition: ps.h:260
HEVCPPS::pps_id
unsigned int pps_id
Definition: ps.h:372
VVCScalingList
Definition: ps.h:196
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
shift
static int shift(int a, int b)
Definition: bonk.c:261
CodedBitstreamH266Context::ph
H266RawPictureHeader * ph
Definition: cbs_h266.h:867
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: ps.c:380
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:515
sample
#define sample
Definition: flacdsp_template.c:44
size
int size
Definition: twinvq_data.h:10344
aps_decode_alf
static int aps_decode_alf(const VVCALF **alf, const H266RawAPS *aps)
Definition: ps.c:1079
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:517
ctu_rs
static int ctu_rs(const int rx, const int ry, const VVCPPS *pps)
Definition: ps.c:351
H266RawAPS::lmcs_min_bin_idx
uint8_t lmcs_min_bin_idx
Definition: cbs_h266.h:634
H266RawSliceHeader::sh_alf_aps_id_chroma
uint8_t sh_alf_aps_id_chroma
Definition: cbs_h266.h:788
sh_derive
static int sh_derive(VVCSH *sh, const VVCFrameParamSets *fps)
Definition: ps.c:1348
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: ps.c:411
IS_CRA
#define IS_CRA(s)
Definition: ps.h:30
next_tile_idx
static int next_tile_idx(int tile_idx, const int i, const H266RawPPS *r)
Definition: ps.c:327
alf_coeff
static void alf_coeff(int16_t *coeff, const uint8_t *abs, const uint8_t *sign, const int size)
Definition: ps.c:996
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:858
VVCSH::deblock
DBParams deblock
Definition: ps.h:254
VVCSH::ctb_addr_in_curr_slice
const uint32_t * ctb_addr_in_curr_slice
CtbAddrInCurrSlice.
Definition: ps.h:244
VVCScalingList::scaling_matrix_dc_rec
uint8_t scaling_matrix_dc_rec[SL_MAX_ID - SL_START_16x16]
ScalingMatrixDcRec[refId − 14].
Definition: ps.h:198
H266RawSliceHeader::sh_alf_cb_enabled_flag
uint8_t sh_alf_cb_enabled_flag
Definition: cbs_h266.h:786
av_refstruct_unref
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition: refstruct.c:120
H266RawSliceHeader::sh_pred_weight_table
H266RawPredWeightTable sh_pred_weight_table
Definition: cbs_h266.h:805
H266RawSliceHeader
Definition: cbs_h266.h:771
VVCLMCS::pivot
uint16_t pivot[LMCS_MAX_BIN_SIZE+1]
Definition: ps.h:210
lmcs_derive_lut
static int lmcs_derive_lut(VVCLMCS *lmcs, const H266RawAPS *rlmcs, const H266RawSPS *sps)
Definition: ps.c:746
pps_chroma_qp_offset
static void pps_chroma_qp_offset(VVCPPS *pps)
Definition: ps.c:259
CR
#define CR
Definition: filter.c:33
pps_derive
static int pps_derive(VVCPPS *pps, const VVCSPS *sps)
Definition: ps.c:574
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
sps_bit_depth
static int sps_bit_depth(VVCSPS *sps, void *log_ctx)
Definition: ps.c:78
H266RawSliceHeader::sh_alf_aps_id_luma
uint8_t sh_alf_aps_id_luma[8]
Definition: cbs_h266.h:785
ff_vvc_diag_scan_x
const uint8_t ff_vvc_diag_scan_x[5][5][16 *16]
Definition: data.c:27
sh_alf_aps
static int sh_alf_aps(const VVCSH *sh, const VVCFrameParamSets *fps)
Definition: ps.c:1202
scaling_derive
static void scaling_derive(VVCScalingList *sl, const H266RawAPS *aps)
Definition: ps.c:1104
CodedBitstreamH266Context::sps
H266RawSPS * sps[VVC_MAX_SPS_COUNT]
RefStruct references.
Definition: cbs_h266.h:865
VVCPH::rref
void * rref
RefStruct reference, backing ph above.
Definition: ps.h:149
ff_vvc_decode_aps
int ff_vvc_decode_aps(VVCParamSets *ps, const CodedBitstreamUnit *unit)
Definition: ps.c:1179
av_always_inline
#define av_always_inline
Definition: attributes.h:49
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: ps.c:404
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
VVCLMCS::fwd_lut
union VVCLMCS::@292 fwd_lut
VVCLMCS::u16
uint16_t u16[LMCS_MAX_LUT_SIZE]
for high bit-depth
Definition: ps.h:207
ph_compute_poc
static int ph_compute_poc(const H266RawPictureHeader *ph, const H266RawSPS *sps, const int poc_tid0, const int is_clvss)
Definition: ps.c:713
ALF_NUM_COEFF_CC
#define ALF_NUM_COEFF_CC
Definition: ps.h:169
H266RawSliceHeader::sh_alf_cc_cb_aps_id
uint8_t sh_alf_cc_cb_aps_id
Definition: cbs_h266.h:790
pps_rect_slice
static int pps_rect_slice(VVCPPS *pps, const VVCSPS *sps)
Definition: ps.c:487
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
GDR_IS_RECOVERED
#define GDR_IS_RECOVERED(s)
Definition: ps.h:43
H266RawAPS::lmcs_delta_sign_crs_flag
uint8_t lmcs_delta_sign_crs_flag
Definition: cbs_h266.h:640
decode_recovery_flag
static void decode_recovery_flag(VVCContext *s)
Definition: ps.c:935
pps_width_height
static void pps_width_height(VVCPPS *pps, const VVCSPS *sps)
Definition: ps.c:271
ff_vvc_ps_uninit
void ff_vvc_ps_uninit(VVCParamSets *ps)
Definition: ps.c:982
VVCALF::r
const H266RawAPS * r
Definition: ps.h:172
ret
ret
Definition: filter_design.txt:187
pred
static const float pred[4]
Definition: siprdata.h:259
ALF_NUM_COEFF_LUMA
#define ALF_NUM_COEFF_LUMA
Definition: ps.h:167
pps_one_tile_slices
static int pps_one_tile_slices(VVCPPS *pps, const int tile_idx, int i, int *off)
Definition: ps.c:446
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:789
SL_START_16x16
@ SL_START_16x16
Definition: ps.h:188
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:514
id
enum AVCodecID id
Definition: dts2pts.c:367
av_refstruct_replace
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition: refstruct.c:160
VVCParamSets::alf_list
const VVCALF * alf_list[VVC_MAX_ALF_COUNT]
RefStruct reference.
Definition: ps.h:221
VVCLMCS::inv_lut
union VVCLMCS::@292 inv_lut
VVCSH::slice_qp_y
int8_t slice_qp_y
SliceQpY.
Definition: ps.h:251
H266RawSPS::sps_num_subpics_minus1
uint16_t sps_num_subpics_minus1
Definition: cbs_h266.h:332
ctu_xy
static void ctu_xy(int *rx, int *ry, const int tile_x, const int tile_y, const VVCPPS *pps)
Definition: ps.c:345
VVC_ASP_TYPE_SCALING
@ VVC_ASP_TYPE_SCALING
Definition: vvc.h:72
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
pps
uint64_t pps
Definition: dovi_rpuenc.c:35
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
alf_luma
static void alf_luma(VVCALF *alf, const H266RawAPS *aps)
Definition: ps.c:1014
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
VVCLMCS::u8
uint8_t u8[LMCS_MAX_LUT_SIZE]
Definition: ps.h:206
ph_derive
static int ph_derive(VVCPH *ph, const H266RawSPS *sps, const H266RawPPS *pps, const int poc_tid0, const int is_clvss)
Definition: ps.c:865
alf_cc
static void alf_cc(VVCALF *alf, const H266RawAPS *aps)
Definition: ps.c:1046
pps_bd
static int pps_bd(VVCPPS *pps)
Definition: ps.c:296
desc
const char * desc
Definition: libsvtav1.c:79
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: ps.h:174
pps_multi_tiles_slice
static int pps_multi_tiles_slice(VVCPPS *pps, const int tile_idx, const int i, int *off, bool *tile_in_slice)
Definition: ps.c:464
sps_alloc
static const VVCSPS * sps_alloc(const H266RawSPS *rsps, void *log_ctx)
Definition: ps.c:210
tile_xy
static void tile_xy(int *tile_x, int *tile_y, const int tile_idx, const VVCPPS *pps)
Definition: ps.c:339
VVCParamSets
Definition: ps.h:218
VVCSH::max_bt_size
uint8_t max_bt_size[2]
MaxBtSizeY, MaxBtSizeC.
Definition: ps.h:258
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
HEVCPPS::sps_id
unsigned int sps_id
seq_parameter_set_id
Definition: ps.h:373
IS_CLVSS
#define IS_CLVSS(s)
Definition: ps.h:34
sps_poc
static void sps_poc(VVCSPS *sps)
Definition: ps.c:136
VVCSPS::r
const H266RawSPS * r
RefStruct reference.
Definition: 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: ps.h:180
H266RawSliceHeader::sh_num_alf_aps_ids_luma
uint8_t sh_num_alf_aps_ids_luma
Definition: cbs_h266.h:784
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
sh_slice_address
static void sh_slice_address(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps)
Definition: ps.c:1235
sps_free
static void sps_free(AVRefStructOpaque opaque, void *obj)
Definition: ps.c:204
SL_START_4x4
@ SL_START_4x4
Definition: ps.h:186
pps_single_slice_per_subpic
static void pps_single_slice_per_subpic(VVCPPS *pps, const VVCSPS *sps, int *off)
Definition: ps.c:436
CodedBitstreamH266Context::ph_ref
void * ph_ref
RefStruct reference backing ph above.
Definition: cbs_h266.h:868
ALF_NUM_FILTERS_LUMA
#define ALF_NUM_FILTERS_LUMA
Definition: ps.h:163
IS_I
#define IS_I(rsh)
Definition: ps.h:38
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: ps.h:257
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
h
h
Definition: vp9dsp_template.c:2070
sps_inter
static void sps_inter(VVCSPS *sps)
Definition: ps.c:141
sh_deblock_offsets
static void sh_deblock_offsets(VVCSH *sh)
Definition: ps.c:1281
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:492
LMCS_MAX_BIT_DEPTH
#define LMCS_MAX_BIT_DEPTH
Definition: ps.h:46
H266RawSliceHeader::sh_alf_cr_enabled_flag
uint8_t sh_alf_cr_enabled_flag
Definition: cbs_h266.h:787
alf_chroma
static void alf_chroma(VVCALF *alf, const H266RawAPS *aps)
Definition: ps.c:1030
VBFS
#define VBFS(c, d)
Definition: ps.c:844
sh_entry_points
static void sh_entry_points(VVCSH *sh, const H266RawSPS *sps, const VVCPPS *pps)
Definition: ps.c:1331
pps_subpic_slice
static void pps_subpic_slice(VVCPPS *pps, const VVCSPS *sps, const int i, int *off)
Definition: ps.c:422
decode_ps
static int decode_ps(VVCParamSets *ps, const CodedBitstreamH266Context *h266, void *log_ctx, int is_clvss)
Definition: ps.c:650
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: ps.h:177
H266RawSPS::sps_subpic_treated_as_pic_flag
uint8_t sps_subpic_treated_as_pic_flag[VVC_MAX_SLICES]
Definition: cbs_h266.h:339
sps_derive
static int sps_derive(VVCSPS *sps, void *log_ctx)
Definition: ps.c:183
VVCParamSets::sps_id_used
uint16_t sps_id_used
Definition: ps.h:226
sps_map_pixel_format
static int sps_map_pixel_format(VVCSPS *sps, void *log_ctx)
Definition: ps.c:33
VVCParamSets::lmcs_list
const H266RawAPS * lmcs_list[VVC_MAX_LMCS_COUNT]
RefStruct reference.
Definition: ps.h:222
ff_vvc_scaling_pred_8
const uint8_t ff_vvc_scaling_pred_8[8 *8]
Definition: data.c:277
MIN_TU_LOG2
#define MIN_TU_LOG2
MinTbLog2SizeY.
Definition: dec.h:39
VVCContext
Definition: dec.h:212
VVCScalingList::scaling_matrix_rec
uint8_t scaling_matrix_rec[SL_MAX_ID][SL_MAX_MATRIX_SIZE *SL_MAX_MATRIX_SIZE]
ScalingMatrixRec.
Definition: ps.h:197
dec.h