vf_scale: add force_original_aspect_ratio
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
48188a5120
commit
3415058541
@ -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
|
||||
|
@ -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 },
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user