blob: 5d1cdf96350dcf1f858b2572a11fab87f8ca0c28 [file] [log] [blame]
/*
* 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 "webrtc/ortc/testrtpparameters.h"
#include <algorithm>
#include <utility>
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