Files
omarchy-pkgs/pkgbuilds/edge/intel-ipu7-camera/PKGBUILD
T
Gaggery Tsai cc1508c75c intel-ipu7-camera: use v4l2-relayd for on-demand camera feed
Replace camera-feed-watch and camera-session with v4l2-relayd, a
single-process daemon that manages the icamerasrc -> v4l2loopback feed.
v4l2-relayd uses V4L2_EVENT_PRI_CLIENT_USAGE kernel events to detect
when an app starts/stops streaming, providing zero-polling on-demand
camera activation with LED control.

This is a generic solution that works with all PipeWire apps (Snapshot,
Chromium, Firefox, etc.) without per-app wrappers or .desktop patching.

The key advantage over the previous camera-feed-watch approach: v4l2-relayd
keeps a single persistent v4l2sink writer, switching only the data source
(splash vs icamerasrc) via appsrc. This avoids the PipeWire stale mmap
buffer issue that caused degraded framerate on subsequent camera sessions
when the writer process changed.

Changes:
- Add v4l2-relayd as package dependency
- Add /etc/v4l2-relayd.d/ipu7.conf with icamerasrc pipeline config
- Add systemd service override for GST_PLUGIN_PATH and device access
- Remove camera-feed-watch, camera-feed-watch.service, camera-session,
  camera-feed.service, and Snapshot .desktop patching
- Restore PipeWireCamera feature flag for Chromium/Brave/Chrome
- Enable v4l2-relayd@ipu7.service at install time
2026-03-24 22:14:08 -07:00

227 lines
7.9 KiB
Bash

# Maintainer: Omarchy <packages@omarchy.org>
pkgname=intel-ipu7-camera
pkgver=1.0.1
pkgrel=4
pkgdesc="Intel IPU7 MIPI camera stack for Hurrican/Performance (OV08X40 + hardware ISP)"
arch=('x86_64')
url="https://github.com/TsaiGaggery/hurrican_omarchy_enabling"
license=('GPL-2.0-or-later')
depends=(
'dkms'
'linux-headers'
'v4l2loopback-dkms'
'v4l2-relayd'
'gstreamer'
'gst-plugins-base'
'gst-plugins-good'
'gst-plugins-bad'
'jsoncpp'
'libdrm'
)
makedepends=(
'git'
'base-devel'
'cmake'
'autoconf'
'automake'
'libtool'
'pkgconf'
)
install=intel-ipu7-camera.install
options=('!strip')
_ipu7_drivers_commit="a88b19096a738d0708742a78d6540d6d4a3021ff"
_vision_drivers_commit="a8d772f261bc90376944956b7bfd49b325ffa2f2"
_ipu7_camera_bins_commit="403c67db6b279dd02752f11db6a34552f31a3ac5"
_ipu7_camera_hal_commit="b1f6ebef12111fb5da0133b144d69dd9b001836c"
_icamerasrc_commit="4fb31db76b618aae72184c59314b839dedb42689"
source=(
"ipu7-drivers::git+https://github.com/intel/ipu7-drivers.git#commit=${_ipu7_drivers_commit}"
"vision-drivers::git+https://github.com/intel/vision-drivers.git#commit=${_vision_drivers_commit}"
"ipu7-camera-bins::git+https://github.com/intel/ipu7-camera-bins.git#commit=${_ipu7_camera_bins_commit}"
"ipu7-camera-hal::git+https://github.com/intel/ipu7-camera-hal.git#commit=${_ipu7_camera_hal_commit}"
"icamerasrc::git+https://github.com/intel/icamerasrc.git#commit=${_icamerasrc_commit}"
"0003-icvs-set-rgbcamera_pwrup_host-0-for-Panther-Lake.patch"
"dkms-ipu7-drivers.conf"
"dkms-vision-drivers.conf"
"camera-deps.conf"
"v4l2loopback-modprobe.conf"
"v4l2loopback-modules-load.conf"
"camera-init.service"
"hide-ipu7-v4l2.conf"
"disable-libcamera.conf"
"90-ipu7-psys.rules"
"camera-tmpfiles.conf"
"ov08x40.yaml"
"camera-sleep-hook"
"v4l2-relayd-ipu7.conf"
"v4l2-relayd-ipu7-override.conf"
)
sha256sums=(
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP' 'SKIP'
)
prepare() {
cd "${srcdir}/vision-drivers"
git config user.email "build@localhost"
git config user.name "Build"
if ! git log --oneline -1 | grep -q "rgbcamera_pwrup_host"; then
git am "${srcdir}/0003-icvs-set-rgbcamera_pwrup_host-0-for-Panther-Lake.patch"
fi
# Stage proprietary libs/headers for build-time use
local staging="${srcdir}/staging"
rm -rf "${staging}"
mkdir -p "${staging}/usr/lib" "${staging}/usr/include" "${staging}/usr/lib/pkgconfig"
cd "${srcdir}/ipu7-camera-bins"
cp -P lib/lib* "${staging}/usr/lib/"
cp -r include/* "${staging}/usr/include/"
cp -r lib/pkgconfig/* "${staging}/usr/lib/pkgconfig/"
for pc in "${staging}"/usr/lib/pkgconfig/*.pc; do
sed -i "s|^prefix=.*|prefix=${staging}/usr|" "$pc"
done
if [[ -d /usr/include/json ]] && [[ ! -e /usr/include/jsoncpp/json ]]; then
mkdir -p "${staging}/usr/include/jsoncpp"
ln -sf /usr/include/json "${staging}/usr/include/jsoncpp/json"
fi
}
build() {
local staging="${srcdir}/staging"
export PKG_CONFIG_PATH="${staging}/usr/lib/pkgconfig:${PKG_CONFIG_PATH:-}"
export LIBRARY_PATH="${staging}/usr/lib:${LIBRARY_PATH:-}"
export LD_LIBRARY_PATH="${staging}/usr/lib:${LD_LIBRARY_PATH:-}"
export CPATH="${staging}/usr/include:${CPATH:-}"
cd "${srcdir}/ipu7-camera-hal"
rm -rf build && mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_LIBDIR=lib \
-DBUILD_CAMHAL_ADAPTOR=ON \
-DBUILD_CAMHAL_PLUGIN=ON \
-DIPU_VERSIONS="ipu75xa" \
-DUSE_STATIC_GRAPH=ON \
-DUSE_STATIC_GRAPH_AUTOGEN=ON \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
-DCMAKE_PREFIX_PATH="${staging}/usr" \
-DCMAKE_LIBRARY_PATH="${staging}/usr/lib" \
-DCMAKE_INCLUDE_PATH="${staging}/usr/include" \
..
make -j"$(nproc)"
make DESTDIR="${staging}" install
install -Dm644 "${srcdir}/ipu7-camera-hal/libcamhal.pc" \
"${staging}/usr/lib/pkgconfig/libcamhal.pc"
sed -i "s|^prefix=.*|prefix=${staging}/usr|" "${staging}/usr/lib/pkgconfig/libcamhal.pc"
cd "${srcdir}/icamerasrc"
export CHROME_SLIM_CAMHAL=ON
[[ ! -f configure ]] && ./autogen.sh
./configure --prefix=/usr
make -j"$(nproc)"
}
package() {
# DKMS: IPU7 drivers (ISYS + PSYS + ACPI)
local ipu7_dkms_dir="${pkgdir}/usr/src/ipu7-drivers-${pkgver}"
install -dm755 "${ipu7_dkms_dir}"
cp -r "${srcdir}/ipu7-drivers/"* "${ipu7_dkms_dir}/"
rm -rf "${ipu7_dkms_dir}/.git"
install -Dm644 "${srcdir}/dkms-ipu7-drivers.conf" "${ipu7_dkms_dir}/dkms.conf"
sed -i "s/@PKGVER@/${pkgver}/" "${ipu7_dkms_dir}/dkms.conf"
# DKMS: Vision drivers (CVS)
local cvs_dkms_dir="${pkgdir}/usr/src/vision-drivers-${pkgver}"
install -dm755 "${cvs_dkms_dir}"
cp -r "${srcdir}/vision-drivers/"* "${cvs_dkms_dir}/"
install -Dm644 "${srcdir}/dkms-vision-drivers.conf" "${cvs_dkms_dir}/dkms.conf"
sed -i "s/@PKGVER@/${pkgver}/" "${cvs_dkms_dir}/dkms.conf"
# Firmware
install -dm755 "${pkgdir}/usr/lib/firmware/intel/ipu"
install -Dm644 "${srcdir}/ipu7-camera-bins/lib/firmware/intel/ipu/"*.bin \
-t "${pkgdir}/usr/lib/firmware/intel/ipu/"
# Proprietary libraries + headers from ipu7-camera-bins
cd "${srcdir}/ipu7-camera-bins"
install -dm755 "${pkgdir}/usr/lib"
cp -P lib/lib* "${pkgdir}/usr/lib/"
install -dm755 "${pkgdir}/usr/include"
cp -r include/* "${pkgdir}/usr/include/"
install -dm755 "${pkgdir}/usr/lib/pkgconfig"
cp -r lib/pkgconfig/* "${pkgdir}/usr/lib/pkgconfig/"
# Camera HAL + config
cd "${srcdir}/ipu7-camera-hal/build"
make DESTDIR="${pkgdir}" install
cd "${srcdir}/ipu7-camera-hal"
install -dm755 "${pkgdir}/usr/share/defaults/etc/camera"
install -Dm644 config/linux/ipu75xa/libcamhal_configs.json \
"${pkgdir}/usr/share/defaults/etc/camera/"
install -Dm644 config/linux/ipu75xa/*.aiqb \
-t "${pkgdir}/usr/share/defaults/etc/camera/"
install -dm755 "${pkgdir}/etc/camera/ipu75xa/gcss"
install -Dm644 config/linux/ipu75xa/gcss/*.bin \
-t "${pkgdir}/etc/camera/ipu75xa/gcss/"
install -dm755 "${pkgdir}/etc/camera/ipu75xa/sensors"
install -Dm644 config/linux/ipu75xa/sensors/*.json \
-t "${pkgdir}/etc/camera/ipu75xa/sensors/"
install -Dm644 config/linux/ipu75xa/pipe_scheduler_profiles.json \
"${pkgdir}/etc/camera/ipu75xa/"
install -Dm644 config/linux/ipu75xa/pnp_profiles.json \
"${pkgdir}/etc/camera/ipu75xa/"
# icamerasrc GStreamer plugin
cd "${srcdir}/icamerasrc"
make DESTDIR="${pkgdir}" install
# modprobe / modules-load
install -Dm644 "${srcdir}/camera-deps.conf" \
"${pkgdir}/usr/lib/modprobe.d/camera-deps.conf"
install -Dm644 "${srcdir}/v4l2loopback-modprobe.conf" \
"${pkgdir}/usr/lib/modprobe.d/v4l2loopback-camera.conf"
install -Dm644 "${srcdir}/v4l2loopback-modules-load.conf" \
"${pkgdir}/usr/lib/modules-load.d/v4l2loopback.conf"
# systemd
install -Dm644 "${srcdir}/camera-init.service" \
"${pkgdir}/usr/lib/systemd/system/camera-init.service"
# WirePlumber
install -Dm644 "${srcdir}/hide-ipu7-v4l2.conf" \
"${pkgdir}/usr/share/wireplumber/wireplumber.conf.d/hide-ipu7-v4l2.conf"
install -Dm644 "${srcdir}/disable-libcamera.conf" \
"${pkgdir}/usr/share/wireplumber/wireplumber.conf.d/disable-libcamera.conf"
# udev / tmpfiles / libcamera tuning
install -Dm644 "${srcdir}/90-ipu7-psys.rules" \
"${pkgdir}/usr/lib/udev/rules.d/90-ipu7-psys.rules"
install -Dm644 "${srcdir}/camera-tmpfiles.conf" \
"${pkgdir}/usr/lib/tmpfiles.d/camera.conf"
install -Dm644 "${srcdir}/ov08x40.yaml" \
"${pkgdir}/usr/share/libcamera/ipa/simple/ov08x40.yaml"
# Sleep hook — staged here, installed to system-sleep by the .install scriptlet
install -Dm755 "${srcdir}/camera-sleep-hook" \
"${pkgdir}/usr/share/intel-ipu7-camera/camera-sleep-hook"
# v4l2-relayd config for IPU7 camera
install -Dm644 "${srcdir}/v4l2-relayd-ipu7.conf" \
"${pkgdir}/etc/v4l2-relayd.d/ipu7.conf"
install -Dm644 "${srcdir}/v4l2-relayd-ipu7-override.conf" \
"${pkgdir}/etc/systemd/system/v4l2-relayd@ipu7.service.d/override.conf"
}