static void gst_uri_downloader_dispose (GObject * object) { GstUriDownloader *downloader = GST_URI_DOWNLOADER (object); if (downloader->priv->urisrc != NULL) { gst_element_set_state (downloader->priv->urisrc, GST_STATE_NULL); gst_object_unref (downloader->priv->urisrc); downloader->priv->urisrc = NULL; } if (downloader->priv->bus != NULL) { gst_object_unref (downloader->priv->bus); downloader->priv->bus = NULL; } if (downloader->priv->pad) { gst_object_unref (downloader->priv->pad); downloader->priv->pad = NULL; } if (downloader->priv->download) { g_object_unref (downloader->priv->download); downloader->priv->download = NULL; } G_OBJECT_CLASS (gst_uri_downloader_parent_class)->dispose (object); }
static GstFlowReturn gst_uri_downloader_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { GstUriDownloader *downloader; downloader = GST_URI_DOWNLOADER (gst_pad_get_element_private (pad)); /* HTML errors (404, 500, etc...) are also pushed through this pad as * response but the source element will also post a warning or error message * in the bus, which is handled synchronously cancelling the download. */ GST_OBJECT_LOCK (downloader); if (downloader->priv->download == NULL) { /* Download cancelled, quit */ gst_buffer_unref (buf); GST_OBJECT_UNLOCK (downloader); goto done; } GST_LOG_OBJECT (downloader, "The uri fetcher received a new buffer " "of size %" G_GSIZE_FORMAT, gst_buffer_get_size (buf)); downloader->priv->got_buffer = TRUE; if (!gst_fragment_add_buffer (downloader->priv->download, buf)) { GST_WARNING_OBJECT (downloader, "Could not add buffer to fragment"); gst_buffer_unref (buf); } GST_OBJECT_UNLOCK (downloader); done: { return GST_FLOW_OK; } }
static gboolean gst_uri_downloader_sink_event (GstPad * pad, GstEvent * event) { gboolean ret = FALSE; GstUriDownloader *downloader; downloader = GST_URI_DOWNLOADER (gst_pad_get_element_private (pad)); switch (event->type) { case GST_EVENT_EOS:{ GST_OBJECT_LOCK (downloader); GST_DEBUG_OBJECT (downloader, "Got EOS on the fetcher pad"); if (downloader->priv->download != NULL) { /* signal we have fetched the URI */ downloader->priv->download->completed = TRUE; downloader->priv->download->download_stop_time = gst_util_get_timestamp (); GST_OBJECT_UNLOCK (downloader); GST_DEBUG_OBJECT (downloader, "Signaling chain funtion"); g_cond_signal (downloader->priv->cond); } else { GST_OBJECT_UNLOCK (downloader); } gst_event_unref (event); break; } default: ret = gst_pad_event_default (pad, event); break; } return ret; }
static void gst_uri_downloader_finalize (GObject * object) { GstUriDownloader *downloader = GST_URI_DOWNLOADER (object); g_mutex_clear (&downloader->priv->download_lock); g_cond_clear (&downloader->priv->cond); G_OBJECT_CLASS (gst_uri_downloader_parent_class)->finalize (object); }
static gboolean gst_uri_downloader_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { gboolean ret = FALSE; GstUriDownloader *downloader; downloader = GST_URI_DOWNLOADER (gst_pad_get_element_private (pad)); switch (event->type) { case GST_EVENT_EOS:{ GST_OBJECT_LOCK (downloader); GST_DEBUG_OBJECT (downloader, "Got EOS on the fetcher pad"); if (downloader->priv->download != NULL) { /* signal we have fetched the URI */ downloader->priv->download->completed = TRUE; downloader->priv->download->download_stop_time = gst_util_get_timestamp (); GST_DEBUG_OBJECT (downloader, "Signaling chain funtion"); g_cond_signal (&downloader->priv->cond); } GST_OBJECT_UNLOCK (downloader); gst_event_unref (event); break; } case GST_EVENT_CUSTOM_DOWNSTREAM_STICKY:{ const GstStructure *str; str = gst_event_get_structure (event); if (gst_structure_has_name (str, "http-headers")) { GST_OBJECT_LOCK (downloader); if (downloader->priv->download != NULL) { if (downloader->priv->download->headers) gst_structure_free (downloader->priv->download->headers); downloader->priv->download->headers = gst_structure_copy (str); } GST_OBJECT_UNLOCK (downloader); } } /* falls through */ default: ret = gst_pad_event_default (pad, parent, event); break; } return ret; }
static GstFlowReturn gst_uri_downloader_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { GstUriDownloader *downloader; GstFlowReturn ret; downloader = GST_URI_DOWNLOADER (gst_pad_get_element_private (pad)); GST_LOG_OBJECT (downloader, "got %" G_GSIZE_FORMAT " bytes buffer", gst_buffer_get_size (buf)); if (downloader->chain) ret = downloader->chain (buf, downloader->priv); else ret = GST_FLOW_OK; return ret; }
static gboolean gst_uri_downloader_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstUriDownloader *downloader; downloader = GST_URI_DOWNLOADER (gst_pad_get_element_private (pad)); if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) { GST_DEBUG_OBJECT (downloader, "Got EOS on the fetcher pad"); GST_OBJECT_LOCK (downloader); downloader->eos = TRUE; g_cond_signal (&downloader->cond); GST_OBJECT_UNLOCK (downloader); } gst_event_unref (event); return TRUE; }