FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
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 FFmpeg.
8
*
9
* FFmpeg 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
* FFmpeg 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 FFmpeg; if not, write to the Free Software Foundation, Inc.,
21
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22
*/
23
24
/**
25
* @file
26
* Search for black frames to detect scene transitions.
27
* Ported from MPlayer libmpcodecs/vf_blackframe.c.
28
*/
29
30
#include <stdio.h>
31
#include <inttypes.h>
32
33
#include "
libavutil/internal.h
"
34
#include "
libavutil/opt.h
"
35
#include "
avfilter.h
"
36
#include "
formats.h
"
37
#include "
internal.h
"
38
#include "
video.h
"
39
40
typedef
struct
{
41
const
AVClass
*
class
;
42
int
bamount
;
///< black amount
43
int
bthresh
;
///< black threshold
44
unsigned
int
frame
;
///< frame number
45
unsigned
int
nblack
;
///< number of black pixels counted so far
46
unsigned
int
last_keyframe
;
///< frame number of the last received key-frame
47
}
BlackFrameContext
;
48
49
static
int
query_formats
(
AVFilterContext
*ctx)
50
{
51
static
const
enum
AVPixelFormat
pix_fmts[] = {
52
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_NV12
,
53
AV_PIX_FMT_NV21
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV411P
,
54
AV_PIX_FMT_NONE
55
};
56
57
ff_set_common_formats
(ctx,
ff_make_format_list
(pix_fmts));
58
return
0;
59
}
60
61
static
int
filter_frame
(
AVFilterLink
*inlink,
AVFrame
*
frame
)
62
{
63
AVFilterContext
*ctx = inlink->
dst
;
64
BlackFrameContext
*
s
= ctx->
priv
;
65
int
x, i;
66
int
pblack = 0;
67
uint8_t
*p = frame->
data
[0];
68
69
for
(i = 0; i < frame->
height
; i++) {
70
for
(x = 0; x < inlink->
w
; x++)
71
s->
nblack
+= p[x] < s->
bthresh
;
72
p += frame->
linesize
[0];
73
}
74
75
if
(frame->
key_frame
)
76
s->
last_keyframe
= s->
frame
;
77
78
pblack = s->
nblack
* 100 / (inlink->
w
* inlink->
h
);
79
if
(pblack >= s->
bamount
)
80
av_log
(ctx,
AV_LOG_INFO
,
"frame:%u pblack:%u pts:%"
PRId64
" t:%f "
81
"type:%c last_keyframe:%d\n"
,
82
s->
frame
, pblack, frame->
pts
,
83
frame->
pts
==
AV_NOPTS_VALUE
? -1 : frame->
pts
*
av_q2d
(inlink->
time_base
),
84
av_get_picture_type_char
(frame->
pict_type
), s->
last_keyframe
);
85
86
s->
frame
++;
87
s->
nblack
= 0;
88
return
ff_filter_frame
(inlink->
dst
->
outputs
[0], frame);
89
}
90
91
#define OFFSET(x) offsetof(BlackFrameContext, x)
92
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
93
static
const
AVOption
blackframe_options
[] = {
94
{
"amount"
,
"Percentage of the pixels that have to be below the threshold "
95
"for the frame to be considered black."
,
OFFSET
(bamount),
AV_OPT_TYPE_INT
, { .i64 = 98 }, 0, 100,
FLAGS
},
96
{
"threshold"
,
"threshold below which a pixel value is considered black"
,
97
OFFSET
(bthresh),
AV_OPT_TYPE_INT
, { .i64 = 32 }, 0, 255,
FLAGS
},
98
{
"thresh"
,
"threshold below which a pixel value is considered black"
,
99
OFFSET
(bthresh),
AV_OPT_TYPE_INT
, { .i64 = 32 }, 0, 255,
FLAGS
},
100
{ NULL }
101
};
102
103
AVFILTER_DEFINE_CLASS
(blackframe);
104
105
static
const
AVFilterPad
avfilter_vf_blackframe_inputs
[] = {
106
{
107
.
name
=
"default"
,
108
.type =
AVMEDIA_TYPE_VIDEO
,
109
.filter_frame =
filter_frame
,
110
},
111
{ NULL }
112
};
113
114
static
const
AVFilterPad
avfilter_vf_blackframe_outputs
[] = {
115
{
116
.
name
=
"default"
,
117
.type =
AVMEDIA_TYPE_VIDEO
118
},
119
{ NULL }
120
};
121
122
AVFilter
ff_vf_blackframe
= {
123
.
name
=
"blackframe"
,
124
.description =
NULL_IF_CONFIG_SMALL
(
"Detect frames that are (almost) black."
),
125
.priv_size =
sizeof
(
BlackFrameContext
),
126
.priv_class = &blackframe_class,
127
.
query_formats
=
query_formats
,
128
.
inputs
= avfilter_vf_blackframe_inputs,
129
.
outputs
= avfilter_vf_blackframe_outputs,
130
};
Generated on Sun Mar 23 2014 23:50:08 for FFmpeg by
1.8.2