GstFragment * gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri) { GstStateChangeReturn ret; GstFragment *download = NULL; g_mutex_lock (&downloader->priv->lock); if (downloader->priv->cancelled) { goto quit; } if (!gst_uri_downloader_set_uri (downloader, uri)) { goto quit; } downloader->priv->download = gst_fragment_new (); gst_bus_set_flushing (downloader->priv->bus, FALSE); ret = gst_element_set_state (downloader->priv->urisrc, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_object_unref (downloader->priv->download); downloader->priv->download = NULL; goto quit; } /* wait until: * - the download succeed (EOS in the src pad) * - the download failed (Error message on the fetcher bus) * - the download was canceled */ 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; GST_OBJECT_UNLOCK (downloader); if (download != NULL) GST_INFO_OBJECT (downloader, "URI fetched successfully"); else GST_INFO_OBJECT (downloader, "Error fetching URI"); quit: { gst_uri_downloader_stop (downloader); g_mutex_unlock (&downloader->priv->lock); return download; } }
gboolean gst_uri_downloader_stream_uri (GstUriDownloader * downloader, const gchar * uri, gint64 range_start, gint64 range_end, GstUriDownloaderChainFunction chain_func, gpointer user_data) { GstStateChangeReturn ret; GST_INFO_OBJECT (downloader, "fetching URI %s", uri); g_mutex_lock (&downloader->download_lock); downloader->chain = chain_func; downloader->priv = user_data; downloader->eos = FALSE; gst_pad_set_active (downloader->pad, TRUE); GST_OBJECT_LOCK (downloader); if (downloader->cancelled) goto quit; if (!gst_uri_downloader_set_uri (downloader, uri)) { GST_ERROR_OBJECT (downloader, "failed to set URI"); goto quit; } gst_bus_set_flushing (downloader->bus, FALSE); GST_OBJECT_UNLOCK (downloader); /* set to ready state first to allow setting range */ ret = gst_element_set_state (downloader->urisrc, GST_STATE_READY); GST_OBJECT_LOCK (downloader); if (ret == GST_STATE_CHANGE_FAILURE) { GST_ERROR_OBJECT (downloader, "failed to set src to READY"); goto quit; } if (downloader->cancelled) goto quit; if (!gst_uri_downloader_set_range (downloader, range_start, range_end)) { GST_ERROR_OBJECT (downloader, "failed to set range"); goto quit; } GST_OBJECT_UNLOCK (downloader); ret = gst_element_set_state (downloader->urisrc, GST_STATE_PLAYING); GST_OBJECT_LOCK (downloader); if (ret == GST_STATE_CHANGE_FAILURE) { GST_ERROR_OBJECT (downloader, "failed to set src to PLAYING"); goto quit; } if (downloader->cancelled) goto quit; if (!downloader->eos) { /* wait until: * - the download succeed (EOS in the src pad) * - the download failed (Error message on the fetcher bus) * - the download was canceled */ GST_DEBUG_OBJECT (downloader, "waiting to fetch the URI %s", uri); g_cond_wait (&downloader->cond, GST_OBJECT_GET_LOCK (downloader)); } quit: { gboolean ret = FALSE; if (downloader->cancelled) { GST_DEBUG_OBJECT (downloader, "download interrupted"); } else if (downloader->eos) { GST_DEBUG_OBJECT (downloader, "URI fetched successfully"); ret = TRUE; } downloader->cancelled = FALSE; gst_uri_downloader_stop (downloader); GST_OBJECT_UNLOCK (downloader); g_mutex_unlock (&downloader->download_lock); return ret; } }