http://www.metsky.com/archives/781.html

现代Camera越来越复杂,导致要彻底理解Camera相关的知识确属不易,早期的Camera就是一个摄像头而已,整个系统从上到下调用也基本是一条线,而现在的Camera则要复杂的多,Camera要正常使用,不只有摄像头本身的各种参数需要配置,还包括音频、马达、距离感应器、闪光灯以及一堆跟效果有关的软件库(人脸识别、各种模式、去红眼、微笑捕捉、JPEG编码)等等,当然如果只有这些还不算复杂,最复杂的是理解各厂家不同HAL层实现。

本文主要介绍Android Camera代码结构以及相关的Camera基础知识。由于Camera架构相对比较规范,理解起来也并不难,但是QCOM、MTK对HAL层的实现上的差异却非常大,需要一番心思。【本文整理自早前Android开发笔记,暂时有点乱,以后再完善】

一、执行逻辑与概念

1、启动加载逻辑

Linux内核驱动在启动过程中会自动遍历执行挂载(在init.rc之前)。找到摄像头后会创建对应节点inode。在/sys/class目录下应可看到对应的设备目录,要访问设备,可通过类似/proc/example,/sys/class/example/example/val,/dev/example,/sys/devices/virtual/example/example等节点访问,这决定于驱动约定。

对摄像头而言就是/dev/video0,/dev/video1这样的设备,上层程序只能通过设备名访问该设备(ioctl,write,read,open,release...),示例:http://blog.chinaunix.net/uid-21880738-id-3361037.html

2、ZSL和Chromatix概念

摄像头ZSL,全称Zero Second Later,零延迟拍摄。

Chromatix,用于CAMERA ISP(qualcomm自己称呼为vfe(video front end)),用于raw sensor效果的,也就是手机摄像头效果的。

二、相关Camera目录

1、重要驱动目录

kernel\drivers\media\platform\msm\camera_v2\sensor

效果(chromatix):vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/chromatix/0301/libchromatix/

马达AF(actuators):vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/0301/

库文件(sensor_libs):vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/

2、JAVA(Framework)部分

APK:packages/apps/Camera/ —— 编译结果 Camera.apk 

Framework上层调用接口:base/core/java/Android/hardware/Camera.java —— 编译结果 framework.jar

JNI接口:frameworks/base/core/jni/Android_hardware_Camera.cpp —— 编译结果 libAndroid_runtime.so

UI库部分:frameworks/base/libs/ui/camera —— 编译结果 libcamera_client.so

服务部分 :frameworks/base/camera/libcameraservice/ —— 编译结果 libcameraservice.so。

HAL层:从这里往下基本都是各厂家自己定制部分,比如QCOM,MTK差异非常大。

10-29 15:36