diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc index 8ced40eacd..0c597ed321 100644 --- a/audio/audio_send_stream.cc +++ b/audio/audio_send_stream.cc @@ -48,14 +48,6 @@ constexpr size_t kPacketLossTrackerMaxWindowSizeMs = 15000; constexpr size_t kPacketLossRateMinNumAckedPackets = 50; constexpr size_t kRecoverablePacketLossRateMinNumAckedPairs = 40; -void CallEncoder(const std::unique_ptr& channel_send, - rtc::FunctionView lambda) { - channel_send->ModifyEncoder([&](std::unique_ptr* encoder_ptr) { - RTC_DCHECK(encoder_ptr); - lambda(encoder_ptr->get()); - }); -} - void UpdateEventLogStreamConfig(RtcEventLog* event_log, const AudioSendStream::Config& config, const AudioSendStream::Config* old_config) { @@ -506,10 +498,8 @@ void AudioSendStream::OnOverheadChanged( void AudioSendStream::UpdateOverheadForEncoder() { const size_t overhead_per_packet_bytes = GetPerPacketOverheadBytes(); - CallEncoder(channel_send_, [&](AudioEncoder* encoder) { - if (encoder) { - encoder->OnReceivedOverhead(overhead_per_packet_bytes); - } + channel_send_->CallEncoder([&](AudioEncoder* encoder) { + encoder->OnReceivedOverhead(overhead_per_packet_bytes); }); } @@ -657,7 +647,7 @@ bool AudioSendStream::ReconfigureSendCodec(AudioSendStream* stream, new_target_bitrate_bps && new_target_bitrate_bps != old_config.send_codec_spec->target_bitrate_bps) { - CallEncoder(stream->channel_send_, [&](AudioEncoder* encoder) { + stream->channel_send_->CallEncoder([&](AudioEncoder* encoder) { encoder->OnReceivedTargetAudioBitrate(*new_target_bitrate_bps); }); } @@ -681,7 +671,7 @@ void AudioSendStream::ReconfigureANA(AudioSendStream* stream, return; } if (new_config.audio_network_adaptor_config) { - CallEncoder(stream->channel_send_, [&](AudioEncoder* encoder) { + stream->channel_send_->CallEncoder([&](AudioEncoder* encoder) { if (encoder->EnableAudioNetworkAdaptor( *new_config.audio_network_adaptor_config, stream->event_log_)) { RTC_DLOG(LS_INFO) << "Audio network adaptor enabled on SSRC " @@ -691,9 +681,8 @@ void AudioSendStream::ReconfigureANA(AudioSendStream* stream, } }); } else { - CallEncoder(stream->channel_send_, [&](AudioEncoder* encoder) { - encoder->DisableAudioNetworkAdaptor(); - }); + stream->channel_send_->CallEncoder( + [&](AudioEncoder* encoder) { encoder->DisableAudioNetworkAdaptor(); }); RTC_DLOG(LS_INFO) << "Audio network adaptor disabled on SSRC " << new_config.rtp.ssrc; } diff --git a/audio/audio_send_stream_unittest.cc b/audio/audio_send_stream_unittest.cc index 0f5edd7c9c..70f6c7238e 100644 --- a/audio/audio_send_stream_unittest.cc +++ b/audio/audio_send_stream_unittest.cc @@ -222,14 +222,13 @@ struct ConfigHelper { } } - void SetupMockForModifyEncoder() { + void SetupMockForCallEncoder() { // Let ModifyEncoder to invoke mock audio encoder. - EXPECT_CALL(*channel_send_, ModifyEncoder(_)) + EXPECT_CALL(*channel_send_, CallEncoder(_)) .WillRepeatedly( - [this](rtc::FunctionView*)> - modifier) { + [this](rtc::FunctionView modifier) { if (this->audio_encoder_) - modifier(&this->audio_encoder_); + modifier(this->audio_encoder_.get()); }); } @@ -426,7 +425,7 @@ TEST(AudioSendStreamTest, SendCodecAppliesAudioNetworkAdaptor) { auto stream_config = helper.config(); stream_config.audio_network_adaptor_config = kAnaReconfigString; - helper.SetupMockForModifyEncoder(); + helper.SetupMockForCallEncoder(); send_stream->Reconfigure(stream_config); } @@ -521,8 +520,8 @@ TEST(AudioSendStreamTest, ReconfigureTransportCcResetsFirst) { .Times(1); } - // ModifyEncoder will be called to re-set overhead. - EXPECT_CALL(*helper.channel_send(), ModifyEncoder(testing::_)).Times(1); + // CallEncoder will be called to re-set overhead. + EXPECT_CALL(*helper.channel_send(), CallEncoder(testing::_)).Times(1); send_stream->Reconfigure(new_config); } @@ -532,8 +531,8 @@ TEST(AudioSendStreamTest, OnTransportOverheadChanged) { auto send_stream = helper.CreateAudioSendStream(); auto new_config = helper.config(); - // ModifyEncoder will be called on overhead change. - EXPECT_CALL(*helper.channel_send(), ModifyEncoder(testing::_)).Times(1); + // CallEncoder will be called on overhead change. + EXPECT_CALL(*helper.channel_send(), CallEncoder(testing::_)).Times(1); const size_t transport_overhead_per_packet_bytes = 333; send_stream->SetTransportOverhead(transport_overhead_per_packet_bytes); @@ -547,8 +546,8 @@ TEST(AudioSendStreamTest, OnAudioOverheadChanged) { auto send_stream = helper.CreateAudioSendStream(); auto new_config = helper.config(); - // ModifyEncoder will be called on overhead change. - EXPECT_CALL(*helper.channel_send(), ModifyEncoder(testing::_)).Times(1); + // CallEncoder will be called on overhead change. + EXPECT_CALL(*helper.channel_send(), CallEncoder(testing::_)).Times(1); const size_t audio_overhead_per_packet_bytes = 555; send_stream->OnOverheadChanged(audio_overhead_per_packet_bytes); @@ -561,8 +560,8 @@ TEST(AudioSendStreamTest, OnAudioAndTransportOverheadChanged) { auto send_stream = helper.CreateAudioSendStream(); auto new_config = helper.config(); - // ModifyEncoder will be called when each of overhead changes. - EXPECT_CALL(*helper.channel_send(), ModifyEncoder(testing::_)).Times(2); + // CallEncoder will be called when each of overhead changes. + EXPECT_CALL(*helper.channel_send(), CallEncoder(testing::_)).Times(2); const size_t transport_overhead_per_packet_bytes = 333; send_stream->SetTransportOverhead(transport_overhead_per_packet_bytes); diff --git a/audio/channel_send.cc b/audio/channel_send.cc index e7408f0a85..cefd2c32da 100644 --- a/audio/channel_send.cc +++ b/audio/channel_send.cc @@ -105,6 +105,7 @@ class ChannelSend std::unique_ptr encoder) override; void ModifyEncoder(rtc::FunctionView*)> modifier) override; + void CallEncoder(rtc::FunctionView modifier) override; // API methods void StartSend() override; @@ -811,6 +812,16 @@ void ChannelSend::ModifyEncoder( audio_coding_->ModifyEncoder(modifier); } +void ChannelSend::CallEncoder(rtc::FunctionView modifier) { + ModifyEncoder([modifier](std::unique_ptr* encoder_ptr) { + if (*encoder_ptr) { + modifier(encoder_ptr->get()); + } else { + RTC_DLOG(LS_WARNING) << "Trying to call unset encoder."; + } + }); +} + void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) { // This method can be called on the worker thread, module process thread // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged. @@ -820,10 +831,8 @@ void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) { // module_process_thread_checker_.CalledOnValidThread()); rtc::CritScope lock(&bitrate_crit_section_); - audio_coding_->ModifyEncoder([&](std::unique_ptr* encoder) { - if (*encoder) { - (*encoder)->OnReceivedUplinkAllocation(update); - } + CallEncoder([&](AudioEncoder* encoder) { + encoder->OnReceivedUplinkAllocation(update); }); retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps()); configured_bitrate_bps_ = update.target_bitrate.bps(); @@ -838,31 +847,25 @@ void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) { RTC_DCHECK_RUN_ON(&worker_thread_checker_); if (!use_twcc_plr_for_ana_) return; - audio_coding_->ModifyEncoder([&](std::unique_ptr* encoder) { - if (*encoder) { - (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate); - } + CallEncoder([&](AudioEncoder* encoder) { + encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate); }); } void ChannelSend::OnRecoverableUplinkPacketLossRate( float recoverable_packet_loss_rate) { RTC_DCHECK_RUN_ON(&worker_thread_checker_); - audio_coding_->ModifyEncoder([&](std::unique_ptr* encoder) { - if (*encoder) { - (*encoder)->OnReceivedUplinkRecoverablePacketLossFraction( - recoverable_packet_loss_rate); - } + CallEncoder([&](AudioEncoder* encoder) { + encoder->OnReceivedUplinkRecoverablePacketLossFraction( + recoverable_packet_loss_rate); }); } void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) { if (use_twcc_plr_for_ana_) return; - audio_coding_->ModifyEncoder([&](std::unique_ptr* encoder) { - if (*encoder) { - (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate); - } + CallEncoder([&](AudioEncoder* encoder) { + encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate); }); } @@ -1222,12 +1225,8 @@ void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) { void ChannelSend::OnReceivedRtt(int64_t rtt_ms) { // Invoke audio encoders OnReceivedRtt(). - audio_coding_->ModifyEncoder( - [rtt_ms](std::unique_ptr* encoder) { - if (*encoder) { - (*encoder)->OnReceivedRtt(rtt_ms); - } - }); + CallEncoder( + [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); }); } } // namespace diff --git a/audio/channel_send.h b/audio/channel_send.h index 148b1ff14b..5f3dd0fd7a 100644 --- a/audio/channel_send.h +++ b/audio/channel_send.h @@ -63,6 +63,7 @@ class ChannelSendInterface { std::unique_ptr encoder) = 0; virtual void ModifyEncoder( rtc::FunctionView*)> modifier) = 0; + virtual void CallEncoder(rtc::FunctionView modifier) = 0; virtual void SetLocalSSRC(uint32_t ssrc) = 0; // Use 0 to indicate that the extension should not be registered. diff --git a/audio/mock_voe_channel_proxy.h b/audio/mock_voe_channel_proxy.h index 4aea1315e0..a03ce7e116 100644 --- a/audio/mock_voe_channel_proxy.h +++ b/audio/mock_voe_channel_proxy.h @@ -76,6 +76,8 @@ class MockChannelSend : public voe::ChannelSendInterface { MOCK_METHOD1( ModifyEncoder, void(rtc::FunctionView*)> modifier)); + MOCK_METHOD1(CallEncoder, + void(rtc::FunctionView modifier)); MOCK_METHOD3(SetRid, void(const std::string& rid, int extension_id,