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 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry( | |
14 const scoped_refptr<WebRtcMediaStreamTrackAdapter>& adapter) | |
15 : adapter(adapter) {} | |
16 | |
17 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry( | |
18 AdapterEntry&& other) | |
19 : adapter(other.adapter) { | |
20 other.adapter = nullptr; | |
21 } | |
22 | |
23 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::~AdapterEntry() { | |
24 DCHECK(!adapter || !adapter->is_initialized()); | |
25 } | |
26 | |
27 WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef( | |
28 const scoped_refptr<WebRtcMediaStreamTrackAdapterMap>& map, | |
29 Type type, | |
30 const MapEntryIterator& it) | |
31 : map_(map), type_(type), it_(it), adapter_(entry()->adapter) { | |
32 DCHECK(map_); | |
33 DCHECK(adapter_); | |
34 } | |
35 | |
36 WebRtcMediaStreamTrackAdapterMap::AdapterRef::~AdapterRef() { | |
37 DCHECK(map_->main_thread_->BelongsToCurrentThread()); | |
38 base::AutoLock scoped_lock(map_->lock_); | |
39 adapter_ = nullptr; | |
40 if (entry()->adapter->HasOneRef()) { | |
41 entry()->adapter->Dispose(); | |
42 if (type_ == Type::kLocal) | |
43 map_->local_track_adapters_.erase(it_); | |
44 else | |
45 map_->remote_track_adapters_.erase(it_); | |
46 } | |
47 } | |
48 | |
49 WebRtcMediaStreamTrackAdapterMap::WebRtcMediaStreamTrackAdapterMap( | |
50 PeerConnectionDependencyFactory* const factory, | |
51 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread) | |
52 : factory_(factory), main_thread_(main_thread) { | |
53 DCHECK(factory_); | |
54 DCHECK(main_thread_); | |
55 } | |
56 | |
57 WebRtcMediaStreamTrackAdapterMap::~WebRtcMediaStreamTrackAdapterMap() { | |
58 DCHECK(local_track_adapters_.empty()); | |
59 DCHECK(remote_track_adapters_.empty()); | |
60 } | |
61 | |
62 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
63 WebRtcMediaStreamTrackAdapterMap::GetLocalTrackAdapter(const std::string& id) { | |
64 return GetTrackAdapter(AdapterRef::Type::kLocal, id); | |
65 } | |
66 | |
67 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
68 WebRtcMediaStreamTrackAdapterMap::GetOrCreateLocalTrackAdapter( | |
69 const blink::WebMediaStreamTrack& web_track) { | |
70 DCHECK(!web_track.IsNull()); | |
71 DCHECK(main_thread_->BelongsToCurrentThread()); | |
72 return GetOrCreateTrackAdapter( | |
73 AdapterRef::Type::kLocal, | |
74 base::Bind(&WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter, | |
75 factory_, main_thread_, web_track), | |
76 web_track.Id().Utf8()); | |
77 } | |
78 | |
79 size_t WebRtcMediaStreamTrackAdapterMap::GetLocalTrackCount() const { | |
80 base::AutoLock scoped_lock(lock_); | |
81 return local_track_adapters_.size(); | |
82 } | |
83 | |
84 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
85 WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackAdapter(const std::string& id) { | |
86 return GetTrackAdapter(AdapterRef::Type::kRemote, id); | |
87 } | |
88 | |
89 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
90 WebRtcMediaStreamTrackAdapterMap::GetOrCreateRemoteTrackAdapter( | |
91 webrtc::MediaStreamTrackInterface* webrtc_track) { | |
92 DCHECK(webrtc_track); | |
93 DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread()); | |
94 return GetOrCreateTrackAdapter( | |
95 AdapterRef::Type::kRemote, | |
96 base::Bind(&WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter, | |
97 factory_, main_thread_, webrtc_track), | |
98 webrtc_track->id()); | |
99 } | |
100 | |
101 size_t WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackCount() const { | |
102 base::AutoLock scoped_lock(lock_); | |
103 return remote_track_adapters_.size(); | |
104 } | |
105 | |
106 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
107 WebRtcMediaStreamTrackAdapterMap::GetTrackAdapter( | |
108 WebRtcMediaStreamTrackAdapterMap::AdapterRef::Type type, | |
109 const std::string& id) { | |
110 std::map<std::string, AdapterEntry>* track_adapters = | |
111 type == AdapterRef::Type::kLocal ? &local_track_adapters_ | |
112 : &remote_track_adapters_; | |
113 base::AutoLock scoped_lock(lock_); | |
114 auto it = track_adapters->find(id); | |
115 if (it == track_adapters->end()) | |
116 return nullptr; | |
117 return std::unique_ptr<AdapterRef>(new AdapterRef(this, type, it)); | |
Guido Urdaneta
2017/06/09 11:28:12
nit: Consider using base::WrapUnique here to avoid
hbos_chromium
2017/06/12 08:12:34
Done.
| |
118 } | |
119 | |
120 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
121 WebRtcMediaStreamTrackAdapterMap::GetOrCreateTrackAdapter( | |
122 AdapterRef::Type type, | |
123 base::Callback<scoped_refptr<WebRtcMediaStreamTrackAdapter>()> | |
124 create_adapter_callback, | |
125 const std::string& id) { | |
126 std::map<std::string, AdapterEntry>* track_adapters = | |
127 type == AdapterRef::Type::kLocal ? &local_track_adapters_ | |
128 : &remote_track_adapters_; | |
129 base::AutoLock scoped_lock(lock_); | |
130 auto it = track_adapters->find(id); | |
131 if (it == track_adapters->end()) { | |
132 scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter = | |
133 create_adapter_callback.Run(); | |
134 it = | |
135 track_adapters->insert(std::make_pair(id, AdapterEntry(adapter))).first; | |
136 } | |
137 return std::unique_ptr<AdapterRef>(new AdapterRef(this, type, it)); | |
Guido Urdaneta
2017/06/09 11:28:12
Ditto.
hbos_chromium
2017/06/12 08:12:34
Done.
| |
138 } | |
139 | |
140 } // namespace content | |
OLD | NEW |