46 .encode_op = VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR,
48 .extensionName = VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME,
49 .specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION,
55 0x03, 0xfd, 0xf2, 0x0a, 0x5d, 0x4c, 0x05, 0x48,
56 0x20, 0x98, 0xca, 0x6b, 0x0c, 0x95, 0x30, 0x1c,
75 VkVideoEncodeH264NaluSliceInfoKHR
vkslice;
101 VkVideoEncodeH264CapabilitiesKHR
caps;
118 VkVideoEncodeRateControlInfoKHR *rc_info,
119 VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
125 hp->
vkrc_info = (VkVideoEncodeH264RateControlInfoKHR) {
126 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_KHR,
127 .flags = VK_VIDEO_ENCODE_H264_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR |
128 VK_VIDEO_ENCODE_H264_RATE_CONTROL_REGULAR_GOP_BIT_KHR,
129 .idrPeriod =
ctx->base.gop_size,
130 .gopFrameCount =
ctx->base.gop_size,
131 .consecutiveBFrameCount =
FFMAX(
ctx->base.b_per_p - 1, 0),
132 .temporalLayerCount = 0,
136 if (rc_info->rateControlMode > VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
141 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_KHR,
143 .useMinQp = avctx->
qmin > 0,
144 .minQp.qpI = avctx->
qmin > 0 ? avctx->
qmin : 0,
145 .minQp.qpP = avctx->
qmin > 0 ? avctx->
qmin : 0,
146 .minQp.qpB = avctx->
qmin > 0 ? avctx->
qmin : 0,
148 .useMaxQp = avctx->
qmax > 0,
149 .maxQp.qpI = avctx->
qmax > 0 ? avctx->
qmax : 0,
150 .maxQp.qpP = avctx->
qmax > 0 ? avctx->
qmax : 0,
151 .maxQp.qpB = avctx->
qmax > 0 ? avctx->
qmax : 0,
153 .useMaxFrameSize = 0,
220 .recovery_frame_cnt = 0,
221 .exact_match_flag = 1,
222 .broken_link_flag =
ctx->base.b_per_p > 0,
230 size_t sei_a53cc_len;
253 hp->
slice_wt = (StdVideoEncodeH264WeightTable) {
254 .flags = (StdVideoEncodeH264WeightTableFlags) {
255 .luma_weight_l0_flag = 0,
256 .chroma_weight_l0_flag = 0,
257 .luma_weight_l1_flag = 0,
258 .chroma_weight_l1_flag = 0,
260 .luma_log2_weight_denom = 0,
261 .chroma_log2_weight_denom = 0,
262 .luma_weight_l0 = { 0 },
263 .luma_offset_l0 = { 0 },
264 .chroma_weight_l0 = { { 0 } },
265 .chroma_offset_l0 = { { 0 } },
266 .luma_weight_l1 = { 0 },
267 .luma_offset_l1 = { 0 },
268 .chroma_weight_l1 = { { 0 } },
269 .chroma_offset_l1 = { { 0 } },
272 hp->
slice_hdr = (StdVideoEncodeH264SliceHeader) {
273 .flags = (StdVideoEncodeH264SliceHeaderFlags) {
274 .direct_spatial_mv_pred_flag = 1,
276 .num_ref_idx_active_override_flag =
280 .first_mb_in_slice = 1,
282 .slice_alpha_c0_offset_div2 = 0,
283 .slice_beta_offset_div2 = 0,
287 .disable_deblocking_filter_idc = 0,
288 .pWeightTable =
NULL,
291 hp->
vkslice = (VkVideoEncodeH264NaluSliceInfoKHR) {
292 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_KHR,
300 if (enc->
common.
opts.
rc_mode != VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR)
329 for (j = n; j > 0; j--) {
334 rpl0[j] = rpl0[j - 1];
336 rpl0[j] = prev->
dpb[
i];
339 for (j = n; j > 0; j--) {
350 rpl0[j] = rpl0[j - 1];
352 rpl0[j] = prev->
dpb[
i];
354 for (j = n; j > 0; j--) {
365 rpl1[j] = rpl1[j - 1];
367 rpl1[j] = prev->
dpb[
i];
374 for (
i = 0;
i < n;
i++) {
375 if (rpl0[
i] != rpl1[
i])
386 for (
i = 0;
i < n;
i++) {
389 hn->frame_num,
hn->pic_order_cnt);
396 for (
i = 0;
i < n;
i++) {
399 hn->frame_num,
hn->pic_order_cnt);
409 VkVideoEncodeInfoKHR *encode_info)
419 .flags = (StdVideoEncodeH264ReferenceListsInfoFlags) {
420 .ref_pic_list_modification_flag_l0 = 0,
421 .ref_pic_list_modification_flag_l1 = 0,
425 .num_ref_idx_l0_active_minus1 = pic->
nb_refs[0] - 1,
426 .num_ref_idx_l1_active_minus1 = pic->
nb_refs[1] - 1,
430 .pRefList0ModOperations =
NULL,
431 .refList0ModOpCount = 0,
432 .pRefList1ModOperations =
NULL,
433 .refList1ModOpCount = 0,
434 .pRefPicMarkingOperations =
NULL,
435 .refPicMarkingOpCount = 0,
438 for (
i = 0;
i < STD_VIDEO_H264_MAX_NUM_LIST_REF;
i++)
443 VkVideoReferenceSlotInfoKHR *slot_info;
444 slot_info = (VkVideoReferenceSlotInfoKHR *)&encode_info->pReferenceSlots[
i];
450 VkVideoReferenceSlotInfoKHR *slot_info;
451 slot_info = (VkVideoReferenceSlotInfoKHR *)&encode_info->pReferenceSlots[pic->
nb_refs[0] +
i];
459 int discard = 0, keep = 0;
465 if (prev->
dpb[
i] == pic->
dpb[j])
469 discard_list[discard] = prev->
dpb[
i];
478 hp->
h264pic_info.flags.adaptive_ref_pic_marking_mode_flag = 0;
480 hp->
h264pic_info.flags.adaptive_ref_pic_marking_mode_flag = 1;
481 for (
i = 0;
i < discard;
i++) {
484 hp->
mmco[
i] = (StdVideoEncodeH264RefPicMarkingEntry) {
485 .memory_management_control_operation = 1,
489 hp->
mmco[
i] = (StdVideoEncodeH264RefPicMarkingEntry) {
490 .memory_management_control_operation = 0,
513 hp->
ref_list_info.flags.ref_pic_list_modification_flag_l0 = need_rplm;
520 hp->
mods[0][
i] = (StdVideoEncodeH264RefListModEntry) {
521 .modification_of_pic_nums_idc = 0,
522 .abs_diff_pic_num_minus1 = pic_num - href->
frame_num - 1,
525 hp->
mods[0][
i] = (StdVideoEncodeH264RefListModEntry) {
526 .modification_of_pic_nums_idc = 1,
527 .abs_diff_pic_num_minus1 = href->
frame_num - pic_num - 1,
536 int need_rplm_l0 = 0, need_rplm_l1 = 0;
556 hp->
ref_list_info.flags.ref_pic_list_modification_flag_l0 = need_rplm_l0;
563 hp->
mods[0][j] = (StdVideoEncodeH264RefListModEntry) {
564 .modification_of_pic_nums_idc = 0,
565 .abs_diff_pic_num_minus1 = pic_num - href->
frame_num - 1,
568 hp->
mods[0][j] = (StdVideoEncodeH264RefListModEntry) {
569 .modification_of_pic_nums_idc = 1,
570 .abs_diff_pic_num_minus1 = href->
frame_num - pic_num - 1,
580 hp->
ref_list_info.flags.ref_pic_list_modification_flag_l1 = need_rplm_l1;
587 hp->
mods[1][j] = (StdVideoEncodeH264RefListModEntry) {
588 .modification_of_pic_nums_idc = 0,
589 .abs_diff_pic_num_minus1 = pic_num - href->
frame_num - 1,
592 hp->
mods[1][j] = (StdVideoEncodeH264RefListModEntry) {
593 .modification_of_pic_nums_idc = 1,
594 .abs_diff_pic_num_minus1 = href->
frame_num - pic_num - 1,
607 VkVideoEncodeInfoKHR *encode_info)
612 VkVideoReferenceSlotInfoKHR *ref_slot;
619 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PICTURE_INFO_KHR,
621 .pNaluSliceEntries =
NULL,
622 .naluSliceEntryCount = 0,
627 .flags = (StdVideoEncodeH264PictureInfoFlags) {
630 .no_output_of_prior_pics_flag = 0,
631 .long_term_reference_flag = 0,
632 .adaptive_ref_pic_marking_mode_flag = 0,
635 .seq_parameter_set_id = 0,
636 .pic_parameter_set_id = 0,
641 STD_VIDEO_H264_PICTURE_TYPE_IDR,
651 .flags = (StdVideoEncodeH264ReferenceInfoFlags) {
652 .used_for_long_term_reference = 0,
658 .long_term_pic_num = 0,
659 .long_term_frame_idx = 0,
663 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_KHR,
669 ref_slot = (VkVideoReferenceSlotInfoKHR *)encode_info->pSetupReferenceSlot;
680 VkVideoProfileInfoKHR *
profile,
void *pnext)
687 VkVideoEncodeH264CapabilitiesKHR h264_caps = {
688 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR,
690 VkVideoEncodeCapabilitiesKHR enc_caps = {
691 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR,
694 VkVideoCapabilitiesKHR caps = {
695 .sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,
701 static const int known_profiles[] = {
713 if (
desc->comp[0].depth == 8)
716 enc->
profile = (VkVideoEncodeH264ProfileInfoKHR) {
717 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR,
732 for (
int i = 0;
i < nb_profiles;
i++) {
734 ret = vk->GetPhysicalDeviceVideoCapabilitiesKHR(
s->hwctx->phys_dev,
737 if (ret == VK_SUCCESS) {
740 last_supported = known_profiles[
i];
752 avctx->
profile = last_supported;
772 "must have initial buffer size (%d) <= "
773 "buffer size (%"PRId64
").\n",
782 if (enc->
common.
opts.
rc_mode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
803 "%d / %d / %d for IDR- / P- / B-frames.\n",
841 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR);
843 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR);
845 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_TRANSFORM_8X8_MODE_FLAG_SET_BIT_KHR);
852 StdVideoH264SequenceParameterSet
vksps;
857 StdVideoH264PictureParameterSet
vkpps;
870 StdVideoH264ScalingLists *vksps_scaling = &vk_units->
vksps_scaling;
872 StdVideoH264SequenceParameterSetVui *vksps_vui = &vk_units->
vksps_vui;
873 StdVideoH264SequenceParameterSet *vksps = &vk_units->
vksps;
876 StdVideoH264ScalingLists *vkpps_scaling = &vk_units->
vkpps_scaling;
877 StdVideoH264PictureParameterSet *vkpps = &vk_units->
vkpps;
879 *vksps_scaling = (StdVideoH264ScalingLists) {
880 .scaling_list_present_mask = 0x0,
881 .use_default_scaling_matrix_mask = 1,
884 *vksps_vui_header = (StdVideoH264HrdParameters) {
899 vksps_vui_header->cbr_flag[
i] = hrd->
cbr_flag[
i];
902 *vksps_vui = (StdVideoH264SequenceParameterSetVui) {
903 .flags = (StdVideoH264SpsVuiFlags) {
904 .aspect_ratio_info_present_flag =
sps->vui.aspect_ratio_info_present_flag,
905 .overscan_info_present_flag =
sps->vui.overscan_info_present_flag,
906 .overscan_appropriate_flag =
sps->vui.overscan_appropriate_flag,
907 .video_signal_type_present_flag =
sps->vui.video_signal_type_present_flag,
908 .video_full_range_flag =
sps->vui.video_full_range_flag,
909 .color_description_present_flag =
sps->vui.colour_description_present_flag,
910 .chroma_loc_info_present_flag =
sps->vui.chroma_loc_info_present_flag,
911 .timing_info_present_flag =
sps->vui.timing_info_present_flag,
912 .fixed_frame_rate_flag =
sps->vui.fixed_frame_rate_flag,
913 .bitstream_restriction_flag =
sps->vui.bitstream_restriction_flag,
914 .nal_hrd_parameters_present_flag =
sps->vui.nal_hrd_parameters_present_flag,
915 .vcl_hrd_parameters_present_flag =
sps->vui.vcl_hrd_parameters_present_flag,
917 .aspect_ratio_idc =
sps->vui.aspect_ratio_idc,
918 .sar_width =
sps->vui.sar_width,
919 .sar_height =
sps->vui.sar_height,
920 .video_format =
sps->vui.video_format,
921 .colour_primaries =
sps->vui.colour_primaries,
922 .transfer_characteristics =
sps->vui.transfer_characteristics,
923 .matrix_coefficients =
sps->vui.matrix_coefficients,
924 .num_units_in_tick =
sps->vui.num_units_in_tick,
925 .time_scale =
sps->vui.time_scale,
926 .max_num_reorder_frames =
sps->vui.max_num_reorder_frames,
927 .max_dec_frame_buffering =
sps->vui.max_dec_frame_buffering,
928 .chroma_sample_loc_type_top_field =
sps->vui.chroma_sample_loc_type_top_field,
929 .chroma_sample_loc_type_bottom_field =
sps->vui.chroma_sample_loc_type_bottom_field,
931 .pHrdParameters = vksps_vui_header,
934 *vksps = (StdVideoH264SequenceParameterSet) {
935 .flags = (StdVideoH264SpsFlags) {
936 .constraint_set0_flag =
sps->constraint_set0_flag,
937 .constraint_set1_flag =
sps->constraint_set1_flag,
938 .constraint_set2_flag =
sps->constraint_set2_flag,
939 .constraint_set3_flag =
sps->constraint_set3_flag,
940 .constraint_set4_flag =
sps->constraint_set4_flag,
941 .constraint_set5_flag =
sps->constraint_set5_flag,
942 .direct_8x8_inference_flag =
sps->direct_8x8_inference_flag,
943 .mb_adaptive_frame_field_flag =
sps->mb_adaptive_frame_field_flag,
944 .frame_mbs_only_flag =
sps->frame_mbs_only_flag,
945 .delta_pic_order_always_zero_flag =
sps->delta_pic_order_always_zero_flag,
946 .separate_colour_plane_flag =
sps->separate_colour_plane_flag,
947 .gaps_in_frame_num_value_allowed_flag =
sps->gaps_in_frame_num_allowed_flag,
948 .qpprime_y_zero_transform_bypass_flag =
sps->qpprime_y_zero_transform_bypass_flag,
949 .frame_cropping_flag =
sps->frame_cropping_flag,
950 .seq_scaling_matrix_present_flag =
sps->seq_scaling_matrix_present_flag,
951 .vui_parameters_present_flag =
sps->vui_parameters_present_flag,
955 .chroma_format_idc =
sps->chroma_format_idc,
956 .seq_parameter_set_id =
sps->seq_parameter_set_id,
957 .bit_depth_luma_minus8 =
sps->bit_depth_luma_minus8,
958 .bit_depth_chroma_minus8 =
sps->bit_depth_chroma_minus8,
959 .log2_max_frame_num_minus4 =
sps->log2_max_frame_num_minus4,
960 .pic_order_cnt_type =
sps->pic_order_cnt_type,
961 .offset_for_non_ref_pic =
sps->offset_for_non_ref_pic,
962 .offset_for_top_to_bottom_field =
sps->offset_for_top_to_bottom_field,
963 .log2_max_pic_order_cnt_lsb_minus4 =
sps->log2_max_pic_order_cnt_lsb_minus4,
964 .num_ref_frames_in_pic_order_cnt_cycle =
sps->num_ref_frames_in_pic_order_cnt_cycle,
965 .max_num_ref_frames =
sps->max_num_ref_frames,
967 .pic_width_in_mbs_minus1 =
sps->pic_width_in_mbs_minus1,
968 .pic_height_in_map_units_minus1 =
sps->pic_height_in_map_units_minus1,
969 .frame_crop_left_offset =
sps->frame_crop_left_offset,
970 .frame_crop_right_offset =
sps->frame_crop_right_offset,
971 .frame_crop_top_offset =
sps->frame_crop_top_offset,
972 .frame_crop_bottom_offset =
sps->frame_crop_bottom_offset,
974 .pOffsetForRefFrame =
sps->offset_for_ref_frame,
975 .pScalingLists = vksps_scaling,
976 .pSequenceParameterSetVui = vksps_vui,
979 *vkpps_scaling = (StdVideoH264ScalingLists) {
980 .scaling_list_present_mask = 0x0,
981 .use_default_scaling_matrix_mask = 1,
984 *vkpps = (StdVideoH264PictureParameterSet) {
985 .flags = (StdVideoH264PpsFlags) {
986 .transform_8x8_mode_flag =
pps->transform_8x8_mode_flag,
987 .redundant_pic_cnt_present_flag =
pps->redundant_pic_cnt_present_flag,
988 .constrained_intra_pred_flag =
pps->constrained_intra_pred_flag,
989 .deblocking_filter_control_present_flag =
pps->deblocking_filter_control_present_flag,
990 .weighted_pred_flag =
pps->weighted_pred_flag,
991 .bottom_field_pic_order_in_frame_present_flag =
pps->bottom_field_pic_order_in_frame_present_flag,
992 .entropy_coding_mode_flag =
pps->entropy_coding_mode_flag,
993 .pic_scaling_matrix_present_flag =
pps->pic_scaling_matrix_present_flag,
995 .seq_parameter_set_id =
pps->seq_parameter_set_id,
996 .pic_parameter_set_id =
pps->pic_parameter_set_id,
997 .num_ref_idx_l0_default_active_minus1 =
pps->num_ref_idx_l0_default_active_minus1,
998 .num_ref_idx_l1_default_active_minus1 =
pps->num_ref_idx_l1_default_active_minus1,
999 .weighted_bipred_idc =
pps->weighted_bipred_idc,
1000 .pic_init_qp_minus26 =
pps->pic_init_qp_minus26,
1001 .pic_init_qs_minus26 =
pps->pic_init_qs_minus26,
1002 .chroma_qp_index_offset =
pps->chroma_qp_index_offset,
1003 .second_chroma_qp_index_offset =
pps->second_chroma_qp_index_offset,
1004 .pScalingLists = vkpps_scaling,
1020 VkVideoEncodeH264SessionParametersAddInfoKHR h264_params_info;
1021 VkVideoEncodeH264SessionParametersCreateInfoKHR h264_params;
1032 if (
ctx->session_params)
1033 vk->DestroyVideoSessionParametersKHR(
s->hwctx->act_dev,
1034 ctx->session_params,
1037 h264_params_info = (VkVideoEncodeH264SessionParametersAddInfoKHR) {
1038 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR,
1039 .pStdSPSs = &vk_units.
vksps,
1041 .pStdPPSs = &vk_units.
vkpps,
1044 h264_params = (VkVideoEncodeH264SessionParametersCreateInfoKHR) {
1045 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR,
1046 .maxStdSPSCount = 1,
1047 .maxStdPPSCount = 1,
1048 .pParametersAddInfo = &h264_params_info,
1056 int sps_override,
int pps_override)
1088 ff_cbs_fragment_free(&au);
1103 VkVideoEncodeH264SessionParametersGetInfoKHR h264_params_info;
1104 VkVideoEncodeSessionParametersGetInfoKHR params_info;
1105 VkVideoEncodeH264SessionParametersFeedbackInfoKHR h264_params_feedback;
1106 VkVideoEncodeSessionParametersFeedbackInfoKHR params_feedback;
1109 size_t data_size = 0;
1124 h264_params_info = (VkVideoEncodeH264SessionParametersGetInfoKHR) {
1125 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR,
1131 params_info = (VkVideoEncodeSessionParametersGetInfoKHR) {
1132 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR,
1133 .pNext = &h264_params_info,
1134 .videoSessionParameters =
ctx->session_params,
1137 h264_params_feedback = (VkVideoEncodeH264SessionParametersFeedbackInfoKHR) {
1138 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,
1140 params_feedback = (VkVideoEncodeSessionParametersFeedbackInfoKHR) {
1141 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,
1142 .pNext = &h264_params_feedback,
1145 ret = vk->GetEncodedVideoSessionParametersKHR(
s->hwctx->act_dev, ¶ms_info,
1148 if (ret == VK_INCOMPLETE ||
1149 (ret == VK_SUCCESS) && (data_size > 0)) {
1154 av_log(avctx,
AV_LOG_ERROR,
"Unable to get feedback for H.264 units = %zu\n", data_size);
1158 ret = vk->GetEncodedVideoSessionParametersKHR(
s->hwctx->act_dev, ¶ms_info,
1161 if (ret != VK_SUCCESS) {
1168 params_feedback.hasOverrides,
1169 h264_params_feedback.hasStdSPSOverrides,
1170 h264_params_feedback.hasStdPPSOverrides);
1172 params_feedback.hasOverrides = 1;
1173 h264_params_feedback.hasStdPPSOverrides = 1;
1177 if (!params_feedback.hasOverrides)
1182 h264_params_feedback.hasStdSPSOverrides,
1183 h264_params_feedback.hasStdPPSOverrides);
1201 int err = ff_cbs_insert_unit_content(au, -1,
1205 "type = %d.\n",
header->nal_unit_type);
1211 uint8_t *
data,
size_t *data_len,
1216 int err = ff_cbs_write_fragment_data(enc->
cbs, au);
1222 if (*data_len < au->data_size) {
1236 uint8_t *
data,
size_t *data_len)
1259 ff_cbs_fragment_reset(au);
1265 uint8_t *
data,
size_t *data_len)
1327 ff_cbs_fragment_reset(au);
1332 uint8_t *
data,
size_t *data_len)
1339 .nal_unit_header = {
1351 ff_cbs_fragment_reset(au);
1360 .filler_header_size = 6,
1371 int err, ref_l0, ref_l1;
1381 enc->
caps = (VkVideoEncodeH264CapabilitiesKHR) {
1382 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR,
1385 enc->
quality_props = (VkVideoEncodeH264QualityLevelPropertiesKHR) {
1386 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUALITY_LEVEL_PROPERTIES_KHR,
1398 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR));
1400 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG_SET_BIT_KHR));
1402 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_SCALING_MATRIX_PRESENT_FLAG_SET_BIT_KHR));
1404 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_CHROMA_QP_INDEX_OFFSET_BIT_KHR));
1406 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_SECOND_CHROMA_QP_INDEX_OFFSET_BIT_KHR));
1408 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_PIC_INIT_QP_MINUS26_BIT_KHR));
1410 enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR ?
1412 enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_EXPLICIT_BIT_KHR ?
1413 " bipred_explicit" :
"",
1414 enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_IMPLICIT_BIT_KHR ?
1415 " bipred_implicit" :
"");
1417 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_TRANSFORM_8X8_MODE_FLAG_SET_BIT_KHR));
1419 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_DIRECT_SPATIAL_MV_PRED_FLAG_UNSET_BIT_KHR));
1421 enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_UNSET_BIT_KHR ?
1423 enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_SET_BIT_KHR ?
1426 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_DIRECT_8X8_INFERENCE_FLAG_UNSET_BIT_KHR));
1428 !!(enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR));
1430 enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_DISABLED_BIT_KHR ?
1431 " filter_disabling" :
"",
1432 enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_ENABLED_BIT_KHR ?
1433 " filter_enabling" :
"",
1434 enc->
caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H264_STD_DEBLOCKING_FILTER_PARTIAL_BIT_KHR ?
1435 " filter_partial" :
"");
1439 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR));
1441 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR));
1443 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR));
1445 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_KHR));
1447 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR));
1449 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR));
1451 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR));
1453 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR));
1455 !!(enc->
caps.flags & VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR));
1459 enc->
caps.maxLevelIdc);
1461 enc->
caps.maxSliceCount);
1463 enc->
caps.maxPPictureL0ReferenceCount,
1464 enc->
caps.maxBPictureL0ReferenceCount);
1466 enc->
caps.maxL1ReferenceCount);
1468 enc->
caps.maxTemporalLayerCount);
1470 enc->
caps.expectDyadicTemporalLayerPattern);
1474 enc->
caps.prefersGopRemainingFrames);
1476 enc->
caps.requiresGopRemainingFrames);
1489 if (!enc->
caps.maxPPictureL0ReferenceCount &&
1490 !enc->
caps.maxBPictureL0ReferenceCount &&
1491 !enc->
caps.maxL1ReferenceCount) {
1494 ref_l0 = ref_l1 = 0;
1495 }
else if (!enc->
caps.maxPPictureL0ReferenceCount) {
1498 ref_l0 = enc->
caps.maxBPictureL0ReferenceCount;
1499 ref_l1 = enc->
caps.maxL1ReferenceCount;
1500 }
else if (!enc->
caps.maxBPictureL0ReferenceCount &&
1501 !enc->
caps.maxL1ReferenceCount) {
1504 ref_l0 = enc->
caps.maxPPictureL0ReferenceCount;
1508 ref_l0 =
FFMIN(enc->
caps.maxPPictureL0ReferenceCount,
1509 enc->
caps.maxBPictureL0ReferenceCount);
1510 ref_l1 = enc->
caps.maxL1ReferenceCount;
1530 "%s / Vulkan video %i.%i.%i / %s %i.%i.%i / %s",
1533 s->driver_props.driverName,
1534 CODEC_VER(
s->props.properties.driverVersion),
1535 s->props.properties.deviceName);
1543 "%s / Vulkan video %i.%i.%i / %s %i.%i.%i / %s",
1546 s->driver_props.driverName,
1547 CODEC_VER(
s->props.properties.driverVersion),
1548 s->props.properties.deviceName);
1578 ff_cbs_close(&enc->
cbs);
1587#define OFFSET(x) offsetof(VulkanEncodeH264Context, x)
1588#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1593 {
"profile",
"Set profile (profile_idc and constraint_set*_flag)",
1597#define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1598 { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1605 {
"level",
"Set level (level_idc)",
1609#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1610 { .i64 = value }, 0, 0, FLAGS, .unit = "level"
1612 {
LEVEL(
"1.1", 11) },
1613 {
LEVEL(
"1.2", 12) },
1614 {
LEVEL(
"1.3", 13) },
1616 {
LEVEL(
"2.1", 21) },
1617 {
LEVEL(
"2.2", 22) },
1619 {
LEVEL(
"3.1", 31) },
1620 {
LEVEL(
"3.2", 32) },
1622 {
LEVEL(
"4.1", 41) },
1623 {
LEVEL(
"4.2", 42) },
1625 {
LEVEL(
"5.1", 51) },
1626 {
LEVEL(
"5.2", 52) },
1628 {
LEVEL(
"6.1", 61) },
1629 {
LEVEL(
"6.2", 62) },
1650 {
"i_qfactor",
"1" },
1651 {
"i_qoffset",
"0" },
1652 {
"b_qfactor",
"1" },
1653 {
"b_qoffset",
"0" },
1661 .class_name =
"h264_vulkan",
1668 .p.name =
"h264_vulkan",
1686 .p.wrapper_name =
"vulkan",
static float hn(int n, EqParameter *param, float fs)
const FFCodec ff_h264_vulkan_encoder
int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len, void **data, size_t *sei_size)
Check AVFrame for A53 side data and allocate and fill SEI message with A53 info.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
int ff_cbs_sei_add_message(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, int prefix, uint32_t payload_type, void *payload_data, void *payload_ref)
Add an SEI message to an access unit.
#define CODEC_PIXFMTS(...)
#define FF_CODEC_RECEIVE_PACKET_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define AV_PROFILE_H264_MAIN
#define AV_PROFILE_UNKNOWN
#define AV_PROFILE_H264_HIGH_444_PREDICTIVE
#define AV_PROFILE_H264_HIGH
#define AV_PROFILE_H264_CONSTRAINED_BASELINE
#define AV_PROFILE_H264_BASELINE
int(* init)(AVBSFContext *ctx)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define AV_CODEC_CAP_ENCODER_FLUSH
This encoder can be flushed using avcodec_flush_buffers().
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
const char * avcodec_profile_name(enum AVCodecID codec_id, int profile)
Return a name for the specified profile, if available.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
#define AVERROR_EXTERNAL
Generic error in an external library.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
#define LIBAVUTIL_VERSION_INT
int ff_hw_base_init_gop_structure(FFHWBaseEncodeContext *ctx, AVCodecContext *avctx, uint32_t ref_l0, uint32_t ref_l1, int flags, int prediction_pre_only)
#define HW_BASE_ENCODE_COMMON_OPTIONS
@ FF_HW_FLAG_NON_IDR_KEY_PICTURES
@ FF_HW_FLAG_B_PICTURE_REFERENCES
#define MAX_REFERENCE_LIST_NUM
int ff_hw_base_encode_init_params_h264(FFHWBaseEncodeContext *base_ctx, AVCodecContext *avctx, FFHWBaseEncodeH264 *common, FFHWBaseEncodeH264Opts *opts)
#define FF_HW_H264_SEI_TIMING
int(* filler)(InterplayACMContext *s, unsigned ind, unsigned col)
Libavcodec version macros.
common internal API header
#define FFSWAP(type, a, b)
Memory handling functions.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
static const uint8_t header[24]
@ SEI_TYPE_RECOVERY_POINT
@ SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35
@ SEI_TYPE_USER_DATA_UNREGISTERED
@ SEI_TYPE_BUFFERING_PERIOD
#define FF_ARRAY_ELEMS(a)
Describe the class of an AVClass context structure.
main external API structure.
int width
picture width / height.
int rc_buffer_size
decoder bitstream buffer size
float b_quant_offset
qscale offset between IP and B-frames
int qmin
minimum quantizer
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
int level
Encoding level descriptor.
int64_t bit_rate
the average bitrate
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
int64_t rc_max_rate
maximum bitrate
int qmax
maximum quantizer
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
float i_quant_offset
qscale offset between P and I-frames
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Context structure for coded bitstream operations.
Coded bitstream fragment structure, combining one or more units.
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
int nb_units
Number of units in this fragment.
size_t data_size
The number of bytes in the bitstream.
uint8_t * data
Pointer to the bitstream form of this fragment.
void * content
Pointer to the decomposed form of this unit.
CodedBitstreamUnitType type
Codec-specific type of this unit.
uint64_t initial_buffer_fullness
H264RawSEIBufferingPeriod sei_buffering_period
struct FFHWBaseEncodePicture * dpb[MAX_DPB_SIZE]
struct FFHWBaseEncodePicture * prev
int nb_refs[MAX_REFERENCE_LIST_NUM]
struct FFHWBaseEncodePicture * refs[MAX_REFERENCE_LIST_NUM][MAX_PICTURE_REFERENCES]
VkVideoEncodeRateControlModeFlagBitsKHR rc_mode
FFHWBaseEncodeContext base
FFVkEncodeCommonOptions opts
VkVideoReferenceSlotInfoKHR dpb_slot
uint8_t dpb_output_delay_length_minus1
uint8_t time_offset_length
uint8_t cbr_flag[H264_MAX_CPB_CNT]
uint32_t bit_rate_value_minus1[H264_MAX_CPB_CNT]
uint32_t cpb_size_value_minus1[H264_MAX_CPB_CNT]
uint8_t cpb_removal_delay_length_minus1
uint8_t initial_cpb_removal_delay_length_minus1
uint8_t pic_scaling_matrix_present_flag
int8_t pic_init_qp_minus26
uint8_t num_ref_idx_l0_default_active_minus1
uint8_t pic_parameter_set_id
uint8_t transform_8x8_mode_flag
uint8_t pic_order_cnt_type
uint8_t seq_scaling_matrix_present_flag
uint8_t seq_parameter_set_id
uint8_t itu_t_t35_country_code
uint8_t uuid_iso_iec_11578[16]
H264RawSEIPicTiming sei_pic_timing
VkVideoEncodeH264QualityLevelPropertiesKHR quality_props
H264RawSEIRecoveryPoint sei_recovery_point
FFHWBaseEncodeH264Opts unit_opts
SEIRawUserDataUnregistered sei_identifier
FFVulkanEncodeContext common
CodedBitstreamFragment current_access_unit
SEIRawUserDataRegistered sei_a53cc
VkVideoEncodeH264CapabilitiesKHR caps
char * sei_identifier_string
enum UnitElems unit_elems
CodedBitstreamContext * cbs
VkVideoEncodeH264ProfileInfoKHR profile
VkVideoEncodeH264RateControlInfoKHR vkrc_info
VkVideoEncodeH264PictureInfoKHR vkh264pic_info
StdVideoEncodeH264SliceHeader slice_hdr
StdVideoEncodeH264PictureInfo h264pic_info
enum UnitElems units_needed
StdVideoEncodeH264RefListModEntry mods[MAX_REFERENCE_LIST_NUM][H264_MAX_RPLM_COUNT]
StdVideoEncodeH264RefPicMarkingEntry mmco[H264_MAX_RPLM_COUNT]
StdVideoEncodeH264ReferenceListsInfo ref_list_info
VkVideoEncodeH264DpbSlotInfoKHR vkh264dpb_info
VkVideoEncodeH264NaluSliceInfoKHR vkslice
VkVideoEncodeH264GopRemainingFrameInfoKHR vkrc_remaining
StdVideoEncodeH264WeightTable slice_wt
StdVideoEncodeH264ReferenceInfo h264dpb_info
VkVideoEncodeH264RateControlLayerInfoKHR vkrc_layer_info
StdVideoH264SequenceParameterSetVui vksps_vui
StdVideoH264SequenceParameterSet vksps
StdVideoH264ScalingLists vkpps_scaling
StdVideoH264ScalingLists vksps_scaling
StdVideoH264PictureParameterSet vkpps
StdVideoH264HrdParameters vksps_vui_header
static AVFormatContext * ctx
const AVCodecHWConfigInternal *const ff_vulkan_encode_hw_configs[]
Paperwork.
av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext *ctx, const FFVulkanEncodeDescriptor *vk_desc, const FFVulkanCodec *codec, void *codec_caps, void *quality_pnext)
Initialize encoder.
av_cold void ff_vulkan_encode_uninit(FFVulkanEncodeContext *ctx)
Uninitialize encoder.
static int init_pic_rc(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeRateControlInfoKHR *rc_info, VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
int ff_vulkan_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Encode.
av_cold int ff_vulkan_write_global_header(AVCodecContext *avctx, FFVulkanEncodeContext *ctx)
Write out the extradata in case its needed.
int ff_vulkan_encode_create_session_params(AVCodecContext *avctx, FFVulkanEncodeContext *ctx, void *codec_params_pnext)
Create session parameters.
#define VULKAN_ENCODE_COMMON_OPTIONS
static int init_profile(AVCodecContext *avctx, VkVideoProfileInfoKHR *profile, void *pnext)
static int write_extra_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
static int init_pic_params(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeInfoKHR *encode_info)
static const FFVulkanCodec enc_cb
static const uint8_t vulkan_encode_h264_sei_identifier_uuid[16]
static av_cold int base_unit_to_vk(AVCodecContext *avctx, VulkanH264Units *vk_units)
static int write_access_unit(AVCodecContext *avctx, uint8_t *data, size_t *data_len, CodedBitstreamFragment *au)
static av_cold int vulkan_encode_h264_init(AVCodecContext *avctx)
static int create_session_params(AVCodecContext *avctx)
static void setup_refs(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeInfoKHR *encode_info)
static const FFCodecDefault vulkan_encode_h264_defaults[]
static int vk_enc_h264_update_pic_info(AVCodecContext *avctx, FFHWBaseEncodePicture *pic)
const FFVulkanEncodeDescriptor ff_vk_enc_h264_desc
static int parse_feedback_units(AVCodecContext *avctx, const uint8_t *data, size_t size, int sps_override, int pps_override)
static int init_profile(AVCodecContext *avctx, VkVideoProfileInfoKHR *profile, void *pnext)
#define LEVEL(name, value)
static const AVOption vulkan_encode_h264_options[]
static int init_enc_options(AVCodecContext *avctx)
static void vk_enc_h264_default_ref_pic_list(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, FFHWBaseEncodePicture **rpl0, FFHWBaseEncodePicture **rpl1, int *rpl_size)
static int init_pic_rc(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeRateControlInfoKHR *rc_info, VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
static const AVClass vulkan_encode_h264_class
static void setup_slices(AVCodecContext *avctx, FFHWBaseEncodePicture *pic)
static int write_filler(AVCodecContext *avctx, uint32_t filler, uint8_t *data, size_t *data_len)
static int write_extra_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
static int init_pic_params(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeInfoKHR *encode_info)
#define PROFILE(name, value)
static av_cold int init_sequence_headers(AVCodecContext *avctx)
static int vulkan_encode_h264_add_nal(AVCodecContext *avctx, CodedBitstreamFragment *au, void *nal_unit)
static int init_base_units(AVCodecContext *avctx)
static av_cold int vulkan_encode_h264_close(AVCodecContext *avctx)
static int write_sequence_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
#define FF_VK_EXT_VIDEO_ENCODE_H264
StdVideoH264LevelIdc ff_vk_h264_level_to_vk(int level_idc)
StdVideoH264ProfileIdc ff_vk_h264_profile_to_vk(int profile)
Convert profile from/to AV to Vulkan.