vf_blackframe: switch to an AVOptions-based system.

This commit is contained in:
Anton Khirnov 2013-02-25 21:21:29 +01:00
parent 2831b307e6
commit 62dcdb028c
2 changed files with 33 additions and 34 deletions

View File

@ -533,16 +533,18 @@ the position in the file if known or -1 and the timestamp in seconds.
In order to display the output lines, you need to set the loglevel at In order to display the output lines, you need to set the loglevel at
least to the AV_LOG_INFO value. least to the AV_LOG_INFO value.
The filter accepts the syntax: The filter accepts the following options:
@example
blackframe[=@var{amount}:[@var{threshold}]]
@end example
@var{amount} is the percentage of the pixels that have to be below the @table @option
threshold, and defaults to 98.
@var{threshold} is the threshold below which a pixel value is @item amount
considered black, and defaults to 32. The percentage of the pixels that have to be below the threshold, defaults to
98.
@item threshold
Threshold below which a pixel value is considered black, defaults to 32.
@end table
@section boxblur @section boxblur

View File

@ -31,14 +31,17 @@
#include <inttypes.h> #include <inttypes.h>
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/opt.h"
#include "avfilter.h" #include "avfilter.h"
#include "formats.h" #include "formats.h"
#include "internal.h" #include "internal.h"
#include "video.h" #include "video.h"
typedef struct { typedef struct {
unsigned int bamount; ///< black amount const AVClass *class;
unsigned int bthresh; ///< black threshold int bamount; ///< black amount
int bthresh; ///< black threshold
unsigned int frame; ///< frame number unsigned int frame; ///< frame number
unsigned int nblack; ///< number of black pixels counted so far unsigned int nblack; ///< number of black pixels counted so far
} BlackFrameContext; } BlackFrameContext;
@ -55,29 +58,6 @@ static int query_formats(AVFilterContext *ctx)
return 0; return 0;
} }
static av_cold int init(AVFilterContext *ctx, const char *args)
{
BlackFrameContext *blackframe = ctx->priv;
blackframe->bamount = 98;
blackframe->bthresh = 32;
blackframe->nblack = 0;
blackframe->frame = 0;
if (args)
sscanf(args, "%u:%u", &blackframe->bamount, &blackframe->bthresh);
av_log(ctx, AV_LOG_VERBOSE, "bamount:%u bthresh:%u\n",
blackframe->bamount, blackframe->bthresh);
if (blackframe->bamount > 100 || blackframe->bthresh > 255) {
av_log(ctx, AV_LOG_ERROR, "Too big value for bamount (max is 100) or bthresh (max is 255)\n");
return AVERROR(EINVAL);
}
return 0;
}
static int filter_frame(AVFilterLink *inlink, AVFrame *frame) static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
{ {
AVFilterContext *ctx = inlink->dst; AVFilterContext *ctx = inlink->dst;
@ -103,6 +83,23 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
return ff_filter_frame(inlink->dst->outputs[0], frame); return ff_filter_frame(inlink->dst->outputs[0], frame);
} }
#define OFFSET(x) offsetof(BlackFrameContext, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
static const AVOption options[] = {
{ "amount", "Percentage of the pixels that have to be below the threshold "
"for the frame to be considered black.", OFFSET(bamount), AV_OPT_TYPE_INT, { .i64 = 98 }, 0, 100, FLAGS },
{ "threshold", "threshold below which a pixel value is considered black",
OFFSET(bthresh), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, INT_MAX, FLAGS },
{ NULL },
};
static const AVClass blackframe_class = {
.class_name = "blackframe",
.item_name = av_default_item_name,
.option = options,
.version = LIBAVUTIL_VERSION_INT,
};
static const AVFilterPad avfilter_vf_blackframe_inputs[] = { static const AVFilterPad avfilter_vf_blackframe_inputs[] = {
{ {
.name = "default", .name = "default",
@ -126,7 +123,7 @@ AVFilter avfilter_vf_blackframe = {
.description = NULL_IF_CONFIG_SMALL("Detect frames that are (almost) black."), .description = NULL_IF_CONFIG_SMALL("Detect frames that are (almost) black."),
.priv_size = sizeof(BlackFrameContext), .priv_size = sizeof(BlackFrameContext),
.init = init, .priv_class = &blackframe_class,
.query_formats = query_formats, .query_formats = query_formats,