diff options
Diffstat (limited to 'cmake/FindVAAPI.cmake')
-rw-r--r-- | cmake/FindVAAPI.cmake | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/cmake/FindVAAPI.cmake b/cmake/FindVAAPI.cmake new file mode 100644 index 000000000..b1170dc8e --- /dev/null +++ b/cmake/FindVAAPI.cmake @@ -0,0 +1,92 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + + +find_package(PkgConfig QUIET) + +function(qt_internal_multimedia_set_va_outputs component include_dir lib_path) + if ("${component}" STREQUAL "VA") + set(VAAPI_INCLUDE_DIR "${include_dir}" CACHE INTERNAL "") + get_filename_component(lib_realpath "${lib_path}" REALPATH) + + string(REGEX MATCH "[0-9]+(\\.[0-9]+)*$" VAAPI_SUFFIX "${lib_realpath}") + set(VAAPI_SUFFIX "${VAAPI_SUFFIX}" CACHE INTERNAL "") + + mark_as_advanced(VAAPI_SUFFIX VAAPI_INCLUDE_DIR) + endif() +endfunction() + +function(find_component component prefix header library) + if(NOT TARGET VAAPI::${component}) + string(TOUPPER ${component} upper) + pkg_search_module(PC_VAAPI_${upper} ${prefix} IMPORTED_TARGET) + if(TARGET PkgConfig::PC_VAAPI_${upper}) + add_library(VAAPI::${component} INTERFACE IMPORTED) + target_link_libraries(VAAPI::${component} INTERFACE PkgConfig::PC_VAAPI_${upper}) + + if (NOT PC_VAAPI_${upper}_LINK_LIBRARIES) + get_target_property(PC_VAAPI_${upper}_LINK_LIBRARIES PkgConfig::PC_VAAPI_${upper} INTERFACE_LINK_LIBRARIES) + message(STATUS "PC_VAAPI_${upper}_LINK_LIBRARIES is not defined by PkgConfig; " + "Get the value from target properties: ${PC_VAAPI_${upper}_LINK_LIBRARIES}") + endif() + + foreach (lib_path ${PC_VAAPI_${upper}_LINK_LIBRARIES}) + get_filename_component(lib_name "${lib_path}" NAME_WLE) + if (${lib_name} STREQUAL ${prefix}) + qt_internal_multimedia_set_va_outputs(${component} + "${PC_VAAPI_${upper}_INCLUDEDIR}" "${lib_path}") + break() + endif() + endforeach() + else() + find_path(VAAPI_${component}_INCLUDE_DIR + NAMES ${header} + PATH_SUFFIXES VAAPI-1.0 + ) + find_library(VAAPI_${component}_LIBRARY + NAMES ${library} + ) + if(VAAPI_${component}_LIBRARY AND VAAPI_${component}_INCLUDE_DIR) + add_library(VAAPI::${component} INTERFACE IMPORTED) + target_include_directories(VAAPI::${component} INTERFACE ${VAAPI_${component}_INCLUDE_DIR}) + target_link_libraries(VAAPI::${component} INTERFACE ${VAAPI_${component}_LIBRARY}) + endif() + mark_as_advanced(VAAPI_${component}_INCLUDE_DIR VAAPI_${component}_LIBRARY) + + qt_internal_multimedia_set_va_outputs(${component} + "${VAAPI_${component}_INCLUDE_DIR}" "${VAAPI_${component}_LIBRARY}") + endif() + endif() + + if(TARGET VAAPI::${component}) + set(VAAPI_${component}_FOUND TRUE PARENT_SCOPE) + endif() +endfunction() + +find_component(VA libva va/va.h libva) +find_component(DRM libva-drm va/va-drm.h libva-drm) + +if(TARGET VAAPI::VA) + target_link_libraries(VAAPI::VA) +endif() +if(TARGET VAAPI::VA AND TARGET VAAPI::DRM) + target_link_libraries(VAAPI::DRM INTERFACE VAAPI::VA) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(VAAPI + REQUIRED_VARS + VAAPI_VA_FOUND + VAAPI_DRM_FOUND + VAAPI_INCLUDE_DIR + VAAPI_SUFFIX + HANDLE_COMPONENTS +) + +if(VAAPI_FOUND AND NOT TARGET VAAPI::VAAPI) + add_library(VAAPI::VAAPI INTERFACE IMPORTED) + target_link_libraries(VAAPI::VAAPI INTERFACE + VAAPI::VA + VAAPI::DRM + ) +endif() |