Diff
Modified: trunk/LayoutTests/ChangeLog (270105 => 270106)
--- trunk/LayoutTests/ChangeLog 2020-11-20 12:13:52 UTC (rev 270105)
+++ trunk/LayoutTests/ChangeLog 2020-11-20 12:19:20 UTC (rev 270106)
@@ -1,3 +1,17 @@
+2020-11-20 Philippe Normand <[email protected]>
+
+ [MSE] Infinite loop in sample eviction when duration is NaN
+ https://bugs.webkit.org/show_bug.cgi?id=218228
+
+ Reviewed by Darin Adler.
+
+ * media/media-source/live-rewind-seek-and-evict-expected.txt: Renamed from LayoutTests/platform/glib/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt.
+ * media/media-source/live-rewind-seek-and-evict.html: Added.
+ * media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt:
+ * media/media-source/mock-media-source.js:
+ (makeAInit):
+ * platform/mac/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt: Copied from LayoutTests/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt.
+
2020-11-20 Fujii Hironori <[email protected]>
[TextureMapper] Hidden surface removal issue for nested transform-style:perserve-3d in Snow Stack demo
Copied: trunk/LayoutTests/media/media-source/live-rewind-seek-and-evict-expected.txt (from rev 270103, trunk/LayoutTests/platform/glib/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt) (0 => 270106)
--- trunk/LayoutTests/media/media-source/live-rewind-seek-and-evict-expected.txt (rev 0)
+++ trunk/LayoutTests/media/media-source/live-rewind-seek-and-evict-expected.txt 2020-11-20 12:19:20 UTC (rev 270106)
@@ -0,0 +1,146 @@
+This tests rewind seeks in a live stream. The sample eviction algorithm should attempt to remove some samples without going into an infinite loop.
+EVENT(sourceopen)
+EVENT(updateend)
+EXPECTED (isNaN(source.duration) == 'true') OK
+Appending PTS=120
+EVENT(updateend)
+Appending PTS=121
+EVENT(updateend)
+Appending PTS=122
+EVENT(updateend)
+Appending PTS=123
+EVENT(updateend)
+Appending PTS=124
+EVENT(updateend)
+Appending PTS=125
+EVENT(updateend)
+Appending PTS=126
+EVENT(updateend)
+Appending PTS=127
+EVENT(updateend)
+Appending PTS=128
+EVENT(updateend)
+Appending PTS=129
+EVENT(updateend)
+Appending PTS=130
+EVENT(updateend)
+Appending PTS=131
+EVENT(updateend)
+Appending PTS=132
+EVENT(updateend)
+Appending PTS=133
+EVENT(updateend)
+Appending PTS=134
+EVENT(updateend)
+Appending PTS=135
+EVENT(updateend)
+Appending PTS=136
+EVENT(updateend)
+Appending PTS=137
+EVENT(updateend)
+Appending PTS=138
+EVENT(updateend)
+Appending PTS=139
+EVENT(updateend)
+Appending PTS=140
+EVENT(updateend)
+Appending PTS=141
+EVENT(updateend)
+Appending PTS=142
+EVENT(updateend)
+Appending PTS=143
+EVENT(updateend)
+Appending PTS=144
+EVENT(updateend)
+Appending PTS=145
+EVENT(updateend)
+Appending PTS=146
+EVENT(updateend)
+Appending PTS=147
+EVENT(updateend)
+Appending PTS=148
+EVENT(updateend)
+Appending PTS=149
+EVENT(updateend)
+Appending PTS=150
+EVENT(updateend)
+Appending PTS=151
+EVENT(updateend)
+Appending PTS=152
+EVENT(updateend)
+Appending PTS=153
+EVENT(updateend)
+Appending PTS=154
+EVENT(updateend)
+Appending PTS=155
+EVENT(updateend)
+Appending PTS=156
+EVENT(updateend)
+Appending PTS=157
+EVENT(updateend)
+Appending PTS=158
+EVENT(updateend)
+Appending PTS=159
+EVENT(updateend)
+Appending PTS=160
+EVENT(updateend)
+Appending PTS=161
+EVENT(updateend)
+Appending PTS=162
+EVENT(updateend)
+Appending PTS=163
+EVENT(updateend)
+Appending PTS=164
+EVENT(updateend)
+Appending PTS=165
+EVENT(updateend)
+Appending PTS=166
+EVENT(updateend)
+Appending PTS=167
+EVENT(updateend)
+Appending PTS=168
+EVENT(updateend)
+Appending PTS=169
+EVENT(updateend)
+Appending PTS=170
+EVENT(updateend)
+Appending PTS=171
+EVENT(updateend)
+Appending PTS=172
+EVENT(updateend)
+Appending PTS=173
+EVENT(updateend)
+Appending PTS=174
+EVENT(updateend)
+Appending PTS=175
+EVENT(updateend)
+Appending PTS=176
+EVENT(updateend)
+EXPECTED (video.currentTime == '175') OK
+EXPECTED (bufferedRanges() == '[ 120...132, 162...177 ]') OK
+EXPECTED (video.currentTime == '115') OK
+Appending PTS=109
+EVENT(updateend)
+Appending PTS=110
+EVENT(updateend)
+Appending PTS=111
+EVENT(updateend)
+Appending PTS=112
+EVENT(updateend)
+Appending PTS=113
+EVENT(updateend)
+Appending PTS=114
+EVENT(updateend)
+Appending PTS=115
+EVENT(updateend)
+Appending PTS=116
+EVENT(updateend)
+Appending PTS=117
+EVENT(updateend)
+Appending PTS=118
+EVENT(updateend)
+Appending PTS=119
+EVENT(updateend)
+EXPECTED (bufferedRanges() == '[ 109...132, 162...177 ]') OK
+END OF TEST
+
Added: trunk/LayoutTests/media/media-source/live-rewind-seek-and-evict.html (0 => 270106)
--- trunk/LayoutTests/media/media-source/live-rewind-seek-and-evict.html (rev 0)
+++ trunk/LayoutTests/media/media-source/live-rewind-seek-and-evict.html 2020-11-20 12:19:20 UTC (rev 270106)
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>mock-media-source</title>
+ <script src=""
+ <script src=""
+ <script>
+ var source;
+ var sourceBuffer;
+ var initSegment;
+ var exception;
+
+ function bufferedRanges() {
+ var bufferedRanges = '[ ';
+ var timeRanges = sourceBuffer.buffered;
+ for (var i = 0 ; i < timeRanges.length ; i++) {
+ if (i)
+ bufferedRanges += ', ';
+ bufferedRanges += timeRanges.start(i) + '...' + timeRanges.end(i);
+ }
+ bufferedRanges += ' ]';
+ return bufferedRanges;
+ }
+
+ async function appendPtsRange(firstPts, lastPts) {
+ var resultException = null;
+ for (var pts = firstPts; pts <= lastPts; pts++) {
+ try {
+ consoleWrite('Appending PTS='+pts);
+ sourceBuffer.appendBuffer(makeASample(pts, pts, 1, 1, 1, SAMPLE_FLAG.SYNC, 1));
+ await waitFor(sourceBuffer, 'updateend');
+ } catch (e) {
+ resultException = e;
+ sourceBuffer.abort();
+ break;
+ }
+ }
+ return resultException;
+ }
+
+ if (window.internals)
+ internals.initializeMockMediaSource();
+
+ window.addEventListener('load', async() => {
+ findMediaElement();
+ source = new MediaSource();
+
+ const videoSource = document.createElement('source');
+ videoSource.type = 'video/mock; codecs=mock';
+ videoSource.src = ""
+ video.appendChild(videoSource);
+
+ await waitFor(source, 'sourceopen');
+ sourceBuffer = source.addSourceBuffer("video/mock; codecs=mock");
+ initSegment = makeAInit(-1, [makeATrack(1, 'mock', TRACK_KIND.VIDEO)]);
+ sourceBuffer.appendBuffer(initSegment);
+ await waitFor(sourceBuffer, 'updateend');
+
+ testExpected('isNaN(source.duration)', true, '==');
+
+ // This should allow bufering up to 177 (empirically tested).
+ internals.settings.setMaximumSourceBufferSize(3000);
+
+ exception = await appendPtsRange(120, 176);
+
+ video.currentTime = 175;
+ testExpected('video.currentTime', 175, '==');
+
+ testExpected('bufferedRanges()', '[ 120...132, 162...177 ]', '==');
+
+ video.currentTime = 115;
+ testExpected('video.currentTime', 115, '==');
+ await appendPtsRange(109, 119);
+ testExpected('bufferedRanges()', '[ 109...132, 162...177 ]', '==');
+ endTest();
+ });
+ </script>
+</head>
+<body>
+ This tests rewind seeks in a live stream. The sample eviction algorithm should attempt to remove
+ some samples without going into an infinite loop.
+ <video></video>
+</body>
+</html>
Modified: trunk/LayoutTests/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt (270105 => 270106)
--- trunk/LayoutTests/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt 2020-11-20 12:13:52 UTC (rev 270105)
+++ trunk/LayoutTests/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt 2020-11-20 12:19:20 UTC (rev 270106)
@@ -115,9 +115,8 @@
Appending PTS=175
EVENT(updateend)
Appending PTS=176
-EVENT(updateend)
-EXPECTED (exception == 'QuotaExceededError: The quota has been exceeded.'), OBSERVED 'null' FAIL
-EXPECTED (bufferedRanges() == '[ 120...176 ]'), OBSERVED '[ 120...177 ]' FAIL
+EXPECTED (exception == 'QuotaExceededError: The quota has been exceeded.') OK
+EXPECTED (bufferedRanges() == '[ 120...176 ]') OK
EXPECTED (video.currentTime == '115') OK
Appending PTS=115
EVENT(updateend)
Modified: trunk/LayoutTests/media/media-source/mock-media-source.js (270105 => 270106)
--- trunk/LayoutTests/media/media-source/mock-media-source.js 2020-11-20 12:13:52 UTC (rev 270105)
+++ trunk/LayoutTests/media/media-source/mock-media-source.js 2020-11-20 12:19:20 UTC (rev 270106)
@@ -75,11 +75,13 @@
var array = new Uint8Array(buffer);
array.set(stringToArray('init'));
- var view = new DataView(buffer);
- var timeScale = 1000;
- view.setUint32(4, byteLength, true);
- view.setInt32(8, duration * timeScale, true);
- view.setInt32(12, timeScale, true);
+ if (!isNaN(duration)) {
+ var view = new DataView(buffer);
+ var timeScale = 1000;
+ view.setUint32(4, byteLength, true);
+ view.setInt32(8, duration * timeScale, true);
+ view.setInt32(12, timeScale, true);
+ }
var offset = 16;
tracks.forEach(function(track){
Deleted: trunk/LayoutTests/platform/glib/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt (270105 => 270106)
--- trunk/LayoutTests/platform/glib/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt 2020-11-20 12:13:52 UTC (rev 270105)
+++ trunk/LayoutTests/platform/glib/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt 2020-11-20 12:19:20 UTC (rev 270106)
@@ -1,132 +0,0 @@
-
-EVENT(sourceopen)
-EVENT(updateend)
-EXPECTED (video.currentTime == '120') OK
-Appending PTS=120
-EVENT(updateend)
-Appending PTS=121
-EVENT(updateend)
-Appending PTS=122
-EVENT(updateend)
-Appending PTS=123
-EVENT(updateend)
-Appending PTS=124
-EVENT(updateend)
-Appending PTS=125
-EVENT(updateend)
-Appending PTS=126
-EVENT(updateend)
-Appending PTS=127
-EVENT(updateend)
-Appending PTS=128
-EVENT(updateend)
-Appending PTS=129
-EVENT(updateend)
-Appending PTS=130
-EVENT(updateend)
-Appending PTS=131
-EVENT(updateend)
-Appending PTS=132
-EVENT(updateend)
-Appending PTS=133
-EVENT(updateend)
-Appending PTS=134
-EVENT(updateend)
-Appending PTS=135
-EVENT(updateend)
-Appending PTS=136
-EVENT(updateend)
-Appending PTS=137
-EVENT(updateend)
-Appending PTS=138
-EVENT(updateend)
-Appending PTS=139
-EVENT(updateend)
-Appending PTS=140
-EVENT(updateend)
-Appending PTS=141
-EVENT(updateend)
-Appending PTS=142
-EVENT(updateend)
-Appending PTS=143
-EVENT(updateend)
-Appending PTS=144
-EVENT(updateend)
-Appending PTS=145
-EVENT(updateend)
-Appending PTS=146
-EVENT(updateend)
-Appending PTS=147
-EVENT(updateend)
-Appending PTS=148
-EVENT(updateend)
-Appending PTS=149
-EVENT(updateend)
-Appending PTS=150
-EVENT(updateend)
-Appending PTS=151
-EVENT(updateend)
-Appending PTS=152
-EVENT(updateend)
-Appending PTS=153
-EVENT(updateend)
-Appending PTS=154
-EVENT(updateend)
-Appending PTS=155
-EVENT(updateend)
-Appending PTS=156
-EVENT(updateend)
-Appending PTS=157
-EVENT(updateend)
-Appending PTS=158
-EVENT(updateend)
-Appending PTS=159
-EVENT(updateend)
-Appending PTS=160
-EVENT(updateend)
-Appending PTS=161
-EVENT(updateend)
-Appending PTS=162
-EVENT(updateend)
-Appending PTS=163
-EVENT(updateend)
-Appending PTS=164
-EVENT(updateend)
-Appending PTS=165
-EVENT(updateend)
-Appending PTS=166
-EVENT(updateend)
-Appending PTS=167
-EVENT(updateend)
-Appending PTS=168
-EVENT(updateend)
-Appending PTS=169
-EVENT(updateend)
-Appending PTS=170
-EVENT(updateend)
-Appending PTS=171
-EVENT(updateend)
-Appending PTS=172
-EVENT(updateend)
-Appending PTS=173
-EVENT(updateend)
-Appending PTS=174
-EVENT(updateend)
-Appending PTS=175
-EVENT(updateend)
-Appending PTS=176
-EXPECTED (exception == 'QuotaExceededError: The quota has been exceeded.') OK
-EXPECTED (bufferedRanges() == '[ 120...176 ]') OK
-EXPECTED (video.currentTime == '115') OK
-Appending PTS=115
-EVENT(updateend)
-Appending PTS=116
-EVENT(updateend)
-Appending PTS=117
-EVENT(updateend)
-Appending PTS=118
-EVENT(updateend)
-EXPECTED (exception != 'QuotaExceededError: The quota has been exceeded.') OK
-EXPECTED (bufferedRanges() == '[ 115...119, 120...170 ]') OK
-END OF TEST
-
Copied: trunk/LayoutTests/platform/mac/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt (from rev 270103, trunk/LayoutTests/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt) (0 => 270106)
--- trunk/LayoutTests/platform/mac/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/mac/media/media-source/media-source-append-before-last-range-no-quota-exceeded-expected.txt 2020-11-20 12:19:20 UTC (rev 270106)
@@ -0,0 +1,133 @@
+
+EVENT(sourceopen)
+EVENT(updateend)
+EXPECTED (video.currentTime == '120') OK
+Appending PTS=120
+EVENT(updateend)
+Appending PTS=121
+EVENT(updateend)
+Appending PTS=122
+EVENT(updateend)
+Appending PTS=123
+EVENT(updateend)
+Appending PTS=124
+EVENT(updateend)
+Appending PTS=125
+EVENT(updateend)
+Appending PTS=126
+EVENT(updateend)
+Appending PTS=127
+EVENT(updateend)
+Appending PTS=128
+EVENT(updateend)
+Appending PTS=129
+EVENT(updateend)
+Appending PTS=130
+EVENT(updateend)
+Appending PTS=131
+EVENT(updateend)
+Appending PTS=132
+EVENT(updateend)
+Appending PTS=133
+EVENT(updateend)
+Appending PTS=134
+EVENT(updateend)
+Appending PTS=135
+EVENT(updateend)
+Appending PTS=136
+EVENT(updateend)
+Appending PTS=137
+EVENT(updateend)
+Appending PTS=138
+EVENT(updateend)
+Appending PTS=139
+EVENT(updateend)
+Appending PTS=140
+EVENT(updateend)
+Appending PTS=141
+EVENT(updateend)
+Appending PTS=142
+EVENT(updateend)
+Appending PTS=143
+EVENT(updateend)
+Appending PTS=144
+EVENT(updateend)
+Appending PTS=145
+EVENT(updateend)
+Appending PTS=146
+EVENT(updateend)
+Appending PTS=147
+EVENT(updateend)
+Appending PTS=148
+EVENT(updateend)
+Appending PTS=149
+EVENT(updateend)
+Appending PTS=150
+EVENT(updateend)
+Appending PTS=151
+EVENT(updateend)
+Appending PTS=152
+EVENT(updateend)
+Appending PTS=153
+EVENT(updateend)
+Appending PTS=154
+EVENT(updateend)
+Appending PTS=155
+EVENT(updateend)
+Appending PTS=156
+EVENT(updateend)
+Appending PTS=157
+EVENT(updateend)
+Appending PTS=158
+EVENT(updateend)
+Appending PTS=159
+EVENT(updateend)
+Appending PTS=160
+EVENT(updateend)
+Appending PTS=161
+EVENT(updateend)
+Appending PTS=162
+EVENT(updateend)
+Appending PTS=163
+EVENT(updateend)
+Appending PTS=164
+EVENT(updateend)
+Appending PTS=165
+EVENT(updateend)
+Appending PTS=166
+EVENT(updateend)
+Appending PTS=167
+EVENT(updateend)
+Appending PTS=168
+EVENT(updateend)
+Appending PTS=169
+EVENT(updateend)
+Appending PTS=170
+EVENT(updateend)
+Appending PTS=171
+EVENT(updateend)
+Appending PTS=172
+EVENT(updateend)
+Appending PTS=173
+EVENT(updateend)
+Appending PTS=174
+EVENT(updateend)
+Appending PTS=175
+EVENT(updateend)
+Appending PTS=176
+EVENT(updateend)
+EXPECTED (exception == 'QuotaExceededError: The quota has been exceeded.'), OBSERVED 'null' FAIL
+EXPECTED (bufferedRanges() == '[ 120...176 ]'), OBSERVED '[ 120...177 ]' FAIL
+EXPECTED (video.currentTime == '115') OK
+Appending PTS=115
+EVENT(updateend)
+Appending PTS=116
+EVENT(updateend)
+Appending PTS=117
+EVENT(updateend)
+Appending PTS=118
+EVENT(updateend)
+EXPECTED (exception != 'QuotaExceededError: The quota has been exceeded.') OK
+EXPECTED (bufferedRanges() == '[ 115...119, 120...170 ]') OK
+END OF TEST
+
Modified: trunk/Source/WTF/ChangeLog (270105 => 270106)
--- trunk/Source/WTF/ChangeLog 2020-11-20 12:13:52 UTC (rev 270105)
+++ trunk/Source/WTF/ChangeLog 2020-11-20 12:19:20 UTC (rev 270106)
@@ -1,3 +1,13 @@
+2020-11-20 Philippe Normand <[email protected]>
+
+ [MSE] Infinite loop in sample eviction when duration is NaN
+ https://bugs.webkit.org/show_bug.cgi?id=218228
+
+ Reviewed by Darin Adler.
+
+ * wtf/MediaTime.h: New isFinite() method, to check if the MediaTime is valid and represents
+ a finite value, eg not NaN or Infinite.
+
2020-11-19 Ada Chan <[email protected]>
Turn on ENABLE_WEBXR for Cocoa
Modified: trunk/Source/WTF/wtf/MediaTime.h (270105 => 270106)
--- trunk/Source/WTF/wtf/MediaTime.h 2020-11-20 12:13:52 UTC (rev 270105)
+++ trunk/Source/WTF/wtf/MediaTime.h 2020-11-20 12:19:20 UTC (rev 270106)
@@ -96,6 +96,7 @@
bool isPositiveInfinite() const { return m_timeFlags & PositiveInfinite; }
bool isNegativeInfinite() const { return m_timeFlags & NegativeInfinite; }
bool isIndefinite() const { return m_timeFlags & Indefinite; }
+ bool isFinite() const { return !isInvalid() && !isIndefinite() && !isPositiveInfinite() && !isNegativeInfinite(); }
bool hasDoubleValue() const { return m_timeFlags & DoubleValue; }
uint8_t timeFlags() const { return m_timeFlags; }
Modified: trunk/Source/WebCore/ChangeLog (270105 => 270106)
--- trunk/Source/WebCore/ChangeLog 2020-11-20 12:13:52 UTC (rev 270105)
+++ trunk/Source/WebCore/ChangeLog 2020-11-20 12:19:20 UTC (rev 270106)
@@ -1,3 +1,32 @@
+2020-11-20 Philippe Normand <[email protected]>
+
+ [MSE] Infinite loop in sample eviction when duration is NaN
+ https://bugs.webkit.org/show_bug.cgi?id=218228
+
+ Reviewed by Darin Adler.
+
+ Avoid infinite loop in evictCodedFrames for live streams
+
+ When playing live streams the MediaSource DOM duration attribute has no meaning
+ and would thus be set as +inf. When seeks are triggered to positions prior to
+ the current playback position the SourceBuffer might attempt to free some space
+ in order to keep the amount of memory used under control. It proceeds in 2
+ steps:
+
+ 1. Attempt to free space represented by buffered range from media start up until
+ current playback position - 30 seconds.
+ 2. If step 1 didn't free enough memory, attempt to release memory represented by
+ buffered ranges starting from current playback position + 30 seconds until media
+ duration.
+
+ Step 2 here wasn't taking into account the case where MediaSource.duration is
+ actually invalid, and thus was entering an infinite loop.
+
+ Test: media/media-source/live-rewind-seek-and-evict.html
+
+ * Modules/mediasource/SourceBuffer.cpp:
+ (WebCore::SourceBuffer::evictCodedFrames):
+
2020-11-20 Fujii Hironori <[email protected]>
[TextureMapper] Hidden surface removal issue for nested transform-style:perserve-3d in Snow Stack demo
Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (270105 => 270106)
--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp 2020-11-20 12:13:52 UTC (rev 270105)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp 2020-11-20 12:19:20 UTC (rev 270106)
@@ -996,6 +996,11 @@
MediaTime minimumRangeStart = currentTime + thirtySeconds;
rangeEnd = m_source->duration();
+ if (!rangeEnd.isFinite()) {
+ rangeEnd = buffered.maximumBufferedTime();
+ DEBUG_LOG(LOGIDENTIFIER, "MediaSource duration is not a finite value, using maximum buffered time: ", rangeEnd);
+ }
+
rangeStart = rangeEnd - thirtySeconds;
while (rangeStart > minimumRangeStart) {