Mercurial > libavcodec.hg
changeset 7861:f092dd630095 libavcodec
write MD5 checksum to FLAC header. update regression tests.
author | jbr |
---|---|
date | Sun, 14 Sep 2008 21:39:54 +0000 |
parents | c11e175fc544 |
children | dc8d9cc3369e |
files | flacenc.c |
diffstat | 1 files changed, 29 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/flacenc.c Sun Sep 14 20:00:36 2008 +0000 +++ b/flacenc.c Sun Sep 14 21:39:54 2008 +0000 @@ -21,6 +21,7 @@ #include "libavutil/crc.h" #include "libavutil/lls.h" +#include "libavutil/md5.h" #include "avcodec.h" #include "bitstream.h" #include "dsputil.h" @@ -97,10 +98,12 @@ int max_framesize; uint32_t frame_count; uint64_t sample_count; + uint8_t md5sum[16]; FlacFrame frame; CompressionOptions options; AVCodecContext *avctx; DSPContext dsp; + struct AVMD5 *md5ctx; } FlacEncodeContext; static const int flac_samplerates[16] = { @@ -139,7 +142,7 @@ put_bits(&pb, 24, (s->sample_count & 0xFFFFFF000LL) >> 12); put_bits(&pb, 12, s->sample_count & 0x000000FFFLL); flush_put_bits(&pb); - /* MD5 signature = 0 */ + memcpy(&header[18], s->md5sum, 16); } /** @@ -372,6 +375,12 @@ s->max_framesize = 14 + (s->avctx->frame_size * s->channels * 2); } + /* initialize MD5 context */ + s->md5ctx = av_malloc(av_md5_size); + if(!s->md5ctx) + return AVERROR_NOMEM; + av_md5_init(s->md5ctx); + streaminfo = av_malloc(FLAC_STREAMINFO_SIZE); write_streaminfo(s, streaminfo); avctx->extradata = streaminfo; @@ -1238,6 +1247,19 @@ flush_put_bits(&s->pb); } +static void update_md5_sum(FlacEncodeContext *s, int16_t *samples) +{ +#ifdef WORDS_BIGENDIAN + int i; + for(i = 0; i < s->frame.blocksize*s->channels; i++) { + int16_t smp = le2me_16(samples[i]); + av_md5_update(s->md5ctx, (uint8_t *)&smp, 2); + } +#else + av_md5_update(s->md5ctx, (uint8_t *)samples, s->frame.blocksize*s->channels*2); +#endif +} + static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame, int buf_size, void *data) { @@ -1256,6 +1278,7 @@ /* when the last block is reached, update the header in extradata */ if (!data) { + av_md5_final(s->md5ctx, s->md5sum); write_streaminfo(s, avctx->extradata); return 0; } @@ -1294,12 +1317,17 @@ s->frame_count++; s->sample_count += avctx->frame_size; + update_md5_sum(s, samples); return out_bytes; } static av_cold int flac_encode_close(AVCodecContext *avctx) { + if (avctx->priv_data) { + FlacEncodeContext *s = avctx->priv_data; + av_freep(&s->md5ctx); + } av_freep(&avctx->extradata); avctx->extradata_size = 0; av_freep(&avctx->coded_frame);