From 9ad10bc4927bf715575c6c560382b35629cda0af Mon Sep 17 00:00:00 2001 From: Philipp Hancke Date: Wed, 18 Jan 2023 13:38:19 +0100 Subject: [PATCH] Only generate codec stats for the voice send and receive codec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit also refactor the code to have FillSendCodecStats/FillReceiveCodecStats methods for similarity with the video engine code. BUG=webrtc:14808 Change-Id: Ib0687f36a4b4a71c849e0b4918e50592d7772ff8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/290891 Reviewed-by: Jakob Ivarsson‎ Reviewed-by: Ilya Nikolaevskiy Commit-Queue: Philipp Hancke Cr-Commit-Position: refs/heads/main@{#39172} --- media/engine/webrtc_voice_engine.cc | 44 ++++++++++++++------ media/engine/webrtc_voice_engine.h | 4 ++ media/engine/webrtc_voice_engine_unittest.cc | 8 ++-- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc index 65aa0dcaca..c8da7c4af3 100644 --- a/media/engine/webrtc_voice_engine.cc +++ b/media/engine/webrtc_voice_engine.cc @@ -2326,15 +2326,11 @@ bool WebRtcVoiceMediaChannel::GetSendStats(VoiceMediaSendInfo* info) { info->senders.push_back(sinfo); } - // Get codec info - for (const AudioCodec& codec : send_codecs_) { - webrtc::RtpCodecParameters codec_params = codec.ToCodecParameters(); - info->send_codecs.insert( - std::make_pair(codec_params.payload_type, std::move(codec_params))); - } + FillSendCodecStats(info); return true; } + bool WebRtcVoiceMediaChannel::GetReceiveStats(VoiceMediaReceiveInfo* info, bool get_and_clear_legacy_stats) { TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::GetReceiveStats"); @@ -2439,17 +2435,41 @@ bool WebRtcVoiceMediaChannel::GetReceiveStats(VoiceMediaReceiveInfo* info, info->receivers.push_back(rinfo); } - // Get codec info - for (const AudioCodec& codec : recv_codecs_) { - webrtc::RtpCodecParameters codec_params = codec.ToCodecParameters(); - info->receive_codecs.insert( - std::make_pair(codec_params.payload_type, std::move(codec_params))); - } + FillReceiveCodecStats(info); + info->device_underrun_count = engine_->adm()->GetPlayoutUnderrunCount(); return true; } +void WebRtcVoiceMediaChannel::FillSendCodecStats( + VoiceMediaSendInfo* voice_media_info) { + for (const auto& sender : voice_media_info->senders) { + auto codec = absl::c_find_if(send_codecs_, [&sender](const AudioCodec& c) { + return sender.codec_payload_type && *sender.codec_payload_type == c.id; + }); + if (codec != send_codecs_.end()) { + voice_media_info->send_codecs.insert( + std::make_pair(codec->id, codec->ToCodecParameters())); + } + } +} + +void WebRtcVoiceMediaChannel::FillReceiveCodecStats( + VoiceMediaReceiveInfo* voice_media_info) { + for (const auto& receiver : voice_media_info->receivers) { + auto codec = + absl::c_find_if(recv_codecs_, [&receiver](const AudioCodec& c) { + return receiver.codec_payload_type && + *receiver.codec_payload_type == c.id; + }); + if (codec != recv_codecs_.end()) { + voice_media_info->receive_codecs.insert( + std::make_pair(codec->id, codec->ToCodecParameters())); + } + } +} + void WebRtcVoiceMediaChannel::SetRawAudioSink( uint32_t ssrc, std::unique_ptr sink) { diff --git a/media/engine/webrtc_voice_engine.h b/media/engine/webrtc_voice_engine.h index 96e07cd9ff..8b62c67449 100644 --- a/media/engine/webrtc_voice_engine.h +++ b/media/engine/webrtc_voice_engine.h @@ -335,7 +335,11 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel, unsignaled_frame_decryptor_; rtc::scoped_refptr unsignaled_frame_transformer_; + + void FillSendCodecStats(VoiceMediaSendInfo* voice_media_info); + void FillReceiveCodecStats(VoiceMediaReceiveInfo* voice_media_info); }; + } // namespace cricket #endif // MEDIA_ENGINE_WEBRTC_VOICE_ENGINE_H_ diff --git a/media/engine/webrtc_voice_engine_unittest.cc b/media/engine/webrtc_voice_engine_unittest.cc index adc6e646e8..795ffc0639 100644 --- a/media/engine/webrtc_voice_engine_unittest.cc +++ b/media/engine/webrtc_voice_engine_unittest.cc @@ -603,7 +603,7 @@ class WebRtcVoiceEngineTestFake : public ::testing::TestWithParam { stats.packets_lost = 9012; stats.fraction_lost = 34.56f; stats.codec_name = "codec_name_send"; - stats.codec_payload_type = 42; + stats.codec_payload_type = 0; stats.jitter_ms = 12; stats.rtt_ms = 345; stats.audio_level = 678; @@ -679,7 +679,7 @@ class WebRtcVoiceEngineTestFake : public ::testing::TestWithParam { stats.packets_rcvd = 768; stats.packets_lost = 101; stats.codec_name = "codec_name_recv"; - stats.codec_payload_type = 42; + stats.codec_payload_type = 0; stats.jitter_ms = 901; stats.jitter_buffer_ms = 234; stats.jitter_buffer_preferred_ms = 567; @@ -2347,6 +2347,7 @@ TEST_P(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) { SetSendParameters(send_parameters_); EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_)); SetAudioSendStreamStats(); + SetAudioReceiveStreamStats(); // Check stats for the added streams. { @@ -2367,7 +2368,7 @@ TEST_P(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) { // We have added one receive stream. We should see empty stats. EXPECT_EQ(receive_info.receivers.size(), 1u); - EXPECT_EQ(receive_info.receivers[0].ssrc(), 0u); + EXPECT_EQ(receive_info.receivers[0].ssrc(), 123u); } // Remove the kSsrcY stream. No receiver stats. @@ -2525,6 +2526,7 @@ TEST_P(WebRtcVoiceEngineTestFake, GetStats) { EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0)); cricket::VoiceMediaSendInfo send_info; cricket::VoiceMediaReceiveInfo receive_info; + SetAudioReceiveStreamStats(); EXPECT_EQ(true, channel_->GetSendStats(&send_info)); EXPECT_EQ(true, channel_->GetReceiveStats( &receive_info, /*get_and_clear_legacy_stats=*/true));