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), 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(); | |
|
hbos_chromium
2017/06/02 08:57:13
Since references are only decreased on the main th
| |
| 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>( | |
| 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>( | |
| 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); | |
| 100 if (it == remote_track_adapters_.end()) | |
| 101 return nullptr; | |
| 102 return std::unique_ptr<AdapterRef>( | |
| 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); | |
| 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>( | |
| 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 |