summaryrefslogtreecommitdiffstats
path: root/cmake_modules/FindFFmpeg.cmake
blob: 6d4b72f618fb74f512a582d4b9001cc1ccd7de67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# - Try to find ffmpeg libraries (libavcodec, libavdevice, libavformat, libavutil, and libswscale)
# Once done this will define
#
# FFMPEG_FOUND - system has ffmpeg or libav
# FFMPEG_INCLUDE_DIR - the ffmpeg include directory
# FFMPEG_LIBRARIES - Link these to use ffmpeg
# FFMPEG_LIBAVCODEC
# FFMPEG_LIBAVDEVICE
# FFMPEG_LIBAVFORMAT
# FFMPEG_LIBAVUTIL
# FFMPEG_LIBSWSCALE
#
# Copyright (c) 2008 Andreas Schneider <mail@cynapses.org>
# Modified for other libraries by Lasse Kärkkäinen <tronic>
# Modified for Hedgewars by Stepik777
# Modified for INDILIB by rlancaste
#
# Redistribution and use is allowed according to the terms of the New
# BSD license.
#

macro(_FFMPEG_PACKAGE_check_version)
	if(EXISTS "${PACKAGE_INCLUDE_DIR}/version.h")
		file(READ "${PACKAGE_INCLUDE_DIR}/version.h" _FFMPEG_PACKAGE_version_header)

		string(REGEX MATCH "#define ${PACKAGE_NAME}_VERSION_MAJOR[ \t]+([0-9]+)" _VERSION_MAJOR_match "${_FFMPEG_PACKAGE_version_header}")
		set(FFMPEG_PACKAGE_VERSION_MAJOR "${CMAKE_MATCH_1}")
		string(REGEX MATCH "#define ${PACKAGE_NAME}_VERSION_MINOR[ \t]+([0-9]+)" _VERSION_MINOR_match "${_FFMPEG_PACKAGE_version_header}")
		set(FFMPEG_PACKAGE_VERSION_MINOR "${CMAKE_MATCH_1}")
		string(REGEX MATCH "#define ${PACKAGE_NAME}_VERSION_MICRO[ \t]+([0-9]+)" _VERSION_MICRO_match "${_FFMPEG_PACKAGE_version_header}")
		set(FFMPEG_PACKAGE_VERSION_MICRO "${CMAKE_MATCH_1}")

		set(FFMPEG_PACKAGE_VERSION ${FFMPEG_PACKAGE_VERSION_MAJOR}.${FFMPEG_PACKAGE_VERSION_MINOR}.${FFMPEG_PACKAGE_VERSION_MICRO})
		if(${FFMPEG_PACKAGE_VERSION} VERSION_LESS ${FFMPEG_PACKAGE_FIND_VERSION})
			set(FFMPEG_PACKAGE_VERSION_OK FALSE)
		else(${FFMPEG_PACKAGE_VERSION} VERSION_LESS ${FFMPEG_PACKAGE_FIND_VERSION})
			set(FFMPEG_PACKAGE_VERSION_OK TRUE)
		endif(${FFMPEG_PACKAGE_VERSION} VERSION_LESS ${FFMPEG_PACKAGE_FIND_VERSION})

		if(NOT FFMPEG_PACKAGE_VERSION_OK)
			message(STATUS "${PACKAGE_NAME} version ${FFMPEG_PACKAGE_VERSION} found in ${PACKAGE_INCLUDE_DIR}, "
					"but at least version ${FFMPEG_PACKAGE_FIND_VERSION} is required")
		else(NOT FFMPEG_PACKAGE_VERSION_OK)
			mark_as_advanced(FFMPEG_PACKAGE_VERSION_MAJOR FFMPEG_PACKAGE_VERSION_MINOR FFMPEG_PACKAGE_VERSION_MICRO)
		endif(NOT FFMPEG_PACKAGE_VERSION_OK)
    else(EXISTS "${PACKAGE_INCLUDE_DIR}/version.h")
    	set(FFMPEG_PACKAGE_VERSION_OK FALSE)
    	message(STATUS "${PACKAGE_NAME}'s version.h file was not found in the include directory: ${PACKAGE_INCLUDE_DIR}, please install this program.")
    endif(EXISTS "${PACKAGE_INCLUDE_DIR}/version.h")
endmacro(_FFMPEG_PACKAGE_check_version)

# required ffmpeg library versions, Requiring at least FFMPEG 3.2.11, Hypatia
set(_avcodec_ver ">=57.64.101")
set(_avdevice_ver ">=57.1.100")
set(_avformat_ver ">=57.56.100")
set(_avutil_ver ">=55.34.100")
set(_swscale_ver ">=4.2.100")

if (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIR)

	# in cache already
	set(FFMPEG_FOUND TRUE)

else (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIR)
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls

find_path(FFMPEG_INCLUDE_DIR
NAMES libavcodec/avcodec.h
PATHS ${FFMPEG_INCLUDE_DIRS} ${CMAKE_INSTALL_PREFIX}/include /usr/include /usr/local/include /opt/local/include /sw/include
PATH_SUFFIXES ffmpeg libav
)

find_package(PkgConfig)
if (PKG_CONFIG_FOUND)

	pkg_check_modules(AVCODEC libavcodec${_avcodec_ver})
	pkg_check_modules(AVDEVICE libavdevice${_avdevice_ver})
	pkg_check_modules(AVFORMAT libavformat${_avformat_ver})
	pkg_check_modules(AVUTIL libavutil${_avutil_ver})
	pkg_check_modules(SWSCALE libswscale${_swscale_ver})

endif (PKG_CONFIG_FOUND)

if (NOT PKG_CONFIG_FOUND OR 
	NOT FFMPEG_LIBAVCODEC OR
	NOT FFMPEG_LIBAVDEVICE OR
	NOT FFMPEG_LIBAVFORMAT OR
	NOT FFMPEG_LIBAVUTIL OR
	NOT FFMPEG_LIBSWSCALE)

# LIBAVCODEC
	set(PACKAGE_NAME "LIBAVCODEC")
	set(PACKAGE_INCLUDE_DIR "${FFMPEG_INCLUDE_DIR}/libavcodec")
	set(FFMPEG_PACKAGE_FIND_VERSION _avcodec_ver)
	
	_FFMPEG_PACKAGE_check_version()
	
	if(FFMPEG_PACKAGE_VERSION_OK)
		set(AVCODEC_VERSION FFMPEG_PACKAGE_VERSION)
	endif(FFMPEG_PACKAGE_VERSION_OK)
	
# LIBAVDEVICE
	set(PACKAGE_NAME "LIBAVDEVICE")
	set(PACKAGE_INCLUDE_DIR "${FFMPEG_INCLUDE_DIR}/libavdevice")
	set(FFMPEG_PACKAGE_FIND_VERSION _avdevice_ver)
	
	_FFMPEG_PACKAGE_check_version()
	
	if(FFMPEG_PACKAGE_VERSION_OK)
		set(AVDEVICE_VERSION FFMPEG_PACKAGE_VERSION)
	endif(FFMPEG_PACKAGE_VERSION_OK)
	
# LIBAVFORMAT
	set(PACKAGE_NAME "LIBAVFORMAT")
	set(PACKAGE_INCLUDE_DIR "${FFMPEG_INCLUDE_DIR}/libavformat")
	set(FFMPEG_PACKAGE_FIND_VERSION _avformat_ver)
	
	_FFMPEG_PACKAGE_check_version()
	
	if(FFMPEG_PACKAGE_VERSION_OK)
		set(AVFORMAT_VERSION FFMPEG_PACKAGE_VERSION)
	endif(FFMPEG_PACKAGE_VERSION_OK)
	
# LIBAVUTIL
	set(PACKAGE_NAME "LIBAVUTIL")
	set(PACKAGE_INCLUDE_DIR "${FFMPEG_INCLUDE_DIR}/libavutil")
	set(FFMPEG_PACKAGE_FIND_VERSION _avutil_ver)
	
	_FFMPEG_PACKAGE_check_version()
	
	if(FFMPEG_PACKAGE_VERSION_OK)
		set(AVUTIL_VERSION FFMPEG_PACKAGE_VERSION)
	endif(FFMPEG_PACKAGE_VERSION_OK)

# LIBSWSCALE
	set(PACKAGE_NAME "LIBSWSCALE")
	set(PACKAGE_INCLUDE_DIR "${FFMPEG_INCLUDE_DIR}/libswscale")
	set(FFMPEG_PACKAGE_FIND_VERSION _swscale_ver)
	
	_FFMPEG_PACKAGE_check_version()
	
	if(FFMPEG_PACKAGE_VERSION_OK)
		set(SWSCALE_VERSION FFMPEG_PACKAGE_VERSION)
	endif(FFMPEG_PACKAGE_VERSION_OK)
	
endif ()

find_library(FFMPEG_LIBAVCODEC
NAMES avcodec libavcodec
PATHS ${AVCODEC_LIBRARY_DIRS} ${CMAKE_INSTALL_PREFIX}/lib /usr/lib /usr/local/lib /opt/local/lib /sw/lib
)

find_library(FFMPEG_LIBAVDEVICE
NAMES avdevice libavdevice
PATHS ${AVDEVICE_LIBRARY_DIRS} ${CMAKE_INSTALL_PREFIX}/lib /usr/lib /usr/local/lib /opt/local/lib /sw/lib
)

find_library(FFMPEG_LIBAVFORMAT
NAMES avformat libavformat
PATHS ${AVFORMAT_LIBRARY_DIRS} ${CMAKE_INSTALL_PREFIX}/lib /usr/lib /usr/local/lib /opt/local/lib /sw/lib
)

find_library(FFMPEG_LIBAVUTIL
NAMES avutil libavutil
PATHS ${AVUTIL_LIBRARY_DIRS} ${CMAKE_INSTALL_PREFIX}/lib /usr/lib /usr/local/lib /opt/local/lib /sw/lib
)

find_library(FFMPEG_LIBSWSCALE
NAMES swscale libswscale
PATHS ${SWSCALE_LIBRARY_DIRS} ${CMAKE_INSTALL_PREFIX}/lib /usr/lib /usr/local/lib /opt/local/lib /sw/lib
)

#Only set FFMPEG to found if all the libraries are found in the right versions.
if(AVCODEC_VERSION AND
                 AVDEVICE_VERSION AND
                 AVFORMAT_VERSION AND
                 AVUTIL_VERSION AND
                 SWSCALE_VERSION AND
				 FFMPEG_LIBAVCODEC AND
				 FFMPEG_LIBAVDEVICE AND
				 FFMPEG_LIBAVFORMAT AND
				 FFMPEG_LIBAVUTIL AND
				 FFMPEG_LIBSWSCALE)
set(FFMPEG_FOUND TRUE)
endif()

if (FFMPEG_FOUND)

	set(FFMPEG_LIBRARIES
	${FFMPEG_LIBAVCODEC}
	${FFMPEG_LIBAVDEVICE}
	${FFMPEG_LIBAVFORMAT}
	${FFMPEG_LIBAVUTIL}
	${FFMPEG_LIBSWSCALE}
	)

endif (FFMPEG_FOUND)

if (FFMPEG_FOUND)
	if (NOT FFMPEG_FIND_QUIETLY)
		message(STATUS "Found FFMPEG: ${FFMPEG_LIBRARIES}, ${FFMPEG_INCLUDE_DIR}")
	endif (NOT FFMPEG_FIND_QUIETLY)
	else (FFMPEG_FOUND)
		message(STATUS "Could not find up to date FFMPEG for INDI Webcam. Up to date versions of these packages are required: libavcodec, libavdevice, libavformat, libavutil, and libswscale")
	if (FFMPEG_FIND_REQUIRED)
		message(FATAL_ERROR "Error: FFMPEG is required by this package!")
	endif (FFMPEG_FIND_REQUIRED)
endif (FFMPEG_FOUND)

endif (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIR)