2011-03-14 Alexis Menard <alexis.menard@openbossa.org>

        Reviewed by Kenneth Rohde Christiansen.

        [Qt] Seeking videos using the timeline bar does not work properly and stop the video playback.
        https://bugs.webkit.org/show_bug.cgi?id=56145

        We do not need seekTimeout and queuedSeekTimeout anymore. setPosition on QMediaPlayer is good enough.
        positionChanged() will be emitted when the data is buffered. On Linux the signal was not emitted because
        of a bug in QtMultimedia.

        * platform/graphics/qt/MediaPlayerPrivateQt.cpp:
        (WebCore::MediaPlayerPrivateQt::MediaPlayerPrivateQt):
        (WebCore::MediaPlayerPrivateQt::seek):
        (WebCore::MediaPlayerPrivateQt::stateChanged):
        (WebCore::MediaPlayerPrivateQt::positionChanged):
        * platform/graphics/qt/MediaPlayerPrivateQt.h:

git-svn-id: svn://svn.chromium.org/blink/trunk@81114 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 276cbca9
2011-03-14 Alexis Menard <alexis.menard@openbossa.org>
Reviewed by Kenneth Rohde Christiansen.
[Qt] Seeking videos using the timeline bar does not work properly and stop the video playback.
https://bugs.webkit.org/show_bug.cgi?id=56145
We do not need seekTimeout and queuedSeekTimeout anymore. setPosition on QMediaPlayer is good enough.
positionChanged() will be emitted when the data is buffered. On Linux the signal was not emitted because
of a bug in QtMultimedia.
* platform/graphics/qt/MediaPlayerPrivateQt.cpp:
(WebCore::MediaPlayerPrivateQt::MediaPlayerPrivateQt):
(WebCore::MediaPlayerPrivateQt::seek):
(WebCore::MediaPlayerPrivateQt::stateChanged):
(WebCore::MediaPlayerPrivateQt::positionChanged):
* platform/graphics/qt/MediaPlayerPrivateQt.h:
2011-03-14 Alexey Proskuryakov <ap@apple.com> 2011-03-14 Alexey Proskuryakov <ap@apple.com>
Reviewed by Adam Roben. Reviewed by Adam Roben.
......
...@@ -103,7 +103,6 @@ MediaPlayerPrivateQt::MediaPlayerPrivateQt(MediaPlayer* player) ...@@ -103,7 +103,6 @@ MediaPlayerPrivateQt::MediaPlayerPrivateQt(MediaPlayer* player)
, m_isVisible(false) , m_isVisible(false)
, m_isSeeking(false) , m_isSeeking(false)
, m_composited(false) , m_composited(false)
, m_queuedSeek(-1)
, m_preload(MediaPlayer::Auto) , m_preload(MediaPlayer::Auto)
, m_suppressNextPlaybackChanged(false) , m_suppressNextPlaybackChanged(false)
{ {
...@@ -296,32 +295,8 @@ void MediaPlayerPrivateQt::seek(float position) ...@@ -296,32 +295,8 @@ void MediaPlayerPrivateQt::seek(float position)
if (m_mediaPlayerControl && !m_mediaPlayerControl->availablePlaybackRanges().contains(position * 1000)) if (m_mediaPlayerControl && !m_mediaPlayerControl->availablePlaybackRanges().contains(position * 1000))
return; return;
if (m_isSeeking) m_isSeeking = true;
return; m_mediaPlayer->setPosition(static_cast<qint64>(position * 1000));
if (position > duration())
position = duration();
// Seeking is most reliable when we're paused.
// Webkit will try to pause before seeking, but due to the asynchronous nature
// of the backend, the player may not actually be paused yet.
// In this case, we should queue the seek and wait until pausing has completed
// before attempting to seek.
if (m_mediaPlayer->state() == QMediaPlayer::PlayingState) {
m_mediaPlayer->pause();
m_isSeeking = true;
m_queuedSeek = static_cast<qint64>(position * 1000);
// Set a timeout, so that in the event that we don't get a state changed
// signal, we still attempt the seek.
QTimer::singleShot(1000, this, SLOT(queuedSeekTimeout()));
} else {
m_isSeeking = true;
m_mediaPlayer->setPosition(static_cast<qint64>(position * 1000));
// Set a timeout, in case we don't get a position changed signal
QTimer::singleShot(10000, this, SLOT(seekTimeout()));
}
} }
bool MediaPlayerPrivateQt::seeking() const bool MediaPlayerPrivateQt::seeking() const
...@@ -443,13 +418,8 @@ void MediaPlayerPrivateQt::handleError(QMediaPlayer::Error) ...@@ -443,13 +418,8 @@ void MediaPlayerPrivateQt::handleError(QMediaPlayer::Error)
updateStates(); updateStates();
} }
void MediaPlayerPrivateQt::stateChanged(QMediaPlayer::State state) void MediaPlayerPrivateQt::stateChanged(QMediaPlayer::State)
{ {
if (state != QMediaPlayer::PlayingState && m_isSeeking && m_queuedSeek >= 0) {
m_mediaPlayer->setPosition(m_queuedSeek);
m_queuedSeek = -1;
}
if (!m_suppressNextPlaybackChanged) if (!m_suppressNextPlaybackChanged)
m_webCorePlayer->playbackStateChanged(); m_webCorePlayer->playbackStateChanged();
else else
...@@ -468,34 +438,12 @@ void MediaPlayerPrivateQt::nativeSizeChanged(const QSizeF& size) ...@@ -468,34 +438,12 @@ void MediaPlayerPrivateQt::nativeSizeChanged(const QSizeF& size)
m_webCorePlayer->sizeChanged(); m_webCorePlayer->sizeChanged();
} }
void MediaPlayerPrivateQt::queuedSeekTimeout()
{
// If we haven't heard anything, assume the player is now paused
// and we can attempt the seek
if (m_isSeeking && m_queuedSeek >= 0) {
m_mediaPlayer->setPosition(m_queuedSeek);
m_queuedSeek = -1;
// Set a timeout, in case we don't get a position changed signal
QTimer::singleShot(10000, this, SLOT(seekTimeout()));
}
}
void MediaPlayerPrivateQt::seekTimeout()
{
// If we haven't heard anything, assume the seek succeeded
if (m_isSeeking) {
m_webCorePlayer->timeChanged();
m_isSeeking = false;
}
}
void MediaPlayerPrivateQt::positionChanged(qint64) void MediaPlayerPrivateQt::positionChanged(qint64)
{ {
// Only propagate this event if we are seeking // Only propagate this event if we are seeking
if (m_isSeeking && m_queuedSeek == -1) { if (m_isSeeking) {
m_webCorePlayer->timeChanged();
m_isSeeking = false; m_isSeeking = false;
m_webCorePlayer->timeChanged();
} }
} }
......
...@@ -120,8 +120,6 @@ private slots: ...@@ -120,8 +120,6 @@ private slots:
void handleError(QMediaPlayer::Error); void handleError(QMediaPlayer::Error);
void stateChanged(QMediaPlayer::State); void stateChanged(QMediaPlayer::State);
void nativeSizeChanged(const QSizeF&); void nativeSizeChanged(const QSizeF&);
void queuedSeekTimeout();
void seekTimeout();
void positionChanged(qint64); void positionChanged(qint64);
void durationChanged(qint64); void durationChanged(qint64);
void bufferStatusChanged(int); void bufferStatusChanged(int);
...@@ -153,7 +151,6 @@ private: ...@@ -153,7 +151,6 @@ private:
bool m_isVisible; bool m_isVisible;
bool m_isSeeking; bool m_isSeeking;
bool m_composited; bool m_composited;
qint64 m_queuedSeek;
MediaPlayer::Preload m_preload; MediaPlayer::Preload m_preload;
bool m_delayingLoad; bool m_delayingLoad;
String m_mediaUrl; String m_mediaUrl;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment