[FFmpeg-cvslog] vf_gradfun: switch to an AVOptions-based system.

Anton Khirnov git at videolan.org
Wed Apr 10 21:14:09 CEST 2013


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Mon Feb 25 21:21:29 2013 +0100| [7ed833d78ea661d619124fd898547a900f6480bc] | committer: Anton Khirnov

vf_gradfun: switch to an AVOptions-based system.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7ed833d78ea661d619124fd898547a900f6480bc
---

 doc/filters.texi         |   28 ++++++++++++++++------------
 libavfilter/gradfun.h    |    2 ++
 libavfilter/vf_gradfun.c |   29 ++++++++++++++++++++---------
 3 files changed, 38 insertions(+), 21 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index 51f7833..f4f5cf5 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -1174,23 +1174,27 @@ This filter is designed for playback only.  Do not use it prior to
 lossy compression, because compression tends to lose the dither and
 bring back the bands.
 
-The filter takes two optional parameters, separated by ':':
- at var{strength}:@var{radius}
+This filter accepts the following options:
+
+ at table @option
 
- at var{strength} is the maximum amount by which the filter will change
-any one pixel. Also the threshold for detecting nearly flat
-regions. Acceptable values range from .51 to 64, default value is
-1.2, out-of-range values will be clipped to the valid range.
+ at item strength
+The maximum amount by which the filter will change any one pixel. Also the
+threshold for detecting nearly flat regions. Acceptable values range from .51 to
+64, default value is 1.2, out-of-range values will be clipped to the valid
+range.
 
- at var{radius} is the neighborhood to fit the gradient to. A larger
-radius makes for smoother gradients, but also prevents the filter from
-modifying the pixels near detailed regions. Acceptable values are
-8-32, default value is 16, out-of-range values will be clipped to the
-valid range.
+ at item radius
+The neighborhood to fit the gradient to. A larger radius makes for smoother
+gradients, but also prevents the filter from modifying the pixels near detailed
+regions. Acceptable values are 8-32, default value is 16, out-of-range values
+will be clipped to the valid range.
+
+ at end table
 
 @example
 # default parameters
-gradfun=1.2:16
+gradfun=strength=1.2:radius=16
 
 # omitting radius
 gradfun=1.2
diff --git a/libavfilter/gradfun.h b/libavfilter/gradfun.h
index 876579a..01e9eed 100644
--- a/libavfilter/gradfun.h
+++ b/libavfilter/gradfun.h
@@ -26,6 +26,8 @@
 
 /// Holds instance-specific information for gradfun.
 typedef struct GradFunContext {
+    const AVClass *class;
+    float strength;
     int thresh;    ///< threshold for gradient algorithm
     int radius;    ///< blur radius
     int chroma_w;  ///< width of the chroma planes
diff --git a/libavfilter/vf_gradfun.c b/libavfilter/vf_gradfun.c
index 900ef60..4278a9d 100644
--- a/libavfilter/vf_gradfun.c
+++ b/libavfilter/vf_gradfun.c
@@ -35,6 +35,7 @@
 #include "libavutil/imgutils.h"
 #include "libavutil/common.h"
 #include "libavutil/cpu.h"
+#include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
 #include "formats.h"
@@ -122,15 +123,9 @@ static void filter(GradFunContext *ctx, uint8_t *dst, uint8_t *src, int width, i
 static av_cold int init(AVFilterContext *ctx, const char *args)
 {
     GradFunContext *gf = ctx->priv;
-    float thresh = 1.2;
-    int radius = 16;
 
-    if (args)
-        sscanf(args, "%f:%d", &thresh, &radius);
-
-    thresh = av_clipf(thresh, 0.51, 64);
-    gf->thresh = (1 << 15) / thresh;
-    gf->radius = av_clip((radius + 1) & ~1, 4, 32);
+    gf->thresh  = (1 << 15) / gf->strength;
+    gf->radius &= ~1;
 
     gf->blur_line = ff_gradfun_blur_line_c;
     gf->filter_line = ff_gradfun_filter_line_c;
@@ -138,7 +133,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
     if (ARCH_X86)
         ff_gradfun_init_x86(gf);
 
-    av_log(ctx, AV_LOG_VERBOSE, "threshold:%.2f radius:%d\n", thresh, gf->radius);
+    av_log(ctx, AV_LOG_VERBOSE, "threshold:%.2f radius:%d\n", gf->strength, gf->radius);
 
     return 0;
 }
@@ -227,6 +222,21 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     return ff_filter_frame(outlink, out);
 }
 
+#define OFFSET(x) offsetof(GradFunContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
+static const AVOption options[] = {
+    { "strength", "The maximum amount by which the filter will change any one pixel.", OFFSET(strength), AV_OPT_TYPE_FLOAT, { .dbl = 1.2 }, 0.51, 64, FLAGS },
+    { "radius",   "The neighborhood to fit the gradient to.",                          OFFSET(radius),   AV_OPT_TYPE_INT,   { .i64 = 16  }, 4,    32, FLAGS },
+    { NULL },
+};
+
+static const AVClass gradfun_class = {
+    .class_name = "gradfun",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 static const AVFilterPad avfilter_vf_gradfun_inputs[] = {
     {
         .name         = "default",
@@ -249,6 +259,7 @@ AVFilter avfilter_vf_gradfun = {
     .name          = "gradfun",
     .description   = NULL_IF_CONFIG_SMALL("Debands video quickly using gradients."),
     .priv_size     = sizeof(GradFunContext),
+    .priv_class    = &gradfun_class,
     .init          = init,
     .uninit        = uninit,
     .query_formats = query_formats,



More information about the ffmpeg-cvslog mailing list