mirror of
https://github.com/opencv/opencv.git
synced 2024-12-15 18:09:11 +08:00
da4ac6b7ef
Introduce libavdevice to make v4l2 available to the ffmpeg backend * introduce libavdevice to make v4l2 available to the ffmpeg backend * downgrade the min required libavdevice version to 53.2.0 * make libavdevice optional * create OCV_OPTION OPENCV_FFMPEG_ENABLE_LIBAVDEVICE and add definition through ocv_add_external_target * move OCV_OPTION 'OPENCV_FFMPEG_ENABLE_LIBAVDEVICE' to detect_ffmpeg.cmake
147 lines
5.6 KiB
CMake
147 lines
5.6 KiB
CMake
# --- FFMPEG ---
|
|
OCV_OPTION(OPENCV_FFMPEG_ENABLE_LIBAVDEVICE "Include FFMPEG/libavdevice library support." OFF
|
|
VISIBLE_IF WITH_FFMPEG)
|
|
|
|
if(NOT HAVE_FFMPEG AND OPENCV_FFMPEG_USE_FIND_PACKAGE)
|
|
if(OPENCV_FFMPEG_USE_FIND_PACKAGE STREQUAL "1" OR OPENCV_FFMPEG_USE_FIND_PACKAGE STREQUAL "ON")
|
|
set(OPENCV_FFMPEG_USE_FIND_PACKAGE "FFMPEG")
|
|
endif()
|
|
find_package(${OPENCV_FFMPEG_USE_FIND_PACKAGE}) # Required components: AVCODEC AVFORMAT AVUTIL SWSCALE
|
|
if(FFMPEG_FOUND OR FFmpeg_FOUND)
|
|
set(HAVE_FFMPEG TRUE)
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT HAVE_FFMPEG AND WIN32 AND NOT ARM AND NOT OPENCV_FFMPEG_SKIP_DOWNLOAD)
|
|
include("${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg.cmake")
|
|
download_win_ffmpeg(FFMPEG_CMAKE_SCRIPT)
|
|
if(FFMPEG_CMAKE_SCRIPT)
|
|
include("${FFMPEG_CMAKE_SCRIPT}")
|
|
set(HAVE_FFMPEG TRUE)
|
|
set(HAVE_FFMPEG_WRAPPER TRUE)
|
|
endif()
|
|
endif()
|
|
|
|
set(_required_ffmpeg_libraries libavcodec libavformat libavutil libswscale)
|
|
set(_used_ffmpeg_libraries ${_required_ffmpeg_libraries})
|
|
if(NOT HAVE_FFMPEG AND PKG_CONFIG_FOUND)
|
|
ocv_check_modules(FFMPEG libavcodec libavformat libavutil libswscale)
|
|
if(FFMPEG_FOUND)
|
|
ocv_check_modules(FFMPEG_libavresample libavresample) # optional
|
|
if(FFMPEG_libavresample_FOUND)
|
|
list(APPEND FFMPEG_LIBRARIES ${FFMPEG_libavresample_LIBRARIES})
|
|
list(APPEND _used_ffmpeg_libraries libavresample)
|
|
endif()
|
|
if(OPENCV_FFMPEG_ENABLE_LIBAVDEVICE)
|
|
ocv_check_modules(FFMPEG_libavdevice libavdevice) # optional
|
|
if(FFMPEG_libavdevice_FOUND)
|
|
list(APPEND FFMPEG_LIBRARIES ${FFMPEG_libavdevice_LIBRARIES})
|
|
list(APPEND _used_ffmpeg_libraries libavdevice)
|
|
endif()
|
|
endif()
|
|
set(HAVE_FFMPEG TRUE)
|
|
else()
|
|
set(_missing_ffmpeg_libraries "")
|
|
foreach (ffmpeg_lib ${_required_ffmpeg_libraries})
|
|
if (NOT FFMPEG_${ffmpeg_lib}_FOUND)
|
|
list(APPEND _missing_ffmpeg_libraries ${ffmpeg_lib})
|
|
endif()
|
|
endforeach ()
|
|
message(STATUS "FFMPEG is disabled. Required libraries: ${_required_ffmpeg_libraries}."
|
|
" Missing libraries: ${_missing_ffmpeg_libraries}")
|
|
unset(_missing_ffmpeg_libraries)
|
|
endif()
|
|
endif()
|
|
|
|
#=================================
|
|
# Versions check.
|
|
if(HAVE_FFMPEG AND NOT HAVE_FFMPEG_WRAPPER)
|
|
set(_min_libavcodec_version 54.35.0)
|
|
set(_min_libavformat_version 54.20.4)
|
|
set(_min_libavutil_version 52.3.0)
|
|
set(_min_libswscale_version 2.1.1)
|
|
set(_min_libavresample_version 1.0.1)
|
|
set(_min_libavdevice_version 53.2.0)
|
|
foreach(ffmpeg_lib ${_used_ffmpeg_libraries})
|
|
if(FFMPEG_${ffmpeg_lib}_VERSION VERSION_LESS _min_${ffmpeg_lib}_version)
|
|
message(STATUS "FFMPEG is disabled. Can't find suitable ${ffmpeg_lib} library"
|
|
" (minimal ${_min_${ffmpeg_lib}_version}, found ${FFMPEG_${ffmpeg_lib}_VERSION}).")
|
|
set(HAVE_FFMPEG FALSE)
|
|
endif()
|
|
endforeach()
|
|
if(NOT HAVE_FFMPEG)
|
|
message(STATUS "FFMPEG libraries version check failed "
|
|
"(minimal libav release 9.20, minimal FFMPEG release 1.1.16).")
|
|
endif()
|
|
unset(_min_libavcodec_version)
|
|
unset(_min_libavformat_version)
|
|
unset(_min_libavutil_version)
|
|
unset(_min_libswscale_version)
|
|
unset(_min_libavresample_version)
|
|
unset(_min_libavdevice_version)
|
|
endif()
|
|
|
|
#==================================
|
|
|
|
if(HAVE_FFMPEG AND NOT HAVE_FFMPEG_WRAPPER AND NOT OPENCV_FFMPEG_SKIP_BUILD_CHECK)
|
|
try_compile(__VALID_FFMPEG
|
|
"${OpenCV_BINARY_DIR}"
|
|
"${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp"
|
|
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${FFMPEG_INCLUDE_DIRS}"
|
|
"-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}"
|
|
OUTPUT_VARIABLE TRY_OUT
|
|
)
|
|
if(NOT __VALID_FFMPEG)
|
|
# message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}")
|
|
message(STATUS "WARNING: Can't build ffmpeg test code")
|
|
set(HAVE_FFMPEG FALSE)
|
|
endif()
|
|
endif()
|
|
|
|
#==================================
|
|
unset(_required_ffmpeg_libraries)
|
|
unset(_used_ffmpeg_libraries)
|
|
|
|
if(HAVE_FFMPEG_WRAPPER)
|
|
ocv_add_external_target(ffmpeg "" "" "HAVE_FFMPEG_WRAPPER")
|
|
elseif(HAVE_FFMPEG)
|
|
if(OPENCV_FFMPEG_ENABLE_LIBAVDEVICE AND FFMPEG_libavdevice_FOUND)
|
|
set(HAVE_FFMPEG_LIBAVDEVICE TRUE)
|
|
ocv_add_external_target(ffmpeg "${FFMPEG_INCLUDE_DIRS}" "${FFMPEG_LIBRARIES}" "HAVE_FFMPEG;HAVE_FFMPEG_LIBAVDEVICE")
|
|
else()
|
|
ocv_add_external_target(ffmpeg "${FFMPEG_INCLUDE_DIRS}" "${FFMPEG_LIBRARIES}" "HAVE_FFMPEG")
|
|
endif()
|
|
set(__builtin_defines "")
|
|
set(__builtin_include_dirs "")
|
|
set(__builtin_libs "")
|
|
set(__plugin_defines "")
|
|
set(__plugin_include_dirs "")
|
|
set(__plugin_libs "")
|
|
if(HAVE_OPENCL)
|
|
set(__opencl_dirs "")
|
|
if(OPENCL_INCLUDE_DIRS)
|
|
set(__opencl_dirs "${OPENCL_INCLUDE_DIRS}")
|
|
elseif(OPENCL_INCLUDE_DIR)
|
|
set(__opencl_dirs "${OPENCL_INCLUDE_DIR}")
|
|
else()
|
|
set(__opencl_dirs "${OpenCV_SOURCE_DIR}/3rdparty/include/opencl/1.2")
|
|
endif()
|
|
# extra dependencies for buildin code (OpenCL dir is required for extensions like cl_d3d11.h)
|
|
# buildin HAVE_OPENCL is already defined through cvconfig.h
|
|
list(APPEND __builtin_include_dirs "${__opencl_dirs}")
|
|
|
|
# extra dependencies for
|
|
list(APPEND __plugin_defines "HAVE_OPENCL")
|
|
list(APPEND __plugin_include_dirs "${__opencl_dirs}")
|
|
endif()
|
|
|
|
# TODO: libva, d3d11
|
|
|
|
if(__builtin_include_dirs OR __builtin_include_defines OR __builtin_include_libs)
|
|
ocv_add_external_target(ffmpeg.builtin_deps "${__builtin_include_dirs}" "${__builtin_include_libs}" "${__builtin_defines}")
|
|
endif()
|
|
if(VIDEOIO_ENABLE_PLUGINS AND __plugin_include_dirs OR __plugin_include_defines OR __plugin_include_libs)
|
|
ocv_add_external_target(ffmpeg.plugin_deps "${__plugin_include_dirs}" "${__plugin_include_libs}" "${__plugin_defines}")
|
|
endif()
|
|
endif()
|