Clean up build warnings

This commit is contained in:
Martijn Braam 2020-09-05 15:02:12 +02:00
parent 52838d9a82
commit 98be11f6b6
1 changed files with 56 additions and 43 deletions

99
main.c
View File

@ -7,6 +7,8 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <time.h> #include <time.h>
#include <assert.h>
#include <limits.h>
#include <linux/kdev_t.h> #include <linux/kdev_t.h>
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#include <asm/errno.h> #include <asm/errno.h>
@ -30,28 +32,28 @@ static unsigned int n_buffers;
// Rear camera // Rear camera
static char *rear_dev_name; static char *rear_dev_name;
static int *rear_entity_id; static unsigned int rear_entity_id;
static char *rear_dev[20]; static char rear_dev[260];
static int rear_width = -1; static int rear_width = -1;
static int rear_height = -1; static int rear_height = -1;
static int rear_rotate = 0; static int rear_rotate = 0;
static int rear_fmt = V4L2_PIX_FMT_RGB24; static int rear_fmt = V4L2_PIX_FMT_RGB24;
static int rear_mbus = MEDIA_BUS_FMT_RGB888_1X24; static int rear_mbus = MEDIA_BUS_FMT_RGB888_1X24;
// Front camera // Front camera
static char *front_dev_name; static char *front_dev_name;
static int *front_entity_id; static unsigned int front_entity_id;
static char *front_dev[20]; static char front_dev[260];
static int front_width = -1; static int front_width = -1;
static int front_height = -1; static int front_height = -1;
static int front_rotate = 0; static int front_rotate = 0;
static int front_fmt = V4L2_PIX_FMT_RGB24; static int front_fmt = V4L2_PIX_FMT_RGB24;
static int front_mbus = MEDIA_BUS_FMT_RGB888_1X24; static int front_mbus = MEDIA_BUS_FMT_RGB888_1X24;
// Camera interface // Camera interface
static char *media_drv_name; static char *media_drv_name;
static int *interface_entity_id; static unsigned int interface_entity_id;
static char *dev_name[20]; static char dev_name[260];
static int media_fd; static int media_fd;
static int video_fd; static int video_fd;
@ -69,7 +71,7 @@ static int preview_width = -1;
static int preview_height = -1; static int preview_height = -1;
// Widgets // Widgets
GObject *preview; GtkWidget *preview;
static int static int
xioctl(int fd, int request, void *arg) xioctl(int fd, int request, void *arg)
@ -142,7 +144,7 @@ init_mmap(int fd)
if (xioctl(fd, VIDIOC_REQBUFS, &req) == -1) { if (xioctl(fd, VIDIOC_REQBUFS, &req) == -1) {
if (errno == EINVAL) { if (errno == EINVAL) {
fprintf(stderr, "%s does not support memory mapping", fprintf(stderr, "%s does not support memory mapping",
*dev_name); dev_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} else { } else {
errno_exit("VIDIOC_REQBUFS"); errno_exit("VIDIOC_REQBUFS");
@ -151,7 +153,7 @@ init_mmap(int fd)
if (req.count < 2) { if (req.count < 2) {
fprintf(stderr, "Insufficient buffer memory on %s\n", fprintf(stderr, "Insufficient buffer memory on %s\n",
*dev_name); dev_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -237,7 +239,7 @@ init_device(int fd)
if (xioctl(fd, VIDIOC_QUERYCAP, &cap) == -1) { if (xioctl(fd, VIDIOC_QUERYCAP, &cap) == -1) {
if (errno == EINVAL) { if (errno == EINVAL) {
fprintf(stderr, "%s is no V4L2 device\n", fprintf(stderr, "%s is no V4L2 device\n",
*dev_name); dev_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} else { } else {
errno_exit("VIDIOC_QUERYCAP"); errno_exit("VIDIOC_QUERYCAP");
@ -246,13 +248,13 @@ init_device(int fd)
if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
fprintf(stderr, "%s is no video capture device\n", fprintf(stderr, "%s is no video capture device\n",
*dev_name); dev_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (!(cap.capabilities & V4L2_CAP_STREAMING)) { if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
fprintf(stderr, "%s does not support streaming i/o\n", fprintf(stderr, "%s does not support streaming i/o\n",
*dev_name); dev_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -458,8 +460,8 @@ read_frame(int fd)
return 1; return 1;
} }
static gboolean gboolean
get_frame(int fd) get_frame()
{ {
if (ready == 0) if (ready == 0)
return TRUE; return TRUE;
@ -469,13 +471,13 @@ get_frame(int fd)
int r; int r;
FD_ZERO(&fds); FD_ZERO(&fds);
FD_SET(fd, &fds); FD_SET(video_fd, &fds);
/* Timeout. */ /* Timeout. */
tv.tv_sec = 2; tv.tv_sec = 2;
tv.tv_usec = 0; tv.tv_usec = 0;
r = select(fd + 1, &fds, NULL, NULL, &tv); r = select(video_fd + 1, &fds, NULL, NULL, &tv);
if (r == -1) { if (r == -1) {
if (EINTR == errno) { if (EINTR == errno) {
@ -487,7 +489,7 @@ get_frame(int fd)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (read_frame(fd)) { if (read_frame(video_fd)) {
break; break;
} }
/* EAGAIN - continue select loop. */ /* EAGAIN - continue select loop. */
@ -495,6 +497,13 @@ get_frame(int fd)
return TRUE; return TRUE;
} }
int
strtoint(const char *nptr, char **endptr, int base)
{
long x = strtol(nptr, endptr, base);
assert(x <= INT_MAX);
return (int) x;
}
static int static int
config_ini_handler(void *user, const char *section, const char *name, config_ini_handler(void *user, const char *section, const char *name,
@ -502,11 +511,11 @@ config_ini_handler(void *user, const char *section, const char *name,
{ {
if (strcmp(section, "rear") == 0) { if (strcmp(section, "rear") == 0) {
if (strcmp(name, "width") == 0) { if (strcmp(name, "width") == 0) {
rear_width = strtol(value, NULL, 10); rear_width = strtoint(value, NULL, 10);
} else if (strcmp(name, "height") == 0) { } else if (strcmp(name, "height") == 0) {
rear_height = strtol(value, NULL, 10); rear_height = strtoint(value, NULL, 10);
} else if (strcmp(name, "rotate") == 0) { } else if (strcmp(name, "rotate") == 0) {
rear_rotate = strtol(value, NULL, 10); rear_rotate = strtoint(value, NULL, 10);
} else if (strcmp(name, "fmt") == 0) { } else if (strcmp(name, "fmt") == 0) {
if (strcmp(value, "RGB") == 0) { if (strcmp(value, "RGB") == 0) {
rear_fmt = V4L2_PIX_FMT_RGB24; rear_fmt = V4L2_PIX_FMT_RGB24;
@ -546,11 +555,11 @@ config_ini_handler(void *user, const char *section, const char *name,
} }
} else if (strcmp(section, "front") == 0) { } else if (strcmp(section, "front") == 0) {
if (strcmp(name, "width") == 0) { if (strcmp(name, "width") == 0) {
front_width = strtol(value, NULL, 10); front_width = strtoint(value, NULL, 10);
} else if (strcmp(name, "height") == 0) { } else if (strcmp(name, "height") == 0) {
front_height = strtol(value, NULL, 10); front_height = strtoint(value, NULL, 10);
} else if (strcmp(name, "rotate") == 0) { } else if (strcmp(name, "rotate") == 0) {
front_rotate = strtol(value, NULL, 10); front_rotate = strtoint(value, NULL, 10);
} else if (strcmp(name, "fmt") == 0) { } else if (strcmp(name, "fmt") == 0) {
if (strcmp(value, "RGB") == 0) { if (strcmp(value, "RGB") == 0) {
front_fmt = V4L2_PIX_FMT_RGB24; front_fmt = V4L2_PIX_FMT_RGB24;
@ -608,10 +617,11 @@ find_dev_node(int maj, int min, char *fnbuf)
DIR *d; DIR *d;
struct dirent *dir; struct dirent *dir;
struct stat info; struct stat info;
printf("find_dev_node\n");
d = opendir("/dev"); d = opendir("/dev");
while ((dir = readdir(d)) != NULL) { while ((dir = readdir(d)) != NULL) {
sprintf(fnbuf, "/dev/%s", dir->d_name); sprintf(fnbuf, "/dev/%s", dir->d_name);
printf("whee\n");
stat(fnbuf, &info); stat(fnbuf, &info);
if (!S_ISCHR(info.st_mode)) { if (!S_ISCHR(info.st_mode)) {
continue; continue;
@ -715,18 +725,21 @@ find_cameras()
if (strncmp(entity.name, front_dev_name, strlen(front_dev_name)) == 0) { if (strncmp(entity.name, front_dev_name, strlen(front_dev_name)) == 0) {
front_entity_id = entity.id; front_entity_id = entity.id;
find_dev_node(entity.dev.major, entity.dev.minor, front_dev); find_dev_node(entity.dev.major, entity.dev.minor, front_dev);
printf("survived1\n");
printf("Found front cam, is %s at %s\n", entity.name, front_dev); printf("Found front cam, is %s at %s\n", entity.name, front_dev);
found++; found++;
} }
if (strncmp(entity.name, rear_dev_name, strlen(rear_dev_name)) == 0) { if (strncmp(entity.name, rear_dev_name, strlen(rear_dev_name)) == 0) {
rear_entity_id = entity.id; rear_entity_id = entity.id;
find_dev_node(entity.dev.major, entity.dev.minor, rear_dev); find_dev_node(entity.dev.major, entity.dev.minor, rear_dev);
printf("survived2\n");
printf("Found rear cam, is %s at %s\n", entity.name, rear_dev); printf("Found rear cam, is %s at %s\n", entity.name, rear_dev);
found++; found++;
} }
if (entity.type == MEDIA_ENT_F_IO_V4L) { if (entity.type == MEDIA_ENT_F_IO_V4L) {
interface_entity_id = entity.id; interface_entity_id = entity.id;
find_dev_node(entity.dev.major, entity.dev.minor, dev_name); find_dev_node(entity.dev.major, entity.dev.minor, dev_name);
printf("survived3\n");
printf("Found v4l2 interface node at %s\n", dev_name); printf("Found v4l2 interface node at %s\n", dev_name);
} }
} }
@ -743,7 +756,7 @@ find_media_fd()
DIR *d; DIR *d;
struct dirent *dir; struct dirent *dir;
int fd; int fd;
char fnbuf[20]; char fnbuf[261];
struct media_device_info mdi = {0}; struct media_device_info mdi = {0};
d = opendir("/dev"); d = opendir("/dev");
while ((dir = readdir(d)) != NULL) { while ((dir = readdir(d)) != NULL) {
@ -786,7 +799,7 @@ on_camera_switch_clicked(GtkWidget *widget, gpointer user_data)
video_fd = open(dev_name, O_RDWR); video_fd = open(dev_name, O_RDWR);
if (video_fd == -1) { if (video_fd == -1) {
g_printerr("Error opening video device: %s\n", dev_name); g_printerr("Error opening video device: %s\n", dev_name);
return 1; return;
} }
init_device(video_fd); init_device(video_fd);
start_capturing(video_fd); start_capturing(video_fd);
@ -814,12 +827,12 @@ main(int argc, char *argv[])
return 1; return 1;
} }
GObject *window = gtk_builder_get_object(builder, "window"); GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
GObject *preview_box = gtk_builder_get_object(builder, "preview_box"); GtkWidget *preview_box = GTK_WIDGET(gtk_builder_get_object(builder, "preview_box"));
GObject *shutter = gtk_builder_get_object(builder, "shutter"); GtkWidget *shutter = GTK_WIDGET(gtk_builder_get_object(builder, "shutter"));
GObject *switch_btn = gtk_builder_get_object(builder, "switch_camera"); GtkWidget *switch_btn = GTK_WIDGET(gtk_builder_get_object(builder, "switch_camera"));
GObject *settings_btn = gtk_builder_get_object(builder, "settings"); GtkWidget *settings_btn = GTK_WIDGET(gtk_builder_get_object(builder, "settings"));
preview = gtk_builder_get_object(builder, "preview"); preview = GTK_WIDGET(gtk_builder_get_object(builder, "preview"));
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(shutter, "clicked", G_CALLBACK(on_shutter_clicked), NULL); g_signal_connect(shutter, "clicked", G_CALLBACK(on_shutter_clicked), NULL);
g_signal_connect(switch_btn, "clicked", G_CALLBACK(on_camera_switch_clicked), NULL); g_signal_connect(switch_btn, "clicked", G_CALLBACK(on_camera_switch_clicked), NULL);
@ -873,7 +886,7 @@ main(int argc, char *argv[])
// Get a new frame every 34ms ~30fps // Get a new frame every 34ms ~30fps
printf("window show\n"); printf("window show\n");
gtk_widget_show(window); gtk_widget_show(window);
g_idle_add(get_frame, fd); g_idle_add((GSourceFunc)get_frame, NULL);
gtk_main(); gtk_main();
return 0; return 0;
} }