日期:2014-05-16 浏览次数:20924 次
//表示了处理图像的代码位置。
static void process_image(const void *p)
{
        FILE* fp;
        fp = fopen("test","w+");
        fputs(p, fp);
        fclose(fp);
      //  fflush(stdout);
}
static void mainloop(void)
{
        unsigned int count;
        count = 100;
        while (count-- > 0) {
                for (;;) {
                        fd_set fds;
                        struct timeval tv;
                        int r;
                        FD_ZERO(&fds);
                        FD_SET(fd, &fds);
                        /* Timeout. */
                        //tv.tv_sec = 2;
                        tv.tv_sec = 60;
                        tv.tv_usec = 0;
                        r = select (fd + 1, &fds, NULL, NULL, &tv);
                        if (-1 == r) {
                                if (EINTR == errno)
                                        continue;
                                errno_exit("select");
                        }
                        if (0 == r) {
                                fprintf(stderr, "select timeout\n");
                                exit(EXIT_FAILURE);
                        }
                        if (read_frame())
                                break;
        
                        /* EAGAIN - continue select loop. */
                }
        }
}
static void start_capturing(void)
{
        unsigned int i;
        enum v4l2_buf_type type;
        switch (io) {
         case IO_METHOD_MMAP:
                for (i = 0; i < n_buffers; ++i) {
                        struct v4l2_buffer buf;
                        CLEAR(buf);
                        buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                        buf.memory      = V4L2_MEMORY_MMAP;
                        buf.index       = i;
                        if (-1 == xioctl(fd, VIDIOC_QBUF, &buf))
                                errno_exit("VIDIOC_QBUF");
                }
                
                type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                if (-1 == xioctl(fd, VIDIOC_STREAMON, &type))
                        errno_exit("VIDIOC_STREAMON");
                break;
        case IO_METHOD_USERPTR:
                for (i = 0; i < n_buffers; ++i) {
                        struct v4l2_buffer buf;
                        CLEAR(buf);
                        buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                        buf.memory      = V4L2_MEMORY_USERPTR;
                        buf.index       = i;
                        buf.m.userptr   = (unsigned long) buffers[i].start;
                        buf.length      = buffers[i].length;
                        if (-1 == xioctl(fd, VIDIOC_QBUF, &buf))
                                errno_exit("VIDIOC_QBUF");
                }
                type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                if (-1 == xioctl(fd, VIDIOC_STREAMON, &type))
                        errno_exit("VIDIOC_STREAMON");
                break;
        }
}
static void init_mmap(void)
{
        struct v4l2_requestbuffers req;
        CLEAR(req);
        req.count               = 4;
        req.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        req.memory              = V4L2_MEMORY_MMAP;
        if (-1 == xioctl(fd, VIDIOC_REQBUFS, &req)) {
                if (EINVAL == errno) {
            printf("EINVAL == errno\n");
                        fprintf(stderr, "%s does not support "
                                 "memory mapping\n", dev_name);
                        exit(EXIT_FAILURE);
                } else {
                        printf("errno_exit(VIDIOC_REQBUFS);\n");
                        errno_exit("VIDIOC_REQBUFS&q