Simulcast screenshare adjustment to temporal layers, bitrate
Change experimental max bitrate setting from 1.6Mbps to 1.25Mbps in order to allow a larger fraction of participants to receive this layer. Add a new field trial to allow setting the number of temporal layers for the high-quality simulcast stream in screensharing separately from the temporal layer count for regular video. Bug: webrtc:9477 Change-Id: I1341b774f870c50710901da24963bd3ede96ffd8 Reviewed-on: https://webrtc-review.googlesource.com/95101 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24356}
This commit is contained in:
@ -31,7 +31,7 @@ constexpr int kScreenshareDefaultTl1BitrateKbps = 1000;
|
|||||||
|
|
||||||
// Max bitrate for the higher one of the two simulcast stream used for screen
|
// Max bitrate for the higher one of the two simulcast stream used for screen
|
||||||
// content.
|
// content.
|
||||||
constexpr int kScreenshareHighStreamMaxBitrateBps = 1600000;
|
constexpr int kScreenshareHighStreamMaxBitrateBps = 1250000;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@ -70,14 +70,17 @@ const SimulcastFormat kSimulcastFormats[] = {
|
|||||||
const int kMaxScreenshareSimulcastLayers = 2;
|
const int kMaxScreenshareSimulcastLayers = 2;
|
||||||
|
|
||||||
// Multiway: Number of temporal layers for each simulcast stream.
|
// Multiway: Number of temporal layers for each simulcast stream.
|
||||||
int DefaultNumberOfTemporalLayers(int simulcast_id) {
|
int DefaultNumberOfTemporalLayers(int simulcast_id, bool screenshare) {
|
||||||
RTC_CHECK_GE(simulcast_id, 0);
|
RTC_CHECK_GE(simulcast_id, 0);
|
||||||
RTC_CHECK_LT(simulcast_id, webrtc::kMaxSimulcastStreams);
|
RTC_CHECK_LT(simulcast_id, webrtc::kMaxSimulcastStreams);
|
||||||
|
|
||||||
const int kDefaultNumTemporalLayers = 3;
|
const int kDefaultNumTemporalLayers = 3;
|
||||||
|
|
||||||
const std::string group_name =
|
const std::string group_name =
|
||||||
webrtc::field_trial::FindFullName("WebRTC-VP8ConferenceTemporalLayers");
|
screenshare ? webrtc::field_trial::FindFullName(
|
||||||
|
"WebRTC-VP8ScreenshareTemporalLayers")
|
||||||
|
: webrtc::field_trial::FindFullName(
|
||||||
|
"WebRTC-VP8ConferenceTemporalLayers");
|
||||||
if (group_name.empty())
|
if (group_name.empty())
|
||||||
return kDefaultNumTemporalLayers;
|
return kDefaultNumTemporalLayers;
|
||||||
|
|
||||||
@ -240,11 +243,10 @@ std::vector<webrtc::VideoStream> GetNormalSimulcastLayers(
|
|||||||
// TODO(pbos): Fill actual temporal-layer bitrate thresholds.
|
// TODO(pbos): Fill actual temporal-layer bitrate thresholds.
|
||||||
layers[s].max_qp = max_qp;
|
layers[s].max_qp = max_qp;
|
||||||
layers[s].num_temporal_layers =
|
layers[s].num_temporal_layers =
|
||||||
temporal_layers_supported ? DefaultNumberOfTemporalLayers(s)
|
temporal_layers_supported ? DefaultNumberOfTemporalLayers(s, false) : 0;
|
||||||
: 0;
|
|
||||||
layers[s].max_bitrate_bps = FindSimulcastMaxBitrateBps(width, height);
|
layers[s].max_bitrate_bps = FindSimulcastMaxBitrateBps(width, height);
|
||||||
layers[s].target_bitrate_bps = FindSimulcastTargetBitrateBps(width, height);
|
layers[s].target_bitrate_bps = FindSimulcastTargetBitrateBps(width, height);
|
||||||
int num_temporal_layers = DefaultNumberOfTemporalLayers(s);
|
int num_temporal_layers = DefaultNumberOfTemporalLayers(s, false);
|
||||||
if (s == 0) {
|
if (s == 0) {
|
||||||
// If alternative number temporal layers is selected, adjust the
|
// If alternative number temporal layers is selected, adjust the
|
||||||
// bitrate of the lowest simulcast stream so that absolute bitrate for
|
// bitrate of the lowest simulcast stream so that absolute bitrate for
|
||||||
@ -317,16 +319,16 @@ std::vector<webrtc::VideoStream> GetScreenshareLayers(
|
|||||||
// restrictions. The base simulcast layer will still use legacy setup.
|
// restrictions. The base simulcast layer will still use legacy setup.
|
||||||
if (num_simulcast_layers == kMaxScreenshareSimulcastLayers) {
|
if (num_simulcast_layers == kMaxScreenshareSimulcastLayers) {
|
||||||
// Add optional upper simulcast layer.
|
// Add optional upper simulcast layer.
|
||||||
const int num_temporal_layers = DefaultNumberOfTemporalLayers(1);
|
const int num_temporal_layers = DefaultNumberOfTemporalLayers(1, true);
|
||||||
int max_bitrate_bps;
|
int max_bitrate_bps;
|
||||||
if (!temporal_layers_supported) {
|
if (!temporal_layers_supported) {
|
||||||
// Set the max bitrate to where the base layer would have been if temporal
|
// Set the max bitrate to where the base layer would have been if temporal
|
||||||
// layer were enabled.
|
// layers were enabled.
|
||||||
max_bitrate_bps = static_cast<int>(
|
max_bitrate_bps = static_cast<int>(
|
||||||
kScreenshareHighStreamMaxBitrateBps *
|
kScreenshareHighStreamMaxBitrateBps *
|
||||||
webrtc::SimulcastRateAllocator::GetTemporalRateAllocation(
|
webrtc::SimulcastRateAllocator::GetTemporalRateAllocation(
|
||||||
num_temporal_layers, 0));
|
num_temporal_layers, 0));
|
||||||
} else if (DefaultNumberOfTemporalLayers(1) != 3 ||
|
} else if (DefaultNumberOfTemporalLayers(1, true) != 3 ||
|
||||||
webrtc::field_trial::IsEnabled("WebRTC-UseShortVP8TL3Pattern")) {
|
webrtc::field_trial::IsEnabled("WebRTC-UseShortVP8TL3Pattern")) {
|
||||||
// Experimental temporal layer mode used, use increased max bitrate.
|
// Experimental temporal layer mode used, use increased max bitrate.
|
||||||
max_bitrate_bps = kScreenshareHighStreamMaxBitrateBps;
|
max_bitrate_bps = kScreenshareHighStreamMaxBitrateBps;
|
||||||
@ -348,7 +350,7 @@ std::vector<webrtc::VideoStream> GetScreenshareLayers(
|
|||||||
layers[1].max_qp = max_qp;
|
layers[1].max_qp = max_qp;
|
||||||
layers[1].max_framerate = max_framerate;
|
layers[1].max_framerate = max_framerate;
|
||||||
layers[1].num_temporal_layers =
|
layers[1].num_temporal_layers =
|
||||||
temporal_layers_supported ? DefaultNumberOfTemporalLayers(1) : 0;
|
temporal_layers_supported ? DefaultNumberOfTemporalLayers(1, true) : 0;
|
||||||
layers[1].min_bitrate_bps = layers[0].target_bitrate_bps * 2;
|
layers[1].min_bitrate_bps = layers[0].target_bitrate_bps * 2;
|
||||||
layers[1].target_bitrate_bps = max_bitrate_bps;
|
layers[1].target_bitrate_bps = max_bitrate_bps;
|
||||||
layers[1].max_bitrate_bps = max_bitrate_bps;
|
layers[1].max_bitrate_bps = max_bitrate_bps;
|
||||||
|
|||||||
Reference in New Issue
Block a user