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