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.
Hi,
I'm using
CameraHelperto connect UVC, webcam devices work correctly, but when I connect an HDMI → USB capture card, preview fails with the following error:Below is my current implementation and logs.
Code (StateCallback)
supportedSizeList output
Failed to set preview
30fps
60fps
Thanks for your time.