[FFmpeg-devel] [PATCH] set correct bytespersec value in wav/ima_adpcm header

ucsavl at gmail.com ucsavl
Sun May 2 16:07:38 CEST 2010

I'm using ffmpeg to convert mp3s to wav + ima_idpcm so I could listen to
them on a mobile phone that doesn't support mp3.

The problem is the files always appear shorter than they are because of
the bogus bytespersec value in the header. When using sox instead of
ffmpeg they're OK, but sox is orders of magnitude slower than ffmpeg,
so it's of no use to me.

This patch sets the bytespersec value to
(packets per second) * (bytes per packet), where (packets per second) 
is calculated from (samples per second) / (samples per packet).

For reference, according to libavcodec/avcodec.h:
enc->sample_rate		samples per second
enc->frame_size			samples per packet
enc->block_align, blkalign	bytes per packet

diff --git a/libavformat/riff.c b/libavformat/riff.c
index 340fd76..94b1ae2 100644
--- a/libavformat/riff.c
+++ b/libavformat/riff.c
@@ -370,6 +370,9 @@ int ff_put_wav_header(ByteIOContext *pb, AVCodecContext *enc)
         enc->codec_id == CODEC_ID_PCM_F64LE ||
         enc->codec_id == CODEC_ID_PCM_S16LE) {
         bytespersec = enc->sample_rate * blkalign;
+    } else if(enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
+	bytespersec = (enc->sample_rate * blkalign + enc->frame_size / 2) /
+		enc->frame_size;
     } else {
         bytespersec = enc->bit_rate / 8;

More information about the ffmpeg-devel mailing list