Search code examples
androidkotlinandroid-cameraandroid-camera2

Unsupported set of inputs/outputs provided when using MediaCodec.createPersistentInputSurface() on Redmi Note 11 Pro 5G


I am only encountering this issue on a Redmi Note 11 Pro 5G, I am not sure why but the Camera support level is LEVEL_3 if it matters.

I get the error below and camera shows me a black preview

Stream configuration failed due to: endConfigure:667: Camera 0: Unsupported set of inputs/outputs provided
2025-02-03 12:14:49.525  6817-7967  CameraCaptureSession      E  Session 0: Failed to create capture session; configuration failed

Stack trace:

025-02-03 12:14:49.000  6817-7688  libc                      W  Access denied finding property "vendor.camera.aux.packagelist"
2025-02-03 12:14:49.000  6817-7688  libc                      W  Access denied finding property "vendor.camera.aux.packagelistext"
2025-02-03 12:14:49.003  6817-7688  libc                      W  Access denied finding property "persist.vendor.camera.privapp.list"
2025-02-03 12:14:49.004  6817-7688  CameraExtImplXiaoMi       D  initCameraDevice: 0
2025-02-03 12:14:49.020  6817-7688  CameraManager             I  Open camera top activityName is <activity name>
2025-02-03 12:14:49.040  6817-7402  CameraManagerGlobal       E  Camera 4 is not available. Ignore physical camera status change
2025-02-03 12:14:49.172  6817-7402  CameraInjector            D  updateCloudCameraControllerInfoAsync: has aleardy start update task.
2025-02-03 12:14:49.172  6817-7402  CameraInjector            D  waitForResult: 
2025-02-03 12:14:49.172  6817-7402  libc                      W  Access denied finding property "vendor.camera.aux.packagelist"
2025-02-03 12:14:49.173  6817-7402  libc                      W  Access denied finding property "vendor.camera.aux.packagelistext"
2025-02-03 12:14:49.173  6817-7402  CameraManagerGlobal       W  ignore the torch status update of camera: 2
2025-02-03 12:14:49.173  6817-7402  CameraInjector            D  updateCloudCameraControllerInfoAsync: has aleardy start update task.
2025-02-03 12:14:49.173  6817-7402  CameraInjector            D  waitForResult: 
2025-02-03 12:14:49.173  6817-7402  libc                      W  Access denied finding property "vendor.camera.aux.packagelist"
2025-02-03 12:14:49.173  6817-7402  libc                      W  Access denied finding property "vendor.camera.aux.packagelistext"
2025-02-03 12:14:49.174  6817-7402  CameraManagerGlobal       W  ignore the torch status update of camera: 3
2025-02-03 12:14:49.174  6817-7402  CameraInjector            D  updateCloudCameraControllerInfoAsync: has aleardy start update task.
2025-02-03 12:14:49.174  6817-7402  CameraInjector            D  waitForResult: 
2025-02-03 12:14:49.174  6817-7402  libc                      W  Access denied finding property "vendor.camera.aux.packagelist"
2025-02-03 12:14:49.174  6817-7402  libc                      W  Access denied finding property "vendor.camera.aux.packagelistext"
2025-02-03 12:14:49.174  6817-7402  CameraManagerGlobal       W  ignore the torch status update of camera: 4
2025-02-03 12:14:49.175  6817-6835  CameraInjector            D  updateCloudCameraControllerInfoAsync: has aleardy start update task.
2025-02-03 12:14:49.175  6817-6835  CameraInjector            D  waitForResult: 
2025-02-03 12:14:49.175  6817-6835  libc                      W  Access denied finding property "vendor.camera.aux.packagelist"
2025-02-03 12:14:49.175  6817-6835  libc                      W  Access denied finding property "vendor.camera.aux.packagelistext"
2025-02-03 12:14:49.176  6817-6835  CameraManagerGlobal       W  ignore the torch status update of camera: 5
2025-02-03 12:14:49.314  6817-7688  BpBinder                  W  PerfMonitor binderTransact :  time=294ms interface=android.hardware.ICameraService code=4
2025-02-03 12:14:49.320  6817-7967  Camera2Controller         D  FPS range is [12, 30]
2025-02-03 12:14:49.409  6817-7967  CameraDevice-JV-0         D  waitUntilIdle: E. id = 0
2025-02-03 12:14:49.410  6817-7967  CameraDevice-JV-0         D  waitUntilIdle: X
2025-02-03 12:14:49.525  6817-7967  CameraDevice-JV-0         W  Stream configuration failed due to: endConfigure:667: Camera 0: Unsupported set of inputs/outputs provided
2025-02-03 12:14:49.525  6817-7967  CameraCaptureSession      E  Session 0: Failed to create capture session; configuration failed
2025-02-03 12:14:49.526  6817-7967  Camera2Con...iewSession   D  Configuration Failed

Relevant code, you may need to setup a few other things if you want to run it. The error goes away if I remove the recorderSurface from the list of surfaces when creating the capture session, but I cannot record then. It only happens for this specific phone so far.

private var recorderSurface: Surface? = null
private var previewReader: ImageReader? = null
private var captureReader: ImageReader? = null
private var cameraThread: HandlerThread? = null
private var cameraHandler: Handler? = null
private var mediaRecorder: MediaRecorder? = null

previewReader = ImageReader.newInstance(1920, 1080, ImageFormat.YUV_420_888, 5)
captureReader = ImageReader.newInstance(1920, 1080, ImageFormat.YUV_420_888, 5)
 
cameraThread = HandlerThread("Camera").also { it.start() }
cameraHandler = Handler(cameraThread.looper)

private fun createRecordRequest() {

    val recorderSurface = MediaCodec.createPersistentInputSurface()
    mediaRecorder = MediaRecorder().apply {
        setVideoSource(MediaRecorder.VideoSource.SURFACE)
        setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
        setOutputFile(context.cacheDir.path + "/file.mp4")
        setVideoEncoder(MediaRecorder.VideoEncoder.HEVC)
        setVideoEncodingBitRate(2_000_000)
        setVideoFrameRate(30)
        setVideoSize(1920, 1080)
        setInputSurface(recorderSurface)
        prepare()
        release()
    }
    
    this.recorderSurface = recorderSurface

}


private val stateCallback =
    object : CameraDevice.StateCallback() {
        override fun onOpened(cameraDevice: CameraDevice) {
            [email protected] = cameraDevice
            createRecordRequest()
            createCameraPreviewSession()
        }
    }



private fun openCamera() {
    //check permissions

    //pass in your camera id
        val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
        cameraManager.openCamera(cameraId, stateCallback, backgroundHandler)
}


private fun createCameraPreviewSession() {
    val surfaceList = mutableListOf<Surface>()
    previewReader?.surface?.let { surface -> surfaceList.add(surface) }
    captureReader?.surface?.let { surface -> surfaceList.add(surface) }

    //if i remove this line, the error doesnt happen, means something is wrong with the recorder surface
    recorderSurface?.let { surface -> surfaceList.add(surface) }

    val previewRequestBuilder =
        cameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)

    previewRequestBuilder.apply {
        addTarget(previewReader!!.surface)
        set(
            CaptureRequest.CONTROL_AE_MODE,
           CameraMetadata.CONTROL_AE_MODE_ON
            )
    }
    
    cameraDevice?.createCaptureSession(
        surfaceList,
        object : CameraCaptureSession.StateCallback() {
            override fun onConfigured(captureSession: CameraCaptureSession) {
                //perform configuration steps after, but it fails
            }

            override fun onConfigureFailed(cameraCaptureSession: CameraCaptureSession) {]
                //configuration will fail
                Timber.d("Configuration Failed")
            }
        },
        cameraHandler)
}

Solution

  • Solved my problem. It seems for this phone, it cannot support both recording and image capture surfaces at the same time, it works if I remove either captureReader?.surface?.let { surface -> surfaceList.add(surface) } or recorderSurface?.let { surface -> surfaceList.add(surface) }