Mtk Camera MtkCam3架構學習

和你一塊兒終身學習,這裏是程序員 Android

本篇文章主要介紹 Android 開發中的部分知識點,經過閱讀本篇文章,您將收穫如下內容:node

一. MtkCam3的代碼結構及學習資料
二. MtkCam3設計架構概覽
三. MtkCam3代碼跟讀
四. MtkCam3 Debug

一.MtkCam3的代碼結構及學習資料

mtk online裏搜Camera 能夠搜到很全面的Mtk Hal3的學習文檔,Mtk整理的文檔很棒,簡單到位!
https://online.mediatek.com/Q...android

下述的代碼結構只是列出了mtk平臺的camera路徑,Android Camera相關路徑並未記錄程序員

APP
MTK Camera算法

vendor/mediatek/proprietary/packages/apps/

HAL
MTK Camera Hal,目前最新Android Camera Api2下用的都是HAL3的內存,HAL3主要代碼在mtkcam3中,有些工具類複用了mtkcam中架構

vendor/mediatek/proprietary/hardware/mtkcam/
vendor/mediatek/proprietary/hardware/mtkcam3/

如下是和camera強相關app

vendor/mediatek/proprietary/hardware/jpeg/
vendor/mediatek/proprietary/hardware/bwc/
vendor/mediatek/proprietary/hardware/m4u/

Kernelide

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

二.MtkCam3設計架構概覽

  1. MtkCam3實現了Android定義的幾個HAL3的接口:ICameraProvider, ICameraDevice, ICameraDeviceSession, ICameraDeviceCallback;ICameraProvider 的實現類CameraProviderImpl包在 camera device manager 外圍,只是一個 adapter, 適配不一樣版本的 camera device interface。 Camera Service(指的是camera android層的進程: cameraserver ) 能夠經過 ICameraProvider 去拿到 ICameraDevice 。ICameraDevice 和 ICameraDeviceSession 的實現類 CameraDevice3Impl, CameraDevice3SessionImpl 。用於Camera Service 去操做每個 camera。 好比: open, close, configureStreams, processCaptureRequest 。
  2. AppStreamManager位於framework與pipeline之間,主要職責有以下三條:
  • Callback result to Android framework according to the returning rules which are defined in camera3.h
  • Update vendor defined gralloc usage
  • Android/ MTK streamInfo conversion
  1. IPipelineModel的角色
    在open/close stage,Power on/off sensor;在config stage,根據APP的createCaptureSession裏面帶下來的surface list,推測Output以及按照Topological推測Pipeline各個Node是否須要建立以及各個Node的I/O buffer,創建整條PipelineModel;在Request Stage,接到上層queue下來的request,轉化爲Pipleline統一的IPipelineFrame,決定這個request的I/O buffer、Topological、sub frame、dummy frame、feature set等信息;
  2. HWNode是大Node,三方算法的掛載在這些node裏面,做爲小node.
    P1Node負責輸出raw圖,P2CaptureNode主要負責拍照的frame的處理,P2StreamingNode主要負責錄像預覽的數據處理,JpegNode的輸入時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日誌開關

設置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;
}

原文連接:https://blog.csdn.net/TaylorP...
友情推薦:
Android 乾貨分享 ui

至此,本篇已結束,若有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

相關文章
相關標籤/搜索