PCLF: Ignore discarded frames in the DefaultVideoQualityAnalyzer
Bug: webrtc:14453, webrtc:11607
Change-Id: Iad0da2d85d9db74026205591e8b2ced399988998
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/276420
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38204}
diff --git a/api/test/video_quality_analyzer_interface.h b/api/test/video_quality_analyzer_interface.h
index 65cc812..dc58b04 100644
--- a/api/test/video_quality_analyzer_interface.h
+++ b/api/test/video_quality_analyzer_interface.h
@@ -101,7 +101,8 @@
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 de0e050..615e3c3 100644
--- a/pc/test/svc_e2e_tests.cc
+++ b/pc/test/svc_e2e_tests.cc
@@ -196,12 +196,13 @@
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<int> spatial_id = encoded_image.SpatialIndex();
absl::optional<int> 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 123071b..08a6fca 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 @@
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 2b16eca..5501fb5 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 @@
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 6929145..e1458d4 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 @@
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 7a276b0..adda17c 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
analyzer.OnFramePreEncode(kAlice, frame);
SleepMs(20);
analyzer.OnFrameEncoded(kAlice, frame.id(), FakeEncode(frame),
- VideoQualityAnalyzerInterface::EncoderStats());
+ VideoQualityAnalyzerInterface::EncoderStats(),
+ false);
}
SleepMs(50);
@@ -592,7 +599,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 9f25ca6..f7d4550 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 @@
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 99a10c6..b12c11b 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 @@
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 e774872..98c12f6 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 @@
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