Title: [170049] trunk
Revision
170049
Author
[email protected]
Date
2014-06-17 00:43:53 -0700 (Tue, 17 Jun 2014)

Log Message

[MSE] Overwritten samples are removed from buffered ranges using decode times; added samples using presentation times
https://bugs.webkit.org/show_bug.cgi?id=133959

Reviewed by Eric Carlson.

Source/WebCore:
Test: media/media-source/media-source-overlapping-append-buffered.html

Explicitly call presentationTime() on removed samples, rather than implicitly asking for the iterator's "first"
member. When iterating over samples, "first" can either be presentation time, or decode time, depending on which
iteration method is called. In the case of removing samples, this was using the decode time incorrectly.

* Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::sourceBufferPrivateDidReceiveSample):

LayoutTests:
* media/media-source/media-source-overlapping-append-buffered-expected.txt: Added.
* media/media-source/media-source-overlapping-append-buffered.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (170048 => 170049)


--- trunk/LayoutTests/ChangeLog	2014-06-17 07:42:32 UTC (rev 170048)
+++ trunk/LayoutTests/ChangeLog	2014-06-17 07:43:53 UTC (rev 170049)
@@ -1,3 +1,13 @@
+2014-06-17  Jer Noble  <[email protected]>
+
+        [MSE] Overwritten samples are removed from buffered ranges using decode times; added samples using presentation times
+        https://bugs.webkit.org/show_bug.cgi?id=133959
+
+        Reviewed by Eric Carlson.
+
+        * media/media-source/media-source-overlapping-append-buffered-expected.txt: Added.
+        * media/media-source/media-source-overlapping-append-buffered.html: Added.
+
 2014-06-16  Mihnea Ovidenie  <[email protected]>
 
         [CSS Regions] Move the overflow tests to a separate folder

Added: trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered-expected.txt (0 => 170049)


--- trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered-expected.txt	2014-06-17 07:43:53 UTC (rev 170049)
@@ -0,0 +1,15 @@
+
+EXPECTED (source.readyState == 'closed') OK
+EVENT(sourceopen)
+RUN(sourceBuffer = source.addSourceBuffer("video/mock; codecs=mock"))
+RUN(sourceBuffer.appendBuffer(initSegment))
+EVENT(updateend)
+RUN(sourceBuffer.appendBuffer(samples))
+EVENT(updateend)
+RUN(sourceBuffer.appendBuffer(samples))
+EVENT(updateend)
+EXPECTED (video.buffered.length == '1') OK
+EXPECTED (video.buffered.start(0).toFixed(3) == '1') OK
+EXPECTED (video.buffered.end(0).toFixed(3) == '7') OK
+END OF TEST
+

Added: trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered.html (0 => 170049)


--- trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered.html	                        (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered.html	2014-06-17 07:43:53 UTC (rev 170049)
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>mock-media-source</title>
+    <script src=""
+    <script src=""
+    <script>
+    var source;
+    var sourceBuffer;
+    var initSegment;
+    var samples;
+
+    if (window.internals)
+        internals.initializeMockMediaSource();
+
+    function runTest() {
+        findMediaElement();
+
+        source = new MediaSource();
+        testExpected('source.readyState', 'closed');
+
+        waitForEventOn(source, 'sourceopen', sourceOpen);
+        var videoSource = document.createElement('source');
+        videoSource.type = 'video/mock; codecs=mock';
+        videoSource.src = ""
+        video.appendChild(videoSource);
+    }
+
+    function sourceOpen() {
+        run('sourceBuffer = source.addSourceBuffer("video/mock; codecs=mock")');
+        waitForEventOn(sourceBuffer, 'updateend', loadSamples, false, true);
+        initSegment = makeAInit(8, [makeATrack(1, 'mock', TRACK_KIND.VIDEO)]);
+        run('sourceBuffer.appendBuffer(initSegment)');
+    }
+
+    function loadSamples() {
+        samples = concatenateSamples([
+            makeASample(1, 0, 1, 1, SAMPLE_FLAG.SYNC),
+            makeASample(2, 1, 1, 1, SAMPLE_FLAG.NONE),
+            makeASample(3, 2, 1, 1, SAMPLE_FLAG.NONE),
+            makeASample(4, 3, 1, 1, SAMPLE_FLAG.SYNC),
+            makeASample(6, 4, 1, 1, SAMPLE_FLAG.NONE),
+            makeASample(5, 5, 1, 1, SAMPLE_FLAG.NONE),
+        ]);
+        waitForEventOn(sourceBuffer, 'updateend', loadMoreSamples, false, true);
+        run('sourceBuffer.appendBuffer(samples)');
+    }
+
+    function loadMoreSamples() {
+        samples = concatenateSamples([
+            makeASample(1, 0, 1, 1, SAMPLE_FLAG.SYNC),
+            makeASample(2, 1, 1, 1, SAMPLE_FLAG.NONE),
+            makeASample(3, 2, 1, 1, SAMPLE_FLAG.NONE),
+            makeASample(4, 3, 1, 1, SAMPLE_FLAG.SYNC),
+            makeASample(6, 4, 1, 1, SAMPLE_FLAG.NONE),
+            makeASample(5, 5, 1, 1, SAMPLE_FLAG.NONE),
+        ]);
+        waitForEventOn(sourceBuffer, 'updateend', loadComplete, false, true);
+        run('sourceBuffer.appendBuffer(samples)');
+    }
+
+    function loadComplete() {
+        testExpected('video.buffered.length', 1);
+        testExpected('video.buffered.start(0).toFixed(3)', 1);
+        testExpected('video.buffered.end(0).toFixed(3)', 7);
+        endTest();
+    }
+    
+    </script>
+</head>
+<body _onload_="runTest()">
+    <video></video>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (170048 => 170049)


--- trunk/Source/WebCore/ChangeLog	2014-06-17 07:42:32 UTC (rev 170048)
+++ trunk/Source/WebCore/ChangeLog	2014-06-17 07:43:53 UTC (rev 170049)
@@ -1,3 +1,19 @@
+2014-06-17  Jer Noble  <[email protected]>
+
+        [MSE] Overwritten samples are removed from buffered ranges using decode times; added samples using presentation times
+        https://bugs.webkit.org/show_bug.cgi?id=133959
+
+        Reviewed by Eric Carlson.
+
+        Test: media/media-source/media-source-overlapping-append-buffered.html
+
+        Explicitly call presentationTime() on removed samples, rather than implicitly asking for the iterator's "first"
+        member. When iterating over samples, "first" can either be presentation time, or decode time, depending on which
+        iteration method is called. In the case of removing samples, this was using the decode time incorrectly.
+
+        * Modules/mediasource/SourceBuffer.cpp:
+        (WebCore::SourceBuffer::sourceBufferPrivateDidReceiveSample):
+
 2014-06-16  Mihnea Ovidenie  <[email protected]>
 
         [CSSRegions] Region with border radius and overflow:hidden does not clip content

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (170048 => 170049)


--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2014-06-17 07:42:32 UTC (rev 170048)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2014-06-17 07:43:53 UTC (rev 170049)
@@ -1158,16 +1158,16 @@
 
             RefPtr<TimeRanges> erasedRanges = TimeRanges::create();
             for (auto erasedIt = erasedSamples.begin(), end = erasedSamples.end(); erasedIt != end; ++erasedIt) {
-                double startTime = erasedIt->first.toDouble();
-                double endTime = ((erasedIt->first + erasedIt->second->duration()) + microsecond).toDouble();
-                erasedRanges->add(startTime, endTime);
+                MediaTime startTime = erasedIt->second->presentationTime();
+                MediaTime endTime = startTime + erasedIt->second->duration() + microsecond;
+                erasedRanges->add(startTime.toDouble(), endTime.toDouble());
                 trackBuffer.samples.removeSample(erasedIt->second.get());
             }
 
             for (auto dependentIt = dependentSamples.begin(), end = dependentSamples.end(); dependentIt != end; ++dependentIt) {
-                double startTime = dependentIt->first.toDouble();
-                double endTime = ((dependentIt->first + dependentIt->second->duration()) + microsecond).toDouble();
-                erasedRanges->add(startTime, endTime);
+                MediaTime startTime = dependentIt->second->presentationTime();
+                MediaTime endTime = startTime + dependentIt->second->duration() + microsecond;
+                erasedRanges->add(startTime.toDouble(), endTime.toDouble());
                 trackBuffer.samples.removeSample(dependentIt->second.get());
             }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to