Android CameraServer Camera3Device/AidlCamera3Device梳理
📅 2026/7/24 22:26:52
👁️ 阅读次数
📝 编程学习
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使用独立内部类
AidlCameraDeviceCallbacks(std::shared_ptr管理),因为 NDK AIDL 后端不支持sp<>
2. 核心成员变量
2.1 Camera3Device
| 变量 | 类型 | 说明 |
|---|---|---|
mInterfaceLock | Mutex | 序列化公共 API(输入/配置端),必须在 mLock 之前获取 |
mLock | Mutex | 内部状态主锁 |
mId | const std::string | 相机设备 ID |
mStatus | enum Status | 设备状态机值 |
mStatusChanged | Condition | 状态变更条件变量 |
mRecentStatusUpdates | Vector<StatusInfo> | 最近状态变更历史,用于 waitUntilStateThenRelock |
mErrorCause | std::string | STATUS_ERROR 时的错误信息 |
mOutputStreams | camera3::StreamSet | 所有活跃输出流集合 |
mInputStream | sp<Camera3Stream> | 单个输入流(如有) |
mInterface | sp<HalInterface> | 抽象 HAL 接口指针(多态:AidlHalInterface 或 HidlHalInterface) |
mDeviceInfo | CameraMetadata | 静态相机特性 metadata |
mPhysicalDeviceInfoMap | unordered_map<string, CameraMetadata> | 逻辑多相机的每个物理相机特性 |
mRequestThread | sp<RequestThread> | 请求下发线程 |
mStatusTracker | sp<StatusTracker> | 空闲检测跟踪器 |
mBufferManager | sp<Camera3BufferManager> | GraphicBuffer 管理器 |
mPreparerThread | sp<PreparerThread> | buffer 预分配后台线程 |
mInFlightMap | InFlightRequestMap | 在途请求跟踪映射(受 mInFlightLock 保护) |
mResultQueue | std::list<CaptureResult> | 已完成捕获结果队列 |
mListener | wp<NotificationListener> | 上游通知监听器(CameraDeviceClient) |
mUseHalBufManager | bool | HAL 是否使用自身 buffer 管理 |
mRequestBufferSM | RequestBufferStateMachine | 控制 HAL 何时可请求 buffer 的状态机 |
mDistortionMappers | unordered_map<string, DistortionMapper> | 每相机畸变矫正映射器 |
mZoomRatioMappers | unordered_map<string, ZoomRatioMapper> | 每相机变焦比映射器 |
mRotateAndCropMappers | unordered_map<string, RotateAndCropMapper> | 每相机旋转裁剪映射器 |
mInjectionMethods | sp<Camera3DeviceInjectionMethods> | 注入相机支持 |
mCameraServiceWatchdog | sp<CameraServiceWatchdog> | 检测 HAL 挂起的看门狗线程 |
2.2 AidlCamera3Device 额外成员
| 变量 | 类型 | 说明 |
|---|---|---|
mResultMetadataQueue | unique_ptr<AidlResultMetadataQueue> | 接收 HAL 捕获结果 metadata 的 FMQ |
mCallbacks | shared_ptr<AidlCameraDeviceCallbacks> | 注册到 HAL 的 AIDL 回调 binder 对象 |
mBatchSizeLimitEnabled | bool | 高速配置的 batch_size_max 是否生效 |
mSensorReadoutTimestampSupported | bool | HAL 是否支持传感器读出时间戳 |
3. 核心内部类
3.1 HalInterface — HAL 通信策略接口
位置:Camera3Device.h:486-646
抽象内部类,定义 HAL 通信契约。继承Camera3StreamBufferFreedListener和BufferRecordsInterface。
关键纯虚方法:
| 方法 | 说明 |
|---|---|
getTransportType() | 返回 AIDL 或 HIDL |
configureStreams() | 配置 HAL 流 |
processBatchCaptureRequests() | 批量下发捕获请求到 HAL |
flush()/close() | 生命周期管理 |
constructDefaultRequestSettings() | 获取默认请求模板 |
signalPipelineDrain() | 通知 HAL 排空管线 |
isReconfigurationRequired() | 检查会话参数是否需要重新配置 |
具体子类:
| 子类 | 位置 | 说明 |
|---|---|---|
AidlHalInterface | AidlCamera3Device.h:80-164 | 封装 ICameraDeviceSession + AidlRequestMetadataQueue |
HidlHalInterface | HidlCamera3Device.h:99-177 | 封装版本化 HIDL session 对象 (3.2-3.7) |
3.2 RequestThread — 请求下发线程
位置:Camera3Device.h:1007-1360
继承Thread,从队列取出请求批量下发到 HAL。
关键成员:
| 成员 | 类型 | 说明 |
|---|---|---|
mParent | wp<Camera3Device> | 拥有设备的弱引用 |
mInterface | sp<HalInterface> | HAL 接口 |
mRequestQueue | RequestList | 一次性请求队列 |
mRepeatingRequests | RequestList | repeating 请求队列 |
mNextRequests | Vector<NextRequest> | 当前正在准备/提交的批次 |
mFrameNumber | uint32_t | 单调递增帧计数器 |
mTriggerMap | TriggerMap | 排队的触发器(AF、AE 预捕获) |
mLatestSessionParams | CameraMetadata | 跟踪会话参数用于重配置检测 |
mStatusId | int | StatusTracker 注册的组件 ID |
关键方法:
| 方法 | 说明 |
|---|---|
threadLoop() | 主循环:waitForNextRequestBatch → prepareHalRequests → sendRequestsBatch |
setRepeatingRequests() | 设置 repeating 请求 |
queueRequestList() | 一次性请求入队 |
flush() | flush 所有待处理请求 |
queueTrigger() | 排队触发器注入下一个请求 |
setPaused() | 暂停/恢复线程(重配置期间) |
编程学习
技术分享
实战经验