blob: 57be76c6c8c88112fbc43d27f320eef172caed28 [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
Mirko Bonadei92ea95e2017-09-15 04:47:3117#include "rtc_base/checks.h"
henrike@webrtc.org28e20752013-07-10 00:45:3618
19namespace webrtc {
20
21template <class V>
Yves Gerey665174f2018-06-19 13:03:0522static typename V::iterator FindTrack(V* vector, const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3623 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 16:57:4230}
henrike@webrtc.org28e20752013-07-10 00:45:3631
Yves Gerey665174f2018-06-19 13:03:0532rtc::scoped_refptr<MediaStream> MediaStream::Create(const std::string& id) {
Tommi87f70902021-04-27 12:43:0833 return rtc::make_ref_counted<MediaStream>(id);
henrike@webrtc.org28e20752013-07-10 00:45:3634}
35
Yves Gerey665174f2018-06-19 13:03:0536MediaStream::MediaStream(const std::string& id) : id_(id) {}
henrike@webrtc.org28e20752013-07-10 00:45:3637
Harald Alvestrand2f7ad282022-04-21 11:35:4338bool MediaStream::AddTrack(rtc::scoped_refptr<AudioTrackInterface> track) {
39 return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
henrike@webrtc.org28e20752013-07-10 00:45:3640}
41
Harald Alvestrand2f7ad282022-04-21 11:35:4342bool MediaStream::AddTrack(rtc::scoped_refptr<VideoTrackInterface> track) {
43 return AddTrack<VideoTrackVector, VideoTrackInterface>(&video_tracks_, track);
henrike@webrtc.org28e20752013-07-10 00:45:3644}
45
Harald Alvestrand2f7ad282022-04-21 11:35:4346bool MediaStream::RemoveTrack(rtc::scoped_refptr<AudioTrackInterface> track) {
Niels Möllera89432f2022-01-05 08:31:4847 return RemoveTrack<AudioTrackVector>(&audio_tracks_, track);
henrike@webrtc.org28e20752013-07-10 00:45:3648}
49
Harald Alvestrand2f7ad282022-04-21 11:35:4350bool MediaStream::RemoveTrack(rtc::scoped_refptr<VideoTrackInterface> track) {
henrike@webrtc.org28e20752013-07-10 00:45:3651 return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
52}
53
Yves Gerey665174f2018-06-19 13:03:0554rtc::scoped_refptr<AudioTrackInterface> MediaStream::FindAudioTrack(
55 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3656 AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
57 if (it == audio_tracks_.end())
Niels Möllerac0d1832022-01-17 14:26:5458 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:3659 return *it;
60}
61
Yves Gerey665174f2018-06-19 13:03:0562rtc::scoped_refptr<VideoTrackInterface> MediaStream::FindVideoTrack(
63 const std::string& track_id) {
henrike@webrtc.org28e20752013-07-10 00:45:3664 VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
65 if (it == video_tracks_.end())
Niels Möllerac0d1832022-01-17 14:26:5466 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:3667 return *it;
68}
69
70template <typename TrackVector, typename Track>
Niels Möllere7cc8832022-01-04 14:20:0371bool MediaStream::AddTrack(TrackVector* tracks,
72 rtc::scoped_refptr<Track> track) {
henrike@webrtc.org28e20752013-07-10 00:45:3673 typename TrackVector::iterator it = FindTrack(tracks, track->id());
74 if (it != tracks->end())
75 return false;
Niels Möllere7cc8832022-01-04 14:20:0376 tracks->emplace_back(std::move((track)));
henrike@webrtc.org28e20752013-07-10 00:45:3677 FireOnChanged();
78 return true;
79}
80
81template <typename TrackVector>
Harald Alvestrand2f7ad282022-04-21 11:35:4382bool MediaStream::RemoveTrack(
83 TrackVector* tracks,
84 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
nisseede5da42017-01-12 13:15:3685 RTC_DCHECK(tracks != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:3686 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