diff --git a/main.c b/main.c index dd1d45d..8e7ba28 100644 --- a/main.c +++ b/main.c @@ -55,14 +55,17 @@ static char *media_drv_name; static int *interface_entity_id; static char *dev_name[20]; static int media_fd; +static int video_fd; // State +static int ready = 0; static int current_width = -1; static int current_height = -1; static int current_fmt = 0; static int current_rotate = 0; static int current_fd; static int capture = 0; +static int current_is_rear = 1; static cairo_surface_t *surface = NULL; static int preview_width = -1; static int preview_height = -1; @@ -91,49 +94,43 @@ static void start_capturing(int fd) { enum v4l2_buf_type type; - switch (io) { - case IO_METHOD_READ: - /* Nothing to do. */ - break; - case IO_METHOD_MMAP: - for (int i = 0; i < n_buffers; ++i) { - struct v4l2_buffer buf = { - .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, - .memory = V4L2_MEMORY_MMAP, - .index = i, - }; - if (xioctl(fd, VIDIOC_QBUF, &buf) == -1) { - errno_exit("VIDIOC_QBUF"); - } - } + for (int i = 0; i < n_buffers; ++i) { + struct v4l2_buffer buf = { + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, + .memory = V4L2_MEMORY_MMAP, + .index = i, + }; - type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if (xioctl(fd, VIDIOC_STREAMON, &type) == -1) { - errno_exit("VIDIOC_STREAMON"); - } - break; - case IO_METHOD_USERPTR: - for (int i = 0; i < n_buffers; ++i) { - struct v4l2_buffer buf = { - .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, - .memory = V4L2_MEMORY_USERPTR, - .index = i, - }; - buf.m.userptr = (unsigned long) buffers[i].start; - buf.length = buffers[i].length; - - if (xioctl(fd, VIDIOC_QBUF, &buf) == -1) { - errno_exit("VIDIOC_QBUF"); - } - } - - type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if (xioctl(fd, VIDIOC_STREAMON, &type) == -1) { - errno_exit("VIDIOC_STREAMON"); - } - break; + if (xioctl(fd, VIDIOC_QBUF, &buf) == -1) { + errno_exit("VIDIOC_QBUF"); + } } + + type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (xioctl(fd, VIDIOC_STREAMON, &type) == -1) { + errno_exit("VIDIOC_STREAMON"); + } + + ready = 1; +} + +static void +stop_capturing(int fd) +{ + int i; + ready = 0; + printf("Stopping capture\n"); + + enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if(xioctl(fd, VIDIOC_STREAMOFF, &type) == -1) { + errno_exit("VIDIOC_STREAMOFF"); + } + + for(i=0;i