FFmpeg
vulkan_filter.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) Lynne
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "filters.h"
22 #include "vulkan_filter.h"
24 
26  AVBufferRef *frames_ref,
27  int width, int height, enum AVPixelFormat sw_format)
28 {
29  int err;
30  AVHWFramesContext *frames_ctx;
31  AVHWDeviceContext *device_ctx;
32  AVVulkanFramesContext *vk_frames;
33  AVVulkanDeviceContext *vk_dev;
34  AVBufferRef *device_ref = avctx->hw_device_ctx;
35 
36  /* Check if context is reusable as-is */
37  if (frames_ref) {
38  int no_storage = 0;
40  VkImageUsageFlagBits usage_req;
41  const VkFormat *sub = av_vkfmt_from_pixfmt(sw_format);
42 
43  frames_ctx = (AVHWFramesContext *)frames_ref->data;
44  device_ctx = (AVHWDeviceContext *)frames_ctx->device_ref->data;
45  vk_frames = frames_ctx->hwctx;
46  vk_dev = device_ctx->hwctx;
47 
48  /* Width and height mismatch */
49  if (width != frames_ctx->width ||
50  height != frames_ctx->height)
51  goto skip;
52 
53  /* Format mismatch */
54  if (sw_format != frames_ctx->sw_format)
55  goto skip;
56 
57  /* Don't let linear through. */
58  if (vk_frames->tiling == VK_IMAGE_TILING_LINEAR)
59  goto skip;
60 
63 
64  /* More advanced format checks */
65  err = ff_vk_load_functions(device_ctx, &s->vkfn, s->extensions, 1, 1);
66  if (err < 0)
67  return err;
68  vk = &s->vkfn;
69 
70  /* Usage mismatch */
71  usage_req = VK_IMAGE_USAGE_SAMPLED_BIT |
72  VK_IMAGE_USAGE_STORAGE_BIT;
73 
74  /* If format supports hardware encoding, make sure
75  * the context includes it. */
76  if (vk_frames->format[1] == VK_FORMAT_UNDEFINED &&
77  (s->extensions & (FF_VK_EXT_VIDEO_ENCODE_QUEUE |
79  VkFormatProperties3 fprops = {
80  .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3,
81  };
82  VkFormatProperties2 prop = {
83  .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
84  .pNext = &fprops,
85  };
86  vk->GetPhysicalDeviceFormatProperties2(vk_dev->phys_dev,
87  vk_frames->format[0],
88  &prop);
89  if (fprops.optimalTilingFeatures & VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR)
90  usage_req |= VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
91  }
92 
93  if ((vk_frames->usage & usage_req) != usage_req)
94  goto skip;
95 
96  /* Check if the subformats can do storage */
97  for (int i = 0; sub[i] != VK_FORMAT_UNDEFINED; i++) {
98  VkFormatProperties2 prop = {
99  .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
100  };
101  vk->GetPhysicalDeviceFormatProperties2(vk_dev->phys_dev, sub[i],
102  &prop);
103  no_storage |= !(prop.formatProperties.optimalTilingFeatures &
104  VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT);
105  }
106 
107  /* Check if it's usable */
108  if (no_storage) {
109 skip:
110  av_log(avctx, AV_LOG_VERBOSE, "Cannot reuse context, creating a new one\n");
111  device_ref = frames_ctx->device_ref;
112  frames_ref = NULL;
113  } else {
114  av_log(avctx, AV_LOG_VERBOSE, "Reusing existing frames context\n");
115  frames_ref = av_buffer_ref(frames_ref);
116  if (!frames_ref)
117  return AVERROR(ENOMEM);
118  }
119  }
120 
121  if (!frames_ref) {
122  if (!device_ref) {
123  av_log(avctx, AV_LOG_ERROR,
124  "Vulkan filtering requires a device context!\n");
125  return AVERROR(EINVAL);
126  }
127 
128  frames_ref = av_hwframe_ctx_alloc(device_ref);
129 
130  frames_ctx = (AVHWFramesContext *)frames_ref->data;
131  frames_ctx->format = AV_PIX_FMT_VULKAN;
132  frames_ctx->sw_format = sw_format;
133  frames_ctx->width = width;
134  frames_ctx->height = height;
135 
136  vk_frames = frames_ctx->hwctx;
137  vk_frames->tiling = VK_IMAGE_TILING_OPTIMAL;
138  vk_frames->usage = VK_IMAGE_USAGE_SAMPLED_BIT |
139  VK_IMAGE_USAGE_STORAGE_BIT |
140  VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
141 
142  err = av_hwframe_ctx_init(frames_ref);
143  if (err < 0) {
144  av_buffer_unref(&frames_ref);
145  return err;
146  }
147 
148  device_ctx = (AVHWDeviceContext *)frames_ctx->device_ref->data;
149  vk_dev = device_ctx->hwctx;
150  }
151 
152  s->extensions = ff_vk_extensions_to_mask(vk_dev->enabled_dev_extensions,
153  vk_dev->nb_enabled_dev_extensions);
154 
155  err = ff_vk_load_functions(device_ctx, &s->vkfn, s->extensions, 1, 1);
156  if (err < 0) {
157  av_buffer_unref(&frames_ref);
158  return err;
159  }
160 
161  s->frames_ref = frames_ref;
162  s->frames = frames_ctx;
163  s->hwfc = vk_frames;
164  s->device = device_ctx;
165  s->hwctx = device_ctx->hwctx;
166 
167  err = ff_vk_load_props(s);
168  if (err < 0)
169  av_buffer_unref(&s->frames_ref);
170 
171  return err;
172 }
173 
175 {
177  AVHWFramesContext *input_frames;
178  AVFilterContext *avctx = inlink->dst;
179  FFVulkanContext *s = inlink->dst->priv;
180 
181  if (!l->hw_frames_ctx) {
182  av_log(inlink->dst, AV_LOG_ERROR, "Vulkan filtering requires a "
183  "hardware frames context on the input.\n");
184  return AVERROR(EINVAL);
185  }
186 
187  input_frames = (AVHWFramesContext *)l->hw_frames_ctx->data;
188  if (input_frames->format != AV_PIX_FMT_VULKAN)
189  return AVERROR(EINVAL);
190 
191  /* Extract the device and default output format from the first input. */
192  if (avctx->inputs[0] != inlink)
193  return 0;
194 
195  /* Save the ref, without reffing it */
196  s->input_frames_ref = l->hw_frames_ctx;
197 
198  /* Defaults */
199  s->input_format = input_frames->sw_format;
200  s->output_format = input_frames->sw_format;
201  s->output_width = inlink->w;
202  s->output_height = inlink->h;
203 
204  return 0;
205 }
206 
208 {
209  int err;
210  FilterLink *l = ff_filter_link(outlink);
211  FFVulkanContext *s = outlink->src->priv;
212 
214 
215  err = ff_vk_filter_init_context(outlink->src, s, s->input_frames_ref,
216  s->output_width, s->output_height,
217  s->output_format);
218  if (err < 0)
219  return err;
220 
221  l->hw_frames_ctx = av_buffer_ref(s->frames_ref);
222  if (!l->hw_frames_ctx)
223  return AVERROR(ENOMEM);
224 
225  outlink->w = s->output_width;
226  outlink->h = s->output_height;
227 
228  return err;
229 }
230 
232 {
233  FFVulkanContext *s = avctx->priv;
234 
235  s->output_format = AV_PIX_FMT_NONE;
236 
237  return 0;
238 }
239 
241  FFVulkanPipeline *pl, AVFrame *out_f, AVFrame *in_f,
242  VkSampler sampler, void *push_src, size_t push_size)
243 {
244  int err = 0;
245  FFVulkanFunctions *vk = &vkctx->vkfn;
246  VkImageView in_views[AV_NUM_DATA_POINTERS];
247  VkImageView out_views[AV_NUM_DATA_POINTERS];
248  VkImageMemoryBarrier2 img_bar[37];
249  int nb_img_bar = 0;
250 
251  /* Update descriptors and init the exec context */
252  FFVkExecContext *exec = ff_vk_exec_get(e);
253  ff_vk_exec_start(vkctx, exec);
254 
255  RET(ff_vk_exec_add_dep_frame(vkctx, exec, out_f,
256  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
257  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
258  RET(ff_vk_create_imageviews(vkctx, exec, out_views, out_f));
259  ff_vk_update_descriptor_img_array(vkctx, pl, exec, out_f, out_views, 0, !!in_f,
260  VK_IMAGE_LAYOUT_GENERAL,
261  VK_NULL_HANDLE);
262  if (in_f) {
263  RET(ff_vk_exec_add_dep_frame(vkctx, exec, in_f,
264  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
265  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
266  RET(ff_vk_create_imageviews(vkctx, exec, in_views, in_f));
267  ff_vk_update_descriptor_img_array(vkctx, pl, exec, in_f, in_views, 0, 0,
268  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
269  sampler);
270  }
271 
272  /* Bind pipeline, update push data */
273  ff_vk_exec_bind_pipeline(vkctx, exec, pl);
274  if (push_src)
275  ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,
276  0, push_size, push_src);
277 
278  /* Add data sync barriers */
279  ff_vk_frame_barrier(vkctx, exec, out_f, img_bar, &nb_img_bar,
280  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
281  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
282  VK_ACCESS_SHADER_WRITE_BIT,
283  VK_IMAGE_LAYOUT_GENERAL,
284  VK_QUEUE_FAMILY_IGNORED);
285  if (in_f)
286  ff_vk_frame_barrier(vkctx, exec, in_f, img_bar, &nb_img_bar,
287  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
288  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
289  VK_ACCESS_SHADER_READ_BIT,
290  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
291  VK_QUEUE_FAMILY_IGNORED);
292 
293  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
294  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
295  .pImageMemoryBarriers = img_bar,
296  .imageMemoryBarrierCount = nb_img_bar,
297  });
298 
299  vk->CmdDispatch(exec->buf,
300  FFALIGN(vkctx->output_width, pl->wg_size[0])/pl->wg_size[0],
301  FFALIGN(vkctx->output_height, pl->wg_size[1])/pl->wg_size[1],
302  pl->wg_size[2]);
303 
304  return ff_vk_exec_submit(vkctx, exec);
305 fail:
306  ff_vk_exec_discard_deps(vkctx, exec);
307  return err;
308 }
309 
311  FFVulkanPipeline *pls[2],
312  AVFrame *out, AVFrame *tmp, AVFrame *in,
313  VkSampler sampler, void *push_src, size_t push_size)
314 {
315  int err = 0;
316  FFVulkanFunctions *vk = &vkctx->vkfn;
317  VkImageView in_views[AV_NUM_DATA_POINTERS];
318  VkImageView tmp_views[AV_NUM_DATA_POINTERS];
319  VkImageView out_views[AV_NUM_DATA_POINTERS];
320  VkImageMemoryBarrier2 img_bar[37];
321  int nb_img_bar = 0;
322 
323  /* Update descriptors and init the exec context */
324  FFVkExecContext *exec = ff_vk_exec_get(e);
325  ff_vk_exec_start(vkctx, exec);
326 
327  RET(ff_vk_exec_add_dep_frame(vkctx, exec, in,
328  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
329  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
330  RET(ff_vk_exec_add_dep_frame(vkctx, exec, tmp,
331  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
332  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
333  RET(ff_vk_exec_add_dep_frame(vkctx, exec, out,
334  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
335  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
336 
337  RET(ff_vk_create_imageviews(vkctx, exec, in_views, in));
338  RET(ff_vk_create_imageviews(vkctx, exec, tmp_views, tmp));
339  RET(ff_vk_create_imageviews(vkctx, exec, out_views, out));
340 
341  ff_vk_frame_barrier(vkctx, exec, in, img_bar, &nb_img_bar,
342  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
343  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
344  VK_ACCESS_SHADER_READ_BIT,
345  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
346  VK_QUEUE_FAMILY_IGNORED);
347  ff_vk_frame_barrier(vkctx, exec, tmp, img_bar, &nb_img_bar,
348  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
349  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
350  VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
351  VK_IMAGE_LAYOUT_GENERAL,
352  VK_QUEUE_FAMILY_IGNORED);
353  ff_vk_frame_barrier(vkctx, exec, out, img_bar, &nb_img_bar,
354  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
355  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
356  VK_ACCESS_SHADER_WRITE_BIT,
357  VK_IMAGE_LAYOUT_GENERAL,
358  VK_QUEUE_FAMILY_IGNORED);
359 
360  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
361  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
362  .pImageMemoryBarriers = img_bar,
363  .imageMemoryBarrierCount = nb_img_bar,
364  });
365 
366  for (int i = 0; i < 2; i++) {
367  FFVulkanPipeline *pl = pls[i];
368  AVFrame *src_f = !i ? in : tmp;
369  AVFrame *dst_f = !i ? tmp : out;
370  VkImageView *src_views = !i ? in_views : tmp_views;
371  VkImageView *dst_views = !i ? tmp_views : out_views;
372 
373  ff_vk_update_descriptor_img_array(vkctx, pl, exec, src_f, src_views, 0, 0,
374  !i ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
375  VK_IMAGE_LAYOUT_GENERAL,
376  sampler);
377  ff_vk_update_descriptor_img_array(vkctx, pl, exec, dst_f, dst_views, 0, 1,
378  VK_IMAGE_LAYOUT_GENERAL,
379  VK_NULL_HANDLE);
380 
381  /* Bind pipeline, update push data */
382  ff_vk_exec_bind_pipeline(vkctx, exec, pl);
383  if (push_src)
384  ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,
385  0, push_size, push_src);
386 
387  vk->CmdDispatch(exec->buf,
388  FFALIGN(vkctx->output_width, pl->wg_size[0])/pl->wg_size[0],
389  FFALIGN(vkctx->output_height, pl->wg_size[1])/pl->wg_size[1],
390  pl->wg_size[2]);
391  }
392 
393  return ff_vk_exec_submit(vkctx, exec);
394 fail:
395  ff_vk_exec_discard_deps(vkctx, exec);
396  return err;
397 }
398 
400  FFVulkanPipeline *pl,
401  AVFrame *out, AVFrame *in[], int nb_in,
402  VkSampler sampler, void *push_src, size_t push_size)
403 {
404  int err = 0;
405  FFVulkanFunctions *vk = &vkctx->vkfn;
406  VkImageView in_views[16][AV_NUM_DATA_POINTERS];
407  VkImageView out_views[AV_NUM_DATA_POINTERS];
408  VkImageMemoryBarrier2 img_bar[128];
409  int nb_img_bar = 0;
410 
411  /* Update descriptors and init the exec context */
412  FFVkExecContext *exec = ff_vk_exec_get(e);
413  ff_vk_exec_start(vkctx, exec);
414 
415  /* Add deps and create temporary imageviews */
416  RET(ff_vk_exec_add_dep_frame(vkctx, exec, out,
417  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
418  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
419  RET(ff_vk_create_imageviews(vkctx, exec, out_views, out));
420  for (int i = 0; i < nb_in; i++) {
421  RET(ff_vk_exec_add_dep_frame(vkctx, exec, in[i],
422  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
423  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
424  RET(ff_vk_create_imageviews(vkctx, exec, in_views[i], in[i]));
425  }
426 
427  /* Update descriptor sets */
428  ff_vk_update_descriptor_img_array(vkctx, pl, exec, out, out_views, 0, nb_in,
429  VK_IMAGE_LAYOUT_GENERAL,
430  VK_NULL_HANDLE);
431  for (int i = 0; i < nb_in; i++)
432  ff_vk_update_descriptor_img_array(vkctx, pl, exec, in[i], in_views[i], 0, i,
433  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
434  sampler);
435 
436  /* Bind pipeline, update push data */
437  ff_vk_exec_bind_pipeline(vkctx, exec, pl);
438  if (push_src)
439  ff_vk_update_push_exec(vkctx, exec, pl, VK_SHADER_STAGE_COMPUTE_BIT,
440  0, push_size, push_src);
441 
442  /* Add data sync barriers */
443  ff_vk_frame_barrier(vkctx, exec, out, img_bar, &nb_img_bar,
444  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
445  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
446  VK_ACCESS_SHADER_WRITE_BIT,
447  VK_IMAGE_LAYOUT_GENERAL,
448  VK_QUEUE_FAMILY_IGNORED);
449  for (int i = 0; i < nb_in; i++)
450  ff_vk_frame_barrier(vkctx, exec, in[i], img_bar, &nb_img_bar,
451  VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
452  VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
453  VK_ACCESS_SHADER_READ_BIT,
454  VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
455  VK_QUEUE_FAMILY_IGNORED);
456 
457  vk->CmdPipelineBarrier2(exec->buf, &(VkDependencyInfo) {
458  .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
459  .pImageMemoryBarriers = img_bar,
460  .imageMemoryBarrierCount = nb_img_bar,
461  });
462 
463  vk->CmdDispatch(exec->buf,
464  FFALIGN(vkctx->output_width, pl->wg_size[0])/pl->wg_size[0],
465  FFALIGN(vkctx->output_height, pl->wg_size[1])/pl->wg_size[1],
466  pl->wg_size[2]);
467 
468  return ff_vk_exec_submit(vkctx, exec);
469 fail:
470  ff_vk_exec_discard_deps(vkctx, exec);
471  return err;
472 }
vulkan_loader.h
AVHWDeviceContext::hwctx
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
Definition: hwcontext.h:85
ff_vk_load_props
int ff_vk_load_props(FFVulkanContext *s)
Loads props/mprops/driver_props.
Definition: vulkan.c:106
FF_VK_EXT_VIDEO_ENCODE_QUEUE
@ FF_VK_EXT_VIDEO_ENCODE_QUEUE
Definition: vulkan_functions.h:54
AVVulkanDeviceContext::phys_dev
VkPhysicalDevice phys_dev
Physical device.
Definition: hwcontext_vulkan.h:79
ff_vk_exec_get
FFVkExecContext * ff_vk_exec_get(FFVkExecPool *pool)
Retrieve an execution pool.
Definition: vulkan.c:463
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
ff_vk_update_descriptor_img_array
void ff_vk_update_descriptor_img_array(FFVulkanContext *s, FFVulkanPipeline *pl, FFVkExecContext *e, AVFrame *f, VkImageView *views, int set, int binding, VkImageLayout layout, VkSampler sampler)
Definition: vulkan.c:1908
FFVulkanContext::output_height
int output_height
Definition: vulkan.h:278
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
out
FILE * out
Definition: movenc.c:55
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
AVHWFramesContext::format
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
Definition: hwcontext.h:197
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
av_hwframe_ctx_init
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition: hwcontext.c:322
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
ff_vk_filter_init
int ff_vk_filter_init(AVFilterContext *avctx)
General lavfi IO functions.
Definition: vulkan_filter.c:231
av_hwframe_ctx_alloc
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition: hwcontext.c:248
ff_vk_filter_process_Nin
int ff_vk_filter_process_Nin(FFVulkanContext *vkctx, FFVkExecPool *e, FFVulkanPipeline *pl, AVFrame *out, AVFrame *in[], int nb_in, VkSampler sampler, void *push_src, size_t push_size)
Up to 16 inputs, one output.
Definition: vulkan_filter.c:399
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
AVFilterContext::hw_device_ctx
AVBufferRef * hw_device_ctx
For filters which will create hardware frames, sets the device the filter should create them in.
Definition: avfilter.h:519
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
AVHWFramesContext::width
int width
The allocated dimensions of the frames in this pool.
Definition: hwcontext.h:217
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
ff_vk_exec_add_dep_frame
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
Definition: vulkan.c:663
AVFilterContext::priv
void * priv
private data for use by the filter
Definition: avfilter.h:472
fail
#define fail()
Definition: checkasm.h:188
FFVulkanPipeline::wg_size
int wg_size[3]
Definition: vulkan.h:219
vulkan_filter.h
ff_vk_filter_init_context
int ff_vk_filter_init_context(AVFilterContext *avctx, FFVulkanContext *s, AVBufferRef *frames_ref, int width, int height, enum AVPixelFormat sw_format)
Can be called manually, if not using ff_vk_filter_config_output.
Definition: vulkan_filter.c:25
AVVulkanFramesContext
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
Definition: hwcontext_vulkan.h:213
ff_vk_filter_process_2pass
int ff_vk_filter_process_2pass(FFVulkanContext *vkctx, FFVkExecPool *e, FFVulkanPipeline *pls[2], AVFrame *out, AVFrame *tmp, AVFrame *in, VkSampler sampler, void *push_src, size_t push_size)
Submit a compute shader with a single in and single out with 2 stages.
Definition: vulkan_filter.c:310
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
AVHWFramesContext::height
int height
Definition: hwcontext.h:217
FFVulkanContext::output_width
int output_width
Definition: vulkan.h:277
s
#define s(width, name)
Definition: cbs_vp9.c:198
FF_VK_EXT_VIDEO_MAINTENANCE_1
@ FF_VK_EXT_VIDEO_MAINTENANCE_1
Definition: vulkan_functions.h:53
ff_vk_load_functions
static int ff_vk_load_functions(AVHWDeviceContext *ctx, FFVulkanFunctions *vk, uint64_t extensions_mask, int has_inst, int has_dev)
Function loader.
Definition: vulkan_loader.h:98
filters.h
ff_vk_exec_bind_pipeline
void ff_vk_exec_bind_pipeline(FFVulkanContext *s, FFVkExecContext *e, FFVulkanPipeline *pl)
Definition: vulkan.c:2063
if
if(ret)
Definition: filter_design.txt:179
AVVulkanDeviceContext
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_vulkan.h:59
NULL
#define NULL
Definition: coverity.c:32
AVHWFramesContext::sw_format
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:210
av_buffer_unref
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
AVVulkanDeviceContext::nb_enabled_dev_extensions
int nb_enabled_dev_extensions
Definition: hwcontext_vulkan.h:113
AVHWFramesContext::device_ref
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
Definition: hwcontext.h:126
AVFilterContext::inputs
AVFilterLink ** inputs
array of pointers to input links
Definition: avfilter.h:465
ff_vk_filter_config_output
int ff_vk_filter_config_output(AVFilterLink *outlink)
Definition: vulkan_filter.c:207
AVVulkanFramesContext::format
VkFormat format[AV_NUM_DATA_POINTERS]
Vulkan format for each image.
Definition: hwcontext_vulkan.h:273
AVVulkanFramesContext::usage
VkImageUsageFlagBits usage
Defines extra usage of output frames.
Definition: hwcontext_vulkan.h:232
FFVulkanContext
Definition: vulkan.h:238
FFVulkanPipeline
Definition: vulkan.h:207
ff_filter_link
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition: filters.h:197
height
#define height
Definition: dsp.h:85
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:390
FFVkExecContext
Definition: vulkan.h:115
ff_vk_update_push_exec
void ff_vk_update_push_exec(FFVulkanContext *s, FFVkExecContext *e, FFVulkanPipeline *pl, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Definition: vulkan.c:1921
ff_vk_filter_process_simple
int ff_vk_filter_process_simple(FFVulkanContext *vkctx, FFVkExecPool *e, FFVulkanPipeline *pl, AVFrame *out_f, AVFrame *in_f, VkSampler sampler, void *push_src, size_t push_size)
Submit a compute shader with a zero/one input and single out for execution.
Definition: vulkan_filter.c:240
av_vkfmt_from_pixfmt
const VkFormat * av_vkfmt_from_pixfmt(enum AVPixelFormat p)
Returns the optimal per-plane Vulkan format for a given sw_format, one for each plane.
Definition: hwcontext_stub.c:30
ff_vk_exec_start
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
Definition: vulkan.c:479
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
VkFormat
enum VkFormat VkFormat
Definition: hwcontext_stub.c:25
ff_vk_frame_barrier
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e, AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar, VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlagBits new_access, VkImageLayout new_layout, uint32_t new_qf)
Definition: vulkan.c:1357
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:115
FFVulkanContext::vkfn
FFVulkanFunctions vkfn
Definition: vulkan.h:242
AVHWFramesContext::hwctx
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
Definition: hwcontext.h:150
FFVkExecPool
Definition: vulkan.h:173
FFVkExecContext::buf
VkCommandBuffer buf
Definition: vulkan.h:127
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AVVulkanFramesContext::tiling
VkImageTiling tiling
Controls the tiling of allocated frames.
Definition: hwcontext_vulkan.h:222
AVFilterContext
An instance of a filter.
Definition: avfilter.h:457
AVVulkanDeviceContext::enabled_dev_extensions
const char *const * enabled_dev_extensions
Enabled device extensions.
Definition: hwcontext_vulkan.h:112
ff_vk_filter_config_input
int ff_vk_filter_config_input(AVFilterLink *inlink)
Definition: vulkan_filter.c:174
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
ff_vk_exec_discard_deps
void ff_vk_exec_discard_deps(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:515
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
ff_vk_exec_submit
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
Definition: vulkan.c:778
ff_vk_extensions_to_mask
static uint64_t ff_vk_extensions_to_mask(const char *const *extensions, int nb_extensions)
Definition: vulkan_loader.h:36
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
ff_vk_create_imageviews
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, VkImageView views[AV_NUM_DATA_POINTERS], AVFrame *f)
Create an imageview and add it as a dependency to an execution.
Definition: vulkan.c:1283
width
#define width
Definition: dsp.h:85
RET
#define RET(x)
Definition: vulkan.h:67
FFVulkanFunctions
Definition: vulkan_functions.h:255
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:375