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