| Index: webrtc/media/engine/webrtcvideoengine2.cc
 | 
| diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
 | 
| index e34056d905257371b6f9c0db015f38a3bdcf3a85..1dbfe8701cd8bf66ad60bf45f51a94a2ef3ac004 100644
 | 
| --- a/webrtc/media/engine/webrtcvideoengine2.cc
 | 
| +++ b/webrtc/media/engine/webrtcvideoengine2.cc
 | 
| @@ -78,9 +78,9 @@ webrtc::Call::Config::BitrateConfig GetBitrateConfigForCodec(
 | 
|    }
 | 
|    if (codec.GetParam(kCodecParamMaxBitrate, &bitrate_kbps) &&
 | 
|        bitrate_kbps > 0) {
 | 
| -    config.max_bitrate_bps = bitrate_kbps * 1000;
 | 
| +    config.max_bitrate_bps = rtc::Optional<int>(bitrate_kbps * 1000);
 | 
|    } else {
 | 
| -    config.max_bitrate_bps = -1;
 | 
| +    config.max_bitrate_bps = rtc::Optional<int>();
 | 
|    }
 | 
|    return config;
 | 
|  }
 | 
| @@ -362,7 +362,7 @@ std::vector<webrtc::VideoStream>
 | 
|  WebRtcVideoChannel2::WebRtcVideoSendStream::CreateSimulcastVideoStreams(
 | 
|      const VideoCodec& codec,
 | 
|      const VideoOptions& options,
 | 
| -    int max_bitrate_bps,
 | 
| +    rtc::Optional<int> max_bitrate_bps,
 | 
|      size_t num_streams) {
 | 
|    int max_qp = kDefaultQpMax;
 | 
|    codec.GetParam(kCodecParamMaxQuantization, &max_qp);
 | 
| @@ -376,11 +376,11 @@ std::vector<webrtc::VideoStream>
 | 
|  WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoStreams(
 | 
|      const VideoCodec& codec,
 | 
|      const VideoOptions& options,
 | 
| -    int max_bitrate_bps,
 | 
| +    rtc::Optional<int> max_bitrate_bps,
 | 
|      size_t num_streams) {
 | 
|    int codec_max_bitrate_kbps;
 | 
|    if (codec.GetParam(kCodecParamMaxBitrate, &codec_max_bitrate_kbps)) {
 | 
| -    max_bitrate_bps = codec_max_bitrate_kbps * 1000;
 | 
| +    max_bitrate_bps = rtc::Optional<int>(codec_max_bitrate_kbps * 1000);
 | 
|    }
 | 
|    if (num_streams != 1) {
 | 
|      return CreateSimulcastVideoStreams(codec, options, max_bitrate_bps,
 | 
| @@ -388,9 +388,9 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoStreams(
 | 
|    }
 | 
|  
 | 
|    // For unset max bitrates set default bitrate for non-simulcast.
 | 
| -  if (max_bitrate_bps <= 0) {
 | 
| -    max_bitrate_bps =
 | 
| -        GetMaxDefaultVideoBitrateKbps(codec.width, codec.height) * 1000;
 | 
| +  if (!max_bitrate_bps) {
 | 
| +    max_bitrate_bps = rtc::Optional<int>(
 | 
| +        GetMaxDefaultVideoBitrateKbps(codec.width, codec.height) * 1000);
 | 
|    }
 | 
|  
 | 
|    webrtc::VideoStream stream;
 | 
| @@ -400,7 +400,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoStreams(
 | 
|        codec.framerate != 0 ? codec.framerate : kDefaultVideoMaxFramerate;
 | 
|  
 | 
|    stream.min_bitrate_bps = kMinVideoBitrate * 1000;
 | 
| -  stream.target_bitrate_bps = stream.max_bitrate_bps = max_bitrate_bps;
 | 
| +  stream.target_bitrate_bps = stream.max_bitrate_bps = *max_bitrate_bps;
 | 
|  
 | 
|    int max_qp = kDefaultQpMax;
 | 
|    codec.GetParam(kCodecParamMaxQuantization, &max_qp);
 | 
| @@ -726,11 +726,9 @@ bool WebRtcVideoChannel2::GetChangedSendParameters(
 | 
|    }
 | 
|  
 | 
|    // Handle max bitrate.
 | 
| -  if (params.max_bandwidth_bps != bitrate_config_.max_bitrate_bps &&
 | 
| -      params.max_bandwidth_bps >= 0) {
 | 
| -    // 0 uncaps max bitrate (-1).
 | 
| -    changed_params->max_bandwidth_bps = rtc::Optional<int>(
 | 
| -        params.max_bandwidth_bps == 0 ? -1 : params.max_bandwidth_bps);
 | 
| +  if (params.max_bitrate_bps != bitrate_config_.max_bitrate_bps) {
 | 
| +    changed_params->max_bandwidth_bps =
 | 
| +        rtc::Optional<rtc::Optional<int>>(params.max_bitrate_bps);
 | 
|    }
 | 
|  
 | 
|    // Handle conference mode.
 | 
| @@ -783,12 +781,11 @@ bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) {
 | 
|      // WebRtcVideoChannel2 (in which case we're good), or per sender (SSRC), in
 | 
|      // which case this should not set a Call::BitrateConfig but rather
 | 
|      // reconfigure all senders.
 | 
| -    int max_bitrate_bps = *changed_params.max_bandwidth_bps;
 | 
|      bitrate_config_.start_bitrate_bps = -1;
 | 
| -    bitrate_config_.max_bitrate_bps = max_bitrate_bps;
 | 
| -    if (max_bitrate_bps > 0 &&
 | 
| -        bitrate_config_.min_bitrate_bps > max_bitrate_bps) {
 | 
| -      bitrate_config_.min_bitrate_bps = max_bitrate_bps;
 | 
| +    bitrate_config_.max_bitrate_bps = *changed_params.max_bandwidth_bps;
 | 
| +    if (bitrate_config_.max_bitrate_bps &&
 | 
| +        (bitrate_config_.min_bitrate_bps > *bitrate_config_.max_bitrate_bps)) {
 | 
| +      bitrate_config_.min_bitrate_bps = *bitrate_config_.max_bitrate_bps;
 | 
|      }
 | 
|      bitrate_config_changed = true;
 | 
|    }
 | 
| @@ -1457,7 +1454,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::VideoSendStreamParameters::
 | 
|      VideoSendStreamParameters(
 | 
|          const webrtc::VideoSendStream::Config& config,
 | 
|          const VideoOptions& options,
 | 
| -        int max_bitrate_bps,
 | 
| +        rtc::Optional<int> max_bitrate_bps,
 | 
|          const rtc::Optional<VideoCodecSettings>& codec_settings)
 | 
|      : config(config),
 | 
|        options(options),
 | 
| @@ -1486,7 +1483,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
 | 
|      const VideoOptions& options,
 | 
|      WebRtcVideoEncoderFactory* external_encoder_factory,
 | 
|      bool enable_cpu_overuse_detection,
 | 
| -    int max_bitrate_bps,
 | 
| +    rtc::Optional<int> max_bitrate_bps,
 | 
|      const rtc::Optional<VideoCodecSettings>& codec_settings,
 | 
|      const std::vector<webrtc::RtpExtension>& rtp_extensions,
 | 
|      // TODO(deadbeef): Don't duplicate information between send_params,
 | 
| @@ -1845,6 +1842,11 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::ValidateRtpParameters(
 | 
|          << "Attempted to set RtpParameters without exactly one encoding";
 | 
|      return false;
 | 
|    }
 | 
| +  if (rtp_parameters.encodings[0].max_bitrate_bps &&
 | 
| +      (*rtp_parameters.encodings[0].max_bitrate_bps <= 0)) {
 | 
| +    LOG(LS_ERROR) << "Attempted to set a negative bitrate limit";
 | 
| +    return false;
 | 
| +  }
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| @@ -1887,8 +1889,8 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
 | 
|      stream_count = 1;
 | 
|    }
 | 
|  
 | 
| -  int stream_max_bitrate =
 | 
| -      MinPositive(rtp_parameters_.encodings[0].max_bitrate_bps,
 | 
| +  rtc::Optional<int> stream_max_bitrate =
 | 
| +      OptionalMin(rtp_parameters_.encodings[0].max_bitrate_bps,
 | 
|                    parameters_.max_bitrate_bps);
 | 
|    encoder_config.streams = CreateVideoStreams(
 | 
|        clamped_codec, parameters_.options, stream_max_bitrate, stream_count);
 | 
| 
 |