Fix so that codec max bitrate doesn't override.

Currently the codec specific max bitrate that is set in the SDP
gets overridden by the value set with the "b=AS" attribute
(WebRtcVideoChannel::SetSendParameters). But at the
WebRtcVideoSendStream level it does the opposite - the codec
specific max bitrate value overrides the values that could be
set by RtpParameters or the "b=AS" value
(in WebRtcVideoSendStream::CreateVideoEncoderConfig). This change
updates the logic to be consistent with what happens at the
WebRtcVideoChannel level, and allows the RtpParameter max bitrate
to override the codec specific max bitrate.

Bug: webrtc:8655
Change-Id: I3f0347cb7cffcfc577484231b061ab0712453e69
Reviewed-on: https://webrtc-review.googlesource.com/88520
Commit-Queue: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23989}
This commit is contained in:
Seth Hampson 2018-07-13 10:41:10 -07:00 committed by Commit Bot
parent 800787f03b
commit feec91e681
2 changed files with 69 additions and 1 deletions

View File

@ -1940,6 +1940,10 @@ WebRtcVideoChannel::WebRtcVideoSendStream::CreateVideoEncoderConfig(
encoder_config.number_of_streams = 1;
}
// parameters_.max_bitrate comes from the max bitrate set at the SDP
// (m-section) level with the attribute "b=AS." Note that we override this
// value below if the RtpParameters max bitrate set with
// RtpSender::SetParameters has a lower value.
int stream_max_bitrate = parameters_.max_bitrate_bps;
// When simulcast is enabled (when there are multiple encodings),
// encodings[i].max_bitrate_bps will be enforced by
@ -1953,8 +1957,13 @@ WebRtcVideoChannel::WebRtcVideoSendStream::CreateVideoEncoderConfig(
parameters_.max_bitrate_bps);
}
// The codec max bitrate comes from the "x-google-max-bitrate" parameter
// attribute set in the SDP for a specific codec. As done in
// WebRtcVideoChannel::SetSendParameters, this value does not override the
// stream max_bitrate set above.
int codec_max_bitrate_kbps;
if (codec.GetParam(kCodecParamMaxBitrate, &codec_max_bitrate_kbps)) {
if (codec.GetParam(kCodecParamMaxBitrate, &codec_max_bitrate_kbps) &&
stream_max_bitrate == -1) {
stream_max_bitrate = codec_max_bitrate_kbps * 1000;
}
encoder_config.max_bitrate_bps = stream_max_bitrate;

View File

@ -3955,6 +3955,65 @@ TEST_F(WebRtcVideoChannelTest, SetMaxSendBandwidthAndAddSendStream) {
stream->GetVideoStreams()[0].max_bitrate_bps);
}
// Tests that when the codec specific max bitrate and VideoSendParameters
// max_bandwidth_bps are used, that it sets the VideoStream's max bitrate
// appropriately.
TEST_F(WebRtcVideoChannelTest,
MaxBitratePrioritizesVideoSendParametersOverCodecMaxBitrate) {
send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "100";
send_parameters_.codecs[0].params[kCodecParamStartBitrate] = "200";
send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "300";
send_parameters_.max_bandwidth_bps = -1;
AddSendStream();
ExpectSetMaxBitrate(300000);
ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
std::vector<FakeVideoSendStream*> video_send_streams = GetFakeSendStreams();
ASSERT_EQ(1u, video_send_streams.size());
FakeVideoSendStream* video_send_stream = video_send_streams[0];
ASSERT_EQ(1u, video_send_streams[0]->GetVideoStreams().size());
// First the max bitrate is set based upon the codec param.
EXPECT_EQ(300000,
video_send_streams[0]->GetVideoStreams()[0].max_bitrate_bps);
// The VideoSendParameters max bitrate overrides the codec's.
send_parameters_.max_bandwidth_bps = 500000;
ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps);
ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
ASSERT_EQ(1u, video_send_stream->GetVideoStreams().size());
EXPECT_EQ(500000, video_send_stream->GetVideoStreams()[0].max_bitrate_bps);
}
// Tests that when the codec specific max bitrate and RtpParameters
// max_bitrate_bps are used, that it sets the VideoStream's max bitrate
// appropriately.
TEST_F(WebRtcVideoChannelTest,
MaxBitratePrioritizesRtpParametersOverCodecMaxBitrate) {
send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "100";
send_parameters_.codecs[0].params[kCodecParamStartBitrate] = "200";
send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "300";
send_parameters_.max_bandwidth_bps = -1;
AddSendStream();
ExpectSetMaxBitrate(300000);
ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
std::vector<FakeVideoSendStream*> video_send_streams = GetFakeSendStreams();
ASSERT_EQ(1u, video_send_streams.size());
FakeVideoSendStream* video_send_stream = video_send_streams[0];
ASSERT_EQ(1u, video_send_stream->GetVideoStreams().size());
// First the max bitrate is set based upon the codec param.
EXPECT_EQ(300000, video_send_stream->GetVideoStreams()[0].max_bitrate_bps);
// The RtpParameter max bitrate overrides the codec's.
webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(last_ssrc_);
ASSERT_EQ(1u, parameters.encodings.size());
parameters.encodings[0].max_bitrate_bps = 500000;
EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
ASSERT_EQ(1u, video_send_stream->GetVideoStreams().size());
EXPECT_EQ(parameters.encodings[0].max_bitrate_bps,
video_send_stream->GetVideoStreams()[0].max_bitrate_bps);
}
TEST_F(WebRtcVideoChannelTest,
MaxBitrateIsMinimumOfMaxSendBandwidthAndMaxEncodingBitrate) {
send_parameters_.max_bandwidth_bps = 99999;