骁龙相机启动流程分析

2024-06-21 13:12

本文主要是介绍骁龙相机启动流程分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、骁龙相机启动流程分析

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. 相机启动阶段概览

01b95bae78b1d192c86773a8f80c4171.png
相机启动阶段概览

4. 相机启动阶段详解

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

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

S1: Camera APP UI 创建 到 OpenCamera 开始

5b9deae566f0dba4c6c95861df5dae66.png
S1: Camera APP UI 创建 到 OpenCamera 开始

S2 Camera HAL 响应 opencamera

0f192aaf52b1fec5df1159d6ab8a7ad3.png
S2 : Camera HAL 响应 opencamera

S3:APP开始下发请求配流

703fbf9ef51c1f0e1f6b3224a65ba552.png
S3:APP开始下发请求配流

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

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

S4: Camera HAL 响应配流

f6180143ddf01ab5b7d64a0dd001f180.png
S4: Camera HAL 响应配流

S5:请求预览 startpreview

3cd817449cd6abef63707db26a5d936d.png
S5:请求预览 startpreview

S6: Camera HAL callback 首帧请求结果

71e3bfa92e6c4aaebb725ba41f5c0cea.png
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


c21d240f5dd0ed0b8517c65953c5dd84.png
一帧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研发,待理清上屏显示的真正时间)


    d4e885d73d789db4a6cc88b8e466535a.png
    Surface 送显上屏阶段

这篇关于骁龙相机启动流程分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081322

相关文章

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

树莓派启动python的实现方法

《树莓派启动python的实现方法》本文主要介绍了树莓派启动python的实现方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、RASPBerry系统设置二、使用sandroidsh连接上开发板Raspberry Pi三、运

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装