opencv / opencv

Open Source Computer Vision Library
https://opencv.org
Apache License 2.0
75.95k stars 55.62k forks source link

Implemented optional EGL based GL/CL interop #22704

Open kallaballa opened 1 year ago

kallaballa commented 1 year ago

The pertaining issue: https://github.com/opencv/opencv/issues/22703

Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

asmorkalov commented 1 year ago

OpenCV may use GLX for several purposes:

kallaballa commented 1 year ago

OpenCV may use GLX for several purposes:

  • Rendering itself in highgui
  • OpenGL interop in core with cv::Mat
  • OpenGL interop for CUDA and OpenCL
  • Indirect interop in context of video codecs EGL integration is useful, but should be optional on CMake level.

But why would you use GLX if you already have EGL (e.g. for android CL/GL interop). Could you please explain a use case where having EGL & GLX provides a benefit? Because all of those things (and more... e.g. offscreen rendering) can be done with EGL.

asmorkalov commented 1 year ago

Let's say, historical reason. Some code was contributed long time ago and not developed actively. I'm not against of EGL, but prefer safe way - not destroy existing features.

kallaballa commented 1 year ago

I see now what you mean. There is another place where GLX is used: https://github.com/opencv/opencv/blob/778faddbd8e997af57202cf4fe633d54f538fe93/modules/core/src/gl_core_3_1.cpp#L131

Anyway, I understand your point but on the other hand I wouldn't mind also replacing the CV_GL_GET_PROC_ADDRESS implementation and be done with GLX. :)

kallaballa commented 1 year ago

Anyway... even if you don't want to replace GLX completely, this pull request still makes sense. Replacing GLX with EGL for OpenGL interop brings many advantages, like:

kallaballa commented 1 year ago
  • EGL integration is useful, but should be optional on CMake level.

I understand now. and will implement it like that.

kallaballa commented 1 year ago

Done de6bb169928dc17aa04a53e150cb674f25c4e971

kallaballa commented 1 year ago

I improved the implementation by defining a proper OCV_OPTION OPENCV_ENABLE_EGL_INTEROP that is OFF by default and depends on WITH_OPENGL. if OPENCV_ENABLE_EGL_INTEROP is ON then the compile flag -DHAVE_EGL_INTEROP for the file modules/core/src/opengl.cpp is set which in turn enables EGL-based OpenGL-interop.

kallaballa commented 1 year ago

I thought about it and maybe it would be a good idea to infer which window-system API (GLX or EGL) to use by probing eglGetCurrentContext() and glXGetCurrentContext() but only if HAVE_EGL_INTEROP. That way both systems can be supported. What do you think?

asmorkalov commented 1 year ago

I tried both branches on my Ubuntu 18.04 host. Both implementations work, but final executable has significantly different dependencies. I do not think that dependency from both libEGL and libGLX is good idea.

asmorkalov commented 1 year ago

Also not all Linux systems provide EGL support. Please check OpenGL_EGL_FOUND beforehand: https://cmake.org/cmake/help/latest/module/FindOpenGL.html

kallaballa commented 1 year ago

Also not all Linux systems provide EGL support. Please check OpenGL_EGL_FOUND beforehand: https://cmake.org/cmake/help/latest/module/FindOpenGL.html

Alright!

I tried both branches on my Ubuntu 18.04 host. Both implementations work, but final executable has significantly different dependencies. I do not think that dependency from both libEGL and libGLX is good idea.

I understand your intuition in this (I had the same) but since i really want this feature i went to find evidence. ;)

First i tried to find examples of libraries on my system linking to both

find /usr/lib64/ -maxdepth 1 -name "*.so" | while read lib; do
    deps="$(sudo ldd "$lib" 2>/dev/null | tr -d '\n')"; 
    echo "$deps" | grep -q -E "libGLX.so.*libEGL.so|libEGL.so.*libGLX.so"; 
    if [ $? -eq 0 ]; then 
        echo "$lib"; 
    fi; 
done

And i found the following files:

/usr/lib64/libshotwell-authenticator.so
/usr/lib64/libshotwell-plugin-common.so
/usr/lib64/libshotwell-plugin-dev-1.0.so
/usr/lib64/libpangocairo-1.0.so
/usr/lib64/liblibreofficekitgtk.so
/usr/lib64/libgailutil.so
/usr/lib64/libgdk-x11-2.0.so
/usr/lib64/libgtk-x11-2.0.so
/usr/lib64/librsvg-2.so
/usr/lib64/libgailutil-3.so
/usr/lib64/libcairomm-1.0.so
/usr/lib64/libpangomm-1.4.so
/usr/lib64/libgdkmm-2.4.so
/usr/lib64/libgtkmm-2.4.so
/usr/lib64/libgdkmm-3.0.so
/usr/lib64/libgtkmm-3.0.so
/usr/lib64/libcairomm-1.16.so
/usr/lib64/libpangomm-2.48.so
/usr/lib64/libgtk-4.so
/usr/lib64/libgtkmm-4.0.so
/usr/lib64/libglade-2.0.so
/usr/lib64/libgladeui-2.so
/usr/lib64/libadwaita-1.so
/usr/lib64/libgnome-bluetooth-ui-3.0.so
/usr/lib64/libgdk-3.so
/usr/lib64/libgtk-3.so
/usr/lib64/libgimp-2.0.so
/usr/lib64/libgimpcolor-2.0.so
/usr/lib64/libgimpconfig-2.0.so
/usr/lib64/libgimpmodule-2.0.so
/usr/lib64/libgimpui-2.0.so
/usr/lib64/libgimpwidgets-2.0.so
/usr/lib64/libgstgl-1.0.so
/usr/lib64/libcairo-gobject.so
/usr/lib64/libcairo-script-interpreter.so
/usr/lib64/libcairo.so
/usr/lib64/libQt5EglFSDeviceIntegration.so
/usr/lib64/libQt5EglFsKmsSupport.so
/usr/lib64/libgdkglext-x11-1.0.so
/usr/lib64/libgtkglext-x11-1.0.so
/usr/lib64/libavahi-ui-gtk3.so
/usr/lib64/libperf-gtk.so

So at least somebody is actively linking EGL and GLX at the same time. But what struck my eye quickly is that it's mostly GTK stack.... So i went to search in their repo and found this: https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/3540

They are basically using GLX as a fallback to EGL.

kallaballa commented 1 year ago

Half a year later firefox did the same: https://mozillagfx.wordpress.com/2021/10/30/switching-the-linux-graphics-stack-from-glx-to-egl/

Btw. I just realized I left -maxdepth 1 in my find command. There are more examples.

asmorkalov commented 1 year ago

Thanks a lot for the research! Could you check if the GTK stack does lazy linkage with EGL and GLX?

kallaballa commented 1 year ago

I am on it :)

kallaballa commented 1 year ago

I have following statement from a GTK developer: "EGL has issues with properly reporting the RGBA VIsual, which is why GTK defaults to GLX. You can often just force the RGBA Visual and it'll work, but GTK isn't doing that yet (Firefox and Chrome switched recently I think, maybe it got fixed or there's a an official way, didn't investigate yet) in any case: GTK does pick one or the other at startup and then disallows the other."

About the exact circumstances of linking i still have to investigate and I am also going to branch out to the Firefox community and see if they have advice.

kallaballa commented 1 year ago

GTK doesn't do any special linking but has routines for probing the subsystems and only uses one at the time: https://gitlab.gnome.org/GNOME/gtk/-/blob/main/gdk/x11/gdkdisplay-x11.c#L2947 https://gitlab.gnome.org/GNOME/gtk/-/blob/main/gdk/gdkdisplay.c#L1638 https://gitlab.gnome.org/GNOME/gtk/-/blob/main/gdk/x11/gdkglcontext-glx.c#L883 https://gitlab.gnome.org/GNOME/gtk/-/blob/main/gdk/gdkglcontextprivate.h#L52

kallaballa commented 1 year ago

Statement from a Firefox dev: "Hi! So unfortunately Mesas X11 EGL implementation still has some open issues (e.g. https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9989 ....) which is why GTK4 still falls back to GLX. Generally GTK4 and OBS-Studio might be simpler examples than FF."

kallaballa commented 1 year ago

Also not all Linux systems provide EGL support. Please check OpenGL_EGL_FOUND beforehand: https://cmake.org/cmake/help/latest/module/FindOpenGL.html

There is no check for GLX in place either (as far as i can see). Can't hurt to add that too?

kallaballa commented 1 year ago

Also not all Linux systems provide EGL support. Please check OpenGL_EGL_FOUND beforehand: https://cmake.org/cmake/help/latest/module/FindOpenGL.html

Done 735a0f2

There is no check for GLX in place either (as far as i can see). Can't hurt to add that too?

Done 49f64dd

kallaballa commented 1 year ago

Based on my experiments with #22836 i decided to use GLVND for now and created an experimental branch that supports:

I built all three variants, verified with ldd that dependencies of libopencv_core.so are linked as expected and did some experiments including running a program using CL/GL (through EGL), CL/VA and highgui (imshow based on QT - with and without OpenGL). I have yet to test GTK and Wayland

kallaballa commented 1 year ago

I have following statement from a GTK developer: "EGL has issues with properly reporting the RGBA VIsual, which is why GTK defaults to GLX. You can often just force the RGBA Visual and it'll work, but GTK isn't doing that yet (Firefox and Chrome switched recently I think, maybe it got fixed or there's a an official way, didn't investigate yet) in any case: GTK does pick one or the other at startup and then disallows the other."

Statement from a Firefox dev: _"Hi! So unfortunately Mesas X11 EGL implementation still has some open issues (e.g. https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9989 ....) which is why GTK4 still falls back to GLX. Generally GTK4 and OBS-Studio might be simpler examples than FF."_

Btw. those problems can only arise in the user-code, not as part of OpenCV, because OpenCV doesn't deal with setting up EGL configs & visuals.

kallaballa commented 1 year ago

I have yet to test GTK and Wayland

After a fix to the build (going to make a pull request) I was able to test GTK2/OpenGL in conjunction with GLVND and the three build combinations (GLX, EGL+GLX, EGL). Note that the EGL-only build does not work for GTK2/OpenGL because it depends on GLX. That still needs to be reflected in the build.

kallaballa commented 1 year ago

including running a program using CL/GL (through EGL), CL/VA and highgui (imshow based on QT - with and without OpenGL).

That said: I did manage to have CL/GL and QT/OpenGL work side by side but it is finicky because you have to very carefully setup the GL-states for both subsystems. I think It might be a good idea to discourage it or even prohibit it (e.g.: through an exception) or have extensive documentation on the internals of QT/OpenGL (e.g. which GL-states are touched). The same goes for GTK2/OpenGL but I was not able to test side by side operation because GTK2 requires GLX.

kallaballa commented 1 year ago

I you don't have any tests to add, that I can run or write, I am at the conclusion:

asmorkalov commented 1 year ago

Your experimental and PR branches look very interesting. OpenCV core team will discuss the options on meeting, make some tests and I'll come back with some solution. Thanks a lot for research and experiments!

kallaballa commented 1 year ago

Great!

asmorkalov commented 1 year ago

Related work:

kallaballa commented 1 year ago

I added proper build options to the experimental branch. OPENCV_ENABLE_EGL and OPENCV_ENABLE_GLX. Default is "ON" for both.

asmorkalov commented 1 year ago

@dmatveev Please take a look.

kallaballa commented 1 year ago

I tested wayland with all three build variants and QT. I couldn't find any problems and my optflow-demo (video rendering) performs considerably faster. I have yet to test (and understand) GTK2/GTK3 with wayland. I don't try to make CL/GL and highgui-OpenGL work at the same time anymore.

kallaballa commented 1 year ago

Just to know if i should wait or start something new: How long might the discussion process take? Also, if there's something in the way of this PR I am willing to invest considerable time to make it still happen. :)

asmorkalov commented 1 year ago

@kallaballa Please be patient. I involved most of stakeholders to the discussion. Hopefully will decided this Friday.

kallaballa commented 1 year ago

No problem! Thanks for the quick answer!

kallaballa commented 1 year ago

I tested wayland with all three build variants and QT. I couldn't find any problems and my optflow-demo (video rendering) performs considerably faster.

While waiting I've continued to work on my demos. I created a simpler interop-API and GUI support based on nanogui.

Fullscreen mode is not properly displayed in the video (because it assumes a fixed rectangle) while it works fine (tested on GNOME/X11, GNOME/Wayland, XFCE and awesome). btw. I forgot to demo in the screen cast that the form is moveable inside the window.

Would OpenCV be interested in a OpenGL-only gui backend?

kallaballa commented 1 year ago

Oh and i forgot. I moved the demo code implementation to GLFW3. no more direct EGL and X11 calls.

kallaballa commented 1 year ago

Had time to review it myself and there are some issues. For example, the OpenGL detection in the build (which is not cross-platform yet) but I haven't found anything critical. I am using it all the time.

kallaballa commented 1 year ago

Would it disrupt the review/discussion if i converted this PR to a draft and fix the issues I found?

kallaballa commented 1 year ago

Any news? Anything I can do for this PR?

kallaballa commented 1 year ago

Another good reason for this PR. CL-GL sharing will be back on Linux: https://github.com/intel/compute-runtime/pull/611 but it only works with EGL.

kallaballa commented 11 months ago

With the release of Intel compute-runtime 23.13.26032.30 CL/GL interop starts to resurface on Intel(Gen8-Gen12)/Linux systems. e.g.: openSUSE Tumbleweed already ships it. The CL/GL interop implementation supports EGL only.

kallaballa commented 7 months ago

I have now two computers at hands:

I can run the exact same binaries on both machines although intel-compute-runtime requires EGL for CLGL and NVIDIA requires GLX for CLGL.

My build configuration:

-- General configuration for OpenCV 4.8.0-dev =====================================
--   Version control:               58561260cd-dirty
-- 
--   Extra modules:
--     Location (extra):            /home/elchaschab/devel/v4d/modules
--     Version control (extra):     0.0.5-alpha-111-g35f889af-dirty
-- 
--   Platform:
--     Timestamp:                   2023-09-24T22:50:20Z
--     Host:                        Linux 6.5.4-1-default x86_64
--     CMake:                       3.27.2
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/gmake
--     Configuration:               Debug
-- 
--   CPU/HW features:
--     Baseline:                    SSE SSE2 SSE3
--       requested:                 SSE3
--     Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
--       requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
--       SSE4_1 (14 files):         + SSSE3 SSE4_1
--       SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
--       FP16 (0 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
--       AVX (7 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
--       AVX2 (33 files):           + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
--       AVX512_SKX (5 files):      + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_COMMON AVX512_SKX
-- 
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ standard:                11
--     C++ Compiler:                /usr/bin/c++  (ver 13.2.1)
--     C++ flags (Release):         -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/cc
--     C flags (Release):           -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):      -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined  
--     Linker flags (Debug):        -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined  
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          dl m pthread rt
--     3rdparty dependencies:
-- 
--   OpenCV modules:
--     To be built:                 calib3d ccalib core dnn face features2d flann highgui imgcodecs imgproc objdetect optflow photo plot stitching tracking v4d video videoio world ximgproc
--     Disabled:                    aruco bgsegm bioinspired cvv datasets dnn_objdetect dnn_superres dpm freetype fuzzy hfs img_hash intensity_transform line_descriptor mcc ml phase_unwrapping quality rapid reg rgbd saliency shape stereo structured_light superres surface_matching text videostab wechat_qrcode xfeatures2d xobjdetect xphoto
--     Disabled by dependency:      -
--     Unavailable:                 alphamat cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev gapi hdf java julia matlab ovis python2 python3 sfm ts viz
--     Applications:                examples
--     Documentation:               doxygen
--     Non-free algorithms:         NO
-- 
--   GUI: 
--     QT:                          YES (ver 6.5.2 )
--       QT OpenGL support:         YES (Qt6::OpenGL )
--     OpenGL support:              YES (/lib64/libOpenGL.so /lib64/libGLX.so /lib64/libGLU.so)
--     GLX support:                 YES (/lib64/libGLX.so)
--     EGL support:                 YES (/lib64/libEGL.so)
-- 
--   Media I/O: 
--     ZLib:                        /lib64/libz.so (ver 1.2.13)
--     JPEG:                        /lib64/libjpeg.so (ver 62)
--     PNG:                         /lib64/libpng.so (ver 1.6.40)
--     JPEG 2000:                   OpenJPEG (ver 2.5.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
-- 
--   Video I/O:
--     FFMPEG:                      YES
--       avcodec:                   YES (60.3.100)
--       avformat:                  YES (60.3.100)
--       avutil:                    YES (58.2.100)
--       swscale:                   YES (7.1.100)
--       avresample:                NO
--       avdevice:                  YES (60.1.100)
--     GStreamer:                   YES (1.22.5)
--     OpenNI2:                     NO
--     v4l/v4l2:                    YES (linux/videodev2.h)
-- 
--   Parallel framework:            pthreads
-- 
--   Other third-party libraries:
--     VA:                          YES
--     Custom HAL:                  NO
--     Protobuf:                    build (3.19.1)
--     Flatbuffers:                 builtin/3rdparty (23.5.9)
-- 
--   OpenCL:                        YES (SVM INTELVA)
--     Include path:                /home/elchaschab/devel/opencv/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
-- 
--   Python (for build):            /usr/bin/python3
-- 
--   Java:                          
--     ant:                         NO
--     Java:                        NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Install to:                    /usr/local
-- -----------------------------------------------------------------

ldd on the binary:

    linux-vdso.so.1 (0x00007ffddccef000)
    libopencv_v4d.so.408 => /home/elchaschab/devel/opencv_build/modules/v4d/../../lib/libopencv_v4d.so.408 (0x00007fc0fc042000)
    libopencv_world.so.408 => /home/elchaschab/devel/opencv_build/modules/v4d/../../lib/libopencv_world.so.408 (0x00007fc0f9800000)
    libglfw.so.3 => /lib64/libglfw.so.3 (0x00007fc0f979b000)
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc0f9400000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fc0f96b4000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc0f968f000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fc0f9000000)
    libOpenCL.so.1 => /usr/local/cuda/targets/x86_64-linux/lib/libOpenCL.so.1 (0x00007fc0f8c00000)
    libOpenGL.so.0 => /lib64/libOpenGL.so.0 (0x00007fc0f9662000)
    libGLEW.so.2.2 => /lib64/libGLEW.so.2.2 (0x00007fc0f933c000)
    libnanovg.so.0 => /home/elchaschab/devel/opencv_build/modules/v4d/../../lib/libnanovg.so.0 (0x00007fc0f92eb000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc0fc123000)
    libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007fc0f8f69000)
    libpng16.so.16 => /lib64/libpng16.so.16 (0x00007fc0f92a2000)
    libz.so.1 => /lib64/libz.so.1 (0x00007fc0fc002000)
    libopenjp2.so.7 => /lib64/libopenjp2.so.7 (0x00007fc0f8f0a000)
    libGLX.so.0 => /lib64/libGLX.so.0 (0x00007fc0f9270000)
    libQt6Test.so.6 => /lib64/libQt6Test.so.6 (0x00007fc0f8ea7000)
    libQt6OpenGLWidgets.so.6 => /lib64/libQt6OpenGLWidgets.so.6 (0x00007fc0f9654000)
    libEGL.so.1 => /lib64/libEGL.so.1 (0x00007fc0f8e95000)
    libQt6Widgets.so.6 => /lib64/libQt6Widgets.so.6 (0x00007fc0f8400000)
    libQt6Gui.so.6 => /lib64/libQt6Gui.so.6 (0x00007fc0f7a00000)
    libQt6Core.so.6 => /lib64/libQt6Core.so.6 (0x00007fc0f7400000)
    libgstbase-1.0.so.0 => /lib64/libgstbase-1.0.so.0 (0x00007fc0f8e0e000)
    libgstreamer-1.0.so.0 => /lib64/libgstreamer-1.0.so.0 (0x00007fc0f82a9000)
    libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007fc0f8b9e000)
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007fc0f72b8000)
    libgstapp-1.0.so.0 => /lib64/libgstapp-1.0.so.0 (0x00007fc0f8b88000)
    libgstriff-1.0.so.0 => /lib64/libgstriff-1.0.so.0 (0x00007fc0f8b77000)
    libgstpbutils-1.0.so.0 => /lib64/libgstpbutils-1.0.so.0 (0x00007fc0f79bd000)
    libgstvideo-1.0.so.0 => /lib64/libgstvideo-1.0.so.0 (0x00007fc0f71eb000)
    libgstaudio-1.0.so.0 => /lib64/libgstaudio-1.0.so.0 (0x00007fc0f7168000)
    libavcodec.so.60 => /lib64/libavcodec.so.60 (0x00007fc0f5e00000)
    libavformat.so.60 => /lib64/libavformat.so.60 (0x00007fc0f5a00000)
    libavutil.so.58 => /lib64/libavutil.so.58 (0x00007fc0f5819000)
    libswscale.so.7 => /lib64/libswscale.so.7 (0x00007fc0f70d7000)
    libavdevice.so.60 => /lib64/libavdevice.so.60 (0x00007fc0f8285000)
    libX11.so.6 => /lib64/libX11.so.6 (0x00007fc0f5cba000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fc0f926b000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc0f9266000)
    libGLdispatch.so.0 => /lib64/libGLdispatch.so.0 (0x00007fc0f7020000)
    libGL.so.1 => /lib64/libGL.so.1 (0x00007fc0f578c000)
    libQt6OpenGL.so.6 => /lib64/libQt6OpenGL.so.6 (0x00007fc0f56ea000)
    libfontconfig.so.1 => /lib64/libfontconfig.so.1 (0x00007fc0f6fd2000)
    libQt6DBus.so.6 => /lib64/libQt6DBus.so.6 (0x00007fc0f5633000)
    libxkbcommon.so.0 => /lib64/libxkbcommon.so.0 (0x00007fc0f5c73000)
    libharfbuzz.so.0 => /lib64/libharfbuzz.so.0 (0x00007fc0f5526000)
    libfreetype.so.6 => /lib64/libfreetype.so.6 (0x00007fc0f5468000)
    libicui18n.so.73 => /lib64/libicui18n.so.73 (0x00007fc0f5000000)
    libicuuc.so.73 => /lib64/libicuuc.so.73 (0x00007fc0f4c00000)
    libzstd.so.1 => /lib64/libzstd.so.1 (0x00007fc0f53b0000)
    libsystemd.so.0 => /lib64/libsystemd.so.0 (0x00007fc0f4f1e000)
    libdouble-conversion.so.3 => /lib64/libdouble-conversion.so.3 (0x00007fc0f8275000)
    libb2.so.1 => /lib64/libb2.so.1 (0x00007fc0f8b6e000)
    libpcre2-16.so.0 => /lib64/libpcre2-16.so.0 (0x00007fc0f4e85000)
    libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007fc0f4600000)
    libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007fc0f826e000)
    libunwind.so.8 => /lib64/libunwind.so.8 (0x00007fc0f79a3000)
    libdw.so.1 => /lib64/libdw.so.1 (0x00007fc0f4b69000)
    libffi.so.8 => /lib64/libffi.so.8 (0x00007fc0f7998000)
    libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007fc0f4559000)
    libgsttag-1.0.so.0 => /lib64/libgsttag-1.0.so.0 (0x00007fc0f536f000)
    liborc-0.4.so.0 => /lib64/liborc-0.4.so.0 (0x00007fc0f44c0000)
    libswresample.so.4 => /lib64/libswresample.so.4 (0x00007fc0f6fb2000)
    libvpx.so.8 => /lib64/libvpx.so.8 (0x00007fc0f4200000)
    libwebpmux.so.3 => /lib64/libwebpmux.so.3 (0x00007fc0f6fa5000)
    liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fc0f4e4e000)
    libdav1d.so.6 => /lib64/libdav1d.so.6 (0x00007fc0f4014000)
    libzvbi.so.0 => /lib64/libzvbi.so.0 (0x00007fc0f4430000)
    libaom.so.3 => /lib64/libaom.so.3 (0x00007fc0f3a00000)
    libcodec2.so.1.2 => /lib64/libcodec2.so.1.2 (0x00007fc0f38b4000)
    libgsm.so.1 => /lib64/libgsm.so.1 (0x00007fc0f5360000)
    libjxl.so.0.8 => /lib64/libjxl.so.0.8 (0x00007fc0f3400000)
    libjxl_threads.so.0.8 => /lib64/libjxl_threads.so.0.8 (0x00007fc0f535a000)
    libmp3lame.so.0 => /lib64/libmp3lame.so.0 (0x00007fc0f4af1000)
    libopus.so.0 => /lib64/libopus.so.0 (0x00007fc0f3fb5000)
    librav1e.so.0 => /lib64/librav1e.so.0 (0x00007fc0f3000000)
    libspeex.so.1 => /lib64/libspeex.so.1 (0x00007fc0f4e32000)
    libSvtAv1Enc.so.1 => /lib64/libSvtAv1Enc.so.1 (0x00007fc0f2800000)
    libtheoraenc.so.1 => /lib64/libtheoraenc.so.1 (0x00007fc0f3f7c000)
    libtheoradec.so.1 => /lib64/libtheoradec.so.1 (0x00007fc0f4e18000)
    libtwolame.so.0 => /lib64/libtwolame.so.0 (0x00007fc0f3f55000)
    libvo-amrwbenc.so.0 => /lib64/libvo-amrwbenc.so.0 (0x00007fc0f3896000)
    libvorbis.so.0 => /lib64/libvorbis.so.0 (0x00007fc0f3868000)
    libvorbisenc.so.2 => /lib64/libvorbisenc.so.2 (0x00007fc0f37bd000)
    libwebp.so.7 => /lib64/libwebp.so.7 (0x00007fc0f3392000)
    libx264.so.164 => /lib64/libx264.so.164 (0x00007fc0f2400000)
    libx265.so.199 => /lib64/libx265.so.199 (0x00007fc0f1400000)
    libxvidcore.so.4 => /lib64/libxvidcore.so.4 (0x00007fc0f2ef2000)
    libva.so.2 => /lib64/libva.so.2 (0x00007fc0f3362000)
    libmfx.so.1 => /lib64/libmfx.so.1 (0x00007fc0f4e08000)
    libxml2.so.2 => /lib64/libxml2.so.2 (0x00007fc0f128f000)
    libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fc0f3349000)
    libopenmpt.so.0 => /lib64/libopenmpt.so.0 (0x00007fc0f10ba000)
    libbluray.so.2 => /lib64/libbluray.so.2 (0x00007fc0f32ea000)
    libgnutls.so.30 => /lib64/libgnutls.so.30 (0x00007fc0f0e00000)
    librist.so.4 => /lib64/librist.so.4 (0x00007fc0f2ebe000)
    libsrt.so.1.5 => /lib64/libsrt.so.1.5 (0x00007fc0f273d000)
    libssh.so.4 => /lib64/libssh.so.4 (0x00007fc0f26cc000)
    libzmq.so.5 => /lib64/libzmq.so.5 (0x00007fc0f1025000)
    libva-drm.so.2 => /lib64/libva-drm.so.2 (0x00007fc0f5351000)
    libva-x11.so.2 => /lib64/libva-x11.so.2 (0x00007fc0f4ae9000)
    libvdpau.so.1 => /lib64/libvdpau.so.1 (0x00007fc0f534b000)
    libdrm.so.2 => /lib64/libdrm.so.2 (0x00007fc0f2ea7000)
    libavfilter.so.9 => /lib64/libavfilter.so.9 (0x00007fc0f0800000)
    libjack.so.0 => /usr/lib64/pipewire-0.3/jack/libjack.so.0 (0x00007fc0f2e68000)
    libxcb.so.1 => /lib64/libxcb.so.1 (0x00007fc0f23d4000)
    libxcb-shm.so.0 => /lib64/libxcb-shm.so.0 (0x00007fc0f4ae2000)
    libxcb-shape.so.0 => /lib64/libxcb-shape.so.0 (0x00007fc0f4adc000)
    libxcb-xfixes.so.0 => /lib64/libxcb-xfixes.so.0 (0x00007fc0f4426000)
    libcdio_paranoia.so.2 => /lib64/libcdio_paranoia.so.2 (0x00007fc0f3f4b000)
    libcdio_cdda.so.2 => /lib64/libcdio_cdda.so.2 (0x00007fc0f26c2000)
    libdc1394.so.26 => /lib64/libdc1394.so.26 (0x00007fc0f0d86000)
    libasound.so.2 => /lib64/libasound.so.2 (0x00007fc0f0c7c000)
    libpulse.so.0 => /lib64/libpulse.so.0 (0x00007fc0f07ab000)
    libSDL2-2.0.so.0 => /lib64/libSDL2-2.0.so.0 (0x00007fc0f05dd000)
    libexpat.so.1 => /lib64/libexpat.so.1 (0x00007fc0f0c50000)
    libdbus-1.so.3 => /lib64/libdbus-1.so.3 (0x00007fc0f058a000)
    libgraphite2.so.3 => /lib64/libgraphite2.so.3 (0x00007fc0f0569000)
    libbrotlidec.so.1 => /lib64/libbrotlidec.so.1 (0x00007fc0f26b5000)
    libicudata.so.73 => /lib64/libicudata.so.73 (0x00007fc0f3f44000)
    libcap.so.2 => /lib64/libcap.so.2 (0x00007fc0f23c8000)
    libgcrypt.so.20 => /lib64/libgcrypt.so.20 (0x00007fc0f0420000)
    liblz4.so.1 => /lib64/liblz4.so.1 (0x00007fc0f03fc000)
    libgomp.so.1 => /lib64/libgomp.so.1 (0x00007fc0f03a8000)
    libelf.so.1 => /lib64/libelf.so.1 (0x00007fc0f0c34000)
    libsoxr.so.0 => /lib64/libsoxr.so.0 (0x00007fc0f0342000)
    libhwy.so.1 => /lib64/libhwy.so.1 (0x00007fc0f101a000)
    libbrotlienc.so.1 => /lib64/libbrotlienc.so.1 (0x00007fc0f02b0000)
    liblcms2.so.2 => /lib64/liblcms2.so.2 (0x00007fc0f024c000)
    libogg.so.0 => /lib64/libogg.so.0 (0x00007fc0f1010000)
    libsharpyuv.so.0 => /lib64/libsharpyuv.so.0 (0x00007fc0f2e60000)
    libnuma.so.1 => /lib64/libnuma.so.1 (0x00007fc0f023e000)
    libmpg123.so.0 => /lib64/libmpg123.so.0 (0x00007fc0f01e1000)
    libvorbisfile.so.3 => /lib64/libvorbisfile.so.3 (0x00007fc0f01d7000)
    libjitterentropy.so.3 => /lib64/libjitterentropy.so.3 (0x00007fc0f26ac000)
    libp11-kit.so.0 => /lib64/libp11-kit.so.0 (0x00007fc0f00ab000)
    libidn2.so.0 => /lib64/libidn2.so.0 (0x00007fc0f0089000)
    libunistring.so.5 => /lib64/libunistring.so.5 (0x00007fc0efed9000)
    libtasn1.so.6 => /lib64/libtasn1.so.6 (0x00007fc0efec2000)
    libnettle.so.8 => /lib64/libnettle.so.8 (0x00007fc0efe6a000)
    libhogweed.so.6 => /lib64/libhogweed.so.6 (0x00007fc0efe1f000)
    libgmp.so.10 => /lib64/libgmp.so.10 (0x00007fc0efd78000)
    libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fc0efd25000)
    libsodium.so.23 => /lib64/libsodium.so.23 (0x00007fc0efcca000)
    libpgm-5.3.so.0 => /lib64/libpgm-5.3.so.0 (0x00007fc0efc80000)
    libXext.so.6 => /lib64/libXext.so.6 (0x00007fc0efc6b000)
    libXfixes.so.3 => /lib64/libXfixes.so.3 (0x00007fc0f23c0000)
    libX11-xcb.so.1 => /lib64/libX11-xcb.so.1 (0x00007fc0efc66000)
    libxcb-dri3.so.0 => /lib64/libxcb-dri3.so.0 (0x00007fc0efc5d000)
    libpostproc.so.57 => /lib64/libpostproc.so.57 (0x00007fc0efc4d000)
    libbs2b.so.0 => /lib64/libbs2b.so.0 (0x00007fc0efc46000)
    liblilv-0.so.0 => /lib64/liblilv-0.so.0 (0x00007fc0efc2a000)
    librubberband.so.2 => /lib64/librubberband.so.2 (0x00007fc0efbd7000)
    libmysofa.so.1 => /lib64/libmysofa.so.1 (0x00007fc0efbc7000)
    libfribidi.so.0 => /lib64/libfribidi.so.0 (0x00007fc0efba5000)
    libplacebo.so.292 => /lib64/libplacebo.so.292 (0x00007fc0efabb000)
    libvmaf.so.1 => /lib64/libvmaf.so.1 (0x00007fc0ef936000)
    libass.so.9 => /lib64/libass.so.9 (0x00007fc0ef8fc000)
    libshaderc_shared.so.1 => /lib64/libshaderc_shared.so.1 (0x00007fc0ef8e3000)
    libvidstab.so.1.1 => /lib64/libvidstab.so.1.1 (0x00007fc0ef8ce000)
    libzimg.so.2 => /lib64/libzimg.so.2 (0x00007fc0ef801000)
    libpipewire-0.3.so.0 => /lib64/libpipewire-0.3.so.0 (0x00007fc0ef71d000)
    libXau.so.6 => /lib64/libXau.so.6 (0x00007fc0ef718000)
    libcdio.so.19 => /lib64/libcdio.so.19 (0x00007fc0ef6ed000)
    libraw1394.so.11 => /lib64/libraw1394.so.11 (0x00007fc0ef6df000)
    libusb-1.0.so.0 => /lib64/libusb-1.0.so.0 (0x00007fc0ef6bf000)
    libpulsecommon-16.1.so => /usr/lib64/pulseaudio/libpulsecommon-16.1.so (0x00007fc0ef638000)
    libbrotlicommon.so.1 => /lib64/libbrotlicommon.so.1 (0x00007fc0ef615000)
    libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x00007fc0ef5ef000)
    libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fc0ef51e000)
    libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fc0ef506000)
    libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fc0ef500000)
    libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fc0ef4f1000)
    libserd-0.so.0 => /lib64/libserd-0.so.0 (0x00007fc0ef4d9000)
    libsord-0.so.0 => /lib64/libsord-0.so.0 (0x00007fc0ef4cc000)
    libsratom-0.so.0 => /lib64/libsratom-0.so.0 (0x00007fc0ef4c1000)
    libfftw3.so.3 => /lib64/libfftw3.so.3 (0x00007fc0ef2d1000)
    libvulkan.so.1 => /lib64/libvulkan.so.1 (0x00007fc0ef25c000)
    libdovi.so.3 => /lib64/libdovi.so.3 (0x00007fc0ef1d8000)
    libSPIRV.so.13 => /lib64/libSPIRV.so.13 (0x00007fc0ee600000)
    libSPIRV-Tools-2023.4~rc2.so => /lib64/libSPIRV-Tools-2023.4~rc2.so (0x00007fc0ef068000)
    libSPIRV-Tools-opt-2023.4~rc2.so => /lib64/libSPIRV-Tools-opt-2023.4~rc2.so (0x00007fc0ee200000)
    libudev.so.1 => /lib64/libudev.so.1 (0x00007fc0ef035000)
    libsndfile.so.1 => /lib64/libsndfile.so.1 (0x00007fc0ee57a000)
    libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fc0ef02c000)
    libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fc0ef01b000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc0eefee000)
    libFLAC.so.12 => /lib64/libFLAC.so.12 (0x00007fc0ee516000)

It works well.