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 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 |
OLD | NEW |