Split up EncoderStreamFactory::CreateEncoderStreams in two.
Motivation: https://google.github.io/styleguide/cppguide.html#Write_Short_Functions
This is a pure clean up CL, that should have no functional implications.
Bug: webrtc:11297
Change-Id: I077a8b52254a936b61d1fda94e8cfc39e8cf1294
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166883
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Rasmus Brandt <brandtr@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30337}
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index a2944d5..b17938b 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -3105,7 +3105,6 @@
RTC_DCHECK_GT(encoder_config.number_of_streams, 0);
RTC_DCHECK_GE(encoder_config.simulcast_layers.size(),
encoder_config.number_of_streams);
- std::vector<webrtc::VideoStream> layers;
const absl::optional<webrtc::DataRate> experimental_min_bitrate =
GetExperimentalMinVideoBitrate(encoder_config.codec_type);
@@ -3114,100 +3113,22 @@
((absl::EqualsIgnoreCase(codec_name_, kVp8CodecName) ||
absl::EqualsIgnoreCase(codec_name_, kH264CodecName)) &&
is_screenshare_ && conference_mode_)) {
- const bool temporal_layers_supported =
- absl::EqualsIgnoreCase(codec_name_, kVp8CodecName) ||
- absl::EqualsIgnoreCase(codec_name_, kH264CodecName);
- // Use legacy simulcast screenshare if conference mode is explicitly enabled
- // or use the regular simulcast configuration path which is generic.
- layers = GetSimulcastConfig(encoder_config.number_of_streams, width, height,
- encoder_config.bitrate_priority, max_qp_,
- is_screenshare_ && conference_mode_,
- temporal_layers_supported);
- // Allow an experiment to override the minimum bitrate for the lowest
- // spatial layer. The experiment's configuration has the lowest priority.
- if (experimental_min_bitrate) {
- layers[0].min_bitrate_bps =
- rtc::saturated_cast<int>(experimental_min_bitrate->bps());
- }
- // Update the active simulcast layers and configured bitrates.
- bool is_highest_layer_max_bitrate_configured = false;
- const bool has_scale_resolution_down_by = absl::c_any_of(
- encoder_config.simulcast_layers, [](const webrtc::VideoStream& layer) {
- return layer.scale_resolution_down_by != -1.;
- });
- const int normalized_width =
- NormalizeSimulcastSize(width, encoder_config.number_of_streams);
- const int normalized_height =
- NormalizeSimulcastSize(height, encoder_config.number_of_streams);
- for (size_t i = 0; i < layers.size(); ++i) {
- layers[i].active = encoder_config.simulcast_layers[i].active;
- // Update with configured num temporal layers if supported by codec.
- if (encoder_config.simulcast_layers[i].num_temporal_layers &&
- IsTemporalLayersSupported(codec_name_)) {
- layers[i].num_temporal_layers =
- *encoder_config.simulcast_layers[i].num_temporal_layers;
- }
- if (encoder_config.simulcast_layers[i].max_framerate > 0) {
- layers[i].max_framerate =
- encoder_config.simulcast_layers[i].max_framerate;
- }
- if (has_scale_resolution_down_by) {
- const double scale_resolution_down_by = std::max(
- encoder_config.simulcast_layers[i].scale_resolution_down_by, 1.0);
- layers[i].width = std::max(
- static_cast<int>(normalized_width / scale_resolution_down_by),
- kMinLayerSize);
- layers[i].height = std::max(
- static_cast<int>(normalized_height / scale_resolution_down_by),
- kMinLayerSize);
- }
- // Update simulcast bitrates with configured min and max bitrate.
- if (encoder_config.simulcast_layers[i].min_bitrate_bps > 0) {
- layers[i].min_bitrate_bps =
- encoder_config.simulcast_layers[i].min_bitrate_bps;
- }
- if (encoder_config.simulcast_layers[i].max_bitrate_bps > 0) {
- layers[i].max_bitrate_bps =
- encoder_config.simulcast_layers[i].max_bitrate_bps;
- }
- if (encoder_config.simulcast_layers[i].target_bitrate_bps > 0) {
- layers[i].target_bitrate_bps =
- encoder_config.simulcast_layers[i].target_bitrate_bps;
- }
- if (encoder_config.simulcast_layers[i].min_bitrate_bps > 0 &&
- encoder_config.simulcast_layers[i].max_bitrate_bps > 0) {
- // Min and max bitrate are configured.
- // Set target to 3/4 of the max bitrate (or to max if below min).
- if (encoder_config.simulcast_layers[i].target_bitrate_bps <= 0)
- layers[i].target_bitrate_bps = layers[i].max_bitrate_bps * 3 / 4;
- if (layers[i].target_bitrate_bps < layers[i].min_bitrate_bps)
- layers[i].target_bitrate_bps = layers[i].max_bitrate_bps;
- } else if (encoder_config.simulcast_layers[i].min_bitrate_bps > 0) {
- // Only min bitrate is configured, make sure target/max are above min.
- layers[i].target_bitrate_bps =
- std::max(layers[i].target_bitrate_bps, layers[i].min_bitrate_bps);
- layers[i].max_bitrate_bps =
- std::max(layers[i].max_bitrate_bps, layers[i].min_bitrate_bps);
- } else if (encoder_config.simulcast_layers[i].max_bitrate_bps > 0) {
- // Only max bitrate is configured, make sure min/target are below max.
- layers[i].min_bitrate_bps =
- std::min(layers[i].min_bitrate_bps, layers[i].max_bitrate_bps);
- layers[i].target_bitrate_bps =
- std::min(layers[i].target_bitrate_bps, layers[i].max_bitrate_bps);
- }
- if (i == layers.size() - 1) {
- is_highest_layer_max_bitrate_configured =
- encoder_config.simulcast_layers[i].max_bitrate_bps > 0;
- }
- }
- if (!is_screenshare_ && !is_highest_layer_max_bitrate_configured) {
- // No application-configured maximum for the largest layer.
- // If there is bitrate leftover, give it to the largest layer.
- BoostMaxSimulcastLayer(encoder_config.max_bitrate_bps, &layers);
- }
- return layers;
+ return CreateSimulcastOrConfereceModeScreenshareStreams(
+ width, height, encoder_config, experimental_min_bitrate);
}
+ return CreateDefaultVideoStreams(width, height, encoder_config,
+ experimental_min_bitrate);
+}
+
+std::vector<webrtc::VideoStream>
+EncoderStreamFactory::CreateDefaultVideoStreams(
+ int width,
+ int height,
+ const webrtc::VideoEncoderConfig& encoder_config,
+ const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const {
+ std::vector<webrtc::VideoStream> layers;
+
// For unset max bitrates set default bitrate for non-simulcast.
int max_bitrate_bps =
(encoder_config.max_bitrate_bps > 0)
@@ -3280,4 +3201,106 @@
return layers;
}
+std::vector<webrtc::VideoStream>
+EncoderStreamFactory::CreateSimulcastOrConfereceModeScreenshareStreams(
+ int width,
+ int height,
+ const webrtc::VideoEncoderConfig& encoder_config,
+ const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const {
+ std::vector<webrtc::VideoStream> layers;
+
+ const bool temporal_layers_supported =
+ absl::EqualsIgnoreCase(codec_name_, kVp8CodecName) ||
+ absl::EqualsIgnoreCase(codec_name_, kH264CodecName);
+ // Use legacy simulcast screenshare if conference mode is explicitly enabled
+ // or use the regular simulcast configuration path which is generic.
+ layers = GetSimulcastConfig(encoder_config.number_of_streams, width, height,
+ encoder_config.bitrate_priority, max_qp_,
+ is_screenshare_ && conference_mode_,
+ temporal_layers_supported);
+ // Allow an experiment to override the minimum bitrate for the lowest
+ // spatial layer. The experiment's configuration has the lowest priority.
+ if (experimental_min_bitrate) {
+ layers[0].min_bitrate_bps =
+ rtc::saturated_cast<int>(experimental_min_bitrate->bps());
+ }
+ // Update the active simulcast layers and configured bitrates.
+ bool is_highest_layer_max_bitrate_configured = false;
+ const bool has_scale_resolution_down_by = absl::c_any_of(
+ encoder_config.simulcast_layers, [](const webrtc::VideoStream& layer) {
+ return layer.scale_resolution_down_by != -1.;
+ });
+ const int normalized_width =
+ NormalizeSimulcastSize(width, encoder_config.number_of_streams);
+ const int normalized_height =
+ NormalizeSimulcastSize(height, encoder_config.number_of_streams);
+ for (size_t i = 0; i < layers.size(); ++i) {
+ layers[i].active = encoder_config.simulcast_layers[i].active;
+ // Update with configured num temporal layers if supported by codec.
+ if (encoder_config.simulcast_layers[i].num_temporal_layers &&
+ IsTemporalLayersSupported(codec_name_)) {
+ layers[i].num_temporal_layers =
+ *encoder_config.simulcast_layers[i].num_temporal_layers;
+ }
+ if (encoder_config.simulcast_layers[i].max_framerate > 0) {
+ layers[i].max_framerate =
+ encoder_config.simulcast_layers[i].max_framerate;
+ }
+ if (has_scale_resolution_down_by) {
+ const double scale_resolution_down_by = std::max(
+ encoder_config.simulcast_layers[i].scale_resolution_down_by, 1.0);
+ layers[i].width = std::max(
+ static_cast<int>(normalized_width / scale_resolution_down_by),
+ kMinLayerSize);
+ layers[i].height = std::max(
+ static_cast<int>(normalized_height / scale_resolution_down_by),
+ kMinLayerSize);
+ }
+ // Update simulcast bitrates with configured min and max bitrate.
+ if (encoder_config.simulcast_layers[i].min_bitrate_bps > 0) {
+ layers[i].min_bitrate_bps =
+ encoder_config.simulcast_layers[i].min_bitrate_bps;
+ }
+ if (encoder_config.simulcast_layers[i].max_bitrate_bps > 0) {
+ layers[i].max_bitrate_bps =
+ encoder_config.simulcast_layers[i].max_bitrate_bps;
+ }
+ if (encoder_config.simulcast_layers[i].target_bitrate_bps > 0) {
+ layers[i].target_bitrate_bps =
+ encoder_config.simulcast_layers[i].target_bitrate_bps;
+ }
+ if (encoder_config.simulcast_layers[i].min_bitrate_bps > 0 &&
+ encoder_config.simulcast_layers[i].max_bitrate_bps > 0) {
+ // Min and max bitrate are configured.
+ // Set target to 3/4 of the max bitrate (or to max if below min).
+ if (encoder_config.simulcast_layers[i].target_bitrate_bps <= 0)
+ layers[i].target_bitrate_bps = layers[i].max_bitrate_bps * 3 / 4;
+ if (layers[i].target_bitrate_bps < layers[i].min_bitrate_bps)
+ layers[i].target_bitrate_bps = layers[i].max_bitrate_bps;
+ } else if (encoder_config.simulcast_layers[i].min_bitrate_bps > 0) {
+ // Only min bitrate is configured, make sure target/max are above min.
+ layers[i].target_bitrate_bps =
+ std::max(layers[i].target_bitrate_bps, layers[i].min_bitrate_bps);
+ layers[i].max_bitrate_bps =
+ std::max(layers[i].max_bitrate_bps, layers[i].min_bitrate_bps);
+ } else if (encoder_config.simulcast_layers[i].max_bitrate_bps > 0) {
+ // Only max bitrate is configured, make sure min/target are below max.
+ layers[i].min_bitrate_bps =
+ std::min(layers[i].min_bitrate_bps, layers[i].max_bitrate_bps);
+ layers[i].target_bitrate_bps =
+ std::min(layers[i].target_bitrate_bps, layers[i].max_bitrate_bps);
+ }
+ if (i == layers.size() - 1) {
+ is_highest_layer_max_bitrate_configured =
+ encoder_config.simulcast_layers[i].max_bitrate_bps > 0;
+ }
+ }
+ if (!is_screenshare_ && !is_highest_layer_max_bitrate_configured) {
+ // No application-configured maximum for the largest layer.
+ // If there is bitrate leftover, give it to the largest layer.
+ BoostMaxSimulcastLayer(encoder_config.max_bitrate_bps, &layers);
+ }
+ return layers;
+}
+
} // namespace cricket
diff --git a/media/engine/webrtc_video_engine.h b/media/engine/webrtc_video_engine.h
index 9e0ede9..d5ed95b 100644
--- a/media/engine/webrtc_video_engine.h
+++ b/media/engine/webrtc_video_engine.h
@@ -612,6 +612,19 @@
int height,
const webrtc::VideoEncoderConfig& encoder_config) override;
+ std::vector<webrtc::VideoStream> CreateDefaultVideoStreams(
+ int width,
+ int height,
+ const webrtc::VideoEncoderConfig& encoder_config,
+ const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const;
+
+ std::vector<webrtc::VideoStream>
+ CreateSimulcastOrConfereceModeScreenshareStreams(
+ int width,
+ int height,
+ const webrtc::VideoEncoderConfig& encoder_config,
+ const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const;
+
const std::string codec_name_;
const int max_qp_;
const bool is_screenshare_;