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

Felipe Contreras felipe.contreras at gmail.com
Fri Feb 26 04:05:56 PST 2010


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.

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.

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

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