前言
上一篇文章大概介绍了一下Camera的整体架构,先回顾一下:

上图是Google官方的Camera架构,Google封装了HAL层接口:ICameraProvider, ICameraDevice, ICameraDeviceSession。
这几个接口的作用如下:
- ICameraProvider:用于枚举单个设备并管理其状态。
- ICameraDevice:相机设备接口。
- ICameraDeviceSession:活跃的相机设备会话接口。
MTK HAL3结构主要实现了这几个接口, CameraProviderImpl实现了ICameraProvider接口,CameraDevice3Impl实现了ICameraDevice接口,CameraDevice3SessionImpl实现了ICameraDeviceSession接口。
Google 将相机子系统塑造为一个管道(pipeline),MTK实现了一个PipelineModelImpl来管理pipeline。
本文详细地描述了从framework到HAL层open camera的整个过程。
open Camera流程
总结MTK平台open Camera的整个流程,忽略callback过程,以下是整个过程中设计到的文件路径:
| 文件名 | 所在路径 |
|---|---|
| CameraManager.java | frameworks/base/core/java/android/hardware/camera2/ |
| CameraService.cpp | frameworks/av/services/camera/libcameraservice/ |
| CameraDeviceClient.cpp | frameworks/av/services/camera/libcameraservice/api2/ |
| Camera2ClientBase.cpp | frameworks/av/services/camera/libcameraservice/common/ |
| Camera3Device.cpp | frameworks/av/services/camera/libcameraservice/device3/ |
| CameraProviderManager.cpp | frameworks/av/services/camera/libcameraservice/common/ |
| CameraDevice3Impl.cpp | mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/device/ |
| CameraDevice3SessionImpl.cpp | mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/device/ |
| PipelineModelImpl.cpp | mediatek/proprietary/hardware/mtkcam3/pipeline/model/ |
| HalDeviceAdapter.cpp | mediatek/proprietary/hardware/mtkcam3/pipeline/model/adapter/ |
| HalSensorList.openList.cpp | mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1/ |
| HalSensor.cpp | mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1/ |
| imgsensor_drv.cpp | mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1/ |
| IHalSensor.h | /mediatek/proprietary/hardware/mtkcam/include/mtkcam/drv/ |
MTK 代码路径说明

下图是整个open camera的流程,可以结合下面的具体步骤一起看。

由Google的Camera框架可知open Camera从CameraManager.java开始(CameraDevice.java负责发出capture命令,这里只讲open)
CameraManager.java
openCamera()==> openCameraForUid() ==>openCameraDeviceUserAsync()
直接看openCameraDeviceUserAsync()函数,限于篇幅,代码部分省略。
需要注意的是第19行ICameraService cameraService = CameraManagerGlobal.get().getCameraService();这里通过Binder获取了CameraService实例。再看第25行cameraUser = cameraService.connectDevice。然后deviceImpl.setRemoteDevice(cameraUser); device = deviceImpl; 最后return device。
由connectDevice往下,到CameraService::connectDevice(),从这里开始进入CameraService!
private CameraDevice openCameraDeviceUserAsync(String cameraId, CameraDevice.StateCallback callback, Executor executor, final int uid)throws CameraAccessException {
CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
CameraDevice device = null;
synchronized (mLock) {
ICameraDeviceUser cameraUser = null;
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
new android.hardware.camera2.impl.CameraDeviceImpl(
cameraId,
callback,
executor,
characteristics,
mContext.getApplicationInfo().targetSdkVersion);
ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
try {
if (supportsCamera2ApiLocked(cameraId)) {
// Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
ICameraService cameraService = CameraManagerGlobal.get().getCameraService();//19行
if (cameraService == null) {
throw new ServiceSpecificException(
ICameraService.ERROR_DISCONNECTED,
"Camera service is currently unavailable");
}
cameraUser = cameraService.connectDevice(callbacks, cameraId,
mContext.getOpPackageName(), uid);
} else {
// Use legacy camera implementation for HAL1 devices
int id;
try {
id = Integer.parseInt(cameraId);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Expected cameraId to be numeric, but it was: "
+ cameraId);
}
Log.i(TAG, "Using legacy camera HAL.");
cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks, id,
getDisplaySize());
}
}
...
// TODO: factor out callback to be non-nested, then move setter to constructor
// For now, calling setRemoteDevice will fire initial
// onOpened/onUnconfigured callbacks.
// This function call may post onDisconnected and throw CAMERA_DISCONNECTED if
// cameraUser dies during setup.
deviceImpl.setRemoteDevice(cameraUser);
device = deviceImpl;
}
return device;
}
CameraService.cpp
看connectDevice()函数,需要注意第14行ret = connectHelper(…,client),其最后一个参数client作为输出。
Status CameraService::connectDevice(
const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb,
const String16& cameraId,
const String16& clientPackageName,
int clientUid,
/*out*/
sp<hardware::camera2::ICameraDeviceUser>* device) {
ATRACE_CALL();
Status ret = Status::ok();
String8 id = String8(cameraId);
sp<CameraDeviceClient> client = nullptr;
ret = connectHelper<hardware::camera2::ICameraDeviceCallbacks,CameraDeviceClient>(cameraCb, id,
/*api1CameraId*/-1,
CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName,
clientUid, USE_CALLING_PID, API_2, /*shimUpdateOnly*/ false, /*out*/client);
*device = client;
return ret;
}
直接看connectHelper(),需要注意的是第10行ret = makeClient(…, &tmp),tmp作为输出, 得到client后第22行调用client->initialize().那么这个client是谁的实例呢,沿着makeClient函数跟下去。
Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&

&spm=1001.2101.3001.5002&articleId=108553449&d=1&t=3&u=452d6b6c8f3f448daa576c281e47efcd)
4975

被折叠的 条评论
为什么被折叠?



