#include <dali/internal/imaging/common/webp-loading.h>
// EXTERNAL INCLUDES
+#ifdef DALI_WEBP_AVAILABLE
#include <webp/decode.h>
#include <webp/demux.h>
+
+#if WEBP_DEMUX_ABI_VERSION > 0x0101
+#define DALI_WEBP_ENABLED 1
+#endif
+
+#endif
#include <dali/integration-api/debug.h>
#include <dali/public-api/images/pixel-data.h>
{
public:
Impl( const std::string& url, bool isLocalResource )
- : mUrl( url ),
- mLoadingFrame( 0 )
+ : mUrl( url )
{
-#if WEBP_DEMUX_ABI_VERSION > 0x0101
+#ifdef DALI_WEBP_ENABLED
if( ReadWebPInformation( isLocalResource ) )
{
WebPAnimDecoderOptions webPAnimDecoderOptions;
bool ReadWebPInformation( bool isLocalResource )
{
-#if WEBP_DEMUX_ABI_VERSION > 0x0101
+#ifdef DALI_WEBP_ENABLED
WebPDataInit( &mWebPData );
if( isLocalResource )
{
~Impl()
{
-#if WEBP_DEMUX_ABI_VERSION > 0x0101
+#ifdef DALI_WEBP_ENABLED
if( &mWebPData != NULL )
{
free( (void*)mWebPData.bytes );
std::string mUrl;
std::vector<uint32_t> mTimeStamp;
- uint32_t mLoadingFrame;
+ uint32_t mLoadingFrame{0};
-#if WEBP_DEMUX_ABI_VERSION > 0x0101
- WebPData mWebPData;
- WebPAnimDecoder* mWebPAnimDecoder;
- WebPAnimInfo mWebPAnimInfo;
+#ifdef DALI_WEBP_ENABLED
+ WebPData mWebPData{0};
+ WebPAnimDecoder* mWebPAnimDecoder{nullptr};
+ WebPAnimInfo mWebPAnimInfo{0};
#endif
};
AnimatedImageLoadingPtr WebPLoading::New( const std::string &url, bool isLocalResource )
{
-#if WEBP_DEMUX_ABI_VERSION <= 0x0101
- DALI_LOG_ERROR( "The system do not support Animated WebP format.\n" );
+#ifndef DALI_WEBP_ENABLED
+ DALI_LOG_ERROR( "The system does not support Animated WebP format.\n" );
#endif
return AnimatedImageLoadingPtr( new WebPLoading( url, isLocalResource ) );
}
bool WebPLoading::LoadNextNFrames( uint32_t frameStartIndex, int count, std::vector<Dali::PixelData> &pixelData )
{
-#if WEBP_DEMUX_ABI_VERSION > 0x0101
+#ifdef DALI_WEBP_ENABLED
if( frameStartIndex >= mImpl->mWebPAnimInfo.frame_count )
{
return false;
#endif
}
+Dali::Devel::PixelBuffer WebPLoading::LoadFrame( uint32_t frameIndex )
+{
+ Dali::Devel::PixelBuffer pixelBuffer;
+#ifdef DALI_WEBP_ENABLED
+ if( frameIndex >= mImpl->mWebPAnimInfo.frame_count )
+ {
+ return pixelBuffer;
+ }
+
+ DALI_LOG_INFO( gWebPLoadingLogFilter, Debug::Concise, "LoadNextNFrames( frameIndex:%d )\n", frameIndex );
+
+ if( mImpl->mLoadingFrame > frameIndex )
+ {
+ mImpl->mLoadingFrame = 0;
+ WebPAnimDecoderReset( mImpl->mWebPAnimDecoder );
+ }
+
+ for( ; mImpl->mLoadingFrame < frameIndex ; ++mImpl->mLoadingFrame )
+ {
+ uint8_t* frameBuffer;
+ int timestamp;
+ WebPAnimDecoderGetNext( mImpl->mWebPAnimDecoder, &frameBuffer, ×tamp );
+ mImpl->mTimeStamp[mImpl->mLoadingFrame] = timestamp;
+ }
+
+ const int bufferSize = mImpl->mWebPAnimInfo.canvas_width * mImpl->mWebPAnimInfo.canvas_height * sizeof( uint32_t );
+ uint8_t* frameBuffer;
+ int timestamp;
+ WebPAnimDecoderGetNext( mImpl->mWebPAnimDecoder, &frameBuffer, ×tamp );
+
+ pixelBuffer = Dali::Devel::PixelBuffer::New( mImpl->mWebPAnimInfo.canvas_width, mImpl->mWebPAnimInfo.canvas_height, Dali::Pixel::RGBA8888 );
+ memcpy( pixelBuffer.GetBuffer(), frameBuffer, bufferSize );
+ mImpl->mTimeStamp[mImpl->mLoadingFrame] = timestamp;
+
+ mImpl->mLoadingFrame++;
+ if( mImpl->mLoadingFrame >= mImpl->mWebPAnimInfo.frame_count )
+ {
+ mImpl->mLoadingFrame = 0;
+ WebPAnimDecoderReset( mImpl->mWebPAnimDecoder );
+ }
+#endif
+ return pixelBuffer;
+}
+
ImageDimensions WebPLoading::GetImageSize() const
{
-#if WEBP_DEMUX_ABI_VERSION > 0x0101
+#ifdef DALI_WEBP_ENABLED
return ImageDimensions( mImpl->mWebPAnimInfo.canvas_width, mImpl->mWebPAnimInfo.canvas_height );
#else
return ImageDimensions();
uint32_t WebPLoading::GetImageCount() const
{
-#if WEBP_DEMUX_ABI_VERSION > 0x0101
+#ifdef DALI_WEBP_ENABLED
return mImpl->mWebPAnimInfo.frame_count;
#else
return 0u;
}
}
+std::string WebPLoading::GetUrl() const
+{
+ return mImpl->mUrl;
+}
+
} // namespace Adaptor
} // namespace Internal
-} // namespace Dali
\ No newline at end of file
+} // namespace Dali