diff options
author | Colin Snover | 2016-12-17 18:50:57 -0600 |
---|---|---|
committer | Colin Snover | 2016-12-17 18:55:23 -0600 |
commit | 6338496dffd3e1dc07fa4cd17654a2daa95f60fe (patch) | |
tree | 863d72d5bdaa5d20ccf34346a54392f697c98e04 | |
parent | 07919b79baca911dcda4708406f5dee85d22b655 (diff) | |
download | scummvm-rg350-6338496dffd3e1dc07fa4cd17654a2daa95f60fe.tar.gz scummvm-rg350-6338496dffd3e1dc07fa4cd17654a2daa95f60fe.tar.bz2 scummvm-rg350-6338496dffd3e1dc07fa4cd17654a2daa95f60fe.zip |
SCI32: Fix bitmap surface memory leaks in video players
Fixes Trac#9662.
-rw-r--r-- | engines/sci/graphics/video32.cpp | 17 | ||||
-rw-r--r-- | engines/sci/graphics/video32.h | 7 |
2 files changed, 11 insertions, 13 deletions
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 @@ -73,14 +73,9 @@ 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 - |