Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1807)

Unified Diff: Source/modules/mediasource/SourceBuffer.cpp

Issue 130523002: Preliminary work for unprefixed MSE SourceBuffer.mode manipulation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Use assert_equals instead of assert_true(...==...) Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/modules/mediasource/SourceBuffer.h ('k') | Source/modules/mediasource/SourceBuffer.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/mediasource/SourceBuffer.cpp
diff --git a/Source/modules/mediasource/SourceBuffer.cpp b/Source/modules/mediasource/SourceBuffer.cpp
index 4c08f27d9534a53f88bd14b99e547062ce90292f..097f9b5438951d589ef1da3acb296b0c5d1c8a80 100644
--- a/Source/modules/mediasource/SourceBuffer.cpp
+++ b/Source/modules/mediasource/SourceBuffer.cpp
@@ -65,6 +65,7 @@ SourceBuffer::SourceBuffer(PassOwnPtr<WebSourceBuffer> webSourceBuffer, MediaSou
, m_webSourceBuffer(webSourceBuffer)
, m_source(source)
, m_asyncEventQueue(asyncEventQueue)
+ , m_mode(segmentsKeyword())
, m_updating(false)
, m_timestampOffset(0)
, m_appendWindowStart(0)
@@ -89,6 +90,57 @@ SourceBuffer::~SourceBuffer()
ASSERT(!m_stream);
}
+const AtomicString& SourceBuffer::segmentsKeyword()
+{
+ DEFINE_STATIC_LOCAL(const AtomicString, segments, ("segments", AtomicString::ConstructFromLiteral));
+ return segments;
+}
+
+const AtomicString& SourceBuffer::sequenceKeyword()
+{
+ DEFINE_STATIC_LOCAL(const AtomicString, sequence, ("sequence", AtomicString::ConstructFromLiteral));
+ return sequence;
+}
+
+void SourceBuffer::setMode(const AtomicString& newMode, ExceptionState& exceptionState)
+{
+ // Section 3.1 On setting mode attribute steps.
+ // 1. Let new mode equal the new value being assigned to this attribute.
+ // 2. If new mode does not equal "segments" or "sequence", then throw an INVALID_ACCESS_ERR exception and abort
+ // these steps.
+ if (newMode != segmentsKeyword() && newMode != sequenceKeyword()) {
+ exceptionState.throwUninformativeAndGenericDOMException(InvalidAccessError);
+ return;
+ }
+
+ // 3. If this object has been removed from the sourceBuffers attribute of the parent media source, then throw
+ // an INVALID_STATE_ERR exception and abort these steps.
+ // 4. If the updating attribute equals true, then throw an INVALID_STATE_ERR exception and abort these steps.
+ if (isRemoved() || m_updating) {
+ exceptionState.throwUninformativeAndGenericDOMException(InvalidStateError);
+ return;
+ }
+
+ // 5. If the readyState attribute of the parent media source is in the "ended" state then run the following steps:
+ // 5.1 Set the readyState attribute of the parent media source to "open"
+ // 5.2 Queue a task to fire a simple event named sourceopen at the parent media source.
+ m_source->openIfInEndedState();
+
+ // 6. If the append state equals PARSING_MEDIA_SEGMENT, then throw an INVALID_STATE_ERR and abort these steps.
+ // 7. If the new mode equals "sequence", then set the group start timestamp to the highest presentation end timestamp.
+ // FIXME: Remove default no-op implementation once these steps are landed in Chromium. See http://crbug.com/249422.
acolwell GONE FROM CHROMIUM 2014/01/10 22:09:34 nit: Remove this comment since nothing needs to ch
wolenetz 2014/01/10 23:06:50 Done.
+ WebSourceBuffer::AppendMode appendMode = WebSourceBuffer::AppendModeSegments;
+ if (newMode == sequenceKeyword())
+ appendMode = WebSourceBuffer::AppendModeSequence;
+ if (!m_webSourceBuffer->setMode(appendMode)) {
+ exceptionState.throwUninformativeAndGenericDOMException(InvalidStateError);
+ return;
+ }
+
+ // 8. Update the attribute to new mode.
+ m_mode = newMode;
+}
+
PassRefPtr<TimeRanges> SourceBuffer::buffered(ExceptionState& exceptionState) const
{
// Section 3.1 buffered attribute steps.
@@ -128,7 +180,7 @@ void SourceBuffer::setTimestampOffset(double offset, ExceptionState& exceptionSt
// 5. If this object is waiting for the end of a media segment to be appended, then throw an InvalidStateError
// and abort these steps.
//
- // FIXME: Add step 6 text when mode attribute is implemented.
+ // FIXME: Add step 6 text when mode attribute is implemented. See http://crbug.com/249422.
acolwell GONE FROM CHROMIUM 2014/01/10 22:09:34 nit: Might as well just add the step 6 text now si
wolenetz 2014/01/10 23:06:50 Done, including updating step 5's text to current
if (!m_webSourceBuffer->setTimestampOffset(offset)) {
exceptionState.throwUninformativeAndGenericDOMException(InvalidStateError);
return;
« no previous file with comments | « Source/modules/mediasource/SourceBuffer.h ('k') | Source/modules/mediasource/SourceBuffer.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698