Working webcam frame after SoftISP on Intel Arc

If you have a recent Intel laptop (IPU6 camera) on Linux and the webcam is blank, green, or useless in the browser, this is the setup that worked on the machine below. Other IPU6 + ov08x40 laptops should be similar.

Laptop used here

ModelHP Spectre x360 2-in-1 Laptop 16-aa0xxx
SKU975R9UA#ABA
Board8C17
CPUIntel Core Ultra 7 155H
iGPUIntel Arc Graphics (Meteor Lake) [8086:7d55]
dGPUNVIDIA GeForce RTX 4050 Laptop [10de:28a1], driver 610.57.04
IPUIntel IPU6 [8086:7d19]
SensorOmniVision ov08x40 (OVTI08F4)
OSCachyOS, kernel 7.1.6
RAM32 GB class (about 30 GiB usable)

Check you actually have IPU6

lspci -nn | grep -i ipu
lsmod | grep -E 'ipu6|ov08'
cam -l   # after installing libcamera-tools; may fail before packages are installed

You want something like Intel ... IPU in lspci, and a sensor module such as ov08x40. You will also see many /dev/video* nodes. That is normal.

IPU6 does not behave like a USB webcam. The kernel nodes give raw Bayer data. Apps that open /dev/video0 directly often show a blank image. You need libcamera to turn that into RGB and PipeWire to hand it to browsers.

1. Install packages

Arch / CachyOS:

sudo pacman -S libcamera libcamera-ipa libcamera-tools \
  gst-plugin-libcamera pipewire-libcamera

Debian / Ubuntu usually want the same names from their repos (libcamera-tools, pipewire-libcamera, etc.).

Confirm the camera is visible:

cam -l

Example:

Available cameras:
1: Internal front camera (\_SB_.PC00.LNK0)

Quick capture test (CPU demosaic, which works even when GPU SoftISP is broken):

LIBCAMERA_SOFTISP_MODE=cpu cam -c 1 -C3 -F'/tmp/frame#.ppm' \
  -s role=viewfinder,width=1280,height=720

If those PPM files have a real picture, the sensor and IPU are fine.

2. SoftISP: CPU, NVIDIA, or Intel GPU

libcamera SoftISP converts the raw Bayer data to RGB.

ModeHowNotes
CPULIBCAMERA_SOFTISP_MODE=cpuSlowest, most reliable
GPU (default)LIBCAMERA_SOFTISP_MODE=gpuUses whatever EGL GLVND picks
GPU on IntelGPU mode + force Mesa EGLUse this on hybrid NVIDIA laptops if default GPU fails

On this Spectre, default GPU SoftISP picked NVIDIA and failed:

EGL_VENDOR: NVIDIA
ERROR eGL: glFrameBufferTexture2D error 36054
ERROR Debayer: debayerGPU failed

Forcing Mesa runs SoftISP on Intel Arc and works:

export LIBCAMERA_SOFTISP_MODE=gpu
export __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
cam -c 1 -C3 -F'/tmp/igpu#.ppm' -s role=viewfinder,width=1280,height=720

You should see:

EGL_VENDOR: Mesa Project
GL_RENDERER: Mesa Intel(R) Arc(tm) Graphics (MTL)

If you only have Intel graphics, try GPU SoftISP without the Mesa pin first. If SoftISP fails with the NVIDIA error above, use CPU mode or the Mesa pin.

3. Make PipeWire expose the right camera

Install pipewire-libcamera, then restart the user media stack:

systemctl --user restart pipewire wireplumber pipewire-pulse
wpctl status

Under Video → Sources you want Built-in Front Camera (or similar from libcamera).

IPU6 also shows up as many raw ipu6 V4L2 devices. Browsers may pick those and stay blank. Disable the V4L2 monitor so only libcamera remains:

// ~/.config/wireplumber/wireplumber.conf.d/50-disable-v4l2-ipu.conf
wireplumber.profiles = {
  main = {
    monitor.v4l2 = disabled
  }
}
systemctl --user restart wireplumber
wpctl status

4. Persist SoftISP settings

Option A: CPU SoftISP (simplest)

# ~/.config/environment.d/libcamera-softisp.conf
LIBCAMERA_SOFTISP_MODE=cpu

Log out and back in (or reboot) so user services pick it up. Also set it for WirePlumber:

# ~/.config/systemd/user/wireplumber.service.d/libcamera.conf
[Service]
Environment=LIBCAMERA_SOFTISP_MODE=cpu

Option B: GPU SoftISP on Intel (hybrid NVIDIA laptops)

Only set Mesa for the camera service so games/desktop can keep using NVIDIA:

# ~/.config/systemd/user/wireplumber.service.d/libcamera.conf
[Service]
Environment=LIBCAMERA_SOFTISP_MODE=gpu
Environment=__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json

Optional: same file under ~/.config/systemd/user/pipewire.service.d/.

systemctl --user daemon-reload
systemctl --user restart pipewire wireplumber pipewire-pulse

Check the journal:

journalctl --user -u wireplumber -b --no-pager | grep -E 'EGL_VENDOR|GL_RENDERER|SoftwareIsp'

For terminal tools:

export LIBCAMERA_SOFTISP_MODE=gpu
export __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json

5. App notes

  • Snapshot / GNOME Camera, browsers via the portal: use PipeWire → Built-in Front Camera.
  • GStreamer: gst-launch-1.0 libcamerasrc ! ... or pipewiresrc.
  • Old V4L2-only apps: libcamerify your-app.

Troubleshooting

SymptomLikely causeWhat to do
Blank in browser, cam worksApp on raw ipu6 deviceDisable V4L2 monitor; pick Built-in Front Camera; restart browser
glFrameBufferTexture2D error 36054NVIDIA EGL SoftISPUse LIBCAMERA_SOFTISP_MODE=cpu or force Mesa as above
cam -l emptyPackages / permissions / sensor not probedInstall libcamera stack; check dmesg for intel-ipu6 / sensor; ensure user is in video
Many /dev/video*Normal for IPU6Do not open them directly; use libcamera
SoftISP stride warning (Requested 4096, got 3904)IPU6 ignores strideUsually OK; Mesa SoftISP still works

Bug reports