diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-10-12 17:16:53 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-12 17:34:49 +0400 |
commit | a33ed6bc74b6b8ada925c76c4084afcf8870a048 (patch) | |
tree | 605fa1fc8e55698f892837e7d0191da5e5c34c1c /libavformat | |
parent | f391e405dfde35bfb3fea9ccc09bd67b5cc0a8f2 (diff) | |
parent | b7f1010c8fce09096057528f7cd29589ea1ae7df (diff) |
Merge commit 'b7f1010c8fce09096057528f7cd29589ea1ae7df'
* commit 'b7f1010c8fce09096057528f7cd29589ea1ae7df':
tools: do not use av_pix_fmt_descriptors directly.
pixdesc: add functions for accessing pixel format descriptors.
build: add support for Tru64 (OSF/1)
md5: Allocate a normal private context for the opaque md5 context pointer
Conflicts:
cmdutils.c
doc/APIchanges
ffprobe.c
libavformat/md5enc.c
libavutil/version.h
tools/graph2dot.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/md5enc.c | 55 | ||||
-rw-r--r-- | libavformat/md5proto.c | 24 |
2 files changed, 53 insertions, 26 deletions
diff --git a/libavformat/md5enc.c b/libavformat/md5enc.c index f3653084e7..050efb1513 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,32 +47,36 @@ 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; } AVOutputFormat ff_md5_muxer = { .name = "md5", .long_name = NULL_IF_CONFIG_SMALL("MD5 testing"), - .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, @@ -80,15 +87,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); @@ -96,14 +109,22 @@ 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"), - .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 diff --git a/libavformat/md5proto.c b/libavformat/md5proto.c index f7c8b78fee..6af0a6ed26 100644 --- a/libavformat/md5proto.c +++ b/libavformat/md5proto.c @@ -27,37 +27,41 @@ #include "avio.h" #include "url.h" -#define PRIV_SIZE 128 +struct MD5Context { + struct AVMD5 *md5; +}; static int md5_open(URLContext *h, const char *filename, int flags) { - if (PRIV_SIZE < av_md5_size) { - av_log(NULL, AV_LOG_ERROR, "Insuffient size for MD5 context\n"); - return -1; - } + struct MD5Context *c = h->priv_data; if (!(flags & AVIO_FLAG_WRITE)) 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; } 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; } static int md5_close(URLContext *h) { + struct MD5Context *c = h->priv_data; const char *filename = h->filename; uint8_t md5[16], buf[64]; URLContext *out; int i, err = 0; - av_md5_final(h->priv_data, md5); + av_md5_final(c->md5, md5); for (i = 0; i < sizeof(md5); i++) snprintf(buf + i*2, 3, "%02x", md5[i]); buf[i*2] = '\n'; @@ -76,6 +80,8 @@ static int md5_close(URLContext *h) err = AVERROR(errno); } + av_freep(&c->md5); + return err; } @@ -85,5 +91,5 @@ URLProtocol ff_md5_protocol = { .url_open = md5_open, .url_write = md5_write, .url_close = md5_close, - .priv_data_size = PRIV_SIZE, + .priv_data_size = sizeof(struct MD5Context), }; |