当前位置: 首页 > news >正文

Android CameraServer Camera3Device/AidlCamera3Device梳理

Camera3Device / AidlCamera3Device 设计与实现

文件位置:

  • common/CameraDeviceBase.h— 纯虚接口基类
  • device3/Camera3Device.h/Camera3Device.cpp— 核心共享逻辑 (~6000行)
  • device3/aidl/AidlCamera3Device.h/AidlCamera3Device.cpp— AIDL HAL 子类
  • device3/hidl/HidlCamera3Device.h/HidlCamera3Device.cpp— HIDL HAL 子类

1. 类层次结构

FrameProducer (虚基类) -> CameraDeviceBase (纯虚接口, common/CameraDeviceBase.h) -> Camera3Device (核心共享逻辑, device3/Camera3Device.h) -> AidlCamera3Device (AIDL HAL 子类, device3/aidl/) -> HidlCamera3Device (HIDL HAL 子类, device3/hidl/)

Camera3Device 实现的 mixin 接口:

  • camera3::SetErrorInterface— 错误状态转换
  • camera3::InflightRequestUpdateInterface— 在途请求簿记
  • camera3::RequestBufferInterface— HAL buffer 请求序列化
  • camera3::FlushBufferInterface— buffer flush 操作
  • AttributionAndPermissionUtilsEncapsulator— 权限/身份工具

AIDL vs HIDL 回调差异:

  • HidlCamera3Device直接继承ICameraDeviceCallback(自身就是 HIDL binder 对象)
  • AidlCamera3Device使用独立内部类AidlCameraDeviceCallbacksstd::shared_ptr管理),因为 NDK AIDL 后端不支持sp<>

2. 核心成员变量

2.1 Camera3Device

变量类型说明
mInterfaceLockMutex序列化公共 API(输入/配置端),必须在 mLock 之前获取
mLockMutex内部状态主锁
mIdconst std::string相机设备 ID
mStatusenum Status设备状态机值
mStatusChangedCondition状态变更条件变量
mRecentStatusUpdatesVector<StatusInfo>最近状态变更历史,用于 waitUntilStateThenRelock
mErrorCausestd::stringSTATUS_ERROR 时的错误信息
mOutputStreamscamera3::StreamSet所有活跃输出流集合
mInputStreamsp<Camera3Stream>单个输入流(如有)
mInterfacesp<HalInterface>抽象 HAL 接口指针(多态:AidlHalInterface 或 HidlHalInterface)
mDeviceInfoCameraMetadata静态相机特性 metadata
mPhysicalDeviceInfoMapunordered_map<string, CameraMetadata>逻辑多相机的每个物理相机特性
mRequestThreadsp<RequestThread>请求下发线程
mStatusTrackersp<StatusTracker>空闲检测跟踪器
mBufferManagersp<Camera3BufferManager>GraphicBuffer 管理器
mPreparerThreadsp<PreparerThread>buffer 预分配后台线程
mInFlightMapInFlightRequestMap在途请求跟踪映射(受 mInFlightLock 保护)
mResultQueuestd::list<CaptureResult>已完成捕获结果队列
mListenerwp<NotificationListener>上游通知监听器(CameraDeviceClient)
mUseHalBufManagerboolHAL 是否使用自身 buffer 管理
mRequestBufferSMRequestBufferStateMachine控制 HAL 何时可请求 buffer 的状态机
mDistortionMappersunordered_map<string, DistortionMapper>每相机畸变矫正映射器
mZoomRatioMappersunordered_map<string, ZoomRatioMapper>每相机变焦比映射器
mRotateAndCropMappersunordered_map<string, RotateAndCropMapper>每相机旋转裁剪映射器
mInjectionMethodssp<Camera3DeviceInjectionMethods>注入相机支持
mCameraServiceWatchdogsp<CameraServiceWatchdog>检测 HAL 挂起的看门狗线程

2.2 AidlCamera3Device 额外成员

变量类型说明
mResultMetadataQueueunique_ptr<AidlResultMetadataQueue>接收 HAL 捕获结果 metadata 的 FMQ
mCallbacksshared_ptr<AidlCameraDeviceCallbacks>注册到 HAL 的 AIDL 回调 binder 对象
mBatchSizeLimitEnabledbool高速配置的 batch_size_max 是否生效
mSensorReadoutTimestampSupportedboolHAL 是否支持传感器读出时间戳

3. 核心内部类

3.1 HalInterface — HAL 通信策略接口

位置:Camera3Device.h:486-646

抽象内部类,定义 HAL 通信契约。继承Camera3StreamBufferFreedListenerBufferRecordsInterface

关键纯虚方法:

方法说明
getTransportType()返回 AIDL 或 HIDL
configureStreams()配置 HAL 流
processBatchCaptureRequests()批量下发捕获请求到 HAL
flush()/close()生命周期管理
constructDefaultRequestSettings()获取默认请求模板
signalPipelineDrain()通知 HAL 排空管线
isReconfigurationRequired()检查会话参数是否需要重新配置

具体子类:

子类位置说明
AidlHalInterfaceAidlCamera3Device.h:80-164封装 ICameraDeviceSession + AidlRequestMetadataQueue
HidlHalInterfaceHidlCamera3Device.h:99-177封装版本化 HIDL session 对象 (3.2-3.7)

3.2 RequestThread — 请求下发线程

位置:Camera3Device.h:1007-1360

继承Thread,从队列取出请求批量下发到 HAL。

关键成员:

成员类型说明
mParentwp<Camera3Device>拥有设备的弱引用
mInterfacesp<HalInterface>HAL 接口
mRequestQueueRequestList一次性请求队列
mRepeatingRequestsRequestListrepeating 请求队列
mNextRequestsVector<NextRequest>当前正在准备/提交的批次
mFrameNumberuint32_t单调递增帧计数器
mTriggerMapTriggerMap排队的触发器(AF、AE 预捕获)
mLatestSessionParamsCameraMetadata跟踪会话参数用于重配置检测
mStatusIdintStatusTracker 注册的组件 ID

关键方法:

方法说明
threadLoop()主循环:waitForNextRequestBatch → prepareHalRequests → sendRequestsBatch
setRepeatingRequests()设置 repeating 请求
queueRequestList()一次性请求入队
flush()flush 所有待处理请求
queueTrigger()排队触发器注入下一个请求
setPaused()暂停/恢复线程(重配置期间)
http://www.jsqmd.com/news/1256991/

相关文章:

  • Flink 术语通关手册:彻底搞懂 Flink 所有名词
  • Umi-OCR:如何免费离线解决PDF文字无法复制的终极指南
  • AIGC不是风口,是操作系统级变革:Gartner预测2025年73%企业将重构IT栈,你准备好了吗?
  • Lifecycle 原理
  • 2026平湖口碑好的黄金回收商家推荐|十年老店实测,本地市民信赖之选 - 微城市网络
  • 如何在浏览器中实现终极3D模型查看?Online3DViewer完整免费指南
  • PyTorch强化学习实战——基于策略梯度法解决Pong环境
  • FigmaCN终极指南:3分钟让Figma界面全中文化,设计师效率提升50%
  • PM有效沟通与主动汇报-打造靠谱标签
  • 【Linux】七.进程概念篇一《操作系统核心概念一篇通:冯诺依曼体系、OS 设计与进程管理》
  • QMK Toolbox:如何5分钟完成机械键盘固件刷写?面向新手的完整教程
  • VLA-世界模型-TVA:具身智能的递归改进引擎(2)
  • 《天道》观后感——以悟道之心,破执念之困
  • 宁波装修装饰GEO服务商代理加盟选型哪家靠谱?2026年宁波GEO代理服务商本地推荐与合作路径解析 - 小随科技
  • 如何解决Android Studio语言障碍:中文语言包安装与配置完全指南
  • Umi-OCR:免费开源的离线文字识别完整指南,5分钟快速上手终极方案
  • Out-of-Distribution Detection with Positive and Negative Prompt Supervision Using Large Language ...
  • FigmaToCode:智能设计到代码的自动化转换引擎
  • 济南壹软网络科技有限公司加入山东省软件行业协会,推动企业规范化发展再上新台阶 - 壹软科技
  • GetQzonehistory终极指南:3步找回你丢失的QQ空间青春记忆
  • 2026平湖黄金回收正规商家推荐|实体门店实测,全程透明无套路 - 微城市网络
  • Android 7系统日志(八)定制安卓的日志系统
  • Claude Code 配置完全指南(一):.claude 目录结构全景解析
  • 3分钟掌握微信单向好友检测:WechatRealFriends让社交关系一目了然 [特殊字符]
  • KVM主题:qcow2快照链与写时复制原理深度解析
  • QiLinkOS:研发人员的专利避坑与审查答复助手(SDKV0.1)
  • Large Language Models and 3D Vision for Intelligent Robotic Perception and Autonomy
  • BetterNCM安装器终极指南:3分钟搞定网易云插件自动化部署
  • 我们在 Workbuddy 做了个 Skill,10 分钟摸透一个行业!
  • java第二天