Runtime Implib detection

This commit is contained in:
Ilya Fedin 2025-06-01 21:31:43 +00:00 committed by John Preston
parent 56ff5808a3
commit 3896f0995c
2 changed files with 26 additions and 23 deletions

View file

@ -10,10 +10,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "base/algorithm.h" #include "base/algorithm.h"
#include "logs.h" #include "logs.h"
#ifdef LIB_FFMPEG_USE_IMPLIB #if !defined Q_OS_WIN && !defined Q_OS_MAC
#include "base/platform/linux/base_linux_library.h" #include "base/platform/linux/base_linux_library.h"
#include <deque> #include <deque>
#endif // LIB_FFMPEG_USE_IMPLIB #endif // !Q_OS_WIN && !Q_OS_MAC
#include <QImage> #include <QImage>
@ -26,6 +26,16 @@ extern "C" {
#include <libavutil/display.h> #include <libavutil/display.h>
} // extern "C" } // extern "C"
#if !defined Q_OS_WIN && !defined Q_OS_MAC
extern "C" {
void _libvdpau_so_tramp_resolve_all(void) __attribute__((weak));
void _libva_drm_so_tramp_resolve_all(void) __attribute__((weak));
void _libva_x11_so_tramp_resolve_all(void) __attribute__((weak));
void _libva_so_tramp_resolve_all(void) __attribute__((weak));
void _libdrm_so_tramp_resolve_all(void) __attribute__((weak));
} // extern "C"
#endif // !Q_OS_WIN && !Q_OS_MAC
namespace FFmpeg { namespace FFmpeg {
namespace { namespace {
@ -91,23 +101,24 @@ void PremultiplyLine(uchar *dst, const uchar *src, int intsCount) {
#endif // LIB_FFMPEG_USE_QT_PRIVATE_API #endif // LIB_FFMPEG_USE_QT_PRIVATE_API
} }
#ifdef LIB_FFMPEG_USE_IMPLIB #if !defined Q_OS_WIN && !defined Q_OS_MAC
[[nodiscard]] auto CheckHwLibs() { [[nodiscard]] auto CheckHwLibs() {
auto list = std::deque{ auto list = std::deque{
AV_PIX_FMT_CUDA, AV_PIX_FMT_CUDA,
}; };
if (base::Platform::LoadLibrary("libvdpau.so.1")) { if (!_libvdpau_so_tramp_resolve_all
|| base::Platform::LoadLibrary("libvdpau.so.1")) {
list.push_front(AV_PIX_FMT_VDPAU); list.push_front(AV_PIX_FMT_VDPAU);
} }
if ([&] { if ([&] {
const auto list = std::array{ const auto list = std::array{
"libva-drm.so.2", std::make_pair(_libva_drm_so_tramp_resolve_all, "libva-drm.so.2"),
"libva-x11.so.2", std::make_pair(_libva_x11_so_tramp_resolve_all, "libva-x11.so.2"),
"libva.so.2", std::make_pair(_libva_so_tramp_resolve_all, "libva.so.2"),
"libdrm.so.2", std::make_pair(_libdrm_so_tramp_resolve_all, "libdrm.so.2"),
}; };
for (const auto lib : list) { for (const auto &lib : list) {
if (!base::Platform::LoadLibrary(lib)) { if (lib.first && !base::Platform::LoadLibrary(lib.second)) {
return false; return false;
} }
} }
@ -117,7 +128,7 @@ void PremultiplyLine(uchar *dst, const uchar *src, int intsCount) {
} }
return list; return list;
} }
#endif // LIB_FFMPEG_USE_IMPLIB #endif // !Q_OS_WIN && !Q_OS_MAC
[[nodiscard]] bool InitHw(AVCodecContext *context, AVHWDeviceType type) { [[nodiscard]] bool InitHw(AVCodecContext *context, AVHWDeviceType type) {
AVCodecContext *parent = static_cast<AVCodecContext*>(context->opaque); AVCodecContext *parent = static_cast<AVCodecContext*>(context->opaque);
@ -160,9 +171,7 @@ void PremultiplyLine(uchar *dst, const uchar *src, int intsCount) {
} }
return false; return false;
}; };
#ifdef LIB_FFMPEG_USE_IMPLIB #if defined Q_OS_WIN || defined Q_OS_MAC
static const auto list = CheckHwLibs();
#else // LIB_FFMPEG_USE_IMPLIB
const auto list = std::array{ const auto list = std::array{
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
AV_PIX_FMT_D3D11, AV_PIX_FMT_D3D11,
@ -170,13 +179,11 @@ void PremultiplyLine(uchar *dst, const uchar *src, int intsCount) {
AV_PIX_FMT_CUDA, AV_PIX_FMT_CUDA,
#elif defined Q_OS_MAC // Q_OS_WIN #elif defined Q_OS_MAC // Q_OS_WIN
AV_PIX_FMT_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX,
#else // Q_OS_WIN || Q_OS_MAC
AV_PIX_FMT_VAAPI,
AV_PIX_FMT_VDPAU,
AV_PIX_FMT_CUDA,
#endif // Q_OS_WIN || Q_OS_MAC #endif // Q_OS_WIN || Q_OS_MAC
}; };
#endif // LIB_FFMPEG_USE_IMPLIB #else // Q_OS_WIN || Q_OS_MAC
static const auto list = CheckHwLibs();
#endif // !Q_OS_WIN && !Q_OS_MAC
for (const auto format : list) { for (const auto format : list) {
if (!has(format)) { if (!has(format)) {
continue; continue;

View file

@ -29,10 +29,6 @@ PUBLIC
desktop-app::external_ffmpeg desktop-app::external_ffmpeg
) )
if (LINUX AND NOT DESKTOP_APP_USE_PACKAGED)
target_compile_definitions(lib_ffmpeg PRIVATE LIB_FFMPEG_USE_IMPLIB)
endif()
if (DESKTOP_APP_SPECIAL_TARGET) if (DESKTOP_APP_SPECIAL_TARGET)
target_compile_definitions(lib_ffmpeg PRIVATE LIB_FFMPEG_USE_QT_PRIVATE_API) target_compile_definitions(lib_ffmpeg PRIVATE LIB_FFMPEG_USE_QT_PRIVATE_API)
endif() endif()