blob: f353af712a9cb4ae387970b72efd3fa9d9c560f4 [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
Steve Anton10542f22019-01-11 17:11:0011#include "pc/media_stream.h"
Yves Gerey3e707812018-11-28 15:47:4912
13#include <stddef.h>
Jonas Olssona4d87372019-07-05 17:08:3314
Niels Möllere7cc8832022-01-04 14:20:0315#include <utility>
Yves Gerey3e707812018-11-28 15:47:4916#include <vector>
17
Mirko Bonadei92ea95e2017-09-15 04:47:3118#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 17:11:0019#include "rtc_base/ref_counted_object.h"
henrike@webrtc.org28e20752013-07-10 00:45:3620
21namespace webrtc {
22
23template <class V>
Yves Gerey665174f2018-06-19 13:03:0524static typename V::iterator FindTrack(V* vector, const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3625 typename V::iterator it = vector->begin();
26 for (; it != vector->end(); ++it) {
27 if ((*it)->id() == track_id) {
28 break;
29 }
30 }
31 return it;
Steve Anton36b29d12017-10-30 16:57:4232}
henrike@webrtc.org28e20752013-07-10 00:45:3633
Yves Gerey665174f2018-06-19 13:03:0534rtc::scoped_refptr<MediaStream> MediaStream::Create(const std::string& id) {
Tommi87f70902021-04-27 12:43:0835 return rtc::make_ref_counted<MediaStream>(id);
henrike@webrtc.org28e20752013-07-10 00:45:3636}
37
Yves Gerey665174f2018-06-19 13:03:0538MediaStream::MediaStream(const std::string& id) : id_(id) {}
henrike@webrtc.org28e20752013-07-10 00:45:3639
40bool MediaStream::AddTrack(AudioTrackInterface* track) {
41 return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
42}
43
44bool MediaStream::AddTrack(VideoTrackInterface* track) {
Niels Möllere7cc8832022-01-04 14:20:0345 return AddTrack<VideoTrackVector, VideoTrackInterface>(
46 &video_tracks_, rtc::scoped_refptr<VideoTrackInterface>(track));
henrike@webrtc.org28e20752013-07-10 00:45:3647}
48
49bool MediaStream::RemoveTrack(AudioTrackInterface* track) {
Niels Möllere7cc8832022-01-04 14:20:0350 return RemoveTrack<AudioTrackVector>(
51 &audio_tracks_, rtc::scoped_refptr<AudioTrackInterface>(track));
henrike@webrtc.org28e20752013-07-10 00:45:3652}
53
54bool MediaStream::RemoveTrack(VideoTrackInterface* track) {
55 return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
56}
57
Yves Gerey665174f2018-06-19 13:03:0558rtc::scoped_refptr<AudioTrackInterface> MediaStream::FindAudioTrack(
59 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3660 AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
61 if (it == audio_tracks_.end())
62 return NULL;
63 return *it;
64}
65
Yves Gerey665174f2018-06-19 13:03:0566rtc::scoped_refptr<VideoTrackInterface> MediaStream::FindVideoTrack(
67 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3668 VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
69 if (it == video_tracks_.end())
70 return NULL;
71 return *it;
72}
73
74template <typename TrackVector, typename Track>
Niels Möllere7cc8832022-01-04 14:20:0375bool MediaStream::AddTrack(TrackVector* tracks,
76 rtc::scoped_refptr<Track> track) {
henrike@webrtc.org28e20752013-07-10 00:45:3677 typename TrackVector::iterator it = FindTrack(tracks, track->id());
78 if (it != tracks->end())
79 return false;
Niels Möllere7cc8832022-01-04 14:20:0380 tracks->emplace_back(std::move((track)));
henrike@webrtc.org28e20752013-07-10 00:45:3681 FireOnChanged();
82 return true;
83}
84
85template <typename TrackVector>
86bool MediaStream::RemoveTrack(TrackVector* tracks,
87 MediaStreamTrackInterface* track) {
nisseede5da42017-01-12 13:15:3688 RTC_DCHECK(tracks != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:3689 if (!track)
90 return false;
91 typename TrackVector::iterator it = FindTrack(tracks, track->id());
92 if (it == tracks->end())
93 return false;
94 tracks->erase(it);
95 FireOnChanged();
96 return true;
97}
98
99} // namespace webrtc