Title: [169200] trunk
Revision
169200
Author
[email protected]
Date
2014-05-22 07:57:59 -0700 (Thu, 22 May 2014)

Log Message

Video is resumed with old playback rate.
https://bugs.webkit.org/show_bug.cgi?id=132905

Patch by Piotr Grad <[email protected]> on 2014-05-22
Reviewed by Philippe Normand.

Source/WebCore:
Setting '0' playback rate is causing pipeline to pause.
GStreamer player impl. exposed this information to upper layers but it should not.
Solution is to hidden such situation behind m_playbackRatePause flag.

Test: media/video-paused-0-rate.html

* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
(WebCore::MediaPlayerPrivateGStreamer::play):
(WebCore::MediaPlayerPrivateGStreamer::pause):
(WebCore::MediaPlayerPrivateGStreamer::doSeek):
(WebCore::MediaPlayerPrivateGStreamer::updatePlaybackRate):
(WebCore::MediaPlayerPrivateGStreamer::paused):
(WebCore::MediaPlayerPrivateGStreamer::setRate):
(WebCore::MediaPlayerPrivateGStreamer::updateStates):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:

LayoutTests:
* media/video-paused-0-rate-expected.txt: Added.
* media/video-paused-0-rate.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (169199 => 169200)


--- trunk/LayoutTests/ChangeLog	2014-05-22 13:05:20 UTC (rev 169199)
+++ trunk/LayoutTests/ChangeLog	2014-05-22 14:57:59 UTC (rev 169200)
@@ -1,3 +1,13 @@
+2014-05-22  Piotr Grad  <[email protected]>
+
+        Video is resumed with old playback rate.
+        https://bugs.webkit.org/show_bug.cgi?id=132905
+
+        Reviewed by Philippe Normand.
+
+        * media/video-paused-0-rate-expected.txt: Added.
+        * media/video-paused-0-rate.html: Added.
+
 2014-05-22  Antti Koivisto  <[email protected]>
 
         Text markers don't paint on simple lines

Added: trunk/LayoutTests/media/video-paused-0-rate-expected.txt (0 => 169200)


--- trunk/LayoutTests/media/video-paused-0-rate-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/video-paused-0-rate-expected.txt	2014-05-22 14:57:59 UTC (rev 169200)
@@ -0,0 +1,8 @@
+
+Test that setting '0' playbackRate works correctly.
+
+EVENT(canplaythrough)
+EXPECTED (video.currentTime == '0') OK
+EXPECTED (video.paused == 'false') OK
+END OF TEST
+

Added: trunk/LayoutTests/media/video-paused-0-rate.html (0 => 169200)


--- trunk/LayoutTests/media/video-paused-0-rate.html	                        (rev 0)
+++ trunk/LayoutTests/media/video-paused-0-rate.html	2014-05-22 14:57:59 UTC (rev 169200)
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <script src=""
+        <script src=""
+        <script>
+            var timeUpdateWasCalled = false;
+            function start()
+            {
+                findMediaElement();
+                video.src = "" "content/test");
+                waitForEventAndFail('ended');
+                video.addEventListener('timeupdate', timeupdate);
+                waitForEventOnce('canplaythrough', canPlayThrough);
+            }
+
+            function canPlayThrough()
+            {
+                video.playbackRate = 0;
+                video.play();
+            }
+
+            function timeupdate()
+            {
+                testExpected('video.currentTime', 0);
+                testExpected('video.paused', false);
+                if(timeUpdateWasCalled)
+                    failTest("Time was updated, but should not change.");
+                timeUpdateWasCalled = true;
+                setTimeout("endTest()", 150);
+            }
+        </script>
+    </head>
+    <body _onload_="start()">
+        <video></video>
+        <p>Test that setting '0' playbackRate works correctly.</p>
+    </body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (169199 => 169200)


--- trunk/Source/WebCore/ChangeLog	2014-05-22 13:05:20 UTC (rev 169199)
+++ trunk/Source/WebCore/ChangeLog	2014-05-22 14:57:59 UTC (rev 169200)
@@ -1,3 +1,27 @@
+2014-05-22  Piotr Grad  <[email protected]>
+
+        Video is resumed with old playback rate.
+        https://bugs.webkit.org/show_bug.cgi?id=132905
+
+        Reviewed by Philippe Normand.
+
+        Setting '0' playback rate is causing pipeline to pause.
+        GStreamer player impl. exposed this information to upper layers but it should not.
+        Solution is to hidden such situation behind m_playbackRatePause flag.
+
+        Test: media/video-paused-0-rate.html
+
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
+        (WebCore::MediaPlayerPrivateGStreamer::play):
+        (WebCore::MediaPlayerPrivateGStreamer::pause):
+        (WebCore::MediaPlayerPrivateGStreamer::doSeek):
+        (WebCore::MediaPlayerPrivateGStreamer::updatePlaybackRate):
+        (WebCore::MediaPlayerPrivateGStreamer::paused):
+        (WebCore::MediaPlayerPrivateGStreamer::setRate):
+        (WebCore::MediaPlayerPrivateGStreamer::updateStates):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+
 2014-05-22  Antti Koivisto  <[email protected]>
 
         Text markers don't paint on simple lines

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (169199 => 169200)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2014-05-22 13:05:20 UTC (rev 169199)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2014-05-22 14:57:59 UTC (rev 169200)
@@ -189,6 +189,7 @@
     , m_mediaLocationCurrentIndex(0)
     , m_resetPipeline(false)
     , m_paused(true)
+    , m_playbackRatePause(false)
     , m_seeking(false)
     , m_seekIsPending(false)
     , m_timeOfOverlappingSeek(-1)
@@ -406,6 +407,11 @@
 
 void MediaPlayerPrivateGStreamer::play()
 {
+    if (!m_playbackRate) {
+        m_playbackRatePause = true;
+        return;
+    }
+
     if (changePipelineState(GST_STATE_PLAYING)) {
         m_isEndReached = false;
         m_delayingLoad = false;
@@ -419,6 +425,7 @@
 
 void MediaPlayerPrivateGStreamer::pause()
 {
+    m_playbackRatePause = false;
     GstState currentState, pendingState;
     gst_element_get_state(m_playBin.get(), &currentState, &pendingState, 0);
     if (currentState < GST_STATE_PAUSED && pendingState <= GST_STATE_PAUSED)
@@ -555,6 +562,9 @@
             endTime = position;
     }
 
+    if (!rate)
+        rate = 1.0;
+
     return gst_element_seek(m_playBin.get(), rate, GST_FORMAT_TIME, seekType,
         GST_SEEK_TYPE_SET, startTime, GST_SEEK_TYPE_SET, endTime);
 }
@@ -587,6 +597,17 @@
         m_playbackRate = m_lastPlaybackRate;
         ERROR_MEDIA_MESSAGE("Set rate to %f failed", m_playbackRate);
     }
+
+    if (m_playbackRatePause) {
+        GstState state;
+        GstState pending;
+
+        gst_element_get_state(m_playBin.get(), &state, &pending, 0);
+        if (state != GST_STATE_PLAYING && pending != GST_STATE_PLAYING)
+            changePipelineState(GST_STATE_PLAYING);
+        m_playbackRatePause = false;
+    }
+
     m_changingRate = false;
     m_player->rateChanged();
 }
@@ -598,6 +619,9 @@
         return true;
     }
 
+    if (m_playbackRatePause)
+        return false;
+
     GstState state;
     gst_element_get_state(m_playBin.get(), &state, 0, 0);
     return state == GST_STATE_PAUSED;
@@ -799,15 +823,19 @@
     m_changingRate = true;
 
     gst_element_get_state(m_playBin.get(), &state, &pending, 0);
-    if ((state != GST_STATE_PLAYING && state != GST_STATE_PAUSED)
-        || (pending == GST_STATE_PAUSED))
-        return;
 
     if (!rate) {
-        changePipelineState(GST_STATE_PAUSED);
+        m_changingRate = false;
+        m_playbackRatePause = true;
+        if (state != GST_STATE_PAUSED && pending != GST_STATE_PAUSED)
+            changePipelineState(GST_STATE_PAUSED);
         return;
     }
 
+    if ((state != GST_STATE_PLAYING && state != GST_STATE_PAUSED)
+        || (pending == GST_STATE_PAUSED))
+        return;
+
     updatePlaybackRate();
 }
 
@@ -1379,14 +1407,14 @@
                 m_volumeAndMuteInitialized = true;
             }
 
-            if (didBuffering && !m_buffering && !m_paused) {
+            if (didBuffering && !m_buffering && !m_paused && m_playbackRate) {
                 LOG_MEDIA_MESSAGE("[Buffering] Restarting playback.");
                 changePipelineState(GST_STATE_PLAYING);
             }
         } else if (state == GST_STATE_PLAYING) {
             m_paused = false;
 
-            if (m_buffering && !isLiveStream()) {
+            if ((m_buffering && !isLiveStream()) || !m_playbackRate) {
                 LOG_MEDIA_MESSAGE("[Buffering] Pausing stream for buffering.");
                 changePipelineState(GST_STATE_PAUSED);
             }
@@ -1423,7 +1451,7 @@
         } else if (state == GST_STATE_PLAYING)
             m_paused = false;
 
-        if (!m_paused)
+        if (!m_paused && m_playbackRate)
             changePipelineState(GST_STATE_PLAYING);
 
         m_networkState = MediaPlayer::Loading;

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (169199 => 169200)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h	2014-05-22 13:05:20 UTC (rev 169199)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h	2014-05-22 14:57:59 UTC (rev 169200)
@@ -177,6 +177,7 @@
     int m_mediaLocationCurrentIndex;
     bool m_resetPipeline;
     bool m_paused;
+    bool m_playbackRatePause;
     bool m_seeking;
     bool m_seekIsPending;
     float m_timeOfOverlappingSeek;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to