[Gstreamer-openmax] [PATCH 2/2] add gst-openmax registry (config file)
Rob Clark
rob at ti.com
Fri Feb 26 13:44:18 PST 2010
Configurable mapping between gst-openmax elements and OMX library-name and component-name via config file. The config file may even create multiple different elements with unique names
using the same gst-openmax class but different OMX library-name and/or component-name. For example:
----
omx_mp3dec_ti,
type=GstOmxMp3Dec,
library-name=libOMX_Core.so.0,
component-name=OMX.TI.AUDIO.DECODE,
component-role=audio_decode.dsp.mp3,
rank=256;
omx_mp3dec_nokia,
type=GstOmxMp3Dec,
library-name=libomxil_bellagio.so.0,
component-name=OMX.nokia.audio_decode.mp3,
rank=128;
----
by default, the config file is stored in $HOME/.config/gst-openmax.conf, although if none is found a default config will be created.
---
omx/Makefile.am | 3 +-
omx/gstomx.c | 351 ++++++++++++++++++++++++++++++++++++++--------
omx/gstomx.h | 6 +
omx/gstomx_base_filter.c | 31 +----
omx/gstomx_base_filter.h | 2 -
omx/gstomx_base_sink.c | 31 +----
omx/gstomx_base_sink.h | 3 -
omx/gstomx_base_src.c | 38 +-----
omx/gstomx_base_src.h | 2 -
omx/gstomx_conf.c | 217 ++++++++++++++++++++++++++++
omx/gstomx_util.c | 9 +-
omx/gstomx_util.h | 2 +-
12 files changed, 537 insertions(+), 158 deletions(-)
create mode 100644 omx/gstomx_conf.c
diff --git a/omx/Makefile.am b/omx/Makefile.am
index 4a3fbf9..6ea9cf5 100644
--- a/omx/Makefile.am
+++ b/omx/Makefile.am
@@ -18,7 +18,8 @@ libgstomx_la_SOURCES = gstomx.c gstomx.h \
gstomx_vorbisdec.c gstomx_vorbisdec.h \
gstomx_mp3dec.c gstomx_mp3dec.h \
gstomx_base_sink.c gstomx_base_sink.h \
- gstomx_audiosink.c gstomx_audiosink.h
+ gstomx_audiosink.c gstomx_audiosink.h \
+ gstomx_conf.c
if EXPERIMENTAL
libgstomx_la_SOURCES += gstomx_amrnbdec.c gstomx_amrnbdec.h \
diff --git a/omx/gstomx.c b/omx/gstomx.c
index 6756f54..f882f64 100644
--- a/omx/gstomx.c
+++ b/omx/gstomx.c
@@ -21,6 +21,10 @@
#include "config.h"
+#include <string.h>
+
+#include <gst/gststructure.h>
+
#include "gstomx.h"
#include "gstomx_dummy.h"
#include "gstomx_mpeg4dec.h"
@@ -59,90 +63,315 @@
GST_DEBUG_CATEGORY (gstomx_debug);
-typedef struct TableItem
-{
- const gchar *name;
- const gchar *library_name;
- const gchar *component_name;
- guint rank;
- GType (*get_type) (void);
-} TableItem;
-
-static TableItem element_table[] =
-{
- { "omx_dummy", "libomxil-bellagio.so.0", "OMX.st.dummy", GST_RANK_NONE, gst_omx_dummy_get_type },
- { "omx_mpeg4dec", "libomxil-bellagio.so.0", "OMX.st.video_decoder.mpeg4", GST_RANK_PRIMARY, gst_omx_mpeg4dec_get_type },
- { "omx_h264dec", "libomxil-bellagio.so.0", "OMX.st.video_decoder.avc", GST_RANK_PRIMARY, gst_omx_h264dec_get_type },
- { "omx_h263dec", "libomxil-bellagio.so.0", "OMX.st.video_decoder.h263", GST_RANK_PRIMARY, gst_omx_h263dec_get_type },
- { "omx_wmvdec", "libomxil-bellagio.so.0", "OMX.st.video_decoder.wmv", GST_RANK_PRIMARY, gst_omx_wmvdec_get_type },
- { "omx_mpeg4enc", "libomxil-bellagio.so.0", "OMX.st.video_encoder.mpeg4", GST_RANK_PRIMARY, gst_omx_mpeg4enc_get_type },
- { "omx_h264enc", "libomxil-bellagio.so.0", "OMX.st.video_encoder.avc", GST_RANK_PRIMARY, gst_omx_h264enc_get_type },
- { "omx_h263enc", "libomxil-bellagio.so.0", "OMX.st.video_encoder.h263", GST_RANK_PRIMARY, gst_omx_h263enc_get_type },
- { "omx_vorbisdec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.ogg.single", GST_RANK_SECONDARY, gst_omx_vorbisdec_get_type },
- { "omx_mp3dec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.mp3.mad", GST_RANK_PRIMARY, gst_omx_mp3dec_get_type },
+static GstStructure *element_table = NULL;
+
+extern const gchar *default_config;
+
+static GType (*get_type[]) (void) = {
+ gst_omx_dummy_get_type,
+ gst_omx_mpeg4dec_get_type,
+ gst_omx_h264dec_get_type,
+ gst_omx_h263dec_get_type,
+ gst_omx_wmvdec_get_type,
+ gst_omx_mpeg4enc_get_type,
+ gst_omx_h264enc_get_type,
+ gst_omx_h263enc_get_type,
+ gst_omx_vorbisdec_get_type,
+ gst_omx_mp3dec_get_type,
#ifdef EXPERIMENTAL
- { "omx_mp2dec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.mp3.mad", GST_RANK_PRIMARY, gst_omx_mp2dec_get_type },
- { "omx_amrnbdec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.amrnb", GST_RANK_PRIMARY, gst_omx_amrnbdec_get_type },
- { "omx_amrnbenc", "libomxil-bellagio.so.0", "OMX.st.audio_encoder.amrnb", GST_RANK_PRIMARY, gst_omx_amrnbenc_get_type },
- { "omx_amrwbdec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.amrwb", GST_RANK_PRIMARY, gst_omx_amrwbdec_get_type },
- { "omx_amrwbenc", "libomxil-bellagio.so.0", "OMX.st.audio_encoder.amrwb", GST_RANK_PRIMARY, gst_omx_amrwbenc_get_type },
- { "omx_aacdec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.aac", GST_RANK_PRIMARY, gst_omx_aacdec_get_type },
- { "omx_aacenc", "libomxil-bellagio.so.0", "OMX.st.audio_encoder.aac", GST_RANK_PRIMARY, gst_omx_aacenc_get_type },
- { "omx_adpcmdec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.adpcm", GST_RANK_PRIMARY, gst_omx_adpcmdec_get_type },
- { "omx_adpcmenc", "libomxil-bellagio.so.0", "OMX.st.audio_encoder.adpcm", GST_RANK_PRIMARY, gst_omx_adpcmenc_get_type },
- { "omx_g711dec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.g711", GST_RANK_PRIMARY, gst_omx_g711dec_get_type },
- { "omx_g711enc", "libomxil-bellagio.so.0", "OMX.st.audio_encoder.g711", GST_RANK_PRIMARY, gst_omx_g711enc_get_type },
- { "omx_g729dec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.g729", GST_RANK_PRIMARY, gst_omx_g729dec_get_type },
- { "omx_g729enc", "libomxil-bellagio.so.0", "OMX.st.audio_encoder.g729", GST_RANK_PRIMARY, gst_omx_g729enc_get_type },
- { "omx_ilbcdec", "libomxil-bellagio.so.0", "OMX.st.audio_decoder.ilbc", GST_RANK_PRIMARY, gst_omx_ilbcdec_get_type },
- { "omx_ilbcenc", "libomxil-bellagio.so.0", "OMX.st.audio_encoder.ilbc", GST_RANK_PRIMARY, gst_omx_ilbcenc_get_type },
- { "omx_jpegenc", "libomxil-bellagio.so.0", "OMX.st.image_encoder.jpeg", GST_RANK_PRIMARY, gst_omx_jpegenc_get_type },
+ gst_omx_mp2dec_get_type,
+ gst_omx_amrnbdec_get_type,
+ gst_omx_amrnbenc_get_type,
+ gst_omx_amrwbdec_get_type,
+ gst_omx_amrwbenc_get_type,
+ gst_omx_aacdec_get_type,
+ gst_omx_aacenc_get_type,
+ gst_omx_adpcmdec_get_type,
+ gst_omx_adpcmenc_get_type,
+ gst_omx_g711dec_get_type,
+ gst_omx_g711enc_get_type,
+ gst_omx_g729dec_get_type,
+ gst_omx_g729enc_get_type,
+ gst_omx_ilbcdec_get_type,
+ gst_omx_ilbcenc_get_type,
+ gst_omx_jpegenc_get_type,
#endif /* EXPERIMENTAL */
- { "omx_audiosink", "libomxil-bellagio.so.0", "OMX.st.alsa.alsasink", GST_RANK_NONE, gst_omx_audiosink_get_type },
+ gst_omx_audiosink_get_type,
#ifdef EXPERIMENTAL
- { "omx_videosink", "libomxil-bellagio.so.0", "OMX.st.videosink", GST_RANK_NONE, gst_omx_videosink_get_type },
- { "omx_filereadersrc", "libomxil-bellagio.so.0", "OMX.st.audio_filereader", GST_RANK_NONE, gst_omx_filereadersrc_get_type },
+ gst_omx_videosink_get_type,
+ gst_omx_filereadersrc_get_type,
#endif /* EXPERIMENTAL */
- { "omx_volume", "libomxil-bellagio.so.0", "OMX.st.volume.component", GST_RANK_NONE, gst_omx_volume_get_type },
- { NULL, NULL, NULL, 0, NULL },
+ gst_omx_volume_get_type,
};
+/* TODO: we can cache table w/ gst_plugin_{get,set}_cache_data..
+ */
+static GstStructure *
+get_element_table (void)
+{
+ static volatile gsize gonce_data = 0;
+ if (g_once_init_enter (&gonce_data))
+ {
+ gchar *path;
+ gchar *config, *s;
+ GstStructure *element;
+
+ path = g_strdup (g_getenv ("OMX_REGISTRY"));
+ if (!path)
+ {
+ path = g_build_filename (g_get_user_config_dir (),
+ "gst-openmax.conf", NULL);
+ }
+
+ if (!g_file_get_contents (path, &config, NULL, NULL))
+ {
+ g_warning ("could not find config file '%s'.. using defaults!", path);
+ config = (gchar *) default_config;
+
+ g_file_set_contents (path, config, -1, NULL);
+ }
+
+ GST_DEBUG ("parsing config:\n%s", config);
+
+ element_table = gst_structure_empty_new ("element_table");
+
+ s = config;
+
+ while ((element = gst_structure_from_string (s, &s)))
+ {
+ const gchar *element_name = gst_structure_get_name (element);
+ gst_structure_set (element_table,
+ element_name, GST_TYPE_STRUCTURE, element, NULL);
+ }
+
+ if (config != default_config)
+ {
+ g_free (config);
+ }
+
+ g_free (path);
+
+ GST_DEBUG ("element_table=%"GST_PTR_FORMAT, element_table);
+
+ g_once_init_leave (&gonce_data, 1);
+ }
+
+ return element_table;
+}
+
+static GstStructure *
+get_element_entry (const gchar *element_name)
+{
+ GstStructure *element_table = get_element_table ();
+ GstStructure *element;
+
+ if (! gst_structure_get (element_table,
+ element_name, GST_TYPE_STRUCTURE, &element, NULL))
+ element = NULL;
+
+ g_assert (element);
+
+ return element;
+}
+
+static const gchar *
+get_element_name (gpointer object)
+{
+ return G_OBJECT_TYPE_NAME (object);
+}
+
+/* register a new dynamic sub-class with the omx element as it's name..
+ * this gives us a way to use the same (for example) GstOmxMp3Dec
+ * element mapping to multiple different element names with different
+ * OMX library implementations and/or component names
+ */
+static GType
+create_subtype (GType type, const gchar *element_name)
+{
+ GTypeQuery q;
+ GTypeInfo i = {0};
+
+ g_type_query (type, &q);
+
+ i.class_size = q.class_size;
+ i.instance_size = q.instance_size;
+
+ return g_type_register_static (type, element_name, &i, 0);
+}
+
static gboolean
plugin_init (GstPlugin *plugin)
{
- GQuark library_name_quark;
- GQuark component_name_quark;
+ gint i, cnt;
+ GstStructure *element_table;
+
GST_DEBUG_CATEGORY_INIT (gstomx_debug, "omx", 0, "gst-openmax");
GST_DEBUG_CATEGORY_INIT (gstomx_util_debug, "omx_util", 0, "gst-openmax utility");
- library_name_quark = g_quark_from_static_string ("library-name");
- component_name_quark = g_quark_from_static_string ("component-name");
+ /* first, call all the _get_type() functions to ensure the types are
+ * registered:
+ */
+ for (i = 0; i < G_N_ELEMENTS (get_type); i++)
+ {
+ get_type[i] ();
+ }
+
+ element_table = get_element_table ();
g_omx_init ();
+ cnt = gst_structure_n_fields (element_table);
+ for (i = 0; i < cnt; i++)
{
- guint i;
- for (i = 0; element_table[i].name; i++)
+ const gchar *element_name = gst_structure_nth_field_name (element_table, i);
+ GstStructure *element = get_element_entry (element_name);
+ const gchar *type_name;
+ GType type;
+ gint rank;
+
+ GST_DEBUG ("element=%"GST_PTR_FORMAT, element);
+
+ type_name = gst_structure_get_string (element, "type");
+ if (!type_name)
{
- TableItem *element;
- GType type;
-
- element = &element_table[i];
- type = element->get_type ();
- g_type_set_qdata (type, library_name_quark, (gpointer) element->library_name);
- g_type_set_qdata (type, component_name_quark, (gpointer) element->component_name);
-
- if (!gst_element_register (plugin, element->name, element->rank, type))
- {
- g_warning ("failed registering '%s'", element->name);
- return FALSE;
- }
+ g_warning ("malformed config file: missing 'type' for %s", element_name);
+ return FALSE;
+ }
+
+ type = g_type_from_name (type_name);
+ if (!type)
+ {
+ g_warning ("malformed config file: invalid type '%s' for %s", type_name, element_name);
+ return FALSE;
+ }
+
+ type = create_subtype (type, element_name);
+
+ if (!gst_structure_get_int (element, "rank", &rank))
+ {
+ /* use default rank: */
+ rank = GST_RANK_NONE;
+ }
+
+ if (!gst_element_register (plugin, element_name, rank, type))
+ {
+ g_warning ("failed registering '%s'", element_name);
+ return FALSE;
}
}
return TRUE;
}
+/**
+ * g_omx_get_component_info:
+ * @object: the GstOmx object (ie. GstOmxBaseFilter, GstOmxBaseSrc, or
+ * GstOmxBaseSink).
+ * @library_name: library-name, returned by reference (or NULL)
+ * @component_name: component-name, returned by reference (or NULL)
+ *
+ * Get library-name and component-name for an element.
+ *
+ * note: this function will gain another parameter later when component-role
+ * is added
+ */
+gboolean
+g_omx_get_component_info (gpointer object,
+ gchar **library_name,
+ gchar **component_name)
+{
+ gboolean ret = TRUE;
+ const gchar *element_name = get_element_name (object);
+ GstStructure *element = get_element_entry (element_name);
+
+ if (!element)
+ return FALSE;
+
+ /* initialize ptrs to NULL so that in error cases we can tell what needs
+ * to be freed:
+ */
+ if (library_name) *library_name = NULL;
+ if (component_name) *component_name = NULL;
+
+ if (library_name)
+ {
+ const gchar *str = gst_structure_get_string (element, "library-name");
+ if (!str)
+ {
+ g_warning ("malformed config file: missing 'library-name' for %s", element_name);
+ ret = FALSE;
+ goto exit;
+ }
+ *library_name = g_strdup (str);
+ }
+
+ if (component_name)
+ {
+ const gchar *str = gst_structure_get_string (element, "component-name");
+ if (!str)
+ {
+ g_warning ("malformed config file: missing 'component-name' for %s", element_name);
+ ret = FALSE;
+ goto exit;
+ }
+ *component_name = g_strdup (str);
+ }
+
+exit:
+
+ /* if we failed, free any memory that might have been allocated:
+ */
+ if (!ret)
+ {
+ if (library_name) g_free (*library_name);
+ if (component_name) g_free (*component_name);
+ }
+
+
+ return ret;
+}
+
+static gboolean
+set_value_helper (GValue *value, gchar *str)
+{
+ g_value_set_string (value, str);
+ return TRUE;
+}
+
+/**
+ * g_omx_get_library_name_value:
+ * @object: the GstOmx object (ie. GstOmxBaseFilter, GstOmxBaseSrc, or
+ * GstOmxBaseSink).
+ * @val: the GValue to return the value through
+ *
+ * A helper to access the "library-name" as a GValue, mainly for
+ * get_property methods.
+ */
+gboolean
+g_omx_get_library_name_value (gpointer object, GValue *val)
+{
+ gchar *str;
+ return g_omx_get_component_info (object, &str, NULL) &&
+ set_value_helper (val, str);
+}
+
+/**
+ * g_omx_get_component_name_value:
+ * @object: the GstOmx object (ie. GstOmxBaseFilter, GstOmxBaseSrc, or
+ * GstOmxBaseSink).
+ * @val: the GValue to return the value through
+ *
+ * A helper to access the "component-name" as a GValue, mainly for
+ * get_property methods.
+ */
+gboolean
+g_omx_get_component_name_value (gpointer object, GValue *val)
+{
+ gchar *str;
+ return g_omx_get_component_info (object, NULL, &str) &&
+ set_value_helper (val, str);
+}
+
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"omx",
diff --git a/omx/gstomx.h b/omx/gstomx.h
index 7d5fa04..063437d 100644
--- a/omx/gstomx.h
+++ b/omx/gstomx.h
@@ -30,6 +30,12 @@ GST_DEBUG_CATEGORY_EXTERN (gstomx_debug);
GST_DEBUG_CATEGORY_EXTERN (gstomx_util_debug);
#define GST_CAT_DEFAULT gstomx_debug
+gboolean g_omx_get_component_info (gpointer object,
+ gchar **library_name,
+ gchar **component_name);
+gboolean g_omx_get_library_name_value (gpointer object, GValue *val);
+gboolean g_omx_get_component_name_value (gpointer object, GValue *val);
+
G_END_DECLS
#endif /* GSTOMX_H */
diff --git a/omx/gstomx_base_filter.c b/omx/gstomx_base_filter.c
index b0353cb..2a30502 100644
--- a/omx/gstomx_base_filter.c
+++ b/omx/gstomx_base_filter.c
@@ -115,7 +115,7 @@ change_state (GstElement *element,
switch (transition)
{
case GST_STATE_CHANGE_NULL_TO_READY:
- g_omx_core_init (core, self->omx_library, self->omx_component);
+ g_omx_core_init (core);
if (core->omx_state != OMX_StateLoaded)
{
ret = GST_STATE_CHANGE_FAILURE;
@@ -184,9 +184,6 @@ finalize (GObject *obj)
g_omx_core_free (self->gomx);
- g_free (self->omx_component);
- g_free (self->omx_library);
-
g_mutex_free (self->ready_lock);
G_OBJECT_CLASS (parent_class)->finalize (obj);
@@ -204,14 +201,6 @@ set_property (GObject *obj,
switch (prop_id)
{
- case ARG_COMPONENT_NAME:
- g_free (self->omx_component);
- self->omx_component = g_value_dup_string (value);
- break;
- case ARG_LIBRARY_NAME:
- g_free (self->omx_library);
- self->omx_library = g_value_dup_string (value);
- break;
case ARG_USE_TIMESTAMPS:
self->use_timestamps = g_value_get_boolean (value);
break;
@@ -234,10 +223,10 @@ get_property (GObject *obj,
switch (prop_id)
{
case ARG_COMPONENT_NAME:
- g_value_set_string (value, self->omx_component);
+ g_omx_get_component_name_value (self, value);
break;
case ARG_LIBRARY_NAME:
- g_value_set_string (value, self->omx_library);
+ g_omx_get_library_name_value (self, value);
break;
case ARG_USE_TIMESTAMPS:
g_value_set_boolean (value, self->use_timestamps);
@@ -271,12 +260,12 @@ type_class_init (gpointer g_class,
g_object_class_install_property (gobject_class, ARG_COMPONENT_NAME,
g_param_spec_string ("component-name", "Component name",
"Name of the OpenMAX IL component to use",
- NULL, G_PARAM_READWRITE));
+ NULL, G_PARAM_READABLE));
g_object_class_install_property (gobject_class, ARG_LIBRARY_NAME,
g_param_spec_string ("library-name", "Library name",
"Name of the OpenMAX IL implementation library to use",
- NULL, G_PARAM_READWRITE));
+ NULL, G_PARAM_READABLE));
g_object_class_install_property (gobject_class, ARG_USE_TIMESTAMPS,
g_param_spec_boolean ("use-timestamps", "Use timestamps",
@@ -922,16 +911,6 @@ type_instance_init (GTypeInstance *instance,
gst_element_add_pad (GST_ELEMENT (self), self->sinkpad);
gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
- {
- const char *tmp;
- tmp = g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class),
- g_quark_from_static_string ("library-name"));
- self->omx_library = g_strdup (tmp);
- tmp = g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class),
- g_quark_from_static_string ("component-name"));
- self->omx_component = g_strdup (tmp);
- }
-
GST_LOG_OBJECT (self, "end");
}
diff --git a/omx/gstomx_base_filter.h b/omx/gstomx_base_filter.h
index 4baf181..99b5d72 100644
--- a/omx/gstomx_base_filter.h
+++ b/omx/gstomx_base_filter.h
@@ -48,8 +48,6 @@ struct GstOmxBaseFilter
GOmxPort *in_port;
GOmxPort *out_port;
- char *omx_component;
- char *omx_library;
gboolean use_timestamps; /** @todo remove; timestamps should always be used */
gboolean ready;
GMutex *ready_lock;
diff --git a/omx/gstomx_base_sink.c b/omx/gstomx_base_sink.c
index c1a2076..7911167 100644
--- a/omx/gstomx_base_sink.c
+++ b/omx/gstomx_base_sink.c
@@ -141,9 +141,6 @@ finalize (GObject *obj)
g_omx_core_free (self->gomx);
- g_free (self->omx_component);
- g_free (self->omx_library);
-
G_OBJECT_CLASS (parent_class)->finalize (obj);
}
@@ -298,14 +295,6 @@ set_property (GObject *obj,
switch (prop_id)
{
- case ARG_COMPONENT_NAME:
- g_free (self->omx_component);
- self->omx_component = g_value_dup_string (value);
- break;
- case ARG_LIBRARY_NAME:
- g_free (self->omx_library);
- self->omx_library = g_value_dup_string (value);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
break;
@@ -325,10 +314,10 @@ get_property (GObject *obj,
switch (prop_id)
{
case ARG_COMPONENT_NAME:
- g_value_set_string (value, self->omx_component);
+ g_omx_get_component_name_value (self, value);
break;
case ARG_LIBRARY_NAME:
- g_value_set_string (value, self->omx_library);
+ g_omx_get_library_name_value (self, value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
@@ -366,12 +355,12 @@ type_class_init (gpointer g_class,
g_object_class_install_property (gobject_class, ARG_COMPONENT_NAME,
g_param_spec_string ("component-name", "Component name",
"Name of the OpenMAX IL component to use",
- NULL, G_PARAM_READWRITE));
+ NULL, G_PARAM_READABLE));
g_object_class_install_property (gobject_class, ARG_LIBRARY_NAME,
g_param_spec_string ("library-name", "Library name",
"Name of the OpenMAX IL implementation library to use",
- NULL, G_PARAM_READWRITE));
+ NULL, G_PARAM_READABLE));
}
}
@@ -420,7 +409,7 @@ activate_push (GstPad *pad,
static inline gboolean
omx_init (GstOmxBaseSink *self)
{
- g_omx_core_init (self->gomx, self->omx_library, self->omx_component);
+ g_omx_core_init (self->gomx);
if (self->gomx->omx_error)
return FALSE;
@@ -468,16 +457,6 @@ type_instance_init (GTypeInstance *instance,
}
{
- const char *tmp;
- tmp = g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class),
- g_quark_from_static_string ("library-name"));
- self->omx_library = g_strdup (tmp);
- tmp = g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class),
- g_quark_from_static_string ("component-name"));
- self->omx_component = g_strdup (tmp);
- }
-
- {
GstPad *sinkpad;
self->sinkpad = sinkpad = GST_BASE_SINK_PAD (self);
self->base_activatepush = GST_PAD_ACTIVATEPUSHFUNC (sinkpad);
diff --git a/omx/gstomx_base_sink.h b/omx/gstomx_base_sink.h
index 681e939..589c441 100644
--- a/omx/gstomx_base_sink.h
+++ b/omx/gstomx_base_sink.h
@@ -46,9 +46,6 @@ struct GstOmxBaseSink
GOmxCore *gomx;
GOmxPort *in_port;
- char *omx_component;
- char *omx_library;
-
gboolean ready;
GstPadActivateModeFunction base_activatepush;
gboolean initialized;
diff --git a/omx/gstomx_base_src.c b/omx/gstomx_base_src.c
index 9b02b22..dd9767e 100644
--- a/omx/gstomx_base_src.c
+++ b/omx/gstomx_base_src.c
@@ -67,7 +67,7 @@ start (GstBaseSrc *gst_base)
GST_LOG_OBJECT (self, "begin");
- g_omx_core_init (self->gomx, self->omx_library, self->omx_component);
+ g_omx_core_init (self->gomx);
if (self->gomx->omx_error)
return GST_STATE_CHANGE_FAILURE;
@@ -106,9 +106,6 @@ finalize (GObject *obj)
g_omx_core_free (self->gomx);
- g_free (self->omx_component);
- g_free (self->omx_library);
-
G_OBJECT_CLASS (parent_class)->finalize (obj);
}
@@ -362,20 +359,6 @@ set_property (GObject *obj,
switch (prop_id)
{
- case ARG_COMPONENT_NAME:
- if (self->omx_component)
- {
- g_free (self->omx_component);
- }
- self->omx_component = g_value_dup_string (value);
- break;
- case ARG_LIBRARY_NAME:
- if (self->omx_library)
- {
- g_free (self->omx_library);
- }
- self->omx_library = g_value_dup_string (value);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
break;
@@ -395,10 +378,10 @@ get_property (GObject *obj,
switch (prop_id)
{
case ARG_COMPONENT_NAME:
- g_value_set_string (value, self->omx_component);
+ g_omx_get_component_name_value (self, value);
break;
case ARG_LIBRARY_NAME:
- g_value_set_string (value, self->omx_library);
+ g_omx_get_library_name_value (self, value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
@@ -433,12 +416,12 @@ type_class_init (gpointer g_class,
g_object_class_install_property (gobject_class, ARG_COMPONENT_NAME,
g_param_spec_string ("component-name", "Component name",
"Name of the OpenMAX IL component to use",
- NULL, G_PARAM_READWRITE));
+ NULL, G_PARAM_READABLE));
g_object_class_install_property (gobject_class, ARG_LIBRARY_NAME,
g_param_spec_string ("library-name", "Library name",
"Name of the OpenMAX IL implementation library to use",
- NULL, G_PARAM_READWRITE));
+ NULL, G_PARAM_READABLE));
}
}
@@ -459,17 +442,6 @@ type_instance_init (GTypeInstance *instance,
gomx->object = self;
}
- {
- const char *tmp;
- tmp = g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class),
- g_quark_from_static_string ("library-name"));
- self->omx_library = g_strdup (tmp);
- tmp = g_type_get_qdata (G_OBJECT_CLASS_TYPE (g_class),
- g_quark_from_static_string ("component-name"));
- self->omx_component = g_strdup (tmp);
- }
-
-
GST_LOG_OBJECT (self, "end");
}
diff --git a/omx/gstomx_base_src.h b/omx/gstomx_base_src.h
index 85e4c13..adab894 100644
--- a/omx/gstomx_base_src.h
+++ b/omx/gstomx_base_src.h
@@ -44,8 +44,6 @@ struct GstOmxBaseSrc
GOmxCore *gomx;
GOmxPort *out_port;
- char *omx_component;
- char *omx_library;
GstOmxBaseSrcCb setup_ports;
};
diff --git a/omx/gstomx_conf.c b/omx/gstomx_conf.c
new file mode 100644
index 0000000..d25c173
--- /dev/null
+++ b/omx/gstomx_conf.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2010 Texas Instruments, Incorporated
+ * Copyright (C) 2007-2010 Nokia Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include <glib.h>
+
+#include "config.h"
+
+const gchar * default_config =
+"\n"
+"omx_dummy,\n"
+" type=GstOmxDummy,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.dummy,\n"
+" rank=0;\n"
+"\n"
+/* for testing: */
+"omx_dummy_2,\n"
+" type=GstOmxDummy,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.dummy2,\n"
+" rank=256;\n"
+"\n"
+"omx_mpeg4dec,\n"
+" type=GstOmxMpeg4Dec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.video_decoder.mpeg4,\n"
+" rank=256;\n"
+"\n"
+"omx_h264dec,\n"
+" type=GstOmxH264Dec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.video_decoder.avc,\n"
+" rank=256;\n"
+"\n"
+"omx_h263dec,\n"
+" type=GstOmxH263Dec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.video_decoder.h263,\n"
+" rank=256;\n"
+"\n"
+"omx_wmvdec,\n"
+" type=GstOmxWmvDec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.video_decoder.wmv,\n"
+" rank=256;\n"
+"\n"
+"omx_mpeg4enc,\n"
+" type=GstOmxMpeg4Enc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.video_encoder.mpeg4,\n"
+" rank=256;\n"
+"\n"
+"omx_h264enc,\n"
+" type=GstOmxH264Enc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.video_encoder.avc,\n"
+" rank=256;\n"
+"\n"
+"omx_h263enc,\n"
+" type=GstOmxH263Enc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.video_encoder.h263,\n"
+" rank=256;\n"
+"\n"
+"omx_vorbisdec,\n"
+" type=GstOmxVorbisDec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.ogg.single,\n"
+" rank=128;\n"
+"\n"
+"omx_mp3dec,\n"
+" type=GstOmxMp3Dec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.mp3.mad,\n"
+" rank=256;\n"
+"\n"
+#ifdef EXPERIMENTAL
+"omx_mp2dec,\n"
+" type=GstOmxMp2Dec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.mp3.mad,\n"
+" rank=256;\n"
+"\n"
+"omx_amrnbdec,\n"
+" type=GstOmxAmrNbDec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.amrnb,\n"
+" rank=256;\n"
+"\n"
+"omx_amrnbenc,\n"
+" type=GstOmxAmrNbEnc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_encoder.amrnb,\n"
+" rank=256;\n"
+"\n"
+"omx_amrwbdec,\n"
+" type=GstOmxAmrWbDec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.amrwb,\n"
+" rank=256;\n"
+"\n"
+"omx_amrwbenc,\n"
+" type=GstOmxAmrWbEnc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_encoder.amrwb,\n"
+" rank=256;\n"
+"\n"
+"omx_aacdec,\n"
+" type=GstOmxAacDec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.aac,\n"
+" rank=256;\n"
+"\n"
+"omx_aacenc,\n"
+" type=GstOmxAacEnc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_encoder.aac,\n"
+" rank=256;\n"
+"\n"
+"omx_adpcmdec,\n"
+" type=GstOmxAdpcmDec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.adpcm,\n"
+" rank=256;\n"
+"\n"
+"omx_adpcmenc,\n"
+" type=GstOmxAdpcmEnc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_encoder.adpcm,\n"
+" rank=256;\n"
+"\n"
+"omx_g711dec,\n"
+" type=GstOmxG711Dec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.g711,\n"
+" rank=256;\n"
+"\n"
+"omx_g711enc,\n"
+" type=GstOmxG711Enc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_encoder.g711,\n"
+" rank=256;\n"
+"\n"
+"omx_g729dec,\n"
+" type=GstOmxG729Dec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.g729,\n"
+" rank=256;\n"
+"\n"
+"omx_g729enc,\n"
+" type=GstOmxG729Enc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_encoder.g729,\n"
+" rank=256;\n"
+"\n"
+"omx_ilbcdec,\n"
+" type=GstOmxIlbcDec,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_decoder.ilbc,\n"
+" rank=256;\n"
+"\n"
+"omx_ilbcenc,\n"
+" type=GstOmxIlbcEnc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_encoder.ilbc,\n"
+" rank=256;\n"
+"\n"
+"omx_jpegenc,\n"
+" type=GstOmxJpegEnc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.image_encoder.jpeg,\n"
+" rank=256;\n"
+"\n"
+#endif /* EXPERIMENTAL */
+"omx_audiosink,\n"
+" type=GstOmxAudioSink,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.alsa.alsasink,\n"
+" rank=0;\n"
+"\n"
+#ifdef EXPERIMENTAL
+"omx_videosink,\n"
+" type=GstOmxVideoSink,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.videosink,\n"
+" rank=0;\n"
+"\n"
+"omx_filereadersrc,\n"
+" type=GstOmxFilereaderSrc,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.audio_filereader,\n"
+" rank=0;\n"
+"\n"
+#endif /* EXPERIMENTAL */
+"omx_volume,\n"
+" type=GstOmxVolume,\n"
+" library-name=libomxil-bellagio.so.0,\n"
+" component-name=OMX.st.volume.component,\n"
+" rank=0;\n"
+;
diff --git a/omx/gstomx_util.c b/omx/gstomx_util.c
index 39d900b..ac94953 100644
--- a/omx/gstomx_util.c
+++ b/omx/gstomx_util.c
@@ -301,10 +301,13 @@ g_omx_core_free (GOmxCore *core)
}
void
-g_omx_core_init (GOmxCore *core,
- const gchar *library_name,
- const gchar *component_name)
+g_omx_core_init (GOmxCore *core)
{
+ gchar *library_name, *component_name;
+
+ g_return_if_fail (g_omx_get_component_info (core->object,
+ &library_name, &component_name));
+
core->imp = request_imp (library_name);
if (!core->imp)
diff --git a/omx/gstomx_util.h b/omx/gstomx_util.h
index f0cf045..c3ac441 100644
--- a/omx/gstomx_util.h
+++ b/omx/gstomx_util.h
@@ -116,7 +116,7 @@ void g_omx_deinit (void);
GOmxCore *g_omx_core_new (void);
void g_omx_core_free (GOmxCore *core);
-void g_omx_core_init (GOmxCore *core, const gchar *library_name, const gchar *component_name);
+void g_omx_core_init (GOmxCore *core);
void g_omx_core_deinit (GOmxCore *core);
void g_omx_core_prepare (GOmxCore *core);
void g_omx_core_start (GOmxCore *core);
--
1.6.3.2
More information about the Gstreamer-openmax
mailing list