ScummVM API documentation
video_decoder.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef VIDEO_DECODER_H
23#define VIDEO_DECODER_H
24
25#include "audio/mixer.h"
26#include "audio/timestamp.h" // TODO: Move this to common/ ?
27#include "common/array.h"
28#include "common/path.h"
29#include "common/rational.h"
30#include "common/str.h"
31#include "graphics/pixelformat.h"
32#include "image/codec-options.h"
33
34namespace Audio {
35class AudioStream;
36class RewindableAudioStream;
37class SeekableAudioStream;
38}
39
40namespace Common {
41class SeekableReadStream;
42}
43
44namespace Graphics {
45struct Surface;
46}
47
48namespace Video {
49
54public:
56 virtual ~VideoDecoder() {}
57
59 // Opening/Closing a Video
61
70 virtual bool loadFile(const Common::Path &filename);
71
83 virtual bool loadStream(Common::SeekableReadStream *stream) = 0;
84
91 virtual void close();
92
96 bool isVideoLoaded() const;
97
98
100 // Playback Control
102
108 void start();
109
115 void stop();
116
127 void setRate(const Common::Rational &rate);
128
133 Common::Rational getRate() const { return _playbackRate; }
134
143 bool isPlaying() const;
144
149 virtual bool isRewindable() const;
150
159 virtual bool rewind();
160
165 virtual bool isSeekable() const;
166
178 bool seek(const Audio::Timestamp &time);
179
186 virtual bool seekToFrame(uint frame);
187
199 void pauseVideo(bool pause);
200
204 bool isPaused() const { return _pauseLevel != 0; }
205
213 void setEndTime(const Audio::Timestamp &endTime);
214
224 void setEndFrame(uint frame);
225
229 Audio::Timestamp getEndTime() const { return _endTime; }
230
235
236
238 // Playback Status
240
245 bool endOfVideo() const;
246
251 int getCurFrame() const;
252
257 int getCurFrameDelay() const;
258
263 uint32 getFrameCount() const;
264
279 uint32 getTime() const;
280
281
283 // Video Info
285
295 virtual uint16 getWidth() const;
296
306 virtual uint16 getHeight() const;
307
312
320
321
323 // Frame Decoding
325
332 const byte *getPalette();
333
337 bool hasDirtyPalette() const { return _dirtyPalette; }
338
343 void delayMillis(uint msecs);
344
348 uint32 getTimeToNextFrame() const;
349
355 bool needsUpdate() const;
356
373
384 bool setReverse(bool reverse);
385
403 bool setDitheringPalette(const byte *palette);
404
415
427
431 virtual void setVideoCodecAccuracy(Image::CodecAccuracy accuracy);
432
434 // Audio Control
436
441 byte getVolume() const { return _audioVolume; }
442
450 void setVolume(byte volume);
451
456 int8 getBalance() const { return _audioBalance; }
457
465 void setBalance(int8 balance);
466
471
478
483
489 bool addStreamFileTrack(const Common::Path &baseName);
490
499 bool setAudioTrack(int index);
500
509 bool getAudioTrackMute(int index);
510
520 bool setAudioTrackMute(int index, bool muted);
521
525 uint getAudioTrackCount() const;
526
527protected:
532 class Track {
533 public:
534 Track();
535 virtual ~Track() {}
536
541 kTrackTypeNone,
542 kTrackTypeVideo,
543 kTrackTypeAudio
544 };
545
549 virtual TrackType getTrackType() const = 0;
550
554 virtual bool endOfTrack() const = 0;
555
562 virtual bool isRewindable() const;
563
572 virtual bool rewind();
573
577 virtual bool isSeekable() const { return false; }
578
584 virtual bool seek(const Audio::Timestamp &time) { return false; }
585
589 void pause(bool shouldPause);
590
594 bool isPaused() const { return _paused; }
595
602
603 protected:
607 virtual void pauseIntern(bool shouldPause) {}
608
609 private:
610 bool _paused;
611 };
612
616 class VideoTrack : public Track {
617 public:
618 VideoTrack() {}
619 virtual ~VideoTrack() {}
620
621 TrackType getTrackType() const override { return kTrackTypeVideo; }
622 bool endOfTrack() const override;
623
627 virtual uint16 getWidth() const = 0;
628
632 virtual uint16 getHeight() const = 0;
633
638
642 virtual bool setOutputPixelFormat(const Graphics::PixelFormat &format) { return format == getPixelFormat(); }
643
647 virtual void setCodecAccuracy(Image::CodecAccuracy accuracy) {}
648
654 virtual int getCurFrame() const = 0;
655
661 virtual int getCurFrameDelay() const {
662 return 0;
663 };
664
672 virtual int getFrameCount() const { return 0; }
673
678 virtual uint32 getNextFrameStartTime() const = 0;
679
683 virtual const Graphics::Surface *decodeNextFrame() = 0;
684
688 virtual const byte *getPalette() const { return 0; }
689
693 virtual bool hasDirtyPalette() const { return false; }
694
701 virtual Audio::Timestamp getFrameTime(uint frame) const;
702
711 virtual bool setReverse(bool reverse) { return !reverse; }
712
716 virtual bool isReversed() const { return false; }
717
721 virtual bool canDither() const { return false; }
722
726 virtual void setDither(const byte *palette) {}
727 };
728
735 public:
737 virtual ~FixedRateVideoTrack() {}
738
739 uint32 getNextFrameStartTime() const override;
741 Audio::Timestamp getFrameTime(uint frame) const override;
742
747 uint getFrameAtTime(const Audio::Timestamp &time) const;
748
749 protected:
753 virtual Common::Rational getFrameRate() const = 0;
754 };
755
759 class AudioTrack : public Track {
760 public:
762 virtual ~AudioTrack() {}
763
764 TrackType getTrackType() const override { return kTrackTypeAudio; }
765
766 bool endOfTrack() const override;
767
771 void start();
772
776 void stop();
777
778 void start(const Audio::Timestamp &limit);
779
783 byte getVolume() const { return _volume; }
784
788 void setVolume(byte volume);
789
793 uint32 getRate() const { return _rate; }
794
798 void setRate(uint32 rate);
799
805
809 int8 getBalance() const { return _balance; }
810
814 void setBalance(int8 balance);
815
819 Audio::Mixer::SoundType getSoundType() const { return _soundType; }
820
824 void setSoundType(Audio::Mixer::SoundType soundType) { _soundType = soundType; }
825
830 uint32 getRunningTime() const;
831
835 bool getMute() { return _muted; }
836
840 void setMute(bool mute);
841
842 protected:
843 void pauseIntern(bool shouldPause) override;
844
848 virtual Audio::AudioStream *getAudioStream() const = 0;
849
850 private:
851 Audio::SoundHandle _handle;
852 Audio::Mixer::SoundType _soundType;
853 byte _volume;
854 uint32 _rate;
855 int8 _balance;
856 bool _muted;
857 };
858
864 public:
866 virtual ~RewindableAudioTrack() {}
867
868 bool isRewindable() const override { return true; }
869 bool rewind() override;
870
871 protected:
873
879 };
880
886 public:
887 SeekableAudioTrack(Audio::Mixer::SoundType soundType) : AudioTrack(soundType) {}
888 virtual ~SeekableAudioTrack() {}
889
890 bool isSeekable() const override { return true; }
891 bool seek(const Audio::Timestamp &time) override;
892
894
895 protected:
897
903 };
904
910 public:
914
920 bool loadFromFile(const Common::Path &baseName);
921
922 protected:
924 Audio::SeekableAudioStream *getSeekableAudioStream() const override { return _stream; }
925 };
926
931
939 virtual void readNextPacket() {}
940
949 void addTrack(Track *track, bool isExternal = false);
950
956 virtual bool useAudioSync() const { return true; }
957
963 Track *getTrack(uint track);
964
970 const Track *getTrack(uint track) const;
971
978 bool endOfVideoTracks() const;
979
986
991 typedef TrackList::iterator TrackListIterator;
992
996 TrackListIterator getTrackListBegin() { return _internalTracks.begin(); }
997
1001 TrackListIterator getTrackListEnd() { return _internalTracks.end(); }
1002
1006 void eraseTrack(Track *track);
1007
1015 virtual bool seekIntern(const Audio::Timestamp &time);
1016
1024 virtual bool supportsAudioTrackSwitching() const { return false; }
1025
1034 virtual AudioTrack *getAudioTrack(int index) { return 0; }
1035
1036 uint getNumTracks() { return _tracks.size(); }
1037
1038private:
1039 // Tracks owned by this VideoDecoder
1040 TrackList _tracks;
1041 TrackList _internalTracks;
1042 TrackList _externalTracks;
1043
1044 // Current playback status
1045 bool _needsUpdate;
1046 Audio::Timestamp _endTime;
1047 bool _endTimeSet;
1048 Common::Rational _playbackRate;
1049
1050 // Palette settings from individual tracks
1051 mutable bool _dirtyPalette;
1052 const byte *_palette;
1053
1054 // Enforcement of not being able to set dither or set the default format
1055 bool _canSetDither;
1056 bool _canSetDefaultFormat;
1057
1058protected:
1059 // Internal helper functions
1060 void stopAudio();
1061 void setAudioRate(Common::Rational rate);
1062 void startAudio();
1063 void startAudioLimit(const Audio::Timestamp &limit);
1064 bool hasFramesLeft() const;
1065 bool hasAudio() const;
1066
1067 Audio::Timestamp _lastTimeChange;
1068 int32 _startTime;
1069
1070 VideoTrack *_nextVideoTrack;
1071
1072 Image::CodecAccuracy _videoCodecAccuracy;
1073
1074private:
1075 uint32 _pauseLevel;
1076 uint32 _pauseStartTime;
1077 byte _audioVolume;
1078 int8 _audioBalance;
1079 Audio::Mixer::SoundType _soundType;
1080
1081 AudioTrack *_mainAudioTrack;
1082};
1083
1084} // End of namespace Video
1085
1086#endif
Definition: audiostream.h:50
SoundType
Definition: mixer.h:73
Definition: audiostream.h:109
Definition: audiostream.h:212
Definition: mixer.h:49
Definition: timestamp.h:83
iterator end()
Definition: array.h:380
Track * * iterator
Definition: array.h:54
size_type size() const
Definition: array.h:316
iterator begin()
Definition: array.h:375
Definition: list.h:44
Definition: path.h:52
Definition: rational.h:40
Definition: stream.h:745
Definition: video_decoder.h:759
byte getVolume() const
Definition: video_decoder.h:783
virtual Audio::AudioStream * getAudioStream() const =0
void setRate(Common::Rational rate)
void pauseIntern(bool shouldPause) override
bool endOfTrack() const override
void setBalance(int8 balance)
Audio::Mixer::SoundType getSoundType() const
Definition: video_decoder.h:819
int8 getBalance() const
Definition: video_decoder.h:809
void setSoundType(Audio::Mixer::SoundType soundType)
Definition: video_decoder.h:824
bool getMute()
Definition: video_decoder.h:835
TrackType getTrackType() const override
Definition: video_decoder.h:764
uint32 getRate() const
Definition: video_decoder.h:793
Definition: video_decoder.h:734
virtual Common::Rational getFrameRate() const =0
uint getFrameAtTime(const Audio::Timestamp &time) const
Audio::Timestamp getDuration() const override
Audio::Timestamp getFrameTime(uint frame) const override
uint32 getNextFrameStartTime() const override
Definition: video_decoder.h:863
virtual Audio::RewindableAudioStream * getRewindableAudioStream() const =0
bool isRewindable() const override
Definition: video_decoder.h:868
Audio::AudioStream * getAudioStream() const override
Definition: video_decoder.h:885
bool seek(const Audio::Timestamp &time) override
Audio::AudioStream * getAudioStream() const override
bool isSeekable() const override
Definition: video_decoder.h:890
virtual Audio::SeekableAudioStream * getSeekableAudioStream() const =0
Audio::Timestamp getDuration() const override
Definition: video_decoder.h:909
bool loadFromFile(const Common::Path &baseName)
Audio::SeekableAudioStream * getSeekableAudioStream() const override
Definition: video_decoder.h:924
Definition: video_decoder.h:532
virtual bool isRewindable() const
virtual bool isSeekable() const
Definition: video_decoder.h:577
void pause(bool shouldPause)
virtual bool endOfTrack() const =0
virtual void pauseIntern(bool shouldPause)
Definition: video_decoder.h:607
virtual Audio::Timestamp getDuration() const
virtual bool seek(const Audio::Timestamp &time)
Definition: video_decoder.h:584
TrackType
Definition: video_decoder.h:540
virtual TrackType getTrackType() const =0
bool isPaused() const
Definition: video_decoder.h:594
Definition: video_decoder.h:616
virtual bool canDither() const
Definition: video_decoder.h:721
virtual const byte * getPalette() const
Definition: video_decoder.h:688
virtual int getCurFrame() const =0
virtual uint16 getWidth() const =0
virtual Audio::Timestamp getFrameTime(uint frame) const
virtual bool setReverse(bool reverse)
Definition: video_decoder.h:711
TrackType getTrackType() const override
Definition: video_decoder.h:621
virtual bool setOutputPixelFormat(const Graphics::PixelFormat &format)
Definition: video_decoder.h:642
virtual int getFrameCount() const
Definition: video_decoder.h:672
bool endOfTrack() const override
virtual const Graphics::Surface * decodeNextFrame()=0
virtual int getCurFrameDelay() const
Definition: video_decoder.h:661
virtual void setCodecAccuracy(Image::CodecAccuracy accuracy)
Definition: video_decoder.h:647
virtual bool hasDirtyPalette() const
Definition: video_decoder.h:693
virtual uint16 getHeight() const =0
virtual void setDither(const byte *palette)
Definition: video_decoder.h:726
virtual bool isReversed() const
Definition: video_decoder.h:716
virtual uint32 getNextFrameStartTime() const =0
virtual Graphics::PixelFormat getPixelFormat() const =0
Definition: video_decoder.h:53
virtual void readNextPacket()
Definition: video_decoder.h:939
void delayMillis(uint msecs)
const Track * getTrack(uint track) const
TrackListIterator getTrackListEnd()
Definition: video_decoder.h:1001
virtual bool seekToFrame(uint frame)
bool seek(const Audio::Timestamp &time)
virtual bool seekIntern(const Audio::Timestamp &time)
int getCurFrameDelay() const
bool addStreamFileTrack(const Common::Path &baseName)
int8 getBalance() const
Definition: video_decoder.h:456
Common::Rational getRate() const
Definition: video_decoder.h:133
void pauseVideo(bool pause)
Track * getTrack(uint track)
void setSoundType(Audio::Mixer::SoundType soundType)
Graphics::PixelFormat getPixelFormat() const
bool isPlaying() const
bool hasDirtyPalette() const
Definition: video_decoder.h:337
virtual uint16 getHeight() const
bool setAudioTrack(int index)
bool setReverse(bool reverse)
bool isPaused() const
Definition: video_decoder.h:204
const byte * getPalette()
bool isVideoLoaded() const
void addTrack(Track *track, bool isExternal=false)
Audio::Timestamp getEndTime() const
Definition: video_decoder.h:229
virtual void setVideoCodecAccuracy(Image::CodecAccuracy accuracy)
void setVolume(byte volume)
void setEndTime(const Audio::Timestamp &endTime)
bool endOfVideoTracks() const
virtual AudioTrack * getAudioTrack(int index)
Definition: video_decoder.h:1034
uint32 getTime() const
void setEndFrame(uint frame)
bool addStreamTrack(Audio::SeekableAudioStream *stream)
bool needsUpdate() const
virtual bool loadStream(Common::SeekableReadStream *stream)=0
bool setDitheringPalette(const byte *palette)
virtual bool isSeekable() const
bool setOutputPixelFormat(const Graphics::PixelFormat &format)
bool setAudioTrackMute(int index, bool muted)
bool setOutputPixelFormats(const Common::List< Graphics::PixelFormat > &formatList)
virtual const Graphics::Surface * decodeNextFrame()
virtual bool isRewindable() const
virtual void close()
byte getVolume() const
Definition: video_decoder.h:441
virtual bool rewind()
virtual bool supportsAudioTrackSwitching() const
Definition: video_decoder.h:1024
uint getAudioTrackCount() const
void eraseTrack(Track *track)
virtual bool loadFile(const Common::Path &filename)
virtual Audio::Timestamp getDuration() const
void setRate(const Common::Rational &rate)
void setBalance(int8 balance)
uint32 getTimeToNextFrame() const
bool endOfVideo() const
int getCurFrame() const
uint32 getFrameCount() const
bool getAudioTrackMute(int index)
Common::Array< Track * > TrackList
Definition: video_decoder.h:990
virtual bool useAudioSync() const
Definition: video_decoder.h:956
TrackListIterator getTrackListBegin()
Definition: video_decoder.h:996
Audio::Mixer::SoundType getSoundType() const
VideoTrack * findNextVideoTrack()
virtual uint16 getWidth() const
Definition: system.h:39
Definition: algorithm.h:29
Definition: formatinfo.h:28
Definition: pixelformat.h:138
Definition: surface.h:67