forked from eden-emu/eden
[host1x] Fix FFmpeg hardware detection, use hardware native formats.
This commit is contained in:
parent
d744cc6a41
commit
55d8911daa
1 changed files with 20 additions and 2 deletions
|
@ -33,21 +33,39 @@ constexpr std::array PreferredGpuDecoders = {
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__)
|
||||||
AV_HWDEVICE_TYPE_VDPAU,
|
AV_HWDEVICE_TYPE_VDPAU,
|
||||||
#elif defined(__unix__)
|
#elif defined(__unix__)
|
||||||
|
AV_HWDEVICE_TYPE_CUDA,
|
||||||
AV_HWDEVICE_TYPE_VAAPI,
|
AV_HWDEVICE_TYPE_VAAPI,
|
||||||
|
AV_HWDEVICE_TYPE_VDPAU,
|
||||||
#endif
|
#endif
|
||||||
AV_HWDEVICE_TYPE_VULKAN,
|
AV_HWDEVICE_TYPE_VULKAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
AVPixelFormat GetGpuFormat(AVCodecContext* codec_context, const AVPixelFormat* pix_fmts) {
|
AVPixelFormat GetGpuFormat(AVCodecContext* codec_context, const AVPixelFormat* pix_fmts) {
|
||||||
|
const auto desc = av_pix_fmt_desc_get(codec_context->pix_fmt);
|
||||||
|
if (desc && !(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
|
||||||
|
for (int i = 0;; i++) {
|
||||||
|
const AVCodecHWConfig* config = avcodec_get_hw_config(codec_context->codec, i);
|
||||||
|
if (!config) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto type : PreferredGpuDecoders) {
|
||||||
|
if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX &&
|
||||||
|
config->device_type == type) {
|
||||||
|
codec_context->pix_fmt = config->pix_fmt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (const AVPixelFormat* p = pix_fmts; *p != AV_PIX_FMT_NONE; ++p) {
|
for (const AVPixelFormat* p = pix_fmts; *p != AV_PIX_FMT_NONE; ++p) {
|
||||||
if (*p == codec_context->pix_fmt) {
|
if (*p == codec_context->pix_fmt) {
|
||||||
return codec_context->pix_fmt;
|
return codec_context->pix_fmt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO(HW_GPU, "Could not find compatible GPU AV format, falling back to CPU");
|
LOG_INFO(HW_GPU, "Could not find supported GPU pixel format, falling back to CPU decoder");
|
||||||
av_buffer_unref(&codec_context->hw_device_ctx);
|
av_buffer_unref(&codec_context->hw_device_ctx);
|
||||||
|
|
||||||
codec_context->pix_fmt = PreferredCpuFormat;
|
codec_context->pix_fmt = PreferredCpuFormat;
|
||||||
return codec_context->pix_fmt;
|
return codec_context->pix_fmt;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue