예제 #1
0
        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_);
        }
예제 #2
0
        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;
            }
        }
예제 #3
0
        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()
            });
        }
예제 #4
0
        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()
            });
        }