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_collection.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 RemoveAndUninitializeTrack( | |
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->Uninitialize(); | |
24 tracks->erase(it); | |
25 return true; | |
26 } | |
27 | |
28 void ClearAndUninitializeTracks( | |
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->Uninitialize(); | |
35 } | |
36 tracks->clear(); | |
37 } | |
38 | |
39 } // namespace | |
40 | |
41 WebRtcMediaStreamTrackCollection::WebRtcMediaStreamTrackCollection( | |
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 WebRtcMediaStreamTrackCollection::~WebRtcMediaStreamTrackCollection() { | |
50 DCHECK(main_thread_->BelongsToCurrentThread()); | |
51 ClearAndUninitializeTracks(); | |
52 } | |
53 | |
54 scoped_refptr<WebRtcMediaStreamTrackAdapter> | |
55 WebRtcMediaStreamTrackCollection::GetLocalTrack(const std::string& id) const { | |
56 base::AutoLock cs(lock_); | |
57 auto it = local_tracks_.find(id); | |
58 if (it == local_tracks_.end()) | |
59 return nullptr; | |
60 return it->second; | |
61 } | |
62 | |
63 scoped_refptr<WebRtcMediaStreamTrackAdapter> | |
64 WebRtcMediaStreamTrackCollection::GetOrCreateLocalTrack( | |
65 const blink::WebMediaStreamTrack& web_track) { | |
66 DCHECK(!web_track.IsNull()); | |
67 DCHECK(main_thread_->BelongsToCurrentThread()); | |
68 std::string id = web_track.Id().Utf8(); | |
69 base::AutoLock cs(lock_); | |
70 auto it = local_tracks_.find(id); | |
71 if (it != local_tracks_.end()) | |
72 return it->second; | |
73 scoped_refptr<WebRtcMediaStreamTrackAdapter> track = | |
74 WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter( | |
75 factory_, main_thread_, web_track); | |
76 local_tracks_.insert(std::make_pair(id, track)); | |
77 return track; | |
78 } | |
79 | |
80 bool WebRtcMediaStreamTrackCollection::RemoveAndUninitializeLocalTrack( | |
81 const std::string& id) { | |
82 DCHECK(main_thread_->BelongsToCurrentThread()); | |
83 base::AutoLock cs(lock_); | |
84 return RemoveAndUninitializeTrack(&local_tracks_, id); | |
85 } | |
86 | |
87 size_t WebRtcMediaStreamTrackCollection::GetLocalTrackCount() const { | |
88 base::AutoLock cs(lock_); | |
89 return local_tracks_.size(); | |
90 } | |
91 | |
92 scoped_refptr<WebRtcMediaStreamTrackAdapter> | |
93 WebRtcMediaStreamTrackCollection::GetRemoteTrack(const std::string& id) const { | |
94 base::AutoLock cs(lock_); | |
95 auto it = remote_tracks_.find(id); | |
96 if (it == remote_tracks_.end()) | |
97 return nullptr; | |
98 return it->second; | |
99 } | |
100 | |
101 scoped_refptr<WebRtcMediaStreamTrackAdapter> | |
102 WebRtcMediaStreamTrackCollection::GetOrCreateRemoteTrack( | |
103 webrtc::MediaStreamTrackInterface* webrtc_track) { | |
104 DCHECK(webrtc_track); | |
105 DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread()); | |
106 std::string id = webrtc_track->id(); | |
107 base::AutoLock cs(lock_); | |
108 auto it = remote_tracks_.find(id); | |
109 if (it != remote_tracks_.end()) | |
110 return it->second; | |
111 scoped_refptr<WebRtcMediaStreamTrackAdapter> track = | |
112 WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter( | |
113 factory_, main_thread_, webrtc_track); | |
114 remote_tracks_.insert(std::make_pair(id, track)); | |
115 return track; | |
116 } | |
117 | |
118 bool WebRtcMediaStreamTrackCollection::RemoveAndUninitializeRemoteTrack( | |
119 const std::string& id) { | |
120 DCHECK(main_thread_->BelongsToCurrentThread()); | |
121 base::AutoLock cs(lock_); | |
122 return RemoveAndUninitializeTrack(&remote_tracks_, id); | |
123 } | |
124 | |
125 size_t WebRtcMediaStreamTrackCollection::GetRemoteTrackCount() const { | |
126 base::AutoLock cs(lock_); | |
127 return remote_tracks_.size(); | |
128 } | |
129 | |
130 void WebRtcMediaStreamTrackCollection::ClearAndUninitializeTracks() { | |
131 DCHECK(main_thread_->BelongsToCurrentThread()); | |
Guido Urdaneta
2017/05/22 16:14:44
Does this need to acquire the lock?
hbos_chromium
2017/05/29 13:28:50
Nice catch, done.
| |
132 ::content::ClearAndUninitializeTracks(&local_tracks_); | |
133 ::content::ClearAndUninitializeTracks(&remote_tracks_); | |
134 } | |
135 | |
136 } // namespace content | |
OLD | NEW |