X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2Futils.cpp;h=45fd4d77a7b76fea970e6182c098f9e18685d6d6;hb=refs%2Fheads%2Fpike;hp=f1c3eaef6a1ab5524a6f59df7696d5e2eafd3c22;hpb=b89e581a2fab177e79d64b5990a464683eac49fa;p=apps%2Fcamera-gstreamer.git diff --git a/app/utils.cpp b/app/utils.cpp index f1c3eae..45fd4d7 100644 --- a/app/utils.cpp +++ b/app/utils.cpp @@ -1,10 +1,16 @@ #include +#include +#include #include #include +#include #include #include #include #include +#include +#include +#include #include "utils.h" @@ -148,3 +154,46 @@ os_create_anonymous_file(off_t size) 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; +}