Toybrick

librga使用问题

雁南飞

注册会员

积分
88
发表于 2023-9-11 19:51:45    查看: 1534|回复: 4 | [复制链接]    打印 | 显示全部楼层
在rk3588正常启用librga库,感觉CPU还是蛮高(18%左右),请问流程哪里不对吗?代码如下:
  1. //初始化
  2. char *outBuff = new char[1024*1024*12];
  3. char *g_dst_buf = new char[1024*1024*12];
  4. rga_buffer_t g_src_img;
  5. rga_buffer_t g_dst_img;
  6. rga_buffer_handle_t g_src_handle;
  7. rga_buffer_handle_t g_dst_handle;

  8. //每一帧的处理
  9. g_src_handle = 0;
  10. g_dst_handle = 0;
  11. memset(&g_src_img, 0, sizeof(g_src_img));
  12. memset(&g_dst_img, 0, sizeof(g_dst_img));

  13. memset(g_dst_buf, 0x80, 1024*1024*12);

  14. //frame为解码后的yuv 帧数据  MppFrame frame
  15. RK_U32 width    = mpp_frame_get_width(frame);
  16. RK_U32 height   = mpp_frame_get_height(frame);
  17. RK_U32 h_stride = mpp_frame_get_hor_stride(frame);
  18. RK_U32 v_stride = mpp_frame_get_ver_stride(frame);
  19. MppBuffer buffer    = mpp_frame_get_buffer(frame);
  20. int size = mpp_frame_get_buf_size(frame);
  21. RK_U8 *base = NULL;

  22. //handle值正常
  23. g_src_handle = importbuffer_virtualaddr((char*)mpp_buffer_get_ptr(buffer), size);
  24. g_dst_handle = importbuffer_virtualaddr(g_dst_buf, 1024*1024*12);
  25. if (g_src_handle == 0 || g_dst_handle == 0)
  26. {
  27.         printf("importbuffer failed!\n");
  28.         return ;
  29. }

  30. g_src_img = wrapbuffer_handle(g_src_handle, width, height, RK_FORMAT_YCbCr_420_SP);
  31. g_dst_img = wrapbuffer_handle(g_dst_handle, width, height, RK_FORMAT_YCbCr_420_SP);

  32. printf("dest handle:%d handle:%d fd:%d vir:%p phy:%p\n", g_dst_handle, g_dst_img.handle, g_dst_img.fd, g_dst_img.vir_addr, g_dst_img.phy_addr);
  33. printf("src handle:%d handle:%d fd:%d vir:%p phy:%p\n", g_src_handle, g_src_img.handle, g_src_img.fd, g_src_img.vir_addr, g_src_img.phy_addr);
  34.        

  35. IM_STATUS checkRet = imcheck(g_src_img, g_dst_img, {}, {});
  36. if (IM_STATUS_NOERROR != checkRet)
  37. {
  38.         printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)checkRet));
  39.         return;
  40. }

  41. //执行成功
  42. IM_STATUS retStatus = imcopy(g_src_img, g_dst_img);
  43. if (retStatus == IM_STATUS_SUCCESS) {
  44.         printf("imcopy running success!\n");
  45. } else {
  46.         printf("imcopy running failed, %s\n", imStrError((IM_STATUS)retStatus));
  47. }

  48. //将yuv数据拷贝到目的地址
  49. memcpy(outBuff, g_dst_buf, size);

  50. if (g_src_handle)
  51.         releasebuffer_handle(g_src_handle);
  52. if (g_dst_handle)
  53.         releasebuffer_handle(g_dst_handle);
  54. //结束一帧YUV的数据处理
复制代码
板子的CPU信息如下:
  1. Architecture:                    aarch64
  2. CPU op-mode(s):                  32-bit, 64-bit
  3. Byte Order:                      Little Endian
  4. CPU(s):                          8
  5. On-line CPU(s) list:             0-7
  6. Thread(s) per core:              1
  7. Core(s) per socket:              2
  8. Socket(s):                       3
  9. Vendor ID:                       ARM
  10. Model:                           0
  11. Model name:                      Cortex-A55
  12. Stepping:                        r2p0
  13. CPU max MHz:                     2304.0000
  14. CPU min MHz:                     408.0000
复制代码

回复

使用道具 举报

jefferyzhang

版主

积分
12768
发表于 2023-9-12 08:53:38 | 显示全部楼层
memcpy(outBuff, g_dst_buf, size);

memcpy都来了,你用rga干嘛
回复

使用道具 举报

雁南飞

注册会员

积分
88
 楼主| 发表于 2023-9-12 09:04:24 | 显示全部楼层
jefferyzhang 发表于 2023-9-12 08:53
memcpy(outBuff, g_dst_buf, size);

memcpy都来了,你用rga干嘛

那我应该如何优化?
回复

使用道具 举报

雁南飞

注册会员

积分
88
 楼主| 发表于 2023-9-12 09:11:14 | 显示全部楼层
jefferyzhang 发表于 2023-9-12 08:53
memcpy(outBuff, g_dst_buf, size);

memcpy都来了,你用rga干嘛

RGA这块的处理是单独封装在库里,采用回调的方式将g_dst_buf指针传给调用者,调用者
再使用memcpy(outBuff, g_dst_buf, size),把数据拷贝到调用者的内存空间outBuff。如果
你使用memcpy,那该如何去优化呢?
回复

使用道具 举报

leafsun

新手上路

积分
31
发表于 2023-11-10 11:37:48 | 显示全部楼层
雁南飞 发表于 2023-9-12 09:11
RGA这块的处理是单独封装在库里,采用回调的方式将g_dst_buf指针传给调用者,调用者
再使用memcpy(outBuf ...

后面有解决的思路吗?也遇到类似的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表