Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
md5enc.c
Go to the documentation of this file.
1
/*
2
* MD5 encoder (for codec/format testing)
3
* Copyright (c) 2009 Reimar Döffinger, based on crcenc (c) 2002 Fabrice Bellard
4
*
5
* This file is part of Libav.
6
*
7
* Libav is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* Libav is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
libavutil/md5.h
"
23
#include "
avformat.h
"
24
25
#define PRIVSIZE 512
26
27
static
void
md5_finish
(
struct
AVFormatContext
*s,
char
*buf)
28
{
29
uint8_t md5[16];
30
int
i, offset = strlen(buf);
31
av_md5_final
(s->
priv_data
, md5);
32
for
(i = 0; i <
sizeof
(md5); i++) {
33
snprintf(buf + offset, 3,
"%02"
PRIx8, md5[i]);
34
offset += 2;
35
}
36
buf[offset] =
'\n'
;
37
buf[offset+1] = 0;
38
39
avio_write
(s->
pb
, buf, strlen(buf));
40
avio_flush
(s->
pb
);
41
}
42
43
#if CONFIG_MD5_MUXER
44
static
int
write_header
(
struct
AVFormatContext
*s)
45
{
46
if
(
PRIVSIZE
<
av_md5_size
) {
47
av_log
(s,
AV_LOG_ERROR
,
"Insuffient size for md5 context\n"
);
48
return
-1;
49
}
50
av_md5_init
(s->
priv_data
);
51
return
0;
52
}
53
54
static
int
write_packet
(
struct
AVFormatContext
*s,
AVPacket
*pkt)
55
{
56
av_md5_update
(s->
priv_data
, pkt->
data
, pkt->
size
);
57
return
0;
58
}
59
60
static
int
write_trailer
(
struct
AVFormatContext
*s)
61
{
62
char
buf[64] =
"MD5="
;
63
64
md5_finish
(s, buf);
65
return
0;
66
}
67
68
AVOutputFormat
ff_md5_muxer = {
69
.
name
=
"md5"
,
70
.long_name =
NULL_IF_CONFIG_SMALL
(
"MD5 testing format"
),
71
.extensions =
""
,
72
.priv_data_size =
PRIVSIZE
,
73
.audio_codec =
CODEC_ID_PCM_S16LE
,
74
.video_codec =
CODEC_ID_RAWVIDEO
,
75
.write_header =
write_header
,
76
.write_packet =
write_packet
,
77
.write_trailer =
write_trailer
,
78
.flags =
AVFMT_NOTIMESTAMPS
,
79
};
80
#endif
81
82
#if CONFIG_FRAMEMD5_MUXER
83
static
int
framemd5_write_packet(
struct
AVFormatContext
*s,
AVPacket
*pkt)
84
{
85
char
buf[256];
86
if
(
PRIVSIZE
<
av_md5_size
) {
87
av_log
(s,
AV_LOG_ERROR
,
"Insuffient size for md5 context\n"
);
88
return
-1;
89
}
90
av_md5_init
(s->
priv_data
);
91
av_md5_update
(s->
priv_data
, pkt->
data
, pkt->
size
);
92
93
snprintf(buf,
sizeof
(buf) - 64,
"%d, %"
PRId64
", %d, "
, pkt->
stream_index
, pkt->
dts
, pkt->
size
);
94
md5_finish
(s, buf);
95
return
0;
96
}
97
98
AVOutputFormat
ff_framemd5_muxer = {
99
.
name
=
"framemd5"
,
100
.long_name =
NULL_IF_CONFIG_SMALL
(
"Per-frame MD5 testing format"
),
101
.extensions =
""
,
102
.priv_data_size =
PRIVSIZE
,
103
.audio_codec =
CODEC_ID_PCM_S16LE
,
104
.video_codec =
CODEC_ID_RAWVIDEO
,
105
.write_packet = framemd5_write_packet,
106
.flags =
AVFMT_VARIABLE_FPS
,
107
};
108
#endif