如何覆盖GstBin中的handle_message?

时间:2017-03-14 13:53:48

标签: c gstreamer glib gnome gobject

尝试创建子类:

mybin.h:

#pragma once

#include <gst/gstbin.h>

G_BEGIN_DECLS

G_DECLARE_DERIVABLE_TYPE(MyBin, my_bin, MY, BIN, GstBin)

struct _MyBinClass
{
    GstBinClass parent_class;
};

GstElement* my_bin_new(const gchar *name);

G_END_DECLS

mybin.c:

#include "mybin.h"

G_DEFINE_TYPE(MyBin, my_bin, GST_TYPE_BIN)

static void my_bin_init(MyBin *bin)
{
}

static void my_bin_class_init(MyBinClass *class)
{
    // virtual function overrides go here
}

GstElement* my_bin_new(const gchar *name)
{
    // ???
}

my_bin_new()中写什么来调用my_bin_class_init()

我在glib文档中看到了g_object_new(),但它还不清楚要传递给它的是什么。 gstreamer来源调用gst_element_factory_make(),但我无法看到该工厂与我的自定义类的关系。

2 个答案:

答案 0 :(得分:1)

好的,是

g_object_new(my_bin_get_type(), NULL);

my_bin_get_type()提供G_DEFINE_TYPE

答案 1 :(得分:0)

GObject将在需要时(对象创建)负责调用这些类和对象初始化函数。检查GObject文档以了解它:https://developer.gnome.org/gobject/stable/chapter-gobject.html

简而言之,只需根据需要实施,GObject将为您处理。在GStreamer代码中有一些覆盖函数的例子:https://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/multifile/gstsplitmuxsink.c#n214

如果你想要一个直接创建的例子(未注册通过gst_element_factory_make使用,你可以检查回放元素:https://cgit.freedesktop.org/gstreamer/gst-plugins-base/tree/gst/playback/gstplaysinkvideoconvert.c,它们是直接在playsink元素中创建的(代码在同一个文件夹中)就像这一个。)