summaryrefslogtreecommitdiff
path: root/libavfilter/vf_blackframe.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavfilter/vf_blackframe.c')
-rw-r--r--libavfilter/vf_blackframe.c50
1 files changed, 31 insertions, 19 deletions
diff --git a/libavfilter/vf_blackframe.c b/libavfilter/vf_blackframe.c
index 5181392b1b..11c8e50893 100644
--- a/libavfilter/vf_blackframe.c
+++ b/libavfilter/vf_blackframe.c
@@ -4,20 +4,20 @@
* Copyright (c) 2006 Julian Hall
* Copyright (c) 2002-2003 Brian J. Murrell
*
- * This file is part of Libav.
+ * This file is part of FFmpeg.
*
- * Libav is free software; you can redistribute it and/or modify
+ * FFmpeg is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
- * Libav is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
- * with Libav; if not, write to the Free Software Foundation, Inc.,
+ * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
@@ -31,18 +31,33 @@
#include <inttypes.h>
#include "libavutil/internal.h"
+#include "libavutil/opt.h"
#include "avfilter.h"
+#include "internal.h"
#include "formats.h"
#include "internal.h"
#include "video.h"
typedef struct {
+ const AVClass *class;
unsigned int bamount; ///< black amount
unsigned int bthresh; ///< black threshold
unsigned int frame; ///< frame number
unsigned int nblack; ///< number of black pixels counted so far
+ unsigned int last_keyframe; ///< frame number of the last received key-frame
} BlackFrameContext;
+#define OFFSET(x) offsetof(BlackFrameContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption blackframe_options[] = {
+ { "amount", "set least percentual amount of pixels below the black threshold enabling black detection", OFFSET(bamount), AV_OPT_TYPE_INT, {.i64=98}, 0, 100, FLAGS },
+ { "thresh", "set threshold below which a pixel value is considered black", OFFSET(bthresh), AV_OPT_TYPE_INT, {.i64=32}, 0, 255, FLAGS },
+ { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(blackframe);
+
static int query_formats(AVFilterContext *ctx)
{
static const enum AVPixelFormat pix_fmts[] = {
@@ -59,22 +74,9 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
{
BlackFrameContext *blackframe = ctx->priv;
- blackframe->bamount = 98;
- blackframe->bthresh = 32;
- blackframe->nblack = 0;
- blackframe->frame = 0;
-
- if (args)
- sscanf(args, "%u:%u", &blackframe->bamount, &blackframe->bthresh);
-
av_log(ctx, AV_LOG_VERBOSE, "bamount:%u bthresh:%u\n",
blackframe->bamount, blackframe->bthresh);
- if (blackframe->bamount > 100 || blackframe->bthresh > 255) {
- av_log(ctx, AV_LOG_ERROR, "Too big value for bamount (max is 100) or bthresh (max is 255)\n");
- return AVERROR(EINVAL);
- }
-
return 0;
}
@@ -92,11 +94,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
p += frame->linesize[0];
}
+ if (frame->key_frame)
+ blackframe->last_keyframe = blackframe->frame;
+
pblack = blackframe->nblack * 100 / (inlink->w * inlink->h);
if (pblack >= blackframe->bamount)
- av_log(ctx, AV_LOG_INFO, "frame:%u pblack:%u pts:%"PRId64" t:%f\n",
+ av_log(ctx, AV_LOG_INFO, "frame:%u pblack:%u pts:%"PRId64" t:%f "
+ "type:%c last_keyframe:%d\n",
blackframe->frame, pblack, frame->pts,
- frame->pts == AV_NOPTS_VALUE ? -1 : frame->pts * av_q2d(inlink->time_base));
+ frame->pts == AV_NOPTS_VALUE ? -1 : frame->pts * av_q2d(inlink->time_base),
+ av_get_picture_type_char(frame->pict_type), blackframe->last_keyframe);
blackframe->frame++;
blackframe->nblack = 0;
@@ -121,6 +128,8 @@ static const AVFilterPad avfilter_vf_blackframe_outputs[] = {
{ NULL }
};
+static const char *const shorthand[] = { "amount", "thresh", NULL };
+
AVFilter avfilter_vf_blackframe = {
.name = "blackframe",
.description = NULL_IF_CONFIG_SMALL("Detect frames that are (almost) black."),
@@ -133,4 +142,7 @@ AVFilter avfilter_vf_blackframe = {
.inputs = avfilter_vf_blackframe_inputs,
.outputs = avfilter_vf_blackframe_outputs,
+
+ .priv_class = &blackframe_class,
+ .shorthand = shorthand,
};