blob: 2e857fa9590de53d58a69766780adc5e65dfaa7d [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"
Yves Gerey3e707812018-11-28 16:47:49 +010012
13#include <stddef.h>
14#include <vector>
15
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "rtc_base/checks.h"
Niels Möller84255bb2017-10-06 13:43:23 +020017#include "rtc_base/refcountedobject.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018
19namespace webrtc {
20
21template <class V>
Yves Gerey665174f2018-06-19 15:03:05 +020022static typename V::iterator FindTrack(V* vector, const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000023 typename V::iterator it = vector->begin();
24 for (; it != vector->end(); ++it) {
25 if ((*it)->id() == track_id) {
26 break;
27 }
28 }
29 return it;
Steve Anton36b29d12017-10-30 09:57:42 -070030}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031
Yves Gerey665174f2018-06-19 15:03:05 +020032rtc::scoped_refptr<MediaStream> MediaStream::Create(const std::string& id) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000033 rtc::RefCountedObject<MediaStream>* stream =
Seth Hampson845e8782018-03-02 11:34:10 -080034 new rtc::RefCountedObject<MediaStream>(id);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035 return stream;
36}
37
Yves Gerey665174f2018-06-19 15:03:05 +020038MediaStream::MediaStream(const std::string& id) : id_(id) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039
40bool MediaStream::AddTrack(AudioTrackInterface* track) {
41 return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
42}
43
44bool MediaStream::AddTrack(VideoTrackInterface* track) {
45 return AddTrack<VideoTrackVector, VideoTrackInterface>(&video_tracks_, track);
46}
47
48bool MediaStream::RemoveTrack(AudioTrackInterface* track) {
49 return RemoveTrack<AudioTrackVector>(&audio_tracks_, track);
50}
51
52bool MediaStream::RemoveTrack(VideoTrackInterface* track) {
53 return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
54}
55
Yves Gerey665174f2018-06-19 15:03:05 +020056rtc::scoped_refptr<AudioTrackInterface> MediaStream::FindAudioTrack(
57 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
59 if (it == audio_tracks_.end())
60 return NULL;
61 return *it;
62}
63
Yves Gerey665174f2018-06-19 15:03:05 +020064rtc::scoped_refptr<VideoTrackInterface> MediaStream::FindVideoTrack(
65 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066 VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
67 if (it == video_tracks_.end())
68 return NULL;
69 return *it;
70}
71
72template <typename TrackVector, typename Track>
73bool MediaStream::AddTrack(TrackVector* tracks, Track* track) {
74 typename TrackVector::iterator it = FindTrack(tracks, track->id());
75 if (it != tracks->end())
76 return false;
77 tracks->push_back(track);
78 FireOnChanged();
79 return true;
80}
81
82template <typename TrackVector>
83bool MediaStream::RemoveTrack(TrackVector* tracks,
84 MediaStreamTrackInterface* track) {
nisseede5da42017-01-12 05:15:36 -080085 RTC_DCHECK(tracks != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086 if (!track)
87 return false;
88 typename TrackVector::iterator it = FindTrack(tracks, track->id());
89 if (it == tracks->end())
90 return false;
91 tracks->erase(it);
92 FireOnChanged();
93 return true;
94}
95
96} // namespace webrtc