2013-07-10 00:45:36 +00:00
|
|
|
/*
|
2016-02-10 07:54:43 -08:00
|
|
|
* Copyright 2011 The WebRTC project authors. All Rights Reserved.
|
2013-07-10 00:45:36 +00:00
|
|
|
*
|
2016-02-10 07:54:43 -08:00
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
2013-07-10 00:45:36 +00:00
|
|
|
*/
|
|
|
|
|
|
2019-01-11 09:11:00 -08:00
|
|
|
#include "pc/media_stream.h"
|
2018-11-28 16:47:49 +01:00
|
|
|
|
|
|
|
|
#include <stddef.h>
|
2019-07-05 19:08:33 +02:00
|
|
|
|
2022-01-04 15:20:03 +01:00
|
|
|
#include <utility>
|
2018-11-28 16:47:49 +01:00
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "rtc_base/checks.h"
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
namespace webrtc {
|
|
|
|
|
|
|
|
|
|
template <class V>
|
|
|
|
|
static typename V::iterator FindTrack(V* vector, const std::string& track_id) {
|
|
|
|
|
typename V::iterator it = vector->begin();
|
|
|
|
|
for (; it != vector->end(); ++it) {
|
|
|
|
|
if ((*it)->id() == track_id) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return it;
|
2017-10-30 09:57:42 -07:00
|
|
|
}
|
2013-07-10 00:45:36 +00:00
|
|
|
|
2014-07-29 17:36:52 +00:00
|
|
|
rtc::scoped_refptr<MediaStream> MediaStream::Create(const std::string& id) {
|
2021-04-27 14:43:08 +02:00
|
|
|
return rtc::make_ref_counted<MediaStream>(id);
|
2013-07-10 00:45:36 +00:00
|
|
|
}
|
|
|
|
|
|
2018-03-02 11:34:10 -08:00
|
|
|
MediaStream::MediaStream(const std::string& id) : id_(id) {}
|
2013-07-10 00:45:36 +00:00
|
|
|
|
2022-04-21 11:35:43 +00:00
|
|
|
bool MediaStream::AddTrack(rtc::scoped_refptr<AudioTrackInterface> track) {
|
|
|
|
|
return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
|
2013-07-10 00:45:36 +00:00
|
|
|
}
|
|
|
|
|
|
2022-04-21 11:35:43 +00:00
|
|
|
bool MediaStream::AddTrack(rtc::scoped_refptr<VideoTrackInterface> track) {
|
|
|
|
|
return AddTrack<VideoTrackVector, VideoTrackInterface>(&video_tracks_, track);
|
2013-07-10 00:45:36 +00:00
|
|
|
}
|
|
|
|
|
|
2022-04-21 11:35:43 +00:00
|
|
|
bool MediaStream::RemoveTrack(rtc::scoped_refptr<AudioTrackInterface> track) {
|
2022-01-05 09:31:48 +01:00
|
|
|
return RemoveTrack<AudioTrackVector>(&audio_tracks_, track);
|
2013-07-10 00:45:36 +00:00
|
|
|
}
|
|
|
|
|
|
2022-04-21 11:35:43 +00:00
|
|
|
bool MediaStream::RemoveTrack(rtc::scoped_refptr<VideoTrackInterface> track) {
|
2013-07-10 00:45:36 +00:00
|
|
|
return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-29 17:36:52 +00:00
|
|
|
rtc::scoped_refptr<AudioTrackInterface> MediaStream::FindAudioTrack(
|
2013-07-10 00:45:36 +00:00
|
|
|
const std::string& track_id) {
|
|
|
|
|
AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
|
|
|
|
|
if (it == audio_tracks_.end())
|
2022-01-17 15:26:54 +01:00
|
|
|
return nullptr;
|
2013-07-10 00:45:36 +00:00
|
|
|
return *it;
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-29 17:36:52 +00:00
|
|
|
rtc::scoped_refptr<VideoTrackInterface> MediaStream::FindVideoTrack(
|
2013-07-10 00:45:36 +00:00
|
|
|
const std::string& track_id) {
|
|
|
|
|
VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
|
|
|
|
|
if (it == video_tracks_.end())
|
2022-01-17 15:26:54 +01:00
|
|
|
return nullptr;
|
2013-07-10 00:45:36 +00:00
|
|
|
return *it;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename TrackVector, typename Track>
|
2022-01-04 15:20:03 +01:00
|
|
|
bool MediaStream::AddTrack(TrackVector* tracks,
|
|
|
|
|
rtc::scoped_refptr<Track> track) {
|
2013-07-10 00:45:36 +00:00
|
|
|
typename TrackVector::iterator it = FindTrack(tracks, track->id());
|
|
|
|
|
if (it != tracks->end())
|
|
|
|
|
return false;
|
2022-01-04 15:20:03 +01:00
|
|
|
tracks->emplace_back(std::move((track)));
|
2013-07-10 00:45:36 +00:00
|
|
|
FireOnChanged();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename TrackVector>
|
2022-04-21 11:35:43 +00:00
|
|
|
bool MediaStream::RemoveTrack(
|
|
|
|
|
TrackVector* tracks,
|
|
|
|
|
rtc::scoped_refptr<MediaStreamTrackInterface> track) {
|
2017-01-12 05:15:36 -08:00
|
|
|
RTC_DCHECK(tracks != NULL);
|
2013-07-10 00:45:36 +00:00
|
|
|
if (!track)
|
|
|
|
|
return false;
|
|
|
|
|
typename TrackVector::iterator it = FindTrack(tracks, track->id());
|
|
|
|
|
if (it == tracks->end())
|
|
|
|
|
return false;
|
|
|
|
|
tracks->erase(it);
|
|
|
|
|
FireOnChanged();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace webrtc
|