[gst-cvs] gst-plugins-good: [MOVED FROM BAD 56/56] deinterlace2: Add a disabled mode for passthrough operation

Sebastian Dröge slomo at kemper.freedesktop.org
Wed May 13 01:50:13 PDT 2009


Module: gst-plugins-good
Branch: master
Commit: 77c15d10a0ddee24c8e33616ce5cf1db7eaaa030
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=77c15d10a0ddee24c8e33616ce5cf1db7eaaa030

Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date:   Fri May  8 15:39:24 2009 +0200

[MOVED FROM BAD 56/56] deinterlace2: Add a disabled mode for passthrough operation

Also allow to change the mode in PAUSED and PLAYING by updating
the caps if necessary.

---

 gst/deinterlace2/gstdeinterlace2.c |   30 +++++++++++++++++++-----------
 gst/deinterlace2/gstdeinterlace2.h |    3 ++-
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/gst/deinterlace2/gstdeinterlace2.c b/gst/deinterlace2/gstdeinterlace2.c
index b293b43..42a6924 100644
--- a/gst/deinterlace2/gstdeinterlace2.c
+++ b/gst/deinterlace2/gstdeinterlace2.c
@@ -350,6 +350,7 @@ gst_deinterlace2_modes_get_type (void)
   static const GEnumValue modes_types[] = {
     {GST_DEINTERLACE2_MODE_AUTO, "Auto detection", "auto"},
     {GST_DEINTERLACE2_MODE_INTERLACED, "Enfore deinterlacing", "interlaced"},
+    {GST_DEINTERLACE2_MODE_DISABLED, "Run in passthrough mode", "disabled"},
     {0, NULL, NULL},
   };
 
@@ -729,14 +730,17 @@ gst_deinterlace2_set_property (GObject * object, guint prop_id,
   self = GST_DEINTERLACE2 (object);
 
   switch (prop_id) {
-    case PROP_MODE:
-      if (GST_STATE (self) >= GST_STATE_PAUSED) {
-        g_warning ("Setting the 'mode' property is only allowed in "
-            "states other than PAUSED and PLAYING");
-      } else {
-        self->mode = g_value_get_enum (value);
-      }
+    case PROP_MODE:{
+      gint oldmode;
+
+      GST_OBJECT_LOCK (self);
+      oldmode = self->mode;
+      self->mode = g_value_get_enum (value);
+      if (self->mode != oldmode && GST_PAD_CAPS (self->srcpad))
+        gst_deinterlace2_setcaps (self->sinkpad, GST_PAD_CAPS (self->sinkpad));
+      GST_OBJECT_UNLOCK (self);
       break;
+    }
     case PROP_METHOD:
       gst_deinterlace2_set_method (self, g_value_get_enum (value));
       break;
@@ -925,7 +929,8 @@ gst_deinterlace2_chain (GstPad * pad, GstBuffer * buf)
 
   self = GST_DEINTERLACE2 (GST_PAD_PARENT (pad));
 
-  if (!self->interlaced && self->mode != GST_DEINTERLACE2_MODE_INTERLACED)
+  if (self->mode == GST_DEINTERLACE2_MODE_DISABLED || (!self->interlaced
+          && self->mode != GST_DEINTERLACE2_MODE_INTERLACED))
     return gst_pad_push (self->srcpad, buf);
 
   if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) {
@@ -1133,7 +1138,8 @@ gst_deinterlace2_getcaps (GstPad * pad)
   GST_OBJECT_UNLOCK (self);
 
   if ((self->interlaced || self->mode == GST_DEINTERLACE2_MODE_INTERLACED) &&
-      self->fields == GST_DEINTERLACE2_ALL) {
+      self->fields == GST_DEINTERLACE2_ALL
+      && self->mode != GST_DEINTERLACE2_MODE_DISABLED) {
     for (len = gst_caps_get_size (ret); len > 0; len--) {
       GstStructure *s = gst_caps_get_structure (ret, len - 1);
       const GValue *val;
@@ -1269,7 +1275,8 @@ gst_deinterlace2_setcaps (GstPad * pad, GstCaps * caps)
     goto invalid_caps;
 
   if ((self->interlaced || self->mode == GST_DEINTERLACE2_MODE_INTERLACED) &&
-      self->fields == GST_DEINTERLACE2_ALL) {
+      self->fields == GST_DEINTERLACE2_ALL
+      && self->mode != GST_DEINTERLACE2_MODE_DISABLED) {
     gint fps_n = self->frame_rate_n, fps_d = self->frame_rate_d;
 
     if (!gst_fraction_double (&fps_n, &fps_d, otherpad != self->srcpad))
@@ -1418,7 +1425,8 @@ gst_deinterlace2_src_query (GstPad * pad, GstQuery * query)
 
   switch (GST_QUERY_TYPE (query)) {
     case GST_QUERY_LATENCY:
-      if (self->interlaced || self->mode == GST_DEINTERLACE2_MODE_INTERLACED) {
+      if ((self->interlaced || self->mode == GST_DEINTERLACE2_MODE_INTERLACED)
+          && self->mode != GST_DEINTERLACE2_MODE_DISABLED) {
         GstClockTime min, max;
         gboolean live;
         GstPad *peer;
diff --git a/gst/deinterlace2/gstdeinterlace2.h b/gst/deinterlace2/gstdeinterlace2.h
index de63f54..7a08d41 100644
--- a/gst/deinterlace2/gstdeinterlace2.h
+++ b/gst/deinterlace2/gstdeinterlace2.h
@@ -189,7 +189,8 @@ typedef enum
 
 typedef enum {
   GST_DEINTERLACE2_MODE_AUTO,
-  GST_DEINTERLACE2_MODE_INTERLACED
+  GST_DEINTERLACE2_MODE_INTERLACED,
+  GST_DEINTERLACE2_MODE_DISABLED
 } GstDeinterlace2Mode;
 
 struct _GstDeinterlace2





More information about the Gstreamer-commits mailing list