hal进程provider进程启动
camera_module_t 调 HAL3Module 调 HwEnvironment
camx chi-cdk互相调
a) open
App调CameraManager的openCamera
调ICameraDevice::open()这一个HIDL接口通知Provider
调HAL中的camera3_device_t结构体,获取一个camera设备
b) initialize
在调用open后紧接着被调用,主要用于将上层的回调接口传入HAL中
包括process_capture_result和notify的函数指针
App调CameraDevice.createCaptureSession,并且通过Camera api v2标准接口,通知Camera Service
通过HIDL接口ICameraDeviceSession::configureStreams_3_4通知Provider开始处理此次配流需求
在Provider内部,调camera3_device_t的configure_streams将数据流配置传入CamX-CHI中,之后由CamX-CHI完成对数据流的配置工作
配流:
- 根据operation_mode、camera 个数以及stream的配置信息选取了对应的UsecaseId
- 根据所选取的UsecaseId,使用UsecaseFactory简单工厂类创建了用于管理整个场景下所有资源的AdvancedCameraUsecase对象
- 创建AdvancedCameraUsecase对象是通过调用其Create()方法完成,该方法中获取了common_usecase.xml定义的关于Usecase的配置信息,之后又根据需要创建了Feature并选取了Feature所需的pipeline,并通过Override机制将Feature中所需要的Pipeline加入重建后的Usecase中
- 最后通过调用CameraUsecaseBaese的initialize方法依次创建了各个pipeline以及Session,并且将AdvancedCameraUsecase的成员方法注册到Session,用于Session将数据返回给Usecase中。
app调setRepeatingRequest。
通过Camera api v2接口下发到Camera Service中。
HIDL接口ICameraCaptureSession:processCaptureRequest_3_4将请求发送至Provider。
调用camera3_device_t结构体的process_capture_request到CamX-CHI。
CamX将request转发到HALDevice中,通过m_ChiAppCallbacks.chi_override_process_request将request发送到CHI
(chi_override_process_request方法的定义位于chxextensioninterface.cpp中)
在chi_override_process_request中会去获取ExtensionModule对象,并将request发送到ExtensionModule对象中,该对象中存储了之前创建的Usecase对象,然后经过层层调用,最终会调用AdvancedCameraUsecase的ExecuteCaptureRequest方法,该方法负责处理此次Request。
一路调到Session::StreamOn和Session::ProcessCaptureRequest,继续调到pipeline的函数:
1)完成Sensor以及IFE等Node的控制硬件模块出图前的配置,其中包括了曝光的参数的设置,Node的Buffer管理机制ImageBufferManager的创建,而该类用于管理Node中的output port的buffer申请/流转/释放等操作。
2)会进一步通知CSL部分开启数据流,分配用于装载图像数据的buffer。
- 通过调用Session::ProcessCaptureRequest方法进入到Session,然后调用Pipeline::ProcessRequest方法通知Pipeline开始处理此次Request。
- 在Pipeline中,会先去调用内部的每一个Node的SetupRequest方法分别设置该Node的Output Port以及Input Port,之后通过调用DRQ(DeferredRequestQueue)的AddDeferredNode方法将所有的Node加入到DRQ中,其中DRQ中有两个队列分别是用于保存没有依赖项的Node的m_readyNodes以及保存处于等待依赖关系满足的Node的m_deferredNodes,当调用DRQ的DispatchReadyNodes方法后,会开始从m_readyNodes队列中取出Node调用其ProcessRequest开始进入Node内部处理本次request,在处理过程中会更新meta data数据,并更新至DRQ中,当该Node处理完成之后,会将处于m_deferredNodes中的已无依赖关系的Node移到m_readyNodes中,并再次调用DispatchReadyNodes方法从m_readyNodes取出Node进行处理。
- 与此过程中,当Node的数据处理完成之后会通过CSLFenceCallback通知到Pipeline,此时Pipeline会判断当前Node的Output port 是否是Sink Port(输出到CHI),如果不是,则会更新依赖项到DRQ中,并且将不存在依赖项的Node移到m_readyNodes队列中,然后调用DispatchReadyNdoes继续进入到DRQ中流转,如果是Sink Port,则表示此Node是整个Pipeline的最末端,调用sinkPortFenceSignaled将数据给到Session中,最后通过调用Session中的NotifyResult将结果发送到CHI中。
在用户开启了相机应用,相机框架收到某次Request请求之后会开始对其进行处理,一旦有图像数据产生便会通过层层回调最终返回到应用层进行显示。