diff options
-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 |