Live video on the AT Protocol
at eli/node-22 304 lines 7.9 kB view raw
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