FFmpeg
hevcdec.c
Go to the documentation of this file.
1 /*
2  * HEVC video Decoder
3  *
4  * Copyright (C) 2012 - 2013 Guillaume Martres
5  * Copyright (C) 2012 - 2013 Mickael Raulet
6  * Copyright (C) 2012 - 2013 Gildas Cocherel
7  * Copyright (C) 2012 - 2013 Wassim Hamidouche
8  *
9  * This file is part of FFmpeg.
10  *
11  * FFmpeg is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * FFmpeg is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with FFmpeg; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24  */
25 
26 #include "config_components.h"
27 
28 #include "libavutil/attributes.h"
29 #include "libavutil/avstring.h"
30 #include "libavutil/common.h"
33 #include "libavutil/internal.h"
34 #include "libavutil/md5.h"
35 #include "libavutil/mem.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/pixdesc.h"
38 #include "libavutil/stereo3d.h"
39 #include "libavutil/timecode.h"
40 
41 #include "aom_film_grain.h"
42 #include "bswapdsp.h"
43 #include "cabac_functions.h"
44 #include "codec_internal.h"
45 #include "decode.h"
46 #include "golomb.h"
47 #include "hevc.h"
48 #include "parse.h"
49 #include "hevcdec.h"
50 #include "hwaccel_internal.h"
51 #include "hwconfig.h"
52 #include "internal.h"
53 #include "profiles.h"
54 #include "progressframe.h"
55 #include "libavutil/refstruct.h"
56 #include "thread.h"
57 #include "threadprogress.h"
58 
59 static const uint8_t hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
60 
61 /**
62  * NOTE: Each function hls_foo correspond to the function foo in the
63  * specification (HLS stands for High Level Syntax).
64  */
65 
66 /**
67  * Section 5.7
68  */
69 
70 /* free everything allocated by pic_arrays_init() */
72 {
73  av_freep(&l->sao);
74  av_freep(&l->deblock);
75 
76  av_freep(&l->skip_flag);
78 
79  av_freep(&l->tab_ipm);
80  av_freep(&l->cbf_luma);
81  av_freep(&l->is_pcm);
82 
83  av_freep(&l->qp_y_tab);
86 
88  av_freep(&l->vertical_bs);
89 
90  for (int i = 0; i < 3; i++) {
93  }
94 
97 }
98 
99 /* allocate arrays that depend on frame dimensions */
101 {
102  int log2_min_cb_size = sps->log2_min_cb_size;
103  int width = sps->width;
104  int height = sps->height;
105  int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
106  ((height >> log2_min_cb_size) + 1);
107  int ctb_count = sps->ctb_width * sps->ctb_height;
108  int min_pu_size = sps->min_pu_width * sps->min_pu_height;
109 
110  l->bs_width = (width >> 2) + 1;
111  l->bs_height = (height >> 2) + 1;
112 
113  l->sao = av_calloc(ctb_count, sizeof(*l->sao));
114  l->deblock = av_calloc(ctb_count, sizeof(*l->deblock));
115  if (!l->sao || !l->deblock)
116  goto fail;
117 
118  l->skip_flag = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
119  l->tab_ct_depth = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
120  if (!l->skip_flag || !l->tab_ct_depth)
121  goto fail;
122 
123  l->cbf_luma = av_malloc_array(sps->min_tb_width, sps->min_tb_height);
124  l->tab_ipm = av_mallocz(min_pu_size);
125  l->is_pcm = av_malloc_array(sps->min_pu_width + 1, sps->min_pu_height + 1);
126  if (!l->tab_ipm || !l->cbf_luma || !l->is_pcm)
127  goto fail;
128 
129  l->filter_slice_edges = av_mallocz(ctb_count);
130  l->tab_slice_address = av_malloc_array(pic_size_in_ctb,
131  sizeof(*l->tab_slice_address));
132  l->qp_y_tab = av_calloc(pic_size_in_ctb,
133  sizeof(*l->qp_y_tab));
134  if (!l->qp_y_tab || !l->filter_slice_edges || !l->tab_slice_address)
135  goto fail;
136 
139  if (!l->horizontal_bs || !l->vertical_bs)
140  goto fail;
141 
142  l->tab_mvf_pool = av_refstruct_pool_alloc(min_pu_size * sizeof(MvField), 0);
143  l->rpl_tab_pool = av_refstruct_pool_alloc(ctb_count * sizeof(RefPicListTab), 0);
144  if (!l->tab_mvf_pool || !l->rpl_tab_pool)
145  goto fail;
146 
147  if (sps->sao_enabled) {
148  int c_count = (sps->chroma_format_idc != 0) ? 3 : 1;
149 
150  for (int c_idx = 0; c_idx < c_count; c_idx++) {
151  int w = sps->width >> sps->hshift[c_idx];
152  int h = sps->height >> sps->vshift[c_idx];
153  l->sao_pixel_buffer_h[c_idx] =
154  av_malloc((w * 2 * sps->ctb_height) <<
155  sps->pixel_shift);
156  l->sao_pixel_buffer_v[c_idx] =
157  av_malloc((h * 2 * sps->ctb_width) <<
158  sps->pixel_shift);
159  if (!l->sao_pixel_buffer_h[c_idx] ||
160  !l->sao_pixel_buffer_v[c_idx])
161  goto fail;
162  }
163  }
164 
165  return 0;
166 
167 fail:
168  pic_arrays_free(l);
169  return AVERROR(ENOMEM);
170 }
171 
172 static int pred_weight_table(SliceHeader *sh, void *logctx,
173  const HEVCSPS *sps, GetBitContext *gb)
174 {
175  int i = 0;
176  int j = 0;
177  uint8_t luma_weight_l0_flag[16];
178  uint8_t chroma_weight_l0_flag[16];
179  uint8_t luma_weight_l1_flag[16];
180  uint8_t chroma_weight_l1_flag[16];
181  int luma_log2_weight_denom;
182 
183  luma_log2_weight_denom = get_ue_golomb_long(gb);
184  if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
185  av_log(logctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
186  return AVERROR_INVALIDDATA;
187  }
188  sh->luma_log2_weight_denom = av_clip_uintp2(luma_log2_weight_denom, 3);
189  if (sps->chroma_format_idc != 0) {
190  int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)get_se_golomb(gb);
191  if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
192  av_log(logctx, AV_LOG_ERROR, "chroma_log2_weight_denom %"PRId64" is invalid\n", chroma_log2_weight_denom);
193  return AVERROR_INVALIDDATA;
194  }
195  sh->chroma_log2_weight_denom = chroma_log2_weight_denom;
196  }
197 
198  for (i = 0; i < sh->nb_refs[L0]; i++) {
199  luma_weight_l0_flag[i] = get_bits1(gb);
200  if (!luma_weight_l0_flag[i]) {
201  sh->luma_weight_l0[i] = 1 << sh->luma_log2_weight_denom;
202  sh->luma_offset_l0[i] = 0;
203  }
204  }
205  if (sps->chroma_format_idc != 0) {
206  for (i = 0; i < sh->nb_refs[L0]; i++)
207  chroma_weight_l0_flag[i] = get_bits1(gb);
208  } else {
209  for (i = 0; i < sh->nb_refs[L0]; i++)
210  chroma_weight_l0_flag[i] = 0;
211  }
212  for (i = 0; i < sh->nb_refs[L0]; i++) {
213  if (luma_weight_l0_flag[i]) {
214  int delta_luma_weight_l0 = get_se_golomb(gb);
215  if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
216  return AVERROR_INVALIDDATA;
217  sh->luma_weight_l0[i] = (1 << sh->luma_log2_weight_denom) + delta_luma_weight_l0;
218  sh->luma_offset_l0[i] = get_se_golomb(gb);
219  }
220  if (chroma_weight_l0_flag[i]) {
221  for (j = 0; j < 2; j++) {
222  int delta_chroma_weight_l0 = get_se_golomb(gb);
223  int delta_chroma_offset_l0 = get_se_golomb(gb);
224 
225  if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
226  || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
227  return AVERROR_INVALIDDATA;
228  }
229 
230  sh->chroma_weight_l0[i][j] = (1 << sh->chroma_log2_weight_denom) + delta_chroma_weight_l0;
231  sh->chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * sh->chroma_weight_l0[i][j])
232  >> sh->chroma_log2_weight_denom) + 128), -128, 127);
233  }
234  } else {
235  sh->chroma_weight_l0[i][0] = 1 << sh->chroma_log2_weight_denom;
236  sh->chroma_offset_l0[i][0] = 0;
237  sh->chroma_weight_l0[i][1] = 1 << sh->chroma_log2_weight_denom;
238  sh->chroma_offset_l0[i][1] = 0;
239  }
240  }
241  if (sh->slice_type == HEVC_SLICE_B) {
242  for (i = 0; i < sh->nb_refs[L1]; i++) {
243  luma_weight_l1_flag[i] = get_bits1(gb);
244  if (!luma_weight_l1_flag[i]) {
245  sh->luma_weight_l1[i] = 1 << sh->luma_log2_weight_denom;
246  sh->luma_offset_l1[i] = 0;
247  }
248  }
249  if (sps->chroma_format_idc != 0) {
250  for (i = 0; i < sh->nb_refs[L1]; i++)
251  chroma_weight_l1_flag[i] = get_bits1(gb);
252  } else {
253  for (i = 0; i < sh->nb_refs[L1]; i++)
254  chroma_weight_l1_flag[i] = 0;
255  }
256  for (i = 0; i < sh->nb_refs[L1]; i++) {
257  if (luma_weight_l1_flag[i]) {
258  int delta_luma_weight_l1 = get_se_golomb(gb);
259  if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
260  return AVERROR_INVALIDDATA;
261  sh->luma_weight_l1[i] = (1 << sh->luma_log2_weight_denom) + delta_luma_weight_l1;
262  sh->luma_offset_l1[i] = get_se_golomb(gb);
263  }
264  if (chroma_weight_l1_flag[i]) {
265  for (j = 0; j < 2; j++) {
266  int delta_chroma_weight_l1 = get_se_golomb(gb);
267  int delta_chroma_offset_l1 = get_se_golomb(gb);
268 
269  if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
270  || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
271  return AVERROR_INVALIDDATA;
272  }
273 
274  sh->chroma_weight_l1[i][j] = (1 << sh->chroma_log2_weight_denom) + delta_chroma_weight_l1;
275  sh->chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * sh->chroma_weight_l1[i][j])
276  >> sh->chroma_log2_weight_denom) + 128), -128, 127);
277  }
278  } else {
279  sh->chroma_weight_l1[i][0] = 1 << sh->chroma_log2_weight_denom;
280  sh->chroma_offset_l1[i][0] = 0;
281  sh->chroma_weight_l1[i][1] = 1 << sh->chroma_log2_weight_denom;
282  sh->chroma_offset_l1[i][1] = 0;
283  }
284  }
285  }
286  return 0;
287 }
288 
289 static int decode_lt_rps(const HEVCSPS *sps, LongTermRPS *rps,
290  GetBitContext *gb, int cur_poc, int poc_lsb)
291 {
292  int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
293  int prev_delta_msb = 0;
294  unsigned int nb_sps = 0, nb_sh;
295  int i;
296 
297  rps->nb_refs = 0;
298  if (!sps->long_term_ref_pics_present)
299  return 0;
300 
301  if (sps->num_long_term_ref_pics_sps > 0)
302  nb_sps = get_ue_golomb_long(gb);
303  nb_sh = get_ue_golomb_long(gb);
304 
305  if (nb_sps > sps->num_long_term_ref_pics_sps)
306  return AVERROR_INVALIDDATA;
307  if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))
308  return AVERROR_INVALIDDATA;
309 
310  rps->nb_refs = nb_sh + nb_sps;
311 
312  for (i = 0; i < rps->nb_refs; i++) {
313 
314  if (i < nb_sps) {
315  uint8_t lt_idx_sps = 0;
316 
317  if (sps->num_long_term_ref_pics_sps > 1)
318  lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
319 
320  rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
321  rps->used[i] = !!(sps->used_by_curr_pic_lt & (1U << lt_idx_sps));
322  } else {
323  rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
324  rps->used[i] = get_bits1(gb);
325  }
326 
327  rps->poc_msb_present[i] = get_bits1(gb);
328  if (rps->poc_msb_present[i]) {
330  int64_t poc;
331 
332  if (i && i != nb_sps)
333  delta += prev_delta_msb;
334 
335  poc = rps->poc[i] + cur_poc - delta * max_poc_lsb - poc_lsb;
336  if (poc != (int32_t)poc)
337  return AVERROR_INVALIDDATA;
338  rps->poc[i] = poc;
339  prev_delta_msb = delta;
340  }
341  }
342 
343  return 0;
344 }
345 
347 {
348  AVCodecContext *avctx = s->avctx;
349  const HEVCVPS *vps = sps->vps;
350  const HEVCWindow *ow = &sps->output_window;
351  unsigned int num = 0, den = 0;
352 
353  avctx->pix_fmt = sps->pix_fmt;
354  avctx->coded_width = sps->width;
355  avctx->coded_height = sps->height;
356  avctx->width = sps->width - ow->left_offset - ow->right_offset;
357  avctx->height = sps->height - ow->top_offset - ow->bottom_offset;
358  avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
359  avctx->profile = sps->ptl.general_ptl.profile_idc;
360  avctx->level = sps->ptl.general_ptl.level_idc;
361 
362  ff_set_sar(avctx, sps->vui.common.sar);
363 
364  if (sps->vui.common.video_signal_type_present_flag)
365  avctx->color_range = sps->vui.common.video_full_range_flag ? AVCOL_RANGE_JPEG
367  else
368  avctx->color_range = AVCOL_RANGE_MPEG;
369 
370  if (sps->vui.common.colour_description_present_flag) {
371  avctx->color_primaries = sps->vui.common.colour_primaries;
372  avctx->color_trc = sps->vui.common.transfer_characteristics;
373  avctx->colorspace = sps->vui.common.matrix_coeffs;
374  } else {
378  }
379 
381  if (sps->chroma_format_idc == 1) {
382  if (sps->vui.common.chroma_loc_info_present_flag) {
383  if (sps->vui.common.chroma_sample_loc_type_top_field <= 5)
384  avctx->chroma_sample_location = sps->vui.common.chroma_sample_loc_type_top_field + 1;
385  } else
387  }
388 
389  if (vps->vps_timing_info_present_flag) {
390  num = vps->vps_num_units_in_tick;
391  den = vps->vps_time_scale;
392  } else if (sps->vui.vui_timing_info_present_flag) {
393  num = sps->vui.vui_num_units_in_tick;
394  den = sps->vui.vui_time_scale;
395  }
396 
397  if (num > 0 && den > 0)
398  av_reduce(&avctx->framerate.den, &avctx->framerate.num,
399  num, den, 1 << 30);
400 }
401 
403 {
404  AVCodecContext *avctx = s->avctx;
405 
406 #if FF_API_CODEC_PROPS
408  if (s->sei.common.a53_caption.buf_ref)
409  s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
411 #endif
412 
413  if (s->sei.common.alternative_transfer.present &&
414  av_color_transfer_name(s->sei.common.alternative_transfer.preferred_transfer_characteristics) &&
415  s->sei.common.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
416  avctx->color_trc = s->sei.common.alternative_transfer.preferred_transfer_characteristics;
417  }
418 
419 #if FF_API_CODEC_PROPS
421  if ((s->sei.common.film_grain_characteristics && s->sei.common.film_grain_characteristics->present) ||
422  s->sei.common.aom_film_grain.enable)
425 #endif
426 
427  return 0;
428 }
429 
431 {
432  const HEVCSEITDRDI *tdrdi = &s->sei.tdrdi;
433 
434  av_freep(&s->view_ids_available);
435  s->nb_view_ids_available = 0;
436  av_freep(&s->view_pos_available);
437  s->nb_view_pos_available = 0;
438 
439  // don't export anything in the trivial case (1 layer, view id=0)
440  if (vps->nb_layers < 2 && !vps->view_id[0])
441  return 0;
442 
443  s->view_ids_available = av_calloc(vps->nb_layers, sizeof(*s->view_ids_available));
444  if (!s->view_ids_available)
445  return AVERROR(ENOMEM);
446 
447  if (tdrdi->num_ref_displays) {
448  s->view_pos_available = av_calloc(vps->nb_layers, sizeof(*s->view_pos_available));
449  if (!s->view_pos_available)
450  return AVERROR(ENOMEM);
451  }
452 
453  for (int i = 0; i < vps->nb_layers; i++) {
454  s->view_ids_available[i] = vps->view_id[i];
455 
456  if (s->view_pos_available) {
457  s->view_pos_available[i] = vps->view_id[i] == tdrdi->left_view_id[0] ?
459  vps->view_id[i] == tdrdi->right_view_id[0] ?
461  }
462  }
463  s->nb_view_ids_available = vps->nb_layers;
464  s->nb_view_pos_available = s->view_pos_available ? vps->nb_layers : 0;
465 
466  return 0;
467 }
468 
470 {
471  const HEVCVPS *vps = s->vps;
472  int ret = 0;
473 
474  if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
475  return 0;
476 
477  /* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId other
478  * than alpha cannot reach here.
479  */
480  ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
481 
482  av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
483  ret ? "is" : "not");
484 
485  return ret;
486 }
487 
489 {
490  unsigned layers_active_output = 0, highest_layer;
491 
492  s->layers_active_output = 1;
493  s->layers_active_decode = 1;
494 
495  if (ff_hevc_is_alpha_video(s)) {
496  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
497 
498  if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
499  return 0;
500 
501  s->layers_active_decode = (1 << vps->nb_layers) - 1;
502  s->layers_active_output = 1;
503 
504  return 0;
505  }
506 
507  // nothing requested - decode base layer only
508  if (!s->nb_view_ids)
509  return 0;
510 
511  if (s->nb_view_ids == 1 && s->view_ids[0] == -1) {
512  layers_active_output = (1 << vps->nb_layers) - 1;
513  } else {
514  for (int i = 0; i < s->nb_view_ids; i++) {
515  int view_id = s->view_ids[i];
516  int layer_idx = -1;
517 
518  if (view_id < 0) {
519  av_log(s->avctx, AV_LOG_ERROR,
520  "Invalid view ID requested: %d\n", view_id);
521  return AVERROR(EINVAL);
522  }
523 
524  for (int j = 0; j < vps->nb_layers; j++) {
525  if (vps->view_id[j] == view_id) {
526  layer_idx = j;
527  break;
528  }
529  }
530  if (layer_idx < 0) {
531  av_log(s->avctx, AV_LOG_ERROR,
532  "View ID %d not present in VPS\n", view_id);
533  return AVERROR(EINVAL);
534  }
535  layers_active_output |= 1 << layer_idx;
536  }
537  }
538 
539  if (!layers_active_output) {
540  av_log(s->avctx, AV_LOG_ERROR, "No layers selected\n");
541  return AVERROR_BUG;
542  }
543 
544  highest_layer = ff_log2(layers_active_output);
545  if (highest_layer >= FF_ARRAY_ELEMS(s->layers)) {
546  av_log(s->avctx, AV_LOG_ERROR,
547  "Too many layers requested: %u\n", layers_active_output);
548  return AVERROR(EINVAL);
549  }
550 
551  /* Assume a higher layer depends on all the lower ones.
552  * This is enforced in VPS parsing currently, this logic will need
553  * to be changed if we want to support more complex dependency structures.
554  */
555  s->layers_active_decode = (1 << (highest_layer + 1)) - 1;
556  s->layers_active_output = layers_active_output;
557 
558  av_log(s->avctx, AV_LOG_DEBUG, "decode/output layers: %x/%x\n",
559  s->layers_active_decode, s->layers_active_output);
560 
561  return 0;
562 }
563 
565  enum AVPixelFormat pix_fmt)
566 {
567  switch (pix_fmt) {
568  case AV_PIX_FMT_YUV420P:
569  case AV_PIX_FMT_YUVJ420P:
570  return AV_PIX_FMT_YUVA420P;
572  return AV_PIX_FMT_YUVA420P10;
573  case AV_PIX_FMT_YUV444P:
574  return AV_PIX_FMT_YUVA444P;
575  case AV_PIX_FMT_YUV422P:
576  return AV_PIX_FMT_YUVA422P;
580  return AV_PIX_FMT_YUVA444P10;
582  return AV_PIX_FMT_YUVA444P12;
584  return AV_PIX_FMT_YUVA422P12;
585  default:
586  av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for %s\n",
588  return AV_PIX_FMT_NONE;
589  }
590 }
591 
593 {
594 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
595  CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
596  CONFIG_HEVC_D3D12VA_HWACCEL + \
597  CONFIG_HEVC_NVDEC_HWACCEL + \
598  CONFIG_HEVC_VAAPI_HWACCEL + \
599  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
600  CONFIG_HEVC_VDPAU_HWACCEL + \
601  CONFIG_HEVC_VULKAN_HWACCEL)
602  enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
603  enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
604  int ret;
605 
607  alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
608 
609  switch (sps->pix_fmt) {
610  case AV_PIX_FMT_YUV420P:
611  case AV_PIX_FMT_YUVJ420P:
612 #if CONFIG_HEVC_DXVA2_HWACCEL
613  *fmt++ = AV_PIX_FMT_DXVA2_VLD;
614 #endif
615 #if CONFIG_HEVC_D3D11VA_HWACCEL
616  *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
617  *fmt++ = AV_PIX_FMT_D3D11;
618 #endif
619 #if CONFIG_HEVC_D3D12VA_HWACCEL
620  *fmt++ = AV_PIX_FMT_D3D12;
621 #endif
622 #if CONFIG_HEVC_VAAPI_HWACCEL
623  *fmt++ = AV_PIX_FMT_VAAPI;
624 #endif
625 #if CONFIG_HEVC_VDPAU_HWACCEL
626  *fmt++ = AV_PIX_FMT_VDPAU;
627 #endif
628 #if CONFIG_HEVC_NVDEC_HWACCEL
629  *fmt++ = AV_PIX_FMT_CUDA;
630 #endif
631 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
632  *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
633 #endif
634 #if CONFIG_HEVC_VULKAN_HWACCEL
635  *fmt++ = AV_PIX_FMT_VULKAN;
636 #endif
637  break;
639 #if CONFIG_HEVC_DXVA2_HWACCEL
640  *fmt++ = AV_PIX_FMT_DXVA2_VLD;
641 #endif
642 #if CONFIG_HEVC_D3D11VA_HWACCEL
643  *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
644  *fmt++ = AV_PIX_FMT_D3D11;
645 #endif
646 #if CONFIG_HEVC_D3D12VA_HWACCEL
647  *fmt++ = AV_PIX_FMT_D3D12;
648 #endif
649 #if CONFIG_HEVC_VAAPI_HWACCEL
650  *fmt++ = AV_PIX_FMT_VAAPI;
651 #endif
652 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
653  *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
654 #endif
655 #if CONFIG_HEVC_VULKAN_HWACCEL
656  *fmt++ = AV_PIX_FMT_VULKAN;
657 #endif
658 #if CONFIG_HEVC_VDPAU_HWACCEL
659  *fmt++ = AV_PIX_FMT_VDPAU;
660 #endif
661 #if CONFIG_HEVC_NVDEC_HWACCEL
662  *fmt++ = AV_PIX_FMT_CUDA;
663 #endif
664  break;
665  case AV_PIX_FMT_YUV444P:
666 #if CONFIG_HEVC_VAAPI_HWACCEL
667  *fmt++ = AV_PIX_FMT_VAAPI;
668 #endif
669 #if CONFIG_HEVC_VDPAU_HWACCEL
670  *fmt++ = AV_PIX_FMT_VDPAU;
671 #endif
672 #if CONFIG_HEVC_NVDEC_HWACCEL
673  *fmt++ = AV_PIX_FMT_CUDA;
674 #endif
675 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
676  *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
677 #endif
678 #if CONFIG_HEVC_VULKAN_HWACCEL
679  *fmt++ = AV_PIX_FMT_VULKAN;
680 #endif
681  break;
682  case AV_PIX_FMT_YUV422P:
684 #if CONFIG_HEVC_VAAPI_HWACCEL
685  *fmt++ = AV_PIX_FMT_VAAPI;
686 #endif
687 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
688  *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
689 #endif
690 #if CONFIG_HEVC_VULKAN_HWACCEL
691  *fmt++ = AV_PIX_FMT_VULKAN;
692 #endif
693 #if CONFIG_HEVC_NVDEC_HWACCEL
694  *fmt++ = AV_PIX_FMT_CUDA;
695 #endif
696  break;
698 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
699  *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
700 #endif
701  /* NOTE: fallthrough */
704 #if CONFIG_HEVC_VAAPI_HWACCEL
705  *fmt++ = AV_PIX_FMT_VAAPI;
706 #endif
707 #if CONFIG_HEVC_VDPAU_HWACCEL
708  *fmt++ = AV_PIX_FMT_VDPAU;
709 #endif
710 #if CONFIG_HEVC_VULKAN_HWACCEL
711  *fmt++ = AV_PIX_FMT_VULKAN;
712 #endif
713 #if CONFIG_HEVC_NVDEC_HWACCEL
714  *fmt++ = AV_PIX_FMT_CUDA;
715 #endif
716  break;
718 #if CONFIG_HEVC_VAAPI_HWACCEL
719  *fmt++ = AV_PIX_FMT_VAAPI;
720 #endif
721 #if CONFIG_HEVC_VULKAN_HWACCEL
722  *fmt++ = AV_PIX_FMT_VULKAN;
723 #endif
724 #if CONFIG_HEVC_NVDEC_HWACCEL
725  *fmt++ = AV_PIX_FMT_CUDA;
726 #endif
727  break;
728  }
729 
730  if (alpha_fmt != AV_PIX_FMT_NONE)
731  *fmt++ = alpha_fmt;
732  *fmt++ = sps->pix_fmt;
733  *fmt = AV_PIX_FMT_NONE;
734 
735  // export multilayer information from active VPS to the caller,
736  // so it is available in get_format()
737  ret = export_multilayer(s, sps->vps);
738  if (ret < 0)
739  return ret;
740 
741  ret = ff_get_format(s->avctx, pix_fmts);
742  if (ret < 0)
743  return ret;
744  s->avctx->pix_fmt = ret;
745 
746  // set up multilayer decoding, if requested by caller
747  ret = setup_multilayer(s, sps->vps);
748  if (ret < 0)
749  return ret;
750 
751  return 0;
752 }
753 
755 {
756  int ret;
757 
758  pic_arrays_free(l);
759  av_refstruct_unref(&l->sps);
760  av_refstruct_unref(&s->vps);
761 
762  if (!sps)
763  return 0;
764 
765  ret = pic_arrays_init(l, sps);
766  if (ret < 0)
767  goto fail;
768 
769  ff_hevc_pred_init(&s->hpc, sps->bit_depth);
770  ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
771  ff_videodsp_init (&s->vdsp, sps->bit_depth);
772 
773  l->sps = av_refstruct_ref_c(sps);
774  s->vps = av_refstruct_ref_c(sps->vps);
775 
776  return 0;
777 
778 fail:
779  pic_arrays_free(l);
780  av_refstruct_unref(&l->sps);
781  return ret;
782 }
783 
785 {
786  const HEVCPPS *pps;
787  const HEVCSPS *sps;
788  const HEVCVPS *vps;
789  unsigned pps_id, layer_idx;
790  int i, ret;
791 
792  // Coded parameters
794 
796  if (IS_IRAP(s))
798 
799  pps_id = get_ue_golomb_long(gb);
800  if (pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[pps_id]) {
801  av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id);
802  return AVERROR_INVALIDDATA;
803  }
804  if (!sh->first_slice_in_pic_flag && s->ps.pps_list[pps_id] != s->pps) {
805  av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
806  return AVERROR_INVALIDDATA;
807  }
808  sh->pps_id = pps_id;
809 
810  pps = s->ps.pps_list[pps_id];
811  sps = pps->sps;
812  vps = sps->vps;
813  layer_idx = vps->layer_idx[s->nuh_layer_id];
814 
815  if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1)
817 
819  if (!sh->first_slice_in_pic_flag) {
820  int slice_address_length;
821 
822  if (pps->dependent_slice_segments_enabled_flag)
824  if (sh->dependent_slice_segment_flag && !s->slice_initialized) {
825  av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
826  return AVERROR_INVALIDDATA;
827  }
828 
829  slice_address_length = av_ceil_log2(sps->ctb_width *
830  sps->ctb_height);
831  sh->slice_segment_addr = get_bitsz(gb, slice_address_length);
832  if (sh->slice_segment_addr >= sps->ctb_width * sps->ctb_height) {
833  av_log(s->avctx, AV_LOG_ERROR,
834  "Invalid slice segment address: %u.\n",
835  sh->slice_segment_addr);
836  return AVERROR_INVALIDDATA;
837  }
838 
839  if (!sh->dependent_slice_segment_flag) {
840  sh->slice_addr = sh->slice_segment_addr;
841  }
842  } else {
843  sh->slice_segment_addr = sh->slice_addr = 0;
844  }
845 
846  if (!sh->dependent_slice_segment_flag) {
847  for (i = 0; i < pps->num_extra_slice_header_bits; i++)
848  skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
849 
850  sh->slice_type = get_ue_golomb_long(gb);
851  if (!(sh->slice_type == HEVC_SLICE_I ||
852  sh->slice_type == HEVC_SLICE_P ||
853  sh->slice_type == HEVC_SLICE_B)) {
854  av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
855  sh->slice_type);
856  return AVERROR_INVALIDDATA;
857  }
858  if (IS_IRAP(s) && sh->slice_type != HEVC_SLICE_I &&
859  !pps->pps_curr_pic_ref_enabled_flag &&
860  s->nuh_layer_id == 0) {
861  av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
862  return AVERROR_INVALIDDATA;
863  }
864 
865  // when flag is not present, picture is inferred to be output
866  sh->pic_output_flag = 1;
867  if (pps->output_flag_present_flag)
868  sh->pic_output_flag = get_bits1(gb);
869 
870  if (sps->separate_colour_plane)
871  sh->colour_plane_id = get_bits(gb, 2);
872 
873  if (!IS_IDR(s) ||
874  (s->nuh_layer_id > 0 &&
875  !(vps->poc_lsb_not_present & (1 << layer_idx)))) {
876  int poc;
877 
878  sh->pic_order_cnt_lsb = get_bits(gb, sps->log2_max_poc_lsb);
879  poc = ff_hevc_compute_poc(sps, s->poc_tid0, sh->pic_order_cnt_lsb, s->nal_unit_type);
880  if (!sh->first_slice_in_pic_flag && poc != sh->poc) {
881  av_log(s->avctx, AV_LOG_WARNING,
882  "Ignoring POC change between slices: %d -> %d\n", poc, sh->poc);
883  if (s->avctx->err_recognition & AV_EF_EXPLODE)
884  return AVERROR_INVALIDDATA;
885  poc = sh->poc;
886  }
887  sh->poc = poc;
888  }
889 
890  if (!IS_IDR(s)) {
891  int pos;
892 
894  pos = get_bits_left(gb);
896  ret = ff_hevc_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, sps, 1);
897  if (ret < 0)
898  return ret;
899 
900  sh->short_term_rps = &sh->slice_rps;
901  } else {
902  int numbits, rps_idx;
903 
904  if (!sps->nb_st_rps) {
905  av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
906  return AVERROR_INVALIDDATA;
907  }
908 
909  numbits = av_ceil_log2(sps->nb_st_rps);
910  rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
911  sh->short_term_rps = &sps->st_rps[rps_idx];
912  }
914 
915  pos = get_bits_left(gb);
916  ret = decode_lt_rps(sps, &sh->long_term_rps, gb, sh->poc, sh->pic_order_cnt_lsb);
917  if (ret < 0) {
918  av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
919  if (s->avctx->err_recognition & AV_EF_EXPLODE)
920  return AVERROR_INVALIDDATA;
921  }
923 
924  if (sps->temporal_mvp_enabled)
926  else
928  } else {
929  sh->poc = 0;
930  sh->pic_order_cnt_lsb = 0;
933  sh->short_term_rps = NULL;
936  }
937 
938  sh->inter_layer_pred = 0;
939  if (s->nuh_layer_id > 0) {
940  int num_direct_ref_layers = vps->num_direct_ref_layers[layer_idx];
941 
942  if (vps->default_ref_layers_active)
943  sh->inter_layer_pred = !!num_direct_ref_layers;
944  else if (num_direct_ref_layers) {
945  sh->inter_layer_pred = get_bits1(gb);
946 
947  if (sh->inter_layer_pred && num_direct_ref_layers > 1) {
948  av_log(s->avctx, AV_LOG_ERROR,
949  "NumDirectRefLayers>1 not supported\n");
950  return AVERROR_PATCHWELCOME;
951  }
952  }
953  }
954 
955  if (sps->sao_enabled) {
957  if (sps->chroma_format_idc) {
960  }
961  } else {
965  }
966 
967  sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
968  if (sh->slice_type == HEVC_SLICE_P || sh->slice_type == HEVC_SLICE_B) {
969  int nb_refs;
970 
971  sh->nb_refs[L0] = pps->num_ref_idx_l0_default_active;
972  if (sh->slice_type == HEVC_SLICE_B)
973  sh->nb_refs[L1] = pps->num_ref_idx_l1_default_active;
974 
975  if (get_bits1(gb)) { // num_ref_idx_active_override_flag
976  sh->nb_refs[L0] = get_ue_golomb_31(gb) + 1;
977  if (sh->slice_type == HEVC_SLICE_B)
978  sh->nb_refs[L1] = get_ue_golomb_31(gb) + 1;
979  }
980  if (sh->nb_refs[L0] >= HEVC_MAX_REFS || sh->nb_refs[L1] >= HEVC_MAX_REFS) {
981  av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
982  sh->nb_refs[L0], sh->nb_refs[L1]);
983  return AVERROR_INVALIDDATA;
984  }
985 
986  sh->rpl_modification_flag[0] = 0;
987  sh->rpl_modification_flag[1] = 0;
988  nb_refs = ff_hevc_frame_nb_refs(sh, pps, layer_idx);
989  if (!nb_refs) {
990  av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
991  return AVERROR_INVALIDDATA;
992  }
993 
994  if (pps->lists_modification_present_flag && nb_refs > 1) {
995  sh->rpl_modification_flag[0] = get_bits1(gb);
996  if (sh->rpl_modification_flag[0]) {
997  for (i = 0; i < sh->nb_refs[L0]; i++)
998  sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
999  }
1000 
1001  if (sh->slice_type == HEVC_SLICE_B) {
1002  sh->rpl_modification_flag[1] = get_bits1(gb);
1003  if (sh->rpl_modification_flag[1] == 1)
1004  for (i = 0; i < sh->nb_refs[L1]; i++)
1005  sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
1006  }
1007  }
1008 
1009  if (sh->slice_type == HEVC_SLICE_B)
1010  sh->mvd_l1_zero_flag = get_bits1(gb);
1011 
1012  if (pps->cabac_init_present_flag)
1013  sh->cabac_init_flag = get_bits1(gb);
1014  else
1015  sh->cabac_init_flag = 0;
1016 
1017  sh->collocated_ref_idx = 0;
1019  sh->collocated_list = L0;
1020  if (sh->slice_type == HEVC_SLICE_B)
1021  sh->collocated_list = !get_bits1(gb);
1022 
1023  if (sh->nb_refs[sh->collocated_list] > 1) {
1025  if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
1026  av_log(s->avctx, AV_LOG_ERROR,
1027  "Invalid collocated_ref_idx: %d.\n",
1028  sh->collocated_ref_idx);
1029  return AVERROR_INVALIDDATA;
1030  }
1031  }
1032  }
1033 
1034  if ((pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) ||
1035  (pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) {
1036  int ret = pred_weight_table(sh, s->avctx, sps, gb);
1037  if (ret < 0)
1038  return ret;
1039  }
1040 
1041  sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
1042  if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
1043  av_log(s->avctx, AV_LOG_ERROR,
1044  "Invalid number of merging MVP candidates: %d.\n",
1045  sh->max_num_merge_cand);
1046  return AVERROR_INVALIDDATA;
1047  }
1048 
1049  // Syntax in 7.3.6.1
1050  if (sps->motion_vector_resolution_control_idc == 2)
1051  sh->use_integer_mv_flag = get_bits1(gb);
1052  else
1053  // Inferred to be equal to motion_vector_resolution_control_idc if not present
1054  sh->use_integer_mv_flag = sps->motion_vector_resolution_control_idc;
1055 
1056  }
1057 
1058  sh->slice_qp_delta = get_se_golomb(gb);
1059 
1060  if (pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1063  if (sh->slice_cb_qp_offset < -12 || sh->slice_cb_qp_offset > 12 ||
1064  sh->slice_cr_qp_offset < -12 || sh->slice_cr_qp_offset > 12) {
1065  av_log(s->avctx, AV_LOG_ERROR, "Invalid slice cx qp offset.\n");
1066  return AVERROR_INVALIDDATA;
1067  }
1068  } else {
1069  sh->slice_cb_qp_offset = 0;
1070  sh->slice_cr_qp_offset = 0;
1071  }
1072 
1073  if (pps->pps_slice_act_qp_offsets_present_flag) {
1077  }
1078 
1079  if (pps->chroma_qp_offset_list_enabled_flag)
1081  else
1083 
1084  if (pps->deblocking_filter_control_present_flag) {
1085  int deblocking_filter_override_flag = 0;
1086 
1087  if (pps->deblocking_filter_override_enabled_flag)
1088  deblocking_filter_override_flag = get_bits1(gb);
1089 
1090  if (deblocking_filter_override_flag) {
1092  if (!sh->disable_deblocking_filter_flag) {
1093  int beta_offset_div2 = get_se_golomb(gb);
1094  int tc_offset_div2 = get_se_golomb(gb) ;
1095  if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
1096  tc_offset_div2 < -6 || tc_offset_div2 > 6) {
1097  av_log(s->avctx, AV_LOG_ERROR,
1098  "Invalid deblock filter offsets: %d, %d\n",
1099  beta_offset_div2, tc_offset_div2);
1100  return AVERROR_INVALIDDATA;
1101  }
1102  sh->beta_offset = beta_offset_div2 * 2;
1103  sh->tc_offset = tc_offset_div2 * 2;
1104  }
1105  } else {
1106  sh->disable_deblocking_filter_flag = pps->disable_dbf;
1107  sh->beta_offset = pps->beta_offset;
1108  sh->tc_offset = pps->tc_offset;
1109  }
1110  } else {
1112  sh->beta_offset = 0;
1113  sh->tc_offset = 0;
1114  }
1115 
1116  if (pps->seq_loop_filter_across_slices_enabled_flag &&
1121  } else {
1122  sh->slice_loop_filter_across_slices_enabled_flag = pps->seq_loop_filter_across_slices_enabled_flag;
1123  }
1124  }
1125 
1126  sh->num_entry_point_offsets = 0;
1127  if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) {
1128  unsigned num_entry_point_offsets = get_ue_golomb_long(gb);
1129  // It would be possible to bound this tighter but this here is simpler
1130  if (num_entry_point_offsets > get_bits_left(gb)) {
1131  av_log(s->avctx, AV_LOG_ERROR, "num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
1132  return AVERROR_INVALIDDATA;
1133  }
1134 
1135  sh->num_entry_point_offsets = num_entry_point_offsets;
1136  if (sh->num_entry_point_offsets > 0) {
1137  int offset_len = get_ue_golomb_long(gb) + 1;
1138 
1139  if (offset_len < 1 || offset_len > 32) {
1140  sh->num_entry_point_offsets = 0;
1141  av_log(s->avctx, AV_LOG_ERROR, "offset_len %d is invalid\n", offset_len);
1142  return AVERROR_INVALIDDATA;
1143  }
1144 
1146  av_freep(&sh->offset);
1147  av_freep(&sh->size);
1148  sh->entry_point_offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(unsigned));
1149  sh->offset = av_malloc_array(sh->num_entry_point_offsets + 1, sizeof(int));
1150  sh->size = av_malloc_array(sh->num_entry_point_offsets + 1, sizeof(int));
1151  if (!sh->entry_point_offset || !sh->offset || !sh->size) {
1152  sh->num_entry_point_offsets = 0;
1153  av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
1154  return AVERROR(ENOMEM);
1155  }
1156  for (i = 0; i < sh->num_entry_point_offsets; i++) {
1157  unsigned val = get_bits_long(gb, offset_len);
1158  sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size
1159  }
1160  }
1161  }
1162 
1163  if (pps->slice_header_extension_present_flag) {
1164  unsigned int length = get_ue_golomb_long(gb);
1165  if (length*8LL > get_bits_left(gb)) {
1166  av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n");
1167  return AVERROR_INVALIDDATA;
1168  }
1169  for (i = 0; i < length; i++)
1170  skip_bits(gb, 8); // slice_header_extension_data_byte
1171  }
1172 
1173  ret = get_bits1(gb);
1174  if (!ret) {
1175  av_log(s->avctx, AV_LOG_ERROR, "alignment_bit_equal_to_one=0\n");
1176  return AVERROR_INVALIDDATA;
1177  }
1178  sh->data_offset = align_get_bits(gb) - gb->buffer;
1179 
1180  // Inferred parameters
1181  sh->slice_qp = 26U + pps->pic_init_qp_minus26 + sh->slice_qp_delta;
1182  if (sh->slice_qp > 51 ||
1183  sh->slice_qp < -sps->qp_bd_offset) {
1184  av_log(s->avctx, AV_LOG_ERROR,
1185  "The slice_qp %d is outside the valid range "
1186  "[%d, 51].\n",
1187  sh->slice_qp,
1188  -sps->qp_bd_offset);
1189  return AVERROR_INVALIDDATA;
1190  }
1191 
1193 
1194  if (sh->dependent_slice_segment_flag &&
1195  (!sh->slice_ctb_addr_rs || !pps->ctb_addr_rs_to_ts[sh->slice_ctb_addr_rs])) {
1196  av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
1197  return AVERROR_INVALIDDATA;
1198  }
1199 
1200  if (get_bits_left(gb) < 0) {
1201  av_log(s->avctx, AV_LOG_ERROR,
1202  "Overread slice header by %d bits\n", -get_bits_left(gb));
1203  return AVERROR_INVALIDDATA;
1204  }
1205 
1206  return 0;
1207 }
1208 
1209 #define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)])
1210 
1211 #define SET_SAO(elem, value) \
1212 do { \
1213  if (!sao_merge_up_flag && !sao_merge_left_flag) \
1214  sao->elem = value; \
1215  else if (sao_merge_left_flag) \
1216  sao->elem = CTB(l->sao, rx-1, ry).elem; \
1217  else if (sao_merge_up_flag) \
1218  sao->elem = CTB(l->sao, rx, ry-1).elem; \
1219  else \
1220  sao->elem = 0; \
1221 } while (0)
1222 
1224  const HEVCPPS *pps, const HEVCSPS *sps,
1225  int rx, int ry)
1226 {
1227  const HEVCContext *const s = lc->parent;
1228  int sao_merge_left_flag = 0;
1229  int sao_merge_up_flag = 0;
1230  SAOParams *sao = &CTB(l->sao, rx, ry);
1231  int c_idx, i;
1232 
1233  if (s->sh.slice_sample_adaptive_offset_flag[0] ||
1234  s->sh.slice_sample_adaptive_offset_flag[1]) {
1235  if (rx > 0) {
1236  if (lc->ctb_left_flag)
1237  sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(lc);
1238  }
1239  if (ry > 0 && !sao_merge_left_flag) {
1240  if (lc->ctb_up_flag)
1241  sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(lc);
1242  }
1243  }
1244 
1245  for (c_idx = 0; c_idx < (sps->chroma_format_idc ? 3 : 1); c_idx++) {
1246  int log2_sao_offset_scale = c_idx == 0 ? pps->log2_sao_offset_scale_luma :
1247  pps->log2_sao_offset_scale_chroma;
1248 
1249  if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1250  sao->type_idx[c_idx] = SAO_NOT_APPLIED;
1251  continue;
1252  }
1253 
1254  if (c_idx == 2) {
1255  sao->type_idx[2] = sao->type_idx[1];
1256  sao->eo_class[2] = sao->eo_class[1];
1257  } else {
1258  SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(lc));
1259  }
1260 
1261  if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
1262  continue;
1263 
1264  for (i = 0; i < 4; i++)
1265  SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(lc, sps->bit_depth));
1266 
1267  if (sao->type_idx[c_idx] == SAO_BAND) {
1268  for (i = 0; i < 4; i++) {
1269  if (sao->offset_abs[c_idx][i]) {
1270  SET_SAO(offset_sign[c_idx][i],
1272  } else {
1273  sao->offset_sign[c_idx][i] = 0;
1274  }
1275  }
1276  SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(lc));
1277  } else if (c_idx != 2) {
1278  SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(lc));
1279  }
1280 
1281  // Inferred parameters
1282  sao->offset_val[c_idx][0] = 0;
1283  for (i = 0; i < 4; i++) {
1284  sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
1285  if (sao->type_idx[c_idx] == SAO_EDGE) {
1286  if (i > 1)
1287  sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
1288  } else if (sao->offset_sign[c_idx][i]) {
1289  sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
1290  }
1291  sao->offset_val[c_idx][i + 1] *= 1 << log2_sao_offset_scale;
1292  }
1293  }
1294 }
1295 
1296 #undef SET_SAO
1297 #undef CTB
1298 
1300 {
1301  int log2_res_scale_abs_plus1 = ff_hevc_log2_res_scale_abs(lc, idx);
1302 
1303  if (log2_res_scale_abs_plus1 != 0) {
1304  int res_scale_sign_flag = ff_hevc_res_scale_sign_flag(lc, idx);
1305  lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) *
1306  (1 - 2 * res_scale_sign_flag);
1307  } else {
1308  lc->tu.res_scale_val = 0;
1309  }
1310 
1311 
1312  return 0;
1313 }
1314 
1316  const HEVCLayerContext *l,
1317  const HEVCPPS *pps, const HEVCSPS *sps,
1318  int x0, int y0,
1319  int xBase, int yBase, int cb_xBase, int cb_yBase,
1320  int log2_cb_size, int log2_trafo_size,
1321  int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
1322 {
1323  const HEVCContext *const s = lc->parent;
1324  const int log2_trafo_size_c = log2_trafo_size - sps->hshift[1];
1325  int i;
1326 
1327  if (lc->cu.pred_mode == MODE_INTRA) {
1328  int trafo_size = 1 << log2_trafo_size;
1329  ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size, sps->log2_ctb_size);
1330 
1331  s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, x0, y0, 0);
1332  }
1333 
1334  if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1335  (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1336  int scan_idx = SCAN_DIAG;
1337  int scan_idx_c = SCAN_DIAG;
1338  int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1339  (sps->chroma_format_idc == 2 &&
1340  (cbf_cb[1] || cbf_cr[1]));
1341 
1342  if (pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
1344  if (lc->tu.cu_qp_delta != 0)
1345  if (ff_hevc_cu_qp_delta_sign_flag(lc) == 1)
1346  lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
1347  lc->tu.is_cu_qp_delta_coded = 1;
1348 
1349  if (lc->tu.cu_qp_delta < -(26 + sps->qp_bd_offset / 2) ||
1350  lc->tu.cu_qp_delta > (25 + sps->qp_bd_offset / 2)) {
1351  av_log(s->avctx, AV_LOG_ERROR,
1352  "The cu_qp_delta %d is outside the valid range "
1353  "[%d, %d].\n",
1354  lc->tu.cu_qp_delta,
1355  -(26 + sps->qp_bd_offset / 2),
1356  (25 + sps->qp_bd_offset / 2));
1357  return AVERROR_INVALIDDATA;
1358  }
1359 
1360  ff_hevc_set_qPy(lc, l, pps, cb_xBase, cb_yBase, log2_cb_size);
1361  }
1362 
1363  if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1365  int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(lc);
1366  if (cu_chroma_qp_offset_flag) {
1367  int cu_chroma_qp_offset_idx = 0;
1368  if (pps->chroma_qp_offset_list_len_minus1 > 0) {
1369  cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(lc, pps->chroma_qp_offset_list_len_minus1);
1370  av_log(s->avctx, AV_LOG_ERROR,
1371  "cu_chroma_qp_offset_idx not yet tested.\n");
1372  }
1373  lc->tu.cu_qp_offset_cb = pps->cb_qp_offset_list[cu_chroma_qp_offset_idx];
1374  lc->tu.cu_qp_offset_cr = pps->cr_qp_offset_list[cu_chroma_qp_offset_idx];
1375  } else {
1376  lc->tu.cu_qp_offset_cb = 0;
1377  lc->tu.cu_qp_offset_cr = 0;
1378  }
1380  }
1381 
1382  if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
1383  if (lc->tu.intra_pred_mode >= 6 &&
1384  lc->tu.intra_pred_mode <= 14) {
1385  scan_idx = SCAN_VERT;
1386  } else if (lc->tu.intra_pred_mode >= 22 &&
1387  lc->tu.intra_pred_mode <= 30) {
1388  scan_idx = SCAN_HORIZ;
1389  }
1390 
1391  if (lc->tu.intra_pred_mode_c >= 6 &&
1392  lc->tu.intra_pred_mode_c <= 14) {
1393  scan_idx_c = SCAN_VERT;
1394  } else if (lc->tu.intra_pred_mode_c >= 22 &&
1395  lc->tu.intra_pred_mode_c <= 30) {
1396  scan_idx_c = SCAN_HORIZ;
1397  }
1398  }
1399 
1400  lc->tu.cross_pf = 0;
1401 
1402  if (cbf_luma)
1403  ff_hevc_hls_residual_coding(lc, pps, x0, y0, log2_trafo_size, scan_idx, 0);
1404  if (sps->chroma_format_idc && (log2_trafo_size > 2 || sps->chroma_format_idc == 3)) {
1405  int trafo_size_h = 1 << (log2_trafo_size_c + sps->hshift[1]);
1406  int trafo_size_v = 1 << (log2_trafo_size_c + sps->vshift[1]);
1407  lc->tu.cross_pf = (pps->cross_component_prediction_enabled_flag && cbf_luma &&
1408  (lc->cu.pred_mode == MODE_INTER ||
1409  (lc->tu.chroma_mode_c == 4)));
1410 
1411  if (lc->tu.cross_pf) {
1412  hls_cross_component_pred(lc, 0);
1413  }
1414  for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1415  if (lc->cu.pred_mode == MODE_INTRA) {
1416  ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c),
1417  trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1418  s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (i << log2_trafo_size_c), 1);
1419  }
1420  if (cbf_cb[i])
1421  ff_hevc_hls_residual_coding(lc, pps, x0, y0 + (i << log2_trafo_size_c),
1422  log2_trafo_size_c, scan_idx_c, 1);
1423  else
1424  if (lc->tu.cross_pf) {
1425  ptrdiff_t stride = s->cur_frame->f->linesize[1];
1426  int hshift = sps->hshift[1];
1427  int vshift = sps->vshift[1];
1428  const int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1429  int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1430  int size = 1 << log2_trafo_size_c;
1431 
1432  uint8_t *dst = &s->cur_frame->f->data[1][(y0 >> vshift) * stride +
1433  ((x0 >> hshift) << sps->pixel_shift)];
1434  for (i = 0; i < (size * size); i++) {
1435  coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1436  }
1437  s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1438  }
1439  }
1440 
1441  if (lc->tu.cross_pf) {
1442  hls_cross_component_pred(lc, 1);
1443  }
1444  for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1445  if (lc->cu.pred_mode == MODE_INTRA) {
1446  ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c),
1447  trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1448  s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (i << log2_trafo_size_c), 2);
1449  }
1450  if (cbf_cr[i])
1451  ff_hevc_hls_residual_coding(lc, pps, x0, y0 + (i << log2_trafo_size_c),
1452  log2_trafo_size_c, scan_idx_c, 2);
1453  else
1454  if (lc->tu.cross_pf) {
1455  ptrdiff_t stride = s->cur_frame->f->linesize[2];
1456  int hshift = sps->hshift[2];
1457  int vshift = sps->vshift[2];
1458  const int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1459  int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1460  int size = 1 << log2_trafo_size_c;
1461 
1462  uint8_t *dst = &s->cur_frame->f->data[2][(y0 >> vshift) * stride +
1463  ((x0 >> hshift) << sps->pixel_shift)];
1464  for (i = 0; i < (size * size); i++) {
1465  coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1466  }
1467  s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1468  }
1469  }
1470  } else if (sps->chroma_format_idc && blk_idx == 3) {
1471  int trafo_size_h = 1 << (log2_trafo_size + 1);
1472  int trafo_size_v = 1 << (log2_trafo_size + sps->vshift[1]);
1473  for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1474  if (lc->cu.pred_mode == MODE_INTRA) {
1475  ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size),
1476  trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1477  s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (i << log2_trafo_size), 1);
1478  }
1479  if (cbf_cb[i])
1480  ff_hevc_hls_residual_coding(lc, pps, xBase, yBase + (i << log2_trafo_size),
1481  log2_trafo_size, scan_idx_c, 1);
1482  }
1483  for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1484  if (lc->cu.pred_mode == MODE_INTRA) {
1485  ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size),
1486  trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1487  s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (i << log2_trafo_size), 2);
1488  }
1489  if (cbf_cr[i])
1490  ff_hevc_hls_residual_coding(lc, pps, xBase, yBase + (i << log2_trafo_size),
1491  log2_trafo_size, scan_idx_c, 2);
1492  }
1493  }
1494  } else if (sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) {
1495  if (log2_trafo_size > 2 || sps->chroma_format_idc == 3) {
1496  int trafo_size_h = 1 << (log2_trafo_size_c + sps->hshift[1]);
1497  int trafo_size_v = 1 << (log2_trafo_size_c + sps->vshift[1]);
1498  ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size_h, trafo_size_v,
1499  sps->log2_ctb_size);
1500  s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0, 1);
1501  s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0, 2);
1502  if (sps->chroma_format_idc == 2) {
1503  ff_hevc_set_neighbour_available(lc, x0, y0 + (1 << log2_trafo_size_c),
1504  trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1505  s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (1 << log2_trafo_size_c), 1);
1506  s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (1 << log2_trafo_size_c), 2);
1507  }
1508  } else if (blk_idx == 3) {
1509  int trafo_size_h = 1 << (log2_trafo_size + 1);
1510  int trafo_size_v = 1 << (log2_trafo_size + sps->vshift[1]);
1511  ff_hevc_set_neighbour_available(lc, xBase, yBase,
1512  trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1513  s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase, 1);
1514  s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase, 2);
1515  if (sps->chroma_format_idc == 2) {
1516  ff_hevc_set_neighbour_available(lc, xBase, yBase + (1 << log2_trafo_size),
1517  trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1518  s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (1 << log2_trafo_size), 1);
1519  s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (1 << log2_trafo_size), 2);
1520  }
1521  }
1522  }
1523 
1524  return 0;
1525 }
1526 
1527 static void set_deblocking_bypass(uint8_t *is_pcm, const HEVCSPS *sps,
1528  int x0, int y0, int log2_cb_size)
1529 {
1530  int cb_size = 1 << log2_cb_size;
1531  int log2_min_pu_size = sps->log2_min_pu_size;
1532 
1533  int min_pu_width = sps->min_pu_width;
1534  int x_end = FFMIN(x0 + cb_size, sps->width);
1535  int y_end = FFMIN(y0 + cb_size, sps->height);
1536  int i, j;
1537 
1538  for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1539  for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1540  is_pcm[i + j * min_pu_width] = 2;
1541 }
1542 
1544  const HEVCLayerContext *l,
1545  const HEVCPPS *pps, const HEVCSPS *sps,
1546  int x0, int y0,
1547  int xBase, int yBase, int cb_xBase, int cb_yBase,
1548  int log2_cb_size, int log2_trafo_size,
1549  int trafo_depth, int blk_idx,
1550  const int *base_cbf_cb, const int *base_cbf_cr)
1551 {
1552  const HEVCContext *const s = lc->parent;
1553  uint8_t split_transform_flag;
1554  int cbf_cb[2];
1555  int cbf_cr[2];
1556  int ret;
1557 
1558  cbf_cb[0] = base_cbf_cb[0];
1559  cbf_cb[1] = base_cbf_cb[1];
1560  cbf_cr[0] = base_cbf_cr[0];
1561  cbf_cr[1] = base_cbf_cr[1];
1562 
1563  if (lc->cu.intra_split_flag) {
1564  if (trafo_depth == 1) {
1565  lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1566  if (sps->chroma_format_idc == 3) {
1567  lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx];
1568  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx];
1569  } else {
1571  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1572  }
1573  }
1574  } else {
1575  lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[0];
1577  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1578  }
1579 
1580  if (log2_trafo_size <= sps->log2_max_trafo_size &&
1581  log2_trafo_size > sps->log2_min_tb_size &&
1582  trafo_depth < lc->cu.max_trafo_depth &&
1583  !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1584  split_transform_flag = ff_hevc_split_transform_flag_decode(lc, log2_trafo_size);
1585  } else {
1586  int inter_split = sps->max_transform_hierarchy_depth_inter == 0 &&
1587  lc->cu.pred_mode == MODE_INTER &&
1588  lc->cu.part_mode != PART_2Nx2N &&
1589  trafo_depth == 0;
1590 
1591  split_transform_flag = log2_trafo_size > sps->log2_max_trafo_size ||
1592  (lc->cu.intra_split_flag && trafo_depth == 0) ||
1593  inter_split;
1594  }
1595 
1596  if (sps->chroma_format_idc && (log2_trafo_size > 2 || sps->chroma_format_idc == 3)) {
1597  if (trafo_depth == 0 || cbf_cb[0]) {
1598  cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1599  if (sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1600  cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1601  }
1602  }
1603 
1604  if (trafo_depth == 0 || cbf_cr[0]) {
1605  cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1606  if (sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1607  cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1608  }
1609  }
1610  }
1611 
1612  if (split_transform_flag) {
1613  const int trafo_size_split = 1 << (log2_trafo_size - 1);
1614  const int x1 = x0 + trafo_size_split;
1615  const int y1 = y0 + trafo_size_split;
1616 
1617 #define SUBDIVIDE(x, y, idx) \
1618 do { \
1619  ret = hls_transform_tree(lc, l, pps, sps, \
1620  x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1621  log2_trafo_size - 1, trafo_depth + 1, idx, \
1622  cbf_cb, cbf_cr); \
1623  if (ret < 0) \
1624  return ret; \
1625 } while (0)
1626 
1627  SUBDIVIDE(x0, y0, 0);
1628  SUBDIVIDE(x1, y0, 1);
1629  SUBDIVIDE(x0, y1, 2);
1630  SUBDIVIDE(x1, y1, 3);
1631 
1632 #undef SUBDIVIDE
1633  } else {
1634  int min_tu_size = 1 << sps->log2_min_tb_size;
1635  int log2_min_tu_size = sps->log2_min_tb_size;
1636  int min_tu_width = sps->min_tb_width;
1637  int cbf_luma = 1;
1638 
1639  if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1640  cbf_cb[0] || cbf_cr[0] ||
1641  (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1642  cbf_luma = ff_hevc_cbf_luma_decode(lc, trafo_depth);
1643  }
1644 
1645  ret = hls_transform_unit(lc, l, pps, sps,
1646  x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1647  log2_cb_size, log2_trafo_size,
1648  blk_idx, cbf_luma, cbf_cb, cbf_cr);
1649  if (ret < 0)
1650  return ret;
1651  // TODO: store cbf_luma somewhere else
1652  if (cbf_luma) {
1653  int i, j;
1654  for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1655  for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1656  int x_tu = (x0 + j) >> log2_min_tu_size;
1657  int y_tu = (y0 + i) >> log2_min_tu_size;
1658  l->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1659  }
1660  }
1661  if (!s->sh.disable_deblocking_filter_flag) {
1662  ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_trafo_size);
1663  if (pps->transquant_bypass_enable_flag &&
1665  set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_trafo_size);
1666  }
1667  }
1668  return 0;
1669 }
1670 
1672  const HEVCPPS *pps, int x0, int y0, int log2_cb_size)
1673 {
1674  const HEVCContext *const s = lc->parent;
1675  const HEVCSPS *const sps = pps->sps;
1676  GetBitContext gb;
1677  int cb_size = 1 << log2_cb_size;
1678  ptrdiff_t stride0 = s->cur_frame->f->linesize[0];
1679  ptrdiff_t stride1 = s->cur_frame->f->linesize[1];
1680  ptrdiff_t stride2 = s->cur_frame->f->linesize[2];
1681  uint8_t *dst0 = &s->cur_frame->f->data[0][y0 * stride0 + (x0 << sps->pixel_shift)];
1682  uint8_t *dst1 = &s->cur_frame->f->data[1][(y0 >> sps->vshift[1]) * stride1 + ((x0 >> sps->hshift[1]) << sps->pixel_shift)];
1683  uint8_t *dst2 = &s->cur_frame->f->data[2][(y0 >> sps->vshift[2]) * stride2 + ((x0 >> sps->hshift[2]) << sps->pixel_shift)];
1684 
1685  int length = cb_size * cb_size * sps->pcm.bit_depth +
1686  (((cb_size >> sps->hshift[1]) * (cb_size >> sps->vshift[1])) +
1687  ((cb_size >> sps->hshift[2]) * (cb_size >> sps->vshift[2]))) *
1688  sps->pcm.bit_depth_chroma;
1689  const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1690  int ret;
1691 
1692  if (!s->sh.disable_deblocking_filter_flag)
1693  ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
1694 
1695  ret = init_get_bits(&gb, pcm, length);
1696  if (ret < 0)
1697  return ret;
1698 
1699  s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, sps->pcm.bit_depth);
1700  if (sps->chroma_format_idc) {
1701  s->hevcdsp.put_pcm(dst1, stride1,
1702  cb_size >> sps->hshift[1],
1703  cb_size >> sps->vshift[1],
1704  &gb, sps->pcm.bit_depth_chroma);
1705  s->hevcdsp.put_pcm(dst2, stride2,
1706  cb_size >> sps->hshift[2],
1707  cb_size >> sps->vshift[2],
1708  &gb, sps->pcm.bit_depth_chroma);
1709  }
1710 
1711  return 0;
1712 }
1713 
1714 /**
1715  * 8.5.3.2.2.1 Luma sample unidirectional interpolation process
1716  *
1717  * @param s HEVC decoding context
1718  * @param dst target buffer for block data at block position
1719  * @param dststride stride of the dst buffer
1720  * @param ref reference picture buffer at origin (0, 0)
1721  * @param mv motion vector (relative to block position) to get pixel data from
1722  * @param x_off horizontal position of block from origin (0, 0)
1723  * @param y_off vertical position of block from origin (0, 0)
1724  * @param block_w width of block
1725  * @param block_h height of block
1726  * @param luma_weight weighting factor applied to the luma prediction
1727  * @param luma_offset additive offset applied to the luma prediction value
1728  */
1729 
1731  const HEVCPPS *pps, const HEVCSPS *sps,
1732  uint8_t *dst, ptrdiff_t dststride,
1733  const AVFrame *ref, const Mv *mv, int x_off, int y_off,
1734  int block_w, int block_h, int luma_weight, int luma_offset)
1735 {
1736  const HEVCContext *const s = lc->parent;
1737  const uint8_t *src = ref->data[0];
1738  ptrdiff_t srcstride = ref->linesize[0];
1739  int pic_width = sps->width;
1740  int pic_height = sps->height;
1741  int mx = mv->x & 3;
1742  int my = mv->y & 3;
1743  int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1744  (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1745  int idx = hevc_pel_weight[block_w];
1746 
1747  x_off += mv->x >> 2;
1748  y_off += mv->y >> 2;
1749  src += y_off * srcstride + (x_off * (1 << sps->pixel_shift));
1750 
1751  if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER ||
1752  x_off >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1753  y_off >= pic_height - block_h - QPEL_EXTRA_AFTER ||
1754  ref == s->cur_frame->f) {
1755  const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1756  int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1757  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1758 
1759  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1760  edge_emu_stride, srcstride,
1761  block_w + QPEL_EXTRA,
1762  block_h + QPEL_EXTRA,
1763  x_off - QPEL_EXTRA_BEFORE, y_off - QPEL_EXTRA_BEFORE,
1764  pic_width, pic_height);
1765  src = lc->edge_emu_buffer + buf_offset;
1766  srcstride = edge_emu_stride;
1767  }
1768 
1769  if (!weight_flag)
1770  s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride, src, srcstride,
1771  block_h, mx, my, block_w);
1772  else
1773  s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride, src, srcstride,
1774  block_h, s->sh.luma_log2_weight_denom,
1775  luma_weight, luma_offset, mx, my, block_w);
1776 }
1777 
1778 /**
1779  * 8.5.3.2.2.1 Luma sample bidirectional interpolation process
1780  *
1781  * @param s HEVC decoding context
1782  * @param dst target buffer for block data at block position
1783  * @param dststride stride of the dst buffer
1784  * @param ref0 reference picture0 buffer at origin (0, 0)
1785  * @param mv0 motion vector0 (relative to block position) to get pixel data from
1786  * @param x_off horizontal position of block from origin (0, 0)
1787  * @param y_off vertical position of block from origin (0, 0)
1788  * @param block_w width of block
1789  * @param block_h height of block
1790  * @param ref1 reference picture1 buffer at origin (0, 0)
1791  * @param mv1 motion vector1 (relative to block position) to get pixel data from
1792  * @param current_mv current motion vector structure
1793  */
1795  const HEVCPPS *pps, const HEVCSPS *sps,
1796  uint8_t *dst, ptrdiff_t dststride,
1797  const AVFrame *ref0, const Mv *mv0, int x_off, int y_off,
1798  int block_w, int block_h, const AVFrame *ref1,
1799  const Mv *mv1, struct MvField *current_mv)
1800 {
1801  const HEVCContext *const s = lc->parent;
1802  ptrdiff_t src0stride = ref0->linesize[0];
1803  ptrdiff_t src1stride = ref1->linesize[0];
1804  int pic_width = sps->width;
1805  int pic_height = sps->height;
1806  int mx0 = mv0->x & 3;
1807  int my0 = mv0->y & 3;
1808  int mx1 = mv1->x & 3;
1809  int my1 = mv1->y & 3;
1810  int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1811  (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1812  int x_off0 = x_off + (mv0->x >> 2);
1813  int y_off0 = y_off + (mv0->y >> 2);
1814  int x_off1 = x_off + (mv1->x >> 2);
1815  int y_off1 = y_off + (mv1->y >> 2);
1816  int idx = hevc_pel_weight[block_w];
1817 
1818  const uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << sps->pixel_shift);
1819  const uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << sps->pixel_shift);
1820 
1821  if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER ||
1822  x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1823  y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1824  const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1825  int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1826  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1827 
1828  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset,
1829  edge_emu_stride, src0stride,
1830  block_w + QPEL_EXTRA,
1831  block_h + QPEL_EXTRA,
1832  x_off0 - QPEL_EXTRA_BEFORE, y_off0 - QPEL_EXTRA_BEFORE,
1833  pic_width, pic_height);
1834  src0 = lc->edge_emu_buffer + buf_offset;
1835  src0stride = edge_emu_stride;
1836  }
1837 
1838  if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER ||
1839  x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1840  y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1841  const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1842  int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1843  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1844 
1845  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset,
1846  edge_emu_stride, src1stride,
1847  block_w + QPEL_EXTRA,
1848  block_h + QPEL_EXTRA,
1849  x_off1 - QPEL_EXTRA_BEFORE, y_off1 - QPEL_EXTRA_BEFORE,
1850  pic_width, pic_height);
1851  src1 = lc->edge_emu_buffer2 + buf_offset;
1852  src1stride = edge_emu_stride;
1853  }
1854 
1855  s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->tmp, src0, src0stride,
1856  block_h, mx0, my0, block_w);
1857  if (!weight_flag)
1858  s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1859  block_h, mx1, my1, block_w);
1860  else
1861  s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1862  block_h, s->sh.luma_log2_weight_denom,
1863  s->sh.luma_weight_l0[current_mv->ref_idx[0]],
1864  s->sh.luma_weight_l1[current_mv->ref_idx[1]],
1865  s->sh.luma_offset_l0[current_mv->ref_idx[0]],
1866  s->sh.luma_offset_l1[current_mv->ref_idx[1]],
1867  mx1, my1, block_w);
1868 
1869 }
1870 
1871 /**
1872  * 8.5.3.2.2.2 Chroma sample uniprediction interpolation process
1873  *
1874  * @param s HEVC decoding context
1875  * @param dst1 target buffer for block data at block position (U plane)
1876  * @param dst2 target buffer for block data at block position (V plane)
1877  * @param dststride stride of the dst1 and dst2 buffers
1878  * @param ref reference picture buffer at origin (0, 0)
1879  * @param mv motion vector (relative to block position) to get pixel data from
1880  * @param x_off horizontal position of block from origin (0, 0)
1881  * @param y_off vertical position of block from origin (0, 0)
1882  * @param block_w width of block
1883  * @param block_h height of block
1884  * @param chroma_weight weighting factor applied to the chroma prediction
1885  * @param chroma_offset additive offset applied to the chroma prediction value
1886  */
1887 
1889  const HEVCPPS *pps, const HEVCSPS *sps,
1890  uint8_t *dst0,
1891  ptrdiff_t dststride, const uint8_t *src0, ptrdiff_t srcstride, int reflist,
1892  int x_off, int y_off, int block_w, int block_h,
1893  const struct MvField *current_mv, int chroma_weight, int chroma_offset)
1894 {
1895  const HEVCContext *const s = lc->parent;
1896  int pic_width = sps->width >> sps->hshift[1];
1897  int pic_height = sps->height >> sps->vshift[1];
1898  const Mv *mv = &current_mv->mv[reflist];
1899  int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1900  (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1901  int idx = hevc_pel_weight[block_w];
1902  int hshift = sps->hshift[1];
1903  int vshift = sps->vshift[1];
1904  intptr_t mx = av_zero_extend(mv->x, 2 + hshift);
1905  intptr_t my = av_zero_extend(mv->y, 2 + vshift);
1906  intptr_t _mx = mx << (1 - hshift);
1907  intptr_t _my = my << (1 - vshift);
1908  int emu = src0 == s->cur_frame->f->data[1] || src0 == s->cur_frame->f->data[2];
1909 
1910  x_off += mv->x >> (2 + hshift);
1911  y_off += mv->y >> (2 + vshift);
1912  src0 += y_off * srcstride + (x_off * (1 << sps->pixel_shift));
1913 
1914  if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1915  x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1916  y_off >= pic_height - block_h - EPEL_EXTRA_AFTER ||
1917  emu) {
1918  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1919  int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << sps->pixel_shift));
1920  int buf_offset0 = EPEL_EXTRA_BEFORE *
1921  (edge_emu_stride + (1 << sps->pixel_shift));
1922  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0,
1923  edge_emu_stride, srcstride,
1924  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1925  x_off - EPEL_EXTRA_BEFORE,
1926  y_off - EPEL_EXTRA_BEFORE,
1927  pic_width, pic_height);
1928 
1929  src0 = lc->edge_emu_buffer + buf_offset0;
1930  srcstride = edge_emu_stride;
1931  }
1932  if (!weight_flag)
1933  s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1934  block_h, _mx, _my, block_w);
1935  else
1936  s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1937  block_h, s->sh.chroma_log2_weight_denom,
1938  chroma_weight, chroma_offset, _mx, _my, block_w);
1939 }
1940 
1941 /**
1942  * 8.5.3.2.2.2 Chroma sample bidirectional interpolation process
1943  *
1944  * @param s HEVC decoding context
1945  * @param dst target buffer for block data at block position
1946  * @param dststride stride of the dst buffer
1947  * @param ref0 reference picture0 buffer at origin (0, 0)
1948  * @param mv0 motion vector0 (relative to block position) to get pixel data from
1949  * @param x_off horizontal position of block from origin (0, 0)
1950  * @param y_off vertical position of block from origin (0, 0)
1951  * @param block_w width of block
1952  * @param block_h height of block
1953  * @param ref1 reference picture1 buffer at origin (0, 0)
1954  * @param mv1 motion vector1 (relative to block position) to get pixel data from
1955  * @param current_mv current motion vector structure
1956  * @param cidx chroma component(cb, cr)
1957  */
1959  const HEVCPPS *pps, const HEVCSPS *sps,
1960  uint8_t *dst0, ptrdiff_t dststride,
1961  const AVFrame *ref0, const AVFrame *ref1,
1962  int x_off, int y_off, int block_w, int block_h, const MvField *current_mv, int cidx)
1963 {
1964  const HEVCContext *const s = lc->parent;
1965  const uint8_t *src1 = ref0->data[cidx+1];
1966  const uint8_t *src2 = ref1->data[cidx+1];
1967  ptrdiff_t src1stride = ref0->linesize[cidx+1];
1968  ptrdiff_t src2stride = ref1->linesize[cidx+1];
1969  int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1970  (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1971  int pic_width = sps->width >> sps->hshift[1];
1972  int pic_height = sps->height >> sps->vshift[1];
1973  const Mv *const mv0 = &current_mv->mv[0];
1974  const Mv *const mv1 = &current_mv->mv[1];
1975  int hshift = sps->hshift[1];
1976  int vshift = sps->vshift[1];
1977 
1978  intptr_t mx0 = av_zero_extend(mv0->x, 2 + hshift);
1979  intptr_t my0 = av_zero_extend(mv0->y, 2 + vshift);
1980  intptr_t mx1 = av_zero_extend(mv1->x, 2 + hshift);
1981  intptr_t my1 = av_zero_extend(mv1->y, 2 + vshift);
1982  intptr_t _mx0 = mx0 << (1 - hshift);
1983  intptr_t _my0 = my0 << (1 - vshift);
1984  intptr_t _mx1 = mx1 << (1 - hshift);
1985  intptr_t _my1 = my1 << (1 - vshift);
1986 
1987  int x_off0 = x_off + (mv0->x >> (2 + hshift));
1988  int y_off0 = y_off + (mv0->y >> (2 + vshift));
1989  int x_off1 = x_off + (mv1->x >> (2 + hshift));
1990  int y_off1 = y_off + (mv1->y >> (2 + vshift));
1991  int idx = hevc_pel_weight[block_w];
1992  src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << sps->pixel_shift);
1993  src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << sps->pixel_shift);
1994 
1995  if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER ||
1996  x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1997  y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1998  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1999  int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << sps->pixel_shift));
2000  int buf_offset1 = EPEL_EXTRA_BEFORE *
2001  (edge_emu_stride + (1 << sps->pixel_shift));
2002 
2003  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
2004  edge_emu_stride, src1stride,
2005  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
2006  x_off0 - EPEL_EXTRA_BEFORE,
2007  y_off0 - EPEL_EXTRA_BEFORE,
2008  pic_width, pic_height);
2009 
2010  src1 = lc->edge_emu_buffer + buf_offset1;
2011  src1stride = edge_emu_stride;
2012  }
2013 
2014  if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER ||
2015  x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
2016  y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
2017  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
2018  int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << sps->pixel_shift));
2019  int buf_offset1 = EPEL_EXTRA_BEFORE *
2020  (edge_emu_stride + (1 << sps->pixel_shift));
2021 
2022  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1,
2023  edge_emu_stride, src2stride,
2024  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
2025  x_off1 - EPEL_EXTRA_BEFORE,
2026  y_off1 - EPEL_EXTRA_BEFORE,
2027  pic_width, pic_height);
2028 
2029  src2 = lc->edge_emu_buffer2 + buf_offset1;
2030  src2stride = edge_emu_stride;
2031  }
2032 
2033  s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->tmp, src1, src1stride,
2034  block_h, _mx0, _my0, block_w);
2035  if (!weight_flag)
2036  s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0, s->cur_frame->f->linesize[cidx+1],
2037  src2, src2stride, lc->tmp,
2038  block_h, _mx1, _my1, block_w);
2039  else
2040  s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0, s->cur_frame->f->linesize[cidx+1],
2041  src2, src2stride, lc->tmp,
2042  block_h,
2043  s->sh.chroma_log2_weight_denom,
2044  s->sh.chroma_weight_l0[current_mv->ref_idx[0]][cidx],
2045  s->sh.chroma_weight_l1[current_mv->ref_idx[1]][cidx],
2046  s->sh.chroma_offset_l0[current_mv->ref_idx[0]][cidx],
2047  s->sh.chroma_offset_l1[current_mv->ref_idx[1]][cidx],
2048  _mx1, _my1, block_w);
2049 }
2050 
2051 static void hevc_await_progress(const HEVCContext *s, const HEVCFrame *ref,
2052  const Mv *mv, int y0, int height)
2053 {
2054  if (s->avctx->active_thread_type == FF_THREAD_FRAME ) {
2055  int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9);
2056 
2057  ff_progress_frame_await(&ref->tf, y);
2058  }
2059 }
2060 
2062  const HEVCPPS *pps, const HEVCSPS *sps,
2063  int x0, int y0, int nPbW,
2064  int nPbH, int log2_cb_size, int part_idx,
2065  int merge_idx, MvField *mv)
2066 {
2067  const HEVCContext *const s = lc->parent;
2068  enum InterPredIdc inter_pred_idc = PRED_L0;
2069  int mvp_flag;
2070 
2071  ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH, sps->log2_ctb_size);
2072  mv->pred_flag = 0;
2073  if (s->sh.slice_type == HEVC_SLICE_B)
2074  inter_pred_idc = ff_hevc_inter_pred_idc_decode(lc, nPbW, nPbH);
2075 
2076  if (inter_pred_idc != PRED_L1) {
2077  if (s->sh.nb_refs[L0])
2078  mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(lc, s->sh.nb_refs[L0]);
2079 
2080  mv->pred_flag = PF_L0;
2081  ff_hevc_hls_mvd_coding(lc, x0, y0, 0);
2082  mvp_flag = ff_hevc_mvp_lx_flag_decode(lc);
2083  ff_hevc_luma_mv_mvp_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2084  part_idx, merge_idx, mv, mvp_flag, 0);
2085  mv->mv[0].x += lc->pu.mvd.x;
2086  mv->mv[0].y += lc->pu.mvd.y;
2087  }
2088 
2089  if (inter_pred_idc != PRED_L0) {
2090  if (s->sh.nb_refs[L1])
2091  mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(lc, s->sh.nb_refs[L1]);
2092 
2093  if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
2094  AV_ZERO32(&lc->pu.mvd);
2095  } else {
2096  ff_hevc_hls_mvd_coding(lc, x0, y0, 1);
2097  }
2098 
2099  mv->pred_flag += PF_L1;
2100  mvp_flag = ff_hevc_mvp_lx_flag_decode(lc);
2101  ff_hevc_luma_mv_mvp_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2102  part_idx, merge_idx, mv, mvp_flag, 1);
2103  mv->mv[1].x += lc->pu.mvd.x;
2104  mv->mv[1].y += lc->pu.mvd.y;
2105  }
2106 }
2107 
2109  const HEVCLayerContext *l,
2110  const HEVCPPS *pps, const HEVCSPS *sps,
2111  int x0, int y0, int nPbW, int nPbH,
2112  int log2_cb_size, int partIdx, int idx)
2113 {
2114 #define POS(c_idx, x, y) \
2115  &s->cur_frame->f->data[c_idx] ? \
2116  &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \
2117  (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] : NULL
2118  const HEVCContext *const s = lc->parent;
2119  int merge_idx = 0;
2120  struct MvField current_mv = {{{ 0 }}};
2121 
2122  int min_pu_width = sps->min_pu_width;
2123 
2124  MvField *tab_mvf = s->cur_frame->tab_mvf;
2125  const RefPicList *refPicList = s->cur_frame->refPicList;
2126  const HEVCFrame *ref0 = NULL, *ref1 = NULL;
2127  const int *linesize = s->cur_frame->f->linesize;
2128  uint8_t *dst0 = POS(0, x0, y0);
2129  uint8_t *dst1 = POS(1, x0, y0);
2130  uint8_t *dst2 = POS(2, x0, y0);
2131  int log2_min_cb_size = sps->log2_min_cb_size;
2132  int min_cb_width = sps->min_cb_width;
2133  int x_cb = x0 >> log2_min_cb_size;
2134  int y_cb = y0 >> log2_min_cb_size;
2135  int x_pu, y_pu;
2136  int i, j;
2137 
2138  int skip_flag = SAMPLE_CTB(l->skip_flag, x_cb, y_cb);
2139 
2140  if (!skip_flag)
2142 
2143  if (skip_flag || lc->pu.merge_flag) {
2144  if (s->sh.max_num_merge_cand > 1)
2145  merge_idx = ff_hevc_merge_idx_decode(lc);
2146  else
2147  merge_idx = 0;
2148 
2149  ff_hevc_luma_mv_merge_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2150  partIdx, merge_idx, &current_mv);
2151  } else {
2152  hevc_luma_mv_mvp_mode(lc, pps, sps, x0, y0, nPbW, nPbH, log2_cb_size,
2153  partIdx, merge_idx, &current_mv);
2154  }
2155 
2156  x_pu = x0 >> sps->log2_min_pu_size;
2157  y_pu = y0 >> sps->log2_min_pu_size;
2158 
2159  for (j = 0; j < nPbH >> sps->log2_min_pu_size; j++)
2160  for (i = 0; i < nPbW >> sps->log2_min_pu_size; i++)
2161  tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
2162 
2163  if (current_mv.pred_flag & PF_L0) {
2164  ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
2165  if (!ref0 || !ref0->f)
2166  return;
2167  hevc_await_progress(s, ref0, &current_mv.mv[0], y0, nPbH);
2168  }
2169  if (current_mv.pred_flag & PF_L1) {
2170  ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
2171  if (!ref1 || !ref1->f)
2172  return;
2173  hevc_await_progress(s, ref1, &current_mv.mv[1], y0, nPbH);
2174  }
2175 
2176  if (current_mv.pred_flag == PF_L0) {
2177  int x0_c = x0 >> sps->hshift[1];
2178  int y0_c = y0 >> sps->vshift[1];
2179  int nPbW_c = nPbW >> sps->hshift[1];
2180  int nPbH_c = nPbH >> sps->vshift[1];
2181 
2182  luma_mc_uni(lc, pps, sps, dst0, linesize[0], ref0->f,
2183  &current_mv.mv[0], x0, y0, nPbW, nPbH,
2184  s->sh.luma_weight_l0[current_mv.ref_idx[0]],
2185  s->sh.luma_offset_l0[current_mv.ref_idx[0]]);
2186 
2187  if (sps->chroma_format_idc) {
2188  chroma_mc_uni(lc, pps, sps, dst1, linesize[1], ref0->f->data[1], ref0->f->linesize[1],
2189  0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2190  s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]);
2191  chroma_mc_uni(lc, pps, sps, dst2, linesize[2], ref0->f->data[2], ref0->f->linesize[2],
2192  0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2193  s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]);
2194  }
2195  } else if (current_mv.pred_flag == PF_L1) {
2196  int x0_c = x0 >> sps->hshift[1];
2197  int y0_c = y0 >> sps->vshift[1];
2198  int nPbW_c = nPbW >> sps->hshift[1];
2199  int nPbH_c = nPbH >> sps->vshift[1];
2200 
2201  luma_mc_uni(lc, pps, sps, dst0, linesize[0], ref1->f,
2202  &current_mv.mv[1], x0, y0, nPbW, nPbH,
2203  s->sh.luma_weight_l1[current_mv.ref_idx[1]],
2204  s->sh.luma_offset_l1[current_mv.ref_idx[1]]);
2205 
2206  if (sps->chroma_format_idc) {
2207  chroma_mc_uni(lc, pps, sps, dst1, linesize[1], ref1->f->data[1], ref1->f->linesize[1],
2208  1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2209  s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]);
2210 
2211  chroma_mc_uni(lc, pps, sps, dst2, linesize[2], ref1->f->data[2], ref1->f->linesize[2],
2212  1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2213  s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]);
2214  }
2215  } else if (current_mv.pred_flag == PF_BI) {
2216  int x0_c = x0 >> sps->hshift[1];
2217  int y0_c = y0 >> sps->vshift[1];
2218  int nPbW_c = nPbW >> sps->hshift[1];
2219  int nPbH_c = nPbH >> sps->vshift[1];
2220 
2221  luma_mc_bi(lc, pps, sps, dst0, linesize[0], ref0->f,
2222  &current_mv.mv[0], x0, y0, nPbW, nPbH,
2223  ref1->f, &current_mv.mv[1], &current_mv);
2224 
2225  if (sps->chroma_format_idc) {
2226  chroma_mc_bi(lc, pps, sps, dst1, linesize[1], ref0->f, ref1->f,
2227  x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 0);
2228 
2229  chroma_mc_bi(lc, pps, sps, dst2, linesize[2], ref0->f, ref1->f,
2230  x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 1);
2231  }
2232  }
2233 }
2234 
2235 /**
2236  * 8.4.1
2237  */
2239  const HEVCSPS *sps,
2240  int x0, int y0, int pu_size,
2241  int prev_intra_luma_pred_flag)
2242 {
2243  const HEVCContext *const s = lc->parent;
2244  int x_pu = x0 >> sps->log2_min_pu_size;
2245  int y_pu = y0 >> sps->log2_min_pu_size;
2246  int min_pu_width = sps->min_pu_width;
2247  int size_in_pus = pu_size >> sps->log2_min_pu_size;
2248  int x0b = av_zero_extend(x0, sps->log2_ctb_size);
2249  int y0b = av_zero_extend(y0, sps->log2_ctb_size);
2250 
2251  int cand_up = (lc->ctb_up_flag || y0b) ?
2252  l->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
2253  int cand_left = (lc->ctb_left_flag || x0b) ?
2254  l->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
2255 
2256  int y_ctb = (y0 >> (sps->log2_ctb_size)) << (sps->log2_ctb_size);
2257 
2258  MvField *tab_mvf = s->cur_frame->tab_mvf;
2259  int intra_pred_mode;
2260  int candidate[3];
2261  int i, j;
2262 
2263  // intra_pred_mode prediction does not cross vertical CTB boundaries
2264  if ((y0 - 1) < y_ctb)
2265  cand_up = INTRA_DC;
2266 
2267  if (cand_left == cand_up) {
2268  if (cand_left < 2) {
2269  candidate[0] = INTRA_PLANAR;
2270  candidate[1] = INTRA_DC;
2271  candidate[2] = INTRA_ANGULAR_26;
2272  } else {
2273  candidate[0] = cand_left;
2274  candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2275  candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2276  }
2277  } else {
2278  candidate[0] = cand_left;
2279  candidate[1] = cand_up;
2280  if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
2281  candidate[2] = INTRA_PLANAR;
2282  } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
2283  candidate[2] = INTRA_DC;
2284  } else {
2285  candidate[2] = INTRA_ANGULAR_26;
2286  }
2287  }
2288 
2289  if (prev_intra_luma_pred_flag) {
2290  intra_pred_mode = candidate[lc->pu.mpm_idx];
2291  } else {
2292  if (candidate[0] > candidate[1])
2293  FFSWAP(uint8_t, candidate[0], candidate[1]);
2294  if (candidate[0] > candidate[2])
2295  FFSWAP(uint8_t, candidate[0], candidate[2]);
2296  if (candidate[1] > candidate[2])
2297  FFSWAP(uint8_t, candidate[1], candidate[2]);
2298 
2299  intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
2300  for (i = 0; i < 3; i++)
2301  if (intra_pred_mode >= candidate[i])
2302  intra_pred_mode++;
2303  }
2304 
2305  /* write the intra prediction units into the mv array */
2306  if (!size_in_pus)
2307  size_in_pus = 1;
2308  for (i = 0; i < size_in_pus; i++) {
2309  memset(&l->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
2310  intra_pred_mode, size_in_pus);
2311 
2312  for (j = 0; j < size_in_pus; j++) {
2313  tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag = PF_INTRA;
2314  }
2315  }
2316 
2317  return intra_pred_mode;
2318 }
2319 
2320 static av_always_inline void set_ct_depth(const HEVCSPS *sps, uint8_t *tab_ct_depth,
2321  int x0, int y0,
2322  int log2_cb_size, int ct_depth)
2323 {
2324  int length = (1 << log2_cb_size) >> sps->log2_min_cb_size;
2325  int x_cb = x0 >> sps->log2_min_cb_size;
2326  int y_cb = y0 >> sps->log2_min_cb_size;
2327  int y;
2328 
2329  for (y = 0; y < length; y++)
2330  memset(&tab_ct_depth[(y_cb + y) * sps->min_cb_width + x_cb],
2331  ct_depth, length);
2332 }
2333 
2334 static const uint8_t tab_mode_idx[] = {
2335  0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2336  21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2337 
2339  const HEVCLayerContext *l, const HEVCSPS *sps,
2340  int x0, int y0,
2341  int log2_cb_size)
2342 {
2343  static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2344  uint8_t prev_intra_luma_pred_flag[4];
2345  int split = lc->cu.part_mode == PART_NxN;
2346  int pb_size = (1 << log2_cb_size) >> split;
2347  int side = split + 1;
2348  int chroma_mode;
2349  int i, j;
2350 
2351  for (i = 0; i < side; i++)
2352  for (j = 0; j < side; j++)
2353  prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(lc);
2354 
2355  for (i = 0; i < side; i++) {
2356  for (j = 0; j < side; j++) {
2357  if (prev_intra_luma_pred_flag[2 * i + j])
2358  lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(lc);
2359  else
2361 
2362  lc->pu.intra_pred_mode[2 * i + j] =
2363  luma_intra_pred_mode(lc, l, sps,
2364  x0 + pb_size * j, y0 + pb_size * i, pb_size,
2365  prev_intra_luma_pred_flag[2 * i + j]);
2366  }
2367  }
2368 
2369  if (sps->chroma_format_idc == 3) {
2370  for (i = 0; i < side; i++) {
2371  for (j = 0; j < side; j++) {
2372  lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2373  if (chroma_mode != 4) {
2374  if (lc->pu.intra_pred_mode[2 * i + j] == intra_chroma_table[chroma_mode])
2375  lc->pu.intra_pred_mode_c[2 * i + j] = 34;
2376  else
2377  lc->pu.intra_pred_mode_c[2 * i + j] = intra_chroma_table[chroma_mode];
2378  } else {
2379  lc->pu.intra_pred_mode_c[2 * i + j] = lc->pu.intra_pred_mode[2 * i + j];
2380  }
2381  }
2382  }
2383  } else if (sps->chroma_format_idc == 2) {
2384  int mode_idx;
2385  lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2386  if (chroma_mode != 4) {
2387  if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2388  mode_idx = 34;
2389  else
2390  mode_idx = intra_chroma_table[chroma_mode];
2391  } else {
2392  mode_idx = lc->pu.intra_pred_mode[0];
2393  }
2394  lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx];
2395  } else if (sps->chroma_format_idc != 0) {
2396  chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2397  if (chroma_mode != 4) {
2398  if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2399  lc->pu.intra_pred_mode_c[0] = 34;
2400  else
2401  lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode];
2402  } else {
2403  lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0];
2404  }
2405  }
2406 }
2407 
2409  const HEVCLayerContext *l,
2410  const HEVCSPS *sps,
2411  int x0, int y0,
2412  int log2_cb_size)
2413 {
2414  const HEVCContext *const s = lc->parent;
2415  int pb_size = 1 << log2_cb_size;
2416  int size_in_pus = pb_size >> sps->log2_min_pu_size;
2417  int min_pu_width = sps->min_pu_width;
2418  MvField *tab_mvf = s->cur_frame->tab_mvf;
2419  int x_pu = x0 >> sps->log2_min_pu_size;
2420  int y_pu = y0 >> sps->log2_min_pu_size;
2421  int j, k;
2422 
2423  if (size_in_pus == 0)
2424  size_in_pus = 1;
2425  for (j = 0; j < size_in_pus; j++)
2426  memset(&l->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2427  if (lc->cu.pred_mode == MODE_INTRA)
2428  for (j = 0; j < size_in_pus; j++)
2429  for (k = 0; k < size_in_pus; k++)
2430  tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA;
2431 }
2432 
2434  const HEVCLayerContext *l,
2435  const HEVCPPS *pps, const HEVCSPS *sps,
2436  int x0, int y0, int log2_cb_size)
2437 {
2438  int cb_size = 1 << log2_cb_size;
2439  int log2_min_cb_size = sps->log2_min_cb_size;
2440  int length = cb_size >> log2_min_cb_size;
2441  int min_cb_width = sps->min_cb_width;
2442  int x_cb = x0 >> log2_min_cb_size;
2443  int y_cb = y0 >> log2_min_cb_size;
2444  int idx = log2_cb_size - 2;
2445  int qp_block_mask = (1 << (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth)) - 1;
2446  int x, y, ret;
2447 
2448  lc->cu.x = x0;
2449  lc->cu.y = y0;
2450  lc->cu.pred_mode = MODE_INTRA;
2451  lc->cu.part_mode = PART_2Nx2N;
2452  lc->cu.intra_split_flag = 0;
2453 
2454  SAMPLE_CTB(l->skip_flag, x_cb, y_cb) = 0;
2455  for (x = 0; x < 4; x++)
2456  lc->pu.intra_pred_mode[x] = 1;
2457  if (pps->transquant_bypass_enable_flag) {
2459  if (lc->cu.cu_transquant_bypass_flag)
2460  set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_cb_size);
2461  } else
2462  lc->cu.cu_transquant_bypass_flag = 0;
2463 
2464  if (s->sh.slice_type != HEVC_SLICE_I) {
2465  const int x0b = av_zero_extend(x0, sps->log2_ctb_size);
2466  const int y0b = av_zero_extend(y0, sps->log2_ctb_size);
2467  uint8_t skip_flag = ff_hevc_skip_flag_decode(lc, l->skip_flag,
2468  x0b, y0b, x_cb, y_cb,
2469  min_cb_width);
2470 
2471  x = y_cb * min_cb_width + x_cb;
2472  for (y = 0; y < length; y++) {
2473  memset(&l->skip_flag[x], skip_flag, length);
2474  x += min_cb_width;
2475  }
2476  lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2477  } else {
2478  x = y_cb * min_cb_width + x_cb;
2479  for (y = 0; y < length; y++) {
2480  memset(&l->skip_flag[x], 0, length);
2481  x += min_cb_width;
2482  }
2483  }
2484 
2485  if (SAMPLE_CTB(l->skip_flag, x_cb, y_cb)) {
2486  hls_prediction_unit(lc, l, pps, sps,
2487  x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2488  intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2489 
2490  if (!s->sh.disable_deblocking_filter_flag)
2491  ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
2492  } else {
2493  int pcm_flag = 0;
2494 
2495  if (s->sh.slice_type != HEVC_SLICE_I)
2497  if (lc->cu.pred_mode != MODE_INTRA ||
2498  log2_cb_size == sps->log2_min_cb_size) {
2499  lc->cu.part_mode = ff_hevc_part_mode_decode(lc, sps, log2_cb_size);
2500  lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2501  lc->cu.pred_mode == MODE_INTRA;
2502  }
2503 
2504  if (lc->cu.pred_mode == MODE_INTRA) {
2505  if (lc->cu.part_mode == PART_2Nx2N && sps->pcm_enabled &&
2506  log2_cb_size >= sps->pcm.log2_min_pcm_cb_size &&
2507  log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) {
2508  pcm_flag = ff_hevc_pcm_flag_decode(lc);
2509  }
2510  if (pcm_flag) {
2511  intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2512  ret = hls_pcm_sample(lc, l, pps, x0, y0, log2_cb_size);
2513  if (sps->pcm_loop_filter_disabled)
2514  set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_cb_size);
2515 
2516  if (ret < 0)
2517  return ret;
2518  } else {
2519  intra_prediction_unit(lc, l, sps, x0, y0, log2_cb_size);
2520  }
2521  } else {
2522  intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2523  switch (lc->cu.part_mode) {
2524  case PART_2Nx2N:
2525  hls_prediction_unit(lc, l, pps, sps,
2526  x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2527  break;
2528  case PART_2NxN:
2529  hls_prediction_unit(lc, l, pps, sps,
2530  x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2531  hls_prediction_unit(lc, l, pps, sps,
2532  x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2533  break;
2534  case PART_Nx2N:
2535  hls_prediction_unit(lc, l, pps, sps,
2536  x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2537  hls_prediction_unit(lc, l, pps, sps,
2538  x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2539  break;
2540  case PART_2NxnU:
2541  hls_prediction_unit(lc, l, pps, sps,
2542  x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2543  hls_prediction_unit(lc, l, pps, sps,
2544  x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2545  break;
2546  case PART_2NxnD:
2547  hls_prediction_unit(lc, l, pps, sps,
2548  x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2549  hls_prediction_unit(lc, l, pps, sps,
2550  x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2551  break;
2552  case PART_nLx2N:
2553  hls_prediction_unit(lc, l, pps, sps,
2554  x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2555  hls_prediction_unit(lc, l, pps, sps,
2556  x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2557  break;
2558  case PART_nRx2N:
2559  hls_prediction_unit(lc, l, pps, sps,
2560  x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2561  hls_prediction_unit(lc, l, pps, sps,
2562  x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2563  break;
2564  case PART_NxN:
2565  hls_prediction_unit(lc, l, pps, sps,
2566  x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2567  hls_prediction_unit(lc, l, pps, sps,
2568  x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2569  hls_prediction_unit(lc, l, pps, sps,
2570  x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2571  hls_prediction_unit(lc, l, pps, sps,
2572  x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2573  break;
2574  }
2575  }
2576 
2577  if (!pcm_flag) {
2578  int rqt_root_cbf = 1;
2579 
2580  if (lc->cu.pred_mode != MODE_INTRA &&
2581  !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2582  rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(lc);
2583  }
2584  if (rqt_root_cbf) {
2585  const static int cbf[2] = { 0 };
2586  lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2587  sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2588  sps->max_transform_hierarchy_depth_inter;
2589  ret = hls_transform_tree(lc, l, pps, sps, x0, y0, x0, y0, x0, y0,
2590  log2_cb_size,
2591  log2_cb_size, 0, 0, cbf, cbf);
2592  if (ret < 0)
2593  return ret;
2594  } else {
2595  if (!s->sh.disable_deblocking_filter_flag)
2596  ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
2597  }
2598  }
2599  }
2600 
2601  if (pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2602  ff_hevc_set_qPy(lc, l, pps, x0, y0, log2_cb_size);
2603 
2604  x = y_cb * min_cb_width + x_cb;
2605  for (y = 0; y < length; y++) {
2606  memset(&l->qp_y_tab[x], lc->qp_y, length);
2607  x += min_cb_width;
2608  }
2609 
2610  if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2611  ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2612  lc->qPy_pred = lc->qp_y;
2613  }
2614 
2615  set_ct_depth(sps, l->tab_ct_depth, x0, y0, log2_cb_size, lc->ct_depth);
2616 
2617  return 0;
2618 }
2619 
2621  const HEVCLayerContext *l,
2622  const HEVCPPS *pps, const HEVCSPS *sps,
2623  int x0, int y0,
2624  int log2_cb_size, int cb_depth)
2625 {
2626  const HEVCContext *const s = lc->parent;
2627  const int cb_size = 1 << log2_cb_size;
2628  int ret;
2629  int split_cu;
2630 
2631  lc->ct_depth = cb_depth;
2632  if (x0 + cb_size <= sps->width &&
2633  y0 + cb_size <= sps->height &&
2634  log2_cb_size > sps->log2_min_cb_size) {
2636  sps, cb_depth, x0, y0);
2637  } else {
2638  split_cu = (log2_cb_size > sps->log2_min_cb_size);
2639  }
2640  if (pps->cu_qp_delta_enabled_flag &&
2641  log2_cb_size >= sps->log2_ctb_size - pps->diff_cu_qp_delta_depth) {
2642  lc->tu.is_cu_qp_delta_coded = 0;
2643  lc->tu.cu_qp_delta = 0;
2644  }
2645 
2646  if (s->sh.cu_chroma_qp_offset_enabled_flag &&
2647  log2_cb_size >= sps->log2_ctb_size - pps->diff_cu_chroma_qp_offset_depth) {
2649  }
2650 
2651  if (split_cu) {
2652  int qp_block_mask = (1 << (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth)) - 1;
2653  const int cb_size_split = cb_size >> 1;
2654  const int x1 = x0 + cb_size_split;
2655  const int y1 = y0 + cb_size_split;
2656 
2657  int more_data = 0;
2658 
2659  more_data = hls_coding_quadtree(lc, l, pps, sps,
2660  x0, y0, log2_cb_size - 1, cb_depth + 1);
2661  if (more_data < 0)
2662  return more_data;
2663 
2664  if (more_data && x1 < sps->width) {
2665  more_data = hls_coding_quadtree(lc, l, pps, sps,
2666  x1, y0, log2_cb_size - 1, cb_depth + 1);
2667  if (more_data < 0)
2668  return more_data;
2669  }
2670  if (more_data && y1 < sps->height) {
2671  more_data = hls_coding_quadtree(lc, l, pps, sps,
2672  x0, y1, log2_cb_size - 1, cb_depth + 1);
2673  if (more_data < 0)
2674  return more_data;
2675  }
2676  if (more_data && x1 < sps->width &&
2677  y1 < sps->height) {
2678  more_data = hls_coding_quadtree(lc, l, pps, sps,
2679  x1, y1, log2_cb_size - 1, cb_depth + 1);
2680  if (more_data < 0)
2681  return more_data;
2682  }
2683 
2684  if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2685  ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2686  lc->qPy_pred = lc->qp_y;
2687 
2688  if (more_data)
2689  return ((x1 + cb_size_split) < sps->width ||
2690  (y1 + cb_size_split) < sps->height);
2691  else
2692  return 0;
2693  } else {
2694  ret = hls_coding_unit(lc, s, l, pps, sps, x0, y0, log2_cb_size);
2695  if (ret < 0)
2696  return ret;
2697  if ((!((x0 + cb_size) %
2698  (1 << (sps->log2_ctb_size))) ||
2699  (x0 + cb_size >= sps->width)) &&
2700  (!((y0 + cb_size) %
2701  (1 << (sps->log2_ctb_size))) ||
2702  (y0 + cb_size >= sps->height))) {
2703  int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(lc);
2704  return !end_of_slice_flag;
2705  } else {
2706  return 1;
2707  }
2708  }
2709 
2710  return 0;
2711 }
2712 
2714  const HEVCLayerContext *l,
2715  const HEVCPPS *pps, const HEVCSPS *sps,
2716  int x_ctb, int y_ctb, int ctb_addr_ts)
2717 {
2718  const HEVCContext *const s = lc->parent;
2719  int ctb_size = 1 << sps->log2_ctb_size;
2720  int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2721  int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2722 
2723  l->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2724 
2725  if (pps->entropy_coding_sync_enabled_flag) {
2726  if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2727  lc->first_qp_group = 1;
2728  lc->end_of_tiles_x = sps->width;
2729  } else if (pps->tiles_enabled_flag) {
2730  if (ctb_addr_ts && pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]) {
2731  int idxX = pps->col_idxX[x_ctb >> sps->log2_ctb_size];
2732  lc->end_of_tiles_x = x_ctb + (pps->column_width[idxX] << sps->log2_ctb_size);
2733  lc->first_qp_group = 1;
2734  }
2735  } else {
2736  lc->end_of_tiles_x = sps->width;
2737  }
2738 
2739  lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, sps->height);
2740 
2741  lc->boundary_flags = 0;
2742  if (pps->tiles_enabled_flag) {
2743  if (x_ctb > 0 && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2745  if (x_ctb > 0 && l->tab_slice_address[ctb_addr_rs] != l->tab_slice_address[ctb_addr_rs - 1])
2747  if (y_ctb > 0 && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - sps->ctb_width]])
2749  if (y_ctb > 0 && l->tab_slice_address[ctb_addr_rs] != l->tab_slice_address[ctb_addr_rs - sps->ctb_width])
2751  } else {
2752  if (ctb_addr_in_slice <= 0)
2754  if (ctb_addr_in_slice < sps->ctb_width)
2756  }
2757 
2758  lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2759  lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2760  lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= sps->ctb_width) && (pps->tile_id[ctb_addr_ts] == pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - sps->ctb_width]]));
2761  lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= sps->ctb_width) && (pps->tile_id[ctb_addr_ts] == pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - sps->ctb_width]]));
2762 }
2763 
2765 {
2766  HEVCLocalContext *const lc = &s->local_ctx[0];
2767  const HEVCLayerContext *const l = &s->layers[s->cur_layer];
2768  const HEVCPPS *const pps = s->pps;
2769  const HEVCSPS *const sps = pps->sps;
2770  const uint8_t *slice_data = gb->buffer + s->sh.data_offset;
2771  const size_t slice_size = gb->buffer_end - gb->buffer - s->sh.data_offset;
2772  int ctb_size = 1 << sps->log2_ctb_size;
2773  int more_data = 1;
2774  int x_ctb = 0;
2775  int y_ctb = 0;
2776  int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2777  int ret;
2778 
2779  while (more_data && ctb_addr_ts < sps->ctb_size) {
2780  int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2781 
2782  x_ctb = (ctb_addr_rs % ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size;
2783  y_ctb = (ctb_addr_rs / ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size;
2784  hls_decode_neighbour(lc, l, pps, sps, x_ctb, y_ctb, ctb_addr_ts);
2785 
2786  ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, slice_data, slice_size, 0);
2787  if (ret < 0) {
2788  l->tab_slice_address[ctb_addr_rs] = -1;
2789  return ret;
2790  }
2791 
2792  hls_sao_param(lc, l, pps, sps,
2793  x_ctb >> sps->log2_ctb_size, y_ctb >> sps->log2_ctb_size);
2794 
2795  l->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2796  l->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2797  l->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2798 
2799  more_data = hls_coding_quadtree(lc, l, pps, sps, x_ctb, y_ctb, sps->log2_ctb_size, 0);
2800  if (more_data < 0) {
2801  l->tab_slice_address[ctb_addr_rs] = -1;
2802  return more_data;
2803  }
2804 
2805 
2806  ctb_addr_ts++;
2807  ff_hevc_save_states(lc, pps, ctb_addr_ts);
2808  ff_hevc_hls_filters(lc, l, pps, x_ctb, y_ctb, ctb_size);
2809  }
2810 
2811  if (x_ctb + ctb_size >= sps->width &&
2812  y_ctb + ctb_size >= sps->height)
2813  ff_hevc_hls_filter(lc, l, pps, x_ctb, y_ctb, ctb_size);
2814 
2815  return ctb_addr_ts;
2816 }
2817 
2818 static int hls_decode_entry_wpp(AVCodecContext *avctx, void *hevc_lclist,
2819  int job, int thread)
2820 {
2821  HEVCLocalContext *lc = &((HEVCLocalContext*)hevc_lclist)[thread];
2822  const HEVCContext *const s = lc->parent;
2823  const HEVCLayerContext *const l = &s->layers[s->cur_layer];
2824  const HEVCPPS *const pps = s->pps;
2825  const HEVCSPS *const sps = pps->sps;
2826  int ctb_size = 1 << sps->log2_ctb_size;
2827  int more_data = 1;
2828  int ctb_row = job;
2829  int ctb_addr_rs = s->sh.slice_ctb_addr_rs + ctb_row * ((sps->width + ctb_size - 1) >> sps->log2_ctb_size);
2830  int ctb_addr_ts = pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2831 
2832  const uint8_t *data = s->data + s->sh.offset[ctb_row];
2833  const size_t data_size = s->sh.size[ctb_row];
2834 
2835  int progress = 0;
2836 
2837  int ret;
2838 
2839  if (ctb_row)
2840  ff_init_cabac_decoder(&lc->cc, data, data_size);
2841 
2842  while(more_data && ctb_addr_ts < sps->ctb_size) {
2843  int x_ctb = (ctb_addr_rs % sps->ctb_width) << sps->log2_ctb_size;
2844  int y_ctb = (ctb_addr_rs / sps->ctb_width) << sps->log2_ctb_size;
2845 
2846  hls_decode_neighbour(lc, l, pps, sps, x_ctb, y_ctb, ctb_addr_ts);
2847 
2848  if (ctb_row)
2849  ff_thread_progress_await(&s->wpp_progress[ctb_row - 1],
2850  progress + SHIFT_CTB_WPP + 1);
2851 
2852  /* atomic_load's prototype requires a pointer to non-const atomic variable
2853  * (due to implementations via mutexes, where reads involve writes).
2854  * Of course, casting const away here is nevertheless safe. */
2855  if (atomic_load((atomic_int*)&s->wpp_err)) {
2856  ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2857  return 0;
2858  }
2859 
2860  ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, data, data_size, 1);
2861  if (ret < 0)
2862  goto error;
2863  hls_sao_param(lc, l, pps, sps,
2864  x_ctb >> sps->log2_ctb_size, y_ctb >> sps->log2_ctb_size);
2865 
2866  l->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2867  l->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2868  l->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2869 
2870  more_data = hls_coding_quadtree(lc, l, pps, sps, x_ctb, y_ctb, sps->log2_ctb_size, 0);
2871 
2872  if (more_data < 0) {
2873  ret = more_data;
2874  goto error;
2875  }
2876 
2877  ctb_addr_ts++;
2878 
2879  ff_hevc_save_states(lc, pps, ctb_addr_ts);
2880  ff_thread_progress_report(&s->wpp_progress[ctb_row], ++progress);
2881  ff_hevc_hls_filters(lc, l, pps, x_ctb, y_ctb, ctb_size);
2882 
2883  if (!more_data && (x_ctb+ctb_size) < sps->width && ctb_row != s->sh.num_entry_point_offsets) {
2884  /* Casting const away here is safe, because it is an atomic operation. */
2885  atomic_store((atomic_int*)&s->wpp_err, 1);
2886  ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2887  return 0;
2888  }
2889 
2890  if ((x_ctb+ctb_size) >= sps->width && (y_ctb+ctb_size) >= sps->height ) {
2891  ff_hevc_hls_filter(lc, l, pps, x_ctb, y_ctb, ctb_size);
2892  ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2893  return ctb_addr_ts;
2894  }
2895  ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2896  x_ctb+=ctb_size;
2897 
2898  if(x_ctb >= sps->width) {
2899  break;
2900  }
2901  }
2902  ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2903 
2904  return 0;
2905 error:
2906  l->tab_slice_address[ctb_addr_rs] = -1;
2907  /* Casting const away here is safe, because it is an atomic operation. */
2908  atomic_store((atomic_int*)&s->wpp_err, 1);
2909  ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2910  return ret;
2911 }
2912 
2913 static int wpp_progress_init(HEVCContext *s, unsigned count)
2914 {
2915  if (s->nb_wpp_progress < count) {
2916  void *tmp = av_realloc_array(s->wpp_progress, count,
2917  sizeof(*s->wpp_progress));
2918  if (!tmp)
2919  return AVERROR(ENOMEM);
2920 
2921  s->wpp_progress = tmp;
2922  memset(s->wpp_progress + s->nb_wpp_progress, 0,
2923  (count - s->nb_wpp_progress) * sizeof(*s->wpp_progress));
2924 
2925  for (int i = s->nb_wpp_progress; i < count; i++) {
2926  int ret = ff_thread_progress_init(&s->wpp_progress[i], 1);
2927  if (ret < 0)
2928  return ret;
2929  s->nb_wpp_progress = i + 1;
2930  }
2931  }
2932 
2933  for (int i = 0; i < count; i++)
2934  ff_thread_progress_reset(&s->wpp_progress[i]);
2935 
2936  return 0;
2937 }
2938 
2939 static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
2940 {
2941  const HEVCPPS *const pps = s->pps;
2942  const HEVCSPS *const sps = pps->sps;
2943  const uint8_t *data = nal->data;
2944  int length = nal->size;
2945  int *ret;
2946  int64_t offset;
2947  int64_t startheader, cmpt = 0;
2948  int i, j, res = 0;
2949 
2950  if (s->sh.slice_ctb_addr_rs + s->sh.num_entry_point_offsets * sps->ctb_width >= sps->ctb_width * sps->ctb_height) {
2951  av_log(s->avctx, AV_LOG_ERROR, "WPP ctb addresses are wrong (%d %d %d %d)\n",
2952  s->sh.slice_ctb_addr_rs, s->sh.num_entry_point_offsets,
2953  sps->ctb_width, sps->ctb_height
2954  );
2955  return AVERROR_INVALIDDATA;
2956  }
2957 
2958  if (s->avctx->thread_count > s->nb_local_ctx) {
2959  HEVCLocalContext *tmp = av_malloc_array(s->avctx->thread_count, sizeof(*s->local_ctx));
2960 
2961  if (!tmp)
2962  return AVERROR(ENOMEM);
2963 
2964  memcpy(tmp, s->local_ctx, sizeof(*s->local_ctx) * s->nb_local_ctx);
2965  av_free(s->local_ctx);
2966  s->local_ctx = tmp;
2967 
2968  for (unsigned i = s->nb_local_ctx; i < s->avctx->thread_count; i++) {
2969  tmp = &s->local_ctx[i];
2970 
2971  memset(tmp, 0, sizeof(*tmp));
2972 
2973  tmp->logctx = s->avctx;
2974  tmp->parent = s;
2975  tmp->common_cabac_state = &s->cabac;
2976  }
2977 
2978  s->nb_local_ctx = s->avctx->thread_count;
2979  }
2980 
2981  offset = s->sh.data_offset;
2982 
2983  for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2984  if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2985  startheader--;
2986  cmpt++;
2987  }
2988  }
2989 
2990  for (i = 1; i < s->sh.num_entry_point_offsets; i++) {
2991  offset += (s->sh.entry_point_offset[i - 1] - cmpt);
2992  for (j = 0, cmpt = 0, startheader = offset
2993  + s->sh.entry_point_offset[i]; j < nal->skipped_bytes; j++) {
2994  if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2995  startheader--;
2996  cmpt++;
2997  }
2998  }
2999  s->sh.size[i] = s->sh.entry_point_offset[i] - cmpt;
3000  s->sh.offset[i] = offset;
3001 
3002  }
3003 
3004  offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
3005  if (length < offset) {
3006  av_log(s->avctx, AV_LOG_ERROR, "entry_point_offset table is corrupted\n");
3007  return AVERROR_INVALIDDATA;
3008  }
3009  s->sh.size [s->sh.num_entry_point_offsets] = length - offset;
3010  s->sh.offset[s->sh.num_entry_point_offsets] = offset;
3011 
3012  s->sh.offset[0] = s->sh.data_offset;
3013  s->sh.size[0] = s->sh.offset[1] - s->sh.offset[0];
3014 
3015  s->data = data;
3016 
3017  for (i = 1; i < s->nb_local_ctx; i++) {
3018  s->local_ctx[i].first_qp_group = 1;
3019  s->local_ctx[i].qp_y = s->local_ctx[0].qp_y;
3020  }
3021 
3022  atomic_store(&s->wpp_err, 0);
3023  res = wpp_progress_init(s, s->sh.num_entry_point_offsets + 1);
3024  if (res < 0)
3025  return res;
3026 
3027  ret = av_calloc(s->sh.num_entry_point_offsets + 1, sizeof(*ret));
3028  if (!ret)
3029  return AVERROR(ENOMEM);
3030 
3031  if (pps->entropy_coding_sync_enabled_flag)
3032  s->avctx->execute2(s->avctx, hls_decode_entry_wpp, s->local_ctx, ret, s->sh.num_entry_point_offsets + 1);
3033 
3034  for (i = 0; i <= s->sh.num_entry_point_offsets; i++)
3035  res += ret[i];
3036 
3037  av_free(ret);
3038  return res;
3039 }
3040 
3042  const H2645NAL *nal, GetBitContext *gb)
3043 {
3044  const HEVCPPS *pps = s->pps;
3045  int ret;
3046 
3047  if (!s->sh.first_slice_in_pic_flag)
3048  s->slice_idx += !s->sh.dependent_slice_segment_flag;
3049 
3050  if (!s->sh.dependent_slice_segment_flag && s->sh.slice_type != HEVC_SLICE_I) {
3051  ret = ff_hevc_slice_rpl(s);
3052  if (ret < 0) {
3053  av_log(s->avctx, AV_LOG_WARNING,
3054  "Error constructing the reference lists for the current slice.\n");
3055  return ret;
3056  }
3057  }
3058 
3059  s->slice_initialized = 1;
3060 
3061  if (s->avctx->hwaccel)
3062  return FF_HW_CALL(s->avctx, decode_slice, nal->raw_data, nal->raw_size);
3063 
3064  if (s->avctx->profile == AV_PROFILE_HEVC_SCC) {
3065  av_log(s->avctx, AV_LOG_ERROR,
3066  "SCC profile is not yet implemented in hevc native decoder.\n");
3067  return AVERROR_PATCHWELCOME;
3068  }
3069 
3070  if (s->sh.dependent_slice_segment_flag) {
3071  int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
3072  int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
3073  if (l->tab_slice_address[prev_rs] != s->sh.slice_addr) {
3074  av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n");
3075  return AVERROR_INVALIDDATA;
3076  }
3077  }
3078 
3079  s->local_ctx[0].first_qp_group = !s->sh.dependent_slice_segment_flag;
3080 
3081  if (!pps->cu_qp_delta_enabled_flag)
3082  s->local_ctx[0].qp_y = s->sh.slice_qp;
3083 
3084  s->local_ctx[0].tu.cu_qp_offset_cb = 0;
3085  s->local_ctx[0].tu.cu_qp_offset_cr = 0;
3086 
3087  if (s->avctx->active_thread_type == FF_THREAD_SLICE &&
3088  s->sh.num_entry_point_offsets > 0 &&
3089  pps->num_tile_rows == 1 && pps->num_tile_columns == 1)
3090  return hls_slice_data_wpp(s, nal);
3091 
3092  return hls_decode_entry(s, gb);
3093 }
3094 
3096 {
3097  const HEVCSPS *sps = s->cur_frame->pps->sps;
3098  AVFrame *out = s->cur_frame->f;
3099  int ret;
3100 
3101  // Decrement the mastering display and content light level flag when IRAP
3102  // frame has no_rasl_output_flag=1 so the side data persists for the entire
3103  // coded video sequence.
3104  if (IS_IRAP(s) && s->no_rasl_output_flag) {
3105  if (s->sei.common.mastering_display.present > 0)
3106  s->sei.common.mastering_display.present--;
3107 
3108  if (s->sei.common.content_light.present > 0)
3109  s->sei.common.content_light.present--;
3110  }
3111 
3112  ret = ff_h2645_sei_to_frame(out, &s->sei.common, AV_CODEC_ID_HEVC, s->avctx,
3113  &sps->vui.common,
3114  sps->bit_depth, sps->bit_depth_chroma,
3115  s->cur_frame->poc /* no poc_offset in HEVC */);
3116  if (ret < 0)
3117  return ret;
3118 
3119  if (s->sei.timecode.present) {
3120  uint32_t *tc_sd;
3121  char tcbuf[AV_TIMECODE_STR_SIZE];
3122  AVFrameSideData *tcside;
3124  sizeof(uint32_t) * 4, &tcside);
3125  if (ret < 0)
3126  return ret;
3127 
3128  if (tcside) {
3129  tc_sd = (uint32_t*)tcside->data;
3130  tc_sd[0] = s->sei.timecode.num_clock_ts;
3131 
3132  for (int i = 0; i < tc_sd[0]; i++) {
3133  int drop = s->sei.timecode.cnt_dropped_flag[i];
3134  int hh = s->sei.timecode.hours_value[i];
3135  int mm = s->sei.timecode.minutes_value[i];
3136  int ss = s->sei.timecode.seconds_value[i];
3137  int ff = s->sei.timecode.n_frames[i];
3138 
3139  tc_sd[i + 1] = av_timecode_get_smpte(s->avctx->framerate, drop, hh, mm, ss, ff);
3140  av_timecode_make_smpte_tc_string2(tcbuf, s->avctx->framerate, tc_sd[i + 1], 0, 0);
3141  av_dict_set(&out->metadata, "timecode", tcbuf, 0);
3142  }
3143  }
3144 
3145  s->sei.timecode.num_clock_ts = 0;
3146  }
3147 
3148  if (s->sei.common.dynamic_hdr_plus.info) {
3149  AVBufferRef *info_ref = av_buffer_ref(s->sei.common.dynamic_hdr_plus.info);
3150  if (!info_ref)
3151  return AVERROR(ENOMEM);
3152 
3154  if (ret < 0)
3155  return ret;
3156  }
3157 
3158  if (s->rpu_buf) {
3160  if (!rpu)
3161  return AVERROR(ENOMEM);
3162 
3163  s->rpu_buf = NULL;
3164  }
3165 
3166  if ((ret = ff_dovi_attach_side_data(&s->dovi_ctx, out)) < 0)
3167  return ret;
3168 
3169  if (s->sei.common.dynamic_hdr_vivid.info) {
3170  if (!av_frame_side_data_add(&out->side_data, &out->nb_side_data,
3172  &s->sei.common.dynamic_hdr_vivid.info,
3174  return AVERROR(ENOMEM);
3175  }
3176 
3177  return 0;
3178 }
3179 
3181 {
3182  int nal_idx = 0;
3183 
3184  for (int i = nal_idx; i < s->pkt.nb_nals; i++) {
3185  const H2645NAL *nal = &s->pkt.nals[i];
3186  const int layer_id = nal->nuh_layer_id;
3187  GetBitContext gb = nal->gb;
3188 
3189  if (layer_id > HEVC_MAX_NUH_LAYER_ID || s->vps->layer_idx[layer_id] < 0 ||
3190  !(s->layers_active_decode & (1 << s->vps->layer_idx[layer_id])))
3191  continue;
3192 
3193  switch (nal->type) {
3194  case HEVC_NAL_TRAIL_R:
3195  case HEVC_NAL_TRAIL_N:
3196  case HEVC_NAL_TSA_N:
3197  case HEVC_NAL_TSA_R:
3198  case HEVC_NAL_STSA_N:
3199  case HEVC_NAL_STSA_R:
3200  case HEVC_NAL_BLA_W_LP:
3201  case HEVC_NAL_BLA_W_RADL:
3202  case HEVC_NAL_BLA_N_LP:
3203  case HEVC_NAL_IDR_W_RADL:
3204  case HEVC_NAL_IDR_N_LP:
3205  case HEVC_NAL_CRA_NUT:
3206  case HEVC_NAL_RADL_N:
3207  case HEVC_NAL_RADL_R:
3208  case HEVC_NAL_RASL_N:
3209  case HEVC_NAL_RASL_R:
3210  if (!get_bits1(&gb)) // first_slice_segment_in_pic_flag
3211  continue;
3212  case HEVC_NAL_VPS:
3213  case HEVC_NAL_SPS:
3214  case HEVC_NAL_PPS:
3215  nal_idx = i;
3216  break;
3217  }
3218  }
3219 
3220  return nal_idx;
3221 }
3222 
3224  unsigned nal_idx)
3225 {
3226  const HEVCPPS *const pps = s->ps.pps_list[s->sh.pps_id];
3227  const HEVCSPS *const sps = pps->sps;
3228  int pic_size_in_ctb = ((sps->width >> sps->log2_min_cb_size) + 1) *
3229  ((sps->height >> sps->log2_min_cb_size) + 1);
3230  int new_sequence = (l == &s->layers[0]) &&
3231  (IS_IDR(s) || IS_BLA(s) || s->last_eos);
3232  int prev_layers_active_decode = s->layers_active_decode;
3233  int prev_layers_active_output = s->layers_active_output;
3234  int ret;
3235 
3236  if (sps->vps != s->vps && l != &s->layers[0]) {
3237  av_log(s->avctx, AV_LOG_ERROR, "VPS changed in a non-base layer\n");
3238  set_sps(s, l, NULL);
3239  return AVERROR_INVALIDDATA;
3240  }
3241 
3242  av_refstruct_replace(&s->pps, pps);
3243  if (l->sps != sps) {
3244  const HEVCSPS *sps_base = s->layers[0].sps;
3245  enum AVPixelFormat pix_fmt = sps->pix_fmt;
3246 
3247  if (l != &s->layers[0]) {
3248  if (!sps_base) {
3249  av_log(s->avctx, AV_LOG_ERROR,
3250  "Access unit starts with a non-base layer frame\n");
3251  return AVERROR_INVALIDDATA;
3252  }
3253 
3254  // Files produced by Vision Pro lack VPS extension VUI,
3255  // so the secondary layer has no range information.
3256  // This check avoids failing in such a case.
3257  if (sps_base->pix_fmt == AV_PIX_FMT_YUVJ420P &&
3258  sps->pix_fmt == AV_PIX_FMT_YUV420P &&
3259  !sps->vui.common.video_signal_type_present_flag)
3260  pix_fmt = sps_base->pix_fmt;
3261 
3262  // Ignore range mismatch between base layer and alpha layer
3263  if (ff_hevc_is_alpha_video(s) &&
3264  sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
3266  pix_fmt = sps_base->pix_fmt;
3267 
3268  if (pix_fmt != sps_base->pix_fmt ||
3269  sps->width != sps_base->width ||
3270  sps->height != sps_base->height) {
3271  av_log(s->avctx, AV_LOG_ERROR,
3272  "Base/non-base layer SPS have unsupported parameter combination\n");
3273  return AVERROR(ENOSYS);
3274  }
3275  }
3276 
3277  ff_hevc_clear_refs(l);
3278 
3279  ret = set_sps(s, l, sps);
3280  if (ret < 0)
3281  return ret;
3282 
3283  if (l == &s->layers[0]) {
3285 
3286  ret = get_format(s, sps);
3287  if (ret < 0) {
3288  set_sps(s, l, NULL);
3289  return ret;
3290  }
3291 
3292  new_sequence = 1;
3293  }
3294  }
3295 
3296  memset(l->horizontal_bs, 0, l->bs_width * l->bs_height);
3297  memset(l->vertical_bs, 0, l->bs_width * l->bs_height);
3298  memset(l->cbf_luma, 0, sps->min_tb_width * sps->min_tb_height);
3299  memset(l->is_pcm, 0, (sps->min_pu_width + 1) * (sps->min_pu_height + 1));
3300  memset(l->tab_slice_address, -1, pic_size_in_ctb * sizeof(*l->tab_slice_address));
3301 
3302  if (IS_IDR(s))
3303  ff_hevc_clear_refs(l);
3304 
3305  s->slice_idx = 0;
3306  s->first_nal_type = s->nal_unit_type;
3307  s->poc = s->sh.poc;
3308 
3309  if (IS_IRAP(s)) {
3310  s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) ||
3311  (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos);
3312  s->recovery_poc = HEVC_RECOVERY_END;
3313  }
3314 
3315  if (s->recovery_poc != HEVC_RECOVERY_END &&
3316  s->sei.recovery_point.has_recovery_poc) {
3317  if (s->recovery_poc == HEVC_RECOVERY_UNSPECIFIED)
3318  s->recovery_poc = s->poc + s->sei.recovery_point.recovery_poc_cnt;
3319  else if (s->poc >= s->recovery_poc)
3320  s->recovery_poc = HEVC_RECOVERY_END;
3321  }
3322 
3323  /* 8.3.1 */
3324  if (s->temporal_id == 0 &&
3325  s->nal_unit_type != HEVC_NAL_TRAIL_N &&
3326  s->nal_unit_type != HEVC_NAL_TSA_N &&
3327  s->nal_unit_type != HEVC_NAL_STSA_N &&
3328  s->nal_unit_type != HEVC_NAL_RADL_N &&
3329  s->nal_unit_type != HEVC_NAL_RADL_R &&
3330  s->nal_unit_type != HEVC_NAL_RASL_N &&
3331  s->nal_unit_type != HEVC_NAL_RASL_R)
3332  s->poc_tid0 = s->poc;
3333 
3334  if (pps->tiles_enabled_flag)
3335  s->local_ctx[0].end_of_tiles_x = pps->column_width[0] << sps->log2_ctb_size;
3336 
3337  if (new_sequence) {
3338  ret = ff_hevc_output_frames(s, prev_layers_active_decode, prev_layers_active_output,
3339  0, 0, s->sh.no_output_of_prior_pics_flag);
3340  if (ret < 0)
3341  return ret;
3342  }
3343 
3345  if (ret < 0)
3346  return ret;
3347 
3348  ret = ff_hevc_set_new_ref(s, l, s->poc);
3349  if (ret < 0)
3350  goto fail;
3351 
3352  ret = ff_hevc_frame_rps(s, l);
3353  if (ret < 0) {
3354  av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
3355  goto fail;
3356  }
3357 
3358  if (IS_IRAP(s))
3359  s->cur_frame->f->flags |= AV_FRAME_FLAG_KEY;
3360  else
3361  s->cur_frame->f->flags &= ~AV_FRAME_FLAG_KEY;
3362 
3363  s->cur_frame->needs_fg = ((s->sei.common.film_grain_characteristics &&
3364  s->sei.common.film_grain_characteristics->present) ||
3365  s->sei.common.aom_film_grain.enable) &&
3366  !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
3367  !s->avctx->hwaccel;
3368 
3369  ret = set_side_data(s);
3370  if (ret < 0)
3371  goto fail;
3372 
3373  if (s->cur_frame->needs_fg &&
3374  (s->sei.common.film_grain_characteristics && s->sei.common.film_grain_characteristics->present &&
3375  !ff_h274_film_grain_params_supported(s->sei.common.film_grain_characteristics->model_id,
3376  s->cur_frame->f->format) ||
3377  !av_film_grain_params_select(s->cur_frame->f))) {
3378  av_log_once(s->avctx, AV_LOG_WARNING, AV_LOG_DEBUG, &s->film_grain_warning_shown,
3379  "Unsupported film grain parameters. Ignoring film grain.\n");
3380  s->cur_frame->needs_fg = 0;
3381  }
3382 
3383  if (s->cur_frame->needs_fg) {
3384  s->cur_frame->frame_grain->format = s->cur_frame->f->format;
3385  s->cur_frame->frame_grain->width = s->cur_frame->f->width;
3386  s->cur_frame->frame_grain->height = s->cur_frame->f->height;
3387  if ((ret = ff_thread_get_buffer(s->avctx, s->cur_frame->frame_grain, 0)) < 0)
3388  goto fail;
3389 
3390  ret = av_frame_copy_props(s->cur_frame->frame_grain, s->cur_frame->f);
3391  if (ret < 0)
3392  goto fail;
3393  }
3394 
3395  s->cur_frame->f->pict_type = 3 - s->sh.slice_type;
3396 
3397  ret = ff_hevc_output_frames(s, s->layers_active_decode, s->layers_active_output,
3398  sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics,
3399  sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering, 0);
3400  if (ret < 0)
3401  goto fail;
3402 
3403  if (s->avctx->hwaccel) {
3404  ret = FF_HW_CALL(s->avctx, start_frame, NULL, 0);
3405  if (ret < 0)
3406  goto fail;
3407  }
3408 
3409  // after starting the base-layer frame we know which layers will be decoded,
3410  // so we can now figure out which NALUs to wait for before we can call
3411  // ff_thread_finish_setup()
3412  if (l == &s->layers[0])
3413  s->finish_setup_nal_idx = find_finish_setup_nal(s);
3414 
3415  if (nal_idx >= s->finish_setup_nal_idx)
3416  ff_thread_finish_setup(s->avctx);
3417 
3418  return 0;
3419 
3420 fail:
3421  if (l->cur_frame)
3423  l->cur_frame = NULL;
3424  s->cur_frame = s->collocated_ref = NULL;
3425  s->slice_initialized = 0;
3426  return ret;
3427 }
3428 
3430 {
3432  char msg_buf[4 * (50 + 2 * 2 * 16 /* MD5-size */)];
3433  int pixel_shift;
3434  int err = 0;
3435  int i, j;
3436 
3437  if (!desc)
3438  return AVERROR(EINVAL);
3439 
3440  pixel_shift = desc->comp[0].depth > 8;
3441 
3442  /* the checksums are LE, so we have to byteswap for >8bpp formats
3443  * on BE arches */
3444 #if HAVE_BIGENDIAN
3445  if (pixel_shift && !s->checksum_buf) {
3446  av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
3447  FFMAX3(frame->linesize[0], frame->linesize[1],
3448  frame->linesize[2]));
3449  if (!s->checksum_buf)
3450  return AVERROR(ENOMEM);
3451  }
3452 #endif
3453 
3454  msg_buf[0] = '\0';
3455  for (i = 0; frame->data[i]; i++) {
3456  int width = s->avctx->coded_width;
3457  int height = s->avctx->coded_height;
3458  int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
3459  int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
3460  uint8_t md5[16];
3461 
3462  av_md5_init(s->md5_ctx);
3463  for (j = 0; j < h; j++) {
3464  const uint8_t *src = frame->data[i] + j * frame->linesize[i];
3465 #if HAVE_BIGENDIAN
3466  if (pixel_shift) {
3467  s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
3468  (const uint16_t *) src, w);
3469  src = s->checksum_buf;
3470  }
3471 #endif
3472  av_md5_update(s->md5_ctx, src, w << pixel_shift);
3473  }
3474  av_md5_final(s->md5_ctx, md5);
3475 
3476 #define MD5_PRI "%016" PRIx64 "%016" PRIx64
3477 #define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3478 
3479  if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) {
3480  av_strlcatf(msg_buf, sizeof(msg_buf),
3481  "plane %d - correct " MD5_PRI "; ",
3482  i, MD5_PRI_ARG(md5));
3483  } else {
3484  av_strlcatf(msg_buf, sizeof(msg_buf),
3485  "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3486  i, MD5_PRI_ARG(md5), MD5_PRI_ARG(s->sei.picture_hash.md5[i]));
3487  err = AVERROR_INVALIDDATA;
3488  }
3489  }
3490 
3491  av_log(s->avctx, err < 0 ? AV_LOG_ERROR : AV_LOG_DEBUG,
3492  "Verifying checksum for frame with POC %d: %s\n",
3493  s->poc, msg_buf);
3494 
3495  return err;
3496  }
3497 
3499 {
3500  HEVCFrame *out = l->cur_frame;
3501  const AVFilmGrainParams *fgp;
3502  av_unused int ret;
3503 
3504  if (out->needs_fg) {
3505  av_assert0(out->frame_grain->buf[0]);
3506  fgp = av_film_grain_params_select(out->f);
3507  switch (fgp->type) {
3509  av_assert0(0);
3510  return AVERROR_BUG;
3512  ret = ff_h274_apply_film_grain(out->frame_grain, out->f,
3513  &s->h274db, fgp);
3514  break;
3516  ret = ff_aom_apply_film_grain(out->frame_grain, out->f, fgp);
3517  break;
3518  }
3519  av_assert1(ret >= 0);
3520  }
3521 
3522  if (s->avctx->hwaccel) {
3523  ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame);
3524  if (ret < 0) {
3525  av_log(s->avctx, AV_LOG_ERROR,
3526  "hardware accelerator failed to decode picture\n");
3527  return ret;
3528  }
3529  } else {
3530  if (s->avctx->err_recognition & AV_EF_CRCCHECK &&
3531  s->sei.picture_hash.is_md5) {
3532  ret = verify_md5(s, out->f);
3533  if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE)
3534  return ret;
3535  }
3536  }
3537  s->sei.picture_hash.is_md5 = 0;
3538 
3539  av_log(s->avctx, AV_LOG_DEBUG, "Decoded frame with POC %zu/%d.\n",
3540  l - s->layers, s->poc);
3541 
3542  return 0;
3543 }
3544 
3545 static int decode_slice(HEVCContext *s, unsigned nal_idx, GetBitContext *gb)
3546 {
3547  const int layer_idx = s->vps ? s->vps->layer_idx[s->nuh_layer_id] : 0;
3548  HEVCLayerContext *l;
3549  int ret;
3550 
3551  // skip layers not requested to be decoded
3552  // layers_active_decode can only change while decoding a base-layer frame,
3553  // so we can check it for non-base layers
3554  if (layer_idx < 0 ||
3555  (s->nuh_layer_id > 0 && !(s->layers_active_decode & (1 << layer_idx))))
3556  return 0;
3557 
3558  ret = hls_slice_header(&s->sh, s, gb);
3559  if (ret < 0) {
3560  // hls_slice_header() does not cleanup on failure thus the state now is inconsistant so we cannot use it on depandant slices
3561  s->slice_initialized = 0;
3562  return ret;
3563  }
3564 
3565  if ((s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) ||
3566  (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) ||
3567  (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s)) ||
3568  ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) &&
3569  s->no_rasl_output_flag)) {
3570  return 0;
3571  }
3572 
3573  // switching to a new layer, mark previous layer's frame (if any) as done
3574  if (s->cur_layer != layer_idx &&
3575  s->layers[s->cur_layer].cur_frame &&
3576  s->avctx->active_thread_type == FF_THREAD_FRAME)
3577  ff_progress_frame_report(&s->layers[s->cur_layer].cur_frame->tf, INT_MAX);
3578 
3579  s->cur_layer = layer_idx;
3580  l = &s->layers[s->cur_layer];
3581 
3582  if (s->sh.first_slice_in_pic_flag) {
3583  if (l->cur_frame) {
3584  av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
3585  return AVERROR_INVALIDDATA;
3586  }
3587 
3588  ret = hevc_frame_start(s, l, nal_idx);
3589  if (ret < 0)
3590  return ret;
3591  } else if (!l->cur_frame) {
3592  av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
3593  return AVERROR_INVALIDDATA;
3594  }
3595 
3596  if (s->nal_unit_type != s->first_nal_type) {
3597  av_log(s->avctx, AV_LOG_ERROR,
3598  "Non-matching NAL types of the VCL NALUs: %d %d\n",
3599  s->first_nal_type, s->nal_unit_type);
3600  return AVERROR_INVALIDDATA;
3601  }
3602 
3603  ret = decode_slice_data(s, l, &s->pkt.nals[nal_idx], gb);
3604  if (ret < 0)
3605  return ret;
3606 
3607  return 0;
3608 }
3609 
3610 static int decode_nal_unit(HEVCContext *s, unsigned nal_idx)
3611 {
3612  H2645NAL *nal = &s->pkt.nals[nal_idx];
3613  GetBitContext gb = nal->gb;
3614  int ret;
3615 
3616  s->nal_unit_type = nal->type;
3617  s->nuh_layer_id = nal->nuh_layer_id;
3618  s->temporal_id = nal->temporal_id;
3619 
3620  if (FF_HW_HAS_CB(s->avctx, decode_params) &&
3621  (s->nal_unit_type == HEVC_NAL_VPS ||
3622  s->nal_unit_type == HEVC_NAL_SPS ||
3623  s->nal_unit_type == HEVC_NAL_PPS ||
3624  s->nal_unit_type == HEVC_NAL_SEI_PREFIX ||
3625  s->nal_unit_type == HEVC_NAL_SEI_SUFFIX)) {
3626  ret = FF_HW_CALL(s->avctx, decode_params,
3627  nal->type, nal->raw_data, nal->raw_size);
3628  if (ret < 0)
3629  goto fail;
3630  }
3631 
3632  switch (s->nal_unit_type) {
3633  case HEVC_NAL_VPS:
3634  ret = ff_hevc_decode_nal_vps(&gb, s->avctx, &s->ps);
3635  if (ret < 0)
3636  goto fail;
3637  break;
3638  case HEVC_NAL_SPS:
3639  ret = ff_hevc_decode_nal_sps(&gb, s->avctx, &s->ps,
3640  nal->nuh_layer_id, s->apply_defdispwin);
3641  if (ret < 0)
3642  goto fail;
3643  break;
3644  case HEVC_NAL_PPS:
3645  ret = ff_hevc_decode_nal_pps(&gb, s->avctx, &s->ps);
3646  if (ret < 0)
3647  goto fail;
3648  break;
3649  case HEVC_NAL_SEI_PREFIX:
3650  case HEVC_NAL_SEI_SUFFIX:
3651  ret = ff_hevc_decode_nal_sei(&gb, s->avctx, &s->sei, &s->ps, s->nal_unit_type);
3652  if (ret < 0)
3653  goto fail;
3654  break;
3655  case HEVC_NAL_TRAIL_R:
3656  case HEVC_NAL_TRAIL_N:
3657  case HEVC_NAL_TSA_N:
3658  case HEVC_NAL_TSA_R:
3659  case HEVC_NAL_STSA_N:
3660  case HEVC_NAL_STSA_R:
3661  case HEVC_NAL_BLA_W_LP:
3662  case HEVC_NAL_BLA_W_RADL:
3663  case HEVC_NAL_BLA_N_LP:
3664  case HEVC_NAL_IDR_W_RADL:
3665  case HEVC_NAL_IDR_N_LP:
3666  case HEVC_NAL_CRA_NUT:
3667  case HEVC_NAL_RADL_N:
3668  case HEVC_NAL_RADL_R:
3669  case HEVC_NAL_RASL_N:
3670  case HEVC_NAL_RASL_R:
3671  ret = decode_slice(s, nal_idx, &gb);
3672  if (ret < 0)
3673  goto fail;
3674  break;
3675  case HEVC_NAL_EOS_NUT:
3676  case HEVC_NAL_EOB_NUT:
3677  case HEVC_NAL_AUD:
3678  case HEVC_NAL_FD_NUT:
3679  case HEVC_NAL_UNSPEC62:
3680  break;
3681  default:
3682  av_log(s->avctx, AV_LOG_INFO,
3683  "Skipping NAL unit %d\n", s->nal_unit_type);
3684  }
3685 
3686  return 0;
3687 fail:
3688  if (ret == AVERROR_INVALIDDATA &&
3689  !(s->avctx->err_recognition & AV_EF_EXPLODE)) {
3690  av_log(s->avctx, AV_LOG_WARNING,
3691  "Skipping invalid undecodable NALU: %d\n", s->nal_unit_type);
3692  return 0;
3693  }
3694  return ret;
3695 }
3696 
3698 {
3699  s->recovery_poc = HEVC_RECOVERY_UNSPECIFIED;
3700  s->sei.recovery_point.has_recovery_poc = 0;
3701 }
3702 
3703 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
3704 {
3705  int i, ret = 0;
3706  int eos_at_start = 1;
3707  int flags = (H2645_FLAG_IS_NALFF * !!s->is_nalff) | H2645_FLAG_SMALL_PADDING;
3708 
3709  s->cur_frame = s->collocated_ref = NULL;
3710  s->last_eos = s->eos;
3711  s->eos = 0;
3712  s->slice_initialized = 0;
3713  if (s->last_eos)
3715 
3716  for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3717  HEVCLayerContext *l = &s->layers[i];
3718  l->cur_frame = NULL;
3719  }
3720 
3721  /* split the input packet into NAL units, so we know the upper bound on the
3722  * number of slices in the frame */
3723  ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx,
3724  s->nal_length_size, s->avctx->codec_id, flags);
3725  if (ret < 0) {
3726  av_log(s->avctx, AV_LOG_ERROR,
3727  "Error splitting the input into NAL units.\n");
3728  return ret;
3729  }
3730 
3731  for (i = 0; i < s->pkt.nb_nals; i++) {
3732  if (s->pkt.nals[i].type == HEVC_NAL_EOB_NUT ||
3733  s->pkt.nals[i].type == HEVC_NAL_EOS_NUT) {
3734  if (eos_at_start) {
3735  s->last_eos = 1;
3737  } else {
3738  s->eos = 1;
3739  }
3740  } else {
3741  eos_at_start = 0;
3742  }
3743  }
3744 
3745  /*
3746  * Check for RPU delimiter.
3747  *
3748  * Dolby Vision RPUs masquerade as unregistered NALs of type 62.
3749  *
3750  * We have to do this check here an create the rpu buffer, since RPUs are appended
3751  * to the end of an AU; they are the last non-EOB/EOS NAL in the AU.
3752  */
3753  if (s->pkt.nb_nals > 1 && s->pkt.nals[s->pkt.nb_nals - 1].type == HEVC_NAL_UNSPEC62 &&
3754  s->pkt.nals[s->pkt.nb_nals - 1].size > 2 && !s->pkt.nals[s->pkt.nb_nals - 1].nuh_layer_id
3755  && !s->pkt.nals[s->pkt.nb_nals - 1].temporal_id) {
3756  H2645NAL *nal = &s->pkt.nals[s->pkt.nb_nals - 1];
3757  if (s->rpu_buf) {
3758  av_buffer_unref(&s->rpu_buf);
3759  av_log(s->avctx, AV_LOG_WARNING, "Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3760  }
3761 
3762  s->rpu_buf = av_buffer_alloc(nal->raw_size - 2);
3763  if (!s->rpu_buf)
3764  return AVERROR(ENOMEM);
3765  memcpy(s->rpu_buf->data, nal->raw_data + 2, nal->raw_size - 2);
3766 
3767  ret = ff_dovi_rpu_parse(&s->dovi_ctx, nal->data + 2, nal->size - 2,
3768  s->avctx->err_recognition);
3769  if (ret < 0) {
3770  av_buffer_unref(&s->rpu_buf);
3771  av_log(s->avctx, AV_LOG_WARNING, "Error parsing DOVI NAL unit.\n");
3772  /* ignore */
3773  }
3774  }
3775 
3776  /* decode the NAL units */
3777  for (i = 0; i < s->pkt.nb_nals; i++) {
3778  H2645NAL *nal = &s->pkt.nals[i];
3779 
3780  if (s->avctx->skip_frame >= AVDISCARD_ALL ||
3781  (s->avctx->skip_frame >= AVDISCARD_NONREF && ff_hevc_nal_is_nonref(nal->type)))
3782  continue;
3783 
3784  ret = decode_nal_unit(s, i);
3785  if (ret < 0) {
3786  av_log(s->avctx, AV_LOG_WARNING,
3787  "Error parsing NAL unit #%d.\n", i);
3788  goto fail;
3789  }
3790  }
3791 
3792 fail:
3793  for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3794  HEVCLayerContext *l = &s->layers[i];
3795 
3796  if (!l->cur_frame)
3797  continue;
3798 
3799  if (ret >= 0)
3800  ret = hevc_frame_end(s, l);
3801 
3802  if (s->avctx->active_thread_type == FF_THREAD_FRAME)
3803  ff_progress_frame_report(&l->cur_frame->tf, INT_MAX);
3804  }
3805 
3806  return ret;
3807 }
3808 
3809 static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first)
3810 {
3811  int ret, i;
3812 
3813  ret = ff_hevc_decode_extradata(buf, length, &s->ps, &s->sei, &s->is_nalff,
3814  &s->nal_length_size, s->avctx->err_recognition,
3815  s->apply_defdispwin, s->avctx);
3816  if (ret < 0)
3817  return ret;
3818 
3819  /* export stream parameters from the first SPS */
3820  for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
3821  if (first && s->ps.sps_list[i]) {
3822  const HEVCSPS *sps = s->ps.sps_list[i];
3824 
3825  ret = export_multilayer(s, sps->vps);
3826  if (ret < 0)
3827  return ret;
3828 
3829  break;
3830  }
3831  }
3832 
3833  /* export stream parameters from SEI */
3835  if (ret < 0)
3836  return ret;
3837 
3838  return 0;
3839 }
3840 
3842 {
3843  HEVCContext *s = avctx->priv_data;
3844  AVCodecInternal *avci = avctx->internal;
3845  AVPacket *avpkt = avci->in_pkt;
3846 
3847  int ret;
3848  uint8_t *sd;
3849  size_t sd_size;
3850 
3851  s->pkt_dts = AV_NOPTS_VALUE;
3852 
3853  if (av_container_fifo_can_read(s->output_fifo))
3854  goto do_output;
3855 
3856  av_packet_unref(avpkt);
3857  ret = ff_decode_get_packet(avctx, avpkt);
3858  if (ret == AVERROR_EOF) {
3859  ret = ff_hevc_output_frames(s, s->layers_active_decode,
3860  s->layers_active_output, 0, 0, 0);
3861  if (ret < 0)
3862  return ret;
3863  goto do_output;
3864  } else if (ret < 0)
3865  return ret;
3866 
3867  s->pkt_dts = avpkt->dts;
3868 
3869  sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, &sd_size);
3870  if (sd && sd_size > 0) {
3871  ret = hevc_decode_extradata(s, sd, sd_size, 0);
3872  if (ret < 0)
3873  return ret;
3874  }
3875 
3876  sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size);
3877  if (sd && sd_size >= sizeof(s->dovi_ctx.cfg)) {
3878  int old = s->dovi_ctx.cfg.dv_profile;
3879  s->dovi_ctx.cfg = *(AVDOVIDecoderConfigurationRecord *) sd;
3880  if (old)
3881  av_log(avctx, AV_LOG_DEBUG,
3882  "New DOVI configuration record from input packet (profile %d -> %u).\n",
3883  old, s->dovi_ctx.cfg.dv_profile);
3884  }
3885 
3886  ret = decode_nal_units(s, avpkt->data, avpkt->size);
3887  if (ret < 0)
3888  return ret;
3889 
3890 do_output:
3891  if (av_container_fifo_read(s->output_fifo, frame, 0) >= 0) {
3894 
3895  return 0;
3896  }
3897 
3898  return avci->draining ? AVERROR_EOF : AVERROR(EAGAIN);
3899 }
3900 
3902 {
3903  int ret;
3904 
3905  ff_progress_frame_ref(&dst->tf, &src->tf);
3906 
3907  if (src->needs_fg) {
3908  ret = av_frame_ref(dst->frame_grain, src->frame_grain);
3909  if (ret < 0) {
3910  ff_hevc_unref_frame(dst, ~0);
3911  return ret;
3912  }
3913  dst->needs_fg = 1;
3914  }
3915 
3916  dst->pps = av_refstruct_ref_c(src->pps);
3917  dst->tab_mvf = av_refstruct_ref(src->tab_mvf);
3918  dst->rpl_tab = av_refstruct_ref(src->rpl_tab);
3919  dst->rpl = av_refstruct_ref(src->rpl);
3920  dst->nb_rpl_elems = src->nb_rpl_elems;
3921 
3922  dst->poc = src->poc;
3923  dst->ctb_count = src->ctb_count;
3924  dst->flags = src->flags;
3925 
3926  dst->base_layer_frame = src->base_layer_frame;
3927 
3928  av_refstruct_replace(&dst->hwaccel_picture_private,
3929  src->hwaccel_picture_private);
3930 
3931  return 0;
3932 }
3933 
3935 {
3936  HEVCContext *s = avctx->priv_data;
3937 
3938  for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3939  pic_arrays_free(&s->layers[i]);
3940  av_refstruct_unref(&s->layers[i].sps);
3941  }
3942 
3943  av_refstruct_unref(&s->vps);
3944  av_refstruct_unref(&s->pps);
3945 
3946  ff_dovi_ctx_unref(&s->dovi_ctx);
3947  av_buffer_unref(&s->rpu_buf);
3948 
3949  av_freep(&s->md5_ctx);
3950 
3951  av_container_fifo_free(&s->output_fifo);
3952 
3953  for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
3954  HEVCLayerContext *l = &s->layers[layer];
3955  for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
3956  ff_hevc_unref_frame(&l->DPB[i], ~0);
3958  }
3959  }
3960 
3961  ff_hevc_ps_uninit(&s->ps);
3962 
3963  for (int i = 0; i < s->nb_wpp_progress; i++)
3964  ff_thread_progress_destroy(&s->wpp_progress[i]);
3965  av_freep(&s->wpp_progress);
3966 
3967  av_freep(&s->sh.entry_point_offset);
3968  av_freep(&s->sh.offset);
3969  av_freep(&s->sh.size);
3970 
3971  av_freep(&s->local_ctx);
3972 
3973  ff_h2645_packet_uninit(&s->pkt);
3974 
3975  ff_hevc_reset_sei(&s->sei);
3976 
3977  return 0;
3978 }
3979 
3981 {
3982  HEVCContext *s = avctx->priv_data;
3983 
3984  s->avctx = avctx;
3985 
3986  s->local_ctx = av_mallocz(sizeof(*s->local_ctx));
3987  if (!s->local_ctx)
3988  return AVERROR(ENOMEM);
3989  s->nb_local_ctx = 1;
3990 
3991  s->local_ctx[0].parent = s;
3992  s->local_ctx[0].logctx = avctx;
3993  s->local_ctx[0].common_cabac_state = &s->cabac;
3994 
3995  s->output_fifo = av_container_fifo_alloc_avframe(0);
3996  if (!s->output_fifo)
3997  return AVERROR(ENOMEM);
3998 
3999  for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
4000  HEVCLayerContext *l = &s->layers[layer];
4001  for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
4002  l->DPB[i].frame_grain = av_frame_alloc();
4003  if (!l->DPB[i].frame_grain)
4004  return AVERROR(ENOMEM);
4005  }
4006  }
4007 
4008  s->md5_ctx = av_md5_alloc();
4009  if (!s->md5_ctx)
4010  return AVERROR(ENOMEM);
4011 
4012  ff_bswapdsp_init(&s->bdsp);
4013 
4014  s->dovi_ctx.logctx = avctx;
4015  s->eos = 0;
4016 
4017  ff_hevc_reset_sei(&s->sei);
4018 
4019  return 0;
4020 }
4021 
4022 #if HAVE_THREADS
4023 static int hevc_update_thread_context(AVCodecContext *dst,
4024  const AVCodecContext *src)
4025 {
4026  HEVCContext *s = dst->priv_data;
4027  HEVCContext *s0 = src->priv_data;
4028  int ret;
4029 
4030  for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
4031  HEVCLayerContext *l = &s->layers[layer];
4032  const HEVCLayerContext *l0 = &s0->layers[layer];
4033  for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
4034  ff_hevc_unref_frame(&l->DPB[i], ~0);
4035  if (l0->DPB[i].f) {
4036  ret = hevc_ref_frame(&l->DPB[i], &l0->DPB[i]);
4037  if (ret < 0)
4038  return ret;
4039  }
4040  }
4041 
4042  if (l->sps != l0->sps) {
4043  ret = set_sps(s, l, l0->sps);
4044  if (ret < 0)
4045  return ret;
4046  }
4047  }
4048 
4049  for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++)
4050  av_refstruct_replace(&s->ps.vps_list[i], s0->ps.vps_list[i]);
4051 
4052  for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++)
4053  av_refstruct_replace(&s->ps.sps_list[i], s0->ps.sps_list[i]);
4054 
4055  for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++)
4056  av_refstruct_replace(&s->ps.pps_list[i], s0->ps.pps_list[i]);
4057 
4058  // PPS do not persist between frames
4059  av_refstruct_unref(&s->pps);
4060 
4061  s->poc_tid0 = s0->poc_tid0;
4062  s->eos = s0->eos;
4063  s->no_rasl_output_flag = s0->no_rasl_output_flag;
4064 
4065  s->is_nalff = s0->is_nalff;
4066  s->nal_length_size = s0->nal_length_size;
4067  s->layers_active_decode = s0->layers_active_decode;
4068  s->layers_active_output = s0->layers_active_output;
4069 
4070  s->film_grain_warning_shown = s0->film_grain_warning_shown;
4071 
4072  if (s->nb_view_ids != s0->nb_view_ids ||
4073  memcmp(s->view_ids, s0->view_ids, sizeof(*s->view_ids) * s->nb_view_ids)) {
4074  av_freep(&s->view_ids);
4075  s->nb_view_ids = 0;
4076 
4077  if (s0->nb_view_ids) {
4078  s->view_ids = av_memdup(s0->view_ids, s0->nb_view_ids * sizeof(*s0->view_ids));
4079  if (!s->view_ids)
4080  return AVERROR(ENOMEM);
4081  s->nb_view_ids = s0->nb_view_ids;
4082  }
4083  }
4084 
4085  ret = ff_h2645_sei_ctx_replace(&s->sei.common, &s0->sei.common);
4086  if (ret < 0)
4087  return ret;
4088 
4089  ret = av_buffer_replace(&s->sei.common.dynamic_hdr_plus.info,
4091  if (ret < 0)
4092  return ret;
4093 
4094  ret = av_buffer_replace(&s->rpu_buf, s0->rpu_buf);
4095  if (ret < 0)
4096  return ret;
4097 
4098  ff_dovi_ctx_replace(&s->dovi_ctx, &s0->dovi_ctx);
4099 
4100  ret = av_buffer_replace(&s->sei.common.dynamic_hdr_vivid.info,
4102  if (ret < 0)
4103  return ret;
4104 
4105  s->sei.common.frame_packing = s0->sei.common.frame_packing;
4106  s->sei.common.display_orientation = s0->sei.common.display_orientation;
4107  s->sei.common.alternative_transfer = s0->sei.common.alternative_transfer;
4108  s->sei.tdrdi = s0->sei.tdrdi;
4109  s->sei.recovery_point = s0->sei.recovery_point;
4110  s->recovery_poc = s0->recovery_poc;
4111 
4112  return 0;
4113 }
4114 #endif
4115 
4117 {
4118  HEVCContext *s = avctx->priv_data;
4119  int ret;
4120 
4121  ret = hevc_init_context(avctx);
4122  if (ret < 0)
4123  return ret;
4124 
4125  s->sei.picture_timing.picture_struct = 0;
4126  s->eos = 1;
4127 
4128  atomic_init(&s->wpp_err, 0);
4129 
4130  if (!avctx->internal->is_copy) {
4131  const AVPacketSideData *sd;
4132 
4133  if (avctx->extradata_size > 0 && avctx->extradata) {
4134  ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
4135  if (ret < 0) {
4136  return ret;
4137  }
4138 
4139  ret = ff_h2645_sei_to_context(avctx, &s->sei.common);
4140  if (ret < 0)
4141  return ret;
4142  }
4143 
4145  if (sd && sd->size >= sizeof(s->dovi_ctx.cfg))
4146  s->dovi_ctx.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data;
4147  }
4148 
4149  return 0;
4150 }
4151 
4153 {
4154  HEVCContext *s = avctx->priv_data;
4156  ff_hevc_reset_sei(&s->sei);
4157  ff_dovi_ctx_flush(&s->dovi_ctx);
4158  av_buffer_unref(&s->rpu_buf);
4159  s->eos = 1;
4160 
4161  if (FF_HW_HAS_CB(avctx, flush))
4162  FF_HW_SIMPLE_CALL(avctx, flush);
4163 }
4164 
4165 #define OFFSET(x) offsetof(HEVCContext, x)
4166 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
4167 
4168 static const AVOption options[] = {
4169  { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
4170  AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
4171  { "strict-displaywin", "stricly apply default display window size", OFFSET(apply_defdispwin),
4172  AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
4173  { "view_ids", "Array of view IDs that should be decoded and output; a single -1 to decode all views",
4174  .offset = OFFSET(view_ids), .type = AV_OPT_TYPE_INT | AV_OPT_TYPE_FLAG_ARRAY,
4175  .min = -1, .max = INT_MAX, .flags = PAR },
4176  { "view_ids_available", "Array of available view IDs is exported here",
4177  .offset = OFFSET(view_ids_available), .type = AV_OPT_TYPE_UINT | AV_OPT_TYPE_FLAG_ARRAY,
4179  { "view_pos_available", "Array of view positions for view_ids_available is exported here, as AVStereo3DView",
4180  .offset = OFFSET(view_pos_available), .type = AV_OPT_TYPE_UINT | AV_OPT_TYPE_FLAG_ARRAY,
4181  .flags = PAR | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY, .unit = "view_pos" },
4182  { "unspecified", .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_UNSPEC }, .unit = "view_pos" },
4183  { "left", .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_LEFT }, .unit = "view_pos" },
4184  { "right", .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_RIGHT }, .unit = "view_pos" },
4185 
4186  { NULL },
4187 };
4188 
4189 static const AVClass hevc_decoder_class = {
4190  .class_name = "HEVC decoder",
4191  .item_name = av_default_item_name,
4192  .option = options,
4193  .version = LIBAVUTIL_VERSION_INT,
4194 };
4195 
4197  .p.name = "hevc",
4198  CODEC_LONG_NAME("HEVC (High Efficiency Video Coding)"),
4199  .p.type = AVMEDIA_TYPE_VIDEO,
4200  .p.id = AV_CODEC_ID_HEVC,
4201  .priv_data_size = sizeof(HEVCContext),
4202  .p.priv_class = &hevc_decoder_class,
4203  .init = hevc_decode_init,
4204  .close = hevc_decode_free,
4206  .flush = hevc_decode_flush,
4207  UPDATE_THREAD_CONTEXT(hevc_update_thread_context),
4208  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
4210  .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING |
4213  .p.profiles = NULL_IF_CONFIG_SMALL(ff_hevc_profiles),
4214  .hw_configs = (const AVCodecHWConfigInternal *const []) {
4215 #if CONFIG_HEVC_DXVA2_HWACCEL
4216  HWACCEL_DXVA2(hevc),
4217 #endif
4218 #if CONFIG_HEVC_D3D11VA_HWACCEL
4219  HWACCEL_D3D11VA(hevc),
4220 #endif
4221 #if CONFIG_HEVC_D3D11VA2_HWACCEL
4222  HWACCEL_D3D11VA2(hevc),
4223 #endif
4224 #if CONFIG_HEVC_D3D12VA_HWACCEL
4225  HWACCEL_D3D12VA(hevc),
4226 #endif
4227 #if CONFIG_HEVC_NVDEC_HWACCEL
4228  HWACCEL_NVDEC(hevc),
4229 #endif
4230 #if CONFIG_HEVC_VAAPI_HWACCEL
4231  HWACCEL_VAAPI(hevc),
4232 #endif
4233 #if CONFIG_HEVC_VDPAU_HWACCEL
4234  HWACCEL_VDPAU(hevc),
4235 #endif
4236 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
4237  HWACCEL_VIDEOTOOLBOX(hevc),
4238 #endif
4239 #if CONFIG_HEVC_VULKAN_HWACCEL
4240  HWACCEL_VULKAN(hevc),
4241 #endif
4242  NULL
4243  },
4244 };
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
HEVCLayerContext::tab_ct_depth
uint8_t * tab_ct_depth
Definition: hevcdec.h:468
HEVC_NAL_AUD
@ HEVC_NAL_AUD
Definition: hevc.h:64
HWACCEL_D3D12VA
#define HWACCEL_D3D12VA(codec)
Definition: hwconfig.h:80
ff_get_coded_side_data
const AVPacketSideData * ff_get_coded_side_data(const AVCodecContext *avctx, enum AVPacketSideDataType type)
Get side data of the given type from a decoding context.
Definition: decode.c:1426
ff_hevc_decode_extradata
int ff_hevc_decode_extradata(const uint8_t *data, int size, HEVCParamSets *ps, HEVCSEI *sei, int *is_nalff, int *nal_length_size, int err_recognition, int apply_defdispwin, void *logctx)
Definition: parse.c:79
hwconfig.h
ff_progress_frame_report
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition: decode.c:1893
HEVCLayerContext::horizontal_bs
uint8_t * horizontal_bs
Definition: hevcdec.h:482
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:430
export_multilayer
static int export_multilayer(HEVCContext *s, const HEVCVPS *vps)
Definition: hevcdec.c:430
hevc_decoder_class
static const AVClass hevc_decoder_class
Definition: hevcdec.c:4189
SliceHeader::beta_offset
int beta_offset
beta_offset_div2 * 2
Definition: hevcdec.h:261
bswapdsp.h
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:73
L1
F H1 F F H1 F F F F H1<-F-------F-------F v v v H2 H3 H2 ^ ^ ^ F-------F-------F-> H1<-F-------F-------F|||||||||F H1 F|||||||||F H1 Funavailable fullpel samples(outside the picture for example) shall be equalto the closest available fullpel sampleSmaller pel interpolation:--------------------------if diag_mc is set then points which lie on a line between 2 vertically, horizontally or diagonally adjacent halfpel points shall be interpolatedlinearly with rounding to nearest and halfway values rounded up.points which lie on 2 diagonals at the same time should only use the onediagonal not containing the fullpel point F--> O q O<--h1-> O q O<--F v \/v \/v O O O O O O O|/|\|q q q q q|/|\|O O O O O O O ^/\ ^/\ ^ h2--> O q O<--h3-> O q O<--h2 v \/v \/v O O O O O O O|\|/|q q q q q|\|/|O O O O O O O ^/\ ^/\ ^ F--> O q O<--h1-> O q O<--Fthe remaining points shall be bilinearly interpolated from theup to 4 surrounding halfpel and fullpel points, again rounding should be tonearest and halfway values rounded upcompliant Snow decoders MUST support 1-1/8 pel luma and 1/2-1/16 pel chromainterpolation at leastOverlapped block motion compensation:-------------------------------------FIXMELL band prediction:===================Each sample in the LL0 subband is predicted by the median of the left, top andleft+top-topleft samples, samples outside the subband shall be considered tobe 0. To reverse this prediction in the decoder apply the following.for(y=0;y< height;y++){ for(x=0;x< width;x++){ sample[y][x]+=median(sample[y-1][x], sample[y][x-1], sample[y-1][x]+sample[y][x-1]-sample[y-1][x-1]);}}sample[-1][ *]=sample[ *][-1]=0;width, height here are the width and height of the LL0 subband not of the finalvideoDequantization:===============FIXMEWavelet Transform:==================Snow supports 2 wavelet transforms, the symmetric biorthogonal 5/3 integertransform and an integer approximation of the symmetric biorthogonal 9/7daubechies wavelet.2D IDWT(inverse discrete wavelet transform) --------------------------------------------The 2D IDWT applies a 2D filter recursively, each time combining the4 lowest frequency subbands into a single subband until only 1 subbandremains.The 2D filter is done by first applying a 1D filter in the vertical directionand then applying it in the horizontal one. --------------- --------------- --------------- ---------------|LL0|HL0|||||||||||||---+---|HL1||L0|H0|HL1||LL1|HL1|||||LH0|HH0|||||||||||||-------+-------|-> L1 H1 LH1 HH1 LH1 HH1 LH1 HH1 L1
Definition: snow.txt:554
ff_hevc_dsp_init
void ff_hevc_dsp_init(HEVCDSPContext *hevcdsp, int bit_depth)
Definition: dsp.c:128
ff_decode_get_packet
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition: decode.c:248
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
AV_TIMECODE_STR_SIZE
#define AV_TIMECODE_STR_SIZE
Definition: timecode.h:33
ff_hevc_luma_mv_mvp_mode
void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, const HEVCPPS *pps, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv, int mvp_lx_flag, int LX)
Definition: mvs.c:589
HEVCLocalContext
Definition: hevcdec.h:393
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:260
HEVCLayerContext::bs_height
int bs_height
Definition: hevcdec.h:461
SliceHeader::slice_act_cr_qp_offset
int slice_act_cr_qp_offset
Definition: hevcdec.h:257
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
AV_STEREO3D_VIEW_LEFT
@ AV_STEREO3D_VIEW_LEFT
Frame contains only the left view.
Definition: stereo3d.h:158
ff_hevc_merge_flag_decode
int ff_hevc_merge_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:747
av_clip
#define av_clip
Definition: common.h:100
ff_thread_progress_report
void ff_thread_progress_report(ThreadProgress *pro, int n)
This function is a no-op in no-op mode; otherwise it notifies other threads that a certain level of p...
Definition: threadprogress.c:53
atomic_store
#define atomic_store(object, desired)
Definition: stdatomic.h:85
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
SliceHeader::chroma_offset_l1
int16_t chroma_offset_l1[16][2]
Definition: hevcdec.h:286
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:678
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
opt.h
ff_dovi_ctx_unref
void ff_dovi_ctx_unref(DOVIContext *s)
Completely reset a DOVIContext, preserving only logctx.
Definition: dovi_rpu.c:29
threadprogress.h
HEVC_MAX_NUH_LAYER_ID
@ HEVC_MAX_NUH_LAYER_ID
Definition: hevc.h:110
decode_slice
static int decode_slice(HEVCContext *s, unsigned nal_idx, GetBitContext *gb)
Definition: hevcdec.c:3545
MD5_PRI_ARG
#define MD5_PRI_ARG(buf)
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:699
av_container_fifo_alloc_avframe
AVContainerFifo * av_container_fifo_alloc_avframe(unsigned flags)
Allocate an AVContainerFifo instance for AVFrames.
Definition: container_fifo.c:215
ff_hevc_end_of_slice_flag_decode
int ff_hevc_end_of_slice_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:563
PART_NxN
@ PART_NxN
Definition: hevcdec.h:100
ff_hevc_cu_qp_delta_sign_flag
int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc)
Definition: cabac.c:613
SliceHeader::slice_act_y_qp_offset
int slice_act_y_qp_offset
Definition: hevcdec.h:255
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1277
decode_reset_recovery_point
static void decode_reset_recovery_point(HEVCContext *s)
Definition: hevcdec.c:3697
out
FILE * out
Definition: movenc.c:55
HEVCContext::layers_active_output
unsigned layers_active_output
Definition: hevcdec.h:505
HEVC_RECOVERY_UNSPECIFIED
#define HEVC_RECOVERY_UNSPECIFIED
Definition: hevcdec.h:81
HEVCWindow::bottom_offset
unsigned int bottom_offset
Definition: ps.h:95
SAO_BAND
@ SAO_BAND
Definition: hevcdec.h:166
HEVCParamSets::pps_list
const HEVCPPS * pps_list[HEVC_MAX_PPS_COUNT]
RefStruct references.
Definition: ps.h:514
ff_hevc_profiles
const AVProfile ff_hevc_profiles[]
Definition: profiles.c:97
ff_hevc_set_neighbour_available
void ff_hevc_set_neighbour_available(HEVCLocalContext *lc, int x0, int y0, int nPbW, int nPbH, int log2_ctb_size)
Definition: mvs.c:43
AV_PKT_DATA_NEW_EXTRADATA
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
Definition: packet.h:56
chroma_mc_uni
static void chroma_mc_uni(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *dst0, ptrdiff_t dststride, const uint8_t *src0, ptrdiff_t srcstride, int reflist, int x_off, int y_off, int block_w, int block_h, const struct MvField *current_mv, int chroma_weight, int chroma_offset)
8.5.3.2.2.2 Chroma sample uniprediction interpolation process
Definition: hevcdec.c:1888
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3248
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
av_clip_uintp2
#define av_clip_uintp2
Definition: common.h:124
ff_h2645_sei_to_frame
int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, enum AVCodecID codec_id, AVCodecContext *avctx, const H2645VUI *vui, unsigned bit_depth_luma, unsigned bit_depth_chroma, int seed)
Definition: h2645_sei.c:718
src1
const pixel * src1
Definition: h264pred_template.c:420
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:404
HEVCLocalContext::ctb_up_flag
uint8_t ctb_up_flag
Definition: hevcdec.h:425
ff_dovi_rpu_parse
int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, int err_recognition)
Parse the contents of a Dolby Vision RPU and update the parsed values in the DOVIContext struct.
Definition: dovi_rpudec.c:346
hevc_await_progress
static void hevc_await_progress(const HEVCContext *s, const HEVCFrame *ref, const Mv *mv, int y0, int height)
Definition: hevcdec.c:2051
int64_t
long long int64_t
Definition: coverity.c:34
HEVCLayerContext::tab_ipm
uint8_t * tab_ipm
Definition: hevcdec.h:472
mv
static const int8_t mv[256][2]
Definition: 4xm.c:81
SliceHeader::num_entry_point_offsets
int num_entry_point_offsets
Definition: hevcdec.h:270
HEVCFrame::frame_grain
AVFrame * frame_grain
Definition: hevcdec.h:369
ff_hevc_decode_short_term_rps
int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header)
Definition: ps.c:89
hls_slice_header
static int hls_slice_header(SliceHeader *sh, const HEVCContext *s, GetBitContext *gb)
Definition: hevcdec.c:784
AV_FRAME_DATA_FILM_GRAIN_PARAMS
@ AV_FRAME_DATA_FILM_GRAIN_PARAMS
Film grain parameters for a frame, described by AVFilmGrainParams.
Definition: frame.h:188
PART_2NxnU
@ PART_2NxnU
Definition: hevcdec.h:101
av_unused
#define av_unused
Definition: attributes.h:131
AV_FRAME_DATA_S12M_TIMECODE
@ AV_FRAME_DATA_S12M_TIMECODE
Timecode which conforms to SMPTE ST 12-1.
Definition: frame.h:152
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:163
ff_hevc_flush_dpb
void ff_hevc_flush_dpb(HEVCContext *s)
Drop all frames currently in DPB.
Definition: refs.c:75
container_fifo.h
HEVCLayerContext::bs_width
int bs_width
Definition: hevcdec.h:460
H2645NAL::nuh_layer_id
int nuh_layer_id
Definition: h2645_parse.h:67
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
pixdesc.h
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:692
TransformUnit::cu_qp_delta
int cu_qp_delta
Definition: hevcdec.h:336
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:390
w
uint8_t w
Definition: llviddspenc.c:38
HWACCEL_DXVA2
#define HWACCEL_DXVA2(codec)
Definition: hwconfig.h:64
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:733
AVPacket::data
uint8_t * data
Definition: packet.h:539
set_deblocking_bypass
static void set_deblocking_bypass(uint8_t *is_pcm, const HEVCSPS *sps, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:1527
HEVC_NAL_BLA_N_LP
@ HEVC_NAL_BLA_N_LP
Definition: hevc.h:47
SAOParams::offset_sign
int offset_sign[3][4]
sao_offset_sign
Definition: dsp.h:36
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:556
INTRA_DC
@ INTRA_DC
Definition: hevcdec.h:128
AVOption
AVOption.
Definition: opt.h:429
HWACCEL_D3D11VA2
#define HWACCEL_D3D11VA2(codec)
Definition: hwconfig.h:66
ff_h2645_packet_uninit
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
Definition: h2645_parse.c:602
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:630
ff_hevc_pred_mode_decode
int ff_hevc_pred_mode_decode(HEVCLocalContext *lc)
Definition: cabac.c:634
HEVCContext::no_rasl_output_flag
int no_rasl_output_flag
Definition: hevcdec.h:534
data
const char data[16]
Definition: mxf.c:149
Mv::y
int16_t y
vertical component of motion vector
Definition: hevcdec.h:307
HEVC_NAL_TSA_N
@ HEVC_NAL_TSA_N
Definition: hevc.h:31
AV_FRAME_DATA_DOVI_RPU_BUFFER
@ AV_FRAME_DATA_DOVI_RPU_BUFFER
Dolby Vision RPU raw data, suitable for passing to x265 or other libraries.
Definition: frame.h:201
HEVC_NAL_IDR_N_LP
@ HEVC_NAL_IDR_N_LP
Definition: hevc.h:49
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:515
SAO_EDGE
@ SAO_EDGE
Definition: hevcdec.h:167
atomic_int
intptr_t atomic_int
Definition: stdatomic.h:55
ff_aom_apply_film_grain
int ff_aom_apply_film_grain(AVFrame *out, const AVFrame *in, const AVFilmGrainParams *params)
Definition: aom_film_grain.c:68
SliceHeader::slice_temporal_mvp_enabled_flag
uint8_t slice_temporal_mvp_enabled_flag
Definition: hevcdec.h:237
AV_PIX_FMT_D3D11VA_VLD
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
Definition: pixfmt.h:254
TransformUnit::is_cu_qp_delta_coded
uint8_t is_cu_qp_delta_coded
Definition: hevcdec.h:344
FFCodec
Definition: codec_internal.h:127
ff_hevc_output_frames
int ff_hevc_output_frames(HEVCContext *s, unsigned layers_active_decode, unsigned layers_active_output, unsigned max_output, unsigned max_dpb, int discard)
Find frames in the DPB that are ready for output and either write them to the output FIFO or drop the...
Definition: refs.c:264
hevc_receive_frame
static int hevc_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition: hevcdec.c:3841
ff_hevc_hls_filters
void ff_hevc_hls_filters(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int x_ctb, int y_ctb, int ctb_size)
Definition: filter.c:912
FF_HW_SIMPLE_CALL
#define FF_HW_SIMPLE_CALL(avctx, function)
Definition: hwaccel_internal.h:174
SliceHeader::slice_loop_filter_across_slices_enabled_flag
uint8_t slice_loop_filter_across_slices_enabled_flag
Definition: hevcdec.h:246
ff_hevc_sao_type_idx_decode
int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc)
Definition: cabac.c:521
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
HEVCLocalContext::ctb_up_left_flag
uint8_t ctb_up_left_flag
Definition: hevcdec.h:427
HEVC_NAL_IDR_W_RADL
@ HEVC_NAL_IDR_W_RADL
Definition: hevc.h:48
find_finish_setup_nal
static int find_finish_setup_nal(const HEVCContext *s)
Definition: hevcdec.c:3180
H2645NAL::temporal_id
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
Definition: h2645_parse.h:62
av_timecode_get_smpte
uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff)
Convert sei info to SMPTE 12M binary representation.
Definition: timecode.c:69
RefPicList
Definition: hevcdec.h:196
AV_STEREO3D_VIEW_RIGHT
@ AV_STEREO3D_VIEW_RIGHT
Frame contains only the right view.
Definition: stereo3d.h:163
av_strlcatf
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:103
AV_STEREO3D_VIEW_UNSPEC
@ AV_STEREO3D_VIEW_UNSPEC
Content is unspecified.
Definition: stereo3d.h:168
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:497
ff_hevc_prev_intra_luma_pred_flag_decode
int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:702
PF_INTRA
@ PF_INTRA
Definition: hevcdec.h:120
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
set_sps
static int set_sps(HEVCContext *s, HEVCLayerContext *l, const HEVCSPS *sps)
Definition: hevcdec.c:754
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:431
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
verify_md5
static int verify_md5(HEVCContext *s, AVFrame *frame)
Definition: hevcdec.c:3429
MODE_SKIP
@ MODE_SKIP
Definition: hevcdec.h:110
HEVCLayerContext::skip_flag
uint8_t * skip_flag
Definition: hevcdec.h:467
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:304
HEVCLocalContext::end_of_tiles_x
int end_of_tiles_x
Definition: hevcdec.h:428
AV_PKT_DATA_DOVI_CONF
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
Definition: packet.h:280
CodingUnit::x
int x
Definition: hevcdec.h:293
tab_mode_idx
static const uint8_t tab_mode_idx[]
Definition: hevcdec.c:2334
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:364
BOUNDARY_LEFT_TILE
#define BOUNDARY_LEFT_TILE
Definition: hevcdec.h:442
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:574
golomb.h
exp golomb vlc stuff
AVCodecInternal::is_copy
int is_copy
When using frame-threaded decoding, this field is set for the first worker thread (e....
Definition: internal.h:54
hls_coding_unit
static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:2433
AVPacketSideData::size
size_t size
Definition: packet.h:392
PART_2Nx2N
@ PART_2Nx2N
Definition: hevcdec.h:97
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:318
intra_prediction_unit
static void intra_prediction_unit(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCSPS *sps, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:2338
hevc_decode_free
static av_cold int hevc_decode_free(AVCodecContext *avctx)
Definition: hevcdec.c:3934
mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition: dsp.h:53
HEVCLocalContext::ctb_up_right_flag
uint8_t ctb_up_right_flag
Definition: hevcdec.h:426
HEVCLayerContext::tab_slice_address
int32_t * tab_slice_address
Definition: hevcdec.h:478
ff_hevc_decoder
const FFCodec ff_hevc_decoder
Definition: hevcdec.c:4196
HEVCLayerContext::sao_pixel_buffer_v
uint8_t * sao_pixel_buffer_v[3]
Definition: hevcdec.h:486
ff_hevc_compute_poc
int ff_hevc_compute_poc(const HEVCSPS *sps, int pocTid0, int poc_lsb, int nal_unit_type)
Compute POC of the current frame and return it.
Definition: ps.c:2446
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
HEVCLayerContext::sao_pixel_buffer_h
uint8_t * sao_pixel_buffer_h[3]
Definition: hevcdec.h:485
PRED_BI
@ PRED_BI
Definition: hevcdec.h:116
ff_hevc_split_transform_flag_decode
int ff_hevc_split_transform_flag_decode(HEVCLocalContext *lc, int log2_trafo_size)
Definition: cabac.c:821
av_ceil_log2
#define av_ceil_log2
Definition: common.h:97
fail
#define fail()
Definition: checkasm.h:193
PredictionUnit::intra_pred_mode_c
uint8_t intra_pred_mode_c[4]
Definition: hevcdec.h:331
H2645SEI::dynamic_hdr_vivid
HEVCSEIDynamicHDRVivid dynamic_hdr_vivid
Definition: h2645_sei.h:132
md5
struct AVMD5 * md5
Definition: movenc.c:57
InterPredIdc
InterPredIdc
Definition: hevcdec.h:113
MODE_INTER
@ MODE_INTER
Definition: hevcdec.h:108
timecode.h
HEVCWindow::left_offset
unsigned int left_offset
Definition: ps.h:92
GetBitContext
Definition: get_bits.h:108
SliceHeader::luma_log2_weight_denom
uint8_t luma_log2_weight_denom
Definition: hevcdec.h:274
ff_hevc_hls_mvd_coding
void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size)
Definition: cabac.c:1493
HEVCLocalContext::pu
PredictionUnit pu
Definition: hevcdec.h:438
HEVC_NAL_SEI_SUFFIX
@ HEVC_NAL_SEI_SUFFIX
Definition: hevc.h:69
av_film_grain_params_select
const AVFilmGrainParams * av_film_grain_params_select(const AVFrame *frame)
Select the most appropriate film grain parameters set for the frame, taking into account the frame's ...
Definition: film_grain_params.c:53
TransformUnit::res_scale_val
int res_scale_val
Definition: hevcdec.h:338
SliceHeader::short_term_ref_pic_set_size
int short_term_ref_pic_set_size
Definition: hevcdec.h:228
ff_hevc_cu_chroma_qp_offset_idx
int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc, int chroma_qp_offset_list_len_minus1)
Definition: cabac.c:623
val
static double val(void *priv, double ch)
Definition: aeval.c:77
ff_hevc_sao_offset_abs_decode
int ff_hevc_sao_offset_abs_decode(HEVCLocalContext *lc, int bit_depth)
Definition: cabac.c:541
HWACCEL_VDPAU
#define HWACCEL_VDPAU(codec)
Definition: hwconfig.h:72
ff_videodsp_init
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
Definition: videodsp.c:39
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:647
SliceHeader::long_term_ref_pic_set_size
int long_term_ref_pic_set_size
Definition: hevcdec.h:231
hls_cross_component_pred
static int hls_cross_component_pred(HEVCLocalContext *lc, int idx)
Definition: hevcdec.c:1299
HEVCParamSets::sps_list
const HEVCSPS * sps_list[HEVC_MAX_SPS_COUNT]
RefStruct references.
Definition: ps.h:513
ss
#define ss(width, name, subs,...)
Definition: cbs_vp9.c:202
hls_transform_tree
static int hls_transform_tree(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int xBase, int yBase, int cb_xBase, int cb_yBase, int log2_cb_size, int log2_trafo_size, int trafo_depth, int blk_idx, const int *base_cbf_cb, const int *base_cbf_cr)
Definition: hevcdec.c:1543
HEVC_NAL_SEI_PREFIX
@ HEVC_NAL_SEI_PREFIX
Definition: hevc.h:68
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
wpp_progress_init
static int wpp_progress_init(HEVCContext *s, unsigned count)
Definition: hevcdec.c:2913
ff_hevc_luma_mv_merge_mode
void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, const HEVCPPS *pps, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv)
Definition: mvs.c:482
AVRational::num
int num
Numerator.
Definition: rational.h:59
progressframe.h
refstruct.h
H2645_FLAG_IS_NALFF
@ H2645_FLAG_IS_NALFF
Definition: h2645_parse.h:97
ff_hevc_pred_init
void ff_hevc_pred_init(HEVCPredContext *hpc, int bit_depth)
Definition: pred.c:43
ff_frame_new_side_data_from_buf
int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef **buf)
Similar to ff_frame_new_side_data, but using an existing buffer ref.
Definition: decode.c:2137
SliceHeader::slice_segment_addr
unsigned int slice_segment_addr
address (in raster order) of the first block in the current slice
Definition: hevcdec.h:211
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:151
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:518
pic_arrays_free
static void pic_arrays_free(HEVCLayerContext *l)
NOTE: Each function hls_foo correspond to the function foo in the specification (HLS stands for High ...
Definition: hevcdec.c:71
first
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
Definition: rate_distortion.txt:12
FF_CODEC_CAP_USES_PROGRESSFRAMES
#define FF_CODEC_CAP_USES_PROGRESSFRAMES
The decoder might make use of the ProgressFrame API.
Definition: codec_internal.h:68
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:685
hls_decode_entry_wpp
static int hls_decode_entry_wpp(AVCodecContext *avctx, void *hevc_lclist, int job, int thread)
Definition: hevcdec.c:2818
ff_hevc_mvp_lx_flag_decode
int ff_hevc_mvp_lx_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:778
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
HEVC_SLICE_B
@ HEVC_SLICE_B
Definition: hevc.h:96
HEVCLayerContext::vertical_bs
uint8_t * vertical_bs
Definition: hevcdec.h:483
set_side_data
static int set_side_data(HEVCContext *s)
Definition: hevcdec.c:3095
QPEL_EXTRA_AFTER
#define QPEL_EXTRA_AFTER
Definition: hevcdec.h:65
film_grain_params.h
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
luma_mc_uni
static void luma_mc_uni(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *dst, ptrdiff_t dststride, const AVFrame *ref, const Mv *mv, int x_off, int y_off, int block_w, int block_h, int luma_weight, int luma_offset)
8.5.3.2.2.1 Luma sample unidirectional interpolation process
Definition: hevcdec.c:1730
TransformUnit::intra_pred_mode
int intra_pred_mode
Definition: hevcdec.h:341
HEVCSEIDynamicHDRPlus::info
AVBufferRef * info
Definition: h2645_sei.h:46
ff_hevc_is_alpha_video
int ff_hevc_is_alpha_video(const HEVCContext *s)
Definition: hevcdec.c:469
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:661
SliceHeader::cabac_init_flag
uint8_t cabac_init_flag
Definition: hevcdec.h:244
DBParams::beta_offset
int beta_offset
Definition: hevcdec.h:352
H2645NAL::size
int size
Definition: h2645_parse.h:36
DBParams::tc_offset
int tc_offset
Definition: hevcdec.h:353
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:538
AVCodecContext::has_b_frames
int has_b_frames
Size of the frame reordering buffer in the decoder.
Definition: avcodec.h:737
ff_progress_frame_ref
void ff_progress_frame_ref(ProgressFrame *dst, const ProgressFrame *src)
Set dst->f to src->f and make dst a co-owner of src->f.
Definition: decode.c:1868
AV_FRAME_SIDE_DATA_FLAG_NEW_REF
#define AV_FRAME_SIDE_DATA_FLAG_NEW_REF
Create a new reference to the passed in buffer instead of taking ownership of it.
Definition: frame.h:1100
QPEL_EXTRA_BEFORE
#define QPEL_EXTRA_BEFORE
Definition: hevcdec.h:64
stereo3d.h
HEVCLayerContext::cur_frame
HEVCFrame * cur_frame
Definition: hevcdec.h:456
AV_PIX_FMT_DXVA2_VLD
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
Definition: pixfmt.h:134
HEVCLocalContext::parent
const struct HEVCContext * parent
Definition: hevcdec.h:401
s
#define s(width, name)
Definition: cbs_vp9.c:198
HEVCSPS::height
int height
Definition: ps.h:351
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:108
SAO_NOT_APPLIED
@ SAO_NOT_APPLIED
Definition: hevcdec.h:165
AV_PROFILE_HEVC_SCC
#define AV_PROFILE_HEVC_SCC
Definition: defs.h:164
set_ct_depth
static av_always_inline void set_ct_depth(const HEVCSPS *sps, uint8_t *tab_ct_depth, int x0, int y0, int log2_cb_size, int ct_depth)
Definition: hevcdec.c:2320
ff_hevc_part_mode_decode
int ff_hevc_part_mode_decode(HEVCLocalContext *lc, const HEVCSPS *sps, int log2_cb_size)
Definition: cabac.c:660
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
SliceHeader::luma_offset_l1
int16_t luma_offset_l1[16]
Definition: hevcdec.h:285
AV_ZERO32
#define AV_ZERO32(d)
Definition: intreadwrite.h:662
ff_hevc_merge_idx_decode
int ff_hevc_merge_idx_decode(HEVCLocalContext *lc)
Definition: cabac.c:736
HEVCSEI::common
H2645SEI common
Definition: sei.h:106
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
ff_hevc_nal_is_nonref
static av_always_inline int ff_hevc_nal_is_nonref(enum HEVCNALUnitType type)
Definition: hevcdec.h:656
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1053
HEVC_NAL_VPS
@ HEVC_NAL_VPS
Definition: hevc.h:61
HEVC_NAL_UNSPEC62
@ HEVC_NAL_UNSPEC62
Definition: hevc.h:91
export_stream_params_from_sei
static int export_stream_params_from_sei(HEVCContext *s)
Definition: hevcdec.c:402
hevc_frame_start
static int hevc_frame_start(HEVCContext *s, HEVCLayerContext *l, unsigned nal_idx)
Definition: hevcdec.c:3223
ff_hevc_save_states
void ff_hevc_save_states(HEVCLocalContext *lc, const HEVCPPS *pps, int ctb_addr_ts)
Definition: cabac.c:402
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:304
ff_hevc_skip_flag_decode
int ff_hevc_skip_flag_decode(HEVCLocalContext *lc, uint8_t *skip_flag, int x0, int y0, int x_cb, int y_cb, int min_cb_width)
Definition: cabac.c:573
SliceHeader::slice_rps
ShortTermRPS slice_rps
Definition: hevcdec.h:229
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:560
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
AVPacketSideData::data
uint8_t * data
Definition: packet.h:391
AV_PIX_FMT_FLAG_ALPHA
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:147
ff_progress_frame_await
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before ff_progress_frame_await() has been called on them. reget_buffer() and buffer age optimizations no longer work. *The contents of buffers must not be written to after ff_progress_frame_report() has been called on them. This includes draw_edges(). Porting codecs to frame threading
decode.h
ff_hevc_cbf_cb_cr_decode
int ff_hevc_cbf_cb_cr_decode(HEVCLocalContext *lc, int trafo_depth)
Definition: cabac.c:826
hevc.h
IS_IDR
#define IS_IDR(s)
Definition: hevcdec.h:76
H2645NAL::data
const uint8_t * data
Definition: h2645_parse.h:35
av_container_fifo_read
int av_container_fifo_read(AVContainerFifo *cf, void *obj, unsigned flags)
Read the next available object from the FIFO into obj.
Definition: container_fifo.c:122
RefPicList::ref
struct HEVCFrame * ref[HEVC_MAX_REFS]
Definition: hevcdec.h:197
H2645NAL::skipped_bytes_pos
int * skipped_bytes_pos
Definition: h2645_parse.h:71
HEVCWindow::top_offset
unsigned int top_offset
Definition: ps.h:94
export_stream_params
static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
Definition: hevcdec.c:346
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
SliceHeader::size
int * size
Definition: hevcdec.h:269
SliceHeader::collocated_list
uint8_t collocated_list
Definition: hevcdec.h:247
atomic_load
#define atomic_load(object)
Definition: stdatomic.h:93
SliceHeader::luma_offset_l0
int16_t luma_offset_l0[16]
Definition: hevcdec.h:282
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:605
AV_FILM_GRAIN_PARAMS_NONE
@ AV_FILM_GRAIN_PARAMS_NONE
Definition: film_grain_params.h:25
AVDISCARD_BIDIR
@ AVDISCARD_BIDIR
discard all bidirectional frames
Definition: defs.h:218
HEVCLayerContext::tab_mvf_pool
struct AVRefStructPool * tab_mvf_pool
Definition: hevcdec.h:488
get_se_golomb
static int get_se_golomb(GetBitContext *gb)
read signed exp golomb code.
Definition: golomb.h:239
INTRA_ANGULAR_26
@ INTRA_ANGULAR_26
Definition: hevcdec.h:153
H2645NAL::type
int type
NAL unit type.
Definition: h2645_parse.h:52
SliceHeader::chroma_weight_l1
int16_t chroma_weight_l1[16][2]
Definition: hevcdec.h:279
CodingUnit::max_trafo_depth
uint8_t max_trafo_depth
MaxTrafoDepth.
Definition: hevcdec.h:301
AV_FRAME_DATA_DYNAMIC_HDR_VIVID
@ AV_FRAME_DATA_DYNAMIC_HDR_VIVID
HDR Vivid dynamic metadata associated with a video frame.
Definition: frame.h:215
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:296
SliceHeader::slice_ctb_addr_rs
int slice_ctb_addr_rs
Definition: hevcdec.h:288
SliceHeader::poc
int poc
Definition: hevcdec.h:218
ff_hevc_hls_residual_coding
void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps, int x0, int y0, int log2_trafo_size, enum ScanType scan_idx, int c_idx)
Definition: cabac.c:981
my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
Definition: dsp.h:53
ff_hevc_decode_nal_vps
int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps)
Definition: ps.c:761
FF_CODEC_PROPERTY_FILM_GRAIN
#define FF_CODEC_PROPERTY_FILM_GRAIN
Definition: avcodec.h:1819
AV_PIX_FMT_YUVA422P10LE
@ AV_PIX_FMT_YUVA422P10LE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
Definition: pixfmt.h:184
hevc_ref_frame
static int hevc_ref_frame(HEVCFrame *dst, const HEVCFrame *src)
Definition: hevcdec.c:3901
if
if(ret)
Definition: filter_design.txt:179
hevc_decode_init
static av_cold int hevc_decode_init(AVCodecContext *avctx)
Definition: hevcdec.c:4116
srcstride
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t const uint8_t ptrdiff_t srcstride
Definition: dsp.h:84
SliceHeader::pic_output_flag
uint8_t pic_output_flag
Definition: hevcdec.h:222
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:110
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:221
GetBitContext::buffer
const uint8_t * buffer
Definition: get_bits.h:109
pred_weight_table
static int pred_weight_table(SliceHeader *sh, void *logctx, const HEVCSPS *sps, GetBitContext *gb)
Definition: hevcdec.c:172
PredictionUnit::rem_intra_luma_pred_mode
int rem_intra_luma_pred_mode
Definition: hevcdec.h:327
HEVCContext::sei
HEVCSEI sei
Definition: hevcdec.h:513
H2645NAL::raw_size
int raw_size
Definition: h2645_parse.h:44
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
ff_thread_progress_await
void ff_thread_progress_await(const ThreadProgress *pro_c, int n)
This function is a no-op in no-op mode; otherwise it waits until other threads have reached a certain...
Definition: threadprogress.c:64
IS_BLA
#define IS_BLA(s)
Definition: hevcdec.h:77
HEVCLayerContext::deblock
DBParams * deblock
Definition: hevcdec.h:464
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
ff_bswapdsp_init
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition: bswapdsp.c:49
NULL
#define NULL
Definition: coverity.c:32
parse.h
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:726
SAOParams::offset_abs
int offset_abs[3][4]
sao_offset_abs
Definition: dsp.h:35
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:709
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
HEVCLocalContext::tmp
int16_t tmp[MAX_PB_SIZE *MAX_PB_SIZE]
Definition: hevcdec.h:434
CTB
#define CTB(tab, x, y)
Definition: hevcdec.c:1209
hwaccel_internal.h
LongTermRPS::poc
int poc[32]
Definition: hevcdec.h:190
AVCHROMA_LOC_LEFT
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition: pixfmt.h:754
CodingUnit::cu_transquant_bypass_flag
uint8_t cu_transquant_bypass_flag
Definition: hevcdec.h:302
is_pcm
static int is_pcm(enum AVCodecID codec_id)
Definition: mxfdec.c:2543
HEVC_SLICE_I
@ HEVC_SLICE_I
Definition: hevc.h:98
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:486
ff_hevc_decode_nal_pps
int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps)
Definition: ps.c:2162
AV_PIX_FMT_YUVJ420P
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition: pixfmt.h:85
HEVCLocalContext::first_qp_group
uint8_t first_qp_group
Definition: hevcdec.h:398
ff_h2645_sei_to_context
int ff_h2645_sei_to_context(AVCodecContext *avctx, H2645SEI *sei)
Definition: h2645_sei.c:923
do_output
static void do_output(BM3DContext *s, uint8_t *dst, int dst_linesize, int plane, int nb_jobs)
Definition: vf_bm3d.c:630
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:239
HEVCLayerContext::cbf_luma
uint8_t * cbf_luma
Definition: hevcdec.h:471
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:371
HEVC_NAL_STSA_N
@ HEVC_NAL_STSA_N
Definition: hevc.h:33
profiles.h
ff_hevc_reset_sei
static void ff_hevc_reset_sei(HEVCSEI *sei)
Reset SEI values that are stored on the Context.
Definition: sei.h:127
ff_hevc_res_scale_sign_flag
int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx)
Definition: cabac.c:861
ff_set_sar
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition: utils.c:109
L0
#define L0
Definition: hevcdec.h:58
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:370
LongTermRPS::poc_msb_present
uint8_t poc_msb_present[32]
Definition: hevcdec.h:191
HEVC_NAL_EOS_NUT
@ HEVC_NAL_EOS_NUT
Definition: hevc.h:65
options
Definition: swscale.c:42
HEVCContext::film_grain_warning_shown
int film_grain_warning_shown
Definition: hevcdec.h:580
ff_log2
#define ff_log2
Definition: intmath.h:51
av_frame_new_side_data_from_buf
AVFrameSideData * av_frame_new_side_data_from_buf(AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef *buf)
Add a new side data to a frame from an existing AVBufferRef.
Definition: frame.c:807
PART_Nx2N
@ PART_Nx2N
Definition: hevcdec.h:99
ff_hevc_ref_idx_lx_decode
int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx)
Definition: cabac.c:762
RefPicListTab
Definition: hevcdec.h:203
UPDATE_THREAD_CONTEXT
#define UPDATE_THREAD_CONTEXT(func)
Definition: codec_internal.h:305
BOUNDARY_UPPER_TILE
#define BOUNDARY_UPPER_TILE
Definition: hevcdec.h:444
AV_PIX_FMT_D3D12
@ AV_PIX_FMT_D3D12
Hardware surfaces for Direct3D 12.
Definition: pixfmt.h:440
decode_nal_unit
static int decode_nal_unit(HEVCContext *s, unsigned nal_idx)
Definition: hevcdec.c:3610
aom_film_grain.h
vps
static int FUNC() vps(CodedBitstreamContext *ctx, RWContext *rw, H265RawVPS *current)
Definition: cbs_h265_syntax_template.c:423
AV_OPT_TYPE_UINT
@ AV_OPT_TYPE_UINT
Underlying C type is unsigned int.
Definition: opt.h:335
HEVCContext::is_nalff
int is_nalff
this flag is != 0 if bitstream is encapsulated as a format defined in 14496-15
Definition: hevcdec.h:563
AV_EF_CRCCHECK
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
Definition: defs.h:48
FF_HW_HAS_CB
#define FF_HW_HAS_CB(avctx, function)
Definition: hwaccel_internal.h:177
SliceHeader::nb_refs
unsigned int nb_refs[2]
Definition: hevcdec.h:239
Mv::x
int16_t x
horizontal component of motion vector
Definition: hevcdec.h:306
AVCodecContext::level
int level
Encoding level descriptor.
Definition: avcodec.h:1802
PF_BI
@ PF_BI
Definition: hevcdec.h:123
ff_hevc_sao_eo_class_decode
int ff_hevc_sao_eo_class_decode(HEVCLocalContext *lc)
Definition: cabac.c:556
H2645SEI::display_orientation
H2645SEIDisplayOrientation display_orientation
Definition: h2645_sei.h:136
SAMPLE_CTB
#define SAMPLE_CTB(tab, x, y)
Definition: hevcdec.h:74
HEVCWindow
Definition: ps.h:91
SCAN_HORIZ
@ SCAN_HORIZ
Definition: hevcdec.h:180
PAR
#define PAR
Definition: hevcdec.c:4166
HEVCLocalContext::edge_emu_buffer
uint8_t edge_emu_buffer[(MAX_PB_SIZE+7) *EDGE_EMU_BUFFER_STRIDE *2]
Definition: hevcdec.h:431
IS_IRAP
#define IS_IRAP(s)
Definition: hevcdec.h:79
SAOParams::offset_val
int16_t offset_val[3][5]
SaoOffsetVal.
Definition: dsp.h:42
HEVCSEI::recovery_point
HEVCSEIRecoveryPoint recovery_point
Definition: sei.h:112
LongTermRPS::used
uint8_t used[32]
Definition: hevcdec.h:192
HEVC_NAL_RASL_R
@ HEVC_NAL_RASL_R
Definition: hevc.h:38
SliceHeader::colour_plane_id
uint8_t colour_plane_id
Definition: hevcdec.h:223
PART_nLx2N
@ PART_nLx2N
Definition: hevcdec.h:103
ff_hevc_cabac_init
int ff_hevc_cabac_init(HEVCLocalContext *lc, const HEVCPPS *pps, int ctb_addr_ts, const uint8_t *data, size_t size, int is_wpp)
Definition: cabac.c:454
HEVCContext::nal_length_size
int nal_length_size
Number of bytes used for nal length (1, 2 or 4)
Definition: hevcdec.h:577
luma_mc_bi
static void luma_mc_bi(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *dst, ptrdiff_t dststride, const AVFrame *ref0, const Mv *mv0, int x_off, int y_off, int block_w, int block_h, const AVFrame *ref1, const Mv *mv1, struct MvField *current_mv)
8.5.3.2.2.1 Luma sample bidirectional interpolation process
Definition: hevcdec.c:1794
SliceHeader::dependent_slice_segment_flag
uint8_t dependent_slice_segment_flag
Definition: hevcdec.h:221
HEVCSEITDRDI
Definition: sei.h:82
ff_hevc_set_new_ref
int ff_hevc_set_new_ref(HEVCContext *s, HEVCLayerContext *l, int poc)
Definition: refs.c:209
H2645_FLAG_SMALL_PADDING
@ H2645_FLAG_SMALL_PADDING
Definition: h2645_parse.h:98
SliceHeader::slice_act_cb_qp_offset
int slice_act_cb_qp_offset
Definition: hevcdec.h:256
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:220
SliceHeader::first_slice_in_pic_flag
uint8_t first_slice_in_pic_flag
Definition: hevcdec.h:220
HEVCLocalContext::ctb_left_flag
uint8_t ctb_left_flag
Definition: hevcdec.h:424
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
ff_dovi_ctx_flush
void ff_dovi_ctx_flush(DOVIContext *s)
Partially reset the internal state.
Definition: dovi_rpu.c:42
H2645SEI::frame_packing
H2645SEIFramePacking frame_packing
Definition: h2645_sei.h:135
AVPacket::size
int size
Definition: packet.h:540
BOUNDARY_UPPER_SLICE
#define BOUNDARY_UPPER_SLICE
Definition: hevcdec.h:443
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
ff_dovi_attach_side_data
int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame)
Attach the decoded AVDOVIMetadata as side data to an AVFrame.
Definition: dovi_rpudec.c:64
hevcdec.h
ff_hevc_frame_rps
int ff_hevc_frame_rps(HEVCContext *s, HEVCLayerContext *l)
Construct the reference picture sets for the current frame.
Definition: refs.c:533
height
#define height
Definition: dsp.h:85
av_frame_ref
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:401
codec_internal.h
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
HEVC_NAL_RASL_N
@ HEVC_NAL_RASL_N
Definition: hevc.h:37
HEVCSEITDRDI::right_view_id
uint16_t right_view_id[32]
Definition: sei.h:88
AV_OPT_TYPE_FLAG_ARRAY
@ AV_OPT_TYPE_FLAG_ARRAY
May be combined with another regular option type to declare an array option.
Definition: opt.h:346
AV_PIX_FMT_YUV422P10LE
@ AV_PIX_FMT_YUV422P10LE
planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition: pixfmt.h:158
HEVCSEITDRDI::left_view_id
uint16_t left_view_id[32]
Definition: sei.h:87
ff_hevc_unref_frame
void ff_hevc_unref_frame(HEVCFrame *frame, int flags)
Definition: refs.c:34
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
INTRA_PLANAR
@ INTRA_PLANAR
Definition: hevcdec.h:127
PART_2NxnD
@ PART_2NxnD
Definition: hevcdec.h:102
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:520
HEVC_NAL_SPS
@ HEVC_NAL_SPS
Definition: hevc.h:62
FF_CODEC_CAP_EXPORTS_CROPPING
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
Definition: codec_internal.h:60
size
int size
Definition: twinvq_data.h:10344
SCAN_VERT
@ SCAN_VERT
Definition: hevcdec.h:181
ff_hevc_pcm_flag_decode
int ff_hevc_pcm_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:697
ff_hevc_deblocking_boundary_strengths
void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int x0, int y0, int log2_trafo_size)
Definition: filter.c:742
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
H2645NAL::gb
GetBitContext gb
Definition: h2645_parse.h:47
SliceHeader::collocated_ref_idx
unsigned int collocated_ref_idx
Definition: hevcdec.h:249
HEVCContext::nb_view_ids
unsigned nb_view_ids
Definition: hevcdec.h:569
SliceHeader::entry_point_offset
unsigned * entry_point_offset
Definition: hevcdec.h:267
ff_frame_new_side_data
int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, size_t size, AVFrameSideData **psd)
Wrapper around av_frame_new_side_data, which rejects side data overridden by the demuxer.
Definition: decode.c:2099
hls_decode_neighbour
static void hls_decode_neighbour(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x_ctb, int y_ctb, int ctb_addr_ts)
Definition: hevcdec.c:2713
H2645NAL
Definition: h2645_parse.h:34
hls_slice_data_wpp
static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
Definition: hevcdec.c:2939
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:522
AVFrameSideData::data
uint8_t * data
Definition: frame.h:267
TransformUnit::chroma_mode_c
int chroma_mode_c
Definition: hevcdec.h:343
SUBDIVIDE
#define SUBDIVIDE(x, y, idx)
AVFilmGrainParams
This structure describes how to handle film grain synthesis in video for specific codecs.
Definition: film_grain_params.h:238
FF_THREAD_SLICE
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
Definition: avcodec.h:1613
SliceHeader::short_term_ref_pic_set_sps_flag
int short_term_ref_pic_set_sps_flag
Definition: hevcdec.h:227
AVCHROMA_LOC_UNSPECIFIED
@ AVCHROMA_LOC_UNSPECIFIED
Definition: pixfmt.h:753
SliceHeader::no_output_of_prior_pics_flag
uint8_t no_output_of_prior_pics_flag
Definition: hevcdec.h:236
AVCodecHWConfigInternal
Definition: hwconfig.h:25
MvField
Definition: hevcdec.h:310
QPEL_EXTRA
#define QPEL_EXTRA
Definition: hevcdec.h:66
HEVC_NAL_PPS
@ HEVC_NAL_PPS
Definition: hevc.h:63
PF_L1
@ PF_L1
Definition: hevcdec.h:122
split
static char * split(char *message, char delim)
Definition: af_channelmap.c:89
HEVC_NAL_STSA_R
@ HEVC_NAL_STSA_R
Definition: hevc.h:34
av_frame_remove_side_data
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type.
Definition: frame.c:1049
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:538
av_refstruct_ref
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
Definition: refstruct.c:140
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:174
HEVCContext::dovi_ctx
DOVIContext dovi_ctx
Dolby Vision decoding context.
Definition: hevcdec.h:586
SliceHeader::chroma_weight_l0
int16_t chroma_weight_l0[16][2]
Definition: hevcdec.h:278
options
static const AVOption options[]
Definition: hevcdec.c:4168
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:114
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:558
HWACCEL_D3D11VA
#define HWACCEL_D3D11VA(codec)
Definition: hwconfig.h:78
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
attributes.h
ff_hevc_cbf_luma_decode
int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth)
Definition: cabac.c:831
AV_PIX_FMT_D3D11
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
Definition: pixfmt.h:336
AVCodecInternal
Definition: internal.h:49
HEVCContext::ps
HEVCParamSets ps
Definition: hevcdec.h:512
av_buffer_alloc
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition: buffer.c:77
HWACCEL_NVDEC
#define HWACCEL_NVDEC(codec)
Definition: hwconfig.h:68
av_zero_extend
#define av_zero_extend
Definition: common.h:151
TransformUnit::cu_qp_offset_cb
int8_t cu_qp_offset_cb
Definition: hevcdec.h:346
SliceHeader::chroma_log2_weight_denom
int16_t chroma_log2_weight_denom
Definition: hevcdec.h:275
AV_PIX_FMT_VAAPI
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition: pixfmt.h:126
MvField::pred_flag
int8_t pred_flag
Definition: hevcdec.h:313
HEVCLocalContext::ct_depth
int ct_depth
Definition: hevcdec.h:436
SAOParams::eo_class
int eo_class[3]
sao_eo_class
Definition: dsp.h:40
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:220
FF_THREAD_FRAME
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1612
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
AV_OPT_FLAG_READONLY
#define AV_OPT_FLAG_READONLY
The option may not be set through the AVOptions API, only read.
Definition: opt.h:368
ff_init_cabac_decoder
int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size)
Definition: cabac.c:162
ff_hevc_ps_uninit
void ff_hevc_ps_uninit(HEVCParamSets *ps)
Definition: ps.c:2434
AV_PIX_FMT_VDPAU
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition: pixfmt.h:194
PART_nRx2N
@ PART_nRx2N
Definition: hevcdec.h:104
setup_multilayer
static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
Definition: hevcdec.c:488
EPEL_EXTRA_BEFORE
#define EPEL_EXTRA_BEFORE
Definition: hevcdec.h:61
AV_PIX_FMT_VIDEOTOOLBOX
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
Definition: pixfmt.h:305
SliceHeader::slice_cb_qp_offset
int slice_cb_qp_offset
Definition: hevcdec.h:252
SliceHeader
Definition: hevcdec.h:207
ff_hevc_frame_nb_refs
int ff_hevc_frame_nb_refs(const SliceHeader *sh, const HEVCPPS *pps, unsigned layer_idx)
Get the number of candidate references for the current frame.
Definition: refs.c:613
MODE_INTRA
#define MODE_INTRA
Definition: vp3.c:84
HEVCLayerContext::filter_slice_edges
uint8_t * filter_slice_edges
Definition: hevcdec.h:476
HEVCLayerContext::qp_y_tab
int8_t * qp_y_tab
Definition: hevcdec.h:480
av_md5_init
void av_md5_init(AVMD5 *ctx)
Initialize MD5 hashing.
Definition: md5.c:143
ff_hevc_cu_transquant_bypass_flag_decode
int ff_hevc_cu_transquant_bypass_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:568
ff_h274_apply_film_grain
int ff_h274_apply_film_grain(AVFrame *out_frame, const AVFrame *in_frame, H274FilmGrainDatabase *database, const AVFilmGrainParams *params)
Definition: h274.c:217
HEVC_NAL_TSA_R
@ HEVC_NAL_TSA_R
Definition: hevc.h:32
SliceHeader::slice_sample_adaptive_offset_flag
uint8_t slice_sample_adaptive_offset_flag[3]
Definition: hevcdec.h:241
AVDISCARD_NONINTRA
@ AVDISCARD_NONINTRA
discard all non intra frames
Definition: defs.h:219
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
decode_nal_units
static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
Definition: hevcdec.c:3703
av_timecode_make_smpte_tc_string2
char * av_timecode_make_smpte_tc_string2(char *buf, AVRational rate, uint32_t tcsmpte, int prevent_df, int skip_field)
Get the timecode string from the SMPTE timecode format.
Definition: timecode.c:139
hevc_pel_weight
static const uint8_t hevc_pel_weight[65]
Definition: hevcdec.c:59
HEVCFrame
Definition: hevcdec.h:362
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:537
HEVCFrame::tf
ProgressFrame tf
Definition: hevcdec.h:367
HEVC_MAX_REFS
@ HEVC_MAX_REFS
Definition: hevc.h:122
av_packet_get_side_data
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
Definition: packet.c:253
HEVCLayerContext
Definition: hevcdec.h:454
internal.h
EPEL_EXTRA_AFTER
#define EPEL_EXTRA_AFTER
Definition: hevcdec.h:62
src2
const pixel * src2
Definition: h264pred_template.c:421
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:31
ff_hevc_no_residual_syntax_flag_decode
int ff_hevc_no_residual_syntax_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:783
SliceHeader::offset
int * offset
Definition: hevcdec.h:268
HEVCSEITDRDI::num_ref_displays
uint8_t num_ref_displays
Definition: sei.h:86
common.h
HEVCContext::view_ids
int * view_ids
Definition: hevcdec.h:568
AVCodecInternal::in_pkt
AVPacket * in_pkt
This packet is used to hold the packet given to decoders implementing the .decode API; it is unused b...
Definition: internal.h:83
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
SliceHeader::mvd_l1_zero_flag
uint8_t mvd_l1_zero_flag
Definition: hevcdec.h:242
ff_hevc_mpm_idx_decode
int ff_hevc_mpm_idx_decode(HEVCLocalContext *lc)
Definition: cabac.c:707
delta
float delta
Definition: vorbis_enc_data.h:430
md5.h
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
chroma_mc_bi
static void chroma_mc_bi(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *dst0, ptrdiff_t dststride, const AVFrame *ref0, const AVFrame *ref1, int x_off, int y_off, int block_w, int block_h, const MvField *current_mv, int cidx)
8.5.3.2.2.2 Chroma sample bidirectional interpolation process
Definition: hevcdec.c:1958
av_always_inline
#define av_always_inline
Definition: attributes.h:49
ff_thread_progress_init
av_cold int ff_thread_progress_init(ThreadProgress *pro, int init_mode)
Initialize a ThreadProgress.
Definition: threadprogress.c:33
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
PF_L0
@ PF_L0
Definition: hevcdec.h:121
EDGE_EMU_BUFFER_STRIDE
#define EDGE_EMU_BUFFER_STRIDE
Definition: hevcdec.h:68
cabac_functions.h
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
SET_SAO
#define SET_SAO(elem, value)
Definition: hevcdec.c:1211
SliceHeader::data_offset
unsigned data_offset
Definition: hevcdec.h:289
HEVCLocalContext::qp_y
int8_t qp_y
Definition: hevcdec.h:417
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
HEVCSPS::width
int width
Definition: ps.h:350
av_buffer_replace
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition: buffer.c:233
AVCodecContext::chroma_sample_location
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition: avcodec.h:716
HEVCSEI::tdrdi
HEVCSEITDRDI tdrdi
Definition: sei.h:111
SliceHeader::chroma_offset_l0
int16_t chroma_offset_l0[16][2]
Definition: hevcdec.h:283
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:659
SliceHeader::list_entry_lx
unsigned int list_entry_lx[2][32]
Definition: hevcdec.h:233
AVCodecContext::height
int height
Definition: avcodec.h:632
HEVCSEIDynamicHDRVivid::info
AVBufferRef * info
Definition: h2645_sei.h:50
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:671
av_md5_final
void av_md5_final(AVMD5 *ctx, uint8_t *dst)
Finish hashing and output digest value.
Definition: md5.c:188
HEVCContext::recovery_poc
int recovery_poc
Definition: hevcdec.h:531
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:716
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
HEVCFrame::f
AVFrame * f
Definition: hevcdec.h:365
HWACCEL_VIDEOTOOLBOX
#define HWACCEL_VIDEOTOOLBOX(codec)
Definition: hwconfig.h:74
ff_hevc_cu_chroma_qp_offset_flag
int ff_hevc_cu_chroma_qp_offset_flag(HEVCLocalContext *lc)
Definition: cabac.c:618
hls_coding_quadtree
static int hls_coding_quadtree(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int log2_cb_size, int cb_depth)
Definition: hevcdec.c:2620
SAOParams
Definition: dsp.h:34
hls_decode_entry
static int hls_decode_entry(HEVCContext *s, GetBitContext *gb)
Definition: hevcdec.c:2764
SliceHeader::short_term_rps
const ShortTermRPS * short_term_rps
Definition: hevcdec.h:230
GetBitContext::buffer_end
const uint8_t * buffer_end
Definition: get_bits.h:109
hls_prediction_unit
static void hls_prediction_unit(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int partIdx, int idx)
Definition: hevcdec.c:2108
hls_transform_unit
static int hls_transform_unit(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int xBase, int yBase, int cb_xBase, int cb_yBase, int log2_cb_size, int log2_trafo_size, int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
Definition: hevcdec.c:1315
stride
#define stride
Definition: h264pred_template.c:536
SliceHeader::cu_chroma_qp_offset_enabled_flag
uint8_t cu_chroma_qp_offset_enabled_flag
Definition: hevcdec.h:259
decode_lt_rps
static int decode_lt_rps(const HEVCSPS *sps, LongTermRPS *rps, GetBitContext *gb, int cur_poc, int poc_lsb)
Definition: hevcdec.c:289
ff_hevc_sao_merge_flag_decode
int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc)
Definition: cabac.c:516
vshift
static int vshift(enum AVPixelFormat fmt, int plane)
Definition: graph.c:99
HEVCLayerContext::sps
const HEVCSPS * sps
Definition: hevcdec.h:458
ret
ret
Definition: filter_design.txt:187
H2645NAL::raw_data
const uint8_t * raw_data
Definition: h2645_parse.h:45
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:80
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
PRED_L1
@ PRED_L1
Definition: hevcdec.h:115
PredictionUnit::mvd
Mv mvd
Definition: hevcdec.h:329
SliceHeader::disable_deblocking_filter_flag
uint8_t disable_deblocking_filter_flag
slice_header_disable_deblocking_filter_flag
Definition: hevcdec.h:245
HEVCLocalContext::edge_emu_buffer2
uint8_t edge_emu_buffer2[(MAX_PB_SIZE+7) *EDGE_EMU_BUFFER_STRIDE *2]
Definition: hevcdec.h:433
HEVC_NAL_EOB_NUT
@ HEVC_NAL_EOB_NUT
Definition: hevc.h:66
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
ff_hevc_set_qPy
void ff_hevc_set_qPy(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int xBase, int yBase, int log2_cb_size)
Definition: filter.c:122
align_get_bits
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:544
av_container_fifo_free
void av_container_fifo_free(AVContainerFifo **pcf)
Free a AVContainerFifo and everything in it.
Definition: container_fifo.c:101
hls_sao_param
static void hls_sao_param(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int rx, int ry)
Definition: hevcdec.c:1223
av_refstruct_pool_alloc
AVRefStructPool * av_refstruct_pool_alloc(size_t size, unsigned flags)
Equivalent to av_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
Definition: refstruct.c:335
pos
unsigned int pos
Definition: spdifenc.c:414
hevc_decode_flush
static void hevc_decode_flush(AVCodecContext *avctx)
Definition: hevcdec.c:4152
SliceHeader::max_num_merge_cand
uint8_t max_num_merge_cand
5 - 5_minus_max_num_merge_cand
Definition: hevcdec.h:264
ff_thread_progress_destroy
av_cold void ff_thread_progress_destroy(ThreadProgress *pro)
Destroy a ThreadProgress.
Definition: threadprogress.c:44
SliceHeader::luma_weight_l0
int16_t luma_weight_l0[16]
Definition: hevcdec.h:277
ff_thread_finish_setup
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call ff_thread_finish_setup() afterwards. If some code can 't be moved
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:519
ff_hevc_sao_band_position_decode
int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc)
Definition: cabac.c:531
HEVCLocalContext::boundary_flags
int boundary_flags
Definition: hevcdec.h:447
U
#define U(x)
Definition: vpx_arith.h:37
HWACCEL_VULKAN
#define HWACCEL_VULKAN(codec)
Definition: hwconfig.h:76
LongTermRPS
Definition: hevcdec.h:189
SliceHeader::slice_type
enum HEVCSliceType slice_type
Definition: hevcdec.h:215
AV_FRAME_DATA_DYNAMIC_HDR_PLUS
@ AV_FRAME_DATA_DYNAMIC_HDR_PLUS
HDR dynamic metadata associated with a video frame.
Definition: frame.h:159
AVCodecContext
main external API structure.
Definition: avcodec.h:451
get_ue_golomb_31
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
Definition: golomb.h:120
HEVCContext::layers_active_decode
unsigned layers_active_decode
Definition: hevcdec.h:504
SliceHeader::slice_qp
int8_t slice_qp
Definition: hevcdec.h:272
HEVC_NAL_CRA_NUT
@ HEVC_NAL_CRA_NUT
Definition: hevc.h:50
ff_hevc_inter_pred_idc_decode
int ff_hevc_inter_pred_idc_decode(HEVCLocalContext *lc, int nPbW, int nPbH)
Definition: cabac.c:752
AV_FILM_GRAIN_PARAMS_H274
@ AV_FILM_GRAIN_PARAMS_H274
The union is valid when interpreted as AVFilmGrainH274Params (codec.h274)
Definition: film_grain_params.h:35
FF_CODEC_RECEIVE_FRAME_CB
#define FF_CODEC_RECEIVE_FRAME_CB(func)
Definition: codec_internal.h:317
av_refstruct_ref_c
const void * av_refstruct_ref_c(const void *obj)
Analog of av_refstruct_ref(), but for constant objects.
Definition: refstruct.c:149
ff_hevc_decode_nal_sps
int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps, unsigned nuh_layer_id, int apply_defdispwin)
Definition: ps.c:1700
ff_h274_film_grain_params_supported
static int ff_h274_film_grain_params_supported(int model_id, enum AVPixelFormat pix_fmt)
Check whether ff_h274_apply_film_grain() supports the given parameter combination.
Definition: h274.h:49
PredictionUnit::merge_flag
uint8_t merge_flag
Definition: hevcdec.h:330
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
av_md5_alloc
struct AVMD5 * av_md5_alloc(void)
Allocate an AVMD5 context.
Definition: md5.c:50
AVRational::den
int den
Denominator.
Definition: rational.h:60
SliceHeader::slice_cr_qp_offset
int slice_cr_qp_offset
Definition: hevcdec.h:253
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
map_to_alpha_format
static enum AVPixelFormat map_to_alpha_format(HEVCContext *s, enum AVPixelFormat pix_fmt)
Definition: hevcdec.c:564
FF_HW_CALL
#define FF_HW_CALL(avctx, function,...)
Definition: hwaccel_internal.h:171
HEVCContext
Definition: hevcdec.h:492
AV_PIX_FMT_YUVA422P12
#define AV_PIX_FMT_YUVA422P12
Definition: pixfmt.h:559
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1658
HWACCEL_MAX
#define HWACCEL_MAX
CodingUnit::pred_mode
enum PredMode pred_mode
PredMode.
Definition: hevcdec.h:296
HEVCContext::layers
HEVCLayerContext layers[HEVC_VPS_MAX_LAYERS]
Definition: hevcdec.h:500
SliceHeader::pic_order_cnt_lsb
int pic_order_cnt_lsb
Definition: hevcdec.h:217
HEVCLayerContext::DPB
HEVCFrame DPB[32]
Definition: hevcdec.h:455
HEVCContext::rpu_buf
AVBufferRef * rpu_buf
0 or 1 Dolby Vision RPUs.
Definition: hevcdec.h:585
HEVCLocalContext::qPy_pred
int qPy_pred
Definition: hevcdec.h:420
ff_hevc_split_coding_unit_flag_decode
int ff_hevc_split_coding_unit_flag_decode(HEVCLocalContext *lc, uint8_t *tab_ct_depth, const HEVCSPS *sps, int ct_depth, int x0, int y0)
Definition: cabac.c:639
SCAN_DIAG
@ SCAN_DIAG
Definition: hevcdec.h:179
intra_prediction_unit_default_value
static void intra_prediction_unit_default_value(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCSPS *sps, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:2408
SliceHeader::rpl_modification_flag
uint8_t rpl_modification_flag[2]
Definition: hevcdec.h:235
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
pps
uint64_t pps
Definition: dovi_rpuenc.c:35
SAOParams::type_idx
uint8_t type_idx[3]
sao_type_idx
Definition: dsp.h:44
AVCodecContext::export_side_data
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
Definition: avcodec.h:1956
HEVCWindow::right_offset
unsigned int right_offset
Definition: ps.h:93
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
MD5_PRI
#define MD5_PRI
ff_thread_progress_reset
static void ff_thread_progress_reset(ThreadProgress *pro)
Reset the ThreadProgress.progress counter; must only be called if the ThreadProgress is not in use in...
Definition: threadprogress.h:72
FF_CODEC_PROPERTY_CLOSED_CAPTIONS
#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS
Definition: avcodec.h:1818
HEVC_MAX_PPS_COUNT
@ HEVC_MAX_PPS_COUNT
Definition: hevc.h:117
av_md5_update
void av_md5_update(AVMD5 *ctx, const uint8_t *src, size_t len)
Update hash value.
Definition: md5.c:153
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
HEVCLocalContext::tu
TransformUnit tu
Definition: hevcdec.h:422
av_container_fifo_can_read
size_t av_container_fifo_can_read(const AVContainerFifo *cf)
Definition: container_fifo.c:185
CodingUnit::y
int y
Definition: hevcdec.h:294
src0
const pixel *const src0
Definition: h264pred_template.c:419
AVCodecInternal::draining
int draining
decoding: AVERROR_EOF has been returned from ff_decode_get_packet(); must not be used by decoders tha...
Definition: internal.h:139
HEVC_SCALABILITY_AUXILIARY
@ HEVC_SCALABILITY_AUXILIARY
Definition: hevc.h:169
av_log_once
void av_log_once(void *avcl, int initial_level, int subsequent_level, int *state, const char *fmt,...)
Definition: log.c:448
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:72
ff_hevc_cu_qp_delta_abs
int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc)
Definition: cabac.c:586
MvField::mv
Mv mv[2]
mvL0, vvL1
Definition: hevcdec.h:311
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:647
SliceHeader::inter_layer_pred
uint8_t inter_layer_pred
RPS coded in the slice header itself is stored here.
Definition: hevcdec.h:224
desc
const char * desc
Definition: libsvtav1.c:79
Mv
Definition: hevcdec.h:305
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
ff_hevc_clear_refs
void ff_hevc_clear_refs(HEVCLayerContext *l)
Mark all frames in DPB as unused for reference.
Definition: refs.c:66
MvField::ref_idx
int8_t ref_idx[2]
refIdxL0, refIdxL1
Definition: hevcdec.h:312
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
PRED_L0
@ PRED_L0
Definition: hevcdec.h:114
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
get_bitsz
static av_always_inline int get_bitsz(GetBitContext *s, int n)
Read 0-25 bits.
Definition: get_bits.h:334
HEVC_RECOVERY_END
#define HEVC_RECOVERY_END
Definition: hevcdec.h:82
HEVCVPS
Definition: ps.h:171
get_ue_golomb_long
static unsigned get_ue_golomb_long(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
Definition: golomb.h:104
hevc_decode_extradata
static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first)
Definition: hevcdec.c:3809
EPEL_EXTRA
#define EPEL_EXTRA
Definition: hevcdec.h:63
ff_h2645_sei_ctx_replace
int ff_h2645_sei_ctx_replace(H2645SEI *dst, const H2645SEI *src)
Definition: h2645_sei.c:521
ff_hevc_slice_rpl
int ff_hevc_slice_rpl(HEVCContext *s)
Construct the reference picture list(s) for the current slice.
Definition: refs.c:342
HEVCContext::eos
int eos
current packet contains an EOS/EOB NAL
Definition: hevcdec.h:529
get_format
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
Definition: hevcdec.c:592
HEVCLayerContext::sao
SAOParams * sao
Definition: hevcdec.h:463
HEVCSPS
Definition: ps.h:255
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:265
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
pic_arrays_init
static int pic_arrays_init(HEVCLayerContext *l, const HEVCSPS *sps)
Definition: hevcdec.c:100
HEVCPPS
Definition: ps.h:374
HEVC_NAL_TRAIL_R
@ HEVC_NAL_TRAIL_R
Definition: hevc.h:30
CodingUnit::part_mode
enum PartMode part_mode
PartMode.
Definition: hevcdec.h:297
HEVC_NAL_RADL_R
@ HEVC_NAL_RADL_R
Definition: hevc.h:36
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
av_refstruct_pool_uninit
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition: refstruct.h:292
hevc_init_context
static av_cold int hevc_init_context(AVCodecContext *avctx)
Definition: hevcdec.c:3980
SliceHeader::tc_offset
int tc_offset
tc_offset_div2 * 2
Definition: hevcdec.h:262
LongTermRPS::nb_refs
uint8_t nb_refs
Definition: hevcdec.h:193
AV_OPT_FLAG_EXPORT
#define AV_OPT_FLAG_EXPORT
The option is intended for exporting values to the caller.
Definition: opt.h:363
AVPacket
This structure stores compressed data.
Definition: packet.h:516
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:478
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
TransformUnit::cross_pf
uint8_t cross_pf
Definition: hevcdec.h:348
HEVCLocalContext::cu
CodingUnit cu
Definition: hevcdec.h:437
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:88
av_fast_malloc
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
Definition: mem.c:557
H2645SEI::dynamic_hdr_plus
HEVCSEIDynamicHDRPlus dynamic_hdr_plus
Definition: h2645_sei.h:131
SliceHeader::pps_id
unsigned int pps_id
address (in raster order) of the first block in the current slice segment
Definition: hevcdec.h:208
SliceHeader::luma_weight_l1
int16_t luma_weight_l1[16]
Definition: hevcdec.h:280
hevc_luma_mv_mvp_mode
static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv)
Definition: hevcdec.c:2061
HWACCEL_VAAPI
#define HWACCEL_VAAPI(codec)
Definition: hwconfig.h:70
HEVCParamSets::vps_list
const HEVCVPS * vps_list[HEVC_MAX_VPS_COUNT]
RefStruct references.
Definition: ps.h:512
FFMAX3
#define FFMAX3(a, b, c)
Definition: macros.h:48
OFFSET
#define OFFSET(x)
Definition: hevcdec.c:4165
ff_hevc_log2_res_scale_abs
int ff_hevc_log2_res_scale_abs(HEVCLocalContext *lc, int idx)
Definition: cabac.c:851
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:632
int32_t
int32_t
Definition: audioconvert.c:56
decode_slice_data
static int decode_slice_data(HEVCContext *s, const HEVCLayerContext *l, const H2645NAL *nal, GetBitContext *gb)
Definition: hevcdec.c:3041
PredictionUnit::mpm_idx
int mpm_idx
Definition: hevcdec.h:326
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
AVCodecContext::properties
attribute_deprecated unsigned properties
Properties of the stream that gets decoded.
Definition: avcodec.h:1816
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:455
ff_hevc_sao_offset_sign_decode
int ff_hevc_sao_offset_sign_decode(HEVCLocalContext *lc)
Definition: cabac.c:551
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
PredictionUnit::chroma_mode_c
uint8_t chroma_mode_c[4]
Definition: hevcdec.h:332
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
skip_bytes
static const av_unused uint8_t * skip_bytes(CABACContext *c, int n)
Skip n bytes and reset the decoder.
Definition: cabac_functions.h:203
PredictionUnit::intra_pred_mode
uint8_t intra_pred_mode[4]
Definition: hevcdec.h:328
TransformUnit::is_cu_chroma_qp_offset_coded
uint8_t is_cu_chroma_qp_offset_coded
Definition: hevcdec.h:345
h
h
Definition: vp9dsp_template.c:2070
hevc_frame_end
static int hevc_frame_end(HEVCContext *s, HEVCLayerContext *l)
Definition: hevcdec.c:3498
BOUNDARY_LEFT_SLICE
#define BOUNDARY_LEFT_SLICE
Definition: hevcdec.h:441
ff_h2645_packet_split
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, void *logctx, int nal_length_size, enum AVCodecID codec_id, int flags)
Split an input packet into NAL units.
Definition: h2645_parse.c:465
SliceHeader::slice_qp_delta
int slice_qp_delta
Definition: hevcdec.h:251
SliceHeader::slice_addr
unsigned int slice_addr
Definition: hevcdec.h:213
SliceHeader::use_integer_mv_flag
uint8_t use_integer_mv_flag
Definition: hevcdec.h:265
avstring.h
atomic_init
#define atomic_init(obj, value)
Definition: stdatomic.h:33
HEVCLayerContext::rpl_tab_pool
struct AVRefStructPool * rpl_tab_pool
Definition: hevcdec.h:489
ff_hevc_hls_filter
void ff_hevc_hls_filter(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int x, int y, int ctb_size)
Definition: filter.c:872
width
#define width
Definition: dsp.h:85
TransformUnit::intra_pred_mode_c
int intra_pred_mode_c
Definition: hevcdec.h:342
AVDISCARD_NONREF
@ AVDISCARD_NONREF
discard all non reference
Definition: defs.h:217
HEVC_NAL_RADL_N
@ HEVC_NAL_RADL_N
Definition: hevc.h:35
AV_FILM_GRAIN_PARAMS_AV1
@ AV_FILM_GRAIN_PARAMS_AV1
The union is valid when interpreted as AVFilmGrainAOMParams (codec.aom)
Definition: film_grain_params.h:30
hls_pcm_sample
static int hls_pcm_sample(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:1671
HEVCLocalContext::end_of_tiles_y
int end_of_tiles_y
Definition: hevcdec.h:429
AVFilmGrainParams::type
enum AVFilmGrainParamsType type
Specifies the codec for which this structure is valid.
Definition: film_grain_params.h:242
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
HEVCContext::poc_tid0
int poc_tid0
Definition: hevcdec.h:527
CodingUnit::intra_split_flag
uint8_t intra_split_flag
IntraSplitFlag.
Definition: hevcdec.h:300
H2645SEI::alternative_transfer
H2645SEIAlternativeTransfer alternative_transfer
Definition: h2645_sei.h:137
POS
#define POS(c_idx, x, y)
HEVCSPS::pix_fmt
enum AVPixelFormat pix_fmt
Definition: ps.h:268
SHIFT_CTB_WPP
#define SHIFT_CTB_WPP
Definition: hevcdec.h:47
av_color_transfer_name
const char * av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
Definition: pixdesc.c:3603
ff_hevc_intra_chroma_pred_mode_decode
int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc)
Definition: cabac.c:725
luma_intra_pred_mode
static int luma_intra_pred_mode(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCSPS *sps, int x0, int y0, int pu_size, int prev_intra_luma_pred_flag)
8.4.1
Definition: hevcdec.c:2238
PART_2NxN
@ PART_2NxN
Definition: hevcdec.h:98
av_frame_side_data_add
AVFrameSideData * av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, AVBufferRef **pbuf, unsigned int flags)
Add a new side data entry to an array from an existing AVBufferRef.
Definition: frame.c:867
src
#define src
Definition: vp8dsp.c:248
AV_CODEC_EXPORT_DATA_FILM_GRAIN
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
Definition: avcodec.h:420
SliceHeader::long_term_rps
LongTermRPS long_term_rps
Definition: hevcdec.h:232
AV_PIX_FMT_YUVA422P
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition: pixfmt.h:173
HEVCLayerContext::is_pcm
uint8_t * is_pcm
Definition: hevcdec.h:473
HEVC_NAL_FD_NUT
@ HEVC_NAL_FD_NUT
Definition: hevc.h:67
HEVC_NAL_BLA_W_RADL
@ HEVC_NAL_BLA_W_RADL
Definition: hevc.h:46
HEVC_NAL_TRAIL_N
@ HEVC_NAL_TRAIL_N
Definition: hevc.h:29
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3168
HEVC_SLICE_P
@ HEVC_SLICE_P
Definition: hevc.h:97
HEVCLocalContext::cc
CABACContext cc
Definition: hevcdec.h:403
TransformUnit::cu_qp_offset_cr
int8_t cu_qp_offset_cr
Definition: hevcdec.h:347
ff_hevc_decode_nal_sei
int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, enum HEVCNALUnitType type)
Definition: sei.c:299
ff_dovi_ctx_replace
void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0)
Definition: dovi_rpu.c:58
HEVC_NAL_BLA_W_LP
@ HEVC_NAL_BLA_W_LP
Definition: hevc.h:45
AVDOVIDecoderConfigurationRecord
Definition: dovi_meta.h:55
ff_hevc_rem_intra_luma_pred_mode_decode
int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCLocalContext *lc)
Definition: cabac.c:715