提交 51def31d 编写于 作者: A Anton Khirnov

vf_boxblur: switch to an AVOptions-based system.

上级 62dcdb02
...@@ -550,8 +550,18 @@ Threshold below which a pixel value is considered black, defaults to 32. ...@@ -550,8 +550,18 @@ Threshold below which a pixel value is considered black, defaults to 32.
Apply boxblur algorithm to the input video. Apply boxblur algorithm to the input video.
This filter accepts the parameters: This filter accepts the following options:
@var{luma_power}:@var{luma_radius}:@var{chroma_radius}:@var{chroma_power}:@var{alpha_radius}:@var{alpha_power}
@table @option
@item luma_radius
@item luma_power
@item chroma_radius
@item chroma_power
@item alpha_radius
@item alpha_power
@end table
Chroma and alpha parameters are optional, if not specified they default Chroma and alpha parameters are optional, if not specified they default
to the corresponding values set for @var{luma_radius} and to the corresponding values set for @var{luma_radius} and
...@@ -589,7 +599,7 @@ Some examples follow: ...@@ -589,7 +599,7 @@ Some examples follow:
Apply a boxblur filter with luma, chroma, and alpha radius Apply a boxblur filter with luma, chroma, and alpha radius
set to 2: set to 2:
@example @example
boxblur=2:1 boxblur=luma_radius=2:luma_power=1
@end example @end example
@item @item
...@@ -601,7 +611,7 @@ boxblur=2:1:0:0:0:0 ...@@ -601,7 +611,7 @@ boxblur=2:1:0:0:0:0
@item @item
Set luma and chroma radius to a fraction of the video dimension Set luma and chroma radius to a fraction of the video dimension
@example @example
boxblur=min(h\,w)/10:1:min(cw\,ch)/10:1 boxblur=luma_radius=min(h\,w)/10:luma_power=1:chroma_radius=min(cw\,ch)/10:chroma_power=1
@end example @end example
@end itemize @end itemize
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/eval.h" #include "libavutil/eval.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "avfilter.h" #include "avfilter.h"
#include "formats.h" #include "formats.h"
...@@ -60,12 +61,13 @@ typedef struct { ...@@ -60,12 +61,13 @@ typedef struct {
} FilterParam; } FilterParam;
typedef struct { typedef struct {
const AVClass *class;
FilterParam luma_param; FilterParam luma_param;
FilterParam chroma_param; FilterParam chroma_param;
FilterParam alpha_param; FilterParam alpha_param;
char luma_radius_expr [256]; char *luma_radius_expr;
char chroma_radius_expr[256]; char *chroma_radius_expr;
char alpha_radius_expr [256]; char *alpha_radius_expr;
int hsub, vsub; int hsub, vsub;
int radius[4]; int radius[4];
...@@ -81,34 +83,23 @@ typedef struct { ...@@ -81,34 +83,23 @@ typedef struct {
static av_cold int init(AVFilterContext *ctx, const char *args) static av_cold int init(AVFilterContext *ctx, const char *args)
{ {
BoxBlurContext *boxblur = ctx->priv; BoxBlurContext *boxblur = ctx->priv;
int e;
if (!args) { if (!boxblur->luma_radius_expr) {
av_log(ctx, AV_LOG_ERROR, av_log(ctx, AV_LOG_ERROR, "Luma radius expression is not set.\n");
"Filter expects 2 or 4 or 6 arguments, none provided\n");
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
e = sscanf(args, "%255[^:]:%d:%255[^:]:%d:%255[^:]:%d", if (!boxblur->chroma_radius_expr) {
boxblur->luma_radius_expr, &boxblur->luma_param .power, boxblur->chroma_radius_expr = av_strdup(boxblur->luma_radius_expr);
boxblur->chroma_radius_expr, &boxblur->chroma_param.power, if (!boxblur->chroma_radius_expr)
boxblur->alpha_radius_expr, &boxblur->alpha_param .power); return AVERROR(ENOMEM);
if (e != 2 && e != 4 && e != 6) {
av_log(ctx, AV_LOG_ERROR,
"Filter expects 2 or 4 or 6 params, provided %d\n", e);
return AVERROR(EINVAL);
}
if (e < 4) {
boxblur->chroma_param.power = boxblur->luma_param.power; boxblur->chroma_param.power = boxblur->luma_param.power;
av_strlcpy(boxblur->chroma_radius_expr, boxblur->luma_radius_expr,
sizeof(boxblur->chroma_radius_expr));
} }
if (e < 6) { if (!boxblur->alpha_radius_expr) {
boxblur->alpha_radius_expr = av_strdup(boxblur->luma_radius_expr);
if (!boxblur->alpha_radius_expr)
return AVERROR(ENOMEM);
boxblur->alpha_param.power = boxblur->luma_param.power; boxblur->alpha_param.power = boxblur->luma_param.power;
av_strlcpy(boxblur->alpha_radius_expr, boxblur->luma_radius_expr,
sizeof(boxblur->alpha_radius_expr));
} }
return 0; return 0;
...@@ -342,6 +333,28 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) ...@@ -342,6 +333,28 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
return ff_filter_frame(outlink, out); return ff_filter_frame(outlink, out);
} }
#define OFFSET(x) offsetof(BoxBlurContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
static const AVOption options[] = {
{ "luma_radius", "Radius of the luma blurring box", OFFSET(luma_radius_expr), AV_OPT_TYPE_STRING, .flags = FLAGS },
{ "luma_power", "How many times should the boxblur be applied to luma",
OFFSET(luma_param.power), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, FLAGS },
{ "chroma_radius", "Radius of the chroma blurring box", OFFSET(chroma_radius_expr), AV_OPT_TYPE_STRING, .flags = FLAGS },
{ "chroma_power", "How many times should the boxblur be applied to chroma",
OFFSET(chroma_param.power), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, FLAGS },
{ "alpha_radius", "Radius of the alpha blurring box", OFFSET(alpha_radius_expr), AV_OPT_TYPE_STRING, .flags = FLAGS },
{ "alpha_power", "How many times should the boxblur be applied to alpha",
OFFSET(alpha_param.power), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX, FLAGS },
{ NULL },
};
static const AVClass boxblur_class = {
.class_name = "boxblur",
.item_name = av_default_item_name,
.option = options,
.version = LIBAVUTIL_VERSION_INT,
};
static const AVFilterPad avfilter_vf_boxblur_inputs[] = { static const AVFilterPad avfilter_vf_boxblur_inputs[] = {
{ {
.name = "default", .name = "default",
...@@ -364,6 +377,7 @@ AVFilter avfilter_vf_boxblur = { ...@@ -364,6 +377,7 @@ AVFilter avfilter_vf_boxblur = {
.name = "boxblur", .name = "boxblur",
.description = NULL_IF_CONFIG_SMALL("Blur the input."), .description = NULL_IF_CONFIG_SMALL("Blur the input."),
.priv_size = sizeof(BoxBlurContext), .priv_size = sizeof(BoxBlurContext),
.priv_class = &boxblur_class,
.init = init, .init = init,
.uninit = uninit, .uninit = uninit,
.query_formats = query_formats, .query_formats = query_formats,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册