public static RTCRtpEncodingParameters ToWebRtc(this RtpEncodingParameters parameters) { RTCRtpEncodingParameters params_ = new() { //Ptime = parameters. Rid = parameters.Rid, }; if (parameters.CodecPayloadType.HasValue) { params_.CodecPayloadType = (byte)parameters.CodecPayloadType; } if (parameters.Dtx.HasValue) { params_.Dtx = (bool)parameters.Dtx ? RTCDtxStatus.Enabled : RTCDtxStatus.Disabled; } if (parameters.MaxBitrate.HasValue) { params_.MaxBitrate = (ulong)parameters.MaxBitrate; } if (parameters.MaxFramerate.HasValue) { params_.MaxFramerate = Convert.ToDouble(parameters.MaxFramerate); } if (parameters.ScaleResolutionDownBy.HasValue) { params_.ScaleResolutionDownBy = Convert.ToDouble(parameters.ScaleResolutionDownBy); } return(params_); }
public void ValidateRtpEncodingParameters(RtpEncodingParameters encoding) { if (encoding.Rtx is not null) { // RTX ssrc is mandatory if rtx is present. if (!encoding.Rtx.Ssrc.HasValue) { throw new Exception("missing encoding.rtx.ssrc"); } } // Dtx is optional. If unset set it to false. if (!encoding.Dtx.HasValue) { encoding.Dtx = false; } }
public RtpParameters GetSendingRemoteRtpParameters(MediaKind kind, ExtendedRtpCapabilities extendedRtpCapabilities) { List <RtpCodecParameters> codecs = new(); foreach (var extendedCodec in extendedRtpCapabilities.Codecs) { if (extendedCodec.Kind != kind) { continue; } RtpCodecParameters codec = new() { MimeType = extendedCodec.MimeType, PayloadType = extendedCodec.LocalPayloadType, ClockRate = extendedCodec.ClockRate, Channels = extendedCodec.Channels, Parameters = extendedCodec.RemoteParameters, RtcpFeedback = extendedCodec.RtcpFeedback }; codecs.Add(codec); if (extendedCodec.LocalRtxPayloadType.HasValue) { RtpCodecParameters rtxCodec = new() { MimeType = $"{extendedCodec.Kind.DisplayName()}/rtx", PayloadType = (int)extendedCodec.LocalRtxPayloadType, ClockRate = extendedCodec.ClockRate, Parameters = new Dictionary <string, object> { { "apt", extendedCodec.LocalPayloadType } }, RtcpFeedback = new RtcpFeedback[] { } }; codecs.Add(rtxCodec); } } List <RtpHeaderExtensionParameters> headerExtensions = new(); foreach (var extendedExtendion in extendedRtpCapabilities.HeaderExtensions) { // Ignore RTP extensions of a different kind and those not valid for sending. if ((extendedExtendion.Kind != kind) || (extendedExtendion.Direction != Direction.SendRecv && extendedExtendion.Direction != Direction.SendOnly)) { continue; } RtpHeaderExtensionParameters ext = new() { Uri = extendedExtendion.Uri, Id = extendedExtendion.SendId, Encrypt = (bool)extendedExtendion.PreferredEncrypt, }; headerExtensions.Add(ext); } // Reduce codecs' RTCP feedback. Use Transport-CC if available, REMB otherwise. if (headerExtensions.Any(ext => ext.Uri == "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01")) { foreach (var codec in codecs) { codec.RtcpFeedback = codec.RtcpFeedback .Where(fb => fb.Type != "goog-remb").ToArray(); } } else if (headerExtensions.Any(ext => ext.Uri == "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time")) { foreach (var codec in codecs) { codec.RtcpFeedback = codec.RtcpFeedback .Where(fb => fb.Type != "transport-cc").ToArray(); } } else { foreach (var codec in codecs) { codec.RtcpFeedback = codec.RtcpFeedback .Where(fb => fb.Type != "transport-cc" && fb.Type != "goog-remb").ToArray(); } } return(new RtpParameters { Codecs = codecs.ToArray(), HeaderExtensions = headerExtensions.ToArray(), Encodings = new RtpEncodingParameters[] { }, Rtcp = new() }); }
public RtpParameters GetSendingRtpParameters(MediaKind kind, ExtendedRtpCapabilities extendedRtpCapabilities) { List <RtpCodecParameters> codecs = new(); foreach (var extendedCodec in extendedRtpCapabilities.Codecs) { if (extendedCodec.Kind != kind) { continue; } RtpCodecParameters codec = new() { MimeType = extendedCodec.MimeType, PayloadType = extendedCodec.LocalPayloadType, ClockRate = extendedCodec.ClockRate, Channels = extendedCodec.Channels, Parameters = extendedCodec.LocalParameters, RtcpFeedback = extendedCodec.RtcpFeedback }; codecs.Add(codec); if (extendedCodec.LocalRtxPayloadType.HasValue) { RtpCodecParameters rtxCodec = new() { MimeType = $"{extendedCodec.Kind.DisplayName()}/rtx", PayloadType = (int)extendedCodec.LocalRtxPayloadType, ClockRate = extendedCodec.ClockRate, Parameters = new Dictionary <string, object> { { "apt", extendedCodec.LocalPayloadType } }, RtcpFeedback = new RtcpFeedback[] { } }; codecs.Add(rtxCodec); } } List <RtpHeaderExtensionParameters> headerExtensions = new(); foreach (var extendedExtendion in extendedRtpCapabilities.HeaderExtensions) { // Ignore RTP extensions of a different kind and those not valid for sending. if ((extendedExtendion.Kind != kind) || (extendedExtendion.Direction != Direction.SendRecv && extendedExtendion.Direction != Direction.SendOnly)) { continue; } RtpHeaderExtensionParameters ext = new() { Uri = extendedExtendion.Uri, Id = extendedExtendion.SendId, Encrypt = (bool)extendedExtendion.PreferredEncrypt, Parameters = new() }; headerExtensions.Add(ext); } return(new RtpParameters { Codecs = codecs.ToArray(), HeaderExtensions = headerExtensions.ToArray(), Encodings = new RtpEncodingParameters[] { }, Rtcp = new() }); }