Live video on the AT Protocol
1project(
2 'streamplace',
3 'c',
4 'cpp',
5 default_options: {
6 'cpp_std': 'c++11',
7 'default_library': 'static',
8 'auto_features': 'disabled',
9 'force_fallback_for': 'gio-2.0,gstreamer-controller-1.0,gstreamer-app-1.0,gstreamer-pbutils-1.0,glib-2.0,gobject-2.0,gio-2.0,gio-unix-2.0,fdk-aac,zlib,libffi,pcre2,intl,x264,freetype2,libpng,libjpeg,fontconfig,pango,opus,fribidi,harfbuzz,nettle,cairo,pixman,expat',
10 'buildtype': 'debugoptimized',
11 },
12)
13
14fs = import('fs')
15
16prog_go = find_program('go')
17
18flagbuilder = custom_target(
19 'flagbuilder',
20 input: ['pkg/config/git/git.go'],
21 output: ['flagbuilder'],
22 command: [prog_go, 'build', '-o', '@OUTPUT0@', '@INPUT@'],
23 build_always_stale: true,
24)
25
26flags = custom_target(
27 'flags',
28 input: [],
29 output: ['build-flags.go'],
30 command: [flagbuilder, '-o', '@OUTPUT0@'],
31 build_always_stale: true,
32)
33
34version_cmd = run_command(prog_go, 'run', 'pkg/config/git/git.go', '-v', check: true)
35version = version_cmd.stdout().strip()
36
37streamplace_go = custom_target(
38 'streamplace.go',
39 input: 'cmd/libstreamplace/streamplace.go',
40 output: 'streamplace.go',
41 command: ['cp', '@INPUT@', '@OUTPUT@'],
42)
43
44# todo: teach meson to automatically populate this CPATH thing for go
45env = {
46 'PKG_CONFIG_PATH': meson.current_build_dir() + '/meson-uninstalled',
47}
48
49GOOS = meson.get_external_property('GOOS', host_machine.system())
50GOARCH = meson.get_external_property('GOARCH', host_machine.cpu())
51if GOARCH == 'x86_64'
52 GOARCH = 'amd64'
53endif
54if GOARCH == 'aarch64'
55 GOARCH = 'arm64'
56endif
57if meson.is_cross_build()
58 env += {
59 'GOOS': GOOS,
60 'GOARCH': GOARCH,
61 'CGO_ENABLED': '1',
62 'CC': meson.get_compiler('c', native: false).cmd_array()[0],
63 }
64endif
65
66c2pa_go_opts = {}
67triple = meson.get_external_property('RUST_TRIPLE', '')
68if triple != ''
69 c2pa_go_opts += {'RUST_TRIPLE': triple}
70endif
71c2pa_go_proj = subproject(
72 'c2pa_go',
73 default_options: c2pa_go_opts,
74)
75c2pa_go_dep = c2pa_go_proj.get_variable('c2pa_go_dep')
76
77streamplace_deps = []
78# if host_machine.system() == 'linux'
79# mistserver_proj = subproject(
80# 'mistserver',
81# default_options: {
82# 'APPNAME': 'MistServer',glib
83# },
84# )
85# mistserver = mistserver_proj.get_variable('libmistserver_dep')
86# streamplace_deps += mistserver
87# endif
88
89ffmpeg_opts = {
90 'aac_adtstoasc_bsf': 'enabled',
91 'aac_decoder': 'enabled',
92 'aac_latm_parser': 'enabled',
93 'aac_parser': 'enabled',
94 'aformat_filter': 'enabled',
95 'aresample_filter': 'enabled',
96 'asetnsamples_filter': 'enabled',
97 'auto_features': 'enabled',
98 'concat_demuxer': 'enabled',
99 'concat_filter': 'enabled',
100 'concat_protocol': 'enabled',
101 'concatf_protocol': 'enabled',
102 'cuda': 'enabled',
103 'extract_extradata_bsf': 'enabled',
104 'fd_protocol': 'enabled',
105 'fifo_muxer': 'enabled',
106 'file_protocol': 'enabled',
107 'flac_decoder': 'enabled',
108 'flac_demuxer': 'enabled',
109 'flac_muxer': 'enabled',
110 'flac_parser': 'enabled',
111 'flv_demuxer': 'enabled',
112 'format_filter': 'enabled',
113 'fps_filter': 'enabled',
114 'gpl': 'enabled',
115 'h264_cuvid_decoder': 'enabled',
116 'h264_decoder': 'enabled',
117 'h264_metadata_bsf': 'enabled',
118 'h264_mp4toannexb_bsf': 'enabled',
119 'h264_parser': 'enabled',
120 'h264_redundant_pps_bsf': 'enabled',
121 'hevc_cuvid_decoder': 'enabled',
122 'hevc_mp4toannexb_bsf': 'enabled',
123 'hevc_muxer': 'enabled',
124 'hevc_parser': 'enabled',
125 'hls_muxer': 'enabled',
126 'http_protocol': 'enabled',
127 'hwdownload_filter': 'enabled',
128 'hwupload_cuda_filter': 'enabled',
129 'image2_demuxer': 'enabled',
130 'libxcb': 'enabled',
131 'matroska_audio_muxer': 'enabled',
132 'matroska_demuxer': 'enabled',
133 'matroska_muxer': 'enabled',
134 'mov_demuxer': 'enabled',
135 'mp3_decoder': 'enabled',
136 'mp3_demuxer': 'enabled',
137 'mp3_muxer': 'enabled',
138 'mp4_muxer': 'enabled',
139 'mpegaudio_parser': 'enabled',
140 'mpegts_demuxer': 'enabled',
141 'mpegts_muxer': 'enabled',
142 'network': 'enabled',
143 'null_muxer': 'enabled',
144 'opus_decoder': 'enabled',
145 'opus_parser': 'enabled',
146 'pipe_protocol': 'enabled',
147 'png_decoder': 'enabled',
148 'png_parser': 'enabled',
149 'rtmp_protocol': 'enabled',
150 'scale_cuda_filter': 'enabled',
151 'scale_filter': 'enabled',
152 'segment_muxer': 'enabled',
153 'stream_segment_muxer': 'enabled',
154 'select_filter': 'enabled',
155 'signature_cuda_filter': 'enabled',
156 'signature_filter': 'enabled',
157 'tcp_protocol': 'enabled',
158 'vorbis_decoder': 'enabled',
159 'vorbis_parser': 'enabled',
160 'vp8_cuvid_decoder': 'enabled',
161 'vp8_parser': 'enabled',
162 'vp9_cuvid_decoder': 'enabled',
163 'vp9_parser': 'enabled',
164 'wav_demuxer': 'enabled',
165 'wav_muxer': 'enabled',
166 'webm_muxer': 'enabled',
167 'x86asm': 'enabled',
168 'mov_muxer': 'enabled',
169 'vp9_superframe_bsf': 'enabled',
170 'ac3_parser': 'enabled',
171 'pgs_frame_merge_bsf': 'enabled',
172}
173
174if host_machine.system() != 'windows'
175 ffmpeg_opts += {'nanosleep': 'enabled'}
176endif
177
178ffmpeg_proj = subproject(
179 'FFmpeg',
180 # vvc seems to have problems building as a submodule?
181 default_options: ffmpeg_opts,
182)
183avformat = ffmpeg_proj.get_variable('libavformat_dep')
184avfilter = ffmpeg_proj.get_variable('libavfilter_dep')
185streamplace_deps += [avformat, avfilter]
186
187gstreamer_proj = subproject(
188 'gstreamer-full',
189 default_options: {},
190)
191
192streamplace_deps += [
193 dependency('gio-2.0'),
194 dependency('gstreamer-controller-1.0'),
195 dependency('gstreamer-app-1.0'),
196 dependency('gstreamer-pbutils-1.0'),
197]
198
199atproto = subproject(
200 'atproto',
201 default_options: {},
202)
203
204if get_option('default_library') == 'static'
205 gst_full_dep = gstreamer_proj.get_variable('gst_full_dep')
206 streamplace_deps += [
207 gst_full_dep,
208 dependency('gstplayback'),
209 ]
210endif
211
212libstreamplace = custom_target(
213 'libstreamplace',
214 input: [streamplace_go, flags],
215 output: ['streamplace.a', 'streamplace.h'],
216 command: [
217 prog_go,
218 'build',
219 '-o', '@OUTPUT0@',
220 '-buildmode', 'c-archive',
221 '-tags', 'netgo',
222 '@INPUT@',
223 ],
224 build_always_stale: true,
225 env: env,
226)
227
228if host_machine.system() == 'darwin'
229 streamplace_deps += [dependency('appleframeworks', modules: ['CoreFoundation', 'Security'])]
230endif
231if host_machine.system() == 'windows'
232 add_project_link_arguments(
233 [
234 '-lntdll',
235 '-luserenv',
236 '-lcrypt32',
237 '-lbcrypt',
238 '-static-libstdc++',
239 '-static-libgcc',
240 ],
241 language: ['c', 'cpp'],
242 )
243endif
244
245pkg = import('pkgconfig')
246pkg.generate(
247 name: 'streamplacedeps',
248 libraries: [streamplace_deps, c2pa_go_dep],
249 description: 'all streamplace dependencies bundled for easy inclusion',
250)
251
252streamplace = executable(
253 'streamplace',
254 ['cmd/streamplace/streamplace.c', libstreamplace],
255 dependencies: [
256 streamplace_deps,
257 ],
258 link_with: [c2pa_go_dep],
259)
260
261if not meson.is_cross_build()
262 test(
263 'go-tests',
264 prog_go,
265 depends: [streamplace],
266 env: env,
267 verbose: true,
268 timeout: 0,
269 args: [
270 'test',
271 '-p', '1',
272 '-timeout', '120s',
273 '@0@/pkg/...'.format(meson.current_source_dir()),
274 '@0@/cmd/...'.format(meson.current_source_dir()),
275 ],
276 )
277endif
278
279if host_machine.system() == 'windows'
280 prog_zip = find_program('zip')
281 archive_name = 'streamplace-' + version + '-' + GOOS + '-' + GOARCH + '.zip'
282 custom_target(
283 'archive',
284 input: [streamplace],
285 output: ['streamplace.zip'],
286 command: [prog_zip, '../bin/' + archive_name, '@INPUT@'],
287 install: true,
288 install_dir: './bin',
289 build_by_default: false,
290 )
291else
292 prog_tar = find_program('tar')
293 # archive_name = streamplace-$(VERSION)-$$GOOS-$$GOARCH.tar.gz
294 archive_name = 'streamplace-' + version + '-' + GOOS + '-' + GOARCH + '.tar.gz'
295 custom_target(
296 'archive',
297 input: [streamplace],
298 output: ['streamplace.tar.gz'],
299 command: [prog_tar, '-czvf', '../bin/' + archive_name, '@INPUT@'],
300 install: true,
301 install_dir: './bin',
302 build_by_default: false,
303 )
304endif