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

Side by Side Diff: content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc

Issue 2887403003: WebRtcMediaStreamTrackMap added (Closed)
Patch Set: WrapUnique 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
(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 base::WrapUnique(new AdapterRef(this, type, it));
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 base::WrapUnique(new AdapterRef(this, type, it));
138 }
139
140 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698