summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibaut Mattern <tmattern@users.sourceforge.net>2003-07-19 19:11:45 +0000
committerThibaut Mattern <tmattern@users.sourceforge.net>2003-07-19 19:11:45 +0000
commitca057156ecd387abcdf0b6ff45c9f850a92ea8e8 (patch)
tree848ded43e85899a4c799e115b376697d8d148d80
parent41614551d8c56a385ee46ec02adb7252d939d8c8 (diff)
downloadxine-lib-ca057156ecd387abcdf0b6ff45c9f850a92ea8e8.tar.gz
xine-lib-ca057156ecd387abcdf0b6ff45c9f850a92ea8e8.tar.bz2
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
-rw-r--r--src/demuxers/demux_avi.c21
1 files 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;