Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavfilter
vf_blackframe.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2010 Stefano Sabatini
3
* Copyright (c) 2006 Ivo van Poorten
4
* Copyright (c) 2006 Julian Hall
5
* Copyright (c) 2002-2003 Brian J. Murrell
6
*
7
* This file is part of Libav.
8
*
9
* Libav is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
13
*
14
* Libav is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License along
20
* with Libav; if not, write to the Free Software Foundation, Inc.,
21
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22
*/
23
30
#include <stdio.h>
31
#include <inttypes.h>
32
33
#include "
libavutil/internal.h
"
34
#include "
avfilter.h
"
35
#include "
formats.h
"
36
#include "
internal.h
"
37
#include "
video.h
"
38
39
typedef
struct
{
40
unsigned
int
bamount
;
41
unsigned
int
bthresh
;
42
unsigned
int
frame
;
43
unsigned
int
nblack
;
44
}
BlackFrameContext
;
45
46
static
int
query_formats
(
AVFilterContext
*ctx)
47
{
48
static
const
enum
AVPixelFormat
pix_fmts[] = {
49
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_NV12
,
50
AV_PIX_FMT_NV21
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV411P
,
51
AV_PIX_FMT_NONE
52
};
53
54
ff_set_common_formats
(ctx,
ff_make_format_list
(pix_fmts));
55
return
0;
56
}
57
58
static
av_cold
int
init
(
AVFilterContext
*ctx,
const
char
*args)
59
{
60
BlackFrameContext
*blackframe = ctx->
priv
;
61
62
blackframe->
bamount
= 98;
63
blackframe->
bthresh
= 32;
64
blackframe->
nblack
= 0;
65
blackframe->
frame
= 0;
66
67
if
(args)
68
sscanf(args,
"%u:%u"
, &blackframe->
bamount
, &blackframe->
bthresh
);
69
70
av_log
(ctx,
AV_LOG_VERBOSE
,
"bamount:%u bthresh:%u\n"
,
71
blackframe->
bamount
, blackframe->
bthresh
);
72
73
if
(blackframe->
bamount
> 100 || blackframe->
bthresh
> 255) {
74
av_log
(ctx,
AV_LOG_ERROR
,
"Too big value for bamount (max is 100) or bthresh (max is 255)\n"
);
75
return
AVERROR
(EINVAL);
76
}
77
78
return
0;
79
}
80
81
static
int
filter_frame
(
AVFilterLink
*inlink,
AVFilterBufferRef
*frame)
82
{
83
AVFilterContext
*ctx = inlink->
dst
;
84
BlackFrameContext
*blackframe = ctx->
priv
;
85
int
x, i;
86
int
pblack = 0;
87
uint8_t
*p = frame->
data
[0];
88
89
for
(i = 0; i < frame->
video
->
h
; i++) {
90
for
(x = 0; x < inlink->
w
; x++)
91
blackframe->
nblack
+= p[x] < blackframe->
bthresh
;
92
p += frame->
linesize
[0];
93
}
94
95
pblack = blackframe->
nblack
* 100 / (inlink->
w
* inlink->
h
);
96
if
(pblack >= blackframe->
bamount
)
97
av_log
(ctx,
AV_LOG_INFO
,
"frame:%u pblack:%u pos:%"
PRId64
" pts:%"
PRId64
" t:%f\n"
,
98
blackframe->
frame
, pblack, frame->
pos
, frame->
pts
,
99
frame->
pts
==
AV_NOPTS_VALUE
? -1 : frame->
pts
*
av_q2d
(inlink->
time_base
));
100
101
blackframe->
frame
++;
102
blackframe->
nblack
= 0;
103
return
ff_filter_frame
(inlink->
dst
->
outputs
[0], frame);
104
}
105
106
static
const
AVFilterPad
avfilter_vf_blackframe_inputs
[] = {
107
{
108
.
name
=
"default"
,
109
.type =
AVMEDIA_TYPE_VIDEO
,
110
.get_video_buffer =
ff_null_get_video_buffer
,
111
.filter_frame =
filter_frame
,
112
},
113
{
NULL
}
114
};
115
116
static
const
AVFilterPad
avfilter_vf_blackframe_outputs
[] = {
117
{
118
.
name
=
"default"
,
119
.type =
AVMEDIA_TYPE_VIDEO
120
},
121
{
NULL
}
122
};
123
124
AVFilter
avfilter_vf_blackframe
= {
125
.
name
=
"blackframe"
,
126
.description =
NULL_IF_CONFIG_SMALL
(
"Detect frames that are (almost) black."
),
127
128
.priv_size =
sizeof
(
BlackFrameContext
),
129
.
init
=
init
,
130
131
.
query_formats
=
query_formats
,
132
133
.
inputs
= avfilter_vf_blackframe_inputs,
134
135
.
outputs
= avfilter_vf_blackframe_outputs,
136
};