diff options
author | Paul Gilbert | 2016-07-11 19:39:53 -0400 |
---|---|---|
committer | Paul Gilbert | 2016-07-17 13:08:31 -0400 |
commit | fa6e12aaab4e19424481fc26eab281663cbf3283 (patch) | |
tree | eabc58a771af32e6c87b41e96831bdeb86d8cc37 | |
parent | 207e1cbb296c8f825d19167d420bbf141398ac1d (diff) | |
download | scummvm-rg350-fa6e12aaab4e19424481fc26eab281663cbf3283.tar.gz scummvm-rg350-fa6e12aaab4e19424481fc26eab281663cbf3283.tar.bz2 scummvm-rg350-fa6e12aaab4e19424481fc26eab281663cbf3283.zip |
VIDEO: Add support for a track filtering callback function
This is needed for Starship Titanic, where videos can have a secondary
video track. It was simpler to use the callback as a means to select
one video track each across two decoders than trying to make VideoDecoder
and/or AVIDecoder support decoding from multiple video tracks simultaneously
-rw-r--r-- | video/avi_decoder.cpp | 20 | ||||
-rw-r--r-- | video/avi_decoder.h | 10 |
2 files changed, 20 insertions, 10 deletions
diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp index 8f1bec4388..cb087c72fc 100644 --- a/video/avi_decoder.cpp +++ b/video/avi_decoder.cpp @@ -76,12 +76,13 @@ enum { }; -AVIDecoder::AVIDecoder(Audio::Mixer::SoundType soundType) : _frameRateOverride(0), _soundType(soundType) { +AVIDecoder::AVIDecoder(Audio::Mixer::SoundType soundType, SelectTrackFn trackFn) : + _frameRateOverride(0), _soundType(soundType), _selectTrackFn(trackFn) { initCommon(); } -AVIDecoder::AVIDecoder(const Common::Rational &frameRateOverride, Audio::Mixer::SoundType soundType) - : _frameRateOverride(frameRateOverride), _soundType(soundType) { +AVIDecoder::AVIDecoder(const Common::Rational &frameRateOverride, Audio::Mixer::SoundType soundType, + SelectTrackFn trackFn) : _frameRateOverride(frameRateOverride), _soundType(soundType), _selectTrackFn(trackFn) { initCommon(); } @@ -99,6 +100,7 @@ void AVIDecoder::initCommon() { _movieListStart = 0; _movieListEnd = 0; _fileStream = 0; + _videoTrackCounter = _audioTrackCounter = 0; memset(&_header, 0, sizeof(_header)); } @@ -263,7 +265,8 @@ void AVIDecoder::handleStreamHeader(uint32 size) { } } - addTrack(new AVIVideoTrack(_header.totalFrames, sHeader, bmInfo, initialPalette)); + if (!_selectTrackFn || _selectTrackFn(true, _videoTrackCounter++)) + addTrack(new AVIVideoTrack(_header.totalFrames, sHeader, bmInfo, initialPalette)); } else if (sHeader.streamType == ID_AUDS) { PCMWaveFormat wvInfo; wvInfo.tag = _fileStream->readUint16LE(); @@ -278,9 +281,11 @@ void AVIDecoder::handleStreamHeader(uint32 size) { if (wvInfo.channels == 2) sHeader.sampleSize /= 2; - AVIAudioTrack *track = createAudioTrack(sHeader, wvInfo); - track->createAudioStream(); - addTrack(track); + if (!_selectTrackFn || _selectTrackFn(false, _audioTrackCounter++)) { + AVIAudioTrack *track = createAudioTrack(sHeader, wvInfo); + track->createAudioStream(); + addTrack(track); + } } // Ensure that we're at the end of the chunk @@ -337,7 +342,6 @@ bool AVIDecoder::loadStream(Common::SeekableReadStream *stream) { } if (_videoTracks.size() != 1) { - warning("Unhandled AVI video track count: %d", _videoTracks.size()); close(); return false; } diff --git a/video/avi_decoder.h b/video/avi_decoder.h index 96d9e821ff..04e6a1847e 100644 --- a/video/avi_decoder.h +++ b/video/avi_decoder.h @@ -61,8 +61,10 @@ namespace Video { */ class AVIDecoder : public VideoDecoder { public: - AVIDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); - AVIDecoder(const Common::Rational &frameRateOverride, Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); + typedef bool(*SelectTrackFn)(bool isVideo, int trackNumber); + AVIDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType, SelectTrackFn trackFn = nullptr); + AVIDecoder(const Common::Rational &frameRateOverride, Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType, + SelectTrackFn trackFn = nullptr); virtual ~AVIDecoder(); bool loadStream(Common::SeekableReadStream *stream); @@ -268,6 +270,10 @@ protected: Audio::Mixer::SoundType _soundType; Common::Rational _frameRateOverride; + + int _videoTrackCounter, _audioTrackCounter; + SelectTrackFn _selectTrackFn; + void initCommon(); bool parseNextChunk(); |