Luma -> Alpha with v1.18

amindfv at mailbox.org amindfv at mailbox.org
Mon Jan 10 10:55:09 UTC 2022


On Mon, Jan 10, 2022 at 10:41:12AM +0100, Florian Echtler wrote:
> On 10/01/2022 10:36, amindfv at mailbox.org wrote:
> > On Mon, Jan 10, 2022 at 09:48:26AM +0100, Florian Echtler wrote:
> > > On 10/01/2022 09:21, amindfv at mailbox.org wrote:
> > > > On Sun, Jan 09, 2022 at 12:33:24PM -0800, amindfv at mailbox.org wrote:
> > > > 
> > > > Here's my latest, boiled down to a simple example. I hope my inexperienced attempts aren't too horrifying, or if so they're easy enough to get on the right track.
> > > > 
> > > > I've built the .so file, which is in the current directory. I then launch a hello world pipeline (unrelated to the new plugin), and hit an error loading the .so:
> > > > 
> > > >       $ GST_PLUGIN_PATH=$GST_PLUGIN_PATH:. gst-launch-1.0 videotestsrc ! autovideosink
> > > >       (gst-plugin-scanner:149635): GStreamer-WARNING **: 00:02:44.715: Failed to load plugin './libgstalphacombine.so': ./libgstalphacombine.so: undefined symbol: gst_video_info_init
> > > >       Setting pipeline to PAUSED ...
> > > >       Pipeline is PREROLLING ...
> > > >       Pipeline is PREROLLED ...
> > > >       Setting pipeline to PLAYING ...
> > > > 
> > > > gstalphacombine.c contains "#include <gst/video/video.h>", which in turn includes gst/video/video-info.h. In other words, gst_video_info_init "shouldn't" be undefined.
> > > 
> > > It's defined for compile time, but apparently not for link time (which is
> > > partially deferred until the library is actually loaded in this case).
> > 
> > Thanks for the fast reply!
> > 
> > > You can check with `ldd ./libgstalphacombine.so` whether there's just a
> > > library path missing at load time;
> > 
> > Here's the output; seems to my untrained eye not to be missing anything:
> > 
> >      $ ldd ./libgstalphacombine.so
> >      linux-vdso.so.1 (0x00007ffdbeded000)
> >      libgstreamer-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0 (0x00007f75529fa000)
> >      libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f75529a0000)
> >      libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f7552871000)
> >      libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f755286b000)
> >      libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7552727000)
> >      libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7552721000)
> >      libunwind.so.8 => /usr/lib/x86_64-linux-gnu/libunwind.so.8 (0x00007f7552704000)
> >      libdw.so.1 => /usr/lib/x86_64-linux-gnu/libdw.so.1 (0x00007f755265b000)
> >      libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7552639000)
> >      libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7552474000)
> >      libffi.so.7 => /usr/lib/x86_64-linux-gnu/libffi.so.7 (0x00007f7552468000)
> >      libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f75523f5000)
> >      /lib64/ld-linux-x86-64.so.2 (0x00007f7552b8b000)
> >      liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f75523cb000)
> >      libelf.so.1 => /usr/lib/x86_64-linux-gnu/libelf.so.1 (0x00007f75523b0000)
> >      libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7552393000)
> >      libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f7552380000)
> 
> Yes, this looks okay, but...
> 
> > > if this is not the case, then you would
> > > need to modify your compiler flags to include whatever GStreamer sub-library
> > > contains gst_video_info_init.
> > 
> > The Makefile includes
> > 
> >      -I/usr/include/gstreamer-1.0
> > 
> > and /usr/include/gstreamer-1.0/gst/video/video-info.h appears to define `gst_video_info_init`.
> 
> I think you also need to add `-lgstvideo-1.0` to the link step (where all
> the other -lgst... options are defined).

Yes, that was it - thank you!

I'm now able to, seemingly, load the .so file, but GStreamer doesn't seem to recognize the plugin:

    $ GST_PLUGIN_PATH=$GST_PLUGIN_PATH:. gst-launch-1.0 videotestsrc ! alphacombine ! autovideosink # obviously this isn't a real pipeline
    WARNING: erroneous pipeline: no element "alphacombine"
    $ GST_PLUGIN_PATH=$GST_PLUGIN_PATH:. gst-inspect-1.0 alphacombine
    No such element or plugin 'alphacombine'

Could it be related to the symbols the .so exports?:

    $ nm -D --defined-only libgstalphacombine.so
    0000000000006220 D format_map
    0000000000002830 T gst_alpha_combine_get_type

I notice for the installed plugins there seem to be a uniform (and different) set of symbols:

    $ nm -D --defined-only /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstalpha.so
    000000000000a670 T gst_plugin_alpha_get_desc
    000000000000a680 T gst_plugin_alpha_register
    $ nm -D --defined-only /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstcompositor.so
    000000000000cee0 T gst_plugin_compositor_get_desc
    000000000000cef0 T gst_plugin_compositor_register

I managed to get the `*_get_desc` and `*_register` symbols exported by copying from gstplugin.c, but clearly I'm still taking shots in the dark, and not yet successfully:

    #ifndef PACKAGE
    #define PACKAGE "jankyalphacombine"
    #endif

    GST_PLUGIN_DEFINE (
        GST_VERSION_MAJOR,
        GST_VERSION_MINOR,
        alpha_combine,
        "alphacombine thing",
        gst_alpha_combine_init,
        "1.0.0",
        "LGPL",
        "GStreamer",
        "http://gstreamer.net/"
    )

Thanks,
Tom


More information about the gstreamer-devel mailing list