static gboolean gst_gdk_pixbuf_dec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstFlowReturn res = GST_FLOW_OK; gboolean ret = TRUE, forward = TRUE; GstGdkPixbufDec *pixbuf; pixbuf = GST_GDK_PIXBUF_DEC (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (event, &caps); ret = gst_gdk_pixbuf_dec_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_dec_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 gboolean gst_gdk_pixbuf_dec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstFlowReturn res = GST_FLOW_OK; gboolean ret = TRUE, forward = TRUE; GstGdkPixbufDec *pixbuf; pixbuf = GST_GDK_PIXBUF_DEC (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (event, &caps); ret = gst_gdk_pixbuf_dec_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_dec_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 && res != GST_FLOW_EOS && res != GST_FLOW_NOT_LINKED) { GST_ELEMENT_ERROR (pixbuf, STREAM, FAILED, (NULL), ("Flow: %s", gst_flow_get_name (res))); forward = FALSE; ret = FALSE; } } break; case GST_EVENT_FLUSH_STOP: g_list_free_full (pixbuf->pending_events, (GDestroyNotify) gst_event_unref); pixbuf->pending_events = NULL; /* Fall through */ case GST_EVENT_SEGMENT: { const GstSegment *segment; gst_event_parse_segment (event, &segment); if (segment->format == GST_FORMAT_BYTES) pixbuf->packetized = FALSE; else pixbuf->packetized = TRUE; 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) { if (!gst_pad_has_current_caps (pixbuf->srcpad) && GST_EVENT_IS_SERIALIZED (event) && GST_EVENT_TYPE (event) > GST_EVENT_CAPS && GST_EVENT_TYPE (event) != GST_EVENT_FLUSH_STOP && GST_EVENT_TYPE (event) != GST_EVENT_EOS) { ret = TRUE; pixbuf->pending_events = g_list_prepend (pixbuf->pending_events, event); } else { ret = gst_pad_event_default (pad, parent, event); } } else { gst_event_unref (event); } return ret; }