| 737 | } |
| 738 | |
| 739 | av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext *ctx, |
| 740 | const FFVulkanEncodeDescriptor *vk_desc, |
| 741 | const FFVulkanCodec *codec, |
| 742 | void *codec_caps, void *quality_pnext) |
| 743 | { |
| 744 | int i, err; |
| 745 | VkResult ret; |
| 746 | FFVulkanFunctions *vk = &ctx->s.vkfn; |
| 747 | FFVulkanContext *s = &ctx->s; |
| 748 | FFHWBaseEncodeContext *base_ctx = &ctx->base; |
| 749 | |
| 750 | const AVPixFmtDescriptor *desc; |
| 751 | |
| 752 | VkVideoFormatPropertiesKHR *ret_info; |
| 753 | uint32_t nb_out_fmts = 0; |
| 754 | const uint32_t feedback_flags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR | |
| 755 | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR; |
| 756 | |
| 757 | VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR quality_info; |
| 758 | |
| 759 | VkQueryPoolVideoEncodeFeedbackCreateInfoKHR query_create; |
| 760 | |
| 761 | VkVideoSessionCreateInfoKHR session_create = { |
| 762 | .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR, |
| 763 | }; |
| 764 | VkPhysicalDeviceVideoFormatInfoKHR fmt_info = { |
| 765 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR, |
| 766 | .pNext = &ctx->profile_list, |
| 767 | }; |
| 768 | |
| 769 | if (!avctx->hw_frames_ctx) { |
| 770 | av_log(avctx, AV_LOG_ERROR, "A hardware frames reference is " |
| 771 | "required to associate the encoding device.\n"); |
| 772 | return AVERROR(EINVAL); |
| 773 | } |
| 774 | |
| 775 | ctx->base.op = &vulkan_base_encode_ops; |
| 776 | ctx->codec = codec; |
| 777 | |
| 778 | s->frames_ref = av_buffer_ref(avctx->hw_frames_ctx); |
| 779 | s->frames = (AVHWFramesContext *)s->frames_ref->data; |
| 780 | s->hwfc = s->frames->hwctx; |
| 781 | |
| 782 | s->device = (AVHWDeviceContext *)s->frames->device_ref->data; |
| 783 | s->hwctx = s->device->hwctx; |
| 784 | |
| 785 | desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt); |
| 786 | if (!desc) |
| 787 | return AVERROR(EINVAL); |
| 788 | |
| 789 | s->extensions = ff_vk_extensions_to_mask(s->hwctx->enabled_dev_extensions, |
| 790 | s->hwctx->nb_enabled_dev_extensions); |
| 791 | |
| 792 | if (!(s->extensions & FF_VK_EXT_VIDEO_ENCODE_QUEUE)) { |
| 793 | av_log(avctx, AV_LOG_ERROR, "Device does not support the %s extension!\n", |
| 794 | VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME); |
| 795 | return AVERROR(ENOSYS); |
| 796 | } else if (!(s->extensions & FF_VK_EXT_VIDEO_MAINTENANCE_1)) { |
no test coverage detected