Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: content/renderer/media/rtc_peer_connection_handler.cc

Issue 2946663003: content::RTCRtpSenders/Receivers using track adapter references. (Closed)
Patch Set: scoped_refptr and std::move Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698