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