From 3415058541a4ad402eefaa8e25041e85e69e633e Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Sat, 3 Aug 2013 16:30:00 -0700 Subject: vf_scale: add force_original_aspect_ratio Signed-off-by: Michael Niedermayer --- doc/filters.texi | 27 +++++++++++++++++++++++++++ libavfilter/vf_scale.c | 19 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/doc/filters.texi b/doc/filters.texi index cd590573cf..0adec4b809 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -6373,6 +6373,33 @@ Full range (0-255 in case of 8bit luma) "Mpeg" range (16-235 in case of 8bit luma) @end table +@item force_original_aspect_ratio +Enable decreasing or increasing output video width or height if necessary to +keep the original aspect ratio. Possible values: + +@table @samp +@item disable +Scale the video as specified and disable this feature. + +@item decrease +The output video dimensions will automatically be decreased if needed. + +@item increase +The output video dimensions will automatically be increased if needed. + +@end table + +One useful instance of this option is that when you know a specific device's +maximum allowed resolution, you can use this to limit the output video to +that, while retaining the aspect ratio. For example, device A allows +1280x720 playback, and your video is 1920x800. Using this option (set it to +decrease) and specifying 1280x720 to the command line makes the output +1280x533. + +Please note that this is a different thing than specifying -1 for @option{w} +or @option{h}, you still need to specify the output resolution for this option +to work. + @end table The values of the @var{w} and @var{h} options are expressions diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 034da5e6a5..883a0f4899 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -101,6 +101,8 @@ typedef struct { int out_v_chr_pos; int in_h_chr_pos; int in_v_chr_pos; + + int force_original_aspect_ratio; } ScaleContext; static av_cold int init(AVFilterContext *ctx) @@ -274,6 +276,19 @@ static int config_props(AVFilterLink *outlink) if (h == -1) h = av_rescale(w, inlink->h, inlink->w); + if (scale->force_original_aspect_ratio) { + int tmp_w = av_rescale(h, inlink->w, inlink->h); + int tmp_h = av_rescale(w, inlink->h, inlink->w); + + if (scale->force_original_aspect_ratio == 1) { + w = FFMIN(tmp_w, w); + h = FFMIN(tmp_h, h); + } else { + w = FFMAX(tmp_w, w); + h = FFMAX(tmp_h, h); + } + } + if (w > INT_MAX || h > INT_MAX || (h * inlink->w) > INT_MAX || (w * inlink->h) > INT_MAX) @@ -501,6 +516,10 @@ static const AVOption scale_options[] = { { "in_h_chr_pos", "input horizontal chroma position in luma grid/256", OFFSET(in_h_chr_pos), AV_OPT_TYPE_INT, { .i64 = -1}, -1, 512, FLAGS }, { "out_v_chr_pos", "output vertical chroma position in luma grid/256" , OFFSET(out_v_chr_pos), AV_OPT_TYPE_INT, { .i64 = -1}, -1, 512, FLAGS }, { "out_h_chr_pos", "output horizontal chroma position in luma grid/256", OFFSET(out_h_chr_pos), AV_OPT_TYPE_INT, { .i64 = -1}, -1, 512, FLAGS }, + { "force_original_aspect_ratio", "decrease or increase w/h if necessary to keep the original AR", OFFSET(force_original_aspect_ratio), AV_OPT_TYPE_INT, { .i64 = 0}, 0, 2, FLAGS, "force_oar" }, + { "disable", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 0, FLAGS, "force_oar" }, + { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, FLAGS, "force_oar" }, + { "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, FLAGS, "force_oar" }, { NULL }, }; -- cgit v1.2.3