From 910430a92e8daccda0a9e4120645f7f024af1309 Mon Sep 17 00:00:00 2001 From: Seoyeon Kim Date: Mon, 16 Oct 2017 16:13:56 +0900 Subject: [PATCH] [4.0] Added underlay property This reverts commit 66a8491c1cb90c19ee0080c1962a7e51ca3c1fc3. Change-Id: Ic6333bb82117a22c3d937bb8ee2d42403fa8c88e --- .../controls/video-view/video-view-impl.cpp | 104 ++++++++++++++++----- .../internal/controls/video-view/video-view-impl.h | 16 +++- .../public-api/controls/video-view/video-view.h | 11 ++- 3 files changed, 104 insertions(+), 27 deletions(-) diff --git a/dali-toolkit/internal/controls/video-view/video-view-impl.cpp b/dali-toolkit/internal/controls/video-view/video-view-impl.cpp index 2fdb70b..7c26265 100644 --- a/dali-toolkit/internal/controls/video-view/video-view-impl.cpp +++ b/dali-toolkit/internal/controls/video-view/video-view-impl.cpp @@ -62,6 +62,7 @@ DALI_PROPERTY_REGISTRATION( Toolkit, VideoView, "video", MAP, VIDEO ) DALI_PROPERTY_REGISTRATION( Toolkit, VideoView, "looping", BOOLEAN, LOOPING ) DALI_PROPERTY_REGISTRATION( Toolkit, VideoView, "muted", BOOLEAN, MUTED ) DALI_PROPERTY_REGISTRATION( Toolkit, VideoView, "volume", MAP, VOLUME ) +DALI_PROPERTY_REGISTRATION( Toolkit, VideoView, "underlay", BOOLEAN, UNDERLAY ) DALI_SIGNAL_REGISTRATION( Toolkit, VideoView, "finished", FINISHED_SIGNAL ) @@ -75,6 +76,8 @@ DALI_TYPE_REGISTRATION_END() const char* const VOLUME_LEFT( "volumeLeft" ); const char* const VOLUME_RIGHT( "volumeRight" ); + +// 3.0 TC uses RENDERING_TARGET. It should be removed in next release const char* const RENDERING_TARGET( "renderingTarget" ); const char* const WINDOW_SURFACE_TARGET( "windowSurfaceTarget" ); const char* const NATIVE_IMAGE_TARGET( "nativeImageTarget" ); @@ -128,9 +131,9 @@ VideoView::VideoView() mUpdateTriggerPropertyIndex( Property::INVALID_INDEX), mNotification( NULL ), mCurrentVideoPlayPosition( 0 ), - mIsNativeImageTarget( true ), mIsPlay( false ), - mIsPause( false ) + mIsPause( false ), + mIsUnderlay( true ) { mVideoPlayer = Dali::VideoPlayer::New(); @@ -159,14 +162,9 @@ Toolkit::VideoView VideoView::New() void VideoView::OnInitialize() { - Any source; - Dali::NativeImageSourcePtr nativeImageSourcePtr = Dali::NativeImageSource::New( source ); - mNativeImage = Dali::NativeImage::New( *nativeImageSourcePtr ); - - mVideoPlayer.SetRenderingTarget( nativeImageSourcePtr ); - mVideoPlayer.FinishedSignal().Connect( this, &VideoView::EmitSignalFinish ); - mUpdateTriggerPropertyIndex = Self().RegisterProperty( "updateTrigger", true ); + mVideoPlayer.FinishedSignal().Connect( this, &VideoView::EmitSignalFinish ); + SetWindowSurfaceTarget(); } void VideoView::SetUrl( const std::string& url ) @@ -177,10 +175,15 @@ void VideoView::SetUrl( const std::string& url ) mPropertyMap.Clear(); } - if( mIsNativeImageTarget ) + if( !mIsUnderlay ) { Actor self( Self() ); Internal::InitializeVisual( self, mVisual, mNativeImage ); + + if( self.OnStage() ) + { + Toolkit::GetImplementation( mVisual ).SetOnStage( self ); + } } mVideoPlayer.SetUrl( mUrl ); @@ -218,10 +221,12 @@ void VideoView::SetPropertyMap( Property::Map map ) if( target && target->Get( targetType ) && targetType == WINDOW_SURFACE_TARGET ) { + mIsUnderlay = true; this->SetWindowSurfaceTarget(); } else if( target && target->Get( targetType ) && targetType == NATIVE_IMAGE_TARGET ) { + mIsUnderlay = false; this->SetNativeImageTarget(); } @@ -465,6 +470,15 @@ void VideoView::SetProperty( BaseObject* object, Property::Index index, const Pr } break; } + case Toolkit::VideoView::Property::UNDERLAY: + { + bool underlay; + if( value.Get( underlay ) ) + { + impl.SetUnderlay( underlay ); + } + break; + } } } } @@ -513,6 +527,11 @@ Property::Value VideoView::GetProperty( BaseObject* object, Property::Index prop value = map; break; } + case Toolkit::VideoView::Property::UNDERLAY: + { + value = impl.IsUnderlay(); + break; + } } } @@ -609,7 +628,22 @@ void VideoView::SetWindowSurfaceTarget() mVideoPlayer.SetRenderingTarget( Dali::Adaptor::Get().GetNativeWindowHandle() ); mVideoPlayer.SetUrl( mUrl ); - mIsNativeImageTarget = false; + if( !mRenderer ) + { + // For underlay rendering mode, video display area have to be transparent. + Geometry geometry = VisualFactoryCache::CreateQuadGeometry(); + Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); + mRenderer = Renderer::New( geometry, shader ); + + mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON ); + mRenderer.SetProperty( Renderer::Property::BLEND_FACTOR_SRC_RGB, BlendFactor::ONE ); + mRenderer.SetProperty( Renderer::Property::BLEND_FACTOR_DEST_RGB, BlendFactor::ZERO ); + mRenderer.SetProperty( Renderer::Property::BLEND_FACTOR_SRC_ALPHA, BlendFactor::ONE ); + mRenderer.SetProperty( Renderer::Property::BLEND_FACTOR_DEST_ALPHA, BlendFactor::ZERO ); + } + self.AddRenderer( mRenderer ); + + UpdateDisplayArea(); if( mIsPlay ) { @@ -625,22 +659,17 @@ void VideoView::SetWindowSurfaceTarget() { mVideoPlayer.SetPlayPosition( curPos ); } - - // For underlay rendering mode, video display area have to be transparent. - Geometry geometry = VisualFactoryCache::CreateQuadGeometry(); - Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); - Renderer renderer = Renderer::New( geometry, shader ); - - renderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON ); - renderer.SetProperty( Renderer::Property::BLEND_FACTOR_SRC_RGB, BlendFactor::ONE ); - renderer.SetProperty( Renderer::Property::BLEND_FACTOR_DEST_RGB, BlendFactor::ZERO ); - renderer.SetProperty( Renderer::Property::BLEND_FACTOR_SRC_ALPHA, BlendFactor::ONE ); - renderer.SetProperty( Renderer::Property::BLEND_FACTOR_DEST_ALPHA, BlendFactor::ZERO ); - self.AddRenderer( renderer ); } void VideoView::SetNativeImageTarget() { + if( mVideoPlayer.IsVideoTextureSupported() == false ) + { + DALI_LOG_ERROR( "Platform doesn't support decoded video frame images\n" ); + mIsUnderlay = true; + return; + } + Actor self( Self() ); int curPos = mVideoPlayer.GetPlayPosition(); @@ -652,7 +681,7 @@ void VideoView::SetNativeImageTarget() mVideoPlayer.SetUrl( mUrl ); Internal::InitializeVisual( self, mVisual, mNativeImage ); - mIsNativeImageTarget = true; + Self().RemoveRenderer( mRenderer ); if( mIsPlay ) { @@ -672,6 +701,11 @@ void VideoView::SetNativeImageTarget() void VideoView::UpdateDisplayArea() { + if( !mIsUnderlay ) + { + return; + } + Actor self( Self() ); bool positionUsesAnchorPoint = self.GetProperty( DevelActor::Property::POSITION_USES_ANCHOR_POINT ).Get< bool >(); @@ -688,6 +722,28 @@ void VideoView::UpdateDisplayArea() mVideoPlayer.SetDisplayArea( mDisplayArea ); } +void VideoView::SetUnderlay( bool set ) +{ + if( set != mIsUnderlay ) + { + mIsUnderlay = set; + + if( mIsUnderlay ) + { + SetWindowSurfaceTarget(); + } + else + { + SetNativeImageTarget(); + } + } +} + +bool VideoView::IsUnderlay() +{ + return mIsUnderlay; +} + } // namespace Internal } // namespace toolkit diff --git a/dali-toolkit/internal/controls/video-view/video-view-impl.h b/dali-toolkit/internal/controls/video-view/video-view-impl.h index 130d2c2..c8d1415 100644 --- a/dali-toolkit/internal/controls/video-view/video-view-impl.h +++ b/dali-toolkit/internal/controls/video-view/video-view-impl.h @@ -207,11 +207,21 @@ public: */ static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ); - /* + /** * @brief Updates video display area for window rendering target */ void UpdateDisplayArea(); + /** + * @brief Sets underlay flag and initializes new rendering target by flag. + */ + void SetUnderlay( bool set ); + + /** + * @brief Checks underlay flag. + */ + bool IsUnderlay(); + private: // From Control /** @@ -265,14 +275,16 @@ private: Dali::Toolkit::VideoView::VideoViewSignalType mFinishedSignal; std::string mUrl; Dali::DisplayArea mDisplayArea; + Dali::Renderer mRenderer; Property::Index mUpdateTriggerPropertyIndex; TriggerEventInterface* mNotification; int mCurrentVideoPlayPosition; - bool mIsNativeImageTarget; bool mIsPlay; bool mIsPause; + bool mIsUnderlay; + bool mIsRenderer; }; } // namespace Internal diff --git a/dali-toolkit/public-api/controls/video-view/video-view.h b/dali-toolkit/public-api/controls/video-view/video-view.h index d6a9bdf..3e7e2ee 100644 --- a/dali-toolkit/public-api/controls/video-view/video-view.h +++ b/dali-toolkit/public-api/controls/video-view/video-view.h @@ -66,6 +66,8 @@ public: // Signal typedef Signal< void (VideoView&) > VideoViewSignalType; ///< Video playback finished signal type @ SINCE_1_1.38 +public: + /** * @brief Enumeration for the start and end property ranges for this control. * @SINCE_1_0.0 @@ -101,7 +103,14 @@ public: * @brief name "volume", left and right volume scalar as float type, Property::Map with two values ( "left" and "right" ). * @SINCE_1_1.38 */ - VOLUME + VOLUME, + + /** + * @brief name "underlay", Video rendering by underlay, true or false + * This shows video composited underneath the window by the system. This means it may ignore rotation of the video-view + * @SINCE_1_2.62 + */ + UNDERLAY }; }; -- 2.7.4