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
36313631 find_rect_filter_deps="avcodec avformat gpl"
36323632 firequalizer_filter_deps="avcodec"
36333633 firequalizer_filter_select="rdft"
3634+flip_vulkan_filter_deps="vulkan spirv_compiler"
36343635 flite_filter_deps="libflite"
36353636 framerate_filter_select="scene_sad"
36363637 freezedetect_filter_select="scene_sad"
libavfilter/allfilters.c+1−0
@@ -265,6 +265,7 @@ extern const AVFilter ff_vf_fieldmatch; · 264 unmodified lines
265265 extern const AVFilter ff_vf_fieldorder;
266266 extern const AVFilter ff_vf_fillborders;
267267 extern const AVFilter ff_vf_find_rect;
268+extern const AVFilter ff_vf_flip_vulkan;
268269 extern const AVFilter ff_vf_floodfill;
269270 extern const AVFilter ff_vf_format;
270271 extern const AVFilter ff_vf_fps;
libavfilter/vf_flip_vulkan.c+49−12
@@ -26,7 +26,8 @@ · 25 unmodified lines
2626
2727 enum FlipType {
2828 FLIP_VERTICAL,
29− FLIP_HORIZONTAL
29+ FLIP_HORIZONTAL,
30+ FLIP_BOTH
3031 };
3132
3233 typedef struct FlipVulkanContext {
@@ -104,6 +105,9 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in, enum FlipType · 71 unmodified lines
104105 case FLIP_VERTICAL:
105106 GLSLF(2, vec4 res = texture(input_image[%i], ivec2(pos.x, size.y - pos.y)); ,i);
106107 break;
108+ case FLIP_BOTH:
109+ GLSLF(2, vec4 res = texture(input_image[%i], ivec2(size.xy - pos.xy));, i);
110+ break;
107111 default:
108112 GLSLF(2, vec4 res = texture(input_image[%i], pos); ,i);
109113 break;
@@ -226,7 +230,7 @@ fail: · 116 unmodified lines
226230 return err;
227231 }
228232
229−static int flip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in, enum FlipType type)
233+static int filter_frame(AVFilterLink *link, AVFrame *in, enum FlipType type)
230234 {
231235 int err;
232236 AVFrame *out = NULL;
@@ -259,14 +263,27 @@ fail: · 26 unmodified lines
259263
260264 static int hflip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
261265 {
262− return flip_vulkan_filter_frame(link, in, FLIP_HORIZONTAL);
266+ return filter_frame(link, in, FLIP_HORIZONTAL);
263267 }
264268
265269 static int vflip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
266270 {
267− return flip_vulkan_filter_frame(link, in, FLIP_VERTICAL);
271+ return filter_frame(link, in, FLIP_VERTICAL);
268272 }
269273
274+static int flip_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
275+{
276+ return filter_frame(link, in, FLIP_BOTH);
277+}
278+
279+static 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+
270287 static const AVOption hflip_vulkan_options[] = {
271288 { NULL },
272289 };
@@ -282,14 +299,6 @@ static const AVFilterPad hflip_vulkan_inputs[] = { · 9 unmodified lines
282299 }
283300 };
284301
285−static 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−
293302 const AVFilter ff_vf_hflip_vulkan = {
294303 .name = "hflip_vulkan",
295304 .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
330339 .priv_class = &vflip_vulkan_class,
331340 .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
332341 };
342+
343+static const AVOption flip_vulkan_options[] = {
344+ { NULL },
345+};
346+
347+AVFILTER_DEFINE_CLASS(flip_vulkan);
348+
349+static 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+
358+const 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