diff --git a/doc/filters.texi b/doc/filters.texi index 51f7833216..f4f5cf5a27 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 ':': -@var{strength}:@var{radius} +This filter accepts the following options: -@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. +@table @option -@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. +@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. + +@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. + +@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 876579a182..01e9eed697 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 900ef604e8..4278a9d10e 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,