2017-03-14 2 views
0

Essayer de faire une sous-classe:Comment remplacer handle_message dans GstBin?

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) 
{ 
    // ??? 
} 

Que écrire dans my_bin_new() pour faire le my_bin_class_init() être appelé?

J'ai vu g_object_new() dans les docs glib, mais on ne sait pas trop quoi lui passer. Les sources gstreamer appellent gst_element_factory_make(), mais je ne vois pas comment cette fabrique est liée à ma classe personnalisée.

Répondre

0

GObject prendra soin d'appeler ces fonctions d'initialisation de classe et d'objet si nécessaire (création d'objet). Consultez la documentation de GObject pour en savoir plus: https://developer.gnome.org/gobject/stable/chapter-gobject.html

En bref, il vous suffit d'implémenter ceux-ci selon vos besoins et GObject le gérera pour vous. Il y a quelques exemples de substitution de la fonction dans le code GStreamer: https://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/multifile/gstsplitmuxsink.c#n214

Si vous voulez un exemple qui est créé directement (non enregistré à utiliser via gst_element_factory_make vous pouvez vérifier les éléments de lecture: https://cgit.freedesktop.org/gstreamer/gst-plugins-base/tree/gst/playback/gstplaysinkvideoconvert.c, ils sont créés directement dans l'élément playsink (code est dans le même répertoire que celui-ci).

1

Ok, il est

g_object_new(my_bin_get_type(), NULL); 

my_bin_get_type() est fourni par G_DEFINE_TYPE.