[FFmpeg-devel] [PATCH] lavfi/rotate: add angle command
Stefano Sabatini
stefasab at gmail.com
Thu Jun 13 01:48:34 CEST 2013
On date Wednesday 2013-06-12 10:01:31 +0200, Clément Bœsch encoded:
> On Tue, Jun 11, 2013 at 04:09:37PM +0200, Stefano Sabatini wrote:
> > ---
> > doc/filters.texi | 13 +++++++++++++
> > libavfilter/vf_rotate.c | 36 ++++++++++++++++++++++++++++++++++++
> > 2 files changed, 49 insertions(+)
> >
> > diff --git a/doc/filters.texi b/doc/filters.texi
> > index 7e8fff9..c4ad494 100644
> > --- a/doc/filters.texi
> > +++ b/doc/filters.texi
> > @@ -5852,6 +5852,19 @@ rotate=2*PI*t:ow='min(iw,ih)/sqrt(2)':oh=ow
> > @end example
> > @end itemize
> >
> > + at subsection Commands
> > +
> > +The filter supports the following commands:
> > +
> > + at table @option
> > + at item a, angle
> > +Set the angle expression.
> > +The command accepts the same syntax of the corresponding option.
> > +
> > +If the specified expression is not valid, it is kept at its current
> > +value.
> > + at end table
> > +
> > @section removelogo
> >
> > Suppress a TV station logo, using an image file to determine which
> > diff --git a/libavfilter/vf_rotate.c b/libavfilter/vf_rotate.c
> > index da294c3..ce31a7c 100644
> > --- a/libavfilter/vf_rotate.c
> > +++ b/libavfilter/vf_rotate.c
> > @@ -425,6 +425,41 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
> > return ff_filter_frame(outlink, out);
> > }
> >
> > +static int set_expr(AVExpr **pexpr, const char *expr, const char *option, void *log_ctx)
> > +{
> > + int ret;
> > + AVExpr *old = NULL;
> > +
>
> > + if (*pexpr)
> > + old = *pexpr;
>
> That check is wrong (dereference in the if), or at best useless.
>
> > + ret = av_expr_parse(pexpr, expr, var_names,
> > + NULL, NULL, NULL, NULL, 0, log_ctx);
> > + if (ret < 0) {
> > + av_log(log_ctx, AV_LOG_ERROR,
> > + "Error when evaluating the expression '%s' for %s\n",
> > + expr, option);
> > + *pexpr = old;
> > + return ret;
> > + }
> > +
> > + av_expr_free(old);
> > + return 0;
> > +}
> > +
> > +static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
> > + char *res, int res_len, int flags)
> > +{
> > + RotContext *rot = ctx->priv;
> > + int ret;
> > +
> > + if (!strcmp(cmd, "angle") || !strcmp(cmd, "a")) {
> > + ret = set_expr(&rot->angle_expr, args, cmd, ctx);
> > + } else
> > + ret = AVERROR(ENOSYS);
> > +
> > + return ret;
> > +}
> > +
> > static const AVFilterPad rotate_inputs[] = {
> > {
> > .name = "default",
> > @@ -453,4 +488,5 @@ AVFilter avfilter_vf_rotate = {
> > .inputs = rotate_inputs,
> > .outputs = rotate_outputs,
> > .priv_class = &rotate_class,
> > + .process_command = process_command,
>
> Rest LGTM
Simplified, pushed.
--
FFmpeg = Forgiving and Fast Mastodontic Powered Elitist Genius
More information about the ffmpeg-devel
mailing list