diff options
Diffstat (limited to 'engines/sword25/fmv')
-rw-r--r-- | engines/sword25/fmv/movieplayer.cpp | 2 | ||||
-rw-r--r-- | engines/sword25/fmv/theora_decoder.cpp | 27 | ||||
-rw-r--r-- | engines/sword25/fmv/theora_decoder.h | 9 |
3 files changed, 24 insertions, 14 deletions
diff --git a/engines/sword25/fmv/movieplayer.cpp b/engines/sword25/fmv/movieplayer.cpp index d267506ae2..d0ad41de22 100644 --- a/engines/sword25/fmv/movieplayer.cpp +++ b/engines/sword25/fmv/movieplayer.cpp @@ -145,7 +145,7 @@ bool MoviePlayer::isMovieLoaded() { } bool MoviePlayer::isPaused() { - return _decoder.isPaused(); + return _decoder.isPaused() || _decoder.endOfVideo(); } float MoviePlayer::getScaleFactor() { diff --git a/engines/sword25/fmv/theora_decoder.cpp b/engines/sword25/fmv/theora_decoder.cpp index 07cb56356d..be6d940d23 100644 --- a/engines/sword25/fmv/theora_decoder.cpp +++ b/engines/sword25/fmv/theora_decoder.cpp @@ -54,7 +54,6 @@ static double rint(double v) { TheoraDecoder::TheoraDecoder(Audio::Mixer::SoundType soundType) { _fileStream = 0; - _surface = 0; _theoraPacket = 0; _vorbisPacket = 0; @@ -298,8 +297,14 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { _endOfAudio = true; } - _surface = new Graphics::Surface(); - _surface->create(_theoraInfo.frame_width, _theoraInfo.frame_height, g_system->getScreenFormat()); + _surface.create(_theoraInfo.frame_width, _theoraInfo.frame_height, g_system->getScreenFormat()); + + // Set up a display surface + _displaySurface.pixels = _surface.getBasePtr(_theoraInfo.pic_x, _theoraInfo.pic_y); + _displaySurface.w = _theoraInfo.pic_width; + _displaySurface.h = _theoraInfo.pic_height; + _displaySurface.format = _surface.format; + _displaySurface.pitch = _surface.pitch; // Set the frame rate _frameRate = Common::Rational(_theoraInfo.fps_numerator, _theoraInfo.fps_denominator); @@ -337,9 +342,9 @@ void TheoraDecoder::close() { delete _fileStream; _fileStream = 0; - _surface->free(); - delete _surface; - _surface = 0; + _surface.free(); + _displaySurface.pixels = 0; + _displaySurface.free(); reset(); } @@ -412,7 +417,7 @@ const Graphics::Surface *TheoraDecoder::decodeNextFrame() { } } - return _surface; + return &_displaySurface; } bool TheoraDecoder::queueAudio() { @@ -440,7 +445,11 @@ bool TheoraDecoder::queueAudio() { _audiobufFill += (i * _vorbisInfo.channels) << 1; if (_audiobufFill == AUDIOFD_FRAGSIZE) { - _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::NO, Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN | Audio::FLAG_STEREO); + byte flags = Audio::FLAG_16BITS | Audio::FLAG_STEREO; +#ifdef SCUMM_LITTLE_ENDIAN + flags |= Audio::FLAG_LITTLE_ENDIAN; +#endif + _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::NO, flags); // The audio mixer is now responsible for the old audio buffer. // We need to create a new one. @@ -533,7 +542,7 @@ void TheoraDecoder::translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer) { assert(YUVBuffer[kBufferU].height == YUVBuffer[kBufferY].height >> 1); assert(YUVBuffer[kBufferV].height == YUVBuffer[kBufferY].height >> 1); - Graphics::convertYUV420ToRGB(_surface, YUVBuffer[kBufferY].data, YUVBuffer[kBufferU].data, YUVBuffer[kBufferV].data, YUVBuffer[kBufferY].width, YUVBuffer[kBufferY].height, YUVBuffer[kBufferY].stride, YUVBuffer[kBufferU].stride); + Graphics::convertYUV420ToRGB(&_surface, YUVBuffer[kBufferY].data, YUVBuffer[kBufferU].data, YUVBuffer[kBufferV].data, YUVBuffer[kBufferY].width, YUVBuffer[kBufferY].height, YUVBuffer[kBufferY].stride, YUVBuffer[kBufferU].stride); } } // End of namespace Sword25 diff --git a/engines/sword25/fmv/theora_decoder.h b/engines/sword25/fmv/theora_decoder.h index 10a05647c3..e8cc5ab8b9 100644 --- a/engines/sword25/fmv/theora_decoder.h +++ b/engines/sword25/fmv/theora_decoder.h @@ -70,8 +70,8 @@ public: const Graphics::Surface *decodeNextFrame(); bool isVideoLoaded() const { return _fileStream != 0; } - uint16 getWidth() const { return _surface->w; } - uint16 getHeight() const { return _surface->h; } + uint16 getWidth() const { return _displaySurface.w; } + uint16 getHeight() const { return _displaySurface.h; } uint32 getFrameCount() const { // It is not possible to get frame count easily @@ -80,7 +80,7 @@ public: return 0; } - Graphics::PixelFormat getPixelFormat() const { return _surface->format; } + Graphics::PixelFormat getPixelFormat() const { return _displaySurface.format; } uint32 getElapsedTime() const; uint32 getTimeToNextFrame() const; @@ -96,7 +96,8 @@ private: void translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer); Common::SeekableReadStream *_fileStream; - Graphics::Surface *_surface; + Graphics::Surface _surface; + Graphics::Surface _displaySurface; Common::Rational _frameRate; double _nextFrameStartTime; bool _endOfVideo; |