diff options
author | Wu Jianhua <jianhua.wu-at-intel.com@ffmpeg.org> | 2022-01-02 22:51:39 +0800 |
---|---|---|
committer | Lynne <dev@lynne.ee> | 2022-01-03 03:17:43 +0100 |
commit | c7c37a8f226cd6ed699c242358d0441faabc80f9 (patch) | |
tree | 159c49629574cc72595cbeb72d020c8e005b1377 /libavfilter | |
parent | b84ce56589755ec290b8564a5d69c5cb1b2adec6 (diff) | |
download | ffmpeg-c7c37a8f226cd6ed699c242358d0441faabc80f9.tar.gz |
transpose_vulkan: add passthrough option
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>
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/vf_transpose_vulkan.c | 22 |
1 files changed, 22 insertions, 0 deletions
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 } }; |