blob: eb78a8bf85376c7c12cfbc0ac9dc91305a28c4f8 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2011 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "pc/mediastream.h"
12#include "rtc_base/checks.h"
13#include "rtc_base/logging.h"
Niels Möller84255bb2017-10-06 13:43:23 +020014#include "rtc_base/refcountedobject.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015
16namespace webrtc {
17
18template <class V>
19static typename V::iterator FindTrack(V* vector,
20 const std::string& track_id) {
21 typename V::iterator it = vector->begin();
22 for (; it != vector->end(); ++it) {
23 if ((*it)->id() == track_id) {
24 break;
25 }
26 }
27 return it;
Steve Anton36b29d12017-10-30 09:57:42 -070028}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000030rtc::scoped_refptr<MediaStream> MediaStream::Create(
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031 const std::string& label) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000032 rtc::RefCountedObject<MediaStream>* stream =
33 new rtc::RefCountedObject<MediaStream>(label);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034 return stream;
35}
36
37MediaStream::MediaStream(const std::string& label)
38 : label_(label) {
39}
40
41bool MediaStream::AddTrack(AudioTrackInterface* track) {
42 return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
43}
44
45bool MediaStream::AddTrack(VideoTrackInterface* track) {
46 return AddTrack<VideoTrackVector, VideoTrackInterface>(&video_tracks_, track);
47}
48
49bool MediaStream::RemoveTrack(AudioTrackInterface* track) {
50 return RemoveTrack<AudioTrackVector>(&audio_tracks_, track);
51}
52
53bool MediaStream::RemoveTrack(VideoTrackInterface* track) {
54 return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
55}
56
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000057rtc::scoped_refptr<AudioTrackInterface>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058MediaStream::FindAudioTrack(const std::string& track_id) {
59 AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
60 if (it == audio_tracks_.end())
61 return NULL;
62 return *it;
63}
64
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000065rtc::scoped_refptr<VideoTrackInterface>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066MediaStream::FindVideoTrack(const std::string& track_id) {
67 VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
68 if (it == video_tracks_.end())
69 return NULL;
70 return *it;
71}
72
73template <typename TrackVector, typename Track>
74bool MediaStream::AddTrack(TrackVector* tracks, Track* track) {
75 typename TrackVector::iterator it = FindTrack(tracks, track->id());
76 if (it != tracks->end())
77 return false;
78 tracks->push_back(track);
79 FireOnChanged();
80 return true;
81}
82
83template <typename TrackVector>
84bool MediaStream::RemoveTrack(TrackVector* tracks,
85 MediaStreamTrackInterface* track) {
nisseede5da42017-01-12 05:15:36 -080086 RTC_DCHECK(tracks != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087 if (!track)
88 return false;
89 typename TrackVector::iterator it = FindTrack(tracks, track->id());
90 if (it == tracks->end())
91 return false;
92 tracks->erase(it);
93 FireOnChanged();
94 return true;
95}
96
97} // namespace webrtc