| Index: webrtc/video/video_send_stream_tests.cc
|
| diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc
|
| index 8adf24717cc374e3d61fd2d8112dfa2716d3592e..25a4df401002e6a1fb4999c4e342d9b009132fe4 100644
|
| --- a/webrtc/video/video_send_stream_tests.cc
|
| +++ b/webrtc/video/video_send_stream_tests.cc
|
| @@ -1121,6 +1121,118 @@ TEST_F(VideoSendStreamTest, MinTransmitBitrateRespectsRemb) {
|
| RunBaseTest(&test);
|
| }
|
|
|
| +class MinTransmitBitrateTest : public test::SendTest, public test::FakeEncoder {
|
| + public:
|
| + static const uint32_t kMinTransmitBitrateBps = 400000;
|
| + static const uint32_t kActualEncodeBitrateBps = 40000;
|
| + static const uint32_t kMinFramesToSend = 10;
|
| +
|
| + explicit MinTransmitBitrateTest(bool test_switch_content_type)
|
| + : SendTest(test::CallTest::kDefaultTimeoutMs),
|
| + FakeEncoder(Clock::GetRealTimeClock()),
|
| + call_(nullptr),
|
| + send_stream_(nullptr),
|
| + frames_sent_(0),
|
| + running_without_padding_(test_switch_content_type) {}
|
| +
|
| + void OnVideoStreamsCreated(
|
| + VideoSendStream* send_stream,
|
| + const std::vector<VideoReceiveStream*>& receive_streams) override {
|
| + send_stream_ = send_stream;
|
| + }
|
| +
|
| + void ModifyVideoConfigs(
|
| + VideoSendStream::Config* send_config,
|
| + std::vector<VideoReceiveStream::Config>* receive_configs,
|
| + VideoEncoderConfig* encoder_config) override {
|
| + send_config->encoder_settings.encoder = this;
|
| + RTC_DCHECK_EQ(1u, encoder_config->streams.size());
|
| + encoder_config->streams[0].target_bitrate_bps = kMinTransmitBitrateBps * 2;
|
| + encoder_config->streams[0].max_bitrate_bps = kMinTransmitBitrateBps * 4;
|
| + if (running_without_padding_) {
|
| + encoder_config->min_transmit_bitrate_bps = 0;
|
| + encoder_config->content_type =
|
| + VideoEncoderConfig::ContentType::kRealtimeVideo;
|
| + } else {
|
| + encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps;
|
| + encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
|
| + }
|
| + encoder_config_ = *encoder_config;
|
| + }
|
| +
|
| + int32_t SetRates(uint32_t new_target_bitrate, uint32_t framerate) override {
|
| + // Make sure not to trigger on any default zero bitrates.
|
| + if (new_target_bitrate == 0)
|
| + return 0;
|
| + rtc::CritScope lock(&crit_);
|
| + return FakeEncoder::SetRates(
|
| + std::min<uint32_t>(new_target_bitrate, kActualEncodeBitrateBps / 1000),
|
| + framerate);
|
| + }
|
| +
|
| + int32_t Encode(const VideoFrame& input_image,
|
| + const CodecSpecificInfo* codec_specific_info,
|
| + const std::vector<FrameType>* frame_types) override {
|
| + int32_t res =
|
| + FakeEncoder::Encode(input_image, codec_specific_info, frame_types);
|
| + CheckDoneState();
|
| + return res;
|
| + }
|
| +
|
| + void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
|
| + call_ = sender_call;
|
| + }
|
| +
|
| + void CheckDoneState() {
|
| + rtc::CritScope lock(&crit_);
|
| +
|
| + if (running_without_padding_)
|
| + EXPECT_EQ(0, call_->GetStats().min_transmit_bitrate_bps);
|
| +
|
| + // Wait until at least kMinFramesToSend frames have been encoded, so that
|
| + // we have reliable data.
|
| + if (++frames_sent_ < kMinFramesToSend)
|
| + return;
|
| +
|
| + if (running_without_padding_) {
|
| + // We've sent kMinFramesToSend frames with default configuration, switch
|
| + // to enabling screen content and setting min transmit bitrate.
|
| + frames_sent_ = 0;
|
| + encoder_config_.min_transmit_bitrate_bps = kMinTransmitBitrateBps;
|
| + encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen;
|
| + send_stream_->ReconfigureVideoEncoder(encoder_config_);
|
| + running_without_padding_ = false;
|
| + return;
|
| + }
|
| +
|
| + // Make sure the pacer has been configured with a min transmit bitrate.
|
| + if (call_->GetStats().min_transmit_bitrate_bps > 0)
|
| + observation_complete_.Set();
|
| + }
|
| +
|
| + void PerformTest() override {
|
| + ASSERT_TRUE(Wait()) << "Timed out waiting for a valid padding bitrate.";
|
| + }
|
| +
|
| + private:
|
| + rtc::CriticalSection crit_;
|
| + Call* call_;
|
| + VideoSendStream* send_stream_;
|
| + VideoEncoderConfig encoder_config_;
|
| + uint32_t frames_sent_ GUARDED_BY(crit_);
|
| + bool running_without_padding_;
|
| +};
|
| +
|
| +TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrate) {
|
| + MinTransmitBitrateTest test(false);
|
| + RunBaseTest(&test);
|
| +}
|
| +
|
| +TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrateAfterContentSwitch) {
|
| + MinTransmitBitrateTest test(true);
|
| + RunBaseTest(&test);
|
| +}
|
| +
|
| TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
|
| class StartBitrateObserver : public test::FakeEncoder {
|
| public:
|
|
|