diff --git a/Makefile.am b/Makefile.am
index 2e466cb2a3..6b47db2fab 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = sources doc
+SUBDIRS = sources sources/glue doc
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = gst-sharp-1.0.pc
diff --git a/configure.ac b/configure.ac
index 578be864ea..ef9551eb49 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,6 +4,7 @@ AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE
AM_MAINTAINER_MODE
AC_PROG_INSTALL
+LT_INIT
dnl Package settings
ASSEMBLY_COMPANY=""
@@ -133,12 +134,15 @@ dnl Check for Gst
PKG_CHECK_MODULES(GST, gstreamer-1.0)
gst_prefix=/usr
AC_SUBST(gst_prefix)
+AC_SUBST(GST_LIBS)
+AC_SUBST(GST_CFLAGS)
AC_CONFIG_FILES([
Makefile
sources/Makefile
+ sources/glue/Makefile
sources/AssemblyInfo.cs
gst-sharp-1.0.pc
doc/Makefile
diff --git a/out/gst-sharp.dll.config b/out/gst-sharp.dll.config
index 6a151fb4c2..44d4aa909c 100644
--- a/out/gst-sharp.dll.config
+++ b/out/gst-sharp.dll.config
@@ -1,3 +1,6 @@
+
+
+
diff --git a/sources/Makefile.am b/sources/Makefile.am
index 13de6e11da..bc3884b806 100644
--- a/sources/Makefile.am
+++ b/sources/Makefile.am
@@ -3,6 +3,7 @@ API = $(ASSEMBLY_NAME)-api.xml
METADATA = $(ASSEMBLY_NAME).metadata
DLL = $(top_srcdir)/out/$(ASSEMBLY_NAME).dll
DLLMAP = $(top_srcdir)/out/$(ASSEMBLY_NAME).dll.config
+GLUEDIR = $(srcdir)/glue
sources = custom/*.cs
@@ -31,6 +32,8 @@ $(API): $(srcdir)/$(RAW_API) $(srcdir)/$(METADATA)
generated-stamp: $(API)
$(GAPI_CODEGEN) --generate $(srcdir)/$(API) $(GTK_SHARP_CFLAGS) \
--outdir=generated \
+ --glue-filename=$(GLUEDIR)/generated.c --gluelib-name=libgstsharpglue-1.0.6.so \
+ --glue-includes=gst/gst.h \
--assembly-name=$(ASSEMBLY_NAME) && touch generated-stamp
$(DLL): $(build_sources) generated-stamp
diff --git a/sources/custom/DynamicSignal.cs b/sources/custom/DynamicSignal.cs
new file mode 100644
index 0000000000..557b13f9d6
--- /dev/null
+++ b/sources/custom/DynamicSignal.cs
@@ -0,0 +1,429 @@
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+//
+//
+// Copyright (C) 2006 Novell Inc.
+// Copyright (C) 2009 Sebastian Dröge
+// Copyright (C) 2013 Stephan Sundermann
+//
+// This class implements functions to bind callbacks to GObject signals
+// dynamically and to emit signals dynamically.
+//
+//
+
+using GLib;
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Collections;
+
+namespace Gst {
+
+ delegate void GClosureMarshal (IntPtr closure, ref GLib.Value retval, uint argc, IntPtr argsPtr,
+ IntPtr invocation_hint, IntPtr data);
+
+ public delegate void SignalHandler (object o, SignalArgs args);
+
+ public static class DynamicSignal {
+
+ private static readonly int gvalue_struct_size = Marshal.SizeOf (typeof (GLib.Value));
+
+ class ObjectSignalKey {
+ object o;
+ string signal_name;
+
+ public ObjectSignalKey (object o, string name) {
+ this.o = o;
+ signal_name = name;
+ }
+
+ public override bool Equals (object o) {
+ if (o is ObjectSignalKey) {
+ ObjectSignalKey k = (ObjectSignalKey) o;
+ return k.o.Equals (this.o) && signal_name.Equals (k.signal_name);
+ }
+ return base.Equals (o);
+ }
+
+ public override int GetHashCode() {
+ return o.GetHashCode() ^ signal_name.GetHashCode();
+ }
+ }
+
+ class SignalInfo {
+ uint handlerId;
+ IntPtr closure;
+ Delegate registeredHandler;
+ Type argsType;
+
+ public IntPtr Closure {
+ get {
+ return closure;
+ } set {
+ closure = value;
+ }
+ }
+
+ public uint HandlerId {
+ get {
+ return handlerId;
+ } set {
+ handlerId = value;
+ }
+ }
+
+ public Delegate RegisteredHandler {
+ get {
+ return registeredHandler;
+ } set {
+ registeredHandler = value;
+ }
+ }
+
+ public Type ArgsType {
+ get {
+ return argsType;
+ } set {
+ argsType = value;
+ }
+ }
+
+ public SignalInfo (uint handlerId, IntPtr closure, Delegate registeredHandler) {
+ this.handlerId = handlerId;
+ this.closure = closure;
+ this.registeredHandler = registeredHandler;
+
+ if (!IsValidDelegate (registeredHandler))
+ throw new Exception ("Invalid delegate");
+
+ MethodInfo mi = registeredHandler.Method;
+ ParameterInfo[] parms = mi.GetParameters ();
+ this.argsType = parms[1].ParameterType;
+ }
+
+ public void UpdateArgsType (Delegate d) {
+ if (!IsCompatibleDelegate (d))
+ throw new Exception ("Incompatible delegate");
+
+ MethodInfo mi = d.Method;
+ ParameterInfo[] parms = mi.GetParameters ();
+
+ Type t1 = parms[1].ParameterType;
+ Type t2 = argsType;
+
+ if (t1 == t2)
+ return;
+
+ if (t1.IsSubclassOf (t2))
+ argsType = t1;
+ else if (t2.IsSubclassOf (t1))
+ argsType = t2;
+ else
+ throw new Exception ("Incompatible delegate");
+ }
+
+ public bool IsCompatibleDelegate (Delegate d) {
+ if (!IsValidDelegate (d))
+ return false;
+
+ MethodInfo mi = d.Method;
+ ParameterInfo[] parms = mi.GetParameters ();
+
+ if (parms[1].ParameterType != this.argsType &&
+ !parms[1].ParameterType.IsSubclassOf (this.argsType) &&
+ !this.argsType.IsSubclassOf (parms[1].ParameterType))
+ return false;
+
+ return true;
+ }
+
+ public static bool IsValidDelegate (Delegate d) {
+ MethodInfo mi = d.Method;
+
+ if (mi.ReturnType != typeof (void))
+ return false;
+
+ ParameterInfo[] parms = mi.GetParameters ();
+ if (parms.Length != 2)
+ return false;
+
+ if (parms[1].ParameterType != typeof (GLib.SignalArgs) &&
+ !parms[1].ParameterType.IsSubclassOf (typeof (GLib.SignalArgs)))
+ return false;
+
+ return true;
+ }
+ }
+
+ static Hashtable SignalHandlers = new Hashtable();
+
+ static GClosureMarshal marshalHandler = new GClosureMarshal (OnMarshal);
+
+ public static void Connect (GLib.Object o, string name, SignalHandler handler) {
+ Connect (o, name, false, (Delegate) handler);
+ }
+
+ public static void Connect (GLib.Object o, string name,
+ bool after, SignalHandler handler) {
+ Connect (o, name, after, (Delegate) handler);
+ }
+
+ public static void Connect (GLib.Object o, string name, Delegate handler) {
+ Connect (o, name, false, handler);
+ }
+
+ static int g_closure_sizeof = gstsharp_g_closure_sizeof ();
+
+ public static void Connect (GLib.Object o, string name,
+ bool after, Delegate handler) {
+ Delegate newHandler;
+
+ ObjectSignalKey k = new ObjectSignalKey (o, name);
+
+ if (!SignalInfo.IsValidDelegate (handler))
+ throw new Exception ("Invalid delegate");
+
+ if (SignalHandlers[k] != null) {
+ SignalInfo si = (SignalInfo) SignalHandlers[k];
+ if (!si.IsCompatibleDelegate (handler))
+ throw new Exception ("Incompatible delegate");
+
+ newHandler = Delegate.Combine (si.RegisteredHandler, handler);
+ si.UpdateArgsType (handler);
+ si.RegisteredHandler = newHandler;
+ } else {
+ if (!SignalInfo.IsValidDelegate (handler))
+ throw new Exception ("Invalid delegate");
+
+ IntPtr closure = g_closure_new_simple (g_closure_sizeof, IntPtr.Zero);
+ g_closure_set_meta_marshal (closure, (IntPtr) GCHandle.Alloc (k), marshalHandler);
+ uint signalId = g_signal_connect_closure (o.Handle, name, closure, after);
+ SignalHandlers.Add (k, new SignalInfo (signalId, closure, handler));
+ }
+ }
+
+ [DllImport ("libgstsharpglue-1.0.6.dll") ]
+ static extern int gstsharp_g_closure_sizeof ();
+
+ public static void Disconnect (GLib.Object o, string name, Delegate handler) {
+ ObjectSignalKey k = new ObjectSignalKey (o, name);
+ if (SignalHandlers[k] != null) {
+ SignalInfo si = (SignalInfo) SignalHandlers[k];
+ Delegate newHandler = Delegate.Remove (si.RegisteredHandler, handler);
+ if (newHandler == null || handler == null) {
+ g_signal_handler_disconnect (o.Handle, si.HandlerId);
+ SignalHandlers.Remove (k);
+ } else {
+ si.RegisteredHandler = newHandler;
+ }
+ }
+ }
+
+ static void OnMarshal (IntPtr closure, ref GLib.Value retval, uint argc, IntPtr argsPtr,
+ IntPtr ihint, IntPtr data) {
+ object [] args = new object[argc - 1];
+ object o = ( (GLib.Value) Marshal.PtrToStructure (argsPtr, typeof (GLib.Value))).Val;
+
+ for (int i = 1; i < argc; i++) {
+ IntPtr struct_ptr = (IntPtr) ( (long) argsPtr + (i * gvalue_struct_size));
+ GLib.Value argument = (GLib.Value) Marshal.PtrToStructure (struct_ptr, typeof (GLib.Value));
+ args[i - 1] = argument.Val;
+ }
+
+ if (data == IntPtr.Zero) {
+ Console.Error.WriteLine ("No available data");
+ return;
+ }
+
+ ObjectSignalKey k = (ObjectSignalKey) ( (GCHandle) data).Target;
+ if (k != null) {
+ SignalInfo si = (SignalInfo) SignalHandlers[k];
+ GLib.SignalArgs arg = (GLib.SignalArgs) Activator.CreateInstance (si.ArgsType);
+ arg.Args = args;
+ si.RegisteredHandler.DynamicInvoke (new object[] {o, arg});
+ if (arg.RetVal != null) {
+ retval.Val = arg.RetVal;
+ }
+ }
+ }
+
+
+ [DllImport ("libgobject-2.0-0.dll") ]
+ static extern IntPtr g_closure_new_simple (int size, IntPtr data);
+
+ [DllImport ("libgobject-2.0-0.dll") ]
+ static extern uint g_signal_connect_closure (IntPtr instance,
+ string name, IntPtr closure, bool after);
+
+ [DllImport ("libgobject-2.0-0.dll") ]
+ static extern void g_closure_set_meta_marshal (IntPtr closure, IntPtr data, GClosureMarshal marshal);
+
+ class GTypeSignalKey {
+ GType type;
+ string signal_name;
+
+ public GTypeSignalKey (GType type, string name) {
+ this.type = type;
+ signal_name = name;
+ }
+
+ public override bool Equals (object o) {
+ if (o is GTypeSignalKey) {
+ GTypeSignalKey k = (GTypeSignalKey) o;
+ return k.type.Equals (this.type) && signal_name.Equals (k.signal_name);
+ }
+ return base.Equals (o);
+ }
+
+ public override int GetHashCode() {
+ return type.GetHashCode() ^ signal_name.GetHashCode();
+ }
+ }
+
+ struct SignalQuery {
+ public uint signal_id;
+ public string signal_name;
+ public GType itype;
+ public uint signal_flags;
+ public GType return_type;
+ public uint n_params;
+ public Type[] param_types;
+ }
+
+ static Hashtable SignalEmitInfo = new Hashtable ();
+
+ public static object Emit (GLib.Object o, string name, params object[] parameters) {
+ SignalQuery query;
+ IntPtr type = gstsharp_g_type_from_instance (o.Handle);
+ GType gtype = new GType (type);
+ string signal_name, signal_detail;
+ uint signal_detail_quark = 0;
+ int colon;
+
+ colon = name.LastIndexOf ("::");
+
+ if (colon == -1) {
+ signal_name = name;
+ signal_detail = String.Empty;
+ } else {
+ signal_name = name.Substring (0, colon);
+ signal_detail = name.Substring (colon + 2);
+ }
+
+ GTypeSignalKey key = new GTypeSignalKey (gtype, signal_name);
+
+ if (SignalEmitInfo[key] == null) {
+ IntPtr native_string = GLib.Marshaller.StringToPtrGStrdup (signal_name);
+ uint signal_id = g_signal_lookup (native_string, type);
+ GLib.Marshaller.Free (native_string);
+
+ if (signal_id == 0)
+ throw new NotSupportedException (String.Format ("{0} has no signal of name {1}", o, name));
+ GSignalQuery q = new GSignalQuery ();
+ g_signal_query (signal_id, ref q);
+
+ if (q.signal_id == 0)
+ throw new NotSupportedException (String.Format ("{0} couldn't be queried for signal with name {1}", o, name));
+
+ query = new SignalQuery ();
+
+ query.signal_id = signal_id;
+ query.signal_name = GLib.Marshaller.Utf8PtrToString (q.signal_name);
+ query.itype = new GType (q.itype);
+ query.signal_flags = q.signal_flags;
+ query.return_type = new GType (q.return_type);
+ query.n_params = q.n_params;
+ query.param_types = new Type[q.n_params];
+
+ for (int i = 0; i < query.n_params; i++) {
+ IntPtr t = Marshal.ReadIntPtr (q.param_types, i);
+ GType g = new GType (t);
+
+ query.param_types[i] = (Type) g;
+ }
+
+ SignalEmitInfo.Add (key, query);
+ }
+
+ query = (SignalQuery) SignalEmitInfo[key];
+ GLib.Value[] signal_parameters = new GLib.Value[query.n_params + 1];
+ signal_parameters[0] = new GLib.Value (o);
+
+ if (parameters.Length != query.n_params)
+ throw new ApplicationException (String.Format ("Invalid number of parameters: expected {0}, got {1}", query.n_params, parameters.Length));
+
+ for (int i = 0; i < query.n_params; i++) {
+ Type expected_type = (Type) query.param_types[i];
+ Type given_type = parameters[i].GetType ();
+
+ if (expected_type != given_type && ! given_type.IsSubclassOf (given_type))
+ throw new ApplicationException (String.Format ("Invalid parameter type: expected {0}, got {1}", expected_type, given_type));
+
+ signal_parameters[i + 1] = new GLib.Value (parameters[i]);
+ }
+
+ GLib.Value return_value = new GLib.Value ();
+ if (query.return_type != GType.Invalid && query.return_type != GType.None)
+ return_value.Init (query.return_type);
+
+ if (signal_detail != String.Empty) {
+ IntPtr native_string = GLib.Marshaller.StringToPtrGStrdup (signal_detail);
+ signal_detail_quark = g_quark_from_string (native_string);
+ GLib.Marshaller.Free (native_string);
+ }
+
+ g_signal_emitv (signal_parameters, query.signal_id, signal_detail_quark, ref return_value);
+
+ foreach (GLib.Value v in signal_parameters)
+ v.Dispose ();
+
+ object ret = (query.return_type != GType.Invalid && query.return_type != GType.None) ? return_value.Val : null;
+
+ if (ret != null)
+ return_value.Dispose ();
+
+ return ret;
+ }
+
+ [DllImport ("libgstsharpglue-1\t.0.6.so") ]
+ static extern IntPtr gstsharp_g_type_from_instance (IntPtr o);
+
+ [DllImport ("libgobject-2.0-0.dll") ]
+ static extern int g_signal_handler_disconnect (IntPtr o, uint handler_id);
+
+ [DllImport ("libgobject-2.0-0.dll") ]
+ static extern uint g_signal_lookup (IntPtr name, IntPtr itype);
+
+ [DllImport ("libglib-2.0-0.dll") ]
+ static extern uint g_quark_from_string (IntPtr str);
+
+ [DllImport ("libgobject-2.0-0.dll") ]
+ static extern void g_signal_emitv (GLib.Value[] parameters, uint signal_id, uint detail, ref GLib.Value return_value);
+
+ [StructLayout (LayoutKind.Sequential) ]
+ struct GSignalQuery {
+ public uint signal_id;
+ public IntPtr signal_name;
+ public IntPtr itype;
+ public uint signal_flags;
+ public IntPtr return_type;
+ public uint n_params;
+ public IntPtr param_types;
+ }
+
+ [DllImport ("libgobject-2.0-0.dll") ]
+ static extern void g_signal_query (uint signal_id, ref GSignalQuery query);
+ }
+}
\ No newline at end of file
diff --git a/sources/custom/Object.cs b/sources/custom/Object.cs
new file mode 100644
index 0000000000..43ab287b8c
--- /dev/null
+++ b/sources/custom/Object.cs
@@ -0,0 +1,56 @@
+// Copyright (C) 2013 Stephan Sundermann
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+namespace Gst {
+ using System;
+ using System.Runtime.InteropServices;
+
+ partial class Object
+ {
+ public object this[string property] {
+ get {
+ GLib.Value v = GetProperty (property);
+ object o = v.Val;
+ v.Dispose ();
+ return o;
+ } set {
+ GLib.Value v = new GLib.Value (this, property);
+ v.Val = value;
+ SetProperty (property, v);
+ v.Dispose ();
+ }
+ }
+
+ public void Connect (string signal, SignalHandler handler) {
+ DynamicSignal.Connect (this, signal, handler);
+ }
+
+ public void Disconnect (string signal, SignalHandler handler) {
+ DynamicSignal.Disconnect (this, signal, handler);
+ }
+
+ public void Connect (string signal, Delegate handler) {
+ DynamicSignal.Connect (this, signal, handler);
+ }
+
+ public void Disconnect (string signal, Delegate handler) {
+ DynamicSignal.Disconnect (this, signal, handler);
+ }
+
+ public object Emit (string signal, params object[] parameters) {
+ return DynamicSignal.Emit (this, signal, parameters);
+ }
+ }
+}
\ No newline at end of file
diff --git a/sources/glue/Makefile.am b/sources/glue/Makefile.am
new file mode 100644
index 0000000000..eb12645d94
--- /dev/null
+++ b/sources/glue/Makefile.am
@@ -0,0 +1,18 @@
+lib_LTLIBRARIES = libgstsharpglue-1.0.6.la
+# TODO: Select all files except generated.c dynamically
+libgstsharpglue_1_0_6_la_SOURCES = gobject.c
+
+nodist_libgstsharpglue_1_0_6_la_SOURCES = generated.c
+
+libgstsharpglue_1_0_6_la_LDFLAGS = -module -avoid-version -no-undefined
+
+libgstsharpglue_1_0_6_la_LIBADD = $(GST_LIBS)
+
+INCLUDES = $(GST_CFLAGS) -I$(top_srcdir)
+
+libgstsharpglue.dll: $(libgstsharpglue_1_0_6_la_OBJECTS) libgstsharpglue.rc libgstsharpglue.def
+ ./build-dll libgstsharpglue $(VERSION)
+
+CLEANFILES = lib*.a lib*.dll
+
+EXTRA_DIST =
diff --git a/sources/glue/gobject.c b/sources/glue/gobject.c
new file mode 100644
index 0000000000..ccec825455
--- /dev/null
+++ b/sources/glue/gobject.c
@@ -0,0 +1,28 @@
+// Copyright (C) 2013 Stephan Sundermann
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+#include
+
+gint
+gstsharp_g_closure_sizeof (void)
+{
+ return sizeof (GClosure);
+}
+
+GType
+gstsharp_g_type_from_instance (GTypeInstance * instance)
+{
+ return G_TYPE_FROM_INSTANCE (instance);
+}
diff --git a/sources/gst-sharp-api.raw b/sources/gst-sharp-api.raw
index 98b34a9a79..7d3034e20a 100644
--- a/sources/gst-sharp-api.raw
+++ b/sources/gst-sharp-api.raw
@@ -665,8 +665,8 @@
-
-
+
+
@@ -890,7 +890,7 @@
-
+
missing glib:type-name
@@ -983,7 +983,7 @@
-
+
missing glib:type-name
@@ -1002,7 +1002,7 @@
-
+
missing glib:type-name
@@ -1248,12 +1248,12 @@
missing glib:type-name
-
+
missing glib:type-name
-
-
-
+
+
+
@@ -1305,7 +1305,7 @@
missing glib:type-name
-
+
missing glib:type-name
@@ -1371,7 +1371,7 @@
missing glib:type-name
-
+
missing glib:type-name
@@ -1534,7 +1534,7 @@
-
+
@@ -1639,7 +1639,7 @@
-
+
@@ -1708,10 +1708,10 @@
-
-
-
-
+
+
+
+
@@ -1767,7 +1767,7 @@
-
+
@@ -2029,14 +2029,14 @@
-
+
-
+
@@ -2063,8 +2063,8 @@
-
-
+
+
@@ -2180,7 +2180,7 @@
-
+
missing glib:type-name
@@ -2208,8 +2208,8 @@
-
-
+
+
@@ -2251,7 +2251,7 @@
-
+
missing glib:type-name
@@ -2259,18 +2259,18 @@
-
+
-
+
-
+
-
-
+
+
missing glib:type-name
@@ -2278,9 +2278,9 @@
-
+
-
+
@@ -2294,8 +2294,8 @@
-
-
+
+
@@ -2341,7 +2341,7 @@
-
+
@@ -2360,8 +2360,8 @@
-
-
+
+
missing glib:type-name
@@ -2523,7 +2523,7 @@
-
+
@@ -2561,7 +2561,7 @@
-
+
@@ -2673,7 +2673,7 @@
-
+
@@ -2706,7 +2706,7 @@
-
+
@@ -2728,7 +2728,7 @@
missing glib:type-name
-
+
@@ -2950,7 +2950,7 @@
-
+
@@ -3110,7 +3110,7 @@
missing glib:type-name
-
+
missing glib:type-name
@@ -3128,14 +3128,14 @@
-
+
-
+
@@ -3209,7 +3209,7 @@
missing glib:type-name
-
+
missing glib:type-name
@@ -3236,7 +3236,7 @@
-
+
@@ -5251,8 +5251,8 @@
-
-
+
+
@@ -5308,11 +5308,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -5832,87 +5832,87 @@
-
+
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
+
missing glib:type-name
-
+
-
+
missing glib:type-name
-
+
-
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
@@ -5944,32 +5944,32 @@
-
-
-
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -5983,8 +5983,8 @@
-
-
+
+
@@ -6007,10 +6007,10 @@
-
+
missing glib:type-name
-
+
@@ -6458,7 +6458,7 @@
-
+
missing glib:type-name
@@ -6466,8 +6466,8 @@
-
-
+
+
missing glib:type-name
@@ -6498,7 +6498,7 @@
-
+
@@ -6557,35 +6557,35 @@
-
+
missing glib:type-name
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
@@ -6607,38 +6607,38 @@
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
+
-
+
missing glib:type-name
@@ -6647,8 +6647,8 @@
-
-
+
+
missing glib:type-name
@@ -6657,25 +6657,25 @@
-
-
-
-
+
+
+
+
-
-
+
+
-
+
@@ -6687,41 +6687,41 @@
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
@@ -6804,8 +6804,8 @@
-
-
+
+
missing glib:type-name
@@ -6936,8 +6936,8 @@
-
-
+
+
@@ -7376,7 +7376,7 @@
-
+
@@ -7754,7 +7754,7 @@
-
+
missing glib:type-name
@@ -7763,7 +7763,7 @@
-
+
missing glib:type-name
@@ -7837,7 +7837,7 @@
-
+
missing glib:type-name
@@ -7853,7 +7853,7 @@
-
+
missing glib:type-name
@@ -7889,7 +7889,7 @@
-
+
missing glib:type-name
@@ -8455,7 +8455,7 @@
-
+
missing glib:type-name
@@ -8546,7 +8546,7 @@
missing glib:type-name
-
+
missing glib:type-name
@@ -8774,8 +8774,8 @@
-
-
+
+
@@ -9094,7 +9094,7 @@
-
+
@@ -9109,7 +9109,7 @@
-
+
missing glib:type-name
@@ -9126,7 +9126,7 @@
-
+
@@ -9272,15 +9272,15 @@
-
-
+
+
-
-
+
+
@@ -9398,7 +9398,7 @@
-
+
missing glib:type-name
@@ -9419,7 +9419,7 @@
-
+
missing glib:type-name
@@ -9437,7 +9437,7 @@
-
+
missing glib:type-name
@@ -9514,7 +9514,7 @@
-
+
@@ -9625,7 +9625,7 @@
-
+
missing glib:type-name
diff --git a/sources/gst-sharp.metadata b/sources/gst-sharp.metadata
index 239d6582d7..eb069feff3 100644
--- a/sources/gst-sharp.metadata
+++ b/sources/gst-sharp.metadata
@@ -7,6 +7,7 @@
gpointer
gpointer
gpointer
+ Obj
true
@@ -28,6 +29,12 @@
n_argc
+
+ true
+ true
+ true
+ true
+ true
protected
diff --git a/sources/gst-sharp.snk b/sources/gst-sharp.snk
index 82ba2fd97b..403c7ad206 100644
Binary files a/sources/gst-sharp.snk and b/sources/gst-sharp.snk differ