Commit 7ed833d7 authored by Anton Khirnov's avatar Anton Khirnov

vf_gradfun: switch to an AVOptions-based system.

parent c334c113
......@@ -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:
@table @option
@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.
@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.
@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 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
......
......@@ -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
......
......@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment