# Video & camera configuration

WirePlumber can expose cameras through two different backends: the V4L2 monitor, which talks to the kernel's Video4Linux2 interface directly, and the libcamera monitor, which uses libcamera and is able to drive more complex camera pipelines (notably the ISP-based cameras found on many ARM platforms).

Both monitors are enabled by default. They are grouped under the `hardware.video-capture` feature, which in turn wants `monitor.v4l2` and `monitor.libcamera`; see Well-known features. The `video-capture` profile brings up only the video part of WirePlumber, which is useful when running multiple instances.

Note

Cameras are also subject to access control. Under a sandbox such as Flatpak or Snap, an application only sees camera nodes if it has been granted permission; see Access configuration.

## Choosing a backend

Because both monitors enumerate the same hardware, the same physical camera is often reported twice. WirePlumber arbitrates between them rather than exposing duplicates, using the device numbers each backend reports in the `device.devids` property:

1. V4L2 devices driven by `uvcvideo` (ordinary USB webcams) are created first — for these, V4L2 is preferred.

2. libcamera devices are created next, unless their device numbers were already claimed by a V4L2 UVC device.

3. Remaining V4L2 devices are created last, unless libcamera already claimed them.

The arbitration needs both monitors to have reported, so node creation is delayed by the `monitor.camera-discovery-timeout` setting (1 second by default); see Well-known settings. A device that reports no device numbers at all bypasses the arbitration and is created immediately.

To use libcamera exclusively, disable the V4L2 monitor in your profile:

    wireplumber.profiles = {
      main = {
        monitor.v4l2 = disabled
      }
    }

Conversely, set `monitor.libcamera = disabled` to use V4L2 only.

## V4L2 configuration

monitor.v4l2.properties

  The properties used when constructing the `api.v4l2.enum.udev` SPA plugin, which does the actual device enumeration.

monitor.v4l2.rules

  Rules that are matched against V4L2 devices and nodes as they are created, allowing their properties to be modified. The syntax is the same as for the other monitor rules; see Modifying configuration.

  Device rules are matched against device properties such as `device.name`:

      monitor.v4l2.rules = [
        {
          matches = [
            {
              device.name = "~v4l2_device.*"
            }
          ]
          actions = {
            update-props = {
              device.nick = "My Device"
              device.disabled = false
            }
          }
        }
      ]

  Node rules are matched against node properties such as `node.name`:

      monitor.v4l2.rules = [
        {
          matches = [
            {
              node.name = "~v4l2_input.*"
            }
          ]
          actions = {
            update-props = {
              node.nick          = "My Node"
              priority.session   = 100
              node.pause-on-idle = false
              node.disabled      = false
            }
          }
        }
      ]

  Setting `device.disabled` or `node.disabled` to `true` is how a specific camera is hidden from the graph.

## libcamera configuration

monitor.libcamera.properties

  The properties used when constructing the `api.libcamera.enum.manager` SPA plugin.

monitor.libcamera.rules

  The same as `monitor.v4l2.rules`, but for devices and nodes created by the libcamera monitor. Device names match `libcamera_device.*` and node names match `libcamera_input.*`.

## Examples

Ready-made, commented example fragments for both backends ship with WirePlumber as `v4l2.conf` and `libcamera.conf`; see Example configuration fragments.

## Troubleshooting

My camera does not appear at all. Check that `hardware.video-capture` is enabled in your profile and that the relevant monitor is not disabled. Then check the logs with `WIREPLUMBER_DEBUG=s-monitors*:D`, which shows what each monitor enumerated and which devices were skipped by the arbitration described above.

My camera appears but produces no image. This is usually a backend issue rather than a WirePlumber one. Try the other backend; `libcamera` is often required for cameras that need ISP processing, while plain UVC webcams generally work better with V4L2.