1 /*
2 * Copyright 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * 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.
9 */
10
11 #include "pc/media_stream.h"
12
13 #include <stddef.h>
14
15 #include <utility>
16
17 #include "rtc_base/checks.h"
18
19 namespace webrtc {
20
21 template <class V>
FindTrack(V * vector,const std::string & track_id)22 static typename V::iterator FindTrack(V* vector, const std::string& track_id) {
23 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;
30 }
31
Create(const std::string & id)32 rtc::scoped_refptr<MediaStream> MediaStream::Create(const std::string& id) {
33 return rtc::make_ref_counted<MediaStream>(id);
34 }
35
MediaStream(const std::string & id)36 MediaStream::MediaStream(const std::string& id) : id_(id) {}
37
AddTrack(rtc::scoped_refptr<AudioTrackInterface> track)38 bool MediaStream::AddTrack(rtc::scoped_refptr<AudioTrackInterface> track) {
39 return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
40 }
41
AddTrack(rtc::scoped_refptr<VideoTrackInterface> track)42 bool MediaStream::AddTrack(rtc::scoped_refptr<VideoTrackInterface> track) {
43 return AddTrack<VideoTrackVector, VideoTrackInterface>(&video_tracks_, track);
44 }
45
RemoveTrack(rtc::scoped_refptr<AudioTrackInterface> track)46 bool MediaStream::RemoveTrack(rtc::scoped_refptr<AudioTrackInterface> track) {
47 return RemoveTrack<AudioTrackVector>(&audio_tracks_, track);
48 }
49
RemoveTrack(rtc::scoped_refptr<VideoTrackInterface> track)50 bool MediaStream::RemoveTrack(rtc::scoped_refptr<VideoTrackInterface> track) {
51 return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
52 }
53
FindAudioTrack(const std::string & track_id)54 rtc::scoped_refptr<AudioTrackInterface> MediaStream::FindAudioTrack(
55 const std::string& track_id) {
56 AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
57 if (it == audio_tracks_.end())
58 return nullptr;
59 return *it;
60 }
61
FindVideoTrack(const std::string & track_id)62 rtc::scoped_refptr<VideoTrackInterface> MediaStream::FindVideoTrack(
63 const std::string& track_id) {
64 VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
65 if (it == video_tracks_.end())
66 return nullptr;
67 return *it;
68 }
69
70 template <typename TrackVector, typename Track>
AddTrack(TrackVector * tracks,rtc::scoped_refptr<Track> track)71 bool MediaStream::AddTrack(TrackVector* tracks,
72 rtc::scoped_refptr<Track> track) {
73 typename TrackVector::iterator it = FindTrack(tracks, track->id());
74 if (it != tracks->end())
75 return false;
76 tracks->emplace_back(std::move((track)));
77 FireOnChanged();
78 return true;
79 }
80
81 template <typename TrackVector>
RemoveTrack(TrackVector * tracks,rtc::scoped_refptr<MediaStreamTrackInterface> track)82 bool MediaStream::RemoveTrack(
83 TrackVector* tracks,
84 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
85 RTC_DCHECK(tracks != NULL);
86 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
97