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
BlackFrameContext
{
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
#define SET_META(key, format, value) \
62
snprintf(buf, sizeof(buf), format, value); \
63
av_dict_set(metadata, key, buf, 0)
64
65
static
int
filter_frame
(
AVFilterLink
*inlink,
AVFrame
*
frame
)
66
{
67
AVFilterContext
*ctx = inlink->
dst
;
68
BlackFrameContext
*
s
= ctx->
priv
;
69
int
x, i;
70
int
pblack = 0;
71
uint8_t
*p = frame->
data
[0];
72
AVDictionary
**metadata;
73
char
buf
[32];
74
75
for
(i = 0; i < frame->
height
; i++) {
76
for
(x = 0; x < inlink->
w
; x++)
77
s->
nblack
+= p[x] < s->
bthresh
;
78
p += frame->
linesize
[0];
79
}
80
81
if
(frame->
key_frame
)
82
s->
last_keyframe
= s->
frame
;
83
84
pblack = s->
nblack
* 100 / (inlink->
w
* inlink->
h
);
85
if
(pblack >= s->
bamount
) {
86
metadata =
avpriv_frame_get_metadatap
(frame);
87
88
av_log
(ctx,
AV_LOG_INFO
,
"frame:%u pblack:%u pts:%"
PRId64
" t:%f "
89
"type:%c last_keyframe:%d\n"
,
90
s->
frame
, pblack, frame->
pts
,
91
frame->
pts
==
AV_NOPTS_VALUE
? -1 : frame->
pts
*
av_q2d
(inlink->
time_base
),
92
av_get_picture_type_char
(frame->
pict_type
), s->
last_keyframe
);
93
94
SET_META
(
"lavfi.blackframe.pblack"
,
"%u"
, pblack);
95
}
96
97
s->
frame
++;
98
s->
nblack
= 0;
99
return
ff_filter_frame
(inlink->
dst
->
outputs
[0], frame);
100
}
101
102
#define OFFSET(x) offsetof(BlackFrameContext, x)
103
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
104
static
const
AVOption
blackframe_options
[] = {
105
{
"amount"
,
"Percentage of the pixels that have to be below the threshold "
106
"for the frame to be considered black."
,
OFFSET
(bamount),
AV_OPT_TYPE_INT
, { .i64 = 98 }, 0, 100,
FLAGS
},
107
{
"threshold"
,
"threshold below which a pixel value is considered black"
,
108
OFFSET
(bthresh),
AV_OPT_TYPE_INT
, { .i64 = 32 }, 0, 255,
FLAGS
},
109
{
"thresh"
,
"threshold below which a pixel value is considered black"
,
110
OFFSET
(bthresh),
AV_OPT_TYPE_INT
, { .i64 = 32 }, 0, 255,
FLAGS
},
111
{
NULL
}
112
};
113
114
AVFILTER_DEFINE_CLASS
(blackframe);
115
116
static
const
AVFilterPad
avfilter_vf_blackframe_inputs
[] = {
117
{
118
.
name
=
"default"
,
119
.type =
AVMEDIA_TYPE_VIDEO
,
120
.filter_frame =
filter_frame
,
121
},
122
{
NULL
}
123
};
124
125
static
const
AVFilterPad
avfilter_vf_blackframe_outputs
[] = {
126
{
127
.
name
=
"default"
,
128
.type =
AVMEDIA_TYPE_VIDEO
129
},
130
{
NULL
}
131
};
132
133
AVFilter
ff_vf_blackframe
= {
134
.
name
=
"blackframe"
,
135
.description =
NULL_IF_CONFIG_SMALL
(
"Detect frames that are (almost) black."
),
136
.priv_size =
sizeof
(
BlackFrameContext
),
137
.priv_class = &blackframe_class,
138
.
query_formats
=
query_formats
,
139
.
inputs
= avfilter_vf_blackframe_inputs,
140
.
outputs
= avfilter_vf_blackframe_outputs,
141
};
Generated on Sun Mar 8 2015 02:35:06 for FFmpeg by
1.8.2