From: Wonsik Jung Date: Sun, 7 Mar 2021 21:55:22 +0000 (+0900) Subject: Support the synchronization of window/screen rotation in Video Player. X-Git-Tag: dali_2.0.19~5^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=22ec5ee90486a5cce7091562375abc1ba6ad67af Support the synchronization of window/screen rotation in Video Player. If video player works with underlay mode and window rotation occurs, video player should be rotated with same window rotation angle. Screen rotation is same case, too. This patch is to support that. Change-Id: I6aec7625e3663a5ebdfb6273df3b92cfb60560ed --- diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window-impl.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window-impl.h index 25e0a16..f443251 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window-impl.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window-impl.h @@ -44,6 +44,8 @@ public: virtual ~Window() = default; static Window* New(const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent); FocusChangeSignalType mFocusChangeSignal; + ResizeSignalType mResizeSignal; + int mRotationAngle; DevelWindow::VisibilityChangedSignalType mVisibilityChangedSignal; }; diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp index 9e9ca35..9ab5021 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp @@ -46,6 +46,8 @@ namespace Adaptor Window::Window( const PositionSize& positionSize ) : SceneHolder( positionSize ), mFocusChangeSignal(), + mResizeSignal(), + mRotationAngle(90), // dummy angle for test coverage mVisibilityChangedSignal() { } @@ -160,6 +162,11 @@ FocusChangeSignalType& Window::FocusChangeSignal() return GetImplementation( *this ).mFocusChangeSignal; } +ResizeSignalType& Window::ResizeSignal() +{ + return GetImplementation( *this ).mResizeSignal; +} + Window::KeyEventSignalType& Window::KeyEventSignal() { return GetImplementation( *this ).KeyEventSignal(); @@ -195,6 +202,17 @@ Window DownCast( BaseHandle handle ) return Dali::Window( windowImpl ); } +void SetPositionSize(Window window, PositionSize positionSize) +{ + Uint16Pair newSize(positionSize.width, positionSize.height); + GetImplementation( window ).mResizeSignal.Emit(window,newSize); +} + +int GetPhysicalOrientation(Window window) +{ + return GetImplementation( window ).mRotationAngle; +} + void AddFrameRenderedCallback( Window window, std::unique_ptr< CallbackBase > callback, int32_t frameId ) { CallbackBase::Execute( *callback, frameId ); diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h index 2291139..a696684 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h @@ -47,12 +47,16 @@ class Window; class Window; typedef Signal< void (Window,bool) > FocusChangeSignalType; +typedef Signal< void (Window,Uint16Pair) > ResizeSignalType; class Window : public BaseHandle { public: + using WindowSize = Uint16Pair; + using KeyEventSignalType = Signal< void (const KeyEvent&) >; using TouchEventSignalType = Signal< void (const TouchEvent&) >; + using ResizeSignalType = Signal; static Window New(PositionSize windowPosition, const std::string& name, bool isTransparent = false); static Window New(PositionSize windowPosition, const std::string& name, const std::string& className, bool isTransparent = false); @@ -76,6 +80,7 @@ public: FocusChangeSignalType& FocusChangeSignal(); KeyEventSignalType& KeyEventSignal(); TouchEventSignalType& TouchedSignal(); + ResizeSignalType& ResizeSignal(); public: explicit Window( Internal::Adaptor::Window* window ); @@ -93,6 +98,8 @@ typedef Signal< void ( Window, bool ) > VisibilityChangedSignalType; Dali::Window Get( Actor actor ); Dali::Window DownCast( BaseHandle handle ); +void SetPositionSize(Window window, PositionSize positionSize); +int GetPhysicalOrientation(Window window); void AddFrameRenderedCallback( Window window, std::unique_ptr< CallbackBase > callback, int32_t frameId ); void AddFramePresentedCallback( Window window, std::unique_ptr< CallbackBase > callback, int32_t frameId ); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-VideoView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-VideoView.cpp index b0aa75e..e8adb89 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-VideoView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-VideoView.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include using namespace Dali; @@ -787,3 +788,27 @@ int UtcDaliVideoViewResizeWithSynchronization(void) END_TEST; } + +// For coverage. +int UtcDaliVideoViewSynchronizationForWindowRotation(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliVideoViewSynchronizationForWindowRotation"); + + Window window = Window::New(PositionSize(0,0,100,100) ,"", false); + DALI_TEST_CHECK( window ); + + VideoView view = VideoView::New( true ); + DALI_TEST_CHECK( view ); + + window.Add( view ); + + view.Play(); + + DevelWindow::SetPositionSize(window,PositionSize(0,0,480, 240)); + + application.SendNotification(); + application.Render(); + + END_TEST; +} 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 5608105..7cfa656 100644 --- a/dali-toolkit/internal/controls/video-view/video-view-impl.cpp +++ b/dali-toolkit/internal/controls/video-view/video-view-impl.cpp @@ -577,6 +577,9 @@ void VideoView::SetWindowSurfaceTarget() return; } + Dali::Window window = DevelWindow::Get(self); + window.ResizeSignal().Connect(this, &VideoView::OnWindowResized); + int curPos = mVideoPlayer.GetPlayPosition(); if(mIsPlay) @@ -782,6 +785,17 @@ void VideoView::OnAnimationFinished(Animation& animation) SetFrameRenderCallback(); } +void VideoView::OnWindowResized(Dali::Window winHandle, Dali::Window::WindowSize size) +{ + Dali::VideoPlayerPlugin::DisplayRotation videoAngle = mVideoPlayer.GetDisplayRotation(); + int windowAngle = (DevelWindow::GetPhysicalOrientation(winHandle) / 90); + + if(windowAngle != videoAngle) + { + mVideoPlayer.SetDisplayRotation(static_cast(windowAngle)); + } +} + void VideoView::PlayAnimation(Dali::Animation animation) { if(mIsUnderlay && mSyncMode == Dali::VideoSyncMode::ENABLED) 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 4d76176..363cb9d 100644 --- a/dali-toolkit/internal/controls/video-view/video-view-impl.h +++ b/dali-toolkit/internal/controls/video-view/video-view-impl.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -365,6 +366,15 @@ private: */ void OnAnimationFinished(Dali::Animation& animation); + /* + * @brief window's resize callback function + * This function is called when window is resized. + * + * @param[in] winHandle The resized window's handle. + * @param[in] size The window's new size. + */ + void OnWindowResized(Dali::Window winHandle, Dali::Window::WindowSize size); + private: Dali::VideoPlayer mVideoPlayer; Dali::ImageDimensions mVideoSize;