【MTK】Android Camera HAL 层浅析

时间:2024-03-17 07:27:20

一、Android Camera HAL层架构

       Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。

  二、Android Camera HAL软件实现

【MTK】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())