Always send abs-send-time when negotiated and do not filter it out.

Previously, when abs-send-time was negotiated, it was not sent if TWCC
was enabled. With this FieldTrial, abs-send-time header extension is
sent even if TWCC was negotiated in addition to abs-send-time.

Bug: webrtc:10234
Change-Id: I3af85720760882e89760888d43996fe85def619a
Reviewed-on: https://webrtc-review.googlesource.com/c/118936
Commit-Queue: Konrad Hofbauer <hofbauer@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26368}
This commit is contained in:
Konrad Hofbauer
2019-01-23 09:46:58 +01:00
committed by Commit Bot
parent ae6e0b2058
commit b0397d69a9
2 changed files with 66 additions and 7 deletions

View File

@ -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<MediaEngineInterface> 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<webrtc::RtpExtension>* extensions,
@ -143,14 +151,20 @@ std::vector<webrtc::RtpExtension> 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;
}

View File

@ -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<RtpExtension> 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<webrtc::RtpExtension> 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<RtpExtension> 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<RtpExtension> 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<webrtc::RtpExtension> 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<RtpExtension> extensions;
extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));