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
| Model | HP Spectre x360 2-in-1 Laptop 16-aa0xxx |
| SKU | 975R9UA#ABA |
| Board | 8C17 |
| CPU | Intel Core Ultra 7 155H |
| iGPU | Intel Arc Graphics (Meteor Lake) [8086:7d55] |
| dGPU | NVIDIA GeForce RTX 4050 Laptop [10de:28a1], driver 610.57.04 |
| IPU | Intel IPU6 [8086:7d19] |
| Sensor | OmniVision ov08x40 (OVTI08F4) |
| OS | CachyOS, kernel 7.1.6 |
| RAM | 32 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.
| Mode | How | Notes |
|---|---|---|
| CPU | LIBCAMERA_SOFTISP_MODE=cpu | Slowest, most reliable |
| GPU (default) | LIBCAMERA_SOFTISP_MODE=gpu | Uses whatever EGL GLVND picks |
| GPU on Intel | GPU mode + force Mesa EGL | Use 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 ! ...orpipewiresrc. - Old V4L2-only apps:
libcamerify your-app.
Troubleshooting
| Symptom | Likely cause | What to do |
|---|---|---|
Blank in browser, cam works | App on raw ipu6 device | Disable V4L2 monitor; pick Built-in Front Camera; restart browser |
glFrameBufferTexture2D error 36054 | NVIDIA EGL SoftISP | Use LIBCAMERA_SOFTISP_MODE=cpu or force Mesa as above |
cam -l empty | Packages / permissions / sensor not probed | Install libcamera stack; check dmesg for intel-ipu6 / sensor; ensure user is in video |
Many /dev/video* | Normal for IPU6 | Do not open them directly; use libcamera |
SoftISP stride warning (Requested 4096, got 3904) | IPU6 ignores stride | Usually OK; Mesa SoftISP still works |