Index: webrtc/media/engine/webrtcvideoengine2.cc |
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc |
index 6442613081e73492c494fce9d1a0e1bcfa99a591..5fe36c43860cf3d41dd703edafe073cfa9916fb8 100644 |
--- a/webrtc/media/engine/webrtcvideoengine2.cc |
+++ b/webrtc/media/engine/webrtcvideoengine2.cc |
@@ -818,6 +818,32 @@ bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) { |
send_params_ = params; |
return true; |
} |
+webrtc::RtpParameters WebRtcVideoChannel2::GetRtpParameters( |
+ uint32_t ssrc) const { |
+ rtc::CritScope stream_lock(&stream_crit_); |
+ auto it = send_streams_.find(ssrc); |
+ if (it == send_streams_.end()) { |
+ LOG(LS_WARNING) << "Attempting to get RTP parameters for stream with ssrc " |
+ << ssrc << " which doesn't exist."; |
+ return webrtc::RtpParameters(); |
+ } |
+ |
+ return it->second->rtp_parameters(); |
+} |
+ |
+bool WebRtcVideoChannel2::SetRtpParameters( |
+ uint32_t ssrc, |
+ const webrtc::RtpParameters& parameters) { |
+ rtc::CritScope stream_lock(&stream_crit_); |
+ auto it = send_streams_.find(ssrc); |
+ if (it == send_streams_.end()) { |
+ LOG(LS_ERROR) << "Attempting to set RTP parameters for stream with ssrc " |
+ << ssrc << " which doesn't exist."; |
+ return false; |
+ } |
+ |
+ return it->second->SetRtpParameters(parameters); |
+} |
bool WebRtcVideoChannel2::GetChangedRecvParameters( |
const VideoRecvParameters& params, |
@@ -1476,6 +1502,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( |
external_encoder_factory_(external_encoder_factory), |
stream_(nullptr), |
parameters_(config, options, max_bitrate_bps, codec_settings), |
+ rtp_parameters_(CreateRtpParametersWithOneEncoding()), |
pending_encoder_reconfiguration_(false), |
allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), |
sending_(false), |
@@ -1763,8 +1790,6 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters( |
recreate_stream = true; |
} |
if (params.max_bandwidth_bps) { |
- // Max bitrate has changed, reconfigure encoder settings on the next frame |
- // or stream recreation. |
parameters_.max_bitrate_bps = *params.max_bandwidth_bps; |
pending_encoder_reconfiguration_ = true; |
} |
@@ -1798,6 +1823,31 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters( |
} |
} |
+bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpParameters( |
+ const webrtc::RtpParameters& new_parameters) { |
+ if (!ValidateRtpParameters(new_parameters)) { |
+ return false; |
+ } |
+ |
+ rtc::CritScope cs(&lock_); |
+ if (new_parameters.encodings[0].max_bitrate_bps != |
+ rtp_parameters_.encodings[0].max_bitrate_bps) { |
+ pending_encoder_reconfiguration_ = true; |
+ } |
+ rtp_parameters_ = new_parameters; |
+ return true; |
+} |
+ |
+bool WebRtcVideoChannel2::WebRtcVideoSendStream::ValidateRtpParameters( |
+ const webrtc::RtpParameters& rtp_parameters) { |
+ if (rtp_parameters.encodings.size() != 1) { |
+ LOG(LS_ERROR) |
+ << "Attempted to set RtpParameters without exactly one encoding"; |
+ return false; |
+ } |
+ return true; |
+} |
+ |
webrtc::VideoEncoderConfig |
WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( |
const Dimensions& dimensions, |
@@ -1837,9 +1887,11 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( |
stream_count = 1; |
} |
- encoder_config.streams = |
- CreateVideoStreams(clamped_codec, parameters_.options, |
- parameters_.max_bitrate_bps, stream_count); |
+ int stream_max_bitrate = |
+ MinPositive(rtp_parameters_.encodings[0].max_bitrate_bps, |
+ parameters_.max_bitrate_bps); |
+ encoder_config.streams = CreateVideoStreams( |
+ clamped_codec, parameters_.options, stream_max_bitrate, stream_count); |
// Conference mode screencast uses 2 temporal layers split at 100kbit. |
if (parameters_.conference_mode && is_screencast && |