当createCaptureSession流程执行完成后,应用在回调方法onConfigured就可以获得创建的CameraCaptureSession,接下来就可以调用CameraCaptureSession#setRepeatingRequest来下发camera stream命令获取camera数据。在CameraCaptureSession#setRepeatingRequest流程中,实际上是调用CameraDeviceImpl#setRepeatingRequest,然后调用submitCaptureRequest中转,最终通过binder调用到CameraDeviceClient#submitRequestList中来完成camera stream命令下发。
/frameworks/base/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
/frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
接下来分析CameraDeviceClient#submitRequestList流程。在这个流程中,首先检查应用pid一致性、request状态和参数配置是否正确、设备物理ID转换后的逻辑ID是否一致和request权限等问题,然后再调用Camera3Device#setStreamingRequestList进行进一步配置。
/frameworks/av/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
在Camera3Device#setStreamingRequestList流程中,通过submitRequestsHelper方法进行完成camera stream命令配置流程。在submitRequestsHelper方法中,首先会检查Camera3Device中流程配置状态是否正常,接着通过convertMetadataListToRequestListLocked方法初始化RequestList,然后再通过RequestThread#setRepeatingRequests进行camera stream命令配置,最后等待request配置完成。
/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
在RequestThread#setRepeatingRequests流程中,会清空本地的camera stream命令列表,将第一次repeating标志位设置为true,同时将当前设置的命令列表拷贝到本地,然后通过unpauseForNewRequests方法发送信号给RequestThread开启命令下发流程。
/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
在openCamera流程时会执行Camera3Device#initializeCommonLocked方法,其中会创建RequestThread并启动,启动后的RequestThread值循环执行threadLoop方法。在threadLoop方法中,主要完成3件事情:1)调用waitForNextRequestBatch方法等待request准备完成,主要是通过waitForNextRequestLocked等待mRequestSignal信号通知(也就是上一步流程中的request设置完成后发出的信号);2)通过prepareHalRequests方法来完成hal request的参数配置和camera stream buffer申请。3)通过sendRequestsBatch方法将request发送给hal层获取camera stream数据。
/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
CaptureRequest创建完成后,会调用prepareHalRequests方法完成request进一步配置。在这个流程中,主要是初始化下发的hal request命令参数,并调用getBuffer方法为request中所有的outputStream申请camera stream buffer。
/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
/frameworks/av/services/camera/libcameraservice/device3/Camera3Stream.cpp
/frameworks/av/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
当hal request命令配置完成,camera stream需要的buffer也申请完成后,接下就会调用sendRequestsBatch将camera stream命令发送给hal层来获取camera数据。在sendRequestsBatch方法中,主要完成2件事情:1)首先调用HalInterface#processBatchCaptureRequests通过wrapAsHidlRequest对命令进行封装,然后设置request setting参数,最后通过之前创建的CameraDeviceSession,调用processCaptureRequest下发命令给hal;2)更新下一次下发的命令。至此,camera stream request下发流程分析结束,request命令发送给hal层,hal层接收到请求读取camera数据。
/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
/hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp