static GstFlowReturn gst_valve_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) { GstValve *valve = GST_VALVE (parent); GstFlowReturn ret = GST_FLOW_OK; if (g_atomic_int_get (&valve->drop)) { gst_buffer_unref (buffer); valve->discont = TRUE; } else { if (valve->discont) { buffer = gst_buffer_make_writable (buffer); GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); valve->discont = FALSE; } if (valve->need_repush_sticky) gst_valve_repush_sticky (valve); ret = gst_pad_push (valve->srcpad, buffer); } /* Ignore errors if "drop" was changed while the thread was blocked * downwards */ if (g_atomic_int_get (&valve->drop)) ret = GST_FLOW_OK; return ret; }
static gboolean gst_valve_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstValve *valve; gboolean is_sticky = GST_EVENT_IS_STICKY (event); gboolean ret = TRUE; valve = GST_VALVE (parent); if (g_atomic_int_get (&valve->drop)) { valve->need_repush_sticky |= is_sticky; gst_event_unref (event); } else { if (valve->need_repush_sticky) gst_valve_repush_sticky (valve); ret = gst_pad_event_default (pad, parent, event); } /* Ignore errors if "drop" was changed while the thread was blocked * downwards. */ if (g_atomic_int_get (&valve->drop)) { valve->need_repush_sticky |= is_sticky; ret = TRUE; } return ret; }
static gboolean gst_valve_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstValve *valve = GST_VALVE (parent); if (GST_QUERY_IS_SERIALIZED (query) && g_atomic_int_get (&valve->drop)) return FALSE; return gst_pad_query_default (pad, parent, query); }
static void gst_valve_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstValve *valve = GST_VALVE (object); switch (prop_id) { case PROP_DROP: g_value_set_boolean (value, g_atomic_int_get (&valve->drop)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_valve_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstValve *valve = GST_VALVE (object); switch (prop_id) { case PROP_DROP: g_atomic_int_set (&valve->drop, g_value_get_boolean (value)); gst_pad_push_event (valve->sinkpad, gst_event_new_reconfigure ()); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static GstCaps * gst_valve_getcaps (GstPad * pad) { GstValve *valve = GST_VALVE (gst_pad_get_parent (pad)); GstCaps *caps; if (pad == valve->sinkpad) caps = gst_pad_peer_get_caps (valve->srcpad); else caps = gst_pad_peer_get_caps (valve->sinkpad); if (caps == NULL) caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); gst_object_unref (valve); return caps; }
static gboolean gst_valve_event (GstPad * pad, GstEvent * event) { GstValve *valve = GST_VALVE (gst_pad_get_parent_element (pad)); gboolean ret = TRUE; if (g_atomic_int_get (&valve->drop)) gst_event_unref (event); else ret = gst_pad_push_event (valve->srcpad, event); /* Ignore errors if "drop" was changed while the thread was blocked * downwards. */ if (g_atomic_int_get (&valve->drop)) ret = TRUE; gst_object_unref (valve); return ret; }
static GstFlowReturn gst_valve_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstValve *valve = GST_VALVE (gst_pad_get_parent_element (pad)); GstFlowReturn ret = GST_FLOW_OK; if (g_atomic_int_get (&valve->drop)) *buf = NULL; else ret = gst_pad_alloc_buffer (valve->srcpad, offset, size, caps, buf); /* Ignore errors if "drop" was changed while the thread was blocked * downwards */ if (g_atomic_int_get (&valve->drop)) ret = GST_FLOW_OK; gst_object_unref (valve); return ret; }