Change fast seek logic to prevent ping-ponging.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 Aug 2017 19:03:57 +0000 (19:03 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 Aug 2017 19:03:57 +0000 (19:03 +0000)
https://bugs.webkit.org/show_bug.cgi?id=175167
rdar://problem/32936116

Patch by Jeremy Jones <jeremyj@apple.com> on 2017-08-08
Reviewed by Jer Noble.

Source/WebCore:

Updated test: media/video-fast-seek.html

Changed fast seek behavior to always seek early than seek time; and after current time when seeking forward.
This prevents ping-ponging, where a fast seek overshoots the target looking for a keyframe.
A subsequent seek will suddenly be on the other side of current time and
will search in the opposite direction for a key frame; repeat.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::fastSeek):

LayoutTests:

Test now requires forward fast seek result to be between current time and the target time,
and a backward seek to be before the seek time.

* media/video-fast-seek.html:
* media/media-source/media-source-fastseek.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@220414 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/media/media-source/media-source-fastseek-expected.txt
LayoutTests/media/media-source/media-source-fastseek.html
LayoutTests/media/video-fast-seek-expected.txt
LayoutTests/media/video-fast-seek.html
Source/WebCore/ChangeLog
Source/WebCore/html/HTMLMediaElement.cpp

index bb232b6859fe949a88bd42a958511ba05cb15a87..7ec2e7146417841668b8692ac0de5df001013996 100644 (file)
@@ -1,3 +1,17 @@
+2017-08-08  Jeremy Jones  <jeremyj@apple.com>
+
+        Change fast seek logic to prevent ping-ponging.
+        https://bugs.webkit.org/show_bug.cgi?id=175167
+        rdar://problem/32936116
+
+        Reviewed by Jer Noble.
+
+        Test now requires forward fast seek result to be between current time and the target time,
+        and a backward seek to be before the seek time.
+
+        * media/video-fast-seek.html:
+        * media/media-source/media-source-fastseek.html:
+
 2017-08-08  Ms2ger  <Ms2ger@igalia.com>
 
         Remove obsolete failure expectations for event_loadedmetadata.html.
index 3dceb3fcbce047f94751a2c5f271a63c1b1ffc0c..377117196a37e7461b6854df3e0c5170a5666ee2 100644 (file)
@@ -11,7 +11,7 @@ RUN(source.endOfStream())
 RUN(video.currentTime = 1)
 EVENT(seeked)
 EXPECTED (video.currentTime.toFixed(1) == '1') OK
-RUN(video.fastSeek(2))
+RUN(video.fastSeek(5))
 EVENT(seeked)
 EXPECTED (video.currentTime.toFixed(1) == '4') OK
 RUN(video.currentTime = 3)
index 34d701cd4a666a85f5f1df6a304e32e237d0c9cc..9e2603f3403347d0fcca0b07e2872f463659dd2c 100644 (file)
@@ -59,7 +59,7 @@
     function seeked1() {
         testExpected('video.currentTime.toFixed(1)', 1);
         waitForEventOnce('seeked', seeked2);
-        run('video.fastSeek(2)');
+        run('video.fastSeek(5)');
     }
 
     function seeked2() {
index 2921dc9fae510db603f4f5c3e391f02861c38aa4..fae80bbe8b5f9bbe7e3aac18b30022a28548d2da 100644 (file)
@@ -6,15 +6,16 @@ Seek past the 4th sync sample:
 RUN(video.currentTime = 2.5)
 EVENT(timeupdate)
 EXPECTED (video.currentTime.toFixed(1) == '2.5') OK
-Test that fastSeek() past the currentTime will not result in a seek before the currentTime:
+Test that fastSeek() past the currentTime will not result in a seek before the currentTime or past the seek time:
 RUN(video.fastSeek(2.6))
 EVENT(timeupdate)
-EXPECTED (video.currentTime >= '2.6') OK
+EXPECTED (video.currentTime <= '2.6') OK
+EXPECTED (video.currentTime >= '2.5') OK
 Seek before the 4th sync sample:
 RUN(video.currentTime = 2.3)
 EVENT(timeupdate)
 EXPECTED (video.currentTime.toFixed(1) == '2.3') OK
-Test that fastSeek() before the currentTime will not result in a seek past the currentTime:
+Test that fastSeek() before the currentTime will not result in a seek past the seek time:
 RUN(video.fastSeek(2.2))
 EVENT(timeupdate)
 EXPECTED (video.currentTime <= '2.2') OK
index 42a3caa7efa0e41594d4dd341a5bebe2f2871cf3..d84e4338667fedc704a2239293a864c3cf1ead1e 100644 (file)
         function seek1()
         {
             testExpected('video.currentTime.toFixed(1)', 2.5);
-            consoleWrite('Test that fastSeek() past the currentTime will not result in a seek before the currentTime:');
+            consoleWrite('Test that fastSeek() past the currentTime will not result in a seek before the currentTime or past the seek time:');
             waitForEventOnce('timeupdate', seek2);
             run('video.fastSeek(2.6)');
         }
 
         function seek2()
         {
-            testExpected('video.currentTime', 2.6, '>=');
+            testExpected('video.currentTime', 2.6, '<=');
+            testExpected('video.currentTime', 2.5, '>=');
             consoleWrite('Seek before the 4th sync sample:');
             waitForEventOnce('timeupdate', seek3);
             run('video.currentTime = 2.3');
@@ -44,7 +45,7 @@
         function seek3()
         {
             testExpected('video.currentTime.toFixed(1)', 2.3);
-            consoleWrite('Test that fastSeek() before the currentTime will not result in a seek past the currentTime:');
+            consoleWrite('Test that fastSeek() before the currentTime will not result in a seek past the seek time:');
             waitForEventOnce('timeupdate', seek4);
             run('video.fastSeek(2.2)');
         }
index 7e5ad3eabf712d335c6da8172c4ff36c130c901f..0475c4c686711be8141c6f0f0ed7ea6f35961ecf 100644 (file)
@@ -1,3 +1,21 @@
+2017-08-08  Jeremy Jones  <jeremyj@apple.com>
+
+        Change fast seek logic to prevent ping-ponging.
+        https://bugs.webkit.org/show_bug.cgi?id=175167
+        rdar://problem/32936116
+
+        Reviewed by Jer Noble.
+
+        Updated test: media/video-fast-seek.html
+
+        Changed fast seek behavior to always seek early than seek time; and after current time when seeking forward.
+        This prevents ping-ponging, where a fast seek overshoots the target looking for a keyframe.
+        A subsequent seek will suddenly be on the other side of current time and
+        will search in the opposite direction for a key frame; repeat.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::fastSeek):
+
 2017-08-08  Ms2ger  <Ms2ger@igalia.com>
 
         Unreviewed. Correct the function name in a debug message.
index 490ece98497b41455c77223568ee93d4c8d7a392..0e8c08b7b790b45f1c107a1835f9996318f5b189 100644 (file)
@@ -2627,11 +2627,10 @@ void HTMLMediaElement::fastSeek(const MediaTime& time)
     // position. Similarly, if the new playback position before this step is after current playback position,
     // then the adjusted new playback position must also be after the current playback position.
     refreshCachedTime();
-    MediaTime delta = time - currentMediaTime();
-    MediaTime negativeTolerance = delta >= MediaTime::zeroTime() ? delta : MediaTime::positiveInfiniteTime();
-    MediaTime positiveTolerance = delta < MediaTime::zeroTime() ? -delta : MediaTime::positiveInfiniteTime();
 
-    seekWithTolerance(time, negativeTolerance, positiveTolerance, true);
+    MediaTime delta = time - currentMediaTime();
+    MediaTime negativeTolerance = delta < MediaTime::zeroTime() ? MediaTime::positiveInfiniteTime() : delta;
+    seekWithTolerance(time, negativeTolerance, MediaTime::zeroTime(), true);
 }
 
 void HTMLMediaElement::seek(const MediaTime& time)