return true;
}
-static void do_setup_cap_buffers(int fd, buffers &b)
+static int do_setup_cap_buffers(int fd, buffers &b)
{
for (unsigned i = 0; i < b.bcount; i++) {
struct v4l2_plane planes[VIDEO_MAX_PLANES];
buf.length = VIDEO_MAX_PLANES;
}
if (doioctl(fd, VIDIOC_QUERYBUF, &buf))
- return;
+ return -1;
if (b.is_mplane) {
b.num_planes = buf.length;
if (b.bufs[i][j] == MAP_FAILED) {
fprintf(stderr, "mmap failed\n");
- return;
+ return -1;
}
}
else {
if (b.bufs[i][0] == MAP_FAILED) {
fprintf(stderr, "mmap failed\n");
- return;
+ return -1;
}
}
else {
}
}
if (doioctl(fd, VIDIOC_QBUF, &buf))
- return;
+ return -1;
}
+ return 0;
}
-static void do_setup_out_buffers(int fd, buffers &b, FILE *fin)
+static int do_setup_out_buffers(int fd, buffers &b, FILE *fin)
{
struct v4l2_format fmt;
memset(&fmt, 0, sizeof(fmt));
if (!precalculate_bars(fmt.fmt.pix.pixelformat, stream_pat)) {
fprintf(stderr, "unsupported pixelformat\n");
- return;
+ return -1;
}
for (unsigned i = 0; i < b.bcount; i++) {
buf.length = VIDEO_MAX_PLANES;
}
if (doioctl(fd, VIDIOC_QUERYBUF, &buf))
- return;
+ return -1;
if (b.is_mplane) {
b.num_planes = buf.length;
if (b.bufs[i][j] == MAP_FAILED) {
fprintf(stderr, "mmap failed\n");
- return;
+ return -1;
}
}
else {
if (b.bufs[i][0] == MAP_FAILED) {
fprintf(stderr, "mmap failed\n");
- return;
+ return -1;
}
}
else {
fill_buffer(b.bufs[i][0], &fmt.fmt.pix);
}
if (doioctl(fd, VIDIOC_QBUF, &buf))
- return;
+ return -1;
}
+ return 0;
}
static void do_release_buffers(buffers &b)
if (b.reqbufs(fd, reqbufs_count_cap))
goto done;
- do_setup_cap_buffers(fd, b);
+ if (do_setup_cap_buffers(fd, b))
+ goto done;
if (doioctl(fd, VIDIOC_STREAMON, &b.type))
goto done;
if (b.reqbufs(fd, reqbufs_count_out))
goto done;
- do_setup_out_buffers(fd, b, fin);
+ if (do_setup_out_buffers(fd, b, fin))
+ goto done;
if (doioctl(fd, VIDIOC_STREAMON, &b.type))
goto done;
out.reqbufs(fd, reqbufs_count_out))
goto done;
- do_setup_cap_buffers(fd, in);
- do_setup_out_buffers(fd, out, file[OUT]);
+ if (do_setup_cap_buffers(fd, in) ||
+ do_setup_out_buffers(fd, out, file[OUT]))
+ goto done;
if (doioctl(fd, VIDIOC_STREAMON, &in.type) ||
doioctl(fd, VIDIOC_STREAMON, &out.type))