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.pswp.cn/news/908600.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908600.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908600.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WPS word 已有多級列表序號

wps的word中&#xff0c;原來已生成的文檔里&#xff0c;已存在序號。比如&#xff0c;存在2、2.1、2.1.1、2.1.1.1、2.1.1.1.1 5層序號&#xff0c;而且已分為5級。但增加內容的時候&#xff0c;并不會自動增加序號&#xff0c;應該如何解決&#xff1f; 原來長這樣&#xff…

從零開始制作小程序簡單概述

以下是結合案例的“從零制作小紅書風格小程序”的全流程指南&#xff0c;采用小紅書爆款筆記的結構呈現&#xff0c;并附CSDN參考資源&#x1f447;&#xff1a; 一、核心開發步驟&#xff08;附工具推薦&#xff09; 賬號與定位 ? 注冊類型選擇&#xff1a;個人店&#xff08…

【Go語言基礎【13】】函數、閉包、方法

文章目錄 零、概述一、函數基礎1、函數基礎概念2、參數傳遞機制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 錯誤處理 二、函數類型與高階函數1. 函數類型定義2. 高階函數&#xff08;函數作為參數、返回值&#xff09; 三、匿名函數與閉包1. 匿名函數&#xff08;Lambda函…

網絡編程之服務器模型與UDP編程

一、服務器模型 在網絡通信中&#xff0c;通常要求一個服務器連接多個客戶端 為了處理多個客戶端的請求&#xff0c;通常有多種表現形式 1、循環服務器模型 一個服務器可以連接多個客戶端&#xff0c;但同一時間只能連接并處理一個客戶的請求 socket() 結構體 bind() listen() …

open3D:三維點云處理

open3d 點云數據處理 爆肝5萬字??Open3D 點云數據處理基礎&#xff08;Python版&#xff09;_python 點云 焊縫-CSDN博客 如何用NumPy讀取和保存點云數據 - 知乎 讀取并可視化點云 np.loadtxt 從txt中讀取點集&#xff0c;并open3d顯示單個點云 txt內容&#xff1a;每行皆…

使用聯邦多軌跡圖神經網絡(GNNs)結合稀缺數據預測嬰兒腦連接|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Predicting infant brain connectivity with federated multi-trajectory GNNs using scarce data 使用聯邦多軌跡圖神經網絡&#xff08;GNNs&#xff09;結合稀缺數據預測嬰兒腦連接 01 文獻速遞介紹 多模態影像下的嬰兒腦連接演化預測&#xff1a;聯邦學習與…

[特殊字符] 深入理解 Linux 內核進程管理:架構、核心函數與調度機制

Linux 內核作為一個多任務操作系統&#xff0c;其進程管理子系統是核心組成部分之一。無論是用戶應用的運行、驅動行為的觸發&#xff0c;還是系統調度決策&#xff0c;幾乎所有操作都離不開進程的創建、調度與銷毀。本文將從進程的概念出發&#xff0c;深入探討 Linux 內核中進…

第16節 Node.js 文件系統

Node.js 提供一組類似 UNIX&#xff08;POSIX&#xff09;標準的文件操作API。 Node 導入文件系統模塊(fs)語法如下所示&#xff1a; var fs require("fs") 異步和同步 Node.js 文件系統&#xff08;fs 模塊&#xff09;模塊中的方法均有異步和同步版本&#xff…

《探秘局域網廣播:網絡世界的 “大喇叭”》

揭開局域網廣播的神秘面紗 在當今數字化時代,網絡已成為人們生活和工作中不可或缺的一部分。從日常的網頁瀏覽、社交媒體互動,到企業級的數據傳輸、云計算應用,網絡通信無處不在。在這個龐大而復雜的網絡世界里,數據如同信息流在各個節點之間穿梭,而局域網廣播則是其中一種…

基于Ubuntu22.04安裝SVN服務器之倉庫遷移

基于Ubuntu22.04安裝SVN服務器之倉庫遷移 第一步: 停止svn服務器 第一步: 停止svn服務器 1&#xff09;建議遷移的時候先把SN服務器停掉&#xff0c;以免操作失敗。 svnserve -d -r /usr/svn第二步&#xff1a;dump出svn代碼庫 1&#xff09;通過dump出舊的svn服務器上的代碼…

Unity UI 性能優化終極指南 — Image篇

&#x1f3af; Unity UI 性能優化終極指南 — Image篇 &#x1f9e9; Image 是什么&#xff1f; Image 是UGUI中最常用的基本繪制組件支持顯示 Sprite&#xff0c;可以用于背景、按鈕圖標、裝飾等是UI性能瓶頸的頭號來源之一&#xff0c;直接影響Draw Call和Overdraw &#x1…

「Java基本語法」代碼格式與注釋規范

Java代碼的基本格式 Java代碼的規范格式是編寫和維護Java程序的基礎&#xff0c;其中包括類定義、方法定義、代碼縮進、大括號位置等。 1&#xff0e;核心規則 每個Java文件必須包含一個公共類&#xff08;public class&#xff09;&#xff0c;且Java源文件的文件名必須和這…

2025年AI編程工具推薦

目錄 &#x1f451; **一、全能型AI開發環境&#xff08;IDE&#xff09;**&#x1f6e0;? **二、AI代碼助手與插件**&#x1f3af; **三、垂直領域工具**&#x1f1e8;&#x1f1f3; **四、國產工具精選**&#x1f52e; **五、創新前沿工具**?? **選型建議** 2025年&#x…

【工具使用】STM32CubeMX-FreeRTOS操作系統-信號標志、互斥鎖、信號量篇

一、概述 無論是新手還是大佬&#xff0c;基于STM32單片機的開發&#xff0c;使用STM32CubeMX都是可以極大提升開發效率的&#xff0c;并且其界面化的開發&#xff0c;也大大降低了新手對STM32單片機的開發門檻。 ????本文主要講述STM32芯片FreeRTOS信號標志、互斥鎖和信號…

ArrayList和LinkedList(深入源碼加擴展)

ArrayList 和 LinkedList 是 Java 集合框架中兩種常用的列表實現,它們在底層數據結構、性能特點和適用場景上有顯著的區別。以下是它們的詳細對比以及 ArrayList 的擴容機制。 1. ArrayList 和 LinkedList 的底層區別 (1) 底層數據結構 ArrayList: 基于動態數組(Dynamic Ar…

淺談 React Suspense

React Suspense 是 React 中用于處理異步操作的功能。它可以讓你"等待"某些操作&#xff0c;如數據獲取或組件加載完成&#xff0c;然后再渲染組件。Suspense 的核心理念是讓組件在準備好之前顯示一個備用的 UI&#xff0c;例如加載指示器&#xff0c;從而提高用戶體…

機器學習的數學基礎:線性模型

線性模型 線性模型的基本形式為&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回歸問題 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的參數估計$ \boldsymbol{\hat{\omega}}…

Linux【4】------RK3568啟動和引導順序

引導順序 RK3568 的啟動流程如下&#xff1a; 加電后&#xff0c;芯片首先執行 BootROM 中的代碼&#xff1b; BootROM 會嘗試從配置好的外部設備&#xff08;如 NOR/NAND/eMMC/SD 卡&#xff09;加載啟動程序&#xff1b; 如果這些設備都沒有有效的啟動代碼&#xff0c;Bo…

Deepseek/cherry studio中的Latex公式復制到word中

需要將Deepseek/cherry studio中公式復制到word中&#xff0c;但是deepseek輸出Latex公式&#xff0c;比如以下Latex代碼段&#xff0c;需要通過Mathtype翻譯才能在word中編輯。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…

關于iview組件中使用 table , 綁定序號分頁后序號從1開始的解決方案

問題描述&#xff1a;iview使用table 中type: "index",分頁之后 &#xff0c;索引還是從1開始&#xff0c;試過綁定后臺返回數據的id, 這種方法可行&#xff0c;就是后臺返回數據的每個頁面id都不完全是按照從1開始的升序&#xff0c;因此百度了下&#xff0c;找到了…