| 1088 | } |
| 1089 | |
| 1090 | static int init_base_units(AVCodecContext *avctx) |
| 1091 | { |
| 1092 | int err; |
| 1093 | VkResult ret; |
| 1094 | VulkanEncodeH264Context *enc = avctx->priv_data; |
| 1095 | FFVulkanEncodeContext *ctx = &enc->common; |
| 1096 | FFVulkanContext *s = &ctx->s; |
| 1097 | FFVulkanFunctions *vk = &ctx->s.vkfn; |
| 1098 | |
| 1099 | VkVideoEncodeH264SessionParametersGetInfoKHR h264_params_info; |
| 1100 | VkVideoEncodeSessionParametersGetInfoKHR params_info; |
| 1101 | VkVideoEncodeH264SessionParametersFeedbackInfoKHR h264_params_feedback; |
| 1102 | VkVideoEncodeSessionParametersFeedbackInfoKHR params_feedback; |
| 1103 | |
| 1104 | void *data = NULL; |
| 1105 | size_t data_size = 0; |
| 1106 | |
| 1107 | /* Generate SPS/PPS unit info */ |
| 1108 | err = init_sequence_headers(avctx); |
| 1109 | if (err < 0) { |
| 1110 | av_log(avctx, AV_LOG_ERROR, "Unable to initialize SPS/PPS units: %s\n", |
| 1111 | av_err2str(err)); |
| 1112 | return err; |
| 1113 | } |
| 1114 | |
| 1115 | /* Create session parameters from them */ |
| 1116 | err = create_session_params(avctx); |
| 1117 | if (err < 0) |
| 1118 | return err; |
| 1119 | |
| 1120 | h264_params_info = (VkVideoEncodeH264SessionParametersGetInfoKHR) { |
| 1121 | .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR, |
| 1122 | .writeStdSPS = 1, |
| 1123 | .writeStdPPS = 1, |
| 1124 | .stdSPSId = enc->units.raw_sps.seq_parameter_set_id, |
| 1125 | .stdPPSId = enc->units.raw_pps.pic_parameter_set_id, |
| 1126 | }; |
| 1127 | params_info = (VkVideoEncodeSessionParametersGetInfoKHR) { |
| 1128 | .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR, |
| 1129 | .pNext = &h264_params_info, |
| 1130 | .videoSessionParameters = ctx->session_params, |
| 1131 | }; |
| 1132 | |
| 1133 | h264_params_feedback = (VkVideoEncodeH264SessionParametersFeedbackInfoKHR) { |
| 1134 | .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_FEEDBACK_INFO_KHR, |
| 1135 | }; |
| 1136 | params_feedback = (VkVideoEncodeSessionParametersFeedbackInfoKHR) { |
| 1137 | .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR, |
| 1138 | .pNext = &h264_params_feedback, |
| 1139 | }; |
| 1140 | |
| 1141 | ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, ¶ms_info, |
| 1142 | ¶ms_feedback, |
| 1143 | &data_size, data); |
| 1144 | if (ret == VK_INCOMPLETE || |
| 1145 | (ret == VK_SUCCESS) && (data_size > 0)) { |
| 1146 | data = av_mallocz(data_size); |
| 1147 | if (!data) |
no test coverage detected