MediaStreamPrivate.cpp [plain text]
#include "config.h"
#if ENABLE(MEDIA_STREAM)
#include "MediaStreamPrivate.h"
#include "UUID.h"
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
namespace WebCore {
RefPtr<MediaStreamPrivate> MediaStreamPrivate::create(const Vector<RefPtr<RealtimeMediaSource>>& audioSources, const Vector<RefPtr<RealtimeMediaSource>>& videoSources)
{
Vector<RefPtr<MediaStreamTrackPrivate>> tracks;
tracks.reserveCapacity(audioSources.size() + videoSources.size());
for (auto source : audioSources)
tracks.append(MediaStreamTrackPrivate::create(WTF::move(source)));
for (auto source : videoSources)
tracks.append(MediaStreamTrackPrivate::create(WTF::move(source)));
return MediaStreamPrivate::create(tracks);
}
RefPtr<MediaStreamPrivate> MediaStreamPrivate::create(const Vector<RefPtr<MediaStreamTrackPrivate>>& tracks)
{
return adoptRef(new MediaStreamPrivate(createCanonicalUUIDString(), tracks));
}
RefPtr<MediaStreamPrivate> MediaStreamPrivate::create()
{
return MediaStreamPrivate::create(Vector<RefPtr<MediaStreamTrackPrivate>>());
}
MediaStreamPrivate::MediaStreamPrivate(const String& id, const Vector<RefPtr<MediaStreamTrackPrivate>>& tracks)
: m_client(0)
, m_id(id)
, m_isActive(false)
{
ASSERT(m_id.length());
for (auto& track : tracks)
m_trackSet.add(track->id(), track);
updateActiveState(NotifyClientOption::DontNotify);
}
Vector<RefPtr<MediaStreamTrackPrivate>> MediaStreamPrivate::tracks() const
{
Vector<RefPtr<MediaStreamTrackPrivate>> tracks;
tracks.reserveCapacity(m_trackSet.size());
copyValuesToVector(m_trackSet, tracks);
return tracks;
}
void MediaStreamPrivate::updateActiveState(NotifyClientOption notifyClientOption)
{
bool newActiveState = false;
for (auto& track : m_trackSet.values()) {
if (!track->ended()) {
newActiveState = true;
break;
}
}
if (newActiveState == m_isActive)
return;
m_isActive = newActiveState;
if (m_client && notifyClientOption == NotifyClientOption::Notify)
m_client->activeStatusChanged();
}
void MediaStreamPrivate::addTrack(RefPtr<MediaStreamTrackPrivate>&& track, NotifyClientOption notifyClientOption)
{
if (m_trackSet.contains(track->id()))
return;
m_trackSet.add(track->id(), track);
if (m_client && notifyClientOption == NotifyClientOption::Notify)
m_client->didAddTrackToPrivate(*track.get());
updateActiveState(NotifyClientOption::Notify);
}
void MediaStreamPrivate::removeTrack(MediaStreamTrackPrivate& track, NotifyClientOption notifyClientOption)
{
if (!m_trackSet.remove(track.id()))
return;
if (m_client && notifyClientOption == NotifyClientOption::Notify)
m_client->didRemoveTrackFromPrivate(track);
updateActiveState(NotifyClientOption::Notify);
}
}
#endif // ENABLE(MEDIA_STREAM)