Chromium Code Reviews| 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(webSourceBuffer.release(), this, m_asyncEventQueue.get()); | 160 SourceBuffer* buffer = SourceBuffer::create(webSourceBuffer.release(), 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 << ") " << this << " -> " << buffer; |
| 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__ << "(" << this << ") -> " << b uffer; |
|
wolenetz
2016/05/20 19:58:15
nit: swap |this| and |buffer| placement in the log
Srirama
2016/05/21 08:28:28
Done.
| |
| 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 19 matching lines...) Expand all Loading... | |
| 199 if (isOpen()) { | 201 if (isOpen()) { |
| 200 scheduleEvent(EventTypeNames::sourceopen); | 202 scheduleEvent(EventTypeNames::sourceopen); |
| 201 return; | 203 return; |
| 202 } | 204 } |
| 203 | 205 |
| 204 if (oldState == openKeyword() && newState == endedKeyword()) { | 206 if (oldState == openKeyword() && newState == endedKeyword()) { |
| 205 scheduleEvent(EventTypeNames::sourceended); | 207 scheduleEvent(EventTypeNames::sourceended); |
| 206 return; | 208 return; |
| 207 } | 209 } |
| 208 | 210 |
| 209 ASSERT(isClosed()); | 211 DCHECK(isClosed()); |
| 210 | 212 |
| 211 m_activeSourceBuffers->clear(); | 213 m_activeSourceBuffers->clear(); |
| 212 | 214 |
| 213 // Clear SourceBuffer references to this object. | 215 // Clear SourceBuffer references to this object. |
| 214 for (unsigned long i = 0; i < m_sourceBuffers->length(); ++i) | 216 for (unsigned long i = 0; i < m_sourceBuffers->length(); ++i) |
| 215 m_sourceBuffers->item(i)->removedFromMediaSource(); | 217 m_sourceBuffers->item(i)->removedFromMediaSource(); |
| 216 m_sourceBuffers->clear(); | 218 m_sourceBuffers->clear(); |
| 217 | 219 |
| 218 scheduleEvent(EventTypeNames::sourceclose); | 220 scheduleEvent(EventTypeNames::sourceclose); |
| 219 } | 221 } |
| 220 | 222 |
| 221 bool MediaSource::isUpdating() const | 223 bool MediaSource::isUpdating() const |
| 222 { | 224 { |
| 223 // Return true if any member of |m_sourceBuffers| is updating. | 225 // Return true if any member of |m_sourceBuffers| is updating. |
| 224 for (unsigned long i = 0; i < m_sourceBuffers->length(); ++i) { | 226 for (unsigned long i = 0; i < m_sourceBuffers->length(); ++i) { |
| 225 if (m_sourceBuffers->item(i)->updating()) | 227 if (m_sourceBuffers->item(i)->updating()) |
| 226 return true; | 228 return true; |
| 227 } | 229 } |
| 228 | 230 |
| 229 return false; | 231 return false; |
| 230 } | 232 } |
| 231 | 233 |
| 232 bool MediaSource::isTypeSupported(const String& type) | 234 bool MediaSource::isTypeSupported(const String& type) |
| 233 { | 235 { |
| 234 // Section 2.2 isTypeSupported() method steps. | 236 // Section 2.2 isTypeSupported() method steps. |
| 235 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-MediaSource-isTypeSupported-boolean-DOMString-type | 237 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-MediaSource-isTypeSupported-boolean-DOMString-type |
| 236 // 1. If type is an empty string, then return false. | 238 // 1. If type is an empty string, then return false. |
| 237 if (type.isEmpty()) { | 239 if (type.isEmpty()) { |
| 238 WTF_LOG(Media, "MediaSource::isTypeSupported(%s) -> false (empty input)" , type.ascii().data()); | 240 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") -> fa lse (empty input)"; |
|
wolenetz
2016/05/20 19:58:15
nit: In Chromium, |this| shouldn't make a differen
Srirama
2016/05/21 08:28:27
Same static function issue here.
| |
| 239 return false; | 241 return false; |
| 240 } | 242 } |
| 241 | 243 |
| 242 ContentType contentType(type); | 244 ContentType contentType(type); |
| 243 String codecs = contentType.parameter("codecs"); | 245 String codecs = contentType.parameter("codecs"); |
| 244 | 246 |
| 245 // 2. If type does not contain a valid MIME type string, then return false. | 247 // 2. If type does not contain a valid MIME type string, then return false. |
| 246 if (contentType.type().isEmpty()) { | 248 if (contentType.type().isEmpty()) { |
| 247 WTF_LOG(Media, "MediaSource::isTypeSupported(%s) -> false (invalid mime type)", type.ascii().data()); | 249 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") -> fa lse (invalid mime type)"; |
| 248 return false; | 250 return false; |
| 249 } | 251 } |
| 250 | 252 |
| 251 // Note: MediaSource.isTypeSupported() returning true implies that HTMLMedia Element.canPlayType() will return "maybe" or "probably" | 253 // Note: MediaSource.isTypeSupported() returning true implies that HTMLMedia Element.canPlayType() will return "maybe" or "probably" |
| 252 // since it does not make sense for a MediaSource to support a type the HTML MediaElement knows it cannot play. | 254 // since it does not make sense for a MediaSource to support a type the HTML MediaElement knows it cannot play. |
| 253 if (HTMLMediaElement::supportsType(contentType) == WebMimeRegistry::IsNotSup ported) { | 255 if (HTMLMediaElement::supportsType(contentType) == WebMimeRegistry::IsNotSup ported) { |
| 254 WTF_LOG(Media, "MediaSource::isTypeSupported(%s) -> false (not supported by HTMLMediaElement)", type.ascii().data()); | 256 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") -> fa lse (not supported by HTMLMediaElement)"; |
| 255 return false; | 257 return false; |
| 256 } | 258 } |
| 257 | 259 |
| 258 // 3. If type contains a media type or media subtype that the MediaSource do es not support, then return false. | 260 // 3. If type contains a media type or media subtype that the MediaSource do es not support, then return false. |
| 259 // 4. If type contains at a codec that the MediaSource does not support, the n return false. | 261 // 4. If type contains at a codec that the MediaSource does not support, the n return false. |
| 260 // 5. If the MediaSource does not support the specified combination of media type, media subtype, and codecs then return false. | 262 // 5. If the MediaSource does not support the specified combination of media type, media subtype, and codecs then return false. |
| 261 // 6. Return true. | 263 // 6. Return true. |
| 262 bool result = MIMETypeRegistry::isSupportedMediaSourceMIMEType(contentType.t ype(), codecs); | 264 bool result = MIMETypeRegistry::isSupportedMediaSourceMIMEType(contentType.t ype(), codecs); |
| 263 WTF_LOG(Media, "MediaSource::isTypeSupported(%s) -> %s", type.ascii().data() , result ? "true" : "false"); | 265 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << type << ") -> " << ( result ? "true" : "false"); |
| 264 return result; | 266 return result; |
| 265 } | 267 } |
| 266 | 268 |
| 267 const AtomicString& MediaSource::interfaceName() const | 269 const AtomicString& MediaSource::interfaceName() const |
| 268 { | 270 { |
| 269 return EventTargetNames::MediaSource; | 271 return EventTargetNames::MediaSource; |
| 270 } | 272 } |
| 271 | 273 |
| 272 ExecutionContext* MediaSource::getExecutionContext() const | 274 ExecutionContext* MediaSource::getExecutionContext() const |
| 273 { | 275 { |
| 274 return ActiveDOMObject::getExecutionContext(); | 276 return ActiveDOMObject::getExecutionContext(); |
| 275 } | 277 } |
| 276 | 278 |
| 277 DEFINE_TRACE(MediaSource) | 279 DEFINE_TRACE(MediaSource) |
| 278 { | 280 { |
| 279 visitor->trace(m_asyncEventQueue); | 281 visitor->trace(m_asyncEventQueue); |
| 280 visitor->trace(m_attachedElement); | 282 visitor->trace(m_attachedElement); |
| 281 visitor->trace(m_sourceBuffers); | 283 visitor->trace(m_sourceBuffers); |
| 282 visitor->trace(m_activeSourceBuffers); | 284 visitor->trace(m_activeSourceBuffers); |
| 283 EventTargetWithInlineData::trace(visitor); | 285 EventTargetWithInlineData::trace(visitor); |
| 284 ActiveDOMObject::trace(visitor); | 286 ActiveDOMObject::trace(visitor); |
| 285 } | 287 } |
| 286 | 288 |
| 287 void MediaSource::setWebMediaSourceAndOpen(PassOwnPtr<WebMediaSource> webMediaSo urce) | 289 void MediaSource::setWebMediaSourceAndOpen(PassOwnPtr<WebMediaSource> webMediaSo urce) |
| 288 { | 290 { |
| 289 TRACE_EVENT_ASYNC_END0("media", "MediaSource::attachToElement", this); | 291 TRACE_EVENT_ASYNC_END0("media", "MediaSource::attachToElement", this); |
| 290 ASSERT(webMediaSource); | 292 DCHECK(webMediaSource); |
| 291 ASSERT(!m_webMediaSource); | 293 DCHECK(!m_webMediaSource); |
| 292 ASSERT(m_attachedElement); | 294 DCHECK(m_attachedElement); |
| 293 m_webMediaSource = std::move(webMediaSource); | 295 m_webMediaSource = std::move(webMediaSource); |
| 294 setReadyState(openKeyword()); | 296 setReadyState(openKeyword()); |
| 295 } | 297 } |
| 296 | 298 |
| 297 void MediaSource::addedToRegistry() | 299 void MediaSource::addedToRegistry() |
| 298 { | 300 { |
| 299 ASSERT(!m_isAddedToRegistry); | 301 DCHECK(!m_isAddedToRegistry); |
| 300 m_isAddedToRegistry = true; | 302 m_isAddedToRegistry = true; |
| 301 } | 303 } |
| 302 | 304 |
| 303 void MediaSource::removedFromRegistry() | 305 void MediaSource::removedFromRegistry() |
| 304 { | 306 { |
| 305 ASSERT(m_isAddedToRegistry); | 307 DCHECK(m_isAddedToRegistry); |
| 306 m_isAddedToRegistry = false; | 308 m_isAddedToRegistry = false; |
| 307 } | 309 } |
| 308 | 310 |
| 309 double MediaSource::duration() const | 311 double MediaSource::duration() const |
| 310 { | 312 { |
| 311 return isClosed() ? std::numeric_limits<float>::quiet_NaN() : m_webMediaSour ce->duration(); | 313 return isClosed() ? std::numeric_limits<float>::quiet_NaN() : m_webMediaSour ce->duration(); |
| 312 } | 314 } |
| 313 | 315 |
| 314 TimeRanges* MediaSource::buffered() const | 316 TimeRanges* MediaSource::buffered() const |
| 315 { | 317 { |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 436 // 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: | 438 // 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 // NOTE: Currently we assume that the media engine is able to render partial frames/cues. If a media | 439 // NOTE: Currently we assume that the media engine is able to render partial frames/cues. If a media |
| 438 // engine gets added that doesn't support this, then we'll need to add logic to handle the substeps. | 440 // engine gets added that doesn't support this, then we'll need to add logic to handle the substeps. |
| 439 | 441 |
| 440 // 6. Update the media controller duration to new duration and run the HTMLM ediaElement duration change algorithm. | 442 // 6. Update the media controller duration to new duration and run the HTMLM ediaElement duration change algorithm. |
| 441 m_attachedElement->durationChanged(newDuration, requestSeek); | 443 m_attachedElement->durationChanged(newDuration, requestSeek); |
| 442 } | 444 } |
| 443 | 445 |
| 444 void MediaSource::setReadyState(const AtomicString& state) | 446 void MediaSource::setReadyState(const AtomicString& state) |
| 445 { | 447 { |
| 446 ASSERT(state == openKeyword() || state == closedKeyword() || state == endedK eyword()); | 448 DCHECK(state == openKeyword() || state == closedKeyword() || state == endedK eyword()); |
| 447 | 449 |
| 448 AtomicString oldState = readyState(); | 450 AtomicString oldState = readyState(); |
| 449 WTF_LOG(Media, "MediaSource::setReadyState() %p : %s -> %s", this, oldState. ascii().data(), state.ascii().data()); | 451 DVLOG(MEDIA_SOURCE_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")" << " : " << oldState << " -> " << state; |
| 450 | 452 |
| 451 if (state == closedKeyword()) { | 453 if (state == closedKeyword()) { |
| 452 m_webMediaSource.clear(); | 454 m_webMediaSource.clear(); |
| 453 m_attachedElement.clear(); | 455 m_attachedElement.clear(); |
| 454 } | 456 } |
| 455 | 457 |
| 456 if (oldState == state) | 458 if (oldState == state) |
| 457 return; | 459 return; |
| 458 | 460 |
| 459 m_readyState = state; | 461 m_readyState = state; |
| 460 | 462 |
| 461 onReadyStateChange(oldState, state); | 463 onReadyStateChange(oldState, state); |
| 462 } | 464 } |
| 463 | 465 |
| 464 void MediaSource::endOfStream(const AtomicString& error, ExceptionState& excepti onState) | 466 void MediaSource::endOfStream(const AtomicString& error, ExceptionState& excepti onState) |
| 465 { | 467 { |
| 466 DEFINE_STATIC_LOCAL(const AtomicString, network, ("network")); | 468 DEFINE_STATIC_LOCAL(const AtomicString, network, ("network")); |
| 467 DEFINE_STATIC_LOCAL(const AtomicString, decode, ("decode")); | 469 DEFINE_STATIC_LOCAL(const AtomicString, decode, ("decode")); |
| 468 | 470 |
| 469 if (error == network) { | 471 if (error == network) { |
| 470 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNetworkError, excep tionState); | 472 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNetworkError, excep tionState); |
| 471 } else if (error == decode) { | 473 } else if (error == decode) { |
| 472 endOfStreamInternal(WebMediaSource::EndOfStreamStatusDecodeError, except ionState); | 474 endOfStreamInternal(WebMediaSource::EndOfStreamStatusDecodeError, except ionState); |
| 473 } else { | 475 } else { |
| 474 ASSERT_NOT_REACHED(); // IDL enforcement should prevent this case. | 476 NOTREACHED(); // IDL enforcement should prevent this case. |
| 475 } | 477 } |
| 476 } | 478 } |
| 477 | 479 |
| 478 void MediaSource::endOfStream(ExceptionState& exceptionState) | 480 void MediaSource::endOfStream(ExceptionState& exceptionState) |
| 479 { | 481 { |
| 480 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNoError, exceptionState ); | 482 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNoError, exceptionState ); |
| 481 } | 483 } |
| 482 | 484 |
| 483 void MediaSource::endOfStreamInternal(const WebMediaSource::EndOfStreamStatus eo sStatus, ExceptionState& exceptionState) | 485 void MediaSource::endOfStreamInternal(const WebMediaSource::EndOfStreamStatus eo sStatus, ExceptionState& exceptionState) |
| 484 { | 486 { |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 499 m_webMediaSource->markEndOfStream(eosStatus); | 501 m_webMediaSource->markEndOfStream(eosStatus); |
| 500 } | 502 } |
| 501 | 503 |
| 502 bool MediaSource::isOpen() const | 504 bool MediaSource::isOpen() const |
| 503 { | 505 { |
| 504 return readyState() == openKeyword(); | 506 return readyState() == openKeyword(); |
| 505 } | 507 } |
| 506 | 508 |
| 507 void MediaSource::setSourceBufferActive(SourceBuffer* sourceBuffer) | 509 void MediaSource::setSourceBufferActive(SourceBuffer* sourceBuffer) |
| 508 { | 510 { |
| 509 ASSERT(!m_activeSourceBuffers->contains(sourceBuffer)); | 511 DCHECK(!m_activeSourceBuffers->contains(sourceBuffer)); |
| 510 | 512 |
| 511 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-MediaSource-activeSourceBuffers | 513 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-MediaSource-activeSourceBuffers |
| 512 // SourceBuffer objects in SourceBuffer.activeSourceBuffers must appear in | 514 // SourceBuffer objects in SourceBuffer.activeSourceBuffers must appear in |
| 513 // the same order as they appear in SourceBuffer.sourceBuffers. | 515 // the same order as they appear in SourceBuffer.sourceBuffers. |
| 514 // SourceBuffer transitions to active are not guaranteed to occur in the | 516 // SourceBuffer transitions to active are not guaranteed to occur in the |
| 515 // same order as buffers in |m_sourceBuffers|, so this method needs to | 517 // same order as buffers in |m_sourceBuffers|, so this method needs to |
| 516 // insert |sourceBuffer| into |m_activeSourceBuffers|. | 518 // insert |sourceBuffer| into |m_activeSourceBuffers|. |
| 517 size_t indexInSourceBuffers = m_sourceBuffers->find(sourceBuffer); | 519 size_t indexInSourceBuffers = m_sourceBuffers->find(sourceBuffer); |
| 518 ASSERT(indexInSourceBuffers != kNotFound); | 520 DCHECK(indexInSourceBuffers != kNotFound); |
| 519 | 521 |
| 520 size_t insertPosition = 0; | 522 size_t insertPosition = 0; |
| 521 while (insertPosition < m_activeSourceBuffers->length() | 523 while (insertPosition < m_activeSourceBuffers->length() |
| 522 && m_sourceBuffers->find(m_activeSourceBuffers->item(insertPosition)) < indexInSourceBuffers) { | 524 && m_sourceBuffers->find(m_activeSourceBuffers->item(insertPosition)) < indexInSourceBuffers) { |
| 523 ++insertPosition; | 525 ++insertPosition; |
| 524 } | 526 } |
| 525 | 527 |
| 526 m_activeSourceBuffers->insert(insertPosition, sourceBuffer); | 528 m_activeSourceBuffers->insert(insertPosition, sourceBuffer); |
| 527 } | 529 } |
| 528 | 530 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 539 void MediaSource::close() | 541 void MediaSource::close() |
| 540 { | 542 { |
| 541 setReadyState(closedKeyword()); | 543 setReadyState(closedKeyword()); |
| 542 } | 544 } |
| 543 | 545 |
| 544 bool MediaSource::attachToElement(HTMLMediaElement* element) | 546 bool MediaSource::attachToElement(HTMLMediaElement* element) |
| 545 { | 547 { |
| 546 if (m_attachedElement) | 548 if (m_attachedElement) |
| 547 return false; | 549 return false; |
| 548 | 550 |
| 549 ASSERT(isClosed()); | 551 DCHECK(isClosed()); |
| 550 | 552 |
| 551 TRACE_EVENT_ASYNC_BEGIN0("media", "MediaSource::attachToElement", this); | 553 TRACE_EVENT_ASYNC_BEGIN0("media", "MediaSource::attachToElement", this); |
| 552 m_attachedElement = element; | 554 m_attachedElement = element; |
| 553 return true; | 555 return true; |
| 554 } | 556 } |
| 555 | 557 |
| 556 void MediaSource::openIfInEndedState() | 558 void MediaSource::openIfInEndedState() |
| 557 { | 559 { |
| 558 if (m_readyState != endedKeyword()) | 560 if (m_readyState != endedKeyword()) |
| 559 return; | 561 return; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 578 } | 580 } |
| 579 | 581 |
| 580 PassOwnPtr<WebSourceBuffer> MediaSource::createWebSourceBuffer(const String& typ e, const String& codecs, ExceptionState& exceptionState) | 582 PassOwnPtr<WebSourceBuffer> MediaSource::createWebSourceBuffer(const String& typ e, const String& codecs, ExceptionState& exceptionState) |
| 581 { | 583 { |
| 582 WebSourceBuffer* webSourceBuffer = 0; | 584 WebSourceBuffer* webSourceBuffer = 0; |
| 583 | 585 |
| 584 switch (m_webMediaSource->addSourceBuffer(type, codecs, &webSourceBuffer)) { | 586 switch (m_webMediaSource->addSourceBuffer(type, codecs, &webSourceBuffer)) { |
| 585 case WebMediaSource::AddStatusOk: | 587 case WebMediaSource::AddStatusOk: |
| 586 return adoptPtr(webSourceBuffer); | 588 return adoptPtr(webSourceBuffer); |
| 587 case WebMediaSource::AddStatusNotSupported: | 589 case WebMediaSource::AddStatusNotSupported: |
| 588 ASSERT(!webSourceBuffer); | 590 DCHECK(!webSourceBuffer); |
| 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 | 591 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/m edia-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type |
| 590 // Step 2: If type contains a MIME type ... that is not supported with t he types | 592 // Step 2: If type contains a MIME type ... that is not supported with t he types |
| 591 // specified for the other SourceBuffer objects in sourceBuffers, then t hrow | 593 // specified for the other SourceBuffer objects in sourceBuffers, then t hrow |
| 592 // a NotSupportedError exception and abort these steps. | 594 // a NotSupportedError exception and abort these steps. |
| 593 logAndThrowDOMException(exceptionState, NotSupportedError, "The type pro vided ('" + type + "') is not supported."); | 595 logAndThrowDOMException(exceptionState, NotSupportedError, "The type pro vided ('" + type + "') is not supported."); |
| 594 return nullptr; | 596 return nullptr; |
| 595 case WebMediaSource::AddStatusReachedIdLimit: | 597 case WebMediaSource::AddStatusReachedIdLimit: |
| 596 ASSERT(!webSourceBuffer); | 598 DCHECK(!webSourceBuffer); |
| 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 | 599 // 2.2 https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/m edia-source.html#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type |
| 598 // Step 3: If the user agent can't handle any more SourceBuffer objects then throw | 600 // Step 3: If the user agent can't handle any more SourceBuffer objects then throw |
| 599 // a QuotaExceededError exception and abort these steps. | 601 // a QuotaExceededError exception and abort these steps. |
| 600 logAndThrowDOMException(exceptionState, QuotaExceededError, "This MediaS ource has reached the limit of SourceBuffer objects it can handle. No additional SourceBuffer objects may be added."); | 602 logAndThrowDOMException(exceptionState, QuotaExceededError, "This MediaS ource has reached the limit of SourceBuffer objects it can handle. No additional SourceBuffer objects may be added."); |
| 601 return nullptr; | 603 return nullptr; |
| 602 } | 604 } |
| 603 | 605 |
| 604 ASSERT_NOT_REACHED(); | 606 NOTREACHED(); |
| 605 return nullptr; | 607 return nullptr; |
| 606 } | 608 } |
| 607 | 609 |
| 608 void MediaSource::scheduleEvent(const AtomicString& eventName) | 610 void MediaSource::scheduleEvent(const AtomicString& eventName) |
| 609 { | 611 { |
| 610 ASSERT(m_asyncEventQueue); | 612 DCHECK(m_asyncEventQueue); |
| 611 | 613 |
| 612 Event* event = Event::create(eventName); | 614 Event* event = Event::create(eventName); |
| 613 event->setTarget(this); | 615 event->setTarget(this); |
| 614 | 616 |
| 615 m_asyncEventQueue->enqueueEvent(event); | 617 m_asyncEventQueue->enqueueEvent(event); |
| 616 } | 618 } |
| 617 | 619 |
| 618 URLRegistry& MediaSource::registry() const | 620 URLRegistry& MediaSource::registry() const |
| 619 { | 621 { |
| 620 return MediaSourceRegistry::registry(); | 622 return MediaSourceRegistry::registry(); |
| 621 } | 623 } |
| 622 | 624 |
| 623 } // namespace blink | 625 } // namespace blink |
| OLD | NEW |