[FFmpeg-cvslog] avfilter/cropdetect: add option for initial skip
Gyan Doshi
git at videolan.org
Wed Dec 9 09:22:38 EET 2020
ffmpeg | branch: master | Gyan Doshi <ffmpeg at gyani.pro> | Tue Dec 8 19:10:37 2020 +0530| [7777e5119ad3377e2c4cb20a7aff56448d035b55] | committer: Gyan Doshi
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.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7777e5119ad3377e2c4cb20a7aff56448d035b55
---
doc/filters.texi | 4 ++++
libavfilter/vf_cropdetect.c | 10 ++++++----
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/doc/filters.texi b/doc/filters.texi
index 62d6e26a02..d9f606604e 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -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.
+ at 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
diff --git a/libavfilter/vf_cropdetect.c b/libavfilter/vf_cropdetect.c
index 7c7d0b953a..5ae87cad2d 100644
--- a/libavfilter/vf_cropdetect.c
+++ b/libavfilter/vf_cropdetect.c
@@ -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 }
More information about the ffmpeg-cvslog
mailing list