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

Clark, Rob rob at ti.com
Fri Feb 26 05:15:00 PST 2010


On Feb 26, 2010, at 6:05 AM, Felipe Contreras wrote:

> On Thu, Feb 25, 2010 at 3:56 AM, Rob Clark <rob at ti.com> wrote:
>> 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:
>
> In general the patch looks ok, but:
>
> 1) I don't like this new class creation, probably the only reason it's
> needed is because the library-name and component-name are set in the
> GType, which is not needed. We can set these into the element itself
> without modifying the original GType.


We can set them as properties on the GstElement, but we still need some way to differentiate when the same element is used for two different OMX components in order to set the correct property values..  we can use the name property on the element, because this can be set to anything by the user (and at a minimum, would end up something like "omx_dummy0")

I originally tried without creating new classes, but ran into this problem in the case that we had two different elements with same GType but different OMX components.  So I don't see any better solution.


>
> 2) gstomx_conf.c looks a bit tricky, I was thinking on a plain text
> file, just like gst-openmax.conf. I guess the .c file is ok for now,
> but I don't like this tricky Makefile rule, let's just have a
> gstomx_conf.c instead.


I think we need something that ends up as a .c file, for the #ifndef EXPERIMENTAL stuff.. and also so we have some default config embedded in libgstomx.so.

That said, it could be a plain gstomx_conf.c file..  I just thought the plain text .conf file generating the .c file was easier to edit.  But I can change it back to plain .c file if you don't like my clever makefile rule ;-)


>
> 3) The configuration location should be obtained with
> g_get_user_config_dir() ($HOME/.config)


ok, I can change this, and address the other minor comments and re-submit

BR,
-R


>
> Also, a few minor comments below.
>
>> ----
>> 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/.gstreamer-0.10/gst-openmax.conf, although if none is found a default config will be created.
>> ---
>> configure.ac             |    3 +
>> omx/Makefile.am          |    9 +-
>> omx/gstomx.c             |  353 ++++++++++++++++++++++++++++++++++++++--------
>> omx/gstomx.conf          |  216 ++++++++++++++++++++++++++++
>> omx/gstomx.h             |   12 ++
>> 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        |    9 +-
>> omx/gstomx_util.h        |    2 +-
>> 13 files changed, 553 insertions(+), 158 deletions(-)
>> create mode 100644 omx/gstomx.conf
>>
>> diff --git a/configure.ac b/configure.ac
>> index 22dcf7d..3d7df3f 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -11,6 +11,9 @@ dnl versions of GStreamer
>> GST_MAJORMINOR=0.10
>> GST_REQUIRED=0.10.0
>>
>> +AC_DEFINE_UNQUOTED(GST_MAJORMINOR, "$GST_MAJORMINOR",
>> +  [library major.minor version])
>> +
>> dnl AM_MAINTAINER_MODE provides the option to enable maintainer mode
>> AM_MAINTAINER_MODE
>>
>> diff --git a/omx/Makefile.am b/omx/Makefile.am
>> index 4a3fbf9..1bb9901 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,9 @@ 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..ae80813 100644
>> --- a/omx/gstomx.c
>> +++ b/omx/gstomx.c
>> @@ -19,8 +19,12 @@
>> *
>> */
>>
>> +#include <string.h>
>> +
>> #include "config.h"
>>
>> +#include <gst/gststructure.h>
>> +
>> #include "gstomx.h"
>> #include "gstomx_dummy.h"
>> #include "gstomx_mpeg4dec.h"
>> @@ -59,90 +63,317 @@
>>
>> 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,
>> };
>>
>> +
>
> Unnecessary extra space.
>
>> +/* 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_home_dir (),
>> +                    ".gstreamer-" GST_MAJORMINOR, "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;
>> +
>> +    g_assert (gst_structure_get (element_table,
>> +            element_name, GST_TYPE_STRUCTURE, &element, NULL));
>> +
>> +    return element;
>> +}
>> +
>> +static const gchar *
>> +get_element_name (gpointer object)
>> +{
>> +    return g_type_name (G_OBJECT_TYPE (object));
>> +}
>> +
>> +
>
> Unnecessary extra space.
>
>> +/* 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;
>> +
>> +    g_type_query (type, &q);
>> +
>> +    bzero (&i, sizeof (i));
>
> bzero is deprecated in POSIX; memset should be used instead.
>
> Even better would be to set any field of i, the compiler would then
> zero the rest of the structure (C spec).
>
>> +    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 < DIM (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)
>> +        {
>> +            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))
>>        {
>> -            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;
>> -            }
>> +            /* 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);
>> +
>> +    g_assert (gst_structure_get (element_table,
>> +            element_name, GST_TYPE_STRUCTURE, &element, NULL));
>> +
>> +    /* 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 beach;
>> +        }
>> +        *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 beach;
>> +        }
>> +        *component_name = g_strdup (str);
>> +    }
>> +
>> +beach:
>
> Let's not follow bad gst practiced :) let's call this "leave", or
> something meaningful.
>
>> +
>> +    /* 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);
>> +}
>> +
>> +
>
> Unnecessary extra space. This is done in a bunch of other places =/
>
>> 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..6a88dc1
>> --- /dev/null
>> +++ b/omx/gstomx.conf
>> @@ -0,0 +1,216 @@
>> +/*
>> + * 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 "config.h"
>> +
>> +omx_dummy,
>> +  type=GstOmxDummy,
>> +  library-name=libomxil-bellagio.so.0,
>> +  component-name=OMX.st.dummy,
>> +  rank=0;
>> +
>> +/* for testing: */
>> +omx_dummy_2,
>> +  type=GstOmxDummy,
>> +  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..0d362d7 100644
>> --- a/omx/gstomx.h
>> +++ b/omx/gstomx.h
>> @@ -30,6 +30,18 @@ GST_DEBUG_CATEGORY_EXTERN (gstomx_debug);
>> GST_DEBUG_CATEGORY_EXTERN (gstomx_util_debug);
>> #define GST_CAT_DEFAULT gstomx_debug
>>
>> +#ifndef DIM  /* XXX is there a better alternative available? */
>> +#  define DIM(x) (sizeof(x)/sizeof((x)[0]))
>> +#endif
>
> Let's call it ARRAY_SIZE (just like in the kernel). Maybe there's
> something in GLib for that (can't recall though), but I like
> ARRAY_SIZE :)
>
>> +
>> +
>> +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..c429738 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_assert (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
>
> Cheers.
>
> --
> Felipe Contreras





More information about the Gstreamer-openmax mailing list