1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
# -*- Mode: Python -*- vi:si:et:sw=4:sts=4:ts=4:syntax=python
from custom import GStreamer
from cerbero.utils import messages as m
class Recipe(recipe.Recipe):
name = 'gst-plugins-rs'
version = '0.11.0-alpha.1'
stype = SourceType.GIT
remotes = {'origin': 'https://gitlab.freedesktop.org/gstreamer/%(name)s.git'}
if GStreamer.tagged_for_release:
commit = f'gstreamer-{GStreamer.version}'
else:
commit = 'origin/main'
# Each plugin uses one or more of these licenses.
licenses = [{
License.Apachev2: ['LICENSE-APACHE'],
License.MIT: ['LICENSE-MIT'],
License.LGPLv2_1Plus: None,
}]
btype = BuildType.CARGO_C
cargoc_packages = [
'audiofx',
'aws',
'cdg',
'claxon',
'closedcaption',
'dav1d',
'fallbackswitch',
'ffv1',
'fmp4',
'gif',
'hlssink3',
'hsv',
'json',
'livesync',
'lewton',
'mp4',
'ndi',
'onvif',
'rav1e',
'regex',
'reqwest',
'raptorq',
'png',
'rtp',
'textahead',
'textwrap',
'threadshare',
'togglerecord',
'tracers',
'uriplaylistbin',
'videofx',
'webrtc',
'webrtchttp',
]
# Needed for openssl
use_system_libs = True
deps = ['gstreamer-1.0', 'gst-plugins-base-1.0', 'pango', 'cairo',
'gst-plugins-bad-1.0', 'dav1d']
def enable_plugin(self, name, category):
if LibraryType.SHARED in self.library_type:
attr = f'files_plugins_{category}'
if not hasattr(self, attr):
setattr(self, attr, [])
self.update_categories()
f = getattr(self, attr)
f += [f'%(libdir)s/gstreamer-1.0/libgst{name}%(mext)s']
if LibraryType.STATIC in self.library_type:
attr = f'files_plugins_{category}_devel'
if not hasattr(self, attr):
setattr(self, attr, [])
d = getattr(self, attr)
d += [
f'%(libdir)s/gstreamer-1.0/libgst{name}.a',
f'%(libdir)s/gstreamer-1.0/libgst{name}.la',
]
def prepare(self):
# See "static plugins" bullet point in phase 2 at
# https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/381
if self.config.target_platform in (Platform.IOS, Platform.ANDROID):
self.library_type = LibraryType.STATIC
else:
self.library_type = LibraryType.SHARED
if self.config.target_platform != Platform.LINUX or self.config.cross_compiling():
self.deps.append('openssl')
plugin_files = {
'core': ['fallbackswitch', 'livesync', 'togglerecord', 'rstracers'],
'net': ['aws', 'hlssink3', 'ndi', 'rsonvif', 'raptorq', 'rsrtp',
'reqwest', 'webrtchttp', 'rswebrtc'],
'effects': ['rsaudiofx', 'rsvideofx'],
'codecs': ['cdg', 'claxon', 'dav1d', 'rsclosedcaption', 'ffv1',
'fmp4', 'mp4', 'gif', 'hsv', 'lewton', 'rav1e', 'json',
'rspng', 'regex', 'textwrap', 'textahead'],
'playback': ['uriplaylistbin'],
}
# https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/326
if self.library_type != LibraryType.STATIC:
plugin_files['core'].append('threadshare')
for category, names in plugin_files.items():
for name in names:
self.enable_plugin(name, category)
self.cargoc_packages = [f'gst-plugin-{pkg}' for pkg in self.cargoc_packages]
# Build with Cerbero's latest glib version as minimum version
self.cargo_features += ['glib/v2_74', 'gio/v2_74']
# Enable assembly optimizations via nasm
self.cargo_features.append('gst-plugin-rav1e/asm')
# Build with the current GStreamer version as minimum version
components = ('', '-app', '-audio', '-base', '-check', '-net', '-pbutils',
'-plugin-tracers', '-rtp', '-sdp', '-utils', '-video', '-webrtc')
for each in components:
self.cargo_features.append(f'gst{each}/v1_22')
self.cargo_features.append('gst-plugin-webrtc/gst1_22')
async def configure(self):
# Check that the Cargo.toml version matches the recipe version
toml_version = self.get_cargo_toml_version()
if toml_version != self.version:
msg = f'{self.name} version {self.version} doesn\'t match Cargo.toml version {toml_version}'
if GStreamer.tagged_for_release:
raise FatalError(msg)
else:
m.warning(msg)
await super().configure()
def post_install(self):
# Cargo-C currently can't install pc files into custom dirs, so we need
# to move these plugin pkgconfig files to the right place.
for f in self.files_list_by_category(self.DEVEL_CAT):
if not f.endswith('.pc') or not 'gstreamer-1.0' in f:
continue
name = os.path.basename(f)
src = os.path.join(self.config.libdir, 'pkgconfig', name)
dst = os.path.join(self.config.prefix, f)
os.replace(src, dst)
# Cargo-C names MinGW DLLs as foo.dll instead of libfoo.dll
# https://github.com/lu-zero/cargo-c/issues/280
if not self.using_msvc():
for f in self.dist_files_list():
if not f.endswith('.dll'):
continue
name = os.path.basename(f)
d = os.path.dirname(f)
src = os.path.join(self.config.prefix, d, f'{name[3:]}')
dst = os.path.join(self.config.prefix, f)
os.replace(src, dst)
# .dll.a also needs renaming
os.replace(src + '.a', dst + '.a')
super().post_install()
|