From 3edd8a674071d40f86ed1539976bde4ee46edf7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 2 Feb 2024 22:14:25 +0800 Subject: [PATCH] Camera (Linux): init support --- CMakeLists.txt | 2 +- src/detection/camera/camera_linux.c | 46 +++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/detection/camera/camera_linux.c diff --git a/CMakeLists.txt b/CMakeLists.txt index d73f19f4e8..f3f15e0b16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -433,7 +433,7 @@ if(LINUX) src/detection/wm/wm_nosupport.c src/detection/de/de_linux.c src/detection/wmtheme/wmtheme_linux.c - src/detection/camera/camera_nosupport.c + src/detection/camera/camera_linux.c src/util/platform/FFPlatform_unix.c ) elseif(ANDROID) diff --git a/src/detection/camera/camera_linux.c b/src/detection/camera/camera_linux.c new file mode 100644 index 0000000000..99a2b85b6a --- /dev/null +++ b/src/detection/camera/camera_linux.c @@ -0,0 +1,46 @@ +#include "camera.h" +#include "common/io/io.h" + +#include +#include +#include + +#if __has_include() + #include +#endif + +const char* ffDetectCamera(FFlist* result) +{ +#if __has_include() + char path[] = "/dev/videoN"; + + for (uint32_t i = 0; i <= 9; ++i) + { + path[sizeof(path) - 2] = (char) (i + '0'); + FF_AUTO_CLOSE_FD int fd = open(path, O_RDONLY); + if (fd < 0) + break; + + struct v4l2_capability cap = {}; + if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0 || !(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) + continue; + + struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE }; + if (ioctl(fd, VIDIOC_G_FMT, &fmt) < 0) + continue; + + FFCameraResult* camera = (FFCameraResult*) ffListAdd(result); + ffStrbufInitS(&camera->name, (const char*) cap.card); + ffStrbufInit(&camera->vendor); + ffStrbufInitS(&camera->id, (const char*) cap.bus_info); + camera->width = camera->height = 0; + + camera->width = fmt.fmt.pix.width; + camera->height = fmt.fmt.pix.height; + } + + return NULL; +#else + return "Fastfetch was compiled without "; +#endif +}