aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gob/demos/demoplayer.cpp10
-rw-r--r--engines/gob/inter_v6.cpp2
-rw-r--r--engines/gob/mult_v2.cpp4
-rw-r--r--engines/gob/scenery.cpp6
-rw-r--r--engines/gob/videoplayer.cpp413
-rw-r--r--engines/gob/videoplayer.h60
-rw-r--r--graphics/module.mk1
-rw-r--r--graphics/video/coktel_decoder.cpp105
-rw-r--r--graphics/video/coktel_decoder.h119
9 files changed, 429 insertions, 291 deletions
diff --git a/engines/gob/demos/demoplayer.cpp b/engines/gob/demos/demoplayer.cpp
index 38e20a46ee..d6c3ac73a5 100644
--- a/engines/gob/demos/demoplayer.cpp
+++ b/engines/gob/demos/demoplayer.cpp
@@ -155,8 +155,8 @@ void DemoPlayer::playVideo(const char *fileName) {
int16 x = _rebase0 ? 0 : -1;
int16 y = _rebase0 ? 0 : -1;
if (_vm->_vidPlayer->primaryOpen(file, x, y)) {
- bool videoSupportsDouble =
- ((_vm->_vidPlayer->getFeatures() & Graphics::CoktelVideo::kFeaturesSupportsDouble) != 0);
+ bool videoSupportsDouble = false;
+ //((_vm->_vidPlayer->getFeatures() & Graphics::CoktelDecoder::kFeaturesSupportsDouble) != 0);
if (_autoDouble) {
int16 defX = _rebase0 ? 0 : _vm->_vidPlayer->getDefaultX();
@@ -215,7 +215,7 @@ void DemoPlayer::playVideoNormal() {
}
void DemoPlayer::playVideoDoubled() {
- Common::String fileNameOpened = _vm->_vidPlayer->getFileName();
+ Common::String fileNameOpened = _vm->_vidPlayer->getPrimaryFileName();
_vm->_vidPlayer->primaryClose();
int16 x = _rebase0 ? 0 : -1;
@@ -223,10 +223,10 @@ void DemoPlayer::playVideoDoubled() {
if (_vm->_vidPlayer->primaryOpen(fileNameOpened.c_str(), x, y,
VideoPlayer::kFlagScreenSurface)) {
- for (int i = 0; i < _vm->_vidPlayer->getFramesCount(); i++) {
+ for (int i = 0; i < _vm->_vidPlayer->getFrameCount(); i++) {
_vm->_vidPlayer->playFrame(i);
- Graphics::CoktelVideo::State state = _vm->_vidPlayer->getState();
+ Graphics::CoktelDecoder::State state;// = _vm->_vidPlayer->getState();
int16 w = state.right - state.left + 1;
int16 h = state.bottom - state.top + 1;
diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp
index cbc831b5a1..9c03ea0b95 100644
--- a/engines/gob/inter_v6.cpp
+++ b/engines/gob/inter_v6.cpp
@@ -231,7 +231,7 @@ bool Inter_v6::o6_loadCursor(OpFuncParams &params) {
return false;
}
- int16 framesCount = _vm->_vidPlayer->getFramesCount(vmdSlot);
+ int16 framesCount = _vm->_vidPlayer->getFrameCount(vmdSlot);
for (int i = 0; i < framesCount; i++) {
_vm->_vidPlayer->slotPlay(vmdSlot);
diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp
index 6acd096e58..6dcc01f836 100644
--- a/engines/gob/mult_v2.cpp
+++ b/engines/gob/mult_v2.cpp
@@ -737,7 +737,7 @@ void Mult_v2::newCycleAnim(Mult_Object &animObj) {
if (animData.animation < 0) {
if ((animObj.videoSlot > 0) &&
(_vm->_vidPlayer->getCurrentFrame(animObj.videoSlot - 1) <
- _vm->_vidPlayer->getFramesCount(animObj.videoSlot - 1))) {
+ _vm->_vidPlayer->getFrameCount(animObj.videoSlot - 1))) {
animData.newCycle = 0;
return;
}
@@ -1139,7 +1139,7 @@ void Mult_v2::playImd(const char *imdFile, Mult::Mult_ImdKey &key, int16 dir,
palFrame = 0;
if (lastFrame == -1)
- lastFrame = _vm->_vidPlayer->getFramesCount() - 1;
+ lastFrame = _vm->_vidPlayer->getFrameCount() - 1;
baseFrame = startFrame % (lastFrame - palFrame + 1);
_vm->_vidPlayer->primaryPlay(baseFrame + palFrame, baseFrame + palFrame, 0,
diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp
index a6d6c06544..6b5982ec3e 100644
--- a/engines/gob/scenery.cpp
+++ b/engines/gob/scenery.cpp
@@ -616,8 +616,8 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags,
return;
}
- if (frame >= _vm->_vidPlayer->getFramesCount(obj.videoSlot - 1))
- frame = _vm->_vidPlayer->getFramesCount(obj.videoSlot - 1) - 1;
+ if (frame >= _vm->_vidPlayer->getFrameCount(obj.videoSlot - 1))
+ frame = _vm->_vidPlayer->getFrameCount(obj.videoSlot - 1) - 1;
// Seek to frame
if (_vm->_vidPlayer->getCurrentFrame(obj.videoSlot - 1) < 256) {
@@ -632,10 +632,12 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags,
_vm->_vidPlayer->slotPlay(obj.videoSlot - 1);
}
+ /*
// Subtitle
Graphics::CoktelVideo::State state = _vm->_vidPlayer->getState(obj.videoSlot - 1);
if (state.flags & Graphics::CoktelVideo::kStateSpeech)
_vm->_draw->printTotText(state.speechId);
+ */
destX = 0;
destY = 0;
diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp
index 51bc1b88a5..d6de1cb652 100644
--- a/engines/gob/videoplayer.cpp
+++ b/engines/gob/videoplayer.cpp
@@ -40,130 +40,17 @@ namespace Gob {
const char *VideoPlayer::_extensions[] = { "IMD", "IMD", "VMD", "RMD", "SMD" };
-VideoPlayer::Video::Video(GobEngine *vm) : _vm(vm), _stream(0), _video(0) {
-}
-
-VideoPlayer::Video::~Video() {
- close();
-}
-
-bool VideoPlayer::Video::open(const char *fileName, Type which, int16 width, int16 height) {
- close();
-
- int16 handle = _vm->_dataIO->openData(fileName);
-
- if (handle < 0) {
- warning("Couldn't open video \"%s\": No such file", fileName);
- return false;
- }
-
- _stream = _vm->_dataIO->openAsStream(handle, true);
-
- if (which == kVideoTypeIMD) {
- _video = new Graphics::Imd();
- } else if (which == kVideoTypePreIMD) {
- _video = new Graphics::PreImd(width, height);
- } else if (which == kVideoTypeVMD) {
- _video = new Graphics::Vmd(_vm->_video->_palLUT);
- } else if (which == kVideoTypeRMD) {
- _video = new Graphics::Vmd(_vm->_video->_palLUT);
- } else {
- warning("Couldn't open video \"%s\": Invalid video Type", fileName);
- close();
- return false;
- }
-
- if (!_video->load(_stream)) {
- warning("While loading video \"%s\"", fileName);
- close();
- return false;
- }
-
- _fileName = fileName;
-
- _defaultX = _video->getX();
- _defaultY = _video->getY();
-
- return true;
-}
-
-void VideoPlayer::Video::close() {
- delete _video;
- delete _stream;
-
- _video = 0;
- _stream = 0;
- _fileName.clear();
- memset(&_state, 0, sizeof(Graphics::CoktelVideo::State));
- _defaultX = _defaultY = 0;
-}
-
-bool VideoPlayer::Video::isOpen() const {
- return (_video != 0);
-}
-
-const char *VideoPlayer::Video::getFileName() const {
- return _fileName.c_str();
-}
-
-Graphics::CoktelVideo *VideoPlayer::Video::getVideo() {
- return _video;
-}
-
-const Graphics::CoktelVideo *VideoPlayer::Video::getVideo() const {
- return _video;
-}
-
-uint32 VideoPlayer::Video::getFeatures() const {
- return _video->getFeatures();
-}
-
-Graphics::CoktelVideo::State VideoPlayer::Video::getState() const {
- return _state;
-}
-
-int16 VideoPlayer::Video::getDefaultX() const {
- return _defaultX;
-}
-
-int16 VideoPlayer::Video::getDefaultY() const {
- return _defaultY;
-}
-
-bool VideoPlayer::Video::hasExtraData(const char *fileName) const {
- if (!_video)
- return false;
-
- return _video->hasExtraData(fileName);
-}
-
-Common::MemoryReadStream *VideoPlayer::Video::getExtraData(const char *fileName) {
- if (!_video)
- return 0;
-
- return _video->getExtraData(fileName);
-}
-
-Graphics::CoktelVideo::State VideoPlayer::Video::nextFrame() {
- if (_video)
- _state = _video->nextFrame();
-
- return _state;
-}
-
+VideoPlayer::VideoPlayer(GobEngine *vm) : _vm(vm), _primaryVideo(0),
+ _ownSurf(false), _backSurf(false), _needBlit(false),
+ _noCursorSwitch(false), _woodruffCohCottWorkaround(false) {
-VideoPlayer::VideoPlayer(GobEngine *vm) : _vm(vm) {
- _primaryVideo = new Video(vm);
- _ownSurf = false;
- _backSurf = false;
- _needBlit = false;
- _noCursorSwitch = false;
- _woodruffCohCottWorkaround = false;
+ for (int i = 0; i < kVideoSlotCount; i++)
+ _videoSlots[i] = 0;
}
VideoPlayer::~VideoPlayer() {
delete _primaryVideo;
- for (uint i = 0; i < _videoSlots.size(); i++)
+ for (int i = 0; i < kVideoSlotCount; i++)
delete _videoSlots[i];
}
@@ -224,6 +111,39 @@ bool VideoPlayer::findFile(char *fileName, Type &which) {
return true;
}
+Graphics::CoktelDecoder *VideoPlayer::openVideo(const char *fileName, Type which, uint16 width, uint16 height) {
+ Common::SeekableReadStream *stream = _vm->_dataIO->getDataStream(fileName);
+ if (!stream)
+ return 0;
+
+ Graphics::CoktelDecoder *video = 0;
+ if (which == kVideoTypeIMD)
+ warning("TODO: IMD");
+ //_video = new Graphics::Imd();
+ else if (which == kVideoTypePreIMD)
+ video = new Graphics::PreIMDDecoder(width, height, *_vm->_mixer, Audio::Mixer::kSFXSoundType);
+ else if (which == kVideoTypeVMD)
+ warning("TODO: VMD");
+ //_video = new Graphics::Vmd(_vm->_video->_palLUT);
+ else if (which == kVideoTypeRMD)
+ warning("TODO: RMD");
+ //_video = new Graphics::Vmd(_vm->_video->_palLUT);
+ else
+ warning("Couldn't open video \"%s\": Invalid video Type", fileName);
+
+ if (!video) {
+ delete stream;
+ return 0;
+ }
+
+ if (!video->load(*stream)) {
+ delete video;
+ return 0;
+ }
+
+ return video;
+}
+
bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y,
int32 flags, Type which, int16 width, int16 height) {
@@ -234,10 +154,14 @@ bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y,
if (!findFile(fileName, which))
return false;
- if (scumm_strnicmp(_primaryVideo->getFileName(), fileName, strlen(fileName))) {
- if (!_primaryVideo->open(fileName, which, width, height))
+ if (scumm_strnicmp(_primaryFileName.c_str(), fileName, strlen(fileName))) {
+ primaryClose();
+
+ if (!(_primaryVideo = openVideo(fileName, which, (uint16) width, (uint16) height)))
return false;
+ _primaryFileName = fileName;
+
// WORKAROUND: In some rare cases, the cursor should still be
// displayed while a video is playing.
_noCursorSwitch = false;
@@ -269,8 +193,8 @@ bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y,
_backSurf = false;
surf = _vm->_video->initSurfDesc(_vm->_global->_videoMode,
- _primaryVideo->getVideo()->getWidth(),
- _primaryVideo->getVideo()->getHeight(), 0);
+ _primaryVideo->getWidth(),
+ _primaryVideo->getHeight(), 0);
_vm->_draw->_spritesArray[x] = surf;
x = 0;
@@ -286,23 +210,24 @@ bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y,
surf = _vm->_draw->_spritesArray[_backSurf ? 21 : 20];
}
+ /*
_primaryVideo->getVideo()->setVideoMemory(surf->getVidMem(),
surf->getWidth(), surf->getHeight());
+ */
} else
- _primaryVideo->getVideo()->setVideoMemory();
+ ;//_primaryVideo->getVideo()->setVideoMemory();
_needBlit = ((flags & kFlagUseBackSurfaceContent) != 0) && ((flags & kFlagFrontSurface) != 0);
-
- _primaryVideo->getVideo()->enableSound(*_vm->_mixer);
}
- if (!_primaryVideo->isOpen())
+ if (!_primaryVideo)
return false;
- _primaryVideo->getVideo()->setFrameRate(_vm->_util->getFrameRate());
- _primaryVideo->getVideo()->setXY(x, y);
- WRITE_VAR(7, _primaryVideo->getVideo()->getFramesCount());
+ //_primaryVideo->getVideo()->setFrameRate(_vm->_util->getFrameRate());
+ //_primaryVideo->getVideo()->setXY(x, y);
+
+ WRITE_VAR(7, _primaryVideo->getFrameCount());
return true;
}
@@ -311,16 +236,16 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
uint16 palCmd, int16 palStart, int16 palEnd,
int16 palFrame, int16 endFrame, bool fade, int16 reverseTo, bool forceSeek) {
- if (!_primaryVideo->isOpen())
+ if (!_primaryVideo)
return false;
- Graphics::CoktelVideo &video = *(_primaryVideo->getVideo());
+ Graphics::CoktelDecoder &video = *_primaryVideo;
breakKey = 27;
if (startFrame < 0)
- startFrame = video.getCurrentFrame();
+ startFrame = video.getCurFrame();
if (lastFrame < 0)
- lastFrame = video.getFramesCount() - 1;
+ lastFrame = video.getFrameCount() - 1;
if (palFrame < 0)
palFrame = startFrame;
if (endFrame < 0)
@@ -328,12 +253,14 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
palCmd &= 0x3F;
int16 realStartFrame = startFrame;
- if (video.getCurrentFrame() != startFrame) {
- if (!forceSeek && (video.getFeatures() & Graphics::CoktelVideo::kFeaturesSound))
- startFrame = video.getCurrentFrame();
+ /*
+ if (video.getCurFrame() != startFrame) {
+ if (!forceSeek && (video.getFeatures() & Graphics::CoktelDecoder::kFeaturesSound))
+ startFrame = video.getCurFrame();
else
- video.seekFrame(startFrame);
+ video.seek(startFrame);
}
+ */ video.seek(startFrame);
_vm->_draw->_showCursor = _noCursorSwitch ? 3 : 0;
@@ -357,17 +284,17 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
fade = false;
}
- if (!_noCursorSwitch)
- video.waitEndFrame();
+ /*if (!_noCursorSwitch)
+ video.waitEndFrame();*/
startFrame++;
}
evalBgShading(video);
if (reverseTo >= 0) {
- int16 toFrame = video.getFramesCount() - reverseTo;
- for (int i = video.getCurrentFrame(); i >= toFrame; i--) {
- video.seekFrame(i, SEEK_SET, true);
+ int16 toFrame = video.getFrameCount() - reverseTo;
+ for (int i = video.getCurFrame(); i >= toFrame; i--) {
+ video.seek(i, SEEK_SET, true);
bool b = doPlay(i, breakKey, 0, 0, 0, 0, 0);
evalBgShading(video);
@@ -377,8 +304,8 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
memset((char *)_vm->_draw->_vgaPalette, 0, 768);
}
- if (!_noCursorSwitch)
- video.waitEndFrame();
+ /*if (!_noCursorSwitch)
+ video.waitEndFrame();*/
}
}
@@ -388,11 +315,19 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey,
}
void VideoPlayer::primaryClose() {
- _primaryVideo->close();
+ delete _primaryVideo;
+ _primaryVideo = 0;
+
+ _primaryFileName.clear();
}
int VideoPlayer::slotOpen(const char *videoFile, Type which, int16 width, int16 height) {
- Video *video = new Video(_vm);
+ int slot = getNextFreeSlot();
+ if (slot == -1)
+ return -1;
+
+ Graphics::CoktelDecoder *&video = _videoSlots[slot];
+
char fileName[256];
strncpy0(fileName, videoFile, 250);
@@ -402,59 +337,49 @@ int VideoPlayer::slotOpen(const char *videoFile, Type which, int16 width, int16
return -1;
}
- if (!video->open(fileName, which, width, height)) {
- delete video;
+ if (!(video = openVideo(fileName, which, width, height)))
return -1;
- }
-
- video->getVideo()->setVideoMemory();
- video->getVideo()->enableSound(*_vm->_mixer);
- int slot = getNextFreeSlot();
+ //video->getVideo()->setVideoMemory();
+ //video->getVideo()->enableSound(*_vm->_mixer);
- _videoSlots[slot] = video;
-
- WRITE_VAR(7, video->getVideo()->getFramesCount());
+ WRITE_VAR(7, video->getFrameCount());
return slot;
}
int VideoPlayer::getNextFreeSlot() {
- uint slot;
-
- for (slot = 0; slot < _videoSlots.size(); slot++)
- if (!_videoSlots[slot])
- break;
+ for (int i = 0; i < kVideoSlotCount; i++)
+ if (!_videoSlots[i])
+ return i;
- if (slot == _videoSlots.size())
- _videoSlots.push_back(0);
-
- return slot;
+ warning("VideoPlayer::getNextFreeSlot(): No free video slot");
+ return -1;
}
void VideoPlayer::slotPlay(int slot, int16 frame) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
+ if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot])
return;
- Graphics::CoktelVideo &video = *(_videoSlots[slot]->getVideo());
+ Graphics::CoktelDecoder &video = *_videoSlots[slot];
if (frame < 0)
- frame = video.getCurrentFrame();
+ frame = video.getCurFrame();
- if (frame >= video.getFramesCount())
+ if (((uint16) frame) >= video.getFrameCount())
return;
- if (video.getCurrentFrame() != frame)
- video.seekFrame(frame);
+ if (video.getCurFrame() != frame)
+ video.seek(frame);
- _videoSlots[slot]->nextFrame();
+ //_videoSlots[slot]->nextFrame();
WRITE_VAR(11, frame);
evalBgShading(video);
}
void VideoPlayer::slotClose(int slot) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
+ if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot])
return;
delete _videoSlots[slot];
@@ -465,147 +390,147 @@ void VideoPlayer::slotCopyFrame(int slot, byte *dest,
uint16 left, uint16 top, uint16 width, uint16 height,
uint16 x, uint16 y, uint16 pitch, int16 transp) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
+ if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot])
return;
- _videoSlots[slot]->getVideo()->copyCurrentFrame(dest,
- left, top, width, height, x, y, pitch, transp);
+ /*_videoSlots[slot]->getVideo()->copyCurrentFrame(dest,
+ left, top, width, height, x, y, pitch, transp);*/
}
void VideoPlayer::slotCopyPalette(int slot, int16 palStart, int16 palEnd) {
- if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot])
+ if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot])
return;
- copyPalette(*(_videoSlots[slot]->getVideo()), palStart, palEnd);
+ //copyPalette(*(_videoSlots[slot]->getVideo()), palStart, palEnd);
}
void VideoPlayer::slotWaitEndFrame(int slot, bool onlySound) {
- Video *video = getVideoBySlot(slot);
+ Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video) {
- Graphics::CoktelVideo &cVideo = *video->getVideo();
+ /*
+ Graphics::CoktelDecoder &cVideo = *video->getVideo();
- if (!onlySound || (cVideo.getFeatures() & Graphics::CoktelVideo::kFeaturesSound))
+ if (!onlySound || (cVideo.getFeatures() & Graphics::CoktelDecoder::kFeaturesSound))
cVideo.waitEndFrame();
+ */
}
}
bool VideoPlayer::slotIsOpen(int slot) const {
- if ((slot >= 0) && (((uint) slot) < _videoSlots.size()) && _videoSlots[slot])
+ if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot])
return true;
return false;
}
void VideoPlayer::slotSetDoubleMode(int slot, bool doubleMode) {
- Video *video = getVideoBySlot(slot);
+ /*
+ Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
video->getVideo()->setDoubleMode(doubleMode);
+ */
}
-const VideoPlayer::Video *VideoPlayer::getVideoBySlot(int slot) const {
+const Graphics::CoktelDecoder *VideoPlayer::getVideoBySlot(int slot) const {
if (slot < 0) {
- if (_primaryVideo->isOpen())
+ if (_primaryVideo)
return _primaryVideo;
- } else if (((uint) slot) < _videoSlots.size() && _videoSlots[slot])
+ } else if ((slot < kVideoSlotCount) && _videoSlots[slot])
return _videoSlots[slot];
return 0;
}
-VideoPlayer::Video *VideoPlayer::getVideoBySlot(int slot) {
+Graphics::CoktelDecoder *VideoPlayer::getVideoBySlot(int slot) {
if (slot < 0) {
- if (_primaryVideo->isOpen())
+ if (_primaryVideo)
return _primaryVideo;
- } else if (((uint) slot) < _videoSlots.size() && _videoSlots[slot])
+ } else if ((slot < kVideoSlotCount) && _videoSlots[slot])
return _videoSlots[slot];
return 0;
}
-const char *VideoPlayer::getFileName(int slot) const {
- const Video *video = getVideoBySlot(slot);
-
- if (video)
- return video->getFileName();
-
- return "";
+const Common::String &VideoPlayer::getPrimaryFileName() const {
+ return _primaryFileName;
}
uint16 VideoPlayer::getFlags(int slot) const {
- const Video *video = getVideoBySlot(slot);
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getVideo()->getFlags();
+ return 0;//return video->getVideo()->getFlags();
return 0;
}
-int16 VideoPlayer::getFramesCount(int slot) const {
- const Video *video = getVideoBySlot(slot);
+int16 VideoPlayer::getFrameCount(int slot) const {
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getVideo()->getFramesCount();
+ return video->getFrameCount();
return 0;
}
int16 VideoPlayer::getCurrentFrame(int slot) const {
- const Video *video = getVideoBySlot(slot);
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getVideo()->getCurrentFrame();
+ return video->getCurFrame();
return 0;
}
int16 VideoPlayer::getWidth(int slot) const {
- const Video *video = getVideoBySlot(slot);
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getVideo()->getWidth();
+ return video->getWidth();
return 0;
}
int16 VideoPlayer::getHeight(int slot) const {
- const Video *video = getVideoBySlot(slot);
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getVideo()->getHeight();
+ return video->getHeight();
return 0;
}
int16 VideoPlayer::getDefaultX(int slot) const {
- const Video *video = getVideoBySlot(slot);
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getDefaultX();
+ return 0;//return video->getDefaultX();
return 0;
}
int16 VideoPlayer::getDefaultY(int slot) const {
- const Video *video = getVideoBySlot(slot);
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getDefaultY();
+ return 0;//return video->getDefaultY();
return 0;
}
uint32 VideoPlayer::getFeatures(int slot) const {
- const Video *video = getVideoBySlot(slot);
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getFeatures();
+ return 0;//return video->getFeatures();
return 0;
}
-Graphics::CoktelVideo::State VideoPlayer::getState(int slot) const {
+void VideoPlayer::getState(int slot) const {
+ /*
const Video *video = getVideoBySlot(slot);
Graphics::CoktelVideo::State state;
@@ -613,22 +538,23 @@ Graphics::CoktelVideo::State VideoPlayer::getState(int slot) const {
state = video->getState();
return state;
+ */
}
bool VideoPlayer::hasExtraData(const char *fileName, int slot) const {
- const Video *video = getVideoBySlot(slot);
+ const Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->hasExtraData(fileName);
+ return false;//return video->hasExtraData(fileName);
return false;
}
Common::MemoryReadStream *VideoPlayer::getExtraData(const char *fileName, int slot) {
- Video *video = getVideoBySlot(slot);
+ Graphics::CoktelDecoder *video = getVideoBySlot(slot);
if (video)
- return video->getExtraData(fileName);
+ return 0;//return video->getExtraData(fileName);
return 0;
}
@@ -640,15 +566,14 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey,
if (!_primaryVideo)
return;
- Video &video = *_primaryVideo;
- Graphics::CoktelVideo &cVideo = *video.getVideo();
+ Graphics::CoktelDecoder &video = *_primaryVideo;
- if (cVideo.getCurrentFrame() != frame)
- cVideo.seekFrame(frame);
+ if (video.getCurFrame() != frame)
+ video.seek(frame);
if (palFrame < 0)
palFrame = 0;
if (endFrame < 0)
- endFrame = cVideo.getFramesCount() - 1;
+ endFrame = video.getFrameCount() - 1;
bool modifiedPal = false;
@@ -658,7 +583,7 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey,
_vm->_draw->_applyPal = true;
if (palCmd >= 4)
- copyPalette(cVideo, palStart, palEnd);
+ copyPalette(video, palStart, palEnd);
}
if (modifiedPal && (palCmd == 8) && !_backSurf)
@@ -668,7 +593,7 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey,
if (_needBlit)
_vm->_draw->forceBlit();
- Graphics::CoktelVideo::State state = video.nextFrame();
+ Graphics::CoktelDecoder::State state;// = video.nextFrame();
WRITE_VAR(11, frame);
if (_woodruffCohCottWorkaround && (frame == 32)) {
@@ -689,14 +614,16 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey,
_vm->_video->dirtyRectsAll();
}
- if ((state.flags & Graphics::CoktelVideo::kStatePalette) && (palCmd > 1)) {
- copyPalette(cVideo, palStart, palEnd);
+ /*
+ if ((state.flags & Graphics::CoktelDecoder::kStatePalette) && (palCmd > 1)) {
+ copyPalette(video, palStart, palEnd);
if (!_backSurf)
_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
else
_vm->_draw->_applyPal = true;
}
+ */
if (modifiedPal && (palCmd == 8) && _backSurf)
_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
@@ -713,9 +640,11 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey,
_vm->_video->retrace();
}
+ /*
// Subtitle
- if (state.flags & Graphics::CoktelVideo::kStateSpeech)
+ if (state.flags & Graphics::CoktelDecoder::kStateSpeech)
_vm->_draw->printTotText(state.speechId);
+ */
if (modifiedPal && ((palCmd == 2) || (palCmd == 4)))
_vm->_palAnim->fade(_vm->_global->_pPaletteDesc, -2, 0);
@@ -730,7 +659,7 @@ bool VideoPlayer::doPlay(int16 frame, int16 breakKey,
_vm->_util->processInput();
if (_vm->shouldQuit()) {
- _primaryVideo->getVideo()->disableSound();
+ //_primaryVideo->getVideo()->disableSound();
return true;
}
@@ -740,9 +669,9 @@ bool VideoPlayer::doPlay(int16 frame, int16 breakKey,
_vm->_inter->storeKey(_vm->_util->checkKey());
if (VAR(0) == (unsigned) breakKey) {
- _primaryVideo->getVideo()->disableSound();
+ //_primaryVideo->getVideo()->disableSound();
// Seek to the last frame. Some scripts depend on that.
- _primaryVideo->getVideo()->seekFrame(endFrame, SEEK_SET, true);
+ _primaryVideo->seek(endFrame, SEEK_SET, true);
return true;
}
}
@@ -750,37 +679,45 @@ bool VideoPlayer::doPlay(int16 frame, int16 breakKey,
return false;
}
-void VideoPlayer::copyPalette(Graphics::CoktelVideo &video, int16 palStart, int16 palEnd) {
- if (!(video.getFeatures() & Graphics::CoktelVideo::kFeaturesPalette))
+void VideoPlayer::copyPalette(Graphics::CoktelDecoder &video, int16 palStart, int16 palEnd) {
+ /*
+ if (!(video.getFeatures() & Graphics::CoktelDecoder::kFeaturesPalette))
return;
+ */
if (palStart < 0)
palStart = 0;
if (palEnd < 0)
palEnd = 255;
+ /*
memcpy(((char *)(_vm->_global->_pPaletteDesc->vgaPal)) + palStart * 3,
video.getPalette() + palStart * 3,
(palEnd - palStart + 1) * 3);
+ */
}
void VideoPlayer::writeVideoInfo(const char *videoFile, int16 varX, int16 varY,
int16 varFrames, int16 varWidth, int16 varHeight) {
if (primaryOpen(videoFile)) {
- int16 x, y, width, height;
+ int16 x = -1, y = -1, width = -1, height = -1;
+ /*
x = _primaryVideo->getVideo()->getX();
y = _primaryVideo->getVideo()->getY();
width = _primaryVideo->getVideo()->getWidth();
height = _primaryVideo->getVideo()->getHeight();
+ */
+ /*
if (VAR_OFFSET(varX) == 0xFFFFFFFF)
_primaryVideo->getVideo()->getFrameCoords(1, x, y, width, height);
+ */
WRITE_VAR_OFFSET(varX, x);
WRITE_VAR_OFFSET(varY, y);
- WRITE_VAR_OFFSET(varFrames, _primaryVideo->getVideo()->getFramesCount());
+ WRITE_VAR_OFFSET(varFrames, _primaryVideo->getFrameCount());
WRITE_VAR_OFFSET(varWidth, width);
WRITE_VAR_OFFSET(varHeight, height);
@@ -794,11 +731,13 @@ void VideoPlayer::writeVideoInfo(const char *videoFile, int16 varX, int16 varY,
}
}
-void VideoPlayer::evalBgShading(Graphics::CoktelVideo &video) {
+void VideoPlayer::evalBgShading(Graphics::CoktelDecoder &video) {
+ /*
if (video.isSoundPlaying())
_vm->_sound->bgShade();
else
_vm->_sound->bgUnshade();
+ */
}
} // End of namespace Gob
diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h
index 8ca8aebf44..f885e96428 100644
--- a/engines/gob/videoplayer.h
+++ b/engines/gob/videoplayer.h
@@ -29,7 +29,7 @@
#include "common/array.h"
#include "common/str.h"
-#include "graphics/video/coktelvideo/coktelvideo.h"
+#include "graphics/video/coktel_decoder.h"
#include "gob/util.h"
@@ -88,16 +88,16 @@ public:
bool slotIsOpen(int slot) const;
- const char *getFileName(int slot = -1) const;
+ const Common::String &getPrimaryFileName() const;
uint16 getFlags(int slot = -1) const;
- int16 getFramesCount(int slot = -1) const;
+ int16 getFrameCount(int slot = -1) const;
int16 getCurrentFrame(int slot = -1) const;
int16 getWidth(int slot = -1) const;
int16 getHeight(int slot = -1) const;
int16 getDefaultX(int slot = -1) const;
int16 getDefaultY(int slot = -1) const;
- Graphics::CoktelVideo::State getState(int slot = -1) const;
+ void getState(int slot = -1) const;
uint32 getFeatures(int slot = -1) const;
bool hasExtraData(const char *fileName, int slot = -1) const;
@@ -107,47 +107,17 @@ public:
int16 varFrames, int16 varWidth, int16 varHeight);
private:
- class Video {
- public:
- Video(GobEngine *vm);
- ~Video();
-
- bool open(const char *fileName, Type which, int16 width, int16 height);
- void close();
-
- bool isOpen() const;
-
- const char *getFileName() const;
- Graphics::CoktelVideo *getVideo();
- const Graphics::CoktelVideo *getVideo() const;
-
- Graphics::CoktelVideo::State getState() const;
- uint32 getFeatures() const;
-
- int16 getDefaultX() const;
- int16 getDefaultY() const;
-
- bool hasExtraData(const char *fileName) const;
- Common::MemoryReadStream *getExtraData(const char *fileName);
-
- Graphics::CoktelVideo::State nextFrame();
-
- private:
- GobEngine *_vm;
-
- Common::String _fileName;
- DataStream *_stream;
- Graphics::CoktelVideo *_video;
- Graphics::CoktelVideo::State _state;
- int16 _defaultX, _defaultY;
- };
+ static const int kVideoSlotCount = 32;
static const char *_extensions[];
GobEngine *_vm;
- Common::Array<Video *> _videoSlots;
- Video *_primaryVideo;
+ Graphics::CoktelDecoder *_primaryVideo;
+ Graphics::CoktelDecoder *_videoSlots[kVideoSlotCount];
+
+ Common::String _primaryFileName;
+
bool _ownSurf;
bool _backSurf;
bool _needBlit;
@@ -157,16 +127,18 @@ private:
bool findFile(char *fileName, Type &which);
- const Video *getVideoBySlot(int slot = -1) const;
- Video *getVideoBySlot(int slot = -1);
+ const Graphics::CoktelDecoder *getVideoBySlot(int slot = -1) const;
+ Graphics::CoktelDecoder *getVideoBySlot(int slot = -1);
int getNextFreeSlot();
- void copyPalette(Graphics::CoktelVideo &video, int16 palStart = -1, int16 palEnd = -1);
+ void copyPalette(Graphics::CoktelDecoder &video, int16 palStart = -1, int16 palEnd = -1);
bool doPlay(int16 frame, int16 breakKey,
uint16 palCmd, int16 palStart, int16 palEnd,
int16 palFrame, int16 endFrame, bool noRetrace = false);
- void evalBgShading(Graphics::CoktelVideo &video);
+ void evalBgShading(Graphics::CoktelDecoder &video);
+
+ Graphics::CoktelDecoder *openVideo(const char *fileName, Type which, uint16 width, uint16 height);
};
} // End of namespace Gob
diff --git a/graphics/module.mk b/graphics/module.mk
index 9df126afa7..df01a05799 100644
--- a/graphics/module.mk
+++ b/graphics/module.mk
@@ -23,6 +23,7 @@ MODULE_OBJS := \
VectorRenderer.o \
VectorRendererSpec.o \
video/avi_decoder.o \
+ video/coktel_decoder.o \
video/dxa_decoder.o \
video/flic_decoder.o \
video/mpeg_player.o \
diff --git a/graphics/video/coktel_decoder.cpp b/graphics/video/coktel_decoder.cpp
new file mode 100644
index 0000000000..a6c79cc1df
--- /dev/null
+++ b/graphics/video/coktel_decoder.cpp
@@ -0,0 +1,105 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "graphics/video/coktel_decoder.h"
+
+#ifdef GRAPHICS_VIDEO_COKTELDECODER_H
+
+namespace Graphics {
+
+CoktelDecoder::State::State() : left(0), top(0), right(0), bottom(0), flags(0), speechId(0) {
+}
+
+
+CoktelDecoder::CoktelDecoder(Audio::Mixer &mixer, Audio::Mixer::SoundType soundType) :
+ _mixer(&mixer), _soundType(soundType), _width(0), _height(0), _frameCount(0), _paletteDirty(false) {
+
+ memset(_palette, 0, 768);
+}
+
+CoktelDecoder::~CoktelDecoder() {
+}
+
+uint16 CoktelDecoder::getWidth() const {
+ return _width;
+}
+
+uint16 CoktelDecoder::getHeight() const {
+ return _height;
+}
+
+uint32 CoktelDecoder::getFrameCount() const {
+ return _frameCount;
+}
+
+byte *CoktelDecoder::getPalette() {
+ return _palette;
+}
+
+bool CoktelDecoder::hasDirtyPalette() const {
+ return _paletteDirty;
+}
+
+Common::Rational CoktelDecoder::getFrameRate() const {
+ return _frameRate;
+}
+
+
+PreIMDDecoder::PreIMDDecoder(uint16 width, uint16 height,
+ Audio::Mixer &mixer, Audio::Mixer::SoundType soundType) : CoktelDecoder(mixer, soundType) {
+
+ _width = width;
+ _height = height;
+}
+
+PreIMDDecoder::~PreIMDDecoder() {
+}
+
+bool PreIMDDecoder::seek(uint32 frame, int whence, bool restart) {
+ return false;
+}
+
+bool PreIMDDecoder::load(Common::SeekableReadStream &stream) {
+ return false;
+}
+
+void PreIMDDecoder::close() {
+}
+
+bool PreIMDDecoder::isVideoLoaded() const {
+ return false;
+}
+
+Surface *PreIMDDecoder::decodeNextFrame() {
+ return 0;
+}
+
+PixelFormat PreIMDDecoder::getPixelFormat() const {
+ return PixelFormat::createFormatCLUT8();
+}
+
+} // End of namespace Graphics
+
+#endif // GRAPHICS_VIDEO_COKTELDECODER_H
diff --git a/graphics/video/coktel_decoder.h b/graphics/video/coktel_decoder.h
new file mode 100644
index 0000000000..acbd533c00
--- /dev/null
+++ b/graphics/video/coktel_decoder.h
@@ -0,0 +1,119 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+// Currently, only GOB and SCI32 games play IMDs and VMDs, so skip compiling if GOB and SCI32 is disabled.
+#if !(defined(ENABLE_GOB) || defined(ENABLE_SCI32) || defined(DYNAMIC_MODULES))
+
+// Do not compile the CoktelDecoder code
+
+#else
+
+#ifndef GRAPHICS_VIDEO_COKTELDECODER_H
+#define GRAPHICS_VIDEO_COKTELDECODER_H
+
+#include "graphics/video/video_decoder.h"
+
+#include "sound/mixer.h"
+
+namespace Graphics {
+
+class CoktelDecoder : public FixedRateVideoDecoder {
+public:
+ struct State {
+ /** Left-most value of the updated rectangle. */
+ int16 left;
+ /** Top-most value of the updated rectangle. */
+ int16 top;
+ /** Right-most value of the updated rectangle. */
+ int16 right;
+ /** Bottom-most value of the updated rectangle. */
+ int16 bottom;
+ /** Set accordingly to what was done. */
+ uint32 flags;
+ /** The id of the spoken words. */
+ uint16 speechId;
+
+ State();
+ };
+
+ CoktelDecoder(Audio::Mixer &mixer,
+ Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType);
+ ~CoktelDecoder();
+
+ virtual bool seek(uint32 frame, int whence = SEEK_SET, bool restart = false) = 0;
+
+ // VideoDecoder interface
+
+ uint16 getWidth() const;
+ uint16 getHeight() const;
+
+ uint32 getFrameCount() const;
+
+ byte *getPalette();
+ bool hasDirtyPalette() const;
+
+protected:
+ Audio::Mixer *_mixer;
+ Audio::Mixer::SoundType _soundType;
+
+ uint16 _width;
+ uint16 _height;
+
+ uint32 _frameCount;
+
+ byte _palette[768];
+ bool _paletteDirty;
+
+ Common::Rational _frameRate;
+
+ // FixedRateVideoDecoder interface
+ Common::Rational getFrameRate() const;
+};
+
+class PreIMDDecoder : public CoktelDecoder {
+public:
+ PreIMDDecoder(uint16 width, uint16 height, Audio::Mixer &mixer,
+ Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType);
+ ~PreIMDDecoder();
+
+ bool seek(uint32 frame, int whence = SEEK_SET, bool restart = false);
+
+ // VideoDecoder interface
+
+ bool load(Common::SeekableReadStream &stream);
+ void close();
+
+ bool isVideoLoaded() const;
+
+ Surface *decodeNextFrame();
+
+ PixelFormat getPixelFormat() const;
+};
+
+} // End of namespace Graphics
+
+#endif // GRAPHICS_VIDEO_COKTELDECODER_H
+
+#endif // Engine and dynamic plugins guard