camera pipeline
Android Camera System
Android Camera硬件抽象层(HAL,Hardware Abstraction Layer)主要用于把底层camera drive与硬件和位于android.hardware中的framework APIs连接起来。Camera子系统主要包含了camera pipeline components 的各种实现,而camera HAL提供了这些组件的使用接口。
注:camera HAL起着承上启下的作用。在camera HAL层实现中,芯片厂商一般将camera HAL层的实现分为两层:interface层和OEM层。OEM层为下层,它用于屏蔽不同的camera硬件。不同的camera硬件必须支持OEM层提供的对外接口。Interface层为上层,它调用OEM层的对外接口来实现camera HAL所定义的接口。对于Interface层,它并不知道底层camera硬件到底是哪一个版本。同时,interface层完成了屏蔽camera HAL版本的作用。对于OEM层,它也不知道上层是哪一个camera HAL版本,及android版本。两层分离架构,可以很容易地实现不同芯片支持同一个android版本和同一款芯片支持不同android版本(前提条件是该款芯片能够支持这些android版本的各个需求)。
Camera System Architecture
下图所示为Android官方给出的Camera System架构。
技术分享图片图 1 Android Camera System Architecture
从图 1中可以看出,Camera System主要包含如下几个重要组成部分:
Application Framework
Application framework层主要是应用代码(app‘s code),这个代码主要利用android.hardware.Camera API与Camera硬件进行交互。这些代码调用相关的JNI类来访问与Camera进行交互的原生代码(native code)。
JNI
与android.hardware.Camera有关的JNI代码主要frameworks/base/core/jni/ android_hardware_Camera.cpp。这些代码调用下一层的原生代码以获得物理camera的访问权,然后返回用于在framework层创建android.hardware.Camera对象的数据。
Native framework
Native framework的定义位于 frameworks/av/camera/Camera.cpp中,它提供了android.hardware.Camera类在本地的实现。这些类调用IPC binder来获得camera service。
Binder IPC proxies
IPC binder代理可以现实进程间通信。在frameworks/av/camera目录下有三个camera binder类的定义。ICameraService是cameraservice的接口,ICamera是被打开的camera设备的接口,ICameraClient是camera设备返回给application framework层的接口。
Camera Service
Camera service位于frameworks/av/services/camera/libcameraservice/CameraService.cpp,它是与HAL直接进行交互的真正代码。
HAL
硬件抽象层定义了一套标准接口,你必须实现这些接口,以保证你的APP能够与你的Camera硬件正确的协调工作,从而使保证你的Camera的所有功能能够正常进行工作。以下是google原文:
The hardware abstraction layer defines the standard interface that the camera service calls into and that you must implement to have your camera hardware function correctly.
Kernel Driver
Camera驱动向下与真实的camera硬件进行交互,向上与HAL实现进行交互。Camera硬件和驱动必须能够提供YV12和NV21格式的图像数据,以支持camera图像数据在显示屏上的预览和视频录制。
注:YV12是YUV420P,三个plane,即Y,V,U三个plane依次存储,如:YYYYYYYY VV UU;NV21是YUV420SP,两plane,即Y,VU作为两个plane存储,且VU交织,即一个V,一个U,依次存储,