骁龙相机启动流程分析

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

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe