[PATCH] libcamera: device_enumerator: exclude uvcvideo device when enumerate
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Tue Mar 26 10:03:07 CET 2024
Hi Anle
On Tue, Mar 26, 2024 at 05:38:04PM +0900, Anle Pan wrote:
> Camera service startup crash when camera and
> usb camera are connected at the same time,
> service will always reboot due to the null pointer
> in populateEntities.
This is weird, libcamera has been used with uvcvideo devices since the
very beginning. As far as I understand, this is not related to Android
or its CameraService, right ? Just loading the library fails ?
>
> In this case, a UVC device was used to populate the
> related entities, pads and links, which was not reasonable.
Not a UVC expert, but why this is not reasonable ? uvc devices have a
media graph with entities, links and pads like every other device,
don't they ?
>
> To fix the issue, ensure the media node is not
> a "uvcvideo" device when enumerate before createDevice.
So this is disabling uvc support in libcamera completely, preventing
uvcvideo devices from being enumerated ?
What about uvcvideo users ? :)
>
> Change-Id: I656a542e83449df287d34a4e358ae2e26e784f17
> Signed-off-by: Anle Pan <anle.pan at nxp.com>
> ---
> src/libcamera/device_enumerator_sysfs.cpp | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/src/libcamera/device_enumerator_sysfs.cpp b/src/libcamera/device_enumerator_sysfs.cpp
> index 9979d68a..224ec8c8 100644
> --- a/src/libcamera/device_enumerator_sysfs.cpp
> +++ b/src/libcamera/device_enumerator_sysfs.cpp
> @@ -73,6 +73,27 @@ int DeviceEnumeratorSysfs::enumerate()
> continue;
> }
>
> + /* Check that the device node not a uvcvideo. */
> + struct media_device_info devinfo;
> + int fd = open(devnode.c_str(), O_RDWR | O_CLOEXEC);
> + if (fd < 0) {
> + LOG(DeviceEnumerator, Warning)
> + << "Failed to open media device:" + devnode
> + << " (" << strerror(errno) << "), skipping";
> + continue;
> + }
> + int retval = ioctl(fd, MEDIA_IOC_DEVICE_INFO, &devinfo);
> + close(fd);
> + if (retval != 0) {
> + LOG(DeviceEnumerator, Warning)
> + << "Failed to get info from device:" + devnode
> + << " (" << strerror(errno) << "), skipping";
> + continue;
> + }
> + if (strstr("uvcvideo", devinfo.driver)) {
> + continue;
> + }
> +
> std::unique_ptr<MediaDevice> media = createDevice(devnode);
> if (!media)
> continue;
> --
> 2.34.1
>
More information about the libcamera-devel
mailing list