24#define ASPECT_2PLANE (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT)
25#define ASPECT_3PLANE (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT)
38 { VK_FORMAT_B8G8R8A8_UNORM,
AV_PIX_FMT_BGRA, VK_IMAGE_ASPECT_COLOR_BIT },
39 { VK_FORMAT_R8G8B8A8_UNORM,
AV_PIX_FMT_RGBA, VK_IMAGE_ASPECT_COLOR_BIT },
46 { VK_FORMAT_B8G8R8A8_UNORM,
AV_PIX_FMT_BGR0, VK_IMAGE_ASPECT_COLOR_BIT },
47 { VK_FORMAT_R8G8B8A8_UNORM,
AV_PIX_FMT_RGB0, VK_IMAGE_ASPECT_COLOR_BIT },
91 { VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,
AV_PIX_FMT_Y210, VK_IMAGE_ASPECT_COLOR_BIT },
92 { VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,
AV_PIX_FMT_Y212, VK_IMAGE_ASPECT_COLOR_BIT },
93 { VK_FORMAT_G16B16G16R16_422_UNORM,
AV_PIX_FMT_Y216, VK_IMAGE_ASPECT_COLOR_BIT },
96 { VK_FORMAT_A2R10G10B10_UNORM_PACK32,
AV_PIX_FMT_XV30, VK_IMAGE_ASPECT_COLOR_BIT },
97 { VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,
AV_PIX_FMT_XV36, VK_IMAGE_ASPECT_COLOR_BIT },
114 return VK_IMAGE_ASPECT_NONE;
119 if (
desc->nb_components == 1)
120 return VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR;
121 else if (!
desc->log2_chroma_w && !
desc->log2_chroma_h)
122 return VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR;
123 else if (
desc->log2_chroma_w == 1 && !
desc->log2_chroma_h)
124 return VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR;
125 else if (
desc->log2_chroma_w == 1 &&
desc->log2_chroma_h == 1)
126 return VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR;
127 return VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR;
133 case 8:
return VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR;
134 case 10:
return VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR;
135 case 12:
return VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR;
138 return VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR;
144 case STD_VIDEO_H264_LEVEL_IDC_1_0:
return 10;
145 case STD_VIDEO_H264_LEVEL_IDC_1_1:
return 11;
146 case STD_VIDEO_H264_LEVEL_IDC_1_2:
return 12;
147 case STD_VIDEO_H264_LEVEL_IDC_1_3:
return 13;
148 case STD_VIDEO_H264_LEVEL_IDC_2_0:
return 20;
149 case STD_VIDEO_H264_LEVEL_IDC_2_1:
return 21;
150 case STD_VIDEO_H264_LEVEL_IDC_2_2:
return 22;
151 case STD_VIDEO_H264_LEVEL_IDC_3_0:
return 30;
152 case STD_VIDEO_H264_LEVEL_IDC_3_1:
return 31;
153 case STD_VIDEO_H264_LEVEL_IDC_3_2:
return 32;
154 case STD_VIDEO_H264_LEVEL_IDC_4_0:
return 40;
155 case STD_VIDEO_H264_LEVEL_IDC_4_1:
return 41;
156 case STD_VIDEO_H264_LEVEL_IDC_4_2:
return 42;
157 case STD_VIDEO_H264_LEVEL_IDC_5_0:
return 50;
158 case STD_VIDEO_H264_LEVEL_IDC_5_1:
return 51;
159 case STD_VIDEO_H264_LEVEL_IDC_5_2:
return 52;
160 case STD_VIDEO_H264_LEVEL_IDC_6_0:
return 60;
161 case STD_VIDEO_H264_LEVEL_IDC_6_1:
return 61;
163 case STD_VIDEO_H264_LEVEL_IDC_6_2:
return 62;
170 case 10:
return STD_VIDEO_H264_LEVEL_IDC_1_0;
171 case 11:
return STD_VIDEO_H264_LEVEL_IDC_1_1;
172 case 12:
return STD_VIDEO_H264_LEVEL_IDC_1_2;
173 case 13:
return STD_VIDEO_H264_LEVEL_IDC_1_3;
174 case 20:
return STD_VIDEO_H264_LEVEL_IDC_2_0;
175 case 21:
return STD_VIDEO_H264_LEVEL_IDC_2_1;
176 case 22:
return STD_VIDEO_H264_LEVEL_IDC_2_2;
177 case 30:
return STD_VIDEO_H264_LEVEL_IDC_3_0;
178 case 31:
return STD_VIDEO_H264_LEVEL_IDC_3_1;
179 case 32:
return STD_VIDEO_H264_LEVEL_IDC_3_2;
180 case 40:
return STD_VIDEO_H264_LEVEL_IDC_4_0;
181 case 41:
return STD_VIDEO_H264_LEVEL_IDC_4_1;
182 case 42:
return STD_VIDEO_H264_LEVEL_IDC_4_2;
183 case 50:
return STD_VIDEO_H264_LEVEL_IDC_5_0;
184 case 51:
return STD_VIDEO_H264_LEVEL_IDC_5_1;
185 case 52:
return STD_VIDEO_H264_LEVEL_IDC_5_2;
186 case 60:
return STD_VIDEO_H264_LEVEL_IDC_6_0;
187 case 61:
return STD_VIDEO_H264_LEVEL_IDC_6_1;
189 case 62:
return STD_VIDEO_H264_LEVEL_IDC_6_2;
196 case STD_VIDEO_H265_LEVEL_IDC_1_0:
return 10;
197 case STD_VIDEO_H265_LEVEL_IDC_2_0:
return 20;
198 case STD_VIDEO_H265_LEVEL_IDC_2_1:
return 21;
199 case STD_VIDEO_H265_LEVEL_IDC_3_0:
return 30;
200 case STD_VIDEO_H265_LEVEL_IDC_3_1:
return 31;
201 case STD_VIDEO_H265_LEVEL_IDC_4_0:
return 40;
202 case STD_VIDEO_H265_LEVEL_IDC_4_1:
return 41;
203 case STD_VIDEO_H265_LEVEL_IDC_5_0:
return 50;
204 case STD_VIDEO_H265_LEVEL_IDC_5_1:
return 51;
205 case STD_VIDEO_H265_LEVEL_IDC_6_0:
return 60;
206 case STD_VIDEO_H265_LEVEL_IDC_6_1:
return 61;
208 case STD_VIDEO_H265_LEVEL_IDC_6_2:
return 62;
215 case 10:
return STD_VIDEO_H265_LEVEL_IDC_1_0;
216 case 20:
return STD_VIDEO_H265_LEVEL_IDC_2_0;
217 case 21:
return STD_VIDEO_H265_LEVEL_IDC_2_1;
218 case 30:
return STD_VIDEO_H265_LEVEL_IDC_3_0;
219 case 31:
return STD_VIDEO_H265_LEVEL_IDC_3_1;
220 case 40:
return STD_VIDEO_H265_LEVEL_IDC_4_0;
221 case 41:
return STD_VIDEO_H265_LEVEL_IDC_4_1;
222 case 50:
return STD_VIDEO_H265_LEVEL_IDC_5_0;
223 case 51:
return STD_VIDEO_H265_LEVEL_IDC_5_1;
224 case 60:
return STD_VIDEO_H265_LEVEL_IDC_6_0;
225 case 61:
return STD_VIDEO_H265_LEVEL_IDC_6_1;
227 case 62:
return STD_VIDEO_H265_LEVEL_IDC_6_2;
234 case 20:
return STD_VIDEO_AV1_LEVEL_2_0;
235 case 21:
return STD_VIDEO_AV1_LEVEL_2_1;
236 case 22:
return STD_VIDEO_AV1_LEVEL_2_2;
237 case 23:
return STD_VIDEO_AV1_LEVEL_2_3;
238 case 30:
return STD_VIDEO_AV1_LEVEL_3_0;
239 case 31:
return STD_VIDEO_AV1_LEVEL_3_1;
240 case 32:
return STD_VIDEO_AV1_LEVEL_3_2;
241 case 33:
return STD_VIDEO_AV1_LEVEL_3_3;
242 case 40:
return STD_VIDEO_AV1_LEVEL_4_0;
243 case 41:
return STD_VIDEO_AV1_LEVEL_4_1;
244 case 42:
return STD_VIDEO_AV1_LEVEL_4_2;
245 case 43:
return STD_VIDEO_AV1_LEVEL_4_3;
246 case 50:
return STD_VIDEO_AV1_LEVEL_5_0;
247 case 51:
return STD_VIDEO_AV1_LEVEL_5_1;
248 case 52:
return STD_VIDEO_AV1_LEVEL_5_2;
249 case 53:
return STD_VIDEO_AV1_LEVEL_5_3;
250 case 60:
return STD_VIDEO_AV1_LEVEL_6_0;
251 case 61:
return STD_VIDEO_AV1_LEVEL_6_1;
252 case 62:
return STD_VIDEO_AV1_LEVEL_6_2;
253 case 63:
return STD_VIDEO_AV1_LEVEL_6_3;
254 case 70:
return STD_VIDEO_AV1_LEVEL_7_0;
255 case 71:
return STD_VIDEO_AV1_LEVEL_7_1;
256 case 72:
return STD_VIDEO_AV1_LEVEL_7_2;
258 case 73:
return STD_VIDEO_AV1_LEVEL_7_3;
270 default:
return STD_VIDEO_H264_PROFILE_IDC_INVALID;
280 default:
return STD_VIDEO_H265_PROFILE_IDC_INVALID;
290 default:
return STD_VIDEO_AV1_PROFILE_INVALID;
295 VkImageAspectFlags *aspect, VkImage
img,
302 VkImageViewUsageCreateInfo usage_create_info = {
303 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
306 VkImageViewCreateInfo img_view_create_info = {
307 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
308 .pNext = &usage_create_info,
309 .viewType = layered ? VK_IMAGE_VIEW_TYPE_2D_ARRAY :
310 VK_IMAGE_VIEW_TYPE_2D,
313 .components = (VkComponentMapping) {
314 .r = VK_COMPONENT_SWIZZLE_IDENTITY,
315 .g = VK_COMPONENT_SWIZZLE_IDENTITY,
316 .b = VK_COMPONENT_SWIZZLE_IDENTITY,
317 .a = VK_COMPONENT_SWIZZLE_IDENTITY,
319 .subresourceRange = (VkImageSubresourceRange) {
320 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
322 .layerCount = layered ? VK_REMAINING_ARRAY_LAYERS : 1,
327 ret = vk->CreateImageView(
s->hwctx->act_dev, &img_view_create_info,
328 s->hwctx->alloc, view);
329 if (ret != VK_SUCCESS)
332 *aspect = aspect_mask;
370 di->
layout = VK_IMAGE_LAYOUT_UNDEFINED;
382 VkImageTiling tiling,
void *create_pnext,
399 dpb->
dev =
s->hwctx->act_dev;
400 dpb->
alloc =
s->hwctx->alloc;
425 vk->DestroyVideoSessionKHR(
s->hwctx->act_dev, common->
session,
427 common->
session = VK_NULL_HANDLE;
432 vk->FreeMemory(
s->hwctx->act_dev, common->
mem[
i],
s->hwctx->alloc);
449 VkVideoSessionCreateInfoKHR *session_create)
454 VkVideoSessionMemoryRequirementsKHR *mem =
NULL;
455 VkBindVideoSessionMemoryInfoKHR *bind_mem =
NULL;
458 ret = vk->CreateVideoSessionKHR(
s->hwctx->act_dev, session_create,
460 if (ret != VK_SUCCESS) {
466 ret = vk->GetVideoSessionMemoryRequirementsKHR(
s->hwctx->act_dev,
470 if (ret != VK_SUCCESS) {
493 for (
int i = 0;
i < common->
nb_mem;
i++) {
494 mem[
i] = (VkVideoSessionMemoryRequirementsKHR) {
495 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR,
500 ret = vk->GetVideoSessionMemoryRequirementsKHR(
s->hwctx->act_dev,
503 if (ret != VK_SUCCESS) {
510 for (
int i = 0;
i < common->
nb_mem;
i++) {
516 bind_mem[
i] = (VkBindVideoSessionMemoryInfoKHR) {
517 .sType = VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR,
518 .memory = common->
mem[
i],
519 .memoryBindIndex = mem[
i].memoryBindIndex,
521 .memorySize = mem[
i].memoryRequirements.size,
524 av_log(avctx,
AV_LOG_VERBOSE,
"Allocating %"PRIu64
" bytes in bind index %i for video session\n",
525 bind_mem[
i].memorySize, bind_mem[
i].memoryBindIndex);
529 ret = vk->BindVideoSessionMemoryKHR(
s->hwctx->act_dev, common->
session,
530 common->
nb_mem, bind_mem);
531 if (ret != VK_SUCCESS) {
549#if CONFIG_VULKAN_SEG_GATHER
550typedef struct SegGatherPushData {
551 VkDeviceAddress sparse;
552 VkDeviceAddress compacted;
553 VkDeviceAddress offset_addr;
557extern const unsigned char ff_seg_gather_comp_spv_data[];
558extern const unsigned int ff_seg_gather_comp_spv_len;
567 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
568 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
573 (uint32_t []) { 256, 1, 1 }, 0);
575 VK_SHADER_STAGE_COMPUTE_BIT);
579 ff_seg_gather_comp_spv_len,
"main"));
589 FFVkBuffer *compacted,
size_t compacted_offset,
590 VkDeviceAddress offset_addr)
594 SegGatherPushData pd = {
596 .compacted = compacted->
address + compacted_offset,
597 .offset_addr = offset_addr,
598 .slot_size = slot_size,
601 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
602 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
603 .pMemoryBarriers = &(VkMemoryBarrier2) {
604 .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
605 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
606 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
607 .dstStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
608 .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT |
609 VK_ACCESS_2_SHADER_WRITE_BIT,
611 .memoryBarrierCount = 1,
615 sizes, sizes_offset, (nb_segs + 1)*
sizeof(uint32_t),
616 VK_FORMAT_UNDEFINED));
620 vk->CmdDispatch(exec->
buf, nb_segs, 1, 1);
623 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
624 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
625 .pMemoryBarriers = &(VkMemoryBarrier2) {
626 .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
627 .srcStageMask = VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
628 .srcAccessMask = VK_ACCESS_2_SHADER_WRITE_BIT,
629 .dstStageMask = VK_PIPELINE_STAGE_2_HOST_BIT,
630 .dstAccessMask = VK_ACCESS_2_HOST_READ_BIT,
632 .memoryBarrierCount = 1,
705 }
else if (err >= 0) {
723 }
else if (err !=
AVERROR(EAGAIN)) {
static double val(void *priv, double ch)
static const char *const format[]
static int submit_frame(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *frame)
#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
int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame)
Called by encoders to get the next frame for encoding.
static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt)
#define AV_CODEC_FLAG_COPY_OPAQUE
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
#define AVERROR_EXTERNAL
Generic error in an external library.
#define AVERROR_EOF
End of file.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_VERBOSE
Detailed information.
static const int sizes[][2]
int ff_vk_shader_load(FFVulkanShader *shd, VkPipelineStageFlags stage, VkSpecializationInfo *spec, uint32_t wg_size[3], uint32_t required_subgroup_size)
Initialize a shader object.
void ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, const FFVulkanDescriptorSetBinding *desc, int nb, int singular)
Add descriptor to a shader.
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.
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, const FFVulkanShader *shd)
Bind a shader.
int ff_vk_shader_update_desc_buffer(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, int bind, int elem, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len, VkFormat fmt)
Update a descriptor in a buffer with a buffer.
int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, const char *spirv, size_t spirv_len, const char *entrypoint)
Link a shader into an executable.
void ff_vk_shader_update_push_const(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Update push constant in a shader.
void * av_calloc(size_t nmemb, size_t size)
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.
int flags
AV_CODEC_FLAG_*.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
void * opaque
Frame owner's private data.
AVBufferRef * opaque_ref
Frame owner's private data.
int64_t duration
Duration of the frame, in the same units as pts.
This structure stores compressed data.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
VkDevice act_dev
Active device.
Frame loop for compute encoders.
int(* get_packet)(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt)
struct FFVkEncodeLoop::@355156236361072070030016171062102261122252313307 * frames
int(* submit_frame)(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *frame)
FFVkExecContext * contexts
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
AVVulkanDeviceContext * hwctx
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.
int ff_vk_encode_loop_receive_packet(AVCodecContext *avctx, FFVkEncodeLoop *l, AVPacket *pkt)
Call from FFCodec.cb.receive_packet; the packet metadata is carried from the submitted frame to its p...
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)
void ff_vk_encode_loop_uninit(FFVkEncodeLoop *l)
static int loop_get_packet(AVCodecContext *avctx, FFVkEncodeLoop *l, AVPacket *pkt)
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
static int loop_oldest_done(FFVkEncodeLoop *l)
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)
void ff_vk_encode_loop_flush(AVCodecContext *avctx, FFVkEncodeLoop *l)
Waits for and discards every frame in flight.
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.
int ff_vk_encode_loop_init(FFVulkanContext *s, FFVkExecPool *pool, FFVkEncodeLoop *l, int(*submit_frame)(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *frame), int(*get_packet)(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt))
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.
int ff_vk_seg_gather_init(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Packs fixed-stride segment slots back to back into a contiguous buffer.
int ff_vk_seg_gather(FFVulkanContext *s, FFVkExecContext *exec, FFVulkanShader *shd, FFVkBuffer *sizes, size_t sizes_offset, uint32_t nb_segs, FFVkBuffer *sparse, uint32_t slot_size, FFVkBuffer *compacted, size_t compacted_offset, VkDeviceAddress offset_addr)
Gathers nb_segs slots of slot_size bytes from sparse into compacted, with the segment sizes given as ...