公司动态
Android CameraServer CompositeStream相关梳理
CompositeStream 设计与实现文件位置:api2/CompositeStream.h/.cpp,api2/DepthCompositeStream.h/.cpp,api2/HeicCompositeStream.h/.cpp,api2/JpegRCompositeStream.h/.cpp1. 功能概述CompositeStream 解决的核心问题:App 看到一条流,但 HAL 需要多条流来产生最终输出。CompositeStream 对 App 表现为单条 public stream,内部创建多条 HAL device stream,将它们的输出组合成最终结果。App 不知道内部流的存在。三个具体实现:DepthCompositeStream— JPEG + Depth → Dynamic Depth Photo (DDP)HeicCompositeStream— YUV + APP Segments → HEIC/HEIF 容器 (MediaCodec + MediaMuxer)JpegRCompositeStream— P010 (+ optional JPEG) → JPEG/R UltraHDR2. 类层次结构Camera3StreamBufferListener (interface: onBufferReleased, onBufferRequestForFrameNumber) | CompositeStream (abstract base) | +-- DepthCompositeStream (+ Thread, + CpuConsumer::FrameAvailableListener) +-- HeicCompositeStream (+ Thread, + CpuConsumer::FrameAvailableListener) +-- JpegRCompositeStream (+ Thread, + CpuConsumer::FrameAvailableListener)所有三个子类同时继承Thread(提供threadLoop()) 和CpuConsumer::FrameAvailableListener(接收 CPU 可访问 buffer 通知)。3. CompositeStream (基类)文件:CompositeStream.h/CompositeStream.cpp3.1 核心成员变量成员类型含义mDevicewpCameraDeviceBasecamera 设备弱引用mStatusTrackerwpStatusTracker活跃/空闲状态跟踪mRemoteCallbackwpICameraDeviceCallbacks错误通知回调mMutexMutex保护所有可变状态mInputReadyConditionCondition通知处理线程有新输入mNumPartialResultsint32_t完整结果需要的 partial result 数mErrorStatebool错误状态,停止所有处理mPendingCaptureResultsunordered_mapuint64_t, CameraMetadataframeNumber → 累积的 partial resultsmCaptureResultsunordered_mapint64_t, tupleint64_t, CameraMetadatatimestamp → (frameNumber, 完整结果)mFrameNumberMapunordered_mapint64_t, int64_tframeNumber → timestamp (来自 buffer release)mErrorFrameNumberssetint64_t遇到 buffer 错误的帧号mRequestTimeMapunordered_mapint64_t, nsecs_tframeNumber → 请求时间 (延迟跟踪)3.2 纯虚接口方法含义createInternalStreams()创建并注册所有 HAL device 流deleteInternalStreams()拆除内部流configureStream()完成流配置 (连接输出 surface, 启动处理线程)insertGbp(outSurfaceMap, outputStreamIds, currentStreamId)将内部流 ID 插入捕获请求insertCompositeStreamIds(compositeStreamIds)列出所有内部流 IDgetStreamId()返回 “public” 流 IDgetStreamStats(streamStats)返回捕获统计onStreamBufferError(resultExtras)处理内部流 buffer 错误 (返回 true 吸收)onResultError(resultExtras)处理结果错误onShutter()默认空; HeicCompositeStream override3.3 核心方法createStream():验证参数 (拒绝 deferred consumers、streamSetId、shared surfaces、multi-res),委托给createInternalStreams()。deleteStream():清空所有 pending result/error maps,委托给deleteInternalStreams()。onBufferRequestForFrameNumber():HAL 请求 buffer 时调用。如果 streamId 匹配且无错误状态,在mPendingCaptureResults创建空条目,记录请求时间。onBufferReleased():HAL 释放 buffer 时调用。记录 frameNumber → timestamp 映射,signalmInputReadyCondition。onResultAvailable():累积 partial results。所有 partial 到齐后 (partialResultCount = mNumPartialResults),提取ANDROID_SENSOR_TIMESTAMP,存入mCaptureResults[timestamp],signal