Do not request encoder switch when the video is suspended.

Bug: None
Change-Id: I0ecd4db4ee53e1eb6682a2a98b684fcdf5c2e93b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168924
Commit-Queue: Mirta Dvornicic <mirtad@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30585}
This commit is contained in:
Mirta Dvornicic
2020-02-21 16:35:51 +01:00
committed by Commit Bot
parent 9526c557be
commit 5ed40cfa2e
2 changed files with 39 additions and 3 deletions

View File

@ -1560,7 +1560,10 @@ void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate,
}
RTC_DCHECK_RUN_ON(&encoder_queue_);
if (settings_.encoder_switch_request_callback) {
const bool video_is_suspended = target_bitrate == DataRate::Zero();
const bool video_suspension_changed = video_is_suspended != EncoderPaused();
if (!video_is_suspended && settings_.encoder_switch_request_callback) {
if (encoder_selector_) {
if (auto encoder = encoder_selector_->OnEncodingBitrate(target_bitrate)) {
settings_.encoder_switch_request_callback->RequestEncoderSwitch(
@ -1594,8 +1597,6 @@ void VideoStreamEncoder::OnBitrateUpdated(DataRate target_bitrate,
uint32_t framerate_fps = GetInputFramerateFps();
frame_dropper_.SetRates((target_bitrate.bps() + 500) / 1000, framerate_fps);
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<double>(framerate_fps),

View File

@ -5258,6 +5258,41 @@ TEST_F(VideoStreamEncoderTest, BitrateEncoderSwitch) {
video_stream_encoder_->Stop();
}
TEST_F(VideoStreamEncoderTest, VideoSuspendedNoEncoderSwitch) {
constexpr int kDontCare = 100;
StrictMock<MockEncoderSwitchRequestCallback> switch_callback;
video_send_config_.encoder_settings.encoder_switch_request_callback =
&switch_callback;
VideoEncoderConfig encoder_config = video_encoder_config_.Copy();
encoder_config.codec_type = kVideoCodecVP8;
webrtc::test::ScopedFieldTrials field_trial(
"WebRTC-NetworkCondition-EncoderSwitch/"
"codec_thresholds:VP8;100;-1|H264;-1;30000,"
"to_codec:AV1,to_param:ping,to_value:pong,window:2.0/");
// Reset encoder for new configuration to take effect.
ConfigureEncoder(std::move(encoder_config));
// Send one frame to trigger ReconfigureEncoder.
video_source_.IncomingCapturedFrame(
CreateFrame(kDontCare, kDontCare, kDontCare));
using Config = EncoderSwitchRequestCallback::Config;
EXPECT_CALL(switch_callback, RequestEncoderSwitch(Matcher<const Config&>(_)))
.Times(0);
video_stream_encoder_->OnBitrateUpdated(
/*target_bitrate=*/DataRate::KilobitsPerSec(0),
/*stable_target_bitrate=*/DataRate::KilobitsPerSec(0),
/*link_allocation=*/DataRate::KilobitsPerSec(kDontCare),
/*fraction_lost=*/0,
/*rtt_ms=*/0,
/*cwnd_reduce_ratio=*/0);
video_stream_encoder_->Stop();
}
TEST_F(VideoStreamEncoderTest, ResolutionEncoderSwitch) {
constexpr int kSufficientBitrateToNotDrop = 1000;
constexpr int kHighRes = 500;