From a8336d3cf4cd3620ae4ca2dfd2022431fbbef3ad Mon Sep 17 00:00:00 2001 From: Florent Castelli Date: Mon, 9 Sep 2019 13:36:55 +0200 Subject: [PATCH] Connect the stable target rate to the video encoders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stable target rate is used to make smarter choices in the rate to chose which layers to enable in SVC or simulcast modes. the addition of hysteresis, we can improve a call quality by reducing the amount of resolution switch. Bug: webrtc:10126 Change-Id: I04d0df9e6bbe247e2f2a668207ff74d475e2464c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/150642 Reviewed-by: Niels Moller Reviewed-by: Erik Språng Commit-Queue: Florent Castelli Cr-Commit-Position: refs/heads/master@{#29112} --- api/video/video_stream_encoder_interface.h | 4 + video/test/mock_video_stream_encoder.h | 3 +- video/video_send_stream_impl.cc | 24 +- video/video_send_stream_impl_unittest.cc | 24 +- video/video_stream_encoder.cc | 34 +-- video/video_stream_encoder.h | 5 +- video/video_stream_encoder_unittest.cc | 260 ++++++++++++++------- 7 files changed, 238 insertions(+), 116 deletions(-) diff --git a/api/video/video_stream_encoder_interface.h b/api/video/video_stream_encoder_interface.h index 32bfc49ee8..d2a90bb00f 100644 --- a/api/video/video_stream_encoder_interface.h +++ b/api/video/video_stream_encoder_interface.h @@ -85,10 +85,14 @@ class VideoStreamEncoderInterface : public rtc::VideoSinkInterface { // Set the currently estimated network properties. A |target_bitrate| // of zero pauses the encoder. + // |stable_target_bitrate| is a filtered version of |target_bitrate|. It is + // always less or equal to it. It can be used to avoid rapid changes of + // expensive encoding settings, such as resolution. // |link_allocation| is the bandwidth available for this video stream on the // network link. It is always at least |target_bitrate| but may be higher // if we are not network constrained. virtual void OnBitrateUpdated(DataRate target_bitrate, + DataRate stable_target_bitrate, DataRate link_allocation, uint8_t fraction_lost, int64_t round_trip_time_ms) = 0; diff --git a/video/test/mock_video_stream_encoder.h b/video/test/mock_video_stream_encoder.h index a5d153453d..494419dffd 100644 --- a/video/test/mock_video_stream_encoder.h +++ b/video/test/mock_video_stream_encoder.h @@ -24,7 +24,8 @@ class MockVideoStreamEncoder : public VideoStreamEncoderInterface { MOCK_METHOD1(SetStartBitrate, void(int)); MOCK_METHOD0(SendKeyFrame, void()); MOCK_METHOD1(OnLossNotification, void(const VideoEncoder::LossNotification&)); - MOCK_METHOD4(OnBitrateUpdated, void(DataRate, DataRate, uint8_t, int64_t)); + MOCK_METHOD5(OnBitrateUpdated, + void(DataRate, DataRate, DataRate, uint8_t, int64_t)); MOCK_METHOD1(OnFrame, void(const VideoFrame&)); MOCK_METHOD1(SetBitrateAllocationObserver, void(VideoBitrateAllocationObserver*)); diff --git a/video/video_send_stream_impl.cc b/video/video_send_stream_impl.cc index 76caeecdca..e333091575 100644 --- a/video/video_send_stream_impl.cc +++ b/video/video_send_stream_impl.cc @@ -451,8 +451,8 @@ void VideoSendStreamImpl::Stop() { void VideoSendStreamImpl::StopVideoSendStream() { bitrate_allocator_->RemoveObserver(this); check_encoder_activity_task_.Stop(); - video_stream_encoder_->OnBitrateUpdated(DataRate::Zero(), DataRate::Zero(), 0, - 0); + video_stream_encoder_->OnBitrateUpdated(DataRate::Zero(), DataRate::Zero(), + DataRate::Zero(), 0, 0); stats_proxy_->OnSetEncoderTargetRate(0); } @@ -690,6 +690,12 @@ uint32_t VideoSendStreamImpl::OnBitrateUpdated(BitrateAllocationUpdate update) { RTC_DCHECK(rtp_video_sender_->IsActive()) << "VideoSendStream::Start has not been called."; + // When the BWE algorithm doesn't pass a stable estimate, we'll use the + // unstable one instead. + if (update.stable_target_bitrate.IsZero()) { + update.stable_target_bitrate = update.target_bitrate; + } + rtp_video_sender_->OnBitrateUpdated( update.target_bitrate.bps(), rtc::dchecked_cast(update.packet_loss_ratio * 256), @@ -702,13 +708,25 @@ uint32_t VideoSendStreamImpl::OnBitrateUpdated(BitrateAllocationUpdate update) { link_allocation = DataRate::bps(encoder_target_rate_bps_ - protection_bitrate_bps); } + DataRate overhead = + update.target_bitrate - DataRate::bps(encoder_target_rate_bps_); + DataRate encoder_stable_target_rate = update.stable_target_bitrate; + if (encoder_stable_target_rate > overhead) { + encoder_stable_target_rate = encoder_stable_target_rate - overhead; + } else { + encoder_stable_target_rate = DataRate::bps(encoder_target_rate_bps_); + } + encoder_target_rate_bps_ = std::min(encoder_max_bitrate_bps_, encoder_target_rate_bps_); + encoder_stable_target_rate = std::min(DataRate::bps(encoder_max_bitrate_bps_), + encoder_stable_target_rate); + DataRate encoder_target_rate = DataRate::bps(encoder_target_rate_bps_); link_allocation = std::max(encoder_target_rate, link_allocation); video_stream_encoder_->OnBitrateUpdated( - encoder_target_rate, link_allocation, + encoder_target_rate, encoder_stable_target_rate, link_allocation, rtc::dchecked_cast(update.packet_loss_ratio * 256), update.round_trip_time.ms()); stats_proxy_->OnSetEncoderTargetRate(encoder_target_rate_bps_); diff --git a/video/video_send_stream_impl_unittest.cc b/video/video_send_stream_impl_unittest.cc index 1d3312921d..b56cf433ef 100644 --- a/video/video_send_stream_impl_unittest.cc +++ b/video/video_send_stream_impl_unittest.cc @@ -659,15 +659,17 @@ TEST_F(VideoSendStreamImplTest, CallsVideoStreamEncoderOnBitrateUpdate) { DataRate::bps(qvga_stream.target_bitrate_bps); BitrateAllocationUpdate update; update.target_bitrate = network_constrained_rate; + update.stable_target_bitrate = network_constrained_rate; update.round_trip_time = TimeDelta::ms(1); EXPECT_CALL(rtp_video_sender_, OnBitrateUpdated(network_constrained_rate.bps(), _, update.round_trip_time.ms(), _)); EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps()) .WillOnce(Return(network_constrained_rate.bps())); - EXPECT_CALL(video_stream_encoder_, - OnBitrateUpdated(network_constrained_rate, - network_constrained_rate, 0, _)); + EXPECT_CALL( + video_stream_encoder_, + OnBitrateUpdated(network_constrained_rate, network_constrained_rate, + network_constrained_rate, 0, _)); static_cast(vss_impl.get()) ->OnBitrateUpdated(update); @@ -683,8 +685,10 @@ TEST_F(VideoSendStreamImplTest, CallsVideoStreamEncoderOnBitrateUpdate) { EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps()) .WillOnce(Return(rate_with_headroom.bps())); EXPECT_CALL(video_stream_encoder_, - OnBitrateUpdated(qvga_max_bitrate, rate_with_headroom, 0, _)); + OnBitrateUpdated(qvga_max_bitrate, qvga_max_bitrate, + rate_with_headroom, 0, _)); update.target_bitrate = rate_with_headroom; + update.stable_target_bitrate = rate_with_headroom; static_cast(vss_impl.get()) ->OnBitrateUpdated(update); @@ -701,9 +705,9 @@ TEST_F(VideoSendStreamImplTest, CallsVideoStreamEncoderOnBitrateUpdate) { .WillOnce(Return(rate_with_headroom.bps())); const DataRate headroom_minus_protection = rate_with_headroom - DataRate::bps(protection_bitrate_bps); - EXPECT_CALL( - video_stream_encoder_, - OnBitrateUpdated(qvga_max_bitrate, headroom_minus_protection, 0, _)); + EXPECT_CALL(video_stream_encoder_, + OnBitrateUpdated(qvga_max_bitrate, qvga_max_bitrate, + headroom_minus_protection, 0, _)); static_cast(vss_impl.get()) ->OnBitrateUpdated(update); @@ -717,13 +721,15 @@ TEST_F(VideoSendStreamImplTest, CallsVideoStreamEncoderOnBitrateUpdate) { EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps()) .WillOnce(Return(rate_with_headroom.bps())); EXPECT_CALL(video_stream_encoder_, - OnBitrateUpdated(qvga_max_bitrate, qvga_max_bitrate, 0, _)); + OnBitrateUpdated(qvga_max_bitrate, qvga_max_bitrate, + qvga_max_bitrate, 0, _)); static_cast(vss_impl.get()) ->OnBitrateUpdated(update); // Set rates to zero on stop. EXPECT_CALL(video_stream_encoder_, - OnBitrateUpdated(DataRate::Zero(), DataRate::Zero(), 0, 0)); + OnBitrateUpdated(DataRate::Zero(), DataRate::Zero(), + DataRate::Zero(), 0, 0)); vss_impl->Stop(); }); } diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc index 0af1628c0f..61a6f2fc5e 100644 --- a/video/video_stream_encoder.cc +++ b/video/video_stream_encoder.cc @@ -438,23 +438,28 @@ class VideoStreamEncoder::VideoSourceProxy { }; VideoStreamEncoder::EncoderRateSettings::EncoderRateSettings() - : VideoEncoder::RateControlParameters(), encoder_target(DataRate::Zero()) {} + : VideoEncoder::RateControlParameters(), + encoder_target(DataRate::Zero()), + stable_encoder_target(DataRate::Zero()) {} VideoStreamEncoder::EncoderRateSettings::EncoderRateSettings( const VideoBitrateAllocation& bitrate, double framerate_fps, DataRate bandwidth_allocation, - DataRate encoder_target) + DataRate encoder_target, + DataRate stable_encoder_target) : VideoEncoder::RateControlParameters(bitrate, framerate_fps, bandwidth_allocation), - encoder_target(encoder_target) {} + encoder_target(encoder_target), + stable_encoder_target(stable_encoder_target) {} bool VideoStreamEncoder::EncoderRateSettings::operator==( const EncoderRateSettings& rhs) const { return bitrate == rhs.bitrate && framerate_fps == rhs.framerate_fps && bandwidth_allocation == rhs.bandwidth_allocation && - encoder_target == rhs.encoder_target; + encoder_target == rhs.encoder_target && + stable_encoder_target == rhs.stable_encoder_target; } bool VideoStreamEncoder::EncoderRateSettings::operator!=( @@ -1123,8 +1128,8 @@ VideoStreamEncoder::UpdateBitrateAllocationAndNotifyObserver( // might cap the bitrate to the min bitrate configured. if (rate_allocator_ && rate_settings.encoder_target > DataRate::Zero()) { new_allocation = rate_allocator_->Allocate(VideoBitrateAllocationParameters( - rate_settings.encoder_target.bps(), - static_cast(rate_settings.framerate_fps + 0.5))); + rate_settings.encoder_target, rate_settings.stable_encoder_target, + rate_settings.framerate_fps)); } if (bitrate_observer_ && new_allocation.get_sum_bps() > 0) { @@ -1695,15 +1700,17 @@ void VideoStreamEncoder::OnDroppedFrame(DropReason reason) { } void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate, + DataRate stable_target_bitrate, DataRate link_allocation, uint8_t fraction_lost, int64_t round_trip_time_ms) { RTC_DCHECK_GE(link_allocation, target_bitrate); if (!encoder_queue_.IsCurrent()) { - encoder_queue_.PostTask([this, target_bitrate, link_allocation, - fraction_lost, round_trip_time_ms] { - OnBitrateUpdated(target_bitrate, link_allocation, fraction_lost, - round_trip_time_ms); + encoder_queue_.PostTask([this, target_bitrate, stable_target_bitrate, + link_allocation, fraction_lost, + round_trip_time_ms] { + OnBitrateUpdated(target_bitrate, stable_target_bitrate, link_allocation, + fraction_lost, round_trip_time_ms); }); return; } @@ -1711,6 +1718,7 @@ void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate, RTC_DCHECK(sink_) << "sink_ must be set before the encoder is active."; RTC_LOG(LS_VERBOSE) << "OnBitrateUpdated, bitrate " << target_bitrate.bps() + << " stable bitrate = " << stable_target_bitrate.bps() << " link allocation bitrate = " << link_allocation.bps() << " packet loss " << static_cast(fraction_lost) << " rtt " << round_trip_time_ms; @@ -1754,9 +1762,9 @@ void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate, const bool video_is_suspended = target_bitrate == DataRate::Zero(); const bool video_suspension_changed = video_is_suspended != EncoderPaused(); - EncoderRateSettings new_rate_settings{VideoBitrateAllocation(), - static_cast(framerate_fps), - link_allocation, target_bitrate}; + EncoderRateSettings new_rate_settings{ + VideoBitrateAllocation(), static_cast(framerate_fps), + link_allocation, target_bitrate, stable_target_bitrate}; SetEncoderRates(UpdateBitrateAllocationAndNotifyObserver(new_rate_settings)); encoder_start_bitrate_bps_ = target_bitrate.bps() != 0 diff --git a/video/video_stream_encoder.h b/video/video_stream_encoder.h index b7070f65d0..4a490d7ced 100644 --- a/video/video_stream_encoder.h +++ b/video/video_stream_encoder.h @@ -91,6 +91,7 @@ class VideoStreamEncoder : public VideoStreamEncoderInterface, const VideoEncoder::LossNotification& loss_notification) override; void OnBitrateUpdated(DataRate target_bitrate, + DataRate stable_target_bitrate, DataRate target_headroom, uint8_t fraction_lost, int64_t round_trip_time_ms) override; @@ -123,7 +124,8 @@ class VideoStreamEncoder : public VideoStreamEncoderInterface, EncoderRateSettings(const VideoBitrateAllocation& bitrate, double framerate_fps, DataRate bandwidth_allocation, - DataRate encoder_target); + DataRate encoder_target, + DataRate stable_encoder_target); bool operator==(const EncoderRateSettings& rhs) const; bool operator!=(const EncoderRateSettings& rhs) const; @@ -134,6 +136,7 @@ class VideoStreamEncoder : public VideoStreamEncoderInterface, // |using last_encoder_rate_setings_->bitrate.get_sum_bps()|, may trick it // into thinking the available bitrate has decreased since the last call. DataRate encoder_target; + DataRate stable_encoder_target; }; void ConfigureEncoderOnTaskQueue(VideoEncoderConfig config, diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc index 3b80f8544b..4f0f23374a 100644 --- a/video/video_stream_encoder_unittest.cc +++ b/video/video_stream_encoder_unittest.cc @@ -505,9 +505,9 @@ class VideoStreamEncoderTest : public ::testing::Test { EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) .Times(1); - video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kTargetBitrateBps), - DataRate::bps(kTargetBitrateBps), 0, - 0); + video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame( CreateFrame(1, codec_width_, codec_height_)); @@ -1090,7 +1090,8 @@ class VideoStreamEncoderTest : public ::testing::Test { TEST_F(VideoStreamEncoderTest, EncodeOneFrame) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); rtc::Event frame_destroyed_event; video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event)); WaitForEncodedFrame(1); @@ -1109,7 +1110,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesBeforeFirstOnBitrateUpdated) { EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs)); video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // The pending frame should be received. WaitForEncodedFrame(2); @@ -1121,12 +1123,13 @@ TEST_F(VideoStreamEncoderTest, DropsFramesBeforeFirstOnBitrateUpdated) { TEST_F(VideoStreamEncoderTest, DropsFramesWhenRateSetToZero) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); WaitForEncodedFrame(1); - video_stream_encoder_->OnBitrateUpdated(DataRate::bps(0), DataRate::bps(0), 0, - 0); + video_stream_encoder_->OnBitrateUpdated(DataRate::bps(0), DataRate::bps(0), + DataRate::bps(0), 0, 0); // The encoder will cache up to one frame for a short duration. Adding two // frames means that the first frame will be dropped and the second frame will // be sent when the encoder is resumed. @@ -1134,7 +1137,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenRateSetToZero) { video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr)); video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); WaitForEncodedFrame(3); video_source_.IncomingCapturedFrame(CreateFrame(4, nullptr)); WaitForEncodedFrame(4); @@ -1143,7 +1147,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenRateSetToZero) { TEST_F(VideoStreamEncoderTest, DropsFramesWithSameOrOldNtpTimestamp) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); WaitForEncodedFrame(1); @@ -1157,7 +1162,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWithSameOrOldNtpTimestamp) { TEST_F(VideoStreamEncoderTest, DropsFrameAfterStop) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); WaitForEncodedFrame(1); @@ -1171,7 +1177,8 @@ TEST_F(VideoStreamEncoderTest, DropsFrameAfterStop) { TEST_F(VideoStreamEncoderTest, DropsPendingFramesOnSlowEncode) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); fake_encoder_.BlockNextEncode(); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); @@ -1188,7 +1195,8 @@ TEST_F(VideoStreamEncoderTest, DropsPendingFramesOnSlowEncode) { TEST_F(VideoStreamEncoderTest, DropFrameWithFailedI420Conversion) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); rtc::Event frame_destroyed_event; video_source_.IncomingCapturedFrame( @@ -1208,7 +1216,8 @@ TEST_F(VideoStreamEncoderTest, DropFrameWithFailedI420ConversionWithCrop) { // Capture a frame at codec_width_/codec_height_. video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); WaitForEncodedFrame(1); // The encoder will have been configured once. @@ -1229,7 +1238,8 @@ TEST_F(VideoStreamEncoderTest, DropFrameWithFailedI420ConversionWithCrop) { TEST_F(VideoStreamEncoderTest, ConfigureEncoderTriggersOnEncoderConfigurationChanged) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); EXPECT_EQ(0, sink_.number_of_reconfigurations()); // Capture a frame and wait for it to synchronize with the encoder thread. @@ -1256,7 +1266,8 @@ TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest, FrameResolutionChangeReconfigureEncoder) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Capture a frame and wait for it to synchronize with the encoder thread. video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); @@ -1282,7 +1293,8 @@ TEST_F(VideoStreamEncoderTest, FrameResolutionChangeReconfigureEncoder) { TEST_F(VideoStreamEncoderTest, EncoderInstanceDestroyedBeforeAnotherInstanceCreated) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Capture a frame and wait for it to synchronize with the encoder thread. video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); @@ -1304,7 +1316,8 @@ TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest, BitrateLimitsChangeReconfigureRateAllocator) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); VideoEncoderConfig video_encoder_config; test::FillEncoderConfiguration(kVideoCodecVP8, 1, &video_encoder_config); @@ -1349,7 +1362,8 @@ TEST_F(VideoStreamEncoderTest, BitrateLimitsChangeReconfigureRateAllocator) { TEST_F(VideoStreamEncoderTest, EncoderRecommendedBitrateLimitsDoNotOverrideAppBitrateLimits) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); VideoEncoderConfig video_encoder_config; test::FillEncoderConfiguration(kVideoCodecVP8, 1, &video_encoder_config); @@ -1441,7 +1455,8 @@ TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest, EncoderRecommendedMaxAndMinBitratesUsedForGivenResolution) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const VideoEncoder::ResolutionBitrateLimits encoder_bitrate_limits_270p( 480 * 270, 34 * 1000, 12 * 1000, 1234 * 1000); @@ -1509,7 +1524,8 @@ TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest, EncoderRecommendedMaxBitrateCapsTargetBitrate) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); VideoEncoderConfig video_encoder_config; test::FillEncoderConfiguration(kVideoCodecVP8, 1, &video_encoder_config); @@ -1579,7 +1595,8 @@ TEST_F(VideoStreamEncoderTest, TestCpuDowngrades_BalancedMode) { // Enable BALANCED preference, no initial limitation. video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_stream_encoder_->SetSource(&video_source_, webrtc::DegradationPreference::BALANCED); VerifyNoLimitation(video_source_.sink_wants()); @@ -1662,7 +1679,8 @@ TEST_F(VideoStreamEncoderTest, TestCpuDowngrades_BalancedMode) { } TEST_F(VideoStreamEncoderTest, SinkWantsStoredByDegradationPreference) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); VerifyNoLimitation(video_source_.sink_wants()); const int kFrameWidth = 1280; @@ -1751,7 +1769,8 @@ TEST_F(VideoStreamEncoderTest, SinkWantsStoredByDegradationPreference) { TEST_F(VideoStreamEncoderTest, StatsTracksQualityAdaptationStats) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const int kWidth = 1280; const int kHeight = 720; @@ -1785,7 +1804,8 @@ TEST_F(VideoStreamEncoderTest, StatsTracksQualityAdaptationStats) { TEST_F(VideoStreamEncoderTest, StatsTracksCpuAdaptationStats) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const int kWidth = 1280; const int kHeight = 720; @@ -1819,7 +1839,8 @@ TEST_F(VideoStreamEncoderTest, StatsTracksCpuAdaptationStats) { TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsCpuAdaptation) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const int kWidth = 1280; const int kHeight = 720; @@ -1888,7 +1909,8 @@ TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsCpuAdaptation) { TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsQualityAdaptation) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const int kWidth = 1280; const int kHeight = 720; @@ -1949,7 +1971,8 @@ TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsQualityAdaptation) { TEST_F(VideoStreamEncoderTest, QualityAdaptationStatsAreResetWhenScalerIsDisabled) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const int kWidth = 1280; const int kHeight = 720; @@ -2005,7 +2028,8 @@ TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest, StatsTracksCpuAdaptationStatsWhenSwitchingSource) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const int kWidth = 1280; const int kHeight = 720; @@ -2142,7 +2166,8 @@ TEST_F(VideoStreamEncoderTest, const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Expect no scaling to begin with. VerifyNoLimitation(video_source_.sink_wants()); @@ -2191,7 +2216,8 @@ TEST_F(VideoStreamEncoderTest, const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable MAINTAIN_FRAMERATE preference, no initial limitation. test::FrameForwarder source; @@ -2224,7 +2250,8 @@ TEST_F(VideoStreamEncoderTest, SkipsSameOrLargerAdaptDownRequest_BalancedMode) { const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. test::FrameForwarder source; @@ -2265,7 +2292,8 @@ TEST_F(VideoStreamEncoderTest, const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable MAINTAIN_FRAMERATE preference, no initial limitation. test::FrameForwarder source; @@ -2292,7 +2320,8 @@ TEST_F(VideoStreamEncoderTest, const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable MAINTAIN_RESOLUTION preference, no initial limitation. test::FrameForwarder source; @@ -2318,7 +2347,8 @@ TEST_F(VideoStreamEncoderTest, NoChangeForInitialNormalUsage_BalancedMode) { const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. test::FrameForwarder source; @@ -2346,7 +2376,8 @@ TEST_F(VideoStreamEncoderTest, NoChangeForInitialNormalUsage_DisabledMode) { const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable DISABLED preference, no initial limitation. test::FrameForwarder source; @@ -2375,7 +2406,8 @@ TEST_F(VideoStreamEncoderTest, const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable MAINTAIN_FRAMERATE preference, no initial limitation. AdaptingFrameForwarder source; @@ -2413,7 +2445,8 @@ TEST_F(VideoStreamEncoderTest, const int kHeight = 720; const int kInputFps = 30; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); VideoSendStream::Stats stats = stats_proxy_->GetStats(); stats.input_frame_rate = kInputFps; @@ -2455,7 +2488,8 @@ TEST_F(VideoStreamEncoderTest, DoesNotScaleBelowSetResolutionLimit) { const size_t kNumFrames = 10; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable adapter, expected input resolutions when downscaling: // 1280x720 -> 960x540 -> 640x360 -> 480x270 -> 320x180 (kMinPixelsPerFrame) @@ -2491,7 +2525,8 @@ TEST_F(VideoStreamEncoderTest, const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable MAINTAIN_FRAMERATE preference, no initial limitation. AdaptingFrameForwarder source; @@ -2550,7 +2585,8 @@ TEST_F(VideoStreamEncoderTest, const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. AdaptingFrameForwarder source; @@ -2616,9 +2652,9 @@ TEST_F(VideoStreamEncoderTest, NoAdaptUpIfBwEstimateIsLessThanMinBitrate) { const int64_t kFrameIntervalMs = 150; const int kMinBitrateBps = 425000; const int kTooLowMinBitrateBps = 424000; - video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kTooLowMinBitrateBps), - DataRate::bps(kTooLowMinBitrateBps), - 0, 0); + video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTooLowMinBitrateBps), DataRate::bps(kTooLowMinBitrateBps), + DataRate::bps(kTooLowMinBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. AdaptingFrameForwarder source; @@ -2666,6 +2702,7 @@ TEST_F(VideoStreamEncoderTest, NoAdaptUpIfBwEstimateIsLessThanMinBitrate) { // Trigger adapt up, expect upscaled fps (target bitrate == min bitrate). video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kMinBitrateBps), + DataRate::bps(kMinBitrateBps), DataRate::bps(kMinBitrateBps), 0, 0); video_stream_encoder_->TriggerQualityHigh(); timestamp_ms += kFrameIntervalMs; @@ -2691,6 +2728,7 @@ TEST_F(VideoStreamEncoderTest, const int kResolutionMinBitrateBps = 435000; const int kTooLowMinResolutionBitrateBps = 434000; video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTooLowMinResolutionBitrateBps), DataRate::bps(kTooLowMinResolutionBitrateBps), DataRate::bps(kTooLowMinResolutionBitrateBps), 0, 0); @@ -2747,6 +2785,7 @@ TEST_F(VideoStreamEncoderTest, // Trigger adapt up, expect upscaled res (target bitrate == min bitrate). video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kResolutionMinBitrateBps), DataRate::bps(kResolutionMinBitrateBps), DataRate::bps(kResolutionMinBitrateBps), 0, 0); video_stream_encoder_->TriggerQualityHigh(); @@ -2774,9 +2813,9 @@ TEST_F(VideoStreamEncoderTest, const int kTooLowMinBitrateBps = 424000; const int kResolutionMinBitrateBps = 435000; const int kTooLowMinResolutionBitrateBps = 434000; - video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kTooLowMinBitrateBps), - DataRate::bps(kTooLowMinBitrateBps), - 0, 0); + video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTooLowMinBitrateBps), DataRate::bps(kTooLowMinBitrateBps), + DataRate::bps(kTooLowMinBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. AdaptingFrameForwarder source; @@ -2823,6 +2862,7 @@ TEST_F(VideoStreamEncoderTest, // Trigger adapt up, expect upscaled fps (target bitrate == min bitrate). video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kMinBitrateBps), + DataRate::bps(kMinBitrateBps), DataRate::bps(kMinBitrateBps), 0, 0); video_stream_encoder_->TriggerQualityHigh(); timestamp_ms += kFrameIntervalMs; @@ -2833,6 +2873,7 @@ TEST_F(VideoStreamEncoderTest, // Trigger adapt up, expect no upscale in res (target bitrate < min bitrate). video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTooLowMinResolutionBitrateBps), DataRate::bps(kTooLowMinResolutionBitrateBps), DataRate::bps(kTooLowMinResolutionBitrateBps), 0, 0); video_stream_encoder_->TriggerQualityHigh(); @@ -2843,6 +2884,7 @@ TEST_F(VideoStreamEncoderTest, // Trigger adapt up, expect upscaled res (target bitrate == min bitrate). video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kResolutionMinBitrateBps), DataRate::bps(kResolutionMinBitrateBps), DataRate::bps(kResolutionMinBitrateBps), 0, 0); video_stream_encoder_->TriggerQualityHigh(); @@ -2860,7 +2902,8 @@ TEST_F(VideoStreamEncoderTest, const int kWidth = 1280; const int kHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable MAINTAIN_FRAMERATE preference, no initial limitation. AdaptingFrameForwarder source; @@ -2998,7 +3041,8 @@ TEST_F(VideoStreamEncoderTest, CpuLimitedHistogramIsReported) { const int kHeight = 360; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) { video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); @@ -3025,7 +3069,8 @@ TEST_F(VideoStreamEncoderTest, CpuLimitedHistogramIsReported) { TEST_F(VideoStreamEncoderTest, CpuLimitedHistogramIsNotReportedForDisabledDegradation) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const int kWidth = 640; const int kHeight = 360; @@ -3057,9 +3102,9 @@ TEST_F(VideoStreamEncoderTest, CallsBitrateObserver) { EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) .Times(1); - video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kLowTargetBitrateBps), - DataRate::bps(kLowTargetBitrateBps), - 0, 0); + video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps), + DataRate::bps(kLowTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame( CreateFrame(rtc::TimeMillis(), codec_width_, codec_height_)); @@ -3164,7 +3209,8 @@ TEST_F(VideoStreamEncoderTest, OveruseDetectorUpdatedOnReconfigureAndAdaption) { const int kFramerate = 24; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); test::FrameForwarder source; video_stream_encoder_->SetSource( &source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); @@ -3225,7 +3271,8 @@ TEST_F(VideoStreamEncoderTest, const int kHighFramerate = 25; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); test::FrameForwarder source; video_stream_encoder_->SetSource( &source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); @@ -3289,7 +3336,8 @@ TEST_F(VideoStreamEncoderTest, const int kFramerate = 24; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); test::FrameForwarder source; video_stream_encoder_->SetSource( &source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); @@ -3335,6 +3383,7 @@ TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest, DropsFramesAndScalesWhenBitrateIsTooLow) { const int kTooLowBitrateForFrameSizeBps = 10000; video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0); const int kWidth = 640; @@ -3366,6 +3415,7 @@ TEST_F(VideoStreamEncoderTest, NumberOfDroppedFramesLimitedWhenBitrateIsTooLow) { const int kTooLowBitrateForFrameSizeBps = 10000; video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0); const int kWidth = 640; @@ -3391,9 +3441,9 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropOffWithMaintainResolutionPreference) { const int kWidth = 640; const int kHeight = 360; - video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kLowTargetBitrateBps), - DataRate::bps(kLowTargetBitrateBps), - 0, 0); + video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps), + DataRate::bps(kLowTargetBitrateBps), 0, 0); // Set degradation preference. video_stream_encoder_->SetSource( @@ -3417,9 +3467,9 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropOffWhenEncoderDisabledScaling) { video_encoder_config.video_format.parameters["foo"] = "foo"; video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config), kMaxPayloadLength); - video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kLowTargetBitrateBps), - DataRate::bps(kLowTargetBitrateBps), - 0, 0); + video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps), + DataRate::bps(kLowTargetBitrateBps), 0, 0); // Force quality scaler reconfiguration by resetting the source. video_stream_encoder_->SetSource(&video_source_, @@ -3443,12 +3493,14 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenBWEstimateReady) { const int kHeight = 360; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); // Frame should not be dropped. WaitForEncodedFrame(1); video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); @@ -3472,12 +3524,14 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenBweDrops) { const int kHeight = 360; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight)); // Frame should not be dropped. WaitForEncodedFrame(1); video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kNotTooLowBitrateForFrameSizeBps), DataRate::bps(kNotTooLowBitrateForFrameSizeBps), DataRate::bps(kNotTooLowBitrateForFrameSizeBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); @@ -3485,6 +3539,7 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenBweDrops) { WaitForEncodedFrame(2); video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0); video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); @@ -3501,7 +3556,8 @@ TEST_F(VideoStreamEncoderTest, const int kTooSmallWidth = 10; const int kTooSmallHeight = 10; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable MAINTAIN_FRAMERATE preference, no initial limitation. test::FrameForwarder source; @@ -3527,7 +3583,8 @@ TEST_F(VideoStreamEncoderTest, const int kTooSmallHeight = 10; const int kFpsLimit = 7; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. test::FrameForwarder source; @@ -3561,7 +3618,8 @@ TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) { fake_encoder_.ForceInitEncodeFailure(true); video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); ResetEncoder("VP8", 2, 1, 1, false); const int kFrameWidth = 1280; const int kFrameHeight = 720; @@ -3575,7 +3633,8 @@ TEST_F(VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) { TEST_F(VideoStreamEncoderTest, AdaptsResolutionOnOveruse_MaintainFramerateMode) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); const int kFrameWidth = 1280; const int kFrameHeight = 720; @@ -3609,7 +3668,8 @@ TEST_F(VideoStreamEncoderTest, const int kFrameHeight = 720; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_stream_encoder_->SetSource( &video_source_, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); video_source_.set_adaptation_enabled(true); @@ -3711,7 +3771,8 @@ TEST_F(VideoStreamEncoderTest, DoesntAdaptDownPastMinFramerate) { ResetEncoder("VP8", 1, 2, 1, true); video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_stream_encoder_->SetSource( &video_source_, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); video_source_.set_adaptation_enabled(true); @@ -3750,7 +3811,8 @@ TEST_F(VideoStreamEncoderTest, const int64_t kFrameIntervalMs = 150; int64_t timestamp_ms = kFrameIntervalMs; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. AdaptingFrameForwarder source; @@ -3931,7 +3993,8 @@ TEST_F(VideoStreamEncoderTest, AdaptWithTwoReasonsAndDifferentOrder_Framerate) { const int64_t kFrameIntervalMs = 150; int64_t timestamp_ms = kFrameIntervalMs; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. AdaptingFrameForwarder source; @@ -4045,7 +4108,8 @@ TEST_F(VideoStreamEncoderTest, const int64_t kFrameIntervalMs = 150; int64_t timestamp_ms = kFrameIntervalMs; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Enable BALANCED preference, no initial limitation. AdaptingFrameForwarder source; @@ -4134,7 +4198,8 @@ TEST_F(VideoStreamEncoderTest, AcceptsFullHdAdaptedDownSimulcastFrames) { const int kFramerate = 24; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Trigger reconfigure encoder (without resetting the entire instance). VideoEncoderConfig video_encoder_config; video_encoder_config.codec_type = kVideoCodecVP8; @@ -4168,7 +4233,8 @@ TEST_F(VideoStreamEncoderTest, PeriodicallyUpdatesChannelParameters) { const int kHighFps = 30; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec; max_framerate_ = kLowFps; @@ -4183,7 +4249,8 @@ TEST_F(VideoStreamEncoderTest, PeriodicallyUpdatesChannelParameters) { // Make sure encoder is updated with new target. video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame( CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); WaitForEncodedFrame(timestamp_ms); @@ -4222,7 +4289,8 @@ TEST_F(VideoStreamEncoderTest, DoesNotUpdateBitrateAllocationWhenSuspended) { MockBitrateObserver bitrate_observer; video_stream_encoder_->SetBitrateAllocationObserver(&bitrate_observer); video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_stream_encoder_->WaitUntilTaskQueueIsIdle(); // Insert a first video frame, causes another bitrate update. @@ -4233,8 +4301,8 @@ TEST_F(VideoStreamEncoderTest, DoesNotUpdateBitrateAllocationWhenSuspended) { WaitForEncodedFrame(timestamp_ms); // Next, simulate video suspension due to pacer queue overrun. - video_stream_encoder_->OnBitrateUpdated(DataRate::bps(0), DataRate::bps(0), 0, - 1); + video_stream_encoder_->OnBitrateUpdated(DataRate::bps(0), DataRate::bps(0), + DataRate::bps(0), 0, 1); // Skip ahead until a new periodic parameter update should have occured. timestamp_ms += vcm::VCMProcessTimer::kDefaultProcessIntervalMs; @@ -4256,7 +4324,8 @@ TEST_F(VideoStreamEncoderTest, const int kFrameHeight = 720; const CpuOveruseOptions default_options; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame( CreateFrame(1, kFrameWidth, kFrameHeight)); WaitForEncodedFrame(1); @@ -4279,7 +4348,8 @@ TEST_F(VideoStreamEncoderTest, fake_encoder_.SetIsHardwareAccelerated(true); video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_source_.IncomingCapturedFrame( CreateFrame(1, kFrameWidth, kFrameHeight)); WaitForEncodedFrame(1); @@ -4300,7 +4370,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenEncoderOvershoots) { const int kNumFramesInRun = kFps * 5; // Runs of five seconds. video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec; max_framerate_ = kFps; @@ -4335,6 +4406,7 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenEncoderOvershoots) { } fake_encoder_.SimulateOvershoot(overshoot_factor); video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kTargetBitrateBps + 1000), DataRate::bps(kTargetBitrateBps + 1000), DataRate::bps(kTargetBitrateBps + 1000), 0, 0); num_dropped = 0; @@ -4349,7 +4421,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenEncoderOvershoots) { } video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Target framerate should be still be near the expected target, despite // the frame drops. @@ -4372,7 +4445,8 @@ TEST_F(VideoStreamEncoderTest, ConfiguresCorrectFrameRate) { int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec; max_framerate_ = kActualInputFps; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Insert 3 seconds of video, with an input fps lower than configured max. for (int i = 0; i < kActualInputFps * 3; ++i) { @@ -4391,7 +4465,8 @@ TEST_F(VideoStreamEncoderTest, ConfiguresCorrectFrameRate) { TEST_F(VideoStreamEncoderTest, AccumulatesUpdateRectOnDroppedFrames) { VideoFrame::UpdateRect rect; video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); fake_encoder_.BlockNextEncode(); video_source_.IncomingCapturedFrame( @@ -4435,7 +4510,8 @@ TEST_F(VideoStreamEncoderTest, AccumulatesUpdateRectOnDroppedFrames) { TEST_F(VideoStreamEncoderTest, SetsFrameTypes) { video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // First frame is always keyframe. video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); @@ -4466,6 +4542,7 @@ TEST_F(VideoStreamEncoderTest, SetsFrameTypesSimulcast) { // Setup simulcast with three streams. ResetEncoder("VP8", 3, 1, 1, false); video_stream_encoder_->OnBitrateUpdated( + DataRate::bps(kSimulcastTargetBitrateBps), DataRate::bps(kSimulcastTargetBitrateBps), DataRate::bps(kSimulcastTargetBitrateBps), 0, 0); // Wait for all three layers before triggering event. @@ -4508,7 +4585,8 @@ TEST_F(VideoStreamEncoderTest, RequestKeyframeInternalSource) { encoder_factory_.SetHasInternalSource(true); ResetEncoder("VP8", 1, 1, 1, false); video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); // Call encoder directly, simulating internal source where encoded frame // callback in VideoStreamEncoder is called despite no OnFrame(). @@ -4545,7 +4623,8 @@ TEST_F(VideoStreamEncoderTest, AdjustsTimestampInternalSource) { encoder_factory_.SetHasInternalSource(true); ResetEncoder("VP8", 1, 1, 1, false); video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); int64_t timestamp = 1; EncodedImage image; @@ -4636,7 +4715,8 @@ TEST_F(VideoStreamEncoderTest, CopiesVideoFrameMetadataAfterDownscale) { const int kTargetBitrateBps = 300000; // To low for HD resolution. video_stream_encoder_->OnBitrateUpdated( - DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), 0, 0); + DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps), + DataRate::bps(kTargetBitrateBps), 0, 0); video_stream_encoder_->WaitUntilTaskQueueIsIdle(); // Insert a first video frame. It should be dropped because of downscale in @@ -4676,6 +4756,7 @@ TEST_F(VideoStreamEncoderTest, BandwidthAllocationLowerBound) { // Initial rate. video_stream_encoder_->OnBitrateUpdated( /*target_bitrate=*/DataRate::kbps(300), + /*stable_target_bitrate=*/DataRate::kbps(300), /*link_allocation=*/DataRate::kbps(300), /*fraction_lost=*/0, /*rtt_ms=*/0); @@ -4693,6 +4774,7 @@ TEST_F(VideoStreamEncoderTest, BandwidthAllocationLowerBound) { DataRate target_rate = min_rate - DataRate::kbps(1); video_stream_encoder_->OnBitrateUpdated( /*target_bitrate=*/target_rate, + /*stable_target_bitrate=*/target_rate, /*link_allocation=*/target_rate, /*fraction_lost=*/0, /*rtt_ms=*/0);