int main(int argc, char* argv[]) { bool use_mmap = false; int ch, max = 100000; while ((ch = getopt(argc, argv, "hmn:")) > 0) { switch (ch) { case 'h': usage(argv[0]); return 0; case 'm': use_mmap = true; break; case 'n': max = atoi(optarg); break; default: break; } } if (use_mmap) test_mmap(max); else test_mem(max); return (0); }
static void do_setup_cap_buffers(int fd, buffers &b) { for (unsigned i = 0; i < b.bcount; i++) { struct v4l2_plane planes[VIDEO_MAX_PLANES]; struct v4l2_buffer buf; memset(&buf, 0, sizeof(buf)); memset(planes, 0, sizeof(planes)); buf.type = b.type; buf.memory = b.memory; buf.index = i; if (b.is_mplane) { buf.m.planes = planes; buf.length = VIDEO_MAX_PLANES; } if (doioctl(fd, VIDIOC_QUERYBUF, &buf)) return; if (b.is_mplane) { b.num_planes = buf.length; for (unsigned j = 0; j < b.num_planes; j++) { struct v4l2_plane &p = b.planes[i][j]; p.length = planes[j].length; if (b.memory == V4L2_MEMORY_MMAP) { b.bufs[i][j] = test_mmap(NULL, p.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, planes[j].m.mem_offset); if (b.bufs[i][j] == MAP_FAILED) { fprintf(stderr, "mmap failed\n"); return; } } else { b.bufs[i][j] = calloc(1, p.length); planes[j].m.userptr = (unsigned long)b.bufs[i][j]; } } } else { struct v4l2_plane &p = b.planes[i][0]; b.num_planes = 1; p.length = buf.length; if (b.memory == V4L2_MEMORY_MMAP) { b.bufs[i][0] = test_mmap(NULL, p.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (b.bufs[i][0] == MAP_FAILED) { fprintf(stderr, "mmap failed\n"); return; } } else { b.bufs[i][0] = calloc(1, p.length); buf.m.userptr = (unsigned long)b.bufs[i][0]; } } if (doioctl(fd, VIDIOC_QBUF, &buf)) return; } }