diff options
Diffstat (limited to 'chromium/third_party/webrtc/media/engine')
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) { |