当前位置: 首页 > ops >正文

Android Camera Hal中通过Neon指令优化数据拷贝

背景描述:

Camera apk普通相机模式录像操作时,一般是同时请求两个流,即预览流和录像流。对于两个流输出图像格式和分辨率相同的情况下,是不是可以通过一个流拷贝得到另一个流的数据,进而节省掉一个Sensor输出处理两次的的开销?

我们都知道平时使用的memcpy()函数是由cpu来实现处理的,如果图像数据比较大的话是很耗cpu的,那么有没有什么方法能优化下copy操作使cpu占用小些?

这里介绍使用ARM Neon指令集实现输出拷贝的优化。

下面以具体实现,了解如何使用Neon指令实现一帧NV12图像数据的拷贝。

Android源码中有对Neon的支持,只需要在使用的模块引用&调用就可以了,实现如下:

#include <arm_neon.h>   //neon指令相关数据结构和接口定义void NeonMemcpy(void *dest, const void *src, size_t size){uint8_t* dst8 = static_cast<uint8_t*>(dest);const uint8_t* src8 = static_cast<const uint8_t*>(src);//小数据直接拷贝if (size < 64) {for (; size > 0; size--) {*dst8++ = *src8++;}return;}// 64字节对齐预处理const uintptr_t mask = 0x3F;const uintptr_t misalign = reinterpret_cast<uintptr_t>(src8) & mask;if (misalign > 0) {const size_t align_bytes = 64 - misalign;for (size_t i = 0; i < align_bytes; i++) {*dst8++ = *src8++;}size -= align_bytes;}// 主拷贝循环(每次64字节)const size_t chunks = size >> 6; // 64字节块数for (size_t i = 0; i < chunks; i++) {// 使用基本NEON指令替代vld1q_u8_x4uint8x16_t data0 = vld1q_u8(src8);        //从src8加载16个8位数据到data0uint8x16_t data1 = vld1q_u8(src8 + 16);uint8x16_t data2 = vld1q_u8(src8 + 32);uint8x16_t data3 = vld1q_u8(src8 + 48);vst1q_u8(dst8, data0);                   //将data0中的16个8位数据存储到dst8中vst1q_u8(dst8 + 16, data1);vst1q_u8(dst8 + 32, data2);vst1q_u8(dst8 + 48, data3);src8 += 64;dst8 += 64;}// 处理剩余数据(16字节块)size &= 63;const size_t vec16_count = size >> 4;for (size_t i = 0; i < vec16_count; i++) {vst1q_u8(dst8, vld1q_u8(src8));src8 += 16;dst8 += 16;size -= 16;}// 尾部字节处理for (; size > 0; size--) {*dst8++ = *src8++;}
}

http://www.xdnf.cn/news/12408.html

相关文章:

  • 使用扩散模型解决Talking Head生成中的头像抖动问题
  • 数据结构与算法——并查集
  • curl获取ip定位信息 --- libcurl-multi(三)
  • 在线OJ项目测试
  • [蓝桥杯]搭积木
  • OD 算法题 B卷【猴子吃桃】
  • 常用操作符,操作符相关笔试题(谷歌)及算法的优化(上)
  • C++编程——关于比较器的使用
  • 1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
  • 深入解析YUM与DNF:RPM包管理器的架构演进与功能对比
  • 前端flex、grid布局
  • VS如何编译Zlib库
  • curl获取ip定位信息 --- libcurl-easy(二)
  • 理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用
  • Qt生成日志与以及报错文件(mingw64位,winDbg)————附带详细解说
  • Cesium使用glb模型、图片标记来实现实时轨迹
  • 数学:数的概念是如何发展的?
  • 基于IDIG-GAN的小样本电机轴承故障诊断
  • PWN-中级ROP-[HNCTF 2022 WEEK2]ret2csu
  • 紧急调整!亚马逊70%谷歌广告预算转向新渠道
  • 引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办
  • Spring Boot 实现流式响应(兼容 2.7.x)
  • 408第一季 - 数据结构 - 栈与队列
  • 实时数据分析的技术架构:Lambda vs Kappa架构选择
  • 如何在CloudCompare中打开pcd文件
  • 使用 Docker Compose 从零部署 TeamCity + PostgreSQL(详细新手教程)
  • 企业版管理工具无法打开(APP)
  • 如何实现安卓端与苹果端互通的多种方案
  • [BJDCTF2020]Easy MD5 1
  • Python打卡训练营day46——2025.06.06