diff --git a/.github/workflows/gst-libav1.0.yml b/.github/workflows/gst-libav1.0.yml new file mode 100644 index 0000000..6409951 --- /dev/null +++ b/.github/workflows/gst-libav1.0.yml @@ -0,0 +1,148 @@ +name: gst-libav1.0 Build and Test + +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build_and_test: + name: Build & Test gst-libav1.0 + runs-on: ubuntu-latest + container: + image: ubuntu:25.04 + options: --user root + timeout-minutes: 60 + + strategy: + matrix: + gst_ref: [ 'master', 'debian/1.26.2-1', 'debian/1.26.3-1' ] + fail-fast: false + + steps: + - name: Checkout gnutls-wolfssl repository + uses: actions/checkout@v4 + + - name: Install Meson and ninja + run: | + apt-get update + apt-get install -y sudo meson ninja-build + + - name: Install GStreamer ≥1.26 dev-packages + run: | + apt-get update + apt-get install -y \ + libgstreamer1.0-dev \ + libgstreamer-plugins-base1.0-dev \ + gstreamer1.0-tools + + - name: Install build tools & dependencies + run: | + apt-get install -y \ + build-essential autoconf automake pkg-config yasm git \ + meson ninja-build cmake \ + libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \ + libavcodec-dev libavformat-dev libavutil-dev libavfilter-dev \ + gstreamer1.0-tools \ + gstreamer1.0-plugins-base \ + gstreamer1.0-plugins-good \ + gstreamer1.0-plugins-bad \ + gstreamer1.0-libav \ + gnulib autopoint gperf gtk-doc-tools nettle-dev \ + clang libtasn1-bin libtasn1-6-dev libunistring-dev \ + libp11-kit-dev libunbound-dev wget gtk-doc-tools libswscale-dev libswresample-dev + + - name: Build GnuTLS with wolfSSL provider + run: | + GNUTLS_INSTALL=/opt/gnutls WOLFSSL_INSTALL=/opt/wolfssl ./setup.sh + + - name: Verify GnuTLS install + run: | + test -d /opt/gnutls/lib || (echo "/opt/gnutls/lib missing" && exit 1) + + - name: Build FFmpeg with GnuTLS & MPEG-4 encoder + run: | + cd $RUNNER_WORKSPACE + git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg-gnutls + cd ffmpeg-gnutls + export PKG_CONFIG_PATH="/opt/gnutls/lib/pkgconfig" + export CPPFLAGS="-I/opt/gnutls/include" + export LDFLAGS="-L/opt/gnutls/lib -Wl,-rpath,/opt/gnutls/lib" + export LD_LIBRARY_PATH="/opt/gnutls/lib:$LD_LIBRARY_PATH" + ./configure \ + --prefix=/opt/ffmpeg-gnutls \ + --disable-openssl \ + --enable-gnutls \ + --enable-encoder=mpeg4 \ + --disable-x86asm \ + --enable-shared + make -j"$(nproc)" && make install + + - name: Verify libav* link against custom GnuTLS + run: | + export PKG_CONFIG_PATH="/opt/gnutls/lib/pkgconfig:/opt/ffmpeg-gnutls/lib/pkgconfig:$PKG_CONFIG_PATH" + export CPPFLAGS="-I/opt/gnutls/include -I/opt/ffmpeg-gnutls/include $CPPFLAGS" + export LDFLAGS="-L/opt/gnutls/lib -L/opt/ffmpeg-gnutls/lib \ + -Wl,-rpath,/opt/gnutls/lib -Wl,-rpath=/opt/ffmpeg-gnutls/lib $LDFLAGS" + export LD_LIBRARY_PATH="/opt/gnutls/lib:/opt/ffmpeg-gnutls/lib:$LD_LIBRARY_PATH" + for lib in libavformat.so.62 libavfilter.so.11; do + echo ">>> ldd for $lib:" + ldd /opt/ffmpeg-gnutls/lib/$lib + if ! ldd /opt/ffmpeg-gnutls/lib/$lib \ + | grep -q '/opt/gnutls/lib/libgnutls.so.30'; then + echo "✖ $lib is NOT using custom GnuTLS" + exit 1 + fi + echo "✔ $lib is using custom GnuTLS" + done + + - name: Clone & checkout gst-libav1.0 @ ${{ matrix.gst_ref }} + run: | + git clone https://salsa.debian.org/gstreamer-team/gst-libav1.0.git gst-libav + cd gst-libav + git fetch --tags + git checkout ${{ matrix.gst_ref }} + + - name: Build gst-libav1.0 (${{ matrix.gst_ref }}) + working-directory: gst-libav + run: | + export PKG_CONFIG_PATH="/opt/gnutls/lib/pkgconfig:/opt/ffmpeg-gnutls/lib/pkgconfig:$PKG_CONFIG_PATH" + export CPPFLAGS="-I/opt/gnutls/include -I/opt/ffmpeg-gnutls/include $CPPFLAGS" + export LDFLAGS="-L/opt/gnutls/lib -L/opt/ffmpeg-gnutls/lib \ + -Wl,-rpath,/opt/gnutls/lib -Wl,-rpath=/opt/ffmpeg-gnutls/lib $LDFLAGS" + export LD_LIBRARY_PATH="/opt/gnutls/lib:/opt/ffmpeg-gnutls/lib:$LD_LIBRARY_PATH" + rm -rf build + meson setup build --prefix=/usr -Ddoc=disabled -Dtests=enabled + ninja -C build + + - name: Smoke-test plugin with gst-inspect & playbin + working-directory: gst-libav + run: | + export PKG_CONFIG_PATH="/opt/gnutls/lib/pkgconfig:/opt/ffmpeg-gnutls/lib/pkgconfig:$PKG_CONFIG_PATH" + export CPPFLAGS="-I/opt/gnutls/include -I/opt/ffmpeg-gnutls/include $CPPFLAGS" + export LDFLAGS="-L/opt/gnutls/lib -L/opt/ffmpeg-gnutls/lib \ + -Wl,-rpath,/opt/gnutls/lib -Wl,-rpath=/opt/ffmpeg-gnutls/lib $LDFLAGS" + export LD_LIBRARY_PATH="/opt/gnutls/lib:/opt/ffmpeg-gnutls/lib:$LD_LIBRARY_PATH" + PAGER=cat \ + GST_PLUGIN_PATH=$(pwd)/build \ + GST_PLUGIN_SYSTEM_PATH_1_0=/usr/lib/x86_64-linux-gnu/gstreamer-1.0 \ + gst-inspect-1.0 libav + timeout 30s env \ + GST_PLUGIN_PATH=$(pwd)/build \ + GST_PLUGIN_SYSTEM_PATH_1_0=/usr/lib/x86_64-linux-gnu/gstreamer-1.0 \ + gst-launch-1.0 -v playbin \ + uri=https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8 || test $? -eq 124 + + - name: Run upstream gst-libav tests + working-directory: gst-libav + run: | + export PKG_CONFIG_PATH="/opt/gnutls/lib/pkgconfig:/opt/ffmpeg-gnutls/lib/pkgconfig:$PKG_CONFIG_PATH" + export CPPFLAGS="-I/opt/gnutls/include -I/opt/ffmpeg-gnutls/include $CPPFLAGS" + export LDFLAGS="-L/opt/gnutls/lib -L/opt/ffmpeg-gnutls/lib \ + -Wl,-rpath,/opt/gnutls/lib -Wl,-rpath=/opt/ffmpeg-gnutls/lib $LDFLAGS" + export LD_LIBRARY_PATH="/opt/gnutls/lib:/opt/ffmpeg-gnutls/lib:$LD_LIBRARY_PATH" + meson test -C build --print-errorlogs