欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 解决rga拷贝数据慢的一个方法

解决rga拷贝数据慢的一个方法

2024/10/24 17:18:43 来源:https://blog.csdn.net/jiexijihe945/article/details/141335135  浏览:    关键词:解决rga拷贝数据慢的一个方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、开始操作
  • 总结


前言

最近接了一个项目,里面要用到解码,然后切割,旋转和转成rgb。我选择使用mpp+rga形式解决,但是有个问题,rga处理的是无缓内存,将转好的rgb复制过来耗时巨大,思来想去还是要借用rga本身的能力将无缓内存自动复制到有缓内存里面,这个功能确实很好。


一、开始操作

前提是你的环境已经装好,入果你的环境没装好,请研究下安装方法。另外,这个方法可能对于很多人不适用,rga的版本也有差异,请确认我的api你也有。思维是一样的,不管是新旧接口都能实现。

比如我需要旋转后的图片进缓存,按照下面的内存管理就行了:

main.cpp

#include <rockchip/mpp_buffer.h>
#include <rockchip/mpp_frame.h>
#include <rockchip/rk_mpi.h>
#include <rga/RockchipRga.h>//rga实例
RockchipRga rkRga;
//切一半的图左半部分
bo_t bo_src_left_cut;
//rga旋转之后的图左半部分
bo_t bo_src_left_rotate;int main(){int ret = rkRga.RkRgaInit();if (ret) {printf("rga initialization failed: %d\n", ret);return ret;}/********** apply for src buffer and dst buffer **********///无缓内存//由于输出格式是RGB,所以只需要24 bpp;如果是ARGB,就需要指定32 bpp,否则可能导致内存错误int ret = rkRga.RkRgaGetAllocBuffer(&bo_src_left_cut, srcWidth, srcHeight, 24);if (ret) {printf("rga left cut buffer allocation failed: %d\n", ret);return ret;}//有缓内存ret = rkRga.RkRgaGetAllocBufferCache(&bo_src_left_rotate, dstWidth, dstHeight, 24);if (ret) {printf("rga left rotate buffer allocation failed: %d\n", ret);return ret;}/********** map buffer_address to userspace **********/ret = rkRga.RkRgaGetMmap(&bo_src_left_cut);if (ret) {printf("rga left cut mmap error: %d\n", ret);return ret;}ret = rkRga.RkRgaGetMmap(&bo_src_left_rotate);if (ret) {printf("rga left rotate mmap error: %d\n", ret);return ret;}/**具体操作将无缓图片转换成有缓图片,这个时候bo_src_left_rotate.ptr就是有缓内存了rgb颜色转换也是一个原理,建议最后一步转,正常情况下以无缓内存为主这个地方由于接口受限,暂时没有办法直接使用malloc的内存*/return 0;
}

总结

1、rk3399整体rga性能偏弱,绞尽脑汁也提升不了多少,终究是廉颇老矣

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com