Resolve memory issues of webp 00/266000/4
authorSeungho Baek <sbsh.baek@samsung.com>
Wed, 3 Nov 2021 14:21:43 +0000 (23:21 +0900)
committerSeungho Baek <sbsh.baek@samsung.com>
Fri, 5 Nov 2021 06:30:39 +0000 (15:30 +0900)
 - If an webp is loaded by image-visual, the image-visual loads only the first frame and renders.
 - So, after the first frame is loaded, the opened file should be closed.
 - And if a single frame webp is loaded by animated-image-visual, we don't keep the buffer until the loader is deleted.

Change-Id: Ibbee0b5e410edeb49593648975e19eeb82e929f8
Signed-off-by: Seungho Baek <sbsh.baek@samsung.com>
dali/internal/imaging/common/loader-webp.cpp
dali/internal/imaging/common/webp-loading.cpp

index e388712..da82a89 100644 (file)
@@ -130,6 +130,7 @@ bool LoadWebpHeader(const Dali::ImageLoader::Input& input, unsigned int& width,
       WebPAnimDecoderGetInfo(webPAnimDecoder, &webPAnimInfo);
       width  = webPAnimInfo.canvas_width;
       height = webPAnimInfo.canvas_height;
+      ReleaseResource(webPData, webPAnimDecoder);
       return true;
     }
   }
@@ -225,6 +226,7 @@ bool LoadBitmapFromWebp(const Dali::ImageLoader::Input& input, Dali::Devel::Pixe
       bitmap                   = Dali::Devel::PixelBuffer::New(webPAnimInfo.canvas_width, webPAnimInfo.canvas_height, Dali::Pixel::RGBA8888);
       const int32_t bufferSize = webPAnimInfo.canvas_width * webPAnimInfo.canvas_height * sizeof(uint32_t);
       memcpy(bitmap.GetBuffer(), frameBuffer, bufferSize);
+      ReleaseResource(webPData, webPAnimDecoder);
       return true;
     }
   }
index dc758fa..707821b 100644 (file)
@@ -116,7 +116,7 @@ public:
     {
       Internal::Platform::FileReader fileReader(mUrl);
       fp = fileReader.GetFile();
-      if(fp == NULL)
+      if(fp == nullptr)
       {
         return false;
       }
@@ -165,28 +165,37 @@ public:
     return false;
   }
 
-  // Moveable but not copyable
-
-  Impl(const Impl&) = delete;
-  Impl& operator=(const Impl&) = delete;
-  Impl(Impl&&)                 = default;
-  Impl& operator=(Impl&&) = default;
-
-  ~Impl()
+  void ReleaseResource()
   {
 #ifdef DALI_ANIMATED_WEBP_ENABLED
-    if(&mWebPData != NULL)
+    if(&mWebPData != nullptr)
     {
       mWebPData.bytes = nullptr;
       WebPDataInit(&mWebPData);
     }
-    if(mWebPAnimDecoder)
+    if(mWebPAnimDecoder != nullptr)
     {
       WebPAnimDecoderDelete(mWebPAnimDecoder);
+      mWebPAnimDecoder = nullptr;
     }
 #endif
-    free((void*)mBuffer);
-    mBuffer = nullptr;
+    if(mBuffer != nullptr)
+    {
+      free((void*)mBuffer);
+      mBuffer = nullptr;
+    }
+  }
+
+  // Moveable but not copyable
+
+  Impl(const Impl&) = delete;
+  Impl& operator=(const Impl&) = delete;
+  Impl(Impl&&)                 = default;
+  Impl& operator=(Impl&&) = default;
+
+  ~Impl()
+  {
+    ReleaseResource();
   }
 
   std::string           mUrl;
@@ -279,8 +288,9 @@ Dali::Devel::PixelBuffer WebPLoading::LoadFrame(uint32_t frameIndex)
       const int32_t imageBufferSize = width * height * sizeof(uint8_t) * channelNumber;
       memcpy(pixelBuffer.GetBuffer(), frameBuffer, imageBufferSize);
       free((void*)frameBuffer);
-      return pixelBuffer;
     }
+    mImpl->ReleaseResource();
+    return pixelBuffer;
   }
 #endif