[FFmpeg-devel] [PATCH] set correct bytespersec value in wav/ima_adpcm header
Michael Niedermayer
michaelni
Tue May 4 13:51:06 CEST 2010
On Tue, May 04, 2010 at 02:37:59PM +0300, ucsavl at gmail.com wrote:
> On Mon, May 03, 2010 at 01:36:30PM +0200, Michael Niedermayer wrote:
> > On Mon, May 03, 2010 at 10:10:13AM +0300, ucsavl at gmail.com wrote:
> > > On Mon, May 03, 2010 at 04:09:23AM +0200, Michael Niedermayer wrote:
> > > > On Sun, May 02, 2010 at 05:07:38PM +0300, ucsavl at gmail.com wrote:
> > > > > 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;
> > > >
> > > > is adding CODEC_ID_ADPCM_IMA_WAV to the previous if() failing?
> > >
> > > Yes, of course. The previous if() assumes that enc->frame_size == 1.
> >
> > what about fixing it then?
>
> Is there a simple way to check if a codec is pcm or adpcm?
a non zero value for av_get_bits_per_sample() might work
but there seem to be a few special cases when setting blkalign for these
enc->frame_size would not work as is in these cases
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100504/4fb0ac65/attachment.pgp>
More information about the ffmpeg-devel
mailing list