blob: d43c6d5a1d81ef8f6f5fb35ccbcd8a7e15b96749 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
2 * libjingle
3 * Copyright 2012, Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "talk/app/webrtc/mediastreamhandler.h"
29
30#include "talk/app/webrtc/localaudiosource.h"
31#include "talk/app/webrtc/localvideosource.h"
32#include "talk/app/webrtc/videosourceinterface.h"
33
34namespace webrtc {
35
36TrackHandler::TrackHandler(MediaStreamTrackInterface* track, uint32 ssrc)
37 : track_(track),
38 ssrc_(ssrc),
39 state_(track->state()),
40 enabled_(track->enabled()) {
41 track_->RegisterObserver(this);
42}
43
44TrackHandler::~TrackHandler() {
45 track_->UnregisterObserver(this);
46}
47
48void TrackHandler::OnChanged() {
49 if (state_ != track_->state()) {
50 state_ = track_->state();
51 OnStateChanged();
52 }
53 if (enabled_ != track_->enabled()) {
54 enabled_ = track_->enabled();
55 OnEnabledChanged();
56 }
57}
58
59LocalAudioTrackHandler::LocalAudioTrackHandler(
60 AudioTrackInterface* track,
61 uint32 ssrc,
62 AudioProviderInterface* provider)
63 : TrackHandler(track, ssrc),
64 audio_track_(track),
65 provider_(provider) {
66 OnEnabledChanged();
67}
68
69LocalAudioTrackHandler::~LocalAudioTrackHandler() {
70}
71
72void LocalAudioTrackHandler::OnStateChanged() {
73 // TODO(perkj): What should happen when the state change?
74}
75
76void LocalAudioTrackHandler::Stop() {
77 cricket::AudioOptions options;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +000078 provider_->SetAudioSend(ssrc(), false, options, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079}
80
81void LocalAudioTrackHandler::OnEnabledChanged() {
82 cricket::AudioOptions options;
83 if (audio_track_->enabled() && audio_track_->GetSource()) {
84 options = static_cast<LocalAudioSource*>(
85 audio_track_->GetSource())->options();
86 }
henrike@webrtc.org1e09a712013-07-26 19:17:59 +000087 provider_->SetAudioSend(ssrc(), audio_track_->enabled(), options,
88 audio_track_->GetRenderer());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089}
90
91RemoteAudioTrackHandler::RemoteAudioTrackHandler(
92 AudioTrackInterface* track,
93 uint32 ssrc,
94 AudioProviderInterface* provider)
95 : TrackHandler(track, ssrc),
96 audio_track_(track),
97 provider_(provider) {
98 OnEnabledChanged();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099}
100
101RemoteAudioTrackHandler::~RemoteAudioTrackHandler() {
102}
103
104void RemoteAudioTrackHandler::Stop() {
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000105 provider_->SetAudioPlayout(ssrc(), false, NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106}
107
108void RemoteAudioTrackHandler::OnStateChanged() {
109}
110
111void RemoteAudioTrackHandler::OnEnabledChanged() {
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000112 provider_->SetAudioPlayout(ssrc(), audio_track_->enabled(),
113 audio_track_->GetRenderer());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114}
115
116LocalVideoTrackHandler::LocalVideoTrackHandler(
117 VideoTrackInterface* track,
118 uint32 ssrc,
119 VideoProviderInterface* provider)
120 : TrackHandler(track, ssrc),
121 local_video_track_(track),
122 provider_(provider) {
123 VideoSourceInterface* source = local_video_track_->GetSource();
124 if (source)
125 provider_->SetCaptureDevice(ssrc, source->GetVideoCapturer());
126 OnEnabledChanged();
127}
128
129LocalVideoTrackHandler::~LocalVideoTrackHandler() {
130}
131
132void LocalVideoTrackHandler::OnStateChanged() {
133}
134
135void LocalVideoTrackHandler::Stop() {
136 provider_->SetCaptureDevice(ssrc(), NULL);
137 provider_->SetVideoSend(ssrc(), false, NULL);
138}
139
140void LocalVideoTrackHandler::OnEnabledChanged() {
141 const cricket::VideoOptions* options = NULL;
142 VideoSourceInterface* source = local_video_track_->GetSource();
143 if (local_video_track_->enabled() && source) {
144 options = source->options();
145 }
146 provider_->SetVideoSend(ssrc(), local_video_track_->enabled(), options);
147}
148
149RemoteVideoTrackHandler::RemoteVideoTrackHandler(
150 VideoTrackInterface* track,
151 uint32 ssrc,
152 VideoProviderInterface* provider)
153 : TrackHandler(track, ssrc),
154 remote_video_track_(track),
155 provider_(provider) {
156 OnEnabledChanged();
157}
158
159RemoteVideoTrackHandler::~RemoteVideoTrackHandler() {
160}
161
162void RemoteVideoTrackHandler::Stop() {
163 // Since cricket::VideoRenderer is not reference counted
164 // we need to remove the renderer before we are deleted.
165 provider_->SetVideoPlayout(ssrc(), false, NULL);
166}
167
168void RemoteVideoTrackHandler::OnStateChanged() {
169}
170
171void RemoteVideoTrackHandler::OnEnabledChanged() {
172 provider_->SetVideoPlayout(ssrc(),
173 remote_video_track_->enabled(),
174 remote_video_track_->FrameInput());
175}
176
177MediaStreamHandler::MediaStreamHandler(MediaStreamInterface* stream,
178 AudioProviderInterface* audio_provider,
179 VideoProviderInterface* video_provider)
180 : stream_(stream),
181 audio_provider_(audio_provider),
182 video_provider_(video_provider) {
183}
184
185MediaStreamHandler::~MediaStreamHandler() {
186 for (TrackHandlers::iterator it = track_handlers_.begin();
187 it != track_handlers_.end(); ++it) {
188 delete *it;
189 }
190}
191
192void MediaStreamHandler::RemoveTrack(MediaStreamTrackInterface* track) {
193 for (TrackHandlers::iterator it = track_handlers_.begin();
194 it != track_handlers_.end(); ++it) {
195 if ((*it)->track() == track) {
196 TrackHandler* track = *it;
197 track->Stop();
198 delete track;
199 track_handlers_.erase(it);
200 break;
201 }
202 }
203}
204
205TrackHandler* MediaStreamHandler::FindTrackHandler(
206 MediaStreamTrackInterface* track) {
207 TrackHandlers::iterator it = track_handlers_.begin();
208 for (; it != track_handlers_.end(); ++it) {
209 if ((*it)->track() == track) {
210 return *it;
211 break;
212 }
213 }
214 return NULL;
215}
216
217MediaStreamInterface* MediaStreamHandler::stream() {
218 return stream_.get();
219}
220
221void MediaStreamHandler::OnChanged() {
222}
223
224void MediaStreamHandler::Stop() {
225 for (TrackHandlers::const_iterator it = track_handlers_.begin();
226 it != track_handlers_.end(); ++it) {
227 (*it)->Stop();
228 }
229}
230
231LocalMediaStreamHandler::LocalMediaStreamHandler(
232 MediaStreamInterface* stream,
233 AudioProviderInterface* audio_provider,
234 VideoProviderInterface* video_provider)
235 : MediaStreamHandler(stream, audio_provider, video_provider) {
236}
237
238LocalMediaStreamHandler::~LocalMediaStreamHandler() {
239}
240
241void LocalMediaStreamHandler::AddAudioTrack(AudioTrackInterface* audio_track,
242 uint32 ssrc) {
243 ASSERT(!FindTrackHandler(audio_track));
244
245 TrackHandler* handler(new LocalAudioTrackHandler(audio_track, ssrc,
246 audio_provider_));
247 track_handlers_.push_back(handler);
248}
249
250void LocalMediaStreamHandler::AddVideoTrack(VideoTrackInterface* video_track,
251 uint32 ssrc) {
252 ASSERT(!FindTrackHandler(video_track));
253
254 TrackHandler* handler(new LocalVideoTrackHandler(video_track, ssrc,
255 video_provider_));
256 track_handlers_.push_back(handler);
257}
258
259RemoteMediaStreamHandler::RemoteMediaStreamHandler(
260 MediaStreamInterface* stream,
261 AudioProviderInterface* audio_provider,
262 VideoProviderInterface* video_provider)
263 : MediaStreamHandler(stream, audio_provider, video_provider) {
264}
265
266RemoteMediaStreamHandler::~RemoteMediaStreamHandler() {
267}
268
269void RemoteMediaStreamHandler::AddAudioTrack(AudioTrackInterface* audio_track,
270 uint32 ssrc) {
271 ASSERT(!FindTrackHandler(audio_track));
272 TrackHandler* handler(
273 new RemoteAudioTrackHandler(audio_track, ssrc, audio_provider_));
274 track_handlers_.push_back(handler);
275}
276
277void RemoteMediaStreamHandler::AddVideoTrack(VideoTrackInterface* video_track,
278 uint32 ssrc) {
279 ASSERT(!FindTrackHandler(video_track));
280 TrackHandler* handler(
281 new RemoteVideoTrackHandler(video_track, ssrc, video_provider_));
282 track_handlers_.push_back(handler);
283}
284
285MediaStreamHandlerContainer::MediaStreamHandlerContainer(
286 AudioProviderInterface* audio_provider,
287 VideoProviderInterface* video_provider)
288 : audio_provider_(audio_provider),
289 video_provider_(video_provider) {
290}
291
292MediaStreamHandlerContainer::~MediaStreamHandlerContainer() {
293 ASSERT(remote_streams_handlers_.empty());
294 ASSERT(local_streams_handlers_.empty());
295}
296
297void MediaStreamHandlerContainer::TearDown() {
298 for (StreamHandlerList::iterator it = remote_streams_handlers_.begin();
299 it != remote_streams_handlers_.end(); ++it) {
300 (*it)->Stop();
301 delete *it;
302 }
303 remote_streams_handlers_.clear();
304 for (StreamHandlerList::iterator it = local_streams_handlers_.begin();
305 it != local_streams_handlers_.end(); ++it) {
306 (*it)->Stop();
307 delete *it;
308 }
309 local_streams_handlers_.clear();
310}
311
312void MediaStreamHandlerContainer::RemoveRemoteStream(
313 MediaStreamInterface* stream) {
314 DeleteStreamHandler(&remote_streams_handlers_, stream);
315}
316
317void MediaStreamHandlerContainer::AddRemoteAudioTrack(
318 MediaStreamInterface* stream,
319 AudioTrackInterface* audio_track,
320 uint32 ssrc) {
321 MediaStreamHandler* handler = FindStreamHandler(remote_streams_handlers_,
322 stream);
323 if (handler == NULL) {
324 handler = CreateRemoteStreamHandler(stream);
325 }
326 handler->AddAudioTrack(audio_track, ssrc);
327}
328
329void MediaStreamHandlerContainer::AddRemoteVideoTrack(
330 MediaStreamInterface* stream,
331 VideoTrackInterface* video_track,
332 uint32 ssrc) {
333 MediaStreamHandler* handler = FindStreamHandler(remote_streams_handlers_,
334 stream);
335 if (handler == NULL) {
336 handler = CreateRemoteStreamHandler(stream);
337 }
338 handler->AddVideoTrack(video_track, ssrc);
339}
340
341void MediaStreamHandlerContainer::RemoveRemoteTrack(
342 MediaStreamInterface* stream,
343 MediaStreamTrackInterface* track) {
344 MediaStreamHandler* handler = FindStreamHandler(remote_streams_handlers_,
345 stream);
346 if (!VERIFY(handler != NULL)) {
347 LOG(LS_WARNING) << "Local MediaStreamHandler for stream with id "
348 << stream->label() << "doesnt't exist.";
349 return;
350 }
351 handler->RemoveTrack(track);
352}
353
354void MediaStreamHandlerContainer::RemoveLocalStream(
355 MediaStreamInterface* stream) {
356 DeleteStreamHandler(&local_streams_handlers_, stream);
357}
358
359void MediaStreamHandlerContainer::AddLocalAudioTrack(
360 MediaStreamInterface* stream,
361 AudioTrackInterface* audio_track,
362 uint32 ssrc) {
363 MediaStreamHandler* handler = FindStreamHandler(local_streams_handlers_,
364 stream);
365 if (handler == NULL) {
366 handler = CreateLocalStreamHandler(stream);
367 }
368 handler->AddAudioTrack(audio_track, ssrc);
369}
370
371void MediaStreamHandlerContainer::AddLocalVideoTrack(
372 MediaStreamInterface* stream,
373 VideoTrackInterface* video_track,
374 uint32 ssrc) {
375 MediaStreamHandler* handler = FindStreamHandler(local_streams_handlers_,
376 stream);
377 if (handler == NULL) {
378 handler = CreateLocalStreamHandler(stream);
379 }
380 handler->AddVideoTrack(video_track, ssrc);
381}
382
383void MediaStreamHandlerContainer::RemoveLocalTrack(
384 MediaStreamInterface* stream,
385 MediaStreamTrackInterface* track) {
386 MediaStreamHandler* handler = FindStreamHandler(local_streams_handlers_,
387 stream);
388 if (!VERIFY(handler != NULL)) {
389 LOG(LS_WARNING) << "Remote MediaStreamHandler for stream with id "
390 << stream->label() << "doesnt't exist.";
391 return;
392 }
393 handler->RemoveTrack(track);
394}
395
396MediaStreamHandler* MediaStreamHandlerContainer::CreateRemoteStreamHandler(
397 MediaStreamInterface* stream) {
398 ASSERT(!FindStreamHandler(remote_streams_handlers_, stream));
399
400 RemoteMediaStreamHandler* handler =
401 new RemoteMediaStreamHandler(stream, audio_provider_, video_provider_);
402 remote_streams_handlers_.push_back(handler);
403 return handler;
404}
405
406MediaStreamHandler* MediaStreamHandlerContainer::CreateLocalStreamHandler(
407 MediaStreamInterface* stream) {
408 ASSERT(!FindStreamHandler(local_streams_handlers_, stream));
409
410 LocalMediaStreamHandler* handler =
411 new LocalMediaStreamHandler(stream, audio_provider_, video_provider_);
412 local_streams_handlers_.push_back(handler);
413 return handler;
414}
415
416MediaStreamHandler* MediaStreamHandlerContainer::FindStreamHandler(
417 const StreamHandlerList& handlers,
418 MediaStreamInterface* stream) {
419 StreamHandlerList::const_iterator it = handlers.begin();
420 for (; it != handlers.end(); ++it) {
421 if ((*it)->stream() == stream) {
422 return *it;
423 }
424 }
425 return NULL;
426}
427
428void MediaStreamHandlerContainer::DeleteStreamHandler(
429 StreamHandlerList* streamhandlers, MediaStreamInterface* stream) {
430 StreamHandlerList::iterator it = streamhandlers->begin();
431 for (; it != streamhandlers->end(); ++it) {
432 if ((*it)->stream() == stream) {
433 (*it)->Stop();
434 delete *it;
435 streamhandlers->erase(it);
436 break;
437 }
438 }
439}
440
441} // namespace webrtc