Title: [171151] trunk/Source/WebCore
Revision
171151
Author
jer.no...@apple.com
Date
2014-07-16 13:51:19 -0700 (Wed, 16 Jul 2014)

Log Message

[MSE] http/tests/media/media-source/mediasource-buffered.html is flakey
https://bugs.webkit.org/show_bug.cgi?id=134949

Reviewed by Eric Carlson.

Depending on which SourceBuffer is successfully parsed first, the order of activeSourceBuffers
may change from run to run, breaking the http/tests/media/media-source/mediasource-buffered.html
test. Make the order of activeSourceBuffers the same as (a subset of) sourceBuffers, by replacing
calls to activeSourceBuffers->add() and with a new call to regenerateActiveSourceBuffers(), which
swaps the contents of the SourceBufferList with a new, ordered Vector.

* Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::addSourceBuffer):
(WebCore::MediaSource::sourceBufferDidChangeAcitveState):
(WebCore::MediaSource::regenerateActiveSourceBuffers):
* Modules/mediasource/MediaSource.h:
* Modules/mediasource/SourceBufferList.cpp:
(WebCore::SourceBufferList::swap):
* Modules/mediasource/SourceBufferList.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (171150 => 171151)


--- trunk/Source/WebCore/ChangeLog	2014-07-16 20:31:06 UTC (rev 171150)
+++ trunk/Source/WebCore/ChangeLog	2014-07-16 20:51:19 UTC (rev 171151)
@@ -1,3 +1,25 @@
+2014-07-16  Jer Noble  <jer.no...@apple.com>
+
+        [MSE] http/tests/media/media-source/mediasource-buffered.html is flakey
+        https://bugs.webkit.org/show_bug.cgi?id=134949
+
+        Reviewed by Eric Carlson.
+
+        Depending on which SourceBuffer is successfully parsed first, the order of activeSourceBuffers
+        may change from run to run, breaking the http/tests/media/media-source/mediasource-buffered.html
+        test. Make the order of activeSourceBuffers the same as (a subset of) sourceBuffers, by replacing
+        calls to activeSourceBuffers->add() and with a new call to regenerateActiveSourceBuffers(), which
+        swaps the contents of the SourceBufferList with a new, ordered Vector.
+
+        * Modules/mediasource/MediaSource.cpp:
+        (WebCore::MediaSource::addSourceBuffer):
+        (WebCore::MediaSource::sourceBufferDidChangeAcitveState):
+        (WebCore::MediaSource::regenerateActiveSourceBuffers):
+        * Modules/mediasource/MediaSource.h:
+        * Modules/mediasource/SourceBufferList.cpp:
+        (WebCore::SourceBufferList::swap):
+        * Modules/mediasource/SourceBufferList.h:
+
 2014-07-16  Mike West  <mk...@chromium.org>
 
         CSP: Drop 'script-nonce' directive.

Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp (171150 => 171151)


--- trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2014-07-16 20:31:06 UTC (rev 171150)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2014-07-16 20:51:19 UTC (rev 171151)
@@ -540,9 +540,8 @@
     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();
 
-    if (buffer->active())
-        m_activeSourceBuffers->add(buffer);
     // 7. Return the new object to the caller.
     return buffer.get();
 }
@@ -745,12 +744,9 @@
     setReadyState(closedKeyword());
 }
 
-void MediaSource::sourceBufferDidChangeAcitveState(SourceBuffer* sourceBuffer, bool active)
+void MediaSource::sourceBufferDidChangeAcitveState(SourceBuffer*, bool)
 {
-    if (active && !m_activeSourceBuffers->contains(sourceBuffer))
-        m_activeSourceBuffers->add(sourceBuffer);
-    else if (!active && m_activeSourceBuffers->contains(sourceBuffer))
-        m_activeSourceBuffers->remove(sourceBuffer);
+    regenerateActiveSourceBuffers();
 }
 
 bool MediaSource::attachToElement(HTMLMediaElement* element)
@@ -869,6 +865,16 @@
     return MediaSourceRegistry::registry();
 }
 
+void MediaSource::regenerateActiveSourceBuffers()
+{
+    Vector<RefPtr<SourceBuffer>> newList;
+    for (auto& sourceBuffer : *m_sourceBuffers) {
+        if (sourceBuffer->active())
+            newList.append(sourceBuffer);
+    }
+    m_activeSourceBuffers->swap(newList);
 }
 
+}
+
 #endif

Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.h (171150 => 171151)


--- trunk/Source/WebCore/Modules/mediasource/MediaSource.h	2014-07-16 20:31:06 UTC (rev 171150)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.h	2014-07-16 20:51:19 UTC (rev 171151)
@@ -123,6 +123,8 @@
     void scheduleEvent(const AtomicString& eventName);
     GenericEventQueue& asyncEventQueue() { return m_asyncEventQueue; }
 
+    void regenerateActiveSourceBuffers();
+
     static URLRegistry* s_registry;
 
     RefPtr<MediaSourcePrivate> m_private;

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBufferList.cpp (171150 => 171151)


--- trunk/Source/WebCore/Modules/mediasource/SourceBufferList.cpp	2014-07-16 20:31:06 UTC (rev 171150)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBufferList.cpp	2014-07-16 20:51:19 UTC (rev 171151)
@@ -70,6 +70,24 @@
     scheduleEvent(eventNames().removesourcebufferEvent);
 }
 
+void SourceBufferList::swap(Vector<RefPtr<SourceBuffer>>& other)
+{
+    int changeInSize = other.size() - m_list.size();
+    int addedEntries = 0;
+    for (auto& sourceBuffer : other) {
+        if (!m_list.contains(sourceBuffer))
+            ++addedEntries;
+    }
+    int removedEntries = addedEntries - changeInSize;
+
+    m_list.swap(other);
+
+    if (addedEntries)
+        scheduleEvent(eventNames().addsourcebufferEvent);
+    if (removedEntries)
+        scheduleEvent(eventNames().removesourcebufferEvent);
+}
+
 void SourceBufferList::scheduleEvent(const AtomicString& eventName)
 {
     RefPtr<Event> event = Event::create(eventName, false, false);

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBufferList.h (171150 => 171151)


--- trunk/Source/WebCore/Modules/mediasource/SourceBufferList.h	2014-07-16 20:31:06 UTC (rev 171150)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBufferList.h	2014-07-16 20:51:19 UTC (rev 171151)
@@ -58,6 +58,7 @@
     void remove(SourceBuffer*);
     bool contains(SourceBuffer* buffer) { return m_list.find(buffer) != notFound; }
     void clear();
+    void swap(Vector<RefPtr<SourceBuffer>>&);
 
     Vector<RefPtr<SourceBuffer>>::iterator begin() { return m_list.begin(); }
     Vector<RefPtr<SourceBuffer>>::iterator end() { return m_list.end(); }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to