diff options
author | Josh Matthews <josh@joshmatthews.net> | 2020-07-16 18:12:34 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2020-07-16 22:42:22 -0400 |
commit | 72040be69bc33b03fabe1048299bed4714616604 (patch) | |
tree | f5c12a31da1a46d80fe84bd160d600af36297616 /python/servo | |
parent | 9fe92ecb4c35747fd58b13f6ae23eb0f31a14680 (diff) | |
download | servo-72040be69bc33b03fabe1048299bed4714616604.tar.gz servo-72040be69bc33b03fabe1048299bed4714616604.zip |
Load explicit set of gstreamer plugins on macos, and include them in the nightly package.
Diffstat (limited to 'python/servo')
-rw-r--r-- | python/servo/build_commands.py | 84 | ||||
-rw-r--r-- | python/servo/gstreamer.py | 144 | ||||
-rw-r--r-- | python/servo/package_commands.py | 2 |
3 files changed, 176 insertions, 54 deletions
diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py index 58ef42e68a1..5a3be66fd09 100644 --- a/python/servo/build_commands.py +++ b/python/servo/build_commands.py @@ -32,6 +32,7 @@ from mach.registrar import Registrar from mach_bootstrap import _get_exec_path from servo.command_base import CommandBase, cd, call, check_call, append_to_path_env, gstreamer_root +from servo.gstreamer import windows_dlls, windows_plugins, macos_dylibs, macos_plugins from servo.util import host_triple @@ -735,6 +736,14 @@ class MachCommands(CommandBase): status = 1 elif sys.platform == "darwin": + servo_exe_dir = os.path.dirname( + self.get_binary_path(release, dev, target=target, simpleservo=libsimpleservo) + ) + assert os.path.exists(servo_exe_dir) + + if not package_gstreamer_dylibs(servo_exe_dir): + return 1 + # On the Mac, set a lovely icon. This makes it easier to pick out the Servo binary in tools # like Instruments.app. try: @@ -842,6 +851,24 @@ def angle_root(target, nuget_env): return angle_default_path +def package_gstreamer_dylibs(servo_exe_dir): + missing = [] + gst_dylibs = macos_dylibs() + macos_plugins() + for gst_lib in gst_dylibs: + try: + dest_path = os.path.join(servo_exe_dir, os.path.basename(gst_lib)) + if os.path.isfile(dest_path): + os.remove(dest_path) + shutil.copy(gst_lib, servo_exe_dir) + except Exception as e: + print(e) + missing += [str(gst_lib)] + + for gst_lib in missing: + print("ERROR: could not find required GStreamer DLL: " + gst_lib) + return not missing + + def package_gstreamer_dlls(env, servo_exe_dir, target, uwp): gst_root = gstreamer_root(target, env) if not gst_root: @@ -860,29 +887,14 @@ def package_gstreamer_dlls(env, servo_exe_dir, target, uwp): "glib-2.0-0.dll", "gmodule-2.0-0.dll", "gobject-2.0-0.dll", - "gstapp-1.0-0.dll", - "gstaudio-1.0-0.dll", - "gstbase-1.0-0.dll", - "gstcodecparsers-1.0-0.dll", - "gstcontroller-1.0-0.dll", - "gstfft-1.0-0.dll", - "gstgl-1.0-0.dll", - "gstpbutils-1.0-0.dll", - "gstplayer-1.0-0.dll", - "gstreamer-1.0-0.dll", - "gstriff-1.0-0.dll", - "gstrtp-1.0-0.dll", - "gstrtsp-1.0-0.dll", - "gstsdp-1.0-0.dll", - "gsttag-1.0-0.dll", - "gstvideo-1.0-0.dll", - "gstwebrtc-1.0-0.dll", "intl-8.dll", "orc-0.4-0.dll", "swresample-3.dll", "z-1.dll", ] + gst_dlls += windows_dlls(uwp) + if uwp: # These come from a more recent version of ffmpeg and # aren't present in the official GStreamer 1.16 release. @@ -897,7 +909,6 @@ def package_gstreamer_dlls(env, servo_exe_dir, target, uwp): # with UWP's restrictions. gst_dlls += [ "graphene-1.0-0.dll", - "gstsctp-1.0-0.dll", "libgmp-10.dll", "libgnutls-30.dll", "libhogweed-4.dll", @@ -929,42 +940,7 @@ def package_gstreamer_dlls(env, servo_exe_dir, target, uwp): return False # Only copy a subset of the available plugins. - gst_dlls = [ - "gstapp.dll", - "gstaudioconvert.dll", - "gstaudiofx.dll", - "gstaudioparsers.dll", - "gstaudioresample.dll", - "gstautodetect.dll", - "gstcoreelements.dll", - "gstdeinterlace.dll", - "gstplayback.dll", - "gstinterleave.dll", - "gstisomp4.dll", - "gstlibav.dll", - "gstproxy.dll", - "gsttypefindfunctions.dll", - "gstvideoconvert.dll", - "gstvideofilter.dll", - "gstvideoparsersbad.dll", - "gstvideoscale.dll", - "gstvolume.dll", - "gstwasapi.dll", - ] - - if not uwp: - gst_dlls += [ - "gstmatroska.dll", - "gstnice.dll", - "gstogg.dll", - "gstopengl.dll", - "gstopus.dll", - "gstrtp.dll", - "gsttheora.dll", - "gstvorbis.dll", - "gstvpx.dll", - "gstwebrtc.dll", - ] + gst_dlls = windows_plugins(uwp) gst_plugin_path_root = os.environ.get("GSTREAMER_PACKAGE_PLUGIN_PATH") or gst_root gst_plugin_path = path.join(gst_plugin_path_root, "lib", "gstreamer-1.0") diff --git a/python/servo/gstreamer.py b/python/servo/gstreamer.py new file mode 100644 index 00000000000..bf75386894b --- /dev/null +++ b/python/servo/gstreamer.py @@ -0,0 +1,144 @@ +# Copyright 2013 The Servo Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution. +# +# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +import os +import sys + +GSTREAMER_DYLIBS = [ + ("gstapp", "gst-plugins-base"), + ("gstaudio", "gst-plugins-base"), + ("gstbase", "gstreamer"), + ("gstcodecparsers", "gst-plugins-bad"), + ("gstcontroller", "gstreamer"), + ("gstfft", "gst-plugins-base"), + ("gstgl", "gst-plugins-base"), + ("gstpbutils", "gst-plugins-base"), + ("gstplayer", "gst-plugins-bad"), + ("gstreamer", "gstreamer"), + ("gstriff", "gst-plugins-base"), + ("gstrtp", "gst-plugins-base"), + ("gstrtsp", "gst-plugins-base"), + ("gstsctp", "gst-plugins-bad"), + ("gstsdp", "gst-plugins-base"), + ("gsttag", "gst-plugins-base"), + ("gstvideo", "gst-plugins-base"), + ("gstwebrtc", "gst-plugins-bad"), +] + +NON_UWP_DYLIBS = [ + "gstsctp", +] + +GSTREAMER_PLUGINS = [ + ("gstapp", "gst-plugins-base"), + ("gstaudioconvert", "gst-plugins-base"), + ("gstaudiofx", "gst-plugins-good"), + ("gstaudioparsers", "gst-plugins-good"), + ("gstaudioresample", "gst-plugins-base"), + ("gstautodetect", "gst-plugins-good"), + ("gstcoreelements", "gstreamer"), + ("gstdeinterlace", "gst-plugins-good"), + ("gstinterleave", "gst-plugins-good"), + ("gstisomp4", "gst-plugins-good"), + ("gstlibav", "gst-libav"), + ("gstmatroska", "gst-plugins-good"), + ("gstogg", "gst-plugins-base"), + ("gstopengl", "gst-plugins-base"), + ("gstopus", "gst-plugins-base"), + ("gstplayback", "gst-plugins-base"), + ("gstproxy", "gst-plugins-bad"), + ("gstrtp", "gst-plugins-good"), + ("gsttheora", "gst-plugins-base"), + ("gsttypefindfunctions", "gst-plugins-base"), + ("gstvideoconvert", "gst-plugins-base"), + ("gstvideofilter", "gst-plugins-good"), + ("gstvideoparsersbad", "gst-plugins-bad"), + ("gstvideoscale", "gst-plugins-base"), + ("gstvorbis", "gst-plugins-base"), + ("gstvolume", "gst-plugins-base"), + ("gstvpx", "gst-plugins-good"), + ("gstwebrtc", "gst-plugins-bad"), +] + +WINDOWS_PLUGINS = [ + ("gstnice", "gst-plugins-base"), + ("gstwasapi", "gst-plugins-base"), +] + +MACOS_PLUGINS = [ + ("gstapplemedia", "gst-plugins-bad"), +] + +NON_UWP_PLUGINS = [ + "gstmatroska", + "gstnice", + "gstogg", + "gstopengl", + "gstopus", + "gstrtp", + "gsttheora", + "gstvorbis", + "gstvpx", + "gstwebrtc", +] + + +def windows_dlls(uwp): + dlls = [x for x, _ in GSTREAMER_DYLIBS] + if uwp: + dlls = filter(lambda x: x not in NON_UWP_DYLIBS, dlls) + return [x + "-1.0-0.dll" for x in dlls] + + +def windows_plugins(uwp): + dlls = [x for x, _ in GSTREAMER_PLUGINS] + [x for x, _ in WINDOWS_PLUGINS] + if uwp: + dlls = filter(lambda x: x not in NON_UWP_PLUGINS, dlls) + return [x + ".dll" for x in dlls] + + +def macos_dylibs(): + return [ + os.path.join( + "/usr/local/opt", + path, + "lib", + "lib" + name + "-1.0.0.dylib" + ) for name, path in GSTREAMER_DYLIBS + ] + + +def macos_plugins(): + return [ + os.path.join( + "/usr/local/opt", + path, + "lib", + "gstreamer-1.0", + "lib" + name + ".so" + ) for name, path in GSTREAMER_PLUGINS + ] + + +def write_plugin_list(target): + plugins = [] + if "apple-" in target: + plugins = [os.path.basename(x) for x in macos_plugins()] + elif '-windows-' in target: + plugins = windows_plugins('-uwp-' in target) + print('''/* This is a generated file. Do not modify. */ + +pub(crate) static GSTREAMER_PLUGINS: &[&'static str] = &[ +%s +]; +''' % ',\n'.join(map(lambda x: '"' + x + '"', plugins))) + + +if __name__ == "__main__": + write_plugin_list(sys.argv[1]) diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py index e4fca52516f..3bd6d856254 100644 --- a/python/servo/package_commands.py +++ b/python/servo/package_commands.py @@ -39,6 +39,7 @@ from servo.command_base import ( is_macosx, is_windows, ) +from servo.gstreamer import macos_dylibs from servo.util import delete # Note: mako cannot be imported at the top level because it breaks mach bootstrap @@ -139,6 +140,7 @@ def copy_dependencies(binary_path, lib_path): # Update binary libraries binary_dependencies = set(otool(binary_path)) + binary_dependencies = binary_dependencies.union(macos_dylibs()) change_non_system_libraries_path(binary_dependencies, relative_path, binary_path) # Update dependencies libraries |