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(), ¤tState, &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;