Commit da18e918 authored by Martin Storsjö's avatar Martin Storsjö

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: 's avatarMartin Storsjö <martin@martin.st>
parent e002e329
...@@ -23,13 +23,16 @@ ...@@ -23,13 +23,16 @@
#include "avformat.h" #include "avformat.h"
#include "internal.h" #include "internal.h"
#define PRIVSIZE 512 struct MD5Context {
struct AVMD5 *md5;
};
static void md5_finish(struct AVFormatContext *s, char *buf) static void md5_finish(struct AVFormatContext *s, char *buf)
{ {
struct MD5Context *c = s->priv_data;
uint8_t md5[16]; uint8_t md5[16];
int i, offset = strlen(buf); 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++) { for (i = 0; i < sizeof(md5); i++) {
snprintf(buf + offset, 3, "%02"PRIx8, md5[i]); snprintf(buf + offset, 3, "%02"PRIx8, md5[i]);
offset += 2; offset += 2;
...@@ -44,25 +47,29 @@ static void md5_finish(struct AVFormatContext *s, char *buf) ...@@ -44,25 +47,29 @@ static void md5_finish(struct AVFormatContext *s, char *buf)
#if CONFIG_MD5_MUXER #if CONFIG_MD5_MUXER
static int write_header(struct AVFormatContext *s) static int write_header(struct AVFormatContext *s)
{ {
if (PRIVSIZE < av_md5_size) { struct MD5Context *c = s->priv_data;
av_log(s, AV_LOG_ERROR, "Insuffient size for md5 context\n"); c->md5 = av_md5_alloc();
return -1; if (!c->md5)
} return AVERROR(ENOMEM);
av_md5_init(s->priv_data); av_md5_init(c->md5);
return 0; return 0;
} }
static int write_packet(struct AVFormatContext *s, AVPacket *pkt) 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; return 0;
} }
static int write_trailer(struct AVFormatContext *s) static int write_trailer(struct AVFormatContext *s)
{ {
struct MD5Context *c = s->priv_data;
char buf[64] = "MD5="; char buf[64] = "MD5=";
md5_finish(s, buf); md5_finish(s, buf);
av_freep(&c->md5);
return 0; return 0;
} }
...@@ -70,7 +77,7 @@ AVOutputFormat ff_md5_muxer = { ...@@ -70,7 +77,7 @@ AVOutputFormat ff_md5_muxer = {
.name = "md5", .name = "md5",
.long_name = NULL_IF_CONFIG_SMALL("MD5 testing"), .long_name = NULL_IF_CONFIG_SMALL("MD5 testing"),
.extensions = "", .extensions = "",
.priv_data_size = PRIVSIZE, .priv_data_size = sizeof(struct MD5Context),
.audio_codec = AV_CODEC_ID_PCM_S16LE, .audio_codec = AV_CODEC_ID_PCM_S16LE,
.video_codec = AV_CODEC_ID_RAWVIDEO, .video_codec = AV_CODEC_ID_RAWVIDEO,
.write_header = write_header, .write_header = write_header,
...@@ -81,15 +88,21 @@ AVOutputFormat ff_md5_muxer = { ...@@ -81,15 +88,21 @@ AVOutputFormat ff_md5_muxer = {
#endif #endif
#if CONFIG_FRAMEMD5_MUXER #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) static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt)
{ {
struct MD5Context *c = s->priv_data;
char buf[256]; char buf[256];
if (PRIVSIZE < av_md5_size) { av_md5_init(c->md5);
av_log(s, AV_LOG_ERROR, "Insuffient size for md5 context\n"); av_md5_update(c->md5, pkt->data, pkt->size);
return -1;
}
av_md5_init(s->priv_data);
av_md5_update(s->priv_data, pkt->data, pkt->size);
snprintf(buf, sizeof(buf) - 64, "%d, %10"PRId64", %10"PRId64", %8d, %8d, ", snprintf(buf, sizeof(buf) - 64, "%d, %10"PRId64", %10"PRId64", %8d, %8d, ",
pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size); 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) ...@@ -97,15 +110,23 @@ static int framemd5_write_packet(struct AVFormatContext *s, AVPacket *pkt)
return 0; 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 = { AVOutputFormat ff_framemd5_muxer = {
.name = "framemd5", .name = "framemd5",
.long_name = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing"), .long_name = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing"),
.extensions = "", .extensions = "",
.priv_data_size = PRIVSIZE, .priv_data_size = sizeof(struct MD5Context),
.audio_codec = AV_CODEC_ID_PCM_S16LE, .audio_codec = AV_CODEC_ID_PCM_S16LE,
.video_codec = AV_CODEC_ID_RAWVIDEO, .video_codec = AV_CODEC_ID_RAWVIDEO,
.write_header = ff_framehash_write_header, .write_header = framemd5_write_header,
.write_packet = framemd5_write_packet, .write_packet = framemd5_write_packet,
.write_trailer = framemd5_write_trailer,
.flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT, .flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,
}; };
#endif #endif
...@@ -27,37 +27,41 @@ ...@@ -27,37 +27,41 @@
#include "avio.h" #include "avio.h"
#include "url.h" #include "url.h"
#define PRIV_SIZE 128 struct MD5Context {
struct AVMD5 *md5;
};
static int md5_open(URLContext *h, const char *filename, int flags) static int md5_open(URLContext *h, const char *filename, int flags)
{ {
if (PRIV_SIZE < av_md5_size) { struct MD5Context *c = h->priv_data;
av_log(NULL, AV_LOG_ERROR, "Insuffient size for MD5 context\n");
return -1;
}
if (!(flags & AVIO_FLAG_WRITE)) if (!(flags & AVIO_FLAG_WRITE))
return AVERROR(EINVAL); return AVERROR(EINVAL);
av_md5_init(h->priv_data); c->md5 = av_md5_alloc();
if (!c->md5)
return AVERROR(ENOMEM);
av_md5_init(c->md5);
return 0; return 0;
} }
static int md5_write(URLContext *h, const unsigned char *buf, int size) static int md5_write(URLContext *h, const unsigned char *buf, int size)
{ {
av_md5_update(h->priv_data, buf, size); struct MD5Context *c = h->priv_data;
av_md5_update(c->md5, buf, size);
return size; return size;
} }
static int md5_close(URLContext *h) static int md5_close(URLContext *h)
{ {
struct MD5Context *c = h->priv_data;
const char *filename = h->filename; const char *filename = h->filename;
uint8_t md5[16], buf[64]; uint8_t md5[16], buf[64];
URLContext *out; URLContext *out;
int i, err = 0; int i, err = 0;
av_md5_final(h->priv_data, md5); av_md5_final(c->md5, md5);
for (i = 0; i < sizeof(md5); i++) for (i = 0; i < sizeof(md5); i++)
snprintf(buf + i*2, 3, "%02x", md5[i]); snprintf(buf + i*2, 3, "%02x", md5[i]);
buf[i*2] = '\n'; buf[i*2] = '\n';
...@@ -76,6 +80,8 @@ static int md5_close(URLContext *h) ...@@ -76,6 +80,8 @@ static int md5_close(URLContext *h)
err = AVERROR(errno); err = AVERROR(errno);
} }
av_freep(&c->md5);
return err; return err;
} }
...@@ -85,5 +91,5 @@ URLProtocol ff_md5_protocol = { ...@@ -85,5 +91,5 @@ URLProtocol ff_md5_protocol = {
.url_open = md5_open, .url_open = md5_open,
.url_write = md5_write, .url_write = md5_write,
.url_close = md5_close, .url_close = md5_close,
.priv_data_size = PRIV_SIZE, .priv_data_size = sizeof(struct MD5Context),
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment