diff options
| author | 2022-12-30 00:29:53 -0800 | |
|---|---|---|
| committer | 2023-06-03 00:05:26 -0700 | |
| commit | 851b1008a881010b90002f4af9d0a4ac36710fea (patch) | |
| tree | 6f808aeacafa6fc3dbfdd149940f068291815878 | |
| parent | cmake: Integrate submoduled LLVM & fixes for Android. (diff) | |
| download | yuzu-851b1008a881010b90002f4af9d0a4ac36710fea.tar.gz yuzu-851b1008a881010b90002f4af9d0a4ac36710fea.tar.xz yuzu-851b1008a881010b90002f4af9d0a4ac36710fea.zip | |
cmake: Integrate bundled FFmpeg for Android.
| -rw-r--r-- | CMakeModules/DownloadExternals.cmake | 7 | ||||
| -rw-r--r-- | externals/ffmpeg/CMakeLists.txt | 64 | ||||
| -rw-r--r-- | src/video_core/CMakeLists.txt | 2 |
3 files changed, 63 insertions, 10 deletions
diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index 8fe5ba48d..814069f0b 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | # prefix_var: name of a variable which will be set with the path to the extracted contents | 7 | # prefix_var: name of a variable which will be set with the path to the extracted contents |
| 8 | function(download_bundled_external remote_path lib_name prefix_var) | 8 | function(download_bundled_external remote_path lib_name prefix_var) |
| 9 | 9 | ||
| 10 | set(package_base_url "https://github.com/yuzu-emu/") | ||
| 10 | set(package_repo "no_platform") | 11 | set(package_repo "no_platform") |
| 11 | set(package_extension "no_platform") | 12 | set(package_extension "no_platform") |
| 12 | if (WIN32) | 13 | if (WIN32) |
| @@ -15,10 +16,14 @@ if (WIN32) | |||
| 15 | elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") | 16 | elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") |
| 16 | set(package_repo "ext-linux-bin/raw/main/") | 17 | set(package_repo "ext-linux-bin/raw/main/") |
| 17 | set(package_extension ".tar.xz") | 18 | set(package_extension ".tar.xz") |
| 19 | elseif (ANDROID) | ||
| 20 | set(package_base_url "https://gitlab.com/tertius42/") | ||
| 21 | set(package_repo "ext-android-bin/-/raw/main/") | ||
| 22 | set(package_extension ".tar.xz") #ffmpeg/ffmpeg-android-20221229.tar.xz") | ||
| 18 | else() | 23 | else() |
| 19 | message(FATAL_ERROR "No package available for this platform") | 24 | message(FATAL_ERROR "No package available for this platform") |
| 20 | endif() | 25 | endif() |
| 21 | set(package_url "https://github.com/yuzu-emu/${package_repo}") | 26 | set(package_url "${package_base_url}${package_repo}") |
| 22 | 27 | ||
| 23 | set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}") | 28 | set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}") |
| 24 | if (NOT EXISTS "${prefix}") | 29 | if (NOT EXISTS "${prefix}") |
diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index 03fad0778..093616629 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # SPDX-FileCopyrightText: 2021 yuzu Emulator Project | 1 | # SPDX-FileCopyrightText: 2021 yuzu Emulator Project |
| 2 | # SPDX-License-Identifier: GPL-2.0-or-later | 2 | # SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | if (NOT WIN32) | 4 | if (NOT WIN32 AND NOT ANDROID) |
| 5 | # Build FFmpeg from externals | 5 | # Build FFmpeg from externals |
| 6 | message(STATUS "Using FFmpeg from externals") | 6 | message(STATUS "Using FFmpeg from externals") |
| 7 | 7 | ||
| @@ -44,10 +44,12 @@ if (NOT WIN32) | |||
| 44 | endforeach() | 44 | endforeach() |
| 45 | 45 | ||
| 46 | find_package(PkgConfig REQUIRED) | 46 | find_package(PkgConfig REQUIRED) |
| 47 | pkg_check_modules(LIBVA libva) | 47 | if (NOT ANDROID) |
| 48 | pkg_check_modules(CUDA cuda) | 48 | pkg_check_modules(LIBVA libva) |
| 49 | pkg_check_modules(FFNVCODEC ffnvcodec) | 49 | pkg_check_modules(CUDA cuda) |
| 50 | pkg_check_modules(VDPAU vdpau) | 50 | pkg_check_modules(FFNVCODEC ffnvcodec) |
| 51 | pkg_check_modules(VDPAU vdpau) | ||
| 52 | endif() | ||
| 51 | 53 | ||
| 52 | set(FFmpeg_HWACCEL_LIBRARIES) | 54 | set(FFmpeg_HWACCEL_LIBRARIES) |
| 53 | set(FFmpeg_HWACCEL_FLAGS) | 55 | set(FFmpeg_HWACCEL_FLAGS) |
| @@ -121,6 +123,26 @@ if (NOT WIN32) | |||
| 121 | list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vdpau) | 123 | list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vdpau) |
| 122 | endif() | 124 | endif() |
| 123 | 125 | ||
| 126 | find_program(BASH_PROGRAM bash REQUIRED) | ||
| 127 | |||
| 128 | set(FFmpeg_CROSS_COMPILE_FLAGS "") | ||
| 129 | if (ANDROID) | ||
| 130 | string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" FFmpeg_HOST_SYSTEM_NAME) | ||
| 131 | set(TOOLCHAIN "${ANDROID_NDK}/toolchains/llvm/prebuilt/${FFmpeg_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}") | ||
| 132 | set(SYSROOT "${TOOLCHAIN}/sysroot") | ||
| 133 | set(FFmpeg_CPU "armv8-a") | ||
| 134 | list(APPEND FFmpeg_CROSS_COMPILE_FLAGS | ||
| 135 | --arch=arm64 | ||
| 136 | #--cpu=${FFmpeg_CPU} | ||
| 137 | --enable-cross-compile | ||
| 138 | --cross-prefix=${TOOLCHAIN}/bin/aarch64-linux-android- | ||
| 139 | --sysroot=${SYSROOT} | ||
| 140 | --target-os=android | ||
| 141 | --extra-ldflags="--ld-path=${TOOLCHAIN}/bin/ld.lld" | ||
| 142 | --extra-ldflags="-nostdlib" | ||
| 143 | ) | ||
| 144 | endif() | ||
| 145 | |||
| 124 | # `configure` parameters builds only exactly what yuzu needs from FFmpeg | 146 | # `configure` parameters builds only exactly what yuzu needs from FFmpeg |
| 125 | # `--disable-vdpau` is needed to avoid linking issues | 147 | # `--disable-vdpau` is needed to avoid linking issues |
| 126 | set(FFmpeg_CC ${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER}) | 148 | set(FFmpeg_CC ${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER}) |
| @@ -129,7 +151,7 @@ if (NOT WIN32) | |||
| 129 | OUTPUT | 151 | OUTPUT |
| 130 | ${FFmpeg_MAKEFILE} | 152 | ${FFmpeg_MAKEFILE} |
| 131 | COMMAND | 153 | COMMAND |
| 132 | /bin/bash ${FFmpeg_PREFIX}/configure | 154 | ${BASH_PROGRAM} ${FFmpeg_PREFIX}/configure |
| 133 | --disable-avdevice | 155 | --disable-avdevice |
| 134 | --disable-avformat | 156 | --disable-avformat |
| 135 | --disable-doc | 157 | --disable-doc |
| @@ -146,12 +168,14 @@ if (NOT WIN32) | |||
| 146 | --cc="${FFmpeg_CC}" | 168 | --cc="${FFmpeg_CC}" |
| 147 | --cxx="${FFmpeg_CXX}" | 169 | --cxx="${FFmpeg_CXX}" |
| 148 | ${FFmpeg_HWACCEL_FLAGS} | 170 | ${FFmpeg_HWACCEL_FLAGS} |
| 171 | ${FFmpeg_CROSS_COMPILE_FLAGS} | ||
| 149 | WORKING_DIRECTORY | 172 | WORKING_DIRECTORY |
| 150 | ${FFmpeg_BUILD_DIR} | 173 | ${FFmpeg_BUILD_DIR} |
| 151 | ) | 174 | ) |
| 152 | unset(FFmpeg_CC) | 175 | unset(FFmpeg_CC) |
| 153 | unset(FFmpeg_CXX) | 176 | unset(FFmpeg_CXX) |
| 154 | unset(FFmpeg_HWACCEL_FLAGS) | 177 | unset(FFmpeg_HWACCEL_FLAGS) |
| 178 | unset(FFmpeg_CROSS_COMPILE_FLAGS) | ||
| 155 | 179 | ||
| 156 | # Workaround for Ubuntu 18.04's older version of make not being able to call make as a child | 180 | # Workaround for Ubuntu 18.04's older version of make not being able to call make as a child |
| 157 | # with context of the jobserver. Also helps ninja users. | 181 | # with context of the jobserver. Also helps ninja users. |
| @@ -197,7 +221,32 @@ if (NOT WIN32) | |||
| 197 | else() | 221 | else() |
| 198 | message(FATAL_ERROR "FFmpeg not found") | 222 | message(FATAL_ERROR "FFmpeg not found") |
| 199 | endif() | 223 | endif() |
| 200 | else(WIN32) | 224 | elseif(ANDROID) |
| 225 | # Use yuzu FFmpeg binaries | ||
| 226 | set(FFmpeg_EXT_NAME "ffmpeg-android-v4.4.LTS") | ||
| 227 | set(FFmpeg_PATH "${CMAKE_BINARY_DIR}/externals/${FFmpeg_EXT_NAME}") | ||
| 228 | download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "") | ||
| 229 | set(FFmpeg_FOUND YES) | ||
| 230 | set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) | ||
| 231 | set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/lib" CACHE PATH "Path to FFmpeg library directory" FORCE) | ||
| 232 | set(FFmpeg_LDFLAGS "" CACHE STRING "FFmpeg linker flags" FORCE) | ||
| 233 | set(FFmpeg_LIBRARIES | ||
| 234 | ${FFmpeg_LIBRARY_DIR}/libavcodec.so | ||
| 235 | ${FFmpeg_LIBRARY_DIR}/libavdevice.so | ||
| 236 | ${FFmpeg_LIBRARY_DIR}/libavfilter.so | ||
| 237 | ${FFmpeg_LIBRARY_DIR}/libavformat.so | ||
| 238 | ${FFmpeg_LIBRARY_DIR}/libavutil.so | ||
| 239 | ${FFmpeg_LIBRARY_DIR}/libswresample.so | ||
| 240 | ${FFmpeg_LIBRARY_DIR}/libswscale.so | ||
| 241 | ${FFmpeg_LIBRARY_DIR}/libvpx.a | ||
| 242 | ${FFmpeg_LIBRARY_DIR}/libx264.a | ||
| 243 | CACHE PATH "Paths to FFmpeg libraries" FORCE) | ||
| 244 | # exported variables | ||
| 245 | set(FFmpeg_PATH "${FFmpeg_PATH}" PARENT_SCOPE) | ||
| 246 | set(FFmpeg_LDFLAGS "${FFmpeg_LDFLAGS}" PARENT_SCOPE) | ||
| 247 | set(FFmpeg_LIBRARIES "${FFmpeg_LIBRARIES}" PARENT_SCOPE) | ||
| 248 | set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE) | ||
| 249 | elseif(WIN32) | ||
| 201 | # Use yuzu FFmpeg binaries | 250 | # Use yuzu FFmpeg binaries |
| 202 | set(FFmpeg_EXT_NAME "ffmpeg-5.1.3") | 251 | set(FFmpeg_EXT_NAME "ffmpeg-5.1.3") |
| 203 | set(FFmpeg_PATH "${CMAKE_BINARY_DIR}/externals/${FFmpeg_EXT_NAME}") | 252 | set(FFmpeg_PATH "${CMAKE_BINARY_DIR}/externals/${FFmpeg_EXT_NAME}") |
| @@ -206,7 +255,6 @@ else(WIN32) | |||
| 206 | set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) | 255 | set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) |
| 207 | set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE) | 256 | set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE) |
| 208 | set(FFmpeg_LDFLAGS "" CACHE STRING "FFmpeg linker flags" FORCE) | 257 | set(FFmpeg_LDFLAGS "" CACHE STRING "FFmpeg linker flags" FORCE) |
| 209 | set(FFmpeg_DLL_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg dll's" FORCE) | ||
| 210 | set(FFmpeg_LIBRARIES | 258 | set(FFmpeg_LIBRARIES |
| 211 | ${FFmpeg_LIBRARY_DIR}/swscale.lib | 259 | ${FFmpeg_LIBRARY_DIR}/swscale.lib |
| 212 | ${FFmpeg_LIBRARY_DIR}/avcodec.lib | 260 | ${FFmpeg_LIBRARY_DIR}/avcodec.lib |
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 308d013d6..027259f57 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt | |||
| @@ -281,7 +281,7 @@ create_target_directory_groups(video_core) | |||
| 281 | target_link_libraries(video_core PUBLIC common core) | 281 | target_link_libraries(video_core PUBLIC common core) |
| 282 | target_link_libraries(video_core PUBLIC glad shader_recompiler stb) | 282 | target_link_libraries(video_core PUBLIC glad shader_recompiler stb) |
| 283 | 283 | ||
| 284 | if (YUZU_USE_BUNDLED_FFMPEG AND NOT WIN32) | 284 | if (YUZU_USE_BUNDLED_FFMPEG AND NOT (WIN32 OR ANDROID)) |
| 285 | add_dependencies(video_core ffmpeg-build) | 285 | add_dependencies(video_core ffmpeg-build) |
| 286 | endif() | 286 | endif() |
| 287 | 287 | ||