Toybrick

mpp解码后数据拷贝占用CPU,是否有更好方式进行拷贝?

雁南飞

注册会员

积分
88
发表于 2023-9-5 15:24:25    查看: 1372|回复: 5 | [复制链接]    打印 | 显示全部楼层
本帖最后由 雁南飞 于 2023-9-5 15:55 编辑

1.应用场景:rk3568 arm盒子视频硬解,在应用层对解码后的图像数据进行处理
2.程序使用到的SDK为rk mpp的SDK,git:https://github.com/rockchip-linux/mpp
3.程序中使用了h264的硬解,解出YUV后使用RGA转换成RGB图像,最后将图像数据拷贝传出给上层应用
4.目前在对RGB图像数据进行拷贝时(目的内存是应用层new出来的,RGB图像数据的内存由mpp SDK控制,可以获取到首地址),
CPU飙升,使用memcpy函数进行数据拷贝,对YUV的数据进行拷贝也会发生同样现象
5.屏蔽对RGB或YUV的数据拷贝CPU是正常的,对其他大的数据进行memcpy函数进行拷贝也是正常  6.主要的代码在decoder.cpp和rk_decoder.cpp

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

jefferyzhang

版主

积分
12768
发表于 2023-9-5 16:31:06 | 显示全部楼层
但凡看到代码里有对图片每帧做memcpy就是错误的写法。
所有图片的memcpy都可以用RGA或者openGL替代
回复

使用道具 举报

雁南飞

注册会员

积分
88
 楼主| 发表于 2023-9-5 16:40:04 | 显示全部楼层
jefferyzhang 发表于 2023-9-5 16:31
但凡看到代码里有对图片每帧做memcpy就是错误的写法。
所有图片的memcpy都可以用RGA或者openGL替代 ...

您好!用RGA具体怎么处理
回复

使用道具 举报

jefferyzhang

版主

积分
12768
发表于 2023-9-5 17:13:51 | 显示全部楼层
雁南飞 发表于 2023-9-5 16:40
您好!用RGA具体怎么处理

请自行参看 https://github.com/airockchip/librga
rga库的sample
回复

使用道具 举报

雁南飞

注册会员

积分
88
 楼主| 发表于 2023-9-5 17:19:12 | 显示全部楼层
jefferyzhang 发表于 2023-9-5 17:13
请自行参看 https://github.com/airockchip/librga
rga库的sample

好的,谢谢!我先研究看看
回复

使用道具 举报

雁南飞

注册会员

积分
88
 楼主| 发表于 2023-9-6 16:53:35 | 显示全部楼层
本帖最后由 雁南飞 于 2023-9-6 16:57 编辑

大神你好,我把解码后yuv的数据直接写文件是可以用工具播放出来,我把librga的库加了进去,经过rga拷贝后写文件就不行了,大概率流程是有问题的,我参考sample中rag_copy_demo.cpp,实现了以下代码,代码如下:
  1. rga_buffer_t g_src_img;
  2. rga_buffer_t g_dst_img;
  3. rga_buffer_handle_t g_src_handle;
  4. rga_buffer_handle_t g_dst_handle;

  5. g_src_handle = 0;
  6. g_dst_handle = 0;
  7. memset(&g_src_img, 0, sizeof(g_src_img));
  8. memset(&g_dst_img, 0, sizeof(g_dst_img));
  9. memset(g_dst_buf, 0x80, width*height*3);
  10.   
  11. g_src_handle = importbuffer_virtualaddr((char*)mpp_buffer_get_ptr(buffer),  width*height*3);
  12. g_dst_handle = importbuffer_virtualaddr(g_dst_buf,  width*height*3);
  13. if (g_src_handle == 0 || g_dst_handle == 0)
  14. {
  15.       printf("importbuffer failed!\n");
  16.       return ;
  17. }

  18. g_src_img = wrapbuffer_handle(g_src_handle, width, height, RK_FORMAT_RGB_888);
  19. g_dst_img = wrapbuffer_handle(g_dst_handle, width, height, RK_FORMAT_RGB_888);

  20. IM_STATUS checkRet = imcheck(g_src_img, g_dst_img, {}, {});
  21. if (IM_STATUS_NOERROR != checkRet)
  22. {
  23.       printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)checkRet));
  24.       return;
  25. }

  26. printf("dest handle:%d handle:%d fd:%d vir:%x phy:%x\n", g_dst_handle, g_dst_img.handle, g_dst_img.fd, g_dst_img.vir_addr, g_dst_img.phy_addr);
  27. printf("src handle:%d handle:%d fd:%d vir:%x phy:%x\n", g_src_handle, g_src_img.handle, g_src_img.fd, g_src_img.vir_addr, g_src_img.phy_addr);
  28. IM_STATUS retStatus = imcopy(g_src_img, g_dst_img);
  29. if (retStatus == IM_STATUS_SUCCESS)
  30. {
  31.            printf("imcopy running success!\n");
  32. }
  33. else
  34. {
  35.            printf("imcopy running failed, %s\n", imStrError((IM_STATUS)retStatus));
  36. }

  37. //这里对g_dst_buf进行操作,写文件之类
  38. //......

  39. if (g_src_handle)
  40.             releasebuffer_handle(g_src_handle);
  41. if (g_dst_handle)
  42.             releasebuffer_handle(g_dst_handle);
复制代码



其中,printf打印的g_dst_handle、g_src_handle均为-1,fd,vir__addr, phy_addr这些值均为0,看着是不正常的。
回复

使用道具 举报

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

本版积分规则

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


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