Adding isort
This commit is contained in:
13
www-client/chromium/Manifest
Normal file
13
www-client/chromium/Manifest
Normal file
@ -0,0 +1,13 @@
|
||||
AUX 01-chromium.conf 967 BLAKE2B d5da500872d5fdca245420942e1a5718ebd1bd4d47d0496306910c5929d4336b69082b48a6190e4617efebdbec68fd5fe8c67be3f8f3a2a943f42b778adafe71 SHA512 e66bc79027cf2311cea810ab02e59ffeac9698f3a83d773ebf96d14e4e95e62a96cf16e416b3638681c0be7d4b72da47091d4f8933dc3388c7f9dc5cafae5505
|
||||
AUX chromium-83-vaapi.patch 8203 BLAKE2B c36a2c695b4ffe00fff585d1f260d06ca0fc686a6d05442e746806b8a1d1a35396f4334ab480d4e3aa851d2d7cfff373606bcd8e15330e51f96d49779a25f98c SHA512 e0e930e4e5713b86ad87c9d5e901ed608dd982ab6cb6c0e8fa2cc7033a6d10dd85968a1e21d377ee35ba4b75068f7aadeda42fc11a85de3121a58e28bffd3cdf
|
||||
AUX chromium-84-mediaalloc.patch 1242 BLAKE2B 3545ea4f8d71a062f71c20f4fa3e1460dbd02d3512ce6445ac4f948582a51bdcbd98829eff9b01cb7b920313d1f849534c46a942eed209a56ca373da8e938b6b SHA512 7799be695afe24844aad35ee4ed2aeb338b36a06e29a7f8d8a9c5d2b2769167469b8cdfa3f8814e6976c26a2731fc73741dc1c0b095695e1a21bfd3db166f7b4
|
||||
AUX chromium-84-pipewire.patch 31734 BLAKE2B 72b756453dd761ad1023e35797bd718ce44ce96eeb91c52478e161f859beb31e11a3167572c2039cdabcf614ef59d1112f0f3315e24c0755470a3b1e74957922 SHA512 da211745e2300f2619997c6a277ebcd103c17eb37d9bad4ced163d5dafb3f67e06f47eadd6415ffde24cfec6754577c93ee0177507fa7b1a98a81f98dc98ebcd
|
||||
AUX chromium-browser.xml 408 BLAKE2B f780619ee2c179c84a5b636f773801c0b9ea718d5b63aac84554bb77cf32e1e59b01156e18d99bd84cd11708c8df4b828a68848348da4c6c9abd3877ad18466b SHA512 12c42129e3146c88264c85abdb0e20281eb36fd62dc4f3626f2534dd21e385acf46e21f7940911ea49182293cbcc72e6e76efde3e0056de3ae9e97064a68252c
|
||||
AUX chromium-launcher-r4.sh 1609 BLAKE2B 77d840d6195a83859539e061f5cc304beccf8a20d1ab947c73cb858b44b3d4bd2930ae7f25c08e972cda18616601a6f5dc66cf3c61988813e99e4d4c9d50c942 SHA512 1d6211bf0703aa8df6ff9e584040470f004d84de9c81d38caee52bb96e38aa2bbd8e495dfcb85105275b53eaf6a4f1de5b89eaab9995e94f8cf313d74061c923
|
||||
AUX chromium.default 148 BLAKE2B 5ee5b582c59a6e4bef87bbb0e232e2470ad412b1fbbb3b9af6ef7153edb55c5b9080cc16a5a115b0c5b3c381aa87ce57a7b12bdd2070e67dac10a6c2995ddbaf SHA512 0d4849e03592fb58b05e62a43021eca7e61615616c8907c3b2e445402e03adaf9e8fa25b0a745d6c31eb037456215cc02b59e345a3a06d932e76cf990c92d739
|
||||
DIST chromium-84-patchset-3.tar.xz 20148 BLAKE2B d910570b43f63bcf4ead90ca4e4005a08d7c85b5b4e7af2a70ec4bc18265cbe8b075523878710075cfee4e0631eb3374e1e6d06251f4bf03377954807b1951e9 SHA512 316db8b0359b10a988242a0d665475d912fa9b610a547478d8c39b337afc02780a54d7024e231eb4fd402063cf439f6e2b4bb92a4968c8e0c3e69d84a2ae1664
|
||||
DIST chromium-84.0.4147.89.tar.xz 845153972 BLAKE2B e8101805af6278fc9c49041071e7cd6d53fe79ba74b83b636584db57f459f003559758a51a1cd155d7fe3d5d0d21c95d37f84e638644c6e08b39ea02cce902be SHA512 cc207a5f09a89e42bc12fd491d5d0ef11c04daaa324aa696d2f8a37679b8f2171d3b265296968c3312e158b0fd2c059e12727a7463d3bd2f640d5bbd43c4f676
|
||||
DIST setuptools-44.1.0.zip 858569 BLAKE2B f59f154e121502a731e51294ccd293d60ffccadacf51e23b53bf7ceba38858948b86783238061136c827ac3373ea7ea8e6253d4bb53f3f1dd69284568ec65a68 SHA512 4dfb0f42d334b835758e865a26ecd1e725711fa2b9c38ddc273b8b3849fba04527bc97436d11ba1e98f1a42922aa0f0b9032e32998273c705fac6e10735eacbf
|
||||
DIST xcb-proto-1.14.tar.xz 143384 BLAKE2B 60212b0f0ce039a64a2e6cbbc78564eeffc57cff20987b37dc780d8d97ae888a7dbfbbaadc6e0e4bedfc5d1e360f16318e3825ad8406de668d9c7c66cf7f4b5d SHA512 de66d568163b6da2be9d6c59984f3afa3acd119a781378638045fd68018665ef5c9af98f024e9962ba3eb7c7a4d85c27ba70ffafceb2324ccc6940f34de16690
|
||||
EBUILD chromium-84.0.4147.89.ebuild 27404 BLAKE2B cd207fc3b0f0164f6142a69769e7a1fab4c2f2706b04f7611659e23e5e988814ae25b663b528915a2e1965784d18d9df163ff64f9be16ece3fa6dc5701fe3ab4 SHA512 198046b4eab1f246f9ab6b9d0e012e0877cfcbadd62ca227bf70f17ff830b98f652a22f1be5e4d0f30fd9c7410b3b1ea69603225f0171afaa4a561fb97805a27
|
||||
MISC metadata.xml 1351 BLAKE2B fb5be12f788385e19aa41ab929c0c0f2744a61cc83b19ed973174cee564043a871f68fadb721ee91d688020aa1daba5fb2bca4535c53630bd88cc0ede527ef53 SHA512 ae812473401017ce399461a829e7182e6e28c56b01c1da926883bd3edf751fa804dc88f429c77a3f533647b2115c960a7bba21572735dcf3d039a6d87fabf51d
|
890
www-client/chromium/chromium-84.0.4147.89.ebuild
Normal file
890
www-client/chromium/chromium-84.0.4147.89.ebuild
Normal file
@ -0,0 +1,890 @@
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI=7
|
||||
PYTHON_COMPAT=( python2_7 )
|
||||
|
||||
CHROMIUM_LANGS="am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu he
|
||||
hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr
|
||||
sv sw ta te th tr uk vi zh-CN zh-TW"
|
||||
|
||||
inherit check-reqs chromium-2 desktop flag-o-matic multilib ninja-utils pax-utils portability python-any-r1 readme.gentoo-r1 toolchain-funcs xdg-utils
|
||||
|
||||
DESCRIPTION="Open-source version of Google Chrome web browser"
|
||||
HOMEPAGE="https://chromium.org/"
|
||||
XCB_PROTO_VERSION="1.14"
|
||||
PATCHSET="3"
|
||||
PATCHSET_NAME="chromium-$(ver_cut 1)-patchset-${PATCHSET}"
|
||||
SRC_URI="https://commondatastorage.googleapis.com/chromium-browser-official/${P}.tar.xz
|
||||
https://files.pythonhosted.org/packages/ed/7b/bbf89ca71e722b7f9464ebffe4b5ee20a9e5c9a555a56e2d3914bb9119a6/setuptools-44.1.0.zip
|
||||
https://www.x.org/releases/individual/proto/xcb-proto-${XCB_PROTO_VERSION}.tar.xz
|
||||
https://github.com/stha09/chromium-patches/releases/download/${PATCHSET_NAME}/${PATCHSET_NAME}.tar.xz"
|
||||
|
||||
LICENSE="BSD"
|
||||
SLOT="0"
|
||||
KEYWORDS="amd64 arm64 ~x86"
|
||||
IUSE="+closure-compile component-build cups cpu_flags_arm_neon +hangouts headless kerberos +memsaver ozone pic +proprietary-codecs pulseaudio screencast selinux +suid +system-ffmpeg +system-icu +system-libvpx +tcmalloc vaapi wayland widevine"
|
||||
RESTRICT="!system-ffmpeg? ( proprietary-codecs? ( bindist ) )"
|
||||
REQUIRED_USE="
|
||||
component-build? ( !suid )
|
||||
wayland? ( ozone )
|
||||
vaapi? ( !ozone )
|
||||
"
|
||||
|
||||
COMMON_X_DEPEND="
|
||||
media-libs/mesa:=[gbm]
|
||||
x11-libs/libX11:=
|
||||
x11-libs/libXcomposite:=
|
||||
x11-libs/libXcursor:=
|
||||
x11-libs/libXdamage:=
|
||||
x11-libs/libXext:=
|
||||
x11-libs/libXfixes:=
|
||||
>=x11-libs/libXi-1.6.0:=
|
||||
x11-libs/libXrandr:=
|
||||
x11-libs/libXrender:=
|
||||
x11-libs/libXtst:=
|
||||
x11-libs/libXScrnSaver:=
|
||||
x11-libs/libxcb:=
|
||||
"
|
||||
|
||||
COMMON_DEPEND="
|
||||
app-arch/bzip2:=
|
||||
cups? ( >=net-print/cups-1.3.11:= )
|
||||
dev-libs/expat:=
|
||||
dev-libs/glib:2
|
||||
>=dev-libs/libxml2-2.9.4-r3:=[icu]
|
||||
dev-libs/nspr:=
|
||||
>=dev-libs/nss-3.26:=
|
||||
>=media-libs/alsa-lib-1.0.19:=
|
||||
media-libs/fontconfig:=
|
||||
media-libs/freetype:=
|
||||
>=media-libs/harfbuzz-2.4.0:0=[icu(-)]
|
||||
media-libs/libjpeg-turbo:=
|
||||
media-libs/libpng:=
|
||||
system-libvpx? ( >=media-libs/libvpx-1.8.2:=[postproc,svc] )
|
||||
pulseaudio? ( media-sound/pulseaudio:= )
|
||||
system-ffmpeg? (
|
||||
>=media-video/ffmpeg-4:=
|
||||
|| (
|
||||
media-video/ffmpeg[-samba]
|
||||
>=net-fs/samba-4.5.10-r1[-debug(-)]
|
||||
)
|
||||
>=media-libs/opus-1.3.1:=
|
||||
)
|
||||
sys-apps/dbus:=
|
||||
sys-apps/pciutils:=
|
||||
virtual/udev
|
||||
x11-libs/cairo:=
|
||||
x11-libs/gdk-pixbuf:2
|
||||
x11-libs/pango:=
|
||||
media-libs/flac:=
|
||||
>=media-libs/libwebp-0.4.0:=
|
||||
sys-libs/zlib:=[minizip]
|
||||
kerberos? ( virtual/krb5 )
|
||||
vaapi? ( x11-libs/libva:= )
|
||||
ozone? (
|
||||
!headless? (
|
||||
${COMMON_X_DEPEND}
|
||||
x11-libs/gtk+:3[wayland?,X]
|
||||
wayland? (
|
||||
dev-libs/wayland:=
|
||||
dev-libs/libffi:=
|
||||
x11-libs/libdrm:=
|
||||
x11-libs/libxkbcommon:=
|
||||
)
|
||||
)
|
||||
)
|
||||
!ozone? (
|
||||
>=app-accessibility/at-spi2-atk-2.26:2
|
||||
>=app-accessibility/at-spi2-core-2.26:2
|
||||
>=dev-libs/atk-2.26
|
||||
x11-libs/gtk+:3[X]
|
||||
${COMMON_X_DEPEND}
|
||||
)
|
||||
"
|
||||
# For nvidia-drivers blocker, see bug #413637 .
|
||||
RDEPEND="${COMMON_DEPEND}
|
||||
x11-misc/xdg-utils
|
||||
virtual/opengl
|
||||
virtual/ttf-fonts
|
||||
selinux? ( sec-policy/selinux-chromium )
|
||||
tcmalloc? ( !<x11-drivers/nvidia-drivers-331.20 )
|
||||
"
|
||||
DEPEND="${COMMON_DEPEND}
|
||||
"
|
||||
# dev-vcs/git - https://bugs.gentoo.org/593476
|
||||
BDEPEND="
|
||||
${PYTHON_DEPS}
|
||||
>=app-arch/gzip-1.7
|
||||
app-arch/unzip
|
||||
dev-lang/perl
|
||||
>=dev-util/gn-0.1726
|
||||
dev-vcs/git
|
||||
>=dev-util/gperf-3.0.3
|
||||
>=dev-util/ninja-1.7.2
|
||||
>=net-libs/nodejs-7.6.0[inspector]
|
||||
sys-apps/hwids[usb(+)]
|
||||
>=sys-devel/bison-2.4.3
|
||||
sys-devel/flex
|
||||
virtual/pkgconfig
|
||||
closure-compile? ( virtual/jre )
|
||||
"
|
||||
|
||||
: ${CHROMIUM_FORCE_CLANG=no}
|
||||
: ${CHROMIUM_FORCE_LIBCXX=no}
|
||||
|
||||
if [[ ${CHROMIUM_FORCE_CLANG} == yes ]]; then
|
||||
BDEPEND+=" >=sys-devel/clang-9"
|
||||
fi
|
||||
|
||||
if [[ ${CHROMIUM_FORCE_LIBCXX} == yes ]]; then
|
||||
RDEPEND+=" >=sys-libs/libcxx-9"
|
||||
DEPEND+=" >=sys-libs/libcxx-9"
|
||||
else
|
||||
COMMON_DEPEND="
|
||||
app-arch/snappy:=
|
||||
dev-libs/libxslt:=
|
||||
>=dev-libs/re2-0.2019.08.01:=
|
||||
>=media-libs/openh264-1.6.0:=
|
||||
system-icu? ( >=dev-libs/icu-67.1:= )
|
||||
"
|
||||
RDEPEND+="${COMMON_DEPEND}"
|
||||
DEPEND+="${COMMON_DEPEND}"
|
||||
fi
|
||||
|
||||
if ! has chromium_pkg_die ${EBUILD_DEATH_HOOKS}; then
|
||||
EBUILD_DEATH_HOOKS+=" chromium_pkg_die";
|
||||
fi
|
||||
|
||||
DISABLE_AUTOFORMATTING="yes"
|
||||
DOC_CONTENTS="
|
||||
Some web pages may require additional fonts to display properly.
|
||||
Try installing some of the following packages if some characters
|
||||
are not displayed properly:
|
||||
- media-fonts/arphicfonts
|
||||
- media-fonts/droid
|
||||
- media-fonts/ipamonafont
|
||||
- media-fonts/noto
|
||||
- media-fonts/ja-ipafonts
|
||||
- media-fonts/takao-fonts
|
||||
- media-fonts/wqy-microhei
|
||||
- media-fonts/wqy-zenhei
|
||||
|
||||
To fix broken icons on the Downloads page, you should install an icon
|
||||
theme that covers the appropriate MIME types, and configure this as your
|
||||
GTK+ icon theme.
|
||||
|
||||
For native file dialogs in KDE, install kde-apps/kdialog.
|
||||
|
||||
To make password storage work with your desktop environment you may
|
||||
have install one of the supported credentials management applications:
|
||||
- app-crypt/libsecret (GNOME)
|
||||
- kde-frameworks/kwallet (KDE)
|
||||
If you have one of above packages installed, but don't want to use
|
||||
them in Chromium, then add --password-store=basic to CHROMIUM_FLAGS
|
||||
in /etc/chromium/default.
|
||||
"
|
||||
|
||||
PATCHES=(
|
||||
"${FILESDIR}/chromium-84-mediaalloc.patch"
|
||||
"${FILESDIR}/chromium-83-vaapi.patch"
|
||||
"${FILESDIR}/chromium-84-pipewire.patch"
|
||||
)
|
||||
|
||||
pre_build_checks() {
|
||||
if [[ ${MERGE_TYPE} != binary ]]; then
|
||||
local -x CPP="$(tc-getCXX) -E"
|
||||
if tc-is-gcc && ! ver_test "$(gcc-version)" -ge 9.2; then
|
||||
die "At least gcc 9.2 is required"
|
||||
fi
|
||||
# component build hangs with tcmalloc enabled due to sandbox issue, bug #695976.
|
||||
if has usersandbox ${FEATURES} && use tcmalloc && use component-build; then
|
||||
die "Component build with tcmalloc requires FEATURES=-usersandbox."
|
||||
fi
|
||||
if [[ ${CHROMIUM_FORCE_CLANG} == yes ]] || tc-is-clang; then
|
||||
if use component-build; then
|
||||
die "Component build with clang requires fuzzer headers."
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check build requirements, bug #541816 and bug #471810 .
|
||||
CHECKREQS_MEMORY="3G"
|
||||
CHECKREQS_DISK_BUILD="7G"
|
||||
if ( shopt -s extglob; is-flagq '-g?(gdb)?([1-9])' ); then
|
||||
if use custom-cflags || use component-build; then
|
||||
CHECKREQS_DISK_BUILD="25G"
|
||||
fi
|
||||
if ! use component-build; then
|
||||
CHECKREQS_MEMORY="16G"
|
||||
fi
|
||||
fi
|
||||
check-reqs_pkg_setup
|
||||
}
|
||||
|
||||
pkg_pretend() {
|
||||
pre_build_checks
|
||||
}
|
||||
|
||||
pkg_setup() {
|
||||
pre_build_checks
|
||||
|
||||
chromium_suid_sandbox_check_kernel_config
|
||||
}
|
||||
|
||||
src_prepare() {
|
||||
# Calling this here supports resumption via FEATURES=keepwork
|
||||
python_setup
|
||||
|
||||
eapply "${WORKDIR}/patches"
|
||||
|
||||
default
|
||||
|
||||
mkdir -p third_party/node/linux/node-linux-x64/bin || die
|
||||
ln -s "${EPREFIX}"/usr/bin/node third_party/node/linux/node-linux-x64/bin/node || die
|
||||
|
||||
local keeplibs=(
|
||||
base/third_party/cityhash
|
||||
base/third_party/double_conversion
|
||||
base/third_party/dynamic_annotations
|
||||
base/third_party/icu
|
||||
base/third_party/nspr
|
||||
base/third_party/superfasthash
|
||||
base/third_party/symbolize
|
||||
base/third_party/valgrind
|
||||
base/third_party/xdg_mime
|
||||
base/third_party/xdg_user_dirs
|
||||
buildtools/third_party/libc++
|
||||
buildtools/third_party/libc++abi
|
||||
chrome/third_party/mozilla_security_manager
|
||||
courgette/third_party
|
||||
net/third_party/mozilla_security_manager
|
||||
net/third_party/nss
|
||||
net/third_party/quic
|
||||
net/third_party/uri_template
|
||||
third_party/abseil-cpp
|
||||
third_party/angle
|
||||
third_party/angle/src/common/third_party/base
|
||||
third_party/angle/src/common/third_party/smhasher
|
||||
third_party/angle/src/common/third_party/xxhash
|
||||
third_party/angle/src/third_party/compiler
|
||||
third_party/angle/src/third_party/libXNVCtrl
|
||||
third_party/angle/src/third_party/trace_event
|
||||
third_party/angle/src/third_party/volk
|
||||
third_party/angle/third_party/glslang
|
||||
third_party/angle/third_party/spirv-headers
|
||||
third_party/angle/third_party/spirv-tools
|
||||
third_party/angle/third_party/vulkan-headers
|
||||
third_party/angle/third_party/vulkan-loader
|
||||
third_party/angle/third_party/vulkan-tools
|
||||
third_party/angle/third_party/vulkan-validation-layers
|
||||
third_party/apple_apsl
|
||||
third_party/axe-core
|
||||
third_party/blink
|
||||
third_party/boringssl
|
||||
third_party/boringssl/src/third_party/fiat
|
||||
third_party/breakpad
|
||||
third_party/breakpad/breakpad/src/third_party/curl
|
||||
third_party/brotli
|
||||
third_party/cacheinvalidation
|
||||
third_party/catapult
|
||||
third_party/catapult/common/py_vulcanize/third_party/rcssmin
|
||||
third_party/catapult/common/py_vulcanize/third_party/rjsmin
|
||||
third_party/catapult/third_party/beautifulsoup4
|
||||
third_party/catapult/third_party/html5lib-python
|
||||
third_party/catapult/third_party/polymer
|
||||
third_party/catapult/third_party/six
|
||||
third_party/catapult/tracing/third_party/d3
|
||||
third_party/catapult/tracing/third_party/gl-matrix
|
||||
third_party/catapult/tracing/third_party/jpeg-js
|
||||
third_party/catapult/tracing/third_party/jszip
|
||||
third_party/catapult/tracing/third_party/mannwhitneyu
|
||||
third_party/catapult/tracing/third_party/oboe
|
||||
third_party/catapult/tracing/third_party/pako
|
||||
third_party/ced
|
||||
third_party/cld_3
|
||||
third_party/closure_compiler
|
||||
third_party/crashpad
|
||||
third_party/crashpad/crashpad/third_party/lss
|
||||
third_party/crashpad/crashpad/third_party/zlib
|
||||
third_party/crc32c
|
||||
third_party/cros_system_api
|
||||
third_party/dav1d
|
||||
third_party/dawn
|
||||
third_party/depot_tools
|
||||
third_party/devscripts
|
||||
third_party/devtools-frontend
|
||||
third_party/devtools-frontend/src/front_end/third_party/acorn
|
||||
third_party/devtools-frontend/src/front_end/third_party/codemirror
|
||||
third_party/devtools-frontend/src/front_end/third_party/fabricjs
|
||||
third_party/devtools-frontend/src/front_end/third_party/lighthouse
|
||||
third_party/devtools-frontend/src/front_end/third_party/wasmparser
|
||||
third_party/devtools-frontend/src/third_party
|
||||
third_party/dom_distiller_js
|
||||
third_party/emoji-segmenter
|
||||
third_party/flatbuffers
|
||||
third_party/freetype
|
||||
third_party/libgifcodec
|
||||
third_party/glslang
|
||||
third_party/google_input_tools
|
||||
third_party/google_input_tools/third_party/closure_library
|
||||
third_party/google_input_tools/third_party/closure_library/third_party/closure
|
||||
third_party/googletest
|
||||
third_party/harfbuzz-ng/utils
|
||||
third_party/hunspell
|
||||
third_party/iccjpeg
|
||||
third_party/inspector_protocol
|
||||
third_party/jinja2
|
||||
third_party/jsoncpp
|
||||
third_party/jstemplate
|
||||
third_party/khronos
|
||||
third_party/leveldatabase
|
||||
third_party/libXNVCtrl
|
||||
third_party/libaddressinput
|
||||
third_party/libaom
|
||||
third_party/libaom/source/libaom/third_party/vector
|
||||
third_party/libaom/source/libaom/third_party/x86inc
|
||||
third_party/libavif
|
||||
third_party/libjingle
|
||||
third_party/libphonenumber
|
||||
third_party/libsecret
|
||||
third_party/libsrtp
|
||||
third_party/libsync
|
||||
third_party/libudev
|
||||
third_party/libwebm
|
||||
third_party/libxml/chromium
|
||||
third_party/libyuv
|
||||
third_party/llvm
|
||||
third_party/lottie
|
||||
third_party/lss
|
||||
third_party/lzma_sdk
|
||||
third_party/mako
|
||||
third_party/markupsafe
|
||||
third_party/mesa
|
||||
third_party/metrics_proto
|
||||
third_party/modp_b64
|
||||
third_party/nasm
|
||||
third_party/node
|
||||
third_party/node/node_modules/polymer-bundler/lib/third_party/UglifyJS2
|
||||
third_party/one_euro_filter
|
||||
third_party/openscreen
|
||||
third_party/openscreen/src/third_party/mozilla
|
||||
third_party/openscreen/src/third_party/tinycbor/src/src
|
||||
third_party/ots
|
||||
third_party/pdfium
|
||||
third_party/pdfium/third_party/agg23
|
||||
third_party/pdfium/third_party/base
|
||||
third_party/pdfium/third_party/bigint
|
||||
third_party/pdfium/third_party/freetype
|
||||
third_party/pdfium/third_party/lcms
|
||||
third_party/pdfium/third_party/libopenjpeg20
|
||||
third_party/pdfium/third_party/libpng16
|
||||
third_party/pdfium/third_party/libtiff
|
||||
third_party/pdfium/third_party/skia_shared
|
||||
third_party/perfetto
|
||||
third_party/pffft
|
||||
third_party/ply
|
||||
third_party/polymer
|
||||
third_party/private-join-and-compute
|
||||
third_party/protobuf
|
||||
third_party/protobuf/third_party/six
|
||||
third_party/pyjson5
|
||||
third_party/qcms
|
||||
third_party/rnnoise
|
||||
third_party/s2cellid
|
||||
third_party/schema_org
|
||||
third_party/simplejson
|
||||
third_party/skia
|
||||
third_party/skia/include/third_party/skcms
|
||||
third_party/skia/include/third_party/vulkan
|
||||
third_party/skia/third_party/skcms
|
||||
third_party/skia/third_party/vulkan
|
||||
third_party/smhasher
|
||||
third_party/spirv-headers
|
||||
third_party/SPIRV-Tools
|
||||
third_party/sqlite
|
||||
third_party/swiftshader
|
||||
third_party/swiftshader/third_party/astc-encoder
|
||||
third_party/swiftshader/third_party/llvm-7.0
|
||||
third_party/swiftshader/third_party/llvm-subzero
|
||||
third_party/swiftshader/third_party/marl
|
||||
third_party/swiftshader/third_party/subzero
|
||||
third_party/swiftshader/third_party/SPIRV-Headers/include/spirv/unified1
|
||||
third_party/unrar
|
||||
third_party/usrsctp
|
||||
third_party/vulkan
|
||||
third_party/web-animations-js
|
||||
third_party/webdriver
|
||||
third_party/webrtc
|
||||
third_party/webrtc/common_audio/third_party/ooura
|
||||
third_party/webrtc/common_audio/third_party/spl_sqrt_floor
|
||||
third_party/webrtc/modules/third_party/fft
|
||||
third_party/webrtc/modules/third_party/g711
|
||||
third_party/webrtc/modules/third_party/g722
|
||||
third_party/webrtc/rtc_base/third_party/base64
|
||||
third_party/webrtc/rtc_base/third_party/sigslot
|
||||
third_party/widevine
|
||||
third_party/woff2
|
||||
third_party/wuffs
|
||||
third_party/zlib/google
|
||||
tools/grit/third_party/six
|
||||
url/third_party/mozilla
|
||||
v8/src/third_party/siphash
|
||||
v8/src/third_party/valgrind
|
||||
v8/src/third_party/utf8-decoder
|
||||
v8/third_party/inspector_protocol
|
||||
v8/third_party/v8
|
||||
|
||||
# gyp -> gn leftovers
|
||||
base/third_party/libevent
|
||||
third_party/adobe
|
||||
third_party/speech-dispatcher
|
||||
third_party/usb_ids
|
||||
third_party/xdg-utils
|
||||
)
|
||||
if ! use system-ffmpeg; then
|
||||
keeplibs+=( third_party/ffmpeg third_party/opus )
|
||||
fi
|
||||
if ! use system-icu; then
|
||||
keeplibs+=( third_party/icu )
|
||||
fi
|
||||
if ! use system-libvpx; then
|
||||
keeplibs+=( third_party/libvpx )
|
||||
keeplibs+=( third_party/libvpx/source/libvpx/third_party/x86inc )
|
||||
|
||||
# we need to generate ppc64 stuff because upstream does not ship it yet
|
||||
# it has to be done before unbundling.
|
||||
if use ppc64; then
|
||||
pushd third_party/libvpx >/dev/null || die
|
||||
mkdir -p source/config/linux/ppc64 || die
|
||||
./generate_gni.sh || die
|
||||
popd >/dev/null || die
|
||||
fi
|
||||
fi
|
||||
if use tcmalloc; then
|
||||
keeplibs+=( third_party/tcmalloc )
|
||||
fi
|
||||
if use ozone && use wayland && ! use headless ; then
|
||||
keeplibs+=( third_party/wayland )
|
||||
fi
|
||||
if [[ ${CHROMIUM_FORCE_LIBCXX} == yes ]]; then
|
||||
keeplibs+=( third_party/libxml )
|
||||
keeplibs+=( third_party/libxslt )
|
||||
keeplibs+=( third_party/openh264 )
|
||||
keeplibs+=( third_party/re2 )
|
||||
keeplibs+=( third_party/snappy )
|
||||
if use system-icu; then
|
||||
keeplibs+=( third_party/icu )
|
||||
fi
|
||||
fi
|
||||
# Remove most bundled libraries. Some are still needed.
|
||||
build/linux/unbundle/remove_bundled_libraries.py "${keeplibs[@]}" --do-remove || die
|
||||
}
|
||||
|
||||
src_configure() {
|
||||
# Calling this here supports resumption via FEATURES=keepwork
|
||||
python_setup
|
||||
|
||||
local myconf_gn=""
|
||||
|
||||
# Make sure the build system will use the right tools, bug #340795.
|
||||
tc-export AR CC CXX NM
|
||||
|
||||
if [[ ${CHROMIUM_FORCE_CLANG} == yes ]] && ! tc-is-clang; then
|
||||
# Force clang since gcc is pretty broken at the moment.
|
||||
CC=${CHOST}-clang
|
||||
CXX=${CHOST}-clang++
|
||||
strip-unsupported-flags
|
||||
fi
|
||||
|
||||
if tc-is-clang; then
|
||||
myconf_gn+=" is_clang=true clang_use_chrome_plugins=false"
|
||||
else
|
||||
if [[ ${CHROMIUM_FORCE_LIBCXX} == yes ]]; then
|
||||
die "Compiling with sys-libs/libcxx requires clang."
|
||||
fi
|
||||
myconf_gn+=" is_clang=false"
|
||||
fi
|
||||
|
||||
# Define a custom toolchain for GN
|
||||
myconf_gn+=" custom_toolchain=\"//build/toolchain/linux/unbundle:default\""
|
||||
|
||||
if tc-is-cross-compiler; then
|
||||
tc-export BUILD_{AR,CC,CXX,NM}
|
||||
myconf_gn+=" host_toolchain=\"//build/toolchain/linux/unbundle:host\""
|
||||
myconf_gn+=" v8_snapshot_toolchain=\"//build/toolchain/linux/unbundle:host\""
|
||||
else
|
||||
myconf_gn+=" host_toolchain=\"//build/toolchain/linux/unbundle:default\""
|
||||
fi
|
||||
|
||||
# GN needs explicit config for Debug/Release as opposed to inferring it from build directory.
|
||||
myconf_gn+=" is_debug=false"
|
||||
|
||||
# Component build isn't generally intended for use by end users. It's mostly useful
|
||||
# for development and debugging.
|
||||
myconf_gn+=" is_component_build=$(usex component-build true false)"
|
||||
|
||||
myconf_gn+=" use_allocator=$(usex tcmalloc \"tcmalloc\" \"none\")"
|
||||
|
||||
# Disable nacl, we can't build without pnacl (http://crbug.com/269560).
|
||||
myconf_gn+=" enable_nacl=false"
|
||||
|
||||
# Use system-provided libraries.
|
||||
# TODO: freetype -- remove sources (https://bugs.chromium.org/p/pdfium/issues/detail?id=733).
|
||||
# TODO: use_system_hunspell (upstream changes needed).
|
||||
# TODO: use_system_libsrtp (bug #459932).
|
||||
# TODO: use_system_protobuf (bug #525560).
|
||||
# TODO: use_system_ssl (http://crbug.com/58087).
|
||||
# TODO: use_system_sqlite (http://crbug.com/22208).
|
||||
|
||||
# libevent: https://bugs.gentoo.org/593458
|
||||
local gn_system_libraries=(
|
||||
flac
|
||||
fontconfig
|
||||
freetype
|
||||
# Need harfbuzz_from_pkgconfig target
|
||||
#harfbuzz-ng
|
||||
libdrm
|
||||
libjpeg
|
||||
libpng
|
||||
libwebp
|
||||
zlib
|
||||
)
|
||||
if use system-ffmpeg; then
|
||||
gn_system_libraries+=( ffmpeg opus )
|
||||
fi
|
||||
if use system-icu; then
|
||||
gn_system_libraries+=( icu )
|
||||
fi
|
||||
if use system-libvpx; then
|
||||
gn_system_libraries+=( libvpx )
|
||||
fi
|
||||
if [[ ${CHROMIUM_FORCE_LIBCXX} != yes ]]; then
|
||||
# unbundle only without libc++, because libc++ is not fully ABI compatible with libstdc++
|
||||
gn_system_libraries+=( libxml )
|
||||
gn_system_libraries+=( libxslt )
|
||||
gn_system_libraries+=( openh264 )
|
||||
gn_system_libraries+=( re2 )
|
||||
gn_system_libraries+=( snappy )
|
||||
fi
|
||||
build/linux/unbundle/replace_gn_files.py --system-libraries "${gn_system_libraries[@]}" || die
|
||||
|
||||
# See dependency logic in third_party/BUILD.gn
|
||||
myconf_gn+=" use_system_harfbuzz=true"
|
||||
|
||||
# Disable deprecated libgnome-keyring dependency, bug #713012
|
||||
myconf_gn+=" use_gnome_keyring=false"
|
||||
|
||||
# Optional dependencies.
|
||||
myconf_gn+=" closure_compile=$(usex closure-compile true false)"
|
||||
myconf_gn+=" enable_hangout_services_extension=$(usex hangouts true false)"
|
||||
myconf_gn+=" enable_widevine=$(usex widevine true false)"
|
||||
myconf_gn+=" use_cups=$(usex cups true false)"
|
||||
myconf_gn+=" use_kerberos=$(usex kerberos true false)"
|
||||
myconf_gn+=" use_pulseaudio=$(usex pulseaudio true false)"
|
||||
myconf_gn+=" use_vaapi=$(usex vaapi true false)"
|
||||
|
||||
# TODO: link_pulseaudio=true for GN.
|
||||
|
||||
myconf_gn+=" fieldtrial_testing_like_official_build=true"
|
||||
|
||||
# Never use bundled gold binary. Disable gold linker flags for now.
|
||||
# Do not use bundled clang.
|
||||
# Trying to use gold results in linker crash.
|
||||
myconf_gn+=" use_gold=false use_sysroot=false use_custom_libcxx=false"
|
||||
|
||||
# Disable forced lld, bug 641556
|
||||
myconf_gn+=" use_lld=false"
|
||||
|
||||
ffmpeg_branding="$(usex proprietary-codecs Chrome Chromium)"
|
||||
myconf_gn+=" proprietary_codecs=$(usex proprietary-codecs true false)"
|
||||
myconf_gn+=" ffmpeg_branding=\"${ffmpeg_branding}\""
|
||||
|
||||
# Set up Google API keys, see http://www.chromium.org/developers/how-tos/api-keys .
|
||||
# Note: these are for Gentoo use ONLY. For your own distribution,
|
||||
# please get your own set of keys. Feel free to contact chromium@gentoo.org
|
||||
# for more info.
|
||||
local google_api_key="AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc"
|
||||
local google_default_client_id="329227923882.apps.googleusercontent.com"
|
||||
local google_default_client_secret="vgKG0NNv7GoDpbtoFNLxCUXu"
|
||||
myconf_gn+=" google_api_key=\"${google_api_key}\""
|
||||
myconf_gn+=" google_default_client_id=\"${google_default_client_id}\""
|
||||
myconf_gn+=" google_default_client_secret=\"${google_default_client_secret}\""
|
||||
local myarch="$(tc-arch)"
|
||||
|
||||
# Avoid CFLAGS problems, bug #352457, bug #390147.
|
||||
if ! use custom-cflags; then
|
||||
replace-flags "-Os" "-O2"
|
||||
strip-flags
|
||||
|
||||
# Debug info section overflows without component build
|
||||
# Prevent linker from running out of address space, bug #471810 .
|
||||
if ! use component-build || use x86; then
|
||||
filter-flags "-g*"
|
||||
fi
|
||||
|
||||
# Prevent libvpx build failures. Bug 530248, 544702, 546984.
|
||||
if [[ ${myarch} == amd64 || ${myarch} == x86 ]]; then
|
||||
filter-flags -mno-mmx -mno-sse2 -mno-ssse3 -mno-sse4.1 -mno-avx -mno-avx2 -mno-fma -mno-fma4
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ${CHROMIUM_FORCE_LIBCXX} == yes ]]; then
|
||||
append-flags -stdlib=libc++
|
||||
append-ldflags -stdlib=libc++
|
||||
fi
|
||||
|
||||
if [[ $myarch = amd64 ]] ; then
|
||||
myconf_gn+=" target_cpu=\"x64\""
|
||||
ffmpeg_target_arch=x64
|
||||
elif [[ $myarch = x86 ]] ; then
|
||||
myconf_gn+=" target_cpu=\"x86\""
|
||||
ffmpeg_target_arch=ia32
|
||||
|
||||
# This is normally defined by compiler_cpu_abi in
|
||||
# build/config/compiler/BUILD.gn, but we patch that part out.
|
||||
append-flags -msse2 -mfpmath=sse -mmmx
|
||||
elif [[ $myarch = arm64 ]] ; then
|
||||
myconf_gn+=" target_cpu=\"arm64\""
|
||||
ffmpeg_target_arch=arm64
|
||||
elif [[ $myarch = arm ]] ; then
|
||||
myconf_gn+=" target_cpu=\"arm\""
|
||||
ffmpeg_target_arch=$(usex cpu_flags_arm_neon arm-neon arm)
|
||||
elif [[ $myarch = ppc64 ]] ; then
|
||||
myconf_gn+=" target_cpu=\"ppc64\""
|
||||
ffmpeg_target_arch=ppc64
|
||||
else
|
||||
die "Failed to determine target arch, got '$myarch'."
|
||||
fi
|
||||
|
||||
# Make sure that -Werror doesn't get added to CFLAGS by the build system.
|
||||
# Depending on GCC version the warnings are different and we don't want
|
||||
# the build to fail because of that.
|
||||
myconf_gn+=" treat_warnings_as_errors=false"
|
||||
|
||||
# Disable fatal linker warnings, bug 506268.
|
||||
myconf_gn+=" fatal_linker_warnings=false"
|
||||
|
||||
# Bug 491582.
|
||||
export TMPDIR="${WORKDIR}/temp"
|
||||
mkdir -p -m 755 "${TMPDIR}" || die
|
||||
|
||||
# https://bugs.gentoo.org/654216
|
||||
addpredict /dev/dri/ #nowarn
|
||||
|
||||
#if ! use system-ffmpeg; then
|
||||
if false; then
|
||||
local build_ffmpeg_args=""
|
||||
if use pic && [[ "${ffmpeg_target_arch}" == "ia32" ]]; then
|
||||
build_ffmpeg_args+=" --disable-asm"
|
||||
fi
|
||||
|
||||
# Re-configure bundled ffmpeg. See bug #491378 for example reasons.
|
||||
einfo "Configuring bundled ffmpeg..."
|
||||
pushd third_party/ffmpeg > /dev/null || die
|
||||
chromium/scripts/build_ffmpeg.py linux ${ffmpeg_target_arch} \
|
||||
--branding ${ffmpeg_branding} -- ${build_ffmpeg_args} || die
|
||||
chromium/scripts/copy_config.sh || die
|
||||
chromium/scripts/generate_gn.py || die
|
||||
popd > /dev/null || die
|
||||
fi
|
||||
|
||||
# Chromium relies on this, but was disabled in >=clang-10, crbug.com/1042470
|
||||
append-cxxflags $(test-flags-CXX -flax-vector-conversions=all)
|
||||
|
||||
# Explicitly disable ICU data file support for system-icu builds.
|
||||
if use system-icu; then
|
||||
myconf_gn+=" icu_use_data_file=false"
|
||||
fi
|
||||
|
||||
# Use bundled xcb-proto, bug #727000
|
||||
myconf_gn+=" xcbproto_path=\"${WORKDIR}/xcb-proto-${XCB_PROTO_VERSION}/src\""
|
||||
|
||||
# Enable ozone support
|
||||
if use ozone; then
|
||||
myconf_gn+=" use_ozone=true ozone_auto_platforms=false"
|
||||
myconf_gn+=" ozone_platform_headless=true"
|
||||
if ! use headless; then
|
||||
myconf_gn+=" use_system_libdrm=true"
|
||||
myconf_gn+=" ozone_platform_wayland=$(usex wayland true false)"
|
||||
myconf_gn+=" ozone_platform_x11=true"
|
||||
myconf_gn+=" ozone_platform_headless=true"
|
||||
if use wayland; then
|
||||
myconf_gn+=" use_system_minigbm=true use_xkbcommon=true"
|
||||
myconf_gn+=" ozone_platform=\"wayland\""
|
||||
else
|
||||
myconf_gn+=" ozone_platform=\"x11\""
|
||||
fi
|
||||
else
|
||||
myconf_gn+=" ozone_platform=\"headless\""
|
||||
fi
|
||||
fi
|
||||
|
||||
if use screencast; then
|
||||
myconf_gn+=" rtc_use_pipewire=true rtc_link_pipewire=true"
|
||||
myconf_gn+=" rtc_use_pipewire_version=\"0.3\""
|
||||
fi
|
||||
|
||||
einfo "Configuring Chromium..."
|
||||
set -- gn gen --args="${myconf_gn} ${EXTRA_GN}" out/Release
|
||||
echo "$@"
|
||||
"$@" || die
|
||||
}
|
||||
|
||||
src_compile() {
|
||||
if use memsaver; then
|
||||
# limit number of jobs based on available memory:
|
||||
mem=$(grep ^MemTotal /proc/meminfo | awk '{print $2}')
|
||||
jobs=$((mem/2500000))
|
||||
if [ ${jobs} -lt 1 ]; then
|
||||
jobs=-j1
|
||||
else
|
||||
jobs=-j${jobs}
|
||||
fi
|
||||
einfo "Using jobs setting of ${jobs}"
|
||||
else
|
||||
jobs=""
|
||||
einfo "Using default Portage jobs setting."
|
||||
fi
|
||||
# Final link uses lots of file descriptors.
|
||||
ulimit -n 2048
|
||||
|
||||
# Calling this here supports resumption via FEATURES=keepwork
|
||||
python_setup
|
||||
|
||||
# https://bugs.gentoo.org/717456
|
||||
# Use bundled xcb-proto, because system xcb-proto doesn't have Python 2.7 support
|
||||
local -x PYTHONPATH="${WORKDIR}/setuptools-44.1.0:${WORKDIR}/xcb-proto-${XCB_PROTO_VERSION}${PYTHONPATH+:}${PYTHONPATH}"
|
||||
|
||||
#"${EPYTHON}" tools/clang/scripts/update.py --force-local-build --gcc-toolchain /usr --skip-checkout --use-system-cmake --without-android || die
|
||||
|
||||
# Build mksnapshot and pax-mark it.
|
||||
local x
|
||||
for x in mksnapshot v8_context_snapshot_generator; do
|
||||
if tc-is-cross-compiler; then
|
||||
eninja ${jobs} -C out/Release "host/${x}"
|
||||
pax-mark m "out/Release/host/${x}"
|
||||
else
|
||||
eninja ${jobs} -C out/Release "${x}"
|
||||
pax-mark m "out/Release/${x}"
|
||||
fi
|
||||
done
|
||||
|
||||
eninja ${jobs} -C out/Release chrome chromedriver
|
||||
use suid && eninja ${jobs} -C out/Release chrome_sandbox
|
||||
|
||||
pax-mark m out/Release/chrome
|
||||
|
||||
# Build manpage; bug #684550
|
||||
sed -e 's|@@PACKAGE@@|chromium-browser|g;
|
||||
s|@@MENUNAME@@|Chromium|g;' \
|
||||
chrome/app/resources/manpage.1.in > \
|
||||
out/Release/chromium-browser.1 || die
|
||||
|
||||
# Build desktop file; bug #706786
|
||||
sed -e 's|@@MENUNAME@@|Chromium|g;
|
||||
s|@@USR_BIN_SYMLINK_NAME@@|chromium-browser|g;
|
||||
s|@@PACKAGE@@|chromium-browser|g;
|
||||
s|\(^Exec=\)/usr/bin/|\1|g;' \
|
||||
chrome/installer/linux/common/desktop.template > \
|
||||
out/Release/chromium-browser-chromium.desktop || die
|
||||
}
|
||||
|
||||
src_install() {
|
||||
local CHROMIUM_HOME="/usr/$(get_libdir)/chromium-browser"
|
||||
exeinto "${CHROMIUM_HOME}"
|
||||
doexe out/Release/chrome
|
||||
|
||||
if use suid; then
|
||||
newexe out/Release/chrome_sandbox chrome-sandbox
|
||||
fperms 4755 "${CHROMIUM_HOME}/chrome-sandbox"
|
||||
fi
|
||||
|
||||
doexe out/Release/chromedriver
|
||||
|
||||
ozone_auto_session () {
|
||||
use ozone && use wayland && ! use headless && echo true || echo false
|
||||
}
|
||||
local sedargs=( -e
|
||||
"s:/usr/lib/:/usr/$(get_libdir)/:g;
|
||||
s:@@OZONE_AUTO_SESSION@@:$(ozone_auto_session):g"
|
||||
)
|
||||
sed "${sedargs[@]}" "${FILESDIR}/chromium-launcher-r4.sh" > chromium-launcher.sh || die
|
||||
doexe chromium-launcher.sh
|
||||
|
||||
if use vaapi; then
|
||||
insinto /usr/share/drirc.d
|
||||
newins "${FILESDIR}"/01-chromium.conf 01-chromium.conf
|
||||
fi
|
||||
|
||||
# It is important that we name the target "chromium-browser",
|
||||
# xdg-utils expect it; bug #355517.
|
||||
dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-browser
|
||||
# keep the old symlink around for consistency
|
||||
dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium
|
||||
|
||||
dosym "${CHROMIUM_HOME}/chromedriver" /usr/bin/chromedriver
|
||||
|
||||
# Allow users to override command-line options, bug #357629.
|
||||
insinto /etc/chromium
|
||||
newins "${FILESDIR}/chromium.default" "default"
|
||||
|
||||
pushd out/Release/locales > /dev/null || die
|
||||
chromium_remove_language_paks
|
||||
popd
|
||||
|
||||
insinto "${CHROMIUM_HOME}"
|
||||
doins out/Release/*.bin
|
||||
doins out/Release/*.pak
|
||||
(
|
||||
shopt -s nullglob
|
||||
local files=(out/Release/*.so)
|
||||
[[ ${#files[@]} -gt 0 ]] && doins "${files[@]}"
|
||||
)
|
||||
|
||||
if ! use system-icu; then
|
||||
doins out/Release/icudtl.dat
|
||||
fi
|
||||
|
||||
doins -r out/Release/locales
|
||||
doins -r out/Release/resources
|
||||
|
||||
if [[ -d out/Release/swiftshader ]]; then
|
||||
insinto "${CHROMIUM_HOME}/swiftshader"
|
||||
doins out/Release/swiftshader/*.so
|
||||
fi
|
||||
|
||||
# Install icons
|
||||
local branding size
|
||||
for size in 16 24 32 48 64 128 256 ; do
|
||||
case ${size} in
|
||||
16|32) branding="chrome/app/theme/default_100_percent/chromium" ;;
|
||||
*) branding="chrome/app/theme/chromium" ;;
|
||||
esac
|
||||
newicon -s ${size} "${branding}/product_logo_${size}.png" \
|
||||
chromium-browser.png
|
||||
done
|
||||
|
||||
# Install desktop entry
|
||||
domenu out/Release/chromium-browser-chromium.desktop
|
||||
|
||||
# Install GNOME default application entry (bug #303100).
|
||||
insinto /usr/share/gnome-control-center/default-apps
|
||||
newins "${FILESDIR}"/chromium-browser.xml chromium-browser.xml
|
||||
|
||||
# Install manpage; bug #684550
|
||||
doman out/Release/chromium-browser.1
|
||||
dosym chromium-browser.1 /usr/share/man/man1/chromium.1
|
||||
|
||||
readme.gentoo_create_doc
|
||||
}
|
||||
|
||||
pkg_postrm() {
|
||||
xdg_icon_cache_update
|
||||
xdg_desktop_database_update
|
||||
}
|
||||
|
||||
pkg_postinst() {
|
||||
xdg_icon_cache_update
|
||||
xdg_desktop_database_update
|
||||
readme.gentoo_print_elog
|
||||
}
|
33
www-client/chromium/files/01-chromium.conf
Normal file
33
www-client/chromium/files/01-chromium.conf
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" standalone="yes"?>
|
||||
<!--
|
||||
|
||||
============================================
|
||||
Application bugs worked around in this file:
|
||||
============================================
|
||||
|
||||
* Work around misrendering with Chromium and vaapi on gallium drivers
|
||||
|
||||
-->
|
||||
|
||||
<!DOCTYPE driconf [
|
||||
<!ELEMENT driconf (device+)>
|
||||
<!ELEMENT device (application+)>
|
||||
<!ATTLIST device driver CDATA #IMPLIED>
|
||||
<!ELEMENT application (option+)>
|
||||
<!ATTLIST application name CDATA #REQUIRED
|
||||
executable CDATA #REQUIRED>
|
||||
<!ELEMENT option EMPTY>
|
||||
<!ATTLIST option name CDATA #REQUIRED
|
||||
value CDATA #REQUIRED>
|
||||
]>
|
||||
|
||||
<driconf>
|
||||
<!-- Please always enable app-specific workarounds for all drivers and
|
||||
screens. -->
|
||||
<device>
|
||||
<application name="Chromium" executable="chrome">
|
||||
<option name="allow_rgb10_configs" value="false" />
|
||||
</application>
|
||||
</device>
|
||||
</driconf>
|
||||
|
183
www-client/chromium/files/chromium-83-vaapi.patch
Normal file
183
www-client/chromium/files/chromium-83-vaapi.patch
Normal file
@ -0,0 +1,183 @@
|
||||
From 7cda9be20eedac2f972f4b99d71a7732d87f1b9b Mon Sep 17 00:00:00 2001
|
||||
From: Mike Lothian <mike@fireburn.co.uk>
|
||||
Date: Thu, 23 Apr 2020 09:51:10 +0100
|
||||
Subject: [PATCH] Enable VAVDA, VAVEA and VAJDA on linux with VAAPI only
|
||||
|
||||
This patch contains all the changes necessary to use VA-API along with
|
||||
vaapi-driver to run all media use cases supported with hardware acceleration.
|
||||
|
||||
It is intended to remain as experimental accessible from chrome://flags on linux.
|
||||
It requires libva/intel-vaapi-driver to be installed on the system path where
|
||||
chrome is executed. Other drivers could be tested if available. Flags are
|
||||
kept independent for linux, where this feature has to be enabled before
|
||||
actually using it. This should not change how other OSes use the flags
|
||||
already, the new flags will show at the buttom on the section of unavailable
|
||||
experiments
|
||||
|
||||
The changes cover a range of compiler pre-processor flags to enable the stack.
|
||||
It moves the presandbox operations to the vaapi_wrapper class as the hook function
|
||||
is available there. vaInit will open driver on the correct installed folder.
|
||||
|
||||
chrome flags consolidtation into only two flags for linux. Mjpeg and accelerated
|
||||
video are used. The other flags are kept for ChromeOS and other OSes.
|
||||
|
||||
Developer testing was made on skylake hardware, ChromeOS and Ubuntu.
|
||||
|
||||
BUG=NONE
|
||||
TEST="subjective testing with VAVDA,VAVEA and VAJDA, autotest for encoder"
|
||||
TEST="and decoder hardware accelerated"
|
||||
TEST="have libva/intel-vaapi-driver installed and not installed in the system"
|
||||
TEST="repeat on different hardware families"
|
||||
R=posciak@chromium.org
|
||||
R=kcwu@chromium.org
|
||||
|
||||
Cq-Include-Trybots: master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel
|
||||
Change-Id: Ifbbf5c9e5221a8b5733fc6d4d0cf984a1f103171
|
||||
Signed-off-by: Daniel Charles <daniel.charles@intel.com>
|
||||
---
|
||||
chrome/browser/about_flags.cc | 8 ++++----
|
||||
chrome/browser/flag_descriptions.cc | 9 ++++++---
|
||||
chrome/browser/flag_descriptions.h | 10 ++++++++--
|
||||
gpu/config/software_rendering_list.json | 3 ++-
|
||||
media/gpu/vaapi/vaapi_video_decode_accelerator.cc | 5 +++++
|
||||
5 files changed, 25 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
|
||||
index 65f76461ec12..5820726d7ad5 100644
|
||||
--- a/chrome/browser/about_flags.cc
|
||||
+++ b/chrome/browser/about_flags.cc
|
||||
@@ -2153,7 +2153,7 @@ const FeatureEntry kFeatureEntries[] = {
|
||||
"disable-accelerated-video-decode",
|
||||
flag_descriptions::kAcceleratedVideoDecodeName,
|
||||
flag_descriptions::kAcceleratedVideoDecodeDescription,
|
||||
- kOsMac | kOsWin | kOsCrOS | kOsAndroid,
|
||||
+ kOsMac | kOsWin | kOsCrOS | kOsAndroid | kOsLinux,
|
||||
SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedVideoDecode),
|
||||
},
|
||||
{
|
||||
@@ -2585,12 +2585,12 @@ const FeatureEntry kFeatureEntries[] = {
|
||||
flag_descriptions::kWebXrForceRuntimeDescription, kOsDesktop,
|
||||
MULTI_VALUE_TYPE(kWebXrForceRuntimeChoices)},
|
||||
#endif // ENABLE_VR
|
||||
-#if defined(OS_CHROMEOS)
|
||||
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
|
||||
{"disable-accelerated-mjpeg-decode",
|
||||
flag_descriptions::kAcceleratedMjpegDecodeName,
|
||||
- flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsCrOS,
|
||||
+ flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsCrOS | kOsLinux,
|
||||
SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedMjpegDecode)},
|
||||
-#endif // OS_CHROMEOS
|
||||
+#endif // OS_CHROMEOS | OS_LINUX
|
||||
{"system-keyboard-lock", flag_descriptions::kSystemKeyboardLockName,
|
||||
flag_descriptions::kSystemKeyboardLockDescription, kOsDesktop,
|
||||
FEATURE_VALUE_TYPE(features::kSystemKeyboardLock)},
|
||||
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
|
||||
index e80fab827621..98b36fa0bcca 100644
|
||||
--- a/chrome/browser/flag_descriptions.cc
|
||||
+++ b/chrome/browser/flag_descriptions.cc
|
||||
@@ -2980,16 +2980,19 @@ const char kMetalDescription[] =
|
||||
|
||||
#endif
|
||||
|
||||
-// Chrome OS -------------------------------------------------------------------
|
||||
-
|
||||
-#if defined(OS_CHROMEOS)
|
||||
+// Chrome OS and Linux -------------------------------------------------------------------
|
||||
|
||||
+#if defined(OS_CHROMEOS) || (defined(OS_LINUX) && !defined(OS_ANDROID))
|
||||
const char kAcceleratedMjpegDecodeName[] =
|
||||
"Hardware-accelerated mjpeg decode for captured frame";
|
||||
const char kAcceleratedMjpegDecodeDescription[] =
|
||||
"Enable hardware-accelerated mjpeg decode for captured frame where "
|
||||
"available.";
|
||||
+#endif
|
||||
|
||||
+// Chrome OS -----------------------------------------------------------------------------
|
||||
+
|
||||
+#if defined(OS_CHROMEOS)
|
||||
const char kAggregatedMlAppRankingName[] = "Rank suggested apps with ML.";
|
||||
const char kAggregatedMlAppRankingDescription[] =
|
||||
"Use the aggregated ML model to rank the suggested apps.";
|
||||
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
|
||||
index 7672b58e6a25..a3baa084c5a0 100644
|
||||
--- a/chrome/browser/flag_descriptions.h
|
||||
+++ b/chrome/browser/flag_descriptions.h
|
||||
@@ -1711,13 +1711,19 @@ extern const char kMetalDescription[];
|
||||
|
||||
#endif // defined(OS_MACOSX)
|
||||
|
||||
-// Chrome OS ------------------------------------------------------------------
|
||||
+// Chrome OS and Linux ---------------------------------------------------------
|
||||
|
||||
-#if defined(OS_CHROMEOS)
|
||||
+#if defined(OS_CHROMEOS) || (defined(OS_LINUX) && !defined(OS_ANDROID))
|
||||
|
||||
extern const char kAcceleratedMjpegDecodeName[];
|
||||
extern const char kAcceleratedMjpegDecodeDescription[];
|
||||
|
||||
+#endif
|
||||
+
|
||||
+// Chrome OS -------------------------------------------------------------------
|
||||
+
|
||||
+#if defined(OS_CHROMEOS)
|
||||
+
|
||||
extern const char kAggregatedMlAppRankingName[];
|
||||
extern const char kAggregatedMlAppRankingDescription[];
|
||||
|
||||
diff --git a/gpu/config/software_rendering_list.json b/gpu/config/software_rendering_list.json
|
||||
index 68bed9e49ddf..5e7fe9cf433b 100644
|
||||
--- a/gpu/config/software_rendering_list.json
|
||||
+++ b/gpu/config/software_rendering_list.json
|
||||
@@ -337,11 +337,12 @@
|
||||
},
|
||||
{
|
||||
"id": 48,
|
||||
- "description": "Accelerated video decode is unavailable on Linux",
|
||||
+ "description": "Accelerated VA-API video decode is not supported on NVIDIA platforms",
|
||||
"cr_bugs": [137247, 1032907],
|
||||
"os": {
|
||||
"type": "linux"
|
||||
},
|
||||
+ "vendor_id": "0x10de",
|
||||
"exceptions": [
|
||||
{
|
||||
"machine_model_name": ["Chromecast"]
|
||||
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
|
||||
index 5020b2b8bf96..a6f1d681b851 100644
|
||||
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
|
||||
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
|
||||
@@ -66,6 +66,7 @@ void ReportToUMA(VAVDADecoderFailure failure) {
|
||||
VAVDA_DECODER_FAILURES_MAX + 1);
|
||||
}
|
||||
|
||||
+#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
|
||||
// Returns true if the CPU is an Intel Gemini Lake or later (including Kaby
|
||||
// Lake) Cpu platform id's are referenced from the following file in kernel
|
||||
// source arch/x86/include/asm/intel-family.h
|
||||
@@ -78,6 +79,7 @@ bool IsGeminiLakeOrLater() {
|
||||
cpuid.model() >= kGeminiLakeModelId;
|
||||
return is_geminilake_or_later;
|
||||
}
|
||||
+#endif
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -1155,6 +1157,8 @@ VaapiVideoDecodeAccelerator::DecideBufferAllocationMode() {
|
||||
if (output_mode_ == VideoDecodeAccelerator::Config::OutputMode::IMPORT)
|
||||
return BufferAllocationMode::kNormal;
|
||||
|
||||
+#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
|
||||
+ // Move this to chromeOs only as it is causing problem in some intel linux drivers
|
||||
// On Gemini Lake, Kaby Lake and later we can pass to libva the client's
|
||||
// PictureBuffers to decode onto, which skips the use of the Vpp unit and its
|
||||
// associated format reconciliation copy, avoiding all internal buffer
|
||||
@@ -1171,6 +1175,7 @@ VaapiVideoDecodeAccelerator::DecideBufferAllocationMode() {
|
||||
num_extra_pics_ = 3;
|
||||
return BufferAllocationMode::kNone;
|
||||
}
|
||||
+#endif
|
||||
|
||||
// If we're here, we have to use the Vpp unit and allocate buffers for
|
||||
// |decoder_|; usually we'd have to allocate the |decoder_|s
|
||||
--
|
||||
2.26.2
|
41
www-client/chromium/files/chromium-84-mediaalloc.patch
Normal file
41
www-client/chromium/files/chromium-84-mediaalloc.patch
Normal file
@ -0,0 +1,41 @@
|
||||
https://bugs.chromium.org/p/chromium/issues/detail?id=1095962
|
||||
|
||||
--- /media/base/media.cc
|
||||
+++ /media/base/media.cc
|
||||
@@ -2,6 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
+#include <limits>
|
||||
+
|
||||
#include "media/base/media.h"
|
||||
|
||||
#include "base/allocator/buildflags.h"
|
||||
@@ -41,7 +43,7 @@
|
||||
|
||||
#if BUILDFLAG(USE_ALLOCATOR_SHIM)
|
||||
// Remove allocation limit from ffmpeg, so calls go down to shim layer.
|
||||
- av_max_alloc(0);
|
||||
+ av_max_alloc(std::numeric_limits<size_t>::max());
|
||||
#endif // BUILDFLAG(USE_ALLOCATOR_SHIM)
|
||||
|
||||
#endif // BUILDFLAG(ENABLE_FFMPEG)
|
||||
--- /third_party/ffmpeg/chromium/dllmain.cc
|
||||
+++ /third_party/ffmpeg/chromium/dllmain.cc
|
||||
@@ -3,6 +3,7 @@
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include <intrin.h>
|
||||
+#include <limits>
|
||||
#include <new.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
@@ -28,7 +29,7 @@
|
||||
if (reason == DLL_PROCESS_ATTACH) {
|
||||
DisableThreadLibraryCalls(instance);
|
||||
// Remove allocation limit from ffmpeg, so calls go down to shim layer.
|
||||
- av_max_alloc(0);
|
||||
+ av_max_alloc(std::numeric_limits<size_t>::max());
|
||||
// Enable OOM crashes in the shim for all malloc calls that fail.
|
||||
_set_new_mode(1);
|
||||
_set_new_handler(&OnNoMemory);
|
792
www-client/chromium/files/chromium-84-pipewire.patch
Normal file
792
www-client/chromium/files/chromium-84-pipewire.patch
Normal file
@ -0,0 +1,792 @@
|
||||
Index: chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/BUILD.gn
|
||||
===================================================================
|
||||
--- chromium-83.0.4103.116.orig/third_party/webrtc/modules/desktop_capture/BUILD.gn
|
||||
+++ chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/BUILD.gn
|
||||
@@ -196,7 +196,7 @@ if (is_linux) {
|
||||
|
||||
if (rtc_link_pipewire) {
|
||||
pkg_config("pipewire") {
|
||||
- packages = [ "libpipewire-0.2" ]
|
||||
+ packages = [ "libpipewire-${rtc_use_pipewire_version}", "libspa-${rtc_use_spa_version}" ]
|
||||
}
|
||||
} else {
|
||||
# When libpipewire is not directly linked, use stubs to allow for dlopening of
|
||||
Index: chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
||||
===================================================================
|
||||
--- chromium-83.0.4103.116.orig/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
||||
+++ chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
||||
@@ -14,8 +14,11 @@
|
||||
#include <glib-object.h>
|
||||
#include <spa/param/format-utils.h>
|
||||
#include <spa/param/props.h>
|
||||
-#include <spa/param/video/raw-utils.h>
|
||||
-#include <spa/support/type-map.h>
|
||||
+
|
||||
+#include <linux/dma-buf.h>
|
||||
+#include <sys/mman.h>
|
||||
+#include <sys/ioctl.h>
|
||||
+#include <sys/syscall.h>
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
@@ -51,31 +54,35 @@ const char kPipeWireLib[] = "libpipewire
|
||||
#endif
|
||||
|
||||
// static
|
||||
-void BaseCapturerPipeWire::OnStateChanged(void* data,
|
||||
- pw_remote_state old_state,
|
||||
- pw_remote_state state,
|
||||
- const char* error_message) {
|
||||
- BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data);
|
||||
- RTC_DCHECK(that);
|
||||
+void BaseCapturerPipeWire::SyncDmaBuf(int fd, uint64_t start_or_end) {
|
||||
+ struct dma_buf_sync sync = { 0 };
|
||||
|
||||
- switch (state) {
|
||||
- case PW_REMOTE_STATE_ERROR:
|
||||
- RTC_LOG(LS_ERROR) << "PipeWire remote state error: " << error_message;
|
||||
- break;
|
||||
- case PW_REMOTE_STATE_CONNECTED:
|
||||
- RTC_LOG(LS_INFO) << "PipeWire remote state: connected.";
|
||||
- that->CreateReceivingStream();
|
||||
- break;
|
||||
- case PW_REMOTE_STATE_CONNECTING:
|
||||
- RTC_LOG(LS_INFO) << "PipeWire remote state: connecting.";
|
||||
+ sync.flags = start_or_end | DMA_BUF_SYNC_READ;
|
||||
+
|
||||
+ while(true) {
|
||||
+ int ret;
|
||||
+ ret = ioctl (fd, DMA_BUF_IOCTL_SYNC, &sync);
|
||||
+ if (ret == -1 && errno == EINTR) {
|
||||
+ continue;
|
||||
+ } else if (ret == -1) {
|
||||
+ RTC_LOG(LS_ERROR) << "Failed to synchronize DMA buffer: " << g_strerror(errno);
|
||||
break;
|
||||
- case PW_REMOTE_STATE_UNCONNECTED:
|
||||
- RTC_LOG(LS_INFO) << "PipeWire remote state: unconnected.";
|
||||
+ } else {
|
||||
break;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
+void BaseCapturerPipeWire::OnCoreError(void *data,
|
||||
+ uint32_t id,
|
||||
+ int seq,
|
||||
+ int res,
|
||||
+ const char *message) {
|
||||
+ RTC_LOG(LS_ERROR) << "core error: " << message;
|
||||
+}
|
||||
+
|
||||
+// static
|
||||
void BaseCapturerPipeWire::OnStreamStateChanged(void* data,
|
||||
pw_stream_state old_state,
|
||||
pw_stream_state state,
|
||||
@@ -87,76 +94,54 @@ void BaseCapturerPipeWire::OnStreamState
|
||||
case PW_STREAM_STATE_ERROR:
|
||||
RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message;
|
||||
break;
|
||||
- case PW_STREAM_STATE_CONFIGURE:
|
||||
- pw_stream_set_active(that->pw_stream_, true);
|
||||
- break;
|
||||
- case PW_STREAM_STATE_UNCONNECTED:
|
||||
- case PW_STREAM_STATE_CONNECTING:
|
||||
- case PW_STREAM_STATE_READY:
|
||||
case PW_STREAM_STATE_PAUSED:
|
||||
case PW_STREAM_STATE_STREAMING:
|
||||
+ case PW_STREAM_STATE_UNCONNECTED:
|
||||
+ case PW_STREAM_STATE_CONNECTING:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
-void BaseCapturerPipeWire::OnStreamFormatChanged(void* data,
|
||||
- const struct spa_pod* format) {
|
||||
+void BaseCapturerPipeWire::OnStreamParamChanged(void *data, uint32_t id,
|
||||
+ const struct spa_pod *format) {
|
||||
BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data);
|
||||
RTC_DCHECK(that);
|
||||
|
||||
- RTC_LOG(LS_INFO) << "PipeWire stream format changed.";
|
||||
+ RTC_LOG(LS_INFO) << "PipeWire stream param changed.";
|
||||
|
||||
- if (!format) {
|
||||
- pw_stream_finish_format(that->pw_stream_, /*res=*/0, /*params=*/nullptr,
|
||||
- /*n_params=*/0);
|
||||
+ if (!format || id != SPA_PARAM_Format) {
|
||||
return;
|
||||
}
|
||||
|
||||
- that->spa_video_format_ = new spa_video_info_raw();
|
||||
- spa_format_video_raw_parse(format, that->spa_video_format_,
|
||||
- &that->pw_type_->format_video);
|
||||
+ spa_format_video_raw_parse(format, &that->spa_video_format_);
|
||||
|
||||
- auto width = that->spa_video_format_->size.width;
|
||||
- auto height = that->spa_video_format_->size.height;
|
||||
+ auto width = that->spa_video_format_.size.width;
|
||||
+ auto height = that->spa_video_format_.size.height;
|
||||
auto stride = SPA_ROUND_UP_N(width * kBytesPerPixel, 4);
|
||||
auto size = height * stride;
|
||||
|
||||
+ that->desktop_size_ = DesktopSize(width, height);
|
||||
+
|
||||
uint8_t buffer[1024] = {};
|
||||
auto builder = spa_pod_builder{buffer, sizeof(buffer)};
|
||||
|
||||
// Setup buffers and meta header for new format.
|
||||
- const struct spa_pod* params[2];
|
||||
- params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_object(
|
||||
- &builder,
|
||||
- // id to enumerate buffer requirements
|
||||
- that->pw_core_type_->param.idBuffers,
|
||||
- that->pw_core_type_->param_buffers.Buffers,
|
||||
- // Size: specified as integer (i) and set to specified size
|
||||
- ":", that->pw_core_type_->param_buffers.size, "i", size,
|
||||
- // Stride: specified as integer (i) and set to specified stride
|
||||
- ":", that->pw_core_type_->param_buffers.stride, "i", stride,
|
||||
- // Buffers: specifies how many buffers we want to deal with, set as
|
||||
- // integer (i) where preferred number is 8, then allowed number is defined
|
||||
- // as range (r) from min and max values and it is undecided (u) to allow
|
||||
- // negotiation
|
||||
- ":", that->pw_core_type_->param_buffers.buffers, "iru", 8,
|
||||
- SPA_POD_PROP_MIN_MAX(1, 32),
|
||||
- // Align: memory alignment of the buffer, set as integer (i) to specified
|
||||
- // value
|
||||
- ":", that->pw_core_type_->param_buffers.align, "i", 16));
|
||||
- params[1] = reinterpret_cast<spa_pod*>(spa_pod_builder_object(
|
||||
- &builder,
|
||||
- // id to enumerate supported metadata
|
||||
- that->pw_core_type_->param.idMeta, that->pw_core_type_->param_meta.Meta,
|
||||
- // Type: specified as id or enum (I)
|
||||
- ":", that->pw_core_type_->param_meta.type, "I",
|
||||
- that->pw_core_type_->meta.Header,
|
||||
- // Size: size of the metadata, specified as integer (i)
|
||||
- ":", that->pw_core_type_->param_meta.size, "i",
|
||||
- sizeof(struct spa_meta_header)));
|
||||
-
|
||||
- pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/2);
|
||||
+ const struct spa_pod* params[3];
|
||||
+ params[0] = reinterpret_cast<spa_pod *>(spa_pod_builder_add_object(&builder,
|
||||
+ SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
|
||||
+ SPA_PARAM_BUFFERS_size, SPA_POD_Int(size),
|
||||
+ SPA_PARAM_BUFFERS_stride, SPA_POD_Int(stride),
|
||||
+ SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 1, 32)));
|
||||
+ params[1] = reinterpret_cast<spa_pod *>(spa_pod_builder_add_object(&builder,
|
||||
+ SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
|
||||
+ SPA_PARAM_META_type, SPA_POD_Id(SPA_META_Header),
|
||||
+ SPA_PARAM_META_size, SPA_POD_Int(sizeof(struct spa_meta_header))));
|
||||
+ params[2] = reinterpret_cast<spa_pod *>(spa_pod_builder_add_object(&builder,
|
||||
+ SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
|
||||
+ SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
|
||||
+ SPA_PARAM_META_size, SPA_POD_Int (sizeof(struct spa_meta_region))));
|
||||
+ pw_stream_update_params(that->pw_stream_, params, 3);
|
||||
}
|
||||
|
||||
// static
|
||||
@@ -164,15 +149,25 @@ void BaseCapturerPipeWire::OnStreamProce
|
||||
BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data);
|
||||
RTC_DCHECK(that);
|
||||
|
||||
- pw_buffer* buf = nullptr;
|
||||
+ struct pw_buffer *next_buffer;
|
||||
+ struct pw_buffer *buffer = nullptr;
|
||||
|
||||
- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) {
|
||||
+ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
|
||||
+ while (next_buffer) {
|
||||
+ buffer = next_buffer;
|
||||
+ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
|
||||
+
|
||||
+ if (next_buffer)
|
||||
+ pw_stream_queue_buffer (that->pw_stream_, buffer);
|
||||
+ }
|
||||
+
|
||||
+ if (!buffer) {
|
||||
return;
|
||||
}
|
||||
|
||||
- that->HandleBuffer(buf);
|
||||
+ that->HandleBuffer(buffer);
|
||||
|
||||
- pw_stream_queue_buffer(that->pw_stream_, buf);
|
||||
+ pw_stream_queue_buffer(that->pw_stream_, buffer);
|
||||
}
|
||||
|
||||
BaseCapturerPipeWire::BaseCapturerPipeWire(CaptureSourceType source_type)
|
||||
@@ -183,38 +178,22 @@ BaseCapturerPipeWire::~BaseCapturerPipeW
|
||||
pw_thread_loop_stop(pw_main_loop_);
|
||||
}
|
||||
|
||||
- if (pw_type_) {
|
||||
- delete pw_type_;
|
||||
- }
|
||||
-
|
||||
- if (spa_video_format_) {
|
||||
- delete spa_video_format_;
|
||||
- }
|
||||
-
|
||||
if (pw_stream_) {
|
||||
pw_stream_destroy(pw_stream_);
|
||||
}
|
||||
|
||||
- if (pw_remote_) {
|
||||
- pw_remote_destroy(pw_remote_);
|
||||
+ if (pw_core_) {
|
||||
+ pw_core_disconnect(pw_core_);
|
||||
}
|
||||
|
||||
- if (pw_core_) {
|
||||
- pw_core_destroy(pw_core_);
|
||||
+ if (pw_context_) {
|
||||
+ pw_context_destroy(pw_context_);
|
||||
}
|
||||
|
||||
if (pw_main_loop_) {
|
||||
pw_thread_loop_destroy(pw_main_loop_);
|
||||
}
|
||||
|
||||
- if (pw_loop_) {
|
||||
- pw_loop_destroy(pw_loop_);
|
||||
- }
|
||||
-
|
||||
- if (current_frame_) {
|
||||
- free(current_frame_);
|
||||
- }
|
||||
-
|
||||
if (start_request_signal_id_) {
|
||||
g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_);
|
||||
}
|
||||
@@ -284,27 +263,35 @@ void BaseCapturerPipeWire::InitPipeWire(
|
||||
|
||||
pw_init(/*argc=*/nullptr, /*argc=*/nullptr);
|
||||
|
||||
- pw_loop_ = pw_loop_new(/*properties=*/nullptr);
|
||||
- pw_main_loop_ = pw_thread_loop_new(pw_loop_, "pipewire-main-loop");
|
||||
-
|
||||
- pw_core_ = pw_core_new(pw_loop_, /*properties=*/nullptr);
|
||||
- pw_core_type_ = pw_core_get_type(pw_core_);
|
||||
- pw_remote_ = pw_remote_new(pw_core_, nullptr, /*user_data_size=*/0);
|
||||
+ pw_main_loop_ = pw_thread_loop_new("pipewire-main-loop", nullptr);
|
||||
+ pw_context_ = pw_context_new(pw_thread_loop_get_loop(pw_main_loop_), nullptr, 0);
|
||||
+ if (!pw_context_) {
|
||||
+ RTC_LOG(LS_ERROR) << "Failed to create PipeWire context";
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
- InitPipeWireTypes();
|
||||
+ pw_core_ = pw_context_connect(pw_context_, nullptr, 0);
|
||||
+ if (!pw_core_) {
|
||||
+ RTC_LOG(LS_ERROR) << "Failed to connect PipeWire context";
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
// Initialize event handlers, remote end and stream-related.
|
||||
- pw_remote_events_.version = PW_VERSION_REMOTE_EVENTS;
|
||||
- pw_remote_events_.state_changed = &OnStateChanged;
|
||||
+ pw_core_events_.version = PW_VERSION_CORE_EVENTS;
|
||||
+ pw_core_events_.error = &OnCoreError;
|
||||
|
||||
pw_stream_events_.version = PW_VERSION_STREAM_EVENTS;
|
||||
pw_stream_events_.state_changed = &OnStreamStateChanged;
|
||||
- pw_stream_events_.format_changed = &OnStreamFormatChanged;
|
||||
+ pw_stream_events_.param_changed = &OnStreamParamChanged;
|
||||
pw_stream_events_.process = &OnStreamProcess;
|
||||
|
||||
- pw_remote_add_listener(pw_remote_, &spa_remote_listener_, &pw_remote_events_,
|
||||
- this);
|
||||
- pw_remote_connect_fd(pw_remote_, pw_fd_);
|
||||
+ pw_core_add_listener(pw_core_, &spa_core_listener_, &pw_core_events_, this);
|
||||
+
|
||||
+ pw_stream_ = CreateReceivingStream();
|
||||
+ if (!pw_stream_) {
|
||||
+ RTC_LOG(LS_ERROR) << "Failed to create PipeWire stream";
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
if (pw_thread_loop_start(pw_main_loop_) < 0) {
|
||||
RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop";
|
||||
@@ -314,81 +301,131 @@ void BaseCapturerPipeWire::InitPipeWire(
|
||||
RTC_LOG(LS_INFO) << "PipeWire remote opened.";
|
||||
}
|
||||
|
||||
-void BaseCapturerPipeWire::InitPipeWireTypes() {
|
||||
- spa_type_map* map = pw_core_type_->map;
|
||||
- pw_type_ = new PipeWireType();
|
||||
-
|
||||
- spa_type_media_type_map(map, &pw_type_->media_type);
|
||||
- spa_type_media_subtype_map(map, &pw_type_->media_subtype);
|
||||
- spa_type_format_video_map(map, &pw_type_->format_video);
|
||||
- spa_type_video_format_map(map, &pw_type_->video_format);
|
||||
-}
|
||||
-
|
||||
-void BaseCapturerPipeWire::CreateReceivingStream() {
|
||||
+pw_stream* BaseCapturerPipeWire::CreateReceivingStream() {
|
||||
spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1};
|
||||
- spa_rectangle pwScreenBounds =
|
||||
- spa_rectangle{static_cast<uint32_t>(desktop_size_.width()),
|
||||
- static_cast<uint32_t>(desktop_size_.height())};
|
||||
-
|
||||
- spa_fraction pwFrameRateMin = spa_fraction{0, 1};
|
||||
- spa_fraction pwFrameRateMax = spa_fraction{60, 1};
|
||||
-
|
||||
- pw_properties* reuseProps =
|
||||
- pw_properties_new_string("pipewire.client.reuse=1");
|
||||
- pw_stream_ = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps);
|
||||
+ spa_rectangle pwMaxScreenBounds = spa_rectangle{INT32_MAX, INT32_MAX};
|
||||
+ auto stream = pw_stream_new(pw_core_, "webrtc-pipewire-stream", nullptr);
|
||||
+
|
||||
+ if (!stream) {
|
||||
+ RTC_LOG(LS_ERROR) << "Could not create receiving stream.";
|
||||
+ return nullptr;
|
||||
+ }
|
||||
|
||||
uint8_t buffer[1024] = {};
|
||||
- const spa_pod* params[1];
|
||||
- spa_pod_builder builder = spa_pod_builder{buffer, sizeof(buffer)};
|
||||
- params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_object(
|
||||
- &builder,
|
||||
- // id to enumerate formats
|
||||
- pw_core_type_->param.idEnumFormat, pw_core_type_->spa_format, "I",
|
||||
- pw_type_->media_type.video, "I", pw_type_->media_subtype.raw,
|
||||
- // Video format: specified as id or enum (I), preferred format is BGRx,
|
||||
- // then allowed formats are enumerated (e) and the format is undecided (u)
|
||||
- // to allow negotiation
|
||||
- ":", pw_type_->format_video.format, "Ieu", pw_type_->video_format.BGRx,
|
||||
- SPA_POD_PROP_ENUM(2, pw_type_->video_format.RGBx,
|
||||
- pw_type_->video_format.BGRx),
|
||||
- // Video size: specified as rectangle (R), preferred size is specified as
|
||||
- // first parameter, then allowed size is defined as range (r) from min and
|
||||
- // max values and the format is undecided (u) to allow negotiation
|
||||
- ":", pw_type_->format_video.size, "Rru", &pwScreenBounds, 2,
|
||||
- &pwMinScreenBounds, &pwScreenBounds,
|
||||
- // Frame rate: specified as fraction (F) and set to minimum frame rate
|
||||
- // value
|
||||
- ":", pw_type_->format_video.framerate, "F", &pwFrameRateMin,
|
||||
- // Max frame rate: specified as fraction (F), preferred frame rate is set
|
||||
- // to maximum value, then allowed frame rate is defined as range (r) from
|
||||
- // min and max values and it is undecided (u) to allow negotiation
|
||||
- ":", pw_type_->format_video.max_framerate, "Fru", &pwFrameRateMax, 2,
|
||||
- &pwFrameRateMin, &pwFrameRateMax));
|
||||
+ const spa_pod* params[2];
|
||||
+ spa_pod_builder builder = SPA_POD_BUILDER_INIT(buffer, sizeof (buffer));
|
||||
+
|
||||
+ params[0] = reinterpret_cast<spa_pod *>(spa_pod_builder_add_object(&builder,
|
||||
+ SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
|
||||
+ SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_video),
|
||||
+ SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw),
|
||||
+ SPA_FORMAT_VIDEO_format, SPA_POD_CHOICE_ENUM_Id(5, SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_RGBx, SPA_VIDEO_FORMAT_RGBA,
|
||||
+ SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_BGRA),
|
||||
+ SPA_FORMAT_VIDEO_size, SPA_POD_CHOICE_RANGE_Rectangle(&pwMinScreenBounds,
|
||||
+ &pwMinScreenBounds,
|
||||
+ &pwMaxScreenBounds),
|
||||
+ 0));
|
||||
+ pw_stream_add_listener(stream, &spa_stream_listener_, &pw_stream_events_, this);
|
||||
|
||||
- pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_,
|
||||
- this);
|
||||
pw_stream_flags flags = static_cast<pw_stream_flags>(
|
||||
- PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE |
|
||||
- PW_STREAM_FLAG_MAP_BUFFERS);
|
||||
- if (pw_stream_connect(pw_stream_, PW_DIRECTION_INPUT, /*port_path=*/nullptr,
|
||||
- flags, params,
|
||||
- /*n_params=*/1) != 0) {
|
||||
+ PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE);
|
||||
+
|
||||
+ if (pw_stream_connect(stream, PW_DIRECTION_INPUT, pw_stream_node_id_, PW_STREAM_FLAG_AUTOCONNECT, params, 1) != 0) {
|
||||
RTC_LOG(LS_ERROR) << "Could not connect receiving stream.";
|
||||
portal_init_failed_ = true;
|
||||
- return;
|
||||
}
|
||||
+
|
||||
+ return stream;
|
||||
}
|
||||
|
||||
void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
|
||||
+ struct spa_meta_region* video_crop;
|
||||
spa_buffer* spaBuffer = buffer->buffer;
|
||||
- void* src = nullptr;
|
||||
+ uint8_t *map = nullptr;
|
||||
+ uint8_t* src = nullptr;
|
||||
+ uint8_t* dst = nullptr;
|
||||
+
|
||||
+ if (spaBuffer->datas[0].chunk->size == 0) {
|
||||
+ map = nullptr;
|
||||
+ src = nullptr;
|
||||
+ } else if (spaBuffer->datas[0].type == SPA_DATA_MemFd) {
|
||||
+ map = static_cast<uint8_t*>(mmap(
|
||||
+ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
|
||||
+ PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0));
|
||||
+
|
||||
+ if (map == MAP_FAILED) {
|
||||
+ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno);
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
- if (!(src = spaBuffer->datas[0].data)) {
|
||||
+ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
|
||||
+ } else if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) {
|
||||
+ int fd;
|
||||
+ fd = spaBuffer->datas[0].fd;
|
||||
+
|
||||
+ map = static_cast<uint8_t*>(mmap(
|
||||
+ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
|
||||
+ PROT_READ, MAP_PRIVATE, fd, 0));
|
||||
+
|
||||
+ if (map == MAP_FAILED) {
|
||||
+ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ SyncDmaBuf(fd, DMA_BUF_SYNC_START);
|
||||
+
|
||||
+ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
|
||||
+ } else if (spaBuffer->datas[0].type == SPA_DATA_MemPtr) {
|
||||
+ map = nullptr;
|
||||
+ src = static_cast<uint8_t*>(spaBuffer->datas[0].data);
|
||||
+ } else {
|
||||
return;
|
||||
}
|
||||
|
||||
- uint32_t maxSize = spaBuffer->datas[0].maxsize;
|
||||
- int32_t srcStride = spaBuffer->datas[0].chunk->stride;
|
||||
+ if (!src) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ DesktopSize prev_crop_size = DesktopSize(0, 0);
|
||||
+ if (video_crop_size_initialized_) {
|
||||
+ prev_crop_size = video_crop_size_;
|
||||
+ }
|
||||
+
|
||||
+ if ((video_crop = static_cast<struct spa_meta_region*>(
|
||||
+ spa_buffer_find_meta_data(spaBuffer, SPA_META_VideoCrop, sizeof(*video_crop))))) {
|
||||
+ RTC_DCHECK(video_crop->region.size.width <= desktop_size_.width() &&
|
||||
+ video_crop->region.size.height <= desktop_size_.height());
|
||||
+ if ((video_crop->region.size.width != desktop_size_.width() ||
|
||||
+ video_crop->region.size.height != desktop_size_.height()) && video_crop->region.size.width && video_crop->region.size.height) {
|
||||
+ video_crop_size_ = DesktopSize(video_crop->region.size.width, video_crop->region.size.height);
|
||||
+ video_crop_size_initialized_ = true;
|
||||
+ } else {
|
||||
+ video_crop_size_initialized_ = false;
|
||||
+ }
|
||||
+ } else {
|
||||
+ video_crop_size_initialized_ = false;
|
||||
+ }
|
||||
+
|
||||
+ size_t frame_size;
|
||||
+ if (video_crop_size_initialized_) {
|
||||
+ frame_size =
|
||||
+ video_crop_size_.width() * video_crop_size_.height() * kBytesPerPixel;
|
||||
+ } else {
|
||||
+ frame_size =
|
||||
+ desktop_size_.width() * desktop_size_.height() * kBytesPerPixel;
|
||||
+ }
|
||||
+
|
||||
+ if (!current_frame_ ||
|
||||
+ (video_crop_size_initialized_ && !video_crop_size_.equals(prev_crop_size))) {
|
||||
+ current_frame_ = std::make_unique<uint8_t[]>(frame_size);
|
||||
+ }
|
||||
+ RTC_DCHECK(current_frame_ != nullptr);
|
||||
+
|
||||
+ const int32_t dstStride = video_crop_size_initialized_
|
||||
+ ? video_crop_size_.width() * kBytesPerPixel
|
||||
+ : desktop_size_.width() * kBytesPerPixel;
|
||||
+ const int32_t srcStride = spaBuffer->datas[0].chunk->stride;
|
||||
+
|
||||
if (srcStride != (desktop_size_.width() * kBytesPerPixel)) {
|
||||
RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: "
|
||||
<< srcStride
|
||||
@@ -397,21 +434,40 @@ void BaseCapturerPipeWire::HandleBuffer(
|
||||
return;
|
||||
}
|
||||
|
||||
- if (!current_frame_) {
|
||||
- current_frame_ = static_cast<uint8_t*>(malloc(maxSize));
|
||||
+ dst = current_frame_.get();
|
||||
+
|
||||
+ // Adjust source content based on crop video position
|
||||
+ if (video_crop_size_initialized_ &&
|
||||
+ (video_crop->region.position.y + video_crop_size_.height() <= desktop_size_.height())) {
|
||||
+ for (int i = 0; i < video_crop->region.position.y; ++i) {
|
||||
+ src += srcStride;
|
||||
+ }
|
||||
+ }
|
||||
+ const int xOffset =
|
||||
+ video_crop_size_initialized_ && (video_crop->region.position.x + video_crop_size_.width() <=
|
||||
+ desktop_size_.width())
|
||||
+ ? video_crop->region.position.x * kBytesPerPixel
|
||||
+ : 0;
|
||||
+ const int height = video_crop_size_initialized_ ? video_crop_size_.height() : desktop_size_.height();
|
||||
+ for (int i = 0; i < height; ++i) {
|
||||
+ // Adjust source content based on crop video position if needed
|
||||
+ src += xOffset;
|
||||
+ std::memcpy(dst, src, dstStride);
|
||||
+ // If both sides decided to go with the RGBx format we need to convert it to
|
||||
+ // BGRx to match color format expected by WebRTC.
|
||||
+ if (spa_video_format_.format == SPA_VIDEO_FORMAT_RGBx ||
|
||||
+ spa_video_format_.format == SPA_VIDEO_FORMAT_RGBA) {
|
||||
+ ConvertRGBxToBGRx(dst, dstStride);
|
||||
+ }
|
||||
+ src += srcStride - xOffset;
|
||||
+ dst += dstStride;
|
||||
}
|
||||
- RTC_DCHECK(current_frame_ != nullptr);
|
||||
|
||||
- // If both sides decided to go with the RGBx format we need to convert it to
|
||||
- // BGRx to match color format expected by WebRTC.
|
||||
- if (spa_video_format_->format == pw_type_->video_format.RGBx) {
|
||||
- uint8_t* tempFrame = static_cast<uint8_t*>(malloc(maxSize));
|
||||
- std::memcpy(tempFrame, src, maxSize);
|
||||
- ConvertRGBxToBGRx(tempFrame, maxSize);
|
||||
- std::memcpy(current_frame_, tempFrame, maxSize);
|
||||
- free(tempFrame);
|
||||
- } else {
|
||||
- std::memcpy(current_frame_, src, maxSize);
|
||||
+ if (map) {
|
||||
+ if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) {
|
||||
+ SyncDmaBuf(spaBuffer->datas[0].fd, DMA_BUF_SYNC_END);
|
||||
+ }
|
||||
+ munmap(map, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -770,10 +826,7 @@ void BaseCapturerPipeWire::OnStartReques
|
||||
g_variant_get(variant, "(u@a{sv})", &stream_id, &options);
|
||||
RTC_DCHECK(options != nullptr);
|
||||
|
||||
- g_variant_lookup(options, "size", "(ii)", &width, &height);
|
||||
-
|
||||
- that->desktop_size_.set(width, height);
|
||||
-
|
||||
+ that->pw_stream_node_id_ = stream_id;
|
||||
g_variant_unref(options);
|
||||
g_variant_unref(variant);
|
||||
}
|
||||
@@ -859,10 +912,15 @@ void BaseCapturerPipeWire::CaptureFrame(
|
||||
return;
|
||||
}
|
||||
|
||||
- std::unique_ptr<DesktopFrame> result(new BasicDesktopFrame(desktop_size_));
|
||||
+ DesktopSize frame_size = desktop_size_;
|
||||
+ if (video_crop_size_initialized_) {
|
||||
+ frame_size = video_crop_size_;
|
||||
+ }
|
||||
+
|
||||
+ std::unique_ptr<DesktopFrame> result(new BasicDesktopFrame(frame_size));
|
||||
result->CopyPixelsFrom(
|
||||
- current_frame_, (desktop_size_.width() * kBytesPerPixel),
|
||||
- DesktopRect::MakeWH(desktop_size_.width(), desktop_size_.height()));
|
||||
+ current_frame_.get(), (frame_size.width() * kBytesPerPixel),
|
||||
+ DesktopRect::MakeWH(frame_size.width(), frame_size.height()));
|
||||
if (!result) {
|
||||
callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
|
||||
return;
|
||||
@@ -887,4 +945,22 @@ bool BaseCapturerPipeWire::SelectSource(
|
||||
return true;
|
||||
}
|
||||
|
||||
+// static
|
||||
+std::unique_ptr<DesktopCapturer>
|
||||
+BaseCapturerPipeWire::CreateRawScreenCapturer(
|
||||
+ const DesktopCaptureOptions& options) {
|
||||
+ std::unique_ptr<BaseCapturerPipeWire> capturer =
|
||||
+ std::make_unique<BaseCapturerPipeWire>(BaseCapturerPipeWire::CaptureSourceType::kAny);
|
||||
+ return std::move(capturer);}
|
||||
+
|
||||
+// static
|
||||
+std::unique_ptr<DesktopCapturer>
|
||||
+BaseCapturerPipeWire::CreateRawWindowCapturer(
|
||||
+ const DesktopCaptureOptions& options) {
|
||||
+
|
||||
+ std::unique_ptr<BaseCapturerPipeWire> capturer =
|
||||
+ std::make_unique<BaseCapturerPipeWire>(BaseCapturerPipeWire::CaptureSourceType::kAny);
|
||||
+ return std::move(capturer);
|
||||
+}
|
||||
+
|
||||
} // namespace webrtc
|
||||
Index: chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
|
||||
===================================================================
|
||||
--- chromium-83.0.4103.116.orig/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
|
||||
+++ chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
|
||||
@@ -16,7 +16,7 @@
|
||||
namespace webrtc {
|
||||
|
||||
WindowCapturerPipeWire::WindowCapturerPipeWire()
|
||||
- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Window) {}
|
||||
+ : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kWindow) {}
|
||||
WindowCapturerPipeWire::~WindowCapturerPipeWire() {}
|
||||
|
||||
// static
|
||||
Index: chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc
|
||||
===================================================================
|
||||
--- chromium-83.0.4103.116.orig/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc
|
||||
+++ chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc
|
||||
@@ -28,7 +28,7 @@ std::unique_ptr<DesktopCapturer> Desktop
|
||||
const DesktopCaptureOptions& options) {
|
||||
#if defined(WEBRTC_USE_PIPEWIRE)
|
||||
if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
|
||||
- return WindowCapturerPipeWire::CreateRawWindowCapturer(options);
|
||||
+ return BaseCapturerPipeWire::CreateRawWindowCapturer(options);
|
||||
}
|
||||
#endif // defined(WEBRTC_USE_PIPEWIRE)
|
||||
|
||||
Index: chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
|
||||
===================================================================
|
||||
--- chromium-83.0.4103.116.orig/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
|
||||
+++ chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
|
||||
@@ -16,7 +16,7 @@
|
||||
namespace webrtc {
|
||||
|
||||
ScreenCapturerPipeWire::ScreenCapturerPipeWire()
|
||||
- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Screen) {}
|
||||
+ : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kScreen) {}
|
||||
ScreenCapturerPipeWire::~ScreenCapturerPipeWire() {}
|
||||
|
||||
// static
|
||||
Index: chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc
|
||||
===================================================================
|
||||
--- chromium-83.0.4103.116.orig/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc
|
||||
+++ chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc
|
||||
@@ -28,8 +28,8 @@ std::unique_ptr<DesktopCapturer> Desktop
|
||||
const DesktopCaptureOptions& options) {
|
||||
#if defined(WEBRTC_USE_PIPEWIRE)
|
||||
if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
|
||||
- return ScreenCapturerPipeWire::CreateRawScreenCapturer(options);
|
||||
- }
|
||||
+ return BaseCapturerPipeWire::CreateRawScreenCapturer(options);
|
||||
+}
|
||||
#endif // defined(WEBRTC_USE_PIPEWIRE)
|
||||
|
||||
#if defined(WEBRTC_USE_X11)
|
||||
Index: chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
|
||||
===================================================================
|
||||
--- chromium-83.0.4103.116.orig/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
|
||||
+++ chromium-83.0.4103.116/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
|
||||
@@ -22,17 +22,13 @@
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
-class PipeWireType {
|
||||
- public:
|
||||
- spa_type_media_type media_type;
|
||||
- spa_type_media_subtype media_subtype;
|
||||
- spa_type_format_video format_video;
|
||||
- spa_type_video_format video_format;
|
||||
-};
|
||||
-
|
||||
class BaseCapturerPipeWire : public DesktopCapturer {
|
||||
public:
|
||||
- enum CaptureSourceType { Screen = 1, Window };
|
||||
+ enum CaptureSourceType : uint32_t {
|
||||
+ kScreen = 0b01,
|
||||
+ kWindow = 0b10,
|
||||
+ kAny = 0b11
|
||||
+ };
|
||||
|
||||
explicit BaseCapturerPipeWire(CaptureSourceType source_type);
|
||||
~BaseCapturerPipeWire() override;
|
||||
@@ -43,28 +39,32 @@ class BaseCapturerPipeWire : public Desk
|
||||
bool GetSourceList(SourceList* sources) override;
|
||||
bool SelectSource(SourceId id) override;
|
||||
|
||||
+ static std::unique_ptr<DesktopCapturer> CreateRawScreenCapturer(
|
||||
+ const DesktopCaptureOptions& options);
|
||||
+
|
||||
+ static std::unique_ptr<DesktopCapturer> CreateRawWindowCapturer(
|
||||
+ const DesktopCaptureOptions& options);
|
||||
+
|
||||
private:
|
||||
// PipeWire types -->
|
||||
+ pw_context* pw_context_ = nullptr;
|
||||
pw_core* pw_core_ = nullptr;
|
||||
- pw_type* pw_core_type_ = nullptr;
|
||||
pw_stream* pw_stream_ = nullptr;
|
||||
- pw_remote* pw_remote_ = nullptr;
|
||||
- pw_loop* pw_loop_ = nullptr;
|
||||
pw_thread_loop* pw_main_loop_ = nullptr;
|
||||
- PipeWireType* pw_type_ = nullptr;
|
||||
|
||||
+ spa_hook spa_core_listener_ = {};
|
||||
spa_hook spa_stream_listener_ = {};
|
||||
- spa_hook spa_remote_listener_ = {};
|
||||
|
||||
+ pw_core_events pw_core_events_ = {};
|
||||
pw_stream_events pw_stream_events_ = {};
|
||||
- pw_remote_events pw_remote_events_ = {};
|
||||
|
||||
- spa_video_info_raw* spa_video_format_ = nullptr;
|
||||
+ struct spa_video_info_raw spa_video_format_;
|
||||
|
||||
+ guint32 pw_stream_node_id_ = 0;
|
||||
gint32 pw_fd_ = -1;
|
||||
|
||||
CaptureSourceType capture_source_type_ =
|
||||
- BaseCapturerPipeWire::CaptureSourceType::Screen;
|
||||
+ BaseCapturerPipeWire::CaptureSourceType::kAny;
|
||||
|
||||
// <-- end of PipeWire types
|
||||
|
||||
@@ -79,33 +79,38 @@ class BaseCapturerPipeWire : public Desk
|
||||
guint sources_request_signal_id_ = 0;
|
||||
guint start_request_signal_id_ = 0;
|
||||
|
||||
+ bool video_crop_size_initialized_ = false;
|
||||
+ DesktopSize video_crop_size_;;
|
||||
DesktopSize desktop_size_ = {};
|
||||
DesktopCaptureOptions options_ = {};
|
||||
|
||||
- uint8_t* current_frame_ = nullptr;
|
||||
+ std::unique_ptr<uint8_t[]> current_frame_;
|
||||
Callback* callback_ = nullptr;
|
||||
|
||||
bool portal_init_failed_ = false;
|
||||
|
||||
void InitPortal();
|
||||
void InitPipeWire();
|
||||
- void InitPipeWireTypes();
|
||||
|
||||
- void CreateReceivingStream();
|
||||
+ pw_stream* CreateReceivingStream();
|
||||
void HandleBuffer(pw_buffer* buffer);
|
||||
|
||||
void ConvertRGBxToBGRx(uint8_t* frame, uint32_t size);
|
||||
|
||||
- static void OnStateChanged(void* data,
|
||||
- pw_remote_state old_state,
|
||||
- pw_remote_state state,
|
||||
- const char* error);
|
||||
+ static void SyncDmaBuf(int fd, uint64_t start_or_end);
|
||||
+ static void OnCoreError(void *data,
|
||||
+ uint32_t id,
|
||||
+ int seq,
|
||||
+ int res,
|
||||
+ const char *message);
|
||||
+ static void OnStreamParamChanged(void *data,
|
||||
+ uint32_t id,
|
||||
+ const struct spa_pod *format);
|
||||
static void OnStreamStateChanged(void* data,
|
||||
pw_stream_state old_state,
|
||||
pw_stream_state state,
|
||||
const char* error_message);
|
||||
|
||||
- static void OnStreamFormatChanged(void* data, const struct spa_pod* format);
|
||||
static void OnStreamProcess(void* data);
|
||||
static void OnNewBuffer(void* data, uint32_t id);
|
||||
|
||||
Index: chromium-83.0.4103.116/third_party/webrtc/webrtc.gni
|
||||
===================================================================
|
||||
--- chromium-83.0.4103.116.orig/third_party/webrtc/webrtc.gni
|
||||
+++ chromium-83.0.4103.116/third_party/webrtc/webrtc.gni
|
||||
@@ -114,6 +114,10 @@ declare_args() {
|
||||
# supported Ubuntu and Debian distributions.
|
||||
rtc_use_pipewire = is_desktop_linux && use_sysroot
|
||||
|
||||
+ # Sets the pipewire pkg-config version to use if rtc_use_pipewire is true
|
||||
+ rtc_use_pipewire_version = "0.3"
|
||||
+ rtc_use_spa_version = "0.2"
|
||||
+
|
||||
# Set this to link PipeWire directly instead of using the dlopen.
|
||||
rtc_link_pipewire = false
|
14
www-client/chromium/files/chromium-browser.xml
Normal file
14
www-client/chromium/files/chromium-browser.xml
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE default-apps SYSTEM "gnome-da-list.dtd">
|
||||
<default-apps>
|
||||
<web-browsers>
|
||||
<web-browser>
|
||||
<name>Chromium</name>
|
||||
<executable>chromium-browser</executable>
|
||||
<command>chromium-browser %s</command>
|
||||
<icon-name>chromium-browser</icon-name>
|
||||
<run-in-terminal>false</run-in-terminal>
|
||||
</web-browser>
|
||||
</web-browsers>
|
||||
</default-apps>
|
53
www-client/chromium/files/chromium-launcher-r4.sh
Executable file
53
www-client/chromium/files/chromium-launcher-r4.sh
Executable file
@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Allow the user to override command-line flags, bug #357629.
|
||||
# This is based on Debian's chromium-browser package, and is intended
|
||||
# to be consistent with Debian.
|
||||
for f in /etc/chromium/*; do
|
||||
[[ -f ${f} ]] && source "${f}"
|
||||
done
|
||||
|
||||
# Prefer user defined CHROMIUM_USER_FLAGS (from env) over system
|
||||
# default CHROMIUM_FLAGS (from /etc/chromium/default).
|
||||
CHROMIUM_FLAGS=${CHROMIUM_USER_FLAGS:-"$CHROMIUM_FLAGS"}
|
||||
|
||||
# Let the wrapped binary know that it has been run through the wrapper
|
||||
export CHROME_WRAPPER=$(readlink -f "$0")
|
||||
|
||||
PROGDIR=${CHROME_WRAPPER%/*}
|
||||
|
||||
case ":$PATH:" in
|
||||
*:$PROGDIR:*)
|
||||
# $PATH already contains $PROGDIR
|
||||
;;
|
||||
*)
|
||||
# Append $PROGDIR to $PATH
|
||||
export PATH="$PATH:$PROGDIR"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ ${EUID} == 0 && -O ${XDG_CONFIG_HOME:-${HOME}} ]]; then
|
||||
# Running as root with HOME owned by root.
|
||||
# Pass --user-data-dir to work around upstream failsafe.
|
||||
CHROMIUM_FLAGS="--user-data-dir=${XDG_CONFIG_HOME:-${HOME}/.config}/chromium
|
||||
${CHROMIUM_FLAGS}"
|
||||
fi
|
||||
|
||||
# Select session type
|
||||
if @@OZONE_AUTO_SESSION@@; then
|
||||
if [[ -z ${XDG_SESSION_TYPE+x} ]]; then
|
||||
if [[ -z ${WAYLAND_DISPLAY+x} ]]; then
|
||||
CHROMIUM_FLAGS="--ozone-platform=x11 ${CHROMIUM_FLAGS}"
|
||||
else
|
||||
CHROMIUM_FLAGS="--ozone-platform=wayland ${CHROMIUM_FLAGS}"
|
||||
fi
|
||||
else
|
||||
CHROMIUM_FLAGS="--ozone-platform=${XDG_SESSION_TYPE} ${CHROMIUM_FLAGS}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Set the .desktop file name
|
||||
export CHROME_DESKTOP="chromium-browser-chromium.desktop"
|
||||
|
||||
exec -a "chromium-browser" "$PROGDIR/chrome" --extra-plugin-dir=/usr/lib/nsbrowser/plugins ${CHROMIUM_FLAGS} "$@"
|
||||
|
5
www-client/chromium/files/chromium.default
Normal file
5
www-client/chromium/files/chromium.default
Normal file
@ -0,0 +1,5 @@
|
||||
# Default settings for chromium. This file is sourced by /bin/bash from
|
||||
# the chromium launcher.
|
||||
|
||||
# Options to pass to chromium.
|
||||
#CHROMIUM_FLAGS=""
|
21
www-client/chromium/metadata.xml
Normal file
21
www-client/chromium/metadata.xml
Normal file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<maintainer type="project">
|
||||
<email>chromium@gentoo.org</email>
|
||||
<name>Chromium in Gentoo Project</name>
|
||||
</maintainer>
|
||||
<use>
|
||||
<flag name="closure-compile">Enable closure type-checking for Chrome's web technology-based UI. Requires Java.</flag>
|
||||
<flag name="component-build">Split build into more shared libraries to speed up linking. Mostly intended for debugging and development, NOT RECOMMENDED for general use.</flag>
|
||||
<flag name="hangouts">Enable support for Google Hangouts features such as screen sharing</flag>
|
||||
<flag name="pic">Disable optimized assembly code that is not PIC friendly</flag>
|
||||
<flag name="proprietary-codecs">Enable proprietary codecs like H.264, MP3</flag>
|
||||
<flag name="suid">Build the SUID sandbox, which is only needed on CONFIG_USER_NS=n kernels</flag>
|
||||
<flag name="system-ffmpeg">Use system ffmpeg instead of the bundled one</flag>
|
||||
<flag name="system-icu">Use system icu instead of the bundled one</flag>
|
||||
<flag name="system-libvpx">Use system libvpx instead of the bundled one</flag>
|
||||
<flag name="tcmalloc">Use bundled tcmalloc instead of system malloc</flag>
|
||||
<flag name="widevine">Unsupported closed-source DRM capability (required by Netflix VOD)</flag>
|
||||
</use>
|
||||
</pkgmetadata>
|
Reference in New Issue
Block a user