mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +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(
|
[[nodiscard]] enum AVPixelFormat GetHwFormat(
|
||||||
AVCodecContext *context,
|
AVCodecContext *context,
|
||||||
const enum AVPixelFormat *formats) {
|
const enum AVPixelFormat *formats) {
|
||||||
const enum AVPixelFormat *p = nullptr;
|
const auto has = [&](enum AVPixelFormat format) {
|
||||||
for (p = formats; *p != AV_PIX_FMT_NONE; p++) {
|
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 = [&] {
|
const auto type = [&] {
|
||||||
switch (*p) {
|
switch (format) {
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
case AV_PIX_FMT_D3D11: return AV_HWDEVICE_TYPE_D3D11VA;
|
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_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
|
#elif defined Q_OS_MAC // Q_OS_WIN
|
||||||
case AV_PIX_FMT_VIDEOTOOLBOX:
|
case AV_PIX_FMT_VIDEOTOOLBOX:
|
||||||
return AV_HWDEVICE_TYPE_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_VAAPI: return AV_HWDEVICE_TYPE_VAAPI;
|
||||||
case AV_PIX_FMT_VDPAU: return AV_HWDEVICE_TYPE_VDPAU;
|
case AV_PIX_FMT_VDPAU: return AV_HWDEVICE_TYPE_VDPAU;
|
||||||
#endif // Q_OS_WIN || Q_OS_MAC
|
#endif // Q_OS_WIN || Q_OS_MAC
|
||||||
case AV_PIX_FMT_CUDA: return AV_HWDEVICE_TYPE_CUDA;
|
|
||||||
}
|
}
|
||||||
return AV_HWDEVICE_TYPE_NONE;
|
return AV_HWDEVICE_TYPE_NONE;
|
||||||
}();
|
}();
|
||||||
if (type != AV_HWDEVICE_TYPE_NONE && !InitHw(context, type)) {
|
if (type == AV_HWDEVICE_TYPE_NONE && context->hw_device_ctx) {
|
||||||
continue;
|
|
||||||
} else if (type == AV_HWDEVICE_TYPE_NONE && context->hw_device_ctx) {
|
|
||||||
av_buffer_unref(&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>
|
template <AVPixelFormat Required>
|
||||||
|
|
Loading…
Add table
Reference in a new issue