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 196918a4eb4695d162e95e645ffa579cc51c728a..ed3d281ce209f9c276d601274a6c07a4f059f0a2 100644 |
--- a/webrtc/video/video_send_stream_tests.cc |
+++ b/webrtc/video/video_send_stream_tests.cc |
@@ -1508,22 +1508,32 @@ TEST_F(VideoSendStreamTest, ChangingTransportOverhead) { |
RunBaseTest(&test); |
} |
+// Test class takes takes as argument a switch selecting if type switch should |
+// occur and a function pointer to reset the send stream. This is necessary |
+// since you cannot change the content type of a VideoSendStream, you need to |
+// recreate it. Stopping and recreating the stream can only be done on the main |
+// thread and in the context of VideoSendStreamTest (not BaseTest). |
+template <typename T> |
class MaxPaddingSetTest : public test::SendTest { |
public: |
static const uint32_t kMinTransmitBitrateBps = 400000; |
static const uint32_t kActualEncodeBitrateBps = 40000; |
static const uint32_t kMinPacketsToSend = 50; |
- explicit MaxPaddingSetTest(bool test_switch_content_type) |
+ explicit MaxPaddingSetTest(bool test_switch_content_type, T* stream_reset_fun) |
: SendTest(test::CallTest::kDefaultTimeoutMs), |
+ content_switch_event_(false, false), |
call_(nullptr), |
send_stream_(nullptr), |
+ send_stream_config_(nullptr), |
packets_sent_(0), |
- running_without_padding_(test_switch_content_type) {} |
+ running_without_padding_(test_switch_content_type), |
+ stream_resetter_(stream_reset_fun) {} |
void OnVideoStreamsCreated( |
VideoSendStream* send_stream, |
const std::vector<VideoReceiveStream*>& receive_streams) override { |
+ rtc::CritScope lock(&crit_); |
send_stream_ = send_stream; |
} |
@@ -1532,7 +1542,7 @@ class MaxPaddingSetTest : public test::SendTest { |
std::vector<VideoReceiveStream::Config>* receive_configs, |
VideoEncoderConfig* encoder_config) override { |
RTC_DCHECK_EQ(1, encoder_config->number_of_streams); |
- if (running_without_padding_) { |
+ if (RunningWithoutPadding()) { |
encoder_config->min_transmit_bitrate_bps = 0; |
encoder_config->content_type = |
VideoEncoderConfig::ContentType::kRealtimeVideo; |
@@ -1540,6 +1550,7 @@ class MaxPaddingSetTest : public test::SendTest { |
encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps; |
encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen; |
} |
+ send_stream_config_ = send_config->Copy(); |
encoder_config_ = encoder_config->Copy(); |
} |
@@ -1549,7 +1560,6 @@ class MaxPaddingSetTest : public test::SendTest { |
Action OnSendRtp(const uint8_t* packet, size_t length) override { |
rtc::CritScope lock(&crit_); |
- |
if (running_without_padding_) |
EXPECT_EQ(0, call_->GetStats().max_padding_bitrate_bps); |
@@ -1561,11 +1571,12 @@ class MaxPaddingSetTest : public test::SendTest { |
if (running_without_padding_) { |
// We've sent kMinPacketsToSend packets with default configuration, switch |
// to enabling screen content and setting min transmit bitrate. |
+ // Note that we need to recreate the stream if changing content type. |
packets_sent_ = 0; |
encoder_config_.min_transmit_bitrate_bps = kMinTransmitBitrateBps; |
encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen; |
- send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy()); |
running_without_padding_ = false; |
+ content_switch_event_.Set(); |
return SEND_PACKET; |
} |
@@ -1577,25 +1588,57 @@ class MaxPaddingSetTest : public test::SendTest { |
} |
void PerformTest() override { |
+ if (RunningWithoutPadding()) { |
+ ASSERT_TRUE( |
+ content_switch_event_.Wait(test::CallTest::kDefaultTimeoutMs)); |
+ rtc::CritScope lock(&crit_); |
+ RTC_DCHECK(stream_resetter_); |
+ (*stream_resetter_)(send_stream_config_, encoder_config_); |
+ } |
+ |
ASSERT_TRUE(Wait()) << "Timed out waiting for a valid padding bitrate."; |
} |
private: |
+ bool RunningWithoutPadding() const { |
+ rtc::CritScope lock(&crit_); |
+ return running_without_padding_; |
+ } |
+ |
rtc::CriticalSection crit_; |
+ rtc::Event content_switch_event_; |
Call* call_; |
- VideoSendStream* send_stream_; |
+ VideoSendStream* send_stream_ GUARDED_BY(crit_); |
+ VideoSendStream::Config send_stream_config_; |
VideoEncoderConfig encoder_config_; |
uint32_t packets_sent_ GUARDED_BY(crit_); |
bool running_without_padding_; |
+ T* const stream_resetter_; |
}; |
TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrate) { |
- MaxPaddingSetTest test(false); |
+ auto reset_fun = [](const VideoSendStream::Config& send_stream_config, |
+ const VideoEncoderConfig& encoder_config) {}; |
+ MaxPaddingSetTest<decltype(reset_fun)> test(false, &reset_fun); |
RunBaseTest(&test); |
} |
TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrateAfterContentSwitch) { |
- MaxPaddingSetTest test(true); |
+ // Function for removing and recreating the send stream with a new config. |
+ auto reset_fun = [this](const VideoSendStream::Config& send_stream_config, |
+ const VideoEncoderConfig& encoder_config) { |
+ Stop(); |
+ sender_call_->DestroyVideoSendStream(video_send_stream_); |
+ video_send_config_ = send_stream_config.Copy(); |
+ video_encoder_config_ = encoder_config.Copy(); |
+ video_send_stream_ = sender_call_->CreateVideoSendStream( |
+ video_send_config_.Copy(), video_encoder_config_.Copy()); |
+ video_send_stream_->SetSource( |
+ frame_generator_capturer_.get(), |
+ VideoSendStream::DegradationPreference::kMaintainResolution); |
+ Start(); |
+ }; |
+ MaxPaddingSetTest<decltype(reset_fun)> test(true, &reset_fun); |
RunBaseTest(&test); |
} |
@@ -2065,6 +2108,7 @@ TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) { |
std::vector<VideoReceiveStream::Config>* receive_configs, |
VideoEncoderConfig* encoder_config) override { |
send_config->encoder_settings.encoder = this; |
+ encoder_config->max_bitrate_bps = kFirstMaxBitrateBps; |
encoder_config_ = encoder_config->Copy(); |
} |
@@ -2079,10 +2123,10 @@ TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) { |
size_t max_payload_size) override { |
if (num_initializations_ == 0) { |
// Verify default values. |
- EXPECT_EQ(kRealtimeVideo, config->mode); |
+ EXPECT_EQ(kFirstMaxBitrateBps / 1000, config->maxBitrate); |
} else { |
// Verify that changed values are propagated. |
- EXPECT_EQ(kScreensharing, config->mode); |
+ EXPECT_EQ(kSecondMaxBitrateBps / 1000, config->maxBitrate); |
} |
++num_initializations_; |
init_encode_event_.Set(); |
@@ -2093,7 +2137,7 @@ TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) { |
EXPECT_TRUE(init_encode_event_.Wait(kDefaultTimeoutMs)); |
EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized."; |
- encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen; |
+ encoder_config_.max_bitrate_bps = kSecondMaxBitrateBps; |
stream_->ReconfigureVideoEncoder(std::move(encoder_config_)); |
EXPECT_TRUE(init_encode_event_.Wait(kDefaultTimeoutMs)); |
EXPECT_EQ(2u, num_initializations_) |
@@ -2101,6 +2145,9 @@ TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) { |
"new encoder settings."; |
} |
+ const uint32_t kFirstMaxBitrateBps = 1000000; |
+ const uint32_t kSecondMaxBitrateBps = 2000000; |
+ |
rtc::Event init_encode_event_; |
size_t num_initializations_; |
VideoSendStream* stream_; |