Add corruption probability to video receive stream stats log.

Bug: webrtc:358039777
Change-Id: Id88b8542dd6934b30a4b2c42bae0ed399ccec5b6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/468420
Auto-Submit: Erik Språng <sprang@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#47589}
diff --git a/call/video_receive_stream.cc b/call/video_receive_stream.cc
index 959c5b4..06e33f6 100644
--- a/call/video_receive_stream.cc
+++ b/call/video_receive_stream.cc
@@ -12,6 +12,7 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <optional>
 #include <string>
 #include <utility>
 
@@ -57,7 +58,8 @@
 VideoReceiveStreamInterface::Stats::~Stats() = default;
 
 std::string VideoReceiveStreamInterface::Stats::ToString(
-    int64_t time_ms) const {
+    int64_t time_ms,
+    std::optional<Stats> previous_stats) const {
   StringBuilder ss;
   ss << "VideoReceiveStreamInterface stats: " << time_ms << ", {ssrc: " << ssrc
      << ", ";
@@ -100,6 +102,17 @@
   ss << "nackCount: " << rtcp_packet_type_counts.nack_packets << ", ";
   ss << "firCount: " << rtcp_packet_type_counts.fir_packets << ", ";
   ss << "pliCount: " << rtcp_packet_type_counts.pli_packets;
+  if (previous_stats.has_value() &&
+      previous_stats->corruption_score_sum.has_value() &&
+      corruption_score_sum.has_value() &&
+      previous_stats->corruption_score_count < corruption_score_count) {
+    ss << "averageCorruptionProbability: "
+       << 100.0 *
+              (*previous_stats->corruption_score_sum - *corruption_score_sum) /
+              static_cast<double>(previous_stats->corruption_score_count -
+                                  corruption_score_count)
+       << "%";
+  }
   ss << "}";
   return ss.Release();
 }
diff --git a/call/video_receive_stream.h b/call/video_receive_stream.h
index ce19d85..a227891 100644
--- a/call/video_receive_stream.h
+++ b/call/video_receive_stream.h
@@ -85,7 +85,8 @@
   struct Stats {
     Stats();
     ~Stats();
-    std::string ToString(int64_t time_ms) const;
+    std::string ToString(int64_t time_ms,
+                         std::optional<Stats> previous_stats) const;
 
     int network_frame_rate = 0;
     int decode_frame_rate = 0;
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index 9ae3524..063c95b 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -3529,6 +3529,7 @@
 WebRtcVideoReceiveChannel::WebRtcVideoReceiveStream::
     ~WebRtcVideoReceiveStream() {
   call_->DestroyVideoReceiveStream(stream_);
+  previous_stats_ = std::nullopt;
   if (flexfec_stream_)
     call_->DestroyFlexfecReceiveStream(flexfec_stream_);
 }
@@ -3721,6 +3722,7 @@
         /*generate_key_frame=*/false);
     call_->DestroyVideoReceiveStream(stream_);
     stream_ = nullptr;
+    previous_stats_ = std::nullopt;
   }
 
   if (flexfec_stream_) {
@@ -3972,7 +3974,10 @@
   // present if DLRR is enabled.
 
   if (log_stats)
-    RTC_LOG(LS_INFO) << stats.ToString(env_.clock().TimeInMilliseconds());
+    RTC_LOG(LS_INFO) << stats.ToString(env_.clock().TimeInMilliseconds(),
+                                       previous_stats_);
+
+  previous_stats_ = stats;
 
   return info;
 }
diff --git a/media/engine/webrtc_video_engine.h b/media/engine/webrtc_video_engine.h
index a08c919..8b3efd5 100644
--- a/media/engine/webrtc_video_engine.h
+++ b/media/engine/webrtc_video_engine.h
@@ -685,6 +685,7 @@
     VideoReceiveStreamInterface::Config config_;
     FlexfecReceiveStream::Config flexfec_config_;
     FlexfecReceiveStream* flexfec_stream_;
+    std::optional<VideoReceiveStreamInterface::Stats> previous_stats_;
 
     Mutex sink_lock_;
     VideoSinkInterface<VideoFrame>* sink_ RTC_GUARDED_BY(sink_lock_);