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

相关推荐
手机不死我是天子1 小时前
《Android 核心组件深度系列 · 第 2 篇 Service》
android
前行的小黑炭1 小时前
Compose页面切换的几种方式:Navigation、NavigationBar+HorizontalPager,会导致LaunchedEffect执行?
android·kotlin·app
前行的小黑炭2 小时前
Android :Comnpose各种副作用的使用
android·kotlin·app
BD_Marathon15 小时前
【MySQL】函数
android·数据库·mysql
西西学代码16 小时前
安卓开发---耳机的按键设置的UI实例
android·ui
maki07720 小时前
虚幻版Pico大空间VR入门教程 05 —— 原点坐标和项目优化技巧整理
android·游戏引擎·vr·虚幻·pico·htc vive·大空间
千里马学框架21 小时前
音频焦点学习之AudioFocusRequest.Builder类剖析
android·面试·智能手机·车载系统·音视频·安卓framework开发·audio
fundroid1 天前
掌握 Compose 性能优化三步法
android·android jetpack
TeleostNaCl1 天前
如何在 IDEA 中使用 Proguard 自动混淆 Gradle 编译的Java 项目
android·java·经验分享·kotlin·gradle·intellij-idea
旷野说1 天前
Android Studio Narwhal 3 特性
android·ide·android studio