static gboolean gst_raw_parse_sink_activatepull (GstPad * sinkpad, gboolean active) { GstRawParse *rp = GST_RAW_PARSE (gst_pad_get_parent (sinkpad)); gboolean result; if (active) { GstFormat format; gint64 duration; /* get the duration in bytes */ format = GST_FORMAT_BYTES; result = gst_pad_query_peer_duration (sinkpad, &format, &duration); if (result) { GST_DEBUG_OBJECT (rp, "got duration %" GST_TIME_FORMAT, GST_TIME_ARGS (duration)); rp->upstream_length = duration; /* convert to time */ gst_raw_parse_convert (rp, format, duration, GST_FORMAT_TIME, &duration); } else { rp->upstream_length = -1; duration = -1; } gst_segment_set_duration (&rp->segment, GST_FORMAT_TIME, duration); result = gst_raw_parse_handle_seek_pull (rp, NULL); } else { result = gst_pad_stop_task (sinkpad); } gst_object_unref (rp); return result; }
static gboolean gst_raw_parse_sink_activatemode (GstPad * sinkpad, GstObject * parent, GstPadMode mode, gboolean active) { GstRawParse *rp = GST_RAW_PARSE (parent); gboolean result; switch (mode) { case GST_PAD_MODE_PULL: if (active) { GstFormat format; gint64 duration; /* get the duration in bytes */ format = GST_FORMAT_BYTES; result = gst_pad_peer_query_duration (sinkpad, format, &duration); if (result) { GST_DEBUG_OBJECT (rp, "got duration %" GST_TIME_FORMAT, GST_TIME_ARGS (duration)); rp->upstream_length = duration; /* convert to time */ gst_raw_parse_convert (rp, format, duration, GST_FORMAT_TIME, &duration); } else { rp->upstream_length = -1; duration = -1; } rp->segment.duration = duration; rp->push_stream_start = TRUE; result = gst_raw_parse_handle_seek_pull (rp, NULL); rp->mode = mode; } else { result = gst_pad_stop_task (sinkpad); } return result; case GST_PAD_MODE_PUSH: rp->mode = mode; return TRUE; default: return FALSE; } }
static gboolean gst_raw_parse_src_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstRawParse *rp = GST_RAW_PARSE (parent); gboolean ret; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: if (rp->mode == GST_PAD_MODE_PUSH) ret = gst_raw_parse_handle_seek_push (rp, event); else ret = gst_raw_parse_handle_seek_pull (rp, event); break; default: ret = gst_pad_event_default (rp->srcpad, parent, event); break; } return ret; }
static gboolean gst_raw_parse_src_event (GstPad * pad, GstEvent * event) { GstRawParse *rp = GST_RAW_PARSE (gst_pad_get_parent (pad)); gboolean ret; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: if (rp->mode == GST_ACTIVATE_PUSH) ret = gst_raw_parse_handle_seek_push (rp, event); else ret = gst_raw_parse_handle_seek_pull (rp, event); break; default: ret = gst_pad_event_default (rp->srcpad, event); break; } gst_object_unref (rp); return ret; }