Title: [236329] releases/WebKitGTK/webkit-2.22
Revision
236329
Author
[email protected]
Date
2018-09-21 10:04:35 -0700 (Fri, 21 Sep 2018)

Log Message

Merge r236314 - [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: releases/WebKitGTK/webkit-2.22/LayoutTests/media/media-source/media-source-append-out-of-order-expected.txt (0 => 236329)


--- releases/WebKitGTK/webkit-2.22/LayoutTests/media/media-source/media-source-append-out-of-order-expected.txt	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.22/LayoutTests/media/media-source/media-source-append-out-of-order-expected.txt	2018-09-21 17:04:35 UTC (rev 236329)
@@ -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: releases/WebKitGTK/webkit-2.22/LayoutTests/media/media-source/media-source-append-out-of-order.html (0 => 236329)


--- releases/WebKitGTK/webkit-2.22/LayoutTests/media/media-source/media-source-append-out-of-order.html	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.22/LayoutTests/media/media-source/media-source-append-out-of-order.html	2018-09-21 17:04:35 UTC (rev 236329)
@@ -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: releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog (236328 => 236329)


--- releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog	2018-09-21 17:04:28 UTC (rev 236328)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog	2018-09-21 17:04:35 UTC (rev 236329)
@@ -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-20  Alicia Boya García  <[email protected]>
 
         [GStreamer][MSE] Add a default sample duration

Modified: releases/WebKitGTK/webkit-2.22/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (236328 => 236329)


--- releases/WebKitGTK/webkit-2.22/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2018-09-21 17:04:28 UTC (rev 236328)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2018-09-21 17:04:35 UTC (rev 236329)
@@ -1629,7 +1629,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