(Vector) Let DecodedBuffer use correct buffer size + Change ResourceReady under mMutex 95/315395/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Fri, 29 Nov 2024 08:02:24 +0000 (17:02 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 2 Dec 2024 01:48:24 +0000 (10:48 +0900)
It is possible that tbm_surface_h buffer stride is not 4 * width.
To make ensure it, we should use stride value instead 4 * width hardly.

+

Let we change mResourceReady value under right mutex.

We always read-write it under mMutex. But sometimes it could be changed
under mRenderingDataMutex.

So let we ensure that it could be changed under mutex always.

Change-Id: I20e03103c6b362ba4817a633519395d1afd89243
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali-extension/vector-animation-renderer/vector-animation-renderer-tizen.cpp
dali-extension/vector-animation-renderer/vector-animation-renderer-x.cpp

index 8064296565e6832248971039e0aa38b949720473..67ec9eee4fb2848d06c4b9ae7f0012a4bfaace74 100644 (file)
@@ -75,6 +75,8 @@ VectorAnimationRendererTizen::~VectorAnimationRendererTizen()
 bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
 {
   std::shared_ptr<RenderingDataImpl> renderingDataImpl;
+
+  bool resourceChanged = false;
   {
     Dali::Mutex::ScopedLock lock(mRenderingDataMutex);
     if(DALI_LIKELY(!mFinalized))
@@ -84,7 +86,7 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
         mPreviousRenderingData.push_back(mCurrentRenderingData);
         mCurrentRenderingData = std::move(mPreparedRenderingData);
         mPreparedRenderingData.reset();
-        mResourceReady = false;
+        resourceChanged = true;
       }
       renderingDataImpl = std::static_pointer_cast<RenderingDataImpl>(mCurrentRenderingData);
     }
@@ -102,9 +104,14 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
     return false;
   }
 
+  if(resourceChanged)
+  {
+    mResourceReady = false;
+  }
+
   if(mEnableFixedCache)
   {
-    if(mDecodedBuffers.size() < mTotalFrameNumber)
+    if(resourceChanged || mDecodedBuffers.size() < mTotalFrameNumber)
     {
       mDecodedBuffers.clear();
       mDecodedBuffers.resize(mTotalFrameNumber, std::make_pair<std::vector<uint8_t>, bool>(std::vector<uint8_t>(), false));
@@ -189,7 +196,7 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
 
   if(mEnableFixedCache && (frameNumber < mDecodedBuffers.size()) && mDecodedBuffers[frameNumber].second)
   {
-    const int bufferSize = renderingDataImpl->mWidth * renderingDataImpl->mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888);
+    const size_t bufferSize = mDecodedBuffers[frameNumber].first.size();
     memcpy(buffer, &mDecodedBuffers[frameNumber].first[0], bufferSize);
   }
   else
@@ -210,7 +217,7 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
 
     if(mEnableFixedCache && (frameNumber < mDecodedBuffers.size()))
     {
-      const uint32_t       bufferSize = renderingDataImpl->mWidth * renderingDataImpl->mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888);
+      const size_t         bufferSize = renderingDataImpl->mHeight * static_cast<size_t>(info.planes[0].stride);
       std::vector<uint8_t> rasterizeBuffer(buffer, buffer + bufferSize);
       mDecodedBuffers[frameNumber].first  = std::move(rasterizeBuffer);
       mDecodedBuffers[frameNumber].second = true;
index 73f95725bdad8ccc21b01159527f6ba895b51dbd..bf0774048ee52b5b1183007ee760b0a99e8c73f4 100644 (file)
@@ -70,6 +70,8 @@ VectorAnimationRendererX::~VectorAnimationRendererX()
 bool VectorAnimationRendererX::Render(uint32_t frameNumber)
 {
   std::shared_ptr<RenderingDataImpl> renderingDataImpl;
+
+  bool resourceChanged = false;
   {
     Dali::Mutex::ScopedLock lock(mRenderingDataMutex);
     if(DALI_LIKELY(!mFinalized))
@@ -79,7 +81,7 @@ bool VectorAnimationRendererX::Render(uint32_t frameNumber)
         mPreviousRenderingData.push_back(mCurrentRenderingData);
         mCurrentRenderingData = std::move(mPreparedRenderingData);
         mPreparedRenderingData.reset();
-        mResourceReady = false;
+        resourceChanged = true;
       }
       renderingDataImpl = std::static_pointer_cast<RenderingDataImpl>(mCurrentRenderingData);
     }
@@ -97,6 +99,11 @@ bool VectorAnimationRendererX::Render(uint32_t frameNumber)
     return false;
   }
 
+  if(resourceChanged)
+  {
+    mResourceReady = false;
+  }
+
   if(!mVectorRenderer || !renderingDataImpl->mPixelBuffer)
   {
     return false;