summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndras Becsi <andras.becsi@digia.com>2012-11-07 18:51:16 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-11-28 17:32:06 +0100
commit25fd41373abdfe967b892173783687262a70139d (patch)
tree3b64f38cb465615e215572347c79709903e2ee7d
parente899ff8c5ac6eacc0e031931b3054b1cb8725081 (diff)
Fix QGstreamerPlayerSession::availablePlaybackRanges()
Since buffering information through buffering queries is only valid if progressive download buffering (on-disk caching) is enabled or local media is played and we explicitly disable on-disk buffering because of cleanup issues with gstreamer availablePlaybackRanges() always returns an empty range for online media. Seeking is also possible using http range requests therefore if valid playback ranges could not be determined we should return the [0..duration] range unless the source is a live stream or the duration is unknown. Change-Id: Idbebc0fdde5053c6f9c0b3794c6d122492c6239c Reviewed-by: Zeno Albisser <zeno.albisser@digia.com> Reviewed-by: Andras Becsi <andras.becsi@digia.com>
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp33
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h2
2 files changed, 15 insertions, 20 deletions
diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp
index e51531c91..b1ccb4f10 100644
--- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp
+++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp
@@ -104,7 +104,6 @@ QGstreamerPlayerSession::QGstreamerPlayerSession(QObject *parent)
m_bus(0),
m_videoOutput(0),
m_renderer(0),
- m_haveQueueElement(false),
#if defined(HAVE_GST_APPSRC)
m_appSrc(0),
#endif
@@ -244,7 +243,6 @@ void QGstreamerPlayerSession::loadFromStream(const QNetworkRequest &request, QIO
m_request = request;
m_duration = -1;
m_lastPosition = 0;
- m_haveQueueElement = false;
m_isPlaylist = false;
if (m_appSrc)
@@ -277,7 +275,6 @@ void QGstreamerPlayerSession::loadFromUri(const QNetworkRequest &request)
m_request = request;
m_duration = -1;
m_lastPosition = 0;
- m_haveQueueElement = false;
m_isPlaylist = false;
if (m_playbin) {
@@ -336,29 +333,32 @@ void QGstreamerPlayerSession::setPlaybackRate(qreal rate)
QMediaTimeRange QGstreamerPlayerSession::availablePlaybackRanges() const
{
QMediaTimeRange ranges;
+
+ if (duration() <= 0)
+ return ranges;
+
#if (GST_VERSION_MAJOR >= 0) && (GST_VERSION_MINOR >= 10) && (GST_VERSION_MICRO >= 31)
//GST_FORMAT_TIME would be more appropriate, but unfortunately it's not supported.
//with GST_FORMAT_PERCENT media is treated as encoded with constant bitrate.
GstQuery* query = gst_query_new_buffering(GST_FORMAT_PERCENT);
- if (gst_element_query(m_playbin, query)) {
- for (guint index = 0; index < gst_query_get_n_buffering_ranges(query); index++) {
- gint64 rangeStart = 0;
- gint64 rangeStop = 0;
+ if (!gst_element_query(m_playbin, query)) {
+ gst_query_unref(query);
+ return ranges;
+ }
- //This query should return values in GST_FORMAT_PERCENT_MAX range,
- //but queue2 returns values in 0..100 range instead
- if (gst_query_parse_nth_buffering_range(query, index, &rangeStart, &rangeStop))
- ranges.addInterval(rangeStart * duration() / 100,
- rangeStop * duration() / 100);
- }
+ gint64 rangeStart = 0;
+ gint64 rangeStop = 0;
+ for (guint index = 0; index < gst_query_get_n_buffering_ranges(query); index++) {
+ if (gst_query_parse_nth_buffering_range(query, index, &rangeStart, &rangeStop))
+ ranges.addInterval(rangeStart * duration() / 100,
+ rangeStop * duration() / 100);
}
gst_query_unref(query);
#endif
- //without queue2 element in pipeline all the media is considered available
- if (ranges.isEmpty() && duration() > 0 && !m_haveQueueElement)
+ if (ranges.isEmpty() && !isLiveSource() && isSeekable())
ranges.addInterval(0, duration());
#ifdef DEBUG_PLAYBIN
@@ -1612,11 +1612,8 @@ void QGstreamerPlayerSession::handleElementAdded(GstBin *bin, GstElement *elemen
gchar *elementName = gst_element_get_name(element);
if (g_str_has_prefix(elementName, "queue2")) {
- session->m_haveQueueElement = true;
-
// Disable on-disk buffering.
g_object_set(G_OBJECT(element), "temp-template", NULL, NULL);
-
} else if (g_str_has_prefix(elementName, "uridecodebin") ||
g_str_has_prefix(elementName, "decodebin2")) {
diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h
index 78f94c5e5..1b440f646 100644
--- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h
+++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h
@@ -216,8 +216,6 @@ private:
QObject *m_videoOutput;
QGstreamerVideoRendererInterface *m_renderer;
- bool m_haveQueueElement;
-
#if defined(HAVE_GST_APPSRC)
QGstAppSrc *m_appSrc;
#endif