SourceBuffer* MediaSource::addSourceBuffer(const String& type, ExceptionCode& ec) { LOG(MediaSource, "MediaSource::addSourceBuffer(%s) %p", type.ascii().data(), this); // 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()) { ec = INVALID_ACCESS_ERR; return nullptr; } // 2. If type contains a MIME type that is not supported ..., then throw a // NOT_SUPPORTED_ERR exception and abort these steps. if (!isTypeSupported(type)) { ec = NOT_SUPPORTED_ERR; return nullptr; } // 4. If the readyState attribute is not in the "open" state then throw an // INVALID_STATE_ERR exception and abort these steps. if (!isOpen()) { ec = INVALID_STATE_ERR; return nullptr; } // 5. Create a new SourceBuffer object and associated resources. ContentType contentType(type); RefPtr<SourceBufferPrivate> sourceBufferPrivate = createSourceBufferPrivate(contentType, ec); 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<SourceBuffer> buffer = SourceBuffer::create(sourceBufferPrivate.releaseNonNull(), this); // 6. Add the new object to sourceBuffers and fire a addsourcebuffer on that object. m_sourceBuffers->add(buffer); regenerateActiveSourceBuffers(); // 7. Return the new object to the caller. return buffer.get(); }
void MediaSource::sourceBufferDidChangeActiveState(SourceBuffer&, bool) { regenerateActiveSourceBuffers(); }
SourceBuffer* MediaSource::addSourceBuffer(const String& type, ExceptionCode& ec) { LOG(MediaSource, "MediaSource::addSourceBuffer(%s) %p", type.ascii().data(), this); // 2.2 http://www.w3.org/TR/media-source/#widl-MediaSource-addSourceBuffer-SourceBuffer-DOMString-type // When this method is invoked, the user agent must run the following steps: // 1. If type is an empty string then throw a TypeError exception and abort these steps. if (type.isEmpty()) { ec = TypeError; return nullptr; } // 2. If type contains a MIME type that is not supported ..., then throw a // NOT_SUPPORTED_ERR exception and abort these steps. if (!isTypeSupported(type)) { ec = NOT_SUPPORTED_ERR; return nullptr; } // 4. If the readyState attribute is not in the "open" state then throw an // INVALID_STATE_ERR exception and abort these steps. if (!isOpen()) { ec = INVALID_STATE_ERR; return nullptr; } // 5. Create a new SourceBuffer object and associated resources. ContentType contentType(type); RefPtr<SourceBufferPrivate> sourceBufferPrivate = createSourceBufferPrivate(contentType, ec); 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 nullptr; } Ref<SourceBuffer> buffer = SourceBuffer::create(sourceBufferPrivate.releaseNonNull(), this); // 6. Set the generate timestamps flag on the new object to the value in the "Generate Timestamps Flag" // column of the byte stream format registry [MSE-REGISTRY] entry that is associated with type. // NOTE: In the current byte stream format registry <http://www.w3.org/2013/12/byte-stream-format-registry/> // only the "MPEG Audio Byte Stream Format" has the "Generate Timestamps Flag" value set. bool shouldGenerateTimestamps = contentType.type() == "audio/aac" || contentType.type() == "audio/mpeg"; buffer->setShouldGenerateTimestamps(shouldGenerateTimestamps); // 7. If the generate timestamps flag equals true: // ↳ Set the mode attribute on the new object to "sequence". // Otherwise: // ↳ Set the mode attribute on the new object to "segments". buffer->setMode(shouldGenerateTimestamps ? SourceBuffer::AppendMode::Sequence : SourceBuffer::AppendMode::Segments, IGNORE_EXCEPTION); SourceBuffer* result = buffer.ptr(); // 8. Add the new object to sourceBuffers and fire a addsourcebuffer on that object. m_sourceBuffers->add(WTFMove(buffer)); regenerateActiveSourceBuffers(); // 9. Return the new object to the caller. return result; }