mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-28 20:53:54 +02:00
hwcontext_vulkan: add support for Vulkan encoding
This commit is contained in:
parent
ca591e6b50
commit
2ce0e51503
@ -437,8 +437,11 @@ static const VulkanOptExtension optional_device_exts[] = {
|
||||
|
||||
/* Video encoding/decoding */
|
||||
{ VK_KHR_VIDEO_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_QUEUE },
|
||||
{ VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_ENCODE_QUEUE },
|
||||
{ VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_QUEUE },
|
||||
{ VK_KHR_VIDEO_ENCODE_H264_EXTENSION_NAME, FF_VK_EXT_VIDEO_ENCODE_H264 },
|
||||
{ VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_H264 },
|
||||
{ VK_KHR_VIDEO_ENCODE_H265_EXTENSION_NAME, FF_VK_EXT_VIDEO_ENCODE_H265 },
|
||||
{ VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_H265 },
|
||||
{ VK_KHR_VIDEO_DECODE_AV1_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_AV1 },
|
||||
};
|
||||
@ -2078,6 +2081,7 @@ enum PrepMode {
|
||||
PREP_MODE_EXTERNAL_IMPORT,
|
||||
PREP_MODE_DECODING_DST,
|
||||
PREP_MODE_DECODING_DPB,
|
||||
PREP_MODE_ENCODING_DPB,
|
||||
};
|
||||
|
||||
static int prepare_frame(AVHWFramesContext *hwfc, FFVkExecPool *ectx,
|
||||
@ -2139,6 +2143,10 @@ static int prepare_frame(AVHWFramesContext *hwfc, FFVkExecPool *ectx,
|
||||
new_layout = VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR;
|
||||
new_access = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
break;
|
||||
case PREP_MODE_ENCODING_DPB:
|
||||
new_layout = VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR;
|
||||
new_access = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
break;
|
||||
}
|
||||
|
||||
ff_vk_frame_barrier(&p->vkctx, exec, &tmp_frame, img_bar, &nb_img_bar,
|
||||
@ -2399,6 +2407,8 @@ static AVBufferRef *vulkan_pool_alloc(void *opaque, size_t size)
|
||||
err = prepare_frame(hwfc, &fp->compute_exec, f, PREP_MODE_DECODING_DPB);
|
||||
else if (hwctx->usage & VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)
|
||||
err = prepare_frame(hwfc, &fp->compute_exec, f, PREP_MODE_DECODING_DST);
|
||||
else if (hwctx->usage & VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR)
|
||||
err = prepare_frame(hwfc, &fp->compute_exec, f, PREP_MODE_ENCODING_DPB);
|
||||
else
|
||||
err = prepare_frame(hwfc, &fp->compute_exec, f, PREP_MODE_WRITE);
|
||||
if (err)
|
||||
|
@ -49,6 +49,10 @@ typedef enum FFVulkanExtensions {
|
||||
FF_VK_EXT_OPTICAL_FLOW = 1ULL << 17, /* VK_NV_optical_flow */
|
||||
FF_VK_EXT_SHADER_OBJECT = 1ULL << 18, /* VK_EXT_shader_object */
|
||||
|
||||
FF_VK_EXT_VIDEO_ENCODE_QUEUE = 1ULL << 28, /* VK_KHR_video_encode_queue */
|
||||
FF_VK_EXT_VIDEO_ENCODE_H264 = 1ULL << 29, /* VK_KHR_video_encode_h264 */
|
||||
FF_VK_EXT_VIDEO_ENCODE_H265 = 1ULL << 30, /* VK_KHR_video_encode_h265 */
|
||||
|
||||
FF_VK_EXT_NO_FLAG = 1ULL << 31,
|
||||
} FFVulkanExtensions;
|
||||
|
||||
@ -196,6 +200,11 @@ typedef enum FFVulkanExtensions {
|
||||
\
|
||||
/* Video decoding */ \
|
||||
MACRO(1, 1, FF_VK_EXT_VIDEO_DECODE_QUEUE, CmdDecodeVideoKHR) \
|
||||
\
|
||||
/* Video encoding */ \
|
||||
MACRO(1, 1, FF_VK_EXT_VIDEO_ENCODE_QUEUE, CmdEncodeVideoKHR) \
|
||||
MACRO(1, 1, FF_VK_EXT_VIDEO_ENCODE_QUEUE, GetEncodedVideoSessionParametersKHR) \
|
||||
MACRO(1, 0, FF_VK_EXT_VIDEO_ENCODE_QUEUE, GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR) \
|
||||
\
|
||||
/* Pipeline */ \
|
||||
MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreatePipelineLayout) \
|
||||
|
@ -57,8 +57,11 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions,
|
||||
#endif
|
||||
{ VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER, },
|
||||
{ VK_KHR_VIDEO_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_QUEUE },
|
||||
{ VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_ENCODE_QUEUE },
|
||||
{ VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_QUEUE },
|
||||
{ VK_KHR_VIDEO_ENCODE_H264_EXTENSION_NAME, FF_VK_EXT_VIDEO_ENCODE_H264 },
|
||||
{ VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_H264 },
|
||||
{ VK_KHR_VIDEO_ENCODE_H265_EXTENSION_NAME, FF_VK_EXT_VIDEO_ENCODE_H265 },
|
||||
{ VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_H265 },
|
||||
{ VK_KHR_VIDEO_DECODE_AV1_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_AV1 },
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user