Blame view

3rdparty/opencv-4.5.4/modules/videoio/cmake/detect_ffmpeg.cmake 4.85 KB
f4334277   Hu Chunming   提交3rdparty
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
  # --- 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()
      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)
    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)
  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)
    ocv_add_external_target(ffmpeg "${FFMPEG_INCLUDE_DIRS}" "${FFMPEG_LIBRARIES}" "HAVE_FFMPEG")
    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()