ScummVM API documentation
videoplayer.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  * This file is dual-licensed.
22  * In addition to the GPLv3 license mentioned above, this code is also
23  * licensed under LGPL 2.1. See LICENSES/COPYING.LGPL file for the
24  * full text of the license.
25  *
26  */
27 
28 #ifndef GOB_VIDEOPLAYER_H
29 #define GOB_VIDEOPLAYER_H
30 
31 #include "common/array.h"
32 #include "common/list.h"
33 #include "common/rect.h"
34 #include "common/str.h"
35 
36 #include "graphics/surface.h"
37 
38 #include "gob/util.h"
39 #include "gob/draw.h"
40 
41 namespace Video {
42 class CoktelDecoder;
43 }
44 
45 namespace Gob {
46 
47 class GobEngine;
48 class DataStream;
49 
50 class VideoPlayer {
51 public:
52  enum Flags {
53  kFlagNone = 0x000000,
54  kFlagUseBackSurfaceContent = 0x000040,
55  kFlagFrontSurface = 0x000080,
56  kFlagNoVideo = 0x000100,
57  kFlagOtherSurface = 0x000800,
58  kFlagScreenSurface = 0x400000
59  };
60 
62  enum Type {
63  kVideoTypeTry = -1,
64  kVideoTypeIMD = 0,
65  kVideoTypePreIMD = 1,
66  kVideoTypeVMD = 2,
67  kVideoTypeRMD = 3
68  };
69 
70  struct Properties {
72 
73  int sprite;
74 
75  int32 x;
76  int32 y;
77  int32 width;
78  int32 height;
79 
80  uint32 flags;
81 
83 
84  int32 startFrame;
85  int32 lastFrame;
86  int32 endFrame;
87 
88  bool forceSeek;
89 
90  int16 breakKey;
91 
92  uint16 palCmd;
93  int16 palStart;
94  int16 palEnd;
95  int32 palFrame;
96 
97  bool noBlock;
98 
99  bool loop;
100  bool fade;
101 
103 
104  bool hasSound;
105  bool canceled;
106 
107  Properties();
108  };
109 
110  VideoPlayer(GobEngine *vm);
111  ~VideoPlayer();
112 
113  void evaluateFlags(Properties &properties);
114 
115  int openVideo(bool primary, const Common::String &file, Properties &properties);
116  bool closeVideo(int slot = 0);
117 
118  void closeLiveSound();
119  void closeAll();
120 
121  bool reopenVideo(int slot = 0);
122  bool reopenAll();
123 
124  void pauseVideo(int slot, bool pause);
125  void pauseAll(bool pause);
126 
127  void finishVideoSound(int slot);
128  void waitSoundEnd(int slot);
129 
130  bool play(int slot, Properties &properties);
131  void waitEndFrame(int slot, bool onlySound = false);
132  int32 getExpectedFrameFromCurrentTime(int slot);
133 
134  bool isPlayingLive() const;
135  bool isSoundPlaying() const;
136 
137  void updateLive(bool force = false);
138 
139  bool slotIsOpen(int slot = 0) const;
140 
141  Common::String getFileName(int slot = 0) const;
142 
143  uint32 getFrameCount (int slot = 0) const;
144  uint32 getCurrentFrame(int slot = 0) const;
145  uint16 getWidth (int slot = 0) const;
146  uint16 getHeight (int slot = 0) const;
147  uint16 getDefaultX (int slot = 0) const;
148  uint16 getDefaultY (int slot = 0) const;
149  uint32 getFlags (int slot = 0) const;
150 
151 
152  const Common::List<Common::Rect> *getDirtyRects(int slot = 0) const;
153 
154  bool hasEmbeddedFile(const Common::String &fileName, int slot = 0) const;
155  Common::SeekableReadStream *getEmbeddedFile(const Common::String &fileName, int slot = 0);
156 
157  int32 getSubtitleIndex(int slot = 0) const;
158 
159  void writeVideoInfo(const Common::String &file, uint16 varX, uint16 varY,
160  uint16 varFrames, uint16 varWidth, uint16 varHeight);
161 
162  bool copyFrame(int slot, Surface &dest,
163  uint16 left, uint16 top, uint16 width, uint16 height, uint16 x, uint16 y,
164  int32 transp = -1, bool yAxisReflexion = false) const;
165 
166 private:
167  struct Video {
168  ::Video::CoktelDecoder *decoder;
169  Common::String fileName;
170 
171  SurfacePtr surface;
172 
173  Properties properties;
174 
175  bool live;
176 
177  Video();
178 
179  bool isEmpty() const;
180  void close();
181 
182  void reopen();
183  };
184 
185  static const int kVideoSlotCount = 32;
186 
187  static const char *const _extensions[];
188 
189  GobEngine *_vm;
190 
191  // _videoSlots[0] is reserved for the "primary" video
192  Video _videoSlots[kVideoSlotCount];
193 
194  bool _needBlit;
195 
196  bool _noCursorSwitch;
197  bool _woodruffCohCottWorkaround;
198 
199  const Video *getVideoBySlot(int slot) const;
200  Video *getVideoBySlot(int slot);
201 
202  int getNextFreeSlot();
203 
204  Common::String findFile(const Common::String &file, Properties &properties);
205 
206  ::Video::CoktelDecoder *openVideo(const Common::String &file, Properties &properties);
207 
208  bool reopenVideo(Video &video);
209 
210  bool playFrame(int slot, Properties &properties);
211 
212  void checkAbort(Video &video, Properties &properties);
213  void evalBgShading(Video &video);
214 
215  void copyPalette(const Video &video, int16 palStart, int16 palEnd);
216 
217  void updateLive(int slot, bool force = false);
218 };
219 
220 } // End of namespace Gob
221 
222 #endif // GOB_VIDEOPLAYER_H
int32 x
X coordinate of the video.
Definition: videoplayer.h:75
Definition: gob.h:156
Definition: str.h:59
bool noBlock
Non-blocking "live" video?
Definition: videoplayer.h:97
int32 y
Y coordinate of the video.
Definition: videoplayer.h:76
int32 lastFrame
Frame to stop playback at.
Definition: videoplayer.h:85
int16 breakKey
Keycode of the break/abort key.
Definition: videoplayer.h:90
int32 startFrame
Frame to start playback from.
Definition: videoplayer.h:84
Definition: stream.h:745
Flags
Definition: videoplayer.h:52
Type type
Type of the video to open.
Definition: videoplayer.h:71
Definition: anifile.h:40
bool hasSound
Does the video have sound?
Definition: videoplayer.h:104
int32 width
Width of the video.
Definition: videoplayer.h:77
bool switchColorMode
Switch between paletted / true color modes?
Definition: videoplayer.h:82
bool canceled
Was the video canceled?
Definition: videoplayer.h:105
int16 palEnd
Palette entry to end at.
Definition: videoplayer.h:94
int16 palStart
Palette entry to start with.
Definition: videoplayer.h:93
bool waitEndFrame
Wait for the frame&#39;s time to run out?
Definition: videoplayer.h:102
int32 palFrame
Frame to apply the palette command at.
Definition: videoplayer.h:95
Type
Definition: videoplayer.h:62
Definition: surface.h:100
Definition: videoplayer.h:70
int sprite
The sprite onto which to draw the video.
Definition: videoplayer.h:73
uint16 palCmd
Palette command.
Definition: videoplayer.h:92
bool fade
Fade in?
Definition: videoplayer.h:100
uint32 flags
Video flags.
Definition: videoplayer.h:80
Definition: avi_frames.h:36
bool forceSeek
Force the seeking to the start frame.
Definition: videoplayer.h:88
int32 endFrame
Last frame of this playback cycle.
Definition: videoplayer.h:86
int32 height
Height of the video.
Definition: videoplayer.h:78
bool loop
Loop the video?
Definition: videoplayer.h:99
Definition: videoplayer.h:50