Title: [177281] trunk
Revision
177281
Author
[email protected]
Date
2014-12-15 09:29:14 -0800 (Mon, 15 Dec 2014)

Log Message

[MSE] Prevent SourceBuffer monitoring algorithm from triggering a HAVE_NOTHING to HAVE_METADATA transition.
https://bugs.webkit.org/show_bug.cgi?id=139444

Patch by Bartlomiej Gajda <[email protected]> on 2014-12-15
Reviewed by Jer Noble.

Source/WebCore:

In case of 2 SourceBuffers, there can be transition to HaveMetadata from monitorSourceBuffers,
even though second SourceBuffer did not receive init segment - we can't query for it's metadata
such as width/height (if second one was video), so we shouldn't fire the event.
W3 Bug reference : https://www.w3.org/Bugs/Public/show_bug.cgi?id=27542

Test: media/media-source/media-source-loadedmetada-with-two-sourcebuffers.html

* Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::monitorSourceBuffers):
* Modules/mediasource/SourceBuffer.h:
* platform/mock/mediasource/MockMediaPlayerMediaSource.cpp:
(WebCore::mimeTypeCache):

LayoutTests:

Added test to check how many active SourceBuffers exist when loadedmetadata fires,
according to spec 3.5.7, this should be equal to number of sourcebuffers.

* media/media-source/media-source-loadedmetada-with-two-sourcebuffers-expected.txt: Added.
* media/media-source/media-source-loadedmetada-with-two-sourcebuffers.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (177280 => 177281)


--- trunk/LayoutTests/ChangeLog	2014-12-15 17:17:53 UTC (rev 177280)
+++ trunk/LayoutTests/ChangeLog	2014-12-15 17:29:14 UTC (rev 177281)
@@ -1,3 +1,16 @@
+2014-12-15  Bartlomiej Gajda  <[email protected]>
+
+        [MSE] Prevent SourceBuffer monitoring algorithm from triggering a HAVE_NOTHING to HAVE_METADATA transition.
+        https://bugs.webkit.org/show_bug.cgi?id=139444
+
+        Reviewed by Jer Noble.
+
+        Added test to check how many active SourceBuffers exist when loadedmetadata fires,
+        according to spec 3.5.7, this should be equal to number of sourcebuffers.
+
+        * media/media-source/media-source-loadedmetada-with-two-sourcebuffers-expected.txt: Added.
+        * media/media-source/media-source-loadedmetada-with-two-sourcebuffers.html: Added.
+
 2014-12-14  Alexey Proskuryakov  <[email protected]>
 
         Add some more slow tests to TestExpectations.

Added: trunk/LayoutTests/media/media-source/media-source-loadedmetada-with-two-sourcebuffers-expected.txt (0 => 177281)


--- trunk/LayoutTests/media/media-source/media-source-loadedmetada-with-two-sourcebuffers-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-loadedmetada-with-two-sourcebuffers-expected.txt	2014-12-15 17:29:14 UTC (rev 177281)
@@ -0,0 +1,13 @@
+
+RUN(video.src = ""
+EVENT(sourceopen)
+RUN(sourceBuffer1 = source.addSourceBuffer("audio/mock; codecs=mock"))
+RUN(sourceBuffer2 = source.addSourceBuffer("video/mock; codecs=mock"))
+RUN(sourceBuffer1.appendBuffer(initSegment))
+EVENT(updateend)
+RUN(sourceBuffer2.appendBuffer(initSegment))
+EVENT(loadedmetadata)
+EVENT(updateend)
+EXPECTED (source.activeSourceBuffers.length == '2') OK
+END OF TEST
+

Added: trunk/LayoutTests/media/media-source/media-source-loadedmetada-with-two-sourcebuffers.html (0 => 177281)


--- trunk/LayoutTests/media/media-source/media-source-loadedmetada-with-two-sourcebuffers.html	                        (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-loadedmetada-with-two-sourcebuffers.html	2014-12-15 17:29:14 UTC (rev 177281)
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>mock-media-source</title>
+    <script src=""
+    <script src=""
+    <script>
+    var source;
+    var sourceBuffer1;
+    var sourceBuffer2;
+    var counter = 0;
+
+    if (window.internals)
+        internals.initializeMockMediaSource();
+
+    function runTest() {
+        findMediaElement();
+        source = new MediaSource();
+        waitForEvent('sourceopen', sourceOpen, false, false, source);
+        run('video.src = ""
+    }
+
+    function sourceOpen() {
+        run('sourceBuffer1 = source.addSourceBuffer("audio/mock; codecs=mock")');
+        run('sourceBuffer2 = source.addSourceBuffer("video/mock; codecs=mock")');
+
+        waitForEventOn(sourceBuffer1, 'updateend', update1, false, true);
+        waitForEventOn(sourceBuffer2, 'updateend', update2, false, true);
+        waitForEventOnce('loadedmetadata', loadedMetadata);
+
+        initSegment = makeAInit(0, [makeATrack(1, 'mock', TRACK_KIND.AUDIO)]);
+        run('sourceBuffer1.appendBuffer(initSegment)');
+    }
+
+    function update1() {
+        counter++;
+        initSegment = makeAInit(0, [makeATrack(1, 'mock', TRACK_KIND.VIDEO)]);
+        setTimeout(function () {
+            run('sourceBuffer2.appendBuffer(initSegment)');
+        }, 200);
+    }
+
+    function update2() {
+        counter++;
+        setTimeout(function () {
+            if (counter==3) endTest();
+        }, 200);
+    }
+
+    function loadedMetadata() {
+        counter++;
+        setTimeout(function () {
+            testExpected('source.activeSourceBuffers.length', 2);
+            if (counter==3) endTest();
+        }, 200);
+    }
+
+    </script>
+</head>
+<body _onload_="runTest()">
+    <video></video>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (177280 => 177281)


--- trunk/Source/WebCore/ChangeLog	2014-12-15 17:17:53 UTC (rev 177280)
+++ trunk/Source/WebCore/ChangeLog	2014-12-15 17:29:14 UTC (rev 177281)
@@ -1,3 +1,23 @@
+2014-12-15  Bartlomiej Gajda  <[email protected]>
+
+        [MSE] Prevent SourceBuffer monitoring algorithm from triggering a HAVE_NOTHING to HAVE_METADATA transition.
+        https://bugs.webkit.org/show_bug.cgi?id=139444
+
+        Reviewed by Jer Noble.
+
+        In case of 2 SourceBuffers, there can be transition to HaveMetadata from monitorSourceBuffers,
+        even though second SourceBuffer did not receive init segment - we can't query for it's metadata
+        such as width/height (if second one was video), so we shouldn't fire the event.
+        W3 Bug reference : https://www.w3.org/Bugs/Public/show_bug.cgi?id=27542
+
+        Test: media/media-source/media-source-loadedmetada-with-two-sourcebuffers.html
+
+        * Modules/mediasource/MediaSource.cpp:
+        (WebCore::MediaSource::monitorSourceBuffers):
+        * Modules/mediasource/SourceBuffer.h:
+        * platform/mock/mediasource/MockMediaPlayerMediaSource.cpp:
+        (WebCore::mimeTypeCache):
+
 2014-12-15  Gyuyoung Kim  <[email protected]>
 
         Move WebCore/platform/text to std::unique_ptr 

Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp (177280 => 177281)


--- trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2014-12-15 17:17:53 UTC (rev 177280)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2014-12-15 17:29:14 UTC (rev 177281)
@@ -246,6 +246,13 @@
         return;
     }
 
+    // http://w3c.github.io/media-source/#buffer-monitoring, change from 11 December 2014
+    // ↳ If the the HTMLMediaElement.readyState attribute equals HAVE_NOTHING:
+    if (mediaElement()->readyState() == HTMLMediaElement::HAVE_NOTHING) {
+        // 1. Abort these steps.
+        return;
+    }
+
     // ↳ If buffered for all objects in activeSourceBuffers do not contain TimeRanges for the current
     // playback position:
     auto begin = m_activeSourceBuffers->begin();

Modified: trunk/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp (177280 => 177281)


--- trunk/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp	2014-12-15 17:17:53 UTC (rev 177280)
+++ trunk/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp	2014-12-15 17:29:14 UTC (rev 177281)
@@ -57,6 +57,7 @@
     if (!isInitialized) {
         isInitialized = true;
         cache.add(ASCIILiteral("video/mock"));
+        cache.add(ASCIILiteral("audio/mock"));
     }
 
     return cache;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to