Camera Extensions
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}
/>
)
}