camera記憶體優化

2021-10-03 17:19:57 字數 3794 閱讀 3674

[description]

總有些專案的記憶體優化落到camera頭上,從hal1到hal3,永不停歇...以下適用於hal3(android p).

眾所周知,記憶體與performance在某些條件下,是無法調和的矛盾,請大家根據各專案狀態酌情選用.

[solution]

記憶體用量概要:adb shell dumpsys meminfo camerahalserver

記憶體用量大頭(graphics部分)分解:adb shell cat /sys/kernel/debug/ion/ion_mm_heap > ion_1

檢視優化效果,對比優化前後meminfo中的total即可.

那麼會有哪些省記憶體辦法呢?請看下文.

1.拍照後buffer立即釋放

優點:拍照過程中產生的buffer使用完畢後即釋放,不影響拍照後的記憶體用量;

缺點:記憶體存量不高的情況下,拍照速度會受影響;

優化量:與拍照實際feature有關,拍照feature越多占用記憶體越大,優化量越大;

/vendor/mediatek/proprietary/hardware/mtkcam3/feature/core/featurepipe/capture/buffer/capturebufferpool.cpp

mptuningbufferpool->setautofree(0); //拍照後release tuning buffer

pimagepool->setautofree(0);//拍照後release image buffer

【重要提醒】如果使用此優化,務必保證yuvnode.cpp中有如下修改,如無,請申請patch alps04338041.

mtkcam3\feature\core\featurepipe\capture\nodes\yuvnode.cpp

1090:     pplgrequest->mibufferfull  = (ibufferfullhandle == null) ? pluginhelper::createbuffer(pnodereq, tid_man_full_yuv, input) : std::move(ibufferfullhandle);

1091:     pplgrequest->mibufferclean = pluginhelper::createbuffer(pnodereq, tid_man_full_pure_yuv, input);

1092:     pplgrequest->mibufferdepth = pluginhelper::createbuffer(pnodereq, tid_man_depth, input);

1093:     pplgrequest->mobufferfull  = (obufferfullhandle == null) ? pluginhelper::createbuffer(pnodereq, tid_man_full_yuv, output) : std::move(obufferfullhandle);

2.減少zsl buffer number

優點:優化整個camera使用期間的記憶體用量

缺點:如果設定值過小,過載時會影響preview幀率.

優化量:實際減少的buffer資料有關,也與sensor大小有關.

/vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/model/zsl/hbc/historybuffercontainerimp.cpp

3.修改p1node buffer格式(需滿足條件)

使用條件:raw格式在一次configure後不會發生改變. 舉例,4-cell功能以及raw hdr功能均會在使用期間切換raw格式.則不可使用此優化;

優點:p1node輸出buffer格式由blob改為bayer10;

缺點:無法實時做格式轉換;

優化量:與sensor實際大小有關.

/vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/policy/config/p1hwsettingpolicy.cpp

bool islowmem = ::property_get_bool("ro.config.low_ram", false); //強制將islowmem置為true.

如果平台支援ufo,也可使用ufo格式,p1輸出可以有多種格式,格式選擇的邏輯判斷均在p1hwsettingpolicy.cpp中,而各值的對應列表可查閱:

/vendor/mediatek/proprietary/hardware/mtkcam/include/mtkcam/def/imageformat.h

4.提高mfnr的門限,盡量避免使用mfnr,減少mfnr張數

優點:極大的改善記憶體以及cpu 資源的消耗,提公升拍照速度,提公升系統流暢度;

缺點:高光感下的影象噪點略高,影響質量,有些可以通過tuning 其他nr引數彌補回來;

/vendor/mediatek/proprietary/custom/mt***x/hal/inc/camera_custom_nvram.h

muint16 mfll_iso_th // tunning 引數 各家不同 ,預設800;

muint8 capture_frame_number; //mfnr張數,最低3張,預設4張;

對應的引數tunning的同事會較清楚,或者在/vendor/mediatek/proprietary/custom/mt***x/hal/imgsensor/ver1/sensorname 下全搜mfll_iso_th即可.

5.關閉zsl

優點:拍照的buffer不再受preview處理效率的影響,同時節省buffer;

缺點:與hal1上關閉zsd不同的是,關閉zsl僅拍照瞬間畫面略有停頓.而hal1上關閉zsd是整個拍照未完成期間均停頓.

優化量:節省zsl buffer pool的大小,一般會達到100m以上.

control.capture.default.zsl.mode 設為off

control.capture.zsl.mode configure和request時,均需設定為off,否則會出現re-configuresesion的問題,影響啟動時間;

6.拍照相關限制以上是通用法則.還有些可能會用得上的優化點:

8.streaming場景的優化

a)確認p1node輸出的size,等於preview size值. 如若不是,請檢視p1node輸出的size**.邏輯判斷**

/vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/policy/config/p1hwsettingpolicy.cpp

需要注意的是:p1node輸出size大於preview size有助於減輕鋸齒問題,客戶需自行斟酌是否優化此項;

b )確認streaming的三方演算法要求的size<=preview size. 三方演算法所需size可通過下述api設定:

if( musesize ) sel.mibuffermain1.setspecifiedsize(msize)

此修改,除了可優化記憶體外,同樣可提公升三方演算法處理效率,但是需要看三方是否都支援;

總的來說,記憶體相關的優化,與手機狀態強相關,所有的引數均需實驗後方可得出,即使同乙個hw,但不同的os系統,不同的feature,都無法使用同一套優化引數,以上僅僅是提供優化思路與相關引數,具體的數值,請大家多多實驗,在效能與記憶體之前找到專案的平衡點,做到最優.

good luck!

Camera實現差值及cts效能優化

camera如何實現插值 camera cts效能優化 camera是移動裝置非常重要的feature,google對於camera的cts測試中有一些比較嚴格的效能測試,以保證camera程式的使用者使用友好度。camera cts測試中效能相關的有很多很多,基本上所有基本功能都有包含效能超時的驗...

camera驅動電源配置 camera驅動

在手機中,我們常將camera直接稱為sensor。一 sensor的種類 其實這個對於驅動來說基本略知就可以了,處於那種說出來要知道是在說sensor的專業名次這種程度就ok了!一般來說,sensor有兩大類,cmos和ccd。一般來說,ccd的功耗高,拍攝質量高,造價高,他更適合在數位相機或dv...

kvm記憶體優化 記憶體氣球

一 記憶體氣球技術 使用virtio balloon 1 balloon簡介 通常來說,要改變客戶機占用的宿主機記憶體,是要先關閉客戶機,修改啟動時的記憶體配置,然後重啟客戶機才能實現。而記憶體的ballooning 氣球 技術可以在客戶機執行時動態地調整它所占用的宿主機記憶體資源,而不需要關閉客戶...