/* * Copyright 2017 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "ortc/testrtpparameters.h" #include #include namespace webrtc { RtpParameters MakeMinimalOpusParameters() { RtpParameters parameters; RtpCodecParameters opus_codec; opus_codec.name = "opus"; opus_codec.kind = cricket::MEDIA_TYPE_AUDIO; opus_codec.payload_type = 111; opus_codec.clock_rate.emplace(48000); opus_codec.num_channels.emplace(2); parameters.codecs.push_back(std::move(opus_codec)); RtpEncodingParameters encoding; encoding.codec_payload_type.emplace(111); parameters.encodings.push_back(std::move(encoding)); return parameters; } RtpParameters MakeMinimalIsacParameters() { RtpParameters parameters; RtpCodecParameters isac_codec; isac_codec.name = "ISAC"; isac_codec.kind = cricket::MEDIA_TYPE_AUDIO; isac_codec.payload_type = 103; isac_codec.clock_rate.emplace(16000); parameters.codecs.push_back(std::move(isac_codec)); RtpEncodingParameters encoding; encoding.codec_payload_type.emplace(111); parameters.encodings.push_back(std::move(encoding)); return parameters; } RtpParameters MakeMinimalOpusParametersWithSsrc(uint32_t ssrc) { RtpParameters parameters = MakeMinimalOpusParameters(); parameters.encodings[0].ssrc.emplace(ssrc); return parameters; } RtpParameters MakeMinimalIsacParametersWithSsrc(uint32_t ssrc) { RtpParameters parameters = MakeMinimalIsacParameters(); parameters.encodings[0].ssrc.emplace(ssrc); return parameters; } RtpParameters MakeMinimalVideoParameters(const char* codec_name) { RtpParameters parameters; RtpCodecParameters vp8_codec; vp8_codec.name = codec_name; vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO; vp8_codec.payload_type = 96; parameters.codecs.push_back(std::move(vp8_codec)); RtpEncodingParameters encoding; encoding.codec_payload_type.emplace(96); parameters.encodings.push_back(std::move(encoding)); return parameters; } RtpParameters MakeMinimalVp8Parameters() { return MakeMinimalVideoParameters("VP8"); } RtpParameters MakeMinimalVp9Parameters() { return MakeMinimalVideoParameters("VP9"); } RtpParameters MakeMinimalVp8ParametersWithSsrc(uint32_t ssrc) { RtpParameters parameters = MakeMinimalVp8Parameters(); parameters.encodings[0].ssrc.emplace(ssrc); return parameters; } RtpParameters MakeMinimalVp9ParametersWithSsrc(uint32_t ssrc) { RtpParameters parameters = MakeMinimalVp9Parameters(); parameters.encodings[0].ssrc.emplace(ssrc); return parameters; } // Note: Currently, these "WithNoSsrc" methods are identical to the normal // "MakeMinimal" methods, but with the added guarantee that they will never be // changed to include an SSRC. RtpParameters MakeMinimalOpusParametersWithNoSsrc() { RtpParameters parameters = MakeMinimalOpusParameters(); RTC_DCHECK(!parameters.encodings[0].ssrc); return parameters; } RtpParameters MakeMinimalIsacParametersWithNoSsrc() { RtpParameters parameters = MakeMinimalIsacParameters(); RTC_DCHECK(!parameters.encodings[0].ssrc); return parameters; } RtpParameters MakeMinimalVp8ParametersWithNoSsrc() { RtpParameters parameters = MakeMinimalVp8Parameters(); RTC_DCHECK(!parameters.encodings[0].ssrc); return parameters; } RtpParameters MakeMinimalVp9ParametersWithNoSsrc() { RtpParameters parameters = MakeMinimalVp9Parameters(); RTC_DCHECK(!parameters.encodings[0].ssrc); return parameters; } // Make audio parameters with all the available properties configured and // features used, and with multiple codecs offered. Obtained by taking a // snapshot of a default PeerConnection offer (and adding other things, like // bitrate limit). // // See "MakeFullOpusParameters"/"MakeFullIsacParameters" below. RtpParameters MakeFullAudioParameters(int preferred_payload_type) { RtpParameters parameters; RtpCodecParameters opus_codec; opus_codec.name = "opus"; opus_codec.kind = cricket::MEDIA_TYPE_AUDIO; opus_codec.payload_type = 111; opus_codec.clock_rate.emplace(48000); opus_codec.num_channels.emplace(2); opus_codec.parameters["minptime"] = "10"; opus_codec.parameters["useinbandfec"] = "1"; opus_codec.parameters["usedtx"] = "1"; opus_codec.parameters["stereo"] = "1"; opus_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC); parameters.codecs.push_back(std::move(opus_codec)); RtpCodecParameters isac_codec; isac_codec.name = "ISAC"; isac_codec.kind = cricket::MEDIA_TYPE_AUDIO; isac_codec.payload_type = 103; isac_codec.clock_rate.emplace(16000); parameters.codecs.push_back(std::move(isac_codec)); RtpCodecParameters cn_codec; cn_codec.name = "CN"; cn_codec.kind = cricket::MEDIA_TYPE_AUDIO; cn_codec.payload_type = 106; cn_codec.clock_rate.emplace(32000); parameters.codecs.push_back(std::move(cn_codec)); RtpCodecParameters dtmf_codec; dtmf_codec.name = "telephone-event"; dtmf_codec.kind = cricket::MEDIA_TYPE_AUDIO; dtmf_codec.payload_type = 126; dtmf_codec.clock_rate.emplace(8000); parameters.codecs.push_back(std::move(dtmf_codec)); // "codec_payload_type" isn't implemented, so we need to reorder codecs to // cause one to be used. // TODO(deadbeef): Remove this when it becomes unnecessary. auto it = std::find_if(parameters.codecs.begin(), parameters.codecs.end(), [preferred_payload_type](const RtpCodecParameters& p) { return p.payload_type == preferred_payload_type; }); RtpCodecParameters preferred = *it; parameters.codecs.erase(it); parameters.codecs.insert(parameters.codecs.begin(), preferred); // Intentionally leave out SSRC so one's chosen automatically. RtpEncodingParameters encoding; encoding.codec_payload_type.emplace(preferred_payload_type); encoding.dtx.emplace(DtxStatus::ENABLED); // 20 kbps. encoding.max_bitrate_bps.emplace(20000); parameters.encodings.push_back(std::move(encoding)); parameters.header_extensions.emplace_back( "urn:ietf:params:rtp-hdrext:ssrc-audio-level", 1); return parameters; } RtpParameters MakeFullOpusParameters() { return MakeFullAudioParameters(111); } RtpParameters MakeFullIsacParameters() { return MakeFullAudioParameters(103); } // Make video parameters with all the available properties configured and // features used, and with multiple codecs offered. Obtained by taking a // snapshot of a default PeerConnection offer (and adding other things, like // bitrate limit). // // See "MakeFullVp8Parameters"/"MakeFullVp9Parameters" below. RtpParameters MakeFullVideoParameters(int preferred_payload_type) { RtpParameters parameters; RtpCodecParameters vp8_codec; vp8_codec.name = "VP8"; vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO; vp8_codec.payload_type = 100; vp8_codec.clock_rate.emplace(90000); vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM, RtcpFeedbackMessageType::FIR); vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::GENERIC_NACK); vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI); vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::REMB); vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC); parameters.codecs.push_back(std::move(vp8_codec)); RtpCodecParameters vp8_rtx_codec; vp8_rtx_codec.name = "rtx"; vp8_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO; vp8_rtx_codec.payload_type = 96; vp8_rtx_codec.clock_rate.emplace(90000); vp8_rtx_codec.parameters["apt"] = "100"; parameters.codecs.push_back(std::move(vp8_rtx_codec)); RtpCodecParameters vp9_codec; vp9_codec.name = "VP9"; vp9_codec.kind = cricket::MEDIA_TYPE_VIDEO; vp9_codec.payload_type = 101; vp9_codec.clock_rate.emplace(90000); vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM, RtcpFeedbackMessageType::FIR); vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::GENERIC_NACK); vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI); vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::REMB); vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC); parameters.codecs.push_back(std::move(vp9_codec)); RtpCodecParameters vp9_rtx_codec; vp9_rtx_codec.name = "rtx"; vp9_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO; vp9_rtx_codec.payload_type = 97; vp9_rtx_codec.clock_rate.emplace(90000); vp9_rtx_codec.parameters["apt"] = "101"; parameters.codecs.push_back(std::move(vp9_rtx_codec)); RtpCodecParameters red_codec; red_codec.name = "red"; red_codec.kind = cricket::MEDIA_TYPE_VIDEO; red_codec.payload_type = 116; red_codec.clock_rate.emplace(90000); parameters.codecs.push_back(std::move(red_codec)); RtpCodecParameters red_rtx_codec; red_rtx_codec.name = "rtx"; red_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO; red_rtx_codec.payload_type = 98; red_rtx_codec.clock_rate.emplace(90000); red_rtx_codec.parameters["apt"] = "116"; parameters.codecs.push_back(std::move(red_rtx_codec)); RtpCodecParameters ulpfec_codec; ulpfec_codec.name = "ulpfec"; ulpfec_codec.kind = cricket::MEDIA_TYPE_VIDEO; ulpfec_codec.payload_type = 117; ulpfec_codec.clock_rate.emplace(90000); parameters.codecs.push_back(std::move(ulpfec_codec)); // "codec_payload_type" isn't implemented, so we need to reorder codecs to // cause one to be used. // TODO(deadbeef): Remove this when it becomes unnecessary. auto it = std::find_if(parameters.codecs.begin(), parameters.codecs.end(), [preferred_payload_type](const RtpCodecParameters& p) { return p.payload_type == preferred_payload_type; }); RtpCodecParameters preferred = *it; parameters.codecs.erase(it); parameters.codecs.insert(parameters.codecs.begin(), preferred); // Intentionally leave out SSRC so one's chosen automatically. RtpEncodingParameters encoding; encoding.codec_payload_type.emplace(preferred_payload_type); encoding.fec.emplace(FecMechanism::RED_AND_ULPFEC); // Will create default RtxParameters, with unset SSRC. encoding.rtx.emplace(); // 100 kbps. encoding.max_bitrate_bps.emplace(100000); parameters.encodings.push_back(std::move(encoding)); parameters.header_extensions.emplace_back( "urn:ietf:params:rtp-hdrext:toffset", 2); parameters.header_extensions.emplace_back( "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time", 3); parameters.header_extensions.emplace_back("urn:3gpp:video-orientation", 4); parameters.header_extensions.emplace_back( "http://www.ietf.org/id/" "draft-holmer-rmcat-transport-wide-cc-extensions-01", 5); parameters.header_extensions.emplace_back( "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay", 6); return parameters; } RtpParameters MakeFullVp8Parameters() { return MakeFullVideoParameters(100); } RtpParameters MakeFullVp9Parameters() { return MakeFullVideoParameters(101); } } // namespace webrtc