Skip to content

Commit 3d8395c

Browse files
committed
Merge pull request opencv#7743 from alalek:cmake_ffmpeg_cleanup_2.4
2 parents 2af4dc7 + 32f5683 commit 3d8395c

File tree

7 files changed

+104
-76
lines changed

7 files changed

+104
-76
lines changed

3rdparty/ffmpeg/ffmpeg_version.cmake

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
set(HAVE_FFMPEG 1)
2-
set(HAVE_FFMPEG_CODEC 1)
3-
set(HAVE_FFMPEG_FORMAT 1)
4-
set(HAVE_FFMPEG_UTIL 1)
5-
set(HAVE_FFMPEG_SWSCALE 1)
6-
set(HAVE_FFMPEG_RESAMPLE 0)
7-
set(HAVE_GENTOO_FFMPEG 1)
1+
set(FFMPEG_libavcodec_FOUND 1)
2+
set(FFMPEG_libavformat_FOUND 1)
3+
set(FFMPEG_libavutil_FOUND 1)
4+
set(FFMPEG_libswscale_FOUND 1)
5+
set(FFMPEG_libavresample_FOUND 1)
86

9-
set(ALIASOF_libavcodec_VERSION 55.18.102)
10-
set(ALIASOF_libavformat_VERSION 55.12.100)
11-
set(ALIASOF_libavutil_VERSION 52.38.100)
12-
set(ALIASOF_libswscale_VERSION 2.3.100)
13-
set(ALIASOF_libavresample_VERSION 1.0.1)
7+
set(FFMPEG_libavcodec_VERSION 55.18.102)
8+
set(FFMPEG_libavformat_VERSION 55.12.100)
9+
set(FFMPEG_libavutil_VERSION 52.38.100)
10+
set(FFMPEG_libswscale_VERSION 2.3.100)
11+
set(FFMPEG_libavresample_VERSION 1.0.1)

CMakeLists.txt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -880,19 +880,18 @@ if(ANDROID)
880880
endif()
881881
endif()
882882

883-
if(DEFINED WITH_FFMPEG)
883+
if(DEFINED WITH_FFMPEG OR HAVE_FFMPEG)
884884
if(WIN32)
885885
status(" FFMPEG:" WITH_FFMPEG THEN "YES (prebuilt binaries)" ELSE NO)
886886
else()
887887
status(" FFMPEG:" HAVE_FFMPEG THEN YES ELSE NO)
888888
endif()
889-
status(" codec:" HAVE_FFMPEG_CODEC THEN "YES (ver ${ALIASOF_libavcodec_VERSION})" ELSE NO)
890-
status(" format:" HAVE_FFMPEG_FORMAT THEN "YES (ver ${ALIASOF_libavformat_VERSION})" ELSE NO)
891-
status(" util:" HAVE_FFMPEG_UTIL THEN "YES (ver ${ALIASOF_libavutil_VERSION})" ELSE NO)
892-
status(" swscale:" HAVE_FFMPEG_SWSCALE THEN "YES (ver ${ALIASOF_libswscale_VERSION})" ELSE NO)
893-
status(" resample:" HAVE_FFMPEG_RESAMPLE THEN "YES (ver ${ALIASOF_libavresample_VERSION})" ELSE NO)
894-
status(" gentoo-style:" HAVE_GENTOO_FFMPEG THEN YES ELSE NO)
895-
endif(DEFINED WITH_FFMPEG)
889+
status(" avcodec:" FFMPEG_libavcodec_FOUND THEN "YES (ver ${FFMPEG_libavcodec_VERSION})" ELSE NO)
890+
status(" avformat:" FFMPEG_libavformat_FOUND THEN "YES (ver ${FFMPEG_libavformat_VERSION})" ELSE NO)
891+
status(" avutil:" FFMPEG_libavutil_FOUND THEN "YES (ver ${FFMPEG_libavutil_VERSION})" ELSE NO)
892+
status(" swscale:" FFMPEG_libswscale_FOUND THEN "YES (ver ${FFMPEG_libswscale_VERSION})" ELSE NO)
893+
status(" avresample:" FFMPEG_libavresample_FOUND THEN "YES (ver ${FFMPEG_libavresample_VERSION})" ELSE NO)
894+
endif()
896895

897896
if(DEFINED WITH_GSTREAMER)
898897
status(" GStreamer:" HAVE_GSTREAMER THEN "" ELSE NO)

cmake/OpenCVFindLibsVideo.cmake

Lines changed: 22 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -190,63 +190,35 @@ if(WITH_XIMEA)
190190
endif(WITH_XIMEA)
191191

192192
# --- FFMPEG ---
193-
ocv_clear_vars(HAVE_FFMPEG HAVE_FFMPEG_CODEC HAVE_FFMPEG_FORMAT HAVE_FFMPEG_UTIL HAVE_FFMPEG_SWSCALE HAVE_FFMPEG_RESAMPLE HAVE_GENTOO_FFMPEG HAVE_FFMPEG_FFMPEG)
193+
ocv_clear_vars(HAVE_FFMPEG)
194194
if(WITH_FFMPEG)
195195
if(WIN32 AND NOT ARM)
196196
include("${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg_version.cmake")
197-
elseif(UNIX)
198-
CHECK_MODULE(libavcodec HAVE_FFMPEG_CODEC)
199-
CHECK_MODULE(libavformat HAVE_FFMPEG_FORMAT)
200-
CHECK_MODULE(libavutil HAVE_FFMPEG_UTIL)
201-
CHECK_MODULE(libswscale HAVE_FFMPEG_SWSCALE)
202-
CHECK_MODULE(libavresample HAVE_FFMPEG_RESAMPLE)
203-
204-
CHECK_INCLUDE_FILE(libavformat/avformat.h HAVE_GENTOO_FFMPEG)
205-
CHECK_INCLUDE_FILE(ffmpeg/avformat.h HAVE_FFMPEG_FFMPEG)
206-
if(NOT HAVE_GENTOO_FFMPEG AND NOT HAVE_FFMPEG_FFMPEG)
207-
if(EXISTS /usr/include/ffmpeg/libavformat/avformat.h OR HAVE_FFMPEG_SWSCALE)
208-
set(HAVE_GENTOO_FFMPEG TRUE)
209-
endif()
197+
set(HAVE_FFMPEG TRUE)
198+
elseif(PKG_CONFIG_FOUND)
199+
ocv_check_modules(FFMPEG libavcodec libavformat libavutil libswscale)
200+
ocv_check_modules(FFMPEG_libavresample libavresample)
201+
if(FFMPEG_libavresample_FOUND)
202+
ocv_append_build_options(FFMPEG FFMPEG_libavresample)
210203
endif()
211-
if(HAVE_FFMPEG_CODEC AND HAVE_FFMPEG_FORMAT AND HAVE_FFMPEG_UTIL AND HAVE_FFMPEG_SWSCALE)
212-
set(HAVE_FFMPEG TRUE)
213-
endif()
214-
215204
if(HAVE_FFMPEG)
216-
# Find the bzip2 library because it is required on some systems
217-
FIND_LIBRARY(BZIP2_LIBRARIES NAMES bz2 bzip2)
218-
if(NOT BZIP2_LIBRARIES)
219-
# Do an other trial
220-
FIND_FILE(BZIP2_LIBRARIES NAMES libbz2.so.1 PATHS /lib)
205+
try_compile(__VALID_FFMPEG
206+
"${OpenCV_BINARY_DIR}"
207+
"${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp"
208+
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${FFMPEG_INCLUDE_DIRS}"
209+
"-DLINK_DIRECTORIES:STRING=${FFMPEG_LIBRARY_DIRS}"
210+
"-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}"
211+
OUTPUT_VARIABLE TRY_OUT
212+
)
213+
if(NOT __VALID_FFMPEG)
214+
#message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}")
215+
message(STATUS "WARNING: Can't build ffmpeg test code")
216+
else()
217+
ocv_append_build_options(HIGHGUI FFMPEG)
221218
endif()
222-
else()
223-
find_path(FFMPEG_INCLUDE_DIR "libavformat/avformat.h"
224-
PATHS /usr/local /usr /opt
225-
PATH_SUFFIXES include
226-
DOC "The path to FFMPEG headers")
227-
if(FFMPEG_INCLUDE_DIR)
228-
set(HAVE_GENTOO_FFMPEG TRUE)
229-
set(FFMPEG_LIB_DIR "${FFMPEG_INCLUDE_DIR}/../lib" CACHE PATH "Full path of FFMPEG library directory")
230-
find_library(FFMPEG_CODEC_LIB "avcodec" HINTS "${FFMPEG_LIB_DIR}")
231-
find_library(FFMPEG_FORMAT_LIB "avformat" HINTS "${FFMPEG_LIB_DIR}")
232-
find_library(FFMPEG_UTIL_LIB "avutil" HINTS "${FFMPEG_LIB_DIR}")
233-
find_library(FFMPEG_SWSCALE_LIB "swscale" HINTS "${FFMPEG_LIB_DIR}")
234-
if(FFMPEG_CODEC_LIB AND FFMPEG_FORMAT_LIB AND
235-
FFMPEG_UTIL_LIB AND FFMPEG_SWSCALE_LIB)
236-
set(ALIASOF_libavcodec_VERSION "Unknown")
237-
set(ALIASOF_libavformat_VERSION "Unknown")
238-
set(ALIASOF_libavutil_VERSION "Unknown")
239-
set(ALIASOF_libswscale_VERSION "Unknown")
240-
set(HAVE_FFMPEG 1)
241-
endif()
242-
endif(FFMPEG_INCLUDE_DIR)
243-
if(HAVE_FFMPEG)
244-
set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES}
245-
${FFMPEG_CODEC_LIB} ${FFMPEG_FORMAT_LIB}
246-
${FFMPEG_UTIL_LIB} ${FFMPEG_SWSCALE_LIB})
247-
ocv_include_directories(${FFMPEG_INCLUDE_DIR})
248-
endif(HAVE_FFMPEG)
249219
endif()
220+
else()
221+
message(STATUS "Can't find ffmpeg - 'pkg-config' utility is missing")
250222
endif()
251223
endif(WITH_FFMPEG)
252224

cmake/OpenCVUtils.cmake

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,44 @@ macro(OCV_OPTION variable description value)
278278
unset(__value)
279279
endmacro()
280280

281+
# Usage: ocv_append_build_options(HIGHGUI FFMPEG)
282+
macro(ocv_append_build_options var_prefix pkg_prefix)
283+
foreach(suffix INCLUDE_DIRS LIBRARIES LIBRARY_DIRS)
284+
if(${pkg_prefix}_${suffix})
285+
list(APPEND ${var_prefix}_${suffix} ${${pkg_prefix}_${suffix}})
286+
list(REMOVE_DUPLICATES ${var_prefix}_${suffix})
287+
endif()
288+
endforeach()
289+
endmacro()
290+
291+
# Usage is similar to CMake 'pkg_check_modules' command
292+
# It additionally controls HAVE_${define} and ${define}_${modname}_FOUND variables
293+
macro(ocv_check_modules define)
294+
unset(HAVE_${define})
295+
foreach(m ${ARGN})
296+
if (m MATCHES "(.*[^><])(>=|=|<=)(.*)")
297+
set(__modname "${CMAKE_MATCH_1}")
298+
else()
299+
set(__modname "${m}")
300+
endif()
301+
unset(${define}_${__modname}_FOUND)
302+
endforeach()
303+
pkg_check_modules(${define} ${ARGN})
304+
if(${define}_FOUND)
305+
set(HAVE_${define} 1)
306+
endif()
307+
foreach(m ${ARGN})
308+
if (m MATCHES "(.*[^><])(>=|=|<=)(.*)")
309+
set(__modname "${CMAKE_MATCH_1}")
310+
else()
311+
set(__modname "${m}")
312+
endif()
313+
if(NOT DEFINED ${define}_${__modname}_FOUND AND ${define}_FOUND)
314+
set(${define}_${__modname}_FOUND 1)
315+
endif()
316+
endforeach()
317+
endmacro()
318+
281319

282320
# Macros that checks if module have been installed.
283321
# After it adds module to build and define

cmake/checks/ffmpeg_test.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <stdlib.h>
2+
3+
extern "C" {
4+
#include <libavformat/avformat.h>
5+
#include <libavcodec/avcodec.h>
6+
#include <libswscale/swscale.h>
7+
}
8+
9+
#define CALC_FFMPEG_VERSION(a,b,c) ( a<<16 | b<<8 | c )
10+
11+
static void test()
12+
{
13+
AVFormatContext* c = 0;
14+
AVCodec* avcodec = 0;
15+
AVFrame* frame = 0;
16+
17+
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)
18+
int err = avformat_open_input(&c, "", NULL, NULL);
19+
#else
20+
int err = av_open_input_file(&c, "", NULL, 0, NULL);
21+
#endif
22+
}
23+
24+
int main() { test(); return 0; }

cmake/templates/cvconfig.h.in

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,6 @@
6161
/* FFMpeg video library */
6262
#cmakedefine HAVE_FFMPEG
6363

64-
/* ffmpeg's libswscale */
65-
#cmakedefine HAVE_FFMPEG_SWSCALE
66-
67-
/* ffmpeg in Gentoo */
68-
#cmakedefine HAVE_GENTOO_FFMPEG
69-
7064
/* GStreamer multimedia framework */
7165
#cmakedefine HAVE_GSTREAMER
7266

modules/highgui/src/cap_ffmpeg_impl.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
//
4141
//M*/
4242

43+
#define HAVE_FFMPEG_SWSCALE
44+
#define HAVE_GENTOO_FFMPEG
45+
4346
#include "cap_ffmpeg_api.hpp"
4447
#include <assert.h>
4548
#include <algorithm>

0 commit comments

Comments
 (0)