static void gst_segment_clip_init (GstSegmentClip * self, GstSegmentClipClass * g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstPadTemplate *templ; templ = gst_element_class_get_pad_template (element_class, "sink"); g_assert (templ); self->sinkpad = gst_pad_new_from_template (templ, "sink"); gst_pad_set_chain_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_segment_clip_sink_chain)); gst_pad_set_event_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_segment_clip_event)); gst_pad_set_query_function (self->sinkpad, GST_DEBUG_FUNCPTR (gst_segment_clip_query)); GST_PAD_SET_PROXY_ALLOCATION (self->sinkpad); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); gst_object_unref (templ); templ = gst_element_class_get_pad_template (element_class, "src"); g_assert (templ); self->srcpad = gst_pad_new_from_template (templ, "src"); gst_pad_set_event_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_segment_clip_event)); gst_pad_set_query_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_segment_clip_query)); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); gst_segment_clip_reset (self); }
static gboolean gst_segment_clip_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstSegmentClip *self = GST_SEGMENT_CLIP (parent); gboolean ret = TRUE; GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; /* should be only downstream */ g_assert (pad == self->sinkpad); gst_event_parse_caps (event, &caps); ret = gst_segment_clip_sink_setcaps (self, caps); break; } case GST_EVENT_SEGMENT: { const GstSegment *segment; gst_event_parse_segment (event, &segment); GST_DEBUG_OBJECT (pad, "Got NEWSEGMENT event %" GST_SEGMENT_FORMAT, segment); gst_segment_copy_into (segment, &self->segment); break; } case GST_EVENT_FLUSH_STOP: gst_segment_clip_reset (self); break; default: break; } if (ret) ret = gst_pad_event_default (pad, parent, event); else gst_event_unref (event); return ret; }
static gboolean gst_segment_clip_event (GstPad * pad, GstEvent * event) { GstSegmentClip *self = GST_SEGMENT_CLIP (gst_pad_get_parent (pad)); GstPad *otherpad; gboolean ret; GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); otherpad = (pad == self->srcpad) ? self->sinkpad : self->srcpad; ret = gst_pad_push_event (otherpad, event); if (ret) { switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT:{ GstFormat fmt; gboolean is_update; gint64 start, end, base; gdouble rate; gst_event_parse_new_segment (event, &is_update, &rate, &fmt, &start, &end, &base); GST_DEBUG_OBJECT (pad, "Got NEWSEGMENT event in %s format, passing on (%" GST_TIME_FORMAT " - %" GST_TIME_FORMAT ")", gst_format_get_name (fmt), GST_TIME_ARGS (start), GST_TIME_ARGS (end)); gst_segment_set_newsegment (&self->segment, is_update, rate, fmt, start, end, base); break; } case GST_EVENT_FLUSH_STOP: gst_segment_clip_reset (self); break; default: break; } } gst_object_unref (self); return ret; }
static GstStateChangeReturn gst_segment_clip_change_state (GstElement * element, GstStateChange transition) { GstSegmentClip *self = GST_SEGMENT_CLIP (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; if (GST_ELEMENT_CLASS (parent_class)->change_state) ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_PAUSED_TO_READY: gst_segment_clip_reset (self); break; default: break; } return ret; }