[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