From 4a0dc293b525af29a4c39b1028df6b633c418c28 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 29 Dec 2011 13:27:45 -0500 Subject: [PATCH] AUDIO: Fix M4A seeking with multiple time->sample chunks --- audio/decoders/quicktime.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index 8cf0305e88b..fdf17e901c6 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -227,16 +227,23 @@ void QuickTimeAudioDecoder::setAudioStreamPos(const Timestamp &where) { uint32 seekSample = sample; if (!isOldDemuxing()) { - // We shouldn't have audio samples that are a different duration - // That would be quite bad! - if (_tracks[_audioTrackIndex]->timeToSampleCount != 1) { - warning("Failed seeking"); - return; - } + // For MPEG-4 style demuxing, we need to track down the sample based on the time + // The old style demuxing doesn't require this because each "sample"'s duration + // is just 1 + uint32 curSample = 0; + seekSample = 0; - // Note that duration is in terms of *one* channel - // This eases calculation a bit - seekSample /= _tracks[_audioTrackIndex]->timeToSample[0].duration; + for (int32 i = 0; i < _tracks[_audioTrackIndex]->timeToSampleCount; i++) { + uint32 sampleCount = _tracks[_audioTrackIndex]->timeToSample[i].count * _tracks[_audioTrackIndex]->timeToSample[i].duration; + + if (sample < curSample + sampleCount) { + seekSample += (sample - curSample) / _tracks[_audioTrackIndex]->timeToSample[i].duration; + break; + } + + seekSample += _tracks[_audioTrackIndex]->timeToSample[i].count; + curSample += sampleCount; + } } // Now to track down what chunk it's in