[gstreamer-bugs] [Bug 628337] State change from PLAYING to PAUSED can take an unusually long time in the gstgnomevfssrc element

GStreamer (bugzilla.gnome.org) bugzilla at gnome.org
Mon Aug 30 10:48:28 PDT 2010


https://bugzilla.gnome.org/show_bug.cgi?id=628337
  GStreamer | gst-plugins-base | 0.10.30

--- Comment #5 from American Dynamics <GStreamer-Bugs at tycosp.com> 2010-08-30 17:48:26 UTC ---
(From update of attachment 169093)
>--- gstgnomevfssrc.c	2010-07-04 10:37:40.000000000 -0400
>+++ gstgnomevfssrc.c	2010-08-26 10:21:41.000000000 -0400
>@@ -70,6 +70,7 @@
> #include "gst/gst-i18n-plugin.h"
> 
> #include "gstgnomevfssrc.h"
>+#include <gnome-vfs-module-2.0/libgnomevfs/gnome-vfs-cancellable-ops.h>
> 
> #include <stdio.h>
> #include <stdlib.h>
>@@ -132,6 +133,8 @@
> static gboolean gst_gnome_vfs_src_start (GstBaseSrc * src);
> static gboolean gst_gnome_vfs_src_is_seekable (GstBaseSrc * src);
> static gboolean gst_gnome_vfs_src_check_get_range (GstBaseSrc * src);
>+static gboolean gst_gnome_vfs_src_unlock (GstBaseSrc * basesrc);
>+static gboolean gst_gnome_vfs_src_unlock_stop (GstBaseSrc * basesrc);
> static gboolean gst_gnome_vfs_src_get_size (GstBaseSrc * src, guint64 * size);
> static GstFlowReturn gst_gnome_vfs_src_create (GstBaseSrc * basesrc,
>     guint64 offset, guint size, GstBuffer ** buffer);
>@@ -240,6 +243,9 @@
> 
>   gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_gnome_vfs_src_start);
>   gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_gnome_vfs_src_stop);
>+  gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_gnome_vfs_src_unlock);
>+  gstbasesrc_class->unlock_stop =
>+      GST_DEBUG_FUNCPTR (gst_gnome_vfs_src_unlock_stop);  
>   gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_gnome_vfs_src_get_size);
>   gstbasesrc_class->is_seekable =
>       GST_DEBUG_FUNCPTR (gst_gnome_vfs_src_is_seekable);
>@@ -254,7 +260,9 @@
> {
>   gnomevfssrc->uri = NULL;
>   gnomevfssrc->uri_name = NULL;
>+  gnomevfssrc->context = NULL;
>   gnomevfssrc->handle = NULL;
>+  gnomevfssrc->interrupted = FALSE;
>   gnomevfssrc->curoffset = 0;
>   gnomevfssrc->seekable = FALSE;
> 
>@@ -632,9 +640,19 @@
>   data = GST_BUFFER_DATA (buf);
> 
>   todo = size;
>-  while (todo > 0) {
>+  while (!src->interrupted && todo > 0) {
>     /* this can return less that we ask for */
>-    res = gnome_vfs_read (src->handle, data, todo, &readbytes);
>+    res = gnome_vfs_read_cancellable (src->handle, data, todo, &readbytes, src->context);
>+
>+    if (G_UNLIKELY (res == GNOME_VFS_ERROR_CANCELLED)) {
>+      GST_DEBUG_OBJECT (src, "interrupted");
>+
>+      /* Just take what we've so far gotten and return */
>+      size = size - todo;
>+      GST_BUFFER_SIZE (buf) = size;
>+      todo = 0;
>+      break;
>+    }
> 
>     if (G_UNLIKELY (res == GNOME_VFS_ERROR_EOF || (res == GNOME_VFS_OK
>                 && readbytes == 0)))
>@@ -651,6 +669,11 @@
>     }
>     GST_LOG ("  got size %" G_GUINT64_FORMAT, readbytes);
>   }
>+
>+  /* Handle interrupts implicitly, since the flag may have been cleared by now */
>+  if (size == todo)
>+    goto interrupted;
>+
>   GST_BUFFER_OFFSET (buf) = src->curoffset;
>   src->curoffset += size;
> 
>@@ -680,6 +703,11 @@
>         ("Failed to read data: %s", gnome_vfs_result_to_string (res)));
>     return GST_FLOW_WRONG_STATE;
>   }
>+interrupted:
>+  {
>+    gst_buffer_unref (buf);
>+    return GST_FLOW_UNEXPECTED;
>+  }
> eos:
>   {
>     gst_buffer_unref (buf);
>@@ -765,6 +793,38 @@
>   }
> }
> 
>+/* Interrupt a blocking request. */
>+static gboolean
>+gst_gnome_vfs_src_unlock (GstBaseSrc * basesrc)
>+{
>+  GstGnomeVFSSrc *src;
>+
>+  src = GST_GNOME_VFS_SRC (basesrc);
>+  GST_DEBUG_OBJECT (src, "unlock()");
>+  src->interrupted = TRUE;
>+  if (src->context)
>+  {
>+    GnomeVFSCancellation *cancel =
>+      gnome_vfs_context_get_cancellation (src->context);
>+    if (cancel)
>+      gnome_vfs_cancellation_cancel (cancel);
>+  }
>+  return TRUE;
>+}
>+
>+/* Interrupt interrupt. */
>+static gboolean
>+gst_gnome_vfs_src_unlock_stop (GstBaseSrc * basesrc)
>+{
>+  GstGnomeVFSSrc *src;
>+
>+  src = GST_GNOME_VFS_SRC (basesrc);
>+  GST_DEBUG_OBJECT (src, "unlock_stop()");
>+
>+  src->interrupted = FALSE;
>+  return TRUE;
>+}
>+
> static gboolean
> gst_gnome_vfs_src_get_size (GstBaseSrc * basesrc, guint64 * size)
> {
>@@ -818,6 +878,7 @@
> 
>   gst_gnome_vfs_src_push_callbacks (src);
> 
>+  src->context = gnome_vfs_context_new();
>   if (src->uri != NULL) {
>     GnomeVFSOpenMode mode = GNOME_VFS_OPEN_READ;
> 
>@@ -889,6 +950,9 @@
>     src->handle = NULL;
>   }
>   src->curoffset = 0;
>+  src->interrupted = FALSE;
>+  gnome_vfs_context_free( src->context );
>+  src->context = NULL;
> 
>   return TRUE;
> }

-- 
Configure bugmail: https://bugzilla.gnome.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.



More information about the Gstreamer-bugs mailing list