diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 071461a18..7674a4e2b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,6 @@ jobs: - name: Release Setup id: release-setup uses: LizardByte/actions/actions/release_setup@ce5d2be83ba14f30062762579f46d074892c5dd0 # v2026.203.15239 - with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitmodules b/.gitmodules index c06ff0d4d..500eaf3f8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -9,7 +9,7 @@ [submodule "third-party/build-deps"] path = third-party/build-deps url = https://github.com/LizardByte/build-deps.git - branch = dist + branch = master [submodule "third-party/doxyconfig"] path = third-party/doxyconfig url = https://github.com/LizardByte/doxyconfig.git diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index 24a808837..b6afdfb21 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -27,52 +27,7 @@ pkg_check_modules(MINIUPNP miniupnpc REQUIRED) include_directories(SYSTEM ${MINIUPNP_INCLUDE_DIRS}) # ffmpeg pre-compiled binaries -if(NOT DEFINED FFMPEG_PREPARED_BINARIES) - if(WIN32) - set(FFMPEG_PLATFORM_LIBRARIES mfplat ole32 strmiids mfuuid vpl) - elseif(FREEBSD) - # numa is not available on FreeBSD - set(FFMPEG_PLATFORM_LIBRARIES va va-drm va-x11 X11) - elseif(UNIX AND NOT APPLE) - set(FFMPEG_PLATFORM_LIBRARIES numa va va-drm va-x11 X11) - endif() - set(FFMPEG_PREPARED_BINARIES - "${CMAKE_SOURCE_DIR}/third-party/build-deps/dist/${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") - - # check if the directory exists - if(NOT EXISTS "${FFMPEG_PREPARED_BINARIES}") - message(FATAL_ERROR - "FFmpeg pre-compiled binaries not found at ${FFMPEG_PREPARED_BINARIES}. \ - Please consider contributing to the LizardByte/build-deps repository. \ - Optionally, you can use the FFMPEG_PREPARED_BINARIES option to specify the path to the \ - system-installed FFmpeg libraries") - endif() - - if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") - set(HDR10_PLUS_LIBRARY - "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") - endif() - set(FFMPEG_LIBRARIES - "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libSvtAv1Enc.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libx264.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libx265.a" - ${HDR10_PLUS_LIBRARY} - ${FFMPEG_PLATFORM_LIBRARIES}) -else() - set(FFMPEG_LIBRARIES - "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a" - ${FFMPEG_PLATFORM_LIBRARIES}) -endif() - -set(FFMPEG_INCLUDE_DIRS - "${FFMPEG_PREPARED_BINARIES}/include") +include("${CMAKE_MODULE_PATH}/dependencies/ffmpeg.cmake") # platform specific dependencies if(WIN32) diff --git a/cmake/dependencies/ffmpeg.cmake b/cmake/dependencies/ffmpeg.cmake new file mode 100644 index 000000000..e13518cfe --- /dev/null +++ b/cmake/dependencies/ffmpeg.cmake @@ -0,0 +1,166 @@ +# +# Loads FFmpeg pre-compiled binaries from GitHub releases or a user-specified path +# +include_guard(GLOBAL) + +# ffmpeg pre-compiled binaries +if(NOT DEFINED FFMPEG_PREPARED_BINARIES) + # Set platform-specific libraries + if(WIN32) + set(FFMPEG_PLATFORM_LIBRARIES mfplat ole32 strmiids mfuuid vpl) + elseif(FREEBSD) + # numa is not available on FreeBSD + set(FFMPEG_PLATFORM_LIBRARIES va va-drm va-x11 X11) + elseif(UNIX AND NOT APPLE) + set(FFMPEG_PLATFORM_LIBRARIES numa va va-drm va-x11 X11) + endif() + + # Determine download location + set(FFMPEG_DOWNLOAD_DIR "${CMAKE_BINARY_DIR}/_deps") + + # Get the current commit/tag from the build-deps submodule + execute_process( + COMMAND git -C "${CMAKE_SOURCE_DIR}/third-party/build-deps" describe --tags --exact-match + OUTPUT_VARIABLE FFMPEG_RELEASE_TAG + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + + # If no exact tag match, try to get the commit hash and look for a tag + if(NOT FFMPEG_RELEASE_TAG) + execute_process( + COMMAND git -C "${CMAKE_SOURCE_DIR}/third-party/build-deps" rev-parse HEAD + OUTPUT_VARIABLE BUILD_DEPS_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + + # Try to find a tag that points to this commit + execute_process( + COMMAND git -C "${CMAKE_SOURCE_DIR}/third-party/build-deps" tag --points-at ${BUILD_DEPS_COMMIT} + OUTPUT_VARIABLE FFMPEG_RELEASE_TAG + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + endif() + + # Set GitHub release URL + set(FFMPEG_GITHUB_REPO "LizardByte/build-deps") + if(FFMPEG_RELEASE_TAG) + set(FFMPEG_RELEASE_URL "https://github.com/${FFMPEG_GITHUB_REPO}/releases/download/${FFMPEG_RELEASE_TAG}") + set(FFMPEG_VERSION_DIR "${FFMPEG_DOWNLOAD_DIR}/ffmpeg-${FFMPEG_RELEASE_TAG}") + message(STATUS "Using FFmpeg from build-deps tag: ${FFMPEG_RELEASE_TAG}") + else() + set(FFMPEG_RELEASE_URL "https://github.com/${FFMPEG_GITHUB_REPO}/releases/latest/download") + set(FFMPEG_VERSION_DIR "${FFMPEG_DOWNLOAD_DIR}/ffmpeg-latest") + message(STATUS "Using FFmpeg from latest build-deps release") + endif() + + # Set extraction directory and prepared binaries path + set(FFMPEG_EXTRACT_DIR "${FFMPEG_DOWNLOAD_DIR}") + set(FFMPEG_PREPARED_BINARIES "${FFMPEG_EXTRACT_DIR}/ffmpeg") + + # Set the archive filename based on architecture + set(FFMPEG_ARCHIVE_NAME "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}-ffmpeg.tar.gz") + set(FFMPEG_ARCHIVE_PATH "${FFMPEG_VERSION_DIR}/${FFMPEG_ARCHIVE_NAME}") + set(FFMPEG_DOWNLOAD_URL "${FFMPEG_RELEASE_URL}/${FFMPEG_ARCHIVE_NAME}") + + # Check if already downloaded and extracted + if(NOT EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a") + # Check if we need to download the archive + if(NOT EXISTS "${FFMPEG_ARCHIVE_PATH}") + message(STATUS "Downloading FFmpeg binaries from ${FFMPEG_DOWNLOAD_URL}") + + # Download the archive + file(DOWNLOAD + "${FFMPEG_DOWNLOAD_URL}" + "${FFMPEG_ARCHIVE_PATH}" + SHOW_PROGRESS + STATUS FFMPEG_DOWNLOAD_STATUS + TIMEOUT 300 + ) + + # Check download status + list(GET FFMPEG_DOWNLOAD_STATUS 0 FFMPEG_DOWNLOAD_STATUS_CODE) + list(GET FFMPEG_DOWNLOAD_STATUS 1 FFMPEG_DOWNLOAD_STATUS_MESSAGE) + + if(NOT FFMPEG_DOWNLOAD_STATUS_CODE EQUAL 0) + message(FATAL_ERROR "Failed to download FFmpeg binaries: ${FFMPEG_DOWNLOAD_STATUS_MESSAGE}") + endif() + else() + message(STATUS "Using cached FFmpeg archive at ${FFMPEG_ARCHIVE_PATH}") + endif() + + # Extract the archive + message(STATUS "Extracting FFmpeg binaries to ${FFMPEG_EXTRACT_DIR}") + file(ARCHIVE_EXTRACT # cmake-lint: disable=E1126 + INPUT "${FFMPEG_ARCHIVE_PATH}" + DESTINATION "${FFMPEG_EXTRACT_DIR}" + ) + + # Verify extraction + if(NOT EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a") + message(FATAL_ERROR "FFmpeg extraction failed or unexpected directory structure") + endif() + + message(STATUS "FFmpeg binaries successfully downloaded and extracted") + else() + message(STATUS "Using existing FFmpeg binaries at ${FFMPEG_PREPARED_BINARIES}") + endif() + + # Set FFmpeg libraries + if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") + set(HDR10_PLUS_LIBRARY "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") + endif() + + set(FFMPEG_LIBRARIES + "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libSvtAv1Enc.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libx264.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libx265.a" + ${HDR10_PLUS_LIBRARY} + ${FFMPEG_PLATFORM_LIBRARIES} + ) +else() + # User provided FFMPEG_PREPARED_BINARIES path + message(STATUS "Using user-specified FFmpeg binaries at ${FFMPEG_PREPARED_BINARIES}") + + # Set platform-specific libraries + if(WIN32) + set(FFMPEG_PLATFORM_LIBRARIES mfplat ole32 strmiids mfuuid vpl) + elseif(FREEBSD) + set(FFMPEG_PLATFORM_LIBRARIES va va-drm va-x11 X11) + elseif(UNIX AND NOT APPLE) + set(FFMPEG_PLATFORM_LIBRARIES numa va va-drm va-x11 X11) + endif() + + # Set base FFmpeg libraries (always required) + set(FFMPEG_LIBRARIES + "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a" + ) + + # Add optional libraries if they exist (e.g., from prebuilt packages) + if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libSvtAv1Enc.a") + list(APPEND FFMPEG_LIBRARIES "${FFMPEG_PREPARED_BINARIES}/lib/libSvtAv1Enc.a") + endif() + if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libx264.a") + list(APPEND FFMPEG_LIBRARIES "${FFMPEG_PREPARED_BINARIES}/lib/libx264.a") + endif() + if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libx265.a") + list(APPEND FFMPEG_LIBRARIES "${FFMPEG_PREPARED_BINARIES}/lib/libx265.a") + endif() + if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") + list(APPEND FFMPEG_LIBRARIES "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") + endif() + + # Add platform libraries + list(APPEND FFMPEG_LIBRARIES ${FFMPEG_PLATFORM_LIBRARIES}) +endif() + +set(FFMPEG_INCLUDE_DIRS "${FFMPEG_PREPARED_BINARIES}/include") diff --git a/packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.yml b/packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.yml index 655816147..74b9baa12 100644 --- a/packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.yml +++ b/packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.yml @@ -46,6 +46,9 @@ modules: # Caching is configured until here, not including CUDA, since it is too large for GitHub cache - "modules/cuda.json" + # FFmpeg prebuilt binaries + - "modules/ffmpeg.json" + - name: sunshine builddir: true build-options: @@ -66,6 +69,7 @@ modules: - -DBUILD_WERROR=ON - -DCMAKE_BUILD_TYPE=Release - -DCMAKE_CUDA_COMPILER=/app/cuda/bin/nvcc + - -DFFMPEG_PREPARED_BINARIES=/app/ffmpeg - -DSUNSHINE_ASSETS_DIR=share/sunshine - -DSUNSHINE_BUILD_FLATPAK=ON - -DSUNSHINE_EXECUTABLE_PATH=/app/bin/sunshine diff --git a/packaging/linux/flatpak/modules/ffmpeg.json b/packaging/linux/flatpak/modules/ffmpeg.json new file mode 100644 index 000000000..5af9a85e8 --- /dev/null +++ b/packaging/linux/flatpak/modules/ffmpeg.json @@ -0,0 +1,40 @@ +{ + "name": "ffmpeg-prebuilt", + "buildsystem": "simple", + "build-commands": [ + "mkdir -p /app/ffmpeg", + "tar -xzf ffmpeg.tar.gz -C /app/ffmpeg --strip-components=1" + ], + "sources": [ + { + "type": "file", + "url": "https://github.com/LizardByte/build-deps/releases/download/v2026.209.233149/Linux-x86_64-ffmpeg.tar.gz", + "sha256": "bb2375992213bda08b666643495297c3fcdd08cf08600cf4dfd42eee52556e55", + "dest-filename": "ffmpeg.tar.gz", + "only-arches": [ + "x86_64" + ], + "x-checker-data": { + "type": "json", + "url": "https://api.github.com/repos/LizardByte/build-deps/releases/latest", + "version-query": ".tag_name", + "url-query": ".assets[] | select(.name==\"Linux-x86_64-ffmpeg.tar.gz\") | .browser_download_url" + } + }, + { + "type": "file", + "url": "https://github.com/LizardByte/build-deps/releases/download/v2026.209.233149/Linux-aarch64-ffmpeg.tar.gz", + "sha256": "841f8ac4586ee1465a357a2ad3eab6cfb2a1677188508eefe150596fd0024ad9", + "dest-filename": "ffmpeg.tar.gz", + "only-arches": [ + "aarch64" + ], + "x-checker-data": { + "type": "json", + "url": "https://api.github.com/repos/LizardByte/build-deps/releases/latest", + "version-query": ".tag_name", + "url-query": ".assets[] | select(.name==\"Linux-aarch64-ffmpeg.tar.gz\") | .browser_download_url" + } + } + ] +} diff --git a/third-party/build-deps b/third-party/build-deps index 4f5e8b264..d4b980b18 160000 --- a/third-party/build-deps +++ b/third-party/build-deps @@ -1 +1 @@ -Subproject commit 4f5e8b264e9854a050f6e0ad4e194723c4988aa5 +Subproject commit d4b980b189f70172030f26d2360d031db443ee3d