diff --git a/apps/simple-camera/ios/Podfile.lock b/apps/simple-camera/ios/Podfile.lock index cf72287d4e..0d0e2ffdc8 100644 --- a/apps/simple-camera/ios/Podfile.lock +++ b/apps/simple-camera/ios/Podfile.lock @@ -72,7 +72,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - NitroModules (0.35.5): + - NitroModules (0.35.6): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2756,7 +2756,7 @@ SPEC CHECKSUMS: MLKitVision: fa8dea9012ac59497c79ddbe9ebf32051047ac4c nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 NitroImage: bf3c19ea96629e5ab1665f61d720efc0df53377a - NitroModules: 2ece7b1523f5e1952c5bcea7c318df11b8ac856b + NitroModules: 1985a9de2cf4a6de1265c5936b7cc9d7f30e45d8 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 RCTDeprecation: 3280799c14232a56e5a44f92981a8ee33bc69fd9 RCTRequired: 9854a51b0f65ccf43ea0b744df4d70fce339db32 diff --git a/apps/simple-camera/package.json b/apps/simple-camera/package.json index 4741c752e8..9ed04b93de 100644 --- a/apps/simple-camera/package.json +++ b/apps/simple-camera/package.json @@ -27,7 +27,7 @@ "react-native": "0.84.0", "react-native-gesture-handler": "^2.30.0", "react-native-nitro-image": "0.14.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-reanimated": "4.3.0", "react-native-safe-area-context": "^5.7.0", "react-native-screens": "^4.24.0", diff --git a/bun.lock b/bun.lock index 2a3bf0ed26..58fcfd104a 100644 --- a/bun.lock +++ b/bun.lock @@ -34,7 +34,7 @@ "react-native": "0.84.0", "react-native-gesture-handler": "^2.30.0", "react-native-nitro-image": "0.14.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-reanimated": "4.3.0", "react-native-safe-area-context": "^5.7.0", "react-native-screens": "^4.24.0", @@ -104,11 +104,11 @@ "version": "5.0.7", "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", "react-native-nitro-image": "0.14.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "typescript": "5.9.3", }, "peerDependencies": { @@ -123,10 +123,10 @@ "version": "5.0.7", "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-vision-camera": "*", "typescript": "5.9.3", }, @@ -142,10 +142,10 @@ "version": "5.0.7", "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-vision-camera": "*", "typescript": "5.9.3", }, @@ -161,10 +161,10 @@ "version": "5.0.7", "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-vision-camera": "*", "typescript": "5.9.3", }, @@ -183,7 +183,7 @@ "@types/react": "19.2.14", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-reanimated": "4.3.0", "react-native-vision-camera": "*", "react-native-vision-camera-worklets": "*", @@ -205,10 +205,10 @@ "version": "5.0.7", "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-vision-camera": "*", "react-native-worklets": "0.8.1", "typescript": "5.9.3", @@ -2167,7 +2167,7 @@ "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], - "nitrogen": ["nitrogen@0.35.5", "", { "dependencies": { "chalk": "^5.3.0", "react-native-nitro-modules": "^0.35.5", "ts-morph": "^27.0.0", "yargs": "^18.0.0", "zod": "^4.0.5" }, "bin": { "nitrogen": "lib/index.js" } }, "sha512-Ofl4aTW2rd44+hBcUwLXu01ViHikn2SDI7zOYc+6NcKSpnhoj42k1FwyvRj1QZPDMUT64Bwlb0DYw7Hrfd3BfQ=="], + "nitrogen": ["nitrogen@0.35.6", "", { "dependencies": { "chalk": "^5.3.0", "react-native-nitro-modules": "^0.35.6", "ts-morph": "^27.0.0", "yargs": "^18.0.0", "zod": "^4.0.5" }, "bin": { "nitrogen": "lib/index.js" } }, "sha512-fUoyqCEQugl49L/lp/v3LceZt8jwL/gqfLhWsxRPxr1pOTnBhyrcEJ2dAJvHl10h7JxaswP6YCnVZMZmjJavKg=="], "nocache": ["nocache@3.0.4", "", {}, "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw=="], @@ -2355,7 +2355,7 @@ "react-native-nitro-image": ["react-native-nitro-image@0.14.0", "", { "peerDependencies": { "react": "*", "react-native": "*", "react-native-nitro-modules": "*" } }, "sha512-yLBm+SC/bdssO5XJhYOxVf6UeFfcUoRLwR1YXPJpNZyv65aHPijDg/nklJ/spAonWEl4yfPpATGSqo8mvVEjlQ=="], - "react-native-nitro-modules": ["react-native-nitro-modules@0.35.5", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-aa03UzC5dLg5qFfyBkVK+JGSwHTjmK7jUZzyRz11r1Yk9C/nJTFe59EeHPxxNNTagkiwQTM6p3sySgD/TDRC7Q=="], + "react-native-nitro-modules": ["react-native-nitro-modules@0.35.6", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-3Cb7s+O5tpZ6RdIiPOB/wi3IMfBxD6tl6VDF8gJ5zvM/BEGTWxwMMLjzmWmsYPKekdbYBznF6qp2d2SxixPy8g=="], "react-native-reanimated": ["react-native-reanimated@4.3.0", "", { "dependencies": { "react-native-is-edge-to-edge": "^1.3.1", "semver": "^7.7.3" }, "peerDependencies": { "react": "*", "react-native": "0.81 - 0.85", "react-native-worklets": "0.8.x" } }, "sha512-HOTTPdKtddXTOsmQxDASXEwLS3lqEHrKERD3XOgzSqWJ7L3x81Pnx7mTcKx1FKdkgomMug/XSmm1C6Z7GIowxA=="], diff --git a/docs/content/docs/multi-camera.mdx b/docs/content/docs/multi-camera.mdx index 891037c7ac..e0b2abf273 100644 --- a/docs/content/docs/multi-camera.mdx +++ b/docs/content/docs/multi-camera.mdx @@ -5,7 +5,7 @@ description: Using multiple Camera Devices in a single Camera Session import { Tab, Tabs } from 'fumadocs-ui/components/tabs' -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. +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. ### Creating a Multi-Camera Session @@ -19,14 +19,35 @@ if (VisionCamera.supportsMultiCamSessions) { ### Using multiple Connections -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: +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: ```ts -const session = ... -const frontDevice = useCameraDevice('front') -const backDevice = useCameraDevice('back') -const frontPreview = usePreviewOutput() -const backPreview = usePreviewOutput() +if (!VisionCamera.supportsMultiCamSessions) + return + +const deviceFactory = await VisionCamera.createDeviceFactory() +const frontAndBackCombination = + deviceFactory.supportedMultiCamDeviceCombinations.find((devices) => { + return ( + devices.some((d) => d.position === 'front') && + devices.some((d) => d.position === 'back') + ) + }) +if (frontAndBackCombination == null) + return + +const frontDevice = frontAndBackCombination.find((d) => d.position === 'front') +const backDevice = frontAndBackCombination.find((d) => d.position === 'back') +``` + +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: + +```ts +const session = await VisionCamera.createCameraSession(true) +const frontPreviewOutput = VisionCamera.createPreviewOutput() +const frontPhotoOutput = VisionCamera.createPhotoOutput({}) +const backPreviewOutput = VisionCamera.createPreviewOutput() +const backPhotoOutput = VisionCamera.createPhotoOutput({}) const [frontController, backController] = await session.configure([ // Front Camera @@ -51,6 +72,26 @@ const [frontController, backController] = await session.configure([ await session.start() ``` -Then, ensure you display both `frontPreview` and `backPreview` in separate [``](/api/react-native-vision-camera/views/NativePreviewView) views. +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. + +Then, ensure you display both `frontPreviewOutput` and `backPreviewOutput` in separate [``](/api/react-native-vision-camera/views/NativePreviewView) views: + +```tsx +function App() { + const frontPreviewOutput = ... + const backPreviewOutput = ... -Each returned [`CameraController`](/api/react-native-vision-camera/hybrid-objects/CameraController) correlates to the connection at that index. + return ( + + + + + ) +} +``` diff --git a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOptions.hpp b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOptions.hpp index 64b77ce07b..6bb5ff6476 100644 --- a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOptions.hpp +++ b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOptions.hpp @@ -36,16 +36,16 @@ namespace margelo::nitro::camera::barcodescanner { static const auto fieldBarcodeFormats = clazz->getField>("barcodeFormats"); jni::local_ref> barcodeFormats = this->getFieldValue(fieldBarcodeFormats); return BarcodeScannerOptions( - [&]() { - size_t __size = barcodeFormats->size(); + [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = barcodeFormats->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }() + }(barcodeFormats) ); } @@ -60,16 +60,16 @@ namespace margelo::nitro::camera::barcodescanner { static const auto create = clazz->getStaticMethod("fromCpp"); return create( clazz, - [&]() { - size_t __size = value.barcodeFormats.size(); + [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.barcodeFormats[__i]; + const auto& __element = __input[__i]; auto __elementJni = JTargetBarcodeFormat::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }() + }(value.barcodeFormats) ); } }; diff --git a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOutputOptions.hpp b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOutputOptions.hpp index 5296bcad03..a23f8724f6 100644 --- a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOutputOptions.hpp +++ b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JBarcodeScannerOutputOptions.hpp @@ -53,16 +53,16 @@ namespace margelo::nitro::camera::barcodescanner { static const auto fieldOnError = clazz->getField("onError"); jni::local_ref onError = this->getFieldValue(fieldOnError); return BarcodeScannerOutputOptions( - [&]() { - size_t __size = barcodeFormats->size(); + [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = barcodeFormats->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(), + }(barcodeFormats), outputResolution != nullptr ? std::make_optional(outputResolution->toCpp()) : std::nullopt, [&]() -> std::function>& /* barcodes */)> { if (onBarcodeScanned->isInstanceOf(JFunc_void_std__vector_std__shared_ptr_HybridBarcodeSpec___cxx::javaClassStatic())) [[likely]] { @@ -96,16 +96,16 @@ namespace margelo::nitro::camera::barcodescanner { static const auto create = clazz->getStaticMethod("fromCpp"); return create( clazz, - [&]() { - size_t __size = value.barcodeFormats.size(); + [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.barcodeFormats[__i]; + const auto& __element = __input[__i]; auto __elementJni = JTargetBarcodeFormat::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }(), + }(value.barcodeFormats), value.outputResolution.has_value() ? JBarcodeScannerOutputResolution::fromCpp(value.outputResolution.value()) : nullptr, JFunc_void_std__vector_std__shared_ptr_HybridBarcodeSpec___cxx::fromCpp(value.onBarcodeScanned), JFunc_void_std__exception_ptr_cxx::fromCpp(value.onError) diff --git a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridBarcodeSpec__.hpp b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridBarcodeSpec__.hpp index 2a1147ca4b..19a0544508 100644 --- a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridBarcodeSpec__.hpp +++ b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridBarcodeSpec__.hpp @@ -35,16 +35,16 @@ namespace margelo::nitro::camera::barcodescanner { */ void invoke(const std::vector>& barcodes) const { static const auto method = javaClassStatic()->getMethod> /* barcodes */)>("invoke"); - method(self(), [&]() { - size_t __size = barcodes.size(); + method(self(), [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = barcodes[__i]; + const auto& __element = __input[__i]; auto __elementJni = std::dynamic_pointer_cast(__element)->getJavaPart(); __array->setElement(__i, *__elementJni); } return __array; - }()); + }(barcodes)); } }; @@ -62,16 +62,16 @@ namespace margelo::nitro::camera::barcodescanner { * Invokes the C++ `std::function<...>` this `JFunc_void_std__vector_std__shared_ptr_HybridBarcodeSpec___cxx` instance holds. */ void invoke_cxx(jni::alias_ref> barcodes) { - _func([&]() { - size_t __size = barcodes->size(); - std::vector> __vector; - __vector.reserve(__size); - for (size_t __i = 0; __i < __size; __i++) { - auto __element = barcodes->getElement(__i); - __vector.push_back(__element->getJHybridBarcodeSpec()); - } - return __vector; - }()); + _func([&](auto&& __input) { + size_t __size = __input->size(); + std::vector> __vector; + __vector.reserve(__size); + for (size_t __i = 0; __i < __size; __i++) { + auto __element = __input->getElement(__i); + __vector.push_back(__element->getJHybridBarcodeSpec()); + } + return __vector; + }(barcodes)); } public: diff --git a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeScannerSpec.cpp b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeScannerSpec.cpp index eadfd0d2ec..0e471a8e2b 100644 --- a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeScannerSpec.cpp +++ b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeScannerSpec.cpp @@ -57,16 +57,16 @@ namespace margelo::nitro::camera::barcodescanner { std::vector> JHybridBarcodeScannerSpec::scanCodes(const std::shared_ptr& frame) { static const auto method = _javaPart->javaClassStatic()->getMethod>(jni::alias_ref /* frame */)>("scanCodes"); auto __result = method(_javaPart, std::dynamic_pointer_cast(frame)->getJavaPart()); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridBarcodeSpec()); } return __vector; - }(); + }(__result); } std::shared_ptr>>> JHybridBarcodeScannerSpec::scanCodesAsync(const std::shared_ptr& frame) { static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* frame */)>("scanCodesAsync"); @@ -75,16 +75,16 @@ namespace margelo::nitro::camera::barcodescanner { auto __promise = Promise>>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { auto __result = jni::static_ref_cast>(__boxedResult); - __promise->resolve([&]() { - size_t __size = __result->size(); + __promise->resolve([&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridBarcodeSpec()); } return __vector; - }()); + }(__result)); }); __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { jni::JniException __jniError(__throwable); diff --git a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeSpec.cpp b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeSpec.cpp index d3f0094f53..89a50a9b70 100644 --- a/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeSpec.cpp +++ b/packages/react-native-vision-camera-barcode-scanner/nitrogen/generated/android/c++/JHybridBarcodeSpec.cpp @@ -73,16 +73,16 @@ namespace margelo::nitro::camera::barcodescanner { std::vector JHybridBarcodeSpec::getCornerPoints() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getCornerPoints"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } std::optional JHybridBarcodeSpec::getDisplayValue() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("getDisplayValue"); diff --git a/packages/react-native-vision-camera-barcode-scanner/package.json b/packages/react-native-vision-camera-barcode-scanner/package.json index 88e0ded7fa..ebe22591ce 100644 --- a/packages/react-native-vision-camera-barcode-scanner/package.json +++ b/packages/react-native-vision-camera-barcode-scanner/package.json @@ -66,10 +66,10 @@ }, "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-vision-camera": "*", "typescript": "5.9.3" }, diff --git a/packages/react-native-vision-camera-location/package.json b/packages/react-native-vision-camera-location/package.json index 40d45719c3..3358747c8c 100644 --- a/packages/react-native-vision-camera-location/package.json +++ b/packages/react-native-vision-camera-location/package.json @@ -65,10 +65,10 @@ }, "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-vision-camera": "*", "typescript": "5.9.3" }, diff --git a/packages/react-native-vision-camera-resizer/package.json b/packages/react-native-vision-camera-resizer/package.json index 7ef249b9a6..75e8d9c700 100644 --- a/packages/react-native-vision-camera-resizer/package.json +++ b/packages/react-native-vision-camera-resizer/package.json @@ -70,10 +70,10 @@ }, "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-vision-camera": "*", "typescript": "5.9.3" }, diff --git a/packages/react-native-vision-camera-skia/package.json b/packages/react-native-vision-camera-skia/package.json index 7d3ece1047..1eb46cf61e 100644 --- a/packages/react-native-vision-camera-skia/package.json +++ b/packages/react-native-vision-camera-skia/package.json @@ -56,7 +56,7 @@ "@types/react": "19.2.14", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-reanimated": "4.3.0", "react-native-worklets": "0.8.1", "react-native-vision-camera": "*", diff --git a/packages/react-native-vision-camera-worklets/package.json b/packages/react-native-vision-camera-worklets/package.json index 2ac5305f6b..ffb3167e9e 100644 --- a/packages/react-native-vision-camera-worklets/package.json +++ b/packages/react-native-vision-camera-worklets/package.json @@ -66,10 +66,10 @@ }, "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "react-native-worklets": "0.8.1", "react-native-vision-camera": "*", "typescript": "5.9.3" diff --git a/packages/react-native-vision-camera/android/src/main/java/com/margelo/nitro/camera/HybridCameraDeviceFactory.kt b/packages/react-native-vision-camera/android/src/main/java/com/margelo/nitro/camera/HybridCameraDeviceFactory.kt index ce693d37ce..5e700b83ac 100644 --- a/packages/react-native-vision-camera/android/src/main/java/com/margelo/nitro/camera/HybridCameraDeviceFactory.kt +++ b/packages/react-native-vision-camera/android/src/main/java/com/margelo/nitro/camera/HybridCameraDeviceFactory.kt @@ -38,6 +38,13 @@ class HybridCameraDeviceFactory( override val cameraDevices: Array get() = cameraProvider.availableCameraInfos.mapToArray { HybridCameraDevice(it) } + override val supportedMultiCamDeviceCombinations: Array> + get() { + return cameraProvider.availableConcurrentCameraInfos.mapToArray { devices -> + return@mapToArray devices.mapToArray { HybridCameraDevice(it) } + } + } + override var userPreferredCamera: HybridCameraDeviceSpec? get() { val preferredCameraId = diff --git a/packages/react-native-vision-camera/ios/Hybrid Objects/HybridCameraDeviceFactory.swift b/packages/react-native-vision-camera/ios/Hybrid Objects/HybridCameraDeviceFactory.swift index 37af6deab6..42ef2f8014 100644 --- a/packages/react-native-vision-camera/ios/Hybrid Objects/HybridCameraDeviceFactory.swift +++ b/packages/react-native-vision-camera/ios/Hybrid Objects/HybridCameraDeviceFactory.swift @@ -9,11 +9,6 @@ import Foundation import NitroModules class HybridCameraDeviceFactory: HybridCameraDeviceFactorySpec { - let discoverySession: AVCaptureDevice.DiscoverySession - var cameraDevices: [any HybridCameraDeviceSpec] { - return discoverySession.devices.map { HybridCameraDevice(device: $0) } - } - override init() { self.discoverySession = AVCaptureDevice.DiscoverySession( deviceTypes: AVCaptureDevice.DeviceType.all, @@ -22,6 +17,17 @@ class HybridCameraDeviceFactory: HybridCameraDeviceFactorySpec { super.init() } + let discoverySession: AVCaptureDevice.DiscoverySession + var cameraDevices: [any HybridCameraDeviceSpec] { + return discoverySession.devices.map { HybridCameraDevice(device: $0) } + } + + var supportedMultiCamDeviceCombinations: [[any HybridCameraDeviceSpec]] { + return discoverySession.supportedMultiCamDeviceSets.map { devices in + return devices.map { HybridCameraDevice(device: $0) } + } + } + var userPreferredCamera: (any HybridCameraDeviceSpec)? { get { guard #available(iOS 17.0, *) else { @@ -36,7 +42,7 @@ class HybridCameraDeviceFactory: HybridCameraDeviceFactorySpec { guard #available(iOS 17.0, *) else { return } - guard let hybridDevice = newValue as? HybridCameraDevice else { + guard let hybridDevice = newValue as? any NativeCameraDevice else { return } AVCaptureDevice.userPreferredCamera = hybridDevice.device diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JCameraSessionConnection.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JCameraSessionConnection.hpp index 6b8d0710b3..ba9d62bac5 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JCameraSessionConnection.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JCameraSessionConnection.hpp @@ -90,26 +90,26 @@ namespace margelo::nitro::camera { jni::local_ref onSessionConfigSelected = this->getFieldValue(fieldOnSessionConfigSelected); return CameraSessionConnection( input->getJHybridCameraDeviceSpec(), - [&]() { - size_t __size = outputs->size(); + [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = outputs->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(), - [&]() { - size_t __size = constraints->size(); + }(outputs), + [&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = constraints->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(), + }(constraints), initialZoom != nullptr ? std::make_optional(initialZoom->value()) : std::nullopt, initialExposureBias != nullptr ? std::make_optional(initialExposureBias->value()) : std::nullopt, onSessionConfigSelected != nullptr ? std::make_optional([&]() -> std::function& /* config */)> { @@ -136,26 +136,26 @@ namespace margelo::nitro::camera { return create( clazz, std::dynamic_pointer_cast(value.input)->getJavaPart(), - [&]() { - size_t __size = value.outputs.size(); + [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.outputs[__i]; + const auto& __element = __input[__i]; auto __elementJni = JCameraOutputConfiguration::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }(), - [&]() { - size_t __size = value.constraints.size(); + }(value.outputs), + [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.constraints[__i]; + const auto& __element = __input[__i]; auto __elementJni = JConstraint::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }(), + }(value.constraints), value.initialZoom.has_value() ? jni::JDouble::valueOf(value.initialZoom.value()) : nullptr, value.initialExposureBias.has_value() ? jni::JDouble::valueOf(value.initialExposureBias.value()) : nullptr, value.onSessionConfigSelected.has_value() ? JFunc_void_std__shared_ptr_HybridCameraSessionConfigSpec__cxx::fromCpp(value.onSessionConfigSelected.value()) : nullptr diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFocusOptions.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFocusOptions.hpp index cd0a697e23..f113ff46e7 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFocusOptions.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFocusOptions.hpp @@ -53,16 +53,16 @@ namespace margelo::nitro::camera { return FocusOptions( responsiveness != nullptr ? std::make_optional(responsiveness->toCpp()) : std::nullopt, adaptiveness != nullptr ? std::make_optional(adaptiveness->toCpp()) : std::nullopt, - modes != nullptr ? std::make_optional([&]() { - size_t __size = modes->size(); + modes != nullptr ? std::make_optional([&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = modes->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }()) : std::nullopt, + }(modes)) : std::nullopt, autoResetAfter != nullptr ? std::make_optional(autoResetAfter->toCpp()) : std::nullopt ); } @@ -80,16 +80,16 @@ namespace margelo::nitro::camera { clazz, value.responsiveness.has_value() ? JFocusResponsiveness::fromCpp(value.responsiveness.value()) : nullptr, value.adaptiveness.has_value() ? JSceneAdaptiveness::fromCpp(value.adaptiveness.value()) : nullptr, - value.modes.has_value() ? [&]() { - size_t __size = value.modes.value().size(); + value.modes.has_value() ? [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.modes.value()[__i]; + const auto& __element = __input[__i]; auto __elementJni = JMeteringMode::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }() : nullptr, + }(value.modes.value()) : nullptr, value.autoResetAfter.has_value() ? JVariant_NullType_Double::fromCpp(value.autoResetAfter.value()) : nullptr ); } diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_bool_std__vector_std__variant_std__shared_ptr_HybridFrameSpec___std__shared_ptr_HybridDepthSpec___.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_bool_std__vector_std__variant_std__shared_ptr_HybridFrameSpec___std__shared_ptr_HybridDepthSpec___.hpp index b5f431afb0..b66ad9417f 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_bool_std__vector_std__variant_std__shared_ptr_HybridFrameSpec___std__shared_ptr_HybridDepthSpec___.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_bool_std__vector_std__variant_std__shared_ptr_HybridFrameSpec___std__shared_ptr_HybridDepthSpec___.hpp @@ -39,16 +39,16 @@ namespace margelo::nitro::camera { */ bool invoke(const std::vector, std::shared_ptr>>& frames) const { static const auto method = javaClassStatic()->getMethod> /* frames */)>("invoke"); - auto __result = method(self(), [&]() { - size_t __size = frames.size(); + auto __result = method(self(), [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = frames[__i]; + const auto& __element = __input[__i]; auto __elementJni = JVariant_HybridFrameSpec_HybridDepthSpec::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }()); + }(frames)); return static_cast(__result); } }; @@ -67,16 +67,16 @@ namespace margelo::nitro::camera { * Invokes the C++ `std::function<...>` this `JFunc_bool_std__vector_std__variant_std__shared_ptr_HybridFrameSpec___std__shared_ptr_HybridDepthSpec____cxx` instance holds. */ jboolean invoke_cxx(jni::alias_ref> frames) { - bool __result = _func([&]() { - size_t __size = frames->size(); - std::vector, std::shared_ptr>> __vector; - __vector.reserve(__size); - for (size_t __i = 0; __i < __size; __i++) { - auto __element = frames->getElement(__i); - __vector.push_back(__element->toCpp()); - } - return __vector; - }()); + bool __result = _func([&](auto&& __input) { + size_t __size = __input->size(); + std::vector, std::shared_ptr>> __vector; + __vector.reserve(__size); + for (size_t __i = 0; __i < __size; __i++) { + auto __element = __input->getElement(__i); + __vector.push_back(__element->toCpp()); + } + return __vector; + }(frames)); return __result; } diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridCameraDeviceSpec__.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridCameraDeviceSpec__.hpp index 35845ee082..0d51ce5b39 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridCameraDeviceSpec__.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridCameraDeviceSpec__.hpp @@ -35,16 +35,16 @@ namespace margelo::nitro::camera { */ void invoke(const std::vector>& newDevices) const { static const auto method = javaClassStatic()->getMethod> /* newDevices */)>("invoke"); - method(self(), [&]() { - size_t __size = newDevices.size(); + method(self(), [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = newDevices[__i]; + const auto& __element = __input[__i]; auto __elementJni = std::dynamic_pointer_cast(__element)->getJavaPart(); __array->setElement(__i, *__elementJni); } return __array; - }()); + }(newDevices)); } }; @@ -62,16 +62,16 @@ namespace margelo::nitro::camera { * Invokes the C++ `std::function<...>` this `JFunc_void_std__vector_std__shared_ptr_HybridCameraDeviceSpec___cxx` instance holds. */ void invoke_cxx(jni::alias_ref> newDevices) { - _func([&]() { - size_t __size = newDevices->size(); - std::vector> __vector; - __vector.reserve(__size); - for (size_t __i = 0; __i < __size; __i++) { - auto __element = newDevices->getElement(__i); - __vector.push_back(__element->getJHybridCameraDeviceSpec()); - } - return __vector; - }()); + _func([&](auto&& __input) { + size_t __size = __input->size(); + std::vector> __vector; + __vector.reserve(__size); + for (size_t __i = 0; __i < __size; __i++) { + auto __element = __input->getElement(__i); + __vector.push_back(__element->getJHybridCameraDeviceSpec()); + } + return __vector; + }(newDevices)); } public: diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridScannedObjectSpec__.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridScannedObjectSpec__.hpp index d3dd7d0f74..ddd4379ea9 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridScannedObjectSpec__.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JFunc_void_std__vector_std__shared_ptr_HybridScannedObjectSpec__.hpp @@ -35,16 +35,16 @@ namespace margelo::nitro::camera { */ void invoke(const std::vector>& objects) const { static const auto method = javaClassStatic()->getMethod> /* objects */)>("invoke"); - method(self(), [&]() { - size_t __size = objects.size(); + method(self(), [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = objects[__i]; + const auto& __element = __input[__i]; auto __elementJni = std::dynamic_pointer_cast(__element)->getJavaPart(); __array->setElement(__i, *__elementJni); } return __array; - }()); + }(objects)); } }; @@ -62,16 +62,16 @@ namespace margelo::nitro::camera { * Invokes the C++ `std::function<...>` this `JFunc_void_std__vector_std__shared_ptr_HybridScannedObjectSpec___cxx` instance holds. */ void invoke_cxx(jni::alias_ref> objects) { - _func([&]() { - size_t __size = objects->size(); - std::vector> __vector; - __vector.reserve(__size); - for (size_t __i = 0; __i < __size; __i++) { - auto __element = objects->getElement(__i); - __vector.push_back(__element->getJHybridScannedObjectSpec()); - } - return __vector; - }()); + _func([&](auto&& __input) { + size_t __size = __input->size(); + std::vector> __vector; + __vector.reserve(__size); + for (size_t __i = 0; __i < __size; __i++) { + auto __element = __input->getElement(__i); + __vector.push_back(__element->getJHybridScannedObjectSpec()); + } + return __vector; + }(objects)); } public: diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceFactorySpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceFactorySpec.cpp index 3f96d33a4d..e5da02d957 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceFactorySpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceFactorySpec.cpp @@ -68,16 +68,16 @@ namespace margelo::nitro::camera { std::vector> JHybridCameraDeviceFactorySpec::getCameraDevices() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getCameraDevices"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridCameraDeviceSpec()); } return __vector; - }(); + }(__result); } std::optional> JHybridCameraDeviceFactorySpec::getUserPreferredCamera() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("getUserPreferredCamera"); @@ -88,6 +88,29 @@ namespace margelo::nitro::camera { static const auto method = _javaPart->javaClassStatic()->getMethod /* userPreferredCamera */)>("setUserPreferredCamera"); method(_javaPart, userPreferredCamera.has_value() ? std::dynamic_pointer_cast(userPreferredCamera.value())->getJavaPart() : nullptr); } + std::vector>> JHybridCameraDeviceFactorySpec::getSupportedMultiCamDeviceCombinations() { + static const auto method = _javaPart->javaClassStatic()->getMethod>>()>("getSupportedMultiCamDeviceCombinations"); + auto __result = method(_javaPart); + return [&](auto&& __input) { + size_t __size = __input->size(); + std::vector>> __vector; + __vector.reserve(__size); + for (size_t __i = 0; __i < __size; __i++) { + auto __element = __input->getElement(__i); + __vector.push_back([&](auto&& __input) { + size_t __size = __input->size(); + std::vector> __vector; + __vector.reserve(__size); + for (size_t __i = 0; __i < __size; __i++) { + auto __element = __input->getElement(__i); + __vector.push_back(__element->getJHybridCameraDeviceSpec()); + } + return __vector; + }(__element)); + } + return __vector; + }(__result); + } // Methods ListenerSubscription JHybridCameraDeviceFactorySpec::addOnCameraDevicesChangedListener(const std::function>& /* newDevices */)>& listener) { @@ -107,16 +130,16 @@ namespace margelo::nitro::camera { auto __promise = Promise>>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { auto __result = jni::static_ref_cast>(__boxedResult); - __promise->resolve([&]() { - size_t __size = __result->size(); + __promise->resolve([&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridCameraExtensionSpec()); } return __vector; - }()); + }(__result)); }); __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { jni::JniException __jniError(__throwable); diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceFactorySpec.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceFactorySpec.hpp index df9b7b23c1..19a60bea95 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceFactorySpec.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceFactorySpec.hpp @@ -53,6 +53,7 @@ namespace margelo::nitro::camera { std::vector> getCameraDevices() override; std::optional> getUserPreferredCamera() override; void setUserPreferredCamera(const std::optional>& userPreferredCamera) override; + std::vector>> getSupportedMultiCamDeviceCombinations() override; public: // Methods diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceSpec.cpp index 5acb643ec8..d1e1f1e4d6 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraDeviceSpec.cpp @@ -136,16 +136,16 @@ namespace margelo::nitro::camera { std::vector> JHybridCameraDeviceSpec::getPhysicalDevices() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getPhysicalDevices"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridCameraDeviceSpec()); } return __vector; - }(); + }(__result); } bool JHybridCameraDeviceSpec::getIsVirtualDevice() { static const auto method = _javaPart->javaClassStatic()->getMethod("isVirtualDevice"); @@ -155,16 +155,16 @@ namespace margelo::nitro::camera { std::vector JHybridCameraDeviceSpec::getSupportedPixelFormats() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getSupportedPixelFormats"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } bool JHybridCameraDeviceSpec::getSupportsPhotoHDR() { static const auto method = _javaPart->javaClassStatic()->getMethod("getSupportsPhotoHDR"); @@ -174,30 +174,30 @@ namespace margelo::nitro::camera { std::vector JHybridCameraDeviceSpec::getSupportedVideoDynamicRanges() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getSupportedVideoDynamicRanges"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } std::vector JHybridCameraDeviceSpec::getSupportedFPSRanges() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getSupportedFPSRanges"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } bool JHybridCameraDeviceSpec::getSupportsPreviewImage() { static const auto method = _javaPart->javaClassStatic()->getMethod("getSupportsPreviewImage"); @@ -232,16 +232,16 @@ namespace margelo::nitro::camera { std::vector JHybridCameraDeviceSpec::getMediaTypes() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getMediaTypes"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } bool JHybridCameraDeviceSpec::getSupportsFocusMetering() { static const auto method = _javaPart->javaClassStatic()->getMethod("getSupportsFocusMetering"); @@ -343,16 +343,16 @@ namespace margelo::nitro::camera { std::vector JHybridCameraDeviceSpec::getSupportedResolutions(OutputStreamType outputStreamType) { static const auto method = _javaPart->javaClassStatic()->getMethod>(jni::alias_ref /* outputStreamType */)>("getSupportedResolutions"); auto __result = method(_javaPart, JOutputStreamType::fromCpp(outputStreamType)); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } bool JHybridCameraDeviceSpec::supportsOutput(const std::shared_ptr& output) { static const auto method = _javaPart->javaClassStatic()->getMethod /* output */)>("supportsOutput"); diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraFactorySpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraFactorySpec.cpp index 17ced14007..c8f8b53583 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraFactorySpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraFactorySpec.cpp @@ -297,25 +297,25 @@ namespace margelo::nitro::camera { } std::shared_ptr>> JHybridCameraFactorySpec::resolveConstraints(const std::shared_ptr& device, const std::vector& outputConfigurations, const std::vector>& constraints, std::optional requiresMultiCam) { static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* device */, jni::alias_ref> /* outputConfigurations */, jni::alias_ref> /* constraints */, jni::alias_ref /* requiresMultiCam */)>("resolveConstraints"); - auto __result = method(_javaPart, std::dynamic_pointer_cast(device)->getJavaPart(), [&]() { - size_t __size = outputConfigurations.size(); + auto __result = method(_javaPart, std::dynamic_pointer_cast(device)->getJavaPart(), [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = outputConfigurations[__i]; + const auto& __element = __input[__i]; auto __elementJni = JCameraOutputConfiguration::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }(), [&]() { - size_t __size = constraints.size(); + }(outputConfigurations), [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = constraints[__i]; + const auto& __element = __input[__i]; auto __elementJni = JConstraint::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }(), requiresMultiCam.has_value() ? jni::JBoolean::valueOf(requiresMultiCam.value()) : nullptr); + }(constraints), requiresMultiCam.has_value() ? jni::JBoolean::valueOf(requiresMultiCam.value()) : nullptr); return [&]() { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { @@ -377,16 +377,16 @@ namespace margelo::nitro::camera { } std::shared_ptr JHybridCameraFactorySpec::createOutputSynchronizer(const std::vector>& outputs) { static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref> /* outputs */)>("createOutputSynchronizer"); - auto __result = method(_javaPart, [&]() { - size_t __size = outputs.size(); + auto __result = method(_javaPart, [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = outputs[__i]; + const auto& __element = __input[__i]; auto __elementJni = std::dynamic_pointer_cast(__element)->getJavaPart(); __array->setElement(__i, *__elementJni); } return __array; - }()); + }(outputs)); return __result->getJHybridCameraOutputSynchronizerSpec(); } std::shared_ptr JHybridCameraFactorySpec::createZoomGestureController() { diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraOutputSynchronizerSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraOutputSynchronizerSpec.cpp index 6ebae44836..a2a0edc555 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraOutputSynchronizerSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraOutputSynchronizerSpec.cpp @@ -80,16 +80,16 @@ namespace margelo::nitro::camera { std::vector> JHybridCameraOutputSynchronizerSpec::getOutputs() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getOutputs"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridCameraOutputSpec()); } return __vector; - }(); + }(__result); } // Methods diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp index 7f939efcc0..15851995f2 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraSessionSpec.cpp @@ -159,30 +159,30 @@ namespace margelo::nitro::camera { // Methods std::shared_ptr>>> JHybridCameraSessionSpec::configure(const std::vector& connections, const std::optional& config) { static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref> /* connections */, jni::alias_ref /* config */)>("configure"); - auto __result = method(_javaPart, [&]() { - size_t __size = connections.size(); + auto __result = method(_javaPart, [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = connections[__i]; + const auto& __element = __input[__i]; auto __elementJni = JCameraSessionConnection::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }(), config.has_value() ? JCameraSessionConfiguration::fromCpp(config.value()) : nullptr); + }(connections), config.has_value() ? JCameraSessionConfiguration::fromCpp(config.value()) : nullptr); return [&]() { auto __promise = Promise>>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { auto __result = jni::static_ref_cast>(__boxedResult); - __promise->resolve([&]() { - size_t __size = __result->size(); + __promise->resolve([&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridCameraControllerSpec()); } return __vector; - }()); + }(__result)); }); __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { jni::JniException __jniError(__throwable); diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraVideoOutputSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraVideoOutputSpec.cpp index ed7389c06c..703c7f65e9 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraVideoOutputSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridCameraVideoOutputSpec.cpp @@ -92,16 +92,16 @@ namespace margelo::nitro::camera { std::vector JHybridCameraVideoOutputSpec::getSupportedVideoCodecs() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getSupportedVideoCodecs"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } std::shared_ptr> JHybridCameraVideoOutputSpec::setOutputSettings(const VideoOutputSettings& settings) { static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* settings */)>("setOutputSettings"); diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridDepthSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridDepthSpec.cpp index ca0da04626..8ffe6a17a0 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridDepthSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridDepthSpec.cpp @@ -143,16 +143,16 @@ namespace margelo::nitro::camera { std::vector JHybridDepthSpec::getAvailableDepthPixelFormats() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getAvailableDepthPixelFormats"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } std::optional> JHybridDepthSpec::getCameraCalibrationData() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("getCameraCalibrationData"); diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridFrameSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridFrameSpec.cpp index 02f8844231..be92e04cfd 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridFrameSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridFrameSpec.cpp @@ -127,16 +127,16 @@ namespace margelo::nitro::camera { std::vector> JHybridFrameSpec::getPlanes() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getPlanes"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridFramePlaneSpec()); } return __vector; - }(); + }(__result); } std::shared_ptr JHybridFrameSpec::getPixelBuffer() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("getPixelBuffer"); diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridPreviewViewSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridPreviewViewSpec.cpp index 37c090cef1..46defb5499 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridPreviewViewSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridPreviewViewSpec.cpp @@ -109,29 +109,29 @@ namespace margelo::nitro::camera { std::optional>> JHybridPreviewViewSpec::getGestureControllers() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getGestureControllers"); auto __result = method(_javaPart); - return __result != nullptr ? std::make_optional([&]() { - size_t __size = __result->size(); + return __result != nullptr ? std::make_optional([&](auto&& __input) { + size_t __size = __input->size(); std::vector> __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->getJHybridGestureControllerSpec()); } return __vector; - }()) : std::nullopt; + }(__result)) : std::nullopt; } void JHybridPreviewViewSpec::setGestureControllers(const std::optional>>& gestureControllers) { static const auto method = _javaPart->javaClassStatic()->getMethod> /* gestureControllers */)>("setGestureControllers"); - method(_javaPart, gestureControllers.has_value() ? [&]() { - size_t __size = gestureControllers.value().size(); + method(_javaPart, gestureControllers.has_value() ? [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = gestureControllers.value()[__i]; + const auto& __element = __input[__i]; auto __elementJni = std::dynamic_pointer_cast(__element)->getJavaPart(); __array->setElement(__i, *__elementJni); } return __array; - }() : nullptr); + }(gestureControllers.value()) : nullptr); } std::optional> JHybridPreviewViewSpec::getOnPreviewStarted() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("getOnPreviewStarted_cxx"); diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridScannedCodeSpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridScannedCodeSpec.cpp index 102b3ba6aa..b70b9cd708 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridScannedCodeSpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JHybridScannedCodeSpec.cpp @@ -62,16 +62,16 @@ namespace margelo::nitro::camera { std::vector JHybridScannedCodeSpec::getCornerPoints() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getCornerPoints"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }(); + }(__result); } ScannedObjectType JHybridScannedCodeSpec::getType() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("getType"); diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JObjectOutputOptions.hpp b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JObjectOutputOptions.hpp index e5443270f3..47ae23168a 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/c++/JObjectOutputOptions.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/android/c++/JObjectOutputOptions.hpp @@ -36,16 +36,16 @@ namespace margelo::nitro::camera { static const auto fieldEnabledObjectTypes = clazz->getField>("enabledObjectTypes"); jni::local_ref> enabledObjectTypes = this->getFieldValue(fieldEnabledObjectTypes); return ObjectOutputOptions( - [&]() { - size_t __size = enabledObjectTypes->size(); + [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = enabledObjectTypes->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }() + }(enabledObjectTypes) ); } @@ -60,16 +60,16 @@ namespace margelo::nitro::camera { static const auto create = clazz->getStaticMethod("fromCpp"); return create( clazz, - [&]() { - size_t __size = value.enabledObjectTypes.size(); + [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.enabledObjectTypes[__i]; + const auto& __element = __input[__i]; auto __elementJni = JScannedObjectType::fromCpp(__element); __array->setElement(__i, *__elementJni); } return __array; - }() + }(value.enabledObjectTypes) ); } }; diff --git a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/HybridCameraDeviceFactorySpec.kt b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/HybridCameraDeviceFactorySpec.kt index f610aeb748..b41306e76c 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/HybridCameraDeviceFactorySpec.kt +++ b/packages/react-native-vision-camera/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/HybridCameraDeviceFactorySpec.kt @@ -35,6 +35,10 @@ abstract class HybridCameraDeviceFactorySpec: HybridObject() { @set:DoNotStrip @set:Keep abstract var userPreferredCamera: HybridCameraDeviceSpec? + + @get:DoNotStrip + @get:Keep + abstract val supportedMultiCamDeviceCombinations: Array> // Methods abstract fun addOnCameraDevicesChangedListener(listener: (newDevices: Array) -> Unit): ListenerSubscription diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Bridge.hpp b/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Bridge.hpp index 5bde895e9d..5abcd00279 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Bridge.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/VisionCamera-Swift-Cxx-Bridge.hpp @@ -1426,6 +1426,17 @@ namespace margelo::nitro::camera::bridge::swift { return Result::withError(error); } + // pragma MARK: std::vector>> + /** + * Specialized version of `std::vector>>`. + */ + using std__vector_std__vector_std__shared_ptr_HybridCameraDeviceSpec___ = std::vector>>; + inline std::vector>> create_std__vector_std__vector_std__shared_ptr_HybridCameraDeviceSpec___(size_t size) noexcept { + std::vector>> vector; + vector.reserve(size); + return vector; + } + // pragma MARK: std::function>& /* newDevices */)> /** * Specialized version of `std::function>&)>`. diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/c++/HybridCameraDeviceFactorySpecSwift.hpp b/packages/react-native-vision-camera/nitrogen/generated/ios/c++/HybridCameraDeviceFactorySpecSwift.hpp index a13436fca5..f166161e87 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/c++/HybridCameraDeviceFactorySpecSwift.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/c++/HybridCameraDeviceFactorySpecSwift.hpp @@ -89,6 +89,10 @@ namespace margelo::nitro::camera { inline void setUserPreferredCamera(const std::optional>& userPreferredCamera) noexcept override { _swiftPart.setUserPreferredCamera(userPreferredCamera); } + inline std::vector>> getSupportedMultiCamDeviceCombinations() noexcept override { + auto __result = _swiftPart.getSupportedMultiCamDeviceCombinations(); + return __result; + } public: // Methods diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraDeviceFactorySpec.swift b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraDeviceFactorySpec.swift index 62708a1149..ce0ba0d904 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraDeviceFactorySpec.swift +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraDeviceFactorySpec.swift @@ -12,6 +12,7 @@ public protocol HybridCameraDeviceFactorySpec_protocol: HybridObject { // Properties var cameraDevices: [(any HybridCameraDeviceSpec)] { get } var userPreferredCamera: (any HybridCameraDeviceSpec)? { get set } + var supportedMultiCamDeviceCombinations: [[(any HybridCameraDeviceSpec)]] { get } // Methods func addOnCameraDevicesChangedListener(listener: @escaping (_ newDevices: [(any HybridCameraDeviceSpec)]) -> Void) throws -> ListenerSubscription diff --git a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraDeviceFactorySpec_cxx.swift b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraDeviceFactorySpec_cxx.swift index 658132f915..ae6fb283ad 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraDeviceFactorySpec_cxx.swift +++ b/packages/react-native-vision-camera/nitrogen/generated/ios/swift/HybridCameraDeviceFactorySpec_cxx.swift @@ -167,6 +167,28 @@ open class HybridCameraDeviceFactorySpec_cxx { }() } } + + public final var supportedMultiCamDeviceCombinations: bridge.std__vector_std__vector_std__shared_ptr_HybridCameraDeviceSpec___ { + @inline(__always) + get { + return { () -> bridge.std__vector_std__vector_std__shared_ptr_HybridCameraDeviceSpec___ in + var __vector = bridge.create_std__vector_std__vector_std__shared_ptr_HybridCameraDeviceSpec___(self.__implementation.supportedMultiCamDeviceCombinations.count) + for __item in self.__implementation.supportedMultiCamDeviceCombinations { + __vector.push_back({ () -> bridge.std__vector_std__shared_ptr_HybridCameraDeviceSpec__ in + var __vector = bridge.create_std__vector_std__shared_ptr_HybridCameraDeviceSpec__(__item.count) + for __item in __item { + __vector.push_back({ () -> bridge.std__shared_ptr_HybridCameraDeviceSpec_ in + let __cxxWrapped = __item.getCxxWrapper() + return __cxxWrapped.getCxxPart() + }()) + } + return __vector + }()) + } + return __vector + }() + } + } // Methods @inline(__always) diff --git a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraDeviceFactorySpec.cpp b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraDeviceFactorySpec.cpp index d50c1b5a4f..f0435f7356 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraDeviceFactorySpec.cpp +++ b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraDeviceFactorySpec.cpp @@ -17,6 +17,7 @@ namespace margelo::nitro::camera { prototype.registerHybridGetter("cameraDevices", &HybridCameraDeviceFactorySpec::getCameraDevices); prototype.registerHybridGetter("userPreferredCamera", &HybridCameraDeviceFactorySpec::getUserPreferredCamera); prototype.registerHybridSetter("userPreferredCamera", &HybridCameraDeviceFactorySpec::setUserPreferredCamera); + prototype.registerHybridGetter("supportedMultiCamDeviceCombinations", &HybridCameraDeviceFactorySpec::getSupportedMultiCamDeviceCombinations); prototype.registerHybridMethod("addOnCameraDevicesChangedListener", &HybridCameraDeviceFactorySpec::addOnCameraDevicesChangedListener); prototype.registerHybridMethod("getCameraForId", &HybridCameraDeviceFactorySpec::getCameraForId); prototype.registerHybridMethod("getSupportedExtensions", &HybridCameraDeviceFactorySpec::getSupportedExtensions); diff --git a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraDeviceFactorySpec.hpp b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraDeviceFactorySpec.hpp index 823a998870..cde15be396 100644 --- a/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraDeviceFactorySpec.hpp +++ b/packages/react-native-vision-camera/nitrogen/generated/shared/c++/HybridCameraDeviceFactorySpec.hpp @@ -63,6 +63,7 @@ namespace margelo::nitro::camera { virtual std::vector> getCameraDevices() = 0; virtual std::optional> getUserPreferredCamera() = 0; virtual void setUserPreferredCamera(const std::optional>& userPreferredCamera) = 0; + virtual std::vector>> getSupportedMultiCamDeviceCombinations() = 0; public: // Methods diff --git a/packages/react-native-vision-camera/package.json b/packages/react-native-vision-camera/package.json index 57ae8c9268..e76f19ff7d 100644 --- a/packages/react-native-vision-camera/package.json +++ b/packages/react-native-vision-camera/package.json @@ -70,11 +70,11 @@ }, "devDependencies": { "@types/react": "19.2.14", - "nitrogen": "0.35.5", + "nitrogen": "0.35.6", "react": "19.2.3", "react-native": "0.84.0", "react-native-nitro-image": "0.14.0", - "react-native-nitro-modules": "0.35.5", + "react-native-nitro-modules": "0.35.6", "typescript": "5.9.3" }, "peerDependencies": { diff --git a/packages/react-native-vision-camera/src/specs/inputs/CameraDeviceFactory.nitro.ts b/packages/react-native-vision-camera/src/specs/inputs/CameraDeviceFactory.nitro.ts index 0a6f3c0852..6d04537536 100644 --- a/packages/react-native-vision-camera/src/specs/inputs/CameraDeviceFactory.nitro.ts +++ b/packages/react-native-vision-camera/src/specs/inputs/CameraDeviceFactory.nitro.ts @@ -1,4 +1,5 @@ import type { HybridObject } from 'react-native-nitro-modules' +import type { CameraFactory } from '../CameraFactory.nitro' import type { CameraPosition } from '../common-types/CameraPosition' import type { ListenerSubscription } from '../common-types/ListenerSubscription' import type { CameraSession } from '../session/CameraSession.nitro' @@ -12,8 +13,12 @@ import type { CameraExtension } from './CameraExtension.nitro' export interface CameraDeviceFactory extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { /** - * Get a list of all devices. - * This list may change as camera devices get plugged in/out. + * Get a list of all {@linkcode CameraDevice}s on this platform. + * + * This list may change as {@linkcode CameraDevice}s get plugged in/out (e.g. + * {@linkcode CameraPosition | 'external'} Cameras via USB/UVC), devices + * become available/unavailable (e.g. continuity Cameras), or Camera positions + * change (e.g. on foldable phones). */ readonly cameraDevices: CameraDevice[] /** @@ -22,6 +27,64 @@ export interface CameraDeviceFactory */ userPreferredCamera?: CameraDevice + /** + * A list of all {@linkcode CameraDevice} combinations that are supported + * in Multi-Cam {@linkcode CameraSession}s. + * + * This list always contains a subset of {@linkcode cameraDevices}, often + * less. + * + * @discussion + * For example, on many platforms only a {@linkcode CameraPosition | 'front'} + * and a {@linkcode CameraPosition | 'back'} {@linkcode CameraDevice} are + * supported to be used in a Multi-Cam {@linkcode CameraSession} - in this case, + * the returned 2D Array looks something like this: + * ``` + * [ + * [{ position: 'back', ... }, { position: 'front', ... }] + * ] + * ``` + * Two {@linkcode CameraPosition | 'back'}-, or two {@linkcode CameraPosition | 'front'} + * {@linkcode CameraDevice}s are often not supported together in a Multi-Cam + * {@linkcode CameraSession}. + * + * When creating a Multi-Cam {@linkcode CameraSession}, you must ensure + * that you are using Device combinations that are actually supported + * on the platform, otherwise the session might fail to configure. + * + * @discussion + * If the platform does not support Multi-Cam {@linkcode CameraSession}s, + * an empty array (`[]`) will be returned. + * + * + * @example + * ```ts + * if (VisionCamera.supportsMultiCamSessions) { + * const deviceFactory = await VisionCamera.createDeviceFactory() + * const deviceCombinations = deviceFactory.supportedMultiCamDeviceCombinations[0] + * if (deviceCombinations != null) { + * const connections = deviceCombinations.map((device) => { + * const previewOutput = VisionCamera.createPreviewOutput() + * return { + * input: device, + * outputs: [ + * { output: previewOutput, mirrorMode: 'auto' } + * ], + * constraints: [] + * } satisfies CameraSessionConnection + * }) + * + * const session = await VisionCamera.createCameraSession(true) + * const controllers = await session.configure(connections) + * await session.start() + * } + * } + * ``` + * + * @see {@linkcode CameraFactory.supportsMultiCamSessions} + */ + readonly supportedMultiCamDeviceCombinations: CameraDevice[][] + /** * Add a listener to be called whenever the * available {@linkcode cameraDevices} change, diff --git a/packages/react-native-vision-camera/src/specs/session/CameraSession.nitro.ts b/packages/react-native-vision-camera/src/specs/session/CameraSession.nitro.ts index 6b19b9ab29..8390dac2b9 100644 --- a/packages/react-native-vision-camera/src/specs/session/CameraSession.nitro.ts +++ b/packages/react-native-vision-camera/src/specs/session/CameraSession.nitro.ts @@ -68,6 +68,10 @@ export type InterruptionReason = * and back-Camera using the imperative API: * ```ts * if (VisionCamera.supportsMultiCamSessions) { + * const deviceFactory = await VisionCamera.createDeviceFactory() + * const deviceCombinations = deviceFactory.supportedMultiCamDeviceCombinations + * // ... get `frontDevice` and `backDevice` from one of + * // the combinations in `deviceCombinations`. * const session = await VisionCamera.createCameraSession(true) * const [frontController, backController] = await session.configure([ * // Front Camera @@ -110,6 +114,12 @@ export interface CameraSession * from one {@linkcode CameraDevice} (the _input_) to multiple * {@linkcode CameraOutput}s (the _outputs_). * + * @note In a Multi-Cam Camera Session, the given {@linkcode connections}' input devices + * must be supported to be used together in a Multi-Cam Camera Session, as not every + * {@linkcode CameraDevice} can be used with every other {@linkcode CameraDevice} + * simultaneously. See {@linkcode CameraDeviceFactory.supportedMultiCamDeviceCombinations} + * for a full list of supported combinations. + * * @param connections The list of connections from one _input_ to * multiple _outputs_. If this {@linkcode CameraSession} was created * as a multi-cam session (see {@linkcode CameraFactory.createCameraSession | createCameraSession(enableMultiCam)}), @@ -122,6 +132,9 @@ export interface CameraSession * @throws If Camera Permission has not been granted - see {@linkcode CameraFactory.cameraPermissionStatus} * @throws If multiple {@linkcode connections} are added, but the * {@linkcode CameraSession} was not created as a multi-cam session. + * @throws If hardware resources are being exhausted by too large connection graphs. + * @throws If this is a Multi-Cam session, but the connection inputs are not supported to + * be used together - see {@linkcode CameraDeviceFactory.supportedMultiCamDeviceCombinations} * * @example * Creating a simple Preview + Photo connection: @@ -162,6 +175,10 @@ export interface CameraSession * Creating a multi-cam session with front- and back Camera: * ```ts * if (VisionCamera.supportsMultiCamSessions) { + * const deviceFactory = await VisionCamera.createDeviceFactory() + * const deviceCombinations = deviceFactory.supportedMultiCamDeviceCombinations + * // ... get `frontDevice` and `backDevice` from one of + * // the combinations in `deviceCombinations`. * const session = await VisionCamera.createCameraSession(true) * const [frontController, backController] = await session.configure([ * // Front Camera