Android相机-架构2

应用:

大概流程:open,创建session,发送request,得到captureresult
CameraManager,获取系统服务CameraService,打开相机:

1)openCamera:打开相机
    获取相机信息:ICameraService.getCameraInfo
    实例化一个CameraDeviceImpl
    通过ICameraService的connectDevice方法,参数包括CameraDevice.StateCallback,传入CameraService
    获取ICameraDeviceUser的代理
    应用通过回调将CameraDeviceImpl返回给App使用,应用端的打开相机流程就完成了。
    
2)createCaptureSession:创建Session
    通过configureStreamsChecked方法来配置数据流
    实例化一个CameraCaptureImpl对象
    
3)createCaptureRequest:创建request
    通过ICameraDeviceUser的CreateDefaultRequest()方法创建一个默认的CameraMetadataNative
    实例化一个CaptureRequest.Builder对象
    将cameraMetaDataNative传入其中
    完成默认请求的创建
    
4)setRepeatingCapture:设置为Repeating
    CameraDeviceImpI对象会包含CameraCaptureSession.CaptureCallback对象

5)capture:下发request
    ICameraDeviceUser的submitcaptureRequest

6)onCaptureProcessed:将结果回传进行解析及后续处理
    ICameraDeviceCallback的onResultReceived方法将PartialMetaData的数据回传回来
    CameraCaptureSession.CaptureCallback的onCaputreProgressed方法回传给app
7)onCaptureCompleted:将结果回传进行解析及后续处理
    ICameraDeviceCallback的onResultReceived方法将MetaData的数据回传回来
    CameraCaptureSession.CaptureCallback的onCaputreProgressed方法回传给app
    
8)onImageAvailable:此时就可以读出图像数据进行处理
    图像数据通过BufferQueue的缓存方式,通过queueBuffer方法入队图像缓存,并通知消费中去消费。
    APP端可以使用ImageReader的onImageAvailable的方法通知ImageReader读取并进行处理
    

CameraService

AIDL:
    ICameraService:主要是通过CameraService实现,打开Camera设备,获取系统支持的相机个数,添加闪光灯的监听等
    ICameraServiceListener:由CameraManagerGlobal类实现,可以搞只当前Camera设备的状态变更等
    ICameraDeviceUser:由CameraDeviceClient实现,主要是对相机设备的操作,开关设备,发送请求,配流等等
    ICameraDeviceCallback:由CameraDeviceCallback实现,主要是提供Metadata和imagedata的回调,以及错误通知等等

CameraService:
    mCameraProviderManager《-ProviderInfo《-DeviceInfo3

CameraDeviceClient:
    mDevice<-Camera3Device<-RequestThread
    mFrameProcessor<-frameProcessorBase

CameraService的启动:
main_cameraserver开始:instantiate方法进行实例化,
    枚举ProviderManger
    new对象和初始化
    初始化包括:getService获取ICameraProvider代理;实例化ProviderInfo对象并对其初始化,加入容器进行管理
    ProviderInfo的初始化:保存ICameraProvider变量,实现ICameraProviderCallback接口等等,主要是通过ICameraProvider
    来获取ICameraDevice,然后实例化CameraInfo3对象
    这样CameraService就可以管理所有的CameraProvider和CameraDevice了

CameraService是在系统启动启动的系统服务,启动后就会等待处理APP的相关请求,处理流程就是如应用的使用流程进行交互。
    包括:获取相机属性,打开相机,配置数据流,处理图像请求,接收图像结果
    

Camera HAL:

HIDL:主要是提供CameraService使用的一些接口,由Camerahal框架负责实现这些接口。
ICameraProvider及相关的Callback
ICameraDevice及相关的Callback
ICameraDeviceSession

HAL的实现:
Qcom和Rockchip的实现
ComX-CHI的框架
主要的目录结构:
CamX:
core:核心实现模块内部包含hal目录,实现hal3接口,以及chi负责与CHI交互
csl:负责CamX与driver通讯模块
hwl:由独立运算能力的node,受csl管理
swl:需要依靠cpu才能实现的node

CHI-cdk:
chioveride:CHI的实现。负责与CamX交互并实现CHI的总体框架与业务逻辑
bin:平台相关的配置
actuator:对焦模块
ois
flash:
eeprom:外部存储
fd
topology:usecase
node:用户定义功能的node
module:不同sensor的配置文件
tunnig:
sensor:sensor的私有信息以及寄存器配置

实现用户场景需求。
usecase-》feature -》session -》pipeline -》Node(port,link,sink)

feature包括:HDR,CFA,JPEG,ASD,ZSL,MFNR,SuperNight,MultiFrame,MFSR等等

Camx-Chi的启动流程:
HwEnvironment
CSLModeManager
SettingsManager

通过dlopen打开com.qti.chi.override.so
dlsym或者chi_hal_override_entry,进入入口。

猜你喜欢

转载自blog.csdn.net/haigand/article/details/132476787