blob: df230e461ac7ab58f17b580680a766893a1e13ab [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
Steve Anton10542f22019-01-11 09:11:00 -080011#include "pc/media_stream.h"
Yves Gerey3e707812018-11-28 16:47:49 +010012
13#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020014
Niels Möllere7cc8832022-01-04 15:20:03 +010015#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "rtc_base/ref_counted_object.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000019
20namespace webrtc {
21
22template <class V>
Yves Gerey665174f2018-06-19 15:03:05 +020023static typename V::iterator FindTrack(V* vector, const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000024 typename V::iterator it = vector->begin();
25 for (; it != vector->end(); ++it) {
26 if ((*it)->id() == track_id) {
27 break;
28 }
29 }
30 return it;
Steve Anton36b29d12017-10-30 09:57:42 -070031}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032
Yves Gerey665174f2018-06-19 15:03:05 +020033rtc::scoped_refptr<MediaStream> MediaStream::Create(const std::string& id) {
Tommi87f70902021-04-27 14:43:08 +020034 return rtc::make_ref_counted<MediaStream>(id);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035}
36
Yves Gerey665174f2018-06-19 15:03:05 +020037MediaStream::MediaStream(const std::string& id) : id_(id) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000038
Harald Alvestrand2f7ad282022-04-21 11:35:43 +000039bool MediaStream::AddTrack(rtc::scoped_refptr<AudioTrackInterface> track) {
40 return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000041}
42
Harald Alvestrand2f7ad282022-04-21 11:35:43 +000043bool MediaStream::AddTrack(rtc::scoped_refptr<VideoTrackInterface> track) {
44 return AddTrack<VideoTrackVector, VideoTrackInterface>(&video_tracks_, track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045}
46
Harald Alvestrand2f7ad282022-04-21 11:35:43 +000047bool MediaStream::RemoveTrack(rtc::scoped_refptr<AudioTrackInterface> track) {
Niels Möllera89432f2022-01-05 09:31:48 +010048 return RemoveTrack<AudioTrackVector>(&audio_tracks_, track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049}
50
Harald Alvestrand2f7ad282022-04-21 11:35:43 +000051bool MediaStream::RemoveTrack(rtc::scoped_refptr<VideoTrackInterface> track) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052 return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
53}
54
Yves Gerey665174f2018-06-19 15:03:05 +020055rtc::scoped_refptr<AudioTrackInterface> MediaStream::FindAudioTrack(
56 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057 AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
58 if (it == audio_tracks_.end())
Niels Möllerac0d1832022-01-17 15:26:54 +010059 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 return *it;
61}
62
Yves Gerey665174f2018-06-19 15:03:05 +020063rtc::scoped_refptr<VideoTrackInterface> MediaStream::FindVideoTrack(
64 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065 VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
66 if (it == video_tracks_.end())
Niels Möllerac0d1832022-01-17 15:26:54 +010067 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068 return *it;
69}
70
71template <typename TrackVector, typename Track>
Niels Möllere7cc8832022-01-04 15:20:03 +010072bool MediaStream::AddTrack(TrackVector* tracks,
73 rtc::scoped_refptr<Track> track) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074 typename TrackVector::iterator it = FindTrack(tracks, track->id());
75 if (it != tracks->end())
76 return false;
Niels Möllere7cc8832022-01-04 15:20:03 +010077 tracks->emplace_back(std::move((track)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000078 FireOnChanged();
79 return true;
80}
81
82template <typename TrackVector>
Harald Alvestrand2f7ad282022-04-21 11:35:43 +000083bool MediaStream::RemoveTrack(
84 TrackVector* tracks,
85 rtc::scoped_refptr<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