123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- #[=======================================================================[.rst
- FindFFmpeg
- ----------
- FindModule for FFmpeg and associated libraries
- .. versionchanged:: 3.0
- Updated FindModule to CMake standards
- Components
- ^^^^^^^^^^
- .. versionadded:: 1.0
- This module contains provides several components:
- ``avcodec``
- ``avdevice``
- ``avfilter``
- ``avformat``
- ``avutil``
- ``postproc``
- ``swscale``
- ``swresample``
- Import targets exist for each component.
- Imported Targets
- ^^^^^^^^^^^^^^^^
- .. versionadded:: 2.0
- This module defines the :prop_tgt:`IMPORTED` targets:
- ``FFmpeg::avcodec``
- AVcodec component
- ``FFmpeg::avdevice``
- AVdevice component
- ``FFmpeg::avfilter``
- AVfilter component
- ``FFmpeg::avformat``
- AVformat component
- ``FFmpeg::avutil``
- AVutil component
- ``FFmpeg::postproc``
- postproc component
- ``FFmpeg::swscale``
- SWscale component
- ``FFmpeg::swresample``
- SWresample component
- Result Variables
- ^^^^^^^^^^^^^^^^
- This module sets the following variables:
- ``FFmpeg_FOUND``
- True, if all required components and the core library were found.
- ``FFmpeg_VERSION``
- Detected version of found FFmpeg libraries.
- ``FFmpeg_INCLUDE_DIRS``
- Include directories needed for FFmpeg.
- ``FFmpeg_LIBRARIES``
- Libraries needed to link to FFmpeg.
- ``FFmpeg_DEFINITIONS``
- Compiler flags required for FFmpeg.
- ``FFmpeg_<COMPONENT>_VERSION``
- Detected version of found FFmpeg component library.
- ``FFmpeg_<COMPONENT>_INCLUDE_DIRS``
- Include directories needed for FFmpeg component.
- ``FFmpeg_<COMPONENT>_LIBRARIES``
- Libraries needed to link to FFmpeg component.
- ``FFmpeg_<COMPONENT>_DEFINITIONS``
- Compiler flags required for FFmpeg component.
- Cache variables
- ^^^^^^^^^^^^^^^
- The following cache variables may also be set:
- ``FFmpeg_<COMPONENT>_LIBRARY``
- Path to the library component of FFmpeg.
- ``FFmpeg_<COMPONENT>_INCLUDE_DIR``
- Directory containing ``<COMPONENT>.h``.
- #]=======================================================================]
- # cmake-format: off
- # cmake-lint: disable=C0103
- # cmake-lint: disable=C0307
- # cmake-format: on
- include(FindPackageHandleStandardArgs)
- set(_DEFAULT_COMPONENTS
- avcodec
- avdevice
- avformat
- avfilter
- avresample
- avutil
- postproc
- swscale
- swresample)
- set(component_avcodec libavcodec avcodec avcodec.h)
- set(component_avdevice libavdevice avdevice avdevice.h)
- set(component_avformat libavformat avformat avformat.h)
- set(component_avfilter libavfilter avfilter avfilter.h)
- set(component_avresample libavresample avresample avresample.h)
- set(component_avutil libavutil avutil avutil.h)
- set(component_postproc libpostproc postproc postprocess.h)
- set(component_swscale libswscale swscale swscale.h)
- set(component_swresample libswresample swresample swresample.h)
- if(NOT FFmpeg_FIND_COMPONENTS)
- set(FFmpeg_FIND_COMPONENTS ${_DEFAULT_COMPONENTS})
- endif()
- # FFmpeg_find_component: Find and set up requested FFmpeg component
- macro(FFmpeg_find_component component)
- list(GET component_${component} 0 component_libname)
- list(GET component_${component} 1 component_name)
- list(GET component_${component} 2 component_header)
- if(NOT CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
- find_package(PkgConfig QUIET)
- if(PKG_CONFIG_FOUND)
- pkg_search_module(PC_FFmpeg_${component} QUIET ${component_libname})
- endif()
- endif()
- find_path(
- FFmpeg_${component}_INCLUDE_DIR
- NAMES ${component_libname}/${component_header} ${component_libname}/version.h
- HINTS ${PC_FFmpeg_${component}_INCLUDE_DIRS}
- PATHS /usr/include /usr/local/include
- DOC "FFmpeg component ${component_name} include directory")
- ffmpeg_check_version()
- if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
- find_library(
- FFmpeg_${component}_IMPLIB
- NAMES ${component_libname} ${component_name}
- DOC "FFmpeg component ${component_name} import library location")
- ffmpeg_find_dll()
- else()
- find_library(
- FFmpeg_${component}_LIBRARY
- NAMES ${component_libname} ${component_name}
- HINTS ${PC_FFmpeg_${component}_LIBRARY_DIRS}
- PATHS /usr/lib /usr/local/lib
- DOC "FFmpeg component ${component_name} location")
- endif()
- if(FFmpeg_${component}_LIBRARY AND FFmpeg_${component}_INCLUDE_DIR)
- set(FFmpeg_${component}_FOUND TRUE)
- set(FFmpeg_${component}_LIBRARIES ${${_library_var}})
- set(FFmpeg_${component}_INCLUDE_DIRS ${FFmpeg_${component}_INCLUDE_DIR})
- set(FFmpeg_${component}_DEFINITIONS ${PC_FFmpeg_${component}_CFLAGS_OTHER})
- mark_as_advanced(FFmpeg_${component}_LIBRARY FFmpeg_${component}_INCLUDE_DIR FFmpeg_${component}_IMPLIB)
- endif()
- endmacro()
- # FFmpeg_find_dll: Macro to find DLL for corresponding import library
- macro(FFmpeg_find_dll)
- cmake_path(GET FFmpeg_${component}_IMPLIB PARENT_PATH _implib_path)
- cmake_path(SET _bin_path NORMALIZE "${_implib_path}/../bin")
- string(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" _dll_version "${FFmpeg_${component}_VERSION}")
- find_program(
- FFmpeg_${component}_LIBRARY
- NAMES ${component_name}-${_dll_version}.dll
- HINTS ${_implib_path} ${_bin_path}
- DOC "FFmpeg component ${component_name} DLL location")
- if(NOT FFmpeg_${component}_LIBRARY)
- set(FFmpeg_${component}_LIBRARY "${FFmpeg_${component}_IMPLIB}")
- endif()
- unset(_implib_path)
- unset(_bin_path)
- unset(_dll_version)
- endmacro()
- # FFmpeg_check_version: Macro to help extract version number from FFmpeg headers
- macro(FFmpeg_check_version)
- if(PC_FFmpeg_${component}_VERSION)
- set(FFmpeg_${component}_VERSION ${PC_FFmpeg_${component}_VERSION})
- elseif(EXISTS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version.h")
- if(EXISTS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version_major.h")
- file(STRINGS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version_major.h" _version_string
- REGEX "^.*VERSION_MAJOR[ \t]+[0-9]+[ \t]*$")
- string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" _version_major "${_version_string}")
- file(STRINGS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version.h" _version_string
- REGEX "^.*VERSION_(MINOR|MICRO)[ \t]+[0-9]+[ \t]*$")
- string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" _version_minor "${_version_string}")
- string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" _version_patch "${_version_string}")
- else()
- file(STRINGS "${FFmpeg_${component}_INCLUDE_DIR}/${component_libname}/version.h" _version_string
- REGEX "^.*VERSION_(MAJOR|MINOR|MICRO)[ \t]+[0-9]+[ \t]*$")
- string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" _version_major "${_version_string}")
- string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" _version_minor "${_version_string}")
- string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" _version_patch "${_version_string}")
- endif()
- set(FFmpeg_${component}_VERSION "${_version_major}.${_version_minor}.${_version_patch}")
- unset(_version_major)
- unset(_version_minor)
- unset(_version_patch)
- else()
- if(NOT FFmpeg_FIND_QUIETLY)
- message(AUTHOR_WARNING "Failed to find ${component_name} version.")
- endif()
- set(FFmpeg_${component}_VERSION 0.0.0)
- endif()
- endmacro()
- # FFmpeg_set_soname: Set SONAME property on imported library targets
- macro(FFmpeg_set_soname)
- if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
- execute_process(
- COMMAND sh -c "otool -D '${FFmpeg_${component}_LIBRARY}' | grep -v '${FFmpeg_${component}_LIBRARY}'"
- OUTPUT_VARIABLE _output
- RESULT_VARIABLE _result)
- if(_result EQUAL 0 AND _output MATCHES "^@rpath/")
- set_property(TARGET FFmpeg::${component} PROPERTY IMPORTED_SONAME "${_output}")
- endif()
- elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD")
- execute_process(
- COMMAND sh -c "objdump -p '${FFmpeg_${component}_LIBRARY}' | grep SONAME"
- OUTPUT_VARIABLE _output
- RESULT_VARIABLE _result)
- if(_result EQUAL 0)
- string(REGEX REPLACE "[ \t]+SONAME[ \t]+([^ \t]+)" "\\1" _soname "${_output}")
- set_property(TARGET FFmpeg::${component} PROPERTY IMPORTED_SONAME "${_soname}")
- unset(_soname)
- endif()
- endif()
- unset(_output)
- unset(_result)
- endmacro()
- foreach(component IN LISTS FFmpeg_FIND_COMPONENTS)
- if(NOT component IN_LIST _DEFAULT_COMPONENTS)
- message(FATAL_ERROR "Unknown FFmpeg component specified: ${component}.")
- endif()
- if(NOT FFmpeg_${component}_FOUND)
- ffmpeg_find_component(${component})
- endif()
- if(FFmpeg_${component}_FOUND)
- list(APPEND FFmpeg_LIBRARIES ${FFmpeg_${component}_LIBRARY})
- list(APPEND FFmpeg_DEFINITIONS ${FFmpeg_${component}_DEFINITIONS})
- list(APPEND FFmpeg_INCLUDE_DIRS ${FFmpeg_${component}_INCLUDE_DIR})
- endif()
- endforeach()
- if(NOT FFmpeg_avutil_FOUND)
- ffmpeg_find_component(avutil)
- endif()
- if(EXISTS "${FFmpeg_avutil_INCLUDE_DIR}/libavutil/ffversion.h")
- file(STRINGS "${FFmpeg_avutil_INCLUDE_DIR}/libavutil/ffversion.h" _version_string
- REGEX "^.*FFMPEG_VERSION[ \t]+\"n[0-9\\.]+\"[ \t]*$")
- string(REGEX REPLACE ".*FFMPEG_VERSION[ \t]+\"n([0-9\\.]+)\".*" "\\1" FFmpeg_VERSION "${_version_string}")
- endif()
- list(REMOVE_DUPLICATES FFmpeg_INCLUDE_DIRS)
- list(REMOVE_DUPLICATES FFmpeg_LIBRARIES)
- list(REMOVE_DUPLICATES FFmpeg_DEFINITIONS)
- if(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin|Windows")
- set(FFmpeg_ERROR_REASON "Ensure that obs-deps is provided as part of CMAKE_PREFIX_PATH.")
- elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD")
- set(FFmpeg_ERROR_REASON "Ensure that required FFmpeg libraries are installed on the system.")
- endif()
- find_package_handle_standard_args(
- FFmpeg
- REQUIRED_VARS FFmpeg_LIBRARIES FFmpeg_INCLUDE_DIRS
- VERSION_VAR FFmpeg_VERSION
- HANDLE_COMPONENTS REASON_FAILURE_MESSAGE "${FFmpeg_ERROR_REASON}")
- if(FFmpeg_FOUND AND NOT TARGET FFmpeg::FFmpeg)
- add_library(FFmpeg::FFmpeg INTERFACE IMPORTED)
- endif()
- foreach(component IN LISTS FFmpeg_FIND_COMPONENTS)
- if(FFmpeg_${component}_FOUND AND NOT TARGET FFmpeg::${component})
- if(IS_ABSOLUTE "${FFmpeg_${component}_LIBRARY}")
- if(DEFINED FFmpeg_${component}_IMPLIB)
- if(FFmpeg_${component}_IMPLIB STREQUAL FFmpeg_${component}_LIBRARY)
- add_library(FFmpeg::${component} STATIC IMPORTED)
- else()
- add_library(FFmpeg::${component} SHARED IMPORTED)
- set_property(TARGET FFmpeg::${component} PROPERTY IMPORTED_IMPLIB "${FFmpeg_${component}_IMPLIB}")
- endif()
- else()
- add_library(FFmpeg::${component} UNKNOWN IMPORTED)
- ffmpeg_set_soname()
- endif()
- set_property(TARGET FFmpeg::${component} PROPERTY IMPORTED_LOCATION "${FFmpeg_${component}_LIBRARY}")
- else()
- add_library(FFmpeg::${component} INTERFACE IMPORTED)
- set_property(TARGET FFmpeg::${component} PROPERTY IMPORTED_LIBNAME "${FFmpeg_${component}_LIBRARY}")
- endif()
- set_target_properties(
- FFmpeg::${component}
- PROPERTIES INTERFACE_COMPILE_OPTIONS "${PC_FFmpeg_${component}_CFLAGS_OTHER}"
- INTERFACE_INCLUDE_DIRECTORIES "${FFmpeg_${component}_INCLUDE_DIR}"
- VERSION ${FFmpeg_${component}_VERSION})
- get_target_property(_ffmpeg_interface_libraries FFmpeg::FFmpeg INTERFACE_LINK_LIBRARIES)
- if(NOT FFmpeg::${component} IN_LIST _ffmpeg_interface_libraries)
- set_property(
- TARGET FFmpeg::FFmpeg
- APPEND
- PROPERTY INTERFACE_LINK_LIBRARIES FFmpeg::${component})
- endif()
- endif()
- endforeach()
- include(FeatureSummary)
- set_package_properties(
- FFmpeg PROPERTIES
- URL "https://www.ffmpeg.org"
- DESCRIPTION "A complete, cross-platform solution to record, convert and stream audio and video.")
|