Skip to content

Commit

Permalink
cmake: download and use only necessary prebuilt FFMPEG
Browse files Browse the repository at this point in the history
  • Loading branch information
KhoraLee authored and Macdu committed Mar 12, 2024
1 parent e402f12 commit c03c738
Show file tree
Hide file tree
Showing 22 changed files with 63 additions and 22 deletions.
85 changes: 63 additions & 22 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,75 @@ endif()
add_library(${FFMPEG_CORE_NAME} INTERFACE)

target_include_directories(${FFMPEG_CORE_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")

# Detect OS
if (WIN32 AND NOT MINGW)
set(FFMPEG_PREBUILTS_NAME "ffmpeg-windows")
elseif (APPLE)
set(FFMPEG_PREBUILTS_NAME "ffmpeg-macos")
elseif (UNIX)
set(FFMPEG_PREBUILTS_NAME "ffmpeg-linux")
else ()
message(FATAL_ERROR "Unsupported OS.")
endif ()

# Detect Architecture
if(NOT DEFINED ARCHITECTURE)
message(FATAL_ERROR "ARCHITECTURE variable is not set up")
elseif (ARCHITECTURE STREQUAL "x86_64")
set(FFMPEG_PREBUILTS_NAME "${FFMPEG_PREBUILTS_NAME}-x64.zip")
elseif(ARCHITECTURE STREQUAL "arm64")
set(FFMPEG_PREBUILTS_NAME "${FFMPEG_PREBUILTS_NAME}-arm64.zip")
elseif(APPLE AND "x86_64" IN_LIST ARCHITECTURE AND "arm64" IN_LIST ARCHITECTURE) # macOS universal
set(FFMPEG_PREBUILTS_NAME "${FFMPEG_PREBUILTS_NAME}-universal.zip")
else ()
message(FATAL_ERROR "Unsupported architecture.")
endif()

# Compute current short git commit SHA
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE FFMPEG_GIT_SHA
OUTPUT_STRIP_TRAILING_WHITESPACE)

# Download prebuilt ffmpeg
if(NOT EXISTS "${CMAKE_BINARY_DIR}/external/ffmpeg.zip")
message(STATUS "Downloading FFMPEG prebuilts...")
file(DOWNLOAD https://github.com/Vita3K/ffmpeg-core/releases/download/${FFMPEG_GIT_SHA}/${FFMPEG_PREBUILTS_NAME}
"${CMAKE_BINARY_DIR}/external/ffmpeg.zip" SHOW_PROGRESS
STATUS FILE_STATUS)
list(GET FILE_STATUS 0 STATUS_CODE)
if (NOT STATUS_CODE EQUAL 0)
file(REMOVE "${CMAKE_BINARY_DIR}/external/ffmpeg.zip") # CMake create 0 byte file even if URL is invalid. So need to delete it.
message(FATAL_ERROR "No FFMPEG prebuilt found with corresponding commit SHA (${FFMPEG_GIT_SHA})")
endif()
endif()

if(NOT EXISTS "${CMAKE_BINARY_DIR}/external/ffmpeg/lib")
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/external/ffmpeg/lib")
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf "${CMAKE_BINARY_DIR}/external/ffmpeg.zip"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/external/ffmpeg/lib")
endif()

set(LIB_PREFIX "lib")
set(LIB_EXT "a")
if (WIN32 AND NOT MINGW)
set(LIB_PREFIX "")
set(LIB_EXT "lib")
target_link_libraries(${FFMPEG_CORE_NAME} INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/lib/windows/x86_64/avformat.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/windows/x86_64/avcodec.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/windows/x86_64/swscale.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/windows/x86_64/avutil.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/windows/x86_64/avfilter.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/windows/x86_64/swresample.lib"
"psapi;strmiids;uuid;oleaut32;shlwapi;ws2_32;ole32;user32;bcrypt")
elseif (APPLE)
target_link_libraries(${FFMPEG_CORE_NAME} INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/lib/macos/libavformat.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/macos/libavcodec.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/macos/libswscale.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/macos/libavutil.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/macos/libavfilter.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/macos/libswresample.a"
"-framework CoreServices" "-framework CoreFoundation" "-framework AudioUnit"
"-framework AudioToolbox" "-framework CoreAudio" "-framework CoreMedia"
"-framework VideoToolbox" "-framework CoreVideo" "-framework Security")
elseif (UNIX)
target_link_libraries(${FFMPEG_CORE_NAME} INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/x86_64/libavformat.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/x86_64/libavcodec.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/x86_64/libswscale.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/x86_64/libavutil.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/x86_64/libavfilter.a"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/linux/x86_64/libswresample.a")
else ()
message(FATAL_ERROR "No prebuilt was found for ffmpeg")
endif ()

target_link_libraries(${FFMPEG_CORE_NAME} INTERFACE
"${CMAKE_BINARY_DIR}/external/ffmpeg/lib/${LIB_PREFIX}avformat.${LIB_EXT}"
"${CMAKE_BINARY_DIR}/external/ffmpeg/lib/${LIB_PREFIX}avcodec.${LIB_EXT}"
"${CMAKE_BINARY_DIR}/external/ffmpeg/lib/${LIB_PREFIX}swscale.${LIB_EXT}"
"${CMAKE_BINARY_DIR}/external/ffmpeg/lib/${LIB_PREFIX}avutil.${LIB_EXT}"
"${CMAKE_BINARY_DIR}/external/ffmpeg/lib/${LIB_PREFIX}avfilter.${LIB_EXT}"
"${CMAKE_BINARY_DIR}/external/ffmpeg/lib/${LIB_PREFIX}swresample.${LIB_EXT}")
Binary file removed lib/linux/x86_64/libavcodec.a
Binary file not shown.
Binary file removed lib/linux/x86_64/libavdevice.a
Binary file not shown.
Binary file removed lib/linux/x86_64/libavfilter.a
Binary file not shown.
Binary file removed lib/linux/x86_64/libavformat.a
Binary file not shown.
Binary file removed lib/linux/x86_64/libavutil.a
Binary file not shown.
Binary file removed lib/linux/x86_64/libswresample.a
Binary file not shown.
Binary file removed lib/linux/x86_64/libswscale.a
Binary file not shown.
Binary file removed lib/macos/libavcodec.a
Binary file not shown.
Binary file removed lib/macos/libavdevice.a
Binary file not shown.
Binary file removed lib/macos/libavfilter.a
Binary file not shown.
Binary file removed lib/macos/libavformat.a
Binary file not shown.
Binary file removed lib/macos/libavutil.a
Binary file not shown.
Binary file removed lib/macos/libswresample.a
Binary file not shown.
Binary file removed lib/macos/libswscale.a
Binary file not shown.
Binary file removed lib/windows/x86_64/avcodec.lib
Binary file not shown.
Binary file removed lib/windows/x86_64/avdevice.lib
Binary file not shown.
Binary file removed lib/windows/x86_64/avfilter.lib
Binary file not shown.
Binary file removed lib/windows/x86_64/avformat.lib
Binary file not shown.
Binary file removed lib/windows/x86_64/avutil.lib
Binary file not shown.
Binary file removed lib/windows/x86_64/swresample.lib
Binary file not shown.
Binary file removed lib/windows/x86_64/swscale.lib
Binary file not shown.

0 comments on commit c03c738

Please sign in to comment.