aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/wintermute/Base/BSurface.h2
-rw-r--r--engines/wintermute/Base/BSurfaceSDL.cpp9
-rw-r--r--engines/wintermute/Base/BSurfaceSDL.h2
-rw-r--r--engines/wintermute/video/VidTheoraPlayer.cpp79
-rw-r--r--engines/wintermute/video/VidTheoraPlayer.h7
-rw-r--r--engines/wintermute/video/decoders/theora_decoder.h1
6 files changed, 80 insertions, 20 deletions
diff --git a/engines/wintermute/Base/BSurface.h b/engines/wintermute/Base/BSurface.h
index a7279a9217..046041ac6a 100644
--- a/engines/wintermute/Base/BSurface.h
+++ b/engines/wintermute/Base/BSurface.h
@@ -30,6 +30,7 @@
#define WINTERMUTE_BSURFACE_H
#include "engines/wintermute/Base/BBase.h"
+#include "graphics/surface.h"
namespace WinterMute {
@@ -62,6 +63,7 @@ public:
virtual HRESULT Restore();
virtual HRESULT Create(const char *Filename, bool default_ck, byte ck_red, byte ck_green, byte ck_blue, int LifeTime = -1, bool KeepLoaded = false);
virtual HRESULT Create(int Width, int Height);
+ virtual HRESULT PutSurface(const Graphics::Surface &surface) { return E_FAIL; }
virtual HRESULT PutPixel(int X, int Y, byte R, byte G, byte B, int A = -1);
virtual HRESULT GetPixel(int X, int Y, byte *R, byte *G, byte *B, byte *A = NULL);
virtual bool ComparePixel(int X, int Y, byte R, byte G, byte B, int A = -1);
diff --git a/engines/wintermute/Base/BSurfaceSDL.cpp b/engines/wintermute/Base/BSurfaceSDL.cpp
index af41231968..391b83c7bb 100644
--- a/engines/wintermute/Base/BSurfaceSDL.cpp
+++ b/engines/wintermute/Base/BSurfaceSDL.cpp
@@ -456,12 +456,12 @@ HRESULT CBSurfaceSDL::DrawSprite(int X, int Y, RECT *Rect, float ZoomX, float Zo
warning("CBSurfaceSDL::DrawSprite not fully ported yet"); // TODO.
hasWarned = true;
}
-#if 0
+
byte r = D3DCOLGetR(Alpha);
byte g = D3DCOLGetG(Alpha);
byte b = D3DCOLGetB(Alpha);
byte a = D3DCOLGetA(Alpha);
-
+#if 0
SDL_SetTextureColorMod(_texture, r, g, b);
SDL_SetTextureAlphaMod(_texture, a);
@@ -499,4 +499,9 @@ HRESULT CBSurfaceSDL::DrawSprite(int X, int Y, RECT *Rect, float ZoomX, float Zo
return S_OK;
}
+HRESULT CBSurfaceSDL::PutSurface(const Graphics::Surface &surface) {
+ _surface->copyFrom(surface);
+ return S_OK;
+}
+
} // end of namespace WinterMute
diff --git a/engines/wintermute/Base/BSurfaceSDL.h b/engines/wintermute/Base/BSurfaceSDL.h
index 07c9b7cc6b..767db0fa74 100644
--- a/engines/wintermute/Base/BSurfaceSDL.h
+++ b/engines/wintermute/Base/BSurfaceSDL.h
@@ -58,7 +58,7 @@ public:
HRESULT Display(int X, int Y, RECT rect, TSpriteBlendMode BlendMode = BLEND_NORMAL, bool MirrorX = false, bool MirrorY = false);
HRESULT DisplayZoom(int X, int Y, RECT rect, float ZoomX, float ZoomY, uint32 Alpha = 0xFFFFFFFF, bool Transparent = false, TSpriteBlendMode BlendMode = BLEND_NORMAL, bool MirrorX = false, bool MirrorY = false);
HRESULT DisplayTransform(int X, int Y, int HotX, int HotY, RECT Rect, float ZoomX, float ZoomY, uint32 Alpha, float Rotate, TSpriteBlendMode BlendMode = BLEND_NORMAL, bool MirrorX = false, bool MirrorY = false);
-
+ virtual HRESULT PutSurface(const Graphics::Surface &surface);
/* static unsigned DLL_CALLCONV ReadProc(void *buffer, unsigned size, unsigned count, fi_handle handle);
static int DLL_CALLCONV SeekProc(fi_handle handle, long offset, int origin);
static long DLL_CALLCONV TellProc(fi_handle handle);*/
diff --git a/engines/wintermute/video/VidTheoraPlayer.cpp b/engines/wintermute/video/VidTheoraPlayer.cpp
index 56bdcc8a8a..219dc03d69 100644
--- a/engines/wintermute/video/VidTheoraPlayer.cpp
+++ b/engines/wintermute/video/VidTheoraPlayer.cpp
@@ -19,7 +19,13 @@
#include "engines/wintermute/dcgf.h"
#include "engines/wintermute/video/vidtheoraplayer.h"
-
+#include "engines/wintermute/Base/BGame.h"
+#include "engines/wintermute/Base/BFileManager.h"
+#include "engines/wintermute/Base/BSurfaceSDL.h"
+#include "engines/wintermute/utils/utils.h"
+#include "engines/wintermute/PlatformSDL.h"
+#include "engines/wintermute/video/decoders/theora_decoder.h"
+#include "common/system.h"
//#pragma comment(lib, "libtheora.lib")
namespace WinterMute {
@@ -99,10 +105,10 @@ void CVidTheoraPlayer::SetDefaults() {
CVidTheoraPlayer::~CVidTheoraPlayer(void) {
Cleanup();
- SAFE_DELETE_ARRAY(_filename);
+/* SAFE_DELETE_ARRAY(_filename);
SAFE_DELETE_ARRAY(_alphaFilename);
SAFE_DELETE(_texture);
- SAFE_DELETE(_alphaImage);
+ SAFE_DELETE(_alphaImage);*/
// SAFE_DELETE(_subtitler);
}
@@ -160,6 +166,28 @@ void CVidTheoraPlayer::Cleanup() {
//////////////////////////////////////////////////////////////////////////
HRESULT CVidTheoraPlayer::initialize(const char *Filename, const char *SubtitleFile) {
+ Cleanup();
+
+ _file = Game->_fileManager->OpenFile(Filename);
+ if (!_file) return E_FAIL;
+
+ //if (Filename != _filename) CBUtils::SetString(&_filename, Filename);
+ _theoraDecoder = new TheoraDecoder();
+ _theoraDecoder->loadStream(_file);
+
+ if (!_theoraDecoder->isVideoLoaded())
+ return E_FAIL;
+
+ _state = THEORA_STATE_PAUSED;
+
+ // Additional setup.
+ _surface.create(_theoraDecoder->getWidth(), _theoraDecoder->getHeight(), _theoraDecoder->getPixelFormat());
+ _texture = new CBSurfaceSDL(Game);
+ _texture->Create(_theoraDecoder->getWidth(), _theoraDecoder->getHeight());
+ _state = THEORA_STATE_PLAYING;
+ _playZoom = 100;
+
+ return S_OK;
#if 0
Cleanup();
@@ -346,6 +374,11 @@ HRESULT CVidTheoraPlayer::ResetStream() {
//////////////////////////////////////////////////////////////////////////
HRESULT CVidTheoraPlayer::play(TVideoPlayback Type, int X, int Y, bool FreezeGame, bool FreezeMusic, bool Looping, uint32 StartTime, float ForceZoom, int Volume) {
+ if (_theoraDecoder) {
+ _surface.copyFrom(*_theoraDecoder->decodeNextFrame());
+ _state = THEORA_STATE_PLAYING;
+ return S_OK;
+ }
#if 0
if (ForceZoom < 0.0f) ForceZoom = 100.0f;
if (Volume < 0) m_Volume = Game->m_SoundMgr->GetVolumePercent(SOUND_SFX);
@@ -412,6 +445,21 @@ HRESULT CVidTheoraPlayer::stop() {
//////////////////////////////////////////////////////////////////////////
HRESULT CVidTheoraPlayer::update() {
+ if (_theoraDecoder) {
+ if (_theoraDecoder->endOfVideo()) {
+ warning("Finished movie");
+ _state = THEORA_STATE_FINISHED;
+ }
+ if (_state == THEORA_STATE_PLAYING) {
+ if (_theoraDecoder->getTimeToNextFrame() > 0) {
+ _surface.copyFrom(*_theoraDecoder->decodeNextFrame()->convertTo(g_system->getScreenFormat()));
+ }
+ if (_texture) WriteVideo();
+ _videoFrameReady = true;
+ return S_OK;
+ }
+ }
+
#if 0
m_CurrentTime = m_FreezeGame ? Game->m_LiveTimer : Game->m_Timer;
@@ -623,16 +671,17 @@ HRESULT CVidTheoraPlayer::WriteAudio() {
//////////////////////////////////////////////////////////////////////////
HRESULT CVidTheoraPlayer::WriteVideo() {
-#if 0
- if (!m_Texture) return E_FAIL;
+ if (!_texture) return E_FAIL;
+#if 0
yuv_buffer yuv;
theora_decode_YUVout(&m_TheoraState, &yuv);
-
- m_Texture->StartPixelOp();
- RenderFrame(m_Texture, &yuv);
- m_Texture->EndPixelOp();
#endif
+ _texture->StartPixelOp();
+ //RenderFrame(_texture, &yuv);
+ _texture->PutSurface(_surface);
+ _texture->EndPixelOp();
+
return S_OK;
}
@@ -641,13 +690,13 @@ HRESULT CVidTheoraPlayer::display(uint32 Alpha) {
RECT rc;
HRESULT Res;
-#if 0
- if (m_Texture) {
- SetRect(&rc, 0, 0, m_Texture->GetWidth(), m_Texture->GetHeight());
- if (m_PlayZoom == 100.0f) Res = m_Texture->DisplayTrans(m_PosX, m_PosY, rc, Alpha);
- else Res = m_Texture->DisplayTransZoom(m_PosX, m_PosY, rc, m_PlayZoom, m_PlayZoom, Alpha);
- } else Res = E_FAIL;
+ if (_texture) {
+ CBPlatform::SetRect(&rc, 0, 0, _texture->GetWidth(), _texture->GetHeight());
+ if (_playZoom == 100.0f) Res = _texture->DisplayTrans(_posX, _posY, rc, Alpha);
+ else Res = _texture->DisplayTransZoom(_posX, _posY, rc, _playZoom, _playZoom, Alpha);
+ } else Res = E_FAIL;
+#if 0
if (m_Subtitler && Game->m_VideoSubtitles) m_Subtitler->Display();
#endif
return Res;
diff --git a/engines/wintermute/video/VidTheoraPlayer.h b/engines/wintermute/video/VidTheoraPlayer.h
index 74a094bf5c..72bb073c0f 100644
--- a/engines/wintermute/video/VidTheoraPlayer.h
+++ b/engines/wintermute/video/VidTheoraPlayer.h
@@ -24,6 +24,8 @@
#include "engines/wintermute/Base/file/BFile.h"
#include "engines/wintermute/Base/BSurface.h"
#include "engines/wintermute/Base/BImage.h"
+#include "video/video_decoder.h"
+#include "common/stream.h"
//#include <theora/theora.h>
namespace WinterMute {
@@ -31,6 +33,8 @@ namespace WinterMute {
class CVidTheoraPlayer : public CBBase {
private:
enum { THEORA_STATE_NONE = 0, THEORA_STATE_PLAYING = 1, THEORA_STATE_PAUSED = 2, THEORA_STATE_FINISHED = 3 };
+ Video::VideoDecoder *_theoraDecoder;
+ Graphics::Surface _surface;
public:
//DECLARE_PERSISTENT(CVidTheoraPlayer, CBBase);
@@ -59,7 +63,7 @@ public:
// external objects
- CBFile *_file;
+ Common::SeekableReadStream *_file;
char *_filename;
//CBSoundTheora *_sound;
@@ -86,7 +90,6 @@ public:
return _state == THEORA_STATE_PLAYING;
};
bool IsFinished() {
- return true; // HACK
return _state == THEORA_STATE_FINISHED;
};
bool IsPaused() {
diff --git a/engines/wintermute/video/decoders/theora_decoder.h b/engines/wintermute/video/decoders/theora_decoder.h
index 34a7aa32a4..79e669c068 100644
--- a/engines/wintermute/video/decoders/theora_decoder.h
+++ b/engines/wintermute/video/decoders/theora_decoder.h
@@ -48,6 +48,7 @@ namespace WinterMute {
* Decoder for Theora videos.
* Video decoder used in engines:
* - sword25
+ * - wintermute
*/
class TheoraDecoder : public Video::VideoDecoder {
public: