Android CameraServer Camera3StreamSplitter梳理 Camera3StreamSplitter 设计与实现文件位置:device3/Camera3StreamSplitter.h/Camera3StreamSplitter.cpp1. 功能概述Camera3StreamSplitter 是一个流分离器,管理一个输入 BufferQueue 和多个输出 BufferQueue。通过 Buffer 的 attach/detach 机制,实现"一个 buffer 入队到输入后,可以被多个输出消费者获取"的效果。核心用途:支持Camera3SharedOutputStream,实现一个 HAL 输出流同时被多个 App 消费者(如同时预览和录像)。2. 核心设计2.1 架构图Camera3OutputStream (HAL 输出) │ ▼ ┌─────────────────────────────────────────────────────────┐ │ Camera3StreamSplitter │ │ │ │ 输入端: BufferItemConsumer (mBufferItemConsumer) │ │ │ acquireBuffer → detachBuffer │ │ ▼ │ │ BufferTracker (引用计数) │ │ │ attachBuffer → 每个输出 │ │ ▼ │ │ 输出端: Surface[] (mOutputSurfaces) │ │ ├── Surface 1 (如预览) │ │ ├── Surface 2 (如录像) │ │ └── Surface N ... │ └─────────────────────────────────────────────────────────┘2.2 Buffer 流转流程HAL queueBuffer → 输入 BufferQueue │ ▼ onFrameAvailable() 回调 ├── acquireBuffer() 从输入获取 buffer ├── 创建 BufferTracker (引用计数 = 输出数量) └── 对每个输出: ├── outputBufferLocked() │ ├── setTimestamp/setCrop/setTransform │ ├── queueBuffer() 到输出 BufferQueue │ └── 引用计数不变 (已由 BufferTracker 初始化) └── 消费者获取 buffer 消费者 releaseBuffer → 输出 BufferQueue │ ▼ onBufferReleasedByOutput() 回调 ├── dequeueBuffer() 从输出取回 buffer ├── decrementBufRefCountLocked() │ └── 引用计数 -1 └── if 引用计数 == 0: └── releaseBuffer() 归还到输入 BufferQueue3. 关键数据结构3.1 BufferTrackerclassBufferTracker{spGraphicBuffermBuffer;// 持有的 GraphicBufferspFencemMergedFence;// 合并后的 release fencestd::vectorsize_tmRequestedSurfaces;// 请求该 buffer 的输出 surface IDsize_t mReferenceCount;// 引用计数 (初始 = 输出数量)};作用:跟踪每个 buffer 的引用计数,当所有输出都释放后,归还 buffer 到输入队列。3.2 OutputListenerclassOutputListener:publicSurfaceListener{wpCamera3StreamSplittermSplitter;wpSurface