aboutsummaryrefslogtreecommitdiff
path: root/video
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
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')
-rw-r--r--video/avi_decoder.cpp20
-rw-r--r--video/avi_decoder.h10
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();