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

相关推荐
故渊at17 小时前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈
aqi0017 小时前
一文速览 HarmonyOS 6.1.1 推出的十个新特性
android·华为·harmonyos·鸿蒙·harmony
matrixmind118 小时前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
随遇丿而安18 小时前
第8周:弹窗 / 提示组件全功能与弹窗优化
android
zh_xuan18 小时前
诡异Bug:输入框删除字符,却越删越多
android·bug
nwsuaf_huasir18 小时前
matlab绘制尺寸和字体合适的图片插入到latex的方法
android·开发语言·matlab
future_li18 小时前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
杊页18 小时前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at18 小时前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc
故渊at19 小时前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务