Connect the stable target rate to the video encoders

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 <nisse@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29112}
This commit is contained in:
Florent Castelli
2019-09-09 13:36:55 +02:00
committed by Commit Bot
parent ddef8d1b6b
commit a8336d3cf4
7 changed files with 238 additions and 116 deletions

View File

@ -85,10 +85,14 @@ class VideoStreamEncoderInterface : public rtc::VideoSinkInterface<VideoFrame> {
// Set the currently estimated network properties. A |target_bitrate| // Set the currently estimated network properties. A |target_bitrate|
// of zero pauses the encoder. // 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 // |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 // network link. It is always at least |target_bitrate| but may be higher
// if we are not network constrained. // if we are not network constrained.
virtual void OnBitrateUpdated(DataRate target_bitrate, virtual void OnBitrateUpdated(DataRate target_bitrate,
DataRate stable_target_bitrate,
DataRate link_allocation, DataRate link_allocation,
uint8_t fraction_lost, uint8_t fraction_lost,
int64_t round_trip_time_ms) = 0; int64_t round_trip_time_ms) = 0;

View File

@ -24,7 +24,8 @@ class MockVideoStreamEncoder : public VideoStreamEncoderInterface {
MOCK_METHOD1(SetStartBitrate, void(int)); MOCK_METHOD1(SetStartBitrate, void(int));
MOCK_METHOD0(SendKeyFrame, void()); MOCK_METHOD0(SendKeyFrame, void());
MOCK_METHOD1(OnLossNotification, void(const VideoEncoder::LossNotification&)); 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(OnFrame, void(const VideoFrame&));
MOCK_METHOD1(SetBitrateAllocationObserver, MOCK_METHOD1(SetBitrateAllocationObserver,
void(VideoBitrateAllocationObserver*)); void(VideoBitrateAllocationObserver*));

View File

@ -451,8 +451,8 @@ void VideoSendStreamImpl::Stop() {
void VideoSendStreamImpl::StopVideoSendStream() { void VideoSendStreamImpl::StopVideoSendStream() {
bitrate_allocator_->RemoveObserver(this); bitrate_allocator_->RemoveObserver(this);
check_encoder_activity_task_.Stop(); check_encoder_activity_task_.Stop();
video_stream_encoder_->OnBitrateUpdated(DataRate::Zero(), DataRate::Zero(), 0, video_stream_encoder_->OnBitrateUpdated(DataRate::Zero(), DataRate::Zero(),
0); DataRate::Zero(), 0, 0);
stats_proxy_->OnSetEncoderTargetRate(0); stats_proxy_->OnSetEncoderTargetRate(0);
} }
@ -690,6 +690,12 @@ uint32_t VideoSendStreamImpl::OnBitrateUpdated(BitrateAllocationUpdate update) {
RTC_DCHECK(rtp_video_sender_->IsActive()) RTC_DCHECK(rtp_video_sender_->IsActive())
<< "VideoSendStream::Start has not been called."; << "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( rtp_video_sender_->OnBitrateUpdated(
update.target_bitrate.bps(), update.target_bitrate.bps(),
rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256), rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256),
@ -702,13 +708,25 @@ uint32_t VideoSendStreamImpl::OnBitrateUpdated(BitrateAllocationUpdate update) {
link_allocation = link_allocation =
DataRate::bps(encoder_target_rate_bps_ - protection_bitrate_bps); 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_ = encoder_target_rate_bps_ =
std::min(encoder_max_bitrate_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_); DataRate encoder_target_rate = DataRate::bps(encoder_target_rate_bps_);
link_allocation = std::max(encoder_target_rate, link_allocation); link_allocation = std::max(encoder_target_rate, link_allocation);
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
encoder_target_rate, link_allocation, encoder_target_rate, encoder_stable_target_rate, link_allocation,
rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256), rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256),
update.round_trip_time.ms()); update.round_trip_time.ms());
stats_proxy_->OnSetEncoderTargetRate(encoder_target_rate_bps_); stats_proxy_->OnSetEncoderTargetRate(encoder_target_rate_bps_);

View File

@ -659,15 +659,17 @@ TEST_F(VideoSendStreamImplTest, CallsVideoStreamEncoderOnBitrateUpdate) {
DataRate::bps(qvga_stream.target_bitrate_bps); DataRate::bps(qvga_stream.target_bitrate_bps);
BitrateAllocationUpdate update; BitrateAllocationUpdate update;
update.target_bitrate = network_constrained_rate; update.target_bitrate = network_constrained_rate;
update.stable_target_bitrate = network_constrained_rate;
update.round_trip_time = TimeDelta::ms(1); update.round_trip_time = TimeDelta::ms(1);
EXPECT_CALL(rtp_video_sender_, EXPECT_CALL(rtp_video_sender_,
OnBitrateUpdated(network_constrained_rate.bps(), _, OnBitrateUpdated(network_constrained_rate.bps(), _,
update.round_trip_time.ms(), _)); update.round_trip_time.ms(), _));
EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps()) EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps())
.WillOnce(Return(network_constrained_rate.bps())); .WillOnce(Return(network_constrained_rate.bps()));
EXPECT_CALL(video_stream_encoder_, EXPECT_CALL(
OnBitrateUpdated(network_constrained_rate, video_stream_encoder_,
network_constrained_rate, 0, _)); OnBitrateUpdated(network_constrained_rate, network_constrained_rate,
network_constrained_rate, 0, _));
static_cast<BitrateAllocatorObserver*>(vss_impl.get()) static_cast<BitrateAllocatorObserver*>(vss_impl.get())
->OnBitrateUpdated(update); ->OnBitrateUpdated(update);
@ -683,8 +685,10 @@ TEST_F(VideoSendStreamImplTest, CallsVideoStreamEncoderOnBitrateUpdate) {
EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps()) EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps())
.WillOnce(Return(rate_with_headroom.bps())); .WillOnce(Return(rate_with_headroom.bps()));
EXPECT_CALL(video_stream_encoder_, 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.target_bitrate = rate_with_headroom;
update.stable_target_bitrate = rate_with_headroom;
static_cast<BitrateAllocatorObserver*>(vss_impl.get()) static_cast<BitrateAllocatorObserver*>(vss_impl.get())
->OnBitrateUpdated(update); ->OnBitrateUpdated(update);
@ -701,9 +705,9 @@ TEST_F(VideoSendStreamImplTest, CallsVideoStreamEncoderOnBitrateUpdate) {
.WillOnce(Return(rate_with_headroom.bps())); .WillOnce(Return(rate_with_headroom.bps()));
const DataRate headroom_minus_protection = const DataRate headroom_minus_protection =
rate_with_headroom - DataRate::bps(protection_bitrate_bps); rate_with_headroom - DataRate::bps(protection_bitrate_bps);
EXPECT_CALL( EXPECT_CALL(video_stream_encoder_,
video_stream_encoder_, OnBitrateUpdated(qvga_max_bitrate, qvga_max_bitrate,
OnBitrateUpdated(qvga_max_bitrate, headroom_minus_protection, 0, _)); headroom_minus_protection, 0, _));
static_cast<BitrateAllocatorObserver*>(vss_impl.get()) static_cast<BitrateAllocatorObserver*>(vss_impl.get())
->OnBitrateUpdated(update); ->OnBitrateUpdated(update);
@ -717,13 +721,15 @@ TEST_F(VideoSendStreamImplTest, CallsVideoStreamEncoderOnBitrateUpdate) {
EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps()) EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps())
.WillOnce(Return(rate_with_headroom.bps())); .WillOnce(Return(rate_with_headroom.bps()));
EXPECT_CALL(video_stream_encoder_, 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<BitrateAllocatorObserver*>(vss_impl.get()) static_cast<BitrateAllocatorObserver*>(vss_impl.get())
->OnBitrateUpdated(update); ->OnBitrateUpdated(update);
// Set rates to zero on stop. // Set rates to zero on stop.
EXPECT_CALL(video_stream_encoder_, EXPECT_CALL(video_stream_encoder_,
OnBitrateUpdated(DataRate::Zero(), DataRate::Zero(), 0, 0)); OnBitrateUpdated(DataRate::Zero(), DataRate::Zero(),
DataRate::Zero(), 0, 0));
vss_impl->Stop(); vss_impl->Stop();
}); });
} }

View File

@ -438,23 +438,28 @@ class VideoStreamEncoder::VideoSourceProxy {
}; };
VideoStreamEncoder::EncoderRateSettings::EncoderRateSettings() VideoStreamEncoder::EncoderRateSettings::EncoderRateSettings()
: VideoEncoder::RateControlParameters(), encoder_target(DataRate::Zero()) {} : VideoEncoder::RateControlParameters(),
encoder_target(DataRate::Zero()),
stable_encoder_target(DataRate::Zero()) {}
VideoStreamEncoder::EncoderRateSettings::EncoderRateSettings( VideoStreamEncoder::EncoderRateSettings::EncoderRateSettings(
const VideoBitrateAllocation& bitrate, const VideoBitrateAllocation& bitrate,
double framerate_fps, double framerate_fps,
DataRate bandwidth_allocation, DataRate bandwidth_allocation,
DataRate encoder_target) DataRate encoder_target,
DataRate stable_encoder_target)
: VideoEncoder::RateControlParameters(bitrate, : VideoEncoder::RateControlParameters(bitrate,
framerate_fps, framerate_fps,
bandwidth_allocation), bandwidth_allocation),
encoder_target(encoder_target) {} encoder_target(encoder_target),
stable_encoder_target(stable_encoder_target) {}
bool VideoStreamEncoder::EncoderRateSettings::operator==( bool VideoStreamEncoder::EncoderRateSettings::operator==(
const EncoderRateSettings& rhs) const { const EncoderRateSettings& rhs) const {
return bitrate == rhs.bitrate && framerate_fps == rhs.framerate_fps && return bitrate == rhs.bitrate && framerate_fps == rhs.framerate_fps &&
bandwidth_allocation == rhs.bandwidth_allocation && 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!=( bool VideoStreamEncoder::EncoderRateSettings::operator!=(
@ -1123,8 +1128,8 @@ VideoStreamEncoder::UpdateBitrateAllocationAndNotifyObserver(
// might cap the bitrate to the min bitrate configured. // might cap the bitrate to the min bitrate configured.
if (rate_allocator_ && rate_settings.encoder_target > DataRate::Zero()) { if (rate_allocator_ && rate_settings.encoder_target > DataRate::Zero()) {
new_allocation = rate_allocator_->Allocate(VideoBitrateAllocationParameters( new_allocation = rate_allocator_->Allocate(VideoBitrateAllocationParameters(
rate_settings.encoder_target.bps(), rate_settings.encoder_target, rate_settings.stable_encoder_target,
static_cast<uint32_t>(rate_settings.framerate_fps + 0.5))); rate_settings.framerate_fps));
} }
if (bitrate_observer_ && new_allocation.get_sum_bps() > 0) { if (bitrate_observer_ && new_allocation.get_sum_bps() > 0) {
@ -1695,15 +1700,17 @@ void VideoStreamEncoder::OnDroppedFrame(DropReason reason) {
} }
void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate, void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate,
DataRate stable_target_bitrate,
DataRate link_allocation, DataRate link_allocation,
uint8_t fraction_lost, uint8_t fraction_lost,
int64_t round_trip_time_ms) { int64_t round_trip_time_ms) {
RTC_DCHECK_GE(link_allocation, target_bitrate); RTC_DCHECK_GE(link_allocation, target_bitrate);
if (!encoder_queue_.IsCurrent()) { if (!encoder_queue_.IsCurrent()) {
encoder_queue_.PostTask([this, target_bitrate, link_allocation, encoder_queue_.PostTask([this, target_bitrate, stable_target_bitrate,
fraction_lost, round_trip_time_ms] { link_allocation, fraction_lost,
OnBitrateUpdated(target_bitrate, link_allocation, fraction_lost, round_trip_time_ms] {
round_trip_time_ms); OnBitrateUpdated(target_bitrate, stable_target_bitrate, link_allocation,
fraction_lost, round_trip_time_ms);
}); });
return; return;
} }
@ -1711,6 +1718,7 @@ void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate,
RTC_DCHECK(sink_) << "sink_ must be set before the encoder is active."; RTC_DCHECK(sink_) << "sink_ must be set before the encoder is active.";
RTC_LOG(LS_VERBOSE) << "OnBitrateUpdated, bitrate " << target_bitrate.bps() RTC_LOG(LS_VERBOSE) << "OnBitrateUpdated, bitrate " << target_bitrate.bps()
<< " stable bitrate = " << stable_target_bitrate.bps()
<< " link allocation bitrate = " << link_allocation.bps() << " link allocation bitrate = " << link_allocation.bps()
<< " packet loss " << static_cast<int>(fraction_lost) << " packet loss " << static_cast<int>(fraction_lost)
<< " rtt " << round_trip_time_ms; << " 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_is_suspended = target_bitrate == DataRate::Zero();
const bool video_suspension_changed = video_is_suspended != EncoderPaused(); const bool video_suspension_changed = video_is_suspended != EncoderPaused();
EncoderRateSettings new_rate_settings{VideoBitrateAllocation(), EncoderRateSettings new_rate_settings{
static_cast<double>(framerate_fps), VideoBitrateAllocation(), static_cast<double>(framerate_fps),
link_allocation, target_bitrate}; link_allocation, target_bitrate, stable_target_bitrate};
SetEncoderRates(UpdateBitrateAllocationAndNotifyObserver(new_rate_settings)); SetEncoderRates(UpdateBitrateAllocationAndNotifyObserver(new_rate_settings));
encoder_start_bitrate_bps_ = target_bitrate.bps() != 0 encoder_start_bitrate_bps_ = target_bitrate.bps() != 0

View File

@ -91,6 +91,7 @@ class VideoStreamEncoder : public VideoStreamEncoderInterface,
const VideoEncoder::LossNotification& loss_notification) override; const VideoEncoder::LossNotification& loss_notification) override;
void OnBitrateUpdated(DataRate target_bitrate, void OnBitrateUpdated(DataRate target_bitrate,
DataRate stable_target_bitrate,
DataRate target_headroom, DataRate target_headroom,
uint8_t fraction_lost, uint8_t fraction_lost,
int64_t round_trip_time_ms) override; int64_t round_trip_time_ms) override;
@ -123,7 +124,8 @@ class VideoStreamEncoder : public VideoStreamEncoderInterface,
EncoderRateSettings(const VideoBitrateAllocation& bitrate, EncoderRateSettings(const VideoBitrateAllocation& bitrate,
double framerate_fps, double framerate_fps,
DataRate bandwidth_allocation, 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;
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 // |using last_encoder_rate_setings_->bitrate.get_sum_bps()|, may trick it
// into thinking the available bitrate has decreased since the last call. // into thinking the available bitrate has decreased since the last call.
DataRate encoder_target; DataRate encoder_target;
DataRate stable_encoder_target;
}; };
void ConfigureEncoderOnTaskQueue(VideoEncoderConfig config, void ConfigureEncoderOnTaskQueue(VideoEncoderConfig config,

View File

@ -505,9 +505,9 @@ class VideoStreamEncoderTest : public ::testing::Test {
EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
.Times(1); .Times(1);
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kTargetBitrateBps), video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTargetBitrateBps), 0, DataRate::bps(kTargetBitrateBps), DataRate::bps(kTargetBitrateBps),
0); DataRate::bps(kTargetBitrateBps), 0, 0);
video_source_.IncomingCapturedFrame( video_source_.IncomingCapturedFrame(
CreateFrame(1, codec_width_, codec_height_)); CreateFrame(1, codec_width_, codec_height_));
@ -1090,7 +1090,8 @@ class VideoStreamEncoderTest : public ::testing::Test {
TEST_F(VideoStreamEncoderTest, EncodeOneFrame) { TEST_F(VideoStreamEncoderTest, EncodeOneFrame) {
video_stream_encoder_->OnBitrateUpdated( 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; rtc::Event frame_destroyed_event;
video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event)); video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event));
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
@ -1109,7 +1110,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesBeforeFirstOnBitrateUpdated) {
EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs)); EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs));
video_stream_encoder_->OnBitrateUpdated( 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. // The pending frame should be received.
WaitForEncodedFrame(2); WaitForEncodedFrame(2);
@ -1121,12 +1123,13 @@ TEST_F(VideoStreamEncoderTest, DropsFramesBeforeFirstOnBitrateUpdated) {
TEST_F(VideoStreamEncoderTest, DropsFramesWhenRateSetToZero) { TEST_F(VideoStreamEncoderTest, DropsFramesWhenRateSetToZero) {
video_stream_encoder_->OnBitrateUpdated( 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)); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(0), DataRate::bps(0), 0, video_stream_encoder_->OnBitrateUpdated(DataRate::bps(0), DataRate::bps(0),
0); DataRate::bps(0), 0, 0);
// The encoder will cache up to one frame for a short duration. Adding two // 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 // frames means that the first frame will be dropped and the second frame will
// be sent when the encoder is resumed. // be sent when the encoder is resumed.
@ -1134,7 +1137,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenRateSetToZero) {
video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr)); video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr));
video_stream_encoder_->OnBitrateUpdated( 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); WaitForEncodedFrame(3);
video_source_.IncomingCapturedFrame(CreateFrame(4, nullptr)); video_source_.IncomingCapturedFrame(CreateFrame(4, nullptr));
WaitForEncodedFrame(4); WaitForEncodedFrame(4);
@ -1143,7 +1147,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenRateSetToZero) {
TEST_F(VideoStreamEncoderTest, DropsFramesWithSameOrOldNtpTimestamp) { TEST_F(VideoStreamEncoderTest, DropsFramesWithSameOrOldNtpTimestamp) {
video_stream_encoder_->OnBitrateUpdated( 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)); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
@ -1157,7 +1162,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWithSameOrOldNtpTimestamp) {
TEST_F(VideoStreamEncoderTest, DropsFrameAfterStop) { TEST_F(VideoStreamEncoderTest, DropsFrameAfterStop) {
video_stream_encoder_->OnBitrateUpdated( 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)); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
@ -1171,7 +1177,8 @@ TEST_F(VideoStreamEncoderTest, DropsFrameAfterStop) {
TEST_F(VideoStreamEncoderTest, DropsPendingFramesOnSlowEncode) { TEST_F(VideoStreamEncoderTest, DropsPendingFramesOnSlowEncode) {
video_stream_encoder_->OnBitrateUpdated( 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(); fake_encoder_.BlockNextEncode();
video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
@ -1188,7 +1195,8 @@ TEST_F(VideoStreamEncoderTest, DropsPendingFramesOnSlowEncode) {
TEST_F(VideoStreamEncoderTest, DropFrameWithFailedI420Conversion) { TEST_F(VideoStreamEncoderTest, DropFrameWithFailedI420Conversion) {
video_stream_encoder_->OnBitrateUpdated( 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; rtc::Event frame_destroyed_event;
video_source_.IncomingCapturedFrame( video_source_.IncomingCapturedFrame(
@ -1208,7 +1216,8 @@ TEST_F(VideoStreamEncoderTest, DropFrameWithFailedI420ConversionWithCrop) {
// Capture a frame at codec_width_/codec_height_. // Capture a frame at codec_width_/codec_height_.
video_stream_encoder_->OnBitrateUpdated( 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)); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
// The encoder will have been configured once. // The encoder will have been configured once.
@ -1229,7 +1238,8 @@ TEST_F(VideoStreamEncoderTest, DropFrameWithFailedI420ConversionWithCrop) {
TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest,
ConfigureEncoderTriggersOnEncoderConfigurationChanged) { ConfigureEncoderTriggersOnEncoderConfigurationChanged) {
video_stream_encoder_->OnBitrateUpdated( 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()); EXPECT_EQ(0, sink_.number_of_reconfigurations());
// Capture a frame and wait for it to synchronize with the encoder thread. // Capture a frame and wait for it to synchronize with the encoder thread.
@ -1256,7 +1266,8 @@ TEST_F(VideoStreamEncoderTest,
TEST_F(VideoStreamEncoderTest, FrameResolutionChangeReconfigureEncoder) { TEST_F(VideoStreamEncoderTest, FrameResolutionChangeReconfigureEncoder) {
video_stream_encoder_->OnBitrateUpdated( 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. // Capture a frame and wait for it to synchronize with the encoder thread.
video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
@ -1282,7 +1293,8 @@ TEST_F(VideoStreamEncoderTest, FrameResolutionChangeReconfigureEncoder) {
TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest,
EncoderInstanceDestroyedBeforeAnotherInstanceCreated) { EncoderInstanceDestroyedBeforeAnotherInstanceCreated) {
video_stream_encoder_->OnBitrateUpdated( 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. // Capture a frame and wait for it to synchronize with the encoder thread.
video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
@ -1304,7 +1316,8 @@ TEST_F(VideoStreamEncoderTest,
TEST_F(VideoStreamEncoderTest, BitrateLimitsChangeReconfigureRateAllocator) { TEST_F(VideoStreamEncoderTest, BitrateLimitsChangeReconfigureRateAllocator) {
video_stream_encoder_->OnBitrateUpdated( 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; VideoEncoderConfig video_encoder_config;
test::FillEncoderConfiguration(kVideoCodecVP8, 1, &video_encoder_config); test::FillEncoderConfiguration(kVideoCodecVP8, 1, &video_encoder_config);
@ -1349,7 +1362,8 @@ TEST_F(VideoStreamEncoderTest, BitrateLimitsChangeReconfigureRateAllocator) {
TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest,
EncoderRecommendedBitrateLimitsDoNotOverrideAppBitrateLimits) { EncoderRecommendedBitrateLimitsDoNotOverrideAppBitrateLimits) {
video_stream_encoder_->OnBitrateUpdated( 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; VideoEncoderConfig video_encoder_config;
test::FillEncoderConfiguration(kVideoCodecVP8, 1, &video_encoder_config); test::FillEncoderConfiguration(kVideoCodecVP8, 1, &video_encoder_config);
@ -1441,7 +1455,8 @@ TEST_F(VideoStreamEncoderTest,
TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest,
EncoderRecommendedMaxAndMinBitratesUsedForGivenResolution) { EncoderRecommendedMaxAndMinBitratesUsedForGivenResolution) {
video_stream_encoder_->OnBitrateUpdated( 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( const VideoEncoder::ResolutionBitrateLimits encoder_bitrate_limits_270p(
480 * 270, 34 * 1000, 12 * 1000, 1234 * 1000); 480 * 270, 34 * 1000, 12 * 1000, 1234 * 1000);
@ -1509,7 +1524,8 @@ TEST_F(VideoStreamEncoderTest,
TEST_F(VideoStreamEncoderTest, EncoderRecommendedMaxBitrateCapsTargetBitrate) { TEST_F(VideoStreamEncoderTest, EncoderRecommendedMaxBitrateCapsTargetBitrate) {
video_stream_encoder_->OnBitrateUpdated( 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; VideoEncoderConfig video_encoder_config;
test::FillEncoderConfiguration(kVideoCodecVP8, 1, &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. // Enable BALANCED preference, no initial limitation.
video_stream_encoder_->OnBitrateUpdated( 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_, video_stream_encoder_->SetSource(&video_source_,
webrtc::DegradationPreference::BALANCED); webrtc::DegradationPreference::BALANCED);
VerifyNoLimitation(video_source_.sink_wants()); VerifyNoLimitation(video_source_.sink_wants());
@ -1662,7 +1679,8 @@ TEST_F(VideoStreamEncoderTest, TestCpuDowngrades_BalancedMode) {
} }
TEST_F(VideoStreamEncoderTest, SinkWantsStoredByDegradationPreference) { TEST_F(VideoStreamEncoderTest, SinkWantsStoredByDegradationPreference) {
video_stream_encoder_->OnBitrateUpdated( 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()); VerifyNoLimitation(video_source_.sink_wants());
const int kFrameWidth = 1280; const int kFrameWidth = 1280;
@ -1751,7 +1769,8 @@ TEST_F(VideoStreamEncoderTest, SinkWantsStoredByDegradationPreference) {
TEST_F(VideoStreamEncoderTest, StatsTracksQualityAdaptationStats) { TEST_F(VideoStreamEncoderTest, StatsTracksQualityAdaptationStats) {
video_stream_encoder_->OnBitrateUpdated( 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 kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
@ -1785,7 +1804,8 @@ TEST_F(VideoStreamEncoderTest, StatsTracksQualityAdaptationStats) {
TEST_F(VideoStreamEncoderTest, StatsTracksCpuAdaptationStats) { TEST_F(VideoStreamEncoderTest, StatsTracksCpuAdaptationStats) {
video_stream_encoder_->OnBitrateUpdated( 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 kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
@ -1819,7 +1839,8 @@ TEST_F(VideoStreamEncoderTest, StatsTracksCpuAdaptationStats) {
TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsCpuAdaptation) { TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsCpuAdaptation) {
video_stream_encoder_->OnBitrateUpdated( 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 kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
@ -1888,7 +1909,8 @@ TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsCpuAdaptation) {
TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsQualityAdaptation) { TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsQualityAdaptation) {
video_stream_encoder_->OnBitrateUpdated( 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 kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
@ -1949,7 +1971,8 @@ TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsQualityAdaptation) {
TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest,
QualityAdaptationStatsAreResetWhenScalerIsDisabled) { QualityAdaptationStatsAreResetWhenScalerIsDisabled) {
video_stream_encoder_->OnBitrateUpdated( 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 kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
@ -2005,7 +2028,8 @@ TEST_F(VideoStreamEncoderTest,
TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest,
StatsTracksCpuAdaptationStatsWhenSwitchingSource) { StatsTracksCpuAdaptationStatsWhenSwitchingSource) {
video_stream_encoder_->OnBitrateUpdated( 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 kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
@ -2142,7 +2166,8 @@ TEST_F(VideoStreamEncoderTest,
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Expect no scaling to begin with.
VerifyNoLimitation(video_source_.sink_wants()); VerifyNoLimitation(video_source_.sink_wants());
@ -2191,7 +2216,8 @@ TEST_F(VideoStreamEncoderTest,
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable MAINTAIN_FRAMERATE preference, no initial limitation.
test::FrameForwarder source; test::FrameForwarder source;
@ -2224,7 +2250,8 @@ TEST_F(VideoStreamEncoderTest, SkipsSameOrLargerAdaptDownRequest_BalancedMode) {
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable BALANCED preference, no initial limitation.
test::FrameForwarder source; test::FrameForwarder source;
@ -2265,7 +2292,8 @@ TEST_F(VideoStreamEncoderTest,
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable MAINTAIN_FRAMERATE preference, no initial limitation.
test::FrameForwarder source; test::FrameForwarder source;
@ -2292,7 +2320,8 @@ TEST_F(VideoStreamEncoderTest,
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable MAINTAIN_RESOLUTION preference, no initial limitation.
test::FrameForwarder source; test::FrameForwarder source;
@ -2318,7 +2347,8 @@ TEST_F(VideoStreamEncoderTest, NoChangeForInitialNormalUsage_BalancedMode) {
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable BALANCED preference, no initial limitation.
test::FrameForwarder source; test::FrameForwarder source;
@ -2346,7 +2376,8 @@ TEST_F(VideoStreamEncoderTest, NoChangeForInitialNormalUsage_DisabledMode) {
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable DISABLED preference, no initial limitation.
test::FrameForwarder source; test::FrameForwarder source;
@ -2375,7 +2406,8 @@ TEST_F(VideoStreamEncoderTest,
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable MAINTAIN_FRAMERATE preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -2413,7 +2445,8 @@ TEST_F(VideoStreamEncoderTest,
const int kHeight = 720; const int kHeight = 720;
const int kInputFps = 30; const int kInputFps = 30;
video_stream_encoder_->OnBitrateUpdated( 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(); VideoSendStream::Stats stats = stats_proxy_->GetStats();
stats.input_frame_rate = kInputFps; stats.input_frame_rate = kInputFps;
@ -2455,7 +2488,8 @@ TEST_F(VideoStreamEncoderTest, DoesNotScaleBelowSetResolutionLimit) {
const size_t kNumFrames = 10; const size_t kNumFrames = 10;
video_stream_encoder_->OnBitrateUpdated( 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: // Enable adapter, expected input resolutions when downscaling:
// 1280x720 -> 960x540 -> 640x360 -> 480x270 -> 320x180 (kMinPixelsPerFrame) // 1280x720 -> 960x540 -> 640x360 -> 480x270 -> 320x180 (kMinPixelsPerFrame)
@ -2491,7 +2525,8 @@ TEST_F(VideoStreamEncoderTest,
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable MAINTAIN_FRAMERATE preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -2550,7 +2585,8 @@ TEST_F(VideoStreamEncoderTest,
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable BALANCED preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -2616,9 +2652,9 @@ TEST_F(VideoStreamEncoderTest, NoAdaptUpIfBwEstimateIsLessThanMinBitrate) {
const int64_t kFrameIntervalMs = 150; const int64_t kFrameIntervalMs = 150;
const int kMinBitrateBps = 425000; const int kMinBitrateBps = 425000;
const int kTooLowMinBitrateBps = 424000; const int kTooLowMinBitrateBps = 424000;
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kTooLowMinBitrateBps), video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTooLowMinBitrateBps), DataRate::bps(kTooLowMinBitrateBps), DataRate::bps(kTooLowMinBitrateBps),
0, 0); DataRate::bps(kTooLowMinBitrateBps), 0, 0);
// Enable BALANCED preference, no initial limitation. // Enable BALANCED preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -2666,6 +2702,7 @@ TEST_F(VideoStreamEncoderTest, NoAdaptUpIfBwEstimateIsLessThanMinBitrate) {
// Trigger adapt up, expect upscaled fps (target bitrate == min bitrate). // Trigger adapt up, expect upscaled fps (target bitrate == min bitrate).
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kMinBitrateBps), video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kMinBitrateBps),
DataRate::bps(kMinBitrateBps),
DataRate::bps(kMinBitrateBps), 0, 0); DataRate::bps(kMinBitrateBps), 0, 0);
video_stream_encoder_->TriggerQualityHigh(); video_stream_encoder_->TriggerQualityHigh();
timestamp_ms += kFrameIntervalMs; timestamp_ms += kFrameIntervalMs;
@ -2691,6 +2728,7 @@ TEST_F(VideoStreamEncoderTest,
const int kResolutionMinBitrateBps = 435000; const int kResolutionMinBitrateBps = 435000;
const int kTooLowMinResolutionBitrateBps = 434000; const int kTooLowMinResolutionBitrateBps = 434000;
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTooLowMinResolutionBitrateBps),
DataRate::bps(kTooLowMinResolutionBitrateBps), DataRate::bps(kTooLowMinResolutionBitrateBps),
DataRate::bps(kTooLowMinResolutionBitrateBps), 0, 0); DataRate::bps(kTooLowMinResolutionBitrateBps), 0, 0);
@ -2747,6 +2785,7 @@ TEST_F(VideoStreamEncoderTest,
// Trigger adapt up, expect upscaled res (target bitrate == min bitrate). // Trigger adapt up, expect upscaled res (target bitrate == min bitrate).
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kResolutionMinBitrateBps),
DataRate::bps(kResolutionMinBitrateBps), DataRate::bps(kResolutionMinBitrateBps),
DataRate::bps(kResolutionMinBitrateBps), 0, 0); DataRate::bps(kResolutionMinBitrateBps), 0, 0);
video_stream_encoder_->TriggerQualityHigh(); video_stream_encoder_->TriggerQualityHigh();
@ -2774,9 +2813,9 @@ TEST_F(VideoStreamEncoderTest,
const int kTooLowMinBitrateBps = 424000; const int kTooLowMinBitrateBps = 424000;
const int kResolutionMinBitrateBps = 435000; const int kResolutionMinBitrateBps = 435000;
const int kTooLowMinResolutionBitrateBps = 434000; const int kTooLowMinResolutionBitrateBps = 434000;
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kTooLowMinBitrateBps), video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTooLowMinBitrateBps), DataRate::bps(kTooLowMinBitrateBps), DataRate::bps(kTooLowMinBitrateBps),
0, 0); DataRate::bps(kTooLowMinBitrateBps), 0, 0);
// Enable BALANCED preference, no initial limitation. // Enable BALANCED preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -2823,6 +2862,7 @@ TEST_F(VideoStreamEncoderTest,
// Trigger adapt up, expect upscaled fps (target bitrate == min bitrate). // Trigger adapt up, expect upscaled fps (target bitrate == min bitrate).
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kMinBitrateBps), video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kMinBitrateBps),
DataRate::bps(kMinBitrateBps),
DataRate::bps(kMinBitrateBps), 0, 0); DataRate::bps(kMinBitrateBps), 0, 0);
video_stream_encoder_->TriggerQualityHigh(); video_stream_encoder_->TriggerQualityHigh();
timestamp_ms += kFrameIntervalMs; timestamp_ms += kFrameIntervalMs;
@ -2833,6 +2873,7 @@ TEST_F(VideoStreamEncoderTest,
// Trigger adapt up, expect no upscale in res (target bitrate < min bitrate). // Trigger adapt up, expect no upscale in res (target bitrate < min bitrate).
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTooLowMinResolutionBitrateBps),
DataRate::bps(kTooLowMinResolutionBitrateBps), DataRate::bps(kTooLowMinResolutionBitrateBps),
DataRate::bps(kTooLowMinResolutionBitrateBps), 0, 0); DataRate::bps(kTooLowMinResolutionBitrateBps), 0, 0);
video_stream_encoder_->TriggerQualityHigh(); video_stream_encoder_->TriggerQualityHigh();
@ -2843,6 +2884,7 @@ TEST_F(VideoStreamEncoderTest,
// Trigger adapt up, expect upscaled res (target bitrate == min bitrate). // Trigger adapt up, expect upscaled res (target bitrate == min bitrate).
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kResolutionMinBitrateBps),
DataRate::bps(kResolutionMinBitrateBps), DataRate::bps(kResolutionMinBitrateBps),
DataRate::bps(kResolutionMinBitrateBps), 0, 0); DataRate::bps(kResolutionMinBitrateBps), 0, 0);
video_stream_encoder_->TriggerQualityHigh(); video_stream_encoder_->TriggerQualityHigh();
@ -2860,7 +2902,8 @@ TEST_F(VideoStreamEncoderTest,
const int kWidth = 1280; const int kWidth = 1280;
const int kHeight = 720; const int kHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable MAINTAIN_FRAMERATE preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -2998,7 +3041,8 @@ TEST_F(VideoStreamEncoderTest, CpuLimitedHistogramIsReported) {
const int kHeight = 360; const int kHeight = 360;
video_stream_encoder_->OnBitrateUpdated( 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) { for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight)); video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
@ -3025,7 +3069,8 @@ TEST_F(VideoStreamEncoderTest, CpuLimitedHistogramIsReported) {
TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest,
CpuLimitedHistogramIsNotReportedForDisabledDegradation) { CpuLimitedHistogramIsNotReportedForDisabledDegradation) {
video_stream_encoder_->OnBitrateUpdated( 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 kWidth = 640;
const int kHeight = 360; const int kHeight = 360;
@ -3057,9 +3102,9 @@ TEST_F(VideoStreamEncoderTest, CallsBitrateObserver) {
EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate)) EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
.Times(1); .Times(1);
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kLowTargetBitrateBps), video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps),
0, 0); DataRate::bps(kLowTargetBitrateBps), 0, 0);
video_source_.IncomingCapturedFrame( video_source_.IncomingCapturedFrame(
CreateFrame(rtc::TimeMillis(), codec_width_, codec_height_)); CreateFrame(rtc::TimeMillis(), codec_width_, codec_height_));
@ -3164,7 +3209,8 @@ TEST_F(VideoStreamEncoderTest, OveruseDetectorUpdatedOnReconfigureAndAdaption) {
const int kFramerate = 24; const int kFramerate = 24;
video_stream_encoder_->OnBitrateUpdated( 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; test::FrameForwarder source;
video_stream_encoder_->SetSource( video_stream_encoder_->SetSource(
&source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); &source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION);
@ -3225,7 +3271,8 @@ TEST_F(VideoStreamEncoderTest,
const int kHighFramerate = 25; const int kHighFramerate = 25;
video_stream_encoder_->OnBitrateUpdated( 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; test::FrameForwarder source;
video_stream_encoder_->SetSource( video_stream_encoder_->SetSource(
&source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); &source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION);
@ -3289,7 +3336,8 @@ TEST_F(VideoStreamEncoderTest,
const int kFramerate = 24; const int kFramerate = 24;
video_stream_encoder_->OnBitrateUpdated( 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; test::FrameForwarder source;
video_stream_encoder_->SetSource( video_stream_encoder_->SetSource(
&source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); &source, webrtc::DegradationPreference::MAINTAIN_RESOLUTION);
@ -3335,6 +3383,7 @@ TEST_F(VideoStreamEncoderTest,
TEST_F(VideoStreamEncoderTest, DropsFramesAndScalesWhenBitrateIsTooLow) { TEST_F(VideoStreamEncoderTest, DropsFramesAndScalesWhenBitrateIsTooLow) {
const int kTooLowBitrateForFrameSizeBps = 10000; const int kTooLowBitrateForFrameSizeBps = 10000;
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTooLowBitrateForFrameSizeBps),
DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps),
DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0); DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0);
const int kWidth = 640; const int kWidth = 640;
@ -3366,6 +3415,7 @@ TEST_F(VideoStreamEncoderTest,
NumberOfDroppedFramesLimitedWhenBitrateIsTooLow) { NumberOfDroppedFramesLimitedWhenBitrateIsTooLow) {
const int kTooLowBitrateForFrameSizeBps = 10000; const int kTooLowBitrateForFrameSizeBps = 10000;
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTooLowBitrateForFrameSizeBps),
DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps),
DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0); DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0);
const int kWidth = 640; const int kWidth = 640;
@ -3391,9 +3441,9 @@ TEST_F(VideoStreamEncoderTest,
InitialFrameDropOffWithMaintainResolutionPreference) { InitialFrameDropOffWithMaintainResolutionPreference) {
const int kWidth = 640; const int kWidth = 640;
const int kHeight = 360; const int kHeight = 360;
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kLowTargetBitrateBps), video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps),
0, 0); DataRate::bps(kLowTargetBitrateBps), 0, 0);
// Set degradation preference. // Set degradation preference.
video_stream_encoder_->SetSource( video_stream_encoder_->SetSource(
@ -3417,9 +3467,9 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropOffWhenEncoderDisabledScaling) {
video_encoder_config.video_format.parameters["foo"] = "foo"; video_encoder_config.video_format.parameters["foo"] = "foo";
video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config), video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config),
kMaxPayloadLength); kMaxPayloadLength);
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(kLowTargetBitrateBps), video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps), DataRate::bps(kLowTargetBitrateBps),
0, 0); DataRate::bps(kLowTargetBitrateBps), 0, 0);
// Force quality scaler reconfiguration by resetting the source. // Force quality scaler reconfiguration by resetting the source.
video_stream_encoder_->SetSource(&video_source_, video_stream_encoder_->SetSource(&video_source_,
@ -3443,12 +3493,14 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenBWEstimateReady) {
const int kHeight = 360; const int kHeight = 360;
video_stream_encoder_->OnBitrateUpdated( 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)); video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
// Frame should not be dropped. // Frame should not be dropped.
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTooLowBitrateForFrameSizeBps),
DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps),
DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0); DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0);
video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
@ -3472,12 +3524,14 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenBweDrops) {
const int kHeight = 360; const int kHeight = 360;
video_stream_encoder_->OnBitrateUpdated( 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)); video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
// Frame should not be dropped. // Frame should not be dropped.
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kNotTooLowBitrateForFrameSizeBps),
DataRate::bps(kNotTooLowBitrateForFrameSizeBps), DataRate::bps(kNotTooLowBitrateForFrameSizeBps),
DataRate::bps(kNotTooLowBitrateForFrameSizeBps), 0, 0); DataRate::bps(kNotTooLowBitrateForFrameSizeBps), 0, 0);
video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight)); video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
@ -3485,6 +3539,7 @@ TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenBweDrops) {
WaitForEncodedFrame(2); WaitForEncodedFrame(2);
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTooLowBitrateForFrameSizeBps),
DataRate::bps(kTooLowBitrateForFrameSizeBps), DataRate::bps(kTooLowBitrateForFrameSizeBps),
DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0); DataRate::bps(kTooLowBitrateForFrameSizeBps), 0, 0);
video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight)); video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
@ -3501,7 +3556,8 @@ TEST_F(VideoStreamEncoderTest,
const int kTooSmallWidth = 10; const int kTooSmallWidth = 10;
const int kTooSmallHeight = 10; const int kTooSmallHeight = 10;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable MAINTAIN_FRAMERATE preference, no initial limitation.
test::FrameForwarder source; test::FrameForwarder source;
@ -3527,7 +3583,8 @@ TEST_F(VideoStreamEncoderTest,
const int kTooSmallHeight = 10; const int kTooSmallHeight = 10;
const int kFpsLimit = 7; const int kFpsLimit = 7;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable BALANCED preference, no initial limitation.
test::FrameForwarder source; test::FrameForwarder source;
@ -3561,7 +3618,8 @@ TEST_F(VideoStreamEncoderTest,
TEST_F(VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) { TEST_F(VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) {
fake_encoder_.ForceInitEncodeFailure(true); fake_encoder_.ForceInitEncodeFailure(true);
video_stream_encoder_->OnBitrateUpdated( 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); ResetEncoder("VP8", 2, 1, 1, false);
const int kFrameWidth = 1280; const int kFrameWidth = 1280;
const int kFrameHeight = 720; const int kFrameHeight = 720;
@ -3575,7 +3633,8 @@ TEST_F(VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) {
TEST_F(VideoStreamEncoderTest, TEST_F(VideoStreamEncoderTest,
AdaptsResolutionOnOveruse_MaintainFramerateMode) { AdaptsResolutionOnOveruse_MaintainFramerateMode) {
video_stream_encoder_->OnBitrateUpdated( 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 kFrameWidth = 1280;
const int kFrameHeight = 720; const int kFrameHeight = 720;
@ -3609,7 +3668,8 @@ TEST_F(VideoStreamEncoderTest,
const int kFrameHeight = 720; const int kFrameHeight = 720;
video_stream_encoder_->OnBitrateUpdated( 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_stream_encoder_->SetSource(
&video_source_, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); &video_source_, webrtc::DegradationPreference::MAINTAIN_RESOLUTION);
video_source_.set_adaptation_enabled(true); video_source_.set_adaptation_enabled(true);
@ -3711,7 +3771,8 @@ TEST_F(VideoStreamEncoderTest, DoesntAdaptDownPastMinFramerate) {
ResetEncoder("VP8", 1, 2, 1, true); ResetEncoder("VP8", 1, 2, 1, true);
video_stream_encoder_->OnBitrateUpdated( 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_stream_encoder_->SetSource(
&video_source_, webrtc::DegradationPreference::MAINTAIN_RESOLUTION); &video_source_, webrtc::DegradationPreference::MAINTAIN_RESOLUTION);
video_source_.set_adaptation_enabled(true); video_source_.set_adaptation_enabled(true);
@ -3750,7 +3811,8 @@ TEST_F(VideoStreamEncoderTest,
const int64_t kFrameIntervalMs = 150; const int64_t kFrameIntervalMs = 150;
int64_t timestamp_ms = kFrameIntervalMs; int64_t timestamp_ms = kFrameIntervalMs;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable BALANCED preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -3931,7 +3993,8 @@ TEST_F(VideoStreamEncoderTest, AdaptWithTwoReasonsAndDifferentOrder_Framerate) {
const int64_t kFrameIntervalMs = 150; const int64_t kFrameIntervalMs = 150;
int64_t timestamp_ms = kFrameIntervalMs; int64_t timestamp_ms = kFrameIntervalMs;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable BALANCED preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -4045,7 +4108,8 @@ TEST_F(VideoStreamEncoderTest,
const int64_t kFrameIntervalMs = 150; const int64_t kFrameIntervalMs = 150;
int64_t timestamp_ms = kFrameIntervalMs; int64_t timestamp_ms = kFrameIntervalMs;
video_stream_encoder_->OnBitrateUpdated( 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. // Enable BALANCED preference, no initial limitation.
AdaptingFrameForwarder source; AdaptingFrameForwarder source;
@ -4134,7 +4198,8 @@ TEST_F(VideoStreamEncoderTest, AcceptsFullHdAdaptedDownSimulcastFrames) {
const int kFramerate = 24; const int kFramerate = 24;
video_stream_encoder_->OnBitrateUpdated( 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). // Trigger reconfigure encoder (without resetting the entire instance).
VideoEncoderConfig video_encoder_config; VideoEncoderConfig video_encoder_config;
video_encoder_config.codec_type = kVideoCodecVP8; video_encoder_config.codec_type = kVideoCodecVP8;
@ -4168,7 +4233,8 @@ TEST_F(VideoStreamEncoderTest, PeriodicallyUpdatesChannelParameters) {
const int kHighFps = 30; const int kHighFps = 30;
video_stream_encoder_->OnBitrateUpdated( 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; int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec;
max_framerate_ = kLowFps; max_framerate_ = kLowFps;
@ -4183,7 +4249,8 @@ TEST_F(VideoStreamEncoderTest, PeriodicallyUpdatesChannelParameters) {
// Make sure encoder is updated with new target. // Make sure encoder is updated with new target.
video_stream_encoder_->OnBitrateUpdated( 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( video_source_.IncomingCapturedFrame(
CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight)); CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
WaitForEncodedFrame(timestamp_ms); WaitForEncodedFrame(timestamp_ms);
@ -4222,7 +4289,8 @@ TEST_F(VideoStreamEncoderTest, DoesNotUpdateBitrateAllocationWhenSuspended) {
MockBitrateObserver bitrate_observer; MockBitrateObserver bitrate_observer;
video_stream_encoder_->SetBitrateAllocationObserver(&bitrate_observer); video_stream_encoder_->SetBitrateAllocationObserver(&bitrate_observer);
video_stream_encoder_->OnBitrateUpdated( 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(); video_stream_encoder_->WaitUntilTaskQueueIsIdle();
// Insert a first video frame, causes another bitrate update. // Insert a first video frame, causes another bitrate update.
@ -4233,8 +4301,8 @@ TEST_F(VideoStreamEncoderTest, DoesNotUpdateBitrateAllocationWhenSuspended) {
WaitForEncodedFrame(timestamp_ms); WaitForEncodedFrame(timestamp_ms);
// Next, simulate video suspension due to pacer queue overrun. // Next, simulate video suspension due to pacer queue overrun.
video_stream_encoder_->OnBitrateUpdated(DataRate::bps(0), DataRate::bps(0), 0, video_stream_encoder_->OnBitrateUpdated(DataRate::bps(0), DataRate::bps(0),
1); DataRate::bps(0), 0, 1);
// Skip ahead until a new periodic parameter update should have occured. // Skip ahead until a new periodic parameter update should have occured.
timestamp_ms += vcm::VCMProcessTimer::kDefaultProcessIntervalMs; timestamp_ms += vcm::VCMProcessTimer::kDefaultProcessIntervalMs;
@ -4256,7 +4324,8 @@ TEST_F(VideoStreamEncoderTest,
const int kFrameHeight = 720; const int kFrameHeight = 720;
const CpuOveruseOptions default_options; const CpuOveruseOptions default_options;
video_stream_encoder_->OnBitrateUpdated( 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( video_source_.IncomingCapturedFrame(
CreateFrame(1, kFrameWidth, kFrameHeight)); CreateFrame(1, kFrameWidth, kFrameHeight));
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
@ -4279,7 +4348,8 @@ TEST_F(VideoStreamEncoderTest,
fake_encoder_.SetIsHardwareAccelerated(true); fake_encoder_.SetIsHardwareAccelerated(true);
video_stream_encoder_->OnBitrateUpdated( 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( video_source_.IncomingCapturedFrame(
CreateFrame(1, kFrameWidth, kFrameHeight)); CreateFrame(1, kFrameWidth, kFrameHeight));
WaitForEncodedFrame(1); WaitForEncodedFrame(1);
@ -4300,7 +4370,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenEncoderOvershoots) {
const int kNumFramesInRun = kFps * 5; // Runs of five seconds. const int kNumFramesInRun = kFps * 5; // Runs of five seconds.
video_stream_encoder_->OnBitrateUpdated( 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; int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec;
max_framerate_ = kFps; max_framerate_ = kFps;
@ -4335,6 +4406,7 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenEncoderOvershoots) {
} }
fake_encoder_.SimulateOvershoot(overshoot_factor); fake_encoder_.SimulateOvershoot(overshoot_factor);
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kTargetBitrateBps + 1000),
DataRate::bps(kTargetBitrateBps + 1000), DataRate::bps(kTargetBitrateBps + 1000),
DataRate::bps(kTargetBitrateBps + 1000), 0, 0); DataRate::bps(kTargetBitrateBps + 1000), 0, 0);
num_dropped = 0; num_dropped = 0;
@ -4349,7 +4421,8 @@ TEST_F(VideoStreamEncoderTest, DropsFramesWhenEncoderOvershoots) {
} }
video_stream_encoder_->OnBitrateUpdated( 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 // Target framerate should be still be near the expected target, despite
// the frame drops. // the frame drops.
@ -4372,7 +4445,8 @@ TEST_F(VideoStreamEncoderTest, ConfiguresCorrectFrameRate) {
int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec; int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec;
max_framerate_ = kActualInputFps; max_framerate_ = kActualInputFps;
video_stream_encoder_->OnBitrateUpdated( 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. // Insert 3 seconds of video, with an input fps lower than configured max.
for (int i = 0; i < kActualInputFps * 3; ++i) { for (int i = 0; i < kActualInputFps * 3; ++i) {
@ -4391,7 +4465,8 @@ TEST_F(VideoStreamEncoderTest, ConfiguresCorrectFrameRate) {
TEST_F(VideoStreamEncoderTest, AccumulatesUpdateRectOnDroppedFrames) { TEST_F(VideoStreamEncoderTest, AccumulatesUpdateRectOnDroppedFrames) {
VideoFrame::UpdateRect rect; VideoFrame::UpdateRect rect;
video_stream_encoder_->OnBitrateUpdated( 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(); fake_encoder_.BlockNextEncode();
video_source_.IncomingCapturedFrame( video_source_.IncomingCapturedFrame(
@ -4435,7 +4510,8 @@ TEST_F(VideoStreamEncoderTest, AccumulatesUpdateRectOnDroppedFrames) {
TEST_F(VideoStreamEncoderTest, SetsFrameTypes) { TEST_F(VideoStreamEncoderTest, SetsFrameTypes) {
video_stream_encoder_->OnBitrateUpdated( 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. // First frame is always keyframe.
video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr)); video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
@ -4466,6 +4542,7 @@ TEST_F(VideoStreamEncoderTest, SetsFrameTypesSimulcast) {
// Setup simulcast with three streams. // Setup simulcast with three streams.
ResetEncoder("VP8", 3, 1, 1, false); ResetEncoder("VP8", 3, 1, 1, false);
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
DataRate::bps(kSimulcastTargetBitrateBps),
DataRate::bps(kSimulcastTargetBitrateBps), DataRate::bps(kSimulcastTargetBitrateBps),
DataRate::bps(kSimulcastTargetBitrateBps), 0, 0); DataRate::bps(kSimulcastTargetBitrateBps), 0, 0);
// Wait for all three layers before triggering event. // Wait for all three layers before triggering event.
@ -4508,7 +4585,8 @@ TEST_F(VideoStreamEncoderTest, RequestKeyframeInternalSource) {
encoder_factory_.SetHasInternalSource(true); encoder_factory_.SetHasInternalSource(true);
ResetEncoder("VP8", 1, 1, 1, false); ResetEncoder("VP8", 1, 1, 1, false);
video_stream_encoder_->OnBitrateUpdated( 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 // Call encoder directly, simulating internal source where encoded frame
// callback in VideoStreamEncoder is called despite no OnFrame(). // callback in VideoStreamEncoder is called despite no OnFrame().
@ -4545,7 +4623,8 @@ TEST_F(VideoStreamEncoderTest, AdjustsTimestampInternalSource) {
encoder_factory_.SetHasInternalSource(true); encoder_factory_.SetHasInternalSource(true);
ResetEncoder("VP8", 1, 1, 1, false); ResetEncoder("VP8", 1, 1, 1, false);
video_stream_encoder_->OnBitrateUpdated( 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; int64_t timestamp = 1;
EncodedImage image; EncodedImage image;
@ -4636,7 +4715,8 @@ TEST_F(VideoStreamEncoderTest, CopiesVideoFrameMetadataAfterDownscale) {
const int kTargetBitrateBps = 300000; // To low for HD resolution. const int kTargetBitrateBps = 300000; // To low for HD resolution.
video_stream_encoder_->OnBitrateUpdated( 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(); video_stream_encoder_->WaitUntilTaskQueueIsIdle();
// Insert a first video frame. It should be dropped because of downscale in // Insert a first video frame. It should be dropped because of downscale in
@ -4676,6 +4756,7 @@ TEST_F(VideoStreamEncoderTest, BandwidthAllocationLowerBound) {
// Initial rate. // Initial rate.
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
/*target_bitrate=*/DataRate::kbps(300), /*target_bitrate=*/DataRate::kbps(300),
/*stable_target_bitrate=*/DataRate::kbps(300),
/*link_allocation=*/DataRate::kbps(300), /*link_allocation=*/DataRate::kbps(300),
/*fraction_lost=*/0, /*fraction_lost=*/0,
/*rtt_ms=*/0); /*rtt_ms=*/0);
@ -4693,6 +4774,7 @@ TEST_F(VideoStreamEncoderTest, BandwidthAllocationLowerBound) {
DataRate target_rate = min_rate - DataRate::kbps(1); DataRate target_rate = min_rate - DataRate::kbps(1);
video_stream_encoder_->OnBitrateUpdated( video_stream_encoder_->OnBitrateUpdated(
/*target_bitrate=*/target_rate, /*target_bitrate=*/target_rate,
/*stable_target_bitrate=*/target_rate,
/*link_allocation=*/target_rate, /*link_allocation=*/target_rate,
/*fraction_lost=*/0, /*fraction_lost=*/0,
/*rtt_ms=*/0); /*rtt_ms=*/0);