| 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 && | 
|  |