22#define ASPECT_2PLANE (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT)
23#define ASPECT_3PLANE (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT)
36 { VK_FORMAT_B8G8R8A8_UNORM,
AV_PIX_FMT_BGRA, VK_IMAGE_ASPECT_COLOR_BIT },
37 { VK_FORMAT_R8G8B8A8_UNORM,
AV_PIX_FMT_RGBA, VK_IMAGE_ASPECT_COLOR_BIT },
44 { VK_FORMAT_B8G8R8A8_UNORM,
AV_PIX_FMT_BGR0, VK_IMAGE_ASPECT_COLOR_BIT },
45 { VK_FORMAT_R8G8B8A8_UNORM,
AV_PIX_FMT_RGB0, VK_IMAGE_ASPECT_COLOR_BIT },
89 { VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,
AV_PIX_FMT_Y210, VK_IMAGE_ASPECT_COLOR_BIT },
90 { VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,
AV_PIX_FMT_Y212, VK_IMAGE_ASPECT_COLOR_BIT },
91 { VK_FORMAT_G16B16G16R16_422_UNORM,
AV_PIX_FMT_Y216, VK_IMAGE_ASPECT_COLOR_BIT },
94 { VK_FORMAT_A2R10G10B10_UNORM_PACK32,
AV_PIX_FMT_XV30, VK_IMAGE_ASPECT_COLOR_BIT },
95 { VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,
AV_PIX_FMT_XV36, VK_IMAGE_ASPECT_COLOR_BIT },
112 return VK_IMAGE_ASPECT_NONE;
117 if (
desc->nb_components == 1)
118 return VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR;
119 else if (!
desc->log2_chroma_w && !
desc->log2_chroma_h)
120 return VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR;
121 else if (!
desc->log2_chroma_w &&
desc->log2_chroma_h == 1)
122 return VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR;
123 else if (
desc->log2_chroma_w == 1 &&
desc->log2_chroma_h == 1)
124 return VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR;
125 return VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR;
131 case 8:
return VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR;
132 case 10:
return VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR;
133 case 12:
return VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR;
136 return VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR;
142 case STD_VIDEO_H264_LEVEL_IDC_1_0:
return 10;
143 case STD_VIDEO_H264_LEVEL_IDC_1_1:
return 11;
144 case STD_VIDEO_H264_LEVEL_IDC_1_2:
return 12;
145 case STD_VIDEO_H264_LEVEL_IDC_1_3:
return 13;
146 case STD_VIDEO_H264_LEVEL_IDC_2_0:
return 20;
147 case STD_VIDEO_H264_LEVEL_IDC_2_1:
return 21;
148 case STD_VIDEO_H264_LEVEL_IDC_2_2:
return 22;
149 case STD_VIDEO_H264_LEVEL_IDC_3_0:
return 30;
150 case STD_VIDEO_H264_LEVEL_IDC_3_1:
return 31;
151 case STD_VIDEO_H264_LEVEL_IDC_3_2:
return 32;
152 case STD_VIDEO_H264_LEVEL_IDC_4_0:
return 40;
153 case STD_VIDEO_H264_LEVEL_IDC_4_1:
return 41;
154 case STD_VIDEO_H264_LEVEL_IDC_4_2:
return 42;
155 case STD_VIDEO_H264_LEVEL_IDC_5_0:
return 50;
156 case STD_VIDEO_H264_LEVEL_IDC_5_1:
return 51;
157 case STD_VIDEO_H264_LEVEL_IDC_5_2:
return 52;
158 case STD_VIDEO_H264_LEVEL_IDC_6_0:
return 60;
159 case STD_VIDEO_H264_LEVEL_IDC_6_1:
return 61;
161 case STD_VIDEO_H264_LEVEL_IDC_6_2:
return 62;
168 case 10:
return STD_VIDEO_H264_LEVEL_IDC_1_0;
169 case 11:
return STD_VIDEO_H264_LEVEL_IDC_1_1;
170 case 12:
return STD_VIDEO_H264_LEVEL_IDC_1_2;
171 case 13:
return STD_VIDEO_H264_LEVEL_IDC_1_3;
172 case 20:
return STD_VIDEO_H264_LEVEL_IDC_2_0;
173 case 21:
return STD_VIDEO_H264_LEVEL_IDC_2_1;
174 case 22:
return STD_VIDEO_H264_LEVEL_IDC_2_2;
175 case 30:
return STD_VIDEO_H264_LEVEL_IDC_3_0;
176 case 31:
return STD_VIDEO_H264_LEVEL_IDC_3_1;
177 case 32:
return STD_VIDEO_H264_LEVEL_IDC_3_2;
178 case 40:
return STD_VIDEO_H264_LEVEL_IDC_4_0;
179 case 41:
return STD_VIDEO_H264_LEVEL_IDC_4_1;
180 case 42:
return STD_VIDEO_H264_LEVEL_IDC_4_2;
181 case 50:
return STD_VIDEO_H264_LEVEL_IDC_5_0;
182 case 51:
return STD_VIDEO_H264_LEVEL_IDC_5_1;
183 case 52:
return STD_VIDEO_H264_LEVEL_IDC_5_2;
184 case 60:
return STD_VIDEO_H264_LEVEL_IDC_6_0;
185 case 61:
return STD_VIDEO_H264_LEVEL_IDC_6_1;
187 case 62:
return STD_VIDEO_H264_LEVEL_IDC_6_2;
194 case STD_VIDEO_H265_LEVEL_IDC_1_0:
return 10;
195 case STD_VIDEO_H265_LEVEL_IDC_2_0:
return 20;
196 case STD_VIDEO_H265_LEVEL_IDC_2_1:
return 21;
197 case STD_VIDEO_H265_LEVEL_IDC_3_0:
return 30;
198 case STD_VIDEO_H265_LEVEL_IDC_3_1:
return 31;
199 case STD_VIDEO_H265_LEVEL_IDC_4_0:
return 40;
200 case STD_VIDEO_H265_LEVEL_IDC_4_1:
return 41;
201 case STD_VIDEO_H265_LEVEL_IDC_5_0:
return 50;
202 case STD_VIDEO_H265_LEVEL_IDC_5_1:
return 51;
203 case STD_VIDEO_H265_LEVEL_IDC_6_0:
return 60;
204 case STD_VIDEO_H265_LEVEL_IDC_6_1:
return 61;
206 case STD_VIDEO_H265_LEVEL_IDC_6_2:
return 62;
213 case 10:
return STD_VIDEO_H265_LEVEL_IDC_1_0;
214 case 20:
return STD_VIDEO_H265_LEVEL_IDC_2_0;
215 case 21:
return STD_VIDEO_H265_LEVEL_IDC_2_1;
216 case 30:
return STD_VIDEO_H265_LEVEL_IDC_3_0;
217 case 31:
return STD_VIDEO_H265_LEVEL_IDC_3_1;
218 case 40:
return STD_VIDEO_H265_LEVEL_IDC_4_0;
219 case 41:
return STD_VIDEO_H265_LEVEL_IDC_4_1;
220 case 50:
return STD_VIDEO_H265_LEVEL_IDC_5_0;
221 case 51:
return STD_VIDEO_H265_LEVEL_IDC_5_1;
222 case 60:
return STD_VIDEO_H265_LEVEL_IDC_6_0;
223 case 61:
return STD_VIDEO_H265_LEVEL_IDC_6_1;
225 case 62:
return STD_VIDEO_H265_LEVEL_IDC_6_2;
232 case 20:
return STD_VIDEO_AV1_LEVEL_2_0;
233 case 21:
return STD_VIDEO_AV1_LEVEL_2_1;
234 case 22:
return STD_VIDEO_AV1_LEVEL_2_2;
235 case 23:
return STD_VIDEO_AV1_LEVEL_2_3;
236 case 30:
return STD_VIDEO_AV1_LEVEL_3_0;
237 case 31:
return STD_VIDEO_AV1_LEVEL_3_1;
238 case 32:
return STD_VIDEO_AV1_LEVEL_3_2;
239 case 33:
return STD_VIDEO_AV1_LEVEL_3_3;
240 case 40:
return STD_VIDEO_AV1_LEVEL_4_0;
241 case 41:
return STD_VIDEO_AV1_LEVEL_4_1;
242 case 42:
return STD_VIDEO_AV1_LEVEL_4_2;
243 case 43:
return STD_VIDEO_AV1_LEVEL_4_3;
244 case 50:
return STD_VIDEO_AV1_LEVEL_5_0;
245 case 51:
return STD_VIDEO_AV1_LEVEL_5_1;
246 case 52:
return STD_VIDEO_AV1_LEVEL_5_2;
247 case 53:
return STD_VIDEO_AV1_LEVEL_5_3;
248 case 60:
return STD_VIDEO_AV1_LEVEL_6_0;
249 case 61:
return STD_VIDEO_AV1_LEVEL_6_1;
250 case 62:
return STD_VIDEO_AV1_LEVEL_6_2;
251 case 63:
return STD_VIDEO_AV1_LEVEL_6_3;
252 case 70:
return STD_VIDEO_AV1_LEVEL_7_0;
253 case 71:
return STD_VIDEO_AV1_LEVEL_7_1;
254 case 72:
return STD_VIDEO_AV1_LEVEL_7_2;
256 case 73:
return STD_VIDEO_AV1_LEVEL_7_3;
268 default:
return STD_VIDEO_H264_PROFILE_IDC_INVALID;
278 default:
return STD_VIDEO_H265_PROFILE_IDC_INVALID;
288 default:
return STD_VIDEO_AV1_PROFILE_INVALID;
293 VkImageAspectFlags *aspect, VkImage
img,
300 VkImageViewUsageCreateInfo usage_create_info = {
301 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
304 VkImageViewCreateInfo img_view_create_info = {
305 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
306 .pNext = &usage_create_info,
307 .viewType = layered ? VK_IMAGE_VIEW_TYPE_2D_ARRAY :
308 VK_IMAGE_VIEW_TYPE_2D,
311 .components = (VkComponentMapping) {
312 .r = VK_COMPONENT_SWIZZLE_IDENTITY,
313 .g = VK_COMPONENT_SWIZZLE_IDENTITY,
314 .b = VK_COMPONENT_SWIZZLE_IDENTITY,
315 .a = VK_COMPONENT_SWIZZLE_IDENTITY,
317 .subresourceRange = (VkImageSubresourceRange) {
318 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
320 .layerCount = layered ? VK_REMAINING_ARRAY_LAYERS : 1,
325 ret = vk->CreateImageView(
s->hwctx->act_dev, &img_view_create_info,
326 s->hwctx->alloc, view);
327 if (ret != VK_SUCCESS)
330 *aspect = aspect_mask;
368 di->
layout = VK_IMAGE_LAYOUT_UNDEFINED;
380 VkImageTiling tiling,
void *create_pnext,
397 dpb->
dev =
s->hwctx->act_dev;
398 dpb->
alloc =
s->hwctx->alloc;
423 vk->DestroyVideoSessionKHR(
s->hwctx->act_dev, common->
session,
425 common->
session = VK_NULL_HANDLE;
430 vk->FreeMemory(
s->hwctx->act_dev, common->
mem[
i],
s->hwctx->alloc);
447 VkVideoSessionCreateInfoKHR *session_create)
452 VkVideoSessionMemoryRequirementsKHR *mem =
NULL;
453 VkBindVideoSessionMemoryInfoKHR *bind_mem =
NULL;
456 ret = vk->CreateVideoSessionKHR(
s->hwctx->act_dev, session_create,
458 if (ret != VK_SUCCESS) {
464 ret = vk->GetVideoSessionMemoryRequirementsKHR(
s->hwctx->act_dev,
468 if (ret != VK_SUCCESS) {
491 for (
int i = 0;
i < common->
nb_mem;
i++) {
492 mem[
i] = (VkVideoSessionMemoryRequirementsKHR) {
493 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR,
498 ret = vk->GetVideoSessionMemoryRequirementsKHR(
s->hwctx->act_dev,
501 if (ret != VK_SUCCESS) {
508 for (
int i = 0;
i < common->
nb_mem;
i++) {
514 bind_mem[
i] = (VkBindVideoSessionMemoryInfoKHR) {
515 .sType = VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR,
516 .memory = common->
mem[
i],
517 .memoryBindIndex = mem[
i].memoryBindIndex,
519 .memorySize = mem[
i].memoryRequirements.size,
522 av_log(avctx,
AV_LOG_VERBOSE,
"Allocating %"PRIu64
" bytes in bind index %i for video session\n",
523 bind_mem[
i].memorySize, bind_mem[
i].memoryBindIndex);
527 ret = vk->BindVideoSessionMemoryKHR(
s->hwctx->act_dev, common->
session,
528 common->
nb_mem, bind_mem);
529 if (ret != VK_SUCCESS) {
static const char *const format[]
#define i(width, name, range_min, range_max)
#define AV_PROFILE_AV1_HIGH
#define AV_PROFILE_H264_MAIN
#define AV_PROFILE_H264_HIGH_444_PREDICTIVE
#define AV_PROFILE_HEVC_REXT
#define AV_PROFILE_HEVC_MAIN
#define AV_PROFILE_HEVC_MAIN_10
#define AV_PROFILE_H264_HIGH
#define AV_PROFILE_H264_CONSTRAINED_BASELINE
#define AV_PROFILE_AV1_MAIN
#define AV_PROFILE_AV1_PROFESSIONAL
#define AV_PROFILE_H264_BASELINE
#define AVERROR_EXTERNAL
Generic error in an external library.
#define AV_LOG_VERBOSE
Detailed information.
void ff_vk_image_free(FFVulkanContext *s, VkImage *img, VkDeviceMemory *mem)
Free an image created by ff_vk_image_create(); all GPU use must have completed.
int ff_vk_alloc_mem(FFVulkanContext *s, VkMemoryRequirements *req, VkMemoryPropertyFlagBits req_flags, void *alloc_extension, VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
int ff_vk_image_create(FFVulkanContext *s, VkImage *img, VkDeviceMemory *mem, int width, int height, VkFormat format, int nb_layers, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, void *create_pnext)
Memory/buffer/image allocation helpers.
Memory handling functions.
#define AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_X2RGB10
#define AV_PIX_FMT_GRAYF32
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
#define AV_PIX_FMT_BGR565
#define AV_PIX_FMT_RGB565
#define AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GBRAPF32
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
static AVRefStructPool * av_refstruct_pool_alloc_ext(size_t size, unsigned flags, void *opaque, int(*init_cb)(AVRefStructOpaque opaque, void *obj), void(*reset_cb)(AVRefStructOpaque opaque, void *obj), void(*free_entry_cb)(AVRefStructOpaque opaque, void *obj), void(*free_cb)(AVRefStructOpaque opaque))
A wrapper around av_refstruct_pool_alloc_ext_c() for the common case of a non-const qualified opaque.
#define FF_ARRAY_ELEMS(a)
main external API structure.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
enum AVPixelFormat pixfmt
VkImageAspectFlags aspect
VkVideoSessionKHR session
FFVkVideoDPBImage * layered_img
VkImageAspectFlags aspect
AVRefStructPool * img_pool
PFN_vkDestroyImage destroy_image
PFN_vkFreeMemory free_memory
const VkAllocationCallbacks * alloc
PFN_vkDestroyImageView destroy_image_view
RefStruct is an API for creating reference-counted objects with minimal overhead.
VkVideoComponentBitDepthFlagBitsKHR ff_vk_depth_from_av_depth(int depth)
Get Vulkan's bit depth from an [8:12] integer.
VkVideoChromaSubsamplingFlagBitsKHR ff_vk_subsampling_from_av_desc(const AVPixFmtDescriptor *desc)
Get Vulkan's chroma subsampling from a pixfmt descriptor.
int ff_vk_h265_level_to_av(StdVideoH265LevelIdc level)
static const struct FFVkFormatMapEntry vk_format_map[]
int ff_vk_create_view(FFVulkanContext *s, VkImageView *view, VkImageAspectFlags *aspect, VkImage img, VkFormat vkf, VkImageUsageFlags usage, int layered)
Creates image views for video frames.
StdVideoH265ProfileIdc ff_vk_h265_profile_to_vk(int profile)
int ff_vk_h264_level_to_av(StdVideoH264LevelIdc level)
Convert level from Vulkan to AV.
av_cold void ff_vk_video_common_uninit(FFVulkanContext *s, FFVkVideoCommon *common)
Free video session and required resources.
StdVideoH265LevelIdc ff_vk_h265_level_to_vk(int level_idc)
StdVideoAV1Profile ff_vk_av1_profile_to_vk(int profile)
static int dpb_image_init(AVRefStructOpaque opaque, void *obj)
static void dpb_pool_free(AVRefStructOpaque opaque)
av_cold int ff_vk_video_dpb_init(FFVulkanContext *s, FFVkVideoCommon *common, VkFormat format, VkImageUsageFlags usage, VkImageTiling tiling, void *create_pnext, int width, int height, int nb_layers)
Initialize the internal DPB image pool.
static const int nb_vk_format_map
enum AVPixelFormat ff_vk_pix_fmt_from_vkfmt(VkFormat vkf)
Get pixfmt from a Vulkan format.
static void dpb_image_free(AVRefStructOpaque opaque, void *obj)
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.
VkImageAspectFlags ff_vk_aspect_bits_from_vkfmt(VkFormat vkf)
Get aspect bits which include all planes from a VkFormat.
StdVideoAV1Level ff_vk_av1_level_to_vk(int level)
av_cold int ff_vk_video_common_init(AVCodecContext *avctx, FFVulkanContext *s, FFVkVideoCommon *common, VkVideoSessionCreateInfoKHR *session_create)
Initialize video session, allocating and binding necessary memory.