Android15 Camera框架中的StatusTracker

打印 上一主题 下一主题

主题 994|帖子 994|积分 2982


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网络组件状态转换(包罗组件间中心状态转换)
  1.          sp<Camera3Device> parent;
  2. 198      {
  3. 199          Mutex::Autolock pl(mPendingLock);
  4. 200          Mutex::Autolock l(mLock);
  5. 201  
  6. 202          // Collect all pending state updates and see if the device
  7. 203          // collectively transitions between idle and active for each one
  8. 204  
  9.              //获取被跟踪组件的状态,优先获取到active状态的
  10.              //如果所有的组件都是idle状态,那么检查fence时间戳确定xx状态
  11. 205          // First pass for changed components or fence completions
  12. 206          ComponentState prevState = getDeviceStateLocked();
  13.              //疑问:组件状态和mDeviceState怎么达到一致?
  14.              //这里收集状态的切换, 有两种可能:active->idle, idle->active
  15. 207          if (prevState != mDeviceState) {
  16. 208              // Only collect changes to overall device state
  17. 209              mStateTransitions.add(prevState);
  18. 210          }
  19. 211          // For each pending component state update, check if we've transitioned
  20. 212          // to a new overall device state
  21. 213          for (size_t i = 0; i < mPendingChangeQueue.size(); i++) {
  22.                  //一个状态转换动作
  23. 214              const StateChange &newState = mPendingChangeQueue[i];
  24.                  //这个状态转换动作是哪个组件来做
  25. 215              ssize_t idx = mStates.indexOfKey(newState.id);
  26. 216              // Ignore notices for unknown components
  27. 217              if (idx >= 0) {
  28.                      //更新这个组件的状态
  29. 218                  // Update single component state
  30. 219                  mStates.replaceValueAt(idx, newState.state);
  31.                      //这是什么意思?
  32. 220                  mIdleFence = Fence::merge(String8("idleFence"),
  33. 221                          mIdleFence, newState.fence);
  34.                      //检查被跟踪的组件状态
  35.                      //收集状态切换
  36. 222                  // .. and see if overall device state has changed
  37. 223                  ComponentState newState = getDeviceStateLocked();
  38. 224                  if (newState != prevState) {
  39. 225                      mStateTransitions.add(newState);
  40. 226                  }
  41. 227                  prevState = newState;
  42. 228              }
  43. 229          }
  44.              //一次状态切换收集后,清空mPendingChangeQueue以进行下一次状态收集。
  45. 230          mPendingChangeQueue.clear();
  46. 231          mComponentsChanged = false;
  47. 232  
  48. 233          // Store final state after all pending state changes are done with
  49. 234         
  50.              //一次状态收集后,得到StatusTracker的状态
  51. 235          mDeviceState = prevState;
  52. 236          parent = mParent.promote();
  53. 237      }
复制代码
StatusTracker将网络的状态转换关照给parent (Camera3Device)
  1. if (mStateTransitions.size() > 0 && parent.get()) {
  2.     for (size_t i = 0; i < mStateTransitions.size(); i++) {
  3.         bool idle = (mStateTransitions[i] == IDLE);
  4.         ALOGV("Camera device is now %s", idle ? "idle" : "active");
  5.         parent->notifyStatus(idle);
  6.     }
  7. }
  8. mStateTransitions.clear();
复制代码

StatusTracker代码实现中的几个点

  1. //StatusTracker工作线程退出需要Camera3Device主动触发
  2. //但是StatusTracker本质是Android Thread, 退出有一定的延时性。
  3. //退出相关代码:
  4. void StatusTracker::requestExit()
  5. {
  6.     //First mark thread dead.
  7.     Thread::requestExit();
  8.     //Then exit any waits
  9.     mPendingChangeSignal.signal();
  10.     mFlushCondition.signal();
  11. }
  12. bool StatusTracker::threadLoop()
  13. {
  14.     {
  15.         Mutex::Autolock pl(mPendinglock);
  16.         while (mPendingChangeQueueSize() == 0 && !mComponentsChanged) {
  17.             //等待pending change处理信号
  18.             res = mPendingChangeSignal.waitRelative(mPendingLock, kWaitDuration);
  19.             
  20.             //线程退出
  21.             if (exitPending()) return false;
  22.             if (res != OK) {
  23.                 if (res != TIMED_OUT) {
  24.                     ALOGE("%s: Error waiting on state changes: %s (%d)",
  25.                         __FUNCTION__, strerror(-res), res);
  26.                 }
  27.                 //TIMED_OUT is expected
  28.                 break;
  29.             }
  30.         }
  31.     }
  32.     ...
  33. }
复制代码
Camera3中的StatusTracker



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表