linuxOS_AP05/buildroot/package/v4l2grab/0001-copy-or-translate-data-by-rga.patch
2025-06-02 13:59:07 +08:00

168 lines
4.2 KiB
Diff

From 03a298362f4fd5cd1037d51c4850581592dfb9fa Mon Sep 17 00:00:00 2001
From: Hertz Wang <wangh@rock-chips.com>
Date: Sat, 13 Oct 2018 20:28:12 +0800
Subject: [PATCH 1/1] copy or translate data by rga
Signed-off-by: Hertz Wang <wangh@rock-chips.com>
---
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/RgaApi.h>
+// 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