vf_gradfun: switch to an AVOptions-based system.

This commit is contained in:
Anton Khirnov 2013-02-25 21:21:29 +01:00
parent c334c113d4
commit 7ed833d78e
3 changed files with 38 additions and 21 deletions

View File

@ -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

View File

@ -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

View File

@ -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,