From 6338496dffd3e1dc07fa4cd17654a2daa95f60fe Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Sat, 17 Dec 2016 18:50:57 -0600 Subject: SCI32: Fix bitmap surface memory leaks in video players Fixes Trac#9662. --- engines/sci/graphics/video32.cpp | 17 ++++++++++------- engines/sci/graphics/video32.h | 7 +------ 2 files changed, 11 insertions(+), 13 deletions(-) (limited to 'engines') diff --git a/engines/sci/graphics/video32.cpp b/engines/sci/graphics/video32.cpp index 6eae4cca87..c3aafb62bf 100644 --- a/engines/sci/graphics/video32.cpp +++ b/engines/sci/graphics/video32.cpp @@ -71,12 +71,13 @@ void SEQPlayer::play(const Common::String &fileName, const int16 numTicks, const // mechanism that is very similar to that used by the VMD player, which // allows the SEQ to be drawn into a bitmap ScreenItem and displayed using // the normal graphics system. - SciBitmap &bitmap = *_segMan->allocateBitmap(&_bitmap, _decoder->getWidth(), _decoder->getHeight(), kDefaultSkipColor, 0, 0, kLowResX, kLowResY, 0, false, false); + reg_t bitmapId; + SciBitmap &bitmap = *_segMan->allocateBitmap(&bitmapId, _decoder->getWidth(), _decoder->getHeight(), kDefaultSkipColor, 0, 0, kLowResX, kLowResY, 0, false, false); bitmap.getBuffer().fillRect(Common::Rect(_decoder->getWidth(), _decoder->getHeight()), 0); CelInfo32 celInfo; celInfo.type = kCelTypeMem; - celInfo.bitmap = _bitmap; + celInfo.bitmap = bitmapId; _plane = new Plane(Common::Rect(kLowResX, kLowResY), kPlanePicColored); g_sci->_gfxFrameout->addPlane(*_plane); @@ -94,20 +95,19 @@ void SEQPlayer::play(const Common::String &fileName, const int16 numTicks, const while (!g_engine->shouldQuit() && !_decoder->endOfVideo()) { g_sci->sleep(_decoder->getTimeToNextFrame()); - renderFrame(); + renderFrame(bitmap); } - _segMan->freeBitmap(_screenItem->_celInfo.bitmap); + _segMan->freeBitmap(bitmapId); g_sci->_gfxFrameout->deletePlane(*_plane); g_sci->_gfxFrameout->frameOut(true); _screenItem = nullptr; _plane = nullptr; } -void SEQPlayer::renderFrame() const { +void SEQPlayer::renderFrame(SciBitmap &bitmap) const { const Graphics::Surface *surface = _decoder->decodeNextFrame(); - SciBitmap &bitmap = *_segMan->lookupBitmap(_bitmap); bitmap.getBuffer().copyRectToSurface(*surface, 0, 0, Common::Rect(surface->w, surface->h)); const bool dirtyPalette = _decoder->hasDirtyPalette(); @@ -326,6 +326,8 @@ AVIPlayer::IOStatus AVIPlayer::close() { _decoder->close(); _status = kAVINotOpen; + _segMan->freeBitmap(_bitmap); + _bitmap = NULL_REG; g_sci->_gfxFrameout->deletePlane(*_plane); _plane = nullptr; _screenItem = nullptr; @@ -569,9 +571,10 @@ VMDPlayer::IOStatus VMDPlayer::close() { _isInitialized = false; _ignorePalettes = false; + _segMan->freeBitmap(_screenItem->_celInfo.bitmap); + if (!_planeIsOwned && _screenItem != nullptr) { g_sci->_gfxFrameout->deleteScreenItem(*_screenItem); - _segMan->freeBitmap(_screenItem->_celInfo.bitmap); _screenItem = nullptr; } else if (_plane != nullptr) { g_sci->_gfxFrameout->deletePlane(*_plane); diff --git a/engines/sci/graphics/video32.h b/engines/sci/graphics/video32.h index 4fc627e674..69acdf2fce 100644 --- a/engines/sci/graphics/video32.h +++ b/engines/sci/graphics/video32.h @@ -72,15 +72,10 @@ private: */ ScreenItem *_screenItem; - /** - * The bitmap used to render video output. - */ - reg_t _bitmap; - /** * Renders a single frame of video. */ - void renderFrame() const; + void renderFrame(SciBitmap &bitmap) const; }; #pragma mark - -- cgit v1.2.3