| 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
|
|
|