From ca057156ecd387abcdf0b6ff45c9f850a92ea8e8 Mon Sep 17 00:00:00 2001 From: Thibaut Mattern Date: Sat, 19 Jul 2003 19:11:45 +0000 Subject: Better detection of VBR streams. Fix playback of this stream : http://cubeonline23.sourceforge.net/kirbylan.avi CVS patchset: 5194 CVS date: 2003/07/19 19:11:45 --- src/demuxers/demux_avi.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/demuxers/demux_avi.c b/src/demuxers/demux_avi.c index 52c231375..4af2f5ed3 100644 --- a/src/demuxers/demux_avi.c +++ b/src/demuxers/demux_avi.c @@ -19,7 +19,7 @@ */ /* - * $Id: demux_avi.c,v 1.164 2003/07/16 14:14:17 andruil Exp $ + * $Id: demux_avi.c,v 1.165 2003/07/19 19:11:45 tmattern Exp $ * * demultiplexer for avi streams * @@ -309,8 +309,20 @@ static int64_t get_audio_pts (demux_avi_t *this, int track, long posc, if (at->dwSampleSize==0) { /* variable bitrate */ - return (int64_t)(90000.0 * (double)posc * - (double)at->dwScale_audio / (double)at->dwRate_audio); + if (at->dwScale_audio > 1) { + /* normal case */ + return (int64_t)(90000.0 * (double)(posc) * + (double)at->dwScale_audio / (double)at->dwRate_audio); + } else { + /* not really variable bitrate */ + if( at->wavex && at->wavex->nBlockAlign ) { + return (int64_t)((double)(postot + posb) / (double)at->wavex->nBlockAlign * + (double)at->dwScale_audio / (double)at->dwRate_audio * 90000.0); + } else { + return (int64_t)((double)(postot + posb) * + (double)at->dwScale_audio / (double)at->dwRate_audio * 90000.0); + } + } } else { /* constant bitrate */ if( at->wavex && at->wavex->nBlockAlign ) { @@ -740,6 +752,9 @@ static avi_t *AVI_init(demux_avi_t *this) { a->audio_strn = num_stream; a->dwScale_audio = str2ulong(hdrl_data+i+20); a->dwRate_audio = str2ulong(hdrl_data+i+24); + + lprintf("dwScale=%d, dwRate=%d, num_stream=%d\n", a->dwScale_audio, a->dwRate_audio, num_stream); + a->dwSampleSize = str2ulong(hdrl_data+i+44); a->audio_tot = 0; auds_strh_seen = 1; -- cgit v1.2.3