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