static GstFlowReturn gst_gdk_pixbuf_chain (GstPad * pad, GstBuffer * buf) { GstGdkPixbuf *filter; GstFlowReturn ret = GST_FLOW_OK; GError *error = NULL; GstClockTime timestamp; guint8 *data; guint size; filter = GST_GDK_PIXBUF (gst_pad_get_parent (pad)); timestamp = GST_BUFFER_TIMESTAMP (buf); if (GST_CLOCK_TIME_IS_VALID (timestamp)) filter->last_timestamp = timestamp; GST_LOG_OBJECT (filter, "buffer with ts: %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (filter->pixbuf_loader == NULL) filter->pixbuf_loader = gdk_pixbuf_loader_new (); data = GST_BUFFER_DATA (buf); size = GST_BUFFER_SIZE (buf); GST_LOG_OBJECT (filter, "Writing buffer size %d", size); if (!gdk_pixbuf_loader_write (filter->pixbuf_loader, data, size, &error)) goto error; /* packetised mode? */ if (filter->framerate_numerator != 0) { gdk_pixbuf_loader_close (filter->pixbuf_loader, NULL); ret = gst_gdk_pixbuf_flush (filter); g_object_unref (filter->pixbuf_loader); filter->pixbuf_loader = NULL; } gst_buffer_unref (buf); gst_object_unref (filter); return ret; /* ERRORS */ error: { GST_ELEMENT_ERROR (filter, STREAM, DECODE, (NULL), ("gdk_pixbuf_loader_write error: %s", error->message)); g_error_free (error); gst_buffer_unref (buf); gst_object_unref (filter); return GST_FLOW_ERROR; } }
static gboolean gst_gdk_pixbuf_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstFlowReturn res = GST_FLOW_OK; gboolean ret = TRUE, forward = TRUE; GstGdkPixbuf *pixbuf; pixbuf = GST_GDK_PIXBUF (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (event, &caps); ret = gst_gdk_pixbuf_sink_setcaps (pixbuf, caps); forward = FALSE; break; } case GST_EVENT_EOS: if (pixbuf->pixbuf_loader != NULL) { gdk_pixbuf_loader_close (pixbuf->pixbuf_loader, NULL); res = gst_gdk_pixbuf_flush (pixbuf); g_object_unref (G_OBJECT (pixbuf->pixbuf_loader)); pixbuf->pixbuf_loader = NULL; /* as long as we don't have flow returns for event functions we need * to post an error here, or the application might never know that * things failed */ if (res != GST_FLOW_OK && res != GST_FLOW_FLUSHING) { GST_ELEMENT_ERROR (pixbuf, STREAM, FAILED, (NULL), ("Flow: %s", gst_flow_get_name (res))); forward = FALSE; ret = FALSE; } } break; case GST_EVENT_SEGMENT: case GST_EVENT_FLUSH_STOP: if (pixbuf->pixbuf_loader != NULL) { gdk_pixbuf_loader_close (pixbuf->pixbuf_loader, NULL); g_object_unref (G_OBJECT (pixbuf->pixbuf_loader)); pixbuf->pixbuf_loader = NULL; } break; default: break; } if (forward) { ret = gst_pad_event_default (pad, parent, event); } else { gst_event_unref (event); } return ret; }
static GstFlowReturn gst_gdk_pixbuf_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { GstGdkPixbuf *filter; GstFlowReturn ret = GST_FLOW_OK; GError *error = NULL; GstClockTime timestamp; GstMapInfo map; filter = GST_GDK_PIXBUF (parent); timestamp = GST_BUFFER_TIMESTAMP (buf); if (GST_CLOCK_TIME_IS_VALID (timestamp)) filter->last_timestamp = timestamp; GST_LOG_OBJECT (filter, "buffer with ts: %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (filter->pixbuf_loader == NULL) filter->pixbuf_loader = gdk_pixbuf_loader_new (); gst_buffer_map (buf, &map, GST_MAP_READ); GST_LOG_OBJECT (filter, "Writing buffer size %d", (gint) map.size); if (!gdk_pixbuf_loader_write (filter->pixbuf_loader, map.data, map.size, &error)) goto error; /* packetised mode? */ if (filter->in_fps_n != 0) { gdk_pixbuf_loader_close (filter->pixbuf_loader, NULL); ret = gst_gdk_pixbuf_flush (filter); g_object_unref (filter->pixbuf_loader); filter->pixbuf_loader = NULL; } gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); return ret; /* ERRORS */ error: { GST_ELEMENT_ERROR (filter, STREAM, DECODE, (NULL), ("gdk_pixbuf_loader_write error: %s", error->message)); g_error_free (error); gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); return GST_FLOW_ERROR; } }