tg_owt-9999mva
download
# Copyright 2026 mva
# Distributed under the terms of the Public Domain or CC0 License
EAPI=8
inherit cmake flag-o-matic
DESCRIPTION="WebRTC (video) library (fork) for Telegram clients"
HOMEPAGE="https://github.com/desktop-app/tg_owt"
if [[ ! "${PV}" = 9999* ]]; then
TG_OWT_COMMIT="dc17143230b5519f3c1a8da0079e00566bd4c5a8"
LIBYUV_COMMIT="04821d1e7d60845525e8db55c7bcd41ef5be9406"
LIBSRTP_COMMIT="a566a9cfcd619e8327784aa7cff4a1276dc1e895"
# ABSL_COMMIT="d7aaad83b488fd62bd51c81ecf16cd938532cc0a"
# check https://github.com/desktop-app/tg_owt/tree/master/src periodically for srtp and others commits
SRC_URI="
https://github.com/desktop-app/tg_owt/archive/${TG_OWT_COMMIT}.tar.gz -> ${P}.tar.gz
https://github.com/cisco/libsrtp/archive/${LIBSRTP_COMMIT}.tar.gz -> libsrtp-${LIBSRTP_COMMIT}.tar.gz
https://gitlab.com/chromiumsrc/libyuv/-/archive/${LIBYUV_COMMIT}/libyuv-${LIBYUV_COMMIT}.tar.bz2
"
# https://github.com/abseil/abseil-cpp/archive/${ABSL_COMMIT}.tar.gz -> abseil-cpp-${ABSL_COMMIT}.tar.gz
S="${WORKDIR}/${PN}-${TG_OWT_COMMIT}"
# Upstream libyuv: https://chromium.googlesource.com/libyuv/libyuv
else
EGIT_REPO_URI="https://github.com/desktop-app/${PN}"
inherit git-r3
EGIT_SUBMODULES=(
'*'
# -src/third_party/libyuv
-src/third_party/abseil-cpp
-src/third_party/crc32c/src
# -src/third_party/libsrtp # TODO: unbundle
)
fi
# 👇 kludge for eix
[[ "${PV}" = 9999* ]] && SLOT="0/${PV}"
[[ "${PV}" = 9999* ]] || SLOT="0/${PV##*pre}"
[[ "${PV}" = 9999* ]] || KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~riscv ~x86"
# 👆 kludge for eix
LICENSE="BSD"
IUSE="pipewire screencast +X"
REQUIRED_USE="screencast? ( pipewire )"
# Bundled libs:
# - libyuv (no stable versioning, www-client/chromium and media-libs/libvpx bundle it
# - libsrtp (project uses private APIs)
# - pffft (no stable versioning, patched)
# - rnnoise (private APIs)
RDEPEND="
>=dev-cpp/abseil-cpp-20240116.2:=
dev-libs/openssl:=
media-libs/libjpeg-turbo:=
>=media-libs/libvpx-1.10.0:=
media-libs/openh264:=
media-libs/opus
media-video/ffmpeg:=[opus,vpx,openh264]
pipewire? (
dev-libs/glib:2
media-video/pipewire:=
)
dev-libs/crc32c
screencast? (
media-libs/libglvnd[X=]
media-libs/mesa
x11-libs/libdrm
)
X? (
x11-libs/libX11
x11-libs/libXcomposite
x11-libs/libXdamage
x11-libs/libXext
x11-libs/libXfixes
x11-libs/libXrender
x11-libs/libXrandr
x11-libs/libXtst
)
"
# media-libs/libyuv
# net-libs/libsrtp
DEPEND="${RDEPEND}"
BDEPEND="
virtual/pkgconfig
X? ( x11-base/xorg-proto )
"
# dev-lang/yasm
PATCHES=(
"${FILESDIR}/0000_pkgconfig.patch"
"${FILESDIR}/${PN}-0_pre20221215-allow-disabling-pipewire.patch"
"${FILESDIR}/${PN}-0_pre20221215-allow-disabling-pulseaudio.patch"
"${FILESDIR}/${PN}-0_pre20221215-expose-set_allow_pipewire.patch"
"${FILESDIR}/fix-clang-emplace.patch"
"${FILESDIR}/patch-cmake-absl-external.patch"
# XXX: 👆comment for re-bundling absl
"${FILESDIR}/patch-cmake-crc32c-external.patch"
)
src_unpack() {
if [[ "${PV}" == 9999 ]]; then
git-r3_src_unpack
else
unpack "${P}.tar.gz"
unpack "libyuv-${LIBYUV_COMMIT}.tar.bz2"
mv -T "libyuv-${LIBYUV_COMMIT}" "${S}/src/third_party/libyuv" || die
unpack "libsrtp-${LIBSRTP_COMMIT}.tar.gz"
mv -T "libsrtp-${LIBSRTP_COMMIT}" "${S}/src/third_party/libsrtp" || die
# unpack "abseil-cpp-${ABSL_COMMIT}.tar.gz"
# mv -T "abseil-cpp-${ABSL_COMMIT}" "${S}/src/third_party/abseil-cpp" || die
# XXX: 👆for re-bundling absl
fi
}
src_prepare() {
cp "${FILESDIR}"/"${PN}".pc.in "${S}" || die "failed to copy pkgconfig template"
# sed -i '/include(cmake\/libyuv.cmake)/d' CMakeLists.txt || die
sed -i '/include(cmake\/libabsl.cmake)/d' CMakeLists.txt || die
# XXX: 👆comment for re-bundling absl
sed -i '/include(cmake\/libcrc32c.cmake)/d' CMakeLists.txt || die
# sed -i '/include(cmake\/librnnoise.cmake)/d' CMakeLists.txt || die
# sed -i '/include(cmake\/libsrtp.cmake)/d' CMakeLists.txt || die
if ! use pipewire; then
eapply "${FILESDIR}"/pipewire_off.patch
eapply "${FILESDIR}"/pipewire_cmake.patch
sed -i -e '/desktop_capture\/screen_drawer/d' CMakeLists.txt || die
else
append-cppflags -I/usr/include/pipewire-0.3 -I/usr/include/spa-0.2
fi
sed -i -e '/desktop_capture\/screen_capturer_integration_test/d' CMakeLists.txt || die
sed -i -e '/desktop_capture\/window_finder_unittest/d' CMakeLists.txt || die
# rm -r "${S}"/src/third_party/crc32c
# XXX: 👆for re-bundling absl
rm -r "${S}"/src/third_party/{crc32c,abseil-cpp}
# libyuv,
# pipewire,
# libsrtp,
# rnnoise,
# sed \
# -e '/#include/s@third_party/libyuv/include/@@' \
# -i \
# "${S}"/src/sdk/objc/unittests/frame_buffer_helpers.mm \
# "${S}"/src/sdk/objc/unittests/RTCCVPixelBuffer_xctest.mm \
# "${S}"/src/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.mm \
# "${S}"/src/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm \
# "${S}"/src/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.mm \
# "${S}"/src/sdk/android/src/jni/java_i420_buffer.cc \
# "${S}"/src/modules/video_coding/codecs/av1/dav1d_decoder.cc \
# "${S}"/src/api/video/i444_buffer.cc || die
# FIXME: abseil-cpp related things (absl::string_view casts)
# tg_owt uses (when bundled) git-almost-HEAD (april's commit) link in submodule
# gentoo for now have only release january release.
# Upgrading to july release (placing it in overlay) doesn't help with build failure (without this) either
# Although, I guess it is related to this:
# https://github.com/gentoo/gentoo/pull/32281#issuecomment-1676404974
sed -r \
-e "/[ ]*(group_name = )(kDefaultProbingScreenshareBweSettings)/s@@\1(std::string)\2@" \
-i "${S}/src/rtc_base/experiments/alr_experiment.cc" || die
sed -r \
-e "/[ \t]*transaction_id.insert/s@(magic_cookie)@(std::string)\1@" \
-i "${S}/src/api/transport/stun.cc" || die
sed -r \
-e "/(candidate_stats->candidate_type = )(candidate.type_name)/s@@\1(std::string)\2@" \
-i "${S}/src/pc/rtc_stats_collector.cc" || die
# append-cppflags -I"${S}/src/third_party/abseil-cpp"
# XXX: 👆for re-bundling absl
cmake_src_prepare
}
src_configure() {
append-flags '-fPIC'
filter-flags '-DDEBUG' # produces bugs in bundled forks of 3party code
# Defined by -DCMAKE_BUILD_TYPE=Release, avoids crashes
# See https://bugs.gentoo.org/754012
# EAPI 8 still wipes this flag.
append-cppflags '-DNDEBUG' # Telegram sets that in code
# (and I also forced that in ebuild to have the same behaviour),
# and segfaults on voice calls on mismatch
# (if tg was built with it, and deps are built without it, and vice versa)
local mycmakeargs=(
-DTG_OWT_PACKAGED_BUILD=ON
-DBUILD_SHARED_LIBS=ON
# -DTG_OWT_USE_PROTOBUF=ON
-DTG_OWT_USE_X11=$(usex X ON OFF)
-DTG_OWT_USE_PIPEWIRE=$(usex pipewire ON OFF)
-DTG_OWT_DLOPEN_PIPEWIRE=$(usex pipewire ON OFF)
)
cmake_src_configure
}
src_install() {
cmake_src_install
# Save about 15MB of useless headers
rm -r "${ED}/usr/include/tg_owt/rtc_base/third_party" || die
rm -r "${ED}/usr/include/tg_owt/common_audio/third_party" || die
rm -r "${ED}/usr/include/tg_owt/modules/third_party" || die
rm -r "${ED}/usr/include/tg_owt/third_party" || die
# Install a few headers anyway, as required by net-im/telegram-desktop...
local headers=(
third_party/libyuv/include
# third_party/abseil-cpp/absl
# XXX: 👆for re-bundling absl
rtc_base/third_party/sigslot
rtc_base/third_party/base64
)
for dir in "${headers[@]}"; do
pushd "${S}/src/${dir}" > /dev/null || die
find -type f -name "*.h" -exec install -Dm644 '{}' "${ED}/usr/include/tg_owt/${dir}/{}" \; || die
popd > /dev/null || die
done
}