Camera Extensions

Android

Understanding what Camera Extensions are, how to enable them, and what restrictions they have

Some CameraDevices support vendor-specific CameraExtensions - such extensions provide application-level access to custom pipelines like 'hdr', 'night', 'bokeh' or 'face-retouch.'.

Getting available Extensions

To get all available CameraExtensions, use getSupportedExtensions(...):

const device = ...
const extensions = useCameraDeviceExtensions(device)
const device = ...
const extensions = await getSupportedExtensions(device)

Enabling an Extension

To enable a CameraExtension, configure the CameraSession connection:

function App() {
  const device = ...
  const extensions = useCameraDeviceExtensions(device)
  const extension = extensions.find((e) => e.type === 'night')

  return (
    <Camera
      style={StyleSheet.absoluteFill}
      isActive={true}
      device={device}
      cameraExtension={extension}
    />
  )
}
function App() {
  const device = ...
  const extensions = useCameraDeviceExtensions(device)
  const extension = extensions.find((e) => e.type === 'night')

  const camera = useCamera({
    isActive: true,
    device: device,
    cameraExtension: extension
  })
}
const device = ...
const session = ...
const extensions = await getSupportedExtensions(device)
const extension = extensions.find((e) => e.type === 'night')

const controllers = await session.configure([
  {
    input: device,
    outputs: [],
    constraints: {
      cameraExtension: extension
    }
  }
], {})

Limitations

Camera Extensions switch the camera into a vendor-defined processing mode. In this mode the capture pipeline is no longer fully controlled by the app, but by the device's built-in ISP and proprietary algorithms - which limits available Camera features - such as HDR videos, RAW capture or Frame Streaming.

No Video HDR

CameraExtensions only work in SDR video sessions. Make sure no { videoDynamicRange: ... } constraint is set (or its videoDynamicRange is an SDR Dynamic Range) to disable Video HDR.

No RAW Photo Capture

CameraExtensions don't work with RAW capture. Make sure you are not using a CameraPhotoOutput configured to capture RAW/'dng', but instead capture in a native or processed format.

Not every Camera Extension supports Frame Streaming

Some CameraExtensions don't support Frame Streaming (see "The Frame Output") while they are enabled. To find out if a CameraExtension works with Frame Streaming, check supportsFrameStreaming:

function App() {
  const device = ...
  const frameOutput = ...
  const extensions = useCameraDeviceExtensions(device)
  const extension = extensions.find((e) => {
    return e.supportsFrameStreaming && e.type === 'night'
  })

  return (
    <Camera
      style={StyleSheet.absoluteFill}
      isActive={true}
      device={device}
      outputs={[frameOutput]}
      cameraExtension={extension}
    />
  )
}