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

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

Issue 2883023002: WebRtcMediaStreamTrackAdapter, maps 1 webrtc and 1 blink track (Closed)
Patch Set: Addressed nits Created 3 years, 6 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_adapter.h"
6
7 #include "content/renderer/media/media_stream_audio_track.h"
8 #include "content/renderer/media/webrtc/media_stream_video_webrtc_sink.h"
9 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
10 #include "content/renderer/media/webrtc/processed_local_audio_source.h"
11
12 namespace content {
13
14 // static
15 scoped_refptr<WebRtcMediaStreamTrackAdapter>
16 WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
17 PeerConnectionDependencyFactory* factory,
18 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
19 const blink::WebMediaStreamTrack& web_track) {
20 DCHECK(main_thread->BelongsToCurrentThread());
21 DCHECK(!web_track.Source().Remote());
22 scoped_refptr<WebRtcMediaStreamTrackAdapter> local_track_adapter(
23 new WebRtcMediaStreamTrackAdapter(factory, main_thread));
24 if (web_track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio) {
25 local_track_adapter->InitializeLocalAudioTrack(web_track);
26 } else {
27 DCHECK_EQ(web_track.Source().GetType(),
28 blink::WebMediaStreamSource::kTypeVideo);
29 local_track_adapter->InitializeLocalVideoTrack(web_track);
30 }
31 return local_track_adapter;
32 }
33
34 // static
35 scoped_refptr<WebRtcMediaStreamTrackAdapter>
36 WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter(
37 PeerConnectionDependencyFactory* factory,
38 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
39 webrtc::MediaStreamTrackInterface* webrtc_track) {
40 DCHECK(factory->GetWebRtcSignalingThread()->BelongsToCurrentThread());
41 DCHECK(webrtc_track);
42 scoped_refptr<WebRtcMediaStreamTrackAdapter> remote_track_adapter(
43 new WebRtcMediaStreamTrackAdapter(factory, main_thread));
44 if (webrtc_track->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) {
45 remote_track_adapter->InitializeRemoteAudioTrack(
46 static_cast<webrtc::AudioTrackInterface*>(webrtc_track));
47 } else {
48 DCHECK_EQ(webrtc_track->kind(),
49 webrtc::MediaStreamTrackInterface::kVideoKind);
50 remote_track_adapter->InitializeRemoteVideoTrack(
51 static_cast<webrtc::VideoTrackInterface*>(webrtc_track));
52 }
53 return remote_track_adapter;
54 }
55
56 WebRtcMediaStreamTrackAdapter::WebRtcMediaStreamTrackAdapter(
57 PeerConnectionDependencyFactory* factory,
58 const scoped_refptr<base::SingleThreadTaskRunner>& main_thread)
59 : factory_(factory), main_thread_(main_thread), is_initialized_(false) {
60 DCHECK(factory_);
61 DCHECK(main_thread_);
62 }
63
64 WebRtcMediaStreamTrackAdapter::~WebRtcMediaStreamTrackAdapter() {
65 DCHECK(main_thread_->BelongsToCurrentThread());
66 DCHECK(!is_initialized_);
67 }
68
69 void WebRtcMediaStreamTrackAdapter::Dispose() {
70 DCHECK(main_thread_->BelongsToCurrentThread());
71 if (!is_initialized_)
72 return;
73 is_initialized_ = false;
74 if (!web_track_.Source().Remote()) {
75 if (web_track_.Source().GetType() ==
76 blink::WebMediaStreamSource::kTypeAudio) {
77 DisposeLocalAudioTrack();
78 } else {
79 DCHECK_EQ(web_track_.Source().GetType(),
80 blink::WebMediaStreamSource::kTypeVideo);
81 DisposeLocalVideoTrack();
82 }
83 } else {
84 if (web_track_.Source().GetType() ==
85 blink::WebMediaStreamSource::kTypeAudio) {
86 DisposeRemoteAudioTrack();
87 } else {
88 DCHECK_EQ(web_track_.Source().GetType(),
89 blink::WebMediaStreamSource::kTypeVideo);
90 DisposeRemoteVideoTrack();
91 }
92 }
93 }
94
95 bool WebRtcMediaStreamTrackAdapter::is_initialized() const {
96 return is_initialized_;
97 }
98
99 const blink::WebMediaStreamTrack& WebRtcMediaStreamTrackAdapter::web_track()
100 const {
101 DCHECK(is_initialized_);
102 DCHECK(!web_track_.IsNull());
103 return web_track_;
104 }
105
106 webrtc::MediaStreamTrackInterface* WebRtcMediaStreamTrackAdapter::webrtc_track()
107 const {
108 DCHECK(is_initialized_);
109 DCHECK(webrtc_track_);
110 return webrtc_track_.get();
111 }
112
113 bool WebRtcMediaStreamTrackAdapter::IsEqual(
114 const blink::WebMediaStreamTrack& web_track) const {
115 DCHECK(is_initialized_);
116 return web_track_.GetTrackData() == web_track.GetTrackData();
117 }
118
119 void WebRtcMediaStreamTrackAdapter::InitializeLocalAudioTrack(
120 const blink::WebMediaStreamTrack& web_track) {
121 DCHECK(main_thread_->BelongsToCurrentThread());
122 DCHECK(!is_initialized_);
123 DCHECK(!web_track.IsNull());
124 DCHECK(!web_track.Source().Remote());
125 DCHECK_EQ(web_track.Source().GetType(),
126 blink::WebMediaStreamSource::kTypeAudio);
127 web_track_ = web_track;
128 MediaStreamAudioTrack* native_track = MediaStreamAudioTrack::From(web_track_);
129 DCHECK(native_track);
130
131 // Non-WebRtc remote sources and local sources do not provide an instance of
132 // the webrtc::AudioSourceInterface, and also do not need references to the
133 // audio level calculator or audio processor passed to the sink.
134 webrtc::AudioSourceInterface* source_interface = nullptr;
135 local_track_audio_sink_.reset(
136 new WebRtcAudioSink(web_track_.Id().Utf8(), source_interface,
137 factory_->GetWebRtcSignalingThread()));
138
139 if (auto* media_stream_source = ProcessedLocalAudioSource::From(
140 MediaStreamAudioSource::From(web_track_.Source()))) {
141 local_track_audio_sink_->SetLevel(media_stream_source->audio_level());
142 // The sink only grabs stats from the audio processor. Stats are only
143 // available if audio processing is turned on. Therefore, only provide the
144 // sink a reference to the processor if audio processing is turned on.
145 if (auto processor = media_stream_source->audio_processor()) {
146 if (processor->has_audio_processing())
147 local_track_audio_sink_->SetAudioProcessor(processor);
148 }
149 }
150 native_track->AddSink(local_track_audio_sink_.get());
151 webrtc_track_ = local_track_audio_sink_->webrtc_audio_track();
152 DCHECK(webrtc_track_);
153 is_initialized_ = true;
154 }
155
156 void WebRtcMediaStreamTrackAdapter::InitializeLocalVideoTrack(
157 const blink::WebMediaStreamTrack& web_track) {
158 DCHECK(main_thread_->BelongsToCurrentThread());
159 DCHECK(!is_initialized_);
160 DCHECK(!web_track.IsNull());
161 DCHECK(!web_track.Source().Remote());
162 DCHECK_EQ(web_track.Source().GetType(),
163 blink::WebMediaStreamSource::kTypeVideo);
164 web_track_ = web_track;
165 local_track_video_sink_.reset(
166 new MediaStreamVideoWebRtcSink(web_track_, factory_));
167 webrtc_track_ = local_track_video_sink_->webrtc_video_track();
168 DCHECK(webrtc_track_);
169 is_initialized_ = true;
170 }
171
172 void WebRtcMediaStreamTrackAdapter::InitializeRemoteAudioTrack(
173 webrtc::AudioTrackInterface* webrtc_audio_track) {
174 DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread());
175 DCHECK(!is_initialized_);
176 DCHECK(webrtc_audio_track);
177 DCHECK_EQ(webrtc_audio_track->kind(),
178 webrtc::MediaStreamTrackInterface::kAudioKind);
179 remote_audio_track_adapter_ =
180 new RemoteAudioTrackAdapter(main_thread_, webrtc_audio_track);
181 webrtc_track_ = webrtc_audio_track;
182 main_thread_->PostTask(
183 FROM_HERE, base::Bind(&WebRtcMediaStreamTrackAdapter::
184 FinalizeRemoteTrackInitializationOnMainThread,
185 this));
186 }
187
188 void WebRtcMediaStreamTrackAdapter::InitializeRemoteVideoTrack(
189 webrtc::VideoTrackInterface* webrtc_video_track) {
190 DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread());
191 DCHECK(!is_initialized_);
192 DCHECK(webrtc_video_track);
193 DCHECK_EQ(webrtc_video_track->kind(),
194 webrtc::MediaStreamTrackInterface::kVideoKind);
195 remote_video_track_adapter_ =
196 new RemoteVideoTrackAdapter(main_thread_, webrtc_video_track);
197 webrtc_track_ = webrtc_video_track;
198 main_thread_->PostTask(
199 FROM_HERE, base::Bind(&WebRtcMediaStreamTrackAdapter::
200 FinalizeRemoteTrackInitializationOnMainThread,
201 this));
202 }
203
204 void WebRtcMediaStreamTrackAdapter::
205 FinalizeRemoteTrackInitializationOnMainThread() {
206 DCHECK(main_thread_->BelongsToCurrentThread());
207 DCHECK(remote_audio_track_adapter_ || remote_video_track_adapter_);
208 if (remote_audio_track_adapter_) {
209 remote_audio_track_adapter_->Initialize();
210 web_track_ = *remote_audio_track_adapter_->web_track();
211 } else {
212 remote_video_track_adapter_->Initialize();
213 web_track_ = *remote_video_track_adapter_->web_track();
214 }
215 is_initialized_ = true;
216 }
217
218 void WebRtcMediaStreamTrackAdapter::DisposeLocalAudioTrack() {
219 DCHECK(main_thread_->BelongsToCurrentThread());
220 DCHECK(!is_initialized_);
221 DCHECK(!web_track_.Source().Remote());
222 DCHECK_EQ(web_track_.Source().GetType(),
223 blink::WebMediaStreamSource::kTypeAudio);
224 MediaStreamAudioTrack* audio_track = MediaStreamAudioTrack::From(web_track_);
225 DCHECK(audio_track);
226 DCHECK(local_track_audio_sink_);
227 audio_track->RemoveSink(local_track_audio_sink_.get());
228 local_track_audio_sink_.reset();
229 webrtc_track_ = nullptr;
230 web_track_.Reset();
231 }
232
233 void WebRtcMediaStreamTrackAdapter::DisposeLocalVideoTrack() {
234 DCHECK(main_thread_->BelongsToCurrentThread());
235 DCHECK(!is_initialized_);
236 DCHECK(!web_track_.Source().Remote());
237 DCHECK_EQ(web_track_.Source().GetType(),
238 blink::WebMediaStreamSource::kTypeVideo);
239 local_track_video_sink_.reset();
240 webrtc_track_ = nullptr;
241 web_track_.Reset();
242 }
243
244 void WebRtcMediaStreamTrackAdapter::DisposeRemoteAudioTrack() {
245 DCHECK(main_thread_->BelongsToCurrentThread());
246 DCHECK(!is_initialized_);
247 DCHECK(web_track_.Source().Remote());
248 DCHECK_EQ(web_track_.Source().GetType(),
249 blink::WebMediaStreamSource::kTypeAudio);
250 factory_->GetWebRtcSignalingThread()->PostTask(
251 FROM_HERE,
252 base::Bind(&WebRtcMediaStreamTrackAdapter::
253 UnregisterRemoteAudioTrackAdapterOnSignalingThread,
254 this));
255 }
256
257 void WebRtcMediaStreamTrackAdapter::DisposeRemoteVideoTrack() {
258 DCHECK(main_thread_->BelongsToCurrentThread());
259 DCHECK(!is_initialized_);
260 DCHECK(web_track_.Source().Remote());
261 DCHECK_EQ(web_track_.Source().GetType(),
262 blink::WebMediaStreamSource::kTypeVideo);
263 FinalizeRemoteTrackDisposingOnMainThread();
264 }
265
266 void WebRtcMediaStreamTrackAdapter::
267 UnregisterRemoteAudioTrackAdapterOnSignalingThread() {
268 DCHECK(factory_->GetWebRtcSignalingThread()->BelongsToCurrentThread());
269 DCHECK(!is_initialized_);
270 DCHECK(remote_audio_track_adapter_);
271 remote_audio_track_adapter_->Unregister();
272 main_thread_->PostTask(
273 FROM_HERE, base::Bind(&WebRtcMediaStreamTrackAdapter::
274 FinalizeRemoteTrackDisposingOnMainThread,
275 this));
276 }
277
278 void WebRtcMediaStreamTrackAdapter::FinalizeRemoteTrackDisposingOnMainThread() {
279 DCHECK(main_thread_->BelongsToCurrentThread());
280 DCHECK(!is_initialized_);
281 remote_audio_track_adapter_ = nullptr;
282 remote_video_track_adapter_ = nullptr;
283 webrtc_track_ = nullptr;
284 web_track_.Reset();
285 }
286
287 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698