Toybrick

标题: 使用RGA硬件处理图像后导致v4l2缓冲区内的buf数据被改变 [打印本页]

作者: 89399074    时间: 2024-11-1 15:45
标题: 使用RGA硬件处理图像后导致v4l2缓冲区内的buf数据被改变
使用RGA硬件处理图像后导致v4l2缓冲区内的buf数据被改变

程序流程:
首先使用V4l2获取USB摄像头的MJPEG数据流,然后把获取到的数据Buf传入到RKMPP进行硬件解码,输出格式为YUV格式,最后通过RGA进行一个颜色转换,输出格式为RGB888的格式,最后通过Qt框架显示到Qt界面中
问题:
我的程序中有个拍照的功能,拍照获取的数据帧是在拿到V4l2获取到的MJPEG数据和RKMPP解码前,然后保存为jpg格式。
在保存为jpg图像后发现一个问题,如果把使用RGA颜色转换这个步骤注释掉不使用这个功能,拍出来的照片大概是1M左右,如果我使用了RGA进行颜色转换,保存的图像大小大概是几百kb,这很明显是图像数据丢失了一部分。我很不理解为什么RGA处理的流程在拍照后面,也会影响前面的数据帧...

使用硬件:TB-RK3588SD
rootfs: buildroot
rkmpp版本:mpp version: 05b80939 author: Yandong Lin   2024-09-11(这个mpp是我直接从rockchip-rkmpp的github上面拉下来的...版本估计就是最新)
rga版本:rga_api version 1.10.1_[0]
kernel:5.10.66
以下是RGA硬件颜色空间转换的代码
  1. if (task)
  2.         {
  3.             mpp_task_meta_get_frame(task, KEY_OUTPUT_FRAME, &frame);
  4.             MppBuffer  buffer   = NULL;
  5.             if (frame)
  6.             {
  7.                 RK_U32 width    = 0;
  8.                 RK_U32 height   = 0;
  9.                 char *base = NULL;
  10.                 width    = mpp_frame_get_width(frame);
  11.                 height   = mpp_frame_get_height(frame);
  12.                 buffer   = mpp_frame_get_buffer(frame);
  13.                 base = (char*)mpp_buffer_get_ptr(buffer);

  14.                 int src_format;
  15.                 int dst_format;
  16.                 char *dst_buf;

  17.                 int src_buf_size, dst_buf_size;
  18.                 rga_buffer_t src_img, dst_img;
  19.                 rga_buffer_handle_t src_handle, dst_handle;

  20.                 memset(&src_img, 0, sizeof(src_img));
  21.                 memset(&dst_img, 0, sizeof(dst_img));

  22.                 int src_width = MPP_ALIGN(width,16);
  23.                 int src_height = MPP_ALIGN(height,16);
  24.                 src_format = RK_FORMAT_YCbCr_420_SP;

  25.                 int dst_width = 640;
  26.                 int dst_height = 480;
  27.                 dst_format = RK_FORMAT_RGB_888;

  28.                 src_buf_size = src_width * src_height * get_bpp_from_format(src_format);
  29.                 dst_buf_size = dst_width * dst_height * get_bpp_from_format(dst_format);

  30.                 dst_buf = (char *)malloc(dst_buf_size);

  31.                 src_handle = importbuffer_virtualaddr(base, src_buf_size);
  32.                 dst_handle = importbuffer_virtualaddr(dst_buf, dst_buf_size);

  33.                 if (src_handle == 0 || dst_handle == 0) {
  34.                     printf("importbuffer failed!\n");
  35.                 }

  36.                 src_img = wrapbuffer_handle(src_handle, src_width, src_height, src_format);
  37.                 dst_img = wrapbuffer_handle(dst_handle, dst_width, dst_height, dst_format);

  38.                 ret = imcheck(src_img, dst_img, {}, {});
  39.                 if (IM_STATUS_NOERROR != ret) {
  40.                     printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)ret));
  41.                     return;
  42.                 }
  43.                 ret = imcvtcolor(src_img, dst_img,RK_FORMAT_YCbCr_420_SP,RK_FORMAT_RGB_888);
复制代码


下面两张图象就是未使用RGA颜色转换和使用了RGA颜色转换后的图像大小区别,一个900多kb,一个只是它的一半


希望能得到官方的回复,谢谢

作者: 89399074    时间: 2024-11-1 15:48
刚刚没有上传到图片,现在补充,不好意思,望回复


作者: 89399074    时间: 2024-11-5 09:53
没有人知道这是什么问题吗




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3