[FFmpeg-devel] Patch to WAV to accurately report duration

Frank Barchard fbarchard
Sat Jan 15 11:16:05 CET 2011


On Wed, Jan 12, 2011 at 3:21 PM, Michael Niedermayer <michaelni at gmx.at>wrote:

> On Wed, Jan 12, 2011 at 01:59:09PM -0800, Frank Barchard wrote:
> > On Wed, Jan 12, 2011 at 8:04 AM, Michael Niedermayer <michaelni at gmx.at
> >wrote:
> >
> > > On Mon, Jan 10, 2011 at 06:51:18PM -0800, Frank Barchard wrote:
> > > > Patch to accurately report duration of a WAV.
> > >
> > > -    } else
> > > > +    } else {
> > > >          wav->data_end= url_ftell(pb) + size;
> > > > +        st->nb_frames = size /
> > > > +            (st->codec->channels * (st->codec->bits_per_coded_sample
> >>
> > > 3));
> > > > +        st->duration = st->codec->frame_size ?
> > > > +            st->nb_frames * st->codec->frame_size : st->nb_frames;
> > > > +    }
> > >
> > > this is wrong, iam not even sure its guranteed to work with PCM
> > >
> >
> > The patch has certainly worked for 8-bit, 16-bit, and 24-bit wav files
> that
> > we've tested.  With the patch, the number of frames is reported as
> exactly
> > right (as compared with the results returned by Apple's 'afinfo' tool).
> >  Without the patch it is not accurate.
>
> try it with any VBR codec
>

done.

This patch corrects VBR codecs, falling back on the estimate if
bits_per_coded_sample is not set.

Also tested with mulaw and alaw that are fixed bits per sample.
The intent of the math is to allow bits per sample that are not multples of
8

diff -wurp -N orig/libavformat/wav.c ffmpeg-mt/libavformat/wav.c
--- orig/libavformat/wav.c      2011-01-14 12:19:43.446029200 -0800
+++ ffmpeg-mt/libavformat/wav.c 2011-01-14 12:25:22.181032500 -0800
@@ -231,8 +231,15 @@ static int wav_read_header(AVFormatConte
         return -1;
     if (!size) {
         wav->data_end = INT64_MAX;
-    } else
+    } else {
         wav->data_end= url_ftell(pb) + size;
+        if (st->codec->channels * st->codec->bits_per_coded_sample) {
+            st->nb_frames = (size << 3) /
+                (st->codec->channels * st->codec->bits_per_coded_sample);
+            st->duration = st->codec->frame_size ?
+                st->nb_frames * st->codec->frame_size : st->nb_frames;
+        }
+    }
     return 0;
 }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 22_wav_duration.2.patch
Type: application/octet-stream
Size: 754 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20110115/403b888c/attachment.obj>



More information about the ffmpeg-devel mailing list