22
22
#include "libavutil/md5.h"
23
23
#include "avformat.h"
27
30
static void md5_finish(struct AVFormatContext *s, char *buf)
32
struct MD5Context *c = s->priv_data;
30
34
int i, offset = strlen(buf);
31
av_md5_final(s->priv_data, md5);
35
av_md5_final(c->md5, md5);
32
36
for (i = 0; i < sizeof(md5); i++) {
33
37
snprintf(buf + offset, 3, "%02"PRIx8, md5[i]);
43
47
#if CONFIG_MD5_MUXER
44
48
static int write_header(struct AVFormatContext *s)
46
if (PRIVSIZE < av_md5_size) {
47
av_log(s, AV_LOG_ERROR, "Insuffient size for md5 context\n");
50
av_md5_init(s->priv_data);
50
struct MD5Context *c = s->priv_data;
51
c->md5 = av_md5_alloc();
53
return AVERROR(ENOMEM);
54
58
static int write_packet(struct AVFormatContext *s, AVPacket *pkt)
56
av_md5_update(s->priv_data, pkt->data, pkt->size);
60
struct MD5Context *c = s->priv_data;
61
av_md5_update(c->md5, pkt->data, pkt->size);
60
65
static int write_trailer(struct AVFormatContext *s)
67
struct MD5Context *c = s->priv_data;
62
68
char buf[64] = "MD5=";
64
70
md5_finish(s, buf);
68
76
AVOutputFormat ff_md5_muxer = {
70
.long_name = NULL_IF_CONFIG_SMALL("MD5 testing format"),
78
.long_name = NULL_IF_CONFIG_SMALL("MD5 testing"),
72
.priv_data_size = PRIVSIZE,
73
.audio_codec = CODEC_ID_PCM_S16LE,
74
.video_codec = CODEC_ID_RAWVIDEO,
80
.priv_data_size = sizeof(struct MD5Context),
81
.audio_codec = AV_CODEC_ID_PCM_S16LE,
82
.video_codec = AV_CODEC_ID_RAWVIDEO,
75
83
.write_header = write_header,
76
84
.write_packet = write_packet,
77
85
.write_trailer = write_trailer,
82
90
#if CONFIG_FRAMEMD5_MUXER
91
static int framemd5_write_header(struct AVFormatContext *s)
93
struct MD5Context *c = s->priv_data;
94
c->md5 = av_md5_alloc();
96
return AVERROR(ENOMEM);
97
return ff_framehash_write_header(s);
83
100
static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt)
102
struct MD5Context *c = s->priv_data;
86
if (PRIVSIZE < av_md5_size) {
87
av_log(s, AV_LOG_ERROR, "Insuffient size for md5 context\n");
90
av_md5_init(s->priv_data);
91
av_md5_update(s->priv_data, pkt->data, pkt->size);
105
av_md5_update(c->md5, pkt->data, pkt->size);
93
snprintf(buf, sizeof(buf) - 64, "%d, %"PRId64", %d, ", pkt->stream_index, pkt->dts, pkt->size);
107
snprintf(buf, sizeof(buf) - 64, "%d, %10"PRId64", %10"PRId64", %8d, %8d, ",
108
pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size);
94
109
md5_finish(s, buf);
113
static int framemd5_write_trailer(struct AVFormatContext *s)
115
struct MD5Context *c = s->priv_data;
98
120
AVOutputFormat ff_framemd5_muxer = {
99
121
.name = "framemd5",
100
.long_name = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing format"),
122
.long_name = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing"),
101
123
.extensions = "",
102
.priv_data_size = PRIVSIZE,
103
.audio_codec = CODEC_ID_PCM_S16LE,
104
.video_codec = CODEC_ID_RAWVIDEO,
124
.priv_data_size = sizeof(struct MD5Context),
125
.audio_codec = AV_CODEC_ID_PCM_S16LE,
126
.video_codec = AV_CODEC_ID_RAWVIDEO,
127
.write_header = framemd5_write_header,
105
128
.write_packet = framemd5_write_packet,
106
.flags = AVFMT_VARIABLE_FPS,
129
.write_trailer = framemd5_write_trailer,
130
.flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,