History

avfilter: add a flip_vulkan filter

This filter flips the input video both horizontally and vertically in one compute pipeline, and it's no need to use two pipelines for hflip_vulkan,vflip_vulkan anymore.

Wu Jianhua committed 4 years ago

Commit bdfb0e41 parent fc9a6863 files · +51 −12Browse files

Unified · Split

3 files
  1. configure +1 −0
  2. libavfilter/allfilters.c +1 −0
  3. libavfilter/vf_flip_vulkan.c +49 −12
configure+1−0
@@ -3631,6 +3631,7 @@ fftdnoiz_filter_select="fft" · 3630 unmodified lines
3631find_rect_filter_deps="avcodec avformat gpl"3631find_rect_filter_deps="avcodec avformat gpl"
3632firequalizer_filter_deps="avcodec"3632firequalizer_filter_deps="avcodec"
3633firequalizer_filter_select="rdft"3633firequalizer_filter_select="rdft"
3634flip_vulkan_filter_deps="vulkan spirv_compiler"
3634flite_filter_deps="libflite"3635flite_filter_deps="libflite"
3635framerate_filter_select="scene_sad"3636framerate_filter_select="scene_sad"
3636freezedetect_filter_select="scene_sad"3637freezedetect_filter_select="scene_sad"
libavfilter/allfilters.c+1−0
@@ -265,6 +265,7 @@ extern const AVFilter ff_vf_fieldmatch; · 264 unmodified lines
265extern const AVFilter ff_vf_fieldorder;265extern const AVFilter ff_vf_fieldorder;
266extern const AVFilter ff_vf_fillborders;266extern const AVFilter ff_vf_fillborders;
267extern const AVFilter ff_vf_find_rect;267extern const AVFilter ff_vf_find_rect;
268extern const AVFilter ff_vf_flip_vulkan;
268extern const AVFilter ff_vf_floodfill;269extern const AVFilter ff_vf_floodfill;
269extern const AVFilter ff_vf_format;270extern const AVFilter ff_vf_format;
270extern const AVFilter ff_vf_fps;271extern const AVFilter ff_vf_fps;
libavfilter/vf_flip_vulkan.c+49−12
@@ -26,7 +26,8 @@ · 25 unmodified lines
26 26
27enum FlipType {27enum FlipType {
28 FLIP_VERTICAL,28 FLIP_VERTICAL,
29 FLIP_HORIZONTAL29 FLIP_HORIZONTAL,
30 FLIP_BOTH
30};31};
31 32
32typedef struct FlipVulkanContext {33typedef struct FlipVulkanContext {
@@ -104,6 +105,9 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in, enum FlipType · 71 unmodified lines
104 case FLIP_VERTICAL:105 case FLIP_VERTICAL:
105 GLSLF(2, vec4 res = texture(input_image[%i], ivec2(pos.x, size.y - pos.y)); ,i);106 GLSLF(2, vec4 res = texture(input_image[%i], ivec2(pos.x, size.y - pos.y)); ,i);
106 break;107 break;
108 case FLIP_BOTH:
109 GLSLF(2, vec4 res = texture(input_image[%i], ivec2(size.xy - pos.xy));, i);
110 break;
107 default:111 default:
108 GLSLF(2, vec4 res = texture(input_image[%i], pos); ,i);112 GLSLF(2, vec4 res = texture(input_image[%i], pos); ,i);
109 break;113 break;
@@ -226,7 +230,7 @@ fail: · 116 unmodified lines
226 return err;230 return err;
227}231}
228 232
229static int flip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in, enum FlipType type)233static int filter_frame(AVFilterLink *link, AVFrame *in, enum FlipType type)
230{234{
231 int err;235 int err;
232 AVFrame *out = NULL;236 AVFrame *out = NULL;
@@ -259,14 +263,27 @@ fail: · 26 unmodified lines
259 263
260static int hflip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)264static int hflip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
261{265{
262 return flip_vulkan_filter_frame(link, in, FLIP_HORIZONTAL);266 return filter_frame(link, in, FLIP_HORIZONTAL);
263}267}
264 268
265static int vflip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)269static int vflip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
266{270{
267 return flip_vulkan_filter_frame(link, in, FLIP_VERTICAL);271 return filter_frame(link, in, FLIP_VERTICAL);
268}272}
269 273
274static int flip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
275{
276 return filter_frame(link, in, FLIP_BOTH);
277}
278
279static const AVFilterPad flip_vulkan_outputs[] = {
280 {
281 .name = "default",
282 .type = AVMEDIA_TYPE_VIDEO,
283 .config_props = &ff_vk_filter_config_output,
284 }
285};
286
270static const AVOption hflip_vulkan_options[] = {287static const AVOption hflip_vulkan_options[] = {
271 { NULL },288 { NULL },
272};289};
@@ -282,14 +299,6 @@ static const AVFilterPad hflip_vulkan_inputs[] = { · 9 unmodified lines
282 }299 }
283};300};
284 301
285static const AVFilterPad flip_vulkan_outputs[] = {
286 {
287 .name = "default",
288 .type = AVMEDIA_TYPE_VIDEO,
289 .config_props = &ff_vk_filter_config_output,
290 }
291};
292
293const AVFilter ff_vf_hflip_vulkan = {302const AVFilter ff_vf_hflip_vulkan = {
294 .name = "hflip_vulkan",303 .name = "hflip_vulkan",
295 .description = NULL_IF_CONFIG_SMALL("Horizontally flip the input video in Vulkan"),304 .description = NULL_IF_CONFIG_SMALL("Horizontally flip the input video in Vulkan"),
@@ -330,3 +339,31 @@ const AVFilter ff_vf_vflip_vulkan = { · 34 unmodified lines
330 .priv_class = &vflip_vulkan_class,339 .priv_class = &vflip_vulkan_class,
331 .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,340 .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
332};341};
342
343static const AVOption flip_vulkan_options[] = {
344 { NULL },
345};
346
347AVFILTER_DEFINE_CLASS(flip_vulkan);
348
349static const AVFilterPad flip_vulkan_inputs[] = {
350 {
351 .name = "default",
352 .type = AVMEDIA_TYPE_VIDEO,
353 .filter_frame = &flip_vulkan_filter_frame,
354 .config_props = &ff_vk_filter_config_input,
355 }
356};
357
358const AVFilter ff_vf_flip_vulkan = {
359 .name = "flip_vulkan",
360 .description = NULL_IF_CONFIG_SMALL("Flip both horizontally and vertically"),
361 .priv_size = sizeof(FlipVulkanContext),
362 .init = &ff_vk_filter_init,
363 .uninit = &flip_vulkan_uninit,
364 FILTER_INPUTS(flip_vulkan_inputs),
365 FILTER_OUTPUTS(flip_vulkan_outputs),
366 FILTER_SINGLE_PIXFMT(AV_PIX_FMT_VULKAN),
367 .priv_class = &flip_vulkan_class,
368 .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
369};

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t