allow dynamic payload types <= 95
extends the range of allowed dynamic payload types by the lower range [35, 63] from https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-1 The upper limit of that range is chosen to avoid the payload types 64 and 65 which may conflict with RTCP as described in https://tools.ietf.org/html/rfc5761#section-4 A killswitch WebRTC-PayloadTypes-Lower-Dynamic-Range is added to allow turning this off should it result in interoperability issues. BUG=webrtc:12194 Change-Id: I7564cc190e4c18cd5b48510a5b6a467c13b0fae4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/195821 Reviewed-by: Erik Språng <sprang@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32790}
This commit is contained in:
committed by
Commit Bot
parent
bb1a28de3c
commit
09ca9a132c
@ -18,6 +18,7 @@
|
||||
#include "rtc_base/logging.h"
|
||||
#include "rtc_base/string_encode.h"
|
||||
#include "rtc_base/strings/string_builder.h"
|
||||
#include "system_wrappers/include/field_trial.h"
|
||||
|
||||
namespace cricket {
|
||||
namespace {
|
||||
@ -143,10 +144,32 @@ bool Codec::operator==(const Codec& c) const {
|
||||
bool Codec::Matches(const Codec& codec) const {
|
||||
// Match the codec id/name based on the typical static/dynamic name rules.
|
||||
// Matching is case-insensitive.
|
||||
const int kMaxStaticPayloadId = 95;
|
||||
return (id <= kMaxStaticPayloadId || codec.id <= kMaxStaticPayloadId)
|
||||
? (id == codec.id)
|
||||
: (absl::EqualsIgnoreCase(name, codec.name));
|
||||
|
||||
// Legacy behaviour with killswitch.
|
||||
if (webrtc::field_trial::IsDisabled(
|
||||
"WebRTC-PayloadTypes-Lower-Dynamic-Range")) {
|
||||
const int kMaxStaticPayloadId = 95;
|
||||
return (id <= kMaxStaticPayloadId || codec.id <= kMaxStaticPayloadId)
|
||||
? (id == codec.id)
|
||||
: (absl::EqualsIgnoreCase(name, codec.name));
|
||||
}
|
||||
// We support the ranges [96, 127] and more recently [35, 65].
|
||||
// https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-1
|
||||
// Within those ranges we match by codec name, outside by codec id.
|
||||
const int kLowerDynamicRangeMin = 35;
|
||||
const int kLowerDynamicRangeMax = 65;
|
||||
const int kUpperDynamicRangeMin = 96;
|
||||
const int kUpperDynamicRangeMax = 127;
|
||||
const bool is_id_in_dynamic_range =
|
||||
(id >= kLowerDynamicRangeMin && id <= kLowerDynamicRangeMax) ||
|
||||
(id >= kUpperDynamicRangeMin && id <= kUpperDynamicRangeMax);
|
||||
const bool is_codec_id_in_dynamic_range =
|
||||
(codec.id >= kLowerDynamicRangeMin &&
|
||||
codec.id <= kLowerDynamicRangeMax) ||
|
||||
(codec.id >= kUpperDynamicRangeMin && codec.id <= kUpperDynamicRangeMax);
|
||||
return is_id_in_dynamic_range && is_codec_id_in_dynamic_range
|
||||
? (absl::EqualsIgnoreCase(name, codec.name))
|
||||
: (id == codec.id);
|
||||
}
|
||||
|
||||
bool Codec::MatchesCapability(
|
||||
|
||||
@ -106,11 +106,12 @@ TEST(CodecTest, TestAudioCodecOperators) {
|
||||
|
||||
TEST(CodecTest, TestAudioCodecMatches) {
|
||||
// Test a codec with a static payload type.
|
||||
AudioCodec c0(95, "A", 44100, 20000, 1);
|
||||
EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 20000, 1)));
|
||||
EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 20000, 0)));
|
||||
EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 0, 0)));
|
||||
EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 0, 0, 0)));
|
||||
AudioCodec c0(34, "A", 44100, 20000, 1);
|
||||
EXPECT_TRUE(c0.Matches(AudioCodec(34, "", 44100, 20000, 1)));
|
||||
EXPECT_TRUE(c0.Matches(AudioCodec(34, "", 44100, 20000, 0)));
|
||||
EXPECT_TRUE(c0.Matches(AudioCodec(34, "", 44100, 0, 0)));
|
||||
EXPECT_TRUE(c0.Matches(AudioCodec(34, "", 0, 0, 0)));
|
||||
EXPECT_FALSE(c0.Matches(AudioCodec(96, "A", 44100, 20000, 1)));
|
||||
EXPECT_FALSE(c0.Matches(AudioCodec(96, "", 44100, 20000, 1)));
|
||||
EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 55100, 20000, 1)));
|
||||
EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 44100, 30000, 1)));
|
||||
@ -123,7 +124,11 @@ TEST(CodecTest, TestAudioCodecMatches) {
|
||||
EXPECT_TRUE(c1.Matches(AudioCodec(97, "A", 0, 0, 0)));
|
||||
EXPECT_TRUE(c1.Matches(AudioCodec(96, "a", 0, 0, 0)));
|
||||
EXPECT_TRUE(c1.Matches(AudioCodec(97, "a", 0, 0, 0)));
|
||||
EXPECT_TRUE(c1.Matches(AudioCodec(35, "a", 0, 0, 0)));
|
||||
EXPECT_TRUE(c1.Matches(AudioCodec(42, "a", 0, 0, 0)));
|
||||
EXPECT_TRUE(c1.Matches(AudioCodec(65, "a", 0, 0, 0)));
|
||||
EXPECT_FALSE(c1.Matches(AudioCodec(95, "A", 0, 0, 0)));
|
||||
EXPECT_FALSE(c1.Matches(AudioCodec(34, "A", 0, 0, 0)));
|
||||
EXPECT_FALSE(c1.Matches(AudioCodec(96, "", 44100, 20000, 2)));
|
||||
EXPECT_FALSE(c1.Matches(AudioCodec(96, "A", 55100, 30000, 1)));
|
||||
|
||||
@ -201,9 +206,10 @@ TEST(CodecTest, TestVideoCodecEqualsWithDifferentPacketization) {
|
||||
|
||||
TEST(CodecTest, TestVideoCodecMatches) {
|
||||
// Test a codec with a static payload type.
|
||||
VideoCodec c0(95, "V");
|
||||
EXPECT_TRUE(c0.Matches(VideoCodec(95, "")));
|
||||
VideoCodec c0(34, "V");
|
||||
EXPECT_TRUE(c0.Matches(VideoCodec(34, "")));
|
||||
EXPECT_FALSE(c0.Matches(VideoCodec(96, "")));
|
||||
EXPECT_FALSE(c0.Matches(VideoCodec(96, "V")));
|
||||
|
||||
// Test a codec with a dynamic payload type.
|
||||
VideoCodec c1(96, "V");
|
||||
@ -211,8 +217,12 @@ TEST(CodecTest, TestVideoCodecMatches) {
|
||||
EXPECT_TRUE(c1.Matches(VideoCodec(97, "V")));
|
||||
EXPECT_TRUE(c1.Matches(VideoCodec(96, "v")));
|
||||
EXPECT_TRUE(c1.Matches(VideoCodec(97, "v")));
|
||||
EXPECT_TRUE(c1.Matches(VideoCodec(35, "v")));
|
||||
EXPECT_TRUE(c1.Matches(VideoCodec(42, "v")));
|
||||
EXPECT_TRUE(c1.Matches(VideoCodec(65, "v")));
|
||||
EXPECT_FALSE(c1.Matches(VideoCodec(96, "")));
|
||||
EXPECT_FALSE(c1.Matches(VideoCodec(95, "V")));
|
||||
EXPECT_FALSE(c1.Matches(VideoCodec(34, "V")));
|
||||
}
|
||||
|
||||
TEST(CodecTest, TestVideoCodecMatchesWithDifferentPacketization) {
|
||||
@ -295,8 +305,9 @@ TEST(CodecTest, TestH264CodecMatches) {
|
||||
|
||||
TEST(CodecTest, TestDataCodecMatches) {
|
||||
// Test a codec with a static payload type.
|
||||
DataCodec c0(95, "D");
|
||||
EXPECT_TRUE(c0.Matches(DataCodec(95, "")));
|
||||
DataCodec c0(34, "D");
|
||||
EXPECT_TRUE(c0.Matches(DataCodec(34, "")));
|
||||
EXPECT_FALSE(c0.Matches(DataCodec(96, "D")));
|
||||
EXPECT_FALSE(c0.Matches(DataCodec(96, "")));
|
||||
|
||||
// Test a codec with a dynamic payload type.
|
||||
@ -305,8 +316,12 @@ TEST(CodecTest, TestDataCodecMatches) {
|
||||
EXPECT_TRUE(c1.Matches(DataCodec(97, "D")));
|
||||
EXPECT_TRUE(c1.Matches(DataCodec(96, "d")));
|
||||
EXPECT_TRUE(c1.Matches(DataCodec(97, "d")));
|
||||
EXPECT_TRUE(c1.Matches(DataCodec(35, "d")));
|
||||
EXPECT_TRUE(c1.Matches(DataCodec(42, "d")));
|
||||
EXPECT_TRUE(c1.Matches(DataCodec(63, "d")));
|
||||
EXPECT_FALSE(c1.Matches(DataCodec(96, "")));
|
||||
EXPECT_FALSE(c1.Matches(DataCodec(95, "D")));
|
||||
EXPECT_FALSE(c1.Matches(DataCodec(34, "D")));
|
||||
}
|
||||
|
||||
TEST(CodecTest, TestSetParamGetParamAndRemoveParam) {
|
||||
|
||||
Reference in New Issue
Block a user