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.
20 namespace Tizen.Multimedia.Remoting
23 /// Provides the ability to control WebRTC.
25 /// <since_tizen> 9 </since_tizen>
26 public partial class WebRTC
28 private NativeWebRTC.ErrorOccurredCallback _webRtcErrorOccurredCallback;
29 private NativeWebRTC.StateChangedCallback _webRtcStateChangedCallback;
30 private NativeWebRTC.IceGatheringStateChangedCallback _webRtcIceGatheringStateChangedCallback;
31 private NativeWebRTC.SignalingStateChangedCallback _webRtcSignalingStateChangedCallback;
32 private NativeWebRTC.PeerConnectionStateChangedCallback _webRtcPeerConnectionStateChangedCallback;
33 private NativeWebRTC.IceConnectionStateChangedCallback _webRtcIceConnectionStateChangedCallback;
34 private NativeWebRTC.NegotiationNeededCallback _webRtcNegotiationNeededCallback;
35 private NativeWebRTC.IceCandidateCallback _webRtcIceCandidateCallback;
36 private NativeWebRTC.TrackAddedCallback _webRtcTrackAddedCallback;
37 private NativeWebRTC.FrameEncodedCallback _webRtcAudioFrameEncodedCallback;
38 private NativeWebRTC.FrameEncodedCallback _webRtcVideoFrameEncodedCallback;
39 private NativeDataChannel.CreatedCallback _webRtcDataChannelCreatedCallback;
42 /// Occurs when any error occurs.
44 /// <since_tizen> 9 </since_tizen>
45 public event EventHandler<WebRTCErrorOccurredEventArgs> ErrorOccurred;
48 /// Occurs when WebRTC state is changed.
50 /// <since_tizen> 9 </since_tizen>
51 public event EventHandler<WebRTCStateChangedEventArgs> StateChanged;
54 /// Occurs when the WebRTC ICE gathering state is changed.
56 /// <since_tizen> 9 </since_tizen>
57 public event EventHandler<WebRTCIceGatheringStateChangedEventArgs> IceGatheringStateChanged;
60 /// Occurs when the WebRTC signaling state is changed.
62 /// <since_tizen> 9 </since_tizen>
63 public event EventHandler<WebRTCSignalingStateChangedEventArgs> SignalingStateChanged;
66 /// Occurs when the WebRTC peer connection state is changed.
68 /// <since_tizen> 9 </since_tizen>
69 public event EventHandler<WebRTCPeerConnectionStateChangedEventArgs> PeerConnectionStateChanged;
72 /// Occurs when the WebRTC ICE connection state is changed.
74 /// <since_tizen> 9 </since_tizen>
75 public event EventHandler<WebRTCIceConnectionStateChangedEventArgs> IceConnectionStateChanged;
78 /// Occurs when negotiation is needed.
80 /// <since_tizen> 9 </since_tizen>
81 public event EventHandler<EventArgs> NegotiationNeeded;
84 /// Occurs when the WebRTC needs to send the ICE candidate message to the remote peer.
86 /// <since_tizen> 9 </since_tizen>
87 public event EventHandler<WebRTCIceCandidateEventArgs> IceCandidate;
90 /// Occurs when a new track has been added to the WebRTC.
92 /// <since_tizen> 9 </since_tizen>
93 public event EventHandler<WebRTCTrackAddedEventArgs> TrackAdded;
95 private event EventHandler<WebRTCFrameEncodedEventArgs> _audioFrameEncoded;
98 /// Occurs when each audio frame is ready to render.
100 /// <since_tizen> 9 </since_tizen>
101 public event EventHandler<WebRTCFrameEncodedEventArgs> AudioFrameEncoded
105 if (_audioFrameEncoded == null)
107 RegisterAudioFrameEncodedCallback();
110 _audioFrameEncoded += value;
114 _audioFrameEncoded -= value;
116 if (_audioFrameEncoded == null)
118 UnregisterAudioFrameEncodedCallback();
123 private event EventHandler<WebRTCFrameEncodedEventArgs> _videoFrameEncoded;
126 /// Occurs when each video frame is ready to render.
128 /// <since_tizen> 9 </since_tizen>
129 public event EventHandler<WebRTCFrameEncodedEventArgs> VideoFrameEncoded
133 if (_videoFrameEncoded == null)
135 RegisterVideoFrameEncodedCallback();
138 _videoFrameEncoded += value;
142 _videoFrameEncoded -= value;
144 if (_videoFrameEncoded == null)
146 UnregisterVideoFrameEncodedCallback();
152 /// Occurs when the data channel is created to the connection by the remote peer.
154 /// <since_tizen> 9 </since_tizen>
155 public event EventHandler<WebRTCDataChannelEventArgs> DataChannel;
157 private void RegisterEvents()
159 RegisterErrorOccurredCallback();
160 RegisterStateChangedCallback();
161 RegisterIceGatheringStateChangedCallback();
162 RegisterSignalingStateChangedCallback();
163 RegisterPeerConnectionStateChangedCallback();
164 RegisterIceConnectionStateChangedCallback();
165 RegisterNegotiationNeededCallback();
166 RegisterIceCandidateCallback();
167 RegisterTrackAddedCallback();
168 RegisterDataChannelCreatedCallback();
171 private void UnregisterEvents()
173 UnregisterErrorOccurredCallback();
174 UnregisterStateChangedCallback();
175 UnregisterIceGatheringStateChangedCallback();
176 UnregisterSignalingStateChangedCallback();
177 UnregisterPeerConnectionStateChangedCallback();
178 UnregisterIceConnectionStateChangedCallback();
179 UnregisterNegotiationNeededCallback();
180 UnregisterIceCandidateCallback();
181 UnregisterTrackAddedCallback();
182 UnregisterDataChannelCreatedCallback();
185 private void RegisterErrorOccurredCallback()
187 _webRtcErrorOccurredCallback = (handle, error, state, _) =>
189 // Log.Info(WebRTCLog.Tag, $"{error}, {state}");
191 ErrorOccurred?.Invoke(this, new WebRTCErrorOccurredEventArgs((WebRTCError)error, state));
194 NativeWebRTC.SetErrorOccurredCb(Handle, _webRtcErrorOccurredCallback).
195 ThrowIfFailed("Failed to set error occurred callback.");
198 private void UnregisterErrorOccurredCallback()
200 NativeWebRTC.UnsetErrorOccurredCb(Handle).
201 ThrowIfFailed("Failed to unset error occurred callback.");
204 private void RegisterStateChangedCallback()
206 _webRtcStateChangedCallback = (handle, previous, current, _) =>
208 // Log.Info(WebRTCLog.Tag, $"{previous}, {current}");
210 StateChanged?.Invoke(this, new WebRTCStateChangedEventArgs(previous, current));
213 NativeWebRTC.SetStateChangedCb(Handle, _webRtcStateChangedCallback).
214 ThrowIfFailed("Failed to set state changed callback.");
217 private void UnregisterStateChangedCallback()
219 NativeWebRTC.UnsetStateChangedCb(Handle).
220 ThrowIfFailed("Failed to unset state changed callback.");
223 private void RegisterIceGatheringStateChangedCallback()
225 _webRtcIceGatheringStateChangedCallback = (handle, state, _) =>
227 // Log.Info(WebRTCLog.Tag, $"Ice gathering state : {state}");
229 IceGatheringStateChanged?.Invoke(this, new WebRTCIceGatheringStateChangedEventArgs(state));
232 NativeWebRTC.SetIceGatheringStateChangedCb(Handle, _webRtcIceGatheringStateChangedCallback).
233 ThrowIfFailed("Failed to set Ice gathering state changed callback.");
236 private void UnregisterIceGatheringStateChangedCallback()
238 NativeWebRTC.UnsetIceGatheringStateChangedCb(Handle).
239 ThrowIfFailed("Failed to unset Ice gathering state changed callback.");
242 private void RegisterSignalingStateChangedCallback()
244 _webRtcSignalingStateChangedCallback = (handle, state, _) =>
246 // Log.Info(WebRTCLog.Tag, $"Signaling state : {state}");
248 SignalingStateChanged?.Invoke(this, new WebRTCSignalingStateChangedEventArgs(state));
251 NativeWebRTC.SetSignalingStateChangedCb(Handle, _webRtcSignalingStateChangedCallback).
252 ThrowIfFailed("Failed to set signaling state changed callback.");
255 private void UnregisterSignalingStateChangedCallback()
257 NativeWebRTC.UnsetSignalingStateChangedCb(Handle).
258 ThrowIfFailed("Failed to unset signaling state changed callback.");
261 private void RegisterPeerConnectionStateChangedCallback()
263 _webRtcPeerConnectionStateChangedCallback = (handle, state, _) =>
265 Log.Info(WebRTCLog.Tag, $"Peer connection state : {state}");
267 PeerConnectionStateChanged?.Invoke(this, new WebRTCPeerConnectionStateChangedEventArgs(state));
270 NativeWebRTC.SetPeerConnectionStateChangedCb(Handle, _webRtcPeerConnectionStateChangedCallback).
271 ThrowIfFailed("Failed to set peer connection state changed callback.");
274 private void UnregisterPeerConnectionStateChangedCallback()
276 NativeWebRTC.UnsetPeerConnectionStateChangedCb(Handle).
277 ThrowIfFailed("Failed to unset peer connection state changed callback.");
280 private void RegisterIceConnectionStateChangedCallback()
282 _webRtcIceConnectionStateChangedCallback = (handle, state, _) =>
284 // Log.Info(WebRTCLog.Tag, $"Ice connection state : {state}");
286 IceConnectionStateChanged?.Invoke(this, new WebRTCIceConnectionStateChangedEventArgs(state));
289 NativeWebRTC.SetIceConnectionStateChangedCb(Handle, _webRtcIceConnectionStateChangedCallback).
290 ThrowIfFailed("Failed to set ICE connection state changed callback.");
293 private void UnregisterIceConnectionStateChangedCallback()
295 NativeWebRTC.UnsetIceConnectionStateChangedCb(Handle).
296 ThrowIfFailed("Failed to unset ICE connection state changed callback.");
299 private void RegisterNegotiationNeededCallback()
301 _webRtcNegotiationNeededCallback = (handle, _) =>
303 NegotiationNeeded?.Invoke(this, new EventArgs());
306 NativeWebRTC.SetNegotiationNeededCb(Handle, _webRtcNegotiationNeededCallback).
307 ThrowIfFailed("Failed to set negotiation needed callback.");
310 private void UnregisterNegotiationNeededCallback()
312 NativeWebRTC.UnsetNegotiationNeededCb(Handle).
313 ThrowIfFailed("Failed to unset negotiation needed callback.");
316 private void RegisterIceCandidateCallback()
318 _webRtcIceCandidateCallback = (handle, candidate, _) =>
320 IceCandidate?.Invoke(this, new WebRTCIceCandidateEventArgs(candidate));
323 NativeWebRTC.SetIceCandidateCb(Handle, _webRtcIceCandidateCallback).
324 ThrowIfFailed("Failed to set ice candidate callback.");
327 private void UnregisterIceCandidateCallback()
329 NativeWebRTC.UnsetIceCandidateCb(Handle).
330 ThrowIfFailed("Failed to unset ice candidate callback.");
333 private void RegisterTrackAddedCallback()
335 _webRtcTrackAddedCallback = (handle, type, id, _) =>
337 // Log.Info(WebRTCLog.Tag, $"Track type[{type}], id[{id}]");
339 TrackAdded?.Invoke(this, new WebRTCTrackAddedEventArgs(new MediaStreamTrack(this, type, id)));
342 NativeWebRTC.SetTrackAddedCb(Handle, _webRtcTrackAddedCallback).
343 ThrowIfFailed("Failed to set track added callback.");
346 private void UnregisterTrackAddedCallback()
348 NativeWebRTC.UnsetTrackAddedCb(Handle).
349 ThrowIfFailed("Failed to unset track added callback.");
352 private void RegisterAudioFrameEncodedCallback()
354 _webRtcAudioFrameEncodedCallback = (handle, type, id, packet, _) =>
356 // Log.Info(WebRTCLog.Tag, $"Track type[{type}], id[{id}]");
358 _audioFrameEncoded?.Invoke(this,
359 new WebRTCFrameEncodedEventArgs(new MediaStreamTrack(this, type, id), MediaPacket.From(packet)));
362 NativeWebRTC.SetAudioFrameEncodedCb(Handle, _webRtcAudioFrameEncodedCallback).
363 ThrowIfFailed("Failed to set audio frame encoded callback.");
366 private void UnregisterAudioFrameEncodedCallback()
368 NativeWebRTC.UnsetAudioFrameEncodedCb(Handle).
369 ThrowIfFailed("Failed to unset audio frame encoded callback.");
372 private void RegisterVideoFrameEncodedCallback()
374 _webRtcVideoFrameEncodedCallback = (handle, type, id, packet, _) =>
376 // Log.Info(WebRTCLog.Tag, $"Track type[{type}], id[{id}]");
378 _videoFrameEncoded?.Invoke(this,
379 new WebRTCFrameEncodedEventArgs(new MediaStreamTrack(this, type, id), MediaPacket.From(packet)));
382 NativeWebRTC.SetVideoFrameEncodedCb(Handle, _webRtcVideoFrameEncodedCallback).
383 ThrowIfFailed("Failed to set video frame encoded callback.");
386 private void UnregisterVideoFrameEncodedCallback()
388 NativeWebRTC.UnsetVideoFrameEncodedCb(Handle).
389 ThrowIfFailed("Failed to unset video frame encoded callback.");
392 private void RegisterDataChannelCreatedCallback()
394 _webRtcDataChannelCreatedCallback = (handle, dataChannelHandle, _) =>
396 // Log.Debug(WebRTCLog.Tag, "Invoked");
398 DataChannel?.Invoke(this, new WebRTCDataChannelEventArgs(dataChannelHandle));
401 NativeDataChannel.SetCreatedByPeerCb(Handle, _webRtcDataChannelCreatedCallback).
402 ThrowIfFailed("Failed to set data channel created callback.");
405 private void UnregisterDataChannelCreatedCallback()
407 NativeDataChannel.UnsetCreatedByPeerCb(Handle).
408 ThrowIfFailed("Failed to unset data channel created callback.");