Skip to content

Commit

Permalink
CMake: GStreamer Fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
HTRamsey committed Feb 12, 2025
1 parent 7f406f1 commit 27c1e08
Show file tree
Hide file tree
Showing 10 changed files with 87 additions and 105 deletions.
1 change: 0 additions & 1 deletion .github/workflows/android-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ jobs:
ARTIFACT: QGroundControl.apk
PACKAGE: QGroundControl
QT_VERSION: 6.8.2
GST_VERSION: 1.22.12
QT_ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/deploy/android/android_release.keystore
QT_ANDROID_KEYSTORE_ALIAS: QGCAndroidKeyStore
QT_ANDROID_KEYSTORE_STORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/android-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ jobs:
ARTIFACT: QGroundControl.apk
PACKAGE: QGroundControl
QT_VERSION: 6.8.2
GST_VERSION: 1.22.12
QT_ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/deploy/android/android_release.keystore
QT_ANDROID_KEYSTORE_ALIAS: QGCAndroidKeyStore
QT_ANDROID_KEYSTORE_STORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/android-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ jobs:
ARTIFACT: QGroundControl.apk
PACKAGE: QGroundControl
QT_VERSION: 6.8.2
GST_VERSION: 1.22.12
QT_ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/deploy/android/android_release.keystore
QT_ANDROID_KEYSTORE_ALIAS: QGCAndroidKeyStore
QT_ANDROID_KEYSTORE_STORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/custom.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
env:
ARTIFACT: QGroundControl-installer.exe
QT_VERSION: 6.8.2
GST_VERSION: 1.22.12
GST_VERSION: 1.24.12

steps:
- name: Checkout repo
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ jobs:
ARTIFACT: QGroundControl.app
PACKAGE: QGroundControl
QT_VERSION: 6.8.2
GST_VERSION: 1.22.12

steps:
- name: Checkout repo
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ jobs:
ARTIFACT: QGroundControl-x86_64.AppImage
PACKAGE: QGroundControl-x86_64
QT_VERSION: 6.8.2
GST_VERSION: 1.22.12

steps:
- name: Checkout repo
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
ARTIFACT: QGroundControl-installer.exe
PACKAGE: QGroundControl-installer
QT_VERSION: 6.8.2
GST_VERSION: 1.22.12
GST_VERSION: 1.24.12

steps:
- name: Checkout repo
Expand Down
138 changes: 69 additions & 69 deletions cmake/find-modules/FindGStreamer.cmake
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
if(ANDROID OR IOS)
if(DEFINED ENV{GST_VERSION})
set(QGC_GST_TARGET_VERSION $ENV{GST_VERSION} CACHE STRING "Environment Provided GStreamer Version")
else()
set(QGC_GST_TARGET_VERSION 1.22.12 CACHE STRING "Requested GStreamer Version")
endif()
endif()

if(ANDROID OR IOS)
set(QGC_GST_TARGET_VERSION 1.24.12)
set(QGC_GST_STATIC_BUILD ON)
endif()

set(PKG_CONFIG_ARGN)
if(QGC_GST_STATIC_BUILD)
list(APPEND PKG_CONFIG_ARGN --static)
list(APPEND PKG_CONFIG_ARGN "--static")
endif()

################################################################################
Expand All @@ -26,11 +20,14 @@ if(WIN32)
else()
set(GSTREAMER_PREFIX "C:/gstreamer/1.0/msvc_x86_64")
endif()
set(ENV{PKG_CONFIG} ${GSTREAMER_PREFIX}/bin)
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_PREFIX}/lib/pkgconfig;${GSTREAMER_PREFIX}/lib/gstreamer-1.0/pkgconfig;$ENV{PKG_CONFIG_PATH}")
set(GSTREAMER_LIB_PATH "${GSTREAMER_PREFIX}/lib")
set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")
set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_PREFIX}/include")
set(ENV{PKG_CONFIG} "${GSTREAMER_PREFIX}/bin")
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig;${GSTREAMER_PLUGIN_PATH}/pkgconfig;$ENV{PKG_CONFIG_PATH}")
cmake_path(CONVERT "${GSTREAMER_PREFIX}" TO_CMAKE_PATH_LIST PREFIX_PATH NORMALIZE)
cmake_path(CONVERT "${GSTREAMER_PREFIX}/lib" TO_CMAKE_PATH_LIST LIBDIR_PATH NORMALIZE)
cmake_path(CONVERT "${GSTREAMER_PREFIX}/include" TO_CMAKE_PATH_LIST INCLUDE_PATH NORMALIZE)
cmake_path(CONVERT "${GSTREAMER_LIB_PATH}" TO_CMAKE_PATH_LIST LIBDIR_PATH NORMALIZE)
cmake_path(CONVERT "${GSTREAMER_INCLUDE_PATH}" TO_CMAKE_PATH_LIST INCLUDE_PATH NORMALIZE)
list(APPEND PKG_CONFIG_ARGN
--dont-define-prefix
--define-variable=prefix=${PREFIX_PATH}
Expand All @@ -41,97 +38,98 @@ elseif(MACOS)
list(APPEND CMAKE_FRAMEWORK_PATH "/Library/Frameworks")
set(GSTREAMER_FRAMEWORK_PATH "/Library/Frameworks/GStreamer.framework" CACHE PATH "GStreamer Framework Path")
set(GSTREAMER_PREFIX "${GSTREAMER_FRAMEWORK_PATH}/Versions/1.0")
set(GSTREAMER_LIB_PATH "${GSTREAMER_PREFIX}/lib")
set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")
set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_FRAMEWORK_PATH}/Headers")
set(ENV{PKG_CONFIG} "${GSTREAMER_PREFIX}/bin")
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_PREFIX}/lib/pkgconfig:${GSTREAMER_PREFIX}/lib/gstreamer-1.0/pkgconfig:$ENV{PKG_CONFIG_PATH}")
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig:${GSTREAMER_PLUGIN_PATH}/pkgconfig:$ENV{PKG_CONFIG_PATH}")
elseif(LINUX)
set(GSTREAMER_PREFIX "/usr")
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_PREFIX}/lib/x86_64-linux-gnu/pkgconfig:${GSTREAMER_PREFIX}/lib/x86_64-linux-gnu/gstreamer-1.0/pkgconfig:$ENV{PKG_CONFIG_PATH}")
if(EXISTS "${GSTREAMER_PREFIX}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu")
set(GSTREAMER_LIB_PATH "${GSTREAMER_PREFIX}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu")
else()
set(GSTREAMER_LIB_PATH "${GSTREAMER_PREFIX}/lib")
endif()
set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")
set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_PREFIX}/include")
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig:$ENV{PKG_CONFIG_PATH}")
elseif(IOS)
list(APPEND CMAKE_FRAMEWORK_PATH "~/Library/Developer/GStreamer/iPhone.sdk")
if(DEFINED ENV{GSTREAMER_PREFIX_IOS} AND EXISTS $ENV{GSTREAMER_PREFIX_IOS})
set(GSTREAMER_PREFIX_IOS $ENV{GSTREAMER_PREFIX_IOS})
elseif(EXISTS "~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework")
set(GSTREAMER_PREFIX_IOS "~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework")
set(GSTREAMER_FRAMEWORK_PATH "~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework")
if(EXISTS "${GSTREAMER_FRAMEWORK_PATH}")
set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_FRAMEWORK_PATH}/Headers")
else()
FetchContent_Declare(gstreamer
DOWNLOAD_EXTRACT_TIMESTAMP true
include(CPM)
CPMAddPackage(
NAME gstreamer
VERSION ${QGC_GST_TARGET_VERSION}
URL "https://gstreamer.freedesktop.org/data/pkg/ios/${QGC_GST_TARGET_VERSION}/gstreamer-1.0-devel-${QGC_GST_TARGET_VERSION}-ios-universal.pkg"
)
FetchContent_MakeAvailable(gstreamer)
set(GSTREAMER_PREFIX_IOS ${gstreamer_SOURCE_DIR})
set(GSTREAMER_PREFIX ${gstreamer_SOURCE_DIR})
set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_PREFIX}/include")
endif()
set(GSTREAMER_PREFIX ${GSTREAMER_PREFIX_IOS})
elseif(ANDROID)
set(GSTREAMER_ARCHIVE "gstreamer-1.0-android-universal-${QGC_GST_TARGET_VERSION}.tar.xz")
include(CPM)
CPMAddPackage(
NAME gstreamer
VERSION ${QGC_GST_TARGET_VERSION}
URL "https://gstreamer.freedesktop.org/data/pkg/android/${QGC_GST_TARGET_VERSION}/${GSTREAMER_ARCHIVE}"
)
set(GSTREAMER_PREFIX_ANDROID "${gstreamer_SOURCE_DIR}")

if(${CMAKE_ANDROID_ARCH_ABI} STREQUAL armeabi-v7a)
set(GSTREAMER_PREFIX ${GSTREAMER_PREFIX_ANDROID}/armv7)
set(GSTREAMER_PREFIX "${GSTREAMER_PREFIX_ANDROID}/armv7")
elseif(${CMAKE_ANDROID_ARCH_ABI} STREQUAL arm64-v8a)
set(GSTREAMER_PREFIX ${GSTREAMER_PREFIX_ANDROID}/arm64)
set(GSTREAMER_PREFIX "${GSTREAMER_PREFIX_ANDROID}/arm64")
elseif(${CMAKE_ANDROID_ARCH_ABI} STREQUAL x86)
set(GSTREAMER_PREFIX ${GSTREAMER_PREFIX_ANDROID}/x86)
set(GSTREAMER_PREFIX "${GSTREAMER_PREFIX_ANDROID}/x86")
elseif(${CMAKE_ANDROID_ARCH_ABI} STREQUAL x86_64)
set(GSTREAMER_PREFIX ${GSTREAMER_PREFIX_ANDROID}/x86_64)
set(GSTREAMER_PREFIX "${GSTREAMER_PREFIX_ANDROID}/x86_64")
endif()
set(GSTREAMER_LIB_PATH "${GSTREAMER_PREFIX}/lib")
set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")
set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_PREFIX}/include")

set(ENV{PKG_CONFIG_PATH} "")
set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH OFF)
set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH ON)
if(CMAKE_HOST_WIN32)
set(ENV{PKG_CONFIG} "${GSTREAMER_PREFIX}/share/gst-android/ndk-build/tools/windows")
set(ENV{PKG_CONFIG_LIBDIR} "${GSTREAMER_PREFIX}/lib/pkgconfig;${GSTREAMER_PREFIX}/lib/gstreamer-1.0/pkgconfig")
set(PKG_CONFIG_EXECUTABLE "$ENV{PKG_CONFIG}/pkg-config.exe")
elseif(CMAKE_HOST_LINUX OR CMAKE_HOST_APPLE)
set(ENV{PKG_CONFIG_LIBDIR} "${GSTREAMER_PREFIX}/lib/pkgconfig:${GSTREAMER_PREFIX}/lib/gstreamer-1.0/pkgconfig")
endif()
set(ENV{PKG_CONFIG_LIBDIR} "${GSTREAMER_LIB_PATH}/pkgconfig;${GSTREAMER_PLUGIN_PATH}/pkgconfig")

list(APPEND PKG_CONFIG_ARGN
--dont-define-prefix
--define-variable=prefix=${GSTREAMER_PREFIX}
--define-variable=libdir=${GSTREAMER_PREFIX}/lib
--define-variable=includedir=${GSTREAMER_PREFIX}/include
--define-variable=libdir=${GSTREAMER_LIB_PATH}
--define-variable=includedir=${GSTREAMER_INCLUDE_PATH}
)
endif()
list(PREPEND CMAKE_PREFIX_PATH ${GSTREAMER_PREFIX})
cmake_print_variables(GSTREAMER_PREFIX)

# TODO: find_path, Change x86_64-linux-gnu based on host
if(LINUX)
set(GSTREAMER_LIB_PATH ${GSTREAMER_PREFIX}/lib/x86_64-linux-gnu)
elseif(MACOS OR ANDROID OR WIN32)
set(GSTREAMER_LIB_PATH ${GSTREAMER_PREFIX}/lib)
elseif(IOS)

endif()
set(GSTREAMER_PLUGIN_PATH ${GSTREAMER_LIB_PATH}/gstreamer-1.0)
cmake_print_variables(GSTREAMER_LIB_PATH)
list(PREPEND CMAKE_PREFIX_PATH ${GSTREAMER_PREFIX})
cmake_print_variables(GSTREAMER_PREFIX GSTREAMER_LIB_PATH GSTREAMER_PLUGIN_PATH)

################################################################################

message(STATUS "PKG_CONFIG $ENV{PKG_CONFIG}")
message(STATUS "PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH}")
message(STATUS "PKG_CONFIG_LIBDIR $ENV{PKG_CONFIG_LIBDIR}")
find_dependency(PkgConfig)

cmake_print_variables(PKG_CONFIG_EXECUTABLE PKG_CONFIG_ARGN)

include(CMakeFindDependencyMacro)
find_dependency(GObject)

set(GStreamer_VERSION ${QGC_GST_TARGET_VERSION})
pkg_check_modules(GStreamer gstreamer-1.0)
cmake_print_variables(GStreamer_VERSION)

# Use Latest Revisions for each minor version: 1.16.3, 1.18.6, 1.20.7, 1.22.12, 1.24.8
# Use Latest Revisions for each minor version: 1.16.3, 1.18.6, 1.20.7, 1.22.12, 1.24.12
string(REPLACE "." ";" GST_VERSION_LIST ${GStreamer_VERSION})
list(GET GST_VERSION_LIST 0 GST_VERSION_MAJOR)
list(GET GST_VERSION_LIST 1 GST_VERSION_MINOR)
list(GET GST_VERSION_LIST 2 GST_VERSION_PATCH)
cmake_print_variables(GST_VERSION_MAJOR GST_VERSION_MINOR GST_VERSION_PATCH)

if(GST_VERSION_MINOR EQUAL 16)
set(GST_VERSION_PATCH 3)
Expand All @@ -142,7 +140,7 @@ elseif(GST_VERSION_MINOR EQUAL 20)
elseif(GST_VERSION_MINOR EQUAL 22)
set(GST_VERSION_PATCH 12)
elseif(GST_VERSION_MINOR EQUAL 24)
set(GST_VERSION_PATCH 8)
set(GST_VERSION_PATCH 12)
endif()

set(GST_PLUGINS_VERSION ${GST_VERSION_MAJOR}.${GST_VERSION_MINOR}.${GST_VERSION_PATCH})
Expand Down Expand Up @@ -252,6 +250,10 @@ if(Play IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(Play gstreamer-play-1.0)
endif()

if(Player IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(Player gstreamer-player-1.0)
endif()

if(PluginsBad IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(PluginsBad gstreamer-plugins-bad-1.0)
endif()
Expand All @@ -272,14 +274,14 @@ if(Rtp IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(Rtp gstreamer-rtp-1.0)
endif()

if(Sdp IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(Sdp gstreamer-sdp-1.0)
endif()

if(Rtsp IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(Rtsp gstreamer-rtsp-1.0)
endif()

if(Sdp IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(Sdp gstreamer-sdp-1.0)
endif()

if(Tag IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(Tag gstreamer-tag-1.0)
endif()
Expand All @@ -293,11 +295,7 @@ endif()
# Create target GStreamer::GStreamer
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GStreamer
REQUIRED_VARS
GStreamer_Core_FOUND
GStreamer_Base_FOUND
GStreamer_Video_FOUND
GStreamer_Gl_FOUND
VERSION_VAR GStreamer_VERSION
HANDLE_COMPONENTS
)

Expand Down Expand Up @@ -327,25 +325,29 @@ target_include_directories(GStreamer::GStreamer
INTERFACE
${GSTREAMER_PREFIX}/include
${GSTREAMER_PREFIX}/include/glib-2.0
# ${GSTREAMER_PREFIX}/include/graphene-1.0
${GSTREAMER_PREFIX}/include/gstreamer-1.0
${GSTREAMER_LIB_PATH}/glib-2.0/include
# ${GSTREAMER_LIB_PATH}/graphene-1.0/include
${GSTREAMER_LIB_PATH}/gstreamer-1.0/include
${GSTREAMER_PLUGIN_PATH}/include
)

target_link_directories(GStreamer::GStreamer INTERFACE ${GSTREAMER_LIB_PATH} ${GSTREAMER_PLUGIN_PATH})

if(MACOS AND EXISTS ${GSTREAMER_FRAMEWORK_PATH})
target_link_libraries(GStreamer::GStreamer INTERFACE "-F /Library/Frameworks -framework GStreamer")
if(EXISTS ${GSTREAMER_FRAMEWORK_PATH})
if(MACOS)
target_link_libraries(GStreamer::GStreamer INTERFACE "-F /Library/Frameworks -framework GStreamer")
elseif(IOS)
target_link_libraries(GStreamer::GStreamer INTERFACE "-F ~/Library/Developer/GStreamer/iPhone.sdk -framework GStreamer -framework AVFoundation -framework CoreMedia -framework CoreVideo -framework VideoToolbox -liconv -lresolv")
endif()
target_include_directories(GStreamer::GStreamer INTERFACE "${GSTREAMER_INCLUDE_PATH}/Headers")
return()
endif()

target_link_directories(GStreamer::GStreamer INTERFACE ${GSTREAMER_LIB_PATH} ${GSTREAMER_PLUGIN_PATH})

################################################################################

# TODO: https://gstreamer.freedesktop.org/documentation/qt6d3d11/index.html#qml6d3d11sink-page

add_library(GStreamer::Plugins INTERFACE IMPORTED)
target_link_directories(GStreamer::Plugins INTERFACE ${GSTREAMER_LIB_PATH} ${GSTREAMER_PLUGIN_PATH})

set(GST_PLUGINS
gstcoreelements
Expand Down Expand Up @@ -396,9 +398,7 @@ foreach(plugin IN LISTS GST_PLUGINS)
endif()
endforeach()

if(NOT MACOS)
target_link_libraries(GStreamer::GStreamer INTERFACE GStreamer::Plugins)
endif()
target_link_libraries(GStreamer::GStreamer INTERFACE GStreamer::Plugins)

################################################################################

Expand Down
6 changes: 3 additions & 3 deletions src/VideoManager/VideoReceiver/GStreamer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ endif()

target_link_libraries(GStreamerReceiver
PRIVATE
Utilities
PUBLIC
Qt6::Core
gstqml6gl
Settings
Utilities
VideoReceiver
PUBLIC
Qt6::Core
)

target_compile_definitions(GStreamerReceiver PUBLIC QGC_GST_STREAMING)
Loading

0 comments on commit 27c1e08

Please sign in to comment.