0025382: Visualization, TKOpenGl - improved video recording capability
[occt.git] / adm / cmake / ffmpeg.cmake
1 # FFmpeg
2
3 if (NOT DEFINED INSTALL_FFMPEG)
4   set (INSTALL_FFMPEG OFF CACHE BOOL "${INSTALL_FFMPEG_DESCR}")
5 endif()
6
7 if (NOT DEFINED 3RDPARTY_FFMPEG_DIR)
8   set (3RDPARTY_FFMPEG_DIR "" CACHE PATH "The directory containing FFmpeg")
9 endif()
10
11 # include occt macros. compiler_bitness, os_wiht_bit, compiler
12 OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros")
13
14 # specify FFMPEG folder in connection with 3RDPARTY_DIR
15 if (3RDPARTY_DIR AND EXISTS "${3RDPARTY_DIR}")
16   if (NOT 3RDPARTY_FFMPEG_DIR OR NOT EXISTS "${3RDPARTY_FFMPEG_DIR}")
17     FIND_PRODUCT_DIR ("${3RDPARTY_DIR}" FFMPEG FFMPEG_DIR_NAME)
18     if (FFMPEG_DIR_NAME)
19       set (3RDPARTY_FFMPEG_DIR "${3RDPARTY_DIR}/${FFMPEG_DIR_NAME}" CACHE PATH "The directory containing FFmpeg" FORCE)
20     endif()
21   endif()
22 else()
23 endif()
24
25 # define required FFMPEG variables
26 if (NOT DEFINED 3RDPARTY_FFMPEG_INCLUDE_DIR)
27   set (3RDPARTY_FFMPEG_INCLUDE_DIR  "" CACHE PATH "the path of headers directory")
28 endif()
29
30 if (NOT DEFINED 3RDPARTY_FFMPEG_LIBRARY OR NOT 3RDPARTY_FFMPEG_LIBRARY_DIR OR NOT EXISTS "${3RDPARTY_FFMPEG_LIBRARY_DIR}")
31   set (3RDPARTY_FFMPEG_LIBRARY               "" CACHE FILEPATH "FFmpeg framework" FORCE)
32 endif()
33
34 if (NOT DEFINED 3RDPARTY_FFMPEG_LIBRARY_DIR)
35   set (3RDPARTY_FFMPEG_LIBRARY_DIR           "" CACHE PATH "The directory containing FFmpeg framework")
36 endif()
37
38 if (WIN32)
39   if (NOT DEFINED 3RDPARTY_FFMPEG_DLL OR NOT 3RDPARTY_FFMPEG_DLL_DIR OR NOT EXISTS "${3RDPARTY_FFMPEG_DLL_DIR}")
40     set (3RDPARTY_FFMPEG_DLL                 "" CACHE FILEPATH "FFmpeg shared libraries" FORCE)
41   endif()
42 endif()
43
44 if (WIN32)
45   if (NOT DEFINED 3RDPARTY_FFMPEG_DLL_DIR)
46     set (3RDPARTY_FFMPEG_DLL_DIR               "" CACHE PATH "The directory containing FFmpeg shared libraries")
47   endif()
48 endif()
49
50 # check 3RDPARTY_${PRODUCT_NAME}_ paths for consistency with specified 3RDPARTY_${PRODUCT_NAME}_DIR
51 if (3RDPARTY_FFMPEG_DIR AND EXISTS "${3RDPARTY_FFMPEG_DIR}")
52   CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FFMPEG_DIR 3RDPARTY_FFMPEG_INCLUDE_DIR PATH "the path to FFmpeg")
53   CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FFMPEG_DIR 3RDPARTY_FFMPEG_LIBRARY FILEPATH "the path to FFmpeg framework")
54
55   if (3RDPARTY_FFMPEG_LIBRARY AND EXISTS "${3RDPARTY_FFMPEG_LIBRARY}")
56     get_filename_component (3RDPARTY_FFMPEG_LIBRARY_DIR "${3RDPARTY_FFMPEG_LIBRARY}" PATH)
57     set (3RDPARTY_FFMPEG_LIBRARY_DIR "${3RDPARTY_FFMPEG_LIBRARY_DIR}" CACHE PATH "The directory containing FFmpeg libraries" FORCE)
58   else()
59     CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FFMPEG_DIR 3RDPARTY_FFMPEG_LIBRARY_DIR PATH "The directory containing FFmpeg libraries")
60   endif()
61
62   if (WIN32)
63     CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FFMPEG_DIR 3RDPARTY_FFMPEG_DLL FILEPATH "the path to FFmpeg shared libraries")
64
65     if (3RDPARTY_FFMPEG_DLL AND EXISTS "${3RDPARTY_FFMPEG_DLL}")
66       get_filename_component (3RDPARTY_FFMPEG_DLL_DIR "${3RDPARTY_FFMPEG_DLL}" PATH)
67       set (3RDPARTY_FFMPEG_DLL_DIR "${3RDPARTY_FFMPEG_DLL_DIR}" CACHE PATH "The directory containing FFmpeg shared libraries" FORCE)
68     else()
69       CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FFMPEG_DIR 3RDPARTY_FFMPEG_DLL_DIR PATH "The directory containing FFmpeg shared libraries")
70     endif()
71   endif()
72 endif()
73
74 # header
75 if (NOT 3RDPARTY_FFMPEG_INCLUDE_DIR OR NOT EXISTS "${3RDPARTY_FFMPEG_INCLUDE_DIR}")
76   set (HEADER_NAMES avutil.h libavutil/avutil.h)
77
78   # set 3RDPARTY_FFMPEG_INCLUDE_DIR as notfound, otherwise find_library can't assign a new value to 3RDPARTY_FFMPEG_INCLUDE_DIR
79   set (3RDPARTY_FFMPEG_INCLUDE_DIR "3RDPARTY_FFMPEG_INCLUDE_DIR-NOTFOUND" CACHE FILEPATH "the path to header directory" FORCE)
80
81   if (3RDPARTY_FFMPEG_DIR AND EXISTS "${3RDPARTY_FFMPEG_DIR}")
82     find_path (3RDPARTY_FFMPEG_INCLUDE_DIR NAMES ${HEADER_NAMES}
83                                                  PATHS ${3RDPARTY_FFMPEG_DIR}
84                                                  PATH_SUFFIXES include
85                                                  CMAKE_FIND_ROOT_PATH_BOTH
86                                                  NO_DEFAULT_PATH)
87   else()
88     find_path (3RDPARTY_FFMPEG_INCLUDE_DIR NAMES ${HEADER_NAMES}
89                                                  PATH_SUFFIXES include
90                                                  CMAKE_FIND_ROOT_PATH_BOTH)
91   endif()
92 endif()
93
94 if (3RDPARTY_FFMPEG_INCLUDE_DIR AND EXISTS "${3RDPARTY_FFMPEG_INCLUDE_DIR}")
95   list (APPEND 3RDPARTY_INCLUDE_DIRS "${3RDPARTY_FFMPEG_INCLUDE_DIR}")
96 else()
97   list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_FFMPEG_INCLUDE_DIR)
98
99   set (3RDPARTY_FFMPEG_INCLUDE_DIR "" CACHE FILEPATH "the path to avutil.h" FORCE)
100 endif()
101
102 # library
103 if (NOT 3RDPARTY_FFMPEG_LIBRARY OR NOT EXISTS "${3RDPARTY_FFMPEG_LIBRARY}")
104   set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .so .dylib .a)
105
106   set (FFMPEG_PATH_SUFFIXES lib)
107   if (ANDROID)
108     set (FFMPEG_PATH_SUFFIXES ${FFMPEG_PATH_SUFFIXES} libs/${ANDROID_ABI})
109   elseif(APPLE)
110     set (FFMPEG_PATH_SUFFIXES ${FFMPEG_PATH_SUFFIXES} Frameworks)
111   endif()
112
113   # set 3RDPARTY_FFMPEG_LIBRARY as notfound, otherwise find_library can't assign a new value to 3RDPARTY_FFMPEG_LIBRARY
114   set (3RDPARTY_FFMPEG_LIBRARY "3RDPARTY_FFMPEG_LIBRARY-NOTFOUND" CACHE FILEPATH "The path to FFmpeg library" FORCE)
115
116   if (3RDPARTY_FFMPEG_DIR AND EXISTS "${3RDPARTY_FFMPEG_DIR}")
117     find_library (3RDPARTY_FFMPEG_LIBRARY NAMES avutil
118                   PATHS "${3RDPARTY_FFMPEG_LIBRARY_DIR}" "${3RDPARTY_FFMPEG_DIR}"
119                   PATH_SUFFIXES ${FFMPEG_PATH_SUFFIXES}
120                   CMAKE_FIND_ROOT_PATH_BOTH
121                   NO_DEFAULT_PATH)
122   else()
123     find_library (3RDPARTY_FFMPEG_LIBRARY NAMES avutil
124                   PATH_SUFFIXES ${FFMPEG_PATH_SUFFIXES}
125                   CMAKE_FIND_ROOT_PATH_BOTH)
126   endif()
127
128   if (3RDPARTY_FFMPEG_LIBRARY AND EXISTS "${3RDPARTY_FFMPEG_LIBRARY}")
129     get_filename_component (3RDPARTY_FFMPEG_LIBRARY_DIR "${3RDPARTY_FFMPEG_LIBRARY}" PATH)
130     set (3RDPARTY_FFMPEG_LIBRARY_DIR "${3RDPARTY_FFMPEG_LIBRARY_DIR}" CACHE PATH "The directory containing FFmpeg library" FORCE)
131   else()
132     set (3RDPARTY_FFMPEG_LIBRARY_DIR "" CACHE PATH "The directory containing FFmpeg library" FORCE)
133   endif()
134 endif()
135
136 if (3RDPARTY_FFMPEG_LIBRARY_DIR AND EXISTS "${3RDPARTY_FFMPEG_LIBRARY_DIR}")
137   list (APPEND 3RDPARTY_LIBRARY_DIRS "${3RDPARTY_FFMPEG_LIBRARY_DIR}")
138 else()
139   list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_FFMPEG_LIBRARY_DIR)
140
141   set (3RDPARTY_FFMPEG_LIBRARY "" CACHE FILEPATH "The path to FFmpeg library" FORCE)
142 endif()
143
144 # shared library
145 if (WIN32)
146   if (NOT 3RDPARTY_FFMPEG_DLL OR NOT EXISTS "${3RDPARTY_FFMPEG_DLL}")
147
148     set (CMAKE_FIND_LIBRARY_SUFFIXES .dll)
149     set (3RDPARTY_FFMPEG_DLL "3RDPARTY_FFMPEG_DLL-NOTFOUND" CACHE FILEPATH "The path to FFmpeg shared library" FORCE)
150
151     # find FFmpeg shared library
152     file (GLOB 3RDPARTY_FFMPEG_DLL "${3RDPARTY_FFMPEG_DIR}/bin/avutil[-][0-9]*")
153
154     if (3RDPARTY_FFMPEG_DLL AND EXISTS "${3RDPARTY_FFMPEG_DLL}")
155       set (3RDPARTY_FFMPEG_DLL "${3RDPARTY_FFMPEG_DLL}" CACHE FILEPATH "FFmpeg shared library" FORCE)
156       get_filename_component (3RDPARTY_FFMPEG_DLL_DIR "${3RDPARTY_FFMPEG_DLL}" PATH)
157       set (3RDPARTY_FFMPEG_DLL_DIR "${3RDPARTY_FFMPEG_DLL_DIR}" CACHE PATH "The directory containing FFmpeg library" FORCE)
158     else()
159       set (3RDPARTY_FFMPEG_DLL_DIR "" CACHE PATH "The directory containing FFmpeg shared library" FORCE)
160     endif()
161   endif()
162
163   if (3RDPARTY_FFMPEG_DLL_DIR OR EXISTS "${3RDPARTY_FFMPEG_DLL_DIR}")
164     list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_FFMPEG_DLL_DIR}")
165   else()
166     list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_FFMPEG_DLL_DIR)
167   endif()
168 endif()
169
170 # install instructions
171 if (INSTALL_FFMPEG)
172   OCCT_MAKE_OS_WITH_BITNESS()
173   OCCT_MAKE_COMPILER_SHORT_NAME()
174
175   if (WIN32)
176     if (DEFINED INSTALL_BIN_DIR)
177       install (FILES "${3RDPARTY_FFMPEG_DLL}" DESTINATION "${INSTALL_BIN_DIR}")
178     else()
179       install (FILES "${3RDPARTY_FFMPEG_DLL}"
180                CONFIGURATIONS Release
181                DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/bin")
182       install (FILES "${3RDPARTY_FFMPEG_DLL}"
183                CONFIGURATIONS RelWithDebInfo
184                DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/bini")
185       install (FILES "${3RDPARTY_FFMPEG_DLL}"
186                CONFIGURATIONS Debug
187                DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/bind")
188     endif()
189   else()
190     get_filename_component(3RDPARTY_FFMPEG_LIBRARY_ABS ${3RDPARTY_FFMPEG_LIBRARY} REALPATH)
191     get_filename_component(3RDPARTY_FFMPEG_LIBRARY_NAME ${3RDPARTY_FFMPEG_LIBRARY} NAME)
192
193     if (DEFINED INSTALL_LIB_DIR)
194       install (FILES "${3RDPARTY_FFMPEG_LIBRARY_ABS}"
195                DESTINATION "${INSTALL_LIB_DIR}"
196                RENAME ${3RDPARTY_FFMPEG_LIBRARY_NAME}.6)
197     else()
198       install (FILES "${3RDPARTY_FFMPEG_LIBRARY_ABS}"
199                CONFIGURATIONS Release
200                DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/lib"
201                RENAME ${3RDPARTY_FFMPEG_LIBRARY_NAME}.6)
202       install (FILES "${3RDPARTY_FFMPEG_LIBRARY_ABS}"
203                CONFIGURATIONS RelWithDebInfo
204                DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/libi"
205                RENAME ${3RDPARTY_FFMPEG_LIBRARY_NAME}.6)
206       install (FILES "${3RDPARTY_FFMPEG_LIBRARY_ABS}"
207                CONFIGURATIONS Debug
208                DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/libd"
209                RENAME ${3RDPARTY_FFMPEG_LIBRARY_NAME}.6)
210     endif()
211   endif()
212
213   set (USED_3RDPARTY_FFMPEG_DIR "")
214 else()
215   # the library directory for using by the executable
216   if (WIN32)
217     set (USED_3RDPARTY_FFMPEG_DIR ${3RDPARTY_FFMPEG_DLL_DIR})
218   else()
219     set (USED_3RDPARTY_FFMPEG_DIR ${3RDPARTY_FFMPEG_LIBRARY_DIR})
220   endif()
221 endif()
222
223 # unset all redundant variables
224 OCCT_CHECK_AND_UNSET (FFMPEG_INCLUDE_DIRS)
225 OCCT_CHECK_AND_UNSET (FFMPEG_LIBRARY_DIRS)
226 OCCT_CHECK_AND_UNSET (FFMPEG_DIR)
227
228 mark_as_advanced (3RDPARTY_FFMPEG_LIBRARY 3RDPARTY_FFMPEG_DLL)