Commit d2b78fe6 authored by Bernd Bleßmann's avatar Bernd Bleßmann Committed by Michael Niedermayer

libavfilter/vf_crop: implement process_command

Signed-off-by: 's avatarBernd Bleßmann <bb@it-entwicklung.de>
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 99ad832c
...@@ -3481,12 +3481,12 @@ It accepts the following parameters: ...@@ -3481,12 +3481,12 @@ It accepts the following parameters:
@item w, out_w @item w, out_w
The width of the output video. It defaults to @code{iw}. The width of the output video. It defaults to @code{iw}.
This expression is evaluated only once during the filter This expression is evaluated only once during the filter
configuration. configuration, or when the @samp{w} or @samp{out_w} command is sent.
@item h, out_h @item h, out_h
The height of the output video. It defaults to @code{ih}. The height of the output video. It defaults to @code{ih}.
This expression is evaluated only once during the filter This expression is evaluated only once during the filter
configuration. configuration, or when the @samp{h} or @samp{out_h} command is sent.
@item x @item x
The horizontal position, in the input video, of the left edge of the output The horizontal position, in the input video, of the left edge of the output
...@@ -3646,6 +3646,22 @@ crop=in_w/2:in_h/2:y:10+10*sin(n/10) ...@@ -3646,6 +3646,22 @@ crop=in_w/2:in_h/2:y:10+10*sin(n/10)
@end example @end example
@end itemize @end itemize
@subsection Commands
This filter supports the following commands:
@table @option
@item w, out_w
@item h, out_h
@item x
@item y
Set width/height of the output video and the horizontal/vertical position
in the input video.
The command accepts the same syntax of the corresponding option.
If the specified expression is not valid, it is kept at its current
value.
@end table
@section cropdetect @section cropdetect
Auto-detect the crop size. Auto-detect the crop size.
......
...@@ -296,6 +296,42 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) ...@@ -296,6 +296,42 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame)
return ff_filter_frame(link->dst->outputs[0], frame); return ff_filter_frame(link->dst->outputs[0], frame);
} }
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
char *res, int res_len, int flags)
{
CropContext *s = ctx->priv;
int ret;
if ( !strcmp(cmd, "out_w") || !strcmp(cmd, "w")
|| !strcmp(cmd, "out_h") || !strcmp(cmd, "h")
|| !strcmp(cmd, "x") || !strcmp(cmd, "y")) {
int old_x = s->x;
int old_y = s->y;
int old_w = s->w;
int old_h = s->h;
AVFilterLink *outlink = ctx->outputs[0];
AVFilterLink *inlink = ctx->inputs[0];
av_opt_set(s, cmd, args, 0);
if ((ret = config_input(inlink)) < 0) {
s->x = old_x;
s->y = old_y;
s->w = old_w;
s->h = old_h;
return ret;
}
ret = config_output(outlink);
} else
ret = AVERROR(ENOSYS);
return ret;
}
#define OFFSET(x) offsetof(CropContext, x) #define OFFSET(x) offsetof(CropContext, x)
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
...@@ -332,12 +368,13 @@ static const AVFilterPad avfilter_vf_crop_outputs[] = { ...@@ -332,12 +368,13 @@ static const AVFilterPad avfilter_vf_crop_outputs[] = {
}; };
AVFilter ff_vf_crop = { AVFilter ff_vf_crop = {
.name = "crop", .name = "crop",
.description = NULL_IF_CONFIG_SMALL("Crop the input video."), .description = NULL_IF_CONFIG_SMALL("Crop the input video."),
.priv_size = sizeof(CropContext), .priv_size = sizeof(CropContext),
.priv_class = &crop_class, .priv_class = &crop_class,
.query_formats = query_formats, .query_formats = query_formats,
.uninit = uninit, .uninit = uninit,
.inputs = avfilter_vf_crop_inputs, .inputs = avfilter_vf_crop_inputs,
.outputs = avfilter_vf_crop_outputs, .outputs = avfilter_vf_crop_outputs,
.process_command = process_command,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment