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  int slot;
108  bool reuseSlotWitSameFilename;
109 
110  bool noWaitSound;
111 
112  Properties();
113  };
114 
115  VideoPlayer(GobEngine *vm);
116  ~VideoPlayer();
117 
118  void evaluateFlags(Properties &properties);
119 
120  int openVideo(bool primary, const Common::String &file, Properties &properties);
121  bool closeVideo(int slot = 0);
122 
123  void closeLiveVideos();
124  void closeAll();
125 
126  bool reopenVideo(int slot = 0);
127  bool reopenAll();
128 
129  void pauseVideo(int slot, bool pause);
130  void pauseAll(bool pause);
131 
132  void finishVideoSound(int slot);
133  void waitSoundEnd(int slot);
134 
135  bool play(int slot, Properties &properties);
136  void waitEndFrame(int slot, bool onlySound = false);
137  int32 getExpectedFrameFromCurrentTime(int slot);
138 
139  bool isPlayingLive() const;
140  bool isSoundPlaying() const;
141 
142  void updateLive(bool force = false, int exceptSlot = -1);
143 
144  bool slotIsOpen(int slot = 0) const;
145 
146  Common::String getFileName(int slot = 0) const;
147 
148  uint32 getFrameCount (int slot = 0) const;
149  uint32 getCurrentFrame (int slot = 0) const;
150  uint16 getWidth (int slot = 0) const;
151  uint16 getHeight (int slot = 0) const;
152  uint16 getDefaultX (int slot = 0) const;
153  uint16 getDefaultY (int slot = 0) const;
154  uint32 getFlags (int slot = 0) const;
155  uint16 getSoundFlags (int slot = 0) const;
156  uint32 getVideoBufferSize(int slot = 0) const;
157  bool hasVideo (int slot = 0) const;
158 
159 
160  const Common::List<Common::Rect> *getDirtyRects(int slot = 0) const;
161 
162  bool hasEmbeddedFile(const Common::String &fileName, int slot = 0) const;
163  Common::SeekableReadStream *getEmbeddedFile(const Common::String &fileName, int slot = 0);
164 
165  int32 getSubtitleIndex(int slot = 0) const;
166 
167  void writeVideoInfo(const Common::String &file, uint16 varX, uint16 varY,
168  uint16 varFrames, uint16 varWidth, uint16 varHeight);
169 
170  bool copyFrame(int slot, Surface &dest,
171  uint16 left, uint16 top, uint16 width, uint16 height, uint16 x, uint16 y,
172  int32 transp = -1, bool yAxisReflexion = false) const;
173 
174 private:
175  struct Video {
176  ::Video::CoktelDecoder *decoder;
177  Common::String fileName;
178 
179  SurfacePtr surface;
180  Common::SharedPtr<Graphics::Surface> tmpSurfBppConversion;
181  uint32 *highColorMap;
182 
183  Properties properties;
184 
185  bool live;
186 
187  Video();
188 
189  bool isEmpty() const;
190  void close();
191 
192  void reopen();
193  };
194 
195  static const int kVideoSlotCount = 32;
196  static const int kPrimaryVideoSlot = 0;
197  static const int kLiveVideoSlotCount = 6;
198  static const int kVideoSlotWithCurFrameVarCount = 4;
199 
200  static const char *const _extensions[];
201 
202  GobEngine *_vm;
203 
204  // _videoSlots[0] is reserved for the "primary" video
205  Video _videoSlots[kVideoSlotCount];
206 
207  bool _needBlit;
208 
209  bool _noCursorSwitch;
210  bool _woodruffCohCottWorkaround;
211 
212  const Video *getVideoBySlot(int slot) const;
213  Video *getVideoBySlot(int slot);
214 
215  int getNextFreeSlot();
216 
217  Common::String findFile(const Common::String &file, Properties &properties);
218 
219  ::Video::CoktelDecoder *openVideo(const Common::String &file, Properties &properties);
220 
221  bool reopenVideo(Video &video);
222 
223  bool lastFrameReached(Video &video, Properties &properties);
224  bool playFrame(int slot, Properties &properties);
225 
226  void checkAbort(Video &video, Properties &properties);
227  void evalBgShading(Video &video);
228 
229  void copyPalette(const Video &video, int16 palStart, int16 palEnd);
230 
231  void updateLive(int slot, bool force = false);
232 };
233 
234 } // End of namespace Gob
235 
236 #endif // GOB_VIDEOPLAYER_H
int32 x
X coordinate of the video.
Definition: videoplayer.h:75
int slot
Explicit slot index (-1 = auto).
Definition: videoplayer.h:107
Definition: gob.h:166
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:106
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