深入理解Android Camera
文章目录
一、Camera框架
(详细资料参见:https://source.android.com/devices/camera)
1. 架构(旧版)
1.1 简介
Camera 在 Android 5 引入了 API2 的接口,可以允许配置更多的 camera 操作。
旧的 API 接口都在 android.hardware.包下(为求方便,下面旧 API 接口都统称为 API1), 新的 API2 的接口都在 android.hardware.camera2 包下面。
由于共存了两套API,也造成了camera框架相对复杂,但是大致可以总结为下图:
由此可知,API1、API2与HAL V1、V3的对应关系是在 CameraService这层做的转化。CameraService通过提供不同的open接口(API1对应connect,API2对应connectDevice、connectLegacy)来初始化转化关系。
1.2 底层用HAL V1
需要注意2点:
- HAL层的代码跑在CameraService进程
- Camera API2接口会通过CameraDeviceUserShim转化为Camera API1的接口,这是唯一一个不在CameraService做API与HAL转化的关系
1.3 底层用HAL V3
二、API和Hal特殊组合
1. API1 + HAL3
API1调用HAL3是在CameraService中完成转换,使用了不同的Client:
- CameraClient (即API调用HAL1的接口)
- Camera2Client (即API1调用HAL3接口)
- CameraDeviceClient (即API2调用HAL3接口)
代码如下(示例):
//代码位置:\frameworks\av\services\camera\libcameraservice\CameraService.cpp
Status CameraService::makeClient(const sp<CameraService>& cameraService,
const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId,
int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid,
int halVersion, int deviceVersion, apiLevel effectiveApiLevel,
/*out*/sp<BasicClient>* client) {
if (halVersion < 0 || halVersion == deviceVersion) {
// Default path: HAL version is unspecified by caller, create CameraClient
// based on device version reported by the HAL.
// 如果HAL版本没有特殊指定(即正常调用Camera.open()), 或者指定的HAL版本和要打开的Camera默认的HAL版本相同, 则根据要打开的Camera的默认HAL版本创建Client
switch(deviceVersion) {
case CAMERA_DEVICE_API_VERSION_1_0:
// 如果HAL层默认使用HAL1, 则创建 CameraClient
if (effectiveApiLevel == API_1) {
// Camera1 API route
sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
*client = new CameraClient(cameraService, tmp, packageName,
api1CameraId, facing, clientPid, clientUid,
getpid());
} else {
// Camera2 API route
ALOGW("Camera using old HAL version: %d", deviceVersion);
return STATUS_ERROR_FMT(ERROR_DEPRECATED_HAL,
"Camera device \"%s\" HAL version %d does not support camera2 API",
cameraId.string(), deviceVersion);
}
break;
case CAMERA_DEVICE_API_VERSION_3_0:
case CAMERA_DEVICE_API_VERSION_3_1:
case CAMERA_DEVICE_API_VERSION_3_2:
case CAMERA_DEVICE_API_VERSION_3_3:
case CAMERA_DEVICE_API_VERSION_3_4:
case CAMERA_DEVICE_API_VERSION_3_5:
// 如果HAL层默认使用HAL3, 根据使用API进行判断, 使用API1则创建Camera2