FFmpeg
Loading...
Searching...
No Matches
vulkan_video.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "config.h"
20#include "libavutil/mem.h"
21#include "encode.h"
22#include "vulkan_video.h"
23
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)
26
27static const struct FFVkFormatMapEntry {
30 VkImageAspectFlags aspect;
31} vk_format_map[] = {
32 /* Gray formats */
33 { VK_FORMAT_R8_UNORM, AV_PIX_FMT_GRAY8, VK_IMAGE_ASPECT_COLOR_BIT },
34 { VK_FORMAT_R16_UNORM, AV_PIX_FMT_GRAY16, VK_IMAGE_ASPECT_COLOR_BIT },
35 { VK_FORMAT_R32_SFLOAT, AV_PIX_FMT_GRAYF32, VK_IMAGE_ASPECT_COLOR_BIT },
36
37 /* RGB formats */
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 },
40 { VK_FORMAT_R8G8B8_UNORM, AV_PIX_FMT_RGB24, VK_IMAGE_ASPECT_COLOR_BIT },
41 { VK_FORMAT_B8G8R8_UNORM, AV_PIX_FMT_BGR24, VK_IMAGE_ASPECT_COLOR_BIT },
42 { VK_FORMAT_R16G16B16_UNORM, AV_PIX_FMT_RGB48, VK_IMAGE_ASPECT_COLOR_BIT },
43 { VK_FORMAT_R16G16B16A16_UNORM, AV_PIX_FMT_RGBA64, VK_IMAGE_ASPECT_COLOR_BIT },
44 { VK_FORMAT_R5G6B5_UNORM_PACK16, AV_PIX_FMT_RGB565, VK_IMAGE_ASPECT_COLOR_BIT },
45 { VK_FORMAT_B5G6R5_UNORM_PACK16, AV_PIX_FMT_BGR565, 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 },
48 { VK_FORMAT_A2R10G10B10_UNORM_PACK32, AV_PIX_FMT_X2RGB10, VK_IMAGE_ASPECT_COLOR_BIT },
49
50 /* Planar RGB */
51 { VK_FORMAT_R8_UNORM, AV_PIX_FMT_GBRAP, VK_IMAGE_ASPECT_COLOR_BIT },
52 { VK_FORMAT_R16_UNORM, AV_PIX_FMT_GBRAP16, VK_IMAGE_ASPECT_COLOR_BIT },
53 { VK_FORMAT_R32_SFLOAT, AV_PIX_FMT_GBRPF32, VK_IMAGE_ASPECT_COLOR_BIT },
54 { VK_FORMAT_R32_SFLOAT, AV_PIX_FMT_GBRAPF32, VK_IMAGE_ASPECT_COLOR_BIT },
55
56 /* Two-plane 420 YUV at 8, 10, 12 and 16 bits */
57 { VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, AV_PIX_FMT_NV12, ASPECT_2PLANE },
58 { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, AV_PIX_FMT_P010, ASPECT_2PLANE },
59 { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16, AV_PIX_FMT_P012, ASPECT_2PLANE },
60 { VK_FORMAT_G16_B16R16_2PLANE_420_UNORM, AV_PIX_FMT_P016, ASPECT_2PLANE },
61
62 /* Two-plane 422 YUV at 8, 10 and 16 bits */
63 { VK_FORMAT_G8_B8R8_2PLANE_422_UNORM, AV_PIX_FMT_NV16, ASPECT_2PLANE },
64 { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, AV_PIX_FMT_P210, ASPECT_2PLANE },
65 { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, AV_PIX_FMT_P212, ASPECT_2PLANE },
66 { VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, AV_PIX_FMT_P216, ASPECT_2PLANE },
67
68 /* Two-plane 444 YUV at 8, 10 and 16 bits */
69 { VK_FORMAT_G8_B8R8_2PLANE_444_UNORM, AV_PIX_FMT_NV24, ASPECT_2PLANE },
70 { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16, AV_PIX_FMT_P410, ASPECT_2PLANE },
71 { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16, AV_PIX_FMT_P412, ASPECT_2PLANE },
72 { VK_FORMAT_G16_B16R16_2PLANE_444_UNORM, AV_PIX_FMT_P416, ASPECT_2PLANE },
73
74 /* Three-plane 420, 422, 444 at 8, 10, 12 and 16 bits */
75 { VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P, ASPECT_3PLANE },
76 { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P10, ASPECT_3PLANE },
77 { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P12, ASPECT_3PLANE },
78 { VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, AV_PIX_FMT_YUV420P16, ASPECT_3PLANE },
79 { VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P, ASPECT_3PLANE },
80 { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P10, ASPECT_3PLANE },
81 { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P12, ASPECT_3PLANE },
82 { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, AV_PIX_FMT_YUV422P16, ASPECT_3PLANE },
83 { VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P, ASPECT_3PLANE },
84 { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P10, ASPECT_3PLANE },
85 { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P12, ASPECT_3PLANE },
86 { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, AV_PIX_FMT_YUV444P16, ASPECT_3PLANE },
87
88 /* Single plane 422 at 8, 10, 12 and 16 bits */
89 { VK_FORMAT_G8B8G8R8_422_UNORM, AV_PIX_FMT_YUYV422, VK_IMAGE_ASPECT_COLOR_BIT },
90 { VK_FORMAT_B8G8R8G8_422_UNORM, AV_PIX_FMT_UYVY422, 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 },
94
95 /* Single plane 444 at 10 and 12 bits */
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 },
98};
100
102{
103 for (int i = 0; i < nb_vk_format_map; i++)
104 if (vk_format_map[i].vkf == vkf)
105 return vk_format_map[i].pixfmt;
106 return AV_PIX_FMT_NONE;
107}
108
110{
111 for (int i = 0; i < nb_vk_format_map; i++)
112 if (vk_format_map[i].vkf == vkf)
113 return vk_format_map[i].aspect;
114 return VK_IMAGE_ASPECT_NONE;
115}
116
117VkVideoChromaSubsamplingFlagBitsKHR ff_vk_subsampling_from_av_desc(const AVPixFmtDescriptor *desc)
118{
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;
128}
129
130VkVideoComponentBitDepthFlagBitsKHR ff_vk_depth_from_av_depth(int depth)
131{
132 switch (depth) {
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;
136 default: break;
137 }
138 return VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR;
139}
140
141int ff_vk_h264_level_to_av(StdVideoH264LevelIdc level)
142{
143 switch (level) {
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;
162 default:
163 case STD_VIDEO_H264_LEVEL_IDC_6_2: return 62;
164 }
165}
166
167StdVideoH264LevelIdc ff_vk_h264_level_to_vk(int level_idc)
168{
169 switch (level_idc) {
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;
188 default:
189 case 62: return STD_VIDEO_H264_LEVEL_IDC_6_2;
190 }
191}
192
193int ff_vk_h265_level_to_av(StdVideoH265LevelIdc level)
194{
195 switch (level) {
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;
207 default:
208 case STD_VIDEO_H265_LEVEL_IDC_6_2: return 62;
209 }
210}
211
212StdVideoH265LevelIdc ff_vk_h265_level_to_vk(int level_idc)
213{
214 switch (level_idc) {
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;
226 default:
227 case 62: return STD_VIDEO_H265_LEVEL_IDC_6_2;
228 }
229}
230
231StdVideoAV1Level ff_vk_av1_level_to_vk(int level)
232{
233 switch (level) {
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;
257 default:
258 case 73: return STD_VIDEO_AV1_LEVEL_7_3;
259 }
260}
261
262StdVideoH264ProfileIdc ff_vk_h264_profile_to_vk(int profile)
263{
264 switch (profile) {
266 case AV_PROFILE_H264_CONSTRAINED_BASELINE: return STD_VIDEO_H264_PROFILE_IDC_BASELINE;
267 case AV_PROFILE_H264_MAIN: return STD_VIDEO_H264_PROFILE_IDC_MAIN;
268 case AV_PROFILE_H264_HIGH: return STD_VIDEO_H264_PROFILE_IDC_HIGH;
269 case AV_PROFILE_H264_HIGH_444_PREDICTIVE: return STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE;
270 default: return STD_VIDEO_H264_PROFILE_IDC_INVALID;
271 }
272}
273
274StdVideoH265ProfileIdc ff_vk_h265_profile_to_vk(int profile)
275{
276 switch (profile) {
277 case AV_PROFILE_HEVC_MAIN: return STD_VIDEO_H265_PROFILE_IDC_MAIN;
278 case AV_PROFILE_HEVC_MAIN_10: return STD_VIDEO_H265_PROFILE_IDC_MAIN_10;
279 case AV_PROFILE_HEVC_REXT: return STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS;
280 default: return STD_VIDEO_H265_PROFILE_IDC_INVALID;
281 }
282}
283
284StdVideoAV1Profile ff_vk_av1_profile_to_vk(int profile)
285{
286 switch (profile) {
287 case AV_PROFILE_AV1_MAIN: return STD_VIDEO_AV1_PROFILE_MAIN;
288 case AV_PROFILE_AV1_HIGH: return STD_VIDEO_AV1_PROFILE_HIGH;
289 case AV_PROFILE_AV1_PROFESSIONAL: return STD_VIDEO_AV1_PROFILE_PROFESSIONAL;
290 default: return STD_VIDEO_AV1_PROFILE_INVALID;
291 }
292}
293
294int ff_vk_create_view(FFVulkanContext *s, VkImageView *view,
295 VkImageAspectFlags *aspect, VkImage img,
296 VkFormat vkf, VkImageUsageFlags usage, int layered)
297{
298 VkResult ret;
299 FFVulkanFunctions *vk = &s->vkfn;
300 VkImageAspectFlags aspect_mask = ff_vk_aspect_bits_from_vkfmt(vkf);
301
302 VkImageViewUsageCreateInfo usage_create_info = {
303 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
304 .usage = usage,
305 };
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,
311 .format = vkf,
312 .image = img,
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,
318 },
319 .subresourceRange = (VkImageSubresourceRange) {
320 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
321 .baseArrayLayer = 0,
322 .layerCount = layered ? VK_REMAINING_ARRAY_LAYERS : 1,
323 .levelCount = 1,
324 },
325 };
326
327 ret = vk->CreateImageView(s->hwctx->act_dev, &img_view_create_info,
328 s->hwctx->alloc, view);
329 if (ret != VK_SUCCESS)
330 return AVERROR_EXTERNAL;
331
332 *aspect = aspect_mask;
333
334 return 0;
335}
336
337static void dpb_image_free(AVRefStructOpaque opaque, void *obj)
338{
339 FFVkVideoDPB *dpb = opaque.nc;
341
342 if (di->view)
343 dpb->destroy_image_view(dpb->dev, di->view, dpb->alloc);
344 if (di->img)
345 dpb->destroy_image(dpb->dev, di->img, dpb->alloc);
346 if (di->mem)
347 dpb->free_memory(dpb->dev, di->mem, dpb->alloc);
348}
349
350static int dpb_image_init(AVRefStructOpaque opaque, void *obj)
351{
352 int err;
353 FFVkVideoDPB *dpb = opaque.nc;
355
356 err = ff_vk_image_create(dpb->s, &di->img, &di->mem,
357 dpb->width, dpb->height, dpb->format,
358 dpb->nb_layers, dpb->tiling, dpb->usage,
359 0x0, dpb->create_pnext);
360 if (err < 0)
361 return err;
362
363 err = ff_vk_create_view(dpb->s, &di->view, &di->aspect, di->img,
364 dpb->format, dpb->usage, dpb->nb_layers > 1);
365 if (err < 0) {
366 ff_vk_image_free(dpb->s, &di->img, &di->mem);
367 return err;
368 }
369
370 di->layout = VK_IMAGE_LAYOUT_UNDEFINED;
371
372 return 0;
373}
374
376{
377 av_free(opaque.nc);
378}
379
381 VkFormat format, VkImageUsageFlags usage,
382 VkImageTiling tiling, void *create_pnext,
383 int width, int height, int nb_layers)
384{
385 FFVulkanFunctions *vk = &s->vkfn;
386 FFVkVideoDPB *dpb = av_mallocz(sizeof(*dpb));
387 if (!dpb)
388 return AVERROR(ENOMEM);
389
390 dpb->s = s;
391 dpb->format = format;
392 dpb->usage = usage;
393 dpb->tiling = tiling;
394 dpb->create_pnext = create_pnext;
395 dpb->width = width;
396 dpb->height = height;
397 dpb->nb_layers = nb_layers;
398
399 dpb->dev = s->hwctx->act_dev;
400 dpb->alloc = s->hwctx->alloc;
401 dpb->destroy_image_view = vk->DestroyImageView;
402 dpb->destroy_image = vk->DestroyImage;
403 dpb->free_memory = vk->FreeMemory;
404
406 dpb, dpb_image_init, NULL,
408 if (!dpb->img_pool) {
409 av_free(dpb);
410 return AVERROR(ENOMEM);
411 }
412
413 common->dpb = dpb;
414
415 return 0;
416}
417
418
420 FFVkVideoCommon *common)
421{
422 FFVulkanFunctions *vk = &s->vkfn;
423
424 if (common->session) {
425 vk->DestroyVideoSessionKHR(s->hwctx->act_dev, common->session,
426 s->hwctx->alloc);
427 common->session = VK_NULL_HANDLE;
428 }
429
430 if (common->nb_mem && common->mem)
431 for (int i = 0; i < common->nb_mem; i++)
432 vk->FreeMemory(s->hwctx->act_dev, common->mem[i], s->hwctx->alloc);
433
434 av_freep(&common->mem);
435
436 /* The layered view is owned by the pool entry */
437 common->layered_view = VK_NULL_HANDLE;
439
440 if (common->dpb) {
441 /* The pool frees the FFVkVideoDPB once its last entry returns */
443 common->dpb = NULL;
444 }
445}
446
448 FFVkVideoCommon *common,
449 VkVideoSessionCreateInfoKHR *session_create)
450{
451 int err;
452 VkResult ret;
453 FFVulkanFunctions *vk = &s->vkfn;
454 VkVideoSessionMemoryRequirementsKHR *mem = NULL;
455 VkBindVideoSessionMemoryInfoKHR *bind_mem = NULL;
456
457 /* Create session */
458 ret = vk->CreateVideoSessionKHR(s->hwctx->act_dev, session_create,
459 s->hwctx->alloc, &common->session);
460 if (ret != VK_SUCCESS) {
461 err = AVERROR_EXTERNAL;
462 goto fail;
463 }
464
465 /* Get memory requirements */
466 ret = vk->GetVideoSessionMemoryRequirementsKHR(s->hwctx->act_dev,
467 common->session,
468 &common->nb_mem,
469 NULL);
470 if (ret != VK_SUCCESS) {
471 err = AVERROR_EXTERNAL;
472 goto fail;
473 }
474
475 /* Allocate all memory needed to actually allocate memory */
476 common->mem = av_mallocz(sizeof(*common->mem)*common->nb_mem);
477 if (!common->mem) {
478 err = AVERROR(ENOMEM);
479 goto fail;
480 }
481 mem = av_mallocz(sizeof(*mem)*common->nb_mem);
482 if (!mem) {
483 err = AVERROR(ENOMEM);
484 goto fail;
485 }
486 bind_mem = av_mallocz(sizeof(*bind_mem)*common->nb_mem);
487 if (!bind_mem) {
488 err = AVERROR(ENOMEM);
489 goto fail;
490 }
491
492 /* Set the needed fields to get the memory requirements */
493 for (int i = 0; i < common->nb_mem; i++) {
494 mem[i] = (VkVideoSessionMemoryRequirementsKHR) {
495 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR,
496 };
497 }
498
499 /* Finally get the memory requirements */
500 ret = vk->GetVideoSessionMemoryRequirementsKHR(s->hwctx->act_dev,
501 common->session, &common->nb_mem,
502 mem);
503 if (ret != VK_SUCCESS) {
504 err = AVERROR_EXTERNAL;
505 goto fail;
506 }
507
508 /* Now allocate each requested memory.
509 * For ricing, could pool together memory that ends up in the same index. */
510 for (int i = 0; i < common->nb_mem; i++) {
511 err = ff_vk_alloc_mem(s, &mem[i].memoryRequirements,
512 UINT32_MAX, NULL, NULL, &common->mem[i]);
513 if (err < 0)
514 goto fail;
515
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,
520 .memoryOffset = 0,
521 .memorySize = mem[i].memoryRequirements.size,
522 };
523
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);
526 }
527
528 /* Bind the allocated memory */
529 ret = vk->BindVideoSessionMemoryKHR(s->hwctx->act_dev, common->session,
530 common->nb_mem, bind_mem);
531 if (ret != VK_SUCCESS) {
532 err = AVERROR_EXTERNAL;
533 goto fail;
534 }
535
536 av_freep(&mem);
537 av_freep(&bind_mem);
538
539 return 0;
540
541fail:
542 av_freep(&mem);
543 av_freep(&bind_mem);
544
546 return err;
547}
548
549#if CONFIG_VULKAN_SEG_GATHER
550typedef struct SegGatherPushData {
551 VkDeviceAddress sparse;
552 VkDeviceAddress compacted;
553 VkDeviceAddress offset_addr;
554 uint32_t slot_size;
555} SegGatherPushData;
556
557extern const unsigned char ff_seg_gather_comp_spv_data[];
558extern const unsigned int ff_seg_gather_comp_spv_len;
559
561 FFVulkanShader *shd)
562{
563 int err;
564 FFVulkanDescriptorSetBinding desc_set[] = {
565 {
566 .name = "sizes_buf",
567 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
568 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
569 },
570 };
571
572 ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, NULL,
573 (uint32_t []) { 256, 1, 1 }, 0);
574 ff_vk_shader_add_push_const(shd, 0, sizeof(SegGatherPushData),
575 VK_SHADER_STAGE_COMPUTE_BIT);
576 ff_vk_shader_add_descriptor_set(s, shd, desc_set, 1, 0);
577
578 RET(ff_vk_shader_link(s, shd, ff_seg_gather_comp_spv_data,
579 ff_seg_gather_comp_spv_len, "main"));
580 RET(ff_vk_shader_register_exec(s, pool, shd));
581
582fail:
583 return err;
584}
585
587 FFVkBuffer *sizes, size_t sizes_offset, uint32_t nb_segs,
588 FFVkBuffer *sparse, uint32_t slot_size,
589 FFVkBuffer *compacted, size_t compacted_offset,
590 VkDeviceAddress offset_addr)
591{
592 int err;
593 FFVulkanFunctions *vk = &s->vkfn;
594 SegGatherPushData pd = {
595 .sparse = sparse->address,
596 .compacted = compacted->address + compacted_offset,
597 .offset_addr = offset_addr,
598 .slot_size = slot_size,
599 };
600
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,
610 },
611 .memoryBarrierCount = 1,
612 });
613
614 RET(ff_vk_shader_update_desc_buffer(s, exec, shd, 0, 0, 0,
615 sizes, sizes_offset, (nb_segs + 1)*sizeof(uint32_t),
616 VK_FORMAT_UNDEFINED));
617 ff_vk_exec_bind_shader(s, exec, shd);
618 ff_vk_shader_update_push_const(s, exec, shd, VK_SHADER_STAGE_COMPUTE_BIT,
619 0, sizeof(pd), &pd);
620 vk->CmdDispatch(exec->buf, nb_segs, 1, 1);
621
622 /* For the host to read the output and the packed size */
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,
631 },
632 .memoryBarrierCount = 1,
633 });
634
635fail:
636 return err;
637}
638#endif /* CONFIG_VULKAN_SEG_GATHER */
639
642 int (*get_packet)(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt))
643{
644 l->s = s;
645 l->pool = pool;
648 l->head = 0;
649 l->in_flight = 0;
650
651 l->frames = av_calloc(pool->pool_size, sizeof(*l->frames));
652 l->frame = av_frame_alloc();
653 l->pkt = av_packet_alloc();
654 if (!l->frames || !l->frame || !l->pkt)
655 return AVERROR(ENOMEM);
656
657 return 0;
658}
659
661{
662 int err;
663 int idx = (l->head + l->pool->pool_size - l->in_flight) % l->pool->pool_size;
664
665 l->in_flight--;
666
667 err = l->get_packet(avctx, &l->pool->contexts[idx], pkt);
668 if (err < 0) {
670 return err;
671 }
672
673 pkt->pts = l->frames[idx].pts;
674 pkt->dts = l->frames[idx].pts;
675 pkt->duration = l->frames[idx].duration;
676 if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
677 pkt->opaque = l->frames[idx].opaque;
678 pkt->opaque_ref = l->frames[idx].opaque_ref;
679 l->frames[idx].opaque_ref = NULL;
680 }
681
682 return 0;
683}
684
686{
687 FFVulkanFunctions *vk = &l->s->vkfn;
688 int idx = (l->head + l->pool->pool_size - l->in_flight) % l->pool->pool_size;
689 FFVkExecContext *e = &l->pool->contexts[idx];
690 uint64_t val;
691
692 return vk->GetSemaphoreCounterValue(l->s->hwctx->act_dev, e->sem, &val) == VK_SUCCESS &&
693 val >= e->sem_value;
694}
695
697 AVPacket *pkt)
698{
699 int err, eof = 0;
700 FFVkExecPool *pool = l->pool;
701
702 err = ff_encode_get_frame(avctx, l->frame);
703 if (err == AVERROR_EOF) {
704 eof = 1;
705 } else if (err >= 0) {
706 l->frames[l->head].pts = l->frame->pts;
707 l->frames[l->head].duration = l->frame->duration;
708 if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
709 l->frames[l->head].opaque = l->frame->opaque;
711 l->frame->opaque_ref = NULL;
712 }
713
714 err = l->submit_frame(avctx, &pool->contexts[l->head], l->frame);
716 if (err < 0) {
718 return err;
719 }
720
721 l->head = (l->head + 1) % pool->pool_size;
722 l->in_flight++;
723 } else if (err != AVERROR(EAGAIN)) {
724 return err;
725 }
726
727 if (!l->in_flight)
728 return eof ? AVERROR_EOF : AVERROR(EAGAIN);
729 if (l->in_flight < pool->pool_size && !eof && !loop_oldest_done(l))
730 return AVERROR(EAGAIN);
731
732 return loop_get_packet(avctx, l, pkt);
733}
734
736{
737 while (l->in_flight) {
738 if (loop_get_packet(avctx, l, l->pkt) >= 0)
740 }
741 l->head = 0;
742}
743
745{
746 if (l->frames) {
747 for (int i = 0; i < l->pool->pool_size; i++)
749 av_freep(&l->frames);
750 }
751 av_frame_free(&l->frame);
752 av_packet_free(&l->pkt);
753}
static double val(void *priv, double ch)
Definition aeval.c:77
static const char *const format[]
Definition af_aiir.c:445
static int submit_frame(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *frame)
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define NULL
Definition coverity.c:32
#define AV_PROFILE_AV1_HIGH
Definition defs.h:179
#define AV_PROFILE_H264_MAIN
Definition defs.h:121
#define AV_PROFILE_H264_HIGH_444_PREDICTIVE
Definition defs.h:131
#define AV_PROFILE_HEVC_REXT
Definition defs.h:171
#define AV_PROFILE_HEVC_MAIN
Definition defs.h:168
#define AV_PROFILE_HEVC_MAIN_10
Definition defs.h:169
#define AV_PROFILE_H264_HIGH
Definition defs.h:123
#define AV_PROFILE_H264_CONSTRAINED_BASELINE
Definition defs.h:120
#define AV_PROFILE_AV1_MAIN
Definition defs.h:178
#define AV_PROFILE_AV1_PROFESSIONAL
Definition defs.h:180
#define AV_PROFILE_H264_BASELINE
Definition defs.h:119
static AVPacket * pkt
static AVFrame * frame
int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame)
Called by encoders to get the next frame for encoding.
Definition encode.c:218
static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt)
const char * usage
#define fail
Definition test.h:479
#define AV_CODEC_FLAG_COPY_OPAQUE
Definition avcodec.h:279
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition packet.c:74
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition packet.c:63
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition buffer.c:139
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition error.h:59
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
enum VkFormat VkFormat
static const int sizes[][2]
Definition img2dec.c:62
#define av_cold
Definition attributes.h:117
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.
Definition vulkan.c:2262
void ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, const FFVulkanDescriptorSetBinding *desc, int nb, int singular)
Add descriptor to a shader.
Definition vulkan.c:2521
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.
Definition vulkan.c:1190
int ff_vk_alloc_mem(FFVulkanContext *s, VkMemoryRequirements *req, VkMemoryPropertyFlagBits req_flags, void *alloc_extension, VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
Definition vulkan.c:1062
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.
Definition vulkan.c:1113
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
Definition vulkan.c:1631
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
Definition vulkan.c:2555
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, const FFVulkanShader *shd)
Bind a shader.
Definition vulkan.c:2739
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.
Definition vulkan.c:2703
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.
Definition vulkan.c:2425
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.
Definition vulkan.c:2729
const char * desc
Definition libsvtav1.c:83
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:264
Memory handling functions.
static const char * obj
Definition mscl.c:57
int profile
Definition mxfenc.c:2299
#define AV_PIX_FMT_YUV420P16
Definition pixfmt.h:556
#define AV_PIX_FMT_GBRPF32
Definition pixfmt.h:584
#define AV_PIX_FMT_P212
Definition pixfmt.h:624
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
#define AV_PIX_FMT_GBRAP16
Definition pixfmt.h:571
#define AV_PIX_FMT_P412
Definition pixfmt.h:625
#define AV_PIX_FMT_P210
Definition pixfmt.h:622
#define AV_PIX_FMT_P012
Definition pixfmt.h:609
#define AV_PIX_FMT_P216
Definition pixfmt.h:626
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
#define AV_PIX_FMT_Y210
Definition pixfmt.h:612
#define AV_PIX_FMT_P010
Definition pixfmt.h:608
#define AV_PIX_FMT_P016
Definition pixfmt.h:610
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_RGBA64
Definition pixfmt.h:535
#define AV_PIX_FMT_XV30
Definition pixfmt.h:615
#define AV_PIX_FMT_RGB48
Definition pixfmt.h:531
#define AV_PIX_FMT_X2RGB10
Definition pixfmt.h:619
#define AV_PIX_FMT_GRAYF32
Definition pixfmt.h:588
#define AV_PIX_FMT_P410
Definition pixfmt.h:623
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ 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...
Definition pixfmt.h:96
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition pixfmt.h:75
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Definition pixfmt.h:265
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition pixfmt.h:102
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
Definition pixfmt.h:88
@ 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...
Definition pixfmt.h:371
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:198
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition pixfmt.h:100
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition pixfmt.h:212
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
Definition pixfmt.h:263
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition pixfmt.h:74
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition pixfmt.h:76
#define AV_PIX_FMT_P416
Definition pixfmt.h:627
#define AV_PIX_FMT_BGR565
Definition pixfmt.h:537
#define AV_PIX_FMT_Y216
Definition pixfmt.h:614
#define AV_PIX_FMT_RGB565
Definition pixfmt.h:532
#define AV_PIX_FMT_YUV422P16
Definition pixfmt.h:557
#define AV_PIX_FMT_GRAY16
Definition pixfmt.h:528
#define AV_PIX_FMT_Y212
Definition pixfmt.h:613
#define AV_PIX_FMT_XV36
Definition pixfmt.h:616
#define AV_PIX_FMT_GBRAPF32
Definition pixfmt.h:585
#define AV_PIX_FMT_YUV444P16
Definition pixfmt.h:558
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:120
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition refstruct.h:292
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.
Definition refstruct.h:258
#define FF_ARRAY_ELEMS(a)
main external API structure.
Definition avcodec.h:443
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition frame.h:574
void * opaque
Frame owner's private data.
Definition frame.h:610
AVBufferRef * opaque_ref
Frame owner's private data.
Definition frame.h:785
int64_t duration
Duration of the frame, in the same units as pts.
Definition frame.h:820
This structure stores compressed data.
Definition packet.h:580
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
VkDevice act_dev
Active device.
VkDeviceAddress address
Definition vulkan.h:99
Frame loop for compute encoders.
int(* get_packet)(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt)
AVBufferRef * opaque_ref
FFVkExecPool * pool
struct FFVkEncodeLoop::@355156236361072070030016171062102261122252313307 * frames
int(* submit_frame)(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *frame)
AVFrame * frame
FFVulkanContext * s
AVPacket * pkt
uint64_t sem_value
Definition vulkan.h:147
VkSemaphore sem
Definition vulkan.h:146
VkCommandBuffer buf
Definition vulkan.h:142
FFVkExecContext * contexts
Definition vulkan.h:271
int pool_size
Definition vulkan.h:276
enum AVPixelFormat pixfmt
VkImageAspectFlags aspect
VkDeviceMemory * mem
VkVideoSessionKHR session
FFVkVideoDPBImage * layered_img
FFVkVideoDPB * dpb
VkImageView layered_view
VkDeviceMemory mem
VkImageLayout layout
VkImageAspectFlags aspect
VkImageView view
AVRefStructPool * img_pool
FFVulkanContext * s
PFN_vkDestroyImage destroy_image
VkDevice dev
VkImageTiling tiling
VkFormat format
PFN_vkFreeMemory free_memory
const VkAllocationCallbacks * alloc
void * create_pnext
PFN_vkDestroyImageView destroy_image_view
VkImageUsageFlags usage
AVVulkanDeviceContext * hwctx
Definition vulkan.h:340
FFVulkanFunctions vkfn
Definition vulkan.h:296
uint8_t level
Definition svq3.c:208
#define av_free(p)
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
int level_idc
Definition h264_levels.c:29
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition refstruct.h:58
#define img
#define RET(x)
Definition vulkan.h:37
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)
#define ASPECT_2PLANE
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.
#define ASPECT_3PLANE
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 ...