From 03a298362f4fd5cd1037d51c4850581592dfb9fa Mon Sep 17 00:00:00 2001 From: Hertz Wang Date: Sat, 13 Oct 2018 20:28:12 +0800 Subject: [PATCH 1/1] copy or translate data by rga Signed-off-by: Hertz Wang --- v4l2grab.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/v4l2grab.c b/v4l2grab.c index 8165c53..1cf6962 100644 --- a/v4l2grab.c +++ b/v4l2grab.c @@ -90,6 +90,9 @@ typedef enum { struct buffer { void * start; size_t length; +#ifdef IO_MMAP + int fd; +#endif }; static io_method io = IO_METHOD_MMAP; @@ -97,6 +100,13 @@ static int fd = -1; struct buffer * buffers = NULL; static unsigned int n_buffers = 0; +#ifdef ENABLE_RGA +#include +// rga buffer +static bo_t bo; +static int rga_buffer_fd = -1; +#endif + // global settings static unsigned int width = 640; static unsigned int height = 480; @@ -246,6 +256,9 @@ static int frameRead(void) #ifdef IO_USERPTR unsigned int i; #endif +#ifdef IO_MMAP + void *buffer_ptr = NULL; +#endif switch (io) { #ifdef IO_READ @@ -297,7 +310,43 @@ static int frameRead(void) assert(buf.index < n_buffers); - imageProcess(buffers[buf.index].start,buf.timestamp); + buffer_ptr = buffers[buf.index].start; +#ifdef ENABLE_RGA + { + // test rga read buffer from v4l2 + rga_info_t src; + rga_info_t dst; + + memset(&src, 0, sizeof(rga_info_t)); + // TOFIX: + // result to wrong image if use the exported fd from usb camera + src.fd = -1; //buffers[buf.index].fd; + src.virAddr = buffers[buf.index].start; + src.mmuFlag = 1; + rga_set_rect(&src.rect, 0, 0, width, height, width, height, + RK_FORMAT_YCbCr_420_P); + + memset(&dst, 0, sizeof(rga_info_t)); + dst.fd = rga_buffer_fd; + dst.mmuFlag = 1; + rga_set_rect(&dst.rect, 0, 0, width, height, width, height, + RK_FORMAT_YCbCr_420_P); + + if (c_RkRgaBlit(&src, &dst, NULL)) + errno_exit("rga copy blit failed"); + buffer_ptr = bo.ptr; + } +#endif + { + // dump yuv data + int fd = open("/tmp/dump.yuv", O_RDWR | O_CREAT); + if (fd < 0) + errno_exit("create /tmp/dump.yuv failed"); + write(fd, buffer_ptr, width * height * 3 / 2); + close(fd); + } + + imageProcess(buffer_ptr, buf.timestamp); if (-1 == xioctl(fd, VIDIOC_QBUF, &buf)) errno_exit("VIDIOC_QBUF"); @@ -505,9 +554,22 @@ static void deviceUninit(void) #ifdef IO_MMAP case IO_METHOD_MMAP: - for (i = 0; i < n_buffers; ++i) + for (i = 0; i < n_buffers; ++i) { if (-1 == v4l2_munmap(buffers[i].start, buffers[i].length)) errno_exit("munmap"); + if (buffers[i].fd >= 0) + close(buffers[i].fd); + } +#ifdef ENABLE_RGA + if (rga_buffer_fd >= 0) { + close(rga_buffer_fd); + rga_buffer_fd = -1; + } + if (c_RkRgaUnmap(&bo)) + printf("c_RkRgaUnmap error : %s\n", strerror(errno)); + if (c_RkRgaFree(&bo)) + printf("c_RkRgaFree error : %s\n", strerror(errno)); +#endif break; #endif @@ -543,6 +605,22 @@ static void readInit(unsigned int buffer_size) #endif #ifdef IO_MMAP +static void buffer_export(int v4lfd, enum v4l2_buf_type bt, int index, int *dmafd) +{ + struct v4l2_exportbuffer expbuf; + + memset(&expbuf, 0, sizeof(expbuf)); + expbuf.type = bt; + expbuf.index = index; + if (ioctl(v4lfd, VIDIOC_EXPBUF, &expbuf) == -1) { + perror("VIDIOC_EXPBUF"); + *dmafd = -1; + return; + } + + *dmafd = expbuf.fd; +} + static void mmapInit(void) { struct v4l2_requestbuffers req; @@ -591,7 +669,23 @@ static void mmapInit(void) if (MAP_FAILED == buffers[n_buffers].start) errno_exit("mmap"); + + buffer_export(fd, buf.type, buf.index, &buffers[n_buffers].fd); } +#ifdef ENABLE_RGA + memset(&bo, 0, sizeof(bo)); + if (1) { + int ret = c_RkRgaGetAllocBuffer(&bo, width, height, 32); + if (ret) + errno_exit("rga alloc buffer failed"); + ret = c_RkRgaGetMmap(&bo); + if (ret) + errno_exit("rga get mmap failed"); + ret = c_RkRgaGetBufferFd(&bo, &rga_buffer_fd); + if (ret) + errno_exit("rga get buffer fd failed"); + } +#endif } #endif -- 2.7.4