[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