From a2d73eaa107bb5e3cd570e522fc69311468c2c89 Mon Sep 17 00:00:00 2001 From: liushuyu Date: Sun, 12 Dec 2021 17:43:10 -0700 Subject: video_core/codecs: skip decoders that use hw frames ... ... this would resolve some edge-cases where multiple devices are present and ffmpeg is unable to auto-supply the hw surfaces --- src/video_core/command_classes/codecs/codec.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/video_core') diff --git a/src/video_core/command_classes/codecs/codec.cpp b/src/video_core/command_classes/codecs/codec.cpp index 2a532b883..439c47209 100644 --- a/src/video_core/command_classes/codecs/codec.cpp +++ b/src/video_core/command_classes/codecs/codec.cpp @@ -130,6 +130,12 @@ bool Codec::CreateGpuAvDevice() { } if (config->methods & HW_CONFIG_METHOD && config->device_type == type) { av_codec_ctx->pix_fmt = config->pix_fmt; + if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX) { + // skip zero-copy decoders, we don't currently support them + LOG_DEBUG(Service_NVDRV, "Skipping decoder {} with unsupported capability {}.", + av_hwdevice_get_type_name(type), config->methods); + continue; + } LOG_INFO(Service_NVDRV, "Using {} GPU decoder", av_hwdevice_get_type_name(type)); return true; } @@ -251,6 +257,9 @@ void Codec::Decode() { final_frame->format = PREFERRED_GPU_FMT; const int ret = av_hwframe_transfer_data(final_frame.get(), initial_frame.get(), 0); ASSERT_MSG(!ret, "av_hwframe_transfer_data error {}", ret); + // null the hw frame context to prevent the buffer from being deleted + // and leaving a dangling reference in the av_codec_ctx + initial_frame->hw_frames_ctx = nullptr; } else { final_frame = std::move(initial_frame); } -- cgit v1.2.3 From dd72e4dce4641498bd7e73f09afd7d90961c435d Mon Sep 17 00:00:00 2001 From: liushuyu Date: Sun, 12 Dec 2021 18:28:52 -0700 Subject: CI: fix CI on Linux --- .ci/scripts/windows/docker.sh | 5 ++--- externals/ffmpeg/CMakeLists.txt | 2 +- src/video_core/command_classes/codecs/codec.cpp | 3 --- 3 files changed, 3 insertions(+), 7 deletions(-) (limited to 'src/video_core') diff --git a/.ci/scripts/windows/docker.sh b/.ci/scripts/windows/docker.sh index 298421a1a..584b9b39f 100755 --- a/.ci/scripts/windows/docker.sh +++ b/.ci/scripts/windows/docker.sh @@ -41,12 +41,11 @@ for i in package/*.exe; do done pip3 install pefile -python3 .ci/scripts/windows/scan_dll.py package/*.exe "package/" -python3 .ci/scripts/windows/scan_dll.py package/imageformats/*.dll "package/" +python3 .ci/scripts/windows/scan_dll.py package/*.exe package/imageformats/*.dll "package/" # copy FFmpeg libraries EXTERNALS_PATH="$(pwd)/build/externals" -FFMPEG_DLL_PATH="$(find ${EXTERNALS_PATH} -maxdepth 1 -type d | grep ffmpeg)/ffmpeg/bin" +FFMPEG_DLL_PATH="$(find "${EXTERNALS_PATH}" -maxdepth 1 -type d | grep 'ffmpeg-')/bin" find ${FFMPEG_DLL_PATH} -type f -regex ".*\.dll" -exec cp -v {} package/ ';' # copy libraries from yuzu.exe path diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index 63896edd5..7da89d2c5 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -17,7 +17,7 @@ if (NOT WIN32) endif() set(FFmpeg_PREFIX ${PROJECT_SOURCE_DIR}/externals/ffmpeg/ffmpeg) - set(FFmpeg_BUILD_DIR ${PROJECT_BINARY_DIR}/externals/ffmpeg) + set(FFmpeg_BUILD_DIR ${PROJECT_BINARY_DIR}/externals/ffmpeg-build) set(FFmpeg_MAKEFILE ${FFmpeg_BUILD_DIR}/Makefile) make_directory(${FFmpeg_BUILD_DIR}) diff --git a/src/video_core/command_classes/codecs/codec.cpp b/src/video_core/command_classes/codecs/codec.cpp index 439c47209..868b82f9b 100644 --- a/src/video_core/command_classes/codecs/codec.cpp +++ b/src/video_core/command_classes/codecs/codec.cpp @@ -257,9 +257,6 @@ void Codec::Decode() { final_frame->format = PREFERRED_GPU_FMT; const int ret = av_hwframe_transfer_data(final_frame.get(), initial_frame.get(), 0); ASSERT_MSG(!ret, "av_hwframe_transfer_data error {}", ret); - // null the hw frame context to prevent the buffer from being deleted - // and leaving a dangling reference in the av_codec_ctx - initial_frame->hw_frames_ctx = nullptr; } else { final_frame = std::move(initial_frame); } -- cgit v1.2.3