[Gstreamer-openmax] [PATCH 2/2] add gst-openmax registry (config file)

Rob Clark rob at ti.com
Sun Feb 28 15:36:13 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.

In the simple case, of one OMX component per gst-openmax class, specify the gst-openmax class as the 'type', and the 'library-name' and 'compnent-name' of the OMX component, and
optionally the 'rank' (defaults to 0 or GST_RANK_NONE):

----
omx_h264dec,
  type=GstOmxH264Dec,
  library-name=libomxil-bellagio.so.0,
  component-name=OMX.st.video_decoder.avc,
  rank=256;
----

Or in the advanced case of multiple OMX components per gst-openmax class, specify the gst-openmax class as the 'parent-type' and a dynamically created sub-class for the 'type':

----
omx_mp3dec_ti,
      parent-type=GstOmxMp3Dec,
      type=GstOmxMp3DecTi
      library-name=libOMX_Core.so.0,
      component-name=OMX.TI.AUDIO.DECODE,
      component-role=audio_decode.dsp.mp3,
      rank=256;

omx_mp3dec_nokia,
      parent-type=GstOmxMp3Dec,
      type=GstOmxMp3DecNokia
      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.
---
Latest (and hopefully final) version of patch fixes small memory leak

 omx/Makefile.am          |    8 +-
 omx/gstomx.c             |  376 +++++++++++++++++++++++++++++++++++++++-------
 omx/gstomx.conf          |  203 +++++++++++++++++++++++++
 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_util.c        |   16 ++-
 omx/gstomx_util.h        |    2 +-
 12 files changed, 564 insertions(+), 154 deletions(-)
 create mode 100644 omx/gstomx.conf

diff --git a/omx/Makefile.am b/omx/Makefile.am
index 4a3fbf9..01243ff 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 \
@@ -47,3 +48,8 @@ libgstomx_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) $(top_builddir)/util/libutil.
 libgstomx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 
 EXTRA_DIST = headers
+
+gstomx_conf.c: gstomx.conf
+	echo "const char * default_config =" > $@
+	cat $^ | $(CPP) $(CFLAGS) $(libgstomx_la_CFLAGS) $(DEFAULT_INCLUDES) $(INCLUDES) - | grep -v "^#" | sed 's/^.*/\"&\\\n"/' >> $@
+	echo ";" >> $@
diff --git a/omx/gstomx.c b/omx/gstomx.c
index 6756f54..6fa9b09 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,348 @@
 
 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;
+static GQuark element_name_quark;
+
+
+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;
+
+    /* This assert should never fail, because plugin elements are registered
+     * based on the entries in this table.  Someone would have to manually
+     * override the type qdata for this to fail.
+     */
+    g_assert (element);
+
+    return element;
+}
+
+static const gchar *
+get_element_name (gpointer object)
+{
+    return g_type_get_qdata (G_OBJECT_TYPE (object), element_name_quark);
+}
+
+/* register a new dynamic sub-class with the name 'type_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 parent_type, const gchar *type_name)
+{
+    GTypeQuery q;
+    GTypeInfo i = {0};
+
+    if (!type_name)
+        return 0;
+
+    g_type_query (parent_type, &q);
+
+    i.class_size = q.class_size;
+    i.instance_size = q.instance_size;
+
+    return g_type_register_static (parent_type, type_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");
+    element_name_quark = g_quark_from_static_string ("element-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++)
-        {
-            TableItem *element;
-            GType type;
+        const gchar *element_name = gst_structure_nth_field_name (element_table, i);
+        GstStructure *element = get_element_entry (element_name);
+        const gchar *type_name, *parent_type_name;
+        GType type;
+        gint rank;
+
+        GST_DEBUG ("element_name=%s, element=%"GST_PTR_FORMAT, element_name, element);
 
-            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);
+        parent_type_name = gst_structure_get_string (element, "parent-type");
+        type_name = gst_structure_get_string (element, "type");
 
-            if (!gst_element_register (plugin, element->name, element->rank, type))
+        if (parent_type_name)
+        {
+            type = g_type_from_name (parent_type_name);
+            if (type)
+            {
+                type = create_subtype (type, type_name);
+            }
+            else
             {
-                g_warning ("failed registering '%s'", element->name);
+                g_warning ("malformed config file: invalid parent-type '%s' for %s",
+                        parent_type_name, element_name);
                 return FALSE;
             }
         }
+        else if (type_name)
+        {
+            type = g_type_from_name (type_name);
+        }
+
+        if (!type_name)
+        {
+            g_warning ("malformed config file: missing 'type' for %s",
+                    element_name);
+            return FALSE;
+        }
+
+        if (!type)
+        {
+            g_warning ("malformed config file: invalid type '%s' for %s",
+                    type_name, element_name);
+            return FALSE;
+        }
+
+        g_type_set_qdata (type, element_name_quark, (gpointer) 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_take_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.conf b/omx/gstomx.conf
new file mode 100644
index 0000000..c22c6d6
--- /dev/null
+++ b/omx/gstomx.conf
@@ -0,0 +1,203 @@
+#include "config.h"
+
+/* in case of multiple OMX components mapping to a single gst-openmax element
+ * class, a dynamic subclass can be created by specifying the gst-openmax
+ * type as the 'parent-type' and specifying a new unique type name as the
+ * 'type' parameter:
+ */
+omx_dummy,
+  parent-type=GstOmxDummy,
+  type=GstOmxDummyOne,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.bellagio.dummy,
+  rank=0;
+
+/* for testing: */
+omx_dummy_2,
+  parent-type=GstOmxDummy,
+  type=GstOmxDummyTwo,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.dummy2,
+  rank=256;
+
+omx_mpeg4dec,
+  type=GstOmxMpeg4Dec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.video_decoder.mpeg4,
+  rank=256;
+
+omx_h264dec,
+  type=GstOmxH264Dec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.video_decoder.avc,
+  rank=256;
+
+omx_h263dec,
+  type=GstOmxH263Dec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.video_decoder.h263,
+  rank=256;
+
+omx_wmvdec,
+  type=GstOmxWmvDec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.video_decoder.wmv,
+  rank=256;
+
+omx_mpeg4enc,
+  type=GstOmxMpeg4Enc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.video_encoder.mpeg4,
+  rank=256;
+
+omx_h264enc,
+  type=GstOmxH264Enc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.video_encoder.avc,
+  rank=256;
+
+omx_h263enc,
+  type=GstOmxH263Enc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.video_encoder.h263,
+  rank=256;
+
+omx_vorbisdec,
+  type=GstOmxVorbisDec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.ogg.single,
+  rank=128;
+
+omx_mp3dec,
+  type=GstOmxMp3Dec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.mp3.mad,
+  rank=256;
+
+#ifdef EXPERIMENTAL
+
+omx_mp2dec,
+  type=GstOmxMp2Dec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.mp3.mad,
+  rank=256;
+
+omx_amrnbdec,
+  type=GstOmxAmrNbDec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.amrnb,
+  rank=256;
+
+omx_amrnbenc,
+  type=GstOmxAmrNbEnc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_encoder.amrnb,
+  rank=256;
+
+omx_amrwbdec,
+  type=GstOmxAmrWbDec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.amrwb,
+  rank=256;
+
+omx_amrwbenc,
+  type=GstOmxAmrWbEnc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_encoder.amrwb,
+  rank=256;
+
+omx_aacdec,
+  type=GstOmxAacDec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.aac,
+  rank=256;
+
+omx_aacenc,
+  type=GstOmxAacEnc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_encoder.aac,
+  rank=256;
+
+omx_adpcmdec,
+  type=GstOmxAdpcmDec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.adpcm,
+  rank=256;
+
+omx_adpcmenc,
+  type=GstOmxAdpcmEnc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_encoder.adpcm,
+  rank=256;
+
+omx_g711dec,
+  type=GstOmxG711Dec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.g711,
+  rank=256;
+
+omx_g711enc,
+  type=GstOmxG711Enc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_encoder.g711,
+  rank=256;
+
+omx_g729dec,
+  type=GstOmxG729Dec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.g729,
+  rank=256;
+
+omx_g729enc,
+  type=GstOmxG729Enc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_encoder.g729,
+  rank=256;
+
+omx_ilbcdec,
+  type=GstOmxIlbcDec,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_decoder.ilbc,
+  rank=256;
+
+omx_ilbcenc,
+  type=GstOmxIlbcEnc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_encoder.ilbc,
+  rank=256;
+
+omx_jpegenc,
+  type=GstOmxJpegEnc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.image_encoder.jpeg,
+  rank=256;
+
+#endif /* EXPERIMENTAL */
+
+omx_audiosink,
+  type=GstOmxAudioSink,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.alsa.alsasink,
+  rank=0;
+
+#ifdef EXPERIMENTAL
+
+omx_videosink,
+  type=GstOmxVideoSink,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.videosink,
+  rank=0;
+
+omx_filereadersrc,
+  type=GstOmxFilereaderSrc,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.audio_filereader,
+  rank=0;
+
+#endif /* EXPERIMENTAL */
+
+omx_volume,
+  type=GstOmxVolume,
+  library-name=libomxil-bellagio.so.0,
+  component-name=OMX.st.volume.component,
+  rank=0;
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_util.c b/omx/gstomx_util.c
index 39d900b..dae3f67 100644
--- a/omx/gstomx_util.c
+++ b/omx/gstomx_util.c
@@ -301,10 +301,17 @@ 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;
+
+    if (!g_omx_get_component_info (core->object,
+            &library_name, &component_name))
+    {
+        GST_ERROR_OBJECT (core->object, "missing component info");
+        return;
+    }
+
     core->imp = request_imp (library_name);
 
     if (!core->imp)
@@ -316,6 +323,9 @@ g_omx_core_init (GOmxCore *core,
                                                        &callbacks);
     if (!core->omx_error)
         core->omx_state = OMX_StateLoaded;
+
+    g_free (library_name);
+    g_free (component_name);
 }
 
 void
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