[FFmpeg-devel] [PATCH] lavfi/hue: add process_command callback

Jérémy Tran tran.jeremy.av at gmail.com
Wed Aug 29 23:08:43 CEST 2012


This allows dynamic reconfiguration of the filter.
The callback uses some code that was in the init function. Hence this code
has been moved in its own function.

Since the hue may now change multiple times, it is no longer possible to
check if hue->hue_deg and hue->hue are both different to -FLT_MAX to verify
that they have not been defined at the same time.
The test now uses strchr on the 'args' string and looks for the options'
name.
---
 doc/filters.texi     | 12 ++++++++++++
 libavfilter/vf_hue.c | 42 +++++++++++++++++++++++++++++++++++++-----
 2 files changed, 49 insertions(+), 5 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index bef95f7..42f32a2 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -2313,6 +2313,18 @@ hue=PI/2:1
 @end example
 @end itemize
 
+ at subsection commands
+
+The filter supports the following command:
+ at table @option
+ at item reinit
+Modify the hue and/or the saturation of the input video.
+The command accepts the same named options and syntax than when calling the
+filter from the command-line.
+
+If a parameter is omitted, it kept at its current value.
+ at end table
+
 @section idet
 
 Interlaceing detect filter. This filter tries to detect if the input is
diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c
index cf1fe5f..d1aa631 100644
--- a/libavfilter/vf_hue.c
+++ b/libavfilter/vf_hue.c
@@ -63,22 +63,19 @@ static const AVOption hue_options[] = {
 
 AVFILTER_DEFINE_CLASS(hue);
 
-static av_cold int init(AVFilterContext *ctx, const char *args)
+static inline int set_options(AVFilterContext *ctx, const char *args)
 {
     HueContext *hue = ctx->priv;
     int n, ret;
     char c1 = 0, c2 = 0;
     char *equal;
 
-    hue->class = &hue_class;
-    av_opt_set_defaults(hue);
-
     if (args) {
         /* named options syntax */
         if (equal = strchr(args, '=')) {
             if ((ret = av_set_options_string(hue, args, "=", ":")) < 0)
                 return ret;
-            if (hue->hue != -FLT_MAX && hue->hue_deg != -FLT_MAX) {
+            if (strchr(args, 'h') && strchr(args, 'H')) {
                 av_log(ctx, AV_LOG_ERROR,
                        "H and h options are incompatible and cannot be specified "
                        "at the same time\n");
@@ -103,6 +100,20 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
         }
     }
 
+    return 0;
+}
+
+static av_cold int init(AVFilterContext *ctx, const char *args)
+{
+    HueContext *hue = ctx->priv;
+    int ret;
+
+    hue->class = &hue_class;
+    av_opt_set_defaults(hue);
+
+    if ((ret = set_options(ctx, args)) < 0)
+        return ret;
+
     if (hue->saturation == -FLT_MAX)
         hue->hue = SAT_DEFAULT_VAL;
     if (hue->hue == -FLT_MAX)
@@ -223,6 +234,26 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
 }
 
+static int command(AVFilterContext *ctx, const char *cmd, const char *args,
+                   char *res, int res_len, int flags)
+{
+    HueContext *hue = ctx->priv;
+    int ret;
+
+    if (!strcmp(cmd, "reinit")) {
+        if ((ret = set_options(ctx, args)) < 0)
+            return ret;
+        if (strchr(args, 'h'))
+            hue->hue = hue->hue_deg * M_PI / 180;
+
+        hue->hue_sin = rint(sin(hue->hue) * (1 << 16) * hue->saturation);
+        hue->hue_cos = rint(cos(hue->hue) * (1 << 16) * hue->saturation);
+    } else
+        return AVERROR(ENOSYS);
+
+    return 0;
+}
+
 AVFilter avfilter_vf_hue = {
     .name        = "hue",
     .description = NULL_IF_CONFIG_SMALL("Adjust the hue and saturation of the input video."),
@@ -232,6 +263,7 @@ AVFilter avfilter_vf_hue = {
     .init          = init,
     .uninit        = uninit,
     .query_formats = query_formats,
+    .process_command = command,
 
     .inputs = (const AVFilterPad[]) {
         {
-- 
1.7.11.3



More information about the ffmpeg-devel mailing list