[FFmpeg-devel] [PATCH] lavfi/rotate: add angle command

Stefano Sabatini stefasab at gmail.com
Tue Jun 11 16:09:37 CEST 2013


---
 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;
+    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,
 };
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list