# Copyright 1999-2024 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 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 EGIT_REPO_URI="https://github.com/desktop-app/${PN}" inherit git-r3 EGIT_SUBMODULES=( '*' -src/third_party/libyuv -src/third_party/libvpx/source/libvpx -src/third_party/pipewire -src/third_party/abseil-cpp -src/third_party/crc32c/src # -src/third_party/libsrtp # TODO: unbundle ) else KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~riscv ~x86" EGIT_COMMIT="592b14d13bf9103226e90a83571e24c49f6bfdcd" SRTP_PV="2.5.0" SRC_URI=" https://github.com/desktop-app/${PN}/archive/${EGIT_COMMIT}.tar.gz -> ${P}.tar.gz https://github.com/cisco/libsrtp/archive/refs/tags/v2.5.0.tar.gz -> libsrtp-${SRTP_PV}.tar.gz " S="${WORKDIR}/${PN}-${EGIT_COMMIT}" fi LICENSE="BSD" SLOT="0" IUSE="pipewire screencast +X" REQUIRED_USE="screencast? ( pipewire )" # Bundled libs: # - libsrtp (project uses private APIs) # - pffft (no stable versioning, patched) # - rnnoise (private APIs) RDEPEND=" >=dev-cpp/abseil-cpp-20220623.1:= dev-libs/crc32c dev-libs/libevent:= dev-libs/openssl:= dev-libs/protobuf:= media-libs/libjpeg-turbo:= >=media-libs/libvpx-1.10.0:= media-libs/libyuv media-libs/openh264:= media-libs/opus media-video/ffmpeg:=[opus,vpx,openh264] pipewire? ( dev-libs/glib:2 media-video/pipewire:= ) 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 ) " # net-libs/libsrtp DEPEND="${RDEPEND}" BDEPEND=" virtual/pkgconfig " # 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}/libyuv.patch" "${FILESDIR}/libyuv_2.patch" "${FILESDIR}/libyuv_3.patch" "${FILESDIR}/libyuv_4.patch" "${FILESDIR}/fix-clang-emplace.patch" "${FILESDIR}/patch-cmake-absl-external.patch" "${FILESDIR}/patch-cmake-crc32c-external.patch" ) src_unpack() { if [[ "${PV}" == 9999 ]]; then git-r3_src_unpack else default rmdir "${S}"/src/third_party/libsrtp cp -rl "${WORKDIR}"/libsrtp-"${SRTP_PV}" "${S}"/src/third_party/libsrtp fi } src_prepare() { cp "${FILESDIR}"/"${PN}".pc.in "${S}" || die "failed to copy pkgconfig template" sed -i '/include(cmake\/libvpx.cmake)/d' CMakeLists.txt || die sed -i '/include(cmake\/libyuv.cmake)/d' CMakeLists.txt || die sed -i '/include(cmake\/libabsl.cmake)/d' CMakeLists.txt || die sed -i '/include(cmake\/libopenh264.cmake)/d' CMakeLists.txt || die sed -i '/include(cmake\/libevent.cmake)/d' CMakeLists.txt || die 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/{abseil-cpp,libvpx,libyuv,openh264,crc32c} # ,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 sed \ -e '/#include/s@third_party/crc32c/src/include/@@' \ -i \ "${S}"/src/net/dcsctp/packet/crc32c.cc || die sed \ -e "1i#include " \ -i "${S}/src/common_video/h265/h265_pps_parser.h" || die cmake_src_prepare } src_configure() { append-flags '-fPIC' filter-flags '-DDEBUG' # produces bugs in bundled forks of 3party code 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 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 }