avfilter/cropdetect: add option for initial skip

The cropdetect filter, at present, skips the first two frames. This
behaviour is hardcoded.

New option 'skip' allows users to change this. Convenient for when
input is a single image or a trimmed video stream.

Default is kept at 2 to preserve current behaviour.
This commit is contained in:
Gyan Doshi 2020-12-08 18:52:37 +05:30
parent b9b719fedc
commit 7777e5119a
2 changed files with 10 additions and 4 deletions

View File

@ -8899,6 +8899,10 @@ The value which the width/height should be divisible by. It defaults to
get only even dimensions (needed for 4:2:2 video). 16 is best when
encoding to most video codecs.
@item skip
Set the number of initial frames for which evaluation is skipped.
Default is 2. Range is 0 to INT_MAX.
@item reset_count, reset
Set the counter that determines after how many frames cropdetect will
reset the previously detected largest video area and start over to

View File

@ -37,6 +37,7 @@ typedef struct CropDetectContext {
int x1, y1, x2, y2;
float limit;
int round;
int skip;
int reset_count;
int frame_nb;
int max_pixsteps[4];
@ -127,10 +128,10 @@ static av_cold int init(AVFilterContext *ctx)
{
CropDetectContext *s = ctx->priv;
s->frame_nb = -2;
s->frame_nb = -1 * s->skip;
av_log(ctx, AV_LOG_VERBOSE, "limit:%f round:%d reset_count:%d\n",
s->limit, s->round, s->reset_count);
av_log(ctx, AV_LOG_VERBOSE, "limit:%f round:%d skip:%d reset_count:%d\n",
s->limit, s->round, s->skip, s->reset_count);
return 0;
}
@ -167,7 +168,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
int outliers, last_y;
int limit = lrint(s->limit);
// ignore first 2 frames - they may be empty
// ignore first s->skip frames
if (++s->frame_nb > 0) {
metadata = &frame->metadata;
@ -247,6 +248,7 @@ static const AVOption cropdetect_options[] = {
{ "limit", "Threshold below which the pixel is considered black", OFFSET(limit), AV_OPT_TYPE_FLOAT, { .dbl = 24.0/255 }, 0, 65535, FLAGS },
{ "round", "Value by which the width/height should be divisible", OFFSET(round), AV_OPT_TYPE_INT, { .i64 = 16 }, 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 },
{ "skip", "Number of initial frames to skip", OFFSET(skip), AV_OPT_TYPE_INT, { .i64 = 2 }, 0, INT_MAX, FLAGS },
{ "reset_count", "Recalculate the crop area after this many frames",OFFSET(reset_count),AV_OPT_TYPE_INT,{ .i64 = 0 }, 0, INT_MAX, FLAGS },
{ "max_outliers", "Threshold count of outliers", OFFSET(max_outliers),AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
{ NULL }