| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 #include "platform/MIMETypeRegistry.h" | 44 #include "platform/MIMETypeRegistry.h" |
| 45 #include "platform/RuntimeEnabledFeatures.h" | 45 #include "platform/RuntimeEnabledFeatures.h" |
| 46 #include "platform/TraceEvent.h" | 46 #include "platform/TraceEvent.h" |
| 47 #include "public/platform/WebMediaSource.h" | 47 #include "public/platform/WebMediaSource.h" |
| 48 #include "public/platform/WebSourceBuffer.h" | 48 #include "public/platform/WebSourceBuffer.h" |
| 49 #include "wtf/text/CString.h" | 49 #include "wtf/text/CString.h" |
| 50 | 50 |
| 51 using blink::WebMediaSource; | 51 using blink::WebMediaSource; |
| 52 using blink::WebSourceBuffer; | 52 using blink::WebSourceBuffer; |
| 53 | 53 |
| 54 #define MEDIA_SOURCE_LOG_LEVEL 3 |
| 55 |
| 54 namespace blink { | 56 namespace blink { |
| 55 | 57 |
| 56 static bool throwExceptionIfClosedOrUpdating(bool isOpen, bool isUpdating, Excep
tionState& exceptionState) | 58 static bool throwExceptionIfClosedOrUpdating(bool isOpen, bool isUpdating, Excep
tionState& exceptionState) |
| 57 { | 59 { |
| 58 if (!isOpen) { | 60 if (!isOpen) { |
| 59 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError,
"The MediaSource's readyState is not 'open'."); | 61 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError,
"The MediaSource's readyState is not 'open'."); |
| 60 return true; | 62 return true; |
| 61 } | 63 } |
| 62 if (isUpdating) { | 64 if (isUpdating) { |
| 63 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError,
"The 'updating' attribute is true on one or more of this MediaSource's SourceBuf
fers."); | 65 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError,
"The 'updating' attribute is true on one or more of this MediaSource's SourceBuf
fers."); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 MediaSource::MediaSource(ExecutionContext* context) | 97 MediaSource::MediaSource(ExecutionContext* context) |
| 96 : ActiveScriptWrappable(this) | 98 : ActiveScriptWrappable(this) |
| 97 , ActiveDOMObject(context) | 99 , ActiveDOMObject(context) |
| 98 , m_readyState(closedKeyword()) | 100 , m_readyState(closedKeyword()) |
| 99 , m_asyncEventQueue(GenericEventQueue::create(this)) | 101 , m_asyncEventQueue(GenericEventQueue::create(this)) |
| 100 , m_attachedElement(nullptr) | 102 , m_attachedElement(nullptr) |
| 101 , m_sourceBuffers(SourceBufferList::create(getExecutionContext(), m_asyncEve
ntQueue.get())) | 103 , m_sourceBuffers(SourceBufferList::create(getExecutionContext(), m_asyncEve
ntQueue.get())) |
| 102 , m_activeSourceBuffers(SourceBufferList::create(getExecutionContext(), m_as
yncEventQueue.get())) | 104 , m_activeSourceBuffers(SourceBufferList::create(getExecutionContext(), m_as
yncEventQueue.get())) |
| 103 , m_isAddedToRegistry(false) | 105 , m_isAddedToRegistry(false) |
| 104 { | 106 { |
| 105 WTF_LOG(Media, "MediaSource::MediaSource %p", this); | 107 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")"; |
| 106 } | 108 } |
| 107 | 109 |
| 108 MediaSource::~MediaSource() | 110 MediaSource::~MediaSource() |
| 109 { | 111 { |
| 110 WTF_LOG(Media, "MediaSource::~MediaSource %p", this); | 112 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")"; |
| 111 ASSERT(isClosed()); | 113 DCHECK(isClosed()); |
| 112 } | 114 } |
| 113 | 115 |
| 114 void MediaSource::logAndThrowDOMException(ExceptionState& exceptionState, const
ExceptionCode& error, const String& message) | 116 void MediaSource::logAndThrowDOMException(ExceptionState& exceptionState, const
ExceptionCode& error, const String& message) |
| 115 { | 117 { |
| 116 WTF_LOG(Media, "throwDOMException: error=%d msg=%s", error, message.utf8().d
ata()); | 118 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(error=" << error << ", me
ssage=" << message << ")"; |
| 117 exceptionState.throwDOMException(error, message); | 119 exceptionState.throwDOMException(error, message); |
| 118 } | 120 } |
| 119 | 121 |
| 120 SourceBuffer* MediaSource::addSourceBuffer(const String& type, ExceptionState& e
xceptionState) | 122 SourceBuffer* MediaSource::addSourceBuffer(const String& type, ExceptionState& e
xceptionState) |
| 121 { | 123 { |
| 122 WTF_LOG(Media, "MediaSource::addSourceBuffer(%s) %p", type.ascii().data(), t
his); | 124 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") " << this
; |
| 123 | 125 |
| 124 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media
-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type | 126 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media
-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type |
| 125 // 1. If type is an empty string then throw an InvalidAccessError exception | 127 // 1. If type is an empty string then throw an InvalidAccessError exception |
| 126 // and abort these steps. | 128 // and abort these steps. |
| 127 if (type.isEmpty()) { | 129 if (type.isEmpty()) { |
| 128 logAndThrowDOMException(exceptionState, InvalidAccessError, "The type pr
ovided is empty."); | 130 logAndThrowDOMException(exceptionState, InvalidAccessError, "The type pr
ovided is empty."); |
| 129 return 0; | 131 return 0; |
| 130 } | 132 } |
| 131 | 133 |
| 132 // 2. If type contains a MIME type that is not supported ..., then throw a | 134 // 2. If type contains a MIME type that is not supported ..., then throw a |
| 133 // NotSupportedError exception and abort these steps. | 135 // NotSupportedError exception and abort these steps. |
| 134 if (!isTypeSupported(type)) { | 136 if (!isTypeSupported(type)) { |
| 135 logAndThrowDOMException(exceptionState, NotSupportedError, "The type pro
vided ('" + type + "') is unsupported."); | 137 logAndThrowDOMException(exceptionState, NotSupportedError, "The type pro
vided ('" + type + "') is unsupported."); |
| 136 return 0; | 138 return 0; |
| 137 } | 139 } |
| 138 | 140 |
| 139 // 4. If the readyState attribute is not in the "open" state then throw an | 141 // 4. If the readyState attribute is not in the "open" state then throw an |
| 140 // InvalidStateError exception and abort these steps. | 142 // InvalidStateError exception and abort these steps. |
| 141 if (!isOpen()) { | 143 if (!isOpen()) { |
| 142 logAndThrowDOMException(exceptionState, InvalidStateError, "The MediaSou
rce's readyState is not 'open'."); | 144 logAndThrowDOMException(exceptionState, InvalidStateError, "The MediaSou
rce's readyState is not 'open'."); |
| 143 return 0; | 145 return 0; |
| 144 } | 146 } |
| 145 | 147 |
| 146 // 5. Create a new SourceBuffer object and associated resources. | 148 // 5. Create a new SourceBuffer object and associated resources. |
| 147 ContentType contentType(type); | 149 ContentType contentType(type); |
| 148 String codecs = contentType.parameter("codecs"); | 150 String codecs = contentType.parameter("codecs"); |
| 149 OwnPtr<WebSourceBuffer> webSourceBuffer = createWebSourceBuffer(contentType.
type(), codecs, exceptionState); | 151 OwnPtr<WebSourceBuffer> webSourceBuffer = createWebSourceBuffer(contentType.
type(), codecs, exceptionState); |
| 150 | 152 |
| 151 if (!webSourceBuffer) { | 153 if (!webSourceBuffer) { |
| 152 ASSERT(exceptionState.code() == NotSupportedError || exceptionState.code
() == QuotaExceededError); | 154 DCHECK(exceptionState.code() == NotSupportedError || exceptionState.code
() == QuotaExceededError); |
| 153 // 2. If type contains a MIME type that is not supported ..., then throw
a NotSupportedError exception and abort these steps. | 155 // 2. If type contains a MIME type that is not supported ..., then throw
a NotSupportedError exception and abort these steps. |
| 154 // 3. If the user agent can't handle any more SourceBuffer objects then
throw a QuotaExceededError exception and abort these steps | 156 // 3. If the user agent can't handle any more SourceBuffer objects then
throw a QuotaExceededError exception and abort these steps |
| 155 return 0; | 157 return 0; |
| 156 } | 158 } |
| 157 | 159 |
| 158 SourceBuffer* buffer = SourceBuffer::create(std::move(webSourceBuffer), this
, m_asyncEventQueue.get()); | 160 SourceBuffer* buffer = SourceBuffer::create(std::move(webSourceBuffer), this
, m_asyncEventQueue.get()); |
| 159 // 6. Add the new object to sourceBuffers and fire a addsourcebuffer on that
object. | 161 // 6. Add the new object to sourceBuffers and fire a addsourcebuffer on that
object. |
| 160 m_sourceBuffers->add(buffer); | 162 m_sourceBuffers->add(buffer); |
| 161 | 163 |
| 162 // 7. Return the new object to the caller. | 164 // 7. Return the new object to the caller. |
| 163 WTF_LOG(Media, "MediaSource::addSourceBuffer(%s) %p -> %p", type.ascii().dat
a(), this, buffer); | 165 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") " << buff
er << " -> " << this; |
| 164 return buffer; | 166 return buffer; |
| 165 } | 167 } |
| 166 | 168 |
| 167 void MediaSource::removeSourceBuffer(SourceBuffer* buffer, ExceptionState& excep
tionState) | 169 void MediaSource::removeSourceBuffer(SourceBuffer* buffer, ExceptionState& excep
tionState) |
| 168 { | 170 { |
| 169 WTF_LOG(Media, "MediaSource::removeSourceBuffer() %p", this); | 171 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << buffer << ") -> " <<
this; |
| 170 | 172 |
| 171 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media
-source.html#widl-MediaSource-removeSourceBuffer-void-SourceBuffer-sourceBuffer | 173 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media
-source.html#widl-MediaSource-removeSourceBuffer-void-SourceBuffer-sourceBuffer |
| 172 | 174 |
| 173 // 1. If sourceBuffer specifies an object that is not in sourceBuffers then | 175 // 1. If sourceBuffer specifies an object that is not in sourceBuffers then |
| 174 // throw a NotFoundError exception and abort these steps. | 176 // throw a NotFoundError exception and abort these steps. |
| 175 if (!m_sourceBuffers->length() || !m_sourceBuffers->contains(buffer)) { | 177 if (!m_sourceBuffers->length() || !m_sourceBuffers->contains(buffer)) { |
| 176 logAndThrowDOMException(exceptionState, NotFoundError, "The SourceBuffer
provided is not contained in this MediaSource."); | 178 logAndThrowDOMException(exceptionState, NotFoundError, "The SourceBuffer
provided is not contained in this MediaSource."); |
| 177 return; | 179 return; |
| 178 } | 180 } |
| 179 | 181 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 196 if (isOpen()) { | 198 if (isOpen()) { |
| 197 scheduleEvent(EventTypeNames::sourceopen); | 199 scheduleEvent(EventTypeNames::sourceopen); |
| 198 return; | 200 return; |
| 199 } | 201 } |
| 200 | 202 |
| 201 if (oldState == openKeyword() && newState == endedKeyword()) { | 203 if (oldState == openKeyword() && newState == endedKeyword()) { |
| 202 scheduleEvent(EventTypeNames::sourceended); | 204 scheduleEvent(EventTypeNames::sourceended); |
| 203 return; | 205 return; |
| 204 } | 206 } |
| 205 | 207 |
| 206 ASSERT(isClosed()); | 208 DCHECK(isClosed()); |
| 207 | 209 |
| 208 m_activeSourceBuffers->clear(); | 210 m_activeSourceBuffers->clear(); |
| 209 | 211 |
| 210 // Clear SourceBuffer references to this object. | 212 // Clear SourceBuffer references to this object. |
| 211 for (unsigned long i = 0; i < m_sourceBuffers->length(); ++i) | 213 for (unsigned long i = 0; i < m_sourceBuffers->length(); ++i) |
| 212 m_sourceBuffers->item(i)->removedFromMediaSource(); | 214 m_sourceBuffers->item(i)->removedFromMediaSource(); |
| 213 m_sourceBuffers->clear(); | 215 m_sourceBuffers->clear(); |
| 214 | 216 |
| 215 m_attachedElement.clear(); | 217 m_attachedElement.clear(); |
| 216 | 218 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 227 | 229 |
| 228 return false; | 230 return false; |
| 229 } | 231 } |
| 230 | 232 |
| 231 bool MediaSource::isTypeSupported(const String& type) | 233 bool MediaSource::isTypeSupported(const String& type) |
| 232 { | 234 { |
| 233 // Section 2.2 isTypeSupported() method steps. | 235 // Section 2.2 isTypeSupported() method steps. |
| 234 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.
html#widl-MediaSource-isTypeSupported-boolean-DOMString-type | 236 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.
html#widl-MediaSource-isTypeSupported-boolean-DOMString-type |
| 235 // 1. If type is an empty string, then return false. | 237 // 1. If type is an empty string, then return false. |
| 236 if (type.isEmpty()) { | 238 if (type.isEmpty()) { |
| 237 WTF_LOG(Media, "MediaSource::isTypeSupported(%s) -> false (empty input)"
, type.ascii().data()); | 239 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") -> fa
lse (empty input)"; |
| 238 return false; | 240 return false; |
| 239 } | 241 } |
| 240 | 242 |
| 241 ContentType contentType(type); | 243 ContentType contentType(type); |
| 242 String codecs = contentType.parameter("codecs"); | 244 String codecs = contentType.parameter("codecs"); |
| 243 | 245 |
| 244 // 2. If type does not contain a valid MIME type string, then return false. | 246 // 2. If type does not contain a valid MIME type string, then return false. |
| 245 if (contentType.type().isEmpty()) { | 247 if (contentType.type().isEmpty()) { |
| 246 WTF_LOG(Media, "MediaSource::isTypeSupported(%s) -> false (invalid mime
type)", type.ascii().data()); | 248 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") -> fa
lse (invalid mime type)"; |
| 247 return false; | 249 return false; |
| 248 } | 250 } |
| 249 | 251 |
| 250 // Note: MediaSource.isTypeSupported() returning true implies that HTMLMedia
Element.canPlayType() will return "maybe" or "probably" | 252 // Note: MediaSource.isTypeSupported() returning true implies that HTMLMedia
Element.canPlayType() will return "maybe" or "probably" |
| 251 // since it does not make sense for a MediaSource to support a type the HTML
MediaElement knows it cannot play. | 253 // since it does not make sense for a MediaSource to support a type the HTML
MediaElement knows it cannot play. |
| 252 if (HTMLMediaElement::supportsType(contentType) == WebMimeRegistry::IsNotSup
ported) { | 254 if (HTMLMediaElement::supportsType(contentType) == WebMimeRegistry::IsNotSup
ported) { |
| 253 WTF_LOG(Media, "MediaSource::isTypeSupported(%s) -> false (not supported
by HTMLMediaElement)", type.ascii().data()); | 255 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") -> fa
lse (not supported by HTMLMediaElement)"; |
| 254 return false; | 256 return false; |
| 255 } | 257 } |
| 256 | 258 |
| 257 // 3. If type contains a media type or media subtype that the MediaSource do
es not support, then return false. | 259 // 3. If type contains a media type or media subtype that the MediaSource do
es not support, then return false. |
| 258 // 4. If type contains at a codec that the MediaSource does not support, the
n return false. | 260 // 4. If type contains at a codec that the MediaSource does not support, the
n return false. |
| 259 // 5. If the MediaSource does not support the specified combination of media
type, media subtype, and codecs then return false. | 261 // 5. If the MediaSource does not support the specified combination of media
type, media subtype, and codecs then return false. |
| 260 // 6. Return true. | 262 // 6. Return true. |
| 261 bool result = MIMETypeRegistry::isSupportedMediaSourceMIMEType(contentType.t
ype(), codecs); | 263 bool result = MIMETypeRegistry::isSupportedMediaSourceMIMEType(contentType.t
ype(), codecs); |
| 262 WTF_LOG(Media, "MediaSource::isTypeSupported(%s) -> %s", type.ascii().data()
, result ? "true" : "false"); | 264 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") -> " << (
result ? "true" : "false"); |
| 263 return result; | 265 return result; |
| 264 } | 266 } |
| 265 | 267 |
| 266 const AtomicString& MediaSource::interfaceName() const | 268 const AtomicString& MediaSource::interfaceName() const |
| 267 { | 269 { |
| 268 return EventTargetNames::MediaSource; | 270 return EventTargetNames::MediaSource; |
| 269 } | 271 } |
| 270 | 272 |
| 271 ExecutionContext* MediaSource::getExecutionContext() const | 273 ExecutionContext* MediaSource::getExecutionContext() const |
| 272 { | 274 { |
| 273 return ActiveDOMObject::getExecutionContext(); | 275 return ActiveDOMObject::getExecutionContext(); |
| 274 } | 276 } |
| 275 | 277 |
| 276 DEFINE_TRACE(MediaSource) | 278 DEFINE_TRACE(MediaSource) |
| 277 { | 279 { |
| 278 visitor->trace(m_asyncEventQueue); | 280 visitor->trace(m_asyncEventQueue); |
| 279 visitor->trace(m_attachedElement); | 281 visitor->trace(m_attachedElement); |
| 280 visitor->trace(m_sourceBuffers); | 282 visitor->trace(m_sourceBuffers); |
| 281 visitor->trace(m_activeSourceBuffers); | 283 visitor->trace(m_activeSourceBuffers); |
| 282 EventTargetWithInlineData::trace(visitor); | 284 EventTargetWithInlineData::trace(visitor); |
| 283 ActiveDOMObject::trace(visitor); | 285 ActiveDOMObject::trace(visitor); |
| 284 } | 286 } |
| 285 | 287 |
| 286 void MediaSource::setWebMediaSourceAndOpen(PassOwnPtr<WebMediaSource> webMediaSo
urce) | 288 void MediaSource::setWebMediaSourceAndOpen(PassOwnPtr<WebMediaSource> webMediaSo
urce) |
| 287 { | 289 { |
| 288 TRACE_EVENT_ASYNC_END0("media", "MediaSource::attachToElement", this); | 290 TRACE_EVENT_ASYNC_END0("media", "MediaSource::attachToElement", this); |
| 289 ASSERT(webMediaSource); | 291 DCHECK(webMediaSource); |
| 290 ASSERT(!m_webMediaSource); | 292 DCHECK(!m_webMediaSource); |
| 291 ASSERT(m_attachedElement); | 293 DCHECK(m_attachedElement); |
| 292 m_webMediaSource = std::move(webMediaSource); | 294 m_webMediaSource = std::move(webMediaSource); |
| 293 setReadyState(openKeyword()); | 295 setReadyState(openKeyword()); |
| 294 } | 296 } |
| 295 | 297 |
| 296 void MediaSource::addedToRegistry() | 298 void MediaSource::addedToRegistry() |
| 297 { | 299 { |
| 298 ASSERT(!m_isAddedToRegistry); | 300 DCHECK(!m_isAddedToRegistry); |
| 299 m_isAddedToRegistry = true; | 301 m_isAddedToRegistry = true; |
| 300 } | 302 } |
| 301 | 303 |
| 302 void MediaSource::removedFromRegistry() | 304 void MediaSource::removedFromRegistry() |
| 303 { | 305 { |
| 304 ASSERT(m_isAddedToRegistry); | 306 DCHECK(m_isAddedToRegistry); |
| 305 m_isAddedToRegistry = false; | 307 m_isAddedToRegistry = false; |
| 306 } | 308 } |
| 307 | 309 |
| 308 double MediaSource::duration() const | 310 double MediaSource::duration() const |
| 309 { | 311 { |
| 310 return isClosed() ? std::numeric_limits<float>::quiet_NaN() : m_webMediaSour
ce->duration(); | 312 return isClosed() ? std::numeric_limits<float>::quiet_NaN() : m_webMediaSour
ce->duration(); |
| 311 } | 313 } |
| 312 | 314 |
| 313 TimeRanges* MediaSource::buffered() const | 315 TimeRanges* MediaSource::buffered() const |
| 314 { | 316 { |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 // 5. If a user agent is unable to partially render audio frames or text cue
s that start before and end after the duration, then run the following steps: | 437 // 5. If a user agent is unable to partially render audio frames or text cue
s that start before and end after the duration, then run the following steps: |
| 436 // NOTE: Currently we assume that the media engine is able to render partial
frames/cues. If a media | 438 // NOTE: Currently we assume that the media engine is able to render partial
frames/cues. If a media |
| 437 // engine gets added that doesn't support this, then we'll need to add logic
to handle the substeps. | 439 // engine gets added that doesn't support this, then we'll need to add logic
to handle the substeps. |
| 438 | 440 |
| 439 // 6. Update the media controller duration to new duration and run the HTMLM
ediaElement duration change algorithm. | 441 // 6. Update the media controller duration to new duration and run the HTMLM
ediaElement duration change algorithm. |
| 440 m_attachedElement->durationChanged(newDuration, requestSeek); | 442 m_attachedElement->durationChanged(newDuration, requestSeek); |
| 441 } | 443 } |
| 442 | 444 |
| 443 void MediaSource::setReadyState(const AtomicString& state) | 445 void MediaSource::setReadyState(const AtomicString& state) |
| 444 { | 446 { |
| 445 ASSERT(state == openKeyword() || state == closedKeyword() || state == endedK
eyword()); | 447 DCHECK(state == openKeyword() || state == closedKeyword() || state == endedK
eyword()); |
| 446 | 448 |
| 447 AtomicString oldState = readyState(); | 449 AtomicString oldState = readyState(); |
| 448 WTF_LOG(Media, "MediaSource::setReadyState() %p : %s -> %s", this, oldState.
ascii().data(), state.ascii().data()); | 450 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << " : " << oldState << " -> "
<< state << " " << this; |
| 449 | 451 |
| 450 if (state == closedKeyword()) { | 452 if (state == closedKeyword()) { |
| 451 m_webMediaSource.clear(); | 453 m_webMediaSource.clear(); |
| 452 } | 454 } |
| 453 | 455 |
| 454 if (oldState == state) | 456 if (oldState == state) |
| 455 return; | 457 return; |
| 456 | 458 |
| 457 m_readyState = state; | 459 m_readyState = state; |
| 458 | 460 |
| 459 onReadyStateChange(oldState, state); | 461 onReadyStateChange(oldState, state); |
| 460 } | 462 } |
| 461 | 463 |
| 462 void MediaSource::endOfStream(const AtomicString& error, ExceptionState& excepti
onState) | 464 void MediaSource::endOfStream(const AtomicString& error, ExceptionState& excepti
onState) |
| 463 { | 465 { |
| 464 DEFINE_STATIC_LOCAL(const AtomicString, network, ("network")); | 466 DEFINE_STATIC_LOCAL(const AtomicString, network, ("network")); |
| 465 DEFINE_STATIC_LOCAL(const AtomicString, decode, ("decode")); | 467 DEFINE_STATIC_LOCAL(const AtomicString, decode, ("decode")); |
| 466 | 468 |
| 467 if (error == network) { | 469 if (error == network) { |
| 468 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNetworkError, excep
tionState); | 470 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNetworkError, excep
tionState); |
| 469 } else if (error == decode) { | 471 } else if (error == decode) { |
| 470 endOfStreamInternal(WebMediaSource::EndOfStreamStatusDecodeError, except
ionState); | 472 endOfStreamInternal(WebMediaSource::EndOfStreamStatusDecodeError, except
ionState); |
| 471 } else { | 473 } else { |
| 472 ASSERT_NOT_REACHED(); // IDL enforcement should prevent this case. | 474 NOTREACHED(); // IDL enforcement should prevent this case. |
| 473 } | 475 } |
| 474 } | 476 } |
| 475 | 477 |
| 476 void MediaSource::endOfStream(ExceptionState& exceptionState) | 478 void MediaSource::endOfStream(ExceptionState& exceptionState) |
| 477 { | 479 { |
| 478 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNoError, exceptionState
); | 480 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNoError, exceptionState
); |
| 479 } | 481 } |
| 480 | 482 |
| 481 void MediaSource::endOfStreamInternal(const WebMediaSource::EndOfStreamStatus eo
sStatus, ExceptionState& exceptionState) | 483 void MediaSource::endOfStreamInternal(const WebMediaSource::EndOfStreamStatus eo
sStatus, ExceptionState& exceptionState) |
| 482 { | 484 { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 497 m_webMediaSource->markEndOfStream(eosStatus); | 499 m_webMediaSource->markEndOfStream(eosStatus); |
| 498 } | 500 } |
| 499 | 501 |
| 500 bool MediaSource::isOpen() const | 502 bool MediaSource::isOpen() const |
| 501 { | 503 { |
| 502 return readyState() == openKeyword(); | 504 return readyState() == openKeyword(); |
| 503 } | 505 } |
| 504 | 506 |
| 505 void MediaSource::setSourceBufferActive(SourceBuffer* sourceBuffer) | 507 void MediaSource::setSourceBufferActive(SourceBuffer* sourceBuffer) |
| 506 { | 508 { |
| 507 ASSERT(!m_activeSourceBuffers->contains(sourceBuffer)); | 509 DCHECK(!m_activeSourceBuffers->contains(sourceBuffer)); |
| 508 | 510 |
| 509 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.
html#widl-MediaSource-activeSourceBuffers | 511 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.
html#widl-MediaSource-activeSourceBuffers |
| 510 // SourceBuffer objects in SourceBuffer.activeSourceBuffers must appear in | 512 // SourceBuffer objects in SourceBuffer.activeSourceBuffers must appear in |
| 511 // the same order as they appear in SourceBuffer.sourceBuffers. | 513 // the same order as they appear in SourceBuffer.sourceBuffers. |
| 512 // SourceBuffer transitions to active are not guaranteed to occur in the | 514 // SourceBuffer transitions to active are not guaranteed to occur in the |
| 513 // same order as buffers in |m_sourceBuffers|, so this method needs to | 515 // same order as buffers in |m_sourceBuffers|, so this method needs to |
| 514 // insert |sourceBuffer| into |m_activeSourceBuffers|. | 516 // insert |sourceBuffer| into |m_activeSourceBuffers|. |
| 515 size_t indexInSourceBuffers = m_sourceBuffers->find(sourceBuffer); | 517 size_t indexInSourceBuffers = m_sourceBuffers->find(sourceBuffer); |
| 516 ASSERT(indexInSourceBuffers != kNotFound); | 518 DCHECK(indexInSourceBuffers != kNotFound); |
| 517 | 519 |
| 518 size_t insertPosition = 0; | 520 size_t insertPosition = 0; |
| 519 while (insertPosition < m_activeSourceBuffers->length() | 521 while (insertPosition < m_activeSourceBuffers->length() |
| 520 && m_sourceBuffers->find(m_activeSourceBuffers->item(insertPosition)) <
indexInSourceBuffers) { | 522 && m_sourceBuffers->find(m_activeSourceBuffers->item(insertPosition)) <
indexInSourceBuffers) { |
| 521 ++insertPosition; | 523 ++insertPosition; |
| 522 } | 524 } |
| 523 | 525 |
| 524 m_activeSourceBuffers->insert(insertPosition, sourceBuffer); | 526 m_activeSourceBuffers->insert(insertPosition, sourceBuffer); |
| 525 } | 527 } |
| 526 | 528 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 537 void MediaSource::close() | 539 void MediaSource::close() |
| 538 { | 540 { |
| 539 setReadyState(closedKeyword()); | 541 setReadyState(closedKeyword()); |
| 540 } | 542 } |
| 541 | 543 |
| 542 bool MediaSource::attachToElement(HTMLMediaElement* element) | 544 bool MediaSource::attachToElement(HTMLMediaElement* element) |
| 543 { | 545 { |
| 544 if (m_attachedElement) | 546 if (m_attachedElement) |
| 545 return false; | 547 return false; |
| 546 | 548 |
| 547 ASSERT(isClosed()); | 549 DCHECK(isClosed()); |
| 548 | 550 |
| 549 TRACE_EVENT_ASYNC_BEGIN0("media", "MediaSource::attachToElement", this); | 551 TRACE_EVENT_ASYNC_BEGIN0("media", "MediaSource::attachToElement", this); |
| 550 m_attachedElement = element; | 552 m_attachedElement = element; |
| 551 return true; | 553 return true; |
| 552 } | 554 } |
| 553 | 555 |
| 554 void MediaSource::openIfInEndedState() | 556 void MediaSource::openIfInEndedState() |
| 555 { | 557 { |
| 556 if (m_readyState != endedKeyword()) | 558 if (m_readyState != endedKeyword()) |
| 557 return; | 559 return; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 576 } | 578 } |
| 577 | 579 |
| 578 PassOwnPtr<WebSourceBuffer> MediaSource::createWebSourceBuffer(const String& typ
e, const String& codecs, ExceptionState& exceptionState) | 580 PassOwnPtr<WebSourceBuffer> MediaSource::createWebSourceBuffer(const String& typ
e, const String& codecs, ExceptionState& exceptionState) |
| 579 { | 581 { |
| 580 WebSourceBuffer* webSourceBuffer = 0; | 582 WebSourceBuffer* webSourceBuffer = 0; |
| 581 | 583 |
| 582 switch (m_webMediaSource->addSourceBuffer(type, codecs, &webSourceBuffer)) { | 584 switch (m_webMediaSource->addSourceBuffer(type, codecs, &webSourceBuffer)) { |
| 583 case WebMediaSource::AddStatusOk: | 585 case WebMediaSource::AddStatusOk: |
| 584 return adoptPtr(webSourceBuffer); | 586 return adoptPtr(webSourceBuffer); |
| 585 case WebMediaSource::AddStatusNotSupported: | 587 case WebMediaSource::AddStatusNotSupported: |
| 586 ASSERT(!webSourceBuffer); | 588 DCHECK(!webSourceBuffer); |
| 587 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/m
edia-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type | 589 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/m
edia-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type |
| 588 // Step 2: If type contains a MIME type ... that is not supported with t
he types | 590 // Step 2: If type contains a MIME type ... that is not supported with t
he types |
| 589 // specified for the other SourceBuffer objects in sourceBuffers, then t
hrow | 591 // specified for the other SourceBuffer objects in sourceBuffers, then t
hrow |
| 590 // a NotSupportedError exception and abort these steps. | 592 // a NotSupportedError exception and abort these steps. |
| 591 logAndThrowDOMException(exceptionState, NotSupportedError, "The type pro
vided ('" + type + "') is not supported."); | 593 logAndThrowDOMException(exceptionState, NotSupportedError, "The type pro
vided ('" + type + "') is not supported."); |
| 592 return nullptr; | 594 return nullptr; |
| 593 case WebMediaSource::AddStatusReachedIdLimit: | 595 case WebMediaSource::AddStatusReachedIdLimit: |
| 594 ASSERT(!webSourceBuffer); | 596 DCHECK(!webSourceBuffer); |
| 595 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/m
edia-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type | 597 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/m
edia-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type |
| 596 // Step 3: If the user agent can't handle any more SourceBuffer objects
then throw | 598 // Step 3: If the user agent can't handle any more SourceBuffer objects
then throw |
| 597 // a QuotaExceededError exception and abort these steps. | 599 // a QuotaExceededError exception and abort these steps. |
| 598 logAndThrowDOMException(exceptionState, QuotaExceededError, "This MediaS
ource has reached the limit of SourceBuffer objects it can handle. No additional
SourceBuffer objects may be added."); | 600 logAndThrowDOMException(exceptionState, QuotaExceededError, "This MediaS
ource has reached the limit of SourceBuffer objects it can handle. No additional
SourceBuffer objects may be added."); |
| 599 return nullptr; | 601 return nullptr; |
| 600 } | 602 } |
| 601 | 603 |
| 602 ASSERT_NOT_REACHED(); | 604 NOTREACHED(); |
| 603 return nullptr; | 605 return nullptr; |
| 604 } | 606 } |
| 605 | 607 |
| 606 void MediaSource::scheduleEvent(const AtomicString& eventName) | 608 void MediaSource::scheduleEvent(const AtomicString& eventName) |
| 607 { | 609 { |
| 608 ASSERT(m_asyncEventQueue); | 610 DCHECK(m_asyncEventQueue); |
| 609 | 611 |
| 610 Event* event = Event::create(eventName); | 612 Event* event = Event::create(eventName); |
| 611 event->setTarget(this); | 613 event->setTarget(this); |
| 612 | 614 |
| 613 m_asyncEventQueue->enqueueEvent(event); | 615 m_asyncEventQueue->enqueueEvent(event); |
| 614 } | 616 } |
| 615 | 617 |
| 616 URLRegistry& MediaSource::registry() const | 618 URLRegistry& MediaSource::registry() const |
| 617 { | 619 { |
| 618 return MediaSourceRegistry::registry(); | 620 return MediaSourceRegistry::registry(); |
| 619 } | 621 } |
| 620 | 622 |
| 621 } // namespace blink | 623 } // namespace blink |
| OLD | NEW |