summaryrefslogtreecommitdiff
path: root/gstreamer-sharp/Element.custom
blob: 9ab37ec7a7a9c4cde7d38361932e8ff9ec36c1a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
[DllImport ("gobject-2.0-0.dll") ]
static extern IntPtr g_object_ref (IntPtr raw);
[DllImport ("gstreamer-0.10.dll") ]
static extern bool gst_element_add_pad (IntPtr raw, IntPtr pad);

public bool AddPad (Pad p) {
  bool ret = gst_element_add_pad (this.Handle, p == null ? IntPtr.Zero : p.Handle);
  if (ret)
    g_object_ref (p.Handle);
  return ret;
}

public static bool LinkMany (params Element [] elements) {
  for (int i = 0; i < elements.Length - 1; i++) {
    if (!elements[i].Link (elements[i+1]))
      return false;
  }

  return true;
}

public static void UnlinkMany (params Element [] elements) {
  for (int i = 0; i < elements.Length - 1; i++) {
    elements[i].Unlink (elements[i+1]);
  }
}

[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_element_iterate_pads (IntPtr element);
[DllImport ("gstreamer-0.10.dll") ]
static extern IntPtr gst_element_iterate_src_pads (IntPtr element);
[DllImport ("gstreamer-0.10.dll") ]
static extern IntPtr gst_element_iterate_sink_pads (IntPtr element);

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;

      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 ();
      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 () {
    gst_iterator_free (iterator);
  }
}

public IEnumerable Pads {
  get {
    return new PadEnumerable (gst_element_iterate_pads (Handle));
  }
}

public IEnumerable SinkPads {
  get {
    return new PadEnumerable (gst_element_iterate_sink_pads (Handle));
  }
}

public IEnumerable SrcPads {
  get {
    return new PadEnumerable (gst_element_iterate_src_pads (Handle));
  }
}

public Gst.StateChangeReturn GetState (out Gst.State state, ulong timeout) {
  Gst.State pending;
  return GetState (out state, out pending, timeout);
}

[DllImport ("gstreamer-0.10.dll") ]
static extern void gst_element_found_tags (IntPtr raw, IntPtr list);
[DllImport ("gstreamer-0.10.dll") ]
static extern IntPtr gst_tag_list_copy (IntPtr raw);

public void FoundTags (Gst.TagList list) {
  gst_element_found_tags (Handle, list == null ? IntPtr.Zero : gst_tag_list_copy (list.Handle));
}

[DllImport ("gstreamer-0.10.dll") ]
static extern void gst_element_found_tags_for_pad (IntPtr raw, IntPtr pad, IntPtr list);

public void FoundTagsForPad (Gst.Pad pad, Gst.TagList list) {
  gst_element_found_tags_for_pad (Handle, pad == null ? IntPtr.Zero : pad.Handle, list == null ? IntPtr.Zero : gst_tag_list_copy (list.Handle));
}

[DllImport ("gstreamer-0.10.dll") ]
static extern bool gst_element_post_message (IntPtr raw, IntPtr message);
[DllImport ("gstreamer-0.10.dll") ]
static extern IntPtr gst_mini_object_ref (IntPtr raw);

public bool PostMessage (Gst.Message message) {
  bool raw_ret = gst_element_post_message (Handle, message == null ? IntPtr.Zero : gst_mini_object_ref (message.Handle));
  bool ret = raw_ret;
  return ret;
}

[DllImport ("gstreamer-0.10.dll") ]
static extern IntPtr gst_element_get_query_types (IntPtr raw);

public Gst.QueryType[] GetQueryTypes () {
  IntPtr raw_ret = gst_element_get_query_types (Handle);
  if (raw_ret == IntPtr.Zero)
    return new Gst.QueryType[] {};

  ArrayList result = new ArrayList ();
  bool term = false;
  int ofs = 0;
  while (!term) {
    Gst.QueryType t = (Gst.QueryType) Marshal.ReadInt32 (raw_ret, ofs);
    if (t == Gst.QueryType.None) {
      term = true;
    } else {
      result.Add (t);
      ofs += 4;
    }
  }

  return (Gst.QueryType[]) result.ToArray (typeof (Gst.QueryType));
}


		[DllImport("gstreamer-0.10.dll")]
		static extern bool gst_element_send_event(IntPtr raw, IntPtr evnt);

		public bool SendEvent(Gst.Event evnt) {
			bool raw_ret = gst_element_send_event(Handle, evnt == null ? IntPtr.Zero : gst_mini_object_ref (evnt.Handle));
			bool ret = raw_ret;
			return ret;
		}