diff options
Diffstat (limited to 'v4l2-mfc-example/mfc.c')
-rw-r--r-- | v4l2-mfc-example/mfc.c | 53 |
1 files changed, 39 insertions, 14 deletions
diff --git a/v4l2-mfc-example/mfc.c b/v4l2-mfc-example/mfc.c index 89aa22d..1f279a1 100644 --- a/v4l2-mfc-example/mfc.c +++ b/v4l2-mfc-example/mfc.c @@ -248,6 +248,7 @@ int mfc_dec_setup_capture(struct instance *i, int extra_buf) struct v4l2_plane planes[MFC_CAP_PLANES]; struct v4l2_control ctrl; struct v4l2_crop crop; + struct v4l2_exportbuffer expbuf; int ret; int n; @@ -325,20 +326,44 @@ int mfc_dec_setup_capture(struct instance *i, int extra_buf) return -1; } - i->mfc.cap_buf_off[n][0] = buf.m.planes[0].m.mem_offset; - i->mfc.cap_buf_off[n][1] = buf.m.planes[1].m.mem_offset; - - i->mfc.cap_buf_addr[n][0] = mmap(NULL, buf.m.planes[0].length, - PROT_READ | PROT_WRITE, MAP_SHARED, - i->mfc.fd, buf.m.planes[0].m.mem_offset); - i->mfc.cap_buf_addr[n][1] = mmap(NULL, buf.m.planes[1].length, - PROT_READ | PROT_WRITE, MAP_SHARED, - i->mfc.fd, buf.m.planes[1].m.mem_offset); - - if (i->mfc.cap_buf_addr[n][0] == MAP_FAILED || - i->mfc.cap_buf_addr[n][1] == MAP_FAILED) { - err("Failed to MMAP MFC CAPTURE buffer"); - return -1; + if (i->fimc.dmabuf) { + memset(&expbuf, 0, sizeof(expbuf)); + expbuf.index = n; + expbuf.plane = 0; + expbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + ret = ioctl(i->mfc.fd, VIDIOC_EXPBUF, &expbuf); + if (ret != 0) { + err("Failed to export buffer\n"); + return -1; + } + i->mfc.dbuf[n][0] = expbuf.fd; + + memset(&expbuf, 0, sizeof(expbuf)); + expbuf.index = n; + expbuf.plane = 1; + expbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + ret = ioctl(i->mfc.fd, VIDIOC_EXPBUF, &expbuf); + if (ret != 0) { + err("Failed to export buffer\n"); + return -1; + } + i->mfc.dbuf[n][1] = expbuf.fd; + } else { + i->mfc.cap_buf_off[n][0] = buf.m.planes[0].m.mem_offset; + i->mfc.cap_buf_off[n][1] = buf.m.planes[1].m.mem_offset; + + i->mfc.cap_buf_addr[n][0] = mmap(NULL, buf.m.planes[0].length, + PROT_READ | PROT_WRITE, MAP_SHARED, + i->mfc.fd, buf.m.planes[0].m.mem_offset); + i->mfc.cap_buf_addr[n][1] = mmap(NULL, buf.m.planes[1].length, + PROT_READ | PROT_WRITE, MAP_SHARED, + i->mfc.fd, buf.m.planes[1].m.mem_offset); + + if (i->mfc.cap_buf_addr[n][0] == MAP_FAILED || + i->mfc.cap_buf_addr[n][1] == MAP_FAILED) { + err("Failed to MMAP MFC CAPTURE buffer"); + return -1; + } } } |