| Index: webrtc/api/peerconnection.cc
 | 
| diff --git a/webrtc/api/peerconnection.cc b/webrtc/api/peerconnection.cc
 | 
| index 125300a3b50955624256b407647047eedb579be1..a381b51bec4471c2e8a0971c6f7ddc5173d1d91c 100644
 | 
| --- a/webrtc/api/peerconnection.cc
 | 
| +++ b/webrtc/api/peerconnection.cc
 | 
| @@ -452,6 +452,12 @@ bool ConvertRtcOptionsForOffer(
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| +bool ConvertRtcOptionsForAnswer(
 | 
| +    const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options,
 | 
| +    cricket::MediaSessionOptions* session_options) {
 | 
| +  return ConvertRtcOptionsForOffer(rtc_options, session_options);
 | 
| +}
 | 
| +
 | 
|  bool ParseConstraintsForAnswer(const MediaConstraintsInterface* constraints,
 | 
|                                 cricket::MediaSessionOptions* session_options) {
 | 
|    bool value = false;
 | 
| @@ -565,8 +571,8 @@ PeerConnection::~PeerConnection() {
 | 
|  }
 | 
|  
 | 
|  bool PeerConnection::Initialize(
 | 
| +    const cricket::MediaConfig& media_config,
 | 
|      const PeerConnectionInterface::RTCConfiguration& configuration,
 | 
| -    const MediaConstraintsInterface* constraints,
 | 
|      rtc::scoped_ptr<cricket::PortAllocator> allocator,
 | 
|      rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
 | 
|      PeerConnectionObserver* observer) {
 | 
| @@ -591,13 +597,10 @@ bool PeerConnection::Initialize(
 | 
|    int portallocator_flags = port_allocator_->flags();
 | 
|    portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET |
 | 
|                           cricket::PORTALLOCATOR_ENABLE_IPV6;
 | 
| -  bool value;
 | 
| -  // If IPv6 flag was specified, we'll not override it by experiment.
 | 
| -  if (FindConstraint(constraints, MediaConstraintsInterface::kEnableIPv6,
 | 
| -                     &value, nullptr)) {
 | 
| -    if (!value) {
 | 
| -      portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
 | 
| -    }
 | 
| +  // If the disable-IPv6 flag was specified, we'll not override it
 | 
| +  // by experiment.
 | 
| +  if (configuration.disable_ipv6) {
 | 
| +    portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
 | 
|    } else if (webrtc::field_trial::FindFullName("WebRTC-IPv6Default") ==
 | 
|               "Disabled") {
 | 
|      portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
 | 
| @@ -612,24 +615,6 @@ bool PeerConnection::Initialize(
 | 
|    // No step delay is used while allocating ports.
 | 
|    port_allocator_->set_step_delay(cricket::kMinimumStepDelay);
 | 
|  
 | 
| -  // We rely on default values when constraints aren't found.
 | 
| -  cricket::MediaConfig media_config;
 | 
| -
 | 
| -  media_config.video.disable_prerenderer_smoothing =
 | 
| -      configuration.disable_prerenderer_smoothing;
 | 
| -
 | 
| -  // Find DSCP constraint.
 | 
| -  FindConstraint(constraints, MediaConstraintsInterface::kEnableDscp,
 | 
| -                 &media_config.enable_dscp, NULL);
 | 
| -  // Find constraint for cpu overuse detection.
 | 
| -  FindConstraint(constraints, MediaConstraintsInterface::kCpuOveruseDetection,
 | 
| -                 &media_config.video.enable_cpu_overuse_detection, NULL);
 | 
| -
 | 
| -  // Find Suspend Below Min Bitrate constraint.
 | 
| -  FindConstraint(constraints,
 | 
| -                 MediaConstraintsInterface::kEnableVideoSuspendBelowMinBitrate,
 | 
| -                 &media_config.video.suspend_below_min_bitrate, NULL);
 | 
| -
 | 
|    media_controller_.reset(factory_->CreateMediaController(media_config));
 | 
|  
 | 
|    remote_stream_factory_.reset(new RemoteMediaStreamFactory(
 | 
| @@ -641,8 +626,8 @@ bool PeerConnection::Initialize(
 | 
|    stats_.reset(new StatsCollector(this));
 | 
|  
 | 
|    // Initialize the WebRtcSession. It creates transport channels etc.
 | 
| -  if (!session_->Initialize(factory_->options(), constraints,
 | 
| -                            std::move(dtls_identity_store), configuration)) {
 | 
| +  if (!session_->Initialize(factory_->options(), std::move(dtls_identity_store),
 | 
| +                            configuration)) {
 | 
|      return false;
 | 
|    }
 | 
|  
 | 
| @@ -1006,7 +991,26 @@ void PeerConnection::CreateAnswer(
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| -  session_->CreateAnswer(observer, constraints, session_options);
 | 
| +  session_->CreateAnswer(observer, session_options);
 | 
| +}
 | 
| +
 | 
| +void PeerConnection::CreateAnswer(CreateSessionDescriptionObserver* observer,
 | 
| +                                  const RTCOfferAnswerOptions& options) {
 | 
| +  TRACE_EVENT0("webrtc", "PeerConnection::CreateAnswer");
 | 
| +  if (!VERIFY(observer != nullptr)) {
 | 
| +    LOG(LS_ERROR) << "CreateAnswer - observer is NULL.";
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  cricket::MediaSessionOptions session_options;
 | 
| +  if (!GetOptionsForAnswer(options, &session_options)) {
 | 
| +    std::string error = "CreateAnswer called with invalid options.";
 | 
| +    LOG(LS_ERROR) << error;
 | 
| +    PostCreateSessionDescriptionFailure(observer, error);
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  session_->CreateAnswer(observer, session_options);
 | 
|  }
 | 
|  
 | 
|  void PeerConnection::SetLocalDescription(
 | 
| @@ -1538,11 +1542,8 @@ bool PeerConnection::GetOptionsForOffer(
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| -bool PeerConnection::GetOptionsForAnswer(
 | 
| -    const MediaConstraintsInterface* constraints,
 | 
| +void PeerConnection::FinishOptionsForAnswer(
 | 
|      cricket::MediaSessionOptions* session_options) {
 | 
| -  session_options->recv_audio = false;
 | 
| -  session_options->recv_video = false;
 | 
|    // TODO(deadbeef): Once we have transceivers, enumerate them here instead of
 | 
|    // ContentInfos.
 | 
|    if (session_->remote_description()) {
 | 
| @@ -1553,10 +1554,6 @@ bool PeerConnection::GetOptionsForAnswer(
 | 
|            cricket::TransportOptions();
 | 
|      }
 | 
|    }
 | 
| -  if (!ParseConstraintsForAnswer(constraints, session_options)) {
 | 
| -    return false;
 | 
| -  }
 | 
| -
 | 
|    AddSendStreams(session_options, senders_, rtp_data_channels_);
 | 
|    session_options->bundle_enabled =
 | 
|        session_options->bundle_enabled &&
 | 
| @@ -1569,6 +1566,29 @@ bool PeerConnection::GetOptionsForAnswer(
 | 
|    if (session_->data_channel_type() == cricket::DCT_SCTP) {
 | 
|      session_options->data_channel_type = cricket::DCT_SCTP;
 | 
|    }
 | 
| +}
 | 
| +
 | 
| +bool PeerConnection::GetOptionsForAnswer(
 | 
| +    const MediaConstraintsInterface* constraints,
 | 
| +    cricket::MediaSessionOptions* session_options) {
 | 
| +  session_options->recv_audio = false;
 | 
| +  session_options->recv_video = false;
 | 
| +  if (!ParseConstraintsForAnswer(constraints, session_options)) {
 | 
| +    return false;
 | 
| +  }
 | 
| +  FinishOptionsForAnswer(session_options);
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +bool PeerConnection::GetOptionsForAnswer(
 | 
| +    const RTCOfferAnswerOptions& options,
 | 
| +    cricket::MediaSessionOptions* session_options) {
 | 
| +  session_options->recv_audio = false;
 | 
| +  session_options->recv_video = false;
 | 
| +  if (!ConvertRtcOptionsForAnswer(options, session_options)) {
 | 
| +    return false;
 | 
| +  }
 | 
| +  FinishOptionsForAnswer(session_options);
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| 
 |