mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-08 11:42:01 +00:00
deinterlace: Don't reconfigure the caps when changing properties
Fixes bug #619848.
This commit is contained in:
parent
ab3b4bc82f
commit
d09ff4124e
2 changed files with 45 additions and 11 deletions
|
@ -618,6 +618,14 @@ gst_deinterlace_reset (GstDeinterlace * self)
|
||||||
self->fps_n = self->fps_d = 0;
|
self->fps_n = self->fps_d = 0;
|
||||||
self->passthrough = FALSE;
|
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);
|
gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
|
||||||
|
|
||||||
if (self->sink_caps)
|
if (self->sink_caps)
|
||||||
|
@ -648,14 +656,17 @@ gst_deinterlace_set_property (GObject * object, guint prop_id,
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_MODE:{
|
case PROP_MODE:{
|
||||||
gint oldmode;
|
gint new_mode;
|
||||||
|
|
||||||
GST_OBJECT_LOCK (self);
|
GST_OBJECT_LOCK (self);
|
||||||
oldmode = self->mode;
|
new_mode = g_value_get_enum (value);
|
||||||
self->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_deinterlace_update_passthrough (self);
|
||||||
if (self->mode != oldmode && GST_PAD_CAPS (self->srcpad))
|
}
|
||||||
gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad));
|
|
||||||
GST_OBJECT_UNLOCK (self);
|
GST_OBJECT_UNLOCK (self);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -663,13 +674,16 @@ gst_deinterlace_set_property (GObject * object, guint prop_id,
|
||||||
gst_deinterlace_set_method (self, g_value_get_enum (value));
|
gst_deinterlace_set_method (self, g_value_get_enum (value));
|
||||||
break;
|
break;
|
||||||
case PROP_FIELDS:{
|
case PROP_FIELDS:{
|
||||||
gint oldfields;
|
gint new_fields;
|
||||||
|
|
||||||
GST_OBJECT_LOCK (self);
|
GST_OBJECT_LOCK (self);
|
||||||
oldfields = self->fields;
|
new_fields = g_value_get_enum (value);
|
||||||
self->fields = g_value_get_enum (value);
|
if (self->fields != new_fields && GST_PAD_CAPS (self->srcpad)) {
|
||||||
if (self->fields != oldfields && GST_PAD_CAPS (self->srcpad))
|
self->reconfigure = TRUE;
|
||||||
gst_deinterlace_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad));
|
self->new_fields = new_fields;
|
||||||
|
} else {
|
||||||
|
self->fields = new_fields;
|
||||||
|
}
|
||||||
GST_OBJECT_UNLOCK (self);
|
GST_OBJECT_UNLOCK (self);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -928,6 +942,22 @@ gst_deinterlace_chain (GstPad * pad, GstBuffer * buf)
|
||||||
gint cur_field_idx = 0;
|
gint cur_field_idx = 0;
|
||||||
GstBuffer *outbuf;
|
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)
|
if (self->still_frame_mode || self->passthrough)
|
||||||
return gst_pad_push (self->srcpad, buf);
|
return gst_pad_push (self->srcpad, buf);
|
||||||
|
|
||||||
|
|
|
@ -137,6 +137,10 @@ struct _GstDeinterlace
|
||||||
GstCaps *src_caps;
|
GstCaps *src_caps;
|
||||||
|
|
||||||
GstCaps *request_caps;
|
GstCaps *request_caps;
|
||||||
|
|
||||||
|
gboolean reconfigure;
|
||||||
|
GstDeinterlaceMode new_mode;
|
||||||
|
GstDeinterlaceFields new_fields;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstDeinterlaceClass
|
struct _GstDeinterlaceClass
|
||||||
|
|
Loading…
Reference in a new issue