winegstreamer: Avoid Fedora and openSUSE?

Francois Gouget fgouget at free.fr
Mon May 25 05:31:18 CDT 2020


On Sun, 24 May 2020, Zebediah Figura wrote:
[...]
> Yes, this is correct. winegstreamer doesn't use tool programs at all, and
> libgstreamer doesn't depend on them either.

Whether winegstreamer uses the tool programs or not is a red herring. 
The GStreamer tools just provide a 3 lines 32-bit process testcase. But 
we can also got the hard way to reproduce this problem:

winegstreamer needs gst_element_factory_make() to work. From various 
functions in dlls/winegstreamer/gstdemux.c:
        if (!(vconv = gst_element_factory_make("videoconvert", NULL)))
        if (!(convert = gst_element_factory_make("audioconvert", NULL)))
    GstElement *element = gst_element_factory_make("decodebin", NULL);


So let's test this out in a simple 32-bit program:

----- checkgst.c -----
/* gcc -m32 -o checkgst32 `PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig:/usr/lib/pkgconfig pkg-config --cflags --libs gstreamer-1.0` checkgst.c
 */
#include <stdio.h>
#include <string.h>
#include <gst/gst.h>

static void check_gstreamer_element(const char *name)
{
    GstElement *element = gst_element_factory_make(name, NULL);
    if (element)
    {
        printf("found %s\n", name);
        gst_object_unref(element);
    }
    else
        printf("could not instantiate %s\n", name);
}

int main(int argc, char** argv)
{
    gst_init(&argc, &argv);
    printf("Bitness: %d bits\n", sizeof(long) * 8);
    check_gstreamer_element("h264parse");    /* gstreamer-plugins-bad */
    check_gstreamer_element("videoconvert"); /* gstreamer-plugins-base */
    check_gstreamer_element("vp8dec");       /* gstreamer-plugins-good */
    check_gstreamer_element("mpeg2dec");     /* gstreamer-plugins-ugly */
    return 0;
}
----- checkgst.c -----

Just as a note for myself, from a clean install one needs the 
following packages to compile it:

# dnf install glibc-devel.x86_64 glibc-devel.i686
# dnf install gstreamer1-devel.x86_64 gstreamer1-devel.i686
# # In fact we really only need one plugin package
# dnf install gstreamer1-plugins-base.i686 gstreamer1-plugins-good.i686
# dnf install gstreamer1-plugins-bad-free.i686 gstreamer1-plugins-ugly-free.i686

And do a 32-bit test:

$ gcc -m32 -o checkgst32 `PKG_CONFIG_PATH=/usr/lib/pkgconfig pkg-config --cflags --libs gstreamer-1.0` checkgst.c
$ ./checkgst32
Bitness: 32 bits
could not instantiate h264parse
could not instantiate videoconvert
could not instantiate vp8dec
could not instantiate mpeg2dec

Let's try again with a 64-bit binary to make sure this program can 
actually work:

$ gcc -o checkgst64 `pkg-config --cflags --libs gstreamer-1.0` checkgst.c
$ ./checkgst64
Bitness: 64 bits
found h264parse
found videoconvert
found vp8dec
found mpeg2dec

And a last check to pinpoint the source of the problem:

$ mv ~/.cache/gstreamer-1.0/registry.i686.bin ~/.cache/gstreamer-1.0/registry.i686.bin.sav
$ ./checkgst32
(gst-plugin-scanner:7151): GStreamer-WARNING **: 12:12:57.971: Failed to 
load plugin '/usr/lib/gstreamer-1.0/libgstdvb.so': 
/usr/lib/gstreamer-1.0/libgstdvb.so: wrong ELF class: ELFCLASS32

(gst-plugin-scanner:7151): GStreamer-WARNING **: 12:12:57.971: Failed to 
load plugin '/usr/lib/gstreamer-1.0/libgstvideo4linux2.so': 
/usr/lib/gstreamer-1.0/libgstvideo4linux2.so: wrong ELF class: 
ELFCLASS32
[...]
Bitness: 32 bits
could not instantiate h264parse
could not instantiate videoconvert
could not instantiate vp8dec
could not instantiate mpeg2dec


As for where gst-plugin-scanner comes from and why 
gst_element_factory_make() may need it, I'll point you to the bug 
report:

https://bugzilla.redhat.com/show_bug.cgi?id=1472160


(and then we can debate whether gst-plugin-scanner is a GStreamer 
command line tool and whether that means winegstreamer does depend on 
GStreamer command line tools)

-- 
Francois Gouget <fgouget at free.fr>              http://fgouget.free.fr/
     Linux, WinNT, MS-DOS - also known as the Good, the Bad and the Ugly.



More information about the wine-devel mailing list