mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-19 07:37:11 +02:00
Enforce our own hardware acceleration attempts order.
This commit is contained in:
parent
dd9e317257
commit
27d9f78566
1 changed files with 37 additions and 10 deletions
|
@ -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 <AVPixelFormat Required>
|
||||
|
|
Loading…
Add table
Reference in a new issue