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 |