Don't override resolution bitrate limits in singlecast mode if they're already set.

Bug: webrtc:13872
Change-Id: I966c744a13cf74336d62d96c72eb37ebf96de71f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256803
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Peter Hanspers <peterhanspers@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36342}
This commit is contained in:
Peter Hanspers 2022-03-25 14:16:27 +01:00 committed by WebRTC LUCI CQ
parent 56a04c3430
commit ac2dd12d84
2 changed files with 46 additions and 1 deletions

View File

@ -824,7 +824,9 @@ void SimulcastEncoderAdapter::OverrideFromFieldTrial(
info->apply_alignment_to_all_simulcast_layers ||
encoder_info_override_.apply_alignment_to_all_simulcast_layers();
}
if (!encoder_info_override_.resolution_bitrate_limits().empty()) {
// Override resolution bitrate limits unless they're set already.
if (info->resolution_bitrate_limits.empty() &&
!encoder_info_override_.resolution_bitrate_limits().empty()) {
info->resolution_bitrate_limits =
encoder_info_override_.resolution_bitrate_limits();
}

View File

@ -182,6 +182,10 @@ class MockVideoEncoderFactory : public VideoEncoderFactory {
void set_supports_simulcast(bool supports_simulcast) {
supports_simulcast_ = supports_simulcast;
}
void set_resolution_bitrate_limits(
std::vector<VideoEncoder::ResolutionBitrateLimits> limits) {
resolution_bitrate_limits_ = limits;
}
void DestroyVideoEncoder(VideoEncoder* encoder);
@ -193,6 +197,7 @@ class MockVideoEncoderFactory : public VideoEncoderFactory {
// Keep number of entries in sync with `kMaxSimulcastStreams`.
std::vector<int> requested_resolution_alignments_ = {1, 1, 1};
bool supports_simulcast_ = false;
std::vector<VideoEncoder::ResolutionBitrateLimits> resolution_bitrate_limits_;
};
class MockVideoEncoder : public VideoEncoder {
@ -245,6 +250,7 @@ class MockVideoEncoder : public VideoEncoder {
info.fps_allocation[0] = fps_allocation_;
info.supports_simulcast = supports_simulcast_;
info.is_qp_trusted = is_qp_trusted_;
info.resolution_bitrate_limits = resolution_bitrate_limits;
return info;
}
@ -312,6 +318,11 @@ class MockVideoEncoder : public VideoEncoder {
is_qp_trusted_ = is_qp_trusted;
}
void set_resolution_bitrate_limits(
std::vector<VideoEncoder::ResolutionBitrateLimits> limits) {
resolution_bitrate_limits = limits;
}
bool supports_simulcast() const { return supports_simulcast_; }
SdpVideoFormat video_format() const { return video_format_; }
@ -331,6 +342,7 @@ class MockVideoEncoder : public VideoEncoder {
bool supports_simulcast_ = false;
absl::optional<bool> is_qp_trusted_;
SdpVideoFormat video_format_;
std::vector<VideoEncoder::ResolutionBitrateLimits> resolution_bitrate_limits;
VideoCodec codec_;
EncodedImageCallback* callback_;
@ -359,6 +371,7 @@ std::unique_ptr<VideoEncoder> MockVideoEncoderFactory::CreateVideoEncoder(
requested_resolution_alignments_[encoders_.size()]);
encoder->set_supports_simulcast(supports_simulcast_);
encoder->set_video_format(format);
encoder->set_resolution_bitrate_limits(resolution_bitrate_limits_);
encoders_.push_back(encoder.get());
return encoder;
}
@ -1329,6 +1342,36 @@ TEST_F(TestSimulcastEncoderAdapterFake,
adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers);
}
TEST_F(
TestSimulcastEncoderAdapterFake,
EncoderInfoFromFieldTrialDoesNotOverrideExistingBitrateLimitsInSinglecast) {
test::ScopedFieldTrials field_trials(
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
"frame_size_pixels:123|456|789,"
"min_start_bitrate_bps:11000|22000|33000,"
"min_bitrate_bps:44000|55000|66000,"
"max_bitrate_bps:77000|88000|99000/");
std::vector<VideoEncoder::ResolutionBitrateLimits> bitrate_limits;
bitrate_limits.push_back(
VideoEncoder::ResolutionBitrateLimits(111, 11100, 44400, 77700));
bitrate_limits.push_back(
VideoEncoder::ResolutionBitrateLimits(444, 22200, 55500, 88700));
bitrate_limits.push_back(
VideoEncoder::ResolutionBitrateLimits(777, 33300, 66600, 99900));
SetUp();
helper_->factory()->set_resolution_bitrate_limits(bitrate_limits);
SimulcastTestFixtureImpl::DefaultSettings(
&codec_, static_cast<const int*>(kTestTemporalLayerProfile),
kVideoCodecVP8);
codec_.numberOfSimulcastStreams = 1;
EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
ASSERT_EQ(1u, helper_->factory()->encoders().size());
EXPECT_EQ(adapter_->GetEncoderInfo().resolution_bitrate_limits,
bitrate_limits);
}
TEST_F(TestSimulcastEncoderAdapterFake, EncoderInfoFromFieldTrial) {
test::ScopedFieldTrials field_trials(
"WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"