From 460e7b4f6d473d9f03ed45501221f9cb209b28fd Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 25 Feb 2013 21:21:29 +0100 Subject: [PATCH] vf_cropdetect: switch to an AVOptions-based system. --- doc/filters.texi | 5 +---- libavfilter/vf_cropdetect.c | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index c75f1198ed..8a2fa54968 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -742,10 +742,7 @@ Calculate necessary cropping parameters and prints the recommended parameters through the logging system. The detected dimensions correspond to the non-black area of the input video. -It accepts the syntax: -@example -cropdetect[=@var{limit}[:@var{round}[:@var{reset}]]] -@end example +This filter accepts the following options: @table @option diff --git a/libavfilter/vf_cropdetect.c b/libavfilter/vf_cropdetect.c index a1d957cbaa..1486695a65 100644 --- a/libavfilter/vf_cropdetect.c +++ b/libavfilter/vf_cropdetect.c @@ -27,12 +27,15 @@ #include "libavutil/imgutils.h" #include "libavutil/internal.h" +#include "libavutil/opt.h" + #include "avfilter.h" #include "formats.h" #include "internal.h" #include "video.h" typedef struct { + const AVClass *class; int x1, y1, x2, y2; int limit; int round; @@ -87,14 +90,8 @@ static av_cold int init(AVFilterContext *ctx, const char *args) { CropDetectContext *cd = ctx->priv; - cd->limit = 24; - cd->round = 0; - cd->reset_count = 0; cd->frame_nb = -2; - if (args) - sscanf(args, "%d:%d:%d", &cd->limit, &cd->round, &cd->reset_count); - av_log(ctx, AV_LOG_VERBOSE, "limit:%d round:%d reset_count:%d\n", cd->limit, cd->round, cd->reset_count); @@ -196,6 +193,22 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) return ff_filter_frame(inlink->dst->outputs[0], frame); } +#define OFFSET(x) offsetof(CropDetectContext, x) +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM +static const AVOption options[] = { + { "limit", "Threshold below which the pixel is considered black", OFFSET(limit), AV_OPT_TYPE_INT, { .i64 = 24 }, 0, INT_MAX, FLAGS }, + { "round", "Value by which the width/height should be divisible", OFFSET(round), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS }, + { "reset", "Recalculate the crop area after this many frames", OFFSET(reset_count), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS }, + { NULL }, +}; + +static const AVClass cropdetect_class = { + .class_name = "cropdetect", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + static const AVFilterPad avfilter_vf_cropdetect_inputs[] = { { .name = "default", @@ -220,6 +233,7 @@ AVFilter avfilter_vf_cropdetect = { .description = NULL_IF_CONFIG_SMALL("Auto-detect crop size."), .priv_size = sizeof(CropDetectContext), + .priv_class = &cropdetect_class, .init = init, .query_formats = query_formats,