高通Camera驱动(4)-- 从configure_streams到Usecase的创建与匹配
1. configure_streams到Usecase的转换机制当Android框架调用configure_streams接口后高通Camera HAL会经历从流配置到具体场景(Usecase)创建的复杂决策过程。这个过程就像餐厅的点餐系统顾客框架提交订单stream configuration厨房HAL需要根据订单内容选择对应的烹饪方案Usecase。在代码层面HALDevice::ConfigureStreams()会先销毁之前的会话如果存在然后通过CHIModuleInitialize()触发以下关键操作// 资源消耗评估示例代码 m_pResourcesUsedLock-Lock(); if (m_totalResourceBudget CostOfAnyCurrentlyOpenLogicalCameras()) { UINT32 myLogicalCamCost CostOfLogicalCamera(logicalCameraId, pStreamConfig); if (myLogicalCamCost (m_totalResourceBudget - CostOfAnyCurrentlyOpenLogicalCameras())) { CHX_LOG_ERROR(Insufficient HW resources!); result CamxResultEResource; } } m_pResourcesUsedLock-Unlock();这个阶段会进行三项核心检查流类型分析检测是否存在视频编码流(GrallocUsageHwVideoEncoder)帧率计算根据operation_mode确定目标FPS硬件资源评估计算当前配置所需的ISP、内存等资源消耗2. UsecaseSelector的决策逻辑UsecaseSelector就像个智能路由表通过分析流配置的多个维度参数来匹配最佳场景。其决策路径主要考虑以下因素2.1 多摄场景判断当检测到物理摄像头数量大于1时if ((NULL ! pCamInfo) (pCamInfo-numPhysicalCameras 1)) { if (VRDCEnable) { usecaseId UsecaseId::MultiCameraVR; // 虚拟现实双摄 } else { usecaseId UsecaseId::MultiCamera; // 普通多摄 } }2.2 特殊模式识别通过operation_mode判断特殊场景| 模式标志位 | 对应Usecase | |----------------------------|----------------------| | StreamConfigModeVideoHdr | HDR视频模式 | | StreamConfigModeQTITorch | 闪光灯模式 | | StreamConfigModeFastShutter | 极速抓拍模式 |2.3 流数量与类型组合不同流组合会触发不同策略2个流可能为ZSL预览拍照或RawJPEG3个流常见于视频预览拍照场景4个流可能涉及YUV回调Blob输出3. 典型Usecase创建流程以最常见的ZSLZero Shutter Lag场景为例其创建过程包含以下关键步骤3.1 Usecase对象实例化通过工厂模式创建具体UsecasepUsecase AdvancedCameraUsecase::Create(pLogicalCameraInfo, pStreamConfig, usecaseId);3.2 特征配置(FeatureSetup)加载XML中预定义的特性配置pAdvancedUsecase GetXMLUsecaseByName(UsecaseZSL); if (NULL pAdvancedUsecase) { CHX_LOG_ERROR(Fail to get ZSL usecase from XML!); }3.3 管道(Pipeline)构建每个Usecase包含多个处理管道例如ZSL场景典型包含ZSLPreviewRaw实时预览管道ZSLSnapshotYUVYUV数据处理管道InternalZSLYuv2JpegJPEG编码管道管道创建时会绑定具体的硬件单元result CreatePipeline(m_pPipelineToCamera[i], m_pChiUsecase-pPipelineTargetCreateDesc[i], m_sessions[sessionId].pipelines[pipelineId], pStreamConfig);4. 资源管理与优化策略4.1 批处理帧数计算对于高帧率(HFR)场景if ((StreamConfigModeConstrainedHighSpeed pStreamConfig-operation_mode) || (StreamConfigModeSuperSlowMotionFRC pStreamConfig-operation_mode)) { SearchNumBatchedFrames(logicalCameraId, pStreamConfig, m_usecaseNumBatchedFrames, m_usecaseMaxFPS, maxSessionFps); }4.2 功耗模式选择根据帧率动态调整功耗策略if (480 m_usecaseMaxFPS) { m_CurrentpowerHint PERF_LOCK_POWER_HINT_VIDEO_ENCODE_HFR; } else { m_CurrentpowerHint PERF_LOCK_POWER_HINT_VIDEO_ENCODE_HFR_480FPS; }4.3 元数据管理每个管道会注册独立的metadata clientm_metadataClients[index] m_pMetadataManager-RegisterClient( pPipeline-IsRealTime(), pPipeline-GetTagList(), pPipeline-GetTagCount(), pPipeline-GetPartialTagCount(), pPipeline-GetMetadataBufferCount() BufferQueueDepth, ChiMetadataUsage::RealtimeOutput);5. 调试与问题排查5.1 关键日志分析在logcat中关注以下标签CamX: 核心HAL层日志CHIUSECASE: Usecase选择过程CHXMETADATA: 元数据操作记录典型错误场景E CHIUSECASE: [CONFIG] chxusecaseutils.cpp:613 GetMatchingUsecase() No matching usecase for stream config! E CamX: [ERROR] camxpipeline.cpp:1356 CreateNodes() Failed to link BPS to IPE nodes5.2 常见问题处理问题1Usecase匹配失败检查stream_config的operation_mode是否合法验证物理摄像头信息是否正确注册问题2资源不足调整m_totalResourceBudget配置检查CostOfLogicalCamera()计算逻辑问题3帧率不达标确认sensor mode支持的FPS范围检查m_usecaseNumBatchedFrames计算值在实际项目中我们发现ZSL场景下如果预览分辨率设置过高容易导致ISP带宽不足。这时需要在QuadCFAMatchingUsecase()中添加分辨率校验逻辑当检测到预览分辨率超过传感器binning模式输出时自动降级到普通拍照模式。