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 359a01385a6db817de5eb1edf4637d1e548ec73e..9870685ebbcefe3de4cf7026762a0a3f343526fb 100644 |
--- a/webrtc/video/video_send_stream_tests.cc |
+++ b/webrtc/video/video_send_stream_tests.cc |
@@ -36,6 +36,7 @@ |
#include "webrtc/test/null_transport.h" |
#include "webrtc/test/rtcp_packet_parser.h" |
#include "webrtc/test/testsupport/perf_test.h" |
+#include "webrtc/test/field_trial.h" |
#include "webrtc/video/send_statistics_proxy.h" |
#include "webrtc/video/transport_adapter.h" |
@@ -1502,21 +1503,27 @@ TEST_F(VideoSendStreamTest, ChangingTransportOverhead) { |
} |
Action OnSendRtp(const uint8_t* packet, size_t length) override { |
- EXPECT_LE(length, |
- IP_PACKET_SIZE - static_cast<size_t>(transport_overhead_)); |
+ EXPECT_LE(length, kMaxRtpPacketSize); |
if (++packets_sent_ < 100) |
return SEND_PACKET; |
observation_complete_.Set(); |
return SEND_PACKET; |
} |
+ void ModifyVideoConfigs( |
+ VideoSendStream::Config* send_config, |
+ std::vector<VideoReceiveStream::Config>* receive_configs, |
+ VideoEncoderConfig* encoder_config) override { |
+ send_config->rtp.max_packet_size = kMaxRtpPacketSize; |
+ } |
+ |
void PerformTest() override { |
- transport_overhead_ = 500; |
+ transport_overhead_ = 100; |
call_->OnTransportOverheadChanged(webrtc::MediaType::VIDEO, |
transport_overhead_); |
EXPECT_TRUE(Wait()); |
packets_sent_ = 0; |
- transport_overhead_ = 1000; |
+ transport_overhead_ = 500; |
call_->OnTransportOverheadChanged(webrtc::MediaType::VIDEO, |
transport_overhead_); |
EXPECT_TRUE(Wait()); |
@@ -1526,6 +1533,7 @@ TEST_F(VideoSendStreamTest, ChangingTransportOverhead) { |
Call* call_; |
int packets_sent_; |
int transport_overhead_; |
+ const size_t kMaxRtpPacketSize = 1000; |
} test; |
RunBaseTest(&test); |
@@ -3173,4 +3181,68 @@ TEST_F(VideoSendStreamTest, |
TestRequestSourceRotateVideo(true); |
} |
+// This test verifies that overhead is removed from the bandwidth estimate by |
+// testing that the maximum possible target payload rate is smaller than the |
+// maximum bandwidth estimate by the overhead rate. |
+TEST_F(VideoSendStreamTest, RemoveOverheadFromBandwidth) { |
+ test::ScopedFieldTrials override_field_trials( |
+ "WebRTC-SendSideBwe-WithOverhead/Enabled/"); |
+ class RemoveOverheadFromBandwidthTest : public test::EndToEndTest, |
+ public test::FakeEncoder { |
+ public: |
+ RemoveOverheadFromBandwidthTest() |
+ : EndToEndTest(test::CallTest::kDefaultTimeoutMs), |
+ FakeEncoder(Clock::GetRealTimeClock()), |
+ call_(nullptr), |
+ max_bitrate_kbps_(0) {} |
+ |
+ int32_t SetRateAllocation(const BitrateAllocation& bitrate, |
+ uint32_t frameRate) override { |
+ rtc::CritScope lock(&crit_); |
+ if (max_bitrate_kbps_ < bitrate.get_sum_kbps()) |
+ max_bitrate_kbps_ = bitrate.get_sum_kbps(); |
+ return FakeEncoder::SetRateAllocation(bitrate, frameRate); |
+ } |
+ |
+ void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
+ call_ = sender_call; |
+ } |
+ |
+ void ModifyVideoConfigs( |
+ VideoSendStream::Config* send_config, |
+ std::vector<VideoReceiveStream::Config>* receive_configs, |
+ VideoEncoderConfig* encoder_config) override { |
+ send_config->rtp.max_packet_size = 1200; |
+ send_config->encoder_settings.encoder = this; |
+ EXPECT_FALSE(send_config->rtp.extensions.empty()); |
+ } |
+ |
+ void PerformTest() override { |
+ call_->OnTransportOverheadChanged(webrtc::MediaType::VIDEO, 20); |
+ Call::Config::BitrateConfig bitrate_config; |
+ constexpr int kStartBitrateBps = 50000; |
+ constexpr int kMaxBitrateBps = 60000; |
+ bitrate_config.start_bitrate_bps = kStartBitrateBps; |
+ bitrate_config.max_bitrate_bps = kMaxBitrateBps; |
+ call_->SetBitrateConfig(bitrate_config); |
+ |
+ // At a bitrate of 60kbps with a packet size of 1200B video and an |
+ // overhead of 40B per packet video produces 2kbps overhead. |
+ // So with a BWE should reach 58kbps but not 60kbps. |
+ Wait(); |
+ { |
+ rtc::CritScope lock(&crit_); |
+ EXPECT_EQ(58u, max_bitrate_kbps_); |
+ } |
+ } |
+ |
+ private: |
+ Call* call_; |
+ rtc::CriticalSection crit_; |
+ uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_); |
+ } test; |
+ |
+ RunBaseTest(&test); |
+} |
+ |
} // namespace webrtc |