[Gstreamer-openmax] gst-openmax on beagleboard problem

Michiel Verschueren Michiel.Verschueren at dekimo.be
Tue Jul 28 07:37:32 PDT 2009


Hi,

I'm currently evaluating the OMAP3530's video capabilities on a Beagle Board. I'm trying but struggling to get Gstreamer to decode an MPEG4 file. The following pages have been my guide so far: http://elinux.org/BeagleBoard/gst-openmax and http://elinux.org/BeagleBoard/DSP_Howto.

I'm using the linux-omap kernel from Felipe Contreras ("git checkout -b felipec v2.6.28-felipec1", as shown on the wiki pages) and a root file system built using OpenEmbedded (Angstrom); it's a build of the demo beagleboard image by Koen Kooi (http://angstrom-distribution.org/demo/beagleboard/).

I've downloaded the TI OpenMAX IL implementation from here: https://omapzoom.org/gf/project/openmax/frs/. Unlike on the wiki, it's version 0.3.5 instead of 0.3, but I don't expect that to make much difference. I've installed this package and copied the lib/dsp folder to my root file system.

Next, I've built libdspbridge, libomxil-ti and gst-openmax, again following the instructions on the wiki. First I was using Scratchbox 2, but I've switched to OpenEmbedded to build the packages because it's easier for me this way to install the files into my rootfs. This doesn't seem to make any difference (and I wouldn't expect it to). Also, I don't see any difference when I use the OpenEmbedded toolchain or a toolchain I've downloaded from CodeSourcery.

After starting up the target, first I loaded the kernel driver: modprobe bridgedriver base_img=/lib/dsp/baseimage.dof. To test whether the kernel driver works, I used the ping test mentioned on the wiki. This is where the first odd thing happened - I got the following error:
./ping.out: error while loading shared libraries: libbridge.so.2: cannot open shared object file: No such file or directory
I worked around this by making a symlink /lib/libbridge.so.2 to /lib/libbdridge.so. After this workaround, the ping test looked to be working fine:

DSP device detected !!
DSPNodeCreate succeeded
DSPNode_registerNotify succeeded
DSPNode_run succeeded
Ping: Id 1.000000 Msg 0.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 1.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 2.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 3.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 4.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 5.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 6.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 7.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 8.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 9.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 10.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 11.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 12.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 13.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 14.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 15.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 16.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 17.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 18.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 19.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 20.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 21.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 22.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 23.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 24.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 25.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 26.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 27.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 28.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 29.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 30.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 31.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 32.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 33.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 34.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 35.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 36.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 37.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 38.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 39.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 40.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 41.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 42.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 43.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 44.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 45.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 46.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 47.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 48.000000 Mem 2407472.000000
Ping: Id 1.000000 Msg 49.000000 Mem 2407472.000000

This is where the real trouble starts. I want to set up a gstreamer pipeline to decode the video. When I run "gst-inspect | grep 'omx'", I get the following output:

omx:  omx_volume: OpenMAX IL Volume component
omx:  omx_filereadersrc: OpenMAX IL filereader src element
omx:  omx_videosink: OpenMAX IL videosink element
omx:  omx_audiosink: OpenMAX IL audiosink element
omx:  omx_jpegenc: OpenMAX IL JPEG image encoder
omx:  omx_ilbcenc: OpenMAX IL iLBC audio encoder
omx:  omx_ilbcdec: OpenMAX IL iLBC audio decoder
omx:  omx_g729enc: OpenMAX IL G.729 audio encoder
omx:  omx_g729dec: OpenMAX IL G.729 audio decoder
omx:  omx_g711enc: OpenMAX IL G.711 audio encoder
omx:  omx_g711dec: OpenMAX IL G.711 audio decoder
omx:  omx_adpcmenc: OpenMAX IL ADPCM audio encoder
omx:  omx_adpcmdec: OpenMAX IL ADPCM audio decoder
omx:  omx_aacenc: OpenMAX IL AAC audio encoder
omx:  omx_aacdec: OpenMAX IL AAC audio decoder
omx:  omx_amrwbenc: OpenMAX IL AMR-WB audio encoder
omx:  omx_amrwbdec: OpenMAX IL AMR-WB audio decoder
omx:  omx_amrnbenc: OpenMAX IL AMR-NB audio encoder
omx:  omx_amrnbdec: OpenMAX IL AMR-NB audio decoder
omx:  omx_mp2dec: OpenMAX IL MP2 audio decoder
omx:  omx_mp3dec: OpenMAX IL MP3 audio decoder
omx:  omx_vorbisdec: OpenMAX IL Vorbis audio decoder
omx:  omx_h263enc: OpenMAX IL H.263 video encoder
omx:  omx_h264enc: OpenMAX IL H.264/AVC video encoder
omx:  omx_mpeg4enc: OpenMAX IL MPEG-4 video encoder
omx:  omx_wmvdec: OpenMAX IL WMV video decoder
omx:  omx_h263dec: OpenMAX IL H.263 video decoder
omx:  omx_h264dec: OpenMAX IL H.264/AVC video decoder
omx:  omx_mpeg4dec: OpenMAX IL MPEG-4 video decoder
omx:  omx_dummy: OpenMAX IL dummy element

Which seems fine to me. When I run "gst-launch-0.10 filesrc location=./test.mp4 ! omx_mpeg4dec ! filesink location=/dev/null", I expect that decoder would decode the video and dump data in the null device. However, I get the following error:

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
gst-launch-0.10: symbol lookup error: /lib/libLCML.so: undefined symbol: DspManager_Open

After some observation of the source code and binaries, I believe that DspManager_Open is defined in my /lib/libbridge.so file. The LCML lib for some reason can't find it. To me, the odd thing here is that the ping test worked, but that gstreamer complains about DspManager_Open. If I have understood the DSP/BIOS documentation correctly, it's impossible to create a dsp node without having opened the manager. But the ping test is able to open a node without complaining about DspManager_Open. I'm baffled.

Can anyone clarify? Am I missing something? Am I doing something wrong here? If you need more information from my part, please ask.

Thanks very much in advance




More information about the Gstreamer-openmax mailing list