mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-21 15:56:42 +00:00
Do not use glue anymore!
This is not needed anymore as ABI compatible structures are now generated and used by the code generator.
This commit is contained in:
parent
8193dd746c
commit
9c289eb563
15 changed files with 32 additions and 109 deletions
|
@ -183,7 +183,6 @@ AC_SUBST(GST_INCLUDEDIR)
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
sources/Makefile
|
sources/Makefile
|
||||||
sources/glue/Makefile
|
|
||||||
samples/Makefile
|
samples/Makefile
|
||||||
sources/AssemblyInfo.cs
|
sources/AssemblyInfo.cs
|
||||||
gstreamer-sharp-1.0.pc
|
gstreamer-sharp-1.0.pc
|
||||||
|
|
|
@ -14,9 +14,9 @@ if __name__ == "__main__":
|
||||||
parser.add_argument("--gapi-fixup")
|
parser.add_argument("--gapi-fixup")
|
||||||
parser.add_argument("--metadata")
|
parser.add_argument("--metadata")
|
||||||
parser.add_argument("--gapi-codegen")
|
parser.add_argument("--gapi-codegen")
|
||||||
parser.add_argument("--glue-file")
|
parser.add_argument("--glue-file", default='')
|
||||||
parser.add_argument("--glue-includes")
|
parser.add_argument("--glue-includes", default='')
|
||||||
parser.add_argument("--glue-libname")
|
parser.add_argument("--glue-libname", default='')
|
||||||
parser.add_argument("--assembly-name")
|
parser.add_argument("--assembly-name")
|
||||||
parser.add_argument("--extra-includes", action='append', default=[])
|
parser.add_argument("--extra-includes", action='append', default=[])
|
||||||
parser.add_argument("--out")
|
parser.add_argument("--out")
|
||||||
|
|
|
@ -123,12 +123,9 @@ source_gen = custom_target(pkg + '_codegen',
|
||||||
'--extra-includes=' + glib_api_includes,
|
'--extra-includes=' + glib_api_includes,
|
||||||
'--extra-includes=' + gio_api_includes,
|
'--extra-includes=' + gio_api_includes,
|
||||||
'--extra-includes=' + gst_api_includes,
|
'--extra-includes=' + gst_api_includes,
|
||||||
'--glue-file', gluefile,
|
|
||||||
'--glue-includes', glueincludes,
|
|
||||||
'--out', meson.current_build_dir(),
|
'--out', meson.current_build_dir(),
|
||||||
'--files', ';'.join(generated_sources),
|
'--files', ';'.join(generated_sources),
|
||||||
'--assembly-name', pkg,
|
'--assembly-name', pkg,
|
||||||
'--glue-libname', 'libgessharpglue-' + apiversion + '.dll',
|
|
||||||
],
|
],
|
||||||
depend_files: [raw_api_fname],
|
depend_files: [raw_api_fname],
|
||||||
depends: codegen_dependencies + [gst_source_gen])
|
depends: codegen_dependencies + [gst_source_gen])
|
||||||
|
|
|
@ -3,29 +3,14 @@ raw_api_fname = join_paths(meson.current_source_dir(), pkg + '-api.raw')
|
||||||
metadata_fname = join_paths(meson.current_source_dir(), pkg + '.metadata')
|
metadata_fname = join_paths(meson.current_source_dir(), pkg + '.metadata')
|
||||||
snk = join_paths(meson.current_source_dir(), '../', meson.project_name() + '.snk')
|
snk = join_paths(meson.current_source_dir(), '../', meson.project_name() + '.snk')
|
||||||
|
|
||||||
glueincludes = 'ges/ges.h'
|
|
||||||
gluefile = join_paths(meson.current_build_dir(), 'generate.c')
|
|
||||||
|
|
||||||
sources = [
|
|
||||||
't.cs'
|
|
||||||
]
|
|
||||||
|
|
||||||
subdir('generated')
|
subdir('generated')
|
||||||
|
|
||||||
ges_sharp = library(pkg + '-sharp', source_gen, sources,
|
ges_sharp = library(pkg + '-sharp', source_gen,
|
||||||
cs_args: ['-nowarn:169', '-nowarn:108', '-nowarn:114', '-unsafe',
|
cs_args: ['-nowarn:169', '-nowarn:108', '-nowarn:114', '-unsafe',
|
||||||
'-keyfile:' + snk],
|
'-keyfile:' + snk],
|
||||||
link_with: gst_sharp,
|
link_with: gst_sharp,
|
||||||
dependencies: [glib_sharp_dep, gio_sharp_dep])
|
dependencies: [glib_sharp_dep, gio_sharp_dep])
|
||||||
|
|
||||||
gluegen = custom_target(pkg + 'gluegen',
|
|
||||||
input: raw_api_fname,
|
|
||||||
output: 'generate.c',
|
|
||||||
command: [generate_api, '--fakeglue'],
|
|
||||||
depends: [source_gen])
|
|
||||||
|
|
||||||
library('gessharpglue-1.0.0', gluegen, dependencies: gst_deps + [ges_dep])
|
|
||||||
|
|
||||||
ges_sharp_dep = declare_dependency(dependencies: [glib_sharp_dep, gio_sharp_dep, gst_sharp_dep,
|
ges_sharp_dep = declare_dependency(dependencies: [glib_sharp_dep, gio_sharp_dep, gst_sharp_dep,
|
||||||
ges_dep], link_with: ges_sharp)
|
ges_dep], link_with: ges_sharp)
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@ glib_sharp = gtk_sharp.get_variable('glib_sharp')
|
||||||
|
|
||||||
gio_sharp_dep = gtk_sharp.get_variable('gio_sharp_dep')
|
gio_sharp_dep = gtk_sharp.get_variable('gio_sharp_dep')
|
||||||
gio_sharp = gtk_sharp.get_variable('gio_sharp')
|
gio_sharp = gtk_sharp.get_variable('gio_sharp')
|
||||||
gio_glue = gtk_sharp.get_variable('gio_glue')
|
|
||||||
|
|
||||||
gapi_fixup = gtk_sharp.get_variable('gapi_fixup')
|
gapi_fixup = gtk_sharp.get_variable('gapi_fixup')
|
||||||
gapi_codegen = gtk_sharp.get_variable('gapi_codegen')
|
gapi_codegen = gtk_sharp.get_variable('gapi_codegen')
|
||||||
|
@ -78,9 +77,7 @@ endif
|
||||||
|
|
||||||
meson.add_install_script(nuget, '--package-name', 'GstSharp',
|
meson.add_install_script(nuget, '--package-name', 'GstSharp',
|
||||||
'--assembly', gst_sharp.full_path(),
|
'--assembly', gst_sharp.full_path(),
|
||||||
'--native', gst_glue.full_path(),
|
|
||||||
'--assembly', gio_sharp.full_path(),
|
'--assembly', gio_sharp.full_path(),
|
||||||
'--native', gio_glue.full_path(),
|
|
||||||
'--assembly', glib_sharp.full_path(),
|
'--assembly', glib_sharp.full_path(),
|
||||||
'--project-url', 'https://gstreamer.freedesktop.org/modules/gstreamer-sharp.html',
|
'--project-url', 'https://gstreamer.freedesktop.org/modules/gstreamer-sharp.html',
|
||||||
'--icon-url', 'https://gstreamer.freedesktop.org/images/header-logo-top.png',
|
'--icon-url', 'https://gstreamer.freedesktop.org/images/header-logo-top.png',
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<configuration>
|
<configuration>
|
||||||
<!-- Linux -->
|
<!-- Linux -->
|
||||||
<dllmap dll="libgstreamersharpglue-1.0.0.dll" target="libgstreamersharpglue-1.0.0.so" os="linux"/>
|
|
||||||
<dllmap dll="libgstreamer-1.0-0.dll" target="libgstreamer-1.0.so" os="linux"/>
|
<dllmap dll="libgstreamer-1.0-0.dll" target="libgstreamer-1.0.so" os="linux"/>
|
||||||
<dllmap dll="libgstaudio-1.0-0.dll" target="libgstaudio-1.0.so" os="linux"/>
|
<dllmap dll="libgstaudio-1.0-0.dll" target="libgstaudio-1.0.so" os="linux"/>
|
||||||
<dllmap dll="libgstbase-1.0-0.dll" target="libgstbase-1.0.so" os="linux"/>
|
<dllmap dll="libgstbase-1.0-0.dll" target="libgstbase-1.0.so" os="linux"/>
|
||||||
|
@ -18,7 +17,6 @@
|
||||||
<dllmap dll="libgobject-2.0-0.dll" target="libgobject-2.0.so" os="linux"/>
|
<dllmap dll="libgobject-2.0-0.dll" target="libgobject-2.0.so" os="linux"/>
|
||||||
<dllmap dll="libgthread-2.0-0.dll" target="libgthread-2.0.so" os="linux"/>
|
<dllmap dll="libgthread-2.0-0.dll" target="libgthread-2.0.so" os="linux"/>
|
||||||
<!-- Mac OS X -->
|
<!-- Mac OS X -->
|
||||||
<dllmap dll="libgstreamersharpglue-1.0.0.dll" target="libgstreamersharpglue-1.0.0.so" os="osx"/>
|
|
||||||
<dllmap dll="libgstreamer-1.0-0.dll" target="libgstreamer-1.0.dylib" os="osx"/>
|
<dllmap dll="libgstreamer-1.0-0.dll" target="libgstreamer-1.0.dylib" os="osx"/>
|
||||||
<dllmap dll="libgstaudio-1.0-0.dll" target="libgstaudio-1.0.dylib" os="osx"/>
|
<dllmap dll="libgstaudio-1.0-0.dll" target="libgstaudio-1.0.dylib" os="osx"/>
|
||||||
<dllmap dll="libgstbase-1.0-0.dll" target="libgstbase-1.0.dylib" os="osx"/>
|
<dllmap dll="libgstbase-1.0-0.dll" target="libgstbase-1.0.dylib" os="osx"/>
|
||||||
|
|
|
@ -202,8 +202,6 @@ namespace Gst
|
||||||
Connect (o, name, false, handler);
|
Connect (o, name, false, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int g_closure_sizeof = gstsharp_g_closure_sizeof ();
|
|
||||||
|
|
||||||
public static void Connect (GLib.Object o, string name,
|
public static void Connect (GLib.Object o, string name,
|
||||||
bool after, Delegate handler)
|
bool after, Delegate handler)
|
||||||
{
|
{
|
||||||
|
@ -226,16 +224,14 @@ namespace Gst
|
||||||
if (!SignalInfo.IsValidDelegate (handler))
|
if (!SignalInfo.IsValidDelegate (handler))
|
||||||
throw new Exception ("Invalid delegate");
|
throw new Exception ("Invalid delegate");
|
||||||
|
|
||||||
IntPtr closure = g_closure_new_simple (g_closure_sizeof, IntPtr.Zero);
|
// Let's allocate 64bytes for the GClosure, it should be more than necessary.
|
||||||
|
IntPtr closure = g_closure_new_simple (64, IntPtr.Zero);
|
||||||
g_closure_set_meta_marshal (closure, (IntPtr)GCHandle.Alloc (k), marshalHandler);
|
g_closure_set_meta_marshal (closure, (IntPtr)GCHandle.Alloc (k), marshalHandler);
|
||||||
uint signalId = g_signal_connect_closure (o.Handle, name, closure, after);
|
uint signalId = g_signal_connect_closure (o.Handle, name, closure, after);
|
||||||
SignalHandlers.Add (k, new SignalInfo (signalId, closure, handler));
|
SignalHandlers.Add (k, new SignalInfo (signalId, closure, handler));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport ("libgstreamersharpglue-1.0.0.dll", CallingConvention = CallingConvention.Cdecl)]
|
|
||||||
static extern int gstsharp_g_closure_sizeof ();
|
|
||||||
|
|
||||||
public static void Disconnect (GLib.Object o, string name, Delegate handler)
|
public static void Disconnect (GLib.Object o, string name, Delegate handler)
|
||||||
{
|
{
|
||||||
ObjectSignalKey k = new ObjectSignalKey (o, name);
|
ObjectSignalKey k = new ObjectSignalKey (o, name);
|
||||||
|
@ -333,7 +329,11 @@ namespace Gst
|
||||||
public static object Emit (GLib.Object o, string name, params object[] parameters)
|
public static object Emit (GLib.Object o, string name, params object[] parameters)
|
||||||
{
|
{
|
||||||
SignalQuery query;
|
SignalQuery query;
|
||||||
IntPtr type = gstsharp_g_type_from_instance (o.Handle);
|
IntPtr type;
|
||||||
|
unsafe {
|
||||||
|
// GType is the first field of GTypeInstance->g_class
|
||||||
|
type = (*(IntPtr*) ((GLib.Object.GTypeInstance*) o.Handle)->g_class);
|
||||||
|
}
|
||||||
GType gtype = new GType (type);
|
GType gtype = new GType (type);
|
||||||
string signal_name, signal_detail;
|
string signal_name, signal_detail;
|
||||||
uint signal_detail_quark = 0;
|
uint signal_detail_quark = 0;
|
||||||
|
@ -424,9 +424,6 @@ namespace Gst
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport ("libgstreamersharpglue-1.0.0.dll", CallingConvention = CallingConvention.Cdecl)]
|
|
||||||
static extern IntPtr gstsharp_g_type_from_instance (IntPtr o);
|
|
||||||
|
|
||||||
[DllImport ("libgobject-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
[DllImport ("libgobject-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||||
static extern int g_signal_handler_disconnect (IntPtr o, uint handler_id);
|
static extern int g_signal_handler_disconnect (IntPtr o, uint handler_id);
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,6 @@ namespace Gst {
|
||||||
static extern void gst_message_parse_error (IntPtr msg, out IntPtr err, out IntPtr debug);
|
static extern void gst_message_parse_error (IntPtr msg, out IntPtr err, out IntPtr debug);
|
||||||
|
|
||||||
public void ParseError (out GLib.GException error, out string debug) {
|
public void ParseError (out GLib.GException error, out string debug) {
|
||||||
if (Type != MessageType.Error)
|
|
||||||
throw new ArgumentException ();
|
|
||||||
|
|
||||||
IntPtr err;
|
IntPtr err;
|
||||||
IntPtr dbg;
|
IntPtr dbg;
|
||||||
|
@ -53,15 +51,11 @@ namespace Gst {
|
||||||
|
|
||||||
public GLib.Value StreamStatusObject {
|
public GLib.Value StreamStatusObject {
|
||||||
get {
|
get {
|
||||||
if(Type != MessageType.StreamStatus)
|
|
||||||
throw new ArgumentException ();
|
|
||||||
IntPtr raw_ret = gst_message_get_stream_status_object(Handle);
|
IntPtr raw_ret = gst_message_get_stream_status_object(Handle);
|
||||||
GLib.Value ret = (GLib.Value) Marshal.PtrToStructure (raw_ret, typeof (GLib.Value));
|
GLib.Value ret = (GLib.Value) Marshal.PtrToStructure (raw_ret, typeof (GLib.Value));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
if(Type != MessageType.StreamStatus)
|
|
||||||
throw new ArgumentException ();
|
|
||||||
IntPtr native_value = GLib.Marshaller.StructureToPtrAlloc (value);
|
IntPtr native_value = GLib.Marshaller.StructureToPtrAlloc (value);
|
||||||
gst_message_set_stream_status_object(Handle, native_value);
|
gst_message_set_stream_status_object(Handle, native_value);
|
||||||
value = (GLib.Value) Marshal.PtrToStructure (native_value, typeof (GLib.Value));
|
value = (GLib.Value) Marshal.PtrToStructure (native_value, typeof (GLib.Value));
|
||||||
|
|
|
@ -31,6 +31,19 @@ namespace Gst {
|
||||||
|
|
||||||
public class PropertyNotFoundException : Exception {}
|
public class PropertyNotFoundException : Exception {}
|
||||||
|
|
||||||
|
[StructLayout (LayoutKind.Sequential)]
|
||||||
|
struct GstObject {
|
||||||
|
IntPtr _lock;
|
||||||
|
public string name;
|
||||||
|
public Object parent;
|
||||||
|
public uint flags;
|
||||||
|
IntPtr controlBindings;
|
||||||
|
public int control_rate;
|
||||||
|
public int last_sync;
|
||||||
|
|
||||||
|
private IntPtr[] _gstGstReserved;
|
||||||
|
}
|
||||||
|
|
||||||
partial class Object
|
partial class Object
|
||||||
{
|
{
|
||||||
private Dictionary <string, bool> PropertyNameCache = new Dictionary<string, bool> ();
|
private Dictionary <string, bool> PropertyNameCache = new Dictionary<string, bool> ();
|
||||||
|
|
|
@ -724,8 +724,6 @@ gst_source_gen = custom_target('gst_codegen',
|
||||||
'--gapi-codegen', gapi_codegen,
|
'--gapi-codegen', gapi_codegen,
|
||||||
'--extra-includes=' + glib_api_includes,
|
'--extra-includes=' + glib_api_includes,
|
||||||
'--extra-includes=' + gio_api_includes,
|
'--extra-includes=' + gio_api_includes,
|
||||||
'--glue-file', gluefile,
|
|
||||||
'--glue-includes', glueincludes,
|
|
||||||
'--out', meson.current_build_dir(),
|
'--out', meson.current_build_dir(),
|
||||||
'--files', ';'.join(generated_sources),
|
'--files', ';'.join(generated_sources),
|
||||||
'--assembly-name', meson.project_name(),
|
'--assembly-name', meson.project_name(),
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
lib_LTLIBRARIES = libgstreamersharpglue-1.0.0.la
|
|
||||||
|
|
||||||
libgstreamersharpglue_1_0_0_la_SOURCES = gobject.c
|
|
||||||
|
|
||||||
nodist_libgstreamersharpglue_1_0_0_la_SOURCES = generated.c
|
|
||||||
|
|
||||||
libgstreamersharpglue_1_0_0_la_LDFLAGS = -module -avoid-version -no-undefined
|
|
||||||
|
|
||||||
libgstreamersharpglue_1_0_0_la_LIBADD = $(GST_LIBS)
|
|
||||||
|
|
||||||
libgstreamersharpglue_1_0_0_la_CPPFLAGS = -DGST_USE_UNSTABLE_API
|
|
||||||
|
|
||||||
INCLUDES = $(GST_CFLAGS) -I$(top_srcdir)
|
|
||||||
|
|
||||||
libgstreamersharpglue.dll: $(libgstreamersharpglue_1_0_0_la_OBJECTS) libgstreamersharpglue.rc libgstreamersharpglue.def
|
|
||||||
./build-dll libgstreamersharpglue $(VERSION)
|
|
||||||
|
|
||||||
CLEANFILES = lib*.a lib*.dll generated.c
|
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
|
||||||
|
|
||||||
EXTRA_DIST =
|
|
|
@ -1,34 +0,0 @@
|
||||||
//
|
|
||||||
// Authors:
|
|
||||||
// Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
|
||||||
//
|
|
||||||
// Copyright (C) 2009 Sebastian Dröge
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
|
|
||||||
#include <glib-object.h>
|
|
||||||
|
|
||||||
gint
|
|
||||||
gstsharp_g_closure_sizeof (void)
|
|
||||||
{
|
|
||||||
return sizeof (GClosure);
|
|
||||||
}
|
|
||||||
|
|
||||||
GType
|
|
||||||
gstsharp_g_type_from_instance (GTypeInstance * instance)
|
|
||||||
{
|
|
||||||
return G_TYPE_FROM_INSTANCE (instance);
|
|
||||||
}
|
|
|
@ -139,6 +139,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
<attr path="/api/namespace/boxed[@cname='GstVideoCodecState']/field[@cname='padding']" name="type">gpointer</attr>
|
<attr path="/api/namespace/boxed[@cname='GstVideoCodecState']/field[@cname='padding']" name="type">gpointer</attr>
|
||||||
<attr path="/api/namespace/object[@cname='GstVideoDecoder']/field[@cname='padding']" name="type">gpointer</attr>
|
<attr path="/api/namespace/object[@cname='GstVideoDecoder']/field[@cname='padding']" name="type">gpointer</attr>
|
||||||
<attr path="/api/namespace/object[@cname='GstVideoDecoder']/class_struct/field[@cname='padding']" name="type">gpointer</attr>
|
<attr path="/api/namespace/object[@cname='GstVideoDecoder']/class_struct/field[@cname='padding']" name="type">gpointer</attr>
|
||||||
|
<attr path="/api/namespace/object[@cname='GstVideoEncoder']/field[@cname='padding']" name="type">gpointer</attr>
|
||||||
<attr path="/api/namespace/struct[@cname='GstByteReader']" name="opaque">1</attr>
|
<attr path="/api/namespace/struct[@cname='GstByteReader']" name="opaque">1</attr>
|
||||||
<remove-node path="/api/namespace//struct[@cname='GstByteReader']//method"/>
|
<remove-node path="/api/namespace//struct[@cname='GstByteReader']//method"/>
|
||||||
<attr path="//struct[@name='VideoGLTextureUploadMeta']//field[@cname='user_data_copy' or @cname='user_data_free']" name="hidden">true</attr>
|
<attr path="//struct[@name='VideoGLTextureUploadMeta']//field[@cname='user_data_copy' or @cname='user_data_free']" name="hidden">true</attr>
|
||||||
|
|
|
@ -41,13 +41,13 @@ gst_sharp = library('gstreamer-sharp', gst_source_gen, sources,
|
||||||
'-keyfile:' + snk],
|
'-keyfile:' + snk],
|
||||||
dependencies: [glib_sharp_dep, gio_sharp_dep])
|
dependencies: [glib_sharp_dep, gio_sharp_dep])
|
||||||
|
|
||||||
gluegen = custom_target('gluegen',
|
#gluegen = custom_target('gluegen',
|
||||||
input: raw_api_fname,
|
#input: raw_api_fname,
|
||||||
output: 'generate.c',
|
#output: 'generate.c',
|
||||||
command: [generate_api, '--fakeglue'],
|
#command: [generate_api, '--fakeglue'],
|
||||||
depends: [gst_source_gen])
|
#depends: [gst_source_gen])
|
||||||
|
|
||||||
gst_glue = library('gstreamersharpglue-1.0.0', gluegen, 'glue/gobject.c', dependencies: gst_deps)
|
#gst_glue = library('gstreamersharpglue-1.0.0', gluegen, 'glue/gobject.c', dependencies: gst_deps)
|
||||||
|
|
||||||
gst_sharp_dep = declare_dependency(dependencies: [glib_sharp_dep, gio_sharp_dep],
|
gst_sharp_dep = declare_dependency(dependencies: [glib_sharp_dep, gio_sharp_dep],
|
||||||
link_with: gst_sharp)
|
link_with: gst_sharp)
|
||||||
|
|
Loading…
Reference in a new issue