From 27d9f7856653e90ed1c9ca60187cce6481667f7a Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 30 Mar 2022 14:59:54 +0400 Subject: [PATCH] Enforce our own hardware acceleration attempts order. --- .../SourceFiles/ffmpeg/ffmpeg_utility.cpp | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp index 7948a79e6..6722f35d9 100644 --- a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp +++ b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp @@ -112,14 +112,38 @@ void PremultiplyLine(uchar *dst, const uchar *src, int intsCount) { [[nodiscard]] enum AVPixelFormat GetHwFormat( AVCodecContext *context, const enum AVPixelFormat *formats) { - const enum AVPixelFormat *p = nullptr; - for (p = formats; *p != AV_PIX_FMT_NONE; p++) { + const auto has = [&](enum AVPixelFormat format) { + const enum AVPixelFormat *p = nullptr; + for (p = formats; *p != AV_PIX_FMT_NONE; p++) { + if (*p == format) { + return true; + } + } + return false; + }; + const auto list = std::array{ +#ifdef Q_OS_WIN + AV_PIX_FMT_D3D11, + AV_PIX_FMT_DXVA2_VLD, + AV_PIX_FMT_CUDA, +#elif defined Q_OS_MAC // Q_OS_WIN + 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 + }; + for (const auto format : list) { + if (!has(format)) { + continue; + } const auto type = [&] { - switch (*p) { + switch (format) { #ifdef Q_OS_WIN case AV_PIX_FMT_D3D11: return AV_HWDEVICE_TYPE_D3D11VA; case AV_PIX_FMT_DXVA2_VLD: return AV_HWDEVICE_TYPE_DXVA2; - case AV_PIX_FMT_D3D11VA_VLD: return AV_HWDEVICE_TYPE_D3D11VA; + case AV_PIX_FMT_CUDA: return AV_HWDEVICE_TYPE_CUDA; #elif defined Q_OS_MAC // Q_OS_WIN case AV_PIX_FMT_VIDEOTOOLBOX: return AV_HWDEVICE_TYPE_VIDEOTOOLBOX; @@ -127,18 +151,21 @@ void PremultiplyLine(uchar *dst, const uchar *src, int intsCount) { case AV_PIX_FMT_VAAPI: return AV_HWDEVICE_TYPE_VAAPI; case AV_PIX_FMT_VDPAU: return AV_HWDEVICE_TYPE_VDPAU; #endif // Q_OS_WIN || Q_OS_MAC - case AV_PIX_FMT_CUDA: return AV_HWDEVICE_TYPE_CUDA; } return AV_HWDEVICE_TYPE_NONE; }(); - if (type != AV_HWDEVICE_TYPE_NONE && !InitHw(context, type)) { - continue; - } else if (type == AV_HWDEVICE_TYPE_NONE && context->hw_device_ctx) { + if (type == AV_HWDEVICE_TYPE_NONE && context->hw_device_ctx) { av_buffer_unref(&context->hw_device_ctx); + } else if (type != AV_HWDEVICE_TYPE_NONE && !InitHw(context, type)) { + continue; } - return *p; + return format; } - return AV_PIX_FMT_NONE; + enum AVPixelFormat result = AV_PIX_FMT_NONE; + for (const enum AVPixelFormat *p = formats; *p != AV_PIX_FMT_NONE; p++) { + result = *p; + } + return result; } template