From: Jakub Adam Date: Mon, 6 Jul 2020 21:15:22 +0000 (+0200) Subject: gstreamer-sharp: Fix App{Src,Sink} constructors X-Git-Tag: 1.22.0~2214 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=38a3af96d0e70c103b6be91e32b0bd38da6eddc9;p=platform%2Fupstream%2Fgstreamer.git gstreamer-sharp: Fix App{Src,Sink} constructors Apparently GtkSharp expects each object has only one ToggleRef at any time. Assigning element.Handle into Raw has a consequence that second ToggleRef attempts to get created but fails on g_object_unref () that breaks a GObject assertion: toggle_refs_notify: assertion failed: (tstack.n_toggle_refs == 1) This is because toggle references should be removed with g_object_remove_toggle_ref(), not a simple unref(). In order to avoid duplicate toggle references, introduce ElementFactory.MakeRaw(), which creates a GstElement without its accompanying C# object. The returned raw pointer can be assigned into another GLib.Object without trouble. Part-of: --- diff --git a/subprojects/gstreamer-sharp/sources/custom/AppSink.cs b/subprojects/gstreamer-sharp/sources/custom/AppSink.cs index 2f21822..de90fae 100644 --- a/subprojects/gstreamer-sharp/sources/custom/AppSink.cs +++ b/subprojects/gstreamer-sharp/sources/custom/AppSink.cs @@ -27,9 +27,8 @@ namespace Gst.App { partial class AppSink { - public AppSink (String name) { - var element = ElementFactory.Make ("appsink", name); - Raw = element.Handle; + public AppSink (String name) : base(IntPtr.Zero) { + Raw = ElementFactory.MakeRaw("appsink", name); } } } diff --git a/subprojects/gstreamer-sharp/sources/custom/AppSrc.cs b/subprojects/gstreamer-sharp/sources/custom/AppSrc.cs index 536725d..ce06671 100644 --- a/subprojects/gstreamer-sharp/sources/custom/AppSrc.cs +++ b/subprojects/gstreamer-sharp/sources/custom/AppSrc.cs @@ -27,9 +27,8 @@ namespace Gst.App { partial class AppSrc { - public AppSrc (String name) { - var element = ElementFactory.Make ("appsrc", name); - Raw = element.Handle; + public AppSrc (String name) : base(IntPtr.Zero) { + Raw = ElementFactory.MakeRaw ("appsrc", name); } } } diff --git a/subprojects/gstreamer-sharp/sources/custom/ElementFactory.cs b/subprojects/gstreamer-sharp/sources/custom/ElementFactory.cs new file mode 100644 index 0000000..c6e11a0 --- /dev/null +++ b/subprojects/gstreamer-sharp/sources/custom/ElementFactory.cs @@ -0,0 +1,41 @@ +// +// ElementFactory.cs +// +// Authors: +// Jakub Adam +// +// Copyright (C) 2020 Collabora Ltd. +// +// 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 + +namespace Gst +{ + using System; + using System.Runtime.InteropServices; + + public partial class ElementFactory + { + public static IntPtr MakeRaw(string factoryname, string name) + { + IntPtr native_factoryname = GLib.Marshaller.StringToPtrGStrdup(factoryname); + IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup(name); + IntPtr raw_ret = gst_element_factory_make(native_factoryname, native_name); + GLib.Marshaller.Free(native_factoryname); + GLib.Marshaller.Free(native_name); + return raw_ret; + } + } +} diff --git a/subprojects/gstreamer-sharp/sources/meson.build b/subprojects/gstreamer-sharp/sources/meson.build index c327ced..0e75ca0 100644 --- a/subprojects/gstreamer-sharp/sources/meson.build +++ b/subprojects/gstreamer-sharp/sources/meson.build @@ -16,6 +16,7 @@ sources = [ 'custom/DeviceProvider.cs', 'custom/DynamicSignal.cs', 'custom/Element.cs', + 'custom/ElementFactory.cs', 'custom/FFTF32.cs', 'custom/Iterator.cs', 'custom/MapInfo.cs',