mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-31 03:29:50 +00:00
omx: Add initial version of configuration system
This now only registers elements that are specified in the configuration file. The configuration file is a keyfile in the first XDG configuration directory with the name gstomx.conf.
This commit is contained in:
parent
6bd84629ed
commit
940febae88
3 changed files with 167 additions and 7 deletions
154
omx/gstomx.c
154
omx/gstomx.c
|
@ -1432,21 +1432,161 @@ done:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GQuark gst_omx_element_name_quark = 0;
|
||||||
|
|
||||||
|
static GType (*types[]) (void) = {
|
||||||
|
gst_omx_mpeg4_video_dec_get_type, gst_omx_h264_dec_get_type};
|
||||||
|
|
||||||
|
static GKeyFile *config = NULL;
|
||||||
|
GKeyFile *
|
||||||
|
gst_omx_get_configuration (void)
|
||||||
|
{
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
plugin_init (GstPlugin * plugin)
|
plugin_init (GstPlugin * plugin)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
|
GError *err = NULL;
|
||||||
|
gchar **config_dirs;
|
||||||
|
gchar **elements;
|
||||||
|
const gchar *user_config_dir;
|
||||||
|
const gchar *const *system_config_dirs;
|
||||||
|
gint i, j;
|
||||||
|
gsize n_elements;
|
||||||
|
static const gchar *config_name[] = { "gstomx.conf", NULL };
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_INIT (gstomx_debug, "omx", 0, "gst-omx");
|
GST_DEBUG_CATEGORY_INIT (gstomx_debug, "omx", 0, "gst-omx");
|
||||||
|
|
||||||
/* TODO: Use configuration file */
|
gst_omx_element_name_quark =
|
||||||
ret |=
|
g_quark_from_static_string ("gst-omx-element-name");
|
||||||
gst_element_register (plugin, "omxmpeg4videodec", GST_RANK_PRIMARY,
|
|
||||||
GST_TYPE_OMX_MPEG4_VIDEO_DEC);
|
|
||||||
|
|
||||||
ret |=
|
/* Read configuration file gstomx.conf from the preferred
|
||||||
gst_element_register (plugin, "omxh264dec", GST_RANK_PRIMARY,
|
* configuration directories */
|
||||||
GST_TYPE_OMX_H264_DEC);
|
user_config_dir = g_get_user_config_dir ();
|
||||||
|
system_config_dirs = g_get_system_config_dirs ();
|
||||||
|
config_dirs =
|
||||||
|
g_new (gchar *, g_strv_length ((gchar **) system_config_dirs) + 2);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
j = 0;
|
||||||
|
config_dirs[i++] = (gchar *) user_config_dir;
|
||||||
|
while (system_config_dirs[j])
|
||||||
|
config_dirs[i++] = (gchar *) system_config_dirs[j++];
|
||||||
|
config_dirs[i++] = NULL;
|
||||||
|
|
||||||
|
gst_plugin_add_dependency (plugin, NULL, (const gchar **) config_dirs,
|
||||||
|
config_name, GST_PLUGIN_DEPENDENCY_FLAG_NONE);
|
||||||
|
|
||||||
|
config = g_key_file_new ();
|
||||||
|
if (!g_key_file_load_from_dirs (config, "gstomx.conf",
|
||||||
|
(const gchar **) config_dirs, NULL, G_KEY_FILE_NONE, &err)) {
|
||||||
|
GST_ERROR ("Failed to load configuration file: %s", err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize all types */
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (types); i++)
|
||||||
|
types[i] ();
|
||||||
|
|
||||||
|
elements = g_key_file_get_groups (config, &n_elements);
|
||||||
|
for (i = 0; i < n_elements; i++) {
|
||||||
|
GTypeQuery type_query;
|
||||||
|
GTypeInfo type_info = { 0, };
|
||||||
|
GType type, subtype;
|
||||||
|
gchar *type_name, *core_name, *component_name;
|
||||||
|
gint rank;
|
||||||
|
|
||||||
|
GST_DEBUG ("Registering element '%s'", elements[i]);
|
||||||
|
|
||||||
|
err = NULL;
|
||||||
|
if (!(type_name =
|
||||||
|
g_key_file_get_string (config, elements[i], "type-name", &err))) {
|
||||||
|
GST_ERROR
|
||||||
|
("Unable to read 'type-name' configuration for element '%s': %s",
|
||||||
|
elements[i], err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = g_type_from_name (type_name);
|
||||||
|
if (type == G_TYPE_INVALID) {
|
||||||
|
GST_ERROR ("Invalid type name '%s' for element '%s'", type_name,
|
||||||
|
elements[i]);
|
||||||
|
g_free (type_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!g_type_is_a (type, GST_TYPE_ELEMENT)) {
|
||||||
|
GST_ERROR ("Type '%s' is no GstElement subtype for element '%s'",
|
||||||
|
type_name, elements[i]);
|
||||||
|
g_free (type_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
g_free (type_name);
|
||||||
|
|
||||||
|
/* And now some sanity checking */
|
||||||
|
err = NULL;
|
||||||
|
if (!(core_name =
|
||||||
|
g_key_file_get_string (config, elements[i], "core-name", &err))) {
|
||||||
|
GST_ERROR
|
||||||
|
("Unable to read 'core-name' configuration for element '%s': %s",
|
||||||
|
elements[i], err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!g_file_test (core_name, G_FILE_TEST_IS_REGULAR)) {
|
||||||
|
GST_ERROR ("Core '%s' does not exist for element '%s'", core_name,
|
||||||
|
elements[i]);
|
||||||
|
g_free (core_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
g_free (core_name);
|
||||||
|
|
||||||
|
err = NULL;
|
||||||
|
if (!(component_name =
|
||||||
|
g_key_file_get_string (config, elements[i], "component-name",
|
||||||
|
&err))) {
|
||||||
|
GST_ERROR
|
||||||
|
("Unable to read 'component-name' configuration for element '%s': %s",
|
||||||
|
elements[i], err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
g_free (component_name);
|
||||||
|
|
||||||
|
err = NULL;
|
||||||
|
rank = g_key_file_get_integer (config, elements[i], "rank", &err);
|
||||||
|
if (err != NULL) {
|
||||||
|
GST_ERROR ("No rank set for element '%s': %s", elements[i], err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And now register the type, all other configuration will
|
||||||
|
* be handled by the type itself */
|
||||||
|
g_type_query (type, &type_query);
|
||||||
|
memset (&type_info, 0, sizeof (type_info));
|
||||||
|
type_info.class_size = type_query.class_size;
|
||||||
|
type_info.instance_size = type_query.instance_size;
|
||||||
|
type_name = g_strdup_printf ("%s-%s", g_type_name (type), elements[i]);
|
||||||
|
if (g_type_from_name (type_name) != G_TYPE_INVALID) {
|
||||||
|
GST_ERROR ("Type '%s' already exists for element '%s'", type_name,
|
||||||
|
elements[i]);
|
||||||
|
g_free (type_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
subtype = g_type_register_static (type, type_name, &type_info, 0);
|
||||||
|
g_free (type_name);
|
||||||
|
g_type_set_qdata (subtype, gst_omx_element_name_quark,
|
||||||
|
g_strdup (elements[i]));
|
||||||
|
ret |= gst_element_register (plugin, elements[i], rank, subtype);
|
||||||
|
}
|
||||||
|
g_strfreev (elements);
|
||||||
|
|
||||||
|
done:
|
||||||
|
g_free (config_dirs);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
16
omx/gstomx.conf
Normal file
16
omx/gstomx.conf
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[omxmpeg4videodec]
|
||||||
|
type-name=GstOMXMPEG4VideoDec
|
||||||
|
core-name=/usr/local/lib/libomxil-bellagio.so.0
|
||||||
|
component-name=OMX.st.video_decoder.mpeg4
|
||||||
|
rank=256
|
||||||
|
in-port-index=0
|
||||||
|
out-port-index=1
|
||||||
|
|
||||||
|
[omxh264dec]
|
||||||
|
type-name=GstOMXH264Dec
|
||||||
|
core-name=/usr/local/lib/libomxil-bellagio.so.0
|
||||||
|
component-name=OMX.st.video_decoder.avc
|
||||||
|
rank=256
|
||||||
|
in-port-index=0
|
||||||
|
out-port-index=1
|
||||||
|
|
|
@ -145,6 +145,10 @@ struct _GstOMXBuffer {
|
||||||
gint settings_cookie;
|
gint settings_cookie;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern GQuark gst_omx_element_name_quark;
|
||||||
|
|
||||||
|
GKeyFile * gst_omx_get_configuration (void);
|
||||||
|
|
||||||
GstOMXCore * gst_omx_core_acquire (const gchar * filename);
|
GstOMXCore * gst_omx_core_acquire (const gchar * filename);
|
||||||
void gst_omx_core_release (GstOMXCore * core);
|
void gst_omx_core_release (GstOMXCore * core);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue