Always offer transport sequence number header extension for audio
If the extension is negotiated, it will only be used if
the field trial WebRTC-Audio-SendSideBwe is enabled.
This allows simpler experimentation if it should be used or not.
Bug: webrtc:10309 webrtc:10286
Change-Id: I797e6f14c06d46189e40f6d09805c2e09afc015b
Reviewed-on: https://webrtc-review.googlesource.com/c/122542
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Oskar Sundbom <ossu@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26689}
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
index e4ab39a..80ce099 100644
--- a/audio/BUILD.gn
+++ b/audio/BUILD.gn
@@ -149,6 +149,7 @@
"../logging:rtc_event_log_api",
"../modules/audio_device:mock_audio_device",
"../rtc_base:rtc_base_tests_utils",
+ "../test:field_trial",
# For TestAudioDeviceModule
"../modules/audio_device:audio_device_impl",
diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc
index 0c597ed..2e4830c 100644
--- a/audio/audio_send_stream.cc
+++ b/audio/audio_send_stream.cc
@@ -264,8 +264,8 @@
RtcpBandwidthObserver* bandwidth_observer = nullptr;
- if (stream->allocation_settings_.IncludeAudioInFeedback(
- new_ids.transport_sequence_number != 0)) {
+ if (stream->allocation_settings_.ShouldSendTransportSequenceNumber(
+ new_ids.transport_sequence_number)) {
channel_send->EnableSendTransportSequenceNumber(
new_ids.transport_sequence_number);
// Probing in application limited region is only used in combination with
diff --git a/audio/audio_send_stream_tests.cc b/audio/audio_send_stream_tests.cc
index 7deeff3..55de03d 100644
--- a/audio/audio_send_stream_tests.cc
+++ b/audio/audio_send_stream_tests.cc
@@ -9,6 +9,8 @@
*/
#include "test/call_test.h"
+#include "test/constants.h"
+#include "test/field_trial.h"
#include "test/gtest.h"
#include "test/rtcp_packet_parser.h"
@@ -137,42 +139,54 @@
RunBaseTest(&test);
}
-TEST_F(AudioSendStreamCallTest, SupportsTransportWideSequenceNumbers) {
- static const uint8_t kExtensionId = test::kTransportSequenceNumberExtensionId;
- class TransportWideSequenceNumberObserver : public AudioSendTest {
- public:
- TransportWideSequenceNumberObserver() : AudioSendTest() {
- EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
- kRtpExtensionTransportSequenceNumber, kExtensionId));
- }
+class TransportWideSequenceNumberObserver : public AudioSendTest {
+ public:
+ explicit TransportWideSequenceNumberObserver(bool expect_sequence_number)
+ : AudioSendTest(), expect_sequence_number_(expect_sequence_number) {
+ EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
+ kRtpExtensionTransportSequenceNumber,
+ kTransportSequenceNumberExtensionId));
+ }
- private:
- Action OnSendRtp(const uint8_t* packet, size_t length) override {
- RTPHeader header;
- EXPECT_TRUE(parser_->Parse(packet, length, &header));
+ private:
+ Action OnSendRtp(const uint8_t* packet, size_t length) override {
+ RTPHeader header;
+ EXPECT_TRUE(parser_->Parse(packet, length, &header));
- EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
- EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
- EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
+ EXPECT_EQ(header.extension.hasTransportSequenceNumber,
+ expect_sequence_number_);
+ EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
+ EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
- observation_complete_.Set();
+ observation_complete_.Set();
- return SEND_PACKET;
- }
+ return SEND_PACKET;
+ }
- void ModifyAudioConfigs(
- AudioSendStream::Config* send_config,
- std::vector<AudioReceiveStream::Config>* receive_configs) override {
- send_config->rtp.extensions.clear();
- send_config->rtp.extensions.push_back(RtpExtension(
- RtpExtension::kTransportSequenceNumberUri, kExtensionId));
- }
+ void ModifyAudioConfigs(
+ AudioSendStream::Config* send_config,
+ std::vector<AudioReceiveStream::Config>* receive_configs) override {
+ send_config->rtp.extensions.clear();
+ send_config->rtp.extensions.push_back(
+ RtpExtension(RtpExtension::kTransportSequenceNumberUri,
+ kTransportSequenceNumberExtensionId));
+ }
- void PerformTest() override {
- EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
- }
- } test;
+ void PerformTest() override {
+ EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
+ }
+ const bool expect_sequence_number_;
+};
+TEST_F(AudioSendStreamCallTest, SendsTransportWideSequenceNumbersInFieldTrial) {
+ ScopedFieldTrials field_trials("WebRTC-Audio-SendSideBwe/Enabled/");
+ TransportWideSequenceNumberObserver test(/*expect_sequence_number=*/true);
+ RunBaseTest(&test);
+}
+
+TEST_F(AudioSendStreamCallTest,
+ DoesNotSendTransportWideSequenceNumbersPerDefault) {
+ TransportWideSequenceNumberObserver test(/*expect_sequence_number=*/false);
RunBaseTest(&test);
}
diff --git a/audio/audio_send_stream_unittest.cc b/audio/audio_send_stream_unittest.cc
index 70f6c72..e20b031 100644
--- a/audio/audio_send_stream_unittest.cc
+++ b/audio/audio_send_stream_unittest.cc
@@ -28,6 +28,7 @@
#include "modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h"
#include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
#include "rtc_base/task_queue.h"
+#include "test/field_trial.h"
#include "test/gtest.h"
#include "test/mock_audio_encoder.h"
#include "test/mock_audio_encoder_factory.h"
@@ -353,6 +354,7 @@
}
TEST(AudioSendStreamTest, AudioBweCorrectObjectsOnChannelProxy) {
+ ScopedFieldTrials field_trials("WebRTC-Audio-SendSideBwe/Enabled/");
ConfigHelper helper(true, true);
auto send_stream = helper.CreateAudioSendStream();
}
@@ -504,6 +506,7 @@
}
TEST(AudioSendStreamTest, ReconfigureTransportCcResetsFirst) {
+ ScopedFieldTrials field_trials("WebRTC-Audio-SendSideBwe/Enabled/");
ConfigHelper helper(false, true);
auto send_stream = helper.CreateAudioSendStream();
auto new_config = helper.config();
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 07a47d7..a055ae9 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -559,11 +559,8 @@
int id = 1;
capabilities.header_extensions.push_back(
webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, id++));
- if (allocation_settings_.EnableTransportSequenceNumberExtension()) {
- capabilities.header_extensions.push_back(webrtc::RtpExtension(
- webrtc::RtpExtension::kTransportSequenceNumberUri, id++));
- }
-
+ capabilities.header_extensions.push_back(webrtc::RtpExtension(
+ webrtc::RtpExtension::kTransportSequenceNumberUri, id++));
return capabilities;
}
diff --git a/rtc_base/experiments/audio_allocation_settings.cc b/rtc_base/experiments/audio_allocation_settings.cc
index 79c5a0d..a505357 100644
--- a/rtc_base/experiments/audio_allocation_settings.cc
+++ b/rtc_base/experiments/audio_allocation_settings.cc
@@ -65,16 +65,12 @@
return audio_send_side_bwe_;
}
-bool AudioAllocationSettings::EnableTransportSequenceNumberExtension() const {
- // TODO(srte): Update this to be more accurate.
- return audio_send_side_bwe_ && !allocate_audio_without_feedback_;
-}
-
-bool AudioAllocationSettings::IncludeAudioInFeedback(
+bool AudioAllocationSettings::ShouldSendTransportSequenceNumber(
int transport_seq_num_extension_header_id) const {
if (force_no_audio_feedback_)
return false;
- return transport_seq_num_extension_header_id != 0;
+ return audio_send_side_bwe_ && !allocate_audio_without_feedback_ &&
+ transport_seq_num_extension_header_id != 0;
}
bool AudioAllocationSettings::UpdateAudioTargetBitrate(
diff --git a/rtc_base/experiments/audio_allocation_settings.h b/rtc_base/experiments/audio_allocation_settings.h
index bcc0f3e..f05b4a3 100644
--- a/rtc_base/experiments/audio_allocation_settings.h
+++ b/rtc_base/experiments/audio_allocation_settings.h
@@ -27,14 +27,13 @@
bool IgnoreSeqNumIdChange() const;
// Returns true if the bitrate allocation range should be configured.
bool ConfigureRateAllocationRange() const;
- // Returns true if the transport sequence number extension should be enabled.
- bool EnableTransportSequenceNumberExtension() const;
- // Returns true if audio traffic should be included in transport wide feedback
- // packets.
+ // Returns true if sent audio packets should have transport wide sequence
+ // numbers.
// |transport_seq_num_extension_header_id| the extension header id for
// transport sequence numbers. Set to 0 if not the extension is not
// configured.
- bool IncludeAudioInFeedback(int transport_seq_num_extension_header_id) const;
+ bool ShouldSendTransportSequenceNumber(
+ int transport_seq_num_extension_header_id) const;
// Returns true if target bitrate for audio streams should be updated.
// |transport_seq_num_extension_header_id| the extension header id for
// transport sequence numbers. Set to 0 if not the extension is not
diff --git a/video/end_to_end_tests/transport_feedback_tests.cc b/video/end_to_end_tests/transport_feedback_tests.cc
index cc0cb7b..9aacd9a 100644
--- a/video/end_to_end_tests/transport_feedback_tests.cc
+++ b/video/end_to_end_tests/transport_feedback_tests.cc
@@ -316,6 +316,7 @@
}
TEST_F(TransportFeedbackEndToEndTest, AudioReceivesTransportFeedback) {
+ test::ScopedFieldTrials field_trials("WebRTC-Audio-SendSideBwe/Enabled/");
TransportFeedbackTester test(true, 0, 1);
RunBaseTest(&test);
}
@@ -424,6 +425,7 @@
}
TEST_F(TransportFeedbackEndToEndTest, TransportSeqNumOnAudioAndVideo) {
+ test::ScopedFieldTrials field_trials("WebRTC-Audio-SendSideBwe/Enabled/");
static constexpr int kExtensionId = 8;
static constexpr size_t kMinPacketsToWaitFor = 50;
class TransportSequenceNumberTest : public test::EndToEndTest {