예제 #1
0
 public WsTransceiverMetadata(TransceiverMetadata other)
 {
     TransceiverMid = other.TransceiverMid;
     Quality        = other.Quality;
     Kind           = other.Kind;
     SourceDeviceId = other.SourceDeviceId == Guid.Empty ? (Guid?)null : other.SourceDeviceId;
 }
예제 #2
0
        public void SetRemoteTransceiverMetadata(TransceiverMetadata transceiverMetadata)
        {
            // Ignore audio tracks for now
            if (transceiverMetadata.Kind != MediaKind.Video)
            {
                return;
            }
            _signallingThread.EnsureCurrentThread();

            // Prepare the source for this quality, if it was not created
            var client      = _clients.GetOrThrow(transceiverMetadata.SourceDeviceId);
            var videoSource = client.VideoSources.ContainsKey(transceiverMetadata.Quality)
                ? client.VideoSources[transceiverMetadata.Quality]
                : null;

            if (null == videoSource)
            {
                videoSource = _clients.CreateVideoSource(transceiverMetadata.SourceDeviceId, transceiverMetadata.Quality);
                videoSource.VideoTrackSource = new PassiveVideoTrackSource();
                videoSource.VideoSinkAdapter = new VideoSinkAdapter(videoSource.VideoTrackSource, false);
                _logger.Info($"Created {videoSource}");
                OnVideoSourceAdded(client, videoSource, transceiverMetadata.Quality);
            }

            // Flag this source to say it should be
            // linked with the provided track
            videoSource.ExpectedTransceiverMid = transceiverMetadata.TransceiverMid;
            _logger.Info($"Associated {videoSource} with transceiver mid {transceiverMetadata.TransceiverMid}");
        }
        public void EnqueueLocalTransceiverMetadata(
            IPeerConnection peerConnection,
            TransceiverMetadata transceiverMetadata)
        {
            if (peerConnection is null)
            {
                throw new ArgumentNullException(nameof(peerConnection));
            }
            if (transceiverMetadata is null)
            {
                throw new ArgumentNullException(nameof(transceiverMetadata));
            }

            _negotiationQueue.Enqueue(new LocalTransceiverMetadataMessage(transceiverMetadata, peerConnection));
        }
예제 #4
0
        public void Handle(IRemoteDevice remoteDevice, TransceiverMetadata metadata)
        {
            // Find the PeerConnection:
            // As the server uses only 1 PeerConnection
            // to send media,
            // the first PeerConnection is alwaus the one this ack is for.
            var peerConnection = remoteDevice.GetCustomData().PeerConnections.FirstOrDefault();

            if (null == peerConnection)
            {
                throw new InvalidOperationException($"Device {remoteDevice} has no PeerConnection - ack what?");
            }


            _negotiationService.EnqueueLocalTransceiverMetadataAck(peerConnection, metadata);
        }
예제 #5
0
 public LocalTransceiverMetadataMessage(TransceiverMetadata transceiverMetadata, IPeerConnection peerConnection)
     : base(peerConnection)
 {
     TransceiverMetadata = transceiverMetadata;
 }
예제 #6
0
 public TransceiverMetadataUpdatedEvent(IPeerConnection peerConnection, TransceiverMetadata transceiverMetadata)
 {
     Require.NotNull(transceiverMetadata);
     PeerConnection      = peerConnection;
     TransceiverMetadata = transceiverMetadata;
 }
 public LocalTransceiverMetadataAckMessage(IPeerConnection peerConnection, TransceiverMetadata transceiverMetadata)
     : base(peerConnection)
 {
     Acked = transceiverMetadata;
 }
 public void EnqueueTransceiverMetadata(TransceiverMetadata transceiverMetadata)
 {
     _ = SendAsync("TransceiverMetadata", new WsTransceiverMetadata(transceiverMetadata));
 }
 public void EnqueueLocalTransceiverMetadataAck(
     IPeerConnection peerConnection,
     TransceiverMetadata transceiverMetadata)
 {
     _negotiationQueue.Enqueue(new LocalTransceiverMetadataAckMessage(peerConnection, transceiverMetadata));
 }