| 977 | } |
| 978 | |
| 979 | static int init_base_units(AVCodecContext *avctx) |
| 980 | { |
| 981 | int err; |
| 982 | VkResult ret; |
| 983 | VulkanEncodeAV1Context *enc = avctx->priv_data; |
| 984 | FFVulkanEncodeContext *ctx = &enc->common; |
| 985 | FFVulkanContext *s = &ctx->s; |
| 986 | FFVulkanFunctions *vk = &ctx->s.vkfn; |
| 987 | |
| 988 | VkVideoEncodeSessionParametersGetInfoKHR params_info; |
| 989 | VkVideoEncodeSessionParametersFeedbackInfoKHR params_feedback; |
| 990 | |
| 991 | void *data = NULL; |
| 992 | size_t data_size = 0; |
| 993 | |
| 994 | /* Generate SPS/PPS unit info */ |
| 995 | err = init_sequence_headers(avctx); |
| 996 | if (err < 0) { |
| 997 | av_log(avctx, AV_LOG_ERROR, "Unable to initialize sequence header: %s\n", |
| 998 | av_err2str(err)); |
| 999 | return err; |
| 1000 | } |
| 1001 | |
| 1002 | /* Create session parameters from them */ |
| 1003 | err = create_session_params(avctx); |
| 1004 | if (err < 0) |
| 1005 | return err; |
| 1006 | |
| 1007 | params_info = (VkVideoEncodeSessionParametersGetInfoKHR) { |
| 1008 | .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR, |
| 1009 | .videoSessionParameters = ctx->session_params, |
| 1010 | }; |
| 1011 | params_feedback = (VkVideoEncodeSessionParametersFeedbackInfoKHR) { |
| 1012 | .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR, |
| 1013 | }; |
| 1014 | |
| 1015 | ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, ¶ms_info, |
| 1016 | ¶ms_feedback, |
| 1017 | &data_size, data); |
| 1018 | if (ret == VK_INCOMPLETE || |
| 1019 | (ret == VK_SUCCESS) && (data_size > 0)) { |
| 1020 | data = av_mallocz(data_size); |
| 1021 | if (!data) |
| 1022 | return AVERROR(ENOMEM); |
| 1023 | } else { |
| 1024 | av_log(avctx, AV_LOG_ERROR, "Unable to get feedback for AV1 sequence header = %zu\n", |
| 1025 | data_size); |
| 1026 | return err; |
| 1027 | } |
| 1028 | |
| 1029 | ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, ¶ms_info, |
| 1030 | ¶ms_feedback, |
| 1031 | &data_size, data); |
| 1032 | if (ret != VK_SUCCESS) { |
| 1033 | av_log(avctx, AV_LOG_ERROR, "Error writing feedback units\n"); |
| 1034 | return err; |
| 1035 | } |
| 1036 |
no test coverage detected