Title: [270106] trunk
Revision
270106
Author
[email protected]
Date
2020-11-20 04:19:20 -0800 (Fri, 20 Nov 2020)

Log Message

[MSE] Infinite loop in sample eviction when duration is NaN
https://bugs.webkit.org/show_bug.cgi?id=218228

Reviewed by Darin Adler.

Source/WebCore:

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):

Source/WTF:

* wtf/MediaTime.h: New isFinite() method, to check if the MediaTime is valid and represents
a finite value, eg not NaN or Infinite.

LayoutTests:

* 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.

Modified Paths

Added Paths

Removed Paths

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) {
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to