diff --git a/api/test/video_quality_analyzer_interface.h b/api/test/video_quality_analyzer_interface.h index 65cc8123f8..dc58b04967 100644 --- a/api/test/video_quality_analyzer_interface.h +++ b/api/test/video_quality_analyzer_interface.h @@ -101,7 +101,8 @@ class VideoQualityAnalyzerInterface virtual void OnFrameEncoded(absl::string_view peer_name, uint16_t frame_id, const EncodedImage& encoded_image, - const EncoderStats& stats) {} + const EncoderStats& stats, + bool discarded) {} // Will be called for each frame dropped by encoder. // `peer_name` is name of the peer on which side frame drop was detected. virtual void OnFrameDropped(absl::string_view peer_name, diff --git a/pc/test/svc_e2e_tests.cc b/pc/test/svc_e2e_tests.cc index de0e050b68..615e3c39a9 100644 --- a/pc/test/svc_e2e_tests.cc +++ b/pc/test/svc_e2e_tests.cc @@ -196,12 +196,13 @@ class SvcVideoQualityAnalyzer : public DefaultVideoQualityAnalyzer { void OnFrameEncoded(absl::string_view peer_name, uint16_t frame_id, const EncodedImage& encoded_image, - const EncoderStats& stats) override { + const EncoderStats& stats, + bool discarded) override { absl::optional spatial_id = encoded_image.SpatialIndex(); absl::optional temporal_id = encoded_image.TemporalIndex(); encoder_layers_seen_[spatial_id.value_or(0)][temporal_id.value_or(0)]++; - DefaultVideoQualityAnalyzer::OnFrameEncoded(peer_name, frame_id, - encoded_image, stats); + DefaultVideoQualityAnalyzer::OnFrameEncoded( + peer_name, frame_id, encoded_image, stats, discarded); } void OnFramePreDecode(absl::string_view peer_name, diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc index 123071bb7e..08a6fca792 100644 --- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc +++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc @@ -295,7 +295,10 @@ void DefaultVideoQualityAnalyzer::OnFrameEncoded( absl::string_view peer_name, uint16_t frame_id, const webrtc::EncodedImage& encoded_image, - const EncoderStats& stats) { + const EncoderStats& stats, + bool discarded) { + if (discarded) + return; MutexLock lock(&mutex_); RTC_CHECK_EQ(state_, State::kActive) << "DefaultVideoQualityAnalyzer has to be started before use"; diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h index 2b16ecad44..5501fb5896 100644 --- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h +++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h @@ -62,7 +62,8 @@ class DefaultVideoQualityAnalyzer : public VideoQualityAnalyzerInterface { void OnFrameEncoded(absl::string_view peer_name, uint16_t frame_id, const EncodedImage& encoded_image, - const EncoderStats& stats) override; + const EncoderStats& stats, + bool discarded) override; void OnFrameDropped(absl::string_view peer_name, EncodedImageCallback::DropReason reason) override; void OnFramePreDecode(absl::string_view peer_name, diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_metric_names_test.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_metric_names_test.cc index 69291455de..e1458d4812 100644 --- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_metric_names_test.cc +++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_metric_names_test.cc @@ -101,7 +101,8 @@ void PassFramesThroughAnalyzer(DefaultVideoQualityAnalyzer& analyzer, frame.set_id(frame_id); analyzer.OnFramePreEncode(sender, frame); analyzer.OnFrameEncoded(sender, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); for (absl::string_view receiver : receivers) { VideoFrame received_frame = DeepCopy(frame); analyzer.OnFramePreDecode(receiver, received_frame.id(), diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc index 7a276b0854..adda17c65e 100644 --- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc +++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc @@ -126,7 +126,8 @@ void PassFramesThroughAnalyzer(DefaultVideoQualityAnalyzer& analyzer, frame.set_id(frame_id); analyzer.OnFramePreEncode(sender, frame); analyzer.OnFrameEncoded(sender, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); for (absl::string_view receiver : receivers) { VideoFrame received_frame = DeepCopy(frame); analyzer.OnFramePreDecode(receiver, received_frame.id(), @@ -165,7 +166,8 @@ TEST(DefaultVideoQualityAnalyzerTest, captured_frames.insert({frame.id(), frame}); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } for (const uint16_t& frame_id : frames_order) { @@ -218,7 +220,8 @@ TEST(DefaultVideoQualityAnalyzerTest, captured_frames.insert({frame.id(), frame}); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } // Receive all frames. @@ -246,7 +249,8 @@ TEST(DefaultVideoQualityAnalyzerTest, captured_frames.insert({frame.id(), frame}); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } // Receive all frames. @@ -299,7 +303,8 @@ TEST(DefaultVideoQualityAnalyzerTest, captured_frames.insert({frame.id(), frame}); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } for (size_t i = kMaxFramesInFlightPerStream; i < frames_order.size(); ++i) { @@ -350,7 +355,8 @@ TEST(DefaultVideoQualityAnalyzerTest, NormalScenario) { captured_frames.insert({frame.id(), frame}); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } for (size_t i = 1; i < frames_order.size(); i += 2) { @@ -405,7 +411,7 @@ TEST(DefaultVideoQualityAnalyzerTest, OneFrameReceivedTwice) { analyzer.OnFramePreEncode(kSenderPeerName, captured_frame); analyzer.OnFrameEncoded(kSenderPeerName, captured_frame.id(), FakeEncode(captured_frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); VideoFrame received_frame = DeepCopy(captured_frame); analyzer.OnFramePreDecode(kReceiverPeerName, received_frame.id(), @@ -465,7 +471,8 @@ TEST(DefaultVideoQualityAnalyzerTest, NormalScenario2Receivers) { analyzer.OnFramePreEncode(kAlice, frame); SleepMs(20); analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } SleepMs(50); @@ -592,7 +599,7 @@ TEST(DefaultVideoQualityAnalyzerTest, analyzer.OnFramePreEncode(kAlice, captured_frame); analyzer.OnFrameEncoded(kAlice, captured_frame.id(), FakeEncode(captured_frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); VideoFrame received_frame = DeepCopy(captured_frame); analyzer.OnFramePreDecode(kBob, received_frame.id(), @@ -653,7 +660,8 @@ TEST(DefaultVideoQualityAnalyzerTest, HeavyQualityMetricsFromEqualFrames) { analyzer.OnFrameCaptured(kSenderPeerName, kStreamLabel, frame)); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); VideoFrame received_frame = DeepCopy(frame); analyzer.OnFramePreDecode(kReceiverPeerName, received_frame.id(), @@ -713,7 +721,8 @@ TEST(DefaultVideoQualityAnalyzerTest, analyzer.OnFrameCaptured(kSenderPeerName, kStreamLabel, frame)); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); VideoFrame received_frame = frame; // Shift frame by a few pixels. @@ -776,7 +785,8 @@ TEST(DefaultVideoQualityAnalyzerTest, CpuUsage) { captured_frames.insert({frame.id(), frame}); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } // Windows CPU clock has low accuracy. We need to fake some additional load to @@ -841,7 +851,8 @@ TEST(DefaultVideoQualityAnalyzerTest, RuntimeParticipantsAdding) { captured_frames.insert({frame.id(), frame}); analyzer.OnFramePreEncode(kAlice, frame); analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } // Bob receives one third of the sent frames. @@ -984,7 +995,7 @@ TEST(DefaultVideoQualityAnalyzerTest, analyzer.OnFramePreEncode(kAlice, frame); // Encode 1st simulcast layer analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); // Receive by Bob VideoFrame received_frame = DeepCopy(frame); @@ -1003,7 +1014,7 @@ TEST(DefaultVideoQualityAnalyzerTest, // Encode 2nd simulcast layer analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); // Give analyzer some time to process frames on async thread. The computations // have to be fast (heavy metrics are disabled!), so if doesn't fit 100ms it @@ -1047,7 +1058,8 @@ TEST(DefaultVideoQualityAnalyzerTest, frames.push_back(frame); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } // Receive by 2nd peer. @@ -1143,7 +1155,8 @@ TEST(DefaultVideoQualityAnalyzerTest, frames.push_back(frame); analyzer.OnFramePreEncode(kSenderPeerName, frame); analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } // Receive by sender @@ -1241,7 +1254,7 @@ TEST(DefaultVideoQualityAnalyzerTest, CodecTrackedCorrectly) { analyzer.OnFramePreEncode(kSenderPeerName, frame); encoder_stats.encoder_name = codec_names[i]; analyzer.OnFrameEncoded(kSenderPeerName, frame.id(), FakeEncode(frame), - encoder_stats); + encoder_stats, false); frames.push_back(std::move(frame)); } } @@ -1322,9 +1335,9 @@ TEST(DefaultVideoQualityAnalyzerTest, analyzer.OnFramePreEncode(kSenderPeerName, frames[i]); } for (int i = 0; i < 4; ++i) { - analyzer.OnFrameEncoded(kSenderPeerName, frames[i].id(), - FakeEncode(frames[i]), - VideoQualityAnalyzerInterface::EncoderStats()); + analyzer.OnFrameEncoded( + kSenderPeerName, frames[i].id(), FakeEncode(frames[i]), + VideoQualityAnalyzerInterface::EncoderStats(), false); } // Receiver side actions @@ -1415,9 +1428,9 @@ TEST( analyzer.OnFramePreEncode(kSenderPeerName, frames[i]); } for (int i = 0; i < 4; ++i) { - analyzer.OnFrameEncoded(kSenderPeerName, frames[i].id(), - FakeEncode(frames[i]), - VideoQualityAnalyzerInterface::EncoderStats()); + analyzer.OnFrameEncoded( + kSenderPeerName, frames[i].id(), FakeEncode(frames[i]), + VideoQualityAnalyzerInterface::EncoderStats(), false); } // Receiver side actions @@ -1517,7 +1530,8 @@ TEST(DefaultVideoQualityAnalyzerTest, GetStreamFrames) { frames.push_back(frame); analyzer.OnFramePreEncode(sender, frame); analyzer.OnFrameEncoded(sender, frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), + false); } // We don't need to receive frames for stats to be gathered correctly. @@ -1547,7 +1561,7 @@ TEST(DefaultVideoQualityAnalyzerTest, ReceiverReceivedFramesWhenSenderRemoved) { frame.set_id(frame_id); analyzer.OnFramePreEncode("alice", frame); analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); analyzer.UnregisterParticipantInCall("alice"); @@ -1591,7 +1605,7 @@ TEST(DefaultVideoQualityAnalyzerTest, frame.set_id(frame_id); analyzer.OnFramePreEncode("alice", frame); analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); analyzer.UnregisterParticipantInCall("alice"); @@ -1635,7 +1649,7 @@ TEST(DefaultVideoQualityAnalyzerTest, frame.set_id(frame_id); analyzer.OnFramePreEncode("alice", frame); analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); analyzer.UnregisterParticipantInCall("bob"); @@ -1679,7 +1693,7 @@ TEST(DefaultVideoQualityAnalyzerTest, frame.set_id(frame_id); analyzer.OnFramePreEncode("alice", frame); analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); analyzer.OnFramePreDecode("bob", frame.id(), FakeEncode(frame)); analyzer.OnFrameDecoded("bob", DeepCopy(frame), @@ -1777,7 +1791,7 @@ TEST(DefaultVideoQualityAnalyzerTest, ReceiverRemovedBeforePreEncoded) { analyzer.UnregisterParticipantInCall("bob"); analyzer.OnFramePreEncode("alice", frame); analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); // Give analyzer some time to process frames on async thread. The computations // have to be fast (heavy metrics are disabled!), so if doesn't fit 100ms it @@ -1820,7 +1834,7 @@ TEST(DefaultVideoQualityAnalyzerTest, ReceiverRemovedBeforeEncoded) { analyzer.OnFramePreEncode("alice", frame); analyzer.UnregisterParticipantInCall("bob"); analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); // Give analyzer some time to process frames on async thread. The computations // have to be fast (heavy metrics are disabled!), so if doesn't fit 100ms it @@ -1864,11 +1878,11 @@ TEST(DefaultVideoQualityAnalyzerTest, analyzer.OnFramePreEncode("alice", frame); // 1st simulcast layer encoded analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); analyzer.UnregisterParticipantInCall("bob"); // 2nd simulcast layer encoded analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); // Give analyzer some time to process frames on async thread. The computations // have to be fast (heavy metrics are disabled!), so if doesn't fit 100ms it @@ -2030,7 +2044,7 @@ TEST(DefaultVideoQualityAnalyzerTest, analyzer.OnFramePreEncode("alice", frame); SleepMs(10); analyzer.OnFrameEncoded("alice", frame.id(), FakeEncode(frame), - VideoQualityAnalyzerInterface::EncoderStats()); + VideoQualityAnalyzerInterface::EncoderStats(), false); analyzer.UnregisterParticipantInCall("bob"); diff --git a/test/pc/e2e/analyzer/video/example_video_quality_analyzer.cc b/test/pc/e2e/analyzer/video/example_video_quality_analyzer.cc index 9f25ca6327..f7d4550b0b 100644 --- a/test/pc/e2e/analyzer/video/example_video_quality_analyzer.cc +++ b/test/pc/e2e/analyzer/video/example_video_quality_analyzer.cc @@ -58,7 +58,8 @@ void ExampleVideoQualityAnalyzer::OnFrameEncoded( absl::string_view peer_name, uint16_t frame_id, const webrtc::EncodedImage& encoded_image, - const EncoderStats& stats) { + const EncoderStats& stats, + bool discarded) { MutexLock lock(&lock_); ++frames_encoded_; } diff --git a/test/pc/e2e/analyzer/video/example_video_quality_analyzer.h b/test/pc/e2e/analyzer/video/example_video_quality_analyzer.h index 99a10c6a74..b12c11ba7c 100644 --- a/test/pc/e2e/analyzer/video/example_video_quality_analyzer.h +++ b/test/pc/e2e/analyzer/video/example_video_quality_analyzer.h @@ -44,7 +44,8 @@ class ExampleVideoQualityAnalyzer : public VideoQualityAnalyzerInterface { void OnFrameEncoded(absl::string_view peer_name, uint16_t frame_id, const EncodedImage& encoded_image, - const EncoderStats& stats) override; + const EncoderStats& stats, + bool discarded) override; void OnFrameDropped(absl::string_view peer_name, EncodedImageCallback::DropReason reason) override; void OnFramePreDecode(absl::string_view peer_name, diff --git a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc index e774872cd9..98c12f665c 100644 --- a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc +++ b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc @@ -290,7 +290,8 @@ EncodedImageCallback::Result QualityAnalyzingVideoEncoder::OnEncodedImage( VideoQualityAnalyzerInterface::EncoderStats stats; stats.encoder_name = codec_name; stats.target_encode_bitrate = target_encode_bitrate; - analyzer_->OnFrameEncoded(peer_name_, frame_id, encoded_image, stats); + analyzer_->OnFrameEncoded(peer_name_, frame_id, encoded_image, stats, + discard); // Image data injector injects frame id and discard flag into provided // EncodedImage and returns the image with a) modified original buffer (in