diff options
author | Matthew Hoops | 2011-12-29 13:27:45 -0500 |
---|---|---|
committer | Matthew Hoops | 2011-12-29 14:50:05 -0500 |
commit | df88a1f2a79faabeabb90c66de4f1404dc12f3ea (patch) | |
tree | 518820e841262be24aa2639011ad530ce7fd5018 /audio/decoders | |
parent | 1aa5608de643cff79bea81132bc18b3a163ccbdb (diff) | |
download | scummvm-rg350-df88a1f2a79faabeabb90c66de4f1404dc12f3ea.tar.gz scummvm-rg350-df88a1f2a79faabeabb90c66de4f1404dc12f3ea.tar.bz2 scummvm-rg350-df88a1f2a79faabeabb90c66de4f1404dc12f3ea.zip |
AUDIO: Fix M4A seeking with multiple time->sample chunks
Diffstat (limited to 'audio/decoders')
-rw-r--r-- | audio/decoders/quicktime.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index 621964cb3b..dcf80ea1c6 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -230,16 +230,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; + + 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; + } - // Note that duration is in terms of *one* channel - // This eases calculation a bit - seekSample /= _tracks[_audioTrackIndex]->timeToSample[0].duration; + seekSample += _tracks[_audioTrackIndex]->timeToSample[i].count; + curSample += sampleCount; + } } // Now to track down what chunk it's in |