From 22bf32fd955958c82c115b2447939abe82cc4022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= Date: Thu, 21 May 2026 12:17:23 +0200 Subject: [PATCH 1/2] Remove references to WebKit or SCCache not used anymore --- Dockerfile-dev-downloaded.in | 2 -- Dockerfile-latest-dev-with-source.in | 2 -- Dockerfile-latest-prod-dbg.in | 2 -- Dockerfile-latest-prod.in | 2 -- README.md | 19 ------------------- build-latest.sh | 7 ------- build-release.sh | 13 +++---------- docker/build-gstreamer/install-dependencies | 17 ----------------- sccache.toml | 18 ------------------ 9 files changed, 3 insertions(+), 79 deletions(-) delete mode 100644 sccache.toml diff --git a/Dockerfile-dev-downloaded.in b/Dockerfile-dev-downloaded.in index eeb91b5..a2976fc 100644 --- a/Dockerfile-dev-downloaded.in +++ b/Dockerfile-dev-downloaded.in @@ -7,8 +7,6 @@ ARG GSTREAMER_CEF_CHECKOUT=b63340852fc93b0ab67b07200e1ff44f59ba6769 COPY docker/cef-config.sh /.cef-config.sh -COPY docker/sccache.toml /sccache.toml - COPY docker/build-gstreamer/download /download RUN ["/download"] diff --git a/Dockerfile-latest-dev-with-source.in b/Dockerfile-latest-dev-with-source.in index 17fce09..4319ade 100644 --- a/Dockerfile-latest-dev-with-source.in +++ b/Dockerfile-latest-dev-with-source.in @@ -1,7 +1,5 @@ FROM restreamio/gstreamer:$TARGET_ARCH-dev-downloaded -ARG WEBKIT_USE_SCCACHE=0 - ENV DEBUG=true ENV OPTIMIZATIONS=false diff --git a/Dockerfile-latest-prod-dbg.in b/Dockerfile-latest-prod-dbg.in index 05bfd5c..aa9c6ca 100644 --- a/Dockerfile-latest-prod-dbg.in +++ b/Dockerfile-latest-prod-dbg.in @@ -1,7 +1,5 @@ FROM restreamio/gstreamer:$TARGET_ARCH-dev-downloaded -ARG WEBKIT_USE_SCCACHE=0 - ENV DEBUG=true ENV OPTIMIZATIONS=true diff --git a/Dockerfile-latest-prod.in b/Dockerfile-latest-prod.in index 1a92e31..f3ad486 100644 --- a/Dockerfile-latest-prod.in +++ b/Dockerfile-latest-prod.in @@ -1,7 +1,5 @@ FROM restreamio/gstreamer:$TARGET_ARCH-dev-downloaded -ARG WEBKIT_USE_SCCACHE=0 - ENV DEBUG=false ENV OPTIMIZATIONS=true diff --git a/README.md b/README.md index d3af007..14e8052 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ Following components are present: * gst-libav * gstreamer-vaapi * libnice (newer version from git) -* WPE WebKit (newer version from upstream release) * gstcefsrc GStreamer and components are tracking upstream master branches (with minor fixes on top) and are usually updated a few times a month. @@ -26,24 +25,6 @@ NOTE: * 1.18.4.0 images and older were based on Ubuntu 20.10 * 2021-06-08T14-12-58Z images and older were based on Ubuntu 20.10 -## SCCache support - -The sysroot includes WPEWebKit, which is a huge project and requires a good -build machine. However in case you have access to a -[SCCache](https://github.com/mozilla/sccache) scheduler online, you can use it -to build WPEWebKit: - -```bash -export SCCACHE_SCHEDULER=https://sccache.corp.com -export SCCACHE_AUTH_TOKEN=s3cr3t -export WEBKIT_USE_SCCACHE=1 -./build-latest.sh -``` - -The configuration template stored in `sccache.toml` is filled with the scheduler -address and authentication token supplied through the corresponding environment -variables. - # Builds on Docker Hub Builds use Restream-specific patches by default, but there are also vanilla upstream builds available. diff --git a/build-latest.sh b/build-latest.sh index b484f6f..3737453 100755 --- a/build-latest.sh +++ b/build-latest.sh @@ -1,13 +1,6 @@ #!/bin/bash set -e -if [[ $WEBKIT_USE_SCCACHE == '1' ]]; then - sed 's;@@SCCACHE_SCHEDULER@@;'"${SCCACHE_SCHEDULER}"';g' sccache.toml > docker/sccache.toml - sed -i 's;@@SCCACHE_AUTH_TOKEN@@;'"${SCCACHE_AUTH_TOKEN}"';g' docker/sccache.toml -else - echo > docker/sccache.toml -fi - ARCH=$(uname -m) TAG_BASENAME="restreamio/gstreamer:$ARCH" diff --git a/build-release.sh b/build-release.sh index ed924e7..f3724d7 100755 --- a/build-release.sh +++ b/build-release.sh @@ -6,13 +6,6 @@ if [[ -z "$1" ]]; then exit 1 fi -if [[ $WEBKIT_USE_SCCACHE == '1' ]]; then - sed 's;@@SCCACHE_SCHEDULER@@;'"${SCCACHE_SCHEDULER}"';g' sccache.toml > docker/sccache.toml - sed -i 's;@@SCCACHE_AUTH_TOKEN@@;'"${SCCACHE_AUTH_TOKEN}"';g' docker/sccache.toml -else - echo > docker/sccache.toml -fi - # Make sure to always have fresh base image docker pull ubuntu:22.04 # Install dev dependencies @@ -22,12 +15,12 @@ docker build -t restreamio/gstreamer:dev-downloaded \ --build-arg GSTREAMER_VERSION=$1 \ -f Dockerfile-dev-downloaded . # Build dev image with source code included -docker build --build-arg WEBKIT_USE_SCCACHE=$WEBKIT_USE_SCCACHE -t restreamio/gstreamer:$1-dev-with-source -f Dockerfile-dev-with-source . +docker build -t restreamio/gstreamer:$1-dev-with-source -f Dockerfile-dev-with-source . # Build dev image with just binaries docker build -t restreamio/gstreamer:$1-dev -f Dockerfile-dev . # Build base production image with necessary dependencies docker build -t restreamio/gstreamer:prod-base -f Dockerfile-prod-base . # Build production image optimized binaries and no debug symbols (-O3 LTO) -docker build --build-arg WEBKIT_USE_SCCACHE=$WEBKIT_USE_SCCACHE -t restreamio/gstreamer:$1-prod -f Dockerfile-prod . +docker build -t restreamio/gstreamer:$1-prod -f Dockerfile-prod . # Build production image optimized binaries and debug symbols -docker build --build-arg WEBKIT_USE_SCCACHE=$WEBKIT_USE_SCCACHE -t restreamio/gstreamer:$1-prod-dbg -f Dockerfile-prod-dbg . +docker build -t restreamio/gstreamer:$1-prod-dbg -f Dockerfile-prod-dbg . diff --git a/docker/build-gstreamer/install-dependencies b/docker/build-gstreamer/install-dependencies index 0594183..0d9650e 100755 --- a/docker/build-gstreamer/install-dependencies +++ b/docker/build-gstreamer/install-dependencies @@ -143,21 +143,4 @@ fi apt-get clean rm -rf /var/lib/apt/lists/* -# SCCache can be used to speed-up WPE compilation. You need cloud builders setup -# though. SCCache binaries are available for arm64 but don't support toolchain -# packaging, so skip this when building on arm64. -if [[ $ARCH == "amd64" ]]; then - MACHINE=$(uname -m) - export SCCACHE_VERSION="0.2.14" - wget https://github.com/mozilla/sccache/releases/download/$SCCACHE_VERSION/sccache-$SCCACHE_VERSION-$MACHINE-unknown-linux-musl.tar.gz - tar xf sccache-$SCCACHE_VERSION-$MACHINE-unknown-linux-musl.tar.gz - mv sccache-$SCCACHE_VERSION-$MACHINE-unknown-linux-musl/sccache /usr/bin - rm -rf sccache-$SCCACHE_VERSION-$MACHINE-unknown-linux-musl - - ln -s /usr/bin/clang{-$CLANG_VERSION,} - ln -s /usr/bin/clang++{-$CLANG_VERSION,} - - sccache --package-toolchain /usr/bin/clang-$CLANG_VERSION /toolchain-clang-$CLANG_VERSION.tar.gz -fi - wget -O- https://sh.rustup.rs | sh -s -- -y --default-toolchain stable diff --git a/sccache.toml b/sccache.toml deleted file mode 100644 index fd94825..0000000 --- a/sccache.toml +++ /dev/null @@ -1,18 +0,0 @@ -[dist] -scheduler_url = "@@SCCACHE_SCHEDULER@@" - -[dist.auth] -type = "token" -token = "@@SCCACHE_AUTH_TOKEN@@" - -[[dist.toolchains]] -type = "path_override" -compiler_executable = "/usr/bin/clang" -archive = "/toolchain-clang-12.tar.gz" -archive_compiler_executable = "/usr/bin/clang-12" - -[[dist.toolchains]] -type = "path_override" -compiler_executable = "/usr/bin/clang++" -archive = "/toolchain-clang-12.tar.gz" -archive_compiler_executable = "/usr/bin/clang-12" From 91a00a62a7fa31f0349a40ad210416748da925ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= Date: Thu, 21 May 2026 14:27:24 +0200 Subject: [PATCH 2/2] Upgrade versions: - Ubuntu 26.04 LTS - GStreamer 1.28.3 - CEF 147.0.14+g76d2442+chromium-147.0.7727.138 --- Dockerfile-dev-dependencies | 6 +- Dockerfile-dev-downloaded.in | 6 +- Dockerfile-prod-base.in | 67 +-- README.md | 9 +- build-latest.sh | 2 +- build-release.sh | 2 +- docker/build-gstreamer/compile | 37 +- docker/build-gstreamer/download | 5 +- ...-dependencies => install-dev-dependencies} | 11 +- ...tAudioAggregator-fix-structure-unref.patch | 27 -- ...date-the-input-pts-if-available-from.patch | 33 -- ...ate-API-to-be-compatible-with-versio.patch | 192 --------- ...arser-fix-uint32-to-int32-truncation.patch | 115 ----- ...x-incomplete-TCP-ICE-candidate-crash.patch | 59 --- ...n-probes-are-stopped-fixed-in-1.24.8.patch | 46 -- ...0001-cefsrc-download-minimal-package.patch | 0 .../0002-cefsrc-unmultiply-alpha.patch} | 0 ...ounded-corners-property-for-sink-pad.patch | 22 +- ...d-box-shadow-property-for-sink-pads.patch} | 403 +++--------------- ...sity-in-webrtcbin-when-a-FEC-decode.patch} | 7 +- docker/cef-config.sh | 4 +- docker/install-arch-specific-dependencies.sh | 2 +- 22 files changed, 142 insertions(+), 913 deletions(-) rename docker/build-gstreamer/{install-dependencies => install-dev-dependencies} (93%) delete mode 100644 docker/build-gstreamer/patch/0001-GstAudioAggregator-fix-structure-unref.patch delete mode 100644 docker/build-gstreamer/patch/0001-baseparse-always-update-the-input-pts-if-available-from.patch delete mode 100644 docker/build-gstreamer/patch/0001-glvideomixer-update-API-to-be-compatible-with-versio.patch delete mode 100644 docker/build-gstreamer/patch/0001-gsth264parser-fix-uint32-to-int32-truncation.patch delete mode 100644 docker/build-gstreamer/patch/0001-libnice.wrap-fix-incomplete-TCP-ICE-candidate-crash.patch delete mode 100644 docker/build-gstreamer/patch/0001-pad-Check-data-NULL-ness-when-probes-are-stopped-fixed-in-1.24.8.patch rename docker/build-gstreamer/patch/{ => cefsrc}/0001-cefsrc-download-minimal-package.patch (100%) rename docker/build-gstreamer/patch/{0001-cefsrc-unmultiply-alpha.patch => cefsrc/0002-cefsrc-unmultiply-alpha.patch} (100%) rename docker/build-gstreamer/patch/{ => gstreamer}/0001-compositor-add-rounded-corners-property-for-sink-pad.patch (96%) rename docker/build-gstreamer/patch/{0001-compositor-add-box-shadow-property-for-sink-pads.patch => gstreamer/0002-compositor-add-box-shadow-property-for-sink-pads.patch} (74%) rename docker/build-gstreamer/patch/{0001-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch => gstreamer/0003-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch} (88%) diff --git a/Dockerfile-dev-dependencies b/Dockerfile-dev-dependencies index 55928bd..cd53e30 100644 --- a/Dockerfile-dev-dependencies +++ b/Dockerfile-dev-dependencies @@ -1,5 +1,5 @@ -FROM ubuntu:22.04 +FROM ubuntu:26.04 -COPY docker/build-gstreamer/install-dependencies / +COPY docker/build-gstreamer/install-dev-dependencies / -RUN ["/install-dependencies"] +RUN ["/install-dev-dependencies"] diff --git a/Dockerfile-dev-downloaded.in b/Dockerfile-dev-downloaded.in index a2976fc..33ff075 100644 --- a/Dockerfile-dev-downloaded.in +++ b/Dockerfile-dev-downloaded.in @@ -1,12 +1,8 @@ FROM restreamio/gstreamer:$TARGET_ARCH-dev-dependencies -ARG GSTREAMER_VERSION=1.22.12 - -ARG GSTREAMER_CEF_REPOSITORY=https://github.com/centricular/gstcefsrc -ARG GSTREAMER_CEF_CHECKOUT=b63340852fc93b0ab67b07200e1ff44f59ba6769 +ARG GSTREAMER_VERSION=1.28.3 COPY docker/cef-config.sh /.cef-config.sh - COPY docker/build-gstreamer/download /download RUN ["/download"] diff --git a/Dockerfile-prod-base.in b/Dockerfile-prod-base.in index ab976b3..a45437d 100644 --- a/Dockerfile-prod-base.in +++ b/Dockerfile-prod-base.in @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:26.04 ARG DEBIAN_FRONTEND=noninteractive @@ -7,18 +7,18 @@ RUN \ apt-get dist-upgrade -y && \ apt-get install -y --no-install-recommends \ ca-certificates \ - libatk1.0-0 \ - libatk-bridge2.0-0 \ + libatk1.0-0t64 \ + libatk-bridge2.0-0t64 \ libatk-adaptor \ - libatspi2.0-0 \ + libatspi2.0-0t64 \ libunwind8 \ - libdw1 \ + libdw1t64 \ libgmp10 \ - libgsl27 \ - libglib2.0-0 \ + libgsl28 \ + libglib2.0-0t64 \ libcap2 \ - libcups2 \ - liborc-0.4-0 \ + libcups2t64 \ + liborc-0.4-0t64 \ iso-codes \ libgl1 \ libgles1 \ @@ -26,13 +26,13 @@ RUN \ libgudev-1.0-0 \ libgbm1 \ libgraphene-1.0-dev \ - libpng16-16 \ + libpng16-16t64 \ libjpeg8 \ libogg0 \ libopus0 \ libpango-1.0-0 \ libvisual-0.4-0 \ - libtheora0 \ + libtheora1 \ libvorbis0a \ libxkbcommon0 \ libxcomposite1 \ @@ -54,20 +54,20 @@ RUN \ bubblewrap \ libseccomp2 \ xdg-dbus-proxy \ - libsoup2.4-1 \ + libsoup-3.0-0 \ libvulkan1 \ libass9 \ libchromaprint1 \ - libcurl3-gnutls \ + libcurl3t64-gnutls \ libaom3 \ libbz2-1.0 \ liblcms2-2 \ libbs2b0 \ libdca0 \ - libfaac0 \ + libfaac0t64 \ libfaad2 \ libflite1 \ - libssl3 \ + libssl3t64 \ ladspa-sdk \ libfdk-aac2 \ libgsm1 \ @@ -77,48 +77,49 @@ RUN \ liblilv-0-0 \ libmodplug1 \ mjpegtools \ - libmjpegutils-2.1-0 \ + libmjpegutils-2.2-0 \ libmpcdec6 \ libdvdnav4 \ - libdvdread8 \ + libdvdread8t64 \ librsvg2-2 \ librtmp1 \ libsbc1 \ libsndfile1 \ libsoundtouch1 \ - libspandsp2 \ - libsrt1.4-openssl \ + libspandsp2t64 \ + libsrt1.5-openssl \ libsrtp2-1 \ libvo-aacenc0 \ libvo-amrwbenc0 \ - libwebrtc-audio-processing1 \ + libwebrtc-audio-processing-1-3 \ + libwebrtc-audio-coding-1-3 \ libofa0 \ - libzvbi0 \ - libopenexr25 \ + libzvbi0t64 \ + libopenexr-3-1-30 \ libwildmidi2 \ - libx265-199 \ - libzbar0 \ + libx265-215 \ + libzbar0t64 \ wayland-protocols \ libaa1 \ libmp3lame0 \ libcaca0 \ - libdv4 \ - libmpg123-0 \ - libvpx7 \ + libdv4t64 \ + libmpg123-0t64 \ + libvpx12 \ libshout3 \ libspeex1 \ - libtag1v5 \ + libtag2 \ libtwolame0 \ libwavpack1 \ liba52-0.7.4 \ - libx264-163 \ + libx264-165 \ libopencore-amrnb0 \ libopencore-amrwb0 \ libmpeg2-4 \ - libavcodec58 \ - libavfilter7 \ - libavformat58 \ - libavutil56 \ + libavcodec62 \ + libavfilter11 \ + libavformat62 \ + libavutil60 \ libva2 \ libva-wayland2 \ xvfb \ diff --git a/README.md b/README.md index 14e8052..ec6e4d8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # docker-gstreamer [![Docker Pulls](https://img.shields.io/docker/pulls/restreamio/gstreamer)](https://hub.docker.com/r/restreamio/gstreamer) -Ubuntu 22.04-based container images with upstream GStreamer and plugins pre-installed +Ubuntu 26.04-LTS-based container images with upstream GStreamer and plugins pre-installed Following components are present: * GStreamer @@ -10,20 +10,21 @@ Following components are present: * gst-plugins-bad (with `msdk`) * gst-plugins-ugly * gst-libav -* gstreamer-vaapi -* libnice (newer version from git) +* gstreamer-va +* libnice * gstcefsrc GStreamer and components are tracking upstream master branches (with minor fixes on top) and are usually updated a few times a month. There are also builds of stable upstream releases available as well. -Base OS is Ubuntu 22.04. +Base OS is Ubuntu 26.04 LTS NOTE: * 1.18.2.0 images and older were based on Ubuntu 20.04 * 2020-12-30T23-16-11Z images and older were based on Ubuntu 20.04 * 1.18.4.0 images and older were based on Ubuntu 20.10 * 2021-06-08T14-12-58Z images and older were based on Ubuntu 20.10 +* 2026-05-07T12-07-24Z images and older were based on Ubuntu 22.04 # Builds on Docker Hub Builds use Restream-specific patches by default, but there are also vanilla upstream builds available. diff --git a/build-latest.sh b/build-latest.sh index 3737453..f176985 100755 --- a/build-latest.sh +++ b/build-latest.sh @@ -14,7 +14,7 @@ docker_build() { } # Make sure to always have fresh base image -docker pull ubuntu:22.04 +docker pull ubuntu:26.04 # Install dev dependencies docker build -t $TAG_BASENAME-dev-dependencies -f Dockerfile-dev-dependencies . diff --git a/build-release.sh b/build-release.sh index f3724d7..70a661b 100755 --- a/build-release.sh +++ b/build-release.sh @@ -7,7 +7,7 @@ if [[ -z "$1" ]]; then fi # Make sure to always have fresh base image -docker pull ubuntu:22.04 +docker pull ubuntu:26.04 # Install dev dependencies docker build -t restreamio/gstreamer:dev-dependencies -f Dockerfile-dev-dependencies . # Download source code diff --git a/docker/build-gstreamer/compile b/docker/build-gstreamer/compile index a0c8fc3..a2606a4 100755 --- a/docker/build-gstreamer/compile +++ b/docker/build-gstreamer/compile @@ -13,37 +13,26 @@ gcc -O2 -Wall -Wextra -fPIC -shared -o /usr/lib/libfakemallinfo.so /fake_mallinf mkdir -p /compiled-binaries/usr/lib cp /usr/lib/libfakemallinfo.so /compiled-binaries/usr/lib/libfakemallinfo.so -pushd gstreamer -# TODO: Hack: `-D gupnp=disabled` is for libnice, because libgupnp-igd causes memory leaks -# msdk=enabled is for gst-plugings-bad to include msdk elements -# with_x11=no is for gstreamer-vaapi to exclude X11-related functionality (that would otherwise require extra dependencies) -MESON_OPTIONS="-Dvaapi=enabled -Dgpl=enabled -Dgst-examples=disabled -Dexamples=disabled -Dtests=disabled -Ddoc=disabled -Dqt5=disabled -Dpython=disabled -Dges=disabled -Ddevtools=disabled -Dintrospection=disabled -Dlibnice:gupnp=disabled -Dgstreamer-vaapi:x11=disabled -Dgstreamer-vaapi:encoders=enabled" - -ARCH=$(dpkg --print-architecture) -if [[ $ARCH == "amd64" ]]; then - MESON_OPTIONS="$MESON_OPTIONS -Dgst-plugins-bad:msdk=enabled " -fi +export CC=`which clang` +export CXX=`which clang++` -git apply /compile-patch/0001-libnice.wrap-fix-incomplete-TCP-ICE-candidate-crash.patch +pushd gstreamer +# `-Dlibnice:gupnp=disabled` is for libnice, because libgupnp-igd causes memory leaks. +MESON_OPTIONS="-Dgpl=enabled -Dgst-examples=disabled -Dexamples=disabled -Dtests=disabled -Ddoc=disabled -Dqt5=disabled -Dpython=disabled -Dges=disabled -Ddevtools=disabled -Dintrospection=disabled -Dlibnice:gupnp=disabled" if [[ $DEBUG == 'true' ]]; then if [[ $OPTIMIZATIONS == 'true' ]]; then - meson build -D prefix=/usr $MESON_OPTIONS -D buildtype=debugoptimized + meson setup build --prefix=/usr --buildtype=debugoptimized $MESON_OPTIONS else - meson build -D prefix=/usr $MESON_OPTIONS -D buildtype=debug + meson setup build --prefix=/usr --buildtype=debug $MESON_OPTIONS fi else - meson build -D prefix=/usr $MESON_OPTIONS -D buildtype=release -D b_lto=true + meson setup build --prefix=/usr --buildtype=release -Db_lto=true $MESON_OPTIONS fi -git apply /compile-patch/0001-baseparse-always-update-the-input-pts-if-available-from.patch -git apply /compile-patch/0001-compositor-add-rounded-corners-property-for-sink-pad.patch -git apply /compile-patch/0001-compositor-add-box-shadow-property-for-sink-pads.patch -git apply /compile-patch/0001-pad-Check-data-NULL-ness-when-probes-are-stopped-fixed-in-1.24.8.patch -git apply /compile-patch/0001-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch -git apply /compile-patch/0001-glvideomixer-update-API-to-be-compatible-with-versio.patch -git apply /compile-patch/0001-GstAudioAggregator-fix-structure-unref.patch -git apply /compile-patch/0001-gsth264parser-fix-uint32-to-int32-truncation.patch +git apply /compile-patch/gstreamer/0001-compositor-add-rounded-corners-property-for-sink-pad.patch +git apply /compile-patch/gstreamer/0002-compositor-add-box-shadow-property-for-sink-pads.patch +git apply /compile-patch/gstreamer/0003-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch # This is needed for other plugins to be built properly ninja -C build install @@ -53,8 +42,8 @@ popd # Build the GStreamer CEF plugin pushd gstcefsrc -git apply /compile-patch/0001-cefsrc-download-minimal-package.patch -git apply /compile-patch/0001-cefsrc-unmultiply-alpha.patch +git apply /compile-patch/cefsrc/0001-cefsrc-download-minimal-package.patch +git apply /compile-patch/cefsrc/0002-cefsrc-unmultiply-alpha.patch source /.cef-config.sh cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/cef -GNinja -DCEF_VERSION=$CEF_VERSION -DCEF_MINIMAL_PACKAGE=ON diff --git a/docker/build-gstreamer/download b/docker/build-gstreamer/download index 09ff2cb..53fa4a8 100755 --- a/docker/build-gstreamer/download +++ b/docker/build-gstreamer/download @@ -3,7 +3,8 @@ set -e git clone -b "$GSTREAMER_VERSION" https://gitlab.freedesktop.org/gstreamer/gstreamer.git -git clone --no-checkout "$GSTREAMER_CEF_REPOSITORY" +source /.cef-config.sh +git clone --no-checkout "$CEF_REPOSITORY" pushd gstcefsrc -git checkout "$GSTREAMER_CEF_CHECKOUT" +git checkout "$CEF_CHECKOUT" popd diff --git a/docker/build-gstreamer/install-dependencies b/docker/build-gstreamer/install-dev-dependencies similarity index 93% rename from docker/build-gstreamer/install-dependencies rename to docker/build-gstreamer/install-dev-dependencies index 0d9650e..94302e9 100755 --- a/docker/build-gstreamer/install-dependencies +++ b/docker/build-gstreamer/install-dev-dependencies @@ -2,9 +2,7 @@ set -e export DEBIAN_FRONTEND=noninteractive -export CLANG_VERSION=12 -sed -i 's/# deb-src/deb-src/g' /etc/apt/sources.list apt-get update apt-get dist-upgrade -y apt-get install -y --no-install-recommends \ @@ -15,7 +13,8 @@ apt-get install -y --no-install-recommends \ python3-pip \ python3-dev \ gcc \ - clang-$CLANG_VERSION \ + clang \ + nasm \ cmake \ libatk1.0-dev \ libatk-bridge2.0-dev \ @@ -62,7 +61,7 @@ apt-get install -y --no-install-recommends \ libseccomp-dev \ xdg-dbus-proxy \ gperf \ - libsoup2.4-dev \ + libsoup-3.0-dev \ libvulkan-dev \ libass-dev \ libchromaprint-dev \ @@ -131,12 +130,12 @@ apt-get install -y --no-install-recommends \ glibc-tools \ libqrencode-dev \ libjson-glib-dev -pip3 install meson ninja +pip3 install --upgrade --break-system-packages meson ninja ARCH=$(dpkg --print-architecture) if [[ $ARCH == "amd64" ]]; then apt-get install -y --no-install-recommends \ - libmfx-dev \ + libmfx-gen-dev \ intel-media-va-driver-non-free fi diff --git a/docker/build-gstreamer/patch/0001-GstAudioAggregator-fix-structure-unref.patch b/docker/build-gstreamer/patch/0001-GstAudioAggregator-fix-structure-unref.patch deleted file mode 100644 index 5145f80..0000000 --- a/docker/build-gstreamer/patch/0001-GstAudioAggregator-fix-structure-unref.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 4c5779845cb8dedf0797b78c382f8f0f8b0d19e2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= -Date: Wed, 18 Jun 2025 18:46:56 +0200 -Subject: [PATCH] GstAudioAggregator: fix structure unref in peek_next_sample - -The GstStructure attached to the audio sample in peek_next_sample() was -freed prematurely before usage as gst_sample_new() is taking full -ownership on it. ---- - .../gst-plugins-base/gst-libs/gst/audio/gstaudioaggregator.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioaggregator.c b/subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioaggregator.c -index d967a3295d..811e5e8a43 100644 ---- a/subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioaggregator.c -+++ b/subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioaggregator.c -@@ -2188,7 +2188,6 @@ gst_audio_aggregator_peek_next_sample (GstAggregator * agg, - - sample = gst_sample_new (pad->priv->buffer, caps, &aggpad->segment, info); - gst_caps_unref (caps); -- gst_structure_free (info); - } - - return sample; --- -2.43.0 - diff --git a/docker/build-gstreamer/patch/0001-baseparse-always-update-the-input-pts-if-available-from.patch b/docker/build-gstreamer/patch/0001-baseparse-always-update-the-input-pts-if-available-from.patch deleted file mode 100644 index 0fd5325..0000000 --- a/docker/build-gstreamer/patch/0001-baseparse-always-update-the-input-pts-if-available-from.patch +++ /dev/null @@ -1,33 +0,0 @@ -From e3ef323fda57a4b4e604820f8e183fea97892acd Mon Sep 17 00:00:00 2001 -From: Matthew Waters -Date: Tue, 29 Sep 2020 14:51:54 +1000 -Subject: [PATCH] baseparse: always update the input pts if available from - upstream - -We were not which could lead to output buffers having a pts of NONE even -if all the input ts were entirely coherent. This meant that certain -muxers would reject the buffer without a pts and fail. ---- - subprojects/gstreamer/libs/gst/base/gstbaseparse.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/subprojects/gstreamer/libs/gst/base/gstbaseparse.c b/subprojects/gstreamer/libs/gst/base/gstbaseparse.c -index 660439bacfa..04d400604ca 100644 ---- a/subprojects/gstreamer/libs/gst/base/gstbaseparse.c -+++ b/subprojects/gstreamer/libs/gst/base/gstbaseparse.c -@@ -3281,9 +3281,10 @@ gst_base_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) - * but interpolate in between */ - pts = gst_adapter_prev_pts (parse->priv->adapter, NULL); - dts = gst_adapter_prev_dts (parse->priv->adapter, NULL); -- if (GST_CLOCK_TIME_IS_VALID (pts) && (parse->priv->prev_pts != pts)) { -+ if (GST_CLOCK_TIME_IS_VALID (pts)) { -+ if (parse->priv->prev_pts != pts) -+ updated_prev_pts = TRUE; - parse->priv->prev_pts = parse->priv->next_pts = pts; -- updated_prev_pts = TRUE; - } - - if (GST_CLOCK_TIME_IS_VALID (dts) && (parse->priv->prev_dts != dts)) { --- -GitLab - diff --git a/docker/build-gstreamer/patch/0001-glvideomixer-update-API-to-be-compatible-with-versio.patch b/docker/build-gstreamer/patch/0001-glvideomixer-update-API-to-be-compatible-with-versio.patch deleted file mode 100644 index c003a06..0000000 --- a/docker/build-gstreamer/patch/0001-glvideomixer-update-API-to-be-compatible-with-versio.patch +++ /dev/null @@ -1,192 +0,0 @@ -From dd1d86caefe98550f3abff0bd018c5f449eda90b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= -Date: Mon, 31 Mar 2025 17:54:51 +0200 -Subject: [PATCH] glvideomixer: update API to be compatible with version 1.24 - ---- - .../gst-plugins-base/ext/gl/gstglmixerbin.c | 74 +++++++++++++++++++ - .../gst-plugins-base/ext/gl/gstglmixerbin.h | 7 ++ - .../gst-plugins-base/ext/gl/gstglvideomixer.c | 15 +++- - 3 files changed, 95 insertions(+), 1 deletion(-) - -diff --git a/subprojects/gst-plugins-base/ext/gl/gstglmixerbin.c b/subprojects/gst-plugins-base/ext/gl/gstglmixerbin.c -index 4e8d045e57..5b55a051b3 100644 ---- a/subprojects/gst-plugins-base/ext/gl/gstglmixerbin.c -+++ b/subprojects/gst-plugins-base/ext/gl/gstglmixerbin.c -@@ -31,9 +31,11 @@ - #define GST_CAT_DEFAULT gst_gl_mixer_bin_debug - GST_DEBUG_CATEGORY (gst_gl_mixer_bin_debug); - -+#define DEFAULT_FORCE_LIVE FALSE - #define DEFAULT_LATENCY 0 - #define DEFAULT_START_TIME_SELECTION 0 - #define DEFAULT_START_TIME (-1) -+#define DEFAULT_MIN_UPSTREAM_LATENCY (0) - - typedef enum - { -@@ -124,6 +126,8 @@ enum - PROP_START_TIME_SELECTION, - PROP_START_TIME, - PROP_CONTEXT, -+ PROP_FORCE_LIVE, -+ PROP_MIN_UPSTREAM_LATENCY, - }; - - enum -@@ -215,6 +219,44 @@ gst_gl_mixer_bin_class_init (GstGLMixerBinClass * klass) - "Get OpenGL context", - GST_TYPE_GL_CONTEXT, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - -+ /** -+ * GstGLMixerBin:force-live: -+ * -+ * Causes the element to aggregate on a timeout even when no live source is -+ * connected to its sinks. See #GstGLMixerBin:min-upstream-latency for a -+ * companion property: in the vast majority of cases where you plan to plug in -+ * live sources with a non-zero latency, you should set it to a non-zero value. -+ * -+ * Since: 1.24 -+ */ -+ g_object_class_install_property (gobject_class, PROP_FORCE_LIVE, -+ g_param_spec_boolean ("force-live", -+ "Force Live", -+ "Always operate in live mode and aggregate on timeout regardless of whether any live sources are linked upstream", -+ DEFAULT_FORCE_LIVE, -+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); -+ -+ /** -+ * GstGLMixerBin:min-upstream-latency: -+ * -+ * Force minimum upstream latency (in nanoseconds). When sources with a -+ * higher latency are expected to be plugged in dynamically after the -+ * aggregator has started playing, this allows overriding the minimum -+ * latency reported by the initial source(s). This is only taken into -+ * account when larger than the actually reported minimum latency. -+ * -+ * Since: 1.24 -+ */ -+ g_object_class_install_property (gobject_class, PROP_MIN_UPSTREAM_LATENCY, -+ g_param_spec_uint64 ("min-upstream-latency", "Buffer latency", -+ "When sources with a higher latency are expected to be plugged " -+ "in dynamically after the aggregator has started playing, " -+ "this allows overriding the minimum latency reported by the " -+ "initial source(s). This is only taken into account when larger " -+ "than the actually reported minimum latency. (nanoseconds)", -+ 0, G_MAXUINT64, -+ DEFAULT_LATENCY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -+ - /** - * GstMixerBin::create-element: - * @object: the #GstGLMixerBin -@@ -270,6 +312,12 @@ gst_gl_mixer_bin_init (GstGLMixerBin * self) - - if (!res) - GST_ERROR_OBJECT (self, "failed to create output chain"); -+ -+ self->force_live = DEFAULT_FORCE_LIVE; -+ self->latency = DEFAULT_LATENCY; -+ self->start_time_selection = DEFAULT_START_TIME_SELECTION; -+ self->start_time = DEFAULT_START_TIME; -+ self->min_upstream_latency = DEFAULT_MIN_UPSTREAM_LATENCY; - } - - static void -@@ -448,6 +496,9 @@ gst_gl_mixer_bin_get_property (GObject * object, - case PROP_MIXER: - g_value_set_object (value, self->mixer); - break; -+ case PROP_FORCE_LIVE: -+ g_value_set_boolean (value, self->force_live); -+ break; - default: - if (self->mixer) - g_object_get_property (G_OBJECT (self->mixer), pspec->name, value); -@@ -474,6 +525,29 @@ gst_gl_mixer_bin_set_property (GObject * object, - } - break; - } -+ case PROP_FORCE_LIVE: -+ self->force_live = g_value_get_boolean (value); -+ break; -+ case PROP_LATENCY: -+ self->latency = g_value_get_uint64 (value); -+ if (self->mixer) -+ g_object_set_property (G_OBJECT (self->mixer), pspec->name, value); -+ break; -+ case PROP_START_TIME_SELECTION: -+ self->start_time_selection = g_value_get_enum (value); -+ if (self->mixer) -+ g_object_set_property (G_OBJECT (self->mixer), pspec->name, value); -+ break; -+ case PROP_START_TIME: -+ self->start_time = g_value_get_uint64 (value); -+ if (self->mixer) -+ g_object_set_property (G_OBJECT (self->mixer), pspec->name, value); -+ break; -+ case PROP_MIN_UPSTREAM_LATENCY: -+ self->min_upstream_latency = g_value_get_uint64 (value); -+ if (self->mixer) -+ g_object_set_property (G_OBJECT (self->mixer), pspec->name, value); -+ break; - default: - if (self->mixer) - g_object_set_property (G_OBJECT (self->mixer), pspec->name, value); -diff --git a/subprojects/gst-plugins-base/ext/gl/gstglmixerbin.h b/subprojects/gst-plugins-base/ext/gl/gstglmixerbin.h -index 5e5bb60b43..06491b7247 100644 ---- a/subprojects/gst-plugins-base/ext/gl/gstglmixerbin.h -+++ b/subprojects/gst-plugins-base/ext/gl/gstglmixerbin.h -@@ -53,6 +53,13 @@ struct _GstGLMixerBin - GstElement *download; - GstPad *srcpad; - -+ gboolean force_live; -+ -+ GstClockTime latency; -+ guint start_time_selection; -+ GstClockTime start_time; -+ GstClockTime min_upstream_latency; -+ - GstGLMixerBinPrivate *priv; - }; - -diff --git a/subprojects/gst-plugins-base/ext/gl/gstglvideomixer.c b/subprojects/gst-plugins-base/ext/gl/gstglvideomixer.c -index de08888095..f61f09fc01 100644 ---- a/subprojects/gst-plugins-base/ext/gl/gstglvideomixer.c -+++ b/subprojects/gst-plugins-base/ext/gl/gstglvideomixer.c -@@ -462,11 +462,23 @@ GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (glvideomixer, "glvideomixer", - - static void - gst_gl_video_mixer_bin_init (GstGLVideoMixerBin * self) -+{ -+} -+ -+static void -+gst_gl_video_mixer_bin_constructed (GObject * self) - { - GstGLMixerBin *mix_bin = GST_GL_MIXER_BIN (self); - -+ G_OBJECT_CLASS (gst_gl_video_mixer_bin_parent_class)->constructed (self); -+ - gst_gl_mixer_bin_finish_init_with_element (mix_bin, -- g_object_new (GST_TYPE_GL_VIDEO_MIXER, NULL)); -+ g_object_new (GST_TYPE_GL_VIDEO_MIXER, -+ "force-live", mix_bin->force_live, -+ "latency", mix_bin->latency, -+ "start-time-selection", mix_bin->start_time_selection, -+ "start-time", mix_bin->start_time, -+ "min-upstream-latency", mix_bin->min_upstream_latency, NULL)); - } - - static void -@@ -479,6 +491,7 @@ gst_gl_video_mixer_bin_class_init (GstGLVideoMixerBinClass * klass) - - mixer_class->create_input_pad = _create_video_mixer_input; - -+ gobject_class->constructed = gst_gl_video_mixer_bin_constructed; - gobject_class->set_property = gst_gl_video_mixer_bin_set_property; - gobject_class->get_property = gst_gl_video_mixer_bin_get_property; - --- -2.43.0 - diff --git a/docker/build-gstreamer/patch/0001-gsth264parser-fix-uint32-to-int32-truncation.patch b/docker/build-gstreamer/patch/0001-gsth264parser-fix-uint32-to-int32-truncation.patch deleted file mode 100644 index 926c670..0000000 --- a/docker/build-gstreamer/patch/0001-gsth264parser-fix-uint32-to-int32-truncation.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 282a528c7234d1cb89422db0fcce56385b0507b5 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= -Date: Fri, 31 Oct 2025 13:27:47 +0100 -Subject: [PATCH] gsth264parser: fix uint32 to int32 truncation - -The H264 parser is using int32 to compute the framerate numerator and -denominator while the SPS block holding the original values used for -this computation are stored on uint32. On corner cases it may lead to a -truncation of the final values leading to an invalid framerate. - -This patch is shifting right the numerator and denominator until both -values may be stored on int32. It may introduce a small computation -error with odd values but negligeable taking into account the huge -initial values > max_int32. ---- - .../gst-libs/gst/codecparsers/gsth264parser.c | 9 +++- - .../tests/check/libs/h264parser.c | 48 +++++++++++++++++++ - 2 files changed, 55 insertions(+), 2 deletions(-) - -diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth264parser.c b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth264parser.c -index ea3c6fb995..5095bcea73 100644 ---- a/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth264parser.c -+++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecparsers/gsth264parser.c -@@ -2946,8 +2946,8 @@ void - gst_h264_video_calculate_framerate (const GstH264SPS * sps, - guint field_pic_flag, guint pic_struct, gint * fps_num, gint * fps_den) - { -- gint num = 0; -- gint den = 1; -+ gint64 num = 0; -+ gint64 den = 1; - - /* To calculate framerate, we use this formula: - * time_scale 1 1 -@@ -2998,6 +2998,11 @@ gst_h264_video_calculate_framerate (const GstH264SPS * sps, - } - } - -+ while (num > G_MAXINT32 || den > G_MAXINT32) { -+ num >>= 1; -+ den >>= 1; -+ } -+ - *fps_num = num; - *fps_den = den; - } -diff --git a/subprojects/gst-plugins-bad/tests/check/libs/h264parser.c b/subprojects/gst-plugins-bad/tests/check/libs/h264parser.c -index ddf4fe50d4..1ddab3bea7 100644 ---- a/subprojects/gst-plugins-bad/tests/check/libs/h264parser.c -+++ b/subprojects/gst-plugins-bad/tests/check/libs/h264parser.c -@@ -1023,6 +1023,53 @@ GST_START_TEST (test_h264_split_avc) - - GST_END_TEST; - -+// This SPS block with vui parameters defines: -+// - frame_mbs_only_flag: 1 (progressive) -+// - time_scale: 4294967294 (overflows int32 capacity) -+// - num_units_in_tick: 71834980 -+// The expected framerate is 29,894678707 fps. -+static const guint8 nalu_sps_with_overflow_framerate[] = { -+ 0x00, 0x00, 0x00, 0x01, 0x27, 0x64, 0x00, 0x1f, -+ 0xac, 0x72, 0x14, 0x05, 0x00, 0x5b, 0xb0, 0x11, -+ 0x04, 0x48, 0x1d, 0x64, 0xff, 0xff, 0xff, 0xfe, -+ 0xe2, 0x20, 0x00, 0x74, 0xc1, 0x00, 0x00, 0x74, -+ 0xc1, 0x3b, 0xde, 0xe0, 0x3e, 0x10, 0x08, 0x32, -+ 0xc0 -+}; -+ -+GST_START_TEST (test_h264_parse_overflow_framerate) -+{ -+ GstH264ParserResult res; -+ GstH264NalUnit nalu; -+ GstH264SPS sps; -+ gint fps_num, fps_den; -+ GstH264NalParser *const parser = gst_h264_nal_parser_new (); -+ -+ res = gst_h264_parser_identify_nalu (parser, nalu_sps_with_overflow_framerate, -+ 0, sizeof (nalu_sps_with_overflow_framerate), &nalu); -+ assert_equals_int (res, GST_H264_PARSER_NO_NAL_END); -+ assert_equals_int (nalu.type, GST_H264_NAL_SPS); -+ assert_equals_int (nalu.size, 37); -+ -+ res = gst_h264_parser_parse_sps (parser, &nalu, &sps); -+ assert_equals_int (res, GST_H264_PARSER_OK); -+ fail_unless (sps.valid); -+ fail_unless (sps.frame_mbs_only_flag); -+ fail_unless (sps.vui_parameters_present_flag); -+ fail_unless (sps.vui_parameters.timing_info_present_flag); -+ assert_equals_uint64 (sps.vui_parameters.time_scale, 4294967294); -+ assert_equals_uint64 (sps.vui_parameters.num_units_in_tick, 71834980); -+ -+ gst_h264_video_calculate_framerate (&sps, 0, 0, &fps_num, &fps_den); -+ assert_equals_int (fps_num, 2147483647); -+ assert_equals_int (fps_den, 71834980); -+ -+ gst_h264_sps_clear (&sps); -+ gst_h264_nal_parser_free (parser); -+} -+ -+GST_END_TEST; -+ - static Suite * - h264parser_suite (void) - { -@@ -1039,6 +1086,7 @@ h264parser_suite (void) - tcase_add_test (tc_chain, test_h264_create_sei); - tcase_add_test (tc_chain, test_h264_decoder_config_record); - tcase_add_test (tc_chain, test_h264_split_avc); -+ tcase_add_test (tc_chain, test_h264_parse_overflow_framerate); - - return s; - } --- -2.43.0 - diff --git a/docker/build-gstreamer/patch/0001-libnice.wrap-fix-incomplete-TCP-ICE-candidate-crash.patch b/docker/build-gstreamer/patch/0001-libnice.wrap-fix-incomplete-TCP-ICE-candidate-crash.patch deleted file mode 100644 index 49e6a5b..0000000 --- a/docker/build-gstreamer/patch/0001-libnice.wrap-fix-incomplete-TCP-ICE-candidate-crash.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 99c642e9de04964ac6ae3c9aa50b28b134ae8496 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= -Date: Mon, 20 Oct 2025 14:17:38 +0200 -Subject: [PATCH] libnice.wrap: fix incomplete TCP ICE candidate crash - ---- - subprojects/libnice.wrap | 1 + - ...sing-an-incomplete-TCP-ICE-candidate.patch | 30 +++++++++++++++++++ - 2 files changed, 31 insertions(+) - create mode 100644 subprojects/packagefiles/libnice-0.1.21/0001-agent-fix-parsing-an-incomplete-TCP-ICE-candidate.patch - -diff --git a/subprojects/libnice.wrap b/subprojects/libnice.wrap -index eeed32daa2..2dc672b27b 100644 ---- a/subprojects/libnice.wrap -+++ b/subprojects/libnice.wrap -@@ -2,3 +2,4 @@ - directory=libnice - url=https://gitlab.freedesktop.org/libnice/libnice.git - revision=0.1.21 -+diff_files = libnice-0.1.21/0001-agent-fix-parsing-an-incomplete-TCP-ICE-candidate.patch -diff --git a/subprojects/packagefiles/libnice-0.1.21/0001-agent-fix-parsing-an-incomplete-TCP-ICE-candidate.patch b/subprojects/packagefiles/libnice-0.1.21/0001-agent-fix-parsing-an-incomplete-TCP-ICE-candidate.patch -new file mode 100644 -index 0000000000..8dec6b9948 ---- /dev/null -+++ b/subprojects/packagefiles/libnice-0.1.21/0001-agent-fix-parsing-an-incomplete-TCP-ICE-candidate.patch -@@ -0,0 +1,30 @@ -+From d5f6db4100fedb01f62909ee342a8ccaa1274431 Mon Sep 17 00:00:00 2001 -+From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= -+Date: Mon, 20 Oct 2025 13:31:54 +0200 -+Subject: [PATCH] agent: fix parsing an incomplete TCP ICE candidate -+ -+If a TCP ICE candidate mline in a SDP doesn't specify the `tcptype` -+field, it was crashing the agent because of the non-null assert in -+`g_ascii_strcasecmp`. The patch is just ignoring an incomplete TCP -+candidate just like the other malformed candidates. -+--- -+ agent/agent.c | 3 +++ -+ 1 file changed, 3 insertions(+) -+ -+diff --git a/agent/agent.c b/agent/agent.c -+index 0d1f1814..7d22e22b 100644 -+--- a/agent/agent.c -++++ b/agent/agent.c -+@@ -7613,6 +7613,9 @@ nice_agent_parse_remote_candidate_sdp (NiceAgent *agent, guint stream_id, -+ else if (g_ascii_strcasecmp (transport, "TCP-PASS") == 0) -+ ctransport = NICE_CANDIDATE_TRANSPORT_TCP_PASSIVE; -+ else if (g_ascii_strcasecmp (transport, "TCP") == 0) { -++ if (tcptype == NULL) -++ goto done; -++ -+ if (g_ascii_strcasecmp (tcptype, "so") == 0) -+ ctransport = NICE_CANDIDATE_TRANSPORT_TCP_SO; -+ else if (g_ascii_strcasecmp (tcptype, "active") == 0) -+-- -+2.43.0 -+ --- -2.43.0 - diff --git a/docker/build-gstreamer/patch/0001-pad-Check-data-NULL-ness-when-probes-are-stopped-fixed-in-1.24.8.patch b/docker/build-gstreamer/patch/0001-pad-Check-data-NULL-ness-when-probes-are-stopped-fixed-in-1.24.8.patch deleted file mode 100644 index 3f3d355..0000000 --- a/docker/build-gstreamer/patch/0001-pad-Check-data-NULL-ness-when-probes-are-stopped-fixed-in-1.24.8.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 78635ce0cd981f4086d254901547ae97caa5e256 Mon Sep 17 00:00:00 2001 -From: Arun Raghavan -Date: Tue, 10 Sep 2024 16:03:05 -0400 -Subject: [PATCH] pad: Check data NULL-ness when probes are stopped - -We were correctly handling this for buffers, but not events and queries. - -Part-of: ---- - subprojects/gstreamer/gst/gstpad.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/subprojects/gstreamer/gst/gstpad.c b/subprojects/gstreamer/gst/gstpad.c -index 276c733c97..355ab9500a 100644 ---- a/subprojects/gstreamer/gst/gstpad.c -+++ b/subprojects/gstreamer/gst/gstpad.c -@@ -4562,7 +4562,7 @@ probe_handled: - probe_stopped: - { - /* We unref the buffer, except if the probe handled it (CUSTOM_SUCCESS_1) */ -- if (!handled) -+ if (data && !handled) - gst_mini_object_unref (GST_MINI_OBJECT_CAST (data)); - - switch (ret) { -@@ -5630,7 +5630,7 @@ inactive: - probe_stopped: - { - GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS); -- if (ret != GST_FLOW_CUSTOM_SUCCESS_1) -+ if (event && ret != GST_FLOW_CUSTOM_SUCCESS_1) - gst_event_unref (event); - - switch (ret) { -@@ -6039,7 +6039,7 @@ probe_stopped: - if (need_unlock) - GST_PAD_STREAM_UNLOCK (pad); - /* Only unref if unhandled */ -- if (ret != GST_FLOW_CUSTOM_SUCCESS_1) -+ if (event && ret != GST_FLOW_CUSTOM_SUCCESS_1) - gst_event_unref (event); - - switch (ret) { --- -2.43.0 - diff --git a/docker/build-gstreamer/patch/0001-cefsrc-download-minimal-package.patch b/docker/build-gstreamer/patch/cefsrc/0001-cefsrc-download-minimal-package.patch similarity index 100% rename from docker/build-gstreamer/patch/0001-cefsrc-download-minimal-package.patch rename to docker/build-gstreamer/patch/cefsrc/0001-cefsrc-download-minimal-package.patch diff --git a/docker/build-gstreamer/patch/0001-cefsrc-unmultiply-alpha.patch b/docker/build-gstreamer/patch/cefsrc/0002-cefsrc-unmultiply-alpha.patch similarity index 100% rename from docker/build-gstreamer/patch/0001-cefsrc-unmultiply-alpha.patch rename to docker/build-gstreamer/patch/cefsrc/0002-cefsrc-unmultiply-alpha.patch diff --git a/docker/build-gstreamer/patch/0001-compositor-add-rounded-corners-property-for-sink-pad.patch b/docker/build-gstreamer/patch/gstreamer/0001-compositor-add-rounded-corners-property-for-sink-pad.patch similarity index 96% rename from docker/build-gstreamer/patch/0001-compositor-add-rounded-corners-property-for-sink-pad.patch rename to docker/build-gstreamer/patch/gstreamer/0001-compositor-add-rounded-corners-property-for-sink-pad.patch index 866aab8..8879312 100644 --- a/docker/build-gstreamer/patch/0001-compositor-add-rounded-corners-property-for-sink-pad.patch +++ b/docker/build-gstreamer/patch/gstreamer/0001-compositor-add-rounded-corners-property-for-sink-pad.patch @@ -1,7 +1,7 @@ -From dd260de0def61760196b76cf33a7bda62280db40 Mon Sep 17 00:00:00 2001 +From 5b2e46069f763665e67e44dd38f5e415fd7da7ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= -Date: Thu, 18 Jul 2024 18:34:55 +0200 -Subject: [PATCH] compositor: add rounded corners property for sink pads +Date: Fri, 22 May 2026 11:22:04 +0200 +Subject: [PATCH 1/2] compositor: add rounded corners property for sink pads --- .../gst/compositor/compositor.c | 239 +++++++++++++++++- @@ -9,7 +9,7 @@ Subject: [PATCH] compositor: add rounded corners property for sink pads 2 files changed, 240 insertions(+), 6 deletions(-) diff --git a/subprojects/gst-plugins-base/gst/compositor/compositor.c b/subprojects/gst-plugins-base/gst/compositor/compositor.c -index 54a2e9dc58..cc40e50add 100644 +index 7e07f2c3ea..336acc44dd 100644 --- a/subprojects/gst-plugins-base/gst/compositor/compositor.c +++ b/subprojects/gst-plugins-base/gst/compositor/compositor.c @@ -41,6 +41,20 @@ @@ -322,12 +322,12 @@ index 54a2e9dc58..cc40e50add 100644 + } +} + - static GstFlowReturn - gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) - { -@@ -1718,6 +1936,15 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) - frames_can_copy (prepared_frame, outframe)) { + static void + copy_metas (GstCompositor * compositor, GstCompositorPad * cpad, + GstVideoFrame * in_frame, GstBuffer * out_buffer) +@@ -1759,6 +1977,15 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) gst_video_frame_copy (outframe, prepared_frame); + copy_metas (compositor, compo_pad, prepared_frame, outbuf); } else { + if (compo_pad->border_radius.has_rounded_corners + && GST_VIDEO_INFO_HAS_ALPHA (&prepared_frame->info)) { @@ -342,7 +342,7 @@ index 54a2e9dc58..cc40e50add 100644 pads_info[n_pads].prepared_frame = prepared_frame; pads_info[n_pads].blend_mode = blend_mode; diff --git a/subprojects/gst-plugins-base/gst/compositor/compositor.h b/subprojects/gst-plugins-base/gst/compositor/compositor.h -index c3d2998422..1b48c1b035 100644 +index 2d4c06c171..274c1e9b4a 100644 --- a/subprojects/gst-plugins-base/gst/compositor/compositor.h +++ b/subprojects/gst-plugins-base/gst/compositor/compositor.h @@ -170,6 +170,13 @@ struct _GstCompositorPad @@ -360,5 +360,5 @@ index c3d2998422..1b48c1b035 100644 GstCompositorOperator op; -- -2.34.1 +2.43.0 diff --git a/docker/build-gstreamer/patch/0001-compositor-add-box-shadow-property-for-sink-pads.patch b/docker/build-gstreamer/patch/gstreamer/0002-compositor-add-box-shadow-property-for-sink-pads.patch similarity index 74% rename from docker/build-gstreamer/patch/0001-compositor-add-box-shadow-property-for-sink-pads.patch rename to docker/build-gstreamer/patch/gstreamer/0002-compositor-add-box-shadow-property-for-sink-pads.patch index 65483be..0048c89 100644 --- a/docker/build-gstreamer/patch/0001-compositor-add-box-shadow-property-for-sink-pads.patch +++ b/docker/build-gstreamer/patch/gstreamer/0002-compositor-add-box-shadow-property-for-sink-pads.patch @@ -1,15 +1,15 @@ -From 31cf4ec891f738fc895f561ed3c7073ee45d2478 Mon Sep 17 00:00:00 2001 +From 6a2de640c50b44cbf8eaeb4a123bec43cafe73db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= -Date: Wed, 24 Jul 2024 17:00:24 +0200 -Subject: [PATCH] compositor: add box-shadow property for sink pads +Date: Fri, 22 May 2026 13:11:25 +0200 +Subject: [PATCH 2/2] compositor: add box-shadow property for sink pads --- - .../gst/compositor/compositor.c | 977 ++++++++++++++---- + .../gst/compositor/compositor.c | 891 +++++++++++++++--- .../gst/compositor/compositor.h | 1 + - 2 files changed, 792 insertions(+), 186 deletions(-) + 2 files changed, 750 insertions(+), 142 deletions(-) diff --git a/subprojects/gst-plugins-base/gst/compositor/compositor.c b/subprojects/gst-plugins-base/gst/compositor/compositor.c -index cc40e50add..c4f9615836 100644 +index 336acc44dd..dfa6f35f3f 100644 --- a/subprojects/gst-plugins-base/gst/compositor/compositor.c +++ b/subprojects/gst-plugins-base/gst/compositor/compositor.c @@ -55,6 +55,16 @@ @@ -64,7 +64,7 @@ index cc40e50add..c4f9615836 100644 */ #ifdef HAVE_CONFIG_H -@@ -232,14 +270,24 @@ enum +@@ -232,8 +270,18 @@ enum PROP_PAD_OPERATOR, PROP_PAD_SIZING_POLICY, PROP_PAD_BORDER_RADIUS, @@ -83,14 +83,6 @@ index cc40e50add..c4f9615836 100644 G_DEFINE_TYPE (GstCompositorPad, gst_compositor_pad, GST_TYPE_VIDEO_AGGREGATOR_PARALLEL_CONVERT_PAD); - static void --gst_compositor_pad_get_property (GObject * object, guint prop_id, -- GValue * value, GParamSpec * pspec) -+gst_compositor_pad_get_property (GObject *object, guint prop_id, -+ GValue *value, GParamSpec *pspec) - { - GstCompositorPad *pad = GST_COMPOSITOR_PAD (object); - @@ -285,6 +333,31 @@ gst_compositor_pad_get_property (GObject * object, guint prop_id, g_value_unset (&radius); } @@ -123,18 +115,7 @@ index cc40e50add..c4f9615836 100644 default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; -@@ -292,8 +365,8 @@ gst_compositor_pad_get_property (GObject * object, guint prop_id, - } - - static void --gst_compositor_pad_set_property (GObject * object, guint prop_id, -- const GValue * value, GParamSpec * pspec) -+gst_compositor_pad_set_property (GObject *object, guint prop_id, -+ const GValue *value, GParamSpec *pspec) - { - GstCompositorPad *pad = GST_COMPOSITOR_PAD (object); - -@@ -379,6 +452,76 @@ gst_compositor_pad_set_property (GObject * object, guint prop_id, +@@ -379,12 +452,99 @@ gst_compositor_pad_set_property (GObject * object, guint prop_id, pad->op == COMPOSITOR_OPERATOR_ADD || pad->border_radius.has_rounded_corners); break; @@ -211,14 +192,11 @@ index cc40e50add..c4f9615836 100644 default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; -@@ -386,9 +529,26 @@ gst_compositor_pad_set_property (GObject * object, guint prop_id, + } } - static void --_mixer_pad_get_output_size (GstCompositor * comp, GstCompositorPad * comp_pad, -- gint out_par_n, gint out_par_d, gint * width, gint * height, -- gint * x_offset, gint * y_offset) -+gst_compositor_pad_dispose (GObject *object) ++static void ++gst_compositor_pad_dispose (GObject * object) +{ + GstCompositorPad *pad = GST_COMPOSITOR_PAD (object); + @@ -234,13 +212,9 @@ index cc40e50add..c4f9615836 100644 + G_OBJECT_CLASS (gst_compositor_pad_parent_class)->dispose (object); +} + -+static void -+_mixer_pad_get_output_size (GstCompositor *comp, GstCompositorPad *comp_pad, -+ gint out_par_n, gint out_par_d, gint *width, gint *height, -+ gint *x_offset, gint *y_offset) - { - GstVideoAggregatorPad *vagg_pad = GST_VIDEO_AGGREGATOR_PAD (comp_pad); - gint pad_width, pad_height; + static void + _mixer_pad_get_output_size (GstCompositor * comp, GstCompositorPad * comp_pad, + gint out_par_n, gint out_par_d, gint * width, gint * height, @@ -538,30 +698,70 @@ is_rectangle_contained (const GstVideoRectangle rect1, return FALSE; } @@ -249,8 +223,8 @@ index cc40e50add..c4f9615836 100644 -clamp_rectangle (gint x, gint y, gint w, gint h, gint outer_width, - gint outer_height) +static void -+extend_rectangle_with_box_shadows (GstVideoRectangle *rect, -+ GstCompositorPad *pad) ++extend_rectangle_with_box_shadows (GstVideoRectangle * rect, ++ GstCompositorPad * pad) { - gint x2 = x + w; - gint y2 = y + h; @@ -296,7 +270,7 @@ index cc40e50add..c4f9615836 100644 +} + +static void -+clamp_rectangle (GstVideoRectangle *rect, gint outer_width, gint outer_height) ++clamp_rectangle (GstVideoRectangle * rect, gint outer_width, gint outer_height) +{ + gint x2 = rect->x + rect->w; + gint y2 = rect->y + rect->h; @@ -321,8 +295,8 @@ index cc40e50add..c4f9615836 100644 static gboolean -_pad_obscures_rectangle (GstVideoAggregator * vagg, GstVideoAggregatorPad * pad, - const GstVideoRectangle rect) -+_pad_image_fully_hide_underneath_rectangle (GstVideoAggregator *vagg, -+ GstVideoAggregatorPad *pad, const GstVideoRectangle rect) ++_pad_image_fully_hide_underneath_rectangle (GstVideoAggregator * vagg, ++ GstVideoAggregatorPad * pad, const GstVideoRectangle rect) { GstVideoRectangle pad_rect; GstCompositorPad *cpad = GST_COMPOSITOR_PAD (pad); @@ -376,17 +350,7 @@ index cc40e50add..c4f9615836 100644 GST_DEBUG_OBJECT (pad, "Pad %s %ix%i@(%i,%i) obscures rect %ix%i@(%i,%i)", GST_PAD_NAME (pad), pad_rect.w, pad_rect.h, pad_rect.x, pad_rect.y, -@@ -616,16 +855,16 @@ _pad_obscures_rectangle (GstVideoAggregator * vagg, GstVideoAggregatorPad * pad, - } - - static void --gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad * pad, -- GstVideoAggregator * vagg, GstBuffer * buffer, -- GstVideoFrame * prepared_frame) -+gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad *pad, -+ GstVideoAggregator *vagg, GstBuffer *buffer, GstVideoFrame *prepared_frame) - { - GstCompositorPad *cpad = GST_COMPOSITOR_PAD (pad); +@@ -624,8 +863,9 @@ gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad * pad, gint width, height; gboolean frame_obscured = FALSE; GList *l; @@ -398,7 +362,7 @@ index cc40e50add..c4f9615836 100644 GstVideoRectangle frame_rect; /* There's three types of width/height here: -@@ -652,9 +891,13 @@ gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad * pad, +@@ -652,9 +892,13 @@ gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad * pad, if (gst_aggregator_pad_is_inactive (GST_AGGREGATOR_PAD (pad))) return; @@ -415,7 +379,7 @@ index cc40e50add..c4f9615836 100644 if (frame_rect.w == 0 || frame_rect.h == 0) { GST_DEBUG_OBJECT (pad, "Resulting frame is zero-width or zero-height " -@@ -685,7 +928,7 @@ gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad * pad, +@@ -685,7 +929,7 @@ gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad * pad, continue; } @@ -424,27 +388,7 @@ index cc40e50add..c4f9615836 100644 frame_obscured = TRUE; break; } -@@ -701,8 +944,8 @@ gst_compositor_pad_prepare_frame_start (GstVideoAggregatorPad * pad, - } - - static void --gst_compositor_pad_create_conversion_info (GstVideoAggregatorConvertPad * pad, -- GstVideoAggregator * vagg, GstVideoInfo * conversion_info) -+gst_compositor_pad_create_conversion_info (GstVideoAggregatorConvertPad *pad, -+ GstVideoAggregator *vagg, GstVideoInfo *conversion_info) - { - GstCompositor *self = GST_COMPOSITOR (vagg); - GstCompositorPad *cpad = GST_COMPOSITOR_PAD (pad); -@@ -763,7 +1006,7 @@ gst_compositor_pad_create_conversion_info (GstVideoAggregatorConvertPad * pad, - } - - static void --gst_compositor_pad_class_init (GstCompositorPadClass * klass) -+gst_compositor_pad_class_init (GstCompositorPadClass *klass) - { - GObjectClass *gobject_class = (GObjectClass *) klass; - GstVideoAggregatorPadClass *vaggpadclass = -@@ -773,6 +1016,7 @@ gst_compositor_pad_class_init (GstCompositorPadClass * klass) +@@ -773,6 +1017,7 @@ gst_compositor_pad_class_init (GstCompositorPadClass * klass) gobject_class->set_property = gst_compositor_pad_set_property; gobject_class->get_property = gst_compositor_pad_get_property; @@ -452,7 +396,7 @@ index cc40e50add..c4f9615836 100644 g_object_class_install_property (gobject_class, PROP_PAD_XPOS, g_param_spec_int ("xpos", "X Position", "X Position of the picture", -@@ -844,6 +1088,33 @@ gst_compositor_pad_class_init (GstCompositorPadClass * klass) +@@ -844,6 +1089,33 @@ gst_compositor_pad_class_init (GstCompositorPadClass * klass) G_PARAM_STATIC_STRINGS), G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); @@ -486,130 +430,7 @@ index cc40e50add..c4f9615836 100644 vaggpadclass->prepare_frame_start = GST_DEBUG_FUNCPTR (gst_compositor_pad_prepare_frame_start); -@@ -854,7 +1125,7 @@ gst_compositor_pad_class_init (GstCompositorPadClass * klass) - } - - static void --gst_compositor_pad_init (GstCompositorPad * compo_pad) -+gst_compositor_pad_init (GstCompositorPad *compo_pad) - { - compo_pad->xpos = DEFAULT_PAD_XPOS; - compo_pad->ypos = DEFAULT_PAD_YPOS; -@@ -891,8 +1162,8 @@ enum - }; - - static void --gst_compositor_get_property (GObject * object, -- guint prop_id, GValue * value, GParamSpec * pspec) -+gst_compositor_get_property (GObject *object, -+ guint prop_id, GValue *value, GParamSpec *pspec) - { - GstCompositor *self = GST_COMPOSITOR (object); - -@@ -917,8 +1188,8 @@ gst_compositor_get_property (GObject * object, - } - - static void --gst_compositor_set_property (GObject * object, -- guint prop_id, const GValue * value, GParamSpec * pspec) -+gst_compositor_set_property (GObject *object, -+ guint prop_id, const GValue *value, GParamSpec *pspec) - { - GstCompositor *self = GST_COMPOSITOR (object); - -@@ -950,7 +1221,7 @@ GST_ELEMENT_REGISTER_DEFINE (compositor, "compositor", GST_RANK_PRIMARY + 1, - GST_TYPE_COMPOSITOR); - - static gboolean --set_functions (GstCompositor * self, const GstVideoInfo * info) -+set_functions (GstCompositor *self, const GstVideoInfo *info) - { - gint offset[GST_VIDEO_MAX_COMPONENTS] = { 0, }; - gint scale[GST_VIDEO_MAX_COMPONENTS] = { 0, }; -@@ -1295,7 +1566,7 @@ set_functions (GstCompositor * self, const GstVideoInfo * info) - } - - static GstCaps * --_fixate_caps (GstAggregator * agg, GstCaps * caps) -+_fixate_caps (GstAggregator *agg, GstCaps *caps) - { - GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg); - GList *l; -@@ -1395,7 +1666,7 @@ gst_parallelized_task_thread_func (gpointer data) - } - - static void --gst_parallelized_task_runner_join (GstParallelizedTaskRunner * self) -+gst_parallelized_task_runner_join (GstParallelizedTaskRunner *self) - { - gboolean joined = FALSE; - -@@ -1412,7 +1683,7 @@ gst_parallelized_task_runner_join (GstParallelizedTaskRunner * self) - } - - static void --gst_parallelized_task_runner_free (GstParallelizedTaskRunner * self) -+gst_parallelized_task_runner_free (GstParallelizedTaskRunner *self) - { - gst_parallelized_task_runner_join (self); - -@@ -1425,7 +1696,7 @@ gst_parallelized_task_runner_free (GstParallelizedTaskRunner * self) - } - - static GstParallelizedTaskRunner * --gst_parallelized_task_runner_new (guint n_threads, GstTaskPool * pool, -+gst_parallelized_task_runner_new (guint n_threads, GstTaskPool *pool, - gboolean async_tasks) - { - GstParallelizedTaskRunner *self; -@@ -1469,7 +1740,7 @@ gst_parallelized_task_runner_new (guint n_threads, GstTaskPool * pool, - } - - static void --gst_parallelized_task_runner_finish (GstParallelizedTaskRunner * self) -+gst_parallelized_task_runner_finish (GstParallelizedTaskRunner *self) - { - g_return_if_fail (self->func != NULL); - -@@ -1480,8 +1751,8 @@ gst_parallelized_task_runner_finish (GstParallelizedTaskRunner * self) - } - - static void --gst_parallelized_task_runner_run (GstParallelizedTaskRunner * self, -- GstParallelizedTaskFunc func, gpointer * task_data) -+gst_parallelized_task_runner_run (GstParallelizedTaskRunner *self, -+ GstParallelizedTaskFunc func, gpointer *task_data) - { - guint n_threads = self->n_threads; - -@@ -1521,7 +1792,7 @@ gst_parallelized_task_runner_run (GstParallelizedTaskRunner * self, - } - - static gboolean --_negotiated_caps (GstAggregator * agg, GstCaps * caps) -+_negotiated_caps (GstAggregator *agg, GstCaps *caps) - { - GstCompositor *compositor = GST_COMPOSITOR (agg); - GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg); -@@ -1620,7 +1891,7 @@ _negotiated_caps (GstAggregator * agg, GstCaps * caps) - } - - static gboolean --gst_composior_stop (GstAggregator * agg) -+gst_composior_stop (GstAggregator *agg) - { - GstCompositor *self = GST_COMPOSITOR (agg); - -@@ -1631,7 +1902,7 @@ gst_composior_stop (GstAggregator * agg) - } - - static gboolean --_should_draw_background (GstVideoAggregator * vagg) -+_should_draw_background (GstVideoAggregator *vagg) - { - GstVideoRectangle bg_rect; - gboolean draw = TRUE; -@@ -1651,7 +1922,7 @@ _should_draw_background (GstVideoAggregator * vagg) +@@ -1651,7 +1923,7 @@ _should_draw_background (GstVideoAggregator * vagg) (l->data)) == NULL) continue; @@ -618,16 +439,7 @@ index cc40e50add..c4f9615836 100644 draw = FALSE; break; } -@@ -1661,7 +1932,7 @@ _should_draw_background (GstVideoAggregator * vagg) - } - - static gboolean --frames_can_copy (const GstVideoFrame * frame1, const GstVideoFrame * frame2) -+frames_can_copy (const GstVideoFrame *frame1, const GstVideoFrame *frame2) - { - if (GST_VIDEO_FRAME_FORMAT (frame1) != GST_VIDEO_FRAME_FORMAT (frame2)) - return FALSE; -@@ -1672,14 +1943,157 @@ frames_can_copy (const GstVideoFrame * frame1, const GstVideoFrame * frame2) +@@ -1672,14 +1944,157 @@ frames_can_copy (const GstVideoFrame * frame1, const GstVideoFrame * frame2) return TRUE; } @@ -655,7 +467,7 @@ index cc40e50add..c4f9615836 100644 +} CompositePadInfo; + +static gboolean -+extract_composite_pad_info (GstCompositorPad *pad, CompositePadInfo *info) ++extract_composite_pad_info (GstCompositorPad * pad, CompositePadInfo * info) +{ + GstVideoFrame *prepared_frame = + gst_video_aggregator_pad_get_prepared_frame (GST_VIDEO_AGGREGATOR_PAD @@ -788,7 +600,7 @@ index cc40e50add..c4f9615836 100644 { GstCompositor *compositor; GstVideoFrame *out_frame; -@@ -1687,12 +2101,12 @@ struct CompositeTask +@@ -1687,8 +2102,8 @@ struct CompositeTask guint dst_line_end; gboolean draw_background; guint n_pads; @@ -798,20 +610,14 @@ index cc40e50add..c4f9615836 100644 +} CompositeTask; static void --_draw_background (GstCompositor * comp, GstVideoFrame * outframe, -- guint y_start, guint y_end, BlendFunction * composite) -+_draw_background (GstCompositor *comp, GstVideoFrame *outframe, -+ guint y_start, guint y_end, BlendFunction *composite) - { - *composite = comp->blend; - -@@ -1750,96 +2164,83 @@ _draw_background (GstCompositor * comp, GstVideoFrame * outframe, + _draw_background (GstCompositor * comp, GstVideoFrame * outframe, +@@ -1750,96 +2165,83 @@ _draw_background (GstCompositor * comp, GstVideoFrame * outframe, } static void -blend_pads (struct CompositeTask *comp) -+cut_off_rounded_corners (const GstVideoRectangle *visible_rect, -+ const guint *border_radius, GstVideoFrame *frame) ++cut_off_rounded_corners (const GstVideoRectangle * visible_rect, ++ const guint * border_radius, GstVideoFrame * frame) { - BlendFunction composite; - guint i; @@ -958,7 +764,7 @@ index cc40e50add..c4f9615836 100644 *(guint16 *) component *= coeff; } else { *component *= coeff; -@@ -1851,15 +2252,236 @@ cut_off_rounded_corners (GstCompositorPad * pad, GstVideoFrame * frame) +@@ -1851,6 +2253,228 @@ cut_off_rounded_corners (GstCompositorPad * pad, GstVideoFrame * frame) } } @@ -1001,7 +807,8 @@ index cc40e50add..c4f9615836 100644 + +static float +compute_box_shadow_alpha_coeff (guint x, guint y, -+ const BoxShadowFrame *shadow, float blur_coeff, const guint *border_radius) ++ const BoxShadowFrame * shadow, float blur_coeff, ++ const guint * border_radius) +{ + float alpha_coeff = 1.f; + guint blur_extent = shadow->shadow.blur << 1; @@ -1070,8 +877,8 @@ index cc40e50add..c4f9615836 100644 +} + +static void -+fill_shadow_frame (const GstVideoRectangle *visible_rect, -+ const BoxShadowFrame *shadow, const CompositePadInfo *info) ++fill_shadow_frame (const GstVideoRectangle * visible_rect, ++ const BoxShadowFrame * shadow, const CompositePadInfo * info) +{ + g_assert (visible_rect->x >= 0); + g_assert (visible_rect->y >= 0); @@ -1120,8 +927,8 @@ index cc40e50add..c4f9615836 100644 +} + +static gboolean -+has_visible_src_rect (GstVideoRectangle *visible_src_rect_out, -+ const GstVideoRectangle *dest_rect, const CompositeTask *task) ++has_visible_src_rect (GstVideoRectangle * visible_src_rect_out, ++ const GstVideoRectangle * dest_rect, const CompositeTask * task) +{ + visible_src_rect_out->x = MAX (0, -dest_rect->x); + visible_src_rect_out->y = MAX (0, (gint) task->dst_line_start - dest_rect->y); @@ -1137,7 +944,7 @@ index cc40e50add..c4f9615836 100644 +} + +static void -+blend_pads (CompositeTask *comp) ++blend_pads (CompositeTask * comp) +{ + BlendFunction composite = comp->compositor->blend; + @@ -1183,12 +990,10 @@ index cc40e50add..c4f9615836 100644 + } +} + - static GstFlowReturn --gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) -+gst_compositor_aggregate_frames (GstVideoAggregator *vagg, GstBuffer *outbuf) - { - GstCompositor *compositor = GST_COMPOSITOR (vagg); - GList *l; + static void + copy_metas (GstCompositor * compositor, GstCompositorPad * cpad, + GstVideoFrame * in_frame, GstBuffer * out_buffer) +@@ -1898,7 +2522,7 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) GstVideoFrame out_frame, intermediate_frame, *outframe; gboolean draw_background; guint drawn_a_pad = FALSE; @@ -1196,8 +1001,8 @@ index cc40e50add..c4f9615836 100644 + CompositePadInfo *pads_info; guint i, n_pads = 0; - if (!gst_video_frame_map (&out_frame, &vagg->info, outbuf, GST_MAP_WRITE)) { -@@ -1902,52 +2524,25 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) + if (!gst_video_frame_map (&out_frame, &vagg->info, outbuf, +@@ -1942,53 +2566,26 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) if (n_pads == 0) draw_background = TRUE; @@ -1242,10 +1047,12 @@ index cc40e50add..c4f9615836 100644 if (!drawn_a_pad && !draw_background && - frames_can_copy (prepared_frame, outframe)) { - gst_video_frame_copy (outframe, prepared_frame); +- copy_metas (compositor, compo_pad, prepared_frame, outbuf); + !compo_info->has_rounded_corners && + !compo_info->box_shadows && + frames_can_copy (compo_info->prepared_frame, outframe)) { + gst_video_frame_copy (outframe, compo_info->prepared_frame); ++ copy_metas (compositor, compo_pad, compo_info->prepared_frame, outbuf); } else { - if (compo_pad->border_radius.has_rounded_corners - && GST_VIDEO_INFO_HAS_ALPHA (&prepared_frame->info)) { @@ -1262,7 +1069,7 @@ index cc40e50add..c4f9615836 100644 n_pads++; } drawn_a_pad = TRUE; -@@ -1957,13 +2552,13 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) +@@ -1998,13 +2595,13 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) { guint n_threads, lines_per_thread; guint out_height; @@ -1280,11 +1087,11 @@ index cc40e50add..c4f9615836 100644 out_height = GST_VIDEO_FRAME_HEIGHT (outframe); lines_per_thread = (out_height + n_threads - 1) / n_threads; -@@ -1988,6 +2583,16 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) +@@ -2029,6 +2626,15 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) (GstParallelizedTaskFunc) blend_pads, (gpointer *) tasks_p); } -+ for (guint i = 0; i < n_pads; ++i) { ++ for (i = 0; i < n_pads; ++i) { + CompositePadInfo *pad_info = pads_info + i; + + for (guint j = 0; j < pad_info->box_shadows_len; ++j) { @@ -1292,114 +1099,20 @@ index cc40e50add..c4f9615836 100644 + } + g_free (pad_info->box_shadows); + } -+ g_free (pads_info); + GST_OBJECT_UNLOCK (vagg); if (compositor->intermediate_frame) { -@@ -2003,8 +2608,8 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) - } - - static GstPad * --gst_compositor_request_new_pad (GstElement * element, GstPadTemplate * templ, -- const gchar * req_name, const GstCaps * caps) -+gst_compositor_request_new_pad (GstElement *element, GstPadTemplate *templ, -+ const gchar *req_name, const GstCaps *caps) - { - GstPad *newpad; - -@@ -2028,7 +2633,7 @@ could_not_create: - } - - static void --gst_compositor_release_pad (GstElement * element, GstPad * pad) -+gst_compositor_release_pad (GstElement *element, GstPad *pad) - { - GstCompositor *compositor; - -@@ -2043,7 +2648,7 @@ gst_compositor_release_pad (GstElement * element, GstPad * pad) - } - - static gboolean --src_pad_mouse_event (GstElement * element, GstPad * pad, gpointer user_data) -+src_pad_mouse_event (GstElement *element, GstPad *pad, gpointer user_data) - { - GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR_CAST (element); - GstCompositor *comp = GST_COMPOSITOR (element); -@@ -2086,7 +2691,7 @@ src_pad_mouse_event (GstElement * element, GstPad * pad, gpointer user_data) - } - - static gboolean --_src_event (GstAggregator * agg, GstEvent * event) -+_src_event (GstAggregator *agg, GstEvent *event) - { - GstNavigationEventType event_type; - -@@ -2116,7 +2721,7 @@ _src_event (GstAggregator * agg, GstEvent * event) - } - - static gboolean --_sink_query (GstAggregator * agg, GstAggregatorPad * bpad, GstQuery * query) -+_sink_query (GstAggregator *agg, GstAggregatorPad *bpad, GstQuery *query) - { - switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_ALLOCATION:{ -@@ -2158,7 +2763,7 @@ _sink_query (GstAggregator * agg, GstAggregatorPad * bpad, GstQuery * query) - } - - static void --gst_compositor_finalize (GObject * object) -+gst_compositor_finalize (GObject *object) - { - GstCompositor *compositor = GST_COMPOSITOR (object); - -@@ -2171,7 +2776,7 @@ gst_compositor_finalize (GObject * object) - - /* GObject boilerplate */ - static void --gst_compositor_class_init (GstCompositorClass * klass) -+gst_compositor_class_init (GstCompositorClass *klass) - { - GObjectClass *gobject_class = (GObjectClass *) klass; - GstElementClass *gstelement_class = (GstElementClass *) klass; -@@ -2265,7 +2870,7 @@ gst_compositor_class_init (GstCompositorClass * klass) - } - - static void --gst_compositor_init (GstCompositor * self) -+gst_compositor_init (GstCompositor *self) - { - /* initialize variables */ - self->background = DEFAULT_BACKGROUND; -@@ -2275,7 +2880,7 @@ gst_compositor_init (GstCompositor * self) +@@ -2046,6 +2652,7 @@ gst_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf) + outbuf); + } + GST_OBJECT_UNLOCK (vagg); ++ g_free (pads_info); - /* GstChildProxy implementation */ - static GObject * --gst_compositor_child_proxy_get_child_by_index (GstChildProxy * child_proxy, -+gst_compositor_child_proxy_get_child_by_index (GstChildProxy *child_proxy, - guint index) - { - GstCompositor *compositor = GST_COMPOSITOR (child_proxy); -@@ -2291,7 +2896,7 @@ gst_compositor_child_proxy_get_child_by_index (GstChildProxy * child_proxy, + return GST_FLOW_OK; } - - static guint --gst_compositor_child_proxy_get_children_count (GstChildProxy * child_proxy) -+gst_compositor_child_proxy_get_children_count (GstChildProxy *child_proxy) - { - guint count = 0; - GstCompositor *compositor = GST_COMPOSITOR (child_proxy); -@@ -2315,7 +2920,7 @@ gst_compositor_child_proxy_init (gpointer g_iface, gpointer iface_data) - - /* Element registration */ - static gboolean --plugin_init (GstPlugin * plugin) -+plugin_init (GstPlugin *plugin) - { - GST_DEBUG_CATEGORY_INIT (gst_compositor_debug, "compositor", 0, "compositor"); - diff --git a/subprojects/gst-plugins-base/gst/compositor/compositor.h b/subprojects/gst-plugins-base/gst/compositor/compositor.h -index 1b48c1b035..72185e5a4c 100644 +index 274c1e9b4a..d02da25afd 100644 --- a/subprojects/gst-plugins-base/gst/compositor/compositor.h +++ b/subprojects/gst-plugins-base/gst/compositor/compositor.h @@ -177,6 +177,7 @@ struct _GstCompositorPad diff --git a/docker/build-gstreamer/patch/0001-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch b/docker/build-gstreamer/patch/gstreamer/0003-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch similarity index 88% rename from docker/build-gstreamer/patch/0001-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch rename to docker/build-gstreamer/patch/gstreamer/0003-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch index 4e19d3e..a9fe834 100644 --- a/docker/build-gstreamer/patch/0001-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch +++ b/docker/build-gstreamer/patch/gstreamer/0003-Reduce-logs-verbosity-in-webrtcbin-when-a-FEC-decode.patch @@ -9,10 +9,10 @@ Subject: [PATCH] Reduce logs verbosity in webrtcbin when a FEC decoder cannot 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c b/subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c -index 0e315ac466..3acae76b6f 100644 +index a2bac2dc1b..87072805f4 100644 --- a/subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c +++ b/subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c -@@ -5013,7 +5013,7 @@ try_match_transceiver_with_fec_decoder (GstWebRTCBin * webrtc, +@@ -5110,7 +5110,7 @@ try_match_transceiver_with_fec_decoder (GstWebRTCBin * webrtc, if (original_pt == item->pt && item->media_idx != -1 && item->media_idx == trans->parent.mline) { if (trans->ulpfecdec) { @@ -21,7 +21,7 @@ index 0e315ac466..3acae76b6f 100644 gst_clear_object (&trans->ulpfecdec); } trans->ulpfecdec = gst_object_ref (fecdec); -@@ -5023,7 +5023,7 @@ try_match_transceiver_with_fec_decoder (GstWebRTCBin * webrtc, +@@ -5120,7 +5120,7 @@ try_match_transceiver_with_fec_decoder (GstWebRTCBin * webrtc, } if (!found_transceiver) { @@ -32,4 +32,3 @@ index 0e315ac466..3acae76b6f 100644 } -- 2.43.0 - diff --git a/docker/cef-config.sh b/docker/cef-config.sh index e04df65..a516afa 100644 --- a/docker/cef-config.sh +++ b/docker/cef-config.sh @@ -1 +1,3 @@ -export CEF_VERSION=146.0.10+g8219561+chromium-146.0.7680.179 +export CEF_REPOSITORY=https://github.com/centricular/gstcefsrc +export CEF_CHECKOUT=b63340852fc93b0ab67b07200e1ff44f59ba6769 +export CEF_VERSION=147.0.14+g76d2442+chromium-147.0.7727.138 diff --git a/docker/install-arch-specific-dependencies.sh b/docker/install-arch-specific-dependencies.sh index af6c879..df4b36e 100755 --- a/docker/install-arch-specific-dependencies.sh +++ b/docker/install-arch-specific-dependencies.sh @@ -3,6 +3,6 @@ ARCH=$(dpkg --print-architecture) if [[ $ARCH == "amd64" ]]; then apt-get install -y --no-install-recommends \ - libmfx1 \ + libmfx-gen1.2 \ intel-media-va-driver-non-free fi