Chromium Code Reviews| 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 |