123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- using System;
- using System.Linq;
- using System.Collections;
- using System.Collections.Generic;
- using Unity.WebRTC;
- using UnityEngine;
- namespace Unity.RenderStreaming
- {
- /// <summary>
- ///
- /// </summary>
- public abstract class SignalingHandlerBase : MonoBehaviour
- {
- private IRenderStreamingHandler m_handler;
- /// <summary>
- ///
- /// </summary>
- public virtual IEnumerable<Component> Streams => null;
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- public virtual void CreateConnection(string connectionId)
- {
- m_handler.CreateConnection(connectionId);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- public virtual void DeleteConnection(string connectionId)
- {
- m_handler.DeleteConnection(connectionId);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <returns></returns>
- public virtual bool ExistConnection(string connectionId)
- {
- return m_handler.ExistConnection(connectionId);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <returns></returns>
- public virtual bool IsConnected(string connectionId)
- {
- return m_handler.IsConnected(connectionId);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <returns></returns>
- public virtual bool IsStable(string connectionId)
- {
- return m_handler.IsStable(connectionId);
- }
- static RTCRtpTransceiverInit GetTransceiverInit(IStreamSender sender)
- {
- RTCRtpTransceiverInit init = new RTCRtpTransceiverInit()
- {
- direction = RTCRtpTransceiverDirection.SendOnly,
- };
- if (sender is VideoStreamSender videoStreamSender)
- {
- init.sendEncodings = new RTCRtpEncodingParameters[]
- {
- new RTCRtpEncodingParameters()
- {
- active = true,
- minBitrate = (ulong?)videoStreamSender.minBitrate * 1000,
- maxBitrate = (ulong?)videoStreamSender.maxBitrate * 1000,
- maxFramerate = (uint?)videoStreamSender.frameRate,
- scaleResolutionDownBy = videoStreamSender.scaleResolutionDown
- }
- };
- }
- if (sender is AudioStreamSender audioStreamSender)
- {
- init.sendEncodings = new RTCRtpEncodingParameters[]
- {
- new RTCRtpEncodingParameters()
- {
- active = true,
- minBitrate = (ulong?)audioStreamSender.minBitrate * 1000,
- maxBitrate = (ulong?)audioStreamSender.maxBitrate * 1000,
- }
- };
- }
- return init;
- }
- internal static VideoCodecInfo[] GetVideoCodecInfo(IStreamSender sender)
- {
- if (sender is VideoStreamSender videoStreamSender)
- {
- if (videoStreamSender.codec == null)
- return new VideoCodecInfo[] { };
- return new VideoCodecInfo[] { videoStreamSender.codec };
- }
- throw new ArgumentException("sender is not for video streaming.", "sender");
- }
- internal static AudioCodecInfo[] GetAudioCodecInfo(IStreamSender sender)
- {
- if (sender is AudioStreamSender audioStreamSender)
- {
- if (audioStreamSender.codec == null)
- return new AudioCodecInfo[] { };
- return new AudioCodecInfo[] { audioStreamSender.codec };
- }
- throw new ArgumentException("sender is not for audio streaming.", "sender");
- }
- internal static VideoCodecInfo[] GetVideoCodecInfo(IStreamReceiver receiver)
- {
- if (receiver is VideoStreamReceiver videoStreamReceiver)
- {
- if (videoStreamReceiver.codec == null)
- return new VideoCodecInfo[] { };
- return new VideoCodecInfo[] { videoStreamReceiver.codec };
- }
- throw new ArgumentException("receiver is not for video streaming.", "receiver");
- }
- internal static AudioCodecInfo[] GetAudioCodecInfo(IStreamReceiver receiver)
- {
- if (receiver is AudioStreamReceiver audioStreamReceiver)
- {
- if (audioStreamReceiver.codec == null)
- return new AudioCodecInfo[] { };
- return new AudioCodecInfo[] { audioStreamReceiver.codec };
- }
- throw new ArgumentException("receiver is not for audio streaming.", "receiver");
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="sender"></param>
- /// <returns></returns>
- public virtual void AddSender(string connectionId, IStreamSender sender)
- {
- StartCoroutine(AddSenderCoroutine(connectionId, sender));
- }
- private IEnumerator AddSenderCoroutine(string connectionId, IStreamSender sender)
- {
- if(sender.Track == null && sender is StreamSenderBase senderBase)
- {
- var op = senderBase.CreateTrack();
- if(op.Track == null)
- yield return op;
- senderBase.SetTrack(op.Track);
- }
- if (sender.Track == null)
- throw new InvalidOperationException("sender.Track is null");
- RTCRtpTransceiverInit init = GetTransceiverInit(sender);
- var transceiver = m_handler.AddTransceiver(connectionId, sender.Track, init);
- if (sender is VideoStreamSender videoStreamSender)
- {
- var codecs = GetVideoCodecInfo(sender);
- transceiver.SetCodecPreferences(videoStreamSender.SelectCodecCapabilities(codecs).ToArray());
- }
- else if (sender is AudioStreamSender audioStreamSender)
- {
- var codecs = GetAudioCodecInfo(sender);
- transceiver.SetCodecPreferences(audioStreamSender.SelectCodecCapabilities(codecs).ToArray());
- }
- sender.SetTransceiver(connectionId, transceiver);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="sender"></param>
- public virtual void RemoveSender(string connectionId, IStreamSender sender)
- {
- if (ExistConnection(connectionId))
- RemoveTrack(connectionId, sender.Track);
- sender.SetTransceiver(connectionId, null);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="receiver"></param>
- /// <param name="transceiver"></param>
- public virtual void SetReceiver(string connectionId, IStreamReceiver receiver, RTCRtpTransceiver transceiver)
- {
- if (receiver is VideoStreamReceiver videoStreamReceiver)
- {
- var codecs = GetVideoCodecInfo(receiver);
- transceiver.SetCodecPreferences(videoStreamReceiver.SelectCodecCapabilities(codecs).ToArray());
- }
- else if (receiver is AudioStreamReceiver audioStreamReceiver)
- {
- var codecs = GetAudioCodecInfo(receiver);
- transceiver.SetCodecPreferences(audioStreamReceiver.SelectCodecCapabilities(codecs).ToArray());
- }
- receiver.SetTransceiver(connectionId, transceiver);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="receiver"></param>
- public virtual void RemoveReceiver(string connectionId, IStreamReceiver receiver)
- {
- receiver.SetTransceiver(connectionId, null);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="channel"></param>
- public virtual void AddChannel(string connectionId, IDataChannel channel)
- {
- if (channel.IsLocal)
- {
- var _channel = m_handler.CreateChannel(connectionId, channel.Label);
- channel.SetChannel(connectionId, _channel);
- }
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="channel"></param>
- public virtual void RemoveChannel(string connectionId, IDataChannel channel)
- {
- channel.SetChannel(connectionId, null);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="track"></param>
- protected virtual void RemoveTrack(string connectionId, MediaStreamTrack track)
- {
- m_handler.RemoveSenderTrack(connectionId, track);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- public virtual void SendOffer(string connectionId)
- {
- m_handler.SendOffer(connectionId);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- public virtual void SendAnswer(string connectionId)
- {
- m_handler.SendAnswer(connectionId);
- }
- internal void SetHandler(IRenderStreamingHandler handler)
- {
- m_handler = handler;
- }
- }
- /// <summary>
- ///
- /// </summary>
- public delegate void OnStartedStreamHandler(string connectionId);
- /// <summary>
- ///
- /// </summary>
- public delegate void OnStoppedStreamHandler(string connectionId);
- /// <summary>
- ///
- /// </summary>
- public delegate void OnStartedChannelHandler(string connectionId);
- /// <summary>
- ///
- /// </summary>
- public delegate void OnStoppedChannelHandler(string connectionId);
- /// <summary>
- ///
- /// </summary>
- public interface IStreamSender
- {
- /// <summary>
- ///
- /// </summary>
- MediaStreamTrack Track { get; }
- /// <summary>
- ///
- /// </summary>
- IReadOnlyDictionary<string, RTCRtpTransceiver> Transceivers { get; }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="transceiver"></param>
- void SetTransceiver(string connectionId, RTCRtpTransceiver transceiver);
- }
- /// <summary>
- ///
- /// </summary>
- public interface IStreamReceiver
- {
- /// <summary>
- ///
- /// </summary>
- MediaStreamTrack Track { get; }
- /// <summary>
- ///
- /// </summary>
- RTCRtpTransceiver Transceiver { get; }
- /// <summary>
- ///
- /// </summary>
- /// <param name="connectionId"></param>
- /// <param name="transceiver"></param>
- void SetTransceiver(string connectionId, RTCRtpTransceiver transceiver);
- }
- /// <summary>
- ///
- /// </summary>
- public interface IDataChannel
- {
- /// <summary>
- ///
- /// </summary>
- bool IsLocal { get; }
- /// <summary>
- ///
- /// </summary>
- bool IsConnected { get; }
- /// <summary>
- ///
- /// </summary>
- string Label { get; }
- /// <summary>
- ///
- /// </summary>
- RTCDataChannel Channel { get; }
- ///// <summary>
- /////
- ///// </summary>
- ///// <param name="track"></param>
- void SetChannel(string connectionId, RTCDataChannel channel);
- /// <summary>
- ///
- /// </summary>
- /// <param name="data"></param>
- void SetChannel(SignalingEventData data);
- }
- }
|