Index: talk/app/webrtc/peerconnection.cc |
diff --git a/talk/app/webrtc/peerconnection.cc b/talk/app/webrtc/peerconnection.cc |
index 3c0dc83aa387c21994fb0962308e39c86c9599a5..b1e146c9a4cd0ed73dfbc9fc4e6e6f7d8bf528c4 100644 |
--- a/talk/app/webrtc/peerconnection.cc |
+++ b/talk/app/webrtc/peerconnection.cc |
@@ -453,27 +453,16 @@ bool ConvertRtcOptionsForOffer( |
return false; |
} |
- // According to the spec, offer to receive audio/video if the constraint is |
- // not set and there are send streams. |
- if (rtc_options.offer_to_receive_audio == RTCOfferAnswerOptions::kUndefined) { |
- session_options->recv_audio = |
- session_options->HasSendMediaStream(cricket::MEDIA_TYPE_AUDIO); |
- } else { |
+ if (rtc_options.offer_to_receive_audio != RTCOfferAnswerOptions::kUndefined) { |
session_options->recv_audio = (rtc_options.offer_to_receive_audio > 0); |
} |
- if (rtc_options.offer_to_receive_video == RTCOfferAnswerOptions::kUndefined) { |
- session_options->recv_video = |
- session_options->HasSendMediaStream(cricket::MEDIA_TYPE_VIDEO); |
- } else { |
+ if (rtc_options.offer_to_receive_video != RTCOfferAnswerOptions::kUndefined) { |
session_options->recv_video = (rtc_options.offer_to_receive_video > 0); |
} |
session_options->vad_enabled = rtc_options.voice_activity_detection; |
session_options->transport_options.ice_restart = rtc_options.ice_restart; |
- session_options->bundle_enabled = |
- rtc_options.use_rtp_mux && |
- (session_options->has_audio() || session_options->has_video() || |
- session_options->has_data()); |
+ session_options->bundle_enabled = rtc_options.use_rtp_mux; |
return true; |
} |
@@ -515,10 +504,6 @@ bool ParseConstraintsForAnswer(const MediaConstraintsInterface* constraints, |
// kUseRtpMux defaults to true according to spec. |
session_options->bundle_enabled = true; |
} |
- session_options->bundle_enabled = |
- session_options->bundle_enabled && |
- (session_options->has_audio() || session_options->has_video() || |
- session_options->has_data()); |
if (FindConstraint(constraints, MediaConstraintsInterface::kIceRestart, |
&value, &mandatory_constraints_satisfied)) { |
@@ -1033,8 +1018,8 @@ void PeerConnection::SetRemoteDescription( |
audio_content->description); |
UpdateRemoteStreamsList(desc->streams(), desc->type(), new_streams); |
remote_info_.default_audio_track_needed = |
- MediaContentDirectionHasSend(desc->direction()) && |
- desc->streams().empty(); |
+ !remote_desc->msid_supported() && desc->streams().empty() && |
+ MediaContentDirectionHasSend(desc->direction()); |
} |
// Find all video rtp streams and create corresponding remote VideoTracks |
@@ -1046,8 +1031,8 @@ void PeerConnection::SetRemoteDescription( |
video_content->description); |
UpdateRemoteStreamsList(desc->streams(), desc->type(), new_streams); |
remote_info_.default_video_track_needed = |
- MediaContentDirectionHasSend(desc->direction()) && |
- desc->streams().empty(); |
+ !remote_desc->msid_supported() && desc->streams().empty() && |
+ MediaContentDirectionHasSend(desc->direction()); |
} |
// Update the DataChannels with the information from the remote peer. |
@@ -1386,12 +1371,28 @@ void PeerConnection::PostCreateSessionDescriptionFailure( |
bool PeerConnection::GetOptionsForOffer( |
const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options, |
cricket::MediaSessionOptions* session_options) { |
- SetStreams(session_options, local_streams_, rtp_data_channels_); |
- |
if (!ConvertRtcOptionsForOffer(rtc_options, session_options)) { |
return false; |
} |
+ SetStreams(session_options, local_streams_, rtp_data_channels_); |
+ // Offer to receive audio/video if the constraint is not set and there are |
+ // send streams, or we're currently receiving. |
+ if (rtc_options.offer_to_receive_audio == RTCOfferAnswerOptions::kUndefined) { |
+ session_options->recv_audio = |
+ session_options->HasSendMediaStream(cricket::MEDIA_TYPE_AUDIO) || |
+ !remote_audio_tracks_.empty(); |
+ } |
+ if (rtc_options.offer_to_receive_video == RTCOfferAnswerOptions::kUndefined) { |
+ session_options->recv_video = |
+ session_options->HasSendMediaStream(cricket::MEDIA_TYPE_VIDEO) || |
+ !remote_video_tracks_.empty(); |
+ } |
+ session_options->bundle_enabled = |
+ session_options->bundle_enabled && |
+ (session_options->has_audio() || session_options->has_video() || |
+ session_options->has_data()); |
+ |
if (session_->data_channel_type() == cricket::DCT_SCTP && HasDataChannels()) { |
session_options->data_channel_type = cricket::DCT_SCTP; |
} |
@@ -1401,14 +1402,18 @@ bool PeerConnection::GetOptionsForOffer( |
bool PeerConnection::GetOptionsForAnswer( |
const MediaConstraintsInterface* constraints, |
cricket::MediaSessionOptions* session_options) { |
- SetStreams(session_options, local_streams_, rtp_data_channels_); |
session_options->recv_audio = false; |
session_options->recv_video = false; |
- |
if (!ParseConstraintsForAnswer(constraints, session_options)) { |
return false; |
} |
+ SetStreams(session_options, local_streams_, rtp_data_channels_); |
+ session_options->bundle_enabled = |
+ session_options->bundle_enabled && |
+ (session_options->has_audio() || session_options->has_video() || |
+ session_options->has_data()); |
+ |
// RTP data channel is handled in MediaSessionOptions::AddStream. SCTP streams |
// are not signaled in the SDP so does not go through that path and must be |
// handled here. |