summaryrefslogtreecommitdiff
path: root/chromium/third_party/webrtc/media/engine
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webrtc/media/engine')
-rw-r--r--chromium/third_party/webrtc/media/engine/fake_webrtc_call.cc11
-rw-r--r--chromium/third_party/webrtc/media/engine/fake_webrtc_call.h7
-rw-r--r--chromium/third_party/webrtc/media/engine/internal_decoder_factory.cc2
-rw-r--r--chromium/third_party/webrtc/media/engine/internal_decoder_factory_unittest.cc21
-rw-r--r--chromium/third_party/webrtc/media/engine/payload_type_mapper.cc1
-rw-r--r--chromium/third_party/webrtc/media/engine/payload_type_mapper_unittest.cc1
-rw-r--r--chromium/third_party/webrtc/media/engine/simulcast_encoder_adapter_unittest.cc20
-rw-r--r--chromium/third_party/webrtc/media/engine/webrtc_video_engine.cc15
-rw-r--r--chromium/third_party/webrtc/media/engine/webrtc_video_engine.h4
-rw-r--r--chromium/third_party/webrtc/media/engine/webrtc_video_engine_unittest.cc32
-rw-r--r--chromium/third_party/webrtc/media/engine/webrtc_voice_engine.cc113
-rw-r--r--chromium/third_party/webrtc/media/engine/webrtc_voice_engine_unittest.cc108
12 files changed, 279 insertions, 56 deletions
diff --git a/chromium/third_party/webrtc/media/engine/fake_webrtc_call.cc b/chromium/third_party/webrtc/media/engine/fake_webrtc_call.cc
index 78d4ba41e03..cb62d9fc0a5 100644
--- a/chromium/third_party/webrtc/media/engine/fake_webrtc_call.cc
+++ b/chromium/third_party/webrtc/media/engine/fake_webrtc_call.cc
@@ -279,6 +279,14 @@ void FakeVideoSendStream::Stop() {
sending_ = false;
}
+void FakeVideoSendStream::AddAdaptationResource(
+ rtc::scoped_refptr<webrtc::Resource> resource) {}
+
+std::vector<rtc::scoped_refptr<webrtc::Resource>>
+FakeVideoSendStream::GetAdaptationResources() {
+ return {};
+}
+
void FakeVideoSendStream::SetSource(
rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
const webrtc::DegradationPreference& degradation_preference) {
@@ -570,6 +578,9 @@ void FakeCall::DestroyFlexfecReceiveStream(
}
}
+void FakeCall::AddAdaptationResource(
+ rtc::scoped_refptr<webrtc::Resource> resource) {}
+
webrtc::PacketReceiver* FakeCall::Receiver() {
return this;
}
diff --git a/chromium/third_party/webrtc/media/engine/fake_webrtc_call.h b/chromium/third_party/webrtc/media/engine/fake_webrtc_call.h
index 4404dec5dfc..97eb49c897b 100644
--- a/chromium/third_party/webrtc/media/engine/fake_webrtc_call.h
+++ b/chromium/third_party/webrtc/media/engine/fake_webrtc_call.h
@@ -173,6 +173,10 @@ class FakeVideoSendStream final
const std::vector<bool> active_layers) override;
void Start() override;
void Stop() override;
+ void AddAdaptationResource(
+ rtc::scoped_refptr<webrtc::Resource> resource) override;
+ std::vector<rtc::scoped_refptr<webrtc::Resource>> GetAdaptationResources()
+ override;
void SetSource(
rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
const webrtc::DegradationPreference& degradation_preference) override;
@@ -341,6 +345,9 @@ class FakeCall final : public webrtc::Call, public webrtc::PacketReceiver {
void DestroyFlexfecReceiveStream(
webrtc::FlexfecReceiveStream* receive_stream) override;
+ void AddAdaptationResource(
+ rtc::scoped_refptr<webrtc::Resource> resource) override;
+
webrtc::PacketReceiver* Receiver() override;
DeliveryStatus DeliverPacket(webrtc::MediaType media_type,
diff --git a/chromium/third_party/webrtc/media/engine/internal_decoder_factory.cc b/chromium/third_party/webrtc/media/engine/internal_decoder_factory.cc
index e68bb369b55..d512b731af4 100644
--- a/chromium/third_party/webrtc/media/engine/internal_decoder_factory.cc
+++ b/chromium/third_party/webrtc/media/engine/internal_decoder_factory.cc
@@ -44,7 +44,7 @@ std::vector<SdpVideoFormat> InternalDecoderFactory::GetSupportedFormats()
const {
std::vector<SdpVideoFormat> formats;
formats.push_back(SdpVideoFormat(cricket::kVp8CodecName));
- for (const SdpVideoFormat& format : SupportedVP9Codecs())
+ for (const SdpVideoFormat& format : SupportedVP9DecoderCodecs())
formats.push_back(format);
for (const SdpVideoFormat& h264_format : SupportedH264Codecs())
formats.push_back(h264_format);
diff --git a/chromium/third_party/webrtc/media/engine/internal_decoder_factory_unittest.cc b/chromium/third_party/webrtc/media/engine/internal_decoder_factory_unittest.cc
index 705933d4395..61be5e72dfd 100644
--- a/chromium/third_party/webrtc/media/engine/internal_decoder_factory_unittest.cc
+++ b/chromium/third_party/webrtc/media/engine/internal_decoder_factory_unittest.cc
@@ -13,6 +13,7 @@
#include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_decoder.h"
#include "media/base/media_constants.h"
+#include "media/base/vp9_profile.h"
#include "modules/video_coding/codecs/av1/libaom_av1_decoder.h"
#include "test/gmock.h"
#include "test/gtest.h"
@@ -30,6 +31,26 @@ TEST(InternalDecoderFactory, TestVP8) {
EXPECT_TRUE(decoder);
}
+#ifdef RTC_ENABLE_VP9
+TEST(InternalDecoderFactory, TestVP9Profile0) {
+ InternalDecoderFactory factory;
+ std::unique_ptr<VideoDecoder> decoder =
+ factory.CreateVideoDecoder(SdpVideoFormat(
+ cricket::kVp9CodecName,
+ {{kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}}));
+ EXPECT_TRUE(decoder);
+}
+
+TEST(InternalDecoderFactory, TestVP9Profile1) {
+ InternalDecoderFactory factory;
+ std::unique_ptr<VideoDecoder> decoder =
+ factory.CreateVideoDecoder(SdpVideoFormat(
+ cricket::kVp9CodecName,
+ {{kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile1)}}));
+ EXPECT_TRUE(decoder);
+}
+#endif // RTC_ENABLE_VP9
+
TEST(InternalDecoderFactory, Av1) {
InternalDecoderFactory factory;
if (kIsLibaomAv1DecoderSupported) {
diff --git a/chromium/third_party/webrtc/media/engine/payload_type_mapper.cc b/chromium/third_party/webrtc/media/engine/payload_type_mapper.cc
index fcacd448839..e9f863ca638 100644
--- a/chromium/third_party/webrtc/media/engine/payload_type_mapper.cc
+++ b/chromium/third_party/webrtc/media/engine/payload_type_mapper.cc
@@ -67,7 +67,6 @@ PayloadTypeMapper::PayloadTypeMapper()
{{kIsacCodecName, 32000, 1}, 104},
{{kCnCodecName, 16000, 1}, 105},
{{kCnCodecName, 32000, 1}, 106},
- {{kGoogleSctpDataCodecName, 0, 0}, kGoogleSctpDataCodecPlType},
{{kOpusCodecName,
48000,
2,
diff --git a/chromium/third_party/webrtc/media/engine/payload_type_mapper_unittest.cc b/chromium/third_party/webrtc/media/engine/payload_type_mapper_unittest.cc
index c8b2234c25e..fa6864b48aa 100644
--- a/chromium/third_party/webrtc/media/engine/payload_type_mapper_unittest.cc
+++ b/chromium/third_party/webrtc/media/engine/payload_type_mapper_unittest.cc
@@ -52,7 +52,6 @@ TEST_F(PayloadTypeMapperTest, WebRTCPayloadTypes) {
return mapper_.FindMappingFor({name, 0, 0});
};
EXPECT_EQ(kGoogleRtpDataCodecPlType, data_mapping(kGoogleRtpDataCodecName));
- EXPECT_EQ(kGoogleSctpDataCodecPlType, data_mapping(kGoogleSctpDataCodecName));
EXPECT_EQ(102, mapper_.FindMappingFor({kIlbcCodecName, 8000, 1}));
EXPECT_EQ(103, mapper_.FindMappingFor({kIsacCodecName, 16000, 1}));
diff --git a/chromium/third_party/webrtc/media/engine/simulcast_encoder_adapter_unittest.cc b/chromium/third_party/webrtc/media/engine/simulcast_encoder_adapter_unittest.cc
index b467c49166c..075cb83ee93 100644
--- a/chromium/third_party/webrtc/media/engine/simulcast_encoder_adapter_unittest.cc
+++ b/chromium/third_party/webrtc/media/engine/simulcast_encoder_adapter_unittest.cc
@@ -199,8 +199,10 @@ class MockVideoEncoder : public VideoEncoder {
video_format_("unknown"),
callback_(nullptr) {}
- MOCK_METHOD1(SetFecControllerOverride,
- void(FecControllerOverride* fec_controller_override));
+ MOCK_METHOD(void,
+ SetFecControllerOverride,
+ (FecControllerOverride * fec_controller_override),
+ (override));
// TODO(nisse): Valid overrides commented out, because the gmock
// methods don't use any override declarations, and we want to avoid
@@ -212,10 +214,11 @@ class MockVideoEncoder : public VideoEncoder {
return init_encode_return_value_;
}
- MOCK_METHOD2(
- Encode,
- int32_t(const VideoFrame& inputImage,
- const std::vector<VideoFrameType>* frame_types) /* override */);
+ MOCK_METHOD(int32_t,
+ Encode,
+ (const VideoFrame& inputImage,
+ const std::vector<VideoFrameType>* frame_types),
+ (override));
int32_t RegisterEncodeCompleteCallback(
EncodedImageCallback* callback) override {
@@ -223,7 +226,7 @@ class MockVideoEncoder : public VideoEncoder {
return 0;
}
- MOCK_METHOD0(Release, int32_t() /* override */);
+ MOCK_METHOD(int32_t, Release, (), (override));
void SetRates(const RateControlParameters& parameters) {
last_set_rates_ = parameters;
@@ -334,8 +337,7 @@ std::vector<SdpVideoFormat> MockVideoEncoderFactory::GetSupportedFormats()
std::unique_ptr<VideoEncoder> MockVideoEncoderFactory::CreateVideoEncoder(
const SdpVideoFormat& format) {
- std::unique_ptr<MockVideoEncoder> encoder(
- new ::testing::NiceMock<MockVideoEncoder>(this));
+ auto encoder = std::make_unique<::testing::NiceMock<MockVideoEncoder>>(this);
encoder->set_init_encode_return_value(init_encode_return_value_);
const char* encoder_name = encoder_names_.empty()
? "codec_implementation_name"
diff --git a/chromium/third_party/webrtc/media/engine/webrtc_video_engine.cc b/chromium/third_party/webrtc/media/engine/webrtc_video_engine.cc
index 3976a6a1c50..a7eff62b16c 100644
--- a/chromium/third_party/webrtc/media/engine/webrtc_video_engine.cc
+++ b/chromium/third_party/webrtc/media/engine/webrtc_video_engine.cc
@@ -20,7 +20,6 @@
#include "absl/algorithm/container.h"
#include "absl/strings/match.h"
#include "api/media_stream_interface.h"
-#include "api/transport/datagram_transport_interface.h"
#include "api/units/data_rate.h"
#include "api/video/video_codec_constants.h"
#include "api/video/video_codec_type.h"
@@ -609,7 +608,6 @@ WebRtcVideoEngine::GetRtpHeaderExtensions() const {
webrtc::RtpExtension::kPlayoutDelayUri,
webrtc::RtpExtension::kVideoContentTypeUri,
webrtc::RtpExtension::kVideoTimingUri,
- webrtc::RtpExtension::kFrameMarkingUri,
webrtc::RtpExtension::kColorSpaceUri, webrtc::RtpExtension::kMidUri,
webrtc::RtpExtension::kRidUri, webrtc::RtpExtension::kRepairedRidUri}) {
result.emplace_back(uri, id++, webrtc::RtpTransceiverDirection::kSendRecv);
@@ -1299,13 +1297,6 @@ bool WebRtcVideoChannel::AddSendStream(const StreamParams& sp) {
config.rtp.extmap_allow_mixed = ExtmapAllowMixed();
config.rtcp_report_interval_ms = video_config_.rtcp_report_interval_ms;
- // If sending through Datagram Transport, limit packet size to maximum
- // packet size supported by datagram_transport.
- if (media_transport_config().rtp_max_packet_size) {
- config.rtp.max_packet_size =
- media_transport_config().rtp_max_packet_size.value();
- }
-
WebRtcVideoSendStream* stream = new WebRtcVideoSendStream(
call_, sp, std::move(config), default_send_options_,
video_config_.enable_cpu_adaptation, bitrate_config_.max_bitrate_bps,
@@ -1759,11 +1750,9 @@ void WebRtcVideoChannel::OnNetworkRouteChanged(
network_route.packet_overhead);
}
-void WebRtcVideoChannel::SetInterface(
- NetworkInterface* iface,
- const webrtc::MediaTransportConfig& media_transport_config) {
+void WebRtcVideoChannel::SetInterface(NetworkInterface* iface) {
RTC_DCHECK_RUN_ON(&thread_checker_);
- MediaChannel::SetInterface(iface, media_transport_config);
+ MediaChannel::SetInterface(iface);
// Set the RTP recv/send buffer to a bigger size.
// The group should be a positive integer with an explicit size, in
diff --git a/chromium/third_party/webrtc/media/engine/webrtc_video_engine.h b/chromium/third_party/webrtc/media/engine/webrtc_video_engine.h
index 00d249541a3..126abfd2905 100644
--- a/chromium/third_party/webrtc/media/engine/webrtc_video_engine.h
+++ b/chromium/third_party/webrtc/media/engine/webrtc_video_engine.h
@@ -169,9 +169,7 @@ class WebRtcVideoChannel : public VideoMediaChannel,
void OnReadyToSend(bool ready) override;
void OnNetworkRouteChanged(const std::string& transport_name,
const rtc::NetworkRoute& network_route) override;
- void SetInterface(
- NetworkInterface* iface,
- const webrtc::MediaTransportConfig& media_transport_config) override;
+ void SetInterface(NetworkInterface* iface) override;
// E2E Encrypted Video Frame API
// Set a frame decryptor to a particular ssrc that will intercept all
diff --git a/chromium/third_party/webrtc/media/engine/webrtc_video_engine_unittest.cc b/chromium/third_party/webrtc/media/engine/webrtc_video_engine_unittest.cc
index ae6f15d8af4..eae83938d4f 100644
--- a/chromium/third_party/webrtc/media/engine/webrtc_video_engine_unittest.cc
+++ b/chromium/third_party/webrtc/media/engine/webrtc_video_engine_unittest.cc
@@ -28,7 +28,6 @@
#include "api/test/mock_video_encoder_factory.h"
#include "api/test/video/function_video_decoder_factory.h"
#include "api/transport/field_trial_based_config.h"
-#include "api/transport/media/media_transport_config.h"
#include "api/units/time_delta.h"
#include "api/video/builtin_video_bitrate_allocator_factory.h"
#include "api/video/i420_buffer.h"
@@ -209,11 +208,15 @@ int GetMaxDefaultBitrateBps(size_t width, size_t height) {
class MockVideoSource : public rtc::VideoSourceInterface<webrtc::VideoFrame> {
public:
- MOCK_METHOD2(AddOrUpdateSink,
- void(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
- const rtc::VideoSinkWants& wants));
- MOCK_METHOD1(RemoveSink,
- void(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink));
+ MOCK_METHOD(void,
+ AddOrUpdateSink,
+ (rtc::VideoSinkInterface<webrtc::VideoFrame> * sink,
+ const rtc::VideoSinkWants& wants),
+ (override));
+ MOCK_METHOD(void,
+ RemoveSink,
+ (rtc::VideoSinkInterface<webrtc::VideoFrame> * sink),
+ (override));
};
} // namespace
@@ -343,10 +346,6 @@ TEST_F(WebRtcVideoEngineTest, SupportsVideoTimingHeaderExtension) {
ExpectRtpCapabilitySupport(RtpExtension::kVideoTimingUri, true);
}
-TEST_F(WebRtcVideoEngineTest, SupportsFrameMarkingHeaderExtension) {
- ExpectRtpCapabilitySupport(RtpExtension::kFrameMarkingUri, true);
-}
-
TEST_F(WebRtcVideoEngineTest, SupportsColorSpaceHeaderExtension) {
ExpectRtpCapabilitySupport(RtpExtension::kColorSpaceUri, true);
}
@@ -1335,7 +1334,7 @@ class WebRtcVideoChannelEncodedFrameCallbackTest : public ::testing::Test {
webrtc::CryptoOptions(),
video_bitrate_allocator_factory_.get())))) {
network_interface_.SetDestination(channel_.get());
- channel_->SetInterface(&network_interface_, webrtc::MediaTransportConfig());
+ channel_->SetInterface(&network_interface_);
cricket::VideoRecvParameters parameters;
parameters.codecs = engine_.recv_codecs();
channel_->SetRecvParameters(parameters);
@@ -1481,7 +1480,7 @@ class WebRtcVideoChannelBaseTest : public ::testing::Test {
channel_->OnReadyToSend(true);
EXPECT_TRUE(channel_.get() != NULL);
network_interface_.SetDestination(channel_.get());
- channel_->SetInterface(&network_interface_, webrtc::MediaTransportConfig());
+ channel_->SetInterface(&network_interface_);
cricket::VideoRecvParameters parameters;
parameters.codecs = engine_.send_codecs();
channel_->SetRecvParameters(parameters);
@@ -5064,8 +5063,7 @@ TEST_F(WebRtcVideoChannelTest, TestSetDscpOptions) {
static_cast<cricket::WebRtcVideoChannel*>(engine_.CreateMediaChannel(
call_.get(), config, VideoOptions(), webrtc::CryptoOptions(),
video_bitrate_allocator_factory_.get())));
- channel->SetInterface(network_interface.get(),
- webrtc::MediaTransportConfig());
+ channel->SetInterface(network_interface.get());
// Default value when DSCP is disabled should be DSCP_DEFAULT.
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
@@ -5076,8 +5074,7 @@ TEST_F(WebRtcVideoChannelTest, TestSetDscpOptions) {
static_cast<cricket::WebRtcVideoChannel*>(engine_.CreateMediaChannel(
call_.get(), config, VideoOptions(), webrtc::CryptoOptions(),
video_bitrate_allocator_factory_.get())));
- channel->SetInterface(network_interface.get(),
- webrtc::MediaTransportConfig());
+ channel->SetInterface(network_interface.get());
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
// Create a send stream to configure
@@ -5106,8 +5103,7 @@ TEST_F(WebRtcVideoChannelTest, TestSetDscpOptions) {
static_cast<cricket::WebRtcVideoChannel*>(engine_.CreateMediaChannel(
call_.get(), config, VideoOptions(), webrtc::CryptoOptions(),
video_bitrate_allocator_factory_.get())));
- channel->SetInterface(network_interface.get(),
- webrtc::MediaTransportConfig());
+ channel->SetInterface(network_interface.get());
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
}
diff --git a/chromium/third_party/webrtc/media/engine/webrtc_voice_engine.cc b/chromium/third_party/webrtc/media/engine/webrtc_voice_engine.cc
index 85c72804c15..38dc3462ace 100644
--- a/chromium/third_party/webrtc/media/engine/webrtc_voice_engine.cc
+++ b/chromium/third_party/webrtc/media/engine/webrtc_voice_engine.cc
@@ -36,7 +36,9 @@
#include "rtc_base/constructor_magic.h"
#include "rtc_base/experiments/field_trial_parser.h"
#include "rtc_base/experiments/field_trial_units.h"
+#include "rtc_base/experiments/struct_parameters_parser.h"
#include "rtc_base/helpers.h"
+#include "rtc_base/ignore_wundef.h"
#include "rtc_base/logging.h"
#include "rtc_base/race_checker.h"
#include "rtc_base/strings/audio_format_to_string.h"
@@ -46,6 +48,16 @@
#include "system_wrappers/include/field_trial.h"
#include "system_wrappers/include/metrics.h"
+#if WEBRTC_ENABLE_PROTOBUF
+RTC_PUSH_IGNORING_WUNDEF()
+#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
+#include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
+#else
+#include "modules/audio_coding/audio_network_adaptor/config.pb.h"
+#endif
+RTC_POP_IGNORING_WUNDEF()
+#endif
+
namespace cricket {
namespace {
@@ -99,6 +111,12 @@ std::string ToString(const AudioCodec& codec) {
return ss.Release();
}
+// If this field trial is enabled, we will negotiate and use RFC 2198
+// redundancy for opus audio.
+bool IsAudioRedForOpusFieldTrialEnabled() {
+ return webrtc::field_trial::IsEnabled("WebRTC-Audio-Red-For-Opus");
+}
+
bool IsCodec(const AudioCodec& codec, const char* ref_name) {
return absl::EqualsIgnoreCase(codec.name, ref_name);
}
@@ -185,6 +203,38 @@ absl::optional<int> ComputeSendBitrate(int max_send_bitrate_bps,
}
}
+struct AdaptivePtimeConfig {
+ bool enabled = false;
+ webrtc::DataRate min_payload_bitrate = webrtc::DataRate::KilobitsPerSec(16);
+ webrtc::DataRate min_encoder_bitrate = webrtc::DataRate::KilobitsPerSec(12);
+ bool use_slow_adaptation = true;
+
+ absl::optional<std::string> audio_network_adaptor_config;
+
+ std::unique_ptr<webrtc::StructParametersParser> Parser() {
+ return webrtc::StructParametersParser::Create( //
+ "enabled", &enabled, //
+ "min_payload_bitrate", &min_payload_bitrate, //
+ "min_encoder_bitrate", &min_encoder_bitrate, //
+ "use_slow_adaptation", &use_slow_adaptation);
+ }
+
+ AdaptivePtimeConfig() {
+ Parser()->Parse(
+ webrtc::field_trial::FindFullName("WebRTC-Audio-AdaptivePtime"));
+#if WEBRTC_ENABLE_PROTOBUF
+ webrtc::audio_network_adaptor::config::ControllerManager config;
+ auto* frame_length_controller =
+ config.add_controllers()->mutable_frame_length_controller_v2();
+ frame_length_controller->set_min_payload_bitrate_bps(
+ min_payload_bitrate.bps());
+ frame_length_controller->set_use_slow_adaptation(use_slow_adaptation);
+ config.add_controllers()->mutable_bitrate_controller();
+ audio_network_adaptor_config = config.SerializeAsString();
+#endif
+ }
+};
+
} // namespace
WebRtcVoiceEngine::WebRtcVoiceEngine(
@@ -682,6 +732,11 @@ std::vector<AudioCodec> WebRtcVoiceEngine::CollectCodecs(
}
}
+ // Add red codec.
+ if (IsAudioRedForOpusFieldTrialEnabled()) {
+ map_format({kRedCodecName, 48000, 2}, &out);
+ }
+
// Add telephone-event codecs last.
for (const auto& dtmf : generate_dtmf) {
if (dtmf.second) {
@@ -726,7 +781,6 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
config_.rtp.extensions = extensions;
config_.has_dscp =
rtp_parameters_.encodings[0].network_priority != webrtc::Priority::kLow;
- config_.audio_network_adaptor_config = audio_network_adaptor_config;
config_.encoder_factory = encoder_factory;
config_.codec_pair_id = codec_pair_id;
config_.track_id = track_id;
@@ -737,6 +791,9 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
rtp_parameters_.rtcp.cname = c_name;
rtp_parameters_.header_extensions = extensions;
+ audio_network_adaptor_config_from_options_ = audio_network_adaptor_config;
+ UpdateAudioNetworkAdaptorConfig();
+
if (send_codec_spec) {
UpdateSendCodecSpec(*send_codec_spec);
}
@@ -787,10 +844,12 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
void SetAudioNetworkAdaptorConfig(
const absl::optional<std::string>& audio_network_adaptor_config) {
RTC_DCHECK(worker_thread_checker_.IsCurrent());
- if (config_.audio_network_adaptor_config == audio_network_adaptor_config) {
+ if (audio_network_adaptor_config_from_options_ ==
+ audio_network_adaptor_config) {
return;
}
- config_.audio_network_adaptor_config = audio_network_adaptor_config;
+ audio_network_adaptor_config_from_options_ = audio_network_adaptor_config;
+ UpdateAudioNetworkAdaptorConfig();
UpdateAllowedBitrateRange();
ReconfigureAudioSendStream();
}
@@ -937,6 +996,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
rtp_parameters_.encodings[0].max_bitrate_bps;
double old_priority = rtp_parameters_.encodings[0].bitrate_priority;
webrtc::Priority old_dscp = rtp_parameters_.encodings[0].network_priority;
+ bool old_adaptive_ptime = rtp_parameters_.encodings[0].adaptive_ptime;
rtp_parameters_ = parameters;
config_.bitrate_priority = rtp_parameters_.encodings[0].bitrate_priority;
config_.has_dscp = (rtp_parameters_.encodings[0].network_priority !=
@@ -945,15 +1005,19 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
bool reconfigure_send_stream =
(rtp_parameters_.encodings[0].max_bitrate_bps != old_rtp_max_bitrate) ||
(rtp_parameters_.encodings[0].bitrate_priority != old_priority) ||
- (rtp_parameters_.encodings[0].network_priority != old_dscp);
+ (rtp_parameters_.encodings[0].network_priority != old_dscp) ||
+ (rtp_parameters_.encodings[0].adaptive_ptime != old_adaptive_ptime);
if (rtp_parameters_.encodings[0].max_bitrate_bps != old_rtp_max_bitrate) {
// Update the bitrate range.
if (send_rate) {
config_.send_codec_spec->target_bitrate_bps = send_rate;
}
- UpdateAllowedBitrateRange();
}
if (reconfigure_send_stream) {
+ // Changing adaptive_ptime may update the audio network adaptor config
+ // used.
+ UpdateAudioNetworkAdaptorConfig();
+ UpdateAllowedBitrateRange();
ReconfigureAudioSendStream();
}
@@ -989,6 +1053,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
// The order of precedence, from lowest to highest is:
// - a reasonable default of 32kbps min/max
// - fixed target bitrate from codec spec
+ // - lower min bitrate if adaptive ptime is enabled
// - bitrate configured in the rtp_parameter encodings settings
const int kDefaultBitrateBps = 32000;
config_.min_bitrate_bps = kDefaultBitrateBps;
@@ -1000,6 +1065,12 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
config_.max_bitrate_bps = *config_.send_codec_spec->target_bitrate_bps;
}
+ if (rtp_parameters_.encodings[0].adaptive_ptime) {
+ config_.min_bitrate_bps = std::min(
+ config_.min_bitrate_bps,
+ static_cast<int>(adaptive_ptime_config_.min_encoder_bitrate.bps()));
+ }
+
if (rtp_parameters_.encodings[0].min_bitrate_bps) {
config_.min_bitrate_bps = *rtp_parameters_.encodings[0].min_bitrate_bps;
}
@@ -1033,12 +1104,24 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
UpdateAllowedBitrateRange();
}
+ void UpdateAudioNetworkAdaptorConfig() {
+ if (adaptive_ptime_config_.enabled ||
+ rtp_parameters_.encodings[0].adaptive_ptime) {
+ config_.audio_network_adaptor_config =
+ adaptive_ptime_config_.audio_network_adaptor_config;
+ return;
+ }
+ config_.audio_network_adaptor_config =
+ audio_network_adaptor_config_from_options_;
+ }
+
void ReconfigureAudioSendStream() {
RTC_DCHECK(worker_thread_checker_.IsCurrent());
RTC_DCHECK(stream_);
stream_->Reconfigure(config_);
}
+ const AdaptivePtimeConfig adaptive_ptime_config_;
rtc::ThreadChecker worker_thread_checker_;
rtc::RaceChecker audio_capture_race_checker_;
webrtc::Call* call_ = nullptr;
@@ -1056,6 +1139,9 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
int max_send_bitrate_bps_;
webrtc::RtpParameters rtp_parameters_;
absl::optional<webrtc::AudioCodecSpec> audio_codec_spec_;
+ // TODO(webrtc:11717): Remove this once audio_network_adaptor in AudioOptions
+ // has been removed.
+ absl::optional<std::string> audio_network_adaptor_config_from_options_;
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioSendStream);
};
@@ -1541,7 +1627,9 @@ bool WebRtcVoiceMediaChannel::SetRecvCodecs(
<< old_codec.id << ")";
}
auto format = AudioCodecToSdpAudioFormat(codec);
- if (!IsCodec(codec, "cn") && !IsCodec(codec, "telephone-event") &&
+ if (!IsCodec(codec, kCnCodecName) && !IsCodec(codec, kDtmfCodecName) &&
+ (!IsAudioRedForOpusFieldTrialEnabled() ||
+ !IsCodec(codec, kRedCodecName)) &&
!engine()->decoder_factory_->IsSupportedDecoder(format)) {
RTC_LOG(LS_ERROR) << "Unsupported codec: " << rtc::ToString(format);
return false;
@@ -1692,6 +1780,19 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
}
}
+ if (IsAudioRedForOpusFieldTrialEnabled()) {
+ // Loop through the codecs to find the RED codec that matches opus
+ // with respect to clockrate and number of channels.
+ for (const AudioCodec& red_codec : codecs) {
+ if (IsCodec(red_codec, kRedCodecName) &&
+ red_codec.clockrate == send_codec_spec->format.clockrate_hz &&
+ red_codec.channels == send_codec_spec->format.num_channels) {
+ send_codec_spec->red_payload_type = red_codec.id;
+ break;
+ }
+ }
+ }
+
if (send_codec_spec_ != send_codec_spec) {
send_codec_spec_ = std::move(send_codec_spec);
// Apply new settings to all streams.
diff --git a/chromium/third_party/webrtc/media/engine/webrtc_voice_engine_unittest.cc b/chromium/third_party/webrtc/media/engine/webrtc_voice_engine_unittest.cc
index e7ebf8940f8..d70019e9f34 100644
--- a/chromium/third_party/webrtc/media/engine/webrtc_voice_engine_unittest.cc
+++ b/chromium/third_party/webrtc/media/engine/webrtc_voice_engine_unittest.cc
@@ -59,6 +59,7 @@ const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
+const cricket::AudioCodec kRed48000Codec(112, "RED", 48000, 32000, 2);
const cricket::AudioCodec kTelephoneEventCodec1(106,
"telephone-event",
8000,
@@ -1031,6 +1032,30 @@ TEST_P(WebRtcVoiceEngineTestFake, ChangeRecvCodecPayloadType) {
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
}
+// Test that we set Opus/Red under the field trial.
+TEST_P(WebRtcVoiceEngineTestFake, RecvRed) {
+ webrtc::test::ScopedFieldTrials override_field_trials(
+ "WebRTC-Audio-Red-For-Opus/Enabled/");
+
+ EXPECT_TRUE(SetupRecvStream());
+ cricket::AudioRecvParameters parameters;
+ parameters.codecs.push_back(kOpusCodec);
+ parameters.codecs.push_back(kRed48000Codec);
+ EXPECT_TRUE(channel_->SetRecvParameters(parameters));
+ EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
+ (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
+ {{111, {"opus", 48000, 2}}, {112, {"red", 48000, 2}}})));
+}
+
+// Test that we do not allow setting Opus/Red by default.
+TEST_P(WebRtcVoiceEngineTestFake, RecvRedDefault) {
+ EXPECT_TRUE(SetupRecvStream());
+ cricket::AudioRecvParameters parameters;
+ parameters.codecs.push_back(kOpusCodec);
+ parameters.codecs.push_back(kRed48000Codec);
+ EXPECT_FALSE(channel_->SetRecvParameters(parameters));
+}
+
TEST_P(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
EXPECT_TRUE(SetupSendStream());
@@ -1194,6 +1219,46 @@ TEST_P(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
}
+TEST_P(WebRtcVoiceEngineTestFake, SetRtpParametersAdaptivePtime) {
+ EXPECT_TRUE(SetupSendStream());
+ // Get current parameters and change "adaptive_ptime" to true.
+ webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
+ ASSERT_EQ(1u, parameters.encodings.size());
+ ASSERT_FALSE(parameters.encodings[0].adaptive_ptime);
+ parameters.encodings[0].adaptive_ptime = true;
+ EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
+ EXPECT_TRUE(GetAudioNetworkAdaptorConfig(kSsrcX));
+ EXPECT_EQ(12000, GetSendStreamConfig(kSsrcX).min_bitrate_bps);
+
+ parameters.encodings[0].adaptive_ptime = false;
+ EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
+ EXPECT_FALSE(GetAudioNetworkAdaptorConfig(kSsrcX));
+ EXPECT_EQ(32000, GetSendStreamConfig(kSsrcX).min_bitrate_bps);
+}
+
+TEST_P(WebRtcVoiceEngineTestFake,
+ DisablingAdaptivePtimeDoesNotRemoveAudioNetworkAdaptorFromOptions) {
+ EXPECT_TRUE(SetupSendStream());
+ send_parameters_.options.audio_network_adaptor = true;
+ send_parameters_.options.audio_network_adaptor_config = {"1234"};
+ SetSendParameters(send_parameters_);
+ EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
+ GetAudioNetworkAdaptorConfig(kSsrcX));
+
+ webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
+ parameters.encodings[0].adaptive_ptime = false;
+ EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
+ EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
+ GetAudioNetworkAdaptorConfig(kSsrcX));
+}
+
+TEST_P(WebRtcVoiceEngineTestFake, AdaptivePtimeFieldTrial) {
+ webrtc::test::ScopedFieldTrials override_field_trials(
+ "WebRTC-Audio-AdaptivePtime/enabled:true/");
+ EXPECT_TRUE(SetupSendStream());
+ EXPECT_TRUE(GetAudioNetworkAdaptorConfig(kSsrcX));
+}
+
// Test that SetRtpSendParameters configures the correct encoding channel for
// each SSRC.
TEST_P(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
@@ -1442,6 +1507,37 @@ TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecs) {
EXPECT_FALSE(channel_->CanInsertDtmf());
}
+// Test that we set Opus/Red under the field trial.
+TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRed) {
+ webrtc::test::ScopedFieldTrials override_field_trials(
+ "WebRTC-Audio-Red-For-Opus/Enabled/");
+
+ EXPECT_TRUE(SetupSendStream());
+ cricket::AudioSendParameters parameters;
+ parameters.codecs.push_back(kOpusCodec);
+ parameters.codecs.push_back(kRed48000Codec);
+ parameters.codecs[0].id = 96;
+ SetSendParameters(parameters);
+ const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
+ EXPECT_EQ(96, send_codec_spec.payload_type);
+ EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
+ EXPECT_EQ(112, send_codec_spec.red_payload_type);
+}
+
+// Test that we set do not interpret Opus/Red by default.
+TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedDefault) {
+ EXPECT_TRUE(SetupSendStream());
+ cricket::AudioSendParameters parameters;
+ parameters.codecs.push_back(kOpusCodec);
+ parameters.codecs.push_back(kRed48000Codec);
+ parameters.codecs[0].id = 96;
+ SetSendParameters(parameters);
+ const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
+ EXPECT_EQ(96, send_codec_spec.payload_type);
+ EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
+ EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
+}
+
// Test that WebRtcVoiceEngine reconfigures, rather than recreates its
// AudioSendStream.
TEST_P(WebRtcVoiceEngineTestFake, DontRecreateSendStream) {
@@ -2046,6 +2142,10 @@ class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
: WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
};
+INSTANTIATE_TEST_SUITE_P(UnusedParameter,
+ WebRtcVoiceEngineWithSendSideBweTest,
+ ::testing::Values(true));
+
TEST_P(WebRtcVoiceEngineWithSendSideBweTest,
SupportsTransportSequenceNumberHeaderExtension) {
const std::vector<webrtc::RtpExtension> header_extensions =
@@ -3098,7 +3198,7 @@ TEST_P(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
webrtc::CryptoOptions())));
- channel->SetInterface(&network_interface, webrtc::MediaTransportConfig());
+ channel->SetInterface(&network_interface);
// Default value when DSCP is disabled should be DSCP_DEFAULT.
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
@@ -3106,7 +3206,7 @@ TEST_P(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
webrtc::CryptoOptions())));
- channel->SetInterface(&network_interface, webrtc::MediaTransportConfig());
+ channel->SetInterface(&network_interface);
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
// Create a send stream to configure
@@ -3134,11 +3234,11 @@ TEST_P(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
webrtc::CryptoOptions())));
- channel->SetInterface(&network_interface, webrtc::MediaTransportConfig());
+ channel->SetInterface(&network_interface);
// Default value when DSCP is disabled should be DSCP_DEFAULT.
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
- channel->SetInterface(nullptr, webrtc::MediaTransportConfig());
+ channel->SetInterface(nullptr);
}
TEST_P(WebRtcVoiceEngineTestFake, SetOutputVolume) {