Skip to content

Commit 8da5b00

Browse files
authored
feat: Add supportedMultiCamDeviceCombinations (with fixed nitrogen __element) (#3821)
* chore: Upgrade to Nitro 0.35.6 for nitrogen `__element` fix * specs * Reapply "feat: Add `supportedMultiCamDeviceCombinations`" (#3820) This reverts commit 7586e98. * fix: Update specs what
1 parent 7586e98 commit 8da5b00

43 files changed

Lines changed: 442 additions & 240 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/simple-camera/ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ PODS:
7272
- ReactCommon/turbomodule/core
7373
- ReactNativeDependencies
7474
- Yoga
75-
- NitroModules (0.35.5):
75+
- NitroModules (0.35.6):
7676
- hermes-engine
7777
- RCTRequired
7878
- RCTTypeSafety
@@ -2756,7 +2756,7 @@ SPEC CHECKSUMS:
27562756
MLKitVision: fa8dea9012ac59497c79ddbe9ebf32051047ac4c
27572757
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
27582758
NitroImage: bf3c19ea96629e5ab1665f61d720efc0df53377a
2759-
NitroModules: 2ece7b1523f5e1952c5bcea7c318df11b8ac856b
2759+
NitroModules: 1985a9de2cf4a6de1265c5936b7cc9d7f30e45d8
27602760
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
27612761
RCTDeprecation: 3280799c14232a56e5a44f92981a8ee33bc69fd9
27622762
RCTRequired: 9854a51b0f65ccf43ea0b744df4d70fce339db32

apps/simple-camera/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"react-native": "0.84.0",
2828
"react-native-gesture-handler": "^2.30.0",
2929
"react-native-nitro-image": "0.14.0",
30-
"react-native-nitro-modules": "0.35.5",
30+
"react-native-nitro-modules": "0.35.6",
3131
"react-native-reanimated": "4.3.0",
3232
"react-native-safe-area-context": "^5.7.0",
3333
"react-native-screens": "^4.24.0",

bun.lock

Lines changed: 14 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/content/docs/multi-camera.mdx

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: Using multiple Camera Devices in a single Camera Session
55

66
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
77

8-
A [`CameraSession`](/api/react-native-vision-camera/hybrid-objects/CameraSession) allows attaching multiple connections to stream from multiple [`CameraDevice`](/api/react-native-vision-camera/hybrid-objects/CameraDevice)s at the same time - if the system supports it.
8+
A [`CameraSession`](/api/react-native-vision-camera/hybrid-objects/CameraSession) allows attaching multiple connections to stream from multiple [`CameraDevice`](/api/react-native-vision-camera/hybrid-objects/CameraDevice)s at the same time (e.g. Picture-in-Picture mode via front + back Camera) - if the system supports it.
99

1010
### Creating a Multi-Camera Session
1111

@@ -19,14 +19,35 @@ if (VisionCamera.supportsMultiCamSessions) {
1919

2020
### Using multiple Connections
2121

22-
With a multi-cam [`CameraSession`](/api/react-native-vision-camera/hybrid-objects/CameraSession), you can now attach multiple [`CameraSessionConnection`](/api/react-native-vision-camera/interfaces/CameraSessionConnection)s - for example to stream and capture from the Front- and Back-Camera at the same time, attach both devices:
22+
Due to hardware constraints, not every [`CameraDevice`](/api/react-native-vision-camera/hybrid-objects/CameraDevice) can be paired with every other [`CameraDevice`](/api/react-native-vision-camera/hybrid-objects/CameraDevice) - therefore VisionCamera exposes a fixed array of supported combinations via [`CameraDeviceFactory.supportedMultiCamDeviceCombinations`](/api/react-native-vision-camera/hybrid-objects/CameraDeviceFactory#supportedmulticamdevicecombinations) upfront:
2323

2424
```ts
25-
const session = ...
26-
const frontDevice = useCameraDevice('front')
27-
const backDevice = useCameraDevice('back')
28-
const frontPreview = usePreviewOutput()
29-
const backPreview = usePreviewOutput()
25+
if (!VisionCamera.supportsMultiCamSessions)
26+
return
27+
28+
const deviceFactory = await VisionCamera.createDeviceFactory()
29+
const frontAndBackCombination =
30+
deviceFactory.supportedMultiCamDeviceCombinations.find((devices) => {
31+
return (
32+
devices.some((d) => d.position === 'front') &&
33+
devices.some((d) => d.position === 'back')
34+
)
35+
})
36+
if (frontAndBackCombination == null)
37+
return
38+
39+
const frontDevice = frontAndBackCombination.find((d) => d.position === 'front')
40+
const backDevice = frontAndBackCombination.find((d) => d.position === 'back')
41+
```
42+
43+
Then, knowing `frontDevice` and `backDevice` can be used simultaneously in a Multi-Cam session, create the [`CameraSession`](/api/react-native-vision-camera/hybrid-objects/CameraSession), and attach the [`CameraSessionConnection`](/api/react-native-vision-camera/interfaces/CameraSessionConnection)s:
44+
45+
```ts
46+
const session = await VisionCamera.createCameraSession(true)
47+
const frontPreviewOutput = VisionCamera.createPreviewOutput()
48+
const frontPhotoOutput = VisionCamera.createPhotoOutput({})
49+
const backPreviewOutput = VisionCamera.createPreviewOutput()
50+
const backPhotoOutput = VisionCamera.createPhotoOutput({})
3051

3152
const [frontController, backController] = await session.configure([
3253
// Front Camera
@@ -51,6 +72,26 @@ const [frontController, backController] = await session.configure([
5172
await session.start()
5273
```
5374

54-
Then, ensure you display both `frontPreview` and `backPreview` in separate [`<NativePreviewView />`](/api/react-native-vision-camera/views/NativePreviewView) views.
75+
Each returned [`CameraController`](/api/react-native-vision-camera/hybrid-objects/CameraController) correlates to the connection at that index - e.g. `frontController` allows zooming/exposure/focus the `frontDevice`, and vice-versa.
76+
77+
Then, ensure you display both `frontPreviewOutput` and `backPreviewOutput` in separate [`<NativePreviewView />`](/api/react-native-vision-camera/views/NativePreviewView) views:
78+
79+
```tsx
80+
function App() {
81+
const frontPreviewOutput = ...
82+
const backPreviewOutput = ...
5583

56-
Each returned [`CameraController`](/api/react-native-vision-camera/hybrid-objects/CameraController) correlates to the connection at that index.
84+
return (
85+
<View style={StyleSheet.absoluteFill}>
86+
<NativePreviewView
87+
style={{ flex: 1 }}
88+
previewOutput={frontPreviewOutput}
89+
/>
90+
<NativePreviewView
91+
style={{ flex: 1 }}
92+
previewOutput={backPreviewOutput}
93+
/>
94+
</View>
95+
)
96+
}
97+
```

packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOptions.hpp

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOutputOptions.hpp

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridBarcodeSpec__.hpp

Lines changed: 14 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeScannerSpec.cpp

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)