mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 18:20:44 +00:00
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: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1885>
This commit is contained in:
parent
95ff949eff
commit
38a3af96d0
4 changed files with 46 additions and 6 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
41
subprojects/gstreamer-sharp/sources/custom/ElementFactory.cs
Normal file
41
subprojects/gstreamer-sharp/sources/custom/ElementFactory.cs
Normal file
|
@ -0,0 +1,41 @@
|
|||
//
|
||||
// ElementFactory.cs
|
||||
//
|
||||
// Authors:
|
||||
// Jakub Adam <jakub.adam@collabora.com>
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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',
|
||||
|
|
Loading…
Reference in a new issue