(AnimatedVectorImageVisual) Render frames based on content's fps 26/200526/3
authorHeeyong Song <heeyong.song@samsung.com>
Tue, 26 Feb 2019 07:34:25 +0000 (16:34 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Thu, 7 Mar 2019 01:27:45 +0000 (10:27 +0900)
Change-Id: Iaa35523eecde1d22a1d2bdcd9ae07dc1e66ee58b

automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp
dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp
dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp
dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h

index 6a42d9c..869bbc2 100755 (executable)
@@ -64,11 +64,16 @@ public:
   {
   }
 
-  uint32_t GetTotalFrameNumber()
+  uint32_t GetTotalFrameNumber() const
   {
     return 5;
   }
 
+  float GetFrameRate() const
+  {
+    return 60.0f;
+  }
+
 public:
 
   std::string mUrl;
@@ -157,10 +162,15 @@ void VectorAnimationRenderer::Render( uint32_t frameNumber )
   Internal::Adaptor::GetImplementation( *this ).Render( frameNumber );
 }
 
-uint32_t VectorAnimationRenderer::GetTotalFrameNumber()
+uint32_t VectorAnimationRenderer::GetTotalFrameNumber() const
 {
   return Internal::Adaptor::GetImplementation( *this ).GetTotalFrameNumber();
 }
 
+float VectorAnimationRenderer::GetFrameRate() const
+{
+  return Internal::Adaptor::GetImplementation( *this ).GetFrameRate();
+}
+
 } // namespace Dali;
 
index 886485b..aed37a2 100644 (file)
@@ -279,7 +279,7 @@ void AnimatedVectorImageVisual::OnDoAction( const Property::Index actionId, cons
   {
     case DevelAnimatedVectorImageVisual::Action::PLAY:
     {
-      if( IsOnStage() )
+      if( IsOnStage() && mVisualSize != Vector2::ZERO )
       {
         mVectorRasterizeThread.PlayAnimation();
 
index 49477ea..a5de71a 100644 (file)
@@ -22,8 +22,8 @@
 #include <dali/devel-api/adaptor-framework/thread-settings.h>
 #include <dali/integration-api/adaptors/adaptor.h>
 #include <dali/integration-api/debug.h>
-
-// INTERNAL INCLUDES
+#include <chrono>
+#include <thread>
 
 namespace Dali
 {
@@ -38,6 +38,7 @@ namespace
 {
 
 constexpr auto LOOP_FOREVER = -1;
+constexpr auto NANOSECONDS_PER_SECOND( 1e+9 );
 
 #if defined(DEBUG_ENABLED)
 Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_VECTOR_ANIMATION" );
@@ -54,7 +55,9 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url )
   mAnimationFinishedTrigger(),
   mPlayRange( 0.0f, 1.0f ),
   mPlayState( DevelImageVisual::PlayState::STOPPED ),
+  mFrameDurationNanoSeconds( 0 ),
   mProgress( 0.0f ),
+  mFrameRate( 60.0f ),
   mCurrentFrame( 0 ),
   mTotalFrame( 0 ),
   mStartFrame( 0 ),
@@ -315,15 +318,16 @@ bool VectorRasterizeThread::StartRender()
 
   mCurrentFrame = std::max( static_cast< uint32_t >( mTotalFrame * mProgress + 0.5f ), mStartFrame );
 
-  DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StartRender: Renderer is started [%d (%d, %d)]\n", mTotalFrame, mStartFrame, mEndFrame );
+  mFrameRate = mVectorRenderer.GetFrameRate();
+  mFrameDurationNanoSeconds = NANOSECONDS_PER_SECOND / mFrameRate;
+
+  DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StartRender: Renderer is started [%d, %f fps]\n", mTotalFrame, mFrameRate );
 
   return true;
 }
 
 void VectorRasterizeThread::Rasterize()
 {
-  DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: [%d]\n", mCurrentFrame );
-
   bool needRender, resourceReady;
 
   {
@@ -332,6 +336,8 @@ void VectorRasterizeThread::Rasterize()
     resourceReady = mResourceReady;
   }
 
+  auto currentFrameStartTime = std::chrono::system_clock::now();
+
   // Rasterize
   mVectorRenderer.Render( mCurrentFrame );
 
@@ -380,6 +386,16 @@ void VectorRasterizeThread::Rasterize()
     mResourceReadyTrigger->Trigger();
     mResourceReady = true;
   }
+
+  auto timeToSleepUntil = currentFrameStartTime + std::chrono::nanoseconds( mFrameDurationNanoSeconds );
+
+#if defined(DEBUG_ENABLED)
+  auto sleepDuration = std::chrono::duration_cast< std::chrono::milliseconds >( timeToSleepUntil - std::chrono::system_clock::now() );
+
+  DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: [current = %d, sleep duration = %lld]\n", mCurrentFrame, sleepDuration.count() );
+#endif
+
+  std::this_thread::sleep_until( timeToSleepUntil );
 }
 
 } // namespace Internal
index afb71b3..3c8879e 100644 (file)
@@ -196,7 +196,9 @@ private:
   std::unique_ptr< EventThreadCallback > mAnimationFinishedTrigger;
   Vector2                     mPlayRange;
   DevelImageVisual::PlayState mPlayState;
+  int64_t                     mFrameDurationNanoSeconds;
   float                       mProgress;
+  float                       mFrameRate;
   uint32_t                    mCurrentFrame;
   uint32_t                    mTotalFrame;
   uint32_t                    mStartFrame;