- 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;