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}"); } }
internal void OnRemoteTrackRemoved(RtpTransceiver transceiver) { _signallingThread.EnsureCurrentThread(); VideoRouterThrowHelper.WhenInvalidReceiver(transceiver); _remoteVideoLinks.RemoveByRemoteTrack(transceiver.Receiver); _logger.Info($"Removed {transceiver.Receiver} from {_remoteVideoLinks}"); }