Title: [236314] trunk
Revision
236314
Author
[email protected]
Date
2018-09-21 06:47:48 -0700 (Fri, 21 Sep 2018)

Log Message

[MSE] Fix comparsion with uninitialized greatestDecodeDuration
https://bugs.webkit.org/show_bug.cgi?id=189805

Reviewed by Michael Catanzaro.

This bug was causing greatestDecodeDuration to never be initialized,
which in turned caused unintended frame erase as distant appends where
not being recognized as distinct coded frame groups.

A test reproducing the sequence of appends that caused unintended
frame deletion has also been added (media-source-append-out-of-order.html).

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

Modified Paths

Added Paths

Diff

Added: trunk/LayoutTests/media/media-source/media-source-append-out-of-order-expected.txt (0 => 236314)


--- trunk/LayoutTests/media/media-source/media-source-append-out-of-order-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-append-out-of-order-expected.txt	2018-09-21 13:47:48 UTC (rev 236314)
@@ -0,0 +1,21 @@
+
+EXPECTED (source.readyState == 'closed') OK
+EVENT(sourceopen)
+RUN(sourceBuffer = source.addSourceBuffer("video/mock; codecs=mock"))
+RUN(sourceBuffer.appendBuffer(initSegment))
+EVENT(updateend)
+EXPECTED (sourceBuffer.buffered.length == '0') OK
+RUN(sourceBuffer.appendBuffer(syncSampleRun(10, 20)))
+EVENT(updateend)
+EXPECTED (formatRanges(sourceBuffer.buffered) == '[10, 20)') OK
+RUN(sourceBuffer.appendBuffer(syncSampleRun(0, 10)))
+EVENT(updateend)
+EXPECTED (formatRanges(sourceBuffer.buffered) == '[0, 20)') OK
+RUN(sourceBuffer.appendBuffer(syncSampleRun(30, 40)))
+EVENT(updateend)
+EXPECTED (formatRanges(sourceBuffer.buffered) == '[0, 20) [30, 40)') OK
+RUN(sourceBuffer.appendBuffer(syncSampleRun(20, 30)))
+EVENT(updateend)
+EXPECTED (formatRanges(sourceBuffer.buffered) == '[0, 40)') OK
+END OF TEST
+

Added: trunk/LayoutTests/media/media-source/media-source-append-out-of-order.html (0 => 236314)


--- trunk/LayoutTests/media/media-source/media-source-append-out-of-order.html	                        (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-append-out-of-order.html	2018-09-21 13:47:48 UTC (rev 236314)
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>mock-media-source</title>
+    <script src=""
+    <script src=""
+    <script>
+    var source;
+    var sourceBuffer;
+    var initSegment;
+
+    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 syncSampleRun(start, end) {
+        const samples = [];
+        for (let time = start; time < end; time++)
+            samples.push(makeASample(time, time, 1, 1, time === start ? SAMPLE_FLAG.SYNC : SAMPLE_FLAG.NONE));
+        return concatenateSamples(samples);
+    }
+
+    function formatRanges(buffered) {
+        function rangesToArray(ranges) {
+            const ret = [];
+            for (let i = 0; i < ranges.length; i++) {
+                ret.push({start: ranges.start(i), end: ranges.end(i)});
+            }
+            return ret;
+        }
+
+        return rangesToArray(buffered)
+            .map(range => `[${range.start}, ${range.end})`)
+            .join(' ');
+    }
+
+    function sourceOpen()
+    {
+        run('sourceBuffer = source.addSourceBuffer("video/mock; codecs=mock")');
+        waitForEventOn(sourceBuffer, 'updateend', loadSamples10_20, false, true);
+        initSegment = makeAInit(8, [makeATrack(1, 'mock', TRACK_KIND.VIDEO)]);
+        run('sourceBuffer.appendBuffer(initSegment)');
+    }
+
+    function loadSamples10_20()
+    {
+        testExpected('sourceBuffer.buffered.length', 0);
+
+        waitForEventOn(sourceBuffer, 'updateend', loadSamples0_10, false, true);
+        run('sourceBuffer.appendBuffer(syncSampleRun(10, 20))');
+    }
+
+    function loadSamples0_10() {
+        testExpected('formatRanges(sourceBuffer.buffered)', '[10, 20)');
+
+        waitForEventOn(sourceBuffer, 'updateend', loadSamples30_40, false, true);
+        run('sourceBuffer.appendBuffer(syncSampleRun(0, 10))');
+    }
+
+    function loadSamples30_40() {
+        testExpected('formatRanges(sourceBuffer.buffered)', '[0, 20)');
+
+        waitForEventOn(sourceBuffer, 'updateend', loadSamples20_30, false, true);
+        run('sourceBuffer.appendBuffer(syncSampleRun(30, 40))');
+    }
+
+    function loadSamples20_30() {
+        testExpected('formatRanges(sourceBuffer.buffered)', '[0, 20) [30, 40)');
+
+        waitForEventOn(sourceBuffer, 'updateend', loadedAllSamples, false, true);
+        run('sourceBuffer.appendBuffer(syncSampleRun(20, 30))');
+    }
+
+    function loadedAllSamples()
+    {
+        testExpected('formatRanges(sourceBuffer.buffered)', '[0, 40)');
+        endTest();
+    }
+    </script>
+</head>
+<body _onload_="runTest()">
+    <video></video>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (236313 => 236314)


--- trunk/Source/WebCore/ChangeLog	2018-09-21 13:14:27 UTC (rev 236313)
+++ trunk/Source/WebCore/ChangeLog	2018-09-21 13:47:48 UTC (rev 236314)
@@ -1,3 +1,20 @@
+2018-09-21  Alicia Boya GarcĂ­a  <[email protected]>
+
+        [MSE] Fix comparsion with uninitialized greatestDecodeDuration
+        https://bugs.webkit.org/show_bug.cgi?id=189805
+
+        Reviewed by Michael Catanzaro.
+
+        This bug was causing greatestDecodeDuration to never be initialized,
+        which in turned caused unintended frame erase as distant appends where
+        not being recognized as distinct coded frame groups.
+
+        A test reproducing the sequence of appends that caused unintended
+        frame deletion has also been added (media-source-append-out-of-order.html).
+
+        * Modules/mediasource/SourceBuffer.cpp:
+        (WebCore::SourceBuffer::sourceBufferPrivateDidReceiveSample):
+
 2018-09-21  Antoine Quint  <[email protected]>
 
         [Web Animations] Accelerated animations don't get suspended

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (236313 => 236314)


--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2018-09-21 13:14:27 UTC (rev 236313)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2018-09-21 13:47:48 UTC (rev 236314)
@@ -1694,7 +1694,7 @@
         // to the decoded duration. When comparing deltas between decode timestamps, the decode duration, not the presentation.
         if (trackBuffer.lastDecodeTimestamp.isValid()) {
             MediaTime lastDecodeDuration = decodeTimestamp - trackBuffer.lastDecodeTimestamp;
-            if (lastDecodeDuration > trackBuffer.greatestDecodeDuration)
+            if (!trackBuffer.greatestDecodeDuration.isValid() || lastDecodeDuration > trackBuffer.greatestDecodeDuration)
                 trackBuffer.greatestDecodeDuration = lastDecodeDuration;
         }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to