29#define GBLUR_MAX_KERNEL_SIZE 127
53static inline float gaussian(
float sigma,
float x)
55 return 1.0 / (sqrt(2.0 *
M_PI) * sigma) *
56 exp(-(x * x) / (2.0 * sigma * sigma));
61 return (
b -
a) * (1.0 / 6.0) * ((
gaussian(sigma,
a) +
71 for (x = 0; x < kernel_size; x++) {
76 sum += kernel[x] * 2.0;
80 for (x = 0; x < kernel_size; x++) {
101 s->sigmaV =
s->sigma;
113 int ksize,
float sigma)
116 uint8_t *kernel_mapped;
119 VK_SHADER_STAGE_COMPUTE_BIT);
122 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
123 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
134 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
135 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
142 params_buf, 0, params_buf->
size,
143 VK_FORMAT_UNDEFINED));
167 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
168 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
172 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
173 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
182 (uint32_t []) { 32, 1, 1 }, 0);
188 (uint32_t []) { 1, 32, 1 }, 0);
240 out,
tmp, in, VK_NULL_HANDLE,
241 planes, &
s->planes,
sizeof(
int)));
259#define OFFSET(x) offsetof(GBlurVulkanContext, x)
260#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
290 .p.name =
"gblur_vulkan",
292 .p.priv_class = &gblur_vulkan_class,
const FFFilter ff_vf_gblur_vulkan
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int(* init)(AVBSFContext *ctx)
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
#define AVFILTER_FLAG_HWDEVICE
The filter can create hardware frames using AVFilterContext.hw_device_ctx.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
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_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool)
int ff_vk_create_buf(FFVulkanContext *s, FFVkBuffer *buf, size_t size, void *pNext, void *alloc_pNext, VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, FFVkExecPool *pool, int nb_contexts, int nb_queries, VkQueryType query_type, int query_64bit, const void *query_create_pnext)
Allocates/frees an execution pool.
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
void ff_vk_uninit(FFVulkanContext *s)
Frees main context.
void ff_vk_free_buf(FFVulkanContext *s, FFVkBuffer *buf)
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
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.
AVVulkanDeviceQueueFamily * ff_vk_qf_find(FFVulkanContext *s, VkQueueFlagBits dev_family, VkVideoCodecOperationFlagBitsKHR vid_ops)
Chooses an appropriate QF.
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.
static const struct @257111027162314367033347246032313251342043035002 planes[]
Memory handling functions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
void * priv
private data for use by the filter
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
AVVulkanDeviceQueueFamily * qf
static AVFormatContext * ctx
const unsigned char ff_gblur_comp_spv_data[]
static void init_gaussian_kernel(float *kernel, float sigma, float kernel_size)
static int init_gblur_pipeline(GBlurVulkanContext *s, FFVulkanShader *shd, FFVkBuffer *params_buf, int ksize, float sigma)
static void init_kernel_size(void *log_ctx, int *out_size)
static const AVFilterPad gblur_vulkan_outputs[]
static float gaussian(float sigma, float x)
static float gaussian_simpson_integration(float sigma, float a, float b)
static int gblur_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
static const AVFilterPad gblur_vulkan_inputs[]
#define GBLUR_MAX_KERNEL_SIZE
static av_cold void gblur_vulkan_uninit(AVFilterContext *avctx)
const unsigned int ff_gblur_comp_spv_len
static av_cold void init_gaussian_params(AVFilterContext *ctx)
static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in)
static const AVOption gblur_vulkan_options[]
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
#define FF_VK_DEFAULT_EXEC_CONTEXTS
static int ff_vk_unmap_buffer(FFVulkanContext *s, FFVkBuffer *buf, int flush)
static int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem, int invalidate)
int ff_vk_filter_process_2pass(FFVulkanContext *vkctx, FFVkExecPool *e, FFVulkanShader *shd_list[2], AVFrame *out, AVFrame *tmp, AVFrame *in, VkSampler sampler, uint32_t wgc_z, void *push_src, size_t push_size)
Submit a compute shader with a single in and single out with 2 stages.
int ff_vk_filter_config_input(AVFilterLink *inlink)
int ff_vk_filter_config_output(AVFilterLink *outlink)
int ff_vk_filter_init(AVFilterContext *avctx)
General lavfi IO functions.