BSP / OS:
root@phyboard-mira-imx6-3:~# lsb_release -a
Distributor ID: Yogurt
Description: Yogurt GNU/Linux i.MX6-PD15.3.0 (fido)
root@phyboard-mira-imx6-3:~# uname -a
Linux phyboard-mira-imx6-3 4.1.18-i.MX6-PD15.3.0 #1 SMP Thu Mar 31 19:45:37 CEST 2016 armv7l GNU/Linux
I'm using the external Trigger input on the Sensor (snapshot mode), so it is not continuously capturing frames but only when requested to do. I'm using V4L2 to retrieve the frames (this is part of the code that is executed in a loop):
ret = select(video_fd + 1, &fds, NULL, NULL, &tv);
ret = xioctl(video_fd, VIDIOC_DQBUF, &v4l2buf);
img->imageData = buffers[v4l2buf.index].start;
cvSaveImage(filename, img, 0);
ret = xioctl(video_fd, VIDIOC_QBUF, &v4l2buf);
I'm retrieving the frames with one frame delay. So triggering the camera at some point A, DQBUF gives me the buffer from the previous capture. But I would like to get it "instant", i.e. select() blocks until the camera is triggered and right then I receive the image data associated with that capture (not the previous one).
What I tried:
- I'm allocating 2 buffers during setup, because I cannot allocates less buffers (only more).
- Using buffers[(v4l2buf.index + 1) % 2].start instead of buffers[v4l2buf.index].start works but it does not look like a reliable solution.
- I found another question about the same topic, but the suggested method does not work for me. Everytime select() returns, I can only DQBUF a single buffer. Trying to DQ a second buffer results in an error.