Index: webrtc/video/vie_encoder_unittest.cc |
diff --git a/webrtc/video/vie_encoder_unittest.cc b/webrtc/video/vie_encoder_unittest.cc |
index 9f4fdc47e33094d3577dbe4f05eb226bfb37a173..e8d5b13e27874f21e238033c2f568908dd1a4c62 100644 |
--- a/webrtc/video/vie_encoder_unittest.cc |
+++ b/webrtc/video/vie_encoder_unittest.cc |
@@ -22,6 +22,8 @@ |
namespace webrtc { |
+using DegredationPreference = VideoSendStream::DegradationPreference; |
+ |
namespace { |
class TestBuffer : public webrtc::I420Buffer { |
public: |
@@ -39,32 +41,31 @@ class TestBuffer : public webrtc::I420Buffer { |
class ViEEncoderUnderTest : public ViEEncoder { |
public: |
- ViEEncoderUnderTest( |
- SendStatisticsProxy* stats_proxy, |
- const webrtc::VideoSendStream::Config::EncoderSettings& settings) |
+ using ScalingObserverInterface::ScaleReason; |
+ ViEEncoderUnderTest(SendStatisticsProxy* stats_proxy, |
+ const VideoSendStream::Config::EncoderSettings& settings) |
: ViEEncoder(1 /* number_of_cores */, |
stats_proxy, |
settings, |
nullptr /* pre_encode_callback */, |
nullptr /* encoder_timing */) {} |
- void TriggerCpuOveruse() { |
+ void PostTaskAndWait(bool down, ScaleReason reason) { |
rtc::Event event(false, false); |
- encoder_queue()->PostTask([this, &event] { |
- OveruseDetected(); |
+ encoder_queue()->PostTask([this, &event, reason, down] { |
+ down ? ScaleDown(reason) : ScaleUp(reason); |
event.Set(); |
}); |
- event.Wait(rtc::Event::kForever); |
+ RTC_DCHECK(event.Wait(5000)); |
} |
- void TriggerCpuNormalUsage() { |
- rtc::Event event(false, false); |
- encoder_queue()->PostTask([this, &event] { |
- NormalUsage(); |
- event.Set(); |
- }); |
- event.Wait(rtc::Event::kForever); |
- } |
+ void TriggerCpuOveruse() { PostTaskAndWait(true, ScaleReason::kCpu); } |
+ |
+ void TriggerCpuNormalUsage() { PostTaskAndWait(false, ScaleReason::kCpu); } |
+ |
+ void TriggerQualityLow() { PostTaskAndWait(true, ScaleReason::kQuality); } |
+ |
+ void TriggerQualityHigh() { PostTaskAndWait(false, ScaleReason::kQuality); } |
}; |
} // namespace |
@@ -134,6 +135,10 @@ class ViEEncoderTest : public ::testing::Test { |
block_next_encode_ = true; |
} |
+ VideoEncoder::ScalingSettings GetScalingSettings() const override { |
+ return VideoEncoder::ScalingSettings(true, 1, 2); |
+ } |
+ |
void ContinueEncode() { continue_encode_event_.Set(); } |
void CheckLastTimeStampsMatch(int64_t ntp_time_ms, |
@@ -427,7 +432,7 @@ TEST_F(ViEEncoderTest, SinkWantsFromOveruseDetector) { |
frame_height /= 2; |
} |
- // Trigger CPU overuse a one more time. This should not trigger request for |
+ // Trigger CPU overuse one more time. This should not trigger a request for |
// lower resolution. |
rtc::VideoSinkWants current_wants = video_source_.sink_wants(); |
video_source_.IncomingCapturedFrame(CreateFrame( |
@@ -533,12 +538,74 @@ TEST_F(ViEEncoderTest, StatsTracksAdaptationStats) { |
vie_encoder_->Stop(); |
} |
-TEST_F(ViEEncoderTest, StatsTracksAdaptationStatsWhenSwitchingSource) { |
+TEST_F(ViEEncoderTest, SwitchingSourceKeepsAdaptation) { |
+ const int kTargetBitrateBps = 100000; |
+ vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
+ |
+ int frame_width = 1280; |
+ int frame_height = 720; |
+ video_source_.IncomingCapturedFrame( |
+ CreateFrame(1, frame_width, frame_height)); |
+ sink_.WaitForEncodedFrame(1); |
+ |
+ VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
+ EXPECT_FALSE(stats.cpu_limited_resolution); |
+ EXPECT_FALSE(stats.bw_limited_resolution); |
+ EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); |
+ |
+ // Set new source with adaptation still enabled. |
+ test::FrameForwarder new_video_source; |
+ vie_encoder_->SetSource(&new_video_source, |
+ VideoSendStream::DegradationPreference::kBalanced); |
+ |
+ new_video_source.IncomingCapturedFrame( |
+ CreateFrame(2, frame_width, frame_height)); |
+ sink_.WaitForEncodedFrame(2); |
+ stats = stats_proxy_->GetStats(); |
+ EXPECT_FALSE(stats.cpu_limited_resolution); |
+ EXPECT_FALSE(stats.bw_limited_resolution); |
+ EXPECT_EQ(0, stats.number_of_cpu_adapt_changes); |
+ |
+ vie_encoder_->TriggerQualityLow(); |
+ |
+ new_video_source.IncomingCapturedFrame( |
+ CreateFrame(3, frame_width, frame_height)); |
+ sink_.WaitForEncodedFrame(3); |
+ stats = stats_proxy_->GetStats(); |
+ EXPECT_FALSE(stats.cpu_limited_resolution); |
+ EXPECT_TRUE(stats.bw_limited_resolution); |
+ |
+ vie_encoder_->SetSource(&new_video_source, |
+ VideoSendStream::DegradationPreference::kBalanced); |
+ |
+ new_video_source.IncomingCapturedFrame( |
+ CreateFrame(4, frame_width, frame_height)); |
+ sink_.WaitForEncodedFrame(4); |
+ stats = stats_proxy_->GetStats(); |
+ EXPECT_FALSE(stats.cpu_limited_resolution); |
+ EXPECT_TRUE(stats.bw_limited_resolution); |
+ |
+ // Set adaptation disabled. |
+ vie_encoder_->SetSource( |
+ &new_video_source, |
+ VideoSendStream::DegradationPreference::kMaintainResolution); |
+ |
+ new_video_source.IncomingCapturedFrame( |
+ CreateFrame(5, frame_width, frame_height)); |
+ sink_.WaitForEncodedFrame(5); |
+ stats = stats_proxy_->GetStats(); |
+ EXPECT_FALSE(stats.cpu_limited_resolution); |
+ EXPECT_FALSE(stats.bw_limited_resolution); |
+ |
+ vie_encoder_->Stop(); |
+} |
+ |
+TEST_F(ViEEncoderTest, StatsTracksQualityAdaptationStatsWhenSwitchingSource) { |
const int kTargetBitrateBps = 100000; |
vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
// Trigger CPU overuse. |
- vie_encoder_->TriggerCpuOveruse(); |
+ vie_encoder_->TriggerQualityLow(); |
int frame_width = 1280; |
int frame_height = 720; |
@@ -547,8 +614,7 @@ TEST_F(ViEEncoderTest, StatsTracksAdaptationStatsWhenSwitchingSource) { |
sink_.WaitForEncodedFrame(1); |
VideoSendStream::Stats stats = stats_proxy_->GetStats(); |
- EXPECT_TRUE(stats.cpu_limited_resolution); |
- EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
+ EXPECT_TRUE(stats.bw_limited_resolution); |
// Set new source with adaptation still enabled. |
test::FrameForwarder new_video_source; |
@@ -559,19 +625,18 @@ TEST_F(ViEEncoderTest, StatsTracksAdaptationStatsWhenSwitchingSource) { |
CreateFrame(2, frame_width, frame_height)); |
sink_.WaitForEncodedFrame(2); |
stats = stats_proxy_->GetStats(); |
- EXPECT_TRUE(stats.cpu_limited_resolution); |
- EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
+ EXPECT_TRUE(stats.bw_limited_resolution); |
// Set adaptation disabled. |
vie_encoder_->SetSource( |
&new_video_source, |
VideoSendStream::DegradationPreference::kMaintainResolution); |
+ |
new_video_source.IncomingCapturedFrame( |
CreateFrame(3, frame_width, frame_height)); |
sink_.WaitForEncodedFrame(3); |
stats = stats_proxy_->GetStats(); |
- EXPECT_FALSE(stats.cpu_limited_resolution); |
- EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
+ EXPECT_FALSE(stats.bw_limited_resolution); |
// Switch back the source with adaptation enabled. |
vie_encoder_->SetSource(&video_source_, |
@@ -580,17 +645,15 @@ TEST_F(ViEEncoderTest, StatsTracksAdaptationStatsWhenSwitchingSource) { |
CreateFrame(4, frame_width, frame_height)); |
sink_.WaitForEncodedFrame(4); |
stats = stats_proxy_->GetStats(); |
- EXPECT_TRUE(stats.cpu_limited_resolution); |
- EXPECT_EQ(1, stats.number_of_cpu_adapt_changes); |
+ EXPECT_TRUE(stats.bw_limited_resolution); |
// Trigger CPU normal usage. |
- vie_encoder_->TriggerCpuNormalUsage(); |
+ vie_encoder_->TriggerQualityHigh(); |
video_source_.IncomingCapturedFrame( |
CreateFrame(5, frame_width, frame_height)); |
sink_.WaitForEncodedFrame(5); |
stats = stats_proxy_->GetStats(); |
- EXPECT_FALSE(stats.cpu_limited_resolution); |
- EXPECT_EQ(2, stats.number_of_cpu_adapt_changes); |
+ EXPECT_FALSE(stats.bw_limited_resolution); |
vie_encoder_->Stop(); |
} |