[totem] Only start playback when the download buffer is filled enough
- From: Bastien Nocera <hadess src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [totem] Only start playback when the download buffer is filled enough
- Date: Wed, 4 Nov 2009 19:42:15 +0000 (UTC)
commit 80297bca6a3ac70d18ddeaaf4fe6a08817c9c008
Author: Bastien Nocera <hadess hadess net>
Date: Wed Nov 4 19:29:20 2009 +0000
Only start playback when the download buffer is filled enough
We ignore the play request, but record that it was requested,
then start playback when the buffer is filled enough so that
we won't have to pause to download.
src/backend/bacon-video-widget-gst-0.10.c | 55 ++++++++++++++++++++++++++--
1 files changed, 51 insertions(+), 4 deletions(-)
---
diff --git a/src/backend/bacon-video-widget-gst-0.10.c b/src/backend/bacon-video-widget-gst-0.10.c
index af5e09f..bc0edcc 100644
--- a/src/backend/bacon-video-widget-gst-0.10.c
+++ b/src/backend/bacon-video-widget-gst-0.10.c
@@ -239,6 +239,10 @@ struct BaconVideoWidgetPrivate
* which may change asynchronously or during buffering */
GstState target_state;
gboolean buffering;
+ gboolean download_buffering;
+ /* used to compute when the download buffer has gone far
+ * enough to start playback */
+ gint64 buffering_left;
/* for easy codec installation */
GList *missing_plugins; /* GList of GstMessages */
@@ -1800,6 +1804,19 @@ text_tags_changed_cb (GstElement *playbin2, gint stream_id, gpointer user_data)
bvw_update_tags_delayed (bvw, tags, "text");
}
+static gboolean
+bvw_buffering_done (BaconVideoWidget *bvw)
+{
+ if (bvw->priv->stream_length <= 0)
+ return FALSE;
+ /* When queue2 doesn't implement buffering-left, always think
+ * it's ready to go */
+ if (bvw->priv->buffering_left < 0)
+ return TRUE;
+
+ return (bvw->priv->buffering_left < bvw->priv->stream_length);
+}
+
static void
bvw_handle_buffering_message (GstMessage * message, BaconVideoWidget *bvw)
{
@@ -1809,7 +1826,24 @@ bvw_handle_buffering_message (GstMessage * message, BaconVideoWidget *bvw)
gst_message_parse_buffering_stats (message, &mode, NULL, NULL, &buffering_left);
if (mode == GST_BUFFERING_DOWNLOAD) {
- bvw_reconfigure_fill_timeout (bvw, 200);
+ bvw->priv->buffering_left = buffering_left;
+
+ if (bvw->priv->download_buffering == FALSE) {
+ bvw->priv->download_buffering = TRUE;
+
+ /* We're not ready to play yet, so pause the stream */
+ GST_DEBUG ("Pausing because we're not ready to play the buffer yet");
+ gst_element_set_state (GST_ELEMENT (bvw->priv->play), GST_STATE_PAUSED);
+
+ bvw_reconfigure_fill_timeout (bvw, 200);
+ }
+
+ /* Start playing when we've download enough */
+ if (bvw_buffering_done (bvw) != FALSE &&
+ bvw->priv->target_state == GST_STATE_PLAYING) {
+ GST_DEBUG ("Starting playback because the download buffer is filled enough");
+ bacon_video_widget_play (bvw, NULL);
+ }
return;
}
@@ -3517,13 +3551,24 @@ bacon_video_widget_play (BaconVideoWidget * bvw, GError ** error)
return TRUE;
}
- /* just lie and do nothing in this case */
+ /* Don't try to play if we're already doing that */
gst_element_get_state (bvw->priv->play, &cur_state, NULL, 0);
+ if (cur_state == GST_STATE_PLAYING)
+ return TRUE;
+
+ /* Lie when trying to play a file whilst we're download buffering */
+ if (bvw->priv->download_buffering != FALSE &&
+ bvw_buffering_done (bvw) == FALSE) {
+ GST_DEBUG ("download buffering in progress, not playing");
+ return TRUE;
+ }
+
+ /* just lie and do nothing in this case */
if (bvw->priv->plugin_install_in_progress && cur_state != GST_STATE_PAUSED) {
- GST_DEBUG ("plugin install in progress and nothing to play, doing nothing");
+ GST_DEBUG ("plugin install in progress and nothing to play, not playing");
return TRUE;
} else if (bvw->priv->mount_in_progress) {
- GST_DEBUG ("Mounting in progress, doing nothing");
+ GST_DEBUG ("Mounting in progress, not playing");
return TRUE;
}
@@ -3671,6 +3716,8 @@ bvw_stop_play_pipeline (BaconVideoWidget * bvw)
bvw->priv->target_state = GST_STATE_NULL;
bvw->priv->buffering = FALSE;
bvw->priv->plugin_install_in_progress = FALSE;
+ bvw->priv->download_buffering = FALSE;
+ bvw->priv->buffering_left = -1;
bvw->priv->ignore_messages_mask = 0;
bvw_reconfigure_fill_timeout (bvw, 0);
if (bvw->priv->cover_pixbuf) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]