#include "config.h"
#include "MediaStream.h"
#if ENABLE(MEDIA_STREAM)
#include "Event.h"
#include "ExceptionCode.h"
#include "MediaStreamCenter.h"
#include "MediaStreamSource.h"
#include "ScriptExecutionContext.h"
#include "UUID.h"
namespace WebCore {
static void processTrackList(PassRefPtr<MediaStreamTrackList> prpTracks, const String& kind, MediaStreamSourceVector& sources, ExceptionCode& ec)
{
RefPtr<MediaStreamTrackList> tracks = prpTracks;
if (!tracks)
return;
for (unsigned i = 0; i < tracks->length(); ++i) {
MediaStreamTrack* track = tracks->item(i);
if (track->kind() != kind) {
ec = SYNTAX_ERR;
return;
}
MediaStreamSource* source = track->component()->source();
bool isDuplicate = false;
for (MediaStreamSourceVector::iterator j = sources.begin(); j < sources.end(); ++j) {
if ((*j)->id() == source->id()) {
isDuplicate = true;
break;
}
}
if (!isDuplicate)
sources.append(source);
}
}
PassRefPtr<MediaStream> MediaStream::create(ScriptExecutionContext* context, PassRefPtr<MediaStreamTrackList> audioTracks, PassRefPtr<MediaStreamTrackList> videoTracks, ExceptionCode& ec)
{
MediaStreamSourceVector audioSources;
processTrackList(audioTracks, "audio", audioSources, ec);
if (ec)
return 0;
MediaStreamSourceVector videoSources;
processTrackList(videoTracks, "video", videoSources, ec);
if (ec)
return 0;
RefPtr<MediaStreamDescriptor> descriptor = MediaStreamDescriptor::create(createCanonicalUUIDString(), audioSources, videoSources);
MediaStreamCenter::instance().didConstructMediaStream(descriptor.get());
RefPtr<MediaStream> stream = adoptRef(new MediaStream(context, descriptor.release()));
stream->suspendIfNeeded();
return stream.release();
}
PassRefPtr<MediaStream> MediaStream::create(ScriptExecutionContext* context, PassRefPtr<MediaStreamDescriptor> streamDescriptor)
{
RefPtr<MediaStream> stream = adoptRef(new MediaStream(context, streamDescriptor));
stream->suspendIfNeeded();
return stream.release();
}
MediaStream::MediaStream(ScriptExecutionContext* context, PassRefPtr<MediaStreamDescriptor> streamDescriptor)
: ActiveDOMObject(context, this)
, m_descriptor(streamDescriptor)
{
m_descriptor->setOwner(this);
MediaStreamTrackVector audioTrackVector;
size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents();
audioTrackVector.reserveCapacity(numberOfAudioTracks);
for (size_t i = 0; i < numberOfAudioTracks; i++)
audioTrackVector.append(MediaStreamTrack::create(m_descriptor, m_descriptor->audioComponent(i)));
m_audioTracks = MediaStreamTrackList::create(audioTrackVector);
MediaStreamTrackVector videoTrackVector;
size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents();
videoTrackVector.reserveCapacity(numberOfVideoTracks);
for (size_t i = 0; i < numberOfVideoTracks; i++)
videoTrackVector.append(MediaStreamTrack::create(m_descriptor, m_descriptor->videoComponent(i)));
m_videoTracks = MediaStreamTrackList::create(videoTrackVector);
}
MediaStream::~MediaStream()
{
m_descriptor->setOwner(0);
}
MediaStream::ReadyState MediaStream::readyState() const
{
return m_descriptor->ended() ? ENDED : LIVE;
}
void MediaStream::streamEnded()
{
if (readyState() == ENDED)
return;
m_descriptor->setEnded();
dispatchEvent(Event::create(eventNames().endedEvent, false, false));
}
const AtomicString& MediaStream::interfaceName() const
{
return eventNames().interfaceForMediaStream;
}
ScriptExecutionContext* MediaStream::scriptExecutionContext() const
{
return ActiveDOMObject::scriptExecutionContext();
}
EventTargetData* MediaStream::eventTargetData()
{
return &m_eventTargetData;
}
EventTargetData* MediaStream::ensureEventTargetData()
{
return &m_eventTargetData;
}
}
#endif // ENABLE(MEDIA_STREAM)