Android CameraServer CameraDeviceClient梳理

📅 2026/7/24 21:53:11
Android CameraServer CameraDeviceClient梳理
CameraDeviceClient 设计与实现文件位置:api2/CameraDeviceClient.h/.cpp,common/Camera2ClientBase.h/.cpp,common/CameraDeviceBase.h1. 功能概述CameraDeviceClient 是ICameraDeviceUserAIDL 接口的服务端 Binder 实现,是 Android 应用 (Camera2 API) 与底层 Camera HAL 设备 (Camera3Device) 之间的核心桥梁。三大职责:请求路径:App → validate → map surfaces → mDevice-captureList/setStreamingRequestList结果路径:HAL → Camera3Device → FrameProcessorBase → onResultAvailable → FMQ → mRemoteCallback-onResultReceived通知路径:HAL → Camera3Device → notifyError/notifyShutter/notifyIdle → mRemoteCallback2. 类层次结构RefBase +-- CameraService::BasicClient [CameraService.h:356] | 权限/AppOps/UID/PID/AudioRestriction 管理 | +-- CameraDeviceClientBase [CameraDeviceClient.h:52] | | 继承 BasicClient + BnCameraDeviceUser (AIDL stub) | | typedef ICameraDeviceCallbacks as TCamCallbacks | | 持有 mRemoteCallback | | | +-- Camera2ClientBaseCameraDeviceClientBase [Camera2ClientBase.h:35] | | 模板类,同时继承 NotificationListener | | 持有 mDevice, mBinderSerializationLock | | | +-- CameraDeviceClient [CameraDeviceClient.h:80] | 同时继承 FrameProcessorBase::FilteredListener | 具体 API2 客户端实现AIDL 接口链:ICameraDeviceUser←BnCameraDeviceUser←CameraDeviceClientBase←CameraDeviceClient实现的接口:ICameraDeviceUser(AIDL) — App 调用的 Binder 接口NotificationListener— HAL 回调接口 (notifyError/notifyShutter/notifyIdle 等)FrameProcessorBase::FilteredListener— 帧结果监听 (onResultAvailable)3. CameraDeviceClient 成员变量3.1 核心成员成员类型含义mFrameProcessorspFrameProcessorBase后台线程,从 Camera3Device dequeue 结果并分发mDevicespCameraDeviceBaseHAL 设备抽象 (HidlCamera3Device/AidlCamera3Device/AidlCamera3SharedDevice)mRemoteCallbackspICameraDeviceCallbacksApp 端 Binder 回调mResultMetadataQueueunique_ptrMetadataQueueFMQ 零拷贝结果 metadata 队列mProviderManagerspCameraProviderManagerHAL provider 管理器引用3.2 流管理成员类型含义mStreamMapKeyedVectorSurfaceKey, StreamSurfaceIdIGBP binder / surface unique ID → (streamId, surfaceId)mConfiguredOutputsKeyedVectorint32_t, OutputConfigurationstream ID → OutputConfigurationmStreamInfoMapunordered_mapint32_t, OutputStreamInfostream ID → 输出流信息mDeferredStreamsVectorint32_t延迟 surface 的 stream ID 列表mInputStreamInputStreamConfiguration输入流状态: {configured, width, height, format, id}mHighResolutionCameraIdToStreamIdSetunordered_mapstring, unordered_setint高分辨率相机 → stream ID 集合mHighResolutionSensorsunordered_setstring支持超高分辨率的相机 ID 集合3.3 请求管理成员类型含义mStreamingRequestIdint32_t当前 repeating request ID (REQUEST_ID_NONE=-1 表示无)mStreamingRequestIdLockMutex保护 mStreamingRequestId 和 mSharedStreamingRequestmRequestIdCounterint32_t单调递增 request ID 计数器mStreamingRequestLastFrameNumberint64_tshared 模式取消 streaming 时的最后帧号3.4 Shared 模式成员类型含义mSharedStreamingRequestpairint32_t, int32_t(device-side reqId, client-side reqId)mSharedRequestMapmapint32_t, int32_tdevice-side capture reqId → client-side reqIdmSharedStreamingRequestLastFrameNumberint64_t最后帧号3.5 Composite Stream成员类型含义mCompositeLockMutex保护 composite stream mapsmCompositeStreamMap