From 462b26202bc167c52159bcf409c0955bfa37134b Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sat, 15 Jan 2011 16:26:42 +0000 Subject: [PATCH] Set duration for wav files from sample size and data size or the wf64 sample value. This should improve duration accuracy slightly and avoids a warning about its inaccuracy when accurate values are available. Idea by Frank Barchard Originally committed as revision 26366 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/wav.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libavformat/wav.c b/libavformat/wav.c index ca687a3adb..903bc72747 100644 --- a/libavformat/wav.c +++ b/libavformat/wav.c @@ -183,6 +183,7 @@ static int wav_read_header(AVFormatContext *s, AVFormatParameters *ap) { int64_t size, av_uninit(data_size); + int64_t sample_count=0; int rf64; unsigned int tag; ByteIOContext *pb = s->pb; @@ -208,6 +209,7 @@ static int wav_read_header(AVFormatContext *s, return -1; get_le64(pb); /* RIFF size */ data_size = get_le64(pb); + sample_count = get_le64(pb); url_fskip(pb, size - 16); /* skip rest of ds64 chunk */ } @@ -233,6 +235,11 @@ static int wav_read_header(AVFormatContext *s, wav->data_end = INT64_MAX; } else wav->data_end= url_ftell(pb) + size; + + if (!sample_count && st->codec->channels && av_get_bits_per_sample(st->codec->codec_id)) + sample_count = (size<<3) / (st->codec->channels * (uint64_t)av_get_bits_per_sample(st->codec->codec_id)); + if (sample_count) + st->duration = sample_count; return 0; }