[MediaPlayer] Support Video and UI sync mode (#3510)
authorHaesu Gwon <haesu.gwon@samsung.com>
Tue, 7 Sep 2021 05:54:58 +0000 (14:54 +0900)
committerGitHub <noreply@github.com>
Tue, 7 Sep 2021 05:54:58 +0000 (14:54 +0900)
src/Tizen.Multimedia.MediaPlayer/Player/Player.Properties.cs
src/Tizen.Multimedia.MediaPlayer/Player/PlayerDisplayType.cs
src/Tizen.Multimedia/Common/Display.cs

index 1a2c2af..81d189a 100644 (file)
@@ -298,6 +298,8 @@ namespace Tizen.Multimedia
 
         private Display _display;
 
+        private bool _uiSync;
+
         private PlayerErrorCode SetDisplay(Display display)
         {
             if (display == null)
@@ -322,7 +324,9 @@ namespace Tizen.Multimedia
         /// <remarks>
         ///     The player must be in the <see cref="PlayerState.Idle"/> state.<br/>
         ///     The raw video feature(http://tizen.org/feature/multimedia.raw_video) is required if
-        ///     the display is created with <see cref="MediaView"/>.
+        ///     the display is created with <see cref="MediaView"/>.<br/>
+        ///     If user want to use video and UI sync mode, please use <see cref="Tizen.Multimedia.Display(NUI.Window, bool)"/>.(Since tizen 6.5)<br/>
+        ///     But in UI sync mode, please note that <see cref="Tizen.Multimedia.Player.DisplaySettings"/> is not supported.
         /// </remarks>
         /// <exception cref="ObjectDisposedException">The player has already been disposed of.</exception>
         /// <exception cref="ArgumentException">The value has already been assigned to another player.</exception>
@@ -354,6 +358,8 @@ namespace Tizen.Multimedia
                     throw new ArgumentException("The display has already been assigned to another.");
                 }
 
+                _uiSync = value.UiSync;
+
                 SetDisplay(value).ThrowIfFailed(this, "Failed to configure display of the player");
 
                 ReplaceDisplay(value);
@@ -375,7 +381,8 @@ namespace Tizen.Multimedia
         {
             Debug.Assert(IsDisposed == false);
 
-            return NativeDisplay.SetEcoreDisplay(Handle, PlayerDisplayType.Overlay, windowHandle);
+            return NativeDisplay.SetEcoreDisplay(Handle,
+                _uiSync ? PlayerDisplayType.OverlayUISync : PlayerDisplayType.Overlay, windowHandle);
         }
         #endregion
 
index bcd2e0c..d3d97e3 100644 (file)
@@ -21,5 +21,6 @@ namespace Tizen.Multimedia
         Overlay,
         Evas = 3,
         None = 4,
+        OverlayUISync = 5
     }
 }
\ No newline at end of file
index 3424027..92100aa 100644 (file)
@@ -137,6 +137,23 @@ namespace Tizen.Multimedia
         /// </remarks>
         /// <since_tizen> 3 </since_tizen>
         public Display(NUI.Window window)
+            : this (window, false)
+        {
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Display"/> class with a <see cref="NUI.Window"/> class.
+        /// </summary>
+        /// <param name="window">A <see cref="NUI.Window"/> to display.</param>
+        /// <param name="uiSync">A value indicates whether video and UI is in sync or not.</param>
+        /// <remarks>
+        /// The <see cref="NUI.Window.BackgroundColor"/> must be <see cref="NUI.Color.Transparent"/>
+        /// for the <see cref="Display"/> to be rendered correctly.<br/>
+        /// UI sync is only for <see cref="T:Tizen.Multimedia.Player"/> and
+        /// <see cref="T:Tizen.Multimedia.Player.DisplaySettings"/> will not work in UI sync mode.
+        /// </remarks>
+        /// <since_tizen> 9 </since_tizen>
+        public Display(NUI.Window window, bool uiSync)
         {
             if (window == null)
             {
@@ -144,6 +161,8 @@ namespace Tizen.Multimedia
             }
 
             _setter = new EcoreDisplaySetter(window.GetNativeWindowHandler());
+
+            UiSync = uiSync;
         }
 
         private EvasObject EvasObject { get; }
@@ -154,6 +173,8 @@ namespace Tizen.Multimedia
 
         internal bool HasMediaView { get; } = false;
 
+        internal bool UiSync { get; } = false;
+
         internal object Owner => _owner;
 
         internal void SetOwner(object newOwner)