@@ -38,6 +38,7 @@ typedef struct BlackDetectContext {
int64_t black_end; ///< pts end time of the last black picture
int64_t last_picref_pts; ///< pts of the last input picture
int black_started;
+ int black_match;
double picture_black_ratio_th;
double pixel_black_th;
@@ -107,15 +108,20 @@ static int config_input(AVFilterLink *inlink)
return 0;
}
-static void check_black_end(AVFilterContext *ctx)
+static void check_black(AVFilterContext *ctx)
{
BlackDetectContext *blackdetect = ctx->priv;
AVFilterLink *inlink = ctx->inputs[0];
- if ((blackdetect->black_end - blackdetect->black_start) >= blackdetect->black_min_duration) {
+ if (blackdetect->last_picref_pts - blackdetect->black_start >= blackdetect->black_min_duration && blackdetect->black_match == 0) {
av_log(blackdetect, AV_LOG_INFO,
- "black_start:%s black_end:%s black_duration:%s\n",
- av_ts2timestr(blackdetect->black_start, &inlink->time_base),
+ "black_start:%s\n",
+ av_ts2timestr(blackdetect->black_start, &inlink->time_base));
+ blackdetect->black_match = 1;
+ }
+ if (blackdetect->black_end - blackdetect->black_start >= blackdetect->black_min_duration && blackdetect->black_started == 1) {
+ av_log(blackdetect, AV_LOG_INFO,
+ "black_end:%s | black_duration:%s\n",
av_ts2timestr(blackdetect->black_end, &inlink->time_base),
av_ts2timestr(blackdetect->black_end - blackdetect->black_start, &inlink->time_base));
}
@@ -131,7 +137,7 @@ static int request_frame(AVFilterLink *outlink)
if (ret == AVERROR_EOF && blackdetect->black_started) {
// FIXME: black_end should be set to last_picref_pts + last_picref_duration
blackdetect->black_end = blackdetect->last_picref_pts;
- check_black_end(ctx);
+ check_black(ctx);
}
return ret;
}
@@ -163,15 +169,17 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
if (!blackdetect->black_started) {
/* black starts here */
blackdetect->black_started = 1;
+ blackdetect->black_match = 0;
blackdetect->black_start = picref->pts;
av_dict_set(&picref->metadata, "lavfi.black_start",
av_ts2timestr(blackdetect->black_start, &inlink->time_base), 0);
}
+ check_black(ctx);
} else if (blackdetect->black_started) {
/* black ends here */
- blackdetect->black_started = 0;
blackdetect->black_end = picref->pts;
- check_black_end(ctx);
+ check_black(ctx);
+ blackdetect->black_started = 0;
av_dict_set(&picref->metadata, "lavfi.black_end",
av_ts2timestr(blackdetect->black_end, &inlink->time_base), 0);
}
Here the cleanup version from the patch. From b6b6e4ab885f9b35a6696492286e504a4b3d6d92 Mon Sep 17 00:00:00 2001 From: Jonathan <jonbae77@gmail.com> Date: Mon, 4 Dec 2017 16:05:48 +0100 Subject: [PATCH] unify blackdetect with af_silencedetect. Is more useful for monitoring streams. --- libavfilter/vf_blackdetect.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) -- 2.15.1