diff options
Diffstat (limited to 'video/bink_decoder.cpp')
-rw-r--r-- | video/bink_decoder.cpp | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/video/bink_decoder.cpp b/video/bink_decoder.cpp index 46ac8ac386..884ca69f17 100644 --- a/video/bink_decoder.cpp +++ b/video/bink_decoder.cpp @@ -113,23 +113,33 @@ BinkDecoder::BinkDecoder() { } _audioStream = 0; - _audioStarted = false; } -BinkDecoder::~BinkDecoder() { - close(); -} +void BinkDecoder::startAudio() { + if (_audioTrack < _audioTracks.size()) { + const AudioTrack &audio = _audioTracks[_audioTrack]; -void BinkDecoder::close() { - reset(); + _audioStream = Audio::makeQueuingAudioStream(audio.outSampleRate, audio.outChannels == 2); + g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audioHandle, _audioStream); + } // else no audio +} +void BinkDecoder::stopAudio() { if (_audioStream) { - // Stop audio g_system->getMixer()->stopHandle(_audioHandle); _audioStream = 0; } +} + +BinkDecoder::~BinkDecoder() { + close(); +} - _audioStarted = false; +void BinkDecoder::close() { + reset(); + + // Stop audio + stopAudio(); for (int i = 0; i < 4; i++) { delete[] _curPlanes[i]; _curPlanes[i] = 0; @@ -173,7 +183,7 @@ void BinkDecoder::close() { uint32 BinkDecoder::getElapsedTime() const { if (_audioStream && g_system->getMixer()->isSoundHandleActive(_audioHandle)) - return g_system->getMixer()->getSoundElapsedTime(_audioHandle); + return g_system->getMixer()->getSoundElapsedTime(_audioHandle) + _audioStartOffset; return g_system->getMillis() - _startTime; } @@ -241,11 +251,6 @@ const Graphics::Surface *BinkDecoder::decodeNextFrame() { if (_curFrame == 0) _startTime = g_system->getMillis(); - if (!_audioStarted && _audioStream) { - _audioStarted = true; - g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audioHandle, _audioStream); - } - return &_surface; } @@ -510,6 +515,11 @@ void BinkDecoder::mergeHuffmanSymbols(VideoFrame &video, byte *dst, const byte * } bool BinkDecoder::loadStream(Common::SeekableReadStream *stream) { + Graphics::PixelFormat format = g_system->getScreenFormat(); + return loadStream(stream, format); +} + +bool BinkDecoder::loadStream(Common::SeekableReadStream *stream, const Graphics::PixelFormat &format) { close(); _id = stream->readUint32BE(); @@ -589,7 +599,6 @@ bool BinkDecoder::loadStream(Common::SeekableReadStream *stream) { _hasAlpha = _videoFlags & kVideoFlagAlpha; _swapPlanes = (_id == kBIKhID) || (_id == kBIKiID); // BIKh and BIKi swap the chroma planes - Graphics::PixelFormat format = g_system->getScreenFormat(); _surface.create(width, height, format); // Give the planes a bit extra space @@ -618,11 +627,8 @@ bool BinkDecoder::loadStream(Common::SeekableReadStream *stream) { initBundles(); initHuffman(); - if (_audioTrack < _audioTracks.size()) { - const AudioTrack &audio = _audioTracks[_audioTrack]; - - _audioStream = Audio::makeQueuingAudioStream(audio.outSampleRate, audio.outChannels == 2); - } + startAudio(); + _audioStartOffset = 0; return true; } @@ -711,15 +717,15 @@ void BinkDecoder::initBundles() { for (int i = 0; i < 2; i++) { int width = MAX<uint32>(cw[i], 8); - _bundles[kSourceBlockTypes ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; - _bundles[kSourceSubBlockTypes].countLengths[i] = Common::intLog2((width >> 4) + 511) + 1; - _bundles[kSourceColors ].countLengths[i] = Common::intLog2((cbw[i] )*64 + 511) + 1; - _bundles[kSourceIntraDC ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; - _bundles[kSourceInterDC ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; - _bundles[kSourceXOff ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; - _bundles[kSourceYOff ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; - _bundles[kSourcePattern ].countLengths[i] = Common::intLog2((cbw[i] << 3) + 511) + 1; - _bundles[kSourceRun ].countLengths[i] = Common::intLog2((cbw[i] )*48 + 511) + 1; + _bundles[kSourceBlockTypes ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; + _bundles[kSourceSubBlockTypes].countLengths[i] = Common::intLog2(((width + 7) >> 4) + 511) + 1; + _bundles[kSourceColors ].countLengths[i] = Common::intLog2((cbw[i]) * 64 + 511) + 1; + _bundles[kSourceIntraDC ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; + _bundles[kSourceInterDC ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; + _bundles[kSourceXOff ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; + _bundles[kSourceYOff ].countLengths[i] = Common::intLog2((width >> 3) + 511) + 1; + _bundles[kSourcePattern ].countLengths[i] = Common::intLog2((cbw[i] << 3) + 511) + 1; + _bundles[kSourceRun ].countLengths[i] = Common::intLog2((cbw[i]) * 48 + 511) + 1; } } |