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

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

Issue 2887403003: WebRtcMediaStreamTrackMap added (Closed)
Patch Set: Removed death tests due to warning about death tests being unsafe with multiple threads Created 3 years, 7 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_collection.h"
6
7 #include <utility>
8
9 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
10
11 namespace content {
12
13 namespace {
14
15 bool RemoveAndUninitializeTrack(
16 std::map<std::string, scoped_refptr<WebRtcMediaStreamTrackAdapter>>* tracks,
17 const std::string& id) {
18 auto it = tracks->find(id);
19 if (it == tracks->end())
20 return false;
21 scoped_refptr<WebRtcMediaStreamTrackAdapter>& track = it->second;
22 DCHECK(track->HasOneRef());
23 track->Uninitialize();
24 tracks->erase(it);
25 return true;
26 }
27
28 void ClearAndUninitializeTracks(
29 std::map<std::string, scoped_refptr<WebRtcMediaStreamTrackAdapter>>*
30 tracks) {
31 for (auto& pair : *tracks) {
32 scoped_refptr<WebRtcMediaStreamTrackAdapter>& track = pair.second;
33 DCHECK(track->HasOneRef());
34 track->Uninitialize();
35 }
36 tracks->clear();
37 }
38
39 } // namespace
40
41 WebRtcMediaStreamTrackCollection::WebRtcMediaStreamTrackCollection(
42 PeerConnectionDependencyFactory* const factory,
43 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread)
44 : factory_(factory), main_thread_(main_thread) {
45 DCHECK(factory_);
46 DCHECK(main_thread_);
47 }
48
49 WebRtcMediaStreamTrackCollection::~WebRtcMediaStreamTrackCollection() {
50 DCHECK(main_thread_->BelongsToCurrentThread());
51 ClearAndUninitializeTracks();
52 }
53
54 scoped_refptr<WebRtcMediaStreamTrackAdapter>
55 WebRtcMediaStreamTrackCollection::GetLocalTrack(const std::string& id) const {
56 base::AutoLock cs(lock_);
57 auto it = local_tracks_.find(id);
58 if (it == local_tracks_.end())
59 return nullptr;
60 return it->second;
61 }
62
63 scoped_refptr<WebRtcMediaStreamTrackAdapter>
64 WebRtcMediaStreamTrackCollection::GetOrCreateLocalTrack(
65 const blink::WebMediaStreamTrack& web_track) {
66 DCHECK(!web_track.IsNull());
67 DCHECK(main_thread_->BelongsToCurrentThread());
68 std::string id = web_track.Id().Utf8();
69 base::AutoLock cs(lock_);
70 auto it = local_tracks_.find(id);
71 if (it != local_tracks_.end())
72 return it->second;
73 scoped_refptr<WebRtcMediaStreamTrackAdapter> track =
74 WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
75 factory_, main_thread_, web_track);
76 local_tracks_.insert(std::make_pair(id, track));
77 return track;
78 }
79
80 bool WebRtcMediaStreamTrackCollection::RemoveAndUninitializeLocalTrack(
81 const std::string& id) {
82 DCHECK(main_thread_->BelongsToCurrentThread());
83 base::AutoLock cs(lock_);
84 return RemoveAndUninitializeTrack(&local_tracks_, id);
85 }
86
87 size_t WebRtcMediaStreamTrackCollection::GetLocalTrackCount() const {
88 base::AutoLock cs(lock_);
89 return local_tracks_.size();
90 }
91
92 scoped_refptr<WebRtcMediaStreamTrackAdapter>
93 WebRtcMediaStreamTrackCollection::GetRemoteTrack(const std::string& id) const {
94 base::AutoLock cs(lock_);
95 auto it = remote_tracks_.find(id);
96 if (it == remote_tracks_.end())
97 return nullptr;
98 return it->second;
99 }
100
101 scoped_refptr<WebRtcMediaStreamTrackAdapter>
102 WebRtcMediaStreamTrackCollection::GetOrCreateRemoteTrack(
103 webrtc::MediaStreamTrackInterface* webrtc_track) {
104 DCHECK(webrtc_track);
105 DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread());
106 std::string id = webrtc_track->id();
107 base::AutoLock cs(lock_);
108 auto it = remote_tracks_.find(id);
109 if (it != remote_tracks_.end())
110 return it->second;
111 scoped_refptr<WebRtcMediaStreamTrackAdapter> track =
112 WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter(
113 factory_, main_thread_, webrtc_track);
114 remote_tracks_.insert(std::make_pair(id, track));
115 return track;
116 }
117
118 bool WebRtcMediaStreamTrackCollection::RemoveAndUninitializeRemoteTrack(
119 const std::string& id) {
120 DCHECK(main_thread_->BelongsToCurrentThread());
121 base::AutoLock cs(lock_);
122 return RemoveAndUninitializeTrack(&remote_tracks_, id);
123 }
124
125 size_t WebRtcMediaStreamTrackCollection::GetRemoteTrackCount() const {
126 base::AutoLock cs(lock_);
127 return remote_tracks_.size();
128 }
129
130 void WebRtcMediaStreamTrackCollection::ClearAndUninitializeTracks() {
131 DCHECK(main_thread_->BelongsToCurrentThread());
Guido Urdaneta 2017/05/22 16:14:44 Does this need to acquire the lock?
hbos_chromium 2017/05/29 13:28:50 Nice catch, done.
132 ::content::ClearAndUninitializeTracks(&local_tracks_);
133 ::content::ClearAndUninitializeTracks(&remote_tracks_);
134 }
135
136 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698