骁龙相机启动流程分析

教育   2024-06-20 18:09   浙江  
一、骁龙相机启动流程分析

1. 相机启动阶段关键TAG

关键字解释
deliverInputEvent点击事件
bindApplicationApp 冷启动 创建application
activityStart创建camera activity
activityResumecamera UI界面开始显示
connectDevicecameraFWK 开始链接并open sensor
CameraHal::openSessionCamera FWK 响应 opencamera
camera_module->openHAL 响应 opencamera
HAL3OpenHAL 开始准备opencamera
constructDefaultRequestSettings获取Camera request setting 比如一下metadata等
createStream创建配流信息,可以查看配几路流
endConfigure配流结束
CameraHal::configureStreamsCamera FWK 配流阶段常用搜索关键字
HAL3ConfigureStreamsCamera HAL 配流阶段常用关键字
AdvancedCameraUsecase::Initializechi usecase 初始化
submitRequestList,setRepeatingRequests发起预览请求
CameraHal::processBatchCaptureRequests下发预览请求
HAL3ProcessCaptureRequestcamera HAL 响应第0帧预览请求
CSLStreamOn,KMDStreamON: DevType20sensor 开始streamon
HAL3ProcessCaptureRequest : 1Camera HAL 响应第一次预览请求
Stream 0: first full bufferCamera FWK接收到返回第一帧
SurfaceView[org.codeaurora.snapcam/com.android.camera.CameraLauncher]#1(BLAST Consumer)1Camera app 接收第一帧
BufferTX - SurfaceVieworg.codeaurora.snapcam/com.android.camera.CameraLauncher#529Surfaceflinger bufferTX 用来存储buffer 供SF 消费
VSYNC-sfSF 开始绘制处理,对应的BufferTX - 1
prepareFrameSF开始预处理帧
HwcPresentOrValidateDisplaySF 与HWC进行通信验证显示
postComposition Last HWVsyncHintpost 显示合成结果
presentFence fence 155,waiting for presentFence 155,REThreaded::mapExternalTextureBuffer上屏显示(SF不太熟大致是这个时候屏幕可以显示处理)

2. 相机启动阶段拆解

阶段模块关键字备注
S0systemdeliverInputEvent---> ZygoteInit之前 app 开始running的地方创建 camera app
S1APPapp 开始running的地方--->connectDevice 开始Camera App 开始请求openCamera
S2Camera HALconnectDeviceHAL 处理open camera 操作
S3Camera APP、FWKconnectDevice 结束--->CameraHidlHal::constructDefaultRequestSettings-->createStream-->endConfigure start请求配流
S4Camera HALCameraHal::configureStreamsCamera HAL 响应配流
S5Camera APPCameraHal::configureStreams 结束 -->submitRequestList、setRepeatingRequests请求预览
S6Camera HALsubmitRequestList、setRepeatingRequests--> first full bufferCamera HAL 返回第一帧
S7SFfirst full buffer-->上屏显示SF送显阶段

3. 相机启动阶段概览


相机启动阶段概览

4. 相机启动阶段详解

S0 :Launcher 点击Camera Icon 响应事件到Camera app 创建


S0 :Launcher 点击Camera Icon 响应事件到Camera app 创建

S1: Camera APP UI 创建 到 OpenCamera 开始


S1: Camera APP UI 创建 到 OpenCamera 开始

S2 Camera HAL 响应 opencamera


S2 : Camera HAL 响应 opencamera

S3:APP开始下发请求配流


S3:APP开始下发请求配流

对应log中创建的2路流如下:

    Line 10538: 06-19 18:09:04.173  1907  3718 I CameraDeviceClient: createStream : stream size is 960 x 720
Line 10543: 06-19 18:09:04.180 1907 3718 I CameraDeviceClient: createStream : stream size is 4608 x 3456

S4: Camera HAL 响应配流


S4: Camera HAL 响应配流

S5:请求预览 startpreview


S5:请求预览 startpreview

S6: Camera HAL callback 首帧请求结果


S6: Camera HAL callback 首帧请求结果

6.1 一帧callback流程

一帧数据传输通过Binder 进行
Camera HAL: HAL3ProcessCaptureResult
--->
Camera FWK: processCaptureResult
--->
Camera App: onFrameAvaillable
--->
SF: SurfaceView +1
SF: BufferTX SurfaceView +1
SF:QueueBuffer +1



一帧callback流程

S7: Surface 送显上屏阶段

  1. App queuebuffer 后SurfaceView +1
  2. Vsync-sf 到来后SF 从BufferQueue中取出app 送显帧进行消费合成
  3. SF跟HWC通过bind通信后,调用postComposition Last HWVsyncHint ,在对应 presentFence fence 到来后,调用SF的REThreaded::mapExternalTextureBuffer 开始上屏显示(非display研发,待理清上屏显示的真正时间)



    Surface 送显上屏阶段


程序员Android
这是一个专注提供 Java Android 知识体系服务的公众号。 和你一起终身学习,小安愿做你成长道路上的垫脚石,不断垫高你的高度,衬托你的威仪。 风里雨里,我们一直在 Java Android 学习的路上支持你!
 最新文章