Skip to content

Commit

Permalink
Merge r234983 - [GStreamer] reduce position queries frequency
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=188645

Patch by Philippe Normand <philn@igalia.com> on 2018-08-17
Reviewed by Xabier Rodriguez-Calvar.

There is no need to perform dozens of position queries per second.
One every 300ms is enough.

* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
(WebCore::MediaPlayerPrivateGStreamer::playbackPosition const):
(WebCore::MediaPlayerPrivateGStreamer::asyncStateChangeDone):
(WebCore::MediaPlayerPrivateGStreamer::updateStates):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
  • Loading branch information
philn authored and carlosgcampos committed Aug 20, 2018
1 parent 999c289 commit 01fb78f
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
17 changes: 17 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,20 @@
2018-08-17 Philippe Normand <philn@igalia.com>

[GStreamer] reduce position queries frequency
https://bugs.webkit.org/show_bug.cgi?id=188645

Reviewed by Xabier Rodriguez-Calvar.

There is no need to perform dozens of position queries per second.
One every 300ms is enough.

* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
(WebCore::MediaPlayerPrivateGStreamer::playbackPosition const):
(WebCore::MediaPlayerPrivateGStreamer::asyncStateChangeDone):
(WebCore::MediaPlayerPrivateGStreamer::updateStates):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:

2018-08-17 Michael Catanzaro <mcatanzaro@igalia.com>

[SOUP] Handle OAuth authentication after r234912
Expand Down
Expand Up @@ -47,6 +47,7 @@
#include <wtf/MediaTime.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/StringPrintStream.h>
#include <wtf/WallTime.h>
#include <wtf/glib/GUniquePtr.h>
#include <wtf/glib/RunLoopSourcePriority.h>
#include <wtf/text/CString.h>
Expand Down Expand Up @@ -131,6 +132,7 @@ MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player)
: MediaPlayerPrivateGStreamerBase(player)
, m_buffering(false)
, m_bufferingPercentage(0)
, m_cachedPosition(MediaTime::invalidTime())
, m_canFallBackToLastFinishedSeekPosition(false)
, m_changingRate(false)
, m_downloadFinished(false)
Expand Down Expand Up @@ -162,6 +164,7 @@ MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player)
, m_readyTimerHandler(RunLoop::main(), this, &MediaPlayerPrivateGStreamer::readyTimerFired)
, m_totalBytes(0)
, m_preservesPitch(false)
, m_lastQuery(-1)
{
#if USE(GLIB)
m_readyTimerHandler.setPriority(G_PRIORITY_DEFAULT_IDLE);
Expand Down Expand Up @@ -341,14 +344,20 @@ MediaTime MediaPlayerPrivateGStreamer::playbackPosition() const
if (m_isEndReached && m_seeking)
return m_seekTime;

double now = WTF::WallTime::now().secondsSinceEpoch().milliseconds();
if (m_lastQuery > -1 && ((now - m_lastQuery) < 300) && m_cachedPosition.isValid())
return m_cachedPosition;

m_lastQuery = now;

// Position is only available if no async state change is going on and the state is either paused or playing.
gint64 position = GST_CLOCK_TIME_NONE;
GstQuery* query = gst_query_new_position(GST_FORMAT_TIME);
if (gst_element_query(m_pipeline.get(), query))
gst_query_parse_position(query, 0, &position);
gst_query_unref(query);

GST_LOG("Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position));
GST_TRACE_OBJECT(pipeline(), "Position %" GST_TIME_FORMAT, GST_TIME_ARGS(position));

MediaTime playbackPosition = MediaTime::zeroTime();
GstClockTime gstreamerPosition = static_cast<GstClockTime>(position);
Expand All @@ -357,6 +366,7 @@ MediaTime MediaPlayerPrivateGStreamer::playbackPosition() const
else if (m_canFallBackToLastFinishedSeekPosition)
playbackPosition = m_seekTime;

m_cachedPosition = playbackPosition;
return playbackPosition;
}

Expand Down Expand Up @@ -1828,6 +1838,7 @@ void MediaPlayerPrivateGStreamer::asyncStateChangeDone()
else {
GST_DEBUG("[Seek] seeked to %s", toString(m_seekTime).utf8().data());
m_seeking = false;
m_cachedPosition = MediaTime::invalidTime();
if (m_timeOfOverlappingSeek != m_seekTime && m_timeOfOverlappingSeek.isValid()) {
seek(m_timeOfOverlappingSeek);
m_timeOfOverlappingSeek = MediaTime::invalidTime();
Expand Down Expand Up @@ -2007,8 +2018,10 @@ void MediaPlayerPrivateGStreamer::updateStates()
GST_DEBUG("[Seek] committing pending seek to %s", toString(m_seekTime).utf8().data());
m_seekIsPending = false;
m_seeking = doSeek(m_seekTime, m_player->rate(), static_cast<GstSeekFlags>(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE));
if (!m_seeking)
if (!m_seeking) {
m_cachedPosition = MediaTime::invalidTime();
GST_DEBUG("[Seek] seeking to %s failed", toString(m_seekTime).utf8().data());
}
}
}
}
Expand Down
Expand Up @@ -257,6 +257,7 @@ class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
mutable unsigned long long m_totalBytes;
URL m_url;
bool m_preservesPitch;
mutable double m_lastQuery;
bool m_isLegacyPlaybin;
#if GST_CHECK_VERSION(1, 10, 0)
GRefPtr<GstStreamCollection> m_streamCollection;
Expand Down

0 comments on commit 01fb78f

Please sign in to comment.