Android Camera簡(jiǎn)單整理(三)-Mtk Camera MtkCam3架構(gòu)學(xué)習(xí)

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/TaylorPotter/article/details/105707181


記錄下 Mtk的Hal3架構(gòu)筆記,正在進(jìn)行學(xué)習(xí),后續(xù)仍會(huì)更新

一.MtkCam3的代碼結(jié)構(gòu)及學(xué)習(xí)資料

mtk online里搜Camera 可以搜到很全面的Mtk Hal3的學(xué)習(xí)文檔,Mtk整理的文檔很棒,簡(jiǎn)單到位!

https://online.mediatek.com/QuickStart/2a17666a-9d46-4686-9222-610ec0f087cc

下述的代碼結(jié)構(gòu)只是列出了mtk平臺(tái)的camera路徑,Android Camera相關(guān)路徑并未記錄

APP

MTK Camera

vendor/mediatek/proprietary/packages/apps/

HAL

MTK Camera Hal,目前最新Android Camera Api2下用的都是HAL3的內(nèi)存,HAL3主要代碼在mtkcam3中,有些工具類復(fù)用了mtkcam中

vendor/mediatek/proprietary/hardware/mtkcam/

vendor/mediatek/proprietary/hardware/mtkcam3/

以下是和camera強(qiáng)相關(guān)

vendor/mediatek/proprietary/hardware/jpeg/

vendor/mediatek/proprietary/hardware/bwc/

vendor/mediatek/proprietary/hardware/m4u/

Kernel

kernel-x.xx/drivers/misc/mediatek/imgsensor/

二.MtkCam3設(shè)計(jì)架構(gòu)概覽

MtkCam3實(shí)現(xiàn)了Android定義的幾個(gè)HAL3的接口:ICameraProvider, ICameraDevice, ICameraDeviceSession, ICameraDeviceCallback;ICameraProvider 的實(shí)現(xiàn)類CameraProviderImpl包在 camera device manager 外圍,只是一個(gè) adapter, 適配不同版本的 camera device interface。 Camera Service(指的是camera android層的進(jìn)程: cameraserver ) 可以通過 ICameraProvider 去拿到 ICameraDevice 。ICameraDevice 和 ICameraDeviceSession 的實(shí)現(xiàn)類 CameraDevice3Impl, CameraDevice3SessionImpl 。用于Camera Service 去操作每一個(gè) camera。 比如: open, close, configureStreams, processCaptureRequest 。

AppStreamManager位于framework與pipeline之間,主要職責(zé)有如下三條:

1、 Callback result to Android framework according to the returning rules which are defined in camera3.h

2、Update vendor defined gralloc usage

3、Android/ MTK streamInfo conversion

IPipelineModel的角色

在open/close stage,Power on/off sensor;在config stage,根據(jù)APP的createCaptureSession里面帶下來的surface list,推測(cè)Output以及按照Topological推測(cè)Pipeline各個(gè)Node是否需要?jiǎng)?chuàng)建以及各個(gè)Node的I/O buffer,建立整條PipelineModel;在Request Stage,接到上層queue下來的request,轉(zhuǎn)化為Pipleline統(tǒng)一的IPipelineFrame,決定這個(gè)request的I/O buffer、Topological、sub frame、dummy frame、feature set等信息;

HWNode是大Node,三方算法的掛載在這些node里面,作為小node.

P1Node負(fù)責(zé)輸出raw圖,P2CaptureNode主要負(fù)責(zé)拍照的frame的處理,P2StreamingNode主要負(fù)責(zé)錄像預(yù)覽的數(shù)據(jù)處理,JpegNode的輸入時(shí)main YUV、Thumbnail YUV及metadata,輸出是Jpeg及App metadata。

三. MtkCam3代碼跟讀

3.1 Camera HAL3 init

3.2 OpenCamera

3.3 ConfigureStream

3.4 Request

四. MtkCam3 Debug

1.Mtk日志開關(guān)

設(shè)置log level,cameraHalserver重啟生效

persist.vendor.mtk.camera.log_level

控制代碼如下:

#define CAM_ULOGMD(fmt, arg...)? ? ? ? ALOGD(fmt, ##arg)

mtkcam/include/mtkcam/utils/std/Log.h

#define CAM_LOGD(fmt, arg...)? do{ if(0!=mtkcam_testLog(LOG_TAG, 'D')) ALOGD(fmt, ##arg); } while(0)


mtkcam/utils/std/Misc.cpp

static int32_t determinePersistLogLevel()

{

? ? int32_t level = ::property_get_int32("persist.vendor.mtk.camera.log_level", -1);

? ? CAM_ULOGMD("###### get camera log property =%d", level);

? ? if? (-1 == level) {

? ? ? ? level = MTKCAM_LOG_LEVEL_DEFAULT;

? ? }

? ? return level;

}

__BEGIN_DECLS

static int32_t gLogLevel = determinePersistLogLevel();

int mtkcam_testLog(char const* /*tag*/, int prio)

{

? ? switch (prio)

? ? {

? ? ? ? case 'V':? ? ? return (gLogLevel>=4);

? ? ? ? case 'D':? ? ? return (gLogLevel>=3);

? ? ? ? case 'I':? ? ? return (gLogLevel>=2);

? ? ? ? case 'W':? ? ? return (gLogLevel>=1);

? ? ? ? case 'E':? ? ? return (1);

? ? ? ? default:? ? ? ? break;

? ? }

? ? return 0;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容