diff --git a/media/engine/webrtc_media_engine.cc b/media/engine/webrtc_media_engine.cc index faba9b1d13..5ea99b6e41 100644 --- a/media/engine/webrtc_media_engine.cc +++ b/media/engine/webrtc_media_engine.cc @@ -18,6 +18,7 @@ #include "api/video_codecs/video_decoder_factory.h" #include "api/video_codecs/video_encoder_factory.h" #include "media/engine/webrtc_voice_engine.h" +#include "system_wrappers/include/field_trial.h" #ifdef HAVE_WEBRTC_VIDEO #include "media/engine/webrtc_video_engine.h" @@ -67,6 +68,13 @@ std::unique_ptr WebRtcMediaEngineFactory::Create( } namespace { +// If this FieldTrial is enabled, we will not filter out the abs-send-time +// header extension when the TWCC extensions were also negotiated, but keep +// kAbsSendTimeUri also if kTransportSequenceNumberUri is present. +bool IsKeepAbsSendTimeExtensionFieldTrialEnabled() { + return webrtc::field_trial::IsEnabled("WebRTC-KeepAbsSendTimeExtension"); +} + // Remove mutually exclusive extensions with lower priority. void DiscardRedundantExtensions( std::vector* extensions, @@ -143,14 +151,20 @@ std::vector FilterRtpExtensions( }); result.erase(it, result.end()); - // Keep just the highest priority extension of any in the following list. - static const char* const kBweExtensionPriorities[] = { - webrtc::RtpExtension::kTransportSequenceNumberUri, - webrtc::RtpExtension::kAbsSendTimeUri, - webrtc::RtpExtension::kTimestampOffsetUri}; - DiscardRedundantExtensions(&result, kBweExtensionPriorities); + // Keep just the highest priority extension of any in the following lists. + if (IsKeepAbsSendTimeExtensionFieldTrialEnabled()) { + static const char* const kBweExtensionPriorities[] = { + webrtc::RtpExtension::kAbsSendTimeUri, + webrtc::RtpExtension::kTimestampOffsetUri}; + DiscardRedundantExtensions(&result, kBweExtensionPriorities); + } else { + static const char* const kBweExtensionPriorities[] = { + webrtc::RtpExtension::kTransportSequenceNumberUri, + webrtc::RtpExtension::kAbsSendTimeUri, + webrtc::RtpExtension::kTimestampOffsetUri}; + DiscardRedundantExtensions(&result, kBweExtensionPriorities); + } } - return result; } diff --git a/media/engine/webrtc_media_engine_unittest.cc b/media/engine/webrtc_media_engine_unittest.cc index 0241607f90..19542a97c5 100644 --- a/media/engine/webrtc_media_engine_unittest.cc +++ b/media/engine/webrtc_media_engine_unittest.cc @@ -17,6 +17,7 @@ #include "api/video_codecs/builtin_video_encoder_factory.h" #include "media/engine/webrtc_media_engine.h" #include "modules/audio_processing/include/audio_processing.h" +#include "test/field_trial.h" #include "test/gtest.h" using webrtc::RtpExtension; @@ -198,6 +199,25 @@ TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) { EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri); } +TEST(WebRtcMediaEngineTest, + FilterRtpExtensions_RemoveRedundantBwe_1_KeepAbsSendTime) { + std::vector extensions; + webrtc::test::ScopedFieldTrials override_field_trials_( + "WebRTC-KeepAbsSendTimeExtension/Enabled/"); + extensions.push_back( + RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3)); + extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9)); + extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6)); + extensions.push_back( + RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1)); + extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14)); + std::vector filtered = + FilterRtpExtensions(extensions, SupportedExtensions2, true); + EXPECT_EQ(2u, filtered.size()); + EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri); + EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[1].uri); +} + TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) { std::vector extensions; extensions.push_back( @@ -219,6 +239,31 @@ TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) { EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt); } +TEST(WebRtcMediaEngineTest, + FilterRtpExtensions_RemoveRedundantBweEncrypted_1_KeepAbsSendTime) { + std::vector extensions; + webrtc::test::ScopedFieldTrials override_field_trials_( + "WebRTC-KeepAbsSendTimeExtension/Enabled/"); + extensions.push_back( + RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3)); + extensions.push_back( + RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true)); + extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9)); + extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6)); + extensions.push_back( + RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1)); + extensions.push_back( + RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true)); + extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14)); + std::vector filtered = + FilterRtpExtensions(extensions, SupportedExtensions2, true); + EXPECT_EQ(3u, filtered.size()); + EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri); + EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri); + EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[2].uri); + EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt); +} + TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) { std::vector extensions; extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));