aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/video/video.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/mohawk/video/video.cpp')
-rw-r--r--engines/mohawk/video/video.cpp377
1 files changed, 0 insertions, 377 deletions
diff --git a/engines/mohawk/video/video.cpp b/engines/mohawk/video/video.cpp
deleted file mode 100644
index 86ecd4dedf..0000000000
--- a/engines/mohawk/video/video.cpp
+++ /dev/null
@@ -1,377 +0,0 @@
-/* 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 "mohawk/resource.h"
-#include "mohawk/video/video.h"
-#include "mohawk/video/qt_player.h"
-
-#include "common/events.h"
-
-namespace Mohawk {
-
-VideoManager::VideoManager(MohawkEngine* vm) : _vm(vm) {
-}
-
-VideoManager::~VideoManager() {
- _mlstRecords.clear();
- stopVideos();
-}
-
-void VideoManager::pauseVideos() {
- for (uint16 i = 0; i < _videoStreams.size(); i++)
- _videoStreams[i]->pauseVideo(true);
-}
-
-void VideoManager::resumeVideos() {
- for (uint16 i = 0; i < _videoStreams.size(); i++)
- _videoStreams[i]->pauseVideo(false);
-}
-
-void VideoManager::stopVideos() {
- for (uint16 i = 0; i < _videoStreams.size(); i++)
- delete _videoStreams[i].video;
- _videoStreams.clear();
-}
-
-void VideoManager::playMovie(Common::String filename, uint16 x, uint16 y, bool clearScreen) {
- VideoHandle videoHandle = createVideoHandle(filename, x, y, false);
- if (videoHandle == NULL_VID_HANDLE)
- return;
-
- // Clear screen if requested
- if (clearScreen) {
- _vm->_system->fillScreen(_vm->_system->getScreenFormat().RGBToColor(0, 0, 0));
- _vm->_system->updateScreen();
- }
-
- waitUntilMovieEnds(videoHandle);
-}
-
-void VideoManager::playMovieCentered(Common::String filename, bool clearScreen) {
- VideoHandle videoHandle = createVideoHandle(filename, 0, 0, false);
- if (videoHandle == NULL_VID_HANDLE)
- return;
-
- // Clear screen if requested
- if (clearScreen) {
- _vm->_system->fillScreen(_vm->_system->getScreenFormat().RGBToColor(0, 0, 0));
- _vm->_system->updateScreen();
- }
-
- _videoStreams[videoHandle].x = (_vm->_system->getWidth() - _videoStreams[videoHandle]->getWidth()) / 2;
- _videoStreams[videoHandle].y = (_vm->_system->getHeight() - _videoStreams[videoHandle]->getHeight()) / 2;
-
- waitUntilMovieEnds(videoHandle);
-}
-
-void VideoManager::waitUntilMovieEnds(VideoHandle videoHandle) {
- bool continuePlaying = true;
-
- while (!_videoStreams[videoHandle]->endOfVideo() && !_vm->shouldQuit() && continuePlaying) {
- if (updateBackgroundMovies())
- _vm->_system->updateScreen();
-
- Common::Event event;
- while (_vm->_system->getEventManager()->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_RTL:
- case Common::EVENT_QUIT:
- continuePlaying = false;
- break;
- case Common::EVENT_KEYDOWN:
- switch (event.kbd.keycode) {
- case Common::KEYCODE_SPACE:
- _vm->pauseGame();
- break;
- case Common::KEYCODE_ESCAPE:
- continuePlaying = false;
- break;
- default:
- break;
- }
- default:
- break;
- }
- }
-
- // Cut down on CPU usage
- _vm->_system->delayMillis(10);
- }
-
- _videoStreams[videoHandle]->close();
- _videoStreams.clear();
-}
-
-void VideoManager::playBackgroundMovie(Common::String filename, int16 x, int16 y, bool loop) {
- VideoHandle videoHandle = createVideoHandle(filename, x, y, loop);
- if (videoHandle == NULL_VID_HANDLE)
- return;
-
- // Center x if requested
- if (x < 0)
- _videoStreams[videoHandle].x = (_vm->_system->getWidth() - _videoStreams[videoHandle]->getWidth()) / 2;
-
- // Center y if requested
- if (y < 0)
- _videoStreams[videoHandle].y = (_vm->_system->getHeight() - _videoStreams[videoHandle]->getHeight()) / 2;
-}
-
-bool VideoManager::updateBackgroundMovies() {
- bool updateScreen = false;
-
- for (uint32 i = 0; i < _videoStreams.size() && !_vm->shouldQuit(); i++) {
- // Skip deleted videos
- if (!_videoStreams[i].video)
- continue;
-
- // Remove any videos that are over
- if (_videoStreams[i]->endOfVideo()) {
- if (_videoStreams[i].loop) {
- _videoStreams[i]->rewind();
- } else {
- delete _videoStreams[i].video;
- memset(&_videoStreams[i], 0, sizeof(VideoEntry));
- _videoStreams[i].video = NULL;
- continue;
- }
- }
-
- // Check if we need to draw a frame
- if (_videoStreams[i]->needsUpdate()) {
- Graphics::Surface *frame = _videoStreams[i]->decodeNextFrame();
- bool deleteFrame = false;
-
- if (frame && _videoStreams[i].enabled) {
- // Convert from 8bpp to the current screen format if necessary
- if (frame->bytesPerPixel == 1) {
- Graphics::Surface *newFrame = new Graphics::Surface();
- Graphics::PixelFormat pixelFormat = _vm->_system->getScreenFormat();
- byte *palette = _videoStreams[i]->getPalette();
- assert(palette);
-
- newFrame->create(frame->w, frame->h, pixelFormat.bytesPerPixel);
-
- for (uint16 j = 0; j < frame->h; j++) {
- for (uint16 k = 0; k < frame->w; k++) {
- byte palIndex = *((byte *)frame->getBasePtr(k, j));
- byte r = palette[palIndex * 3];
- byte g = palette[palIndex * 3 + 1];
- byte b = palette[palIndex * 3 + 2];
- if (pixelFormat.bytesPerPixel == 2)
- *((uint16 *)newFrame->getBasePtr(k, j)) = pixelFormat.RGBToColor(r, g, b);
- else
- *((uint32 *)newFrame->getBasePtr(k, j)) = pixelFormat.RGBToColor(r, g, b);
- }
- }
-
- frame = newFrame;
- deleteFrame = true;
- }
-
- // Clip the width/height to make sure we stay on the screen (Myst does this a few times)
- uint16 width = MIN<int32>(_videoStreams[i]->getWidth(), _vm->_system->getWidth() - _videoStreams[i].x);
- uint16 height = MIN<int32>(_videoStreams[i]->getHeight(), _vm->_system->getHeight() - _videoStreams[i].y);
- _vm->_system->copyRectToScreen((byte*)frame->pixels, frame->pitch, _videoStreams[i].x, _videoStreams[i].y, width, height);
-
- // We've drawn something to the screen, make sure we update it
- updateScreen = true;
-
- // Delete the frame if we're using the buffer from the 8bpp conversion
- if (deleteFrame) {
- frame->free();
- delete frame;
- }
- }
- }
-
- // Update the audio buffer too
- _videoStreams[i]->updateAudioBuffer();
- }
-
- // Return true if we need to update the screen
- return updateScreen;
-}
-
-void VideoManager::activateMLST(uint16 mlstId, uint16 card) {
- Common::SeekableReadStream *mlstStream = _vm->getRawData(ID_MLST, card);
- uint16 recordCount = mlstStream->readUint16BE();
-
- for (uint16 i = 0; i < recordCount; i++) {
- MLSTRecord mlstRecord;
- mlstRecord.index = mlstStream->readUint16BE();
- mlstRecord.movieID = mlstStream->readUint16BE();
- mlstRecord.code = mlstStream->readUint16BE();
- mlstRecord.left = mlstStream->readUint16BE();
- mlstRecord.top = mlstStream->readUint16BE();
-
- for (byte j = 0; j < 2; j++)
- if (mlstStream->readUint16BE() != 0)
- warning("u0[%d] in MLST non-zero", j);
-
- if (mlstStream->readUint16BE() != 0xFFFF)
- warning("u0[2] in MLST not 0xFFFF");
-
- mlstRecord.loop = mlstStream->readUint16BE();
- mlstRecord.volume = mlstStream->readUint16BE();
- mlstRecord.u1 = mlstStream->readUint16BE();
-
- if (mlstRecord.u1 != 1)
- warning("mlstRecord.u1 not 1");
-
- if (mlstRecord.index == mlstId) {
- _mlstRecords.push_back(mlstRecord);
- break;
- }
- }
-
- delete mlstStream;
-}
-
-void VideoManager::playMovie(uint16 id) {
- for (uint16 i = 0; i < _mlstRecords.size(); i++)
- if (_mlstRecords[i].code == id) {
- debug(1, "Play tMOV %d (non-blocking) at (%d, %d) %s", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].loop != 0 ? "looping" : "non-looping");
- createVideoHandle(_mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, _mlstRecords[i].loop != 0);
- return;
- }
-}
-
-void VideoManager::playMovieBlocking(uint16 id) {
- for (uint16 i = 0; i < _mlstRecords.size(); i++)
- if (_mlstRecords[i].code == id) {
- debug(1, "Play tMOV %d (blocking) at (%d, %d)", _mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top);
- VideoHandle videoHandle = createVideoHandle(_mlstRecords[i].movieID, _mlstRecords[i].left, _mlstRecords[i].top, false);
- waitUntilMovieEnds(videoHandle);
- return;
- }
-}
-
-void VideoManager::stopMovie(uint16 id) {
- debug(2, "Stopping movie %d", id);
- for (uint16 i = 0; i < _mlstRecords.size(); i++)
- if (_mlstRecords[i].code == id)
- for (uint16 j = 0; j < _videoStreams.size(); j++)
- if (_mlstRecords[i].movieID == _videoStreams[j].id) {
- delete _videoStreams[i].video;
- memset(&_videoStreams[i].video, 0, sizeof(VideoEntry));
- return;
- }
-}
-
-void VideoManager::enableMovie(uint16 id) {
- debug(2, "Enabling movie %d", id);
- for (uint16 i = 0; i < _mlstRecords.size(); i++)
- if (_mlstRecords[i].code == id)
- for (uint16 j = 0; j < _videoStreams.size(); j++)
- if (_mlstRecords[i].movieID == _videoStreams[j].id) {
- _videoStreams[j].enabled = true;
- return;
- }
-}
-
-void VideoManager::disableMovie(uint16 id) {
- debug(2, "Disabling movie %d", id);
- for (uint16 i = 0; i < _mlstRecords.size(); i++)
- if (_mlstRecords[i].code == id)
- for (uint16 j = 0; j < _videoStreams.size(); j++)
- if (_mlstRecords[i].movieID == _videoStreams[j].id) {
- _videoStreams[j].enabled = false;
- return;
- }
-}
-
-void VideoManager::disableAllMovies() {
- debug(2, "Disabling all movies");
- for (uint16 i = 0; i < _videoStreams.size(); i++)
- _videoStreams[i].enabled = false;
-}
-
-VideoHandle VideoManager::createVideoHandle(uint16 id, uint16 x, uint16 y, bool loop) {
- // First, check to see if that video is already playing
- for (uint32 i = 0; i < _videoStreams.size(); i++)
- if (_videoStreams[i].id == id)
- return i;
-
- // Otherwise, create a new entry
- VideoEntry entry;
- entry.video = new QTPlayer();
- entry.x = x;
- entry.y = y;
- entry.filename = "";
- entry.id = id;
- entry.loop = loop;
- entry.enabled = true;
- entry->setChunkBeginOffset(_vm->getResourceOffset(ID_TMOV, id));
- entry->load(*_vm->getRawData(ID_TMOV, id));
-
- // Search for any deleted videos so we can take a formerly used slot
- for (uint32 i = 0; i < _videoStreams.size(); i++)
- if (!_videoStreams[i].video) {
- _videoStreams[i] = entry;
- return i;
- }
-
- // Otherwise, just add it to the list
- _videoStreams.push_back(entry);
- return _videoStreams.size() - 1;
-}
-
-VideoHandle VideoManager::createVideoHandle(Common::String filename, uint16 x, uint16 y, bool loop) {
- // First, check to see if that video is already playing
- for (uint32 i = 0; i < _videoStreams.size(); i++)
- if (_videoStreams[i].filename == filename)
- return i;
-
- // Otherwise, create a new entry
- VideoEntry entry;
- entry.video = new QTPlayer();
- entry.x = x;
- entry.y = y;
- entry.filename = filename;
- entry.id = 0;
- entry.loop = loop;
- entry.enabled = true;
-
- Common::File *file = new Common::File();
- if (!file->open(filename)) {
- delete file;
- return NULL_VID_HANDLE;
- }
-
- entry->load(*file);
-
- // Search for any deleted videos so we can take a formerly used slot
- for (uint32 i = 0; i < _videoStreams.size(); i++)
- if (!_videoStreams[i].video) {
- _videoStreams[i] = entry;
- return i;
- }
-
- // Otherwise, just add it to the list
- _videoStreams.push_back(entry);
- return _videoStreams.size() - 1;
-}
-
-} // End of namespace Mohawk