[gst-cvs] gstreamer-sharp: Add support for iterating the internal links of a pad

Sebastian Dröge slomo at kemper.freedesktop.org
Fri May 1 08:11:41 PDT 2009


Module: gstreamer-sharp
Branch: master
Commit: 67f3b86d77c5c101a9d0fa490a3e8ae6a6e66655
URL:    http://cgit.freedesktop.org/gstreamer/gstreamer-sharp/commit/?id=67f3b86d77c5c101a9d0fa490a3e8ae6a6e66655

Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date:   Fri May  1 17:11:18 2009 +0200

Add support for iterating the internal links of a pad

---

 gstreamer-sharp/Pad.custom |   90 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 90 insertions(+), 0 deletions(-)

diff --git a/gstreamer-sharp/Pad.custom b/gstreamer-sharp/Pad.custom
index cb82a55..1a4cc0a 100644
--- a/gstreamer-sharp/Pad.custom
+++ b/gstreamer-sharp/Pad.custom
@@ -431,4 +431,94 @@ public bool StreamTryLock () {
   return g_static_rec_mutex_trylock (StreamLockPtr);
 }
 
+[DllImport ("gstreamer-0.10.dll") ]
+static extern int gst_iterator_next (IntPtr iterator, out IntPtr elem);
+[DllImport ("gstreamer-0.10.dll") ]
+static extern void gst_iterator_resync (IntPtr iterator);
+[DllImport ("gstreamer-0.10.dll") ]
+static extern void gst_iterator_free (IntPtr iterator);
+[DllImport ("gstreamer-0.10.dll") ]
+static extern IntPtr gst_pad_iterate_internal_links (IntPtr pad);
+[DllImport ("gstreamer-0.10.dll") ]
+static extern IntPtr gst_pad_iterate_internal_links_default (IntPtr pad);
+
+private class PadEnumerable : IEnumerable {
+  private class PadEnumerator : IEnumerator {
+    Hashtable seen = new Hashtable ();
+    IntPtr iterator;
+
+    private object current = null;
+    public object Current {
+      get {
+        return current;
+      }
+    }
+
+    public bool MoveNext () {
+      IntPtr raw_ret;
+      bool retry = false;
+
+      if (iterator == IntPtr.Zero)
+        return false;
+
+      do {
+        int ret = gst_iterator_next (iterator, out raw_ret);
+        switch (ret) {
+          case 0:
+            return false;
+          case 1:
+            if (seen.Contains (raw_ret)) {
+              retry = true;
+              break;
+            }
+
+            seen.Add (raw_ret, null);
+            current = GLib.Object.GetObject (raw_ret, true);
+            return true;
+          case 2:
+            gst_iterator_resync (iterator);
+            break;
+          default:
+          case 3:
+            throw new Exception ("Error while iterating pads");
+        }
+      } while (retry);
+
+      return false;
+    }
+
+    public void Reset () {
+      seen.Clear ();
+      if (iterator != IntPtr.Zero)
+        gst_iterator_resync (iterator);
+    }
+
+    public PadEnumerator (IntPtr iterator) {
+      this.iterator = iterator;
+    }
+  }
+
+  private IntPtr iterator;
+  private PadEnumerator enumerator;
+
+  public PadEnumerable (IntPtr iterator) {
+    this.iterator = iterator;
+    this.enumerator = new PadEnumerator (iterator);
+  }
+
+  public IEnumerator GetEnumerator () {
+    return enumerator;
+  }
+
+  ~PadEnumerable () {
+    if (iterator != IntPtr.Zero)
+      gst_iterator_free (iterator);
+  }
+}
+
+public IEnumerable InternalLinks {
+  get {
+    return new PadEnumerable (gst_pad_iterate_internal_links (Handle));
+  }
+}
 





More information about the Gstreamer-commits mailing list