[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:50:59 PDT 2010


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

--- Comment #6 from American Dynamics <GStreamer-Bugs at tycosp.com> 2010-08-30 17:50:57 UTC ---
PLEASE DISREGARD THIS COMMENT!

(In reply to comment #5)
> (From update of attachment 169093 [details])
> >--- 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