Skip to content

UVC capture card fails to start preview (err = -51) while webcam works fine #135

@noho501

Description

@noho501

Hi,

I'm using CameraHelper to connect UVC, webcam devices work correctly, but when I connect an HDMI → USB capture card, preview fails with the following error:

[UVCPreview.cpp:549:prepare_preview]: could not negotiate with camera: err = -51
class CustomCameraUvcSource : VideoSource() {

    private var cameraHelper: ICameraHelper? = null
    private var surface: Surface? = null
    private var running = false

    override fun start(surfaceTexture: SurfaceTexture) {
        this.surfaceTexture = surfaceTexture
        surface = Surface(surfaceTexture)

        cameraHelper = CameraHelper().apply {
            setStateCallback(stateCallback)
        }
        running = true
    }

    override fun stop() {
        surface?.let { cameraHelper?.removeSurface(it) }
        surface?.release()
        surface = null
        cameraHelper?.release()
        cameraHelper = null
        running = false
    }

    override fun isRunning(): Boolean = running

    override fun getOrientationConfig() =
        OrientationConfig(forced = OrientationForced.LANDSCAPE)

    private val stateCallback = object : ICameraHelper.StateCallback {

        override fun onAttach(device: UsbDevice) {
            cameraHelper?.selectDevice(device)
        }

        override fun onDeviceOpen(device: UsbDevice, isFirstOpen: Boolean) {
            cameraHelper?.openCamera()
        }

        override fun onCameraOpen(device: UsbDevice) {
            val list = cameraHelper?.supportedSizeList ?: return
            list.forEach {
                Log.d("UVC", "size=${it.width}x${it.height}, type=${it.type}")
            }

            val target = list.firstOrNull {
                it.type == UVCCamera.FRAME_FORMAT_YUYV
            } ?: list.first()

            cameraHelper?.previewSize = target

            surface?.let {
                cameraHelper?.addSurface(it, false)
            }

            cameraHelper?.startPreview()
        }

        override fun onCameraClose(device: UsbDevice) {}
        override fun onDeviceClose(device: UsbDevice) {}
        override fun onDetach(device: UsbDevice) {}
        override fun onCancel(device: UsbDevice) {}
    }
}

Below is my current implementation and logs.

Code (StateCallback)

override fun onCameraOpen(device: UsbDevice) {
    surface?.let { cameraHelper?.addSurface(it, false) }

    val allConfigs = cameraHelper?.supportedSizeList ?: emptyList()

    val mjpegConfigs = allConfigs.filter {
        it.type == UVCCamera.UVC_VS_FRAME_MJPEG
    }

    Log.d("UVC", "Supported sizes = $allConfigs")
    Log.d("UVC", "Supported MJPEG sizes = $mjpegConfigs")

    if (mjpegConfigs.isNotEmpty()) {
        // I tried several indices, including low resolutions
        cameraHelper?.previewSize = mjpegConfigs.first()
        Log.d("UVC", "Selected size = ${cameraHelper?.previewSize}")
    }

    cameraHelper?.startPreview()
}

supportedSizeList output

Supported sizes = [
 Size(1920x1080@60,type:7),
 Size(1920x1080@60,type:7),
 Size(1360x768@60,type:7),
 Size(1280x1024@60,type:7),
 Size(1280x960@60,type:7),
 Size(1280x720@60,type:7),
 Size(1024x768@60,type:7),
 Size(800x600@60,type:7),
 Size(720x576@60,type:7),
 Size(720x480@60,type:7),
 Size(640x480@60,type:7)
]

Supported MJPEG sizes = same list above
Selected size = Size(1920x1080@60,type:7)

Failed to set preview

30fps

  • setPreviewSize: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.serenegiant.usb.UVCCamera.setPreviewSize(com.serenegiant.usb.Size)' on a null object reference at com.herohan.uvcapp.CameraInternal.setPreviewSize(CameraInternal.java:127)

60fps

  • setPreviewSize: java.lang.IllegalArgumentException: Failed to set preview size at com.serenegiant.usb.UVCCamera.setPreviewSize(UVCCamera.java:467)

Thanks for your time.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions