Chromium Code Reviews| 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 { |
|
perkj_webrtc
2016/07/04 14:51:12
name MaxPaddingSetTest?
sprang_webrtc
2016/07/05 11:29:31
Done.
|
| + 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; |
|
perkj_webrtc
2016/07/04 14:51:12
are all these modifications really needed?
sprang_webrtc
2016/07/05 11:29:31
Nope. Removed most.
|
| + 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 { |
|
perkj_webrtc
2016/07/04 14:51:12
not needed any more?
sprang_webrtc
2016/07/05 11:29:31
Done.
|
| + // 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); |
|
perkj_webrtc
2016/07/04 14:51:12
why not simply call this max_padding_bitrate_bps ?
sprang_webrtc
2016/07/05 11:29:31
As discussed offline, yes and no. :)
Changed anyho
|
| + |
| + // Wait until at least kMinFramesToSend frames have been encoded, so that |
| + // we have reliable data. |
| + if (++frames_sent_ < kMinFramesToSend) |
|
perkj_webrtc
2016/07/04 14:51:12
nit frames_encoded_ ?
sprang_webrtc
2016/07/05 11:29:31
Acknowledged.
|
| + 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: |