`GObject
|
+GstObject
| |
| +GstPad
| |
| +GstPadTemplate
| |
| +GstPluginFeature
| | |
| | +GstElementFactory
| | |
| | +GstTypeFindFactory
| | |
| | `GstIndexFactory
| |
| +GstElement
| | |
| | `GstBin
| | |
| | `GstPipeline
| |
| +GstBus
| |
| +GstTask
| |
| +GstTaskPool
| |
| +GstClock
| |
| +GstPlugin
| |
| `GstRegistry
|
`GstSignalObject
|
`GstMiniObject
|
+GstQuery
|
+GstMessage
|
+GstBuffer
|
+GstEvent
|
`GstBufferList
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
* GstObject:
* @refcount: unused
* @lock: object LOCK
* @name: The name of the object
* @name_prefix: unused
* @parent: this object's parent, weak ref
* @flags: use GST_OBJECT_IS_XXX macros to access the flags
*
* GStreamer base object class.
*/
struct _GstObject {
GObject object;
/*< public >*/
gint refcount; /* unused (FIXME 0.11: remove) */
/*< public >*/ /* with LOCK */
GMutex *lock; /* object LOCK */
gchar *name; /* object name */
gchar *name_prefix; /* (un)used for debugging (FIXME 0.11: remove) */
GstObject *parent; /* this object's parent, weak ref */
guint32 flags;
/*< private >*/
gpointer _gst_reserved;
};
/**
* GstObjectClass:
* @parent_class: parent
* @path_string_separator: separator used by gst_object_get_path_string()
* @signal_object: is used to signal to the whole class
* @lock: class lock to be used with GST_CLASS_GET_LOCK(), GST_CLASS_LOCK(), GST_CLASS_UNLOCK() and others.
* @parent_set: default signal handler
* @parent_unset: default signal handler
* @object_saved: default signal handler
* @deep_notify: default signal handler
* @save_thyself: xml serialisation
* @restore_thyself: xml de-serialisation
*
* GStreamer base object class.
*/
struct _GstObjectClass {
GObjectClass parent_class;
const gchar *path_string_separator;
GObject *signal_object;
/* FIXME-0.11: remove this, plus the above GST_CLASS_*_LOCK macros */
GStaticRecMutex *lock;
/* signals */
/* FIXME-0.11: remove, and pass NULL in g_signal_new(), we never used them */
void (*parent_set) (GstObject * object, GstObject * parent);
void (*parent_unset) (GstObject * object, GstObject * parent);
/* FIXME 0.11: Remove this, it's deprecated */
void (*object_saved) (GstObject * object, GstXmlNodePtr parent);
void (*deep_notify) (GstObject * object, GstObject * orig, GParamSpec * pspec);
/*< public >*/
/* virtual methods for subclasses */
/* FIXME 0.11: Remove this, it's deprecated */
GstXmlNodePtr (*save_thyself) (GstObject * object, GstXmlNodePtr parent);
void (*restore_thyself) (GstObject * object, GstXmlNodePtr self);
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
GObjectGstObject
成員函數 class->constructor = g_object_constructor;
class->constructed = g_object_constructed;
class->set_property = g_object_do_set_property;
class->get_property = g_object_do_get_property;
class->dispose = g_object_real_dispose;
class->finalize = g_object_finalize;
class->dispatch_properties_changed = g_object_dispatch_properties_changed;
class->notify = NULL;override Gobject的一些:
gobject_class->set_property = gst_object_set_property;
gobject_class->get_property = gst_object_get_property;
gobject_class->dispatch_properties_changed
= GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);
gobject_class->dispose = gst_object_dispose;
gobject_class->finalize = gst_object_finalize;
Property-"name"
Signals"notify" ; default handler: class->notify = NULL;"parent-set",it's default handler is NULL?
"parent-unset",it's default handler is NULL?
"object-saved",it's default handler is NULL?
"deep-notify",it's default handler is NULL?
User register signal handler user可以自己注冊"notify"的回調: user handleruser可以自己注冊上面幾個(gè)信號的回調: user handler
何時(shí)emit signal?user 調用GObject的APIs:
g_object_set()
g_object_notify()
g_object_notify_by_pspec()
user 調用GstObject的APIs:
gst_object_set_parent()
gst_object_unparent()
gst_object_save_thyself()
Quark data"GObject-closure-array"
"GObject-weak-references"
"GObject-toggle-references"
"GObject-notify-queue"
以及用戶(hù)自定義的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/**
* GstPad:
* @element_private: private data owned by the parent element
* @padtemplate: padtemplate for this pad
* @direction: the direction of the pad, cannot change after creating
* the pad.
* @stream_rec_lock: recursive stream lock of the pad, used to protect
* the data used in streaming.
* @task: task for this pad if the pad is actively driving dataflow.
* @preroll_lock: lock used when prerolling
* @preroll_cond: conf to signal preroll
* @block_cond: conditional to signal pad block
* @block_callback: callback for the pad block if any
* @block_data: user data for @block_callback
* @caps: the current caps of the pad
* @getcapsfunc: function to get caps of the pad
* @setcapsfunc: function to set caps on the pad
* @acceptcapsfunc: function to check if pad can accept caps
* @fixatecapsfunc: function to fixate caps
* @activatefunc: pad activation function
* @activatepushfunc: function to activate/deactivate pad in push mode
* @activatepullfunc: function to activate/deactivate pad in pull mode
* @linkfunc: function called when pad is linked
* @unlinkfunc: function called when pad is unlinked
* @peer: the pad this pad is linked to
* @sched_private: private storage for the scheduler
* @chainfunc: function to chain buffer to pad
* @checkgetrangefunc: function to check if pad can operate in pull mode
* @getrangefunc: function to get a range of data from a pad
* @eventfunc: function to send an event to a pad
* @mode: current activation mode of the pad
* @querytypefunc: get list of supported queries
* @queryfunc: perform a query on the pad
* @intlinkfunc: get the internal links of this pad
* @bufferallocfunc: function to allocate a buffer for this pad
* @do_buffer_signals: counter counting installed buffer signals
* @do_event_signals: counter counting installed event signals
* @iterintlinkfunc: get the internal links iterator of this pad
* @block_destroy_data: notify function for gst_pad_set_blocked_async_full()
*
* The #GstPad structure. Use the functions to update the variables.
*/
struct _GstPad {
GstObject object;
/*< public >*/
gpointer element_private;
GstPadTemplate *padtemplate;
GstPadDirection direction;
/*< public >*/ /* with STREAM_LOCK */
/* streaming rec_lock */
GStaticRecMutex *stream_rec_lock;
GstTask *task;
/*< public >*/ /* with PREROLL_LOCK */
GMutex *preroll_lock;
GCond *preroll_cond;
/*< public >*/ /* with LOCK */
/* block cond, mutex is from the object */
GCond *block_cond;
GstPadBlockCallback block_callback;
gpointer block_data;
/* the pad capabilities */
GstCaps *caps;
GstPadGetCapsFunction getcapsfunc;
GstPadSetCapsFunction setcapsfunc;
GstPadAcceptCapsFunction acceptcapsfunc;
GstPadFixateCapsFunction fixatecapsfunc;
GstPadActivateFunction activatefunc;
GstPadActivateModeFunction activatepushfunc;
GstPadActivateModeFunction activatepullfunc;
/* pad link */
GstPadLinkFunction linkfunc;
GstPadUnlinkFunction unlinkfunc;
GstPad *peer;
gpointer sched_private;
/* data transport functions */
GstPadChainFunction chainfunc;
GstPadCheckGetRangeFunction checkgetrangefunc;
GstPadGetRangeFunction getrangefunc;
GstPadEventFunction eventfunc;
GstActivateMode mode;
/* generic query method */
GstPadQueryTypeFunction querytypefunc;
GstPadQueryFunction queryfunc;
/* internal links */
#ifndef GST_DISABLE_DEPRECATED
GstPadIntLinkFunction intlinkfunc;
#else
#ifndef __GTK_DOC_IGNORE__
gpointer intlinkfunc;
#endif
#endif
GstPadBufferAllocFunction bufferallocfunc;
/* whether to emit signals for have-data. counts number
* of handlers attached. */
gint do_buffer_signals;
gint do_event_signals;
/* ABI added */
/* iterate internal links */
GstPadIterIntLinkFunction iterintlinkfunc;
/* free block_data */
GDestroyNotify block_destroy_data;
/*< private >*/
union {
struct {
gboolean block_callback_called;
GstPadPrivate *priv;
} ABI;
gpointer _gst_reserved[GST_PADDING - 2];
} abidata;
};
struct _GstPadClass {
GstObjectClass parent_class;
/* signal callbacks */
void (*linked) (GstPad *pad, GstPad *peer);
void (*unlinked) (GstPad *pad, GstPad *peer);
void (*request_link) (GstPad *pad);
gboolean (*have_data) (GstPad *pad, GstMiniObject *data);
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
GObjectGstObjectGstPad
成員函數 override Gobject的一些:
gobject_class->set_property = gst_object_set_property;
gobject_class->get_property = gst_object_get_property;
gobject_class->dispatch_properties_changed
= GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);
gobject_class->dispose = gst_object_dispose;
gobject_class->finalize = gst_object_finalize;
gobject_class->dispose = gst_pad_dispose;
gobject_class->finalize = gst_pad_finalize;
gobject_class->set_property = gst_pad_set_property;
gobject_class->get_property = gst_pad_get_property;
Property-"name""caps"
"direction"
"template"
enum
{
PAD_PROP_0,
PAD_PROP_CAPS,
PAD_PROP_DIRECTION,
PAD_PROP_TEMPLATE,
/* FILL ME */
};
Signals "parent-set",it's default handler is NULL?
"parent-unset",it's default handler is NULL?
"object-saved",it's default handler is NULL?
"deep-notify",it's default handler is NULL?
"linked"
"unlinked"
"request-link"
"have-data"
enum
{
PAD_LINKED,
PAD_UNLINKED,
PAD_REQUEST_LINK,
PAD_HAVE_DATA,
/* FILL ME */
LAST_SIGNAL
};
User register signal handler user可以自己注冊上面幾個(gè)信號的回調: user handler
何時(shí)emit signal?
user 調用GstObject的APIs:
gst_object_set_parent()
gst_object_unparent()
gst_object_save_thyself()
gst_pad_signals[PAD_LINKED]:
1. gst_pad_link_full()
2. gst_pad_link()
gst_pad_signals[PAD_UNLINKED]:
1. gst_pad_unlink()
gst_pad_signals[PAD_HAVE_DATA]:
1. gst_pad_pull_range()
2. gst_pad_push_event()
3. gst_pad_send_event()
Quark data
/* quarks for probe signals */
static GQuark buffer_quark;
static GQuark event_quark;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* GstPadTemplate:
*
* The padtemplate object.
*/
struct _GstPadTemplate {
GstObject object;
gchar *name_template;
GstPadDirection direction;
GstPadPresence presence;
GstCaps *caps;
gpointer _gst_reserved[GST_PADDING];
};
struct _GstPadTemplateClass {
GstObjectClass parent_class;
/* signal callbacks */
void (*pad_created) (GstPadTemplate *templ, GstPad *pad);
gpointer _gst_reserved[GST_PADDING];
};
GObjectGstObjectGstPadTemplate
成員函數 override Gobject的一些:
gobject_class->set_property = gst_object_set_property;
gobject_class->get_property = gst_object_get_property;
gobject_class->dispatch_properties_changed
= GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);
gobject_class->dispose = gst_object_dispose;
gobject_class->finalize = gst_object_finalize;
gobject_class->dispose = gst_pad_template_dispose;
gobject_class->get_property = gst_pad_template_get_property;
gobject_class->set_property = gst_pad_template_set_property;
Property-"name"enum
{
PROP_NAME_TEMPLATE = 1,
PROP_DIRECTION,
PROP_PRESENCE,
PROP_CAPS
};
Signals "parent-set",it's default handler is NULL?
"parent-unset",it's default handler is NULL?
"object-saved",it's default handler is NULL?
"deep-notify",it's default handler is NULL?
"pad-created"
enum
{
TEMPL_PAD_CREATED,
/* FILL ME */
LAST_SIGNAL
};
User register signal handler user可以自己注冊上面幾個(gè)信號的回調: user handler
何時(shí)emit signal?
user 調用GstObject的APIs:
gst_object_set_parent()
gst_object_unparent()
gst_object_save_thyself()
gst_pad_template_signals[TEMPL_PAD_CREATED]:
gst_pad_template_pad_created
Quark data
/* quarks for probe signals */
static GQuark buffer_quark;
static GQuark event_quark;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* GstPluginFeature:
*
* Opaque #GstPluginFeature structure.
*/
struct _GstPluginFeature {
GstObject object;
/*< private >*/
gboolean loaded;
gchar *name; /* FIXME-0.11: remove variable, we use GstObject:name */
guint rank;
const gchar *plugin_name;
GstPlugin *plugin; /* weak ref */
/*< private >*/
gpointer _gst_reserved[GST_PADDING - 1];
};
struct _GstPluginFeatureClass {
GstObjectClass parent_class;
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
GObjectGstObjectGstPluginFeature
成員函數 override Gobject的一些:
gobject_class->set_property = gst_object_set_property;
gobject_class->get_property = gst_object_get_property;
gobject_class->dispatch_properties_changed
= GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);
gobject_class->dispose = gst_object_dispose;
gobject_class->finalize = gst_object_finalize;
G_OBJECT_CLASS (klass)->finalize = gst_plugin_feature_finalize;
Property-"name"
Signals "parent-set",it's default handler is NULL?
"parent-unset",it's default handler is NULL?
"object-saved",it's default handler is NULL?
"deep-notify",it's default handler is NULL?
User register signal handler user可以自己注冊上面幾個(gè)信號的回調: user handler
何時(shí)emit signal?
user 調用GstObject的APIs:
gst_object_set_parent()
gst_object_unparent()
gst_object_save_thyself()
Quark data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* GstElementFactory:
*
* The opaque #GstElementFactory data structure.
*/
struct _GstElementFactory {
GstPluginFeature parent;
GType type; /* unique GType of element or 0 if not loaded */
/* FIXME-0.11: deprecate this in favour of meta_data */
GstElementDetails details;
GList * staticpadtemplates; /* GstStaticPadTemplate list */
guint numpadtemplates;
/* URI interface stuff */
guint uri_type;
gchar ** uri_protocols;
GList * interfaces; /* interface type names this element implements */
/*< private >*/
/* FIXME-0.11: move up and replace details */
gpointer meta_data;
gpointer _gst_reserved[GST_PADDING - 1];
};
struct _GstElementFactoryClass {
GstPluginFeatureClass parent_class;
gpointer _gst_reserved[GST_PADDING];
};
GObjectGstObjectGstPluginFeatureGstElementFactory
成員函數
G_OBJECT_CLASS (klass)->finalize = gst_plugin_feature_finalize;
gobject_class->finalize = gst_element_factory_finalize;
Property
Signals
User register signal handler
何時(shí)emit signal?
Quark data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* GstTypeFindFactory:
*
* Object that stores information about a typefind function.
*/
struct _GstTypeFindFactory {
GstPluginFeature feature;
/* <private> */
GstTypeFindFunction function;
gchar ** extensions;
GstCaps * caps; /* FIXME: not yet saved in registry */
gpointer user_data;
GDestroyNotify user_data_notify;
gpointer _gst_reserved[GST_PADDING];
};
struct _GstTypeFindFactoryClass {
GstPluginFeatureClass parent;
/* <private> */
gpointer _gst_reserved[GST_PADDING];
};
GObjectGstObjectGstPluginFeatureGstTypeFindFactory
成員函數
G_OBJECT_CLASS (klass)->finalize = gst_plugin_feature_finalize;
object_class->dispose = gst_type_find_factory_dispose;
Property
Signals
User register signal handler
何時(shí)emit signal?
Quark data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* GstIndexFactory:
*
* The GstIndexFactory object
*/
struct _GstIndexFactory {
GstPluginFeature feature;
gchar *longdesc; /* long description of the index (well, don't overdo it..) */
GType type; /* unique GType of the index */
gpointer _gst_reserved[GST_PADDING];
};
struct _GstIndexFactoryClass {
GstPluginFeatureClass parent;
gpointer _gst_reserved[GST_PADDING];
};
GObjectGstObjectGstPluginFeatureGstIndexFactory
成員函數
G_OBJECT_CLASS (klass)->finalize = gst_plugin_feature_finalize;
gobject_class->finalize = gst_index_factory_finalize;
Property
Signals
User register signal handler
何時(shí)emit signal?
Quark data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/**
* GstElement:
* @state_lock: Used to serialize execution of gst_element_set_state()
* @state_cond: Used to signal completion of a state change
* @state_cookie: Used to detect concurrent execution of
* gst_element_set_state() and gst_element_get_state()
* @current_state: the current state of an element
* @next_state: the next state of an element, can be #GST_STATE_VOID_PENDING if
* the element is in the correct state.
* @pending_state: the final state the element should go to, can be
* #GST_STATE_VOID_PENDING if the element is in the correct state
* @last_return: the last return value of an element state change
* @bus: the bus of the element. This bus is provided to the element by the
* parent element or the application. A #GstPipeline has a bus of its own.
* @clock: the clock of the element. This clock is usually provided to the
* element by the toplevel #GstPipeline.
* @base_time: the time of the clock right before the element is set to
* PLAYING. Subtracting @base_time from the current clock time in the PLAYING
* state will yield the running_time against the clock.
* @numpads: number of pads of the element, includes both source and sink pads.
* @pads: list of pads
* @numsrcpads: number of source pads of the element.
* @srcpads: list of source pads
* @numsinkpads: number of sink pads of the element.
* @sinkpads: list of sink pads
* @pads_cookie: updated whenever the a pad is added or removed
*
* GStreamer element abstract base class.
*/
struct _GstElement
{
GstObject object;
/*< public >*/ /* with LOCK */
GStaticRecMutex *state_lock;
/* element state */
GCond *state_cond;
guint32 state_cookie;
GstState current_state;
GstState next_state;
GstState pending_state;
GstStateChangeReturn last_return;
GstBus *bus;
/* allocated clock */
GstClock *clock;
GstClockTimeDiff base_time; /* NULL/READY: 0 - PAUSED: current time - PLAYING: difference to clock */
/* element pads, these lists can only be iterated while holding
* the LOCK or checking the cookie after each LOCK. */
guint16 numpads;
GList *pads;
guint16 numsrcpads;
GList *srcpads;
guint16 numsinkpads;
GList *sinkpads;
guint32 pads_cookie;
/*< private >*/
union {
struct {
/* state set by application */
GstState target_state;
/* running time of the last PAUSED state */
GstClockTime start_time;
} ABI;
/* adding + 0 to mark ABI change to be undone later */
gpointer _gst_reserved[GST_PADDING + 0];
} abidata;
};
/**
* GstElementClass:
* @parent_class: the parent class structure
* @details: #GstElementDetails for elements of this class
* @elementfactory: the #GstElementFactory that creates these elements
* @padtemplates: a #GList of #GstPadTemplate
* @numpadtemplates: the number of padtemplates
* @pad_templ_cookie: changed whenever the padtemplates change
* @request_new_pad: called when a new pad is requested
* @release_pad: called when a request pad is to be released
* @get_state: get the state of the element
* @set_state: set a new state on the element
* @change_state: called by @set_state to perform an incremental state change
* @set_bus: set a #GstBus on the element
* @provide_clock: gets the #GstClock provided by the element
* @set_clock: set the #GstClock on the element
* @get_index: set a #GstIndex on the element
* @set_index: get the #GstIndex of an element
* @send_event: send a #GstEvent to the element
* @get_query_types: get the supported #GstQueryType of this element
* @query: perform a #GstQuery on the element
* @request_new_pad_full: called when a new pad is requested. Since: 0.10.32.
* @state_changed: called immediately after a new state was set. Since: 0.10.36.
*
* GStreamer element class. Override the vmethods to implement the element
* functionality.
*/
struct _GstElementClass
{
GstObjectClass parent_class;
/*< public >*/
/* the element details */
/* FIXME-0.11: deprecate this in favour of meta_data */
GstElementDetails details;
/* factory that the element was created from */
GstElementFactory *elementfactory;
/* templates for our pads */
GList *padtemplates;
gint numpadtemplates;
guint32 pad_templ_cookie;
/*< private >*/
/* signal callbacks */
void (*pad_added) (GstElement *element, GstPad *pad);
void (*pad_removed) (GstElement *element, GstPad *pad);
void (*no_more_pads) (GstElement *element);
/*< public >*/
/* virtual methods for subclasses */
/* request/release pads */
GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ, const gchar* name);
void (*release_pad) (GstElement *element, GstPad *pad);
/* state changes */
GstStateChangeReturn (*get_state) (GstElement * element, GstState * state,
GstState * pending, GstClockTime timeout);
GstStateChangeReturn (*set_state) (GstElement *element, GstState state);
GstStateChangeReturn (*change_state) (GstElement *element, GstStateChange transition);
/* bus */
void (*set_bus) (GstElement * element, GstBus * bus);
/* set/get clocks */
GstClock* (*provide_clock) (GstElement *element);
gboolean (*set_clock) (GstElement *element, GstClock *clock);
/* index */
GstIndex* (*get_index) (GstElement *element);
void (*set_index) (GstElement *element, GstIndex *index);
/* query functions */
gboolean (*send_event) (GstElement *element, GstEvent *event);
const GstQueryType* (*get_query_types) (GstElement *element);
gboolean (*query) (GstElement *element, GstQuery *query);
/*< private >*/
/* FIXME-0.11: move up and replace details */
gpointer meta_data;
/*< public >*/
/* Virtual method for subclasses (additions) */
/* FIXME-0.11 Make this the default behaviour */
GstPad* (*request_new_pad_full) (GstElement *element, GstPadTemplate *templ,
const gchar* name, const GstCaps *caps);
void (*state_changed) (GstElement *element, GstState oldstate,
GstState newstate, GstState pending);
/*< private >*/
gpointer _gst_reserved[GST_PADDING-3];
};
GObjectGstObjectGstElement
成員函數 override Gobject的一些:
gobject_class->set_property = gst_object_set_property;
gobject_class->get_property = gst_object_get_property;
gobject_class->dispatch_properties_changed
= GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);
gobject_class->dispose = gst_object_dispose;
gobject_class->finalize = gst_object_finalize;
gobject_class->dispose = gst_element_dispose;
gobject_class->finalize = gst_element_finalize;
Property-"name"
Signals "parent-set",it's default handler is NULL?
"parent-unset",it's default handler is NULL?
"object-saved",it's default handler is NULL?
"deep-notify",it's default handler is NULL?
enum
{
PAD_ADDED,
PAD_REMOVED,
NO_MORE_PADS,
/* add more above */
LAST_SIGNAL
};
User register signal handler user可以自己注冊上面幾個(gè)信號的回調: user handler
何時(shí)emit signal?
user 調用GstObject的APIs:
gst_object_set_parent()
gst_object_unparent()
gst_object_save_thyself()
gst_element_add_pad ()
gst_element_remove_pad()
gst_element_no_more_pads()
Quark data
_gst_elementclass_factory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
* GstBin:
* @numchildren: the number of children in this bin
* @children: the list of children in this bin
* @children_cookie: updated whenever @children changes
* @child_bus: internal bus for handling child messages
* @messages: queued and cached messages
* @polling: the bin is currently calculating its state
* @state_dirty: the bin needs to recalculate its state (deprecated)
* @clock_dirty: the bin needs to select a new clock
* @provided_clock: the last clock selected
* @clock_provider: the element that provided @provided_clock
*
* The GstBin base class. Subclasses can access these fields provided
* the LOCK is taken.
*/
struct _GstBin {
GstElement element;
/*< public >*/ /* with LOCK */
/* our children, subclass are supposed to update these
* fields to reflect their state with _iterate_*() */
gint numchildren;
GList *children;
guint32 children_cookie;
GstBus *child_bus;
GList *messages;
gboolean polling;
gboolean state_dirty;
gboolean clock_dirty;
GstClock *provided_clock;
GstElement *clock_provider;
/*< private >*/
GstBinPrivate *priv;
gpointer _gst_reserved[GST_PADDING - 1];
};
/**
* GstBinClass:
* @parent_class: bin parent class
* @add_element: method to add an element to a bin
* @remove_element: method to remove an element from a bin
* @handle_message: method to handle a message from the children
*
* Subclasses can override the @add_element and @remove_element to
* update the list of children in the bin.
*
* The @handle_message method can be overridden to implement custom
* message handling. @handle_message takes ownership of the message, just like
* #gst_element_post_message.
*/
struct _GstBinClass {
GstElementClass parent_class;
/*< private >*/
GThreadPool *pool;
/* signals */
void (*element_added) (GstBin *bin, GstElement *child);
void (*element_removed) (GstBin *bin, GstElement *child);
/*< public >*/
/* virtual methods for subclasses */
gboolean (*add_element) (GstBin *bin, GstElement *element);
gboolean (*remove_element) (GstBin *bin, GstElement *element);
void (*handle_message) (GstBin *bin, GstMessage *message);
/*< private >*/
/* signal added 0.10.22 */
gboolean (*do_latency) (GstBin *bin);
/*< private >*/
gpointer _gst_reserved[GST_PADDING-1];
};
GObjectGstObjectGstElementGstBin
成員函數
gobject_class->dispose = gst_element_dispose;
gobject_class->finalize = gst_element_finalize; gobject_class->set_property = gst_bin_set_property;
gobject_class->get_property = gst_bin_get_property;
Property-
enum
{
PROP_0,
PROP_ASYNC_HANDLING,
PROP_MESSAGE_FORWARD,
PROP_LAST
};
Signals
enum
{
PAD_ADDED,
PAD_REMOVED,
NO_MORE_PADS,
/* add more above */
LAST_SIGNAL
};
enum
{
ELEMENT_ADDED,
ELEMENT_REMOVED,
DO_LATENCY,
LAST_SIGNAL
};
User register signal handler
何時(shí)emit signal?
gst_element_add_pad ()
gst_element_remove_pad()
gst_element_no_more_pads()
klass->add_element = GST_DEBUG_FUNCPTR (gst_bin_add_func);
klass->remove_element = GST_DEBUG_FUNCPTR (gst_bin_remove_func);
klass->handle_message = GST_DEBUG_FUNCPTR (gst_bin_handle_message_func);
Quark data
_gst_elementclass_factory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct _GstPipeline {
GstBin bin;
/*< public >*/ /* with LOCK */
GstClock *fixed_clock;
GstClockTime stream_time;
GstClockTime delay;
/*< private >*/
GstPipelinePrivate *priv;
gpointer _gst_reserved[GST_PADDING-1];
};
struct _GstPipelineClass {
GstBinClass parent_class;
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
GObjectGstObjectGstElementGstBinGstPipeline
成員函數
gobject_class->set_property = gst_bin_set_property;
gobject_class->get_property = gst_bin_get_property; override老祖宗:
gobject_class->set_property = gst_pipeline_set_property;
gobject_class->get_property = gst_pipeline_get_property;
gobject_class->dispose = gst_pipeline_dispose;
override父類(lèi):
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_pipeline_change_state);
gstelement_class->provide_clock =
GST_DEBUG_FUNCPTR (gst_pipeline_provide_clock_func);
gstbin_class->handle_message =
GST_DEBUG_FUNCPTR (gst_pipeline_handle_message);
Property-
enum
{
PROP_0,
PROP_ASYNC_HANDLING,
PROP_MESSAGE_FORWARD,
PROP_LAST
};enum
{
PROP_0,
PROP_DELAY,
PROP_AUTO_FLUSH_BUS
};
Signals
enum
{
ELEMENT_ADDED,
ELEMENT_REMOVED,
DO_LATENCY,
LAST_SIGNAL
};
User register signal handler
何時(shí)emit signal?
klass->add_element = GST_DEBUG_FUNCPTR (gst_bin_add_func);
klass->remove_element = GST_DEBUG_FUNCPTR (gst_bin_remove_func);
klass->handle_message = GST_DEBUG_FUNCPTR (gst_bin_handle_message_func);
Quark data