diff options
Diffstat (limited to 'video/rampup_tests.cc')
-rw-r--r-- | video/rampup_tests.cc | 125 |
1 files changed, 74 insertions, 51 deletions
diff --git a/video/rampup_tests.cc b/video/rampup_tests.cc index c86963d0..94f1c19d 100644 --- a/video/rampup_tests.cc +++ b/video/rampup_tests.cc @@ -38,8 +38,9 @@ namespace webrtc { namespace { -static const int kAbsoluteSendTimeExtensionId = 7; +static const int kTransmissionTimeOffsetExtensionId = 6; static const int kMaxPacketSize = 1500; +static const unsigned int kSingleStreamTargetBps = 1000000; class StreamObserver : public newapi::Transport, public RemoteBitrateObserver { public: @@ -57,6 +58,7 @@ class StreamObserver : public newapi::Transport, public RemoteBitrateObserver { new RTPPayloadRegistry(RTPPayloadStrategy::CreateStrategy(false))), crit_(CriticalSectionWrapper::CreateCriticalSection()), expected_bitrate_bps_(0), + start_bitrate_bps_(0), rtx_media_ssrcs_(rtx_media_ssrcs), total_sent_(0), padding_sent_(0), @@ -75,8 +77,8 @@ class StreamObserver : public newapi::Transport, public RemoteBitrateObserver { rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); rtp_rtcp_->SetREMBStatus(true); rtp_rtcp_->SetRTCPStatus(kRtcpNonCompound); - rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, - kAbsoluteSendTimeExtensionId); + rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, + kTransmissionTimeOffsetExtensionId); AbsoluteSendTimeRemoteBitrateEstimatorFactory rbe_factory; const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000; remote_bitrate_estimator_.reset( @@ -89,10 +91,25 @@ class StreamObserver : public newapi::Transport, public RemoteBitrateObserver { expected_bitrate_bps_ = expected_bitrate_bps; } + void set_start_bitrate_bps(unsigned int start_bitrate_bps) { + CriticalSectionScoped lock(crit_.get()); + start_bitrate_bps_ = start_bitrate_bps; + } + virtual void OnReceiveBitrateChanged(const std::vector<unsigned int>& ssrcs, unsigned int bitrate) OVERRIDE { CriticalSectionScoped lock(crit_.get()); assert(expected_bitrate_bps_ > 0); + if (start_bitrate_bps_ != 0) { + // For tests with an explicitly set start bitrate, verify the first + // bitrate estimate is close to the start bitrate and lower than the + // test target bitrate. This is to verify a call respects the configured + // start bitrate, but due to the BWE implementation we can't guarantee the + // first estimate really is as high as the start bitrate. + EXPECT_GT(bitrate, 0.9 * start_bitrate_bps_); + EXPECT_LT(bitrate, expected_bitrate_bps_); + start_bitrate_bps_ = 0; + } if (bitrate >= expected_bitrate_bps_) { // Just trigger if there was any rtx padding packet. if (rtx_media_ssrcs_.empty() || rtx_media_sent_ > 0) { @@ -178,6 +195,7 @@ class StreamObserver : public newapi::Transport, public RemoteBitrateObserver { const scoped_ptr<CriticalSectionWrapper> crit_; unsigned int expected_bitrate_bps_ GUARDED_BY(crit_); + unsigned int start_bitrate_bps_ GUARDED_BY(crit_); SsrcMap rtx_media_ssrcs_ GUARDED_BY(crit_); size_t total_sent_ GUARDED_BY(crit_); size_t padding_sent_ GUARDED_BY(crit_); @@ -218,8 +236,8 @@ class LowRateStreamObserver : public test::DirectTransport, rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); rtp_rtcp_->SetREMBStatus(true); rtp_rtcp_->SetRTCPStatus(kRtcpNonCompound); - rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, - kAbsoluteSendTimeExtensionId); + rtp_parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, + kTransmissionTimeOffsetExtensionId); AbsoluteSendTimeRemoteBitrateEstimatorFactory rbe_factory; const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 10000; remote_bitrate_estimator_.reset( @@ -400,14 +418,16 @@ class LowRateStreamObserver : public test::DirectTransport, size_t total_overuse_bytes_ GUARDED_BY(crit_); bool suspended_in_stats_ GUARDED_BY(crit_); }; -} +} // namespace class RampUpTest : public ::testing::Test { public: virtual void SetUp() { reserved_ssrcs_.clear(); } protected: - void RunRampUpTest(bool pacing, bool rtx, size_t num_streams) { + void RunRampUpTest(bool rtx, + size_t num_streams, + unsigned int start_bitrate_bps) { std::vector<uint32_t> ssrcs(GenerateSsrcs(num_streams, 100)); std::vector<uint32_t> rtx_ssrcs(GenerateSsrcs(num_streams, 200)); StreamObserver::SsrcMap rtx_ssrc_map; @@ -421,59 +441,61 @@ class RampUpTest : public ::testing::Test { Clock::GetRealTimeClock()); Call::Config call_config(&stream_observer); - webrtc::Config webrtc_config; - call_config.webrtc_config = &webrtc_config; - webrtc_config.Set<PaddingStrategy>(new PaddingStrategy(rtx)); + if (start_bitrate_bps != 0) { + call_config.start_bitrate_bps = start_bitrate_bps; + stream_observer.set_start_bitrate_bps(start_bitrate_bps); + } scoped_ptr<Call> call(Call::Create(call_config)); VideoSendStream::Config send_config = call->GetDefaultSendConfig(); receiver_transport.SetReceiver(call->Receiver()); test::FakeEncoder encoder(Clock::GetRealTimeClock()); - send_config.encoder_settings = - test::CreateEncoderSettings(&encoder, "FAKE", 125, num_streams); + send_config.encoder_settings.encoder = &encoder; + send_config.encoder_settings.payload_type = 125; + send_config.encoder_settings.payload_name = "FAKE"; + std::vector<VideoStream> video_streams = + test::CreateVideoStreams(num_streams); if (num_streams == 1) { - send_config.encoder_settings.streams[0].target_bitrate_bps = 2000000; - send_config.encoder_settings.streams[0].max_bitrate_bps = 2000000; + video_streams[0].target_bitrate_bps = 2000000; + video_streams[0].max_bitrate_bps = 2000000; } - send_config.pacing = pacing; send_config.rtp.nack.rtp_history_ms = 1000; send_config.rtp.ssrcs = ssrcs; if (rtx) { send_config.rtp.rtx.payload_type = 96; send_config.rtp.rtx.ssrcs = rtx_ssrcs; + send_config.rtp.rtx.pad_with_redundant_payloads = true; } send_config.rtp.extensions.push_back( - RtpExtension(RtpExtension::kAbsSendTime, kAbsoluteSendTimeExtensionId)); + RtpExtension(RtpExtension::kTOffset, + kTransmissionTimeOffsetExtensionId)); if (num_streams == 1) { // For single stream rampup until 1mbps - stream_observer.set_expected_bitrate_bps(1000000); + stream_observer.set_expected_bitrate_bps(kSingleStreamTargetBps); } else { // For multi stream rampup until all streams are being sent. That means - // enough birate to sent all the target streams plus the min bitrate of + // enough birate to send all the target streams plus the min bitrate of // the last one. - int expected_bitrate_bps = - send_config.encoder_settings.streams.back().min_bitrate_bps; - for (size_t i = 0; i < send_config.encoder_settings.streams.size() - 1; - ++i) { - expected_bitrate_bps += - send_config.encoder_settings.streams[i].target_bitrate_bps; + int expected_bitrate_bps = video_streams.back().min_bitrate_bps; + for (size_t i = 0; i < video_streams.size() - 1; ++i) { + expected_bitrate_bps += video_streams[i].target_bitrate_bps; } stream_observer.set_expected_bitrate_bps(expected_bitrate_bps); } - VideoSendStream* send_stream = call->CreateVideoSendStream(send_config); + VideoSendStream* send_stream = + call->CreateVideoSendStream(send_config, video_streams, NULL); scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer( - test::FrameGeneratorCapturer::Create( - send_stream->Input(), - send_config.encoder_settings.streams.back().width, - send_config.encoder_settings.streams.back().height, - send_config.encoder_settings.streams.back().max_framerate, - Clock::GetRealTimeClock())); + test::FrameGeneratorCapturer::Create(send_stream->Input(), + video_streams.back().width, + video_streams.back().height, + video_streams.back().max_framerate, + Clock::GetRealTimeClock())); send_stream->Start(); frame_generator_capturer->Start(); @@ -504,23 +526,29 @@ class RampUpTest : public ::testing::Test { receiver_transport.SetReceiver(call->Receiver()); test::FakeEncoder encoder(Clock::GetRealTimeClock()); - send_config.encoder_settings = - test::CreateEncoderSettings(&encoder, "FAKE", 125, number_of_streams); + send_config.encoder_settings.encoder = &encoder; + send_config.encoder_settings.payload_type = 125; + send_config.encoder_settings.payload_name = "FAKE"; + std::vector<VideoStream> video_streams = + test::CreateVideoStreams(number_of_streams); + send_config.rtp.nack.rtp_history_ms = 1000; send_config.rtp.ssrcs.insert( send_config.rtp.ssrcs.begin(), ssrcs.begin(), ssrcs.end()); send_config.rtp.extensions.push_back( - RtpExtension(RtpExtension::kAbsSendTime, kAbsoluteSendTimeExtensionId)); + RtpExtension(RtpExtension::kTOffset, + kTransmissionTimeOffsetExtensionId)); send_config.suspend_below_min_bitrate = true; - VideoSendStream* send_stream = call->CreateVideoSendStream(send_config); + VideoSendStream* send_stream = + call->CreateVideoSendStream(send_config, video_streams, NULL); stream_observer.SetSendStream(send_stream); size_t width = 0; size_t height = 0; - for (size_t i = 0; i < send_config.encoder_settings.streams.size(); ++i) { - size_t stream_width = send_config.encoder_settings.streams[i].width; - size_t stream_height = send_config.encoder_settings.streams[i].height; + for (size_t i = 0; i < video_streams.size(); ++i) { + size_t stream_width = video_streams[i].width; + size_t stream_height = video_streams[i].height; if (stream_width > width) width = stream_width; if (stream_height > height) @@ -559,25 +587,20 @@ class RampUpTest : public ::testing::Test { std::map<uint32_t, bool> reserved_ssrcs_; }; -TEST_F(RampUpTest, SingleStreamWithoutPacing) { - RunRampUpTest(false, false, 1); -} - -TEST_F(RampUpTest, SingleStreamWithPacing) { - RunRampUpTest(true, false, 1); +TEST_F(RampUpTest, SingleStream) { + RunRampUpTest(false, 1, 0); } -TEST_F(RampUpTest, SimulcastWithoutPacing) { - RunRampUpTest(false, false, 3); +TEST_F(RampUpTest, Simulcast) { + RunRampUpTest(false, 3, 0); } -TEST_F(RampUpTest, SimulcastWithPacing) { - RunRampUpTest(true, false, 3); +TEST_F(RampUpTest, SimulcastWithRtx) { + RunRampUpTest(true, 3, 0); } -// TODO(pbos): Re-enable, webrtc:2992. -TEST_F(RampUpTest, DISABLED_SimulcastWithPacingAndRtx) { - RunRampUpTest(true, true, 3); +TEST_F(RampUpTest, SingleStreamWithHighStartBitrate) { + RunRampUpTest(false, 1, 0.9 * kSingleStreamTargetBps); } TEST_F(RampUpTest, UpDownUpOneStream) { RunRampUpDownUpTest(1, false); } |