From d09ff4124e1b176dc7395965794b5eccfaeb8270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 27 May 2010 21:06:43 +0200 Subject: [PATCH] deinterlace: Don't reconfigure the caps when changing properties Fixes bug #619848. --- gst/deinterlace/gstdeinterlace.c | 52 +++++++++++++++++++++++++------- gst/deinterlace/gstdeinterlace.h | 4 +++ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/gst/deinterlace/gstdeinterlace.c b/gst/deinterlace/gstdeinterlace.c index fcd0cc74f0..fb01ee3ca1 100644 --- a/gst/deinterlace/gstdeinterlace.c +++ b/gst/deinterlace/gstdeinterlace.c @@ -618,6 +618,14 @@ gst_deinterlace_reset (GstDeinterlace * self) self->fps_n = self->fps_d = 0; self->passthrough = FALSE; + self->reconfigure = FALSE; + if (self->new_mode != -1) + self->mode = self->new_mode; + if (self->new_fields != -1) + self->fields = self->new_fields; + self->new_mode = -1; + self->new_fields = -1; + gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED); if (self->sink_caps) @@ -648,14 +656,17 @@ gst_deinterlace_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_MODE:{ - gint oldmode; + gint new_mode; GST_OBJECT_LOCK (self); - oldmode = self->mode; - self->mode = g_value_get_enum (value); - gst_deinterlace_update_passthrough (self); - if (self->mode != oldmode && GST_PAD_CAPS (self->srcpad)) - gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad)); + new_mode = g_value_get_enum (value); + if (self->mode != new_mode && GST_PAD_CAPS (self->srcpad)) { + self->reconfigure = TRUE; + self->new_mode = new_mode; + } else { + self->mode = new_mode; + gst_deinterlace_update_passthrough (self); + } GST_OBJECT_UNLOCK (self); break; } @@ -663,13 +674,16 @@ gst_deinterlace_set_property (GObject * object, guint prop_id, gst_deinterlace_set_method (self, g_value_get_enum (value)); break; case PROP_FIELDS:{ - gint oldfields; + gint new_fields; GST_OBJECT_LOCK (self); - oldfields = self->fields; - self->fields = g_value_get_enum (value); - if (self->fields != oldfields && GST_PAD_CAPS (self->srcpad)) - gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad)); + new_fields = g_value_get_enum (value); + if (self->fields != new_fields && GST_PAD_CAPS (self->srcpad)) { + self->reconfigure = TRUE; + self->new_fields = new_fields; + } else { + self->fields = new_fields; + } GST_OBJECT_UNLOCK (self); break; } @@ -928,6 +942,22 @@ gst_deinterlace_chain (GstPad * pad, GstBuffer * buf) gint cur_field_idx = 0; GstBuffer *outbuf; + GST_OBJECT_LOCK (self); + if (self->reconfigure) { + if (self->new_fields != -1) + self->fields = self->new_fields; + if (self->new_mode != -1) + self->mode = self->new_mode; + self->new_mode = self->new_fields = -1; + + self->reconfigure = FALSE; + GST_OBJECT_UNLOCK (self); + if (GST_PAD_CAPS (self->srcpad)) + gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad)); + } else { + GST_OBJECT_UNLOCK (self); + } + if (self->still_frame_mode || self->passthrough) return gst_pad_push (self->srcpad, buf); diff --git a/gst/deinterlace/gstdeinterlace.h b/gst/deinterlace/gstdeinterlace.h index d2740bfbbc..7e4ed6da8e 100644 --- a/gst/deinterlace/gstdeinterlace.h +++ b/gst/deinterlace/gstdeinterlace.h @@ -137,6 +137,10 @@ struct _GstDeinterlace GstCaps *src_caps; GstCaps *request_caps; + + gboolean reconfigure; + GstDeinterlaceMode new_mode; + GstDeinterlaceFields new_fields; }; struct _GstDeinterlaceClass