Example #1
0
        internal void OnRemoteTrackAdded(Client client, IPeerConnection peerConnection, RtpTransceiver transceiver)
        {
            _signallingThread.EnsureCurrentThread();
            Require.NotNull(peerConnection);
            VideoRouterThrowHelper.WhenInvalidReceiver(transceiver);

            // Ignore audio tracks for now
            if (transceiver.Receiver.Track.Kind != MediaKind.Video)
            {
                return;
            }

            // What's the video source that this track should be connected to?
            var transceiverMid = transceiver.Mid;
            var videoSource    = client.VideoSources
                                 .FirstOrDefault(kv => string.Equals(kv.Value.ExpectedTransceiverMid, transceiverMid, StringComparison.InvariantCultureIgnoreCase))
                                 .Value;

            // videoSource could be null when the client doesn't have any input devices,
            // therefore it never calls SetRemoteTransceiverMetadata()
            if (videoSource != null)
            {
                VideoRouterThrowHelper.WhenSourceIsEmpty(videoSource, transceiver.Receiver);

                var remoteVideoLink = new RemoteVideoLink(peerConnection, videoSource, transceiver.Receiver);
                _remoteVideoLinks.AddOrUpdate(remoteVideoLink);
                _logger.Info($"Added {remoteVideoLink} into {_remoteVideoLinks}");
            }
        }
Example #2
0
        internal void OnRemoteTrackRemoved(RtpTransceiver transceiver)
        {
            _signallingThread.EnsureCurrentThread();
            VideoRouterThrowHelper.WhenInvalidReceiver(transceiver);

            _remoteVideoLinks.RemoveByRemoteTrack(transceiver.Receiver);
            _logger.Info($"Removed {transceiver.Receiver} from {_remoteVideoLinks}");
        }