|
|
@@ -544,6 +544,30 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) |
|
|
|
return ff_filter_frame(outlink, out); |
|
|
|
} |
|
|
|
|
|
|
|
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, |
|
|
|
char *res, int res_len, int flags) |
|
|
|
{ |
|
|
|
ScaleContext *scale = ctx->priv; |
|
|
|
int ret; |
|
|
|
|
|
|
|
if ( !strcmp(cmd, "width") || !strcmp(cmd, "w") |
|
|
|
|| !strcmp(cmd, "height") || !strcmp(cmd, "h")) { |
|
|
|
|
|
|
|
int old_w = scale->w; |
|
|
|
int old_h = scale->h; |
|
|
|
AVFilterLink *outlink = ctx->outputs[0]; |
|
|
|
|
|
|
|
av_opt_set(scale, cmd, args, 0); |
|
|
|
if ((ret = config_props(outlink)) < 0) { |
|
|
|
scale->w = old_w; |
|
|
|
scale->h = old_h; |
|
|
|
} |
|
|
|
} else |
|
|
|
ret = AVERROR(ENOSYS); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
static const AVClass *child_class_next(const AVClass *prev) |
|
|
|
{ |
|
|
|
return prev ? NULL : sws_get_class(); |
|
|
@@ -610,13 +634,14 @@ static const AVFilterPad avfilter_vf_scale_outputs[] = { |
|
|
|
}; |
|
|
|
|
|
|
|
AVFilter ff_vf_scale = { |
|
|
|
.name = "scale", |
|
|
|
.description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format."), |
|
|
|
.init_dict = init_dict, |
|
|
|
.uninit = uninit, |
|
|
|
.query_formats = query_formats, |
|
|
|
.priv_size = sizeof(ScaleContext), |
|
|
|
.priv_class = &scale_class, |
|
|
|
.inputs = avfilter_vf_scale_inputs, |
|
|
|
.outputs = avfilter_vf_scale_outputs, |
|
|
|
.name = "scale", |
|
|
|
.description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format."), |
|
|
|
.init_dict = init_dict, |
|
|
|
.uninit = uninit, |
|
|
|
.query_formats = query_formats, |
|
|
|
.priv_size = sizeof(ScaleContext), |
|
|
|
.priv_class = &scale_class, |
|
|
|
.inputs = avfilter_vf_scale_inputs, |
|
|
|
.outputs = avfilter_vf_scale_outputs, |
|
|
|
.process_command = process_command, |
|
|
|
}; |