diff options
| -rwxr-xr-x | .ci/scripts/windows/docker.sh | 5 | ||||
| -rw-r--r-- | .gitmodules | 6 | ||||
| -rw-r--r-- | CMakeLists.txt | 218 | ||||
| -rw-r--r-- | externals/CMakeLists.txt | 5 | ||||
| m--------- | externals/ffmpeg | 0 | ||||
| -rw-r--r-- | externals/ffmpeg/CMakeLists.txt | 209 | ||||
| m--------- | externals/ffmpeg/ffmpeg | 0 | ||||
| -rw-r--r-- | src/video_core/command_classes/codecs/codec.cpp | 6 | 
8 files changed, 227 insertions, 222 deletions
diff --git a/.ci/scripts/windows/docker.sh b/.ci/scripts/windows/docker.sh index 155d8a5c8..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)/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/.gitmodules b/.gitmodules index dc6ed500f..a9cf9a24a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -34,12 +34,12 @@  [submodule "opus"]  	path = externals/opus/opus  	url = https://github.com/xiph/opus.git -[submodule "ffmpeg"] -	path = externals/ffmpeg -	url = https://git.ffmpeg.org/ffmpeg.git  [submodule "SDL"]  	path = externals/SDL  	url = https://github.com/libsdl-org/SDL.git  [submodule "externals/cpp-httplib"]  	path = externals/cpp-httplib  	url = https://github.com/yhirose/cpp-httplib.git +[submodule "externals/ffmpeg/ffmpeg"] +	path = externals/ffmpeg/ffmpeg +	url = https://git.ffmpeg.org/ffmpeg.git diff --git a/CMakeLists.txt b/CMakeLists.txt index a810e11c2..18d553f4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -514,7 +514,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")  endif()  if (NOT YUZU_USE_BUNDLED_FFMPEG)      # Use system installed FFmpeg -    find_package(FFmpeg QUIET COMPONENTS ${FFmpeg_COMPONENTS}) +    find_package(FFmpeg 4.3 QUIET COMPONENTS ${FFmpeg_COMPONENTS})      if (FFmpeg_FOUND)          # Overwrite aggregate defines from FFmpeg module to avoid over-linking libraries. @@ -527,225 +527,11 @@ if (NOT YUZU_USE_BUNDLED_FFMPEG)              set(FFmpeg_INCLUDE_DIR ${FFmpeg_INCLUDE_DIR} ${FFmpeg_INCLUDE_${COMPONENT}} CACHE PATH "Path to FFmpeg headers" FORCE)          endforeach()      else() -        message(WARNING "FFmpeg not found, falling back to externals") +        message(WARNING "FFmpeg not found or too old, falling back to externals")          set(YUZU_USE_BUNDLED_FFMPEG ON)      endif()  endif() -if (YUZU_USE_BUNDLED_FFMPEG) -    if (NOT WIN32) -        # TODO(lat9nq): Move this to externals/ffmpeg/CMakeLists.txt (and move externals/ffmpeg to -        # externals/ffmpeg/ffmpeg) - -        # Build FFmpeg from externals -        message(STATUS "Using FFmpeg from externals") - -        # FFmpeg has source that requires one of nasm or yasm to assemble it. -        # REQUIRED throws an error if not found here during configuration rather than during compilation. -        find_program(ASSEMBLER NAMES nasm yasm) -        if ("${ASSEMBLER}" STREQUAL "ASSEMBLER-NOTFOUND") -            message(FATAL_ERROR "One of either `nasm` or `yasm` not found but is required.") -        endif() - -        find_program(AUTOCONF autoconf) -        if ("${AUTOCONF}" STREQUAL "AUTOCONF-NOTFOUND") -            message(FATAL_ERROR "Required program `autoconf` not found.") -        endif() - -        set(FFmpeg_PREFIX ${PROJECT_SOURCE_DIR}/externals/ffmpeg) -        set(FFmpeg_BUILD_DIR ${PROJECT_BINARY_DIR}/externals/ffmpeg) -        set(FFmpeg_MAKEFILE ${FFmpeg_BUILD_DIR}/Makefile) -        make_directory(${FFmpeg_BUILD_DIR}) - -        # Read version string from external -        file(READ ${FFmpeg_PREFIX}/RELEASE FFmpeg_VERSION) -        set(FFmpeg_FOUND NO) -        if (NOT FFmpeg_VERSION STREQUAL "") -            set(FFmpeg_FOUND YES) -        endif() - -        unset(FFmpeg_LIBRARIES CACHE) -        foreach(COMPONENT ${FFmpeg_COMPONENTS}) -            set(FFmpeg_${COMPONENT}_PREFIX "${FFmpeg_BUILD_DIR}/lib${COMPONENT}") -            set(FFmpeg_${COMPONENT}_LIB_NAME "lib${COMPONENT}.a") -            set(FFmpeg_${COMPONENT}_LIBRARY "${FFmpeg_${COMPONENT}_PREFIX}/${FFmpeg_${COMPONENT}_LIB_NAME}") - -            set(FFmpeg_LIBRARIES -                ${FFmpeg_LIBRARIES} -                ${FFmpeg_${COMPONENT}_LIBRARY} -                CACHE PATH "Paths to FFmpeg libraries" FORCE) -        endforeach() - -        Include(FindPkgConfig REQUIRED) -        pkg_check_modules(LIBVA libva) -        pkg_check_modules(CUDA cuda) -        pkg_check_modules(FFNVCODEC ffnvcodec) -        pkg_check_modules(VDPAU vdpau) - -        set(FFmpeg_HWACCEL_LIBRARIES) -        set(FFmpeg_HWACCEL_FLAGS) -        set(FFmpeg_HWACCEL_INCLUDE_DIRS) -        set(FFmpeg_HWACCEL_LDFLAGS) - -        if(LIBVA_FOUND) -            pkg_check_modules(LIBDRM libdrm REQUIRED) -            find_package(X11 REQUIRED) -            pkg_check_modules(LIBVA-DRM libva-drm REQUIRED) -            pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED) -            list(APPEND FFmpeg_HWACCEL_LIBRARIES -                ${LIBDRM_LIBRARIES} -                ${X11_LIBRARIES} -                ${LIBVA-DRM_LIBRARIES} -                ${LIBVA-X11_LIBRARIES} -                ${LIBVA_LIBRARIES}) -            set(FFmpeg_HWACCEL_FLAGS -                --enable-hwaccel=h264_vaapi -                --enable-hwaccel=vp8_vaapi -                --enable-hwaccel=vp9_vaapi -                --enable-libdrm) -            list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS -                ${LIBDRM_INCLUDE_DIRS} -                ${X11_INCLUDE_DIRS} -                ${LIBVA-DRM_INCLUDE_DIRS} -                ${LIBVA-X11_INCLUDE_DIRS} -                ${LIBVA_INCLUDE_DIRS} -            ) -            message(STATUS "VA-API found") -        else() -            set(FFmpeg_HWACCEL_FLAGS --disable-vaapi) -        endif() - -        if (FFNVCODEC_FOUND AND CUDA_FOUND) -            list(APPEND FFmpeg_HWACCEL_FLAGS -                --enable-cuvid -                --enable-ffnvcodec -                --enable-nvdec -                --enable-hwaccel=h264_nvdec -                --enable-hwaccel=vp8_nvdec -                --enable-hwaccel=vp9_nvdec -                --extra-cflags=-I${CUDA_INCLUDE_DIRS} -            ) -            list(APPEND FFmpeg_HWACCEL_LIBRARIES -                ${FFNVCODEC_LIBRARIES} -                ${CUDA_LIBRARIES} -            ) -            list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS -                ${FFNVCODEC_INCLUDE_DIRS} -                ${CUDA_INCLUDE_DIRS} -            ) -            list(APPEND FFmpeg_HWACCEL_LDFLAGS -                ${FFNVCODEC_LDFLAGS} -                ${CUDA_LDFLAGS} -            ) -            message(STATUS "ffnvcodec libraries version ${FFNVCODEC_VERSION} found") -        endif() - -        if (VDPAU_FOUND) -            list(APPEND FFmpeg_HWACCEL_FLAGS -                --enable-vdpau -                --enable-hwaccel=h264_vdpau -                --enable-hwaccel=vp9_vdpau -            ) -            list(APPEND FFmpeg_HWACCEL_LIBRARIES ${VDPAU_LIBRARIES}) -            list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${VDPAU_INCLUDE_DIRS}) -            list(APPEND FFmpeg_HWACCEL_LDFLAGS ${VDPAU_LDFLAGS}) -            message(STATUS "vdpau libraries version ${VDPAU_VERSION} found") -        else() -            list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vdpau) -        endif() - -        # `configure` parameters builds only exactly what yuzu needs from FFmpeg -        # `--disable-vdpau` is needed to avoid linking issues -        add_custom_command( -            OUTPUT -                ${FFmpeg_MAKEFILE} -            COMMAND -                /bin/bash ${FFmpeg_PREFIX}/configure -                    --disable-avdevice -                    --disable-avfilter -                    --disable-avformat -                    --disable-doc -                    --disable-everything -                    --disable-ffmpeg -                    --disable-ffprobe -                    --disable-network -                    --disable-postproc -                    --disable-swresample -                    --enable-decoder=h264 -                    --enable-decoder=vp8 -                    --enable-decoder=vp9 -                    --cc="${CMAKE_C_COMPILER}" -                    --cxx="${CMAKE_CXX_COMPILER}" -                    ${FFmpeg_HWACCEL_FLAGS} -            WORKING_DIRECTORY -                ${FFmpeg_BUILD_DIR} -        ) -        unset(FFmpeg_HWACCEL_FLAGS) - -        # Workaround for Ubuntu 18.04's older version of make not being able to call make as a child -        # with context of the jobserver. Also helps ninja users. -        execute_process( -            COMMAND -                nproc -            OUTPUT_VARIABLE -                SYSTEM_THREADS) - -        set(FFmpeg_BUILD_LIBRARIES ${FFmpeg_LIBRARIES}) -        add_custom_command( -            OUTPUT -                ${FFmpeg_BUILD_LIBRARIES} -            COMMAND -                make -j${SYSTEM_THREADS} -            WORKING_DIRECTORY -                ${FFmpeg_BUILD_DIR} -        ) - -        set(FFmpeg_INCLUDE_DIR -            "${FFmpeg_PREFIX};${FFmpeg_BUILD_DIR};${FFmpeg_HWACCEL_INCLUDE_DIRS}" -            CACHE PATH "Path to FFmpeg headers" FORCE) - -        set(FFmpeg_LDFLAGS -            "${FFmpeg_HWACCEL_LDFLAGS}" -            CACHE STRING "FFmpeg linker flags" FORCE) - -        # ALL makes this custom target build every time -        # but it won't actually build if the DEPENDS parameter is up to date -        add_custom_target(ffmpeg-configure ALL DEPENDS ${FFmpeg_MAKEFILE}) -        add_custom_target(ffmpeg-build ALL DEPENDS ${FFmpeg_BUILD_LIBRARIES} ffmpeg-configure) -        link_libraries(${FFmpeg_LIBVA_LIBRARIES}) -        set(FFmpeg_LIBRARIES ${FFmpeg_BUILD_LIBRARIES} ${FFmpeg_HWACCEL_LIBRARIES} -            CACHE PATH "Paths to FFmpeg libraries" FORCE) -        unset(FFmpeg_BUILD_LIBRARIES) -        unset(FFmpeg_HWACCEL_FLAGS) -        unset(FFmpeg_HWACCEL_INCLUDE_DIRS) -        unset(FFmpeg_HWACCEL_LDFLAGS) -        unset(FFmpeg_HWACCEL_LIBRARIES) - -        if (FFmpeg_FOUND) -            message(STATUS "Found FFmpeg version ${FFmpeg_VERSION}") -        else() -            message(FATAL_ERROR "FFmpeg not found") -        endif() -    else() # WIN32 -        # Use yuzu FFmpeg binaries -        set(FFmpeg_EXT_NAME "ffmpeg-4.4") -        set(FFmpeg_PATH "${CMAKE_BINARY_DIR}/externals/${FFmpeg_EXT_NAME}") -        download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "") -        set(FFmpeg_FOUND YES) -        set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) -        set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE) -        set(FFmpeg_LDFLAGS "" CACHE STRING "FFmpeg linker flags" FORCE) -        set(FFmpeg_DLL_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg dll's" FORCE) -        set(FFmpeg_LIBRARIES -            ${FFmpeg_LIBRARY_DIR}/swscale.lib -            ${FFmpeg_LIBRARY_DIR}/avcodec.lib -            ${FFmpeg_LIBRARY_DIR}/avutil.lib -            CACHE PATH "Paths to FFmpeg libraries" FORCE) -    endif() -endif() - -unset(FFmpeg_COMPONENTS) -  # Prefer the -pthread flag on Linux.  set(THREADS_PREFER_PTHREAD_FLAG ON)  find_package(Threads REQUIRED) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 64d1e6aec..bbbe6667d 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -121,3 +121,8 @@ if (NOT opus_FOUND)      message(STATUS "opus 1.3 or newer not found, falling back to externals")      add_subdirectory(opus EXCLUDE_FROM_ALL)  endif() + +# FFMpeg +if (YUZU_USE_BUNDLED_FFMPEG) +    add_subdirectory(ffmpeg) +endif() diff --git a/externals/ffmpeg b/externals/ffmpeg deleted file mode 160000 -Subproject 79e8d17024e6c6328a40fcee191ffd70798a9c6 diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt new file mode 100644 index 000000000..7da89d2c5 --- /dev/null +++ b/externals/ffmpeg/CMakeLists.txt @@ -0,0 +1,209 @@ +if (NOT WIN32) +    # Build FFmpeg from externals +    message(STATUS "Using FFmpeg from externals") + +    if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64|amd64)") +        # FFmpeg has source that requires one of nasm or yasm to assemble it. +        # REQUIRED throws an error if not found here during configuration rather than during compilation. +        find_program(ASSEMBLER NAMES nasm yasm) +        if ("${ASSEMBLER}" STREQUAL "ASSEMBLER-NOTFOUND") +            message(FATAL_ERROR "One of either `nasm` or `yasm` not found but is required.") +        endif() +    endif() + +    find_program(AUTOCONF autoconf) +    if ("${AUTOCONF}" STREQUAL "AUTOCONF-NOTFOUND") +        message(FATAL_ERROR "Required program `autoconf` not found.") +    endif() + +    set(FFmpeg_PREFIX ${PROJECT_SOURCE_DIR}/externals/ffmpeg/ffmpeg) +    set(FFmpeg_BUILD_DIR ${PROJECT_BINARY_DIR}/externals/ffmpeg-build) +    set(FFmpeg_MAKEFILE ${FFmpeg_BUILD_DIR}/Makefile) +    make_directory(${FFmpeg_BUILD_DIR}) + +    # Read version string from external +    file(READ ${FFmpeg_PREFIX}/RELEASE FFmpeg_VERSION) +    set(FFmpeg_FOUND NO) +    if (NOT FFmpeg_VERSION STREQUAL "") +        set(FFmpeg_FOUND YES) +    endif() + +    unset(FFmpeg_LIBRARIES CACHE) +    foreach(COMPONENT ${FFmpeg_COMPONENTS}) +        set(FFmpeg_${COMPONENT}_PREFIX "${FFmpeg_BUILD_DIR}/lib${COMPONENT}") +        set(FFmpeg_${COMPONENT}_LIB_NAME "lib${COMPONENT}.a") +        set(FFmpeg_${COMPONENT}_LIBRARY "${FFmpeg_${COMPONENT}_PREFIX}/${FFmpeg_${COMPONENT}_LIB_NAME}") + +        set(FFmpeg_LIBRARIES +            ${FFmpeg_LIBRARIES} +            ${FFmpeg_${COMPONENT}_LIBRARY} +            CACHE PATH "Paths to FFmpeg libraries" FORCE) +    endforeach() + +    Include(FindPkgConfig REQUIRED) +    pkg_check_modules(LIBVA libva) +    pkg_check_modules(CUDA cuda) +    pkg_check_modules(FFNVCODEC ffnvcodec) +    pkg_check_modules(VDPAU vdpau) + +    set(FFmpeg_HWACCEL_LIBRARIES) +    set(FFmpeg_HWACCEL_FLAGS) +    set(FFmpeg_HWACCEL_INCLUDE_DIRS) +    set(FFmpeg_HWACCEL_LDFLAGS) + +    if(LIBVA_FOUND) +        pkg_check_modules(LIBDRM libdrm REQUIRED) +        find_package(X11 REQUIRED) +        pkg_check_modules(LIBVA-DRM libva-drm REQUIRED) +        pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED) +        list(APPEND FFmpeg_HWACCEL_LIBRARIES +            ${LIBDRM_LIBRARIES} +            ${X11_LIBRARIES} +            ${LIBVA-DRM_LIBRARIES} +            ${LIBVA-X11_LIBRARIES} +            ${LIBVA_LIBRARIES}) +        set(FFmpeg_HWACCEL_FLAGS +            --enable-hwaccel=h264_vaapi +            --enable-hwaccel=vp8_vaapi +            --enable-hwaccel=vp9_vaapi +            --enable-libdrm) +        list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS +            ${LIBDRM_INCLUDE_DIRS} +            ${X11_INCLUDE_DIRS} +            ${LIBVA-DRM_INCLUDE_DIRS} +            ${LIBVA-X11_INCLUDE_DIRS} +            ${LIBVA_INCLUDE_DIRS} +        ) +        message(STATUS "VA-API found") +    else() +        set(FFmpeg_HWACCEL_FLAGS --disable-vaapi) +    endif() + +    if (FFNVCODEC_FOUND) +        list(APPEND FFmpeg_HWACCEL_FLAGS +            --enable-cuvid +            --enable-ffnvcodec +            --enable-nvdec +            --enable-hwaccel=h264_nvdec +            --enable-hwaccel=vp8_nvdec +            --enable-hwaccel=vp9_nvdec +        ) +        list(APPEND FFmpeg_HWACCEL_LIBRARIES ${FFNVCODEC_LIBRARIES}) +        list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${FFNVCODEC_INCLUDE_DIRS}) +        list(APPEND FFmpeg_HWACCEL_LDFLAGS ${FFNVCODEC_LDFLAGS}) +        message(STATUS "ffnvcodec libraries version ${FFNVCODEC_VERSION} found") +        # ffnvenc could load CUDA libraries at the runtime using dlopen/dlsym or LoadLibrary/GetProcAddress +        # here we handle the hard-linking senario where CUDA is linked during compilation +        if (CUDA_FOUND) +            list(APPEND FFmpeg_HWACCEL_FLAGS --extra-cflags=-I${CUDA_INCLUDE_DIRS}) +            list(APPEND FFmpeg_HWACCEL_LIBRARIES ${CUDA_LIBRARIES}) +            list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS}) +            list(APPEND FFmpeg_HWACCEL_LDFLAGS ${CUDA_LDFLAGS}) +            message(STATUS "CUDA libraries found, hard-linking will be performed") +        endif(CUDA_FOUND) +    endif() + +    if (VDPAU_FOUND) +        list(APPEND FFmpeg_HWACCEL_FLAGS +            --enable-vdpau +            --enable-hwaccel=h264_vdpau +            --enable-hwaccel=vp9_vdpau +        ) +        list(APPEND FFmpeg_HWACCEL_LIBRARIES ${VDPAU_LIBRARIES}) +        list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${VDPAU_INCLUDE_DIRS}) +        list(APPEND FFmpeg_HWACCEL_LDFLAGS ${VDPAU_LDFLAGS}) +        message(STATUS "vdpau libraries version ${VDPAU_VERSION} found") +    else() +        list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vdpau) +    endif() + +    # `configure` parameters builds only exactly what yuzu needs from FFmpeg +    # `--disable-vdpau` is needed to avoid linking issues +    add_custom_command( +        OUTPUT +            ${FFmpeg_MAKEFILE} +        COMMAND +            /bin/bash ${FFmpeg_PREFIX}/configure +                --disable-avdevice +                --disable-avfilter +                --disable-avformat +                --disable-doc +                --disable-everything +                --disable-ffmpeg +                --disable-ffprobe +                --disable-network +                --disable-postproc +                --disable-swresample +                --enable-decoder=h264 +                --enable-decoder=vp8 +                --enable-decoder=vp9 +                --cc="${CMAKE_C_COMPILER}" +                --cxx="${CMAKE_CXX_COMPILER}" +                ${FFmpeg_HWACCEL_FLAGS} +        WORKING_DIRECTORY +            ${FFmpeg_BUILD_DIR} +    ) +    unset(FFmpeg_HWACCEL_FLAGS) + +    # Workaround for Ubuntu 18.04's older version of make not being able to call make as a child +    # with context of the jobserver. Also helps ninja users. +    execute_process( +        COMMAND +            nproc +        OUTPUT_VARIABLE +            SYSTEM_THREADS) + +    set(FFmpeg_BUILD_LIBRARIES ${FFmpeg_LIBRARIES}) +    add_custom_command( +        OUTPUT +            ${FFmpeg_BUILD_LIBRARIES} +        COMMAND +            make -j${SYSTEM_THREADS} +        WORKING_DIRECTORY +            ${FFmpeg_BUILD_DIR} +    ) + +    set(FFmpeg_INCLUDE_DIR +        "${FFmpeg_PREFIX};${FFmpeg_BUILD_DIR};${FFmpeg_HWACCEL_INCLUDE_DIRS}" +        CACHE PATH "Path to FFmpeg headers" FORCE) + +    set(FFmpeg_LDFLAGS +        "${FFmpeg_HWACCEL_LDFLAGS}" +        CACHE STRING "FFmpeg linker flags" FORCE) + +    # ALL makes this custom target build every time +    # but it won't actually build if the DEPENDS parameter is up to date +    add_custom_target(ffmpeg-configure ALL DEPENDS ${FFmpeg_MAKEFILE}) +    add_custom_target(ffmpeg-build ALL DEPENDS ${FFmpeg_BUILD_LIBRARIES} ffmpeg-configure) +    link_libraries(${FFmpeg_LIBVA_LIBRARIES}) +    set(FFmpeg_LIBRARIES ${FFmpeg_BUILD_LIBRARIES} ${FFmpeg_HWACCEL_LIBRARIES} +        CACHE PATH "Paths to FFmpeg libraries" FORCE) +    unset(FFmpeg_BUILD_LIBRARIES) +    unset(FFmpeg_HWACCEL_FLAGS) +    unset(FFmpeg_HWACCEL_INCLUDE_DIRS) +    unset(FFmpeg_HWACCEL_LDFLAGS) +    unset(FFmpeg_HWACCEL_LIBRARIES) + +    if (FFmpeg_FOUND) +        message(STATUS "Found FFmpeg version ${FFmpeg_VERSION}") +    else() +        message(FATAL_ERROR "FFmpeg not found") +    endif() +else(WIN32) +    # Use yuzu FFmpeg binaries +    set(FFmpeg_EXT_NAME "ffmpeg-4.4") +    set(FFmpeg_PATH "${CMAKE_BINARY_DIR}/externals/${FFmpeg_EXT_NAME}") +    download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "") +    set(FFmpeg_FOUND YES) +    set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) +    set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE) +    set(FFmpeg_LDFLAGS "" CACHE STRING "FFmpeg linker flags" FORCE) +    set(FFmpeg_DLL_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg dll's" FORCE) +    set(FFmpeg_LIBRARIES +        ${FFmpeg_LIBRARY_DIR}/swscale.lib +        ${FFmpeg_LIBRARY_DIR}/avcodec.lib +        ${FFmpeg_LIBRARY_DIR}/avutil.lib +        CACHE PATH "Paths to FFmpeg libraries" FORCE) +endif(WIN32) + +unset(FFmpeg_COMPONENTS) diff --git a/externals/ffmpeg/ffmpeg b/externals/ffmpeg/ffmpeg new file mode 160000 +Subproject dc91b913b6260e85e1304c74ff7bb3c22a8c9fb diff --git a/src/video_core/command_classes/codecs/codec.cpp b/src/video_core/command_classes/codecs/codec.cpp index 2a532b883..868b82f9b 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;              }  | 
