news 2026/7/24 22:07:41

Android CameraServer Camera3Device/AidlCamera3Device梳理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()暂停/恢复线程(重配置期间)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 22:05:47

一键预览Office文件:Windows用户的效率革命

一键预览Office文件&#xff1a;Windows用户的效率革命 【免费下载链接】QuickLook.Plugin.OfficeViewer-Native View Word, Excel, and PowerPoint files with MS Office and WPS Office components. 项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook.Plugin.OfficeV…

作者头像 李华
网站建设 2026/7/24 22:03:13

EtherCAT设备描述文件

本质是伺服厂商提供的标准化 XML,是总线控制器软件识别、配置 EtherCAT 伺服驱动器的核心文件。 一、 ESI XML 表格里每一列数据,都是解析 XML 提取出来的: 厂家名 VendorName:如Shenzhen Sine Electric、Maxsine、TECO 东元 设备型号 DeviceName:如EA300E CoE Drive、EP…

作者头像 李华
网站建设 2026/7/24 22:02:08

WaveTools:鸣潮玩家的全能游戏工具箱,轻松解锁极致游戏体验

WaveTools&#xff1a;鸣潮玩家的全能游戏工具箱&#xff0c;轻松解锁极致游戏体验 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 对于热爱《鸣潮》的玩家来说&#xff0c;你是否曾为游戏帧率不稳定而烦恼…

作者头像 李华
网站建设 2026/7/24 22:01:48

2026年度日系车润滑解决方案:突破领衔全合成节能阵营

2026年6月&#xff0c;参考中国石油和化学工业联合会发布的《2025年中国润滑油行业运行监测报告》中关于车用油品性能评估的调研方法&#xff0c;以及行业研究机构发布的《2025年中国汽车用润滑油市场白皮书》显示&#xff0c;国内日系燃油车保有量长期稳居合资品牌前列&#x…

作者头像 李华
网站建设 2026/7/24 21:55:54

C++ 变量赋值

在C++编程学习中,变量赋值是最基础、最核心的语法知识,也是所有程序运算的基石。程序的本质就是对内存数据进行读取、修改和运算,而变量作为内存空间的映射载体,赋值操作就是操控内存数据的核心手段。熟练掌握变量的赋值规则、赋值方式与运算逻辑,是入门C++编程、读懂复杂…

作者头像 李华