Merge "Resolve memory issues of webp" into devel/master
authorSeungho BAEK <sbsh.baek@samsung.com>
Wed, 10 Nov 2021 04:13:06 +0000 (04:13 +0000)
committerGerrit Code Review <gerrit@review>
Wed, 10 Nov 2021 04:13:06 +0000 (04:13 +0000)
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