Add unit tests for balanced degradation settings.
Bug: none
Change-Id: I159965b931f0ab734b84cb68d5bfb7b5bd9a81a4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/153348
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29295}
diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc
index 6f19edc..a572506 100644
--- a/video/video_stream_encoder_unittest.cc
+++ b/video/video_stream_encoder_unittest.cc
@@ -150,10 +150,14 @@
task_queue_factory) {}
void PostTaskAndWait(bool down, AdaptReason reason) {
+ PostTaskAndWait(down, reason, /*expected_results=*/true);
+ }
+
+ void PostTaskAndWait(bool down, AdaptReason reason, bool expected_results) {
rtc::Event event;
- encoder_queue()->PostTask([this, &event, reason, down] {
+ encoder_queue()->PostTask([this, &event, reason, down, expected_results] {
if (down)
- AdaptDown(reason);
+ EXPECT_EQ(expected_results, AdaptDown(reason));
else
AdaptUp(reason);
event.Set();
@@ -169,13 +173,26 @@
ASSERT_TRUE(event.Wait(5000));
}
- void TriggerCpuOveruse() { PostTaskAndWait(true, AdaptReason::kCpu); }
+ void TriggerCpuOveruse() {
+ PostTaskAndWait(/*down=*/true, AdaptReason::kCpu);
+ }
- void TriggerCpuNormalUsage() { PostTaskAndWait(false, AdaptReason::kCpu); }
+ void TriggerCpuNormalUsage() {
+ PostTaskAndWait(/*down=*/false, AdaptReason::kCpu);
+ }
- void TriggerQualityLow() { PostTaskAndWait(true, AdaptReason::kQuality); }
+ void TriggerQualityLow() {
+ PostTaskAndWait(/*down=*/true, AdaptReason::kQuality);
+ }
- void TriggerQualityHigh() { PostTaskAndWait(false, AdaptReason::kQuality); }
+ void TriggerQualityLowExpectFalse() {
+ PostTaskAndWait(/*down=*/true, AdaptReason::kQuality,
+ /*expected_results=*/false);
+ }
+
+ void TriggerQualityHigh() {
+ PostTaskAndWait(/*down=*/false, AdaptReason::kQuality);
+ }
CpuOveruseDetectorProxy* overuse_detector_proxy_;
};
@@ -2644,8 +2661,101 @@
video_stream_encoder_->Stop();
}
+class BalancedDegradationTest : public VideoStreamEncoderTest {
+ protected:
+ void SetupTest() {
+ // Reset encoder for field trials to take effect.
+ ConfigureEncoder(video_encoder_config_.Copy());
+
+ video_stream_encoder_->OnBitrateUpdated(
+ DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps),
+ DataRate::bps(kTargetBitrateBps), 0, 0);
+
+ // Enable BALANCED preference.
+ source_.set_adaptation_enabled(true);
+ video_stream_encoder_->SetSource(&source_,
+ webrtc::DegradationPreference::BALANCED);
+ }
+
+ void IncomingCapturedFrame() {
+ timestamp_ms_ += kFrameIntervalMs;
+ source_.IncomingCapturedFrame(CreateFrame(timestamp_ms_, kWidth, kHeight));
+ sink_.WaitForEncodedFrame(timestamp_ms_);
+ }
+
+ const int kWidth = 640; // pixels:640x360=230400
+ const int kHeight = 360;
+ const int64_t kFrameIntervalMs = 150; // Use low fps to not drop any frame.
+ int64_t timestamp_ms_ = 0;
+ AdaptingFrameForwarder source_;
+};
+
+TEST_F(BalancedDegradationTest, AdaptDownReturnsFalseIfFpsDiffLtThreshold) {
+ test::ScopedFieldTrials field_trials(
+ "WebRTC-Video-BalancedDegradationSettings/"
+ "pixels:57600|129600|230400,fps:7|10|24,fps_diff:1|1|1/");
+ SetupTest();
+
+ // Force input frame rate.
+ const int kInputFps = 24;
+ VideoSendStream::Stats stats = stats_proxy_->GetStats();
+ stats.input_frame_rate = kInputFps;
+ stats_proxy_->SetMockStats(stats);
+
+ IncomingCapturedFrame();
+ VerifyFpsMaxResolutionMax(source_.sink_wants());
+
+ // Trigger adapt down, expect scaled down framerate (640x360@24fps).
+ // Fps diff (input-requested:0) < threshold, expect AdaptDown to return false.
+ video_stream_encoder_->TriggerQualityLowExpectFalse();
+ VerifyFpsEqResolutionMax(source_.sink_wants(), 24);
+
+ video_stream_encoder_->Stop();
+}
+
+TEST_F(BalancedDegradationTest, AdaptDownReturnsTrueIfFpsDiffGeThreshold) {
+ test::ScopedFieldTrials field_trials(
+ "WebRTC-Video-BalancedDegradationSettings/"
+ "pixels:57600|129600|230400,fps:7|10|24,fps_diff:1|1|1/");
+ SetupTest();
+
+ // Force input frame rate.
+ const int kInputFps = 25;
+ VideoSendStream::Stats stats = stats_proxy_->GetStats();
+ stats.input_frame_rate = kInputFps;
+ stats_proxy_->SetMockStats(stats);
+
+ IncomingCapturedFrame();
+ VerifyFpsMaxResolutionMax(source_.sink_wants());
+
+ // Trigger adapt down, expect scaled down framerate (640x360@24fps).
+ // Fps diff (input-requested:1) == threshold, expect AdaptDown to return true.
+ video_stream_encoder_->TriggerQualityLow();
+ VerifyFpsEqResolutionMax(source_.sink_wants(), 24);
+
+ video_stream_encoder_->Stop();
+}
+
+TEST_F(BalancedDegradationTest, AdaptDownUsesCodecSpecificFps) {
+ test::ScopedFieldTrials field_trials(
+ "WebRTC-Video-BalancedDegradationSettings/"
+ "pixels:57600|129600|230400,fps:7|10|24,vp8_fps:8|11|22/");
+ SetupTest();
+
+ EXPECT_EQ(kVideoCodecVP8, video_encoder_config_.codec_type);
+
+ IncomingCapturedFrame();
+ VerifyFpsMaxResolutionMax(source_.sink_wants());
+
+ // Trigger adapt down, expect scaled down framerate (640x360@22fps).
+ video_stream_encoder_->TriggerQualityLow();
+ VerifyFpsEqResolutionMax(source_.sink_wants(), 22);
+
+ video_stream_encoder_->Stop();
+}
+
TEST_F(VideoStreamEncoderTest, NoAdaptUpIfBwEstimateIsLessThanMinBitrate) {
- webrtc::test::ScopedFieldTrials field_trials(
+ test::ScopedFieldTrials field_trials(
"WebRTC-Video-BalancedDegradationSettings/"
"pixels:57600|129600|230400,fps:7|10|14,kbps:0|0|425/");
// Reset encoder for field trials to take effect.
@@ -2720,7 +2830,7 @@
TEST_F(VideoStreamEncoderTest,
NoAdaptUpInResolutionIfBwEstimateIsLessThanMinBitrate) {
- webrtc::test::ScopedFieldTrials field_trials(
+ test::ScopedFieldTrials field_trials(
"WebRTC-Video-BalancedDegradationSettings/"
"pixels:57600|129600|230400,fps:7|10|14,kbps_res:0|0|435/");
// Reset encoder for field trials to take effect.
@@ -2804,7 +2914,7 @@
TEST_F(VideoStreamEncoderTest,
NoAdaptUpInFpsAndResolutionIfBwEstimateIsLessThanMinBitrate) {
- webrtc::test::ScopedFieldTrials field_trials(
+ test::ScopedFieldTrials field_trials(
"WebRTC-Video-BalancedDegradationSettings/"
"pixels:57600|129600|230400,fps:7|10|14,kbps:0|0|425,kbps_res:0|0|435/");
// Reset encoder for field trials to take effect.