# Bundled media tools (ffprobe, ffmpeg)
`ffprobe.gz` and `ffmpeg.gz` are gzipped aarch64 binaries shipped in the **BrightSign player package
only**. `bs-server-boot.js` unpacks them into `/tmp/screentinker-bin` at boot — every writable volume
on a BrightSign player is mounted `noexec`, so a copy onto tmpfs is the only way to execute anything
— and puts that directory on `PATH` so the server's normal ffprobe/ffmpeg lookups find them.
## What they are
Unmodified **FFmpeg 7.1.1** (), licensed **LGPL 2.1 or later**. See
`COPYING.LGPLv2.1` in this directory, which ships beside the binaries in the package.
Configured `--disable-gpl`, so **no GPL component is present**, including `libpostproc` (GPL-only).
This is deliberate: it keeps the shipped tree free of copyleft beyond the LGPL, which the licence
position for underwriting and procurement depends on.
## Rebuilding them
Cross-built on Ubuntu with `aarch64-linux-gnu-gcc`. ffprobe carries **no decoders** — duration and
stream geometry come from the container — which is why it is 1.8MB against ffmpeg's 4.9MB.
```sh
./configure \
--arch=aarch64 --target-os=linux --enable-cross-compile \
--cross-prefix=aarch64-linux-gnu- \
--disable-gpl --disable-nonfree --disable-autodetect \
--disable-shared --enable-static --enable-small \
--disable-doc --disable-network --disable-debug --disable-ffplay \
--extra-version="ScreenTinker" \
--disable-everything \
--enable-demuxer=mov,matroska,mp3,image2,wav,avi,flv,mpegts,ogg,aac \
--enable-muxer=image2,mjpeg \
--enable-decoder=h264,hevc,vp8,vp9,av1,mpeg4,mjpeg,aac,mp3,vorbis,opus,pcm_s16le \
--enable-encoder=mjpeg \
--enable-parser=h264,hevc,vp8,vp9,av1,mpeg4video,mjpeg,mpegaudio,aac \
--enable-filter=scale,transpose,hflip,vflip,format,null,copy,crop,setsar \
--enable-protocol=file --enable-swscale \
--extra-cflags="-Os -ffunction-sections -fdata-sections" \
--extra-ldflags="-static -Wl,--gc-sections"
make -j"$(nproc)" ffmpeg ffprobe
gzip -9 -c ffprobe > brightsign/media-tools/ffprobe.gz
gzip -9 -c ffmpeg > brightsign/media-tools/ffmpeg.gz
```
Test the result with `qemu-aarch64-static ./ffprobe -version` before putting it near a device.
## ⚠️ Do not substitute a distribution build
A stock Debian `ffprobe` linked against BrightSignOS's own libav stack starts, prints its banner, and
then **SIGSEGVs** on the first file it opens: their Yocto build is patched for hardware decode.
Debian's is also built `--enable-gpl`. These binaries deliberately link nothing of the platform's.
## LGPL section 6
These are statically linked, so the licence requires that we can supply the corresponding source and
the object files needed to relink against a modified library. The configure line above plus the
upstream 7.1.1 tarball reproduces them exactly; the written offer is published at
.