Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gstreamer: Support Conan V2 #13400

Merged
merged 34 commits into from
May 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
ee1a122
gstreamer: Support Conan V2
jwillikers Oct 10, 2022
afbfb61
Fix licenses installation
jwillikers Oct 13, 2022
642883f
Check for pkgconf conf setting
jwillikers Oct 20, 2022
67188ab
Fix Apple shared install name
jwillikers Oct 20, 2022
d584aed
Fix Python F-string
jwillikers Oct 25, 2022
e23e83b
Organize versions in descending order
jwillikers Oct 25, 2022
c7e5951
Update dependencies and use rm_safe
jwillikers Dec 3, 2022
1c80bbe
Fix license
jwillikers Dec 3, 2022
bc7a730
Don't use fix_apple_shared_install_name
jwillikers Dec 28, 2022
b87853b
Bump glib to 2.75.1
jwillikers Jan 6, 2023
b3b58b3
Place MesonToolchain last in generate method
jwillikers Jan 7, 2023
4a30e1e
Add glib as a tool_requires for the glib-mkenums tool
jwillikers Jan 7, 2023
648a40a
Bump Meson and glib versions
jwillikers Jan 9, 2023
751943e
Remove package_id method
jwillikers Jan 20, 2023
950098f
Update other glib version
jwillikers Jan 20, 2023
9fc624d
Remove package_id method?
jwillikers Jan 20, 2023
30e06f2
Update test v1 package
jwillikers Jan 30, 2023
8f1a43d
Add package type
jwillikers Mar 22, 2023
f03e094
Update glib to 2.76.0
jwillikers Mar 22, 2023
3c32e91
Bump glib to version 2.76.1
jwillikers Mar 29, 2023
733b1af
Bump CMake version
jwillikers May 5, 2023
320c233
Bump glib
jwillikers May 5, 2023
82ba75b
Change CMake project name of test v1 package
jwillikers May 5, 2023
1541e9b
Fix package name
jwillikers May 6, 2023
67120a1
gstreamer: add timeout when calling test_package and add GST_DEBUG to…
jcar87 May 16, 2023
722bfea
gstreamer test package: generate virtualrunenv
jcar87 May 16, 2023
dba4014
gstreamer: undo debugging and fix conan2
jcar87 May 16, 2023
8d82798
gstreamer: fix removal of pdb files on Windows/msvc
jcar87 May 17, 2023
9160b97
Update recipes/gstreamer/all/conanfile.py
jcar87 May 17, 2023
7f16f82
Update recipes/gstreamer/all/conanfile.py
jcar87 May 17, 2023
0fd0c3e
Update recipes/gstreamer/all/conanfile.py
jcar87 May 19, 2023
5119f86
gstreamer test_package: add GST_DEBUG env var
jcar87 May 19, 2023
4a8f1b4
gstreamer: use newer runenv info
jcar87 May 19, 2023
c8d8ee3
transitive_libs might be needed after all
AbrilRBS May 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions recipes/gstreamer/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
sources:
"1.16.2":
sha256: "dac037ab84d557f5d4e6e66e833f6bf8cf4f84671a311e0b2df99f9b30a9d693"
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.16.2/gstreamer-1.16.2.tar.bz2"
"1.18.0":
sha256: "f072da67b6dad9b4aecf2cb594aaaa66f86c22af9ba80503b90f957d47015ef8"
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.18.0/gstreamer-1.18.0.tar.bz2"
"1.18.3":
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.18.3/gstreamer-1.18.3.tar.gz"
sha256: "d7e3917b5d3d9c3bd9bb70b7500314a5725377cff39bcd818df13c1fda0f60ba"
"1.18.4":
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.18.4/gstreamer-1.18.4.tar.gz"
sha256: "f0956c2056281f5909d030945a9896810e55084f29b6bcfc401b53e91ddf1c7f"
"1.19.1":
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.19.1/gstreamer-1.19.1.tar.gz"
sha256: "2e51f61e59564e48883b5f1996871b0d1c404406aadb9aa1b306de8a2a331a90"
"1.19.2":
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.19.2/gstreamer-1.19.2.tar.gz"
sha256: "6ec8494867d9b58f145c0c357da631faf21c2c72c7cd8b637b440188fe904ab8"
"1.19.1":
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.19.1/gstreamer-1.19.1.tar.gz"
sha256: "2e51f61e59564e48883b5f1996871b0d1c404406aadb9aa1b306de8a2a331a90"
"1.18.4":
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.18.4/gstreamer-1.18.4.tar.gz"
sha256: "f0956c2056281f5909d030945a9896810e55084f29b6bcfc401b53e91ddf1c7f"
"1.18.3":
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.18.3/gstreamer-1.18.3.tar.gz"
sha256: "d7e3917b5d3d9c3bd9bb70b7500314a5725377cff39bcd818df13c1fda0f60ba"
"1.18.0":
sha256: "f072da67b6dad9b4aecf2cb594aaaa66f86c22af9ba80503b90f957d47015ef8"
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.18.0/gstreamer-1.18.0.tar.bz2"
"1.16.2":
sha256: "dac037ab84d557f5d4e6e66e833f6bf8cf4f84671a311e0b2df99f9b30a9d693"
url: "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.16.2/gstreamer-1.16.2.tar.bz2"
183 changes: 93 additions & 90 deletions recipes/gstreamer/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
from conans import ConanFile, tools, Meson, VisualStudioBuildEnvironment
from conans.errors import ConanInvalidConfiguration
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.env import VirtualBuildEnv
from conan.tools.files import chdir, copy, get, rename, rm, rmdir
from conan.tools.gnu import PkgConfigDeps
from conan.tools.layout import basic_layout
from conan.tools.meson import Meson, MesonToolchain
from conan.tools.microsoft import is_msvc, check_min_vs
from conan.tools.scm import Version

import glob
import os
import shutil

required_conan_version = ">=1.29"
required_conan_version = ">=1.53.0"

class GStreamerConan(ConanFile):
name = "gstreamer"
description = "GStreamer is a development framework for creating applications like media players, video editors, streaming media broadcasters and so on"
topics = ("conan", "gstreamer", "multimedia", "video", "audio", "broadcasting", "framework", "media")
topics = ("multimedia", "video", "audio", "broadcasting", "framework", "media")
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://gstreamer.freedesktop.org/"
license = "GPL-2.0-only"
license = "LGPL-2.0-or-later"
package_type = "library"
settings = "os", "arch", "compiler", "build_type"
options = {
"shared": [True, False],
Expand All @@ -24,121 +32,105 @@ class GStreamerConan(ConanFile):
"fPIC": True,
"with_introspection": False,
}
generators = "pkg_config"
_meson = None

@property
def _source_subfolder(self):
return "source_subfolder"

@property
def _build_subfolder(self):
return "build_subfolder"

def requirements(self):
self.requires("glib/2.72.0")

@property
def _is_msvc(self):
return self.settings.compiler == "Visual Studio"
def config_options(self):
if self.settings.os == 'Windows':
del self.options.fPIC

def configure(self):
if self.options.shared:
del self.options.fPIC
del self.settings.compiler.libcxx
del self.settings.compiler.cppstd
self.options.rm_safe("fPIC")
self.settings.rm_safe("compiler.libcxx")
self.settings.rm_safe("compiler.cppstd")

def config_options(self):
if self.settings.os == 'Windows':
del self.options.fPIC
def layout(self):
basic_layout(self, src_folder="src")

def requirements(self):
self.requires("glib/2.76.2", transitive_headers=True, transitive_libs=True)

def validate(self):
if not self.options["glib"].shared and self.options.shared:
if not self.dependencies.direct_host["glib"].options.shared and self.info.options.shared:
# https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/133
raise ConanInvalidConfiguration("shared GStreamer cannot link to static GLib")

def build_requirements(self):
self.build_requires("meson/0.61.2")
self.build_requires("pkgconf/1.7.4")
self.tool_requires("meson/1.1.0")
# There used to be an issue with glib being shared by default but its dependencies being static
# No longer the case, but see: https://github.com/conan-io/conan-center-index/pull/13400#issuecomment-1551565573 for context
self.tool_requires("glib/2.76.2")
jcar87 marked this conversation as resolved.
Show resolved Hide resolved
if not self.conf.get("tools.gnu:pkg_config", default=False, check_type=str):
self.tool_requires("pkgconf/1.9.3")
if self.options.with_introspection:
self.build_requires("gobject-introspection/1.70.0")
self.tool_requires("gobject-introspection/1.72.0")
if self.settings.os == 'Windows':
self.build_requires("winflexbison/2.5.24")
self.tool_requires("winflexbison/2.5.24")
else:
self.build_requires("bison/3.7.6")
self.build_requires("flex/2.6.4")
self.tool_requires("bison/3.8.2")
self.tool_requires("flex/2.6.4")

def source(self):
tools.get(**self.conan_data["sources"][self.version])
os.rename("%s-%s" % (self.name, self.version), self._source_subfolder)

def _configure_meson(self):
if self._meson:
return self._meson
meson = Meson(self)
if self._is_msvc:
if tools.Version(self.settings.compiler.version) < "14":
meson.options["c_args"] = " -Dsnprintf=_snprintf"
meson.options["cpp_args"] = " -Dsnprintf=_snprintf"
if self.settings.get_safe("compiler.runtime"):
meson.options["b_vscrt"] = str(self.settings.compiler.runtime).lower()
meson.options["tools"] = "disabled"
meson.options["examples"] = "disabled"
meson.options["benchmarks"] = "disabled"
meson.options["tests"] = "disabled"
meson.options["introspection"] = "enabled" if self.options.with_introspection else "disabled"
meson.configure(build_folder=self._build_subfolder,
source_folder=self._source_subfolder,
args=['--wrap-mode=nofallback'])
self._meson = meson
return self._meson
get(self, **self.conan_data["sources"][self.version], strip_root=True)

def generate(self):
virtual_build_env = VirtualBuildEnv(self)
virtual_build_env.generate()
pkg_config_deps = PkgConfigDeps(self)
pkg_config_deps.generate()
tc = MesonToolchain(self)
if is_msvc(self) and not check_min_vs(self, "190", raise_invalid=False):
tc.project_options["c_std"] = "c99"
tc.project_options["tools"] = "disabled"
tc.project_options["examples"] = "disabled"
tc.project_options["benchmarks"] = "disabled"
tc.project_options["tests"] = "disabled"
tc.project_options["introspection"] = "enabled" if self.options.with_introspection else "disabled"
tc.generate()

def build(self):
with tools.environment_append(VisualStudioBuildEnvironment(self).vars) if self._is_msvc else tools.no_op():
meson = self._configure_meson()
meson.build()
meson = Meson(self)
meson.configure()
meson.build()

def _fix_library_names(self, path):
# regression in 1.16
if self.settings.compiler == "Visual Studio":
with tools.chdir(path):
if is_msvc(self):
with chdir(self, path):
for filename_old in glob.glob("*.a"):
filename_new = filename_old[3:-2] + ".lib"
self.output.info("rename %s into %s" % (filename_old, filename_new))
shutil.move(filename_old, filename_new)
self.output.info(f"rename {filename_old} into {filename_new}")
rename(self, filename_old, filename_new)

def package(self):
self.copy(pattern="COPYING", dst="licenses", src=self._source_subfolder)
with tools.environment_append(VisualStudioBuildEnvironment(self).vars) if self._is_msvc else tools.no_op():
meson = self._configure_meson()
meson.install()
copy(self, "COPYING", self.source_folder, os.path.join(self.package_folder, "licenses"))
meson = Meson(self)
meson.install()

self._fix_library_names(os.path.join(self.package_folder, "lib"))
self._fix_library_names(os.path.join(self.package_folder, "lib", "gstreamer-1.0"))
tools.rmdir(os.path.join(self.package_folder, "lib", "pkgconfig"))
tools.rmdir(os.path.join(self.package_folder, "lib", "gstreamer-1.0", "pkgconfig"))
tools.rmdir(os.path.join(self.package_folder, "share"))
tools.remove_files_by_mask(self.package_folder, "*.pdb")

def package_id(self):
self.info.requires["glib"].full_package_mode()
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
rmdir(self, os.path.join(self.package_folder, "lib", "gstreamer-1.0", "pkgconfig"))
rmdir(self, os.path.join(self.package_folder, "share"))
rm(self, "*.pdb", self.package_folder, recursive=True)

def package_info(self):
gst_plugin_path = os.path.join(self.package_folder, "lib", "gstreamer-1.0")

pkgconfig_variables = {
"exec_prefix": "${prefix}",
"toolsdir": "${exec_prefix}/bin",
"pluginsdir": "${libdir}/gstreamer-1.0",
# PkgConfigDep uses libdir1 instead of libdir, so the path is spelled out explicitly here.
"pluginsdir": "${prefix}/lib/gstreamer-1.0",
"datarootdir": "${prefix}/share",
"datadir": "${datarootdir}",
"girdir": "${datadir}/gir-1.0",
"typelibdir": "${libdir}/girepository-1.0",
"typelibdir": "${prefix}/lib/girepository-1.0",
"libexecdir": "${prefix}/libexec",
"pluginscannerdir": "${libexecdir}/gstreamer-1.0",
}
pkgconfig_custom_content = "\n".join("{}={}".format(key, value) for key, value in pkgconfig_variables.items())

self.cpp_info.components["gstreamer-1.0"].set_property("pkg_config_name", "gstreamer-1.0")
self.cpp_info.components["gstreamer-1.0"].names["pkg_config"] = "gstreamer-1.0"
self.cpp_info.components["gstreamer-1.0"].requires = ["glib::glib-2.0", "glib::gobject-2.0"]
if not self.options.shared:
Expand All @@ -149,62 +141,73 @@ def package_info(self):
if self.settings.os == "Linux":
self.cpp_info.components["gstreamer-1.0"].system_libs = ["m"]
self.cpp_info.components["gstreamer-1.0"].set_property("pkg_config_custom_content", pkgconfig_custom_content)


self.cpp_info.components["gstreamer-base-1.0"].set_property("pkg_config_name", "gstreamer-base-1.0")
self.cpp_info.components["gstreamer-base-1.0"].names["pkg_config"] = "gstreamer-base-1.0"
self.cpp_info.components["gstreamer-base-1.0"].requires = ["gstreamer-1.0"]
self.cpp_info.components["gstreamer-base-1.0"].libs = ["gstbase-1.0"]
self.cpp_info.components["gstreamer-base-1.0"].includedirs = [os.path.join("include", "gstreamer-1.0")]
self.cpp_info.components["gstreamer-base-1.0"].set_property("pkg_config_custom_content", pkgconfig_custom_content)


self.cpp_info.components["gstreamer-controller-1.0"].set_property("pkg_config_name", "gstreamer-controller-1.0")
self.cpp_info.components["gstreamer-controller-1.0"].names["pkg_config"] = "gstreamer-controller-1.0"
self.cpp_info.components["gstreamer-controller-1.0"].requires = ["gstreamer-1.0"]
self.cpp_info.components["gstreamer-controller-1.0"].libs = ["gstcontroller-1.0"]
self.cpp_info.components["gstreamer-controller-1.0"].includedirs = [os.path.join("include", "gstreamer-1.0")]
if self.settings.os == "Linux":
self.cpp_info.components["gstreamer-controller-1.0"].system_libs = ["m"]
self.cpp_info.components["gstreamer-controller-1.0"].set_property("pkg_config_custom_content", pkgconfig_custom_content)


self.cpp_info.components["gstreamer-net-1.0"].set_property("pkg_config_name", "gstreamer-net-1.0")
self.cpp_info.components["gstreamer-net-1.0"].names["pkg_config"] = "gstreamer-net-1.0"
self.cpp_info.components["gstreamer-net-1.0"].requires = ["gstreamer-1.0", "glib::gio-2.0"]
self.cpp_info.components["gstreamer-net-1.0"].libs = ["gstnet-1.0"]
self.cpp_info.components["gstreamer-net-1.0"].includedirs = [os.path.join("include", "gstreamer-1.0")]
self.cpp_info.components["gstreamer-net-1.0"].set_property("pkg_config_custom_content", pkgconfig_custom_content)


self.cpp_info.components["gstreamer-check-1.0"].set_property("pkg_config_name", "gstreamer-check-1.0")
self.cpp_info.components["gstreamer-check-1.0"].names["pkg_config"] = "gstreamer-check-1.0"
self.cpp_info.components["gstreamer-check-1.0"].requires = ["gstreamer-1.0"]
self.cpp_info.components["gstreamer-check-1.0"].libs = ["gstcheck-1.0"]
self.cpp_info.components["gstreamer-check-1.0"].includedirs = [os.path.join("include", "gstreamer-1.0")]
if self.settings.os == "Linux":
self.cpp_info.components["gstreamer-check-1.0"].system_libs = ["rt", "m"]
self.cpp_info.components["gstreamer-check-1.0"].set_property("pkg_config_custom_content", pkgconfig_custom_content)

# gstcoreelements and gstcoretracers are plugins which should be loaded dynamicaly, and not linked to directly
if not self.options.shared:
self.cpp_info.components["gstcoreelements"].set_property("pkg_config_name", "gstcoreelements")
self.cpp_info.components["gstcoreelements"].names["pkg_config"] = "gstcoreelements"
self.cpp_info.components["gstcoreelements"].requires = ["glib::gobject-2.0", "glib::glib-2.0", "gstreamer-1.0", "gstreamer-base-1.0"]
self.cpp_info.components["gstcoreelements"].libs = ["gstcoreelements"]
self.cpp_info.components["gstcoreelements"].includedirs = [os.path.join("include", "gstreamer-1.0")]
self.cpp_info.components["gstcoreelements"].libdirs = [gst_plugin_path]

self.cpp_info.components["gstcoretracers"].set_property("pkg_config_name", "gstcoretracers")
self.cpp_info.components["gstcoretracers"].names["pkg_config"] = "gstcoretracers"
self.cpp_info.components["gstcoretracers"].requires = ["gstreamer-1.0"]
self.cpp_info.components["gstcoretracers"].libs = ["gstcoretracers"]
self.cpp_info.components["gstcoretracers"].includedirs = [os.path.join("include", "gstreamer-1.0")]
self.cpp_info.components["gstcoretracers"].libdirs = [gst_plugin_path]

if self.options.shared:
self.output.info("Appending GST_PLUGIN_PATH env var : %s" % gst_plugin_path)
self.env_info.GST_PLUGIN_PATH.append(gst_plugin_path)
self.runenv_info.define_path("GST_PLUGIN_PATH", gst_plugin_path)
gstreamer_root = self.package_folder
self.output.info("Creating GSTREAMER_ROOT env var : %s" % gstreamer_root)
self.env_info.GSTREAMER_ROOT = gstreamer_root
gst_plugin_scanner = "gst-plugin-scanner.exe" if self.settings.os == "Windows" else "gst-plugin-scanner"
gst_plugin_scanner = os.path.join(self.package_folder, "bin", "gstreamer-1.0", gst_plugin_scanner)
self.output.info("Creating GST_PLUGIN_SCANNER env var : %s" % gst_plugin_scanner)
self.runenv_info.define_path("GSTREAMER_ROOT", gstreamer_root)
self.runenv_info.define_path("GST_PLUGIN_SCANNER", gst_plugin_scanner)
if self.settings.arch == "x86":
self.runenv_info.define_path("GSTREAMER_ROOT_X86", gstreamer_root)
elif self.settings.arch == "x86_64":
self.runenv_info.define_path("GSTREAMER_ROOT_X86_64", gstreamer_root)

# TODO: remove the following when only Conan 2.0 is supported
if self.options.shared:
self.env_info.GST_PLUGIN_PATH.append(gst_plugin_path)
self.env_info.GSTREAMER_ROOT = gstreamer_root
self.env_info.GST_PLUGIN_SCANNER = gst_plugin_scanner
if self.settings.arch == "x86":
self.output.info("Creating GSTREAMER_ROOT_X86 env var : %s" % gstreamer_root)
self.env_info.GSTREAMER_ROOT_X86 = gstreamer_root
elif self.settings.arch == "x86_64":
self.output.info("Creating GSTREAMER_ROOT_X86_64 env var : %s" % gstreamer_root)
self.env_info.GSTREAMER_ROOT_X86_64 = gstreamer_root
33 changes: 23 additions & 10 deletions recipes/gstreamer/all/test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
cmake_minimum_required(VERSION 3.1)
cmake_minimum_required(VERSION 3.15)
project(test_package LANGUAGES C)

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)

find_package(gstreamer REQUIRED CONFIG)

add_executable(${PROJECT_NAME} test_package.c)
target_link_libraries(${PROJECT_NAME}
gstreamer::gstreamer-1.0 gstreamer::gstreamer-base-1.0 gstreamer::gstreamer-controller-1.0
gstreamer::gstreamer-net-1.0 gstreamer::gstreamer-check-1.0)
if (TARGET gstreamer::gstcoreelements)
target_link_libraries(${PROJECT_NAME} gstreamer::gstcoreelements)
endif ()

if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
jwillikers marked this conversation as resolved.
Show resolved Hide resolved
target_link_libraries(${PROJECT_NAME} PRIVATE
gstreamer::gstreamer-1.0 gstreamer::gstreamer-base-1.0 gstreamer::gstreamer-controller-1.0
gstreamer::gstreamer-net-1.0 gstreamer::gstreamer-check-1.0)
if (TARGET gstreamer::gstcoreelements)
target_link_libraries(${PROJECT_NAME} PRIVATE gstreamer::gstcoreelements)
endif ()
else()
find_package(PkgConfig REQUIRED)
pkg_check_modules(gstreamer-1.0 REQUIRED IMPORTED_TARGET gstreamer-1.0)
pkg_check_modules(gstreamer-base-1.0 REQUIRED IMPORTED_TARGET gstreamer-base-1.0)
pkg_check_modules(gstreamer-controller-1.0 REQUIRED IMPORTED_TARGET gstreamer-controller-1.0)
pkg_check_modules(gstreamer-net-1.0 REQUIRED IMPORTED_TARGET gstreamer-net-1.0)
pkg_check_modules(gstreamer-check-1.0 REQUIRED IMPORTED_TARGET gstreamer-check-1.0)
pkg_check_modules(gstcoreelements IMPORTED_TARGET gstcoreelements)
target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::gstreamer-1.0 PkgConfig::gstreamer-base-1.0 PkgConfig::gstreamer-controller-1.0
PkgConfig::gstreamer-net-1.0 PkgConfig::gstreamer-check-1.0)
if (TARGET PkgConfig::gstcoreelements)
target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::gstcoreelements)
endif ()
endif()
Loading