summaryrefslogtreecommitdiffstats
path: root/cmake/FindGStreamer.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/FindGStreamer.cmake')
-rw-r--r--cmake/FindGStreamer.cmake154
1 files changed, 154 insertions, 0 deletions
diff --git a/cmake/FindGStreamer.cmake b/cmake/FindGStreamer.cmake
new file mode 100644
index 000000000..b8891e7ed
--- /dev/null
+++ b/cmake/FindGStreamer.cmake
@@ -0,0 +1,154 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# FindGStreamer
+# ---------
+#
+# Locate the gstreamer-1.0 library and some of its plugins.
+# Defines the following imported target:
+#
+# ``GStreamer::GStreamer``
+# If the gstreamer-1.0 library is available and target GStreamer::Base,
+# GStreamer::Audio, GStreamer::Video, GStreamer::Pbutils and
+# GStreamer::Allocators exist
+#
+# If target GStreamer::GStreamer exists, the following targets may be defined:
+#
+# ``GStreamer::App``
+# If the gstapp-1.0 library is available and target GStreamer::GStreamer exists
+# ``GStreamer::Photography``
+# If the gstphotography-1.0 library is available and target GStreamer::GStreamer exists
+# ``GStreamer::Gl``
+# If the gstgl-1.0 library is available and target GStreamer::GStreamer exists
+#
+
+include(CMakeFindDependencyMacro)
+find_dependency(GObject)
+
+find_package(PkgConfig QUIET)
+function(find_gstreamer_component component prefix header library)
+ if(NOT TARGET GStreamer::${component})
+ string(TOUPPER ${component} upper)
+ pkg_check_modules(PC_GSTREAMER_${upper} ${prefix} IMPORTED_TARGET)
+ if(TARGET PkgConfig::PC_GSTREAMER_${upper})
+ add_library(GStreamer::${component} INTERFACE IMPORTED)
+ target_link_libraries(GStreamer::${component} INTERFACE PkgConfig::PC_GSTREAMER_${upper})
+ else()
+ find_path(GStreamer_${component}_INCLUDE_DIR
+ NAMES ${header}
+ PATH_SUFFIXES gstreamer-1.0
+ )
+ find_library(GStreamer_${component}_LIBRARY
+ NAMES ${library}
+ )
+ if(${component} STREQUAL "Gl")
+ # search the gstglconfig.h include dir under the same root where the library is found
+ get_filename_component(gstglLibDir "${GStreamer_Gl_LIBRARY}" PATH)
+ find_path(GStreamer_GlConfig_INCLUDE_DIR
+ NAMES gst/gl/gstglconfig.h
+ PATH_SUFFIXES gstreamer-1.0/include
+ HINTS ${PC_GSTREAMER_GL_INCLUDE_DIRS} ${PC_GSTREAMER_GL_INCLUDEDIR} "${gstglLibDir}"
+ )
+ if(GStreamer_GlConfig_INCLUDE_DIR)
+ list(APPEND GStreamer_Gl_INCLUDE_DIR "${GStreamer_GlConfig_INCLUDE_DIR}")
+ list(REMOVE_DUPLICATES GStreamer_Gl_INCLUDE_DIR)
+ endif()
+ endif()
+ if(GStreamer_${component}_LIBRARY AND GStreamer_${component}_INCLUDE_DIR)
+ add_library(GStreamer::${component} INTERFACE IMPORTED)
+ target_include_directories(GStreamer::${component} INTERFACE ${GStreamer_${component}_INCLUDE_DIR})
+ target_link_libraries(GStreamer::${component} INTERFACE ${GStreamer_${component}_LIBRARY})
+ endif()
+ mark_as_advanced(GStreamer_${component}_INCLUDE_DIR GStreamer_${component}_LIBRARY)
+ endif()
+ endif()
+
+ if(TARGET GStreamer::${component})
+ set(GStreamer_${component}_FOUND TRUE PARENT_SCOPE)
+ endif()
+endfunction()
+
+# GStreamer required dependencies
+find_gstreamer_component(Core gstreamer-1.0 gst/gst.h gstreamer-1.0)
+find_gstreamer_component(Base gstreamer-base-1.0 gst/gst.h gstbase-1.0)
+find_gstreamer_component(Audio gstreamer-audio-1.0 gst/audio/audio.h gstaudio-1.0)
+find_gstreamer_component(Video gstreamer-video-1.0 gst/video/video.h gstvideo-1.0)
+find_gstreamer_component(Pbutils gstreamer-pbutils-1.0 gst/pbutils/pbutils.h gstpbutils-1.0)
+find_gstreamer_component(Allocators gstreamer-allocators-1.0 gst/allocators/allocators.h gstallocators-1.0)
+
+if(TARGET GStreamer::Core)
+ target_link_libraries(GStreamer::Core INTERFACE GObject::GObject)
+endif()
+if(TARGET GStreamer::Base AND TARGET GStreamer::Core)
+ target_link_libraries(GStreamer::Base INTERFACE GStreamer::Core)
+endif()
+if(TARGET GStreamer::Audio AND TARGET GStreamer::Base)
+ target_link_libraries(GStreamer::Audio INTERFACE GStreamer::Base)
+endif()
+if(TARGET GStreamer::Video AND TARGET GStreamer::Base)
+ target_link_libraries(GStreamer::Video INTERFACE GStreamer::Base)
+endif()
+if(TARGET GStreamer::Pbutils AND TARGET GStreamer::Audio AND TARGET GStreamer::Video)
+ target_link_libraries(GStreamer::Pbutils INTERFACE GStreamer::Audio GStreamer::Video)
+endif()
+if(TARGET GStreamer::Allocators AND TARGET GStreamer::Core)
+ target_link_libraries(GStreamer::Allocators INTERFACE GStreamer::Core)
+endif()
+
+# GStreamer optional components
+foreach(component ${GStreamer_FIND_COMPONENTS})
+ if(${component} STREQUAL "App")
+ find_gstreamer_component(App gstreamer-app-1.0 gst/app/gstappsink.h gstapp-1.0)
+ if(TARGET GStreamer::App AND TARGET GStreamer::Base)
+ target_link_libraries(GStreamer::App INTERFACE GStreamer::Base)
+ endif()
+ elseif(${component} STREQUAL "Photography")
+ find_gstreamer_component(Photography gstreamer-photography-1.0 gst/interfaces/photography.h gstphotography-1.0)
+ if(TARGET GStreamer::Photography AND TARGET GStreamer::Core)
+ target_link_libraries(GStreamer::Photography INTERFACE GStreamer::Core)
+ endif()
+ elseif(${component} STREQUAL "Gl")
+ find_gstreamer_component(Gl gstreamer-gl-1.0 gst/gl/gl.h gstgl-1.0)
+ if(TARGET GStreamer::Gl AND TARGET GStreamer::Video AND TARGET GStreamer::Allocators)
+ target_link_libraries(GStreamer::Gl INTERFACE GStreamer::Video GStreamer::Allocators)
+ endif()
+ else()
+ message(WARNING "FindGStreamer.cmake: Invalid Gstreamer component \"${component}\" requested")
+ endif()
+endforeach()
+
+# Create target GStreamer::GStreamer
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(GStreamer
+ REQUIRED_VARS
+ GStreamer_Core_FOUND
+ GStreamer_Base_FOUND
+ GStreamer_Audio_FOUND
+ GStreamer_Video_FOUND
+ GStreamer_Pbutils_FOUND
+ GStreamer_Allocators_FOUND
+ HANDLE_COMPONENTS
+)
+
+if(GStreamer_FOUND AND NOT TARGET GStreamer::GStreamer)
+ add_library(GStreamer::GStreamer INTERFACE IMPORTED)
+ target_link_libraries(GStreamer::GStreamer INTERFACE
+ GStreamer::Core
+ GStreamer::Base
+ GStreamer::Audio
+ GStreamer::Video
+ GStreamer::Pbutils
+ GStreamer::Allocators
+ )
+endif()
+
+if(TARGET PkgConfig::PC_GSTREAMER_GL)
+ get_target_property(_qt_incs PkgConfig::PC_GSTREAMER_GL INTERFACE_INCLUDE_DIRECTORIES)
+ set(__qt_fixed_incs)
+ foreach(path IN LISTS _qt_incs)
+ if(IS_DIRECTORY "${path}")
+ list(APPEND __qt_fixed_incs "${path}")
+ endif()
+ endforeach()
+ set_property(TARGET PkgConfig::PC_GSTREAMER_GL PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${__qt_fixed_incs}")
+endif()