Camera HAL3的整体架构和流程(二)

前言

上一篇文章大概介绍了一下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&
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值