aboutsummaryrefslogtreecommitdiff
path: root/audio/decoders
diff options
context:
space:
mode:
authorMatthew Hoops2011-12-29 13:27:45 -0500
committerMatthew Hoops2011-12-29 14:50:05 -0500
commitdf88a1f2a79faabeabb90c66de4f1404dc12f3ea (patch)
tree518820e841262be24aa2639011ad530ce7fd5018 /audio/decoders
parent1aa5608de643cff79bea81132bc18b3a163ccbdb (diff)
downloadscummvm-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.cpp25
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