summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-06-10 14:55:18 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-06-11 10:06:04 +0200
commit101123a75db8d9f53a50498e5e6304aa7ea9ca10 (patch)
treea38cb1747105c1a0ecdce5bfbfb244ed94367273
parent4710a91cbfb1b77cd9d93dc7373a07f07b1c9fde (diff)
deinterlace: Clip buffers to the current segment if possible
-rw-r--r--gst/deinterlace/gstdeinterlace.c43
1 files changed, 41 insertions, 2 deletions
diff --git a/gst/deinterlace/gstdeinterlace.c b/gst/deinterlace/gstdeinterlace.c
index dd852a0b6..fadacdb57 100644
--- a/gst/deinterlace/gstdeinterlace.c
+++ b/gst/deinterlace/gstdeinterlace.c
@@ -469,6 +469,33 @@ gst_deinterlace_set_method (GstDeinterlace * self, GstDeinterlaceMethods method)
gst_child_proxy_child_added (GST_OBJECT (self), GST_OBJECT (self->method));
}
+static gboolean
+gst_deinterlace_clip_buffer (GstDeinterlace * self, GstBuffer * buffer)
+{
+ gboolean ret = TRUE;
+ GstClockTime start, stop;
+ gint64 cstart, cstop;
+
+ if (G_UNLIKELY (self->segment.format != GST_FORMAT_TIME))
+ goto beach;
+ if (G_UNLIKELY (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer)))
+ goto beach;
+
+ start = GST_BUFFER_TIMESTAMP (buffer);
+ stop = start + GST_BUFFER_DURATION (buffer);
+
+ if (!(ret = gst_segment_clip (&self->segment, GST_FORMAT_TIME,
+ start, stop, &cstart, &cstop)))
+ goto beach;
+
+ GST_BUFFER_TIMESTAMP (buffer) = cstart;
+ if (GST_CLOCK_TIME_IS_VALID (cstop))
+ GST_BUFFER_DURATION (buffer) = cstop - cstart;
+
+beach:
+ return ret;
+}
+
static void
gst_deinterlace_base_init (gpointer klass)
{
@@ -1089,7 +1116,13 @@ gst_deinterlace_chain (GstPad * pad, GstBuffer * buf)
gst_buffer_unref (gst_deinterlace_pop_history (self));
- ret = gst_pad_push (self->srcpad, outbuf);
+ if (gst_deinterlace_clip_buffer (self, outbuf)) {
+ ret = gst_pad_push (self->srcpad, outbuf);
+ } else {
+ ret = GST_FLOW_OK;
+ gst_buffer_unref (outbuf);
+ }
+
outbuf = NULL;
if (ret != GST_FLOW_OK)
return ret;
@@ -1144,7 +1177,13 @@ gst_deinterlace_chain (GstPad * pad, GstBuffer * buf)
gst_buffer_unref (gst_deinterlace_pop_history (self));
- ret = gst_pad_push (self->srcpad, outbuf);
+ if (gst_deinterlace_clip_buffer (self, outbuf)) {
+ ret = gst_pad_push (self->srcpad, outbuf);
+ } else {
+ ret = GST_FLOW_OK;
+ gst_buffer_unref (outbuf);
+ }
+
outbuf = NULL;
if (ret != GST_FLOW_OK)
return ret;