Android15 Camera框架中的StatusTracker

StatusTracker介绍
StatusTracker是Android15 Camera框架中用来协调Camera3各组件之间状态转换的类。
StatusTracker线程名:std::string("C3Dev-") + mId + "-Status"
Camera3 StatusTracker工作原理
StatusTracker实现批处理(状态转换)的基础
StatusTracker对组件(component)状态的跟踪和处理,主要围绕三个表一个线程来实现:
- 三个表
- mComponentName 用于记录注册的组件名字和跟踪id。
- mState 用于记录注册的组件状态。
- mPendingChangeQueue 用于记录组件pending StateChange(提交的某个组件的statechange, 待后续处理完成)。
- 一个工作线程
- threadLoop
首先,一个component通过addComponent()向StatusTracker注册跟踪,StatusTracker会根据当前注册情况为这个component分配一个trackId(mNextComponentId记录当前注册了多少component),并将这个component登记到mComponentName表,以默认IDLE的状态登记到mState表。
然后,一个component通过markComponentActive(trackId)或者makrComponentIdle(trackId, Fence)向StatusTracker提交一个状态转换(StateChange),StatusTracker将这个component的状态转换请求添加到mPendingChangeQueue。StatusTracker工作线程负责处理提交到mPendingChangeQueue的状态转换。
StatusTracker工作线程的6个状态
StatusTracker工作线程有6个状态,状态之间的转换如下

图1.StatusTracker工作线程状态转换图
StatusTracker的生与死由Camera3Device控制。Camera3Device::initializeCommonLocked()初始化基础内容时创建并启动这个StatusTracker工作线程;Camera3Device::disconnectImpl()主动调用requestExit(),将StatusTracker工作线程标记为dead, 系统Thread实现触发最终的StatusTracker工作线程退出。
StatusTracker处理一次状态转换可能有两种情况
- 跟踪的组件有变化。包括组件通过addComponent()/removeComponent()主动注册或注销,也包括状态转换处理后组件idle(idleFence)。
- 跟踪的组件状态有变化。组件通过markComponentX()主动标记状态。
StatusTracker工作线程相关的两个信号
从图1.StatusTracker工作线程状态转换图中,StatusTracker工作线程协作有两个信号:
- mPendingChangeSignal信号,是组件状态更改提交(尚未完成)的信号。组件主动注册/注销/标记状态会触发这个信号,Camera3Device结束StatusTracker工作线程也会发这个信号。
- mFlushCondition信号,是一批状态变更完成的信号。当所有的状态变更处理完会清空mPendingChangeQueue,并发送这个信号,表示StatusTracker已经冲刷完成。
StatusTracker工作线程处理状态转换
StatusTracker一次状态处理使分三步做的:
1. 将mPendingChangeQueue中的各组件状态变更统一收集到mStateTransitions,同时更新跟踪状态表。
2.将状态变更通知给parent(这里也就是Camera3Device)
3.所有的pengding change处理完,标记tracker为flushed
代码如下:
StatusTracker收集组件状态转换(包括组件间中间状态转换)
sp<Camera3Device> parent;
198 {
199 Mutex::Autolock pl(mPendingLock);
200 Mutex::Autolock l(mLock);
201
202 // Collect all pending state updates and see if the device
203 // collectively transitions between idle and active for each one
204 //获取被跟踪组件的状态,优先获取到active状态的//如果所有的组件都是idle状态,那么检查fence时间戳确定xx状态
205 // First pass for changed components or fence completions
206 ComponentState prevState = getDeviceStateLocked();//疑问:组件状态和mDeviceState怎么达到一致?//这里收集状态的切换, 有两种可能:active->idle, idle->active
207 if (prevState != mDeviceState) {
208 // Only collect changes to overall device state
209 mStateTransitions.add(prevState);
210 }
211 // For each pending component state update, check if we've transitioned
212 // to a new overall device state
213 for (size_t i = 0; i < mPendingChangeQueue.size(); i++) {//一个状态转换动作
214 const StateChange &newState = mPendingChangeQueue[i];//这个状态转换动作是哪个组件来做
215 ssize_t idx = mStates.indexOfKey(newState.id);
216 // Ignore notices for unknown components
217 if (idx >= 0) {//更新这个组件的状态
218 // Update single component state
219 mStates.replaceValueAt(idx, newState.state);//这是什么意思?
220 mIdleFence = Fence::merge(String8("idleFence"),
221 mIdleFence, newState.fence);//检查被跟踪的组件状态//收集状态切换
222 // .. and see if overall device state has changed
223 ComponentState newState = getDeviceStateLocked();
224 if (newState != prevState) {
225 mStateTransitions.add(newState);
226 }
227 prevState = newState;
228 }
229 }//一次状态切换收集后,清空mPendingChangeQueue以进行下一次状态收集。
230 mPendingChangeQueue.clear();
231 mComponentsChanged = false;
232
233 // Store final state after all pending state changes are done with
234 //一次状态收集后,得到StatusTracker的状态
235 mDeviceState = prevState;
236 parent = mParent.promote();
237 }
StatusTracker将收集的状态转换通知给parent (Camera3Device)
if (mStateTransitions.size() > 0 && parent.get()) {for (size_t i = 0; i < mStateTransitions.size(); i++) {bool idle = (mStateTransitions[i] == IDLE);ALOGV("Camera device is now %s", idle ? "idle" : "active");parent->notifyStatus(idle);}
}
mStateTransitions.clear();
StatusTracker代码实现中的几个点
//StatusTracker工作线程退出需要Camera3Device主动触发
//但是StatusTracker本质是Android Thread, 退出有一定的延时性。
//退出相关代码:
void StatusTracker::requestExit()
{//First mark thread dead.Thread::requestExit();//Then exit any waitsmPendingChangeSignal.signal();mFlushCondition.signal();
}bool StatusTracker::threadLoop()
{{Mutex::Autolock pl(mPendinglock);while (mPendingChangeQueueSize() == 0 && !mComponentsChanged) {//等待pending change处理信号res = mPendingChangeSignal.waitRelative(mPendingLock, kWaitDuration);//线程退出if (exitPending()) return false;if (res != OK) {if (res != TIMED_OUT) {ALOGE("%s: Error waiting on state changes: %s (%d)",__FUNCTION__, strerror(-res), res);}//TIMED_OUT is expectedbreak;}}}...
}
Camera3中的StatusTracker
相关文章:
Android15 Camera框架中的StatusTracker
StatusTracker介绍 StatusTracker是Android15 Camera框架中用来协调Camera3各组件之间状态转换的类。 StatusTracker线程名:std::string("C3Dev-") mId "-Status" Camera3 StatusTracker工作原理 StatusTracker实现批处理(状态…...
MyBatis-Plus 注解大全
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 MyBatis-Plus 注解大全 MyBatis-Plus 是基于 MyBatis 的增强工具,通过注解简化了单表 CRUD 操作和复杂查询的配置。以下是常用注解的分类及详细说…...
【MySQL_03】数据库基本--核心概念
文章目录 一、数据库基础1.1 数据库基础定义1.2 数据库分类与典型产品1.3 数据库模型1.4 数据库层次结构1.5 数据库核心机制1.6 数据表和视图1.61 数据表(Table)1.62 视图(View) 1.7 键类型1.8 MySQL数据类型1.9 数据库范式化 二、…...
Ubuntu 下 nginx-1.24.0 源码分析 (1)
main 函数在 src\core\nginx.c int ngx_cdecl main(int argc, char *const *argv) {ngx_buf_t *b;ngx_log_t *log;ngx_uint_t i;ngx_cycle_t *cycle, init_cycle;ngx_conf_dump_t *cd;ngx_core_conf_t *ccf;ngx_debug_init(); 进入 main 函数 最…...
边缘计算盒子:解决交通拥堵的智能方案
在当今的智能交通系统中,边缘计算盒子(Edge Computing Box)正逐渐成为不可或缺的核心组件。这种设备通过将计算能力下沉到网络边缘,极大地提升了数据处理的速度和效率,特别适用于实时性要求极高的交通监控场景。本文将…...
工程化与框架系列(22)--前端性能优化(中)
前端性能优化(运行) 🏃 引言 运行时性能直接影响用户交互体验和应用流畅度。本文将深入探讨前端运行时性能优化的各种策略和技术,包括渲染优化、内存管理、计算优化等关键主题,帮助开发者构建高性能的Web应用。 运行…...
API调试工具的无解困境:白名单、动态IP与平台设计问题
引言 你是否曾经在开发中遇到过这样的尴尬情形:你打开了平台的API调试工具,准备一番操作,结果却发现根本无法连接到平台?别急,问题出在调试工具本身。今天我们要吐槽的就是那些神奇的开放平台API调试工具,…...
C#模拟鼠标点击,模拟鼠标双击,模拟鼠标恒定速度移动,可以看到轨迹
C#模拟鼠标点击,模拟鼠标双击,模拟鼠标恒定速度移动,可以看到轨迹 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks;namespa…...
php虚拟站点提示No input file specified时的问题及权限处理方法
访问站点,提示如下 No input file specified. 可能是文件权限有问题,也可能是“.user.ini”文件路径没有配置对,最简单的办法就是直接将它删除掉,还有就是将它设置正确 #配置成自己服务器上正确的路径 open_basedir/mnt/qiy/te…...
RISC-V汇编学习(三)—— RV指令集
有了前两节对于RISC-V汇编、寄存器、汇编语法等的认识,本节开始介绍RISC-V指令集和伪指令。 前面说了RISC-V的模块化特点,是以RV32I为作为ISA的核心模块,其他都是要基于此为基础,可以这样认为:RISC-V ISA 基本整数指…...
java 重点知识 — JVM存储模块与类加载器
1 jvm主要模块 方法区 存储了由类加载器从.class文件中解析的类的元数据(类型信息、域信息、方法信息)及运行时常量池(引用符号及字面量)。 所有线程共享;内存不要求连续,可扩展,可能发生垃圾回…...
WPF有哪些使用率高的框架
架构类库 Community Toolkit MVVMMVVM Light UI类库 MahApps.MetroMaterial Design In XAML Toolkit 图标类库 MahApps.Metro.IconPacks...
idea中使用DeepSeek让编程更加便捷
IDEA中使用DeepSeek让编程更加便捷 对于开发者来说,IDEA(IntelliJ IDEA)是一款强大的开发工具。但你是否知道,通过安装DeepSeek这款插件,可以让你的编程体验更上一层楼?今天,我们就来聊聊如何在…...
创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程
环境: node v20.18.0 npm 11.1.0 用到的所有依赖: "dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"ba…...
elasticsearch是哪家的
Elasticsearch:数据搜索与分析的领航者 在当今这个信息爆炸的时代,快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…...
nginx基础http基础
目录 nginx简介正向代理&反向代理正向代理反向代理What Is a Reverse Proxy Server? High-Performance Load Balancing (负载均衡)Problem(问题)Solution(解决方案)常见负载均衡算法Round Robin(轮询)…...
5. MySQL 存储引擎(详解说明)
5. MySQL 存储引擎(详解说明) 文章目录 5. MySQL 存储引擎(详解说明)1. 查看存储引擎2. 设置系统默认的存储引擎3. 设置表的存储引擎3.1 创建表时指定存储引擎3.2 修改表的存储引擎 4. 引擎介绍4.1 InnoDB 引擎:具备外键支持功能的事务存储引擎4.2 MyISAM 引擎&…...
基于LabVIEW的伺服阀高频振动测试闭环控制系统
为实现伺服阀在设定位置上下快速移动(1kHz控制频率)的振动测试目标,需构建基于LabVIEW的闭环控制系统。系统需满足高速数据采集、实时控制算法(如PID或自适应控制)、高精度电流驱动及传感器反馈处理等需求。结合用户提…...
97.在 Vue 3 中使用 OpenLayers 根据两行根数 (TLE) 计算并显示卫星轨迹(EPSG:3857)
前言 在许多卫星应用场景中,我们需要 基于 TLE(Two-Line Element Set, 两行根数)计算卫星轨迹,并在地图上进行可视化。本文将使用 Vue 3 OpenLayers satellite.js,实现 实时计算卫星轨迹,并在地图上动态更…...
Android Coil总结
文章目录 Android Coil总结概述添加依赖用法基本用法占位图变形自定义ImageLoader取消加载协程支持缓存清除缓存监听 简单封装 Android Coil总结 概述 Coil 是一个用于 Android 的 Kotlin 图像加载库,旨在简化图像加载和显示的过程。它基于 Kotlin 协程࿰…...
fastjson漏洞#不出网#原理#流量特征
原理 本质是java的反序列化漏洞,由于引进了自动检测类型的(autotype)功能,fastjson在对json字符串反序列化的时候,会读取type内容,会试图将json内容反序列化成这个对象,并调用这个类的setter方…...
云计算:虚拟化、容器化与云存储技术详解
在上一篇中,我们深入探讨了网络安全的核心技术,包括加密、认证和防火墙,并通过实际案例和细节帮助读者全面理解这些技术的应用和重要性。今天,我们将转向一个近年来迅速发展的领域——云计算。云计算通过提供按需访问的计算资源,彻底改变了IT基础设施的构建和管理方式。本…...
使用 marked.min.js 实现 Markdown 编辑器 —— 我的博客后台选择之旅
最近,我决定为个人博客后台换一个编辑器。之前的富文本编辑器虽然功能齐全,但生成的 HTML 代码繁杂,维护起来非常麻烦。为了追求更简洁高效的写作体验,我开始研究 Markdown 编辑器,并最终选择了 marked.min.js。 1. 传…...
Linux系统基于ARM平台的LVGL移植
软硬件介绍:Ubuntu 20.04 ARM 和(Cortex-A53架构)开发板 基本原理 LVGL图形库是支持使用Linux系统的Framebuffer帧缓冲设备实现的,如果想要实现在ARM开发板上运行LVGL图形库,那么就需要把LVGL图形库提供的关于帧缓冲设…...
LeetCode 2070.每一个查询的最大美丽值:排序 + 二分查找
【LetMeFly】2070.每一个查询的最大美丽值:排序 二分查找 力扣题目链接:https://leetcode.cn/problems/most-beautiful-item-for-each-query/ 给你一个二维整数数组 items ,其中 items[i] [pricei, beautyi] 分别表示每一个物品的 价格 和…...
电力场景绝缘子缺陷分割数据集labelme格式1585张4类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1585 标注数量(json文件个数):1585 标注类别数:4 标注类别名称:["broken part","broken insulat…...
【计算机网络】深入解析 HTTP 协议的概念、工作原理和通过 Fiddler 抓包查看 HTTP 请求/响应的协议格式
网络原理— HTTP 1. 什么是HTTP? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议: HTTP 往往是基于传输层的 TCP 协议实现的 (HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3基于UDP实现) 我们平时打开一个网站,就是通过HTTP协议来…...
IPFS:下一代互联网传输协议
IPFS:下一代互联网传输协议 1. 引言2. IPFS概述3. IPFS的核心优势3.1 去中心化3.2 高效性3.3 安全性3.4 持久性3.5 可扩展性 4. IPFS的工作原理4.1 内容寻址4.2 分布式哈希表(DHT)4.3 文件分块4.4 版本控制4.5 网络协议 5. IPFS的应用场景5.1…...
线上接口tp99突然升高如何排查?
当线上接口的 TP99 突然升高时,意味着该接口在 99% 的情况下响应时间变长,这可能会严重影响系统的性能和用户体验。可以按照下面的步骤进行排查。这里我们先说明一下如何计算tp99:监控系统计算 TP99(第 99 百分位数的响应时间&…...
SpringBoot优雅关机,监听关机事件,docker配置
Spring Boot 提供了多种方法来实现优雅停机(Graceful Shutdown),这意味着在关闭应用程序之前,它会等待当前正在处理的请求完成,并且不再接受新的请求。 一、优雅停机的基本概念 优雅停机的主要步骤如下: …...
