diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 7eabe00a23..ac9d4c31fe 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -71,6 +71,13 @@ enum var_name { VARS_NB }; +enum EvalMode { + EVAL_MODE_INIT, + EVAL_MODE_FRAME, + EVAL_MODE_NB +}; + + typedef struct ScaleContext { const AVClass *class; struct SwsContext *sws; ///< software scaler context @@ -112,6 +119,9 @@ typedef struct ScaleContext { int force_original_aspect_ratio; int nb_slices; + + int eval_mode; ///< expression evaluation mode + } ScaleContext; AVFilter ff_vf_scale2ref; @@ -494,17 +504,25 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) if( in->width != link->w || in->height != link->h - || in->format != link->format) { + || in->format != link->format + || in->sample_aspect_ratio.den != link->sample_aspect_ratio.den || in->sample_aspect_ratio.num != link->sample_aspect_ratio.num) { int ret; - snprintf(buf, sizeof(buf)-1, "%d", outlink->w); - av_opt_set(scale, "w", buf, 0); - snprintf(buf, sizeof(buf)-1, "%d", outlink->h); - av_opt_set(scale, "h", buf, 0); + + if (scale->eval_mode == EVAL_MODE_INIT) { + snprintf(buf, sizeof(buf)-1, "%d", outlink->w); + av_opt_set(scale, "w", buf, 0); + snprintf(buf, sizeof(buf)-1, "%d", outlink->h); + av_opt_set(scale, "h", buf, 0); + } link->dst->inputs[0]->format = in->format; link->dst->inputs[0]->w = in->width; link->dst->inputs[0]->h = in->height; + link->dst->inputs[0]->sample_aspect_ratio.den = in->sample_aspect_ratio.den; + link->dst->inputs[0]->sample_aspect_ratio.num = in->sample_aspect_ratio.num; + + if ((ret = config_props(outlink)) < 0) return ret; } @@ -665,6 +683,9 @@ static const AVOption scale_options[] = { { "param0", "Scaler param 0", OFFSET(param[0]), AV_OPT_TYPE_DOUBLE, { .dbl = SWS_PARAM_DEFAULT }, INT_MIN, INT_MAX, FLAGS }, { "param1", "Scaler param 1", OFFSET(param[1]), AV_OPT_TYPE_DOUBLE, { .dbl = SWS_PARAM_DEFAULT }, INT_MIN, INT_MAX, FLAGS }, { "nb_slices", "set the number of slices (debug purpose only)", OFFSET(nb_slices), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS }, + { "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" }, { NULL } };