diff mbox series

[FFmpeg-devel,2/3] avfilter/find_rect: add option to discard non-matching frames

Message ID 20210401131832.9614-2-ffmpeg@gyani.pro
State Accepted
Commit abdafca9ad26b020b13b76d538a98d135d127fcb
Headers show
Series [FFmpeg-devel,1/3] avfilter/find_rect: improve logging
Related show

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Gyan Doshi April 1, 2021, 1:18 p.m. UTC
Default is disabled.
---
 doc/filters.texi           | 3 +++
 libavfilter/vf_find_rect.c | 9 ++++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/doc/filters.texi b/doc/filters.texi
index 64878e15da..5e35fa6467 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -12139,6 +12139,9 @@  Number of mipmaps, default is 3.
 
 @item xmin, ymin, xmax, ymax
 Specifies the rectangle in which to search.
+
+@item discard
+Discard frames where object is not detected. Default is disabled.
 @end table
 
 @subsection Examples
diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c
index ea3b7aeee5..f9129cc140 100644
--- a/libavfilter/vf_find_rect.c
+++ b/libavfilter/vf_find_rect.c
@@ -40,6 +40,7 @@  typedef struct FOCContext {
     AVFrame *obj_frame;
     AVFrame *needle_frame[MAX_MIPMAPS];
     AVFrame *haystack_frame[MAX_MIPMAPS];
+    int discard;
 } FOCContext;
 
 #define OFFSET(x) offsetof(FOCContext, x)
@@ -52,6 +53,7 @@  static const AVOption find_rect_options[] = {
     { "ymin", "", OFFSET(ymin), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
     { "xmax", "", OFFSET(xmax), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
     { "ymax", "", OFFSET(ymax), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
+    { "discard", "", OFFSET(discard), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS },
     { NULL }
 };
 
@@ -206,7 +208,12 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     }
 
     if (best_score > foc->threshold) {
-        return ff_filter_frame(ctx->outputs[0], in);
+        if (foc->discard) {
+            av_frame_free(&in);
+            return 0;
+        } else {
+            return ff_filter_frame(ctx->outputs[0], in);
+        }
     }
 
     av_log(ctx, AV_LOG_INFO, "Found at n=%lld pts_time=%f x=%d y=%d with score=%f\n",