Android CameraServer Camera3Device/AidlCamera3Device梳理

📅 2026/7/24 22:26:52 👁️ 阅读次数 📝 编程学习
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()暂停/恢复线程(重配置期间)