docs: Document signals and properties only for current type

This commit is contained in:
Thibault Saunier 2020-06-22 09:11:07 -04:00
parent c1c035bd65
commit 1152fb33a4
2 changed files with 69 additions and 139 deletions

View file

@ -14,24 +14,6 @@ static GRegex *cleanup_caps_field = NULL;
static void _add_object_details (GString * json, GString * other_types, static void _add_object_details (GString * json, GString * other_types,
GHashTable * seen_other_types, GObject * object); GHashTable * seen_other_types, GObject * object);
static gboolean
has_sometimes_template (GObject * object)
{
GstElementClass *klass;
GList *l;
if (!GST_IS_ELEMENT (object))
return FALSE;
klass = GST_ELEMENT_GET_CLASS (object);
for (l = klass->padtemplates; l != NULL; l = l->next) {
if (GST_PAD_TEMPLATE (l->data)->presence == GST_PAD_SOMETIMES)
return TRUE;
}
return FALSE;
}
static gchar * static gchar *
json_strescape (const gchar * str) json_strescape (const gchar * str)
{ {
@ -250,144 +232,91 @@ _add_signals (GString * json, GString * other_types,
GHashTable * seen_other_types, GObject * object) GHashTable * seen_other_types, GObject * object)
{ {
gboolean opened = FALSE; gboolean opened = FALSE;
guint *signals; guint *signals = NULL;
guint nsignals; guint nsignals;
gint i = 0, j, k; gint i = 0, j;
GSignalQuery *query = NULL;
GType type;
GstPluginAPIFlags api_flags; GstPluginAPIFlags api_flags;
GSList *found_signals, *l;
for (k = 0; k < 2; k++) { signals = g_signal_list_ids (G_OBJECT_TYPE (object), &nsignals);
found_signals = NULL; for (i = 0; i < nsignals; i++) {
GSignalQuery query = { 0, };
/* For elements that have sometimes pads, also list a few useful GstElement g_signal_query (signals[i], &query);
* signals. Put these first, so element-specific ones come later. */ g_string_append_printf (json,
if (k == 0 && has_sometimes_template (object)) { "%s\"%s\" : {", opened ? "," : ",\"signals\": {", query.signal_name);
query = g_new0 (GSignalQuery, 1);
g_signal_query (g_signal_lookup ("pad-added", GST_TYPE_ELEMENT), query);
found_signals = g_slist_append (found_signals, query);
query = g_new0 (GSignalQuery, 1);
g_signal_query (g_signal_lookup ("pad-removed", GST_TYPE_ELEMENT), query);
found_signals = g_slist_append (found_signals, query);
query = g_new0 (GSignalQuery, 1);
g_signal_query (g_signal_lookup ("no-more-pads", GST_TYPE_ELEMENT),
query);
found_signals = g_slist_append (found_signals, query);
}
for (type = G_OBJECT_TYPE (object); type; type = g_type_parent (type)) { opened = TRUE;
if (type == GST_TYPE_ELEMENT || type == GST_TYPE_OBJECT
|| type == G_TYPE_OBJECT)
break;
if (type == GST_TYPE_PAD) g_string_append (json, "\"args\": [");
break; for (j = 0; j < query.n_params; j++) {
gchar *arg_name = g_strdup_printf ("arg%u", j);
if (type == GST_TYPE_BIN && G_OBJECT_TYPE (object) != GST_TYPE_BIN) if (j) {
continue; g_string_append_c (json, ',');
if (type == GST_TYPE_PIPELINE
&& G_OBJECT_TYPE (object) != GST_TYPE_PIPELINE)
continue;
signals = g_signal_list_ids (type, &nsignals);
for (i = 0; i < nsignals; i++) {
query = g_new0 (GSignalQuery, 1);
g_signal_query (signals[i], query);
if ((k == 0 && !(query->signal_flags & G_SIGNAL_ACTION)) ||
(k == 1 && (query->signal_flags & G_SIGNAL_ACTION)))
found_signals = g_slist_append (found_signals, query);
else
g_free (query);
} }
g_free (signals);
signals = NULL;
}
if (!found_signals) g_string_append_printf (json, "{ \"name\": \"%s\","
continue; "\"type\": \"%s\" }", arg_name, g_type_name (query.param_types[j]));
for (l = found_signals; l; l = l->next) {
query = (GSignalQuery *) l->data;
g_string_append_printf (json,
"%s\"%s\" : {", opened ? "," : ",\"signals\": {", query->signal_name);
opened = TRUE;
g_string_append (json, "\"args\": [");
for (j = 0; j < query->n_params; j++) {
gchar *arg_name = g_strdup_printf ("arg%u", j);
if (j) {
g_string_append_c (json, ',');
}
g_string_append_printf (json, "{ \"name\": \"%s\","
"\"type\": \"%s\" }", arg_name,
g_type_name (query->param_types[j]));
if (!g_hash_table_contains (seen_other_types,
g_type_name (query->param_types[j]))
&& gst_type_is_plugin_api (query->param_types[j], &api_flags)) {
g_hash_table_insert (seen_other_types,
(gpointer) g_type_name (query->param_types[j]), NULL);
if (g_type_is_a (query->param_types[j], G_TYPE_ENUM)) {
_serialize_enum (other_types, query->param_types[j], api_flags);
} else if (g_type_is_a (query->param_types[j], G_TYPE_FLAGS)) {
_serialize_flags (other_types, query->param_types[j]);
} else if (g_type_is_a (query->param_types[j], G_TYPE_OBJECT)) {
_serialize_object (other_types, seen_other_types,
query->param_types[j]);
}
}
}
g_string_append_c (json, ']');
if (!g_hash_table_contains (seen_other_types, if (!g_hash_table_contains (seen_other_types,
g_type_name (query->return_type)) g_type_name (query.param_types[j])) &&
&& gst_type_is_plugin_api (query->return_type, &api_flags)) { gst_type_is_plugin_api (query.param_types[j], &api_flags)) {
g_hash_table_insert (seen_other_types, g_hash_table_insert (seen_other_types,
(gpointer) g_type_name (query->return_type), NULL); (gpointer) g_type_name (query.param_types[j]), NULL);
if (g_type_is_a (query->return_type, G_TYPE_ENUM)) {
_serialize_enum (other_types, query->return_type, api_flags); if (g_type_is_a (query.param_types[j], G_TYPE_ENUM)) {
} else if (g_type_is_a (query->return_type, G_TYPE_FLAGS)) { _serialize_enum (other_types, query.param_types[j], api_flags);
_serialize_flags (other_types, query->return_type); } else if (g_type_is_a (query.param_types[j], G_TYPE_FLAGS)) {
} else if (g_type_is_a (query->return_type, G_TYPE_OBJECT)) { _serialize_flags (other_types, query.param_types[j]);
_serialize_object (other_types, seen_other_types, query->return_type); } else if (g_type_is_a (query.param_types[j], G_TYPE_OBJECT)) {
_serialize_object (other_types, seen_other_types,
query.param_types[j]);
} }
} }
}
g_string_append_c (json, ']');
g_string_append_printf (json, if (g_type_name (query.return_type) &&
",\"return-type\": \"%s\"", g_type_name (query->return_type)); !g_hash_table_contains (seen_other_types,
g_type_name (query.return_type)) &&
if (query->signal_flags & G_SIGNAL_RUN_FIRST) gst_type_is_plugin_api (query.return_type, &api_flags)) {
g_string_append (json, ",\"when\": \"first\""); g_hash_table_insert (seen_other_types,
else if (query->signal_flags & G_SIGNAL_RUN_LAST) (gpointer) g_type_name (query.return_type), NULL);
g_string_append (json, ",\"when\": \"last\""); if (g_type_is_a (query.return_type, G_TYPE_ENUM)) {
else if (query->signal_flags & G_SIGNAL_RUN_CLEANUP) _serialize_enum (other_types, query.return_type, api_flags);
g_string_append (json, ",\"when\": \"cleanup\""); } else if (g_type_is_a (query.return_type, G_TYPE_FLAGS)) {
_serialize_flags (other_types, query.return_type);
if (query->signal_flags & G_SIGNAL_NO_RECURSE) } else if (g_type_is_a (query.return_type, G_TYPE_OBJECT)) {
g_string_append (json, ",\"no-recurse\": true"); _serialize_object (other_types, seen_other_types, query.return_type);
}
if (query->signal_flags & G_SIGNAL_DETAILED)
g_string_append (json, ",\"detailed\": true");
if (query->signal_flags & G_SIGNAL_ACTION)
g_string_append (json, ",\"action\": true");
if (query->signal_flags & G_SIGNAL_NO_HOOKS)
g_string_append (json, ",\"no-hooks\": true");
g_string_append_c (json, '}');
} }
g_slist_foreach (found_signals, (GFunc) g_free, NULL); g_string_append_printf (json,
g_slist_free (found_signals); ",\"return-type\": \"%s\"", g_type_name (query.return_type));
if (query.signal_flags & G_SIGNAL_RUN_FIRST)
g_string_append (json, ",\"when\": \"first\"");
else if (query.signal_flags & G_SIGNAL_RUN_LAST)
g_string_append (json, ",\"when\": \"last\"");
else if (query.signal_flags & G_SIGNAL_RUN_CLEANUP)
g_string_append (json, ",\"when\": \"cleanup\"");
if (query.signal_flags & G_SIGNAL_NO_RECURSE)
g_string_append (json, ",\"no-recurse\": true");
if (query.signal_flags & G_SIGNAL_DETAILED)
g_string_append (json, ",\"detailed\": true");
if (query.signal_flags & G_SIGNAL_ACTION)
g_string_append (json, ",\"action\": true");
if (query.signal_flags & G_SIGNAL_NO_HOOKS)
g_string_append (json, ",\"no-hooks\": true");
g_string_append_c (json, '}');
opened = TRUE; opened = TRUE;
} }
g_free (signals);
if (opened) if (opened)
g_string_append (json, "}"); g_string_append (json, "}");
@ -410,7 +339,7 @@ _add_properties (GString * json, GString * other_types,
const gchar *mutable_str = NULL; const gchar *mutable_str = NULL;
spec = specs[i]; spec = specs[i];
if (spec->owner_type == GST_TYPE_PAD || spec->owner_type == GST_TYPE_OBJECT) if (spec->owner_type != G_OBJECT_TYPE (object))
continue; continue;
g_value_init (&value, spec->value_type); g_value_init (&value, spec->value_type);

View file

@ -32,6 +32,7 @@ plugins_doc_dep = custom_target('build-doc-cache',
input: plugins, input: plugins,
output: 'gst_plugins_cache.json', output: 'gst_plugins_cache.json',
depends: [hotdoc_plugin_scanner], depends: [hotdoc_plugin_scanner],
build_always_stale: true,
) )
hotdoc_p = find_program('hotdoc', required: get_option('doc')) hotdoc_p = find_program('hotdoc', required: get_option('doc'))