X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvf_pad.c;h=44a8fec0cb3f912e0f03660eace169f96c670f7f;hb=f3d8e0d369456113d1223cdf77072b52fc79eceb;hp=61927b654aba12ea2bffd95b09c6f470fb06e315;hpb=edfa7ac8ec4a3a51951b7f2c0d7589ca965556fd;p=ffmpeg diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c index 61927b654ab..44a8fec0cb3 100644 --- a/libavfilter/vf_pad.c +++ b/libavfilter/vf_pad.c @@ -24,6 +24,8 @@ * video padding filter */ +#include /* DBL_MAX */ + #include "avfilter.h" #include "formats.h" #include "internal.h" @@ -87,6 +89,7 @@ typedef struct PadContext { int x, y; ///< offsets of the input area with respect to the padded area int in_w, in_h; ///< width and height for the padded input video, which has to be aligned to the chroma values in order to avoid chroma issues int inlink_w, inlink_h; + AVRational aspect; char *w_expr; ///< width expression string char *h_expr; ///< height expression string @@ -103,6 +106,7 @@ static int config_input(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; PadContext *s = ctx->priv; + AVRational adjusted_aspect = s->aspect; int ret; double var_values[VARS_NB], res; char *expr; @@ -143,6 +147,15 @@ static int config_input(AVFilterLink *inlink) if (!s->w) var_values[VAR_OUT_W] = var_values[VAR_OW] = s->w = inlink->w; + if (adjusted_aspect.num && adjusted_aspect.den) { + adjusted_aspect = av_div_q(adjusted_aspect, inlink->sample_aspect_ratio); + if (s->h < av_rescale(s->w, adjusted_aspect.den, adjusted_aspect.num)) { + s->h = var_values[VAR_OUT_H] = var_values[VAR_OH] = av_rescale(s->w, adjusted_aspect.den, adjusted_aspect.num); + } else { + s->w = var_values[VAR_OUT_W] = var_values[VAR_OW] = av_rescale(s->h, adjusted_aspect.num, adjusted_aspect.den); + } + } + /* evaluate x and y */ av_expr_parse_and_eval(&res, (expr = s->x_expr), var_names, var_values, @@ -409,6 +422,7 @@ static const AVOption pad_options[] = { { "eval", "specify when to evaluate expressions", OFFSET(eval_mode), AV_OPT_TYPE_INT, {.i64 = EVAL_MODE_INIT}, 0, EVAL_MODE_NB-1, FLAGS, "eval" }, { "init", "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_INIT}, .flags = FLAGS, .unit = "eval" }, { "frame", "eval expressions during initialization and per-frame", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_FRAME}, .flags = FLAGS, .unit = "eval" }, + { "aspect", "pad to fit an aspect instead of a resolution", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl = 0}, 0, DBL_MAX, FLAGS }, { NULL } };