summaryrefslogtreecommitdiff
path: root/libavformat/md5enc.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-10-11 15:27:25 +0300
committerMartin Storsjö <martin@martin.st>2012-10-11 23:35:29 +0300
commitda18e918a4ec015dd0aef1c7ec9cab09f3a019bf (patch)
treeddbc6765428ae3093e5ae8d0fad58396e3c06e78 /libavformat/md5enc.c
parente002e3291e6dc7953f843abf56fc14f08f238b21 (diff)
md5: Allocate a normal private context for the opaque md5 context pointer
This avoids having to overestimate the md5 context size, which isn't known beforehand, allowing us to use the new allocate functions instead. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/md5enc.c')
-rw-r--r--libavformat/md5enc.c55
1 files changed, 38 insertions, 17 deletions
diff --git a/libavformat/md5enc.c b/libavformat/md5enc.c
index fbd4d99397..16412c9a34 100644
--- a/libavformat/md5enc.c
+++ b/libavformat/md5enc.c
@@ -23,13 +23,16 @@
#include "avformat.h"
#include "internal.h"
-#define PRIVSIZE 512
+struct MD5Context {
+ struct AVMD5 *md5;
+};
static void md5_finish(struct AVFormatContext *s, char *buf)
{
+ struct MD5Context *c = s->priv_data;
uint8_t md5[16];
int i, offset = strlen(buf);
- av_md5_final(s->priv_data, md5);
+ av_md5_final(c->md5, md5);
for (i = 0; i < sizeof(md5); i++) {
snprintf(buf + offset, 3, "%02"PRIx8, md5[i]);
offset += 2;
@@ -44,25 +47,29 @@ static void md5_finish(struct AVFormatContext *s, char *buf)
#if CONFIG_MD5_MUXER
static int write_header(struct AVFormatContext *s)
{
- if (PRIVSIZE < av_md5_size) {
- av_log(s, AV_LOG_ERROR, "Insuffient size for md5 context\n");
- return -1;
- }
- av_md5_init(s->priv_data);
+ struct MD5Context *c = s->priv_data;
+ c->md5 = av_md5_alloc();
+ if (!c->md5)
+ return AVERROR(ENOMEM);
+ av_md5_init(c->md5);
return 0;
}
static int write_packet(struct AVFormatContext *s, AVPacket *pkt)
{
- av_md5_update(s->priv_data, pkt->data, pkt->size);
+ struct MD5Context *c = s->priv_data;
+ av_md5_update(c->md5, pkt->data, pkt->size);
return 0;
}
static int write_trailer(struct AVFormatContext *s)
{
+ struct MD5Context *c = s->priv_data;
char buf[64] = "MD5=";
md5_finish(s, buf);
+
+ av_freep(&c->md5);
return 0;
}
@@ -70,7 +77,7 @@ AVOutputFormat ff_md5_muxer = {
.name = "md5",
.long_name = NULL_IF_CONFIG_SMALL("MD5 testing"),
.extensions = "",
- .priv_data_size = PRIVSIZE,
+ .priv_data_size = sizeof(struct MD5Context),
.audio_codec = AV_CODEC_ID_PCM_S16LE,
.video_codec = AV_CODEC_ID_RAWVIDEO,
.write_header = write_header,
@@ -81,15 +88,21 @@ AVOutputFormat ff_md5_muxer = {
#endif
#if CONFIG_FRAMEMD5_MUXER
+static int framemd5_write_header(struct AVFormatContext *s)
+{
+ struct MD5Context *c = s->priv_data;
+ c->md5 = av_md5_alloc();
+ if (!c->md5)
+ return AVERROR(ENOMEM);
+ return ff_framehash_write_header(s);
+}
+
static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt)
{
+ struct MD5Context *c = s->priv_data;
char buf[256];
- if (PRIVSIZE < av_md5_size) {
- av_log(s, AV_LOG_ERROR, "Insuffient size for md5 context\n");
- return -1;
- }
- av_md5_init(s->priv_data);
- av_md5_update(s->priv_data, pkt->data, pkt->size);
+ av_md5_init(c->md5);
+ av_md5_update(c->md5, pkt->data, pkt->size);
snprintf(buf, sizeof(buf) - 64, "%d, %10"PRId64", %10"PRId64", %8d, %8d, ",
pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size);
@@ -97,15 +110,23 @@ static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt)
return 0;
}
+static int framemd5_write_trailer(struct AVFormatContext *s)
+{
+ struct MD5Context *c = s->priv_data;
+ av_freep(&c->md5);
+ return 0;
+}
+
AVOutputFormat ff_framemd5_muxer = {
.name = "framemd5",
.long_name = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing"),
.extensions = "",
- .priv_data_size = PRIVSIZE,
+ .priv_data_size = sizeof(struct MD5Context),
.audio_codec = AV_CODEC_ID_PCM_S16LE,
.video_codec = AV_CODEC_ID_RAWVIDEO,
- .write_header = ff_framehash_write_header,
+ .write_header = framemd5_write_header,
.write_packet = framemd5_write_packet,
+ .write_trailer = framemd5_write_trailer,
.flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,
};
#endif