mrousavy / react-native-vision-camera

📸 A powerful, high-performance React Native Camera library.
https://react-native-vision-camera.com
MIT License
7.28k stars 1.07k forks source link

🐛 Using Skia Frame Processor and Photo true throws error in Android #3150

Open v1n33th opened 2 weeks ago

v1n33th commented 2 weeks ago

What's happening?

Using Skia Frame processor along with photo true throws [device/camera-already-in-use: The given Camera Device is already in use!] in Android. Skia Frame processor works when photo is set to false. Was able to reproduce this in the example app by changing minSDKVersion.

Reproduceable Code

<ReanimatedCamera
                style={StyleSheet.absoluteFill}
                device={device}
                isActive={isActive}
                ref={camera}
                onInitialized={onInitialized}
                onError={onError}
                format={format}
                fps={fps}
                photoHdr={photoHdr}
                videoHdr={videoHdr}
                photoQualityBalance="quality"
                lowLightBoost={device.supportsLowLightBoost && enableNightMode}
                enableZoomGesture={false}
                animatedProps={cameraAnimatedProps}
                exposure={0}
                enableFpsGraph={true}
                outputOrientation="device"
                photo={true}
                video={true}
                audio={microphone.hasPermission}
                enableLocation={location.hasPermission}
                frameProcessor={skiaFrameProcessor}
              />

Relevant log output

2024-08-23 12:06:57.873 15980-16730 CameraStateRegistry     com.mrousavy.camera.example          D  Recalculating open cameras:
                                                                                                  Camera                                       State                 
                                                                                                  -------------------------------------------------------------------
                                                                                                  Camera@987758d[id=0]                         OPENING               
                                                                                                  Camera@ea065bc[id=1]                         UNKNOWN               
                                                                                                  -------------------------------------------------------------------
                                                                                                  Open count: 1 (Max allowed: 1)

2024-08-23 12:06:57.873 15980-16730 CameraStateMachine      com.mrousavy.camera.example          D  New public camera state CameraState{type=OPENING, error=StateError{code=2, cause=null}} from OPENING and StateError{code=2, cause=null}

2024-08-23 12:06:57.873 15980-16730 CameraStateMachine      com.mrousavy.camera.example          D  Publishing new public camera state CameraState{type=OPENING, error=StateError{code=2, cause=null}}

2024-08-23 12:06:57.873 15980-15980 CameraSession           com.mrousavy.camera.example          I  Camera State: OPENING (has error: true)

2024-08-23 12:06:57.873 15980-15980 CameraView              com.mrousavy.camera.example          I  invokeOnStopped()

2024-08-23 12:06:57.874 15980-16730 Camera2CameraImpl       com.mrousavy.camera.example          D  {Camera@987758d[id=0]} Resetting Capture Session

2024-08-23 12:06:57.874 15980-16730 Camera2CameraImpl       com.mrousavy.camera.example          D  {Camera@987758d[id=0]} Skipping Capture Session state check due to current camera state: REOPENING and previous session status: false

2024-08-23 12:06:57.874 15980-16730 Camera2CameraImpl       com.mrousavy.camera.example          D  {Camera@987758d[id=0]} Releasing session in state REOPENING

2024-08-23 12:06:57.875 15980-16730 Camera2CameraImpl       com.mrousavy.camera.example          D  {Camera@987758d[id=0]} Camera reopen required. Checking if the current camera can be closed safely.

2024-08-23 12:06:57.875 15980-16730 Camera2CameraImpl       com.mrousavy.camera.example          D  {Camera@987758d[id=0]} closing camera

2024-08-23 12:06:57.875 15980-15980 CameraView              com.mrousavy.camera.example          E  invokeOnError(...):

2024-08-23 12:06:57.875 15980-15980 System.err              com.mrousavy.camera.example          W  com.mrousavy.camera.core.CameraInUseError: The given Camera Device is already in use!
                                                                                                  at com.mrousavy.camera.core.extensions.StateError_toCameraErrorKt.toCameraError(StateError+toCameraError.kt:18)
                                                                                                  at com.mrousavy.camera.core.CameraSession_ConfigurationKt$configureCamera$2.invoke(CameraSession+Configuration.kt:291)
                                                                                                  at com.mrousavy.camera.core.CameraSession_ConfigurationKt$configureCamera$2.invoke(CameraSession+Configuration.kt:274)
                                                                                                  at com.mrousavy.camera.core.CameraSession_ConfigurationKt.configureCamera$lambda$7(CameraSession+Configuration.kt:274)
                                                                                                  at com.mrousavy.camera.core.CameraSession_ConfigurationKt.$r8$lambda$k4xoH-HsrtOJUBzN5ggCd_BRp2Y(Unknown Source:0)
                                                                                                  at com.mrousavy.camera.core.CameraSession_ConfigurationKt$$ExternalSyntheticLambda0.onChanged(Unknown Source:2)
                                                                                                  at androidx.lifecycle.LiveData.considerNotify(LiveData.java:133)
                                                                                                  at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:151)
                                                                                                  at androidx.lifecycle.LiveData.setValue(LiveData.java:309)
                                                                                                  at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)
                                                                                                  at androidx.camera.camera2.internal.Camera2CameraInfoImpl$RedirectableLiveData.$r8$lambda$LuOJQ0sg1wvLyxomp0-YWy0I_2g(Unknown Source:0)
                                                                                                  at androidx.camera.camera2.internal.Camera2CameraInfoImpl$RedirectableLiveData$$ExternalSyntheticLambda0.onChanged(Unknown Source:2)
                                                                                                  at androidx.lifecycle.MediatorLiveData$Source.onChanged(MediatorLiveData.java:171)
                                                                                                  at androidx.lifecycle.LiveData.considerNotify(LiveData.java:133)
                                                                                                  at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:151)
                                                                                                  at androidx.lifecycle.LiveData.setValue(LiveData.java:309)
                                                                                                  at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)
                                                                                                  at androidx.lifecycle.LiveData$1.run(LiveData.java:93)
                                                                                                  at android.os.Handler.handleCallback(Handler.java:938)
                                                                                                  at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                  at android.os.Looper.loop(Looper.java:263)
                                                                                                  at android.app.ActivityThread.main(ActivityThread.java:8296)
                                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
                                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)

2024-08-23 12:06:57.878 15980-16730 Camera2CameraImpl       com.mrousavy.camera.example          E  Unable to configure camera Camera@987758d[id=0]
                                                                                                  androidx.camera.camera2.internal.compat.CameraAccessExceptionCompat: CAMERA_ERROR (3): endConfigure:547: Camera 0: Error configuring streams: Broken pipe (-32)
                                                                                                  at androidx.camera.camera2.internal.compat.CameraDeviceCompatApi28Impl.createCaptureSession(CameraDeviceCompatApi28Impl.java:44)
                                                                                                  at androidx.camera.camera2.internal.compat.CameraDeviceCompat.createCaptureSession(CameraDeviceCompat.java:125)
                                                                                                  at androidx.camera.camera2.internal.SynchronizedCaptureSessionBaseImpl.lambda$openCaptureSession$0$androidx-camera-camera2-internal-SynchronizedCaptureSessionBaseImpl(SynchronizedCaptureSessionBaseImpl.java:157)
                                                                                                  at androidx.camera.camera2.internal.SynchronizedCaptureSessionBaseImpl$$ExternalSyntheticLambda2.attachCompleter(Unknown Source:8)
                                                                                                  at androidx.concurrent.futures.CallbackToFutureAdapter.getFuture(CallbackToFutureAdapter.java:102)
                                                                                                  at androidx.camera.camera2.internal.SynchronizedCaptureSessionBaseImpl.openCaptureSession(SynchronizedCaptureSessionBaseImpl.java:147)
                                                                                                  at androidx.camera.camera2.internal.SynchronizedCaptureSessionImpl.lambda$openCaptureSession$0$androidx-camera-camera2-internal-SynchronizedCaptureSessionImpl(SynchronizedCaptureSessionImpl.java:117)
                                                                                                  at androidx.camera.camera2.internal.SynchronizedCaptureSessionImpl$$ExternalSyntheticLambda1.apply(Unknown Source:10)
                                                                                                  at androidx.camera.core.impl.utils.futures.ChainingListenableFuture.run(ChainingListenableFuture.java:201)
                                                                                                  at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:229)
                                                                                                  at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:171)
                                                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
                                                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
                                                                                                  at java.lang.Thread.run(Thread.java:923)
                                                                                                  Caused by: android.os.ServiceSpecificException: endConfigure:547: Camera 0: Error configuring streams: Broken pipe (-32) (code 10)
                                                                                                  at android.os.Parcel.createExceptionOrNull(Parcel.java:2403)
                                                                                                  at android.os.Parcel.createException(Parcel.java:2373)
                                                                                                  at android.os.Parcel.readException(Parcel.java:2356)
                                                                                                  at android.os.Parcel.readException(Parcel.java:2298)
                                                                                                  at android.hardware.camera2.ICameraDeviceUser$Stub$Proxy.endConfigure(ICameraDeviceUser.java:799)
                                                                                                  at android.hardware.camera2.impl.ICameraDeviceUserWrapper.endConfigure(ICameraDeviceUserWrapper.java:116)
                                                                                                  at android.hardware.camera2.impl.CameraDeviceImpl.configureStreamsChecked(CameraDeviceImpl.java:507)
                                                                                                  at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSessionInternal(CameraDeviceImpl.java:709)
                                                                                                  at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:670)
                                                                                                  at androidx.camera.camera2.internal.compat.CameraDeviceCompatApi28Impl.createCaptureSession(CameraDeviceCompatApi28Impl.java:42)
                                                                                                  at androidx.camera.camera2.internal.compat.CameraDeviceCompat.createCaptureSession(CameraDeviceCompat.java:125)

Camera Device

{
  "formats": [],
  "sensorOrientation": "landscape-left",
  "hardwareLevel": "full",
  "maxZoom": 10,
  "minZoom": 1,
  "maxExposure": 12,
  "supportsLowLightBoost": false,
  "neutralZoom": 1,
  "physicalDevices": [
    "wide-angle-camera"
  ],
  "supportsFocus": true,
  "supportsRawCapture": false,
  "isMultiCam": false,
  "minFocusDistance": 10,
  "minExposure": -12,
  "name": "0 (BACK) androidx.camera.camera2",
  "hasFlash": true,
  "hasTorch": true,
  "position": "back",
  "id": "0"
}

Device

Realme 3 pro (RMX1851) (Android version:11)

VisionCamera Version

4.5.2

Can you reproduce this issue in the VisionCamera Example app?

Yes, I can reproduce the same issue in the Example app here

Additional information

maintenance-hans[bot] commented 2 weeks ago

Guten Tag, Hans here!🍻

Looks like you’ve encountered an interesting issue with ze Skia Frame Processor. Thank you for providing such detailed information and logs, it helps a lot!

However, have you tried checking if your camera device might already be in use by another part of ze app? This error often occurs when multiple camera streams are trying to access ze camera at once.

Also, please ensure you're following all setup instructions in ze documentation. If ze problem persists, it would be great to get some additional context or any recent changes you’ve made to your code.

If you find this project helpful, consider sponsoring mrousavy to support his work: sponsor here. It really helps keep ze project alive and healthy.

Looking forward to your reply!

Note: If you think I made a mistake, please ping @mrousavy to take a look.