Forward the corruption score from the decoder to ReceiveStatisticsProxy

Bug: webrtc:358039777
Change-Id: Iace01daa53d08b5d0c484b5f55da73ba230317da
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/365095
Reviewed-by: Erik Språng <sprang@webrtc.org>
Auto-Submit: Fanny Linderborg <linderborg@webrtc.org>
Commit-Queue: Fanny Linderborg <linderborg@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43213}
diff --git a/modules/video_coding/generic_decoder.cc b/modules/video_coding/generic_decoder.cc
index 166ce1d..23199f7 100644
--- a/modules/video_coding/generic_decoder.cc
+++ b/modules/video_coding/generic_decoder.cc
@@ -134,14 +134,13 @@
     return;
   }
 
-  // TODO: bugs.webrtc.org/358039777 - Use the score.
-  std::optional<double> score;
+  std::optional<double> corruption_score;
   if (corruption_score_calculator_ &&
       frame_info->frame_instrumentation_data.has_value()) {
     if (const FrameInstrumentationData* data =
             absl::get_if<FrameInstrumentationData>(
                 &*frame_info->frame_instrumentation_data)) {
-      score = corruption_score_calculator_->CalculateCorruptionScore(
+      corruption_score = corruption_score_calculator_->CalculateCorruptionScore(
           decodedImage, *data);
     }
   }
@@ -242,7 +241,8 @@
                                      .qp = qp,
                                      .decode_time = decode_time,
                                      .content_type = frame_info->content_type,
-                                     .frame_type = frame_info->frame_type});
+                                     .frame_type = frame_info->frame_type,
+                                     .corruption_score = corruption_score});
 }
 
 void VCMDecodedFrameCallback::OnDecoderInfoChanged(
diff --git a/modules/video_coding/generic_decoder_unittest.cc b/modules/video_coding/generic_decoder_unittest.cc
index 9f362e4..8300292 100644
--- a/modules/video_coding/generic_decoder_unittest.cc
+++ b/modules/video_coding/generic_decoder_unittest.cc
@@ -37,6 +37,8 @@
 #include "test/scoped_key_value_config.h"
 #include "test/time_controller/simulated_time_controller.h"
 
+using ::testing::Return;
+
 namespace webrtc {
 namespace video_coding {
 
@@ -65,6 +67,7 @@
 
   int32_t OnFrameToRender(const struct FrameToRender& arguments) override {
     frames_.push_back(arguments.video_frame);
+    last_corruption_score_ = arguments.corruption_score;
     return 0;
   }
 
@@ -84,9 +87,14 @@
 
   uint32_t frames_dropped() const { return frames_dropped_; }
 
+  std::optional<double> last_corruption_score() const {
+    return last_corruption_score_;
+  }
+
  private:
   std::vector<VideoFrame> frames_;
   uint32_t frames_dropped_ = 0;
+  std::optional<double> last_corruption_score_;
 };
 
 class GenericDecoderTest : public ::testing::Test {
@@ -220,22 +228,27 @@
 }
 
 TEST_F(GenericDecoderTest, CallCalculateCorruptionScoreInDecoded) {
-  EXPECT_CALL(corruption_score_calculator_, CalculateCorruptionScore);
+  constexpr double kCorruptionScore = 0.76;
 
-  uint32_t rtp_timestamp = 1;
+  EXPECT_CALL(corruption_score_calculator_, CalculateCorruptionScore)
+      .WillOnce(Return(kCorruptionScore));
+
+  constexpr uint32_t kRtpTimestamp = 1;
   FrameInfo frame_info;
   frame_info.frame_instrumentation_data = FrameInstrumentationData{};
-  frame_info.rtp_timestamp = rtp_timestamp;
+  frame_info.rtp_timestamp = kRtpTimestamp;
   frame_info.decode_start = Timestamp::Zero();
   frame_info.content_type = VideoContentType::UNSPECIFIED;
   frame_info.frame_type = VideoFrameType::kVideoFrameDelta;
   VideoFrame video_frame = VideoFrame::Builder()
                                .set_video_frame_buffer(I420Buffer::Create(5, 5))
-                               .set_rtp_timestamp(rtp_timestamp)
+                               .set_rtp_timestamp(kRtpTimestamp)
                                .build();
   vcm_callback_.Map(std::move(frame_info));
 
   vcm_callback_.Decoded(video_frame);
+
+  EXPECT_EQ(user_callback_.last_corruption_score(), kCorruptionScore);
 }
 
 }  // namespace video_coding
diff --git a/modules/video_coding/include/video_coding_defines.h b/modules/video_coding/include/video_coding_defines.h
index 1347431..c5d8e75 100644
--- a/modules/video_coding/include/video_coding_defines.h
+++ b/modules/video_coding/include/video_coding_defines.h
@@ -59,6 +59,7 @@
     TimeDelta decode_time;
     VideoContentType content_type;
     VideoFrameType frame_type;
+    std::optional<double> corruption_score;
   };
 
   // TODO: bugs.webrtc.org/358039777 - Delete this function.
diff --git a/video/video_stream_decoder2.cc b/video/video_stream_decoder2.cc
index c8bec27..30ea4c3 100644
--- a/video/video_stream_decoder2.cc
+++ b/video/video_stream_decoder2.cc
@@ -66,6 +66,10 @@
   receive_stats_callback_->OnDecodedFrame(
       arguments.video_frame, arguments.qp, arguments.decode_time,
       arguments.content_type, arguments.frame_type);
+  if (arguments.corruption_score.has_value()) {
+    receive_stats_callback_->OnCorruptionScore(*arguments.corruption_score,
+                                               arguments.content_type);
+  }
   incoming_video_stream_->OnFrame(arguments.video_frame);
   return 0;
 }