2024-09-06 10:41:06 +03:00
# vim: ts=2 sw=2
# - Try to find the required ffmpeg components(default: AVFORMAT, AVUTIL, AVCODEC)
2012-01-27 05:13:08 +04:00
#
2024-09-06 10:41:06 +03:00
# Once done this will define
# FFMPEG_FOUND - System has the all required components.
# FFMPEG_INCLUDE_DIRS - Include directory necessary for using the required components headers.
# FFMPEG_LIBRARIES - Link these to use the required ffmpeg components.
# FFMPEG_DEFINITIONS - Compiler switches required for using the required ffmpeg components.
#
# For each of the components
# - AVCODEC
# - AVDEVICE
# - AVFORMAT
# - AVFILTER
# - AVUTIL
# - POSTPROCESS
# - SWSCALE
# - SWRESAMPLE
# the following variables will be defined:
# <component>_FOUND - System has <component>
# <component>_INCLUDE_DIRS - Include directory necessary for using the <component> headers
# <component>_LIBRARIES - Link these to use <component>
# <component>_DEFINITIONS - Compiler switches required for using <component>
# <component>_VERSION - The components version
#
# As the versions of the various FFmpeg components differ for a given release,
# and CMake supports only one common version for all components, use the
# following to specify required versions for multiple components:
#
# find_package(FFmpeg 57.48 COMPONENTS AVCODEC)
# find_package(FFmpeg 57.40 COMPONENTS AVFORMAT)
# find_package(FFmpeg 55.27 COMPONENTS AVUTIL)
#
# SPDX-FileCopyrightText: 2006 Matthias Kretz <kretz@kde.org>
# SPDX-FileCopyrightText: 2008 Alexander Neundorf <neundorf@kde.org>
# SPDX-FileCopyrightText: 2011 Michael Jansen <kde@michael-jansen.biz>
# SPDX-FileCopyrightText: 2021 Stefan Brüns <stefan.bruens@rwth-aachen.de>
2024-09-24 09:42:37 +03:00
# SPDX-FileCopyrightText: 2024 Armin Novak <anovak@thincast.com>
2024-09-06 10:41:06 +03:00
# SPDX-License-Identifier: BSD-3-Clause
2012-01-27 05:13:08 +04:00
2024-09-06 10:41:06 +03:00
include ( FindPackageHandleStandardArgs )
2012-09-26 17:45:30 +04:00
2024-09-06 10:41:06 +03:00
if ( NOT FFmpeg_FIND_COMPONENTS )
# The default components were taken from a survey over other FindFFMPEG.cmake files
set ( FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL )
endif ( )
2012-01-27 05:13:08 +04:00
2024-09-06 10:41:06 +03:00
list ( LENGTH FFmpeg_FIND_COMPONENTS _numComponents )
2012-01-27 05:13:08 +04:00
2024-09-06 10:41:06 +03:00
if ( ( ${ _numComponents } GREATER 1 ) AND DEFINED ${ FFmpeg_FIND_VERSION } )
message ( WARNING "Using a required version in combination with multiple COMPONENTS is not supported" )
set ( _FFmpeg_REQUIRED_VERSION 0 )
elseif ( DEFINED FFmpeg_FIND_VERSION )
set ( _FFmpeg_REQUIRED_VERSION ${ FFmpeg_FIND_VERSION } )
else ( )
set ( _FFmpeg_REQUIRED_VERSION 0 )
endif ( )
2012-01-27 05:13:08 +04:00
2024-09-06 10:41:06 +03:00
set ( _FFmpeg_ALL_COMPONENTS AVCODEC AVDEVICE AVFORMAT AVFILTER AVUTIL POSTPROCESS SWSCALE SWRESAMPLE )
2012-01-27 05:13:08 +04:00
2024-09-06 10:41:06 +03:00
#
# ## Macro: set_component_found
#
# Marks the given component as found if both *_LIBRARIES AND *_INCLUDE_DIRS is present.
#
macro ( set_component_found _component )
if ( ${ _component } _LIBRARIES AND ${ _component } _INCLUDE_DIRS )
set ( ${ _component } _FOUND TRUE )
set ( FFmpeg_ ${ _component } _FOUND TRUE )
endif ( )
endmacro ( )
2021-07-20 11:57:28 +03:00
2024-09-06 10:41:06 +03:00
#
# ## Macro: find_component
#
# Checks for the given component by invoking pkgconfig and then looking up the libraries and
# include directories.
#
macro ( find_component _component _pkgconfig _library _header )
if ( NOT WIN32 )
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package ( PkgConfig )
2018-02-20 14:15:30 +03:00
2024-09-06 10:41:06 +03:00
if ( PKG_CONFIG_FOUND )
pkg_check_modules ( PC_ ${ _component } QUIET ${ _pkgconfig } )
endif ( )
endif ( NOT WIN32 )
2018-02-20 14:15:30 +03:00
2024-09-06 10:41:06 +03:00
find_path ( ${ _component } _INCLUDE_DIRS ${ _header }
H I N T S
$ { P C _ L I B $ { _ c o m p o n e n t } _ I N C L U D E D I R }
$ { P C _ L I B $ { _ c o m p o n e n t } _ I N C L U D E _ D I R S }
P A T H _ S U F F I X E S
f f m p e g
)
2021-07-20 11:57:28 +03:00
2024-09-06 10:41:06 +03:00
find_library ( ${ _component } _LIBRARIES NAMES ${ _library }
H I N T S
$ { P C _ L I B $ { _ c o m p o n e n t } _ L I B D I R }
$ { P C _ L I B $ { _ c o m p o n e n t } _ L I B R A R Y _ D I R S }
)
2012-01-27 05:13:08 +04:00
2024-09-06 10:41:06 +03:00
set ( ${ _component } _DEFINITIONS ${ PC_${_component } _CFLAGS_OTHER} CACHE STRING "The ${_component} CFLAGS." )
2024-09-24 09:42:37 +03:00
# Fallback version detection:
# Read version.h (and version_major.h if it exists) and try to extract the version
if ( "${PC_${_component}_VERSION}_" STREQUAL "_" )
get_filename_component ( ${ _component } _suffix
" $ { _ h e a d e r } "
D I R E C T O R Y
)
find_file ( ${ _component } _hdr_version_major
N A M E S v e r s i o n _ m a j o r . h
P A T H _ S U F F I X E S $ { $ { _ c o m p o n e n t } _ s u f f i x }
H I N T S
$ { $ { _ c o m p o n e n t } _ I N C L U D E _ D I R S }
)
find_file ( ${ _component } _hdr_version
N A M E S v e r s i o n . h
P A T H _ S U F F I X E S $ { $ { _ c o m p o n e n t } _ s u f f i x }
H I N T S
$ { $ { _ c o m p o n e n t } _ I N C L U D E _ D I R S }
)
if ( NOT ${ ${_component } _hdr_version} MATCHES ".*-NOTFOUND" )
file ( READ "${${_component}_hdr_version}" ${ _component } _version_text )
endif ( )
if ( NOT ${ ${_component } _hdr_version_major} MATCHES ".*-NOTFOUND" )
file ( READ "${${_component}_hdr_version_major}" ${ _component } _version_major_text )
else ( )
set ( ${ _component } _version_major_text "${${_component}_version_text}" )
endif ( )
string ( REGEX MATCH "#define[ \t]+.*_VERSION_MAJOR[ \t]+([0-9]+)" _ "${${_component}_version_major_text}" )
set ( ${ _component } _version_major ${ CMAKE_MATCH_1 } )
string ( REGEX MATCH "#define[ \t]+.*_VERSION_MINOR[ \t]+([0-9]+)" _ "${${_component}_version_text}" )
set ( ${ _component } _version_minor ${ CMAKE_MATCH_1 } )
string ( REGEX MATCH "#define[ \t]+.*_VERSION_MICRO[ \t]+([0-9]+)" _ "${${_component}_version_text}" )
set ( ${ _component } _version_micro ${ CMAKE_MATCH_1 } )
set ( ${ _component } _VERSION "${${_component}_version_major}.${${_component}_version_minor}.${${_component}_version_micro}" CACHE STRING "The ${_component} version number." )
else ( )
set ( ${ _component } _VERSION ${ PC_${_component } _VERSION} CACHE STRING "The ${_component} version number." )
endif ( )
2024-09-06 10:41:06 +03:00
set_component_found ( ${ _component } )
mark_as_advanced (
$ { _ c o m p o n e n t } _ I N C L U D E _ D I R S
$ { _ c o m p o n e n t } _ L I B R A R I E S
$ { _ c o m p o n e n t } _ D E F I N I T I O N S
$ { _ c o m p o n e n t } _ V E R S I O N )
endmacro ( )
# Check for cached results. If there are skip the costly part.
if ( NOT FFMPEG_LIBRARIES )
# Check for all possible component.
find_component ( AVCODEC libavcodec avcodec libavcodec/avcodec.h )
find_component ( AVFORMAT libavformat avformat libavformat/avformat.h )
find_component ( AVFILTER libavfilter avfilter libavfilter/avfilter.h )
find_component ( AVDEVICE libavdevice avdevice libavdevice/avdevice.h )
find_component ( AVUTIL libavutil avutil libavutil/avutil.h )
find_component ( SWSCALE libswscale swscale libswscale/swscale.h )
find_component ( SWRESAMPLE libswresample swresample libswresample/swresample.h )
find_component ( POSTPROCESS libpostproc postproc libpostproc/postprocess.h )
# Check if the required components were found and add their stuff to the FFMPEG_* vars.
foreach ( _component ${ _FFmpeg_ALL_COMPONENTS } )
if ( ${ _component } _FOUND )
set ( FFMPEG_LIBRARIES ${ FFMPEG_LIBRARIES } ${ ${_component } _LIBRARIES} )
set ( FFMPEG_DEFINITIONS ${ FFMPEG_DEFINITIONS } ${ ${_component } _DEFINITIONS} )
list ( APPEND FFMPEG_INCLUDE_DIRS ${ ${_component } _INCLUDE_DIRS} )
endif ( )
endforeach ( )
# Build the include path with duplicates removed.
if ( FFMPEG_INCLUDE_DIRS )
list ( REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS )
endif ( )
# cache the vars.
set ( FFMPEG_INCLUDE_DIRS ${ FFMPEG_INCLUDE_DIRS } CACHE STRING "The FFmpeg include directories." FORCE )
set ( FFMPEG_LIBRARIES ${ FFMPEG_LIBRARIES } CACHE STRING "The FFmpeg libraries." FORCE )
set ( FFMPEG_DEFINITIONS ${ FFMPEG_DEFINITIONS } CACHE STRING "The FFmpeg cflags." FORCE )
mark_as_advanced ( FFMPEG_INCLUDE_DIRS
F F M P E G _ L I B R A R I E S
F F M P E G _ D E F I N I T I O N S )
2012-01-27 05:13:08 +04:00
2018-10-04 09:57:54 +03:00
else ( )
2024-09-06 10:41:06 +03:00
# Set the noncached _FOUND vars for the components.
foreach ( _component ${ _FFmpeg_ALL_COMPONENTS } )
set_component_found ( ${ _component } )
endforeach ( )
2018-10-04 09:57:54 +03:00
endif ( )
2012-01-27 05:13:08 +04:00
2024-09-06 10:41:06 +03:00
# Compile the list of required vars
unset ( _FFmpeg_REQUIRED_VARS )
set ( _FFmpeg_FOUND_LIBRARIES "" )
foreach ( _component ${ FFmpeg_FIND_COMPONENTS } )
if ( ${ _component } _FOUND )
if ( ${ _component } _VERSION VERSION_LESS _FFmpeg_REQUIRED_VERSION )
message ( STATUS "${_component}: ${${_component}_VERSION} < ${_FFmpeg_REQUIRED_VERSION}" )
unset ( ${ _component } _FOUND )
endif ( )
list ( APPEND _FFmpeg_FOUND_LIBRARIES ${ ${_component } _LIBRARIES} )
endif ( )
list ( APPEND _FFmpeg_REQUIRED_VARS ${ _component } _LIBRARIES ${ _component } _INCLUDE_DIRS ${ _component } _FOUND )
endforeach ( )
list ( INSERT _FFmpeg_REQUIRED_VARS 0 _FFmpeg_FOUND_LIBRARIES )
# Give a nice error message if some of the required vars are missing.
find_package_handle_standard_args ( FFmpeg
R E Q U I R E D _ V A R S $ { _ F F m p e g _ R E Q U I R E D _ V A R S }
H A N D L E _ C O M P O N E N T S )