【MTK】Android Camera HAL 層淺析

一、Android Camera HAL層架構

       Android的硬件抽象層,簡單來說,就是對Linux內核驅動程序的封裝,向上提供接口,屏蔽低層的實現細節。也就是說,把對硬件的支持分成了兩層,一層放在用戶空間(User Space),一層放在內核空間(Kernel Space),其中,硬件抽象層運行在用戶空間,而Linux內核驅動程序運行在內核空間。

  二、Android Camera HAL軟件實現

       如上圖爲MTK平臺上Android Camera的主要框架,其中最上面的Camera.java是應用使用的接口,它處理維護一個在java層的狀態外核心功能都是通過Android_hardware_Camera這個JNI調到C++層實現的。這裏提到得C++層部分就是我們這講裏面提到得HAL的軟件實現。  

 在C++層的Camera類其實是Binder的client端,對應的Service端是CameraService。每次請求Camera服務時會在CameraService端創建一個CameraClient,並保存在mClient數組裏面,同時返回給Client保存在Camera類的mCamera對象裏面。

涉及到HAL層的核心文件主要是下面三個文件: vendor\mediatek\proprietary\hardware\mtkcam\main\hal\module\module\module.h vendor\mediatek\proprietary\hardware\mtkcam\main\hal\module\ devicemgr\CamDeviceManagerBase.cpp vendor\mediatek\proprietary\hardware\mtkcam\main\hal\device1\common\ Cam1DeviceBase.cpp

 

Camera的打開的過程:

Camera.open()---->native_setup()----> android_hardware_Camera_native_setup() ----> Camera::connect()---->CameraBase::connect() ----> CameraService::conect()---->CameraService::connectHelperLocked() ----> new CameraClient()。      

 

Camera設置Preview窗口的過程:    

 Camera.setPreviewDisplay() ----> setPreviewSurface----> android_hardware_Camera_setPreviewSurface() ---->Camera:: setPreviewTarget()----> c->setPreviewTarget() ---->CameraClient ----> CameraClient::setPreviewTarget()----> CameraClient::setPreviewWindow ----> CameraHardwareInterface::setPreviewWindow ----> mDevice->ops->set_preview_window (hw_device_t) ---->Cam1Device:: camera_set_preview_window() ----> Cam1Device:: setPreviewWindow()----> Cam1DeviceBase::setPreviewWindow() ----> Cam1DeviceBase::initDisplayClient() ----> Cam1DeviceBase::initDisplayClient() ----> DisplayClient::setWindow() ---->  DisplayClient:: set_preview_stream_ops() ----> mpStreamOps = window

 

數據被讀取到圖像緩衝區的過程:

Cam1DeviceBase::setPreviewWindow() ----> Cam1DeviceBase::initDisplayClient()---->IDisplayClient::createInstance() ----> DisplayClient::init()----> createDisplayThread()&& createImgBufQueue()---->Cam1DeviceBase::enableDisplayClient()---->DisplayClient::enableDisplay()---->DisplayClient::enableDisplay()----> mpDisplayThread-> postCommand(Command(Command::eID_WAKEUP)) ---->DisplayThread::threadLoop() ----> DisplayClient::onThreadLoop()---->DisplayClient::waitAndHandleReturnBuffers ---->rpBufQueue->dequeProcessor(vQueNode)----> DisplayClient::handleReturnBuffers() ----> enquePrvOps() ----> mpStreamOps->enqueue_buffer(mpStreamOps,rpImgBuf->getBufHndlPtr())

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章