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), ref_count(0) {} | |
16 | |
17 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry( | |
18 AdapterEntry&& other) | |
19 : adapter(other.adapter), ref_count(other.ref_count) { | |
20 other.adapter = nullptr; | |
21 } | |
22 | |
23 WebRtcMediaStreamTrackAdapterMap::AdapterEntry::~AdapterEntry() { | |
24 DCHECK(!ref_count); | |
25 DCHECK(!adapter || !adapter->is_initialized()); | |
26 } | |
27 | |
28 WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef( | |
29 const scoped_refptr<WebRtcMediaStreamTrackAdapterMap>& map, | |
30 Type type, | |
31 const std::map<std::string, AdapterEntry>::iterator& it) | |
32 : map_(map), type_(type), it_(it) { | |
33 DCHECK(map_); | |
34 ++entry()->ref_count; | |
35 } | |
36 | |
37 WebRtcMediaStreamTrackAdapterMap::AdapterRef::~AdapterRef() { | |
38 DCHECK(map_->main_thread_->BelongsToCurrentThread()); | |
39 base::AutoLock scoped_lock(map_->lock_); | |
40 if (--entry()->ref_count == 0) { | |
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 base::AutoLock scoped_lock(lock_); | |
65 auto it = local_track_adapters_.find(id); | |
66 if (it == local_track_adapters_.end()) | |
67 return nullptr; | |
68 return std::unique_ptr<AdapterRef>( | |
Guido Urdaneta
2017/06/02 13:19:01
use base::MakeUnique
hbos_chromium
2017/06/05 11:55:40
base::MakeUnique actually does not work in this ca
Guido Urdaneta
2017/06/05 13:05:56
Acknowledged.
| |
69 new AdapterRef(this, AdapterRef::Type::kLocal, it)); | |
70 } | |
71 | |
72 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
73 WebRtcMediaStreamTrackAdapterMap::GetOrCreateLocalTrackAdapter( | |
74 const blink::WebMediaStreamTrack& web_track) { | |
75 DCHECK(!web_track.IsNull()); | |
76 DCHECK(main_thread_->BelongsToCurrentThread()); | |
77 std::string id = web_track.Id().Utf8(); | |
78 base::AutoLock scoped_lock(lock_); | |
79 auto it = local_track_adapters_.find(id); | |
80 if (it == local_track_adapters_.end()) { | |
81 scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter = | |
82 WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter( | |
83 factory_, main_thread_, web_track); | |
84 it = local_track_adapters_.insert(std::make_pair(id, AdapterEntry(adapter))) | |
85 .first; | |
86 } | |
87 return std::unique_ptr<AdapterRef>( | |
Guido Urdaneta
2017/06/02 13:19:01
use base::MakeUnique
hbos_chromium
2017/06/05 11:55:40
Ditto.
Guido Urdaneta
2017/06/05 13:05:56
Acko.
| |
88 new AdapterRef(this, AdapterRef::Type::kLocal, it)); | |
89 } | |
90 | |
91 size_t WebRtcMediaStreamTrackAdapterMap::GetLocalTrackCount() const { | |
92 base::AutoLock scoped_lock(lock_); | |
93 return local_track_adapters_.size(); | |
94 } | |
95 | |
96 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
97 WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackAdapter(const std::string& id) { | |
98 base::AutoLock scoped_lock(lock_); | |
99 auto it = remote_track_adapters_.find(id); | |
Guido Urdaneta
2017/06/02 13:19:01
Since the logic is the same as for GetLocalTrackAd
hbos_chromium
2017/06/05 11:55:40
Done.
| |
100 if (it == remote_track_adapters_.end()) | |
101 return nullptr; | |
102 return std::unique_ptr<AdapterRef>( | |
Guido Urdaneta
2017/06/02 13:19:01
use base::MakeUnique
hbos_chromium
2017/06/05 11:55:40
Ditto.
| |
103 new AdapterRef(this, AdapterRef::Type::kRemote, it)); | |
104 } | |
105 | |
106 std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef> | |
107 WebRtcMediaStreamTrackAdapterMap::GetOrCreateRemoteTrackAdapter( | |
108 webrtc::MediaStreamTrackInterface* webrtc_track) { | |
109 DCHECK(webrtc_track); | |
Guido Urdaneta
2017/06/02 13:19:01
Same genericness argument as with simple Get metho
hbos_chromium
2017/06/05 11:55:39
Done.
| |
110 DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread()); | |
111 std::string id = webrtc_track->id(); | |
112 base::AutoLock scoped_lock(lock_); | |
113 auto it = remote_track_adapters_.find(id); | |
114 if (it == remote_track_adapters_.end()) { | |
115 scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter = | |
116 WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter( | |
117 factory_, main_thread_, webrtc_track); | |
118 it = | |
119 remote_track_adapters_.insert(std::make_pair(id, AdapterEntry(adapter))) | |
120 .first; | |
121 } | |
122 return std::unique_ptr<AdapterRef>( | |
Guido Urdaneta
2017/06/02 13:19:01
use base::MakeUnique
hbos_chromium
2017/06/05 11:55:40
Ditto.
| |
123 new AdapterRef(this, AdapterRef::Type::kRemote, it)); | |
124 } | |
125 | |
126 size_t WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackCount() const { | |
127 base::AutoLock scoped_lock(lock_); | |
128 return remote_track_adapters_.size(); | |
129 } | |
130 | |
131 } // namespace content | |
OLD | NEW |