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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用OpenResty拦截SQL注入

需求 客户的一个老项目被相关部门检测不安全&#xff0c;报告为sql注入。不想改代码&#xff0c;改项目&#xff0c;所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些&#xff0c;都给拦截掉&#xff0c;从而实现拦截sql…

警惕AI神话破灭:深度解析大模型缺陷与禁用场景指南

摘要 当前AI大模型虽展现强大能力&#xff0c;但其本质缺陷可能引发系统性风险。本文从认知鸿沟、数据困境、伦理雷区、技术瓶颈四大维度剖析大模型局限性&#xff0c;揭示医疗诊断、法律决策等8类禁用场景&#xff0c;提出可信AI建设框架与用户防护策略。通过理论分析与实操案…

颠覆语言认知的革命!神经概率语言模型如何突破人类思维边界?

颠覆语言认知的革命&#xff01;神经概率语言模型如何突破人类思维边界&#xff1f; 一、传统模型的世纪困境&#xff1a;当n-gram遇上"月光族难题" 令人震惊的案例&#xff1a;2012年Google语音识别系统将 用户说&#xff1a;“我要还信用卡” 系统识别&#xff…

【Linux】详谈 基础I/O

目录 一、理解文件 狭义的理解&#xff1a; 广义理解&#xff1a; 文件操作的归类认知 系统角度 二、系统文件I/O 2.1 标志位的传递 系统级接口open ​编辑 open返回值 写入文件 读文件 三、文件描述符 3.1&#xff08;0 & 1 & 2&#xff09; 3.2 文件描…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA&#xff1a;检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景&#xff1a; GAN-SR模型虽然…

Vue3 Pinia 符合直觉的Vue.js状态管理库

Pinia 符合直觉的Vue.js状态管理库 什么时候使用Pinia 当两个关系非常远的组件&#xff0c;要传递参数时使用Pinia组件的公共参数使用Pinia

Web Worker如何在本地使用

首先了解一下什么是Web Worker Web Worker 是一种在后台线程中运行 JavaScript 的机制&#xff0c;允许你在不阻塞主线程的情况下执行耗时的任务。这对于保持网页的响应性和流畅性非常重要&#xff0c;特别是在需要进行复杂计算或大量数据处理时。 主要特点 多线程&#xff1…

Javaweb后端文件上传@value注解

文件本地存储磁盘 阿里云oss准备工作 阿里云oss入门程序 要重启一下idea&#xff0c;上面有cmd 阿里云oss案例集成 优化 用spring中的value注解

MAC-禁止百度网盘自动升级更新

通过终端禁用更新服务(推荐)​ 此方法直接移除百度网盘的自动更新组件,无需修改系统文件。 ​步骤: ​1.关闭百度网盘后台进程 按下 Command + Space → 输入「活动监视器」→ 搜索 BaiduNetdisk 或 UpdateAgent → 结束相关进程。 ​2.删除自动更新配置文件 打开终端…

数据结构:有序表的插入

本文是我编写的针对计算机专业考研复习《数据结构》所用资料内容选刊。主要目的在于向复习这门课程的同学说明&#xff0c;此类问题不仅仅使用顺序表&#xff0c;也可以使用链表。并且&#xff0c;在复习中&#xff0c;两种数据结构都要掌握。 若线性表中的数据元素相互之间可以…

DeepSeek大语言模型下几个常用术语

昨天刷B站看到复旦赵斌老师说的一句话“科幻电影里在人脑中植入芯片或许在当下无法实现&#xff0c;但当下可以借助AI人工智能实现人类第二脑”&#xff08;大概是这个意思&#xff09; &#x1f49e;更多内容&#xff0c;可关注公众号“ 一名程序媛 ”&#xff0c;我们一起从 …

Html5学习教程,从入门到精通, HTML5超链接应用的详细语法知识点和案例代码(18)

HTML5超链接应用的详细语法知识点和案例代码 超链接&#xff08;Hyperlink&#xff09;&#xff0c;也称为跃点链接&#xff0c;是互联网和文档编辑中的一种重要概念。 超链接的定义 超链接是指从一个网页指向一个目标的连接关系&#xff0c;这个目标可以是另一个网页&#…

MYSQL之创建数据库和表

创建数据库db_ck &#xff08;下面的创建是最好的创建方法&#xff0c;如果数据库存在也不会报错&#xff0c;并且指定使用utf8mb4&#xff09; show databases命令可以查看所有的数据库名&#xff0c;可以找到刚刚创建的db_ck数据库 使用该数据库时&#xff0c;发现里面没有…

[pytest] 配置

这里写目录标题 PytestInitRun3. 根据命令行选项将不同的值传递给测试函数 Report1. 向测试报告标题添加信息2. 分析测试持续时间 pytest --durations33. 增量测试 - 测试步骤--junitxml{report}.xml1. testsuite1.1 在测试套件级别添加属性节点 record_testsuite_property 2. …

Manus联创澄清:我们并未使用MCP技术

摘要 近日&#xff0c;Manus联创针对外界关于其产品可能涉及“沙盒越狱”的疑问进行了正式回应。公司明确表示并未使用Anthropic的MCP&#xff08;模型上下文协议&#xff09;技术&#xff0c;并强调MCP是一个旨在标准化应用程序与大型语言模型&#xff08;LLM&#xff09;之间…

初始化E9环境,安装Sqlserver数据库

title: 初始化E9环境,安装Sqlserver数据库 date: 2025-03-10 19:27:19 tags: E9SqlServer初始化E9环境,安装Sqlserver数据库 安装E9本地环境安装Sql server 数据库1、检查SQL Server服务是否开启2、检查SQL Server网络网络配置是否开启创建一个ecology数据库点击初始化数据库…

推荐一个基于Koin, Ktor Paging等组件的KMM Compose Multiplatform项目

Kotlin Multiplatform Mobile&#xff08;KMM&#xff09;已经从一个雄心勃勃的想法发展成为一个稳定而强大的框架&#xff0c;为开发人员提供了在多个平台上无缝共享代码的能力。通过最近的稳定版本里程碑&#xff0c;KMM已成为跨平台开发领域的改变者。 环境设置 带有Kotli…

在WSL2-Ubuntu中安装CUDA12.8、cuDNN、Anaconda、Pytorch并验证安装

#记录工作 提示&#xff1a;整个过程最好先开启系统代理&#xff0c;也可以用镜像源&#xff0c;确保有官方发布的最新特性和官方库的完整和兼容性支持。 期间下载会特别慢&#xff0c;需要在系统上先开启代理&#xff0c;然后WSL设置里打开网络模式“Mirrored”,以设置WSL自动…

Ubuntu 24.04.2 允许 root 登录桌面、 ssh 远程、允许 Ubuntu 客户机与主机拖拽传递文件

允许 root 登录桌面 修改 /etc/pam.d/gdm-autologin , /etc/pam.d/gdm-password 加 # 以注释掉 auth required pam_succeed_if.so user ! root quiet_success 允许 root 通过 ssh 登录 修改 /etc/ssh/sshd_config ... #PermitRootLogin prohibit-password PermitRootLogin …

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是&#xff0c;有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射&#xff08;ORM&#xff09;功能而闻名&#xff…