Android Camera HAL浅析

Android Camera框架

Android的Camera子系统提供一个拍照和录制视频的框架。

它将Camera的上层应用与Application Framework、用户库串接起来,而正是这个用户库来与Camera的硬件层通信,从而实现操作camera硬件。

Android Camera HAL浅析

Android Camera HAL浅析

 

Android Camera HAL浅析

Camera HAL层部分 

源码平台:rk3288
代码存放目录:hardware/rockchip/camera/CameraHal:

命令行ls看下源代码的结构

Android Camera HAL浅析

lib目录

Android Camera HAL浅析

源代码的文件看起来有点多,我们看看Android.mk文件

Android Camera HAL浅析

Android Camera HAL浅析

这些文件最终编译成camera.rk30board.so库文件,这些文件中主要是CameraHal_Module.cpp和CameraHal.cpp这两个文件组织起整个hal层其他文件。

CameraSocAdapter.cpp\CameraUSBAdapter.cpp\CameraIspAdapter.cpp\CameraIspSOCAdapter.cpp\FakeCameraAdapter.cpp这5个adapter都是继承自CameraAdapter.cpp,主要实现针对具体的camera的操作,比如开始预览,停止预览,闪光控制,设置参数等等,实现的这些操作都会在CameraHal.cpp中调用。

CameraHalUtil.cpp是个工具类,里面有一些比如YUV420 旋转的函数,作为一个工具。

为了实现一个具体功能的Camera,在HAL层需要一个硬件相关的Camera库(例如通过调用video for linux驱动程序和Jpeg编码程序实现或者直接用各个chip厂商实现的私有库来实现,比如Qualcomm实现的libcamera.so和libqcamera.so),此处为camera.rk30board.so实现CameraHardwareInterface规定的接口,来调用相关的库,驱动相关的driver,实现对camera硬件的操作。这个库将被Camera的服务库libcameraservice.so调用。

全部文件的大概调用框架:

Android Camera HAL浅析

从上图的框架看,canera server通过与CameraHal_Module建立和Hal层的连接后,CmaeraHal会通过SensorListener返回消息给上层。

如果上层要预览或者拍照,要通过binder机制向Hal层发送命令,Hal层MessageQueue.cpp的消息队列获取到上层的命令后,会通过消息通知器通知CameraHal,CameraHal有一个CommandThread接收命令,收到命令后,最终会下达命令给对应的Adapter去执行对于的动作。
 

CameraHal_Module.cpp主要是Camera HAL对上层提供的接口,和实际设备无关,上层的本地库都直接调用这个文件里面提供的接口。而对于为上层提供的HAL层接口函数,并不直接操作节点,而是间接的去调用CameraHal.cpp去操作节点。

CameraHal.cpp去操作节点来进行实际的操作。如:初始化时参数的配置,默认参数图片大小,分辨率,帧等。然后剩下的大部分都是针对这个线程的运行实现以及对于CameraHal_Module.cpp中实现的为上层提供的接口的具体实现。