Index: content/renderer/media/rtc_peer_connection_handler.cc |
diff --git a/content/renderer/media/rtc_peer_connection_handler.cc b/content/renderer/media/rtc_peer_connection_handler.cc |
index 1fb95e1bceb7114a4ff9657bf0fa29063e3b206e..45170bdefb8c207d042d0d4a334e29a2908667e2 100644 |
--- a/content/renderer/media/rtc_peer_connection_handler.cc |
+++ b/content/renderer/media/rtc_peer_connection_handler.cc |
@@ -1682,6 +1682,7 @@ RTCPeerConnectionHandler::GetReceivers() { |
track_adapter = |
track_adapter_map_->GetRemoteTrackAdapter(webrtc_track->id()); |
DCHECK(track_adapter); |
+ DCHECK(track_adapter->is_initialized()); |
// Create a reference to the receiver. Multiple |RTCRtpReceiver|s can |
// reference the same webrtc track, see |id|. |
web_receivers.push_back(base::MakeUnique<RTCRtpReceiver>( |
@@ -1951,8 +1952,58 @@ void RTCPeerConnectionHandler::OnAddStream( |
track_metrics_.AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM, |
stream_ptr->webrtc_stream().get()); |
- if (!is_closed_) |
- client_->DidAddRemoteStream(stream_ptr->webkit_stream()); |
+ if (!is_closed_) { |
+ // Get receivers for the tracks in this stream. The result is a subset of |
+ // |RTCPeerConnectionHandler::GetReceivers|. We can't invoke that here |
+ // because creating receivers for remote streams that have not been |
+ // processed on both threads yet might grab track adapters that have not |
+ // been initialized yet. |
+ // TODO(hbos): Helper function instead of duplicate code! |
+ std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> |
+ webrtc_receivers = native_peer_connection_->GetReceivers(); |
+ std::vector<std::unique_ptr<blink::WebRTCRtpReceiver>> stream_web_receivers; |
+ for (auto& webrtc_receiver : webrtc_receivers) { |
+ rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track = |
+ webrtc_receiver->track(); |
+ DCHECK(webrtc_track); |
+ bool is_stream_receiver = false; |
+ if (webrtc_track->kind() == |
+ webrtc::MediaStreamTrackInterface::kAudioKind) { |
+ for (const auto& track : |
+ stream_ptr->webrtc_stream()->GetAudioTracks()) { |
+ if (webrtc_track == track) { |
+ is_stream_receiver = true; |
+ break; |
+ } |
+ } |
+ } else { |
+ for (const auto& track : |
+ stream_ptr->webrtc_stream()->GetVideoTracks()) { |
+ if (webrtc_track == track) { |
+ is_stream_receiver = true; |
+ break; |
+ } |
+ } |
+ } |
+ if (is_stream_receiver) { |
+ std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> |
+ track_adapter = |
+ track_adapter_map_->GetRemoteTrackAdapter(webrtc_track->id()); |
+ DCHECK(track_adapter); |
+ DCHECK(track_adapter->is_initialized()); |
+ // Create a reference to the receiver. Multiple |RTCRtpReceiver|s can |
+ // reference the same webrtc track, see |id|. |
+ stream_web_receivers.push_back(base::MakeUnique<RTCRtpReceiver>( |
+ webrtc_receiver.get(), std::move(track_adapter))); |
+ } |
+ } |
+ blink::WebVector<std::unique_ptr<blink::WebRTCRtpReceiver>> result( |
+ stream_web_receivers.size()); |
+ for (size_t i = 0; i < stream_web_receivers.size(); ++i) { |
+ result[i] = std::move(stream_web_receivers[i]); |
+ } |
+ client_->DidAddRemoteStream(stream_ptr->webkit_stream(), &result); |
+ } |
} |
void RTCPeerConnectionHandler::OnRemoveStream( |