diff mbox series

[FFmpeg-devel,2/5] transpose_vulkan: add passthrough option

Message ID 20220102145142.4083918-2-jianhua.wu@intel.com
State Accepted
Commit c7c37a8f226cd6ed699c242358d0441faabc80f9
Headers show
Series [FFmpeg-devel,1/5] avutil/hwcontext_vulkan: fixed validation error VUID 01387 | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_ppc success Make finished
andriy/make_fate_ppc fail Make fate failed

Commit Message

Wu, Jianhua Jan. 2, 2022, 2:51 p.m. UTC
The following command is on how to apply passthrough option:

ffmpeg -init_hw_device vulkan -i input.264 -vf hwupload=extra_hw_frames=16,transpose_vulkan=passthrough=landscape,hwdownload,format=yuv420p output.264

Signed-off-by: Wu Jianhua <jianhua.wu@intel.com>
---
 libavfilter/vf_transpose_vulkan.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

Comments

Anton Khirnov Jan. 10, 2022, 2:19 p.m. UTC | #1
It sure would be nice if all the different hw flavors of the same filter
could share code.
Wu Jianhua Jan. 10, 2022, 3:52 p.m. UTC | #2
> It sure would be nice if all the different hw flavors of the same filter
> could share code.

Yeah. Definitely. The config_output function of the same filter
implemented by different hw is similar. Maybe something like
this could be integrated into one separate function.

Best Regards,
Jianhua
diff mbox series

Patch

diff --git a/libavfilter/vf_transpose_vulkan.c b/libavfilter/vf_transpose_vulkan.c
index ce83cf0fd7..30d052e08c 100644
--- a/libavfilter/vf_transpose_vulkan.c
+++ b/libavfilter/vf_transpose_vulkan.c
@@ -35,6 +35,7 @@  typedef struct TransposeVulkanContext {
     VkDescriptorImageInfo output_images[3];
 
     int dir;
+    int passthrough;
     int initialized;
 } TransposeVulkanContext;
 
@@ -222,6 +223,9 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     TransposeVulkanContext *s = ctx->priv;
     AVFilterLink *outlink = ctx->outputs[0];
 
+    if (s->passthrough)
+        return ff_filter_frame(outlink, in);
+
     out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
     if (!out) {
         err = AVERROR(ENOMEM);
@@ -267,6 +271,17 @@  static int config_props_output(AVFilterLink *outlink)
     FFVulkanContext *vkctx = &s->vkctx;
     AVFilterLink *inlink = avctx->inputs[0];
 
+    if ((inlink->w >= inlink->h && s->passthrough == TRANSPOSE_PT_TYPE_LANDSCAPE) ||
+        (inlink->w <= inlink->h && s->passthrough == TRANSPOSE_PT_TYPE_PORTRAIT)) {
+        av_log(avctx, AV_LOG_VERBOSE,
+               "w:%d h:%d -> w:%d h:%d (passthrough mode)\n",
+               inlink->w, inlink->h, inlink->w, inlink->h);
+        outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
+        return outlink->hw_frames_ctx ? 0 : AVERROR(ENOMEM);
+    } else {
+        s->passthrough = TRANSPOSE_PT_TYPE_NONE;
+    }
+
     vkctx->output_width  = inlink->h;
     vkctx->output_height = inlink->w;
 
@@ -288,6 +303,13 @@  static const AVOption transpose_vulkan_options[] = {
         { "clock",       "rotate clockwise",                            0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK       }, .flags=FLAGS, .unit = "dir" },
         { "cclock",      "rotate counter-clockwise",                    0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK      }, .flags=FLAGS, .unit = "dir" },
         { "clock_flip",  "rotate clockwise with vertical flip",         0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP  }, .flags=FLAGS, .unit = "dir" },
+
+    { "passthrough", "do not apply transposition if the input matches the specified geometry",
+      OFFSET(passthrough), AV_OPT_TYPE_INT, {.i64=TRANSPOSE_PT_TYPE_NONE},  0, INT_MAX, FLAGS, "passthrough" },
+        { "none",      "always apply transposition",   0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_NONE},      INT_MIN, INT_MAX, FLAGS, "passthrough" },
+        { "portrait",  "preserve portrait geometry",   0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_PORTRAIT},  INT_MIN, INT_MAX, FLAGS, "passthrough" },
+        { "landscape", "preserve landscape geometry",  0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_LANDSCAPE}, INT_MIN, INT_MAX, FLAGS, "passthrough" },
+
     { NULL }
 };