dmabuftest: Don't call omap_bo_dmabuf multiple times
authorNikhil Devshatwar <nikhil.nd@ti.com>
Thu, 5 Dec 2013 22:15:30 +0000 (03:45 +0530)
committerAmarinder Bindra <a-bindra@ti.com>
Wed, 11 Dec 2013 06:27:05 +0000 (11:57 +0530)
Each call to omap_bo_dmabuf returns a duplicated dmabuf fd
Therefore, fd from reqbuf (exported first time) will not match with
fd of the same buffer while queueing due to dup(fd)
Using buffer->fd array for saving dmabuf fds

Signed-off-by: Nikhil Devshatwar <nikhil.nd@ti.com>
util/v4l2.c

index b161448a35105b0239818f2fb10b023575a58677..1a5c905186a0a8d9e71a76704c3353800d591261 100644 (file)
@@ -232,7 +232,7 @@ v4l2_open(int argc, char **argv, uint32_t *fourcc,
        bool mcf = false;
 
        v4l2 = calloc(1, sizeof(*v4l2));
-       v4l2->fd = open("/dev/video0", O_RDWR);
+       v4l2->fd = open("/dev/video1", O_RDWR);
 
        ret = ioctl(v4l2->fd, VIDIOC_G_FMT, &format);
        if (ret < 0) {
@@ -308,7 +308,7 @@ v4l2_reqbufs(struct v4l2 *v4l2, struct buffer **bufs, uint32_t n)
                        .count = n,
        };
        uint32_t i;
-       int ret;
+       int ret,dmafd;
 
        if (v4l2->v4l2bufs) {
                // maybe eventually need to support this?
@@ -339,14 +339,22 @@ v4l2_reqbufs(struct v4l2 *v4l2, struct buffer **bufs, uint32_t n)
 
        for (i = 0; i < reqbuf.count; i++) {
                assert(bufs[i]->nbo == 1); /* TODO add multi-planar support */
+               /* Call omap_bo_dmabuf only once, to export only once
+                * Otherwise, each call will return duplicated fds
+                * This way, every call to omap_bo_dmabuf will return a new fd
+                * Which won't match with any previously exported fds
+                * Instead, store dma fd in buf->fd[] */
+               dmafd = omap_bo_dmabuf(bufs[i]->bo[0]);
+               bufs[i]->fd[0] = dmafd;
                v4l2->v4l2bufs[i] = (struct v4l2_buffer){
                        .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
                                        .memory = V4L2_MEMORY_DMABUF,
                                        .index = i,
-                                       .m.fd = omap_bo_dmabuf(bufs[i]->bo[0]),
+                                       .m.fd = dmafd,
                };
+               MSG("Exported buffer fd = %d\n", dmafd);
                ret = ioctl(v4l2->fd, VIDIOC_QUERYBUF, &v4l2->v4l2bufs[i]);
-               v4l2->v4l2bufs[i].m.fd = omap_bo_dmabuf(bufs[i]->bo[0]);
+               v4l2->v4l2bufs[i].m.fd = dmafd;
                if (ret) {
                        ERROR("VIDIOC_QUERYBUF failed: %s (%d)", strerror(errno), ret);
                        return ret;
@@ -394,7 +402,7 @@ v4l2_qbuf(struct v4l2 *v4l2, struct buffer *buf)
 
        assert(buf->nbo == 1); /* TODO add multi-planar support */
 
-       fd = omap_bo_dmabuf(buf->bo[0]);
+       fd = buf->fd[0];
 
        for (i = 0; i < v4l2->nbufs; i++) {
                if (v4l2->v4l2bufs[i].m.fd == fd) {
@@ -410,7 +418,7 @@ v4l2_qbuf(struct v4l2 *v4l2, struct buffer *buf)
        MSG("QBUF: idx=%d, fd=%d", v4l2buf->index, v4l2buf->m.fd);
 
        ret = ioctl(v4l2->fd, VIDIOC_QBUF, v4l2buf);
-       v4l2buf->m.fd = omap_bo_dmabuf(buf->bo[0]);
+       v4l2buf->m.fd = buf->fd[0];
        if (ret) {
                ERROR("VIDIOC_QBUF failed: %s (%d)", strerror(errno), ret);
        }
@@ -437,7 +445,7 @@ v4l2_dqbuf(struct v4l2 *v4l2)
 
        assert(buf->nbo == 1); /* TODO add multi-planar support */
 
-       MSG("DQBUF: idx=%d, fd=%d", v4l2buf.index, omap_bo_dmabuf(buf->bo[0]));
+       MSG("DQBUF: idx=%d, fd=%d", v4l2buf.index, buf->fd[0]);
 
        return buf;
 }