Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,7 @@ jobs:
x11/libxcb \
x11/libXext \
x11/libXfixes \
x11/libXrandr \
x11/xorgproto

# create symlink for shebang bash compatibility
Expand Down
8 changes: 8 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,11 @@
path = third-party/FFmpeg/SVT-AV1
url = https://github.com/LizardByte-infrastructure/SVT-AV1.git
branch = master
[submodule "third-party/FFmpeg/Vulkan-Headers"]
path = third-party/FFmpeg/Vulkan-Headers
url = https://github.com/KhronosGroup/Vulkan-Headers.git
branch = main
[submodule "third-party/FFmpeg/Vulkan-Loader"]
path = third-party/FFmpeg/Vulkan-Loader
url = https://github.com/KhronosGroup/Vulkan-Loader.git
branch = main
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ option(BUILD_FFMPEG_X264 "Build FFmpeg x264" ON)
option(BUILD_FFMPEG_X264_PATCHES "Apply FFmpeg x264 patches" ON)
option(BUILD_FFMPEG_X265 "Build FFmpeg x265" ON)
option(BUILD_FFMPEG_X265_PATCHES "Apply FFmpeg x265 patches" ON)
option(BUILD_FFMPEG_VULKAN "Build FFmpeg with Vulkan video encoding support" ON)

# common includes
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/apply_git_patch.cmake)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ pkg install -y \

```bash
sudo apt install -y \
autoconf \
autoconf \
automake \
build-essential \
cmake \
Expand Down
9 changes: 8 additions & 1 deletion cmake/ffmpeg/_main.cmake
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# the destination directory needs to be same level down as the original source directory
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/third-party/FFmpeg DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/third-party/FFmpeg DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
PATTERN "Vulkan-Loader/tests" EXCLUDE) # vulkan loader test files contain emojis in file names which can fail

set(FFMPEG_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/FFmpeg)
set(AVCODEC_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/libavcodec)

if(WIN32)
set(BUILD_FFMPEG_LIBVA OFF)
set(BUILD_FFMPEG_VULKAN OFF)

# We must disable CUDA and NVENC on ARM64 until following issues is resolved
# https://github.com/FFmpeg/FFmpeg/blob/4e5523c98597a417eb43555933b1075d18ec5f8b/configure#L7443
Expand All @@ -17,6 +19,7 @@ elseif(APPLE)
set(BUILD_FFMPEG_MF OFF)
set(BUILD_FFMPEG_NV_CODEC_HEADERS OFF)
set(BUILD_FFMPEG_LIBVA OFF)
set(BUILD_FFMPEG_VULKAN OFF)
elseif(FREEBSD)
set(BUILD_FFMPEG_AMF OFF)
set(BUILD_FFMPEG_MF OFF)
Expand Down Expand Up @@ -50,6 +53,10 @@ if(BUILD_FFMPEG_LIBVA)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/libva.cmake)
endif()

if(BUILD_FFMPEG_VULKAN)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/vulkan.cmake)
endif()

if(BUILD_FFMPEG_X264)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/x264.cmake)
endif()
Expand Down
11 changes: 11 additions & 0 deletions cmake/ffmpeg/ffmpeg.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,11 @@ list(APPEND FFMPEG_EXTRA_CONFIGURE
--extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/usr/local/include'
--extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/x264/include'
--extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/libva/include'
--extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/include'
--extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/usr/local/lib'
--extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/x264/lib'
--extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/libva/lib'
--extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/lib'
--extra-libs='-lpthread -lm'
--disable-all
--disable-autodetect
Expand Down Expand Up @@ -83,6 +85,12 @@ if(BUILD_FFMPEG_LIBVA)
--enable-encoder=h264_vaapi,hevc_vaapi,av1_vaapi
)
endif()
if(BUILD_FFMPEG_VULKAN)
list(APPEND FFMPEG_EXTRA_CONFIGURE
--enable-vulkan
--enable-encoder=h264_vulkan,hevc_vulkan,av1_vulkan
)
endif()
if(BUILD_FFMPEG_X264)
list(APPEND FFMPEG_EXTRA_CONFIGURE
--enable-libx264
Expand Down Expand Up @@ -167,6 +175,9 @@ endif()
if(BUILD_FFMPEG_LIBVA)
add_dependencies(ffmpeg libva)
endif()
if(BUILD_FFMPEG_VULKAN)
add_dependencies(ffmpeg vulkan-loader)
endif()
if(BUILD_FFMPEG_X264)
add_dependencies(ffmpeg x264)
endif()
Expand Down
81 changes: 81 additions & 0 deletions cmake/ffmpeg/vulkan.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Vulkan Headers
set(VULKAN_HEADERS_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/Vulkan-Headers)

add_custom_target(vulkan-headers ALL
COMMAND ${CMAKE_COMMAND}
-S ${VULKAN_HEADERS_GENERATED_SRC_PATH}
-B ${CMAKE_CURRENT_BINARY_DIR}/vulkan-headers-build
-G "${CMAKE_GENERATOR}"
-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/vulkan
-DCMAKE_BUILD_TYPE=Release
COMMAND ${CMAKE_COMMAND}
--build ${CMAKE_CURRENT_BINARY_DIR}/vulkan-headers-build
--target install
WORKING_DIRECTORY ${VULKAN_HEADERS_GENERATED_SRC_PATH}
COMMENT "Target: Vulkan-Headers"
VERBATIM
)
add_dependencies(${CMAKE_PROJECT_NAME} vulkan-headers)

# Vulkan Loader
set(VULKAN_LOADER_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/Vulkan-Loader)

# Configure options for Vulkan-Loader
set(VULKAN_LOADER_CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/vulkan
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DVULKAN_HEADERS_INSTALL_DIR=${CMAKE_CURRENT_BINARY_DIR}/vulkan
-DBUILD_STATIC_LOADER=ON
-DBUILD_SHARED_LIBS=OFF
-DBUILD_TESTS=OFF
-DENABLE_WERROR=OFF
)

# Enable Wayland and X11 WSI for Linux and FreeBSD builds
if(UNIX AND NOT APPLE)
list(APPEND VULKAN_LOADER_CMAKE_ARGS
-DBUILD_WSI_WAYLAND_SUPPORT=ON
-DBUILD_WSI_XCB_SUPPORT=ON
-DBUILD_WSI_XLIB_SUPPORT=ON
)
endif()

if(CMAKE_CROSSCOMPILING)
list(APPEND VULKAN_LOADER_CMAKE_ARGS
-DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
-DCMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
)
if(UNIX AND NOT APPLE)
list(APPEND VULKAN_LOADER_CMAKE_ARGS
-DCMAKE_C_COMPILER_TARGET=${CMAKE_C_COMPILER_TARGET}
-DCMAKE_CXX_COMPILER_TARGET=${CMAKE_CXX_COMPILER_TARGET}
)
endif()
endif()

add_custom_target(vulkan-loader ALL
COMMAND ${CMAKE_COMMAND}
-S ${VULKAN_LOADER_GENERATED_SRC_PATH}
-B ${CMAKE_CURRENT_BINARY_DIR}/vulkan-loader-build
-G "${CMAKE_GENERATOR}"
${VULKAN_LOADER_CMAKE_ARGS}
COMMAND ${CMAKE_COMMAND}
--build ${CMAKE_CURRENT_BINARY_DIR}/vulkan-loader-build
--config Release
--target install
-- --jobs=${N_PROC}
WORKING_DIRECTORY ${VULKAN_LOADER_GENERATED_SRC_PATH}
COMMENT "Target: Vulkan-Loader"
VERBATIM
BYPRODUCTS
"${CMAKE_CURRENT_BINARY_DIR}/vulkan/lib/libvulkan.a"
)
add_dependencies(vulkan-loader vulkan-headers)
add_dependencies(${CMAKE_PROJECT_NAME} vulkan-loader)

# Add to PKG_CONFIG_PATH for FFmpeg to find
set(PKG_CONFIG_PATH "${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/lib/pkgconfig:${PKG_CONFIG_PATH}")
1 change: 1 addition & 0 deletions third-party/FFmpeg/Vulkan-Headers
Submodule Vulkan-Headers added at 49f1a3
1 change: 1 addition & 0 deletions third-party/FFmpeg/Vulkan-Loader
Submodule Vulkan-Loader added at 5ad4fe