Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavfilter
vf_showinfo.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2011 Stefano Sabatini
3
* This file is part of Libav.
4
*
5
* Libav is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU Lesser General Public
7
* License as published by the Free Software Foundation; either
8
* version 2.1 of the License, or (at your option) any later version.
9
*
10
* Libav is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* Lesser General Public License for more details.
14
*
15
* You should have received a copy of the GNU Lesser General Public
16
* License along with Libav; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
*/
19
25
#include "
libavutil/adler32.h
"
26
#include "
libavutil/imgutils.h
"
27
#include "
libavutil/pixdesc.h
"
28
#include "
avfilter.h
"
29
30
typedef
struct
{
31
unsigned
int
frame
;
32
}
ShowInfoContext
;
33
34
static
av_cold
int
init
(
AVFilterContext
*ctx,
const
char
*args,
void
*opaque)
35
{
36
ShowInfoContext
*showinfo = ctx->
priv
;
37
showinfo->
frame
= 0;
38
return
0;
39
}
40
41
static
void
end_frame
(
AVFilterLink
*inlink)
42
{
43
AVFilterContext
*ctx = inlink->
dst
;
44
ShowInfoContext
*showinfo = ctx->
priv
;
45
AVFilterBufferRef
*picref = inlink->
cur_buf
;
46
uint32_t plane_checksum[4] = {0}, checksum = 0;
47
int
i, plane, vsub =
av_pix_fmt_descriptors
[inlink->
format
].
log2_chroma_h
;
48
49
for
(plane = 0; picref->
data
[plane] && plane < 4; plane++) {
50
size_t
linesize =
av_image_get_linesize
(picref->
format
, picref->
video
->
w
, plane);
51
uint8_t *
data
= picref->
data
[plane];
52
int
h = plane == 1 || plane == 2 ? inlink->
h
>> vsub : inlink->
h
;
53
54
for
(i = 0; i < h; i++) {
55
plane_checksum[plane] =
av_adler32_update
(plane_checksum[plane], data, linesize);
56
checksum =
av_adler32_update
(checksum, data, linesize);
57
data += picref->
linesize
[plane];
58
}
59
}
60
61
av_log
(ctx,
AV_LOG_INFO
,
62
"n:%d pts:%"
PRId64
" pts_time:%f pos:%"
PRId64
" "
63
"fmt:%s sar:%d/%d s:%dx%d i:%c iskey:%d type:%c "
64
"checksum:%u plane_checksum:[%u %u %u %u]\n"
,
65
showinfo->
frame
,
66
picref->
pts
, picref->
pts
*
av_q2d
(inlink->
time_base
), picref->
pos
,
67
av_pix_fmt_descriptors
[picref->
format
].
name
,
68
picref->
video
->
pixel_aspect
.
num
, picref->
video
->
pixel_aspect
.
den
,
69
picref->
video
->
w
, picref->
video
->
h
,
70
!picref->
video
->
interlaced
?
'P'
:
/* Progressive */
71
picref->
video
->
top_field_first
?
'T'
:
'B'
,
/* Top / Bottom */
72
picref->
video
->
key_frame
,
73
av_get_picture_type_char
(picref->
video
->
pict_type
),
74
checksum, plane_checksum[0], plane_checksum[1], plane_checksum[2], plane_checksum[3]);
75
76
showinfo->
frame
++;
77
avfilter_end_frame
(inlink->
dst
->
outputs
[0]);
78
}
79
80
AVFilter
avfilter_vf_showinfo
= {
81
.
name
=
"showinfo"
,
82
.description =
NULL_IF_CONFIG_SMALL
(
"Show textual information for each video frame."
),
83
84
.priv_size =
sizeof
(
ShowInfoContext
),
85
.
init
=
init
,
86
87
.inputs = (
AVFilterPad
[]) {{ .name =
"default"
,
88
.type =
AVMEDIA_TYPE_VIDEO
,
89
.get_video_buffer =
avfilter_null_get_video_buffer
,
90
.start_frame =
avfilter_null_start_frame
,
91
.end_frame =
end_frame
,
92
.min_perms =
AV_PERM_READ
, },
93
{ .name =
NULL
}},
94
95
.outputs = (
AVFilterPad
[]) {{ .name =
"default"
,
96
.type =
AVMEDIA_TYPE_VIDEO
},
97
{ .name =
NULL
}},
98
};