OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.h" | |
6 | |
7 #include <utility> | |
8 | |
9 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" | |
10 | |
11 namespace content { | |
12 | |
13 namespace { | |
14 | |
15 bool RemoveAndDisposeTrackAdapter( | |
16 std::map<std::string, scoped_refptr<WebRtcMediaStreamTrackAdapter>>* tracks, | |
17 const std::string& id) { | |
18 auto it = tracks->find(id); | |
19 if (it == tracks->end()) | |
20 return false; | |
21 scoped_refptr<WebRtcMediaStreamTrackAdapter>& track = it->second; | |
22 DCHECK(track->HasOneRef()); | |
23 track->Dispose(); | |
24 tracks->erase(it); | |
25 return true; | |
26 } | |
27 | |
28 void DisposeAllTrackAdapters( | |
29 std::map<std::string, scoped_refptr<WebRtcMediaStreamTrackAdapter>>* | |
30 tracks) { | |
31 for (auto& pair : *tracks) { | |
32 scoped_refptr<WebRtcMediaStreamTrackAdapter>& track = pair.second; | |
33 DCHECK(track->HasOneRef()); | |
34 track->Dispose(); | |
35 } | |
36 tracks->clear(); | |
37 } | |
38 | |
39 } // namespace | |
40 | |
41 WebRtcMediaStreamTrackAdapterMap::WebRtcMediaStreamTrackAdapterMap( | |
42 PeerConnectionDependencyFactory* const factory, | |
43 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread) | |
44 : factory_(factory), main_thread_(main_thread) { | |
45 DCHECK(factory_); | |
46 DCHECK(main_thread_); | |
47 } | |
48 | |
49 WebRtcMediaStreamTrackAdapterMap::~WebRtcMediaStreamTrackAdapterMap() { | |
50 DCHECK(main_thread_->BelongsToCurrentThread()); | |
51 DisposeAllTrackAdapters(); | |
52 } | |
53 | |
54 scoped_refptr<WebRtcMediaStreamTrackAdapter> | |
55 WebRtcMediaStreamTrackAdapterMap::GetLocalTrackAdapter( | |
56 const std::string& id) const { | |
57 base::AutoLock cs(lock_); | |
58 auto it = local_tracks_.find(id); | |
59 if (it == local_tracks_.end()) | |
60 return nullptr; | |
61 return it->second; | |
62 } | |
63 | |
64 scoped_refptr<WebRtcMediaStreamTrackAdapter> | |
65 WebRtcMediaStreamTrackAdapterMap::GetOrCreateLocalTrackAdapter( | |
66 const blink::WebMediaStreamTrack& web_track) { | |
67 DCHECK(!web_track.IsNull()); | |
68 DCHECK(main_thread_->BelongsToCurrentThread()); | |
69 std::string id = web_track.Id().Utf8(); | |
70 base::AutoLock cs(lock_); | |
71 auto it = local_tracks_.find(id); | |
72 if (it != local_tracks_.end()) | |
73 return it->second; | |
74 scoped_refptr<WebRtcMediaStreamTrackAdapter> track = | |
75 WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter( | |
76 factory_, main_thread_, web_track); | |
77 local_tracks_.insert(std::make_pair(id, track)); | |
78 return track; | |
79 } | |
80 | |
81 bool WebRtcMediaStreamTrackAdapterMap::DisposeLocalTrackAdapter( | |
82 const std::string& id) { | |
83 DCHECK(main_thread_->BelongsToCurrentThread()); | |
84 base::AutoLock cs(lock_); | |
Guido Urdaneta
2017/05/30 09:02:41
what does cs mean? (no action necessary, unless it
hbos_chromium
2017/06/02 08:52:19
Critical section or scope, inspired by rtc::CritSc
| |
85 return RemoveAndDisposeTrackAdapter(&local_tracks_, id); | |
86 } | |
87 | |
88 size_t WebRtcMediaStreamTrackAdapterMap::GetLocalTrackCount() const { | |
89 base::AutoLock cs(lock_); | |
90 return local_tracks_.size(); | |
91 } | |
92 | |
93 scoped_refptr<WebRtcMediaStreamTrackAdapter> | |
94 WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackAdapter( | |
95 const std::string& id) const { | |
96 base::AutoLock cs(lock_); | |
97 auto it = remote_tracks_.find(id); | |
98 if (it == remote_tracks_.end()) | |
99 return nullptr; | |
100 return it->second; | |
101 } | |
102 | |
103 scoped_refptr<WebRtcMediaStreamTrackAdapter> | |
104 WebRtcMediaStreamTrackAdapterMap::GetOrCreateRemoteTrackAdapter( | |
105 webrtc::MediaStreamTrackInterface* webrtc_track) { | |
106 DCHECK(webrtc_track); | |
107 DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread()); | |
108 std::string id = webrtc_track->id(); | |
109 base::AutoLock cs(lock_); | |
110 auto it = remote_tracks_.find(id); | |
111 if (it != remote_tracks_.end()) | |
112 return it->second; | |
113 scoped_refptr<WebRtcMediaStreamTrackAdapter> track = | |
114 WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter( | |
115 factory_, main_thread_, webrtc_track); | |
116 remote_tracks_.insert(std::make_pair(id, track)); | |
117 return track; | |
118 } | |
119 | |
120 bool WebRtcMediaStreamTrackAdapterMap::DisposeRemoteTrackAdapter( | |
121 const std::string& id) { | |
122 DCHECK(main_thread_->BelongsToCurrentThread()); | |
123 base::AutoLock cs(lock_); | |
124 return RemoveAndDisposeTrackAdapter(&remote_tracks_, id); | |
125 } | |
126 | |
127 size_t WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackCount() const { | |
128 base::AutoLock cs(lock_); | |
129 return remote_tracks_.size(); | |
130 } | |
131 | |
132 void WebRtcMediaStreamTrackAdapterMap::DisposeAllTrackAdapters() { | |
133 DCHECK(main_thread_->BelongsToCurrentThread()); | |
134 base::AutoLock cs(lock_); | |
135 ::content::DisposeAllTrackAdapters(&local_tracks_); | |
136 ::content::DisposeAllTrackAdapters(&remote_tracks_); | |
137 } | |
138 | |
139 } // namespace content | |
OLD | NEW |