| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/rtc_peer_connection_handler.h" | 5 #include "content/renderer/media/rtc_peer_connection_handler.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 &blink::WebMediaTrackConstraintSet::ice_restart, | 913 &blink::WebMediaTrackConstraintSet::ice_restart, |
| 914 &output->ice_restart); | 914 &output->ice_restart); |
| 915 } | 915 } |
| 916 | 916 |
| 917 std::set<RTCPeerConnectionHandler*>* GetPeerConnectionHandlers() { | 917 std::set<RTCPeerConnectionHandler*>* GetPeerConnectionHandlers() { |
| 918 static std::set<RTCPeerConnectionHandler*>* handlers = | 918 static std::set<RTCPeerConnectionHandler*>* handlers = |
| 919 new std::set<RTCPeerConnectionHandler*>(); | 919 new std::set<RTCPeerConnectionHandler*>(); |
| 920 return handlers; | 920 return handlers; |
| 921 } | 921 } |
| 922 | 922 |
| 923 blink::WebMediaStreamTrack GetRemoteTrack( | |
| 924 const std::map<webrtc::MediaStreamInterface*, | |
| 925 std::unique_ptr<content::RemoteMediaStreamImpl>>& | |
| 926 remote_streams, | |
| 927 const blink::WebString& id, | |
| 928 blink::WebMediaStreamTrack (blink::WebMediaStream::*get_track_method)( | |
| 929 const blink::WebString& trackId) const) { | |
| 930 // TODO(hbos): Tracks and streams are currently added/removed on a per-stream | |
| 931 // basis, but tracks could be removed from a stream or added to an existing | |
| 932 // stream. We need to listen to events of tracks being added and removed, and | |
| 933 // have a list of tracks that is separate from the list of streams. | |
| 934 // https://crbug.com/705901 | |
| 935 for (const auto& remote_stream_pair : remote_streams) { | |
| 936 blink::WebMediaStreamTrack web_track = | |
| 937 (remote_stream_pair.second->webkit_stream().*get_track_method)(id); | |
| 938 if (!web_track.IsNull()) | |
| 939 return web_track; | |
| 940 } | |
| 941 return blink::WebMediaStreamTrack(); | |
| 942 } | |
| 943 | |
| 944 } // namespace | 923 } // namespace |
| 945 | 924 |
| 946 // Implementation of LocalRTCStatsRequest. | 925 // Implementation of LocalRTCStatsRequest. |
| 947 LocalRTCStatsRequest::LocalRTCStatsRequest(blink::WebRTCStatsRequest impl) | 926 LocalRTCStatsRequest::LocalRTCStatsRequest(blink::WebRTCStatsRequest impl) |
| 948 : impl_(impl) { | 927 : impl_(impl) { |
| 949 } | 928 } |
| 950 | 929 |
| 951 LocalRTCStatsRequest::LocalRTCStatsRequest() {} | 930 LocalRTCStatsRequest::LocalRTCStatsRequest() {} |
| 952 LocalRTCStatsRequest::~LocalRTCStatsRequest() {} | 931 LocalRTCStatsRequest::~LocalRTCStatsRequest() {} |
| 953 | 932 |
| (...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1664 RTCPeerConnectionHandler::GetSenders() { | 1643 RTCPeerConnectionHandler::GetSenders() { |
| 1665 DCHECK(thread_checker_.CalledOnValidThread()); | 1644 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1666 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::getSenders"); | 1645 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::getSenders"); |
| 1667 std::vector<rtc::scoped_refptr<webrtc::RtpSenderInterface>> webrtc_senders = | 1646 std::vector<rtc::scoped_refptr<webrtc::RtpSenderInterface>> webrtc_senders = |
| 1668 native_peer_connection_->GetSenders(); | 1647 native_peer_connection_->GetSenders(); |
| 1669 blink::WebVector<std::unique_ptr<blink::WebRTCRtpSender>> web_senders( | 1648 blink::WebVector<std::unique_ptr<blink::WebRTCRtpSender>> web_senders( |
| 1670 webrtc_senders.size()); | 1649 webrtc_senders.size()); |
| 1671 for (size_t i = 0; i < web_senders.size(); ++i) { | 1650 for (size_t i = 0; i < web_senders.size(); ++i) { |
| 1672 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track = | 1651 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track = |
| 1673 webrtc_senders[i]->track(); | 1652 webrtc_senders[i]->track(); |
| 1674 std::unique_ptr<blink::WebMediaStreamTrack> web_track; | 1653 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> track_adapter; |
| 1675 | |
| 1676 if (webrtc_track) { | 1654 if (webrtc_track) { |
| 1677 std::string track_id = webrtc_track->id(); | 1655 track_adapter = |
| 1678 bool is_audio_track = (webrtc_track->kind() == | 1656 track_adapter_map_->GetLocalTrackAdapter(webrtc_track->id()); |
| 1679 webrtc::MediaStreamTrackInterface::kAudioKind); | 1657 DCHECK(track_adapter); |
| 1680 for (const auto& stream_adapter : local_streams_) { | |
| 1681 blink::WebVector<blink::WebMediaStreamTrack> tracks; | |
| 1682 if (is_audio_track) | |
| 1683 stream_adapter->web_stream().AudioTracks(tracks); | |
| 1684 else | |
| 1685 stream_adapter->web_stream().VideoTracks(tracks); | |
| 1686 for (const blink::WebMediaStreamTrack& track : tracks) { | |
| 1687 if (track.Id() == track_id.c_str()) { | |
| 1688 web_track.reset(new blink::WebMediaStreamTrack(track)); | |
| 1689 break; | |
| 1690 } | |
| 1691 } | |
| 1692 if (web_track) | |
| 1693 break; | |
| 1694 } | |
| 1695 DCHECK(web_track); | |
| 1696 } | 1658 } |
| 1697 | 1659 // Create a reference to the sender. Multiple |RTCRtpSender|s can reference |
| 1660 // the same webrtc track, see |id|. |
| 1698 web_senders[i] = base::MakeUnique<RTCRtpSender>(webrtc_senders[i].get(), | 1661 web_senders[i] = base::MakeUnique<RTCRtpSender>(webrtc_senders[i].get(), |
| 1699 std::move(web_track)); | 1662 std::move(track_adapter)); |
| 1700 } | 1663 } |
| 1701 return web_senders; | 1664 return web_senders; |
| 1702 } | 1665 } |
| 1703 | 1666 |
| 1704 blink::WebVector<std::unique_ptr<blink::WebRTCRtpReceiver>> | 1667 blink::WebVector<std::unique_ptr<blink::WebRTCRtpReceiver>> |
| 1705 RTCPeerConnectionHandler::GetReceivers() { | 1668 RTCPeerConnectionHandler::GetReceivers() { |
| 1706 DCHECK(thread_checker_.CalledOnValidThread()); | 1669 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1707 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::getReceivers"); | 1670 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::getReceivers"); |
| 1708 | 1671 |
| 1709 std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> | 1672 std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> |
| 1710 webrtc_receivers = native_peer_connection_->GetReceivers(); | 1673 webrtc_receivers = native_peer_connection_->GetReceivers(); |
| 1711 std::vector<std::unique_ptr<blink::WebRTCRtpReceiver>> web_receivers; | 1674 std::vector<std::unique_ptr<blink::WebRTCRtpReceiver>> web_receivers; |
| 1712 for (size_t i = 0; i < webrtc_receivers.size(); ++i) { | 1675 for (size_t i = 0; i < webrtc_receivers.size(); ++i) { |
| 1713 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track = | 1676 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track = |
| 1714 webrtc_receivers[i]->track(); | 1677 webrtc_receivers[i]->track(); |
| 1715 DCHECK(webrtc_track); | 1678 DCHECK(webrtc_track); |
| 1679 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> |
| 1680 track_adapter = |
| 1681 track_adapter_map_->GetRemoteTrackAdapter(webrtc_track->id()); |
| 1682 DCHECK(track_adapter); |
| 1716 // Create a reference to the receiver. Multiple |RTCRtpReceiver|s can | 1683 // Create a reference to the receiver. Multiple |RTCRtpReceiver|s can |
| 1717 // reference the same webrtc track, see |id|. | 1684 // reference the same webrtc track, see |id|. |
| 1718 blink::WebMediaStreamTrack web_track; | 1685 web_receivers.push_back(base::MakeUnique<RTCRtpReceiver>( |
| 1719 if (webrtc_track->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) { | 1686 webrtc_receivers[i].get(), std::move(track_adapter))); |
| 1720 web_track = GetRemoteAudioTrack(webrtc_track->id()); | |
| 1721 } else { | |
| 1722 web_track = GetRemoteVideoTrack(webrtc_track->id()); | |
| 1723 } | |
| 1724 // TODO(hbos): Any existing remote track should be known but the case of a | |
| 1725 // track being added or removed separately from streams is not handled | |
| 1726 // properly, see todo in |GetRemoteTrack|. When that is addressed, DCHECK | |
| 1727 // that the track is not null. https://crbug.com/705901 | |
| 1728 if (!web_track.IsNull()) { | |
| 1729 web_receivers.push_back(base::MakeUnique<RTCRtpReceiver>( | |
| 1730 webrtc_receivers[i].get(), web_track)); | |
| 1731 } | |
| 1732 } | 1687 } |
| 1733 | 1688 |
| 1734 // |blink::WebVector|'s size must be known at construction, that is why | 1689 // |blink::WebVector|'s size must be known at construction, that is why |
| 1735 // |web_vectors| uses |std::vector| and needs to be moved before returning. | 1690 // |web_vectors| uses |std::vector| and needs to be moved before returning. |
| 1736 blink::WebVector<std::unique_ptr<blink::WebRTCRtpReceiver>> result( | 1691 blink::WebVector<std::unique_ptr<blink::WebRTCRtpReceiver>> result( |
| 1737 web_receivers.size()); | 1692 web_receivers.size()); |
| 1738 for (size_t i = 0; i < web_receivers.size(); ++i) { | 1693 for (size_t i = 0; i < web_receivers.size(); ++i) { |
| 1739 result[i] = std::move(web_receivers[i]); | 1694 result[i] = std::move(web_receivers[i]); |
| 1740 } | 1695 } |
| 1741 return result; | 1696 return result; |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2095 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC, | 2050 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| 2096 base::WaitableEvent::InitialState::NOT_SIGNALED); | 2051 base::WaitableEvent::InitialState::NOT_SIGNALED); |
| 2097 thread->PostTask(FROM_HERE, | 2052 thread->PostTask(FROM_HERE, |
| 2098 base::Bind(&RunSynchronousClosure, closure, | 2053 base::Bind(&RunSynchronousClosure, closure, |
| 2099 base::Unretained(trace_event_name), | 2054 base::Unretained(trace_event_name), |
| 2100 base::Unretained(&event))); | 2055 base::Unretained(&event))); |
| 2101 event.Wait(); | 2056 event.Wait(); |
| 2102 } | 2057 } |
| 2103 } | 2058 } |
| 2104 | 2059 |
| 2105 blink::WebMediaStreamTrack RTCPeerConnectionHandler::GetRemoteAudioTrack( | |
| 2106 const std::string& track_id) const { | |
| 2107 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 2108 return GetRemoteTrack(remote_streams_, blink::WebString::FromUTF8(track_id), | |
| 2109 &blink::WebMediaStream::GetAudioTrack); | |
| 2110 } | |
| 2111 | |
| 2112 blink::WebMediaStreamTrack RTCPeerConnectionHandler::GetRemoteVideoTrack( | |
| 2113 const std::string& track_id) const { | |
| 2114 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 2115 return GetRemoteTrack(remote_streams_, blink::WebString::FromUTF8(track_id), | |
| 2116 &blink::WebMediaStream::GetVideoTrack); | |
| 2117 } | |
| 2118 | |
| 2119 void RTCPeerConnectionHandler::ReportICEState( | 2060 void RTCPeerConnectionHandler::ReportICEState( |
| 2120 webrtc::PeerConnectionInterface::IceConnectionState new_state) { | 2061 webrtc::PeerConnectionInterface::IceConnectionState new_state) { |
| 2121 DCHECK(thread_checker_.CalledOnValidThread()); | 2062 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2122 if (ice_state_seen_[new_state]) | 2063 if (ice_state_seen_[new_state]) |
| 2123 return; | 2064 return; |
| 2124 ice_state_seen_[new_state] = true; | 2065 ice_state_seen_[new_state] = true; |
| 2125 UMA_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.ConnectionState", new_state, | 2066 UMA_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.ConnectionState", new_state, |
| 2126 webrtc::PeerConnectionInterface::kIceConnectionMax); | 2067 webrtc::PeerConnectionInterface::kIceConnectionMax); |
| 2127 } | 2068 } |
| 2128 | 2069 |
| 2129 void RTCPeerConnectionHandler::ResetUMAStats() { | 2070 void RTCPeerConnectionHandler::ResetUMAStats() { |
| 2130 DCHECK(thread_checker_.CalledOnValidThread()); | 2071 DCHECK(thread_checker_.CalledOnValidThread()); |
| 2131 num_local_candidates_ipv6_ = 0; | 2072 num_local_candidates_ipv6_ = 0; |
| 2132 num_local_candidates_ipv4_ = 0; | 2073 num_local_candidates_ipv4_ = 0; |
| 2133 ice_connection_checking_start_ = base::TimeTicks(); | 2074 ice_connection_checking_start_ = base::TimeTicks(); |
| 2134 memset(ice_state_seen_, 0, sizeof(ice_state_seen_)); | 2075 memset(ice_state_seen_, 0, sizeof(ice_state_seen_)); |
| 2135 } | 2076 } |
| 2136 } // namespace content | 2077 } // namespace content |
| OLD | NEW |