1
# ----------------------------------------------------------------------------
2
# Detect 3rd-party image IO libraries
3
# ----------------------------------------------------------------------------
5
# --- zlib (required) ---
7
ocv_clear_vars(ZLIB_LIBRARY ZLIB_LIBRARIES ZLIB_INCLUDE_DIR)
8
set(ZLIB_LIBRARY zlib CACHE INTERNAL "")
9
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/zlib-ng")
10
set(ZLIB_INCLUDE_DIR "${${ZLIB_LIBRARY}_BINARY_DIR}" CACHE INTERNAL "")
11
set(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR})
12
set(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
14
ocv_parse_header_version(ZLIB "${${ZLIB_LIBRARY}_SOURCE_DIR}/zlib.h.in" ZLIB_VERSION)
15
ocv_parse_header_version(ZLIBNG "${${ZLIB_LIBRARY}_SOURCE_DIR}/zlib.h.in" ZLIBNG_VERSION)
20
ocv_clear_vars(ZLIB_FOUND)
22
ocv_clear_internal_cache_vars(ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
24
set(_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
25
set(CMAKE_FIND_LIBRARY_SUFFIXES .so)
32
find_package(ZLIB "${MIN_VER_ZLIB}")
35
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
36
unset(_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
38
if(ZLIB_FOUND AND ANDROID)
39
if(ZLIB_LIBRARY MATCHES "/usr/lib.*/libz.so$")
42
set(ZLIB_LIBRARY_RELEASE z)
48
ocv_clear_vars(ZLIB_LIBRARY ZLIB_LIBRARIES ZLIB_INCLUDE_DIR)
50
set(ZLIB_LIBRARY zlib CACHE INTERNAL "")
51
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/zlib")
52
set(ZLIB_INCLUDE_DIR "${${ZLIB_LIBRARY}_SOURCE_DIR}" "${${ZLIB_LIBRARY}_BINARY_DIR}" CACHE INTERNAL "")
53
set(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR})
54
set(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
56
ocv_parse_header_version(ZLIB "${${ZLIB_LIBRARY}_SOURCE_DIR}/zlib.h" ZLIB_VERSION)
60
# --- libavif (optional) ---
63
ocv_clear_internal_cache_vars(AVIF_LIBRARY AVIF_INCLUDE_DIR)
64
include(cmake/OpenCVFindAVIF.cmake)
70
# --- libjpeg (optional) ---
73
ocv_clear_vars(JPEG_FOUND)
75
ocv_clear_internal_cache_vars(JPEG_LIBRARY JPEG_INCLUDE_DIR)
77
set(JPEG_LIBRARY jpeg)
78
set(JPEG_LIBRARIES jpeg)
86
ocv_clear_vars(JPEG_LIBRARY JPEG_INCLUDE_DIR)
88
if(NOT BUILD_JPEG_TURBO_DISABLE)
89
set(JPEG_LIBRARY libjpeg-turbo CACHE INTERNAL "")
90
set(JPEG_LIBRARIES ${JPEG_LIBRARY})
91
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libjpeg-turbo")
92
set(JPEG_INCLUDE_DIR "${${JPEG_LIBRARY}_SOURCE_DIR}/src" CACHE INTERNAL "")
94
set(JPEG_LIBRARY libjpeg CACHE INTERNAL "")
95
set(JPEG_LIBRARIES ${JPEG_LIBRARY})
96
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libjpeg")
97
set(JPEG_INCLUDE_DIR "${${JPEG_LIBRARY}_SOURCE_DIR}" CACHE INTERNAL "")
99
set(JPEG_INCLUDE_DIRS "${JPEG_INCLUDE_DIR}")
102
macro(ocv_detect_jpeg_version header_file)
103
if(NOT DEFINED JPEG_LIB_VERSION AND EXISTS "${header_file}")
104
ocv_parse_header("${header_file}" JPEG_VERSION_LINES JPEG_LIB_VERSION)
107
ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/jpeglib.h")
108
if(DEFINED CMAKE_CXX_LIBRARY_ARCHITECTURE)
109
ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/${CMAKE_CXX_LIBRARY_ARCHITECTURE}/jconfig.h")
111
# no needed for strict platform check here, both files 64/32 should contain the same version
112
ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/jconfig-64.h")
113
ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/jconfig-32.h")
114
ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/jconfig.h")
115
ocv_detect_jpeg_version("${${JPEG_LIBRARY}_BINARY_DIR}/jconfig.h")
116
if(NOT DEFINED JPEG_LIB_VERSION)
117
set(JPEG_LIB_VERSION "unknown")
122
# --- libtiff (optional, should be searched after zlib and libjpeg) ---
125
ocv_clear_vars(TIFF_FOUND)
127
ocv_clear_internal_cache_vars(TIFF_LIBRARY TIFF_INCLUDE_DIR)
129
set(TIFF_LIBRARY tiff)
130
set(TIFF_LIBRARIES tiff)
136
ocv_parse_header("${TIFF_INCLUDE_DIR}/tiff.h" TIFF_VERSION_LINES TIFF_VERSION_CLASSIC TIFF_VERSION_BIG TIFF_VERSION TIFF_BIGTIFF_VERSION)
141
ocv_clear_vars(TIFF_LIBRARY TIFF_LIBRARIES TIFF_INCLUDE_DIR)
143
set(TIFF_LIBRARY libtiff CACHE INTERNAL "")
144
set(TIFF_LIBRARIES ${TIFF_LIBRARY})
145
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libtiff")
146
set(TIFF_INCLUDE_DIR "${${TIFF_LIBRARY}_SOURCE_DIR}" "${${TIFF_LIBRARY}_BINARY_DIR}" CACHE INTERNAL "")
147
ocv_parse_header("${${TIFF_LIBRARY}_SOURCE_DIR}/tiff.h" TIFF_VERSION_LINES TIFF_VERSION_CLASSIC TIFF_VERSION_BIG TIFF_VERSION TIFF_BIGTIFF_VERSION)
150
if(TIFF_VERSION_CLASSIC AND NOT TIFF_VERSION)
151
set(TIFF_VERSION ${TIFF_VERSION_CLASSIC})
154
if(TIFF_BIGTIFF_VERSION AND NOT TIFF_VERSION_BIG)
155
set(TIFF_VERSION_BIG ${TIFF_BIGTIFF_VERSION})
158
if(NOT TIFF_VERSION_STRING AND TIFF_INCLUDE_DIR)
159
foreach(_TIFF_INCLUDE_DIR IN LISTS TIFF_INCLUDE_DIR)
160
if(EXISTS "${_TIFF_INCLUDE_DIR}/tiffvers.h")
161
file(STRINGS "${_TIFF_INCLUDE_DIR}/tiffvers.h" tiff_version_str REGEX "^#define[\t ]+TIFFLIB_VERSION_STR[\t ]+\"LIBTIFF, Version .*")
162
string(REGEX REPLACE "^#define[\t ]+TIFFLIB_VERSION_STR[\t ]+\"LIBTIFF, Version +([^ \\n]*).*" "\\1" TIFF_VERSION_STRING "${tiff_version_str}")
163
unset(tiff_version_str)
171
# --- libwebp (optional) ---
175
ocv_clear_vars(WEBP_FOUND WEBP_LIBRARY WEBP_LIBRARIES WEBP_INCLUDE_DIR)
177
ocv_clear_internal_cache_vars(WEBP_LIBRARY WEBP_INCLUDE_DIR)
178
include(cmake/OpenCVFindWebP.cmake)
185
# --- Add libwebp to 3rdparty/libwebp and compile it if not available ---
186
if(WITH_WEBP AND NOT WEBP_FOUND
187
AND (NOT ANDROID OR HAVE_CPUFEATURES)
189
ocv_clear_vars(WEBP_LIBRARY WEBP_INCLUDE_DIR)
190
set(WEBP_LIBRARY libwebp CACHE INTERNAL "")
191
set(WEBP_LIBRARIES ${WEBP_LIBRARY})
193
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libwebp")
194
set(WEBP_INCLUDE_DIR "${${WEBP_LIBRARY}_SOURCE_DIR}/src" CACHE INTERNAL "")
198
if(NOT WEBP_VERSION AND WEBP_INCLUDE_DIR)
199
ocv_clear_vars(ENC_MAJ_VERSION ENC_MIN_VERSION ENC_REV_VERSION)
200
if(EXISTS "${WEBP_INCLUDE_DIR}/enc/vp8enci.h")
201
ocv_parse_header("${WEBP_INCLUDE_DIR}/enc/vp8enci.h" WEBP_VERSION_LINES ENC_MAJ_VERSION ENC_MIN_VERSION ENC_REV_VERSION)
202
set(WEBP_VERSION "${ENC_MAJ_VERSION}.${ENC_MIN_VERSION}.${ENC_REV_VERSION}")
203
elseif(EXISTS "${WEBP_INCLUDE_DIR}/webp/encode.h")
204
file(STRINGS "${WEBP_INCLUDE_DIR}/webp/encode.h" WEBP_ENCODER_ABI_VERSION REGEX "#define[ \t]+WEBP_ENCODER_ABI_VERSION[ \t]+([x0-9a-f]+)" )
205
if(WEBP_ENCODER_ABI_VERSION MATCHES "#define[ \t]+WEBP_ENCODER_ABI_VERSION[ \t]+([x0-9a-f]+)")
206
set(WEBP_ENCODER_ABI_VERSION "${CMAKE_MATCH_1}")
207
set(WEBP_VERSION "encoder: ${WEBP_ENCODER_ABI_VERSION}")
209
unset(WEBP_ENCODER_ABI_VERSION)
214
# --- libopenjp2 (optional, check before libjasper) ---
217
ocv_clear_vars(OpenJPEG_FOUND)
219
find_package(OpenJPEG QUIET)
222
if(NOT OpenJPEG_FOUND OR OPENJPEG_MAJOR_VERSION LESS 2)
223
ocv_clear_vars(OPENJPEG_MAJOR_VERSION OPENJPEG_MINOR_VERSION OPENJPEG_BUILD_VERSION OPENJPEG_LIBRARIES OPENJPEG_INCLUDE_DIRS)
224
message(STATUS "Could NOT find OpenJPEG (minimal suitable version: 2.0, "
225
"recommended version >= 2.3.1). OpenJPEG will be built from sources")
226
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/openjpeg")
227
if(OCV_CAN_BUILD_OPENJPEG)
228
set(HAVE_OPENJPEG YES)
229
message(STATUS "OpenJPEG libraries will be built from sources: ${OPENJPEG_LIBRARIES} "
230
"(version \"${OPENJPEG_VERSION}\")")
232
set(HAVE_OPENJPEG NO)
233
message(STATUS "OpenJPEG libraries can't be built from sources. System requirements are not fulfilled.")
236
set(HAVE_OPENJPEG YES)
237
set(OPENJPEG_VERSION "${OPENJPEG_MAJOR_VERSION}.${OPENJPEG_MINOR_VERSION}.${OPENJPEG_BUILD_VERSION}")
238
message(STATUS "Found system OpenJPEG: ${OPENJPEG_LIBRARIES} "
239
"(found version \"${OPENJPEG_VERSION}\")")
243
# --- libjasper (optional, should be searched after libjpeg) ---
244
if(WITH_JASPER AND NOT HAVE_OPENJPEG)
246
ocv_clear_vars(JASPER_FOUND)
252
ocv_clear_vars(JASPER_LIBRARY JASPER_LIBRARIES JASPER_INCLUDE_DIR)
254
set(JASPER_LIBRARY libjasper CACHE INTERNAL "")
255
set(JASPER_LIBRARIES ${JASPER_LIBRARY})
256
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libjasper")
257
set(JASPER_INCLUDE_DIR "${${JASPER_LIBRARY}_SOURCE_DIR}" CACHE INTERNAL "")
262
if(NOT JASPER_VERSION_STRING)
263
ocv_parse_header2(JASPER "${JASPER_INCLUDE_DIR}/jasper/jas_config.h" JAS_VERSION "")
269
ocv_clear_vars(PNG_FOUND)
271
# CMakeConfig bug in SPNG, include is missing there in version 0.7.4 and older
272
# See https://github.com/randy408/libspng/pull/264
273
include(CMakeFindDependencyMacro)
274
find_package(SPNG QUIET)
276
set(SPNG_LIBRARY "spng::spng" CACHE INTERNAL "")
277
set(SPNG_LIBRARIES ${SPNG_LIBRARY})
280
pkg_check_modules(SPNG QUIET spng)
285
message(STATUS "imgcodecs: PNG codec will use SPNG, version: ${SPNG_VERSION}")
289
set(SPNG_LIBRARY libspng CACHE INTERNAL "")
290
set(SPNG_LIBRARIES ${SPNG_LIBRARY})
291
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libspng")
292
set(SPNG_INCLUDE_DIR "${${SPNG_LIBRARY}_SOURCE_DIR}" CACHE INTERNAL "")
293
set(SPNG_DEFINITIONS "")
294
ocv_parse_header("${SPNG_INCLUDE_DIR}/spng.h" SPNG_VERSION_LINES SPNG_VERSION_MAJOR SPNG_VERSION_MINOR SPNG_VERSION_PATCH)
297
set(SPNG_VERSION "${SPNG_VERSION_MAJOR}.${SPNG_VERSION_MINOR}.${SPNG_VERSION_PATCH}")
298
message(STATUS "imgcodecs: PNG codec will use SPNG, version: ${SPNG_VERSION} ")
302
# --- libpng (optional, should be searched after zlib) ---
303
if(NOT HAVE_SPNG AND WITH_PNG)
305
ocv_clear_vars(PNG_FOUND)
307
ocv_clear_internal_cache_vars(PNG_LIBRARY PNG_INCLUDE_DIR)
308
find_package(PNG QUIET)
312
ocv_clear_vars(PNG_LIBRARY PNG_LIBRARIES PNG_INCLUDE_DIR PNG_DEFINITIONS)
314
set(PNG_LIBRARY libpng CACHE INTERNAL "")
315
set(PNG_LIBRARIES ${PNG_LIBRARY})
316
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libpng")
317
set(PNG_INCLUDE_DIR "${${PNG_LIBRARY}_SOURCE_DIR}" CACHE INTERNAL "")
318
set(PNG_DEFINITIONS "")
319
ocv_parse_header_version(PNG "${PNG_INCLUDE_DIR}/png.h" PNG_LIBPNG_VER_STRING)
326
# --- OpenEXR (optional) ---
328
ocv_clear_vars(HAVE_OPENEXR)
329
if(NOT BUILD_OPENEXR)
330
ocv_clear_internal_cache_vars(OPENEXR_INCLUDE_PATHS OPENEXR_LIBRARIES OPENEXR_ILMIMF_LIBRARY OPENEXR_VERSION)
331
include("${OpenCV_SOURCE_DIR}/cmake/OpenCVFindOpenEXR.cmake")
335
set(HAVE_OPENEXR YES)
337
ocv_clear_vars(OPENEXR_INCLUDE_PATHS OPENEXR_LIBRARIES OPENEXR_ILMIMF_LIBRARY OPENEXR_VERSION)
339
set(OPENEXR_LIBRARIES IlmImf)
340
add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/openexr")
341
if(OPENEXR_VERSION) # check via TARGET doesn't work
342
set(BUILD_OPENEXR ON)
343
set(HAVE_OPENEXR YES)
344
set(BUILD_OPENEXR ON)
349
# --- GDAL (optional) ---
351
find_package(GDAL QUIET)
355
ocv_clear_vars(GDAL_VERSION GDAL_LIBRARIES)
358
ocv_include_directories(${GDAL_INCLUDE_DIR})
363
find_package(GDCM QUIET)
366
ocv_clear_vars(GDCM_VERSION GDCM_LIBRARIES)
369
# include(${GDCM_USE_FILE})
370
set(GDCM_LIBRARIES gdcmMSFF) # GDCM does not set this variable for some reason
375
set(HAVE_IMGCODEC_HDR ON)
376
elseif(DEFINED WITH_IMGCODEC_HDR)
377
set(HAVE_IMGCODEC_HDR OFF)
379
if(WITH_IMGCODEC_SUNRASTER)
380
set(HAVE_IMGCODEC_SUNRASTER ON)
381
elseif(DEFINED WITH_IMGCODEC_SUNRASTER)
382
set(HAVE_IMGCODEC_SUNRASTER OFF)
385
set(HAVE_IMGCODEC_PXM ON)
386
elseif(DEFINED WITH_IMGCODEC_PXM)
387
set(HAVE_IMGCODEC_PXM OFF)
390
set(HAVE_IMGCODEC_PFM ON)
391
elseif(DEFINED WITH_IMGCODEC_PFM)
392
set(HAVE_IMGCODEC_PFM OFF)