diff --git a/gst-libs/gst/uridownloader/gsturidownloader.c b/gst-libs/gst/uridownloader/gsturidownloader.c index 5384141ae0..4ca0dc70ec 100644 --- a/gst-libs/gst/uridownloader/gsturidownloader.c +++ b/gst-libs/gst/uridownloader/gsturidownloader.c @@ -41,6 +41,7 @@ struct _GstUriDownloaderPrivate GstFragment *download; GMutex lock; GCond cond; + gboolean cancelled; }; static void gst_uri_downloader_finalize (GObject * object); @@ -263,6 +264,16 @@ gst_uri_downloader_stop (GstUriDownloader * downloader) GST_CLOCK_TIME_NONE); } +void +gst_uri_downloader_reset (GstUriDownloader * downloader) +{ + g_return_if_fail (downloader != NULL); + + GST_OBJECT_LOCK (downloader); + downloader->priv->cancelled = FALSE; + GST_OBJECT_UNLOCK (downloader); +} + void gst_uri_downloader_cancel (GstUriDownloader * downloader) { @@ -271,15 +282,21 @@ gst_uri_downloader_cancel (GstUriDownloader * downloader) GST_DEBUG_OBJECT (downloader, "Cancelling download"); g_object_unref (downloader->priv->download); downloader->priv->download = NULL; + downloader->priv->cancelled = TRUE; GST_OBJECT_UNLOCK (downloader); GST_DEBUG_OBJECT (downloader, "Signaling chain funtion"); g_mutex_lock (&downloader->priv->lock); g_cond_signal (&downloader->priv->cond); g_mutex_unlock (&downloader->priv->lock); } else { + gboolean cancelled; + + cancelled = downloader->priv->cancelled; + downloader->priv->cancelled = TRUE; GST_OBJECT_UNLOCK (downloader); - GST_DEBUG_OBJECT (downloader, - "Trying to cancell a download that was alredy cancelled"); + if (cancelled) + GST_DEBUG_OBJECT (downloader, + "Trying to cancell a download that was alredy cancelled"); } } @@ -319,6 +336,10 @@ gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri) g_mutex_lock (&downloader->priv->lock); + if (downloader->priv->cancelled) { + goto quit; + } + if (!gst_uri_downloader_set_uri (downloader, uri)) { goto quit; } @@ -337,9 +358,17 @@ gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri) * - the download failed (Error message on the fetcher bus) * - the download was canceled */ - GST_DEBUG_OBJECT (downloader, "Waiting to fetch the URI"); + GST_DEBUG_OBJECT (downloader, "Waiting to fetch the URI %s", uri); g_cond_wait (&downloader->priv->cond, &downloader->priv->lock); + if (downloader->priv->cancelled) { + if (downloader->priv->download) { + g_object_unref (downloader->priv->download); + downloader->priv->download = NULL; + } + goto quit; + } + GST_OBJECT_LOCK (downloader); download = downloader->priv->download; downloader->priv->download = NULL; diff --git a/gst-libs/gst/uridownloader/gsturidownloader.h b/gst-libs/gst/uridownloader/gsturidownloader.h index 8c1a6ec284..c29cb52b39 100644 --- a/gst-libs/gst/uridownloader/gsturidownloader.h +++ b/gst-libs/gst/uridownloader/gsturidownloader.h @@ -57,6 +57,7 @@ GType gst_uri_downloader_get_type (void); GstUriDownloader * gst_uri_downloader_new (void); GstFragment * gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri); +void gst_uri_downloader_reset (GstUriDownloader *downloader); void gst_uri_downloader_cancel (GstUriDownloader *downloader); void gst_uri_downloader_free (GstUriDownloader *downloader);