Index: webrtc/video/vie_encoder_unittest.cc |
diff --git a/webrtc/video/vie_encoder_unittest.cc b/webrtc/video/vie_encoder_unittest.cc |
index b143e4d54624b405419fd42bc22cf97d66d10590..976cf47bb2fa504033b226c41733257c8804aab3 100644 |
--- a/webrtc/video/vie_encoder_unittest.cc |
+++ b/webrtc/video/vie_encoder_unittest.cc |
@@ -166,6 +166,7 @@ class VideoStreamFactory |
const int framerate_; |
}; |
+ |
class AdaptingFrameForwarder : public test::FrameForwarder { |
public: |
AdaptingFrameForwarder() : adaptation_enabled_(false) {} |
@@ -2944,4 +2945,71 @@ TEST_F(ViEEncoderTest, AdaptWithTwoReasonsAndDifferentOrder_Resolution) { |
vie_encoder_->Stop(); |
} |
+TEST_F(ViEEncoderTest, AcceptsFullHdAdaptedDownSimulcastFrames) { |
+ // Simulates simulcast behavior and makes highest stream resolutions divisible |
+ // by 4. |
+ class CroppingVideoStreamFactory |
+ : public VideoEncoderConfig::VideoStreamFactoryInterface { |
+ public: |
+ explicit CroppingVideoStreamFactory(size_t num_temporal_layers, |
+ int framerate) |
+ : num_temporal_layers_(num_temporal_layers), framerate_(framerate) { |
+ EXPECT_GT(num_temporal_layers, 0u); |
+ EXPECT_GT(framerate, 0); |
+ } |
+ |
+ private: |
+ std::vector<VideoStream> CreateEncoderStreams( |
+ int width, |
+ int height, |
+ const VideoEncoderConfig& encoder_config) override { |
+ std::vector<VideoStream> streams = |
+ test::CreateVideoStreams(width - width % 4, height - height % 4, |
+ encoder_config); |
+ for (VideoStream& stream : streams) { |
+ stream.temporal_layer_thresholds_bps.resize(num_temporal_layers_ - 1); |
+ stream.max_framerate = framerate_; |
+ } |
+ return streams; |
+ } |
+ |
+ const size_t num_temporal_layers_; |
+ const int framerate_; |
+ }; |
+ |
+ const int kFrameWidth = 1920; |
+ const int kFrameHeight = 1080; |
+ // 3/4 of 1920. |
+ const int kAdaptedFrameWidth = 1440; |
+ // 3/4 of 1080 rounded down to multiple of 4. |
+ const int kAdaptedFrameHeight = 808; |
+ const int kFramerate = 24; |
+ |
+ vie_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0); |
+ // Trigger reconfigure encoder (without resetting the entire instance). |
+ VideoEncoderConfig video_encoder_config; |
+ video_encoder_config.max_bitrate_bps = kTargetBitrateBps; |
+ video_encoder_config.number_of_streams = 1; |
+ video_encoder_config.video_stream_factory = |
+ new rtc::RefCountedObject<CroppingVideoStreamFactory>(1, kFramerate); |
+ vie_encoder_->ConfigureEncoder(std::move(video_encoder_config), |
+ kMaxPayloadLength, false); |
+ vie_encoder_->WaitUntilTaskQueueIsIdle(); |
+ |
+ video_source_.set_adaptation_enabled(true); |
+ |
+ video_source_.IncomingCapturedFrame( |
+ CreateFrame(1, kFrameWidth, kFrameHeight)); |
+ sink_.WaitForEncodedFrame(kFrameWidth, kFrameHeight); |
+ |
+ // Trigger CPU overuse, downscale by 3/4. |
+ vie_encoder_->TriggerCpuOveruse(); |
+ video_source_.IncomingCapturedFrame( |
+ CreateFrame(2, kFrameWidth, kFrameHeight)); |
+ sink_.WaitForEncodedFrame(kAdaptedFrameWidth, kAdaptedFrameHeight); |
+ |
+ vie_encoder_->Stop(); |
+} |
+ |
+ |
} // namespace webrtc |