Open kallaballa opened 1 year ago
OpenCV may use GLX for several purposes:
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.
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.
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. :)
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:
- EGL integration is useful, but should be optional on CMake level.
I understand now. and will implement it like that.
Done de6bb169928dc17aa04a53e150cb674f25c4e971
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.
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?
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.
Also not all Linux systems provide EGL support. Please check OpenGL_EGL_FOUND
beforehand: https://cmake.org/cmake/help/latest/module/FindOpenGL.html
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.
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.
Thanks a lot for the research! Could you check if the GTK stack does lazy linkage with EGL and GLX?
I am on it :)
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.
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
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."
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?
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
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
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.
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.
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.
I you don't have any tests to add, that I can run or write, I am at the conclusion:
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!
Great!
Related work:
I added proper build options to the experimental branch. OPENCV_ENABLE_EGL
and OPENCV_ENABLE_GLX
. Default is "ON" for both.
@dmatveev Please take a look.
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.
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. :)
@kallaballa Please be patient. I involved most of stakeholders to the discussion. Hopefully will decided this Friday.
No problem! Thanks for the quick answer!
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?
Oh and i forgot. I moved the demo code implementation to GLFW3. no more direct EGL and X11 calls.
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.
Would it disrupt the review/discussion if i converted this PR to a draft and fix the issues I found?
Any news? Anything I can do for this PR?
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.
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.
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.
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