]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/cropdetect: add option for initial skip
authorGyan Doshi <ffmpeg@gyani.pro>
Tue, 8 Dec 2020 13:22:37 +0000 (18:52 +0530)
committerGyan Doshi <ffmpeg@gyani.pro>
Wed, 9 Dec 2020 07:22:09 +0000 (12:52 +0530)
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.

doc/filters.texi
libavfilter/vf_cropdetect.c

index 62d6e26a02e78dcd6cb103c717e348e6bcfa2273..d9f606604ee8db6db644e2db9943b74a6e397eb7 100644 (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
index 7c7d0b953ab00a1acc6f15c0ff055d3744d6ab78..5ae87cad2d7bbc4b6dd07e4dff6aca990f365bd8 100644 (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 }