Index: Source/modules/mediasource/MediaSource.cpp |
diff --git a/Source/modules/mediasource/WebKitMediaSource.cpp b/Source/modules/mediasource/MediaSource.cpp |
similarity index 59% |
copy from Source/modules/mediasource/WebKitMediaSource.cpp |
copy to Source/modules/mediasource/MediaSource.cpp |
index 8dd5f5640fb943338842987dbe2451cac2f30660..8145fcf9434890c2cbc5c846a4b5db66267b0dd8 100644 |
--- a/Source/modules/mediasource/WebKitMediaSource.cpp |
+++ b/Source/modules/mediasource/MediaSource.cpp |
@@ -1,5 +1,5 @@ |
/* |
- * Copyright (C) 2012 Google Inc. All rights reserved. |
+ * Copyright (C) 2013 Google Inc. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions are |
@@ -29,10 +29,12 @@ |
*/ |
#include "config.h" |
-#include "modules/mediasource/WebKitMediaSource.h" |
+#include "modules/mediasource/MediaSource.h" |
+#include "core/dom/GenericEventQueue.h" |
#include "core/html/TimeRanges.h" |
#include "core/platform/ContentType.h" |
+#include "core/platform/Logging.h" |
#include "core/platform/MIMETypeRegistry.h" |
#include "core/platform/graphics/SourceBufferPrivate.h" |
#include "modules/mediasource/MediaSourceRegistry.h" |
@@ -40,35 +42,33 @@ |
namespace WebCore { |
-PassRefPtr<WebKitMediaSource> WebKitMediaSource::create(ScriptExecutionContext* context) |
+PassRefPtr<MediaSource> MediaSource::create(ScriptExecutionContext* context) |
{ |
- RefPtr<WebKitMediaSource> mediaSource(adoptRef(new WebKitMediaSource(context))); |
+ RefPtr<MediaSource> mediaSource(adoptRef(new MediaSource(context))); |
mediaSource->suspendIfNeeded(); |
return mediaSource.release(); |
} |
-WebKitMediaSource::WebKitMediaSource(ScriptExecutionContext* context) |
+MediaSource::MediaSource(ScriptExecutionContext* context) |
: MediaSourceBase(context) |
{ |
+ LOG(Media, "MediaSource::MediaSource %p", this); |
ScriptWrappable::init(this); |
- m_sourceBuffers = WebKitSourceBufferList::create(scriptExecutionContext(), asyncEventQueue()); |
- m_activeSourceBuffers = WebKitSourceBufferList::create(scriptExecutionContext(), asyncEventQueue()); |
+ m_sourceBuffers = SourceBufferList::create(scriptExecutionContext(), asyncEventQueue()); |
+ m_activeSourceBuffers = SourceBufferList::create(scriptExecutionContext(), asyncEventQueue()); |
} |
-WebKitSourceBufferList* WebKitMediaSource::sourceBuffers() |
+MediaSource::~MediaSource() |
{ |
- return m_sourceBuffers.get(); |
+ LOG(Media, "MediaSource::~MediaSource %p", this); |
+ ASSERT(isClosed()); |
} |
-WebKitSourceBufferList* WebKitMediaSource::activeSourceBuffers() |
+SourceBuffer* MediaSource::addSourceBuffer(const String& type, ExceptionCode& ec) |
{ |
- // FIXME(91649): support track selection |
- return m_activeSourceBuffers.get(); |
-} |
+ LOG(Media, "MediaSource::addSourceBuffer(%s) %p", type.ascii().data(), this); |
-WebKitSourceBuffer* WebKitMediaSource::addSourceBuffer(const String& type, ExceptionCode& ec) |
-{ |
- // 3.1 http://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#dom-addsourcebuffer |
+ // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type |
// 1. If type is null or an empty then throw an INVALID_ACCESS_ERR exception and |
// abort these steps. |
if (type.isNull() || type.isEmpty()) { |
@@ -94,10 +94,15 @@ WebKitSourceBuffer* WebKitMediaSource::addSourceBuffer(const String& type, Excep |
ContentType contentType(type); |
Vector<String> codecs = contentType.codecs(); |
OwnPtr<SourceBufferPrivate> sourceBufferPrivate = createSourceBufferPrivate(contentType.type(), codecs, ec); |
- if (!sourceBufferPrivate) |
+ |
+ if (!sourceBufferPrivate) { |
+ ASSERT(ec == NOT_SUPPORTED_ERR || ec == QUOTA_EXCEEDED_ERR); |
+ // 2. If type contains a MIME type that is not supported ..., then throw a NOT_SUPPORTED_ERR exception and abort these steps. |
+ // 3. If the user agent can't handle any more SourceBuffer objects then throw a QUOTA_EXCEEDED_ERR exception and abort these steps |
return 0; |
+ } |
- RefPtr<WebKitSourceBuffer> buffer = WebKitSourceBuffer::create(sourceBufferPrivate.release(), this); |
+ RefPtr<SourceBuffer> buffer = SourceBuffer::create(sourceBufferPrivate.release(), this, asyncEventQueue()); |
// 6. Add the new object to sourceBuffers and fire a addsourcebuffer on that object. |
m_sourceBuffers->add(buffer); |
m_activeSourceBuffers->add(buffer); |
@@ -105,9 +110,12 @@ WebKitSourceBuffer* WebKitMediaSource::addSourceBuffer(const String& type, Excep |
return buffer.get(); |
} |
-void WebKitMediaSource::removeSourceBuffer(WebKitSourceBuffer* buffer, ExceptionCode& ec) |
+void MediaSource::removeSourceBuffer(SourceBuffer* buffer, ExceptionCode& ec) |
{ |
- // 3.1 http://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#dom-removesourcebuffer |
+ LOG(Media, "MediaSource::removeSourceBuffer() %p", this); |
+ RefPtr<SourceBuffer> protect(buffer); |
+ |
+ // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#widl-MediaSource-removeSourceBuffer-void-SourceBuffer-sourceBuffer |
// 1. If sourceBuffer is null then throw an INVALID_ACCESS_ERR exception and |
// abort these steps. |
if (!buffer) { |
@@ -115,64 +123,68 @@ void WebKitMediaSource::removeSourceBuffer(WebKitSourceBuffer* buffer, Exception |
return; |
} |
- // 2. If sourceBuffers is empty then throw an INVALID_STATE_ERR exception and |
- // abort these steps. |
- if (isClosed() || !m_sourceBuffers->length()) { |
- ec = INVALID_STATE_ERR; |
- return; |
- } |
- |
- // 3. If sourceBuffer specifies an object that is not in sourceBuffers then |
+ // 2. If sourceBuffer specifies an object that is not in sourceBuffers then |
// throw a NOT_FOUND_ERR exception and abort these steps. |
- // 6. Remove sourceBuffer from sourceBuffers and fire a removesourcebuffer event |
- // on that object. |
- if (!m_sourceBuffers->remove(buffer)) { |
+ if (!m_sourceBuffers->length() || !m_sourceBuffers->contains(buffer)) { |
ec = NOT_FOUND_ERR; |
return; |
} |
- // 7. Destroy all resources for sourceBuffer. |
- m_activeSourceBuffers->remove(buffer); |
+ // 3. If the sourceBuffer.updating attribute equals true, then run the following steps: ... |
+ buffer->abortIfUpdating(); |
- // 4. Remove track information from audioTracks, videoTracks, and textTracks for all tracks |
- // associated with sourceBuffer and fire a simple event named change on the modified lists. |
+ // Steps 4-9 are related to updating audioTracks, videoTracks, and textTracks which aren't implmented yet. |
// FIXME(91649): support track selection |
- // 5. If sourceBuffer is in activeSourceBuffers, then remove it from that list and fire a |
- // removesourcebuffer event on that object. |
- // FIXME(91649): support track selection |
+ // 10. If sourceBuffer is in activeSourceBuffers, then remove sourceBuffer from activeSourceBuffers ... |
+ m_activeSourceBuffers->remove(buffer); |
+ |
+ // 11. Remove sourceBuffer from sourceBuffers and fire a removesourcebuffer event |
+ // on that object. |
+ m_sourceBuffers->remove(buffer); |
+ |
+ // 12. Destroy all resources for sourceBuffer. |
+ buffer->removedFromMediaSource(); |
} |
-void WebKitMediaSource::setReadyState(const AtomicString& state) |
+void MediaSource::setReadyState(const AtomicString& state) |
{ |
ASSERT(state == openKeyword() || state == closedKeyword() || state == endedKeyword()); |
- String oldState = readyState(); |
+ AtomicString oldState = readyState(); |
if (oldState == state) |
return; |
+ LOG(Media, "MediaSource::setReadyState() %p : %s -> %s", this, oldState.string().ascii().data(), state.string().ascii().data()); |
+ |
MediaSourceBase::setReadyState(state); |
- if (isClosed()) { |
- m_sourceBuffers->clear(); |
- m_activeSourceBuffers->clear(); |
- scheduleEvent(eventNames().webkitsourcecloseEvent); |
+ if (isOpen()) { |
+ scheduleEvent(eventNames().sourceopenEvent); |
return; |
} |
if (oldState == openKeyword() && state == endedKeyword()) { |
- scheduleEvent(eventNames().webkitsourceendedEvent); |
+ scheduleEvent(eventNames().sourceendedEvent); |
return; |
} |
- if (isOpen()) { |
- scheduleEvent(eventNames().webkitsourceopenEvent); |
- return; |
- } |
+ ASSERT(isClosed()); |
+ |
+ m_activeSourceBuffers->clear(); |
+ |
+ // Clear SourceBuffer references to this object. |
+ for (unsigned long i = 0; i < m_sourceBuffers->length(); ++i) |
+ m_sourceBuffers->item(i)->removedFromMediaSource(); |
+ m_sourceBuffers->clear(); |
+ |
+ scheduleEvent(eventNames().sourcecloseEvent); |
} |
-bool WebKitMediaSource::isTypeSupported(const String& type) |
+bool MediaSource::isTypeSupported(const String& type) |
{ |
- // Section 2.1 isTypeSupported() method steps. |
+ LOG(Media, "MediaSource::isTypeSupported(%s)", type.ascii().data()); |
+ |
+ // Section 2.2 isTypeSupported() method steps. |
// https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#widl-MediaSource-isTypeSupported-boolean-DOMString-type |
// 1. If type is an empty string, then return false. |
if (type.isNull() || type.isEmpty()) |
@@ -192,12 +204,12 @@ bool WebKitMediaSource::isTypeSupported(const String& type) |
return MIMETypeRegistry::isSupportedMediaSourceMIMEType(contentType.type(), codecs); |
} |
-const AtomicString& WebKitMediaSource::interfaceName() const |
+const AtomicString& MediaSource::interfaceName() const |
{ |
- return eventNames().interfaceForWebKitMediaSource; |
+ return eventNames().interfaceForMediaSource; |
} |
-void WebKitMediaSource::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const |
+void MediaSource::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const |
{ |
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::DOM); |
ScriptWrappable::reportMemoryUsage(memoryObjectInfo); |