mirror of
https://github.com/scummvm/scummvm.git
synced 2026-05-21 05:40:43 +00:00
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:
+12
-8
@@ -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
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user