You can subscribe to this list here.
| 2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(2) |
Sep
|
Oct
(1) |
Nov
|
Dec
(8) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2008 |
Jan
(5) |
Feb
(3) |
Mar
|
Apr
(2) |
May
(4) |
Jun
(1) |
Jul
(11) |
Aug
(31) |
Sep
(2) |
Oct
(21) |
Nov
(16) |
Dec
(56) |
| 2009 |
Jan
(12) |
Feb
(5) |
Mar
(34) |
Apr
(9) |
May
(5) |
Jun
(7) |
Jul
(18) |
Aug
(5) |
Sep
(2) |
Oct
(6) |
Nov
(50) |
Dec
|
| 2010 |
Jan
(3) |
Feb
(67) |
Mar
(135) |
Apr
(30) |
May
(2) |
Jun
(11) |
Jul
|
Aug
(18) |
Sep
(12) |
Oct
(4) |
Nov
(17) |
Dec
(11) |
| 2011 |
Jan
(14) |
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: Clark, R. <ro...@ti...> - 2010-02-26 18:15:11
|
On Feb 26, 2010, at 5:47 AM, Felipe Contreras wrote:
> On Thu, Feb 25, 2010 at 3:55 AM, Rob Clark <ro...@ti...> wrote:
>> ---
>> omx/gstomx_base_filter.c | 12 ++++++------
>> omx/gstomx_base_sink.c | 2 +-
>> 2 files changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/omx/gstomx_base_filter.c b/omx/gstomx_base_filter.c
>> index 287f50c..b0353cb 100644
>> --- a/omx/gstomx_base_filter.c
>> +++ b/omx/gstomx_base_filter.c
>> @@ -40,11 +40,11 @@ log_buffer (GstOmxBaseFilter *self,
>> OMX_BUFFERHEADERTYPE *omx_buffer)
>> {
>> GST_DEBUG_OBJECT (self, "omx_buffer: "
>> - "size=%" G_GUINT32_FORMAT ", "
>> - "len=%" G_GUINT32_FORMAT ", "
>> - "flags=%" G_GUINT32_FORMAT ", "
>> - "offset=%" G_GUINT32_FORMAT ", "
>> - "timestamp=%" G_GUINT64_FORMAT,
>> + "size=%lu, "
>> + "len=%lu, "
>> + "flags=%lu, "
>> + "offset=%lu, "
>> + "timestamp=%lld",
>> omx_buffer->nAllocLen, omx_buffer->nFilledLen, omx_buffer->nFlags,
>> omx_buffer->nOffset, omx_buffer->nTimeStamp);
>> }
>
> Interesting, so G_GUINT32_FORMAT doesn't work with OMX_U32.
>
> Probably because of this:
> /** OMX_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */
> typedef unsigned long OMX_U32;
>
> Can you do a sizeof(OMX_U32) in your 64-bit system? I guess it's 64
> bits, and if so, that's a bug in the header files and I wonder if
> communication between different omx components (64bit client vs 32bit
> implementation) might be screwed.
>
yup, this becomes 8 bytes.. if I build w/ -m32 to force 32bit binary, then it goes back to 4 bytes. But the compiler complains in either case.
It would be better if OMX header used stdint types for better portability.. but I guess not much thought has gone into using OMX on 64bit platform yet.
It is your call on merging this patch.. I don't think it should hurt anything, but probably most people won't need it. But I'll leave it in my own working tree since I need it to build on my laptop.
BR,
-R
> --
> Felipe Contreras
|
|
From: Clark, R. <ro...@ti...> - 2010-02-26 14:14:17
|
On Feb 26, 2010, at 6:05 AM, Felipe Contreras wrote: > 3) The configuration location should be obtained with > g_get_user_config_dir() ($HOME/.config) What do you think about leaving this as-is, but submitting a patch to gstreamer to add API to get the gst registry directory (gst_get_registry_dir() or something like that?), and later changing to using that? I'm wondering if the config file makes more sense to be located along side gst registry.. Thoughts? BR, -R |
|
From: Clark, R. <ro...@ti...> - 2010-02-26 14:01:16
|
On Feb 26, 2010, at 6:36 AM, Tim-Philipp Müller wrote: > On Fri, 2010-02-26 at 14:05 +0200, Felipe Contreras wrote: > >>> +#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 :) > > GLib macro is G_N_ELEMENTS, fwiw. > ahh, brilliant.. I couldn't figure out what macro name to look for, and was hoping for someone to clue me in :-) BR, -R > Cheers > -Tim > > > > ------------------------------------------------------------------------------ > Download Intel® Parallel Studio Eval > Try the new software tools for yourself. Speed compiling, find bugs > proactively, and fine-tune applications for parallel performance. > See why Intel Parallel Studio got high marks during beta. > http://p.sf.net/sfu/intel-sw-dev > _______________________________________________ > Gstreamer-openmax mailing list > Gst...@li... > https://lists.sourceforge.net/lists/listinfo/gstreamer-openmax |
|
From: Clark, R. <ro...@ti...> - 2010-02-26 13:18:17
|
On Feb 26, 2010, at 5:47 AM, Felipe Contreras wrote:
> On Thu, Feb 25, 2010 at 3:55 AM, Rob Clark <ro...@ti...> wrote:
>> ---
>> omx/gstomx_base_filter.c | 12 ++++++------
>> omx/gstomx_base_sink.c | 2 +-
>> 2 files changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/omx/gstomx_base_filter.c b/omx/gstomx_base_filter.c
>> index 287f50c..b0353cb 100644
>> --- a/omx/gstomx_base_filter.c
>> +++ b/omx/gstomx_base_filter.c
>> @@ -40,11 +40,11 @@ log_buffer (GstOmxBaseFilter *self,
>> OMX_BUFFERHEADERTYPE *omx_buffer)
>> {
>> GST_DEBUG_OBJECT (self, "omx_buffer: "
>> - "size=%" G_GUINT32_FORMAT ", "
>> - "len=%" G_GUINT32_FORMAT ", "
>> - "flags=%" G_GUINT32_FORMAT ", "
>> - "offset=%" G_GUINT32_FORMAT ", "
>> - "timestamp=%" G_GUINT64_FORMAT,
>> + "size=%lu, "
>> + "len=%lu, "
>> + "flags=%lu, "
>> + "offset=%lu, "
>> + "timestamp=%lld",
>> omx_buffer->nAllocLen, omx_buffer->nFilledLen, omx_buffer->nFlags,
>> omx_buffer->nOffset, omx_buffer->nTimeStamp);
>> }
>
> Interesting, so G_GUINT32_FORMAT doesn't work with OMX_U32.
>
> Probably because of this:
> /** OMX_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */
> typedef unsigned long OMX_U32;
>
> Can you do a sizeof(OMX_U32) in your 64-bit system? I guess it's 64
> bits, and if so, that's a bug in the header files and I wonder if
> communication between different omx components (64bit client vs 32bit
> implementation) might be screwed.
I'll check that.. I was thinking the issue was the glib type size changed but OMX type size stayed the same. But I'll investigate further.
BR,
-R
>
> --
> Felipe Contreras
|
|
From: Clark, R. <ro...@ti...> - 2010-02-26 13:15:06
|
On Feb 26, 2010, at 6:05 AM, Felipe Contreras wrote:
> On Thu, Feb 25, 2010 at 3:56 AM, Rob Clark <ro...@ti...> 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
|
|
From: Tim-Philipp M. <t....@ze...> - 2010-02-26 13:13:08
|
On Fri, 2010-02-26 at 14:05 +0200, Felipe Contreras wrote: > > +#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 :) GLib macro is G_N_ELEMENTS, fwiw. Cheers -Tim |
|
From: Felipe C. <fel...@gm...> - 2010-02-26 12:54:08
|
On Thu, Feb 25, 2010 at 3:30 AM, Clark, Rob <ro...@ti...> wrote: > I'll send the patch email separately to the list (I'm not sure if it will be big enough that you'll have to moderate) Apparently the limit was 40K. I've increased it to 500K. Cheers. -- Felipe Contreras |
|
From: Felipe C. <fel...@gm...> - 2010-02-26 12:06:04
|
On Thu, Feb 25, 2010 at 3:56 AM, Rob Clark <ro...@ti...> 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
|
|
From: Felipe C. <fel...@gm...> - 2010-02-26 11:47:53
|
On Thu, Feb 25, 2010 at 3:55 AM, Rob Clark <ro...@ti...> wrote:
> ---
> omx/gstomx_base_filter.c | 12 ++++++------
> omx/gstomx_base_sink.c | 2 +-
> 2 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/omx/gstomx_base_filter.c b/omx/gstomx_base_filter.c
> index 287f50c..b0353cb 100644
> --- a/omx/gstomx_base_filter.c
> +++ b/omx/gstomx_base_filter.c
> @@ -40,11 +40,11 @@ log_buffer (GstOmxBaseFilter *self,
> OMX_BUFFERHEADERTYPE *omx_buffer)
> {
> GST_DEBUG_OBJECT (self, "omx_buffer: "
> - "size=%" G_GUINT32_FORMAT ", "
> - "len=%" G_GUINT32_FORMAT ", "
> - "flags=%" G_GUINT32_FORMAT ", "
> - "offset=%" G_GUINT32_FORMAT ", "
> - "timestamp=%" G_GUINT64_FORMAT,
> + "size=%lu, "
> + "len=%lu, "
> + "flags=%lu, "
> + "offset=%lu, "
> + "timestamp=%lld",
> omx_buffer->nAllocLen, omx_buffer->nFilledLen, omx_buffer->nFlags,
> omx_buffer->nOffset, omx_buffer->nTimeStamp);
> }
Interesting, so G_GUINT32_FORMAT doesn't work with OMX_U32.
Probably because of this:
/** OMX_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */
typedef unsigned long OMX_U32;
Can you do a sizeof(OMX_U32) in your 64-bit system? I guess it's 64
bits, and if so, that's a bug in the header files and I wonder if
communication between different omx components (64bit client vs 32bit
implementation) might be screwed.
--
Felipe Contreras
|
|
From: Clark, R. <ro...@ti...> - 2010-02-25 02:02:10
|
On Feb 24, 2010, at 10:19 AM, Felipe Contreras wrote: > On Wed, Feb 24, 2010 at 4:10 PM, Rob Clark <ro...@ti...> wrote: >> On Feb 24, 2010, at 6:41 AM, Felipe Contreras wrote: >>> I think rank should also be optional. >> >> ok, should default rank=GST_RANK_NONE? > > That was my idea, yeah. > >>> Anyway, the only important comment I have for now is that I think the >>> type should also be configurable (you can use g_type_from_name()) >>> >>> I'm thinking something like: >>> >>> --- >>> 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 >>> --- >> >> ok, that seems reasonable.. are you ok w/ basically same thing in GstStructure syntax: >> >> 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; > > Yeah, whatever is easier. ok, what I ended up doing, in order to accommodate multiple elements with different names and different component-name and/or library-name but same gst-openmax class was to dynamically generate subclasses of the gst-openmax class.. so for example you'll end up with a class called omx_mp3dec_ti and omx_mp3dec_nokia which both subclass GstOmxMp3Dec. This approach seems to work pretty well, you can have as many different elements using the same code but different OMX components as you want: http://gitorious.org/robclark-gstreamer/gst-openmax/commit/e91b1e643ceac35f04b6649af0532d12219e33d7 http://gitorious.org/robclark-gstreamer/gst-openmax/commit/e91b1e643ceac35f04b6649af0532d12219e33d7.patch I'll send the patch email separately to the list (I'm not sure if it will be big enough that you'll have to moderate) There is one preceding patch to fix some issues building on 64bit host (since I found it easier to build and test on my laptop than on the target board). BR, -R > >>> Oh, and I think the default configuration should be in a separate file. >> >> ok, I'll do that.. expect an updated patch, rebased on latest gst-openmax master so you can more easily apply the patch and try it out > > Cool :) > > -- > Felipe Contreras |
|
From: Rob C. <ro...@ti...> - 2010-02-25 02:01:51
|
---
omx/gstomx_base_filter.c | 12 ++++++------
omx/gstomx_base_sink.c | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/omx/gstomx_base_filter.c b/omx/gstomx_base_filter.c
index 287f50c..b0353cb 100644
--- a/omx/gstomx_base_filter.c
+++ b/omx/gstomx_base_filter.c
@@ -40,11 +40,11 @@ log_buffer (GstOmxBaseFilter *self,
OMX_BUFFERHEADERTYPE *omx_buffer)
{
GST_DEBUG_OBJECT (self, "omx_buffer: "
- "size=%" G_GUINT32_FORMAT ", "
- "len=%" G_GUINT32_FORMAT ", "
- "flags=%" G_GUINT32_FORMAT ", "
- "offset=%" G_GUINT32_FORMAT ", "
- "timestamp=%" G_GUINT64_FORMAT,
+ "size=%lu, "
+ "len=%lu, "
+ "flags=%lu, "
+ "offset=%lu, "
+ "timestamp=%lld",
omx_buffer->nAllocLen, omx_buffer->nFilledLen, omx_buffer->nFlags,
omx_buffer->nOffset, omx_buffer->nTimeStamp);
}
@@ -450,7 +450,7 @@ output_loop (gpointer data)
}
else
{
- GST_WARNING_OBJECT (self, "couldn't allocate buffer of size %" G_GUINT32_FORMAT,
+ GST_WARNING_OBJECT (self, "couldn't allocate buffer of size %lu",
omx_buffer->nFilledLen);
}
}
diff --git a/omx/gstomx_base_sink.c b/omx/gstomx_base_sink.c
index b50564d..c1a2076 100644
--- a/omx/gstomx_base_sink.c
+++ b/omx/gstomx_base_sink.c
@@ -161,7 +161,7 @@ render (GstBaseSink *gst_base,
gomx = self->gomx;
GST_LOG_OBJECT (self, "begin");
- GST_LOG_OBJECT (self, "gst_buffer: size=%lu", GST_BUFFER_SIZE (buf));
+ GST_LOG_OBJECT (self, "gst_buffer: size=%u", GST_BUFFER_SIZE (buf));
GST_LOG_OBJECT (self, "state: %d", gomx->omx_state);
--
1.6.3.2
|
|
From: Rob C. <ro...@ti...> - 2010-02-25 02:01:51
|
Configurable mapping between gst-openmax elements and OMX library-name and component-name via config file. The config file may even create multiple different elements with unique names
using the same gst-openmax class but different OMX library-name and/or component-name. For example:
----
omx_mp3dec_ti,
type=GstOmxMp3Dec,
library-name=libOMX_Core.so.0,
component-name=OMX.TI.AUDIO.DECODE,
component-role=audio_decode.dsp.mp3,
rank=256;
omx_mp3dec_nokia,
type=GstOmxMp3Dec,
library-name=libomxil_bellagio.so.0,
component-name=OMX.nokia.audio_decode.mp3,
rank=128;
----
by default, the config file is stored in $HOME/.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,
};
+
+/* 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));
+}
+
+
+/* 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));
+
+ 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:
+
+ /* if we failed, free any memory that might have been allocated:
+ */
+ if (!ret)
+ {
+ if (library_name) g_free (*library_name);
+ if (component_name) g_free (*component_name);
+ }
+
+
+ return ret;
+}
+
+static gboolean
+set_value_helper (GValue *value, gchar *str)
+{
+ g_value_set_string (value, str);
+ return TRUE;
+}
+
+/**
+ * g_omx_get_library_name_value:
+ * @object: the GstOmx object (ie. GstOmxBaseFilter, GstOmxBaseSrc, or
+ * GstOmxBaseSink).
+ * @val: the GValue to return the value through
+ *
+ * A helper to access the "library-name" as a GValue, mainly for
+ * get_property methods.
+ */
+gboolean
+g_omx_get_library_name_value (gpointer object, GValue *val)
+{
+ gchar *str;
+ return g_omx_get_component_info (object, &str, NULL) &&
+ set_value_helper (val, str);
+}
+
+/**
+ * g_omx_get_component_name_value:
+ * @object: the GstOmx object (ie. GstOmxBaseFilter, GstOmxBaseSrc, or
+ * GstOmxBaseSink).
+ * @val: the GValue to return the value through
+ *
+ * A helper to access the "component-name" as a GValue, mainly for
+ * get_property methods.
+ */
+gboolean
+g_omx_get_component_name_value (gpointer object, GValue *val)
+{
+ gchar *str;
+ return g_omx_get_component_info (object, NULL, &str) &&
+ set_value_helper (val, str);
+}
+
+
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"omx",
diff --git a/omx/gstomx.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
+
+
+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
|
|
From: Felipe C. <fel...@gm...> - 2010-02-24 16:20:01
|
On Wed, Feb 24, 2010 at 4:10 PM, Rob Clark <ro...@ti...> wrote: > On Feb 24, 2010, at 6:41 AM, Felipe Contreras wrote: >> I think rank should also be optional. > > ok, should default rank=GST_RANK_NONE? That was my idea, yeah. >> Anyway, the only important comment I have for now is that I think the >> type should also be configurable (you can use g_type_from_name()) >> >> I'm thinking something like: >> >> --- >> 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 >> --- > > ok, that seems reasonable.. are you ok w/ basically same thing in GstStructure syntax: > > 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; Yeah, whatever is easier. >> Oh, and I think the default configuration should be in a separate file. > > ok, I'll do that.. expect an updated patch, rebased on latest gst-openmax master so you can more easily apply the patch and try it out Cool :) -- Felipe Contreras |
|
From: Rob C. <ro...@ti...> - 2010-02-24 14:10:07
|
On Feb 24, 2010, at 6:41 AM, Felipe Contreras wrote:
> On Tue, Feb 23, 2010 at 4:42 AM, Clark, Rob <ro...@ti...> wrote:
>> Ok, attached is a work-in-progress for what I'm thinking.. the basic idea is that the config file is just a list of GstStructure's, so no parser needed, just gst_structure_from_string(). These get stored within a parent GstStructure (so could be cached w/ gst_plugin_{get,set}_cache_data(), although that is not implemented yet. The config file looks like:
>>
>> -----8<----------8<-----
>> omx_mp3dec, library-name=libOMX_Core.so, component-name=OMX.TI.AUDIO.DECODE, component-role=audio_decode.dsp.mp3, rank=256;
>> omx_aacdec, library-name=libOMX_Core.so, component-name=OMX.TI.AUDIO.DECODE, component-role=audio_decode.dsp.aac, rank=256;
>> omx_volume, library-name=libomxil-bellagio.so.0, component-name=OMX.st.volume.component, rank=0;
>> ...
>> ----->8---------->8-----
>
> We most probably will add more stuff so I think each element should
> span more than one line.
>
>> (the component-role field is optional, others are mandatory)
>
> I think rank should also be optional.
ok, should default rank=GST_RANK_NONE?
>
>> I left for now the library-name/component-name/component-role properties in the base src/filter/sink elements. But now they are just read-only properties, showing what is configured via the config file. I think this is useful to see in output of gst-inspect, diagrams generated from .dot files of the pipeline, etc.
>>
>> Right now I have a small default config, in case no config file is found.. but I could go either way on this, either making it complete or removing it altogether. Anyone have any preference about whether the config file should just override a complete default table, or whether the config file should be mandatory?
>>
>> The patch won't apply as-is on the gst-openmax tree from freedesktop.org (in our tree we've added component-role and some other stuff), but I'm just sending it as an RFC. If people like the idea, I'll rebase it on current master from fd.o (after cleaning up a couple of quick-n-dirty aspects of the patch).
>>
>> I've pushed the patch here, if this is an easier way for you to review:
>>
>> http://gitorious.org/robclark-gstreamer/gst-openmax/commit/4a8e4064c9b698d03ffce735257758cd0b8999f1
>>
>> and since the patch seems to be too big and caused my original email to bounce, here it the link to the patch:
>
> You didn't give me enough time to moderate it :) The patch doesn't
> look too big, I wonder why it was deferred.
sorry, I think it was just over the threshold..
I'll be more patient next time ;-)
> Anyway, the only important comment I have for now is that I think the
> type should also be configurable (you can use g_type_from_name())
>
> I'm thinking something like:
>
> ---
> 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
> ---
ok, that seems reasonable.. are you ok w/ basically same thing in GstStructure syntax:
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;
note, w/ GstStructure, we can easily add parameters later if we want:
omx_h264dec_ti,
type=GstOmxH264Dec,
library-name=libOMX_Core.so,
component-name=OMX.TI.DUCATI1.VIDEO.H264D,
src-formats=(fourcc){NV12,YUYV},
rank=256;
>
> Oh, and I think the default configuration should be in a separate file.
ok, I'll do that.. expect an updated patch, rebased on latest gst-openmax master so you can more easily apply the patch and try it out
BR,
-R
|
|
From: Felipe C. <fel...@gm...> - 2010-02-24 13:22:37
|
On Wed, Feb 24, 2010 at 12:16 AM, Stephen M. Webb <ste...@xa...> wrote: > On 23/02/10 15:09, Felipe Contreras wrote: >> On Tue, Feb 23, 2010 at 4:45 PM, Stephen M. Webb <ste...@xa...> > wrote: >> > >> > What I would want is some way to expose more properties via gst-openmax, >> > at runtime. I use gst-openmax to integrate various hardware codecs from >> > different vendors, each one with a different set of properties that may >> > need to be tweaked. The more I can keep generic and as a single binary, >> > the happier I am. And the easier it will be to push everything upstream. >> >> I'm not sure exactly what properties you might need. The only one I'm >> aware of is TI's "OMX.TI.VideoDecode.Param.WMVFileType" which is >> needed because the spec is missing something similar. And this one >> cannot be properly set with a configuration file, it has to be set >> programatically based on the fourcc/fomat caps. > > I have one hardware vendor who does the same thing with WVC1 vs. WMV3 formats, > only uses a different parameter name. They also have a parameter to enable > the use of hardware buffering -- effectively tunnelling, only tunnelled from > their video decoder to the gstreamer-based video renderer. Evidently there > are other parameters but their documentation is, ah, terse. I'm not sure how we can fix this WVC1 vs WMV3 issue since the property names and the values are going to be different no matter what. The best we can do is try to align on a non-vendor-specific extension. I will also try to fill a bug report in Khronos's bugzilla. I'm not sure about that tunneling stuff... it's not integrated on gst-omx yet and it looks like it might require quite big changes. > I think what I would really like to be able to do is to be able to set OpenMAX > parameters via GStreamer properties, not through a config file. As long as > the gst-openmax layer is configured to load the right component > (introspection or configuration), if I can query and set OpenMAX parameters > via GStreamer properties I could move most of the hardware-specific settings > into my player software. We could add some functions to access omx parameters directly through a gst-omx interface. That shouldn't be that difficult. But ideally we want all applications to be able to use the omx stuff transparently, not just the ones that know how to use the gst-omx interface smartly. >> Yeah, that's definitely not ideal but it would be nice to know exactly >> what are the differences each platform needs so that we know how to >> build a binary that works on all those platforms with a proper >> configuration file. > > Among the things I have to configure are the OMX_ALLOCATE_ON settings and the > fourcc caps supported by the video decoders. We could also specify the caps that each element supports, and yeah, allocate/use would make sense, along with the share_*_buffer hacks. Cheers. -- Felipe Contreras |
|
From: Felipe C. <fel...@gm...> - 2010-02-24 12:45:00
|
On Tue, Feb 23, 2010 at 4:42 AM, Clark, Rob <ro...@ti...> wrote:
> Ok, attached is a work-in-progress for what I'm thinking.. the basic idea is that the config file is just a list of GstStructure's, so no parser needed, just gst_structure_from_string(). These get stored within a parent GstStructure (so could be cached w/ gst_plugin_{get,set}_cache_data(), although that is not implemented yet. The config file looks like:
>
> -----8<----------8<-----
> omx_mp3dec, library-name=libOMX_Core.so, component-name=OMX.TI.AUDIO.DECODE, component-role=audio_decode.dsp.mp3, rank=256;
> omx_aacdec, library-name=libOMX_Core.so, component-name=OMX.TI.AUDIO.DECODE, component-role=audio_decode.dsp.aac, rank=256;
> omx_volume, library-name=libomxil-bellagio.so.0, component-name=OMX.st.volume.component, rank=0;
> ...
> ----->8---------->8-----
We most probably will add more stuff so I think each element should
span more than one line.
> (the component-role field is optional, others are mandatory)
I think rank should also be optional.
> I left for now the library-name/component-name/component-role properties in the base src/filter/sink elements. But now they are just read-only properties, showing what is configured via the config file. I think this is useful to see in output of gst-inspect, diagrams generated from .dot files of the pipeline, etc.
>
> Right now I have a small default config, in case no config file is found.. but I could go either way on this, either making it complete or removing it altogether. Anyone have any preference about whether the config file should just override a complete default table, or whether the config file should be mandatory?
>
> The patch won't apply as-is on the gst-openmax tree from freedesktop.org (in our tree we've added component-role and some other stuff), but I'm just sending it as an RFC. If people like the idea, I'll rebase it on current master from fd.o (after cleaning up a couple of quick-n-dirty aspects of the patch).
>
> I've pushed the patch here, if this is an easier way for you to review:
>
> http://gitorious.org/robclark-gstreamer/gst-openmax/commit/4a8e4064c9b698d03ffce735257758cd0b8999f1
>
> and since the patch seems to be too big and caused my original email to bounce, here it the link to the patch:
You didn't give me enough time to moderate it :) The patch doesn't
look too big, I wonder why it was deferred.
Anyway, the only important comment I have for now is that I think the
type should also be configurable (you can use g_type_from_name())
I'm thinking something like:
---
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
---
Oh, and I think the default configuration should be in a separate file.
Cheers.
--
Felipe Contreras
|
|
From: Felipe C. <fel...@gm...> - 2010-02-24 10:37:16
|
On Wed, Feb 24, 2010 at 8:47 AM, Tejas <te...@pi...> wrote: > " [ 160.292694] omapdss MANAGER error: dispc_setup_plane failed for > ovl 1" I'll repeat what I already suggested you: I would add debugging in gst-omapfb to find out what parameters are being used to setup the plane that make it fail. Anyway, gst-omapfb is not part of gst-openmax so this is not the right place to discuss about that. I would use gst-embedded mailing list and CC the beagleboard mailing list too, or maybe even linux-omap. You might also have better luck CC'ing the author of DSS2 Tomi Valkeinen, but he must probably will ask you the same thing: what is gst-omapfb trying to do before you get that error message? -- Felipe Contreras |
|
From: Tejas <te...@pi...> - 2010-02-24 08:16:44
|
Hello All, I would like to explain steps followed by me. 1. Boot argument is as followed. " setenv bootargs 'console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait omapfb.mode=dvi:1280x720MR-32@60 vram=12M omapfb.vram=0:2M,1:4M' " 2. let system boot properly. 3. open totem media player and make it full screen. 4. open video conetent of size 640x480. And its playback is perfect. 5. During the playback of video file, if I restore down the fullscreen, there is no frame is displayed instead only blue screen, instead playback is continue. And I am getting following error on my hyperterminal " [ 160.292694] omapdss MANAGER error: dispc_setup_plane failed for ovl 1" The totem movie player which is in my image is of version 2.24.2 and it is not having playbin2. Please try to help me to resolve this issue. -Tejas. -----Original Message----- From: Tim-Philipp Müller [mailto:t....@ze...] Sent: Tuesday, February 23, 2010 8:41 PM To: gst...@li... Subject: Re: [Gstreamer-openmax] AV Sync with Gst-OpenMax pluggin On Tue, 2010-02-23 at 09:00 -0600, Clark, Rob wrote: > could you patch totem to use playbin2? For most part, you just have to > replace "playbin" with "playbin2". > > the native-video and native-audio flags on playbin2 result in a more > embedded friendly pipeline.. that alone is worth the switch No patching needed, just use a recent versions of totem. Cheers -Tim ---------------------------------------------------------------------------- -- Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Gstreamer-openmax mailing list Gst...@li... https://lists.sourceforge.net/lists/listinfo/gstreamer-openmax |
|
From: Rob C. <ro...@ti...> - 2010-02-24 01:02:47
|
On Feb 23, 2010, at 4:16 PM, Stephen M. Webb wrote: > On 23/02/10 15:09, Felipe Contreras wrote: >> On Tue, Feb 23, 2010 at 4:45 PM, Stephen M. Webb <ste...@xa...> > wrote: >>> >>> What I would want is some way to expose more properties via gst-openmax, >>> at runtime. I use gst-openmax to integrate various hardware codecs from >>> different vendors, each one with a different set of properties that may >>> need to be tweaked. The more I can keep generic and as a single binary, >>> the happier I am. And the easier it will be to push everything upstream. >> >> I'm not sure exactly what properties you might need. The only one I'm >> aware of is TI's "OMX.TI.VideoDecode.Param.WMVFileType" which is >> needed because the spec is missing something similar. And this one >> cannot be properly set with a configuration file, it has to be set >> programatically based on the fourcc/fomat caps. > > I have one hardware vendor who does the same thing with WVC1 vs. WMV3 formats, > only uses a different parameter name. They also have a parameter to enable > the use of hardware buffering -- effectively tunnelling, only tunnelled from > their video decoder to the gstreamer-based video renderer. Evidently there > are other parameters but their documentation is, ah, terse. > > I think what I would really like to be able to do is to be able to set OpenMAX > parameters via GStreamer properties, not through a config file. As long as > the gst-openmax layer is configured to load the right component > (introspection or configuration), if I can query and set OpenMAX parameters > via GStreamer properties I could move most of the hardware-specific settings > into my player software. > > Hmm, I will think about this. It doesn't sound too hard.... > >> Yeah, that's definitely not ideal but it would be nice to know exactly >> what are the differences each platform needs so that we know how to >> build a binary that works on all those platforms with a proper >> configuration file. > > Among the things I have to configure are the OMX_ALLOCATE_ON settings and the > fourcc caps supported by the video decoders. > buffer mode per port (use vs allocate, and whether buffer sharing is enabled) would be nice.. For supported color formats, I did experiment with a trick of trying a SetParam with each different color format and seeing for which ones it returned an error code. Of course an introspection API for OMX would be more ideal. But assuming your OMX implementation wasn't *too* horrible, that could be an option.. BR, -R |
|
From: Stephen M. W. <ste...@xa...> - 2010-02-23 22:04:03
|
On 23/02/10 15:09, Felipe Contreras wrote: > On Tue, Feb 23, 2010 at 4:45 PM, Stephen M. Webb <ste...@xa...> wrote: > > > > What I would want is some way to expose more properties via gst-openmax, > > at runtime. I use gst-openmax to integrate various hardware codecs from > > different vendors, each one with a different set of properties that may > > need to be tweaked. The more I can keep generic and as a single binary, > > the happier I am. And the easier it will be to push everything upstream. > > I'm not sure exactly what properties you might need. The only one I'm > aware of is TI's "OMX.TI.VideoDecode.Param.WMVFileType" which is > needed because the spec is missing something similar. And this one > cannot be properly set with a configuration file, it has to be set > programatically based on the fourcc/fomat caps. I have one hardware vendor who does the same thing with WVC1 vs. WMV3 formats, only uses a different parameter name. They also have a parameter to enable the use of hardware buffering -- effectively tunnelling, only tunnelled from their video decoder to the gstreamer-based video renderer. Evidently there are other parameters but their documentation is, ah, terse. I think what I would really like to be able to do is to be able to set OpenMAX parameters via GStreamer properties, not through a config file. As long as the gst-openmax layer is configured to load the right component (introspection or configuration), if I can query and set OpenMAX parameters via GStreamer properties I could move most of the hardware-specific settings into my player software. Hmm, I will think about this. It doesn't sound too hard.... > Yeah, that's definitely not ideal but it would be nice to know exactly > what are the differences each platform needs so that we know how to > build a binary that works on all those platforms with a proper > configuration file. Among the things I have to configure are the OMX_ALLOCATE_ON settings and the fourcc caps supported by the video decoders. -- Stephen M. Webb Xandros ste...@xa... www.xandros.com |
|
From: Felipe C. <fel...@gm...> - 2010-02-23 20:09:20
|
On Tue, Feb 23, 2010 at 4:45 PM, Stephen M. Webb <ste...@xa...> wrote: > On 22/02/10 12:05, Clark, Rob wrote: >> On Feb 22, 2010, at 10:47 AM, Stephen M. Webb wrote: >> > >> > Another thing that came up recently was the ability to specify some >> > OpenMAX parameters with default values on a per-plugin basis. Even >> > better, some way to specify rules for different parameters values to >> > handle cases such as the WMVFileType setting for the TI video decoder. >> >> would it be sufficient to (a) expose more setting via properties, and (b) >> have some generic (not specific to gst-openmax) way to config default >> values for element's properties > > What I would want is some way to expose more properties via gst-openmax, at > runtime. I use gst-openmax to integrate various hardware codecs from > different vendors, each one with a different set of properties that may need > to be tweaked. The more I can keep generic and as a single binary, the > happier I am. And the easier it will be to push everything upstream. I'm not sure exactly what properties you might need. The only one I'm aware of is TI's "OMX.TI.VideoDecode.Param.WMVFileType" which is needed because the spec is missing something similar. And this one cannot be properly set with a configuration file, it has to be set programatically based on the fourcc/fomat caps. Other than that it might make sense to add a quirks list that can be configurable. I've tried to send patches to TI to fix their implementation but I don't think that's ever going to happen. Other implementations might make similar mistakes... not sure. > Because of the need for compile-time differentiation, I currently end up > building everything multiple times, once for each hardware platform. That > gives a fine end result but sure makes my life more difficult. Yeah, that's definitely not ideal but it would be nice to know exactly what are the differences each platform needs so that we know how to build a binary that works on all those platforms with a proper configuration file. I'm only aware of bellagio (doesn't need any quirks), TI (needs quirks at least for video components), and I know a bit about Android's OpenCore, but haven't yet managed to get anything done with that. Cheers. -- Felipe Contreras |
|
From: Tim-Philipp M. <t....@ze...> - 2010-02-23 15:10:53
|
On Tue, 2010-02-23 at 09:00 -0600, Clark, Rob wrote: > could you patch totem to use playbin2? For most part, you just have to > replace "playbin" with "playbin2". > > the native-video and native-audio flags on playbin2 result in a more > embedded friendly pipeline.. that alone is worth the switch No patching needed, just use a recent versions of totem. Cheers -Tim |
|
From: Clark, R. <ro...@ti...> - 2010-02-23 15:00:25
|
could you patch totem to use playbin2? For most part, you just have to replace "playbin" with "playbin2". the native-video and native-audio flags on playbin2 result in a more embedded friendly pipeline.. that alone is worth the switch BR, -R On Feb 22, 2010, at 11:10 PM, Tejas wrote: > Hi Felipe, > With help of playbin2 also I am able to run all HD video content by following commands. > > $ gst-launch-0.10 playbin2 uri=file:///648x480.mp4 > > $ gst-launch-0.10 playbin2 uri=file:///1280x720.mp4 > > I have taken debug log of totem playback, it is creating bin as playbin only. > > totem --gst-debug=GST_ELEMENT_*:3 --play /media/mmcblk0p1/Movie.mp4 > > It is using playbin only. And the kernel image which I am using is having DSS2. > > I have added "omapfb.vram=0:2M,1:4M" argument to my boot argument. Still I am getting "omapdss MANAGER error: dispc_setup_plane failed for ovl 1" error > > > -Tejas. > > -----Original Message----- > From: Felipe Contreras [mailto:fel...@gm...] > Sent: Monday, February 22, 2010 5:39 PM > To: Tejas > Cc: Stefan Kost; gst...@li... > Subject: Re: [Gstreamer-openmax] AV Sync with Gst-OpenMax pluggin > > On Mon, Feb 22, 2010 at 2:00 PM, Tejas <te...@pi...> wrote: >> Hello Felipe, >> As I was not able to play any video content with the help of omapfbsink plugin. Later I found that memory from frame buffer 1 was not mapped , because memory for fb1 has not been allocated. After my system of beagle board boots I am running following commands to allocate memory. >> >> My boot args is as followed. >> >> "setenv bootargs 'console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait omapfb.mode=dvi:1280x720MR-32@60 vram=12M'" > > I add "omapfb.vram=0:2M,1:4M". I'm not sure if you need that in recent DSS2. > >> $echo 8000000 > /sys/class/graphics/fb1/size >> $fbset -fb /dev/fb1 -nonstd 1 >> $echo "1" > /sys/devices/platform/omapdss/overlay1/enabled >> $echo "$1,$2" > /sys/devices/platform/omapdss/overlay1/output_size >> $echo "0,0" > /sys/devices/platform/omapdss/overlay1/position >> $fbset -fb /dev/fb0 -xres $1 -yres $2 >> $echo "0,0" > /sys/devices/platform/omapdss/overlay0/position >> $echo "0" > /sys/devices/platform/omapdss/display0/enabled >> $echo "" > /sys/devices/platform/omapdss/manager0/display >> $echo "0" > /sys/devices/platform/omapdss/overlay1/enabled >> $ >> $echo "1" > /sys/devices/platform/omapdss/overlay1/enabled >> $echo "dvi" > /sys/devices/platform/omapdss/manager0/display >> $echo "1" > /sys/devices/platform/omapdss/display0/enabled >> >> I put all these command into one disp.sh file and run it as ./disp.sh 640 480, then 640x480 display comes and rest comes as black. Now I can run following command smoothly. >> >> $gst-launch-0.10 playbin uri=file:///648x480.mp4 > > AFAIK omapfbsink would do most of those sysctl commands. However maybe > you are using and old version of gst-omapfb. > >> After that when I run following command, that display doesn't come properly. That video content is of resolution 1280 x 720. >> >> $gst-launch-0.10 playbin uri=file:///1280x720.mp4 >> >> After that I run ./disp.sh 1280 720 and then run above command I can play video properly. >> >> But when I run 1280 x 720 video file into totem movie player nothing is coming and only blue screen throught entire video play back. After getting log file it gives following error. >> "omapdss MANAGER error: dispc_setup_plane failed for ovl 1" >> >> Can any one guide me to come out this error. > > That's really strange. Totem shouldn't be doing anything different... > well, I't using playbin2 instead of playbin. Can you try that? > > Anyway, I would add debugging in gst-omapfb to find out what > parameters are being used to setup the plane that make it fail. > > Cheers. > > -- > Felipe Contreras > > > ------------------------------------------------------------------------------ > Download Intel® Parallel Studio Eval > Try the new software tools for yourself. Speed compiling, find bugs > proactively, and fine-tune applications for parallel performance. > See why Intel Parallel Studio got high marks during beta. > http://p.sf.net/sfu/intel-sw-dev > _______________________________________________ > Gstreamer-openmax mailing list > Gst...@li... > https://lists.sourceforge.net/lists/listinfo/gstreamer-openmax |
|
From: Stephen M. W. <ste...@xa...> - 2010-02-23 14:33:34
|
On 22/02/10 12:05, Clark, Rob wrote: > On Feb 22, 2010, at 10:47 AM, Stephen M. Webb wrote: > > > > Another thing that came up recently was the ability to specify some > > OpenMAX parameters with default values on a per-plugin basis. Even > > better, some way to specify rules for different parameters values to > > handle cases such as the WMVFileType setting for the TI video decoder. > > would it be sufficient to (a) expose more setting via properties, and (b) > have some generic (not specific to gst-openmax) way to config default > values for element's properties What I would want is some way to expose more properties via gst-openmax, at runtime. I use gst-openmax to integrate various hardware codecs from different vendors, each one with a different set of properties that may need to be tweaked. The more I can keep generic and as a single binary, the happier I am. And the easier it will be to push everything upstream. Because of the need for compile-time differentiation, I currently end up building everything multiple times, once for each hardware platform. That gives a fine end result but sure makes my life more difficult. -- Stephen M. Webb Xandros ste...@xa... www.xandros.com |
|
From: Tejas <te...@pi...> - 2010-02-23 05:08:38
|
Hi Felipe, With help of playbin2 also I am able to run all HD video content by following commands. $ gst-launch-0.10 playbin2 uri=file:///648x480.mp4 $ gst-launch-0.10 playbin2 uri=file:///1280x720.mp4 I have taken debug log of totem playback, it is creating bin as playbin only. totem --gst-debug=GST_ELEMENT_*:3 --play /media/mmcblk0p1/Movie.mp4 It is using playbin only. And the kernel image which I am using is having DSS2. I have added "omapfb.vram=0:2M,1:4M" argument to my boot argument. Still I am getting "omapdss MANAGER error: dispc_setup_plane failed for ovl 1" error -Tejas. -----Original Message----- From: Felipe Contreras [mailto:fel...@gm...] Sent: Monday, February 22, 2010 5:39 PM To: Tejas Cc: Stefan Kost; gst...@li... Subject: Re: [Gstreamer-openmax] AV Sync with Gst-OpenMax pluggin On Mon, Feb 22, 2010 at 2:00 PM, Tejas <te...@pi...> wrote: > Hello Felipe, > As I was not able to play any video content with the help of omapfbsink plugin. Later I found that memory from frame buffer 1 was not mapped , because memory for fb1 has not been allocated. After my system of beagle board boots I am running following commands to allocate memory. > > My boot args is as followed. > > "setenv bootargs 'console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait omapfb.mode=dvi:1280x720MR-32@60 vram=12M'" I add "omapfb.vram=0:2M,1:4M". I'm not sure if you need that in recent DSS2. > $echo 8000000 > /sys/class/graphics/fb1/size > $fbset -fb /dev/fb1 -nonstd 1 > $echo "1" > /sys/devices/platform/omapdss/overlay1/enabled > $echo "$1,$2" > /sys/devices/platform/omapdss/overlay1/output_size > $echo "0,0" > /sys/devices/platform/omapdss/overlay1/position > $fbset -fb /dev/fb0 -xres $1 -yres $2 > $echo "0,0" > /sys/devices/platform/omapdss/overlay0/position > $echo "0" > /sys/devices/platform/omapdss/display0/enabled > $echo "" > /sys/devices/platform/omapdss/manager0/display > $echo "0" > /sys/devices/platform/omapdss/overlay1/enabled > $ > $echo "1" > /sys/devices/platform/omapdss/overlay1/enabled > $echo "dvi" > /sys/devices/platform/omapdss/manager0/display > $echo "1" > /sys/devices/platform/omapdss/display0/enabled > > I put all these command into one disp.sh file and run it as ./disp.sh 640 480, then 640x480 display comes and rest comes as black. Now I can run following command smoothly. > > $gst-launch-0.10 playbin uri=file:///648x480.mp4 AFAIK omapfbsink would do most of those sysctl commands. However maybe you are using and old version of gst-omapfb. > After that when I run following command, that display doesn't come properly. That video content is of resolution 1280 x 720. > > $gst-launch-0.10 playbin uri=file:///1280x720.mp4 > > After that I run ./disp.sh 1280 720 and then run above command I can play video properly. > > But when I run 1280 x 720 video file into totem movie player nothing is coming and only blue screen throught entire video play back. After getting log file it gives following error. > "omapdss MANAGER error: dispc_setup_plane failed for ovl 1" > > Can any one guide me to come out this error. That's really strange. Totem shouldn't be doing anything different... well, I't using playbin2 instead of playbin. Can you try that? Anyway, I would add debugging in gst-omapfb to find out what parameters are being used to setup the plane that make it fail. Cheers. -- Felipe Contreras |