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
This commit is contained in:
Paul Gilbert
2016-07-11 19:39:53 -04:00
parent 207e1cbb29
commit fa6e12aaab
2 changed files with 20 additions and 10 deletions
+12 -8
View File
@@ -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;
}
+8 -2
View File
@@ -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();