summaryrefslogtreecommitdiff
path: root/gst/deinterlace
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2016-01-26 17:50:30 +0100
committerSebastian Dröge <sebastian@centricular.com>2016-01-27 16:45:29 +0100
commit2e8d4e8c7a7c24af7301793d32b77f4ec5d2d75c (patch)
tree39beb0802b4e05cd950d7975a8b9fad1023feb8c /gst/deinterlace
parent8c1c091439ee9c732a7c65905926d6b2216a5e5e (diff)
downloadgstreamer-plugins-good-2e8d4e8c7a7c24af7301793d32b77f4ec5d2d75c.tar.gz
deinterlace: Implement reconfiguration a bit better
And e.g. consider reconfiguration caused by RECONFIGURE events too. https://bugzilla.gnome.org/show_bug.cgi?id=720388
Diffstat (limited to 'gst/deinterlace')
-rw-r--r--gst/deinterlace/gstdeinterlace.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/gst/deinterlace/gstdeinterlace.c b/gst/deinterlace/gstdeinterlace.c
index 2aae805da..f01efd9f8 100644
--- a/gst/deinterlace/gstdeinterlace.c
+++ b/gst/deinterlace/gstdeinterlace.c
@@ -34,10 +34,6 @@
* </refsect2>
*/
-/* FIXME PORTING 0.11:
- * - reconfiguration needs to be done differently
- */
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -847,7 +843,6 @@ gst_deinterlace_set_property (GObject * object, guint prop_id,
GST_OBJECT_LOCK (self);
new_mode = g_value_get_enum (value);
- /* FIXME: reconfiguration should probably be done differently */
if (self->mode != new_mode && gst_pad_has_current_caps (self->srcpad)) {
self->reconfigure = TRUE;
self->new_mode = new_mode;
@@ -866,7 +861,6 @@ gst_deinterlace_set_property (GObject * object, guint prop_id,
GST_OBJECT_LOCK (self);
new_fields = g_value_get_enum (value);
- /* FIXME: reconfiguration should probably be done differently */
if (self->fields != new_fields && gst_pad_has_current_caps (self->srcpad)) {
self->reconfigure = TRUE;
self->new_fields = new_fields;
@@ -1550,7 +1544,11 @@ restart:
/* setcaps on sink and src pads */
sinkcaps = gst_pad_get_current_caps (self->sinkpad);
- gst_deinterlace_setcaps (self, self->sinkpad, sinkcaps); // FIXME
+ if (!gst_deinterlace_setcaps (self, self->sinkpad, sinkcaps)) {
+ gst_caps_unref (sinkcaps);
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+
gst_caps_unref (sinkcaps);
if (flush_one && self->drop_orphans) {
@@ -2014,7 +2012,7 @@ gst_deinterlace_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
GstFlowReturn ret = GST_FLOW_OK;
GST_OBJECT_LOCK (self);
- if (self->reconfigure) { /* FIXME: reconfigure should probably work differently */
+ if (self->reconfigure || gst_pad_check_reconfigure (self->srcpad)) {
GstCaps *caps;
if ((gint) self->new_fields != -1)
@@ -2028,8 +2026,13 @@ gst_deinterlace_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
GST_OBJECT_UNLOCK (self);
caps = gst_pad_get_current_caps (self->sinkpad);
if (caps != NULL) {
- gst_deinterlace_setcaps (self, self->sinkpad, caps); // FIXME
+ if (!gst_deinterlace_setcaps (self, self->sinkpad, caps)) {
+ gst_caps_unref (caps);
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
gst_caps_unref (caps);
+ } else {
+ return GST_FLOW_FLUSHING;
}
} else {
GST_OBJECT_UNLOCK (self);