Allows change of fake encoder max rate in scenarios tests.
Bug: webrtc:9510
Change-Id: I13010c7febe8c31de78178611915a2b9e2f9869f
Reviewed-on: https://webrtc-review.googlesource.com/c/110612
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25608}
diff --git a/test/scenario/video_stream.cc b/test/scenario/video_stream.cc
index 77dff14..9a5d461 100644
--- a/test/scenario/video_stream.cc
+++ b/test/scenario/video_stream.cc
@@ -163,6 +163,12 @@
}
encoder_config.encoder_specific_settings =
CreateEncoderSpecificSettings(config);
+ if (config.encoder.max_framerate) {
+ for (auto& layer : encoder_config.simulcast_layers) {
+ layer.max_framerate = *config.encoder.max_framerate;
+ }
+ }
+
return encoder_config;
}
} // namespace
@@ -203,11 +209,13 @@
case Encoder::Implementation::kFake:
if (config.encoder.codec == Codec::kVideoCodecGeneric) {
encoder_factory_ =
- absl::make_unique<FunctionVideoEncoderFactory>([this, config]() {
+ absl::make_unique<FunctionVideoEncoderFactory>([this]() {
+ rtc::CritScope cs(&crit_);
auto encoder =
absl::make_unique<test::FakeEncoder>(sender_->clock_);
- if (config.encoder.fake.max_rate.IsFinite())
- encoder->SetMaxBitrate(config.encoder.fake.max_rate.kbps());
+ fake_encoders_.push_back(encoder.get());
+ if (config_.encoder.fake.max_rate.IsFinite())
+ encoder->SetMaxBitrate(config_.encoder.fake.max_rate.kbps());
return encoder;
});
} else {
@@ -250,17 +258,31 @@
video_capturer_->Start();
}
+void SendVideoStream::UpdateConfig(
+ std::function<void(VideoStreamConfig*)> modifier) {
+ rtc::CritScope cs(&crit_);
+ VideoStreamConfig prior_config = config_;
+ modifier(&config_);
+ if (prior_config.encoder.fake.max_rate != config_.encoder.fake.max_rate) {
+ for (auto* encoder : fake_encoders_) {
+ encoder->SetMaxBitrate(config_.encoder.fake.max_rate.kbps());
+ }
+ }
+ // TODO(srte): Add more conditions that should cause reconfiguration.
+ if (prior_config.encoder.max_framerate != config_.encoder.max_framerate) {
+ VideoEncoderConfig encoder_config = CreateVideoEncoderConfig(config_);
+ send_stream_->ReconfigureVideoEncoder(std::move(encoder_config));
+ }
+ if (prior_config.source.framerate != config_.source.framerate) {
+ SetCaptureFramerate(config_.source.framerate);
+ }
+}
+
void SendVideoStream::SetCaptureFramerate(int framerate) {
RTC_CHECK(frame_generator_)
<< "Framerate change only implemented for generators";
frame_generator_->ChangeFramerate(framerate);
-}
-void SendVideoStream::SetMaxFramerate(absl::optional<int> max_framerate) {
- VideoEncoderConfig encoder_config = CreateVideoEncoderConfig(config_);
- RTC_DCHECK_EQ(encoder_config.simulcast_layers.size(), 1);
- encoder_config.simulcast_layers[0].max_framerate = max_framerate.value_or(-1);
- send_stream_->ReconfigureVideoEncoder(std::move(encoder_config));
}
VideoSendStream::Stats SendVideoStream::GetStats() const {
@@ -290,9 +312,7 @@
SendVideoStream* send_stream,
size_t chosen_stream,
Transport* feedback_transport)
- : receiver_(receiver),
- config_(config),
- decoder_factory_(absl::make_unique<InternalDecoderFactory>()) {
+ : receiver_(receiver), config_(config) {
renderer_ = absl::make_unique<FakeVideoRenderer>();
VideoReceiveStream::Config recv_config(feedback_transport);
recv_config.rtp.remb = !config.stream.packet_feedback;
@@ -317,6 +337,13 @@
VideoReceiveStream::Decoder decoder =
CreateMatchingDecoder(CodecTypeToPayloadType(config.encoder.codec),
CodecTypeToPayloadString(config.encoder.codec));
+ if (config.encoder.codec ==
+ VideoStreamConfig::Encoder::Codec::kVideoCodecGeneric) {
+ decoder_factory_ = absl::make_unique<FunctionVideoDecoderFactory>(
+ []() { return absl::make_unique<FakeDecoder>(); });
+ } else {
+ decoder_factory_ = absl::make_unique<InternalDecoderFactory>();
+ }
decoder.decoder_factory = decoder_factory_.get();
recv_config.decoders.push_back(decoder);