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 "
internal.h
"
37
#include "
formats.h
"
38
#include "
internal.h
"
39
#include "
video.h
"
40
41
typedef
struct
{
42
const
AVClass
*
class
;
43
int
bamount
;
///< black amount
44
int
bthresh
;
///< black threshold
45
unsigned
int
frame
;
///< frame number
46
unsigned
int
nblack
;
///< number of black pixels counted so far
47
unsigned
int
last_keyframe
;
///< frame number of the last received key-frame
48
}
BlackFrameContext
;
49
50
static
int
query_formats
(
AVFilterContext
*ctx)
51
{
52
static
const
enum
AVPixelFormat
pix_fmts[] = {
53
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_NV12
,
54
AV_PIX_FMT_NV21
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV411P
,
55
AV_PIX_FMT_NONE
56
};
57
58
ff_set_common_formats
(ctx,
ff_make_format_list
(pix_fmts));
59
return
0;
60
}
61
62
static
int
filter_frame
(
AVFilterLink
*inlink,
AVFrame
*
frame
)
63
{
64
AVFilterContext
*ctx = inlink->
dst
;
65
BlackFrameContext
*
s
= ctx->
priv
;
66
int
x, i;
67
int
pblack = 0;
68
uint8_t
*p = frame->
data
[0];
69
70
for
(i = 0; i < frame->
height
; i++) {
71
for
(x = 0; x < inlink->
w
; x++)
72
s->
nblack
+= p[x] < s->
bthresh
;
73
p += frame->
linesize
[0];
74
}
75
76
if
(frame->
key_frame
)
77
s->
last_keyframe
= s->
frame
;
78
79
pblack = s->
nblack
* 100 / (inlink->
w
* inlink->
h
);
80
if
(pblack >= s->
bamount
)
81
av_log
(ctx,
AV_LOG_INFO
,
"frame:%u pblack:%u pts:%"
PRId64
" t:%f "
82
"type:%c last_keyframe:%d\n"
,
83
s->
frame
, pblack, frame->
pts
,
84
frame->
pts
==
AV_NOPTS_VALUE
? -1 : frame->
pts
*
av_q2d
(inlink->
time_base
),
85
av_get_picture_type_char
(frame->
pict_type
), s->
last_keyframe
);
86
87
s->
frame
++;
88
s->
nblack
= 0;
89
return
ff_filter_frame
(inlink->
dst
->
outputs
[0], frame);
90
}
91
92
#define OFFSET(x) offsetof(BlackFrameContext, x)
93
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
94
static
const
AVOption
blackframe_options
[] = {
95
{
"amount"
,
"Percentage of the pixels that have to be below the threshold "
96
"for the frame to be considered black."
,
OFFSET
(bamount),
AV_OPT_TYPE_INT
, { .i64 = 98 }, 0, 100,
FLAGS
},
97
{
"threshold"
,
"threshold below which a pixel value is considered black"
,
98
OFFSET
(bthresh),
AV_OPT_TYPE_INT
, { .i64 = 32 }, 0, 255,
FLAGS
},
99
{
"thresh"
,
"threshold below which a pixel value is considered black"
,
100
OFFSET
(bthresh),
AV_OPT_TYPE_INT
, { .i64 = 32 }, 0, 255,
FLAGS
},
101
{ NULL },
102
};
103
104
AVFILTER_DEFINE_CLASS
(blackframe);
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
.priv_class = &blackframe_class,
130
131
.
query_formats
=
query_formats
,
132
133
.
inputs
= avfilter_vf_blackframe_inputs,
134
135
.
outputs
= avfilter_vf_blackframe_outputs,
136
};
Generated on Wed Jul 10 2013 23:48:10 for FFmpeg by
1.8.2