From: <sl...@ke...> - 2009-05-01 15:11:57
|
Module: gstreamer-sharp Branch: master Commit: 67f3b86d77c5c101a9d0fa490a3e8ae6a6e66655 URL: http://cgit.freedesktop.org/gstreamer/gstreamer-sharp/commit/?id=67f3b86d77c5c101a9d0fa490a3e8ae6a6e66655 Author: Sebastian Dröge <seb...@co...> 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)); + } +} |