From 28e9d735bbcf989b52062b0b299de1b2e1bb6aa8 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Fri, 16 Dec 2011 17:59:22 +0100 Subject: [PATCH] collectpads2: add convenience clipping function ... which also converts to running time; useful for typical muxer. --- libs/gst/base/gstcollectpads2.c | 42 +++++++++++++++++++++++++++++++++ libs/gst/base/gstcollectpads2.h | 5 ++++ 2 files changed, 47 insertions(+) diff --git a/libs/gst/base/gstcollectpads2.c b/libs/gst/base/gstcollectpads2.c index 932e3c903a..3e51a0c615 100644 --- a/libs/gst/base/gstcollectpads2.c +++ b/libs/gst/base/gstcollectpads2.c @@ -401,6 +401,48 @@ gst_collect_pads2_set_event_function (GstCollectPads2 * pads, GST_OBJECT_UNLOCK (pads); } +/** +* gst_collect_pads2_clip_running: +* @pads: the collectspads to use +* @cdata: collect data of corrsponding pad +* @buf: buffer being clipped +* @outbuf: output buffer with running time, or NULL if clipped +* @user_data: user data (unused) +* +* Convenience clipping function that converts incoming buffer's timestamp +* to running time, or clips the buffer if outside configured segment. +* +* Since: 0.10.37 +*/ +GstFlowReturn +gst_collect_pads2_clip_running_time (GstCollectPads2 * pads, + GstCollectData2 * cdata, GstBuffer * buf, GstBuffer ** outbuf, + gpointer user_data) +{ + GstClockTime time; + + *outbuf = buf; + time = GST_BUFFER_TIMESTAMP (buf); + + /* invalid left alone and passed */ + if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) { + time = gst_segment_to_running_time (&cdata->segment, GST_FORMAT_TIME, time); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { + GST_DEBUG_OBJECT (cdata->pad, "clipping buffer on pad outside segment"); + gst_buffer_unref (buf); + *outbuf = NULL; + } else { + GST_LOG_OBJECT (cdata->pad, "buffer ts %" GST_TIME_FORMAT " -> %" + GST_TIME_FORMAT " running time", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (time)); + *outbuf = gst_buffer_make_metadata_writable (buf); + GST_BUFFER_TIMESTAMP (*outbuf) = time; + } + } + + return GST_FLOW_OK; +} + /** * gst_collect_pads2_set_clip_function: * @pads: the collectspads to use diff --git a/libs/gst/base/gstcollectpads2.h b/libs/gst/base/gstcollectpads2.h index 208b547dc8..7890e7ae35 100644 --- a/libs/gst/base/gstcollectpads2.h +++ b/libs/gst/base/gstcollectpads2.h @@ -380,6 +380,11 @@ GstBuffer* gst_collect_pads2_take_buffer (GstCollectPads2 * pads, GstCollectData void gst_collect_pads2_set_waiting (GstCollectPads2 *pads, GstCollectData2 *data, gboolean waiting); +/* convenience helper */ +GstFlowReturn gst_collect_pads2_clip_running_time (GstCollectPads2 * pads, + GstCollectData2 * cdata, GstBuffer * buf, GstBuffer ** outbuf, + gpointer user_data); + G_END_DECLS