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