blob: d5924095cdbfaf8d1795a54fe6e9f172cf9ae294 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:361/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2011 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:363 *
kjellanderb24317b2016-02-10 15:54:434 * 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:369 */
10
Mirko Bonadei92ea95e2017-09-15 04:47:3111#include "pc/mediastream.h"
12#include "rtc_base/checks.h"
13#include "rtc_base/logging.h"
Niels Möller84255bb2017-10-06 11:43:2314#include "rtc_base/refcountedobject.h"
henrike@webrtc.org28e20752013-07-10 00:45:3615
16namespace webrtc {
17
18template <class V>
Yves Gerey665174f2018-06-19 13:03:0519static typename V::iterator FindTrack(V* vector, const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3620 typename V::iterator it = vector->begin();
21 for (; it != vector->end(); ++it) {
22 if ((*it)->id() == track_id) {
23 break;
24 }
25 }
26 return it;
Steve Anton36b29d12017-10-30 16:57:4227}
henrike@webrtc.org28e20752013-07-10 00:45:3628
Yves Gerey665174f2018-06-19 13:03:0529rtc::scoped_refptr<MediaStream> MediaStream::Create(const std::string& id) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:5230 rtc::RefCountedObject<MediaStream>* stream =
Seth Hampson845e8782018-03-02 19:34:1031 new rtc::RefCountedObject<MediaStream>(id);
henrike@webrtc.org28e20752013-07-10 00:45:3632 return stream;
33}
34
Yves Gerey665174f2018-06-19 13:03:0535MediaStream::MediaStream(const std::string& id) : id_(id) {}
henrike@webrtc.org28e20752013-07-10 00:45:3636
37bool MediaStream::AddTrack(AudioTrackInterface* track) {
38 return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
39}
40
41bool MediaStream::AddTrack(VideoTrackInterface* track) {
42 return AddTrack<VideoTrackVector, VideoTrackInterface>(&video_tracks_, track);
43}
44
45bool MediaStream::RemoveTrack(AudioTrackInterface* track) {
46 return RemoveTrack<AudioTrackVector>(&audio_tracks_, track);
47}
48
49bool MediaStream::RemoveTrack(VideoTrackInterface* track) {
50 return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
51}
52
Yves Gerey665174f2018-06-19 13:03:0553rtc::scoped_refptr<AudioTrackInterface> MediaStream::FindAudioTrack(
54 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3655 AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
56 if (it == audio_tracks_.end())
57 return NULL;
58 return *it;
59}
60
Yves Gerey665174f2018-06-19 13:03:0561rtc::scoped_refptr<VideoTrackInterface> MediaStream::FindVideoTrack(
62 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3663 VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
64 if (it == video_tracks_.end())
65 return NULL;
66 return *it;
67}
68
69template <typename TrackVector, typename Track>
70bool MediaStream::AddTrack(TrackVector* tracks, Track* track) {
71 typename TrackVector::iterator it = FindTrack(tracks, track->id());
72 if (it != tracks->end())
73 return false;
74 tracks->push_back(track);
75 FireOnChanged();
76 return true;
77}
78
79template <typename TrackVector>
80bool MediaStream::RemoveTrack(TrackVector* tracks,
81 MediaStreamTrackInterface* track) {
nisseede5da42017-01-12 13:15:3682 RTC_DCHECK(tracks != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:3683 if (!track)
84 return false;
85 typename TrackVector::iterator it = FindTrack(tracks, track->id());
86 if (it == tracks->end())
87 return false;
88 tracks->erase(it);
89 FireOnChanged();
90 return true;
91}
92
93} // namespace webrtc