diff --git a/doc/filters.texi b/doc/filters.texi
index 282355ad77771d0a5a988e8809bcb74d24b994f3..c0bd2816002e17effcb93462d2c5508b0d7ac7a7 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -5883,6 +5883,19 @@ rotate=2*PI*t:ow='min(iw,ih)/sqrt(2)':oh=ow:c=none
 @end example
 @end itemize
 
+@subsection Commands
+
+The filter supports the following commands:
+
+@table @option
+@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.
+@end table
+
 @section sab
 
 Apply Shape Adaptive Blur.
diff --git a/libavfilter/version.h b/libavfilter/version.h
index c71cce65a8b3fff6a6d76eb4f27d45882f79af86..4485a7fb045b0d564ec519af4dca81cc7f307cbb 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -31,7 +31,7 @@
 
 #define LIBAVFILTER_VERSION_MAJOR  3
 #define LIBAVFILTER_VERSION_MINOR  76
-#define LIBAVFILTER_VERSION_MICRO 100
+#define LIBAVFILTER_VERSION_MICRO 101
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
                                                LIBAVFILTER_VERSION_MINOR, \
diff --git a/libavfilter/vf_rotate.c b/libavfilter/vf_rotate.c
index b2fe66197db4f061098b7445e4bcc1da9508feed..a032f99086739a30e09f26ba136200b770647079 100644
--- a/libavfilter/vf_rotate.c
+++ b/libavfilter/vf_rotate.c
@@ -409,6 +409,29 @@ static int filter_frame(AVFilterLink *inlink, 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)
+{
+    RotContext *rot = ctx->priv;
+    int ret;
+
+    if (!strcmp(cmd, "angle") || !strcmp(cmd, "a")) {
+        AVExpr *old = rot->angle_expr;
+        ret = av_expr_parse(&rot->angle_expr, args, var_names,
+                            NULL, NULL, NULL, NULL, 0, ctx);
+        if (ret < 0) {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Error when parsing the expression '%s' for angle command\n", args);
+            rot->angle_expr = old;
+            return ret;
+        }
+        av_expr_free(old);
+    } else
+        ret = AVERROR(ENOSYS);
+
+    return ret;
+}
+
 static const AVFilterPad rotate_inputs[] = {
     {
         .name         = "default",
@@ -434,6 +457,7 @@ AVFilter avfilter_vf_rotate = {
     .init          = init,
     .uninit        = uninit,
     .query_formats = query_formats,
+    .process_command = process_command,
     .inputs        = rotate_inputs,
     .outputs       = rotate_outputs,
     .priv_class    = &rotate_class,