mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Load explicit set of gstreamer plugins on macos, and include them in the nightly package.
This commit is contained in:
parent
9fe92ecb4c
commit
72040be69b
6 changed files with 239 additions and 108 deletions
|
@ -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")
|
||||
|
|
144
python/servo/gstreamer.py
Normal file
144
python/servo/gstreamer.py
Normal file
|
@ -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])
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue