#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
+#include <dirent.h>
#include <assert.h>
#include <cstdlib>
#include <cstring>
#include <cerrno>
+#include <cstdio>
+#include <cctype>
+#include <linux/videodev2.h>
#include "utils.h"
return fd;
}
+
+const char*
+get_first_camera_device(void)
+{
+ DIR *dir = opendir("/dev");
+ if (!dir) {
+ perror("Couldn't open the '/dev' directory");
+ return NULL;
+ }
+
+ static char device[PATH_MAX];
+ struct dirent *dirent;
+ bool found = false;
+ while ((dirent = readdir(dir)) != NULL) {
+ struct v4l2_capability vid_cap;
+ int fd;
+
+ if (strcmp(dirent->d_name, "video"))
+ continue;
+ if (!isdigit(dirent->d_name[5]))
+ continue;
+
+ snprintf(device, sizeof(device), "/dev/%s", dirent->d_name);
+
+ fd = open(device, O_RDWR);
+ if (fd == -1)
+ continue;
+ if (ioctl(fd, VIDIOC_QUERYCAP, &vid_cap) < 0) {
+ close(fd);
+ continue;
+ }
+ close(fd);
+
+ if ((vid_cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) ||
+ (vid_cap.capabilities & V4L2_CAP_VIDEO_CAPTURE_MPLANE)) {
+ found = true;
+ break;
+ }
+ }
+
+ closedir(dir);
+ return found ? device : NULL;
+}