Camera2 setRepeatingRequest源码分析

当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

相关推荐
C4rpeDime1 小时前
自建MD5解密平台-续
android
鲤籽鲲3 小时前
C# Random 随机数 全面解析
android·java·c#
m0_548514776 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯7 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯7 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android
喀什酱豆腐7 小时前
Handle
android
m0_748232929 小时前
Android Https和WebView
android·网络协议·https
m0_748251729 小时前
Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)
android·游戏·unity
m0_7482546611 小时前
go官方日志库带色彩格式化
android·开发语言·golang
zhangphil11 小时前
Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)
android·kotlin