27 .decode_op = VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR,
29 .extensionName = VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME,
30 .specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION,
54 VkVideoReferenceSlotInfoKHR *ref_slot,
55 VkVideoPictureResourceInfoKHR *
ref,
56 VkVideoDecodeH264DpbSlotInfoKHR *vkh264_ref,
57 StdVideoDecodeH264ReferenceInfo *h264_ref,
59 int is_field,
int picture_structure,
71 *h264_ref = (StdVideoDecodeH264ReferenceInfo) {
74 .flags = (StdVideoDecodeH264ReferenceInfoFlags) {
75 .top_field_flag = is_field ? !!(picture_structure &
PICT_TOP_FIELD) : 0,
89 *vkh264_ref = (VkVideoDecodeH264DpbSlotInfoKHR) {
90 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR,
91 .pStdReferenceInfo = h264_ref,
94 *
ref = (VkVideoPictureResourceInfoKHR) {
95 .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
96 .codedOffset = (VkOffset2D){ 0, 0 },
98 .baseArrayLayer = dec->
layered_dpb ? dpb_slot_index : 0,
102 *ref_slot = (VkVideoReferenceSlotInfoKHR) {
103 .sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR,
105 .slotIndex = dpb_slot_index,
106 .pPictureResource =
ref,
118 case 10:
return STD_VIDEO_H264_LEVEL_IDC_1_0;
119 case 11:
return STD_VIDEO_H264_LEVEL_IDC_1_1;
120 case 12:
return STD_VIDEO_H264_LEVEL_IDC_1_2;
121 case 13:
return STD_VIDEO_H264_LEVEL_IDC_1_3;
122 case 20:
return STD_VIDEO_H264_LEVEL_IDC_2_0;
123 case 21:
return STD_VIDEO_H264_LEVEL_IDC_2_1;
124 case 22:
return STD_VIDEO_H264_LEVEL_IDC_2_2;
125 case 30:
return STD_VIDEO_H264_LEVEL_IDC_3_0;
126 case 31:
return STD_VIDEO_H264_LEVEL_IDC_3_1;
127 case 32:
return STD_VIDEO_H264_LEVEL_IDC_3_2;
128 case 40:
return STD_VIDEO_H264_LEVEL_IDC_4_0;
129 case 41:
return STD_VIDEO_H264_LEVEL_IDC_4_1;
130 case 42:
return STD_VIDEO_H264_LEVEL_IDC_4_2;
131 case 50:
return STD_VIDEO_H264_LEVEL_IDC_5_0;
132 case 51:
return STD_VIDEO_H264_LEVEL_IDC_5_1;
133 case 52:
return STD_VIDEO_H264_LEVEL_IDC_5_2;
134 case 60:
return STD_VIDEO_H264_LEVEL_IDC_6_0;
135 case 61:
return STD_VIDEO_H264_LEVEL_IDC_6_1;
137 case 62:
return STD_VIDEO_H264_LEVEL_IDC_6_2;
142 StdVideoH264ScalingLists *vksps_scaling,
143 StdVideoH264HrdParameters *vksps_vui_header,
144 StdVideoH264SequenceParameterSetVui *vksps_vui,
145 StdVideoH264SequenceParameterSet *vksps)
147 *vksps_scaling = (StdVideoH264ScalingLists) {
148 .scaling_list_present_mask =
sps->scaling_matrix_present_mask,
149 .use_default_scaling_matrix_mask = 0,
152 for (
int i = 0;
i < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS;
i++)
153 for (
int j = 0; j < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS; j++)
156 for (
int i = 0;
i < STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS;
i++)
157 for (
int j = 0; j < STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS; j++)
158 vksps_scaling->ScalingList8x8[
i][j] =
161 *vksps_vui_header = (StdVideoH264HrdParameters) {
162 .cpb_cnt_minus1 =
sps->cpb_cnt - 1,
163 .bit_rate_scale =
sps->bit_rate_scale,
164 .initial_cpb_removal_delay_length_minus1 =
sps->initial_cpb_removal_delay_length - 1,
165 .cpb_removal_delay_length_minus1 =
sps->cpb_removal_delay_length - 1,
166 .dpb_output_delay_length_minus1 =
sps->dpb_output_delay_length - 1,
167 .time_offset_length =
sps->time_offset_length,
170 for (
int i = 0;
i <
sps->cpb_cnt;
i++) {
171 vksps_vui_header->bit_rate_value_minus1[
i] =
sps->bit_rate_value[
i] - 1;
172 vksps_vui_header->cpb_size_value_minus1[
i] =
sps->cpb_size_value[
i] - 1;
173 vksps_vui_header->cbr_flag[
i] = (
sps->cpr_flag >>
i) & 0x1;
176 *vksps_vui = (StdVideoH264SequenceParameterSetVui) {
177 .aspect_ratio_idc =
sps->vui.aspect_ratio_idc,
178 .sar_width =
sps->vui.sar.num,
179 .sar_height =
sps->vui.sar.den,
180 .video_format =
sps->vui.video_format,
181 .colour_primaries =
sps->vui.colour_primaries,
182 .transfer_characteristics =
sps->vui.transfer_characteristics,
183 .matrix_coefficients =
sps->vui.matrix_coeffs,
184 .num_units_in_tick =
sps->num_units_in_tick,
185 .time_scale =
sps->time_scale,
186 .pHrdParameters = vksps_vui_header,
187 .max_num_reorder_frames =
sps->num_reorder_frames,
188 .max_dec_frame_buffering =
sps->max_dec_frame_buffering,
189 .flags = (StdVideoH264SpsVuiFlags) {
190 .aspect_ratio_info_present_flag =
sps->vui.aspect_ratio_info_present_flag,
191 .overscan_info_present_flag =
sps->vui.overscan_info_present_flag,
192 .overscan_appropriate_flag =
sps->vui.overscan_appropriate_flag,
193 .video_signal_type_present_flag =
sps->vui.video_signal_type_present_flag,
194 .video_full_range_flag =
sps->vui.video_full_range_flag,
195 .color_description_present_flag =
sps->vui.colour_description_present_flag,
196 .chroma_loc_info_present_flag =
sps->vui.chroma_location,
197 .timing_info_present_flag =
sps->timing_info_present_flag,
198 .fixed_frame_rate_flag =
sps->fixed_frame_rate_flag,
199 .bitstream_restriction_flag =
sps->bitstream_restriction_flag,
200 .nal_hrd_parameters_present_flag =
sps->nal_hrd_parameters_present_flag,
201 .vcl_hrd_parameters_present_flag =
sps->vcl_hrd_parameters_present_flag,
205 *vksps = (StdVideoH264SequenceParameterSet) {
206 .profile_idc =
sps->profile_idc,
208 .seq_parameter_set_id =
sps->sps_id,
209 .chroma_format_idc =
sps->chroma_format_idc,
210 .bit_depth_luma_minus8 =
sps->bit_depth_luma - 8,
211 .bit_depth_chroma_minus8 =
sps->bit_depth_chroma - 8,
212 .log2_max_frame_num_minus4 =
sps->log2_max_frame_num - 4,
213 .pic_order_cnt_type =
sps->poc_type,
214 .log2_max_pic_order_cnt_lsb_minus4 =
sps->poc_type ? 0 :
sps->log2_max_poc_lsb - 4,
215 .offset_for_non_ref_pic =
sps->offset_for_non_ref_pic,
216 .offset_for_top_to_bottom_field =
sps->offset_for_top_to_bottom_field,
217 .num_ref_frames_in_pic_order_cnt_cycle =
sps->poc_cycle_length,
218 .max_num_ref_frames =
sps->ref_frame_count,
219 .pic_width_in_mbs_minus1 =
sps->mb_width - 1,
220 .pic_height_in_map_units_minus1 = (
sps->mb_height/(2 -
sps->frame_mbs_only_flag)) - 1,
221 .frame_crop_left_offset =
sps->crop_left,
222 .frame_crop_right_offset =
sps->crop_right,
223 .frame_crop_top_offset =
sps->crop_top,
224 .frame_crop_bottom_offset =
sps->crop_bottom,
225 .flags = (StdVideoH264SpsFlags) {
226 .constraint_set0_flag = (
sps->constraint_set_flags >> 0) & 0x1,
227 .constraint_set1_flag = (
sps->constraint_set_flags >> 1) & 0x1,
228 .constraint_set2_flag = (
sps->constraint_set_flags >> 2) & 0x1,
229 .constraint_set3_flag = (
sps->constraint_set_flags >> 3) & 0x1,
230 .constraint_set4_flag = (
sps->constraint_set_flags >> 4) & 0x1,
231 .constraint_set5_flag = (
sps->constraint_set_flags >> 5) & 0x1,
232 .direct_8x8_inference_flag =
sps->direct_8x8_inference_flag,
233 .mb_adaptive_frame_field_flag =
sps->mb_aff,
234 .frame_mbs_only_flag =
sps->frame_mbs_only_flag,
235 .delta_pic_order_always_zero_flag =
sps->delta_pic_order_always_zero_flag,
236 .separate_colour_plane_flag =
sps->residual_color_transform_flag,
237 .gaps_in_frame_num_value_allowed_flag =
sps->gaps_in_frame_num_allowed_flag,
238 .qpprime_y_zero_transform_bypass_flag =
sps->transform_bypass,
239 .frame_cropping_flag =
sps->crop,
240 .seq_scaling_matrix_present_flag =
sps->scaling_matrix_present,
241 .vui_parameters_present_flag =
sps->vui_parameters_present_flag,
243 .pOffsetForRefFrame =
sps->offset_for_ref_frame,
244 .pScalingLists = vksps_scaling,
245 .pSequenceParameterSetVui = vksps_vui,
250 StdVideoH264ScalingLists *vkpps_scaling,
251 StdVideoH264PictureParameterSet *vkpps)
253 *vkpps_scaling = (StdVideoH264ScalingLists) {
254 .scaling_list_present_mask =
pps->pic_scaling_matrix_present_mask,
255 .use_default_scaling_matrix_mask = 0,
258 for (
int i = 0;
i < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS;
i++)
259 for (
int j = 0; j < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS; j++)
262 for (
int i = 0;
i < STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS;
i++)
263 for (
int j = 0; j < STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS; j++)
264 vkpps_scaling->ScalingList8x8[
i][j] =
267 *vkpps = (StdVideoH264PictureParameterSet) {
268 .seq_parameter_set_id =
pps->sps_id,
269 .pic_parameter_set_id =
pps->pps_id,
270 .num_ref_idx_l0_default_active_minus1 =
pps->ref_count[0] - 1,
271 .num_ref_idx_l1_default_active_minus1 =
pps->ref_count[1] - 1,
272 .weighted_bipred_idc =
pps->weighted_bipred_idc,
273 .pic_init_qp_minus26 =
pps->init_qp - 26,
274 .pic_init_qs_minus26 =
pps->init_qs - 26,
275 .chroma_qp_index_offset =
pps->chroma_qp_index_offset[0],
276 .second_chroma_qp_index_offset =
pps->chroma_qp_index_offset[1],
277 .flags = (StdVideoH264PpsFlags) {
278 .transform_8x8_mode_flag =
pps->transform_8x8_mode,
279 .redundant_pic_cnt_present_flag =
pps->redundant_pic_cnt_present,
280 .constrained_intra_pred_flag =
pps->constrained_intra_pred,
281 .deblocking_filter_control_present_flag =
pps->deblocking_filter_parameters_present,
282 .weighted_pred_flag =
pps->weighted_pred,
283 .bottom_field_pic_order_in_frame_present_flag =
pps->pic_order_present,
284 .entropy_coding_mode_flag =
pps->cabac,
285 .pic_scaling_matrix_present_flag =
pps->pic_scaling_matrix_present_flag,
287 .pScalingLists = vkpps_scaling,
301 StdVideoH264SequenceParameterSetVui vksps_vui[
MAX_SPS_COUNT];
308 VkVideoDecodeH264SessionParametersAddInfoKHR h264_params_info = {
309 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR,
315 VkVideoDecodeH264SessionParametersCreateInfoKHR h264_params = {
316 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR,
317 .pParametersAddInfo = &h264_params_info,
319 VkVideoSessionParametersCreateInfoKHR session_params_create = {
320 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
321 .pNext = &h264_params,
322 .videoSession =
ctx->common.session,
323 .videoSessionParametersTemplate = VK_NULL_HANDLE,
328 if (
h->ps.sps_list[
i]) {
329 const SPS *sps_l =
h->ps.sps_list[
i];
330 int idx = h264_params_info.stdSPSCount;
331 set_sps(sps_l, &vksps_scaling[idx], &vksps_vui_header[idx], &vksps_vui[idx], &vksps[idx]);
332 h264_params_info.stdSPSCount++;
338 if (
h->ps.pps_list[
i]) {
339 const PPS *pps_l =
h->ps.pps_list[
i];
340 int idx = h264_params_info.stdPPSCount;
341 set_pps(pps_l, pps_l->
sps, &vkpps_scaling[idx], &vkpps[idx]);
342 h264_params_info.stdPPSCount++;
346 h264_params.maxStdSPSCount = h264_params_info.stdSPSCount;
347 h264_params.maxStdPPSCount = h264_params_info.stdPPSCount;
354 h264_params_info.stdSPSCount, h264_params_info.stdPPSCount);
364 int dpb_slot_index = 0;
380 if (pic == &
h->DPB[slot]) {
381 dpb_slot_index = slot;
388 h->DPB[dpb_slot_index].field_picture,
389 h->DPB[dpb_slot_index].reference,
395 for (
int i = 0;
i <
h->short_ref_count;
i++) {
398 if (
h->short_ref[
i] == &
h->DPB[slot]) {
399 dpb_slot_index = slot;
406 h->DPB[dpb_slot_index].field_picture,
407 h->DPB[dpb_slot_index].reference,
415 i < h->short_ref_count +
h->long_ref_count;
r++) {
420 for (
unsigned slot = 0; slot < 16; slot++) {
421 if (
h->long_ref[
r] == &
h->DPB[slot]) {
422 dpb_slot_index = slot;
429 h->DPB[dpb_slot_index].field_picture,
430 h->DPB[dpb_slot_index].reference,
437 hp->
h264pic = (StdVideoDecodeH264PictureInfo) {
438 .seq_parameter_set_id = pic->
pps->
sps_id,
439 .pic_parameter_set_id = pic->
pps->
pps_id,
444 .flags = (StdVideoDecodeH264PictureInfoFlags) {
447 .IdrPicFlag =
h->picture_idr,
448 .bottom_field_flag =
h->picture_structure !=
PICT_FRAME &&
450 .is_reference =
h->nal_ref_idc != 0,
456 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR,
457 .pStdPictureInfo = &hp->
h264pic,
461 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR,
464 .pSetupReferenceSlot = &vp->
ref_slot,
465 .referenceSlotCount =
h->short_ref_count +
h->long_ref_count,
467 .dstPictureResource = (VkVideoPictureResourceInfoKHR) {
468 .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
469 .codedOffset = (VkOffset2D){ 0, 0 },
470 .codedExtent = (VkExtent2D){ pic->
f->
width, pic->
f->
height },
499 hp->
h264pic.flags.is_intra = 0;
553 .
p.
name =
"h264_vulkan",