diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-06-10 14:55:18 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-06-11 10:06:04 +0200 |
commit | 101123a75db8d9f53a50498e5e6304aa7ea9ca10 (patch) | |
tree | a38cb1747105c1a0ecdce5bfbfb244ed94367273 | |
parent | 4710a91cbfb1b77cd9d93dc7373a07f07b1c9fde (diff) |
deinterlace: Clip buffers to the current segment if possible
-rw-r--r-- | gst/deinterlace/gstdeinterlace.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/gst/deinterlace/gstdeinterlace.c b/gst/deinterlace/gstdeinterlace.c index dd852a0b..fadacdb5 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; |