Only generate codec stats for the voice send and receive codec

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‎ <jakobi@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Philipp Hancke <phancke@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#39172}
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 65aa0dc..c8da7c4 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -2326,15 +2326,11 @@
     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 @@
     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<webrtc::AudioSinkInterface> sink) {
diff --git a/media/engine/webrtc_voice_engine.h b/media/engine/webrtc_voice_engine.h
index 96e07cd..8b62c67 100644
--- a/media/engine/webrtc_voice_engine.h
+++ b/media/engine/webrtc_voice_engine.h
@@ -335,7 +335,11 @@
       unsignaled_frame_decryptor_;
   rtc::scoped_refptr<webrtc::FrameTransformerInterface>
       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 adc6e64..795ffc0 100644
--- a/media/engine/webrtc_voice_engine_unittest.cc
+++ b/media/engine/webrtc_voice_engine_unittest.cc
@@ -603,7 +603,7 @@
     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 @@
     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 @@
   SetSendParameters(send_parameters_);
   EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
   SetAudioSendStreamStats();
+  SetAudioReceiveStreamStats();
 
   // Check stats for the added streams.
   {
@@ -2367,7 +2368,7 @@
 
     // 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 @@
     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));