| Index: content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc
 | 
| diff --git a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..d21937b76f0a74eb0875298ce20c3a4984940078
 | 
| --- /dev/null
 | 
| +++ b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.cc
 | 
| @@ -0,0 +1,140 @@
 | 
| +// Copyright (c) 2017 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.h"
 | 
| +
 | 
| +#include <utility>
 | 
| +
 | 
| +#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
 | 
| +
 | 
| +namespace content {
 | 
| +
 | 
| +WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry(
 | 
| +    const scoped_refptr<WebRtcMediaStreamTrackAdapter>& adapter)
 | 
| +    : adapter(adapter) {}
 | 
| +
 | 
| +WebRtcMediaStreamTrackAdapterMap::AdapterEntry::AdapterEntry(
 | 
| +    AdapterEntry&& other)
 | 
| +    : adapter(other.adapter) {
 | 
| +  other.adapter = nullptr;
 | 
| +}
 | 
| +
 | 
| +WebRtcMediaStreamTrackAdapterMap::AdapterEntry::~AdapterEntry() {
 | 
| +  DCHECK(!adapter || !adapter->is_initialized());
 | 
| +}
 | 
| +
 | 
| +WebRtcMediaStreamTrackAdapterMap::AdapterRef::AdapterRef(
 | 
| +    const scoped_refptr<WebRtcMediaStreamTrackAdapterMap>& map,
 | 
| +    Type type,
 | 
| +    const MapEntryIterator& it)
 | 
| +    : map_(map), type_(type), it_(it), adapter_(entry()->adapter) {
 | 
| +  DCHECK(map_);
 | 
| +  DCHECK(adapter_);
 | 
| +}
 | 
| +
 | 
| +WebRtcMediaStreamTrackAdapterMap::AdapterRef::~AdapterRef() {
 | 
| +  DCHECK(map_->main_thread_->BelongsToCurrentThread());
 | 
| +  base::AutoLock scoped_lock(map_->lock_);
 | 
| +  adapter_ = nullptr;
 | 
| +  if (entry()->adapter->HasOneRef()) {
 | 
| +    entry()->adapter->Dispose();
 | 
| +    if (type_ == Type::kLocal)
 | 
| +      map_->local_track_adapters_.erase(it_);
 | 
| +    else
 | 
| +      map_->remote_track_adapters_.erase(it_);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +WebRtcMediaStreamTrackAdapterMap::WebRtcMediaStreamTrackAdapterMap(
 | 
| +    PeerConnectionDependencyFactory* const factory,
 | 
| +    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread)
 | 
| +    : factory_(factory), main_thread_(main_thread) {
 | 
| +  DCHECK(factory_);
 | 
| +  DCHECK(main_thread_);
 | 
| +}
 | 
| +
 | 
| +WebRtcMediaStreamTrackAdapterMap::~WebRtcMediaStreamTrackAdapterMap() {
 | 
| +  DCHECK(local_track_adapters_.empty());
 | 
| +  DCHECK(remote_track_adapters_.empty());
 | 
| +}
 | 
| +
 | 
| +std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
 | 
| +WebRtcMediaStreamTrackAdapterMap::GetLocalTrackAdapter(const std::string& id) {
 | 
| +  return GetTrackAdapter(AdapterRef::Type::kLocal, id);
 | 
| +}
 | 
| +
 | 
| +std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
 | 
| +WebRtcMediaStreamTrackAdapterMap::GetOrCreateLocalTrackAdapter(
 | 
| +    const blink::WebMediaStreamTrack& web_track) {
 | 
| +  DCHECK(!web_track.IsNull());
 | 
| +  DCHECK(main_thread_->BelongsToCurrentThread());
 | 
| +  return GetOrCreateTrackAdapter(
 | 
| +      AdapterRef::Type::kLocal,
 | 
| +      base::Bind(&WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter,
 | 
| +                 factory_, main_thread_, web_track),
 | 
| +      web_track.Id().Utf8());
 | 
| +}
 | 
| +
 | 
| +size_t WebRtcMediaStreamTrackAdapterMap::GetLocalTrackCount() const {
 | 
| +  base::AutoLock scoped_lock(lock_);
 | 
| +  return local_track_adapters_.size();
 | 
| +}
 | 
| +
 | 
| +std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
 | 
| +WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackAdapter(const std::string& id) {
 | 
| +  return GetTrackAdapter(AdapterRef::Type::kRemote, id);
 | 
| +}
 | 
| +
 | 
| +std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
 | 
| +WebRtcMediaStreamTrackAdapterMap::GetOrCreateRemoteTrackAdapter(
 | 
| +    webrtc::MediaStreamTrackInterface* webrtc_track) {
 | 
| +  DCHECK(webrtc_track);
 | 
| +  DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread());
 | 
| +  return GetOrCreateTrackAdapter(
 | 
| +      AdapterRef::Type::kRemote,
 | 
| +      base::Bind(&WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter,
 | 
| +                 factory_, main_thread_, webrtc_track),
 | 
| +      webrtc_track->id());
 | 
| +}
 | 
| +
 | 
| +size_t WebRtcMediaStreamTrackAdapterMap::GetRemoteTrackCount() const {
 | 
| +  base::AutoLock scoped_lock(lock_);
 | 
| +  return remote_track_adapters_.size();
 | 
| +}
 | 
| +
 | 
| +std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
 | 
| +WebRtcMediaStreamTrackAdapterMap::GetTrackAdapter(
 | 
| +    WebRtcMediaStreamTrackAdapterMap::AdapterRef::Type type,
 | 
| +    const std::string& id) {
 | 
| +  std::map<std::string, AdapterEntry>* track_adapters =
 | 
| +      type == AdapterRef::Type::kLocal ? &local_track_adapters_
 | 
| +                                       : &remote_track_adapters_;
 | 
| +  base::AutoLock scoped_lock(lock_);
 | 
| +  auto it = track_adapters->find(id);
 | 
| +  if (it == track_adapters->end())
 | 
| +    return nullptr;
 | 
| +  return base::WrapUnique(new AdapterRef(this, type, it));
 | 
| +}
 | 
| +
 | 
| +std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>
 | 
| +WebRtcMediaStreamTrackAdapterMap::GetOrCreateTrackAdapter(
 | 
| +    AdapterRef::Type type,
 | 
| +    base::Callback<scoped_refptr<WebRtcMediaStreamTrackAdapter>()>
 | 
| +        create_adapter_callback,
 | 
| +    const std::string& id) {
 | 
| +  std::map<std::string, AdapterEntry>* track_adapters =
 | 
| +      type == AdapterRef::Type::kLocal ? &local_track_adapters_
 | 
| +                                       : &remote_track_adapters_;
 | 
| +  base::AutoLock scoped_lock(lock_);
 | 
| +  auto it = track_adapters->find(id);
 | 
| +  if (it == track_adapters->end()) {
 | 
| +    scoped_refptr<WebRtcMediaStreamTrackAdapter> adapter =
 | 
| +        create_adapter_callback.Run();
 | 
| +    it =
 | 
| +        track_adapters->insert(std::make_pair(id, AdapterEntry(adapter))).first;
 | 
| +  }
 | 
| +  return base::WrapUnique(new AdapterRef(this, type, it));
 | 
| +}
 | 
| +
 | 
| +}  // namespace content
 | 
| 
 |