2 * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Diagnostics;
21 namespace Tizen.Multimedia.Remoting
24 /// Provides the ability to control audio/video track.
26 /// <since_tizen> 9 </since_tizen>
27 public sealed class MediaStreamTrack : IDisplayable<WebRTCErrorCode>
29 private WebRTC _webRtc;
30 private uint _trackId;
31 private Display _display;
33 internal MediaStreamTrack(WebRTC webRtc, MediaType type, uint trackId)
41 /// Gets the the of media stream track.
43 /// <value><see cref="MediaType"/></value>
44 /// <since_tizen> 9 </since_tizen>
45 public MediaType Type { get; }
47 private WebRTCErrorCode SetDisplay(Display display)
48 => display.ApplyTo(this);
50 private void ReplaceDisplay(Display newDisplay)
52 _display?.SetOwner(null);
53 _display = newDisplay;
54 _display?.SetOwner(this);
58 /// Gets or sets the display to show remote video.
60 /// <value>A <see cref="Multimedia.Display"/> that specifies the display.</value>
62 /// If user set video source with <see cref="TransceiverDirection.SendRecv"/>, <see cref="Display"/> must be set.<br/>
63 /// If not, the received video will fill entire screen.<br/>
64 /// If remote track, <see cref="Display"/> must be set in <see cref="WebRTC.TrackAdded"/> event.<br/>
65 /// The display is created with <see cref="MediaView"/>.
67 /// <exception cref="ObjectDisposedException">The WebRTC has already been disposed of.</exception>
68 /// <exception cref="ArgumentException">The value has already been assigned to another WebRTC.</exception>
69 /// <exception cref="InvalidOperationException">
70 /// The WebRTC is not called in <see cref="WebRTC.TrackAdded"/> event.
72 /// This MediaStreamTrack is not Video.
74 /// <since_tizen> 9 </since_tizen>
75 public Display Display
80 if (Type != MediaType.Video)
82 throw new InvalidOperationException("This property is only for video.");
87 throw new ArgumentNullException(nameof(value), "Display cannot be null.");
90 if (value?.Owner != null)
92 if (ReferenceEquals(this, value.Owner))
94 throw new ArgumentException("The display has already been assigned to another.");
99 SetDisplay(value).ThrowIfFailed("Failed to configure display of the MediaStreamTrack");
100 ReplaceDisplay(value);
105 WebRTCErrorCode IDisplayable<WebRTCErrorCode>.ApplyEvasDisplay(DisplayType type, ElmSharp.EvasObject evasObject)
107 Debug.Assert(Enum.IsDefined(typeof(DisplayType), type));
108 Debug.Assert(type != DisplayType.None);
110 return NativeWebRTC.SetDisplay(_webRtc.Handle, _trackId,
111 type == DisplayType.Overlay ? WebRTCDisplayType.Overlay : WebRTCDisplayType.Evas, evasObject);
114 WebRTCErrorCode IDisplayable<WebRTCErrorCode>.ApplyEcoreWindow(IntPtr windowHandle, Rectangle rect, Rotation rotation)
116 return NativeWebRTC.SetEcoreDisplay(_webRtc.Handle, _trackId, windowHandle);
120 /// Gets or sets the display mode.
123 /// This property is meaningful only in overlay or EVAS surface display type.
125 /// <value>A <see cref="WebRTCDisplayMode"/> that specifies the display mode.</value>
126 /// <exception cref="ArgumentException">Display mode type is incorrect.</exception>
127 /// <exception cref="InvalidOperationException"><see cref="Display"/> is not set.</exception>
128 /// <since_tizen> 9 </since_tizen>
129 public WebRTCDisplayMode DisplayMode
133 if (Type != MediaType.Video)
135 throw new InvalidOperationException("This property is only for video.");
138 NativeWebRTC.GetDisplayMode(_webRtc.Handle, _trackId, out var val).
139 ThrowIfFailed("Failed to get WebRTC display mode");
145 if (Type != MediaType.Video)
147 throw new InvalidOperationException("This property is only for video.");
150 ValidationUtil.ValidateEnum(typeof(WebRTCDisplayMode), value, nameof(value));
152 NativeWebRTC.SetDisplayMode(_webRtc.Handle, _trackId, value).
153 ThrowIfFailed("Failed to set WebRTC display mode.");
158 /// Gets or sets the display visibility.
160 /// <value>true if WebRTC display is visible, otherwise false.</value>
162 /// This property is meaningful only in overlay or EVAS surface display type.
164 /// <exception cref="InvalidOperationException"><see cref="Display"/> is not set.</exception>
165 /// <since_tizen> 9 </since_tizen>
166 public bool DisplayVisible
170 if (Type != MediaType.Video)
172 throw new InvalidOperationException("This property is only for video.");
175 NativeWebRTC.GetDisplayVisible(_webRtc.Handle, _trackId, out bool val).
176 ThrowIfFailed("Failed to get visible status");
182 if (Type != MediaType.Video)
184 throw new InvalidOperationException("This property is only for video.");
187 NativeWebRTC.SetDisplayVisible(_webRtc.Handle, _trackId, value).
188 ThrowIfFailed("Failed to set display status.");
193 /// Applies the audio stream policy to remote track.
195 /// <param name="policy">The <see cref="AudioStreamPolicy"/> to apply.</param>
197 /// This must be called in <see cref="WebRTC.TrackAdded"/> event.<br/>
199 /// <see cref="WebRTC"/> does not support all <see cref="AudioStreamType"/>.<br/>
200 /// Supported types are <see cref="AudioStreamType.Media"/>, <see cref="AudioStreamType.Voip"/>,
201 /// <see cref="AudioStreamType.MediaExternalOnly"/>.
203 /// <exception cref="ArgumentNullException"><paramref name="policy"/> is null.</exception>
204 /// <exception cref="InvalidOperationException">
205 /// <see cref="WebRTC.AudioFrameEncoded"/> was set.<br/>
207 /// This method was not called in <see cref="WebRTC.TrackAdded"/> event.
209 /// This MediaStreamTrack is not Audio.
211 /// <exception cref="NotSupportedException">
212 /// <see cref="AudioStreamType"/> of <paramref name="policy"/> is not supported on the current platform.
214 /// <exception cref="ObjectDisposedException">
215 /// The WebRTC has already been disposed.<br/>
217 /// <paramref name="policy"/> has already been disposed.
219 /// <seealso cref="AudioStreamPolicy"/>
220 /// <seealso cref="WebRTC.TrackAdded"/>
221 /// <since_tizen> 9 </since_tizen>
222 public void ApplyAudioStreamPolicy(AudioStreamPolicy policy)
226 throw new ArgumentNullException(nameof(policy));
229 if (Type != MediaType.Audio)
231 throw new InvalidOperationException("Should be applied in Audio");
234 var ret = NativeWebRTC.SetAudioStreamPolicy(_webRtc.Handle, _trackId, policy.Handle);
236 if (ret == WebRTCErrorCode.InvalidArgument)
238 throw new NotSupportedException("The specified policy is not supported on the current system.");
241 ret.ThrowIfFailed("Failed to set the audio stream policy to the WebRTC");