mixedreality/com.microsoft.mixedreality..../Runtime/Scripts/Media/VideoReceiver.cs

93 lines
3.3 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using UnityEngine;
using UnityEngine.Events;
namespace Microsoft.MixedReality.WebRTC.Unity
{
/// <summary>
/// Unity event corresponding to a new video stream being started.
/// </summary>
[Serializable]
public class VideoStreamStartedEvent : UnityEvent<IVideoSource>
{ };
/// <summary>
/// Unity event corresponding to an on-going video stream being stopped.
/// </summary>
[Serializable]
public class VideoStreamStoppedEvent : UnityEvent<IVideoSource>
{ };
/// <summary>
/// Endpoint for a WebRTC remote video track.
/// </summary>
/// <remarks>
/// Setting this on a video <see cref="MediaLine"/> will enable the corresponding transceiver to receive.
/// A remote track will be exposed through <see cref="VideoTrack"/> once a connection is established.
/// The video track can optionally be displayed locally with a <see cref="VideoRenderer"/>.
/// </remarks>
[AddComponentMenu("MixedReality-WebRTC/Video Receiver")]
public class VideoReceiver : MediaReceiver
{
/// <summary>
/// Remote video track receiving data from the remote peer.
///
/// This is <c>null</c> until <see cref="MediaLine.Transceiver"/> is set to a non-null value
/// and a remote track is added to that transceiver.
/// </summary>
public RemoteVideoTrack VideoTrack { get; private set; }
/// <summary>
/// Event raised when the video stream started.
///
/// When this event is raised, the followings are true:
/// - The <see cref="Track"/> property is a valid remote video track.
/// - The <see cref="MediaReceiver.IsLive"/> property is <c>true</c>.
/// </summary>
/// <remarks>
/// This event is raised from the main Unity thread to allow Unity object access.
/// </remarks>
public VideoStreamStartedEvent VideoStreamStarted = new VideoStreamStartedEvent();
/// <summary>
/// Event raised when the video stream stopped.
///
/// When this event is raised, the followings are true:
/// - The <see cref="Track"/> property is <c>null</c>.
/// - The <see cref="MediaReceiver.IsLive"/> property is <c>false</c>.
/// </summary>
/// <remarks>
/// This event is raised from the main Unity thread to allow Unity object access.
/// </remarks>
public VideoStreamStoppedEvent VideoStreamStopped = new VideoStreamStoppedEvent();
/// <inheritdoc/>
public override MediaKind MediaKind => MediaKind.Video;
/// <inheritdoc/>
public override MediaTrack Track => VideoTrack;
/// <inheritdoc/>
protected internal override void OnPaired(MediaTrack track)
{
var remoteVideoTrack = (RemoteVideoTrack)track;
Debug.Assert(VideoTrack == null);
VideoTrack = remoteVideoTrack;
VideoStreamStarted.Invoke(VideoTrack);
}
/// <inheritdoc/>
protected internal override void OnUnpaired(MediaTrack track)
{
Debug.Assert(track is RemoteVideoTrack);
Debug.Assert(VideoTrack == track);
VideoTrack = null;
VideoStreamStopped.Invoke(VideoTrack);
}
}
}