aboutsummaryrefslogtreecommitdiff
path: root/video/avi_decoder.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2016-07-11 19:39:53 -0400
committerPaul Gilbert2016-07-17 13:08:31 -0400
commitfa6e12aaab4e19424481fc26eab281663cbf3283 (patch)
treeeabc58a771af32e6c87b41e96831bdeb86d8cc37 /video/avi_decoder.cpp
parent207e1cbb296c8f825d19167d420bbf141398ac1d (diff)
downloadscummvm-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
Diffstat (limited to 'video/avi_decoder.cpp')
-rw-r--r--video/avi_decoder.cpp20
1 files changed, 12 insertions, 8 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;
}