FFmpeg
vulkan_hevc.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "libavutil/mem.h"
20 #include "hevcdec.h"
21 #include "hevc_data.h"
22 #include "hevc_ps.h"
23 
24 #include "vulkan_decode.h"
25 
28  .decode_extension = FF_VK_EXT_VIDEO_DECODE_H265,
29  .decode_op = VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR,
30  .ext_props = {
31  .extensionName = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME,
32  .specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION,
33  },
34 };
35 
36 typedef struct HEVCHeaderSPS {
37  StdVideoH265ScalingLists scaling;
38  StdVideoH265HrdParameters vui_header;
39  StdVideoH265SequenceParameterSetVui vui;
40  StdVideoH265ProfileTierLevel ptl;
41  StdVideoH265DecPicBufMgr dpbm;
42  StdVideoH265PredictorPaletteEntries pal;
43  StdVideoH265SubLayerHrdParameters nal_hdr[HEVC_MAX_SUB_LAYERS];
44  StdVideoH265SubLayerHrdParameters vcl_hdr[HEVC_MAX_SUB_LAYERS];
45  StdVideoH265ShortTermRefPicSet str[HEVC_MAX_SHORT_TERM_REF_PIC_SETS];
46  StdVideoH265LongTermRefPicsSps ltr;
48 
49 typedef struct HEVCHeaderPPS {
50  StdVideoH265ScalingLists scaling;
51  StdVideoH265PredictorPaletteEntries pal;
53 
54 typedef struct HEVCHeaderVPSSet {
55  StdVideoH265SubLayerHrdParameters nal_hdr[HEVC_MAX_SUB_LAYERS];
56  StdVideoH265SubLayerHrdParameters vcl_hdr[HEVC_MAX_SUB_LAYERS];
58 
59 typedef struct HEVCHeaderVPS {
60  StdVideoH265ProfileTierLevel ptl;
61  StdVideoH265DecPicBufMgr dpbm;
62  StdVideoH265HrdParameters hdr[HEVC_MAX_LAYER_SETS];
65 
66 typedef struct HEVCHeaderSet {
67  StdVideoH265SequenceParameterSet sps[HEVC_MAX_SPS_COUNT];
69 
70  StdVideoH265PictureParameterSet pps[HEVC_MAX_PPS_COUNT];
72 
73  StdVideoH265VideoParameterSet vps[HEVC_MAX_PPS_COUNT];
76 
78  int nb_vps,
79  const int vps_list_idx[HEVC_MAX_VPS_COUNT],
80  const HEVCVPS * const vps_list[HEVC_MAX_VPS_COUNT])
81 {
82  uint8_t *data_ptr;
83  HEVCHeaderSet *hdr;
84 
85  size_t buf_size = sizeof(HEVCHeaderSet) + nb_vps*sizeof(HEVCHeaderVPS);
86  for (int i = 0; i < nb_vps; i++) {
87  const HEVCVPS *vps = vps_list[vps_list_idx[i]];
88  buf_size += sizeof(HEVCHeaderVPSSet)*vps->vps_num_hrd_parameters;
89  }
90 
91  if (buf_size > s->hevc_headers_size) {
92  av_freep(&s->hevc_headers);
93  s->hevc_headers_size = 0;
94  s->hevc_headers = av_mallocz(buf_size);
95  if (!s->hevc_headers)
96  return AVERROR(ENOMEM);
97  s->hevc_headers_size = buf_size;
98  }
99 
100  /* Setup struct pointers */
101  hdr = s->hevc_headers;
102  data_ptr = (uint8_t *)hdr;
103  hdr->hvps = (HEVCHeaderVPS *)(data_ptr + sizeof(HEVCHeaderSet));
104  data_ptr += sizeof(HEVCHeaderSet) + nb_vps*sizeof(HEVCHeaderVPS);
105  for (int i = 0; i < nb_vps; i++) {
106  const HEVCVPS *vps = vps_list[vps_list_idx[i]];
107  hdr->hvps[i].sls = (HEVCHeaderVPSSet *)data_ptr;
108  data_ptr += sizeof(HEVCHeaderVPSSet)*vps->vps_num_hrd_parameters;
109  }
110 
111  return 0;
112 }
113 
114 typedef struct HEVCVulkanDecodePicture {
116 
117  /* Current picture */
118  StdVideoDecodeH265ReferenceInfo h265_ref;
119  VkVideoDecodeH265DpbSlotInfoKHR vkh265_ref;
120 
121  /* Picture refs */
123  StdVideoDecodeH265ReferenceInfo h265_refs [HEVC_MAX_REFS];
124  VkVideoDecodeH265DpbSlotInfoKHR vkh265_refs[HEVC_MAX_REFS];
125 
126  /* Current picture (contd.) */
127  StdVideoDecodeH265PictureInfo h265pic;
128  VkVideoDecodeH265PictureInfoKHR h265_pic_info;
130 
131 static int vk_hevc_fill_pict(AVCodecContext *avctx, HEVCFrame **ref_src,
132  VkVideoReferenceSlotInfoKHR *ref_slot, /* Main structure */
133  VkVideoPictureResourceInfoKHR *ref, /* Goes in ^ */
134  VkVideoDecodeH265DpbSlotInfoKHR *vkh265_ref, /* Goes in ^ */
135  StdVideoDecodeH265ReferenceInfo *h265_ref, /* Goes in ^ */
136  HEVCFrame *pic, int is_current, int pic_id)
137 {
140  FFVulkanDecodePicture *vkpic = &hp->vp;
141 
142  int err = ff_vk_decode_prepare_frame(dec, pic->frame, vkpic, is_current,
143  dec->dedicated_dpb);
144  if (err < 0)
145  return err;
146 
147  *h265_ref = (StdVideoDecodeH265ReferenceInfo) {
148  .flags = (StdVideoDecodeH265ReferenceInfoFlags) {
149  .used_for_long_term_reference = pic->flags & HEVC_FRAME_FLAG_LONG_REF,
150  .unused_for_reference = 0,
151  },
152  .PicOrderCntVal = pic->poc,
153  };
154 
155  *vkh265_ref = (VkVideoDecodeH265DpbSlotInfoKHR) {
156  .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR,
157  .pStdReferenceInfo = h265_ref,
158  };
159 
160  *ref = (VkVideoPictureResourceInfoKHR) {
161  .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
162  .codedOffset = (VkOffset2D){ 0, 0 },
163  .codedExtent = (VkExtent2D){ pic->frame->width, pic->frame->height },
164  .baseArrayLayer = dec->layered_dpb ? pic_id : 0,
165  .imageViewBinding = vkpic->img_view_ref,
166  };
167 
168  *ref_slot = (VkVideoReferenceSlotInfoKHR) {
169  .sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR,
170  .pNext = vkh265_ref,
171  .slotIndex = pic_id,
172  .pPictureResource = ref,
173  };
174 
175  if (ref_src)
176  *ref_src = pic;
177 
178  return 0;
179 }
180 
181 static StdVideoH265LevelIdc convert_to_vk_level_idc(int level_idc)
182 {
183  switch (level_idc) {
184  case 10: return STD_VIDEO_H265_LEVEL_IDC_1_0;
185  case 20: return STD_VIDEO_H265_LEVEL_IDC_2_0;
186  case 21: return STD_VIDEO_H265_LEVEL_IDC_2_1;
187  case 30: return STD_VIDEO_H265_LEVEL_IDC_3_0;
188  case 31: return STD_VIDEO_H265_LEVEL_IDC_3_1;
189  case 40: return STD_VIDEO_H265_LEVEL_IDC_4_0;
190  case 41: return STD_VIDEO_H265_LEVEL_IDC_4_1;
191  case 50: return STD_VIDEO_H265_LEVEL_IDC_5_0;
192  case 51: return STD_VIDEO_H265_LEVEL_IDC_5_1;
193  case 60: return STD_VIDEO_H265_LEVEL_IDC_6_0;
194  case 61: return STD_VIDEO_H265_LEVEL_IDC_6_1;
195  default:
196  case 62: return STD_VIDEO_H265_LEVEL_IDC_6_2;
197  }
198 }
199 
200 static void copy_scaling_list(const ScalingList *sl, StdVideoH265ScalingLists *vksl)
201 {
202  for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS; i++) {
203  for (int j = 0; j < STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS; j++) {
204  uint8_t pos = 4 * ff_hevc_diag_scan4x4_y[j] + ff_hevc_diag_scan4x4_x[j];
205  vksl->ScalingList4x4[i][j] = sl->sl[0][i][pos];
206  }
207  }
208 
209  for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS; i++) {
210  for (int j = 0; j < STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS; j++) {
211  uint8_t pos = 8 * ff_hevc_diag_scan8x8_y[j] + ff_hevc_diag_scan8x8_x[j];
212  vksl->ScalingList8x8[i][j] = sl->sl[1][i][pos];
213  }
214  }
215 
216  for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS; i++) {
217  for (int j = 0; j < STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS; j++) {
218  uint8_t pos = 8 * ff_hevc_diag_scan8x8_y[j] + ff_hevc_diag_scan8x8_x[j];
219  vksl->ScalingList16x16[i][j] = sl->sl[2][i][pos];
220  }
221  }
222 
223  for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; i++) {
224  for (int j = 0; j < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS; j++) {
225  uint8_t pos = 8 * ff_hevc_diag_scan8x8_y[j] + ff_hevc_diag_scan8x8_x[j];
226  vksl->ScalingList32x32[i][j] = sl->sl[3][i * 3][pos];
227  }
228  }
229 
230  memcpy(vksl->ScalingListDCCoef16x16, sl->sl_dc[0],
231  STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS * sizeof(*vksl->ScalingListDCCoef16x16));
232 
233  for (int i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; i++)
234  vksl->ScalingListDCCoef32x32[i] = sl->sl_dc[1][i * 3];
235 }
236 
237 static void set_sps(const HEVCSPS *sps, int sps_idx,
238  StdVideoH265ScalingLists *vksps_scaling,
239  StdVideoH265HrdParameters *vksps_vui_header,
240  StdVideoH265SequenceParameterSetVui *vksps_vui,
241  StdVideoH265SequenceParameterSet *vksps,
242  StdVideoH265SubLayerHrdParameters *slhdrnal,
243  StdVideoH265SubLayerHrdParameters *slhdrvcl,
244  StdVideoH265ProfileTierLevel *ptl,
245  StdVideoH265DecPicBufMgr *dpbm,
246  StdVideoH265PredictorPaletteEntries *pal,
247  StdVideoH265ShortTermRefPicSet *str,
248  StdVideoH265LongTermRefPicsSps *ltr)
249 {
250  copy_scaling_list(&sps->scaling_list, vksps_scaling);
251 
252  *vksps_vui_header = (StdVideoH265HrdParameters) {
253  .flags = (StdVideoH265HrdFlags) {
254  .nal_hrd_parameters_present_flag = sps->hdr.nal_hrd_parameters_present_flag,
255  .vcl_hrd_parameters_present_flag = sps->hdr.vcl_hrd_parameters_present_flag,
256  .sub_pic_hrd_params_present_flag = sps->hdr.sub_pic_hrd_params_present_flag,
257  .sub_pic_cpb_params_in_pic_timing_sei_flag = sps->hdr.sub_pic_cpb_params_in_pic_timing_sei_flag,
258  .fixed_pic_rate_general_flag = sps->hdr.flags.fixed_pic_rate_general_flag,
259  .fixed_pic_rate_within_cvs_flag = sps->hdr.flags.fixed_pic_rate_within_cvs_flag,
260  .low_delay_hrd_flag = sps->hdr.flags.low_delay_hrd_flag,
261  },
262  .tick_divisor_minus2 = sps->hdr.tick_divisor_minus2,
263  .du_cpb_removal_delay_increment_length_minus1 = sps->hdr.du_cpb_removal_delay_increment_length_minus1,
264  .dpb_output_delay_du_length_minus1 = sps->hdr.dpb_output_delay_du_length_minus1,
265  .bit_rate_scale = sps->hdr.bit_rate_scale,
266  .cpb_size_scale = sps->hdr.cpb_size_scale,
267  .cpb_size_du_scale = sps->hdr.cpb_size_du_scale,
268  .initial_cpb_removal_delay_length_minus1 = sps->hdr.initial_cpb_removal_delay_length_minus1,
269  .au_cpb_removal_delay_length_minus1 = sps->hdr.au_cpb_removal_delay_length_minus1,
270  .dpb_output_delay_length_minus1 = sps->hdr.dpb_output_delay_length_minus1,
271  /* Reserved - 3*16 bits */
272  .pSubLayerHrdParametersNal = slhdrnal,
273  .pSubLayerHrdParametersVcl = slhdrvcl,
274  };
275 
276  memcpy(vksps_vui_header->cpb_cnt_minus1, sps->hdr.cpb_cnt_minus1,
277  STD_VIDEO_H265_SUBLAYERS_LIST_SIZE*sizeof(*vksps_vui_header->cpb_cnt_minus1));
278  memcpy(vksps_vui_header->elemental_duration_in_tc_minus1, sps->hdr.elemental_duration_in_tc_minus1,
279  STD_VIDEO_H265_SUBLAYERS_LIST_SIZE*sizeof(*vksps_vui_header->elemental_duration_in_tc_minus1));
280 
281  memcpy(slhdrnal, sps->hdr.nal_params, HEVC_MAX_SUB_LAYERS*sizeof(*slhdrnal));
282  memcpy(slhdrvcl, sps->hdr.vcl_params, HEVC_MAX_SUB_LAYERS*sizeof(*slhdrvcl));
283 
284  *vksps_vui = (StdVideoH265SequenceParameterSetVui) {
285  .flags = (StdVideoH265SpsVuiFlags) {
286  .aspect_ratio_info_present_flag = sps->vui.common.aspect_ratio_info_present_flag,
287  .overscan_info_present_flag = sps->vui.common.overscan_info_present_flag,
288  .overscan_appropriate_flag = sps->vui.common.overscan_appropriate_flag,
289  .video_signal_type_present_flag = sps->vui.common.video_signal_type_present_flag,
290  .video_full_range_flag = sps->vui.common.video_full_range_flag,
291  .colour_description_present_flag = sps->vui.common.colour_description_present_flag,
292  .chroma_loc_info_present_flag = sps->vui.common.chroma_loc_info_present_flag,
293  .neutral_chroma_indication_flag = sps->vui.neutra_chroma_indication_flag,
294  .field_seq_flag = sps->vui.field_seq_flag,
295  .frame_field_info_present_flag = sps->vui.frame_field_info_present_flag,
296  .default_display_window_flag = sps->vui.default_display_window_flag,
297  .vui_timing_info_present_flag = sps->vui.vui_timing_info_present_flag,
298  .vui_poc_proportional_to_timing_flag = sps->vui.vui_poc_proportional_to_timing_flag,
299  .vui_hrd_parameters_present_flag = sps->vui.vui_hrd_parameters_present_flag,
300  .bitstream_restriction_flag = sps->vui.bitstream_restriction_flag,
301  .tiles_fixed_structure_flag = sps->vui.tiles_fixed_structure_flag,
302  .motion_vectors_over_pic_boundaries_flag = sps->vui.motion_vectors_over_pic_boundaries_flag,
303  .restricted_ref_pic_lists_flag = sps->vui.restricted_ref_pic_lists_flag,
304  },
305  .aspect_ratio_idc = sps->vui.common.aspect_ratio_idc,
306  .sar_width = sps->vui.common.sar.num,
307  .sar_height = sps->vui.common.sar.den,
308  .video_format = sps->vui.common.video_format,
309  .colour_primaries = sps->vui.common.colour_primaries,
310  .transfer_characteristics = sps->vui.common.transfer_characteristics,
311  .matrix_coeffs = sps->vui.common.matrix_coeffs,
312  .chroma_sample_loc_type_top_field = sps->vui.common.chroma_sample_loc_type_top_field,
313  .chroma_sample_loc_type_bottom_field = sps->vui.common.chroma_sample_loc_type_bottom_field,
314  /* Reserved */
315  /* Reserved */
316  .def_disp_win_left_offset = sps->vui.def_disp_win.left_offset,
317  .def_disp_win_right_offset = sps->vui.def_disp_win.right_offset,
318  .def_disp_win_top_offset = sps->vui.def_disp_win.top_offset,
319  .def_disp_win_bottom_offset = sps->vui.def_disp_win.bottom_offset,
320  .vui_num_units_in_tick = sps->vui.vui_num_units_in_tick,
321  .vui_time_scale = sps->vui.vui_time_scale,
322  .vui_num_ticks_poc_diff_one_minus1 = sps->vui.vui_num_ticks_poc_diff_one_minus1,
323  .min_spatial_segmentation_idc = sps->vui.min_spatial_segmentation_idc,
324  .max_bytes_per_pic_denom = sps->vui.max_bytes_per_pic_denom,
325  .max_bits_per_min_cu_denom = sps->vui.max_bits_per_min_cu_denom,
326  .log2_max_mv_length_horizontal = sps->vui.log2_max_mv_length_horizontal,
327  .log2_max_mv_length_vertical = sps->vui.log2_max_mv_length_vertical,
328  .pHrdParameters = vksps_vui_header,
329  };
330 
331  *ptl = (StdVideoH265ProfileTierLevel) {
332  .flags = (StdVideoH265ProfileTierLevelFlags) {
333  .general_tier_flag = sps->ptl.general_ptl.tier_flag,
334  .general_progressive_source_flag = sps->ptl.general_ptl.progressive_source_flag,
335  .general_interlaced_source_flag = sps->ptl.general_ptl.interlaced_source_flag,
336  .general_non_packed_constraint_flag = sps->ptl.general_ptl.non_packed_constraint_flag,
337  .general_frame_only_constraint_flag = sps->ptl.general_ptl.frame_only_constraint_flag,
338  },
339  .general_profile_idc = sps->ptl.general_ptl.profile_idc,
340  .general_level_idc = convert_to_vk_level_idc(sps->ptl.general_ptl.level_idc),
341  };
342 
343  for (int i = 0; i < sps->max_sub_layers; i++) {
344  dpbm->max_latency_increase_plus1[i] = sps->temporal_layer[i].max_latency_increase + 1;
345  dpbm->max_dec_pic_buffering_minus1[i] = sps->temporal_layer[i].max_dec_pic_buffering - 1;
346  dpbm->max_num_reorder_pics[i] = sps->temporal_layer[i].num_reorder_pics;
347  }
348 
349  for (int i = 0; i < (sps->chroma_format_idc ? 3 : 1); i++)
350  for (int j = 0; j < sps->sps_num_palette_predictor_initializers; j++)
351  pal->PredictorPaletteEntries[i][j] = sps->sps_palette_predictor_initializer[i][j];
352 
353  for (int i = 0; i < sps->nb_st_rps; i++) {
354  str[i] = (StdVideoH265ShortTermRefPicSet) {
355  .flags = (StdVideoH265ShortTermRefPicSetFlags) {
356  .inter_ref_pic_set_prediction_flag = sps->st_rps[i].rps_predict,
357  .delta_rps_sign = sps->st_rps[i].delta_rps_sign,
358  },
359  .delta_idx_minus1 = sps->st_rps[i].delta_idx - 1,
360  .use_delta_flag = sps->st_rps[i].use_delta_flag,
361  .abs_delta_rps_minus1 = sps->st_rps[i].abs_delta_rps - 1,
362  .used_by_curr_pic_flag = 0x0,
363  .used_by_curr_pic_s0_flag = 0x0,
364  .used_by_curr_pic_s1_flag = 0x0,
365  /* Reserved */
366  /* Reserved */
367  /* Reserved */
368  .num_negative_pics = sps->st_rps[i].num_negative_pics,
369  .num_positive_pics = sps->st_rps[i].num_delta_pocs - sps->st_rps[i].num_negative_pics,
370  };
371 
372  /* NOTE: This is the predicted, and *reordered* version.
373  * Probably incorrect, but the spec doesn't say which version to use. */
374  for (int j = 0; j < sps->st_rps[i].num_delta_pocs; j++)
375  str[i].used_by_curr_pic_flag |= sps->st_rps[i].used[j] << j;
376 
377  for (int j = 0; j < str[i].num_negative_pics; j++) {
378  str[i].delta_poc_s0_minus1[j] = sps->st_rps[i].delta_poc_s0[j] - 1;
379  str[i].used_by_curr_pic_s0_flag |= sps->st_rps[i].used[j] << j;
380  }
381 
382  for (int j = 0; j < str[i].num_positive_pics; j++) {
383  str[i].delta_poc_s1_minus1[j] = sps->st_rps[i].delta_poc_s1[j] - 1;
384  str[i].used_by_curr_pic_s0_flag |= sps->st_rps[i].used[str[i].num_negative_pics + j] << j;
385  }
386  }
387 
388  *ltr = (StdVideoH265LongTermRefPicsSps) {
389  .used_by_curr_pic_lt_sps_flag = 0x0,
390  };
391 
392  for (int i = 0; i < sps->num_long_term_ref_pics_sps; i++) {
393  ltr->used_by_curr_pic_lt_sps_flag |= sps->used_by_curr_pic_lt_sps_flag[i] << i;
394  ltr->lt_ref_pic_poc_lsb_sps[i] = sps->lt_ref_pic_poc_lsb_sps[i];
395  }
396 
397  *vksps = (StdVideoH265SequenceParameterSet) {
398  .flags = (StdVideoH265SpsFlags) {
399  .sps_temporal_id_nesting_flag = sps->temporal_id_nesting_flag,
400  .separate_colour_plane_flag = sps->separate_colour_plane_flag,
401  .conformance_window_flag = sps->conformance_window_flag,
402  .sps_sub_layer_ordering_info_present_flag = sps->sublayer_ordering_info_flag,
403  .scaling_list_enabled_flag = sps->scaling_list_enable_flag,
404  .sps_scaling_list_data_present_flag = sps->scaling_list_enable_flag,
405  .amp_enabled_flag = sps->amp_enabled_flag,
406  .sample_adaptive_offset_enabled_flag = sps->sao_enabled,
407  .pcm_enabled_flag = sps->pcm_enabled_flag,
408  .pcm_loop_filter_disabled_flag = sps->pcm.loop_filter_disable_flag,
409  .long_term_ref_pics_present_flag = sps->long_term_ref_pics_present_flag,
410  .sps_temporal_mvp_enabled_flag = sps->sps_temporal_mvp_enabled_flag,
411  .strong_intra_smoothing_enabled_flag = sps->sps_strong_intra_smoothing_enable_flag,
412  .vui_parameters_present_flag = sps->vui_present,
413  .sps_extension_present_flag = sps->sps_extension_present_flag,
414  .sps_range_extension_flag = sps->sps_range_extension_flag,
415  .transform_skip_rotation_enabled_flag = sps->transform_skip_rotation_enabled_flag,
416  .transform_skip_context_enabled_flag = sps->transform_skip_context_enabled_flag,
417  .implicit_rdpcm_enabled_flag = sps->implicit_rdpcm_enabled_flag,
418  .explicit_rdpcm_enabled_flag = sps->explicit_rdpcm_enabled_flag,
419  .extended_precision_processing_flag = sps->extended_precision_processing_flag,
420  .intra_smoothing_disabled_flag = sps->intra_smoothing_disabled_flag,
421  .high_precision_offsets_enabled_flag = sps->high_precision_offsets_enabled_flag,
422  .persistent_rice_adaptation_enabled_flag = sps->persistent_rice_adaptation_enabled_flag,
423  .cabac_bypass_alignment_enabled_flag = sps->cabac_bypass_alignment_enabled_flag,
424  .sps_scc_extension_flag = sps->sps_scc_extension_flag,
425  .sps_curr_pic_ref_enabled_flag = sps->sps_curr_pic_ref_enabled_flag,
426  .palette_mode_enabled_flag = sps->palette_mode_enabled_flag,
427  .sps_palette_predictor_initializers_present_flag = sps->sps_palette_predictor_initializers_present_flag,
428  .intra_boundary_filtering_disabled_flag = sps->intra_boundary_filtering_disabled_flag,
429  },
430  .chroma_format_idc = sps->chroma_format_idc,
431  .pic_width_in_luma_samples = sps->width,
432  .pic_height_in_luma_samples = sps->height,
433  .sps_video_parameter_set_id = sps->vps_id,
434  .sps_max_sub_layers_minus1 = sps->max_sub_layers - 1,
435  .sps_seq_parameter_set_id = sps_idx,
436  .bit_depth_luma_minus8 = sps->bit_depth - 8,
437  .bit_depth_chroma_minus8 = sps->bit_depth_chroma - 8,
438  .log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_poc_lsb - 4,
439  .log2_min_luma_coding_block_size_minus3 = sps->log2_min_cb_size - 3,
440  .log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_coding_block_size,
441  .log2_min_luma_transform_block_size_minus2 = sps->log2_min_tb_size - 2,
442  .log2_diff_max_min_luma_transform_block_size = sps->log2_diff_max_min_transform_block_size,
443  .max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter,
444  .max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra,
445  .num_short_term_ref_pic_sets = sps->nb_st_rps,
446  .num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps,
447  .pcm_sample_bit_depth_luma_minus1 = sps->pcm.bit_depth - 1,
448  .pcm_sample_bit_depth_chroma_minus1 = sps->pcm.bit_depth_chroma - 1,
449  .log2_min_pcm_luma_coding_block_size_minus3 = sps->pcm.log2_min_pcm_cb_size - 3,
450  .log2_diff_max_min_pcm_luma_coding_block_size = sps->pcm.log2_max_pcm_cb_size - sps->pcm.log2_min_pcm_cb_size,
451  /* Reserved */
452  /* Reserved */
453  .palette_max_size = sps->palette_max_size,
454  .delta_palette_max_predictor_size = sps->delta_palette_max_predictor_size,
455  .motion_vector_resolution_control_idc = sps->motion_vector_resolution_control_idc,
456  .sps_num_palette_predictor_initializers_minus1 = sps->sps_num_palette_predictor_initializers - 1,
457  .conf_win_left_offset = sps->pic_conf_win.left_offset,
458  .conf_win_right_offset = sps->pic_conf_win.right_offset,
459  .conf_win_top_offset = sps->pic_conf_win.top_offset,
460  .conf_win_bottom_offset = sps->pic_conf_win.bottom_offset,
461  .pProfileTierLevel = ptl,
462  .pDecPicBufMgr = dpbm,
463  .pScalingLists = vksps_scaling,
464  .pShortTermRefPicSet = str,
465  .pLongTermRefPicsSps = ltr,
466  .pSequenceParameterSetVui = vksps_vui,
467  .pPredictorPaletteEntries = pal,
468  };
469 }
470 
471 static void set_pps(const HEVCPPS *pps, const HEVCSPS *sps,
472  StdVideoH265ScalingLists *vkpps_scaling,
473  StdVideoH265PictureParameterSet *vkpps,
474  StdVideoH265PredictorPaletteEntries *pal)
475 {
476  copy_scaling_list(&pps->scaling_list, vkpps_scaling);
477 
478  *vkpps = (StdVideoH265PictureParameterSet) {
479  .flags = (StdVideoH265PpsFlags) {
480  .dependent_slice_segments_enabled_flag = pps->dependent_slice_segments_enabled_flag,
481  .output_flag_present_flag = pps->output_flag_present_flag,
482  .sign_data_hiding_enabled_flag = pps->sign_data_hiding_flag,
483  .cabac_init_present_flag = pps->cabac_init_present_flag,
484  .constrained_intra_pred_flag = pps->constrained_intra_pred_flag,
485  .transform_skip_enabled_flag = pps->transform_skip_enabled_flag,
486  .cu_qp_delta_enabled_flag = pps->cu_qp_delta_enabled_flag,
487  .pps_slice_chroma_qp_offsets_present_flag = pps->pic_slice_level_chroma_qp_offsets_present_flag,
488  .weighted_pred_flag = pps->weighted_pred_flag,
489  .weighted_bipred_flag = pps->weighted_bipred_flag,
490  .transquant_bypass_enabled_flag = pps->transquant_bypass_enable_flag,
491  .tiles_enabled_flag = pps->tiles_enabled_flag,
492  .entropy_coding_sync_enabled_flag = pps->entropy_coding_sync_enabled_flag,
493  .uniform_spacing_flag = pps->uniform_spacing_flag,
494  .loop_filter_across_tiles_enabled_flag = pps->loop_filter_across_tiles_enabled_flag,
495  .pps_loop_filter_across_slices_enabled_flag = pps->seq_loop_filter_across_slices_enabled_flag,
496  .deblocking_filter_control_present_flag = pps->deblocking_filter_control_present_flag,
497  .deblocking_filter_override_enabled_flag = pps->deblocking_filter_override_enabled_flag,
498  .pps_deblocking_filter_disabled_flag = pps->disable_dbf,
499  .pps_scaling_list_data_present_flag = pps->scaling_list_data_present_flag,
500  .lists_modification_present_flag = pps->lists_modification_present_flag,
501  .slice_segment_header_extension_present_flag = pps->slice_header_extension_present_flag,
502  .pps_extension_present_flag = pps->pps_extension_present_flag,
503  .cross_component_prediction_enabled_flag = pps->cross_component_prediction_enabled_flag,
504  .chroma_qp_offset_list_enabled_flag = pps->chroma_qp_offset_list_enabled_flag,
505  .pps_curr_pic_ref_enabled_flag = pps->pps_curr_pic_ref_enabled_flag,
506  .residual_adaptive_colour_transform_enabled_flag = pps->residual_adaptive_colour_transform_enabled_flag,
507  .pps_slice_act_qp_offsets_present_flag = pps->pps_slice_act_qp_offsets_present_flag,
508  .pps_palette_predictor_initializers_present_flag = pps->pps_palette_predictor_initializers_present_flag,
509  .monochrome_palette_flag = pps->monochrome_palette_flag,
510  .pps_range_extension_flag = pps->pps_range_extensions_flag,
511  },
512  .pps_pic_parameter_set_id = pps->pps_id,
513  .pps_seq_parameter_set_id = pps->sps_id,
514  .sps_video_parameter_set_id = sps->vps_id,
515  .num_extra_slice_header_bits = pps->num_extra_slice_header_bits,
516  .num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active - 1,
517  .num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active - 1,
518  .init_qp_minus26 = pps->pic_init_qp_minus26,
519  .diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth,
520  .pps_cb_qp_offset = pps->cb_qp_offset,
521  .pps_cr_qp_offset = pps->cr_qp_offset,
522  .pps_beta_offset_div2 = pps->beta_offset >> 1,
523  .pps_tc_offset_div2 = pps->tc_offset >> 1,
524  .log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2,
525  .log2_max_transform_skip_block_size_minus2 = pps->log2_max_transform_skip_block_size - 2,
526  .diff_cu_chroma_qp_offset_depth = pps->diff_cu_chroma_qp_offset_depth,
527  .chroma_qp_offset_list_len_minus1 = pps->chroma_qp_offset_list_len_minus1,
528  .log2_sao_offset_scale_luma = pps->log2_sao_offset_scale_luma,
529  .log2_sao_offset_scale_chroma = pps->log2_sao_offset_scale_chroma,
530  .pps_act_y_qp_offset_plus5 = pps->pps_act_y_qp_offset + 5,
531  .pps_act_cb_qp_offset_plus5 = pps->pps_act_cb_qp_offset + 5,
532  .pps_act_cr_qp_offset_plus3 = pps->pps_act_cr_qp_offset + 3,
533  .pps_num_palette_predictor_initializers = pps->pps_num_palette_predictor_initializers,
534  .luma_bit_depth_entry_minus8 = pps->luma_bit_depth_entry - 8,
535  .chroma_bit_depth_entry_minus8 = pps->chroma_bit_depth_entry - 8,
536  .num_tile_columns_minus1 = pps->num_tile_columns - 1,
537  .num_tile_rows_minus1 = pps->num_tile_rows - 1,
538  .pScalingLists = vkpps_scaling,
539  .pPredictorPaletteEntries = pal,
540  };
541 
542  for (int i = 0; i < (pps->monochrome_palette_flag ? 1 : 3); i++) {
543  for (int j = 0; j < pps->pps_num_palette_predictor_initializers; j++)
544  pal->PredictorPaletteEntries[i][j] = pps->pps_palette_predictor_initializer[i][j];
545  }
546 
547  for (int i = 0; i < pps->num_tile_columns - 1; i++)
548  vkpps->column_width_minus1[i] = pps->column_width[i] - 1;
549 
550  for (int i = 0; i < pps->num_tile_rows - 1; i++)
551  vkpps->row_height_minus1[i] = pps->row_height[i] - 1;
552 
553  for (int i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) {
554  vkpps->cb_qp_offset_list[i] = pps->cb_qp_offset_list[i];
555  vkpps->cr_qp_offset_list[i] = pps->cr_qp_offset_list[i];
556  }
557 }
558 
559 static void set_vps(const HEVCVPS *vps,
560  StdVideoH265VideoParameterSet *vkvps,
561  StdVideoH265ProfileTierLevel *ptl,
562  StdVideoH265DecPicBufMgr *dpbm,
563  StdVideoH265HrdParameters *sls_hdr,
564  HEVCHeaderVPSSet sls[])
565 {
566  for (int i = 0; i < vps->vps_num_hrd_parameters; i++) {
567  const HEVCHdrParams *src = &vps->hdr[i];
568 
569  sls_hdr[i] = (StdVideoH265HrdParameters) {
570  .flags = (StdVideoH265HrdFlags) {
571  .nal_hrd_parameters_present_flag = src->nal_hrd_parameters_present_flag,
572  .vcl_hrd_parameters_present_flag = src->vcl_hrd_parameters_present_flag,
573  .sub_pic_hrd_params_present_flag = src->sub_pic_hrd_params_present_flag,
574  .sub_pic_cpb_params_in_pic_timing_sei_flag = src->sub_pic_cpb_params_in_pic_timing_sei_flag,
575  .fixed_pic_rate_general_flag = src->flags.fixed_pic_rate_general_flag,
576  .fixed_pic_rate_within_cvs_flag = src->flags.fixed_pic_rate_within_cvs_flag,
577  .low_delay_hrd_flag = src->flags.low_delay_hrd_flag,
578  },
579  .tick_divisor_minus2 = src->tick_divisor_minus2,
580  .du_cpb_removal_delay_increment_length_minus1 = src->du_cpb_removal_delay_increment_length_minus1,
581  .dpb_output_delay_du_length_minus1 = src->dpb_output_delay_du_length_minus1,
582  .bit_rate_scale = src->bit_rate_scale,
583  .cpb_size_scale = src->cpb_size_scale,
584  .cpb_size_du_scale = src->cpb_size_du_scale,
585  .initial_cpb_removal_delay_length_minus1 = src->initial_cpb_removal_delay_length_minus1,
586  .au_cpb_removal_delay_length_minus1 = src->au_cpb_removal_delay_length_minus1,
587  .dpb_output_delay_length_minus1 = src->dpb_output_delay_length_minus1,
588  /* Reserved - 3*16 bits */
589  .pSubLayerHrdParametersNal = sls[i].nal_hdr,
590  .pSubLayerHrdParametersVcl = sls[i].vcl_hdr,
591  };
592 
593  memcpy(sls_hdr[i].cpb_cnt_minus1, src->cpb_cnt_minus1,
594  STD_VIDEO_H265_SUBLAYERS_LIST_SIZE*sizeof(*sls_hdr[i].cpb_cnt_minus1));
595  memcpy(sls_hdr[i].elemental_duration_in_tc_minus1, src->elemental_duration_in_tc_minus1,
596  STD_VIDEO_H265_SUBLAYERS_LIST_SIZE*sizeof(*sls_hdr[i].elemental_duration_in_tc_minus1));
597 
598  memcpy(sls[i].nal_hdr, src->nal_params, HEVC_MAX_SUB_LAYERS*sizeof(*sls[i].nal_hdr));
599  memcpy(sls[i].vcl_hdr, src->vcl_params, HEVC_MAX_SUB_LAYERS*sizeof(*sls[i].vcl_hdr));
600  }
601 
602  *ptl = (StdVideoH265ProfileTierLevel) {
603  .flags = (StdVideoH265ProfileTierLevelFlags) {
604  .general_tier_flag = vps->ptl.general_ptl.tier_flag,
605  .general_progressive_source_flag = vps->ptl.general_ptl.progressive_source_flag,
606  .general_interlaced_source_flag = vps->ptl.general_ptl.interlaced_source_flag,
607  .general_non_packed_constraint_flag = vps->ptl.general_ptl.non_packed_constraint_flag,
608  .general_frame_only_constraint_flag = vps->ptl.general_ptl.frame_only_constraint_flag,
609  },
610  .general_profile_idc = vps->ptl.general_ptl.profile_idc,
611  .general_level_idc = convert_to_vk_level_idc(vps->ptl.general_ptl.level_idc),
612  };
613 
614  for (int i = 0; i < vps->vps_max_sub_layers; i++) {
615  dpbm->max_latency_increase_plus1[i] = vps->vps_max_latency_increase[i] + 1;
616  dpbm->max_dec_pic_buffering_minus1[i] = vps->vps_max_dec_pic_buffering[i] - 1;
617  dpbm->max_num_reorder_pics[i] = vps->vps_num_reorder_pics[i];
618  }
619 
620  *vkvps = (StdVideoH265VideoParameterSet) {
621  .flags = (StdVideoH265VpsFlags) {
622  .vps_temporal_id_nesting_flag = vps->vps_temporal_id_nesting_flag,
623  .vps_sub_layer_ordering_info_present_flag = vps->vps_sub_layer_ordering_info_present_flag,
624  .vps_timing_info_present_flag = vps->vps_timing_info_present_flag,
625  .vps_poc_proportional_to_timing_flag = vps->vps_poc_proportional_to_timing_flag,
626  },
627  .vps_video_parameter_set_id = vps->vps_id,
628  .vps_max_sub_layers_minus1 = vps->vps_max_sub_layers - 1,
629  /* Reserved */
630  /* Reserved */
631  .vps_num_units_in_tick = vps->vps_num_units_in_tick,
632  .vps_time_scale = vps->vps_time_scale,
633  .vps_num_ticks_poc_diff_one_minus1 = vps->vps_num_ticks_poc_diff_one - 1,
634  /* Reserved */
635  .pDecPicBufMgr = dpbm,
636  .pHrdParameters = sls_hdr,
637  .pProfileTierLevel = ptl,
638  };
639 }
640 
642 {
643  int err;
644  const HEVCContext *h = avctx->priv_data;
647 
648  VkVideoDecodeH265SessionParametersAddInfoKHR h265_params_info = {
649  .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR,
650  .stdSPSCount = 0,
651  .stdPPSCount = 0,
652  .stdVPSCount = 0,
653  };
654  VkVideoDecodeH265SessionParametersCreateInfoKHR h265_params = {
655  .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR,
656  .pParametersAddInfo = &h265_params_info,
657  };
658  VkVideoSessionParametersCreateInfoKHR session_params_create = {
659  .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
660  .pNext = &h265_params,
661  .videoSession = ctx->common.session,
662  .videoSessionParametersTemplate = VK_NULL_HANDLE,
663  };
664 
665  HEVCHeaderSet *hdr;
666  int nb_vps = 0;
667  int vps_list_idx[HEVC_MAX_VPS_COUNT];
668 
669  for (int i = 0; i < HEVC_MAX_VPS_COUNT; i++)
670  if (h->ps.vps_list[i])
671  vps_list_idx[nb_vps++] = i;
672 
673  err = alloc_hevc_header_structs(dec, nb_vps, vps_list_idx, h->ps.vps_list);
674  if (err < 0)
675  return err;
676 
677  hdr = dec->hevc_headers;
678 
679  h265_params_info.pStdSPSs = hdr->sps;
680  h265_params_info.pStdPPSs = hdr->pps;
681  h265_params_info.pStdVPSs = hdr->vps;
682 
683  /* SPS list */
684  for (int i = 0; i < HEVC_MAX_SPS_COUNT; i++) {
685  if (h->ps.sps_list[i]) {
686  const HEVCSPS *sps_l = h->ps.sps_list[i];
687  int idx = h265_params_info.stdSPSCount++;
688  set_sps(sps_l, i, &hdr->hsps[idx].scaling, &hdr->hsps[idx].vui_header,
689  &hdr->hsps[idx].vui, &hdr->sps[idx], hdr->hsps[idx].nal_hdr,
690  hdr->hsps[idx].vcl_hdr, &hdr->hsps[idx].ptl, &hdr->hsps[idx].dpbm,
691  &hdr->hsps[idx].pal, hdr->hsps[idx].str, &hdr->hsps[idx].ltr);
692  }
693  }
694 
695  /* PPS list */
696  for (int i = 0; i < HEVC_MAX_PPS_COUNT; i++) {
697  if (h->ps.pps_list[i]) {
698  const HEVCPPS *pps_l = h->ps.pps_list[i];
699  const HEVCSPS *sps_l = h->ps.sps_list[pps_l->sps_id];
700  int idx = h265_params_info.stdPPSCount++;
701  set_pps(pps_l, sps_l, &hdr->hpps[idx].scaling,
702  &hdr->pps[idx], &hdr->hpps[idx].pal);
703  }
704  }
705 
706  /* VPS list */
707  for (int i = 0; i < nb_vps; i++) {
708  const HEVCVPS *vps_l = h->ps.vps_list[vps_list_idx[i]];
709  set_vps(vps_l, &hdr->vps[i], &hdr->hvps[i].ptl, &hdr->hvps[i].dpbm,
710  hdr->hvps[i].hdr, hdr->hvps[i].sls);
711  h265_params_info.stdVPSCount++;
712  }
713 
714  h265_params.maxStdSPSCount = h265_params_info.stdSPSCount;
715  h265_params.maxStdPPSCount = h265_params_info.stdPPSCount;
716  h265_params.maxStdVPSCount = h265_params_info.stdVPSCount;
717 
718  err = ff_vk_decode_create_params(buf, avctx, ctx, &session_params_create);
719  if (err < 0)
720  return err;
721 
722  av_log(avctx, AV_LOG_DEBUG, "Created frame parameters: %i SPS %i PPS %i VPS\n",
723  h265_params_info.stdSPSCount, h265_params_info.stdPPSCount,
724  h265_params_info.stdVPSCount);
725 
726  return 0;
727 }
728 
730  av_unused const uint8_t *buffer,
731  av_unused uint32_t size)
732 {
733  int err;
734  HEVCContext *h = avctx->priv_data;
735  HEVCFrame *pic = h->ref;
738  FFVulkanDecodePicture *vp = &hp->vp;
739  const HEVCSPS *sps = h->ps.sps;
740  const HEVCPPS *pps = h->ps.pps;
741  int nb_refs = 0;
742 
743  if (!dec->session_params) {
744  err = vk_hevc_create_params(avctx, &dec->session_params);
745  if (err < 0)
746  return err;
747  }
748 
749  hp->h265pic = (StdVideoDecodeH265PictureInfo) {
750  .flags = (StdVideoDecodeH265PictureInfoFlags) {
751  .IrapPicFlag = IS_IRAP(h),
752  .IdrPicFlag = IS_IDR(h),
753  .IsReference = h->nal_unit_type < 16 ? h->nal_unit_type & 1 : 1,
754  .short_term_ref_pic_set_sps_flag = h->sh.short_term_ref_pic_set_sps_flag,
755  },
756  .sps_video_parameter_set_id = sps->vps_id,
757  .pps_seq_parameter_set_id = pps->sps_id,
758  .pps_pic_parameter_set_id = pps->pps_id,
759  .NumDeltaPocsOfRefRpsIdx = h->sh.short_term_rps ? h->sh.short_term_rps->rps_idx_num_delta_pocs : 0,
760  .PicOrderCntVal = h->poc,
761  .NumBitsForSTRefPicSetInSlice = !h->sh.short_term_ref_pic_set_sps_flag ?
762  h->sh.short_term_ref_pic_set_size : 0,
763  };
764 
765  /* Fill in references */
766  for (int i = 0; i < FF_ARRAY_ELEMS(h->DPB); i++) {
767  const HEVCFrame *ref = &h->DPB[i];
768  int idx = nb_refs;
769 
771  continue;
772 
773  if (ref == pic) {
774  err = vk_hevc_fill_pict(avctx, NULL, &vp->ref_slot, &vp->ref,
775  &hp->vkh265_ref, &hp->h265_ref, pic, 1, i);
776  if (err < 0)
777  return err;
778 
779  continue;
780  }
781 
782  err = vk_hevc_fill_pict(avctx, &hp->ref_src[idx], &vp->ref_slots[idx],
783  &vp->refs[idx], &hp->vkh265_refs[idx],
784  &hp->h265_refs[idx], (HEVCFrame *)ref, 0, i);
785  if (err < 0)
786  return err;
787 
788  nb_refs++;
789  }
790 
791  memset(hp->h265pic.RefPicSetStCurrBefore, 0xff, 8);
792  for (int i = 0; i < h->rps[ST_CURR_BEF].nb_refs; i++) {
793  HEVCFrame *frame = h->rps[ST_CURR_BEF].ref[i];
794  for (int j = 0; j < FF_ARRAY_ELEMS(h->DPB); j++) {
795  const HEVCFrame *ref = &h->DPB[j];
796  if (ref == frame) {
797  hp->h265pic.RefPicSetStCurrBefore[i] = j;
798  break;
799  }
800  }
801  }
802  memset(hp->h265pic.RefPicSetStCurrAfter, 0xff, 8);
803  for (int i = 0; i < h->rps[ST_CURR_AFT].nb_refs; i++) {
804  HEVCFrame *frame = h->rps[ST_CURR_AFT].ref[i];
805  for (int j = 0; j < FF_ARRAY_ELEMS(h->DPB); j++) {
806  const HEVCFrame *ref = &h->DPB[j];
807  if (ref == frame) {
808  hp->h265pic.RefPicSetStCurrAfter[i] = j;
809  break;
810  }
811  }
812  }
813  memset(hp->h265pic.RefPicSetLtCurr, 0xff, 8);
814  for (int i = 0; i < h->rps[LT_CURR].nb_refs; i++) {
815  HEVCFrame *frame = h->rps[LT_CURR].ref[i];
816  for (int j = 0; j < FF_ARRAY_ELEMS(h->DPB); j++) {
817  const HEVCFrame *ref = &h->DPB[j];
818  if (ref == frame) {
819  hp->h265pic.RefPicSetLtCurr[i] = j;
820  break;
821  }
822  }
823  }
824 
825  hp->h265_pic_info = (VkVideoDecodeH265PictureInfoKHR) {
826  .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR,
827  .pStdPictureInfo = &hp->h265pic,
828  .sliceSegmentCount = 0,
829  };
830 
831  vp->decode_info = (VkVideoDecodeInfoKHR) {
832  .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR,
833  .pNext = &hp->h265_pic_info,
834  .flags = 0x0,
835  .pSetupReferenceSlot = &vp->ref_slot,
836  .referenceSlotCount = nb_refs,
837  .pReferenceSlots = vp->ref_slots,
838  .dstPictureResource = (VkVideoPictureResourceInfoKHR) {
839  .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
840  .codedOffset = (VkOffset2D){ 0, 0 },
841  .codedExtent = (VkExtent2D){ pic->frame->width, pic->frame->height },
842  .baseArrayLayer = 0,
843  .imageViewBinding = vp->img_view_out,
844  },
845  };
846 
847  return 0;
848 }
849 
851  const uint8_t *data,
852  uint32_t size)
853 {
854  const HEVCContext *h = avctx->priv_data;
855  HEVCVulkanDecodePicture *hp = h->ref->hwaccel_picture_private;
856  FFVulkanDecodePicture *vp = &hp->vp;
857 
858  int err = ff_vk_decode_add_slice(avctx, vp, data, size, 1,
859  &hp->h265_pic_info.sliceSegmentCount,
860  &hp->h265_pic_info.pSliceSegmentOffsets);
861  if (err < 0)
862  return err;
863 
864  return 0;
865 }
866 
868 {
869  const HEVCContext *h = avctx->priv_data;
871  HEVCFrame *pic = h->ref;
873  FFVulkanDecodePicture *vp = &hp->vp;
874  FFVulkanDecodePicture *rvp[HEVC_MAX_REFS] = { 0 };
875  AVFrame *rav[HEVC_MAX_REFS] = { 0 };
876  int err;
877 
878  if (!hp->h265_pic_info.sliceSegmentCount)
879  return 0;
880 
881  if (!dec->session_params) {
882  const HEVCSPS *sps = h->ps.sps;
883  const HEVCPPS *pps = h->ps.pps;
884 
885  if (!pps) {
886  unsigned int pps_id = h->sh.pps_id;
887  if (pps_id < HEVC_MAX_PPS_COUNT && h->ps.pps_list[pps_id] != NULL)
888  pps = h->ps.pps_list[pps_id];
889  }
890 
891  if (!pps) {
892  av_log(avctx, AV_LOG_ERROR,
893  "Encountered frame without a valid active PPS reference.\n");
894  return AVERROR_INVALIDDATA;
895  }
896 
897  err = vk_hevc_create_params(avctx, &dec->session_params);
898  if (err < 0)
899  return err;
900 
901  hp->h265pic.sps_video_parameter_set_id = sps->vps_id;
902  hp->h265pic.pps_seq_parameter_set_id = pps->sps_id;
903  hp->h265pic.pps_pic_parameter_set_id = pps->pps_id;
904  }
905 
906  for (int i = 0; i < vp->decode_info.referenceSlotCount; i++) {
908  rav[i] = hp->ref_src[i]->frame;
909  rvp[i] = &rfhp->vp;
910  }
911 
912  av_log(avctx, AV_LOG_VERBOSE, "Decoding frame, %"SIZE_SPECIFIER" bytes, %i slices\n",
913  vp->slices_size, hp->h265_pic_info.sliceSegmentCount);
914 
915  return ff_vk_decode_frame(avctx, pic->frame, vp, rav, rvp);
916 }
917 
919 {
920  AVHWDeviceContext *hwctx = _hwctx.nc;
922 
923  /* Free frame resources */
924  ff_vk_decode_free_frame(hwctx, &hp->vp);
925 }
926 
928  .p.name = "hevc_vulkan",
929  .p.type = AVMEDIA_TYPE_VIDEO,
930  .p.id = AV_CODEC_ID_HEVC,
931  .p.pix_fmt = AV_PIX_FMT_VULKAN,
932  .start_frame = &vk_hevc_start_frame,
933  .decode_slice = &vk_hevc_decode_slice,
934  .end_frame = &vk_hevc_end_frame,
935  .free_frame_priv = &vk_hevc_free_frame_priv,
936  .frame_priv_data_size = sizeof(HEVCVulkanDecodePicture),
939  .decode_params = &ff_vk_params_invalidate,
942  .frame_params = &ff_vk_frame_params,
943  .priv_data_size = sizeof(FFVulkanDecodeContext),
945 };
HEVCHeaderSPS::vui_header
StdVideoH265HrdParameters vui_header
Definition: vulkan_hevc.c:38
FFVulkanDecodePicture::slices_size
size_t slices_size
Definition: vulkan_decode.h:112
HEVCFrame::flags
uint8_t flags
A combination of HEVC_FRAME_FLAG_*.
Definition: hevcdec.h:383
HEVCHeaderSet::hvps
HEVCHeaderVPS * hvps
Definition: vulkan_hevc.c:74
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
HEVCHeaderSPS::dpbm
StdVideoH265DecPicBufMgr dpbm
Definition: vulkan_hevc.c:41
HEVCHeaderSPS::pal
StdVideoH265PredictorPaletteEntries pal
Definition: vulkan_hevc.c:42
HEVCHeaderVPSSet::nal_hdr
StdVideoH265SubLayerHrdParameters nal_hdr[HEVC_MAX_SUB_LAYERS]
Definition: vulkan_hevc.c:55
HEVCHeaderVPS::sls
HEVCHeaderVPSSet * sls
Definition: vulkan_hevc.c:63
ff_hevc_diag_scan8x8_y
const uint8_t ff_hevc_diag_scan8x8_y[64]
Definition: hevc_data.c:58
HEVCHeaderSPS::scaling
StdVideoH265ScalingLists scaling
Definition: vulkan_hevc.c:37
FFVulkanDecodeContext::shared_ctx
FFVulkanDecodeShared * shared_ctx
Definition: vulkan_decode.h:66
HEVCHeaderSet::hsps
HEVCHeaderSPS hsps[HEVC_MAX_SPS_COUNT]
Definition: vulkan_hevc.c:68
HEVCHeaderVPSSet
Definition: vulkan_hevc.c:54
HEVC_MAX_VPS_COUNT
@ HEVC_MAX_VPS_COUNT
Definition: hevc.h:110
av_unused
#define av_unused
Definition: attributes.h:131
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:374
AVFrame::width
int width
Definition: frame.h:446
HEVCFrame::hwaccel_picture_private
void * hwaccel_picture_private
RefStruct reference.
Definition: hevcdec.h:372
level_idc
int level_idc
Definition: h264_levels.c:29
vk_hevc_fill_pict
static int vk_hevc_fill_pict(AVCodecContext *avctx, HEVCFrame **ref_src, VkVideoReferenceSlotInfoKHR *ref_slot, VkVideoPictureResourceInfoKHR *ref, VkVideoDecodeH265DpbSlotInfoKHR *vkh265_ref, StdVideoDecodeH265ReferenceInfo *h265_ref, HEVCFrame *pic, int is_current, int pic_id)
Definition: vulkan_hevc.c:131
HEVCHeaderSPS::ltr
StdVideoH265LongTermRefPicsSps ltr
Definition: vulkan_hevc.c:46
data
const char data[16]
Definition: mxf.c:148
FFVulkanDecodeDescriptor::codec_id
enum AVCodecID codec_id
Definition: vulkan_decode.h:30
ff_hevc_vulkan_hwaccel
const FFHWAccel ff_hevc_vulkan_hwaccel
Definition: vulkan_hevc.c:927
ScalingList::sl
uint8_t sl[4][6][64]
Definition: hevc_ps.h:184
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
FFRefStructOpaque
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition: refstruct.h:58
vk_hevc_decode_slice
static int vk_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size)
Definition: vulkan_hevc.c:850
alloc_hevc_header_structs
static int alloc_hevc_header_structs(FFVulkanDecodeContext *s, int nb_vps, const int vps_list_idx[HEVC_MAX_VPS_COUNT], const HEVCVPS *const vps_list[HEVC_MAX_VPS_COUNT])
Definition: vulkan_hevc.c:77
HEVCHdrParams
Definition: hevc_ps.h:49
FFVulkanDecodeContext
Definition: vulkan_decode.h:65
FF_VK_EXT_VIDEO_DECODE_H265
@ FF_VK_EXT_VIDEO_DECODE_H265
Definition: vulkan_functions.h:45
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
vk_hevc_end_frame
static int vk_hevc_end_frame(AVCodecContext *avctx)
Definition: vulkan_hevc.c:867
ff_vk_decode_prepare_frame
int ff_vk_decode_prepare_frame(FFVulkanDecodeContext *dec, AVFrame *pic, FFVulkanDecodePicture *vkpic, int is_current, int alloc_dpb)
Prepare a frame, creates the image view, and sets up the dpb fields.
Definition: vulkan_decode.c:187
FFVulkanDecodePicture::ref
VkVideoPictureResourceInfoKHR ref
Definition: vulkan_decode.h:100
FFVulkanDecodeContext::session_params
AVBufferRef * session_params
Definition: vulkan_decode.h:67
HEVC_FRAME_FLAG_LONG_REF
#define HEVC_FRAME_FLAG_LONG_REF
Definition: hevcdec.h:348
FFHWAccel
Definition: hwaccel_internal.h:34
HEVCVulkanDecodePicture::ref_src
HEVCFrame * ref_src[HEVC_MAX_REFS]
Definition: vulkan_hevc.c:122
HEVCHeaderPPS
Definition: vulkan_hevc.c:49
HWACCEL_CAP_THREAD_SAFE
#define HWACCEL_CAP_THREAD_SAFE
Definition: hwaccel_internal.h:32
HEVCHeaderSPS
Definition: vulkan_hevc.c:36
HEVCHeaderPPS::scaling
StdVideoH265ScalingLists scaling
Definition: vulkan_hevc.c:50
HEVCHeaderVPS
Definition: vulkan_hevc.c:59
ff_vk_decode_frame
int ff_vk_decode_frame(AVCodecContext *avctx, AVFrame *pic, FFVulkanDecodePicture *vp, AVFrame *rpic[], FFVulkanDecodePicture *rvkp[])
Decode a frame.
Definition: vulkan_decode.c:343
FFVulkanDecodeShared
Definition: vulkan_decode.h:46
vk_hevc_start_frame
static int vk_hevc_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size)
Definition: vulkan_hevc.c:729
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:60
HEVCHeaderSPS::nal_hdr
StdVideoH265SubLayerHrdParameters nal_hdr[HEVC_MAX_SUB_LAYERS]
Definition: vulkan_hevc.c:43
HEVCVulkanDecodePicture::vkh265_refs
VkVideoDecodeH265DpbSlotInfoKHR vkh265_refs[HEVC_MAX_REFS]
Definition: vulkan_hevc.c:124
FFVulkanDecodePicture::img_view_out
VkImageView img_view_out
Definition: vulkan_decode.h:91
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
FFVulkanDecodePicture::refs
VkVideoPictureResourceInfoKHR refs[36]
Definition: vulkan_decode.h:104
ptl
const H265RawProfileTierLevel * ptl
Definition: h265_levels.c:170
HEVCHeaderSet::hpps
HEVCHeaderPPS hpps[HEVC_MAX_PPS_COUNT]
Definition: vulkan_hevc.c:71
HEVCHeaderSPS::vui
StdVideoH265SequenceParameterSetVui vui
Definition: vulkan_hevc.c:39
s
#define s(width, name)
Definition: cbs_vp9.c:198
HEVC_MAX_SPS_COUNT
@ HEVC_MAX_SPS_COUNT
Definition: hevc.h:112
FFVulkanDecodePicture
Definition: vulkan_decode.h:87
ff_vk_decode_create_params
int ff_vk_decode_create_params(AVBufferRef **par_ref, void *logctx, FFVulkanDecodeShared *ctx, const VkVideoSessionParametersCreateInfoKHR *session_params_create)
Create VkVideoSessionParametersKHR wrapped in an AVBufferRef.
Definition: vulkan_decode.c:1064
HEVC_MAX_SHORT_TERM_REF_PIC_SETS
@ HEVC_MAX_SHORT_TERM_REF_PIC_SETS
Definition: hevc.h:122
ff_hevc_diag_scan8x8_x
const uint8_t ff_hevc_diag_scan8x8_x[64]
Definition: hevc_data.c:39
HEVCHeaderSet::pps
StdVideoH265PictureParameterSet pps[HEVC_MAX_PPS_COUNT]
Definition: vulkan_hevc.c:70
copy_scaling_list
static void copy_scaling_list(const ScalingList *sl, StdVideoH265ScalingLists *vksl)
Definition: vulkan_hevc.c:200
vk_hevc_free_frame_priv
static void vk_hevc_free_frame_priv(FFRefStructOpaque _hwctx, void *data)
Definition: vulkan_hevc.c:918
HEVCVulkanDecodePicture::h265_refs
StdVideoDecodeH265ReferenceInfo h265_refs[HEVC_MAX_REFS]
Definition: vulkan_hevc.c:123
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
ctx
AVFormatContext * ctx
Definition: movenc.c:49
IS_IDR
#define IS_IDR(s)
Definition: hevcdec.h:75
HEVC_FRAME_FLAG_SHORT_REF
#define HEVC_FRAME_FLAG_SHORT_REF
Definition: hevcdec.h:347
HEVCVulkanDecodePicture::h265_ref
StdVideoDecodeH265ReferenceInfo h265_ref
Definition: vulkan_hevc.c:118
ScalingList
Definition: hevc_ps.h:181
ff_hevc_diag_scan4x4_y
const uint8_t ff_hevc_diag_scan4x4_y[16]
Definition: hevc_data.c:32
HWACCEL_CAP_ASYNC_SAFE
#define HWACCEL_CAP_ASYNC_SAFE
Header providing the internals of AVHWAccel.
Definition: hwaccel_internal.h:31
set_sps
static void set_sps(const HEVCSPS *sps, int sps_idx, StdVideoH265ScalingLists *vksps_scaling, StdVideoH265HrdParameters *vksps_vui_header, StdVideoH265SequenceParameterSetVui *vksps_vui, StdVideoH265SequenceParameterSet *vksps, StdVideoH265SubLayerHrdParameters *slhdrnal, StdVideoH265SubLayerHrdParameters *slhdrvcl, StdVideoH265ProfileTierLevel *ptl, StdVideoH265DecPicBufMgr *dpbm, StdVideoH265PredictorPaletteEntries *pal, StdVideoH265ShortTermRefPicSet *str, StdVideoH265LongTermRefPicsSps *ltr)
Definition: vulkan_hevc.c:237
FFVulkanDecodePicture::img_view_ref
VkImageView img_view_ref
Definition: vulkan_decode.h:90
NULL
#define NULL
Definition: coverity.c:32
ScalingList::sl_dc
uint8_t sl_dc[2][6]
Definition: hevc_ps.h:185
ff_vk_decode_free_frame
void ff_vk_decode_free_frame(AVHWDeviceContext *dev_ctx, FFVulkanDecodePicture *vp)
Free a frame and its state.
Definition: vulkan_decode.c:573
HEVCVulkanDecodePicture
Definition: vulkan_hevc.c:114
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:480
ff_vk_decode_uninit
int ff_vk_decode_uninit(AVCodecContext *avctx)
Free decoder.
Definition: vulkan_decode.c:1093
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:368
vk_hevc_create_params
static int vk_hevc_create_params(AVCodecContext *avctx, AVBufferRef **buf)
Definition: vulkan_hevc.c:641
vps
static int FUNC() vps(CodedBitstreamContext *ctx, RWContext *rw, H265RawVPS *current)
Definition: cbs_h265_syntax_template.c:423
ff_vk_frame_params
int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Initialize hw_frames_ctx with the parameters needed to decode the stream using the parameters from av...
Definition: vulkan_decode.c:1007
H265RawProfileTierLevel::general_tier_flag
uint8_t general_tier_flag
Definition: cbs_h265.h:37
HEVCVulkanDecodePicture::vp
FFVulkanDecodePicture vp
Definition: vulkan_hevc.c:115
hevc_data.h
IS_IRAP
#define IS_IRAP(s)
Definition: hevcdec.h:78
HEVCHeaderVPSSet::vcl_hdr
StdVideoH265SubLayerHrdParameters vcl_hdr[HEVC_MAX_SUB_LAYERS]
Definition: vulkan_hevc.c:56
HEVCHeaderPPS::pal
StdVideoH265PredictorPaletteEntries pal
Definition: vulkan_hevc.c:51
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:366
set_pps
static void set_pps(const HEVCPPS *pps, const HEVCSPS *sps, StdVideoH265ScalingLists *vkpps_scaling, StdVideoH265PictureParameterSet *vkpps, StdVideoH265PredictorPaletteEntries *pal)
Definition: vulkan_hevc.c:471
HEVCHeaderSPS::ptl
StdVideoH265ProfileTierLevel ptl
Definition: vulkan_hevc.c:40
hevcdec.h
HEVCVulkanDecodePicture::h265pic
StdVideoDecodeH265PictureInfo h265pic
Definition: vulkan_hevc.c:127
convert_to_vk_level_idc
static StdVideoH265LevelIdc convert_to_vk_level_idc(int level_idc)
Definition: vulkan_hevc.c:181
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:123
HEVC_MAX_PPS_COUNT
@ HEVC_MAX_PPS_COUNT
Definition: hevc.h:114
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
size
int size
Definition: twinvq_data.h:10344
HEVC_MAX_LAYER_SETS
@ HEVC_MAX_LAYER_SETS
Definition: hevc.h:107
FFRefStructOpaque::nc
void * nc
Definition: refstruct.h:59
HEVCVulkanDecodePicture::vkh265_ref
VkVideoDecodeH265DpbSlotInfoKHR vkh265_ref
Definition: vulkan_hevc.c:119
HEVC_MAX_REFS
@ HEVC_MAX_REFS
Definition: hevc.h:119
HEVCHeaderSet
Definition: vulkan_hevc.c:66
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:2094
HEVCFrame::frame
AVFrame * frame
Definition: hevcdec.h:357
uninit
static void uninit(AVBSFContext *ctx)
Definition: pcm_rechunk.c:68
hevc_ps.h
set_vps
static void set_vps(const HEVCVPS *vps, StdVideoH265VideoParameterSet *vkvps, StdVideoH265ProfileTierLevel *ptl, StdVideoH265DecPicBufMgr *dpbm, StdVideoH265HrdParameters *sls_hdr, HEVCHeaderVPSSet sls[])
Definition: vulkan_hevc.c:559
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
HEVCFrame
Definition: hevcdec.h:354
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:226
FFVulkanDecodePicture::ref_slot
VkVideoReferenceSlotInfoKHR ref_slot
Definition: vulkan_decode.h:101
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
FFVulkanDecodePicture::ref_slots
VkVideoReferenceSlotInfoKHR ref_slots[36]
Definition: vulkan_decode.h:105
HEVCFrame::poc
int poc
Definition: hevcdec.h:367
ff_vk_decode_flush
void ff_vk_decode_flush(AVCodecContext *avctx)
Flush decoder.
Definition: vulkan_decode.c:313
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
HEVCHeaderSPS::str
StdVideoH265ShortTermRefPicSet str[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]
Definition: vulkan_hevc.c:45
ST_CURR_BEF
@ ST_CURR_BEF
Definition: hevcdec.h:81
HEVCVulkanDecodePicture::h265_pic_info
VkVideoDecodeH265PictureInfoKHR h265_pic_info
Definition: vulkan_hevc.c:128
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
ff_vk_decode_add_slice
int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp, const uint8_t *data, size_t size, int add_startcode, uint32_t *nb_slices, const uint32_t **offsets)
Add slice data to frame.
Definition: vulkan_decode.c:251
HEVCHeaderVPS::dpbm
StdVideoH265DecPicBufMgr dpbm
Definition: vulkan_hevc.c:61
pos
unsigned int pos
Definition: spdifenc.c:414
HEVCHeaderVPS::hdr
StdVideoH265HrdParameters hdr[HEVC_MAX_LAYER_SETS]
Definition: vulkan_hevc.c:62
FFVulkanDecodeContext::hevc_headers
struct HEVCHeaderSet * hevc_headers
Definition: vulkan_decode.h:80
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:129
ff_vk_dec_hevc_desc
const FFVulkanDecodeDescriptor ff_vk_dec_hevc_desc
Definition: vulkan_hevc.c:26
LT_CURR
@ LT_CURR
Definition: hevcdec.h:84
AVCodecContext
main external API structure.
Definition: avcodec.h:445
AVFrame::height
int height
Definition: frame.h:446
FFVulkanDecodeContext::dedicated_dpb
int dedicated_dpb
Definition: vulkan_decode.h:70
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
HEVCContext
Definition: hevcdec.h:444
update_thread_context
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 have update_thread_context() run it in the next thread. Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little speed gain at this point but it should work. Use ff_thread_get_buffer()(or ff_progress_frame_get_buffer() in case you have inter-frame dependencies and use the ProgressFrame API) to allocate frame buffers. Call ff_progress_frame_report() after some part of the current picture has decoded. A good place to put this is where draw_horiz_band() is called - add this if it isn 't called anywhere
FFVulkanDecodeDescriptor
Definition: vulkan_decode.h:29
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:112
pps
uint64_t pps
Definition: dovi_rpuenc.c:35
ff_vk_params_invalidate
int ff_vk_params_invalidate(AVCodecContext *avctx, int t, const uint8_t *b, uint32_t s)
Removes current session parameters to recreate them.
Definition: vulkan_decode.c:121
ff_hevc_diag_scan4x4_x
const uint8_t ff_hevc_diag_scan4x4_x[16]
Definition: hevc_data.c:25
ff_vk_update_thread_context
int ff_vk_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
Synchronize the contexts between 2 threads.
Definition: vulkan_decode.c:80
HEVC_MAX_SUB_LAYERS
@ HEVC_MAX_SUB_LAYERS
Definition: hevc.h:105
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
HEVCVPS
Definition: hevc_ps.h:154
HEVCSPS
Definition: hevc_ps.h:188
HEVCPPS
Definition: hevc_ps.h:305
vulkan_decode.h
ST_CURR_AFT
@ ST_CURR_AFT
Definition: hevcdec.h:82
HEVCPPS::sps_id
unsigned int sps_id
seq_parameter_set_id
Definition: hevc_ps.h:307
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:472
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
FFVulkanDecodeContext::layered_dpb
int layered_dpb
Definition: vulkan_decode.h:71
HEVCHeaderSPS::vcl_hdr
StdVideoH265SubLayerHrdParameters vcl_hdr[HEVC_MAX_SUB_LAYERS]
Definition: vulkan_hevc.c:44
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
ff_vk_decode_init
int ff_vk_decode_init(AVCodecContext *avctx)
Initialize decoder.
Definition: vulkan_decode.c:1108
h
h
Definition: vp9dsp_template.c:2038
FFVulkanDecodePicture::decode_info
VkVideoDecodeInfoKHR decode_info
Definition: vulkan_decode.h:108
HEVCHeaderSet::vps
StdVideoH265VideoParameterSet vps[HEVC_MAX_PPS_COUNT]
Definition: vulkan_hevc.c:73
HEVCHeaderVPS::ptl
StdVideoH265ProfileTierLevel ptl
Definition: vulkan_hevc.c:60
HEVCHeaderSet::sps
StdVideoH265SequenceParameterSet sps[HEVC_MAX_SPS_COUNT]
Definition: vulkan_hevc.c:67