static void print_clocking_info (GstElement * element) { if (!gst_element_requires_clock (element) && !(gst_element_provides_clock (element) && gst_element_get_clock (element))) { n_print ("\n"); n_print ("Element has no clocking capabilities."); return; } n_print ("\n"); n_print ("Clocking Interaction:\n"); if (gst_element_requires_clock (element)) { n_print (" element requires a clock\n"); } if (gst_element_provides_clock (element)) { GstClock *clock; clock = gst_element_get_clock (element); if (clock) n_print (" element provides a clock: %s\n", GST_OBJECT_NAME (clock)); else n_print (" element is supposed to provide a clock but returned NULL\n"); } }
static gint print_element_info (GstElementFactory * factory) { GstElement *element; #ifndef GST_DISABLE_LOADSAVE GstObjectClass *gstobject_class; #endif GstElementClass *gstelement_class; GList *pads; GstPad *pad; GstStaticPadTemplate *padtemplate; gint maxlevel = 0; element = gst_element_factory_create (factory, "element"); if (!element) { g_print ("couldn't construct element for some reason\n"); return -1; } PUT_START_TAG (0, "element"); PUT_ESCAPED (1, "name", GST_PLUGIN_FEATURE_NAME (factory)); #ifndef GST_DISABLE_LOADSAVE gstobject_class = GST_OBJECT_CLASS (G_OBJECT_GET_CLASS (element)); #endif gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); PUT_START_TAG (1, "details"); PUT_ESCAPED (2, "long-name", factory->details.longname); PUT_ESCAPED (2, "class", factory->details.klass); PUT_ESCAPED (2, "description", factory->details.description); PUT_ESCAPED (2, "authors", factory->details.author); PUT_END_TAG (1, "details"); output_hierarchy (G_OBJECT_TYPE (element), 0, &maxlevel); PUT_START_TAG (1, "pad-templates"); if (factory->numpadtemplates) { pads = factory->staticpadtemplates; while (pads) { padtemplate = (GstStaticPadTemplate *) (pads->data); pads = g_list_next (pads); PUT_START_TAG (2, "pad-template"); PUT_ESCAPED (3, "name", padtemplate->name_template); if (padtemplate->direction == GST_PAD_SRC) PUT_ESCAPED (3, "direction", "src"); else if (padtemplate->direction == GST_PAD_SINK) PUT_ESCAPED (3, "direction", "sink"); else PUT_ESCAPED (3, "direction", "unknown"); if (padtemplate->presence == GST_PAD_ALWAYS) PUT_ESCAPED (3, "presence", "always"); else if (padtemplate->presence == GST_PAD_SOMETIMES) PUT_ESCAPED (3, "presence", "sometimes"); else if (padtemplate->presence == GST_PAD_REQUEST) { PUT_ESCAPED (3, "presence", "request"); PUT_ESCAPED (3, "request-function", GST_DEBUG_FUNCPTR_NAME (gstelement_class->request_new_pad)); } else PUT_ESCAPED (3, "presence", "unknown"); if (padtemplate->static_caps.string) { print_caps (gst_static_caps_get (&padtemplate->static_caps), 3); } PUT_END_TAG (2, "pad-template"); } } PUT_END_TAG (1, "pad-templates"); PUT_START_TAG (1, "element-flags"); PUT_END_TAG (1, "element-flags"); if (GST_IS_BIN (element)) { PUT_START_TAG (1, "bin-flags"); PUT_END_TAG (1, "bin-flags"); } PUT_START_TAG (1, "element-implementation"); PUT_STRING (2, "<state-change function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (gstelement_class->change_state)); #ifndef GST_DISABLE_LOADSAVE PUT_STRING (2, "<save function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (gstobject_class->save_thyself)); PUT_STRING (2, "<load function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (gstobject_class->restore_thyself)); #endif PUT_END_TAG (1, "element-implementation"); PUT_START_TAG (1, "clocking-interaction"); if (gst_element_requires_clock (element)) { PUT_STRING (2, "<requires-clock/>"); } if (gst_element_provides_clock (element)) { GstClock *clock; clock = gst_element_get_clock (element); if (clock) PUT_STRING (2, "<provides-clock name=\"%s\"/>", GST_OBJECT_NAME (clock)); } PUT_END_TAG (1, "clocking-interaction"); if (gst_element_is_indexable (element)) { PUT_STRING (1, "<indexing-capabilities/>"); } PUT_START_TAG (1, "pads"); if (element->numpads) { const GList *pads; pads = element->pads; while (pads) { pad = GST_PAD (pads->data); pads = g_list_next (pads); PUT_START_TAG (2, "pad"); PUT_ESCAPED (3, "name", gst_pad_get_name (pad)); if (gst_pad_get_direction (pad) == GST_PAD_SRC) PUT_ESCAPED (3, "direction", "src"); else if (gst_pad_get_direction (pad) == GST_PAD_SINK) PUT_ESCAPED (3, "direction", "sink"); else PUT_ESCAPED (3, "direction", "unknown"); if (pad->padtemplate) PUT_ESCAPED (3, "template", pad->padtemplate->name_template); PUT_START_TAG (3, "implementation"); if (pad->chainfunc) PUT_STRING (4, "<chain-based function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (pad->chainfunc)); if (pad->getrangefunc) PUT_STRING (4, "<get-range-based function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (pad->getrangefunc)); if (pad->eventfunc != gst_pad_event_default) PUT_STRING (4, "<event-function function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (pad->eventfunc)); if (pad->queryfunc != gst_pad_query_default) PUT_STRING (4, "<query-function function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (pad->queryfunc)); if (pad->querytypefunc != gst_pad_get_query_types_default) { PUT_STRING (4, "<query-type-func function=\"%s\">", GST_DEBUG_FUNCPTR_NAME (pad->querytypefunc)); print_query_types (gst_pad_get_query_types (pad), 5); PUT_END_TAG (4, "query-type-func"); } if (pad->iterintlinkfunc != gst_pad_iterate_internal_links_default) PUT_STRING (4, "<iterintlink-function function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (pad->iterintlinkfunc)); if (pad->bufferallocfunc) PUT_STRING (4, "<bufferalloc-function function=\"%s\"/>", GST_DEBUG_FUNCPTR_NAME (pad->bufferallocfunc)); PUT_END_TAG (3, "implementation"); if (pad->caps) { print_caps (pad->caps, 3); } PUT_END_TAG (2, "pad"); } } PUT_END_TAG (1, "pads"); print_element_properties (element, 1); print_element_signals (element, 1); /* for compound elements */ /* FIXME: gst_bin_get_list does not exist anymore if (GST_IS_BIN (element)) { GList *children; GstElement *child; PUT_START_TAG (1, "children"); children = (GList *) gst_bin_get_list (GST_BIN (element)); while (children) { child = GST_ELEMENT (children->data); children = g_list_next (children); PUT_ESCAPED (2, "child", GST_ELEMENT_NAME (child)); } PUT_END_TAG (1, "children"); } */ PUT_END_TAG (0, "element"); return 0; }
/* Method: requires_clock? * Returns: true if the element requires a clock, false otherwise. */ static VALUE rg_requires_clock_p(VALUE self) { return CBOOL2RVAL(gst_element_requires_clock(SELF(self))); }