当前位置: 首页 > news >正文

高通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(预览+拍照)或Raw+JPEG
  • 3个流:常见于视频+预览+拍照场景
  • 4个流:可能涉及YUV回调+Blob输出

3. 典型Usecase创建流程

以最常见的ZSL(Zero Shutter Lag)场景为例,其创建过程包含以下关键步骤:

3.1 Usecase对象实例化

通过工厂模式创建具体Usecase:

pUsecase = 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场景典型包含:

  1. ZSLPreviewRaw:实时预览管道
  2. ZSLSnapshotYUV:YUV数据处理管道
  3. InternalZSLYuv2Jpeg:JPEG编码管道

管道创建时会绑定具体的硬件单元:

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 client:

m_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 nodes

5.2 常见问题处理

问题1:Usecase匹配失败

  • 检查stream_config的operation_mode是否合法
  • 验证物理摄像头信息是否正确注册

问题2:资源不足

  • 调整m_totalResourceBudget配置
  • 检查CostOfLogicalCamera()计算逻辑

问题3:帧率不达标

  • 确认sensor mode支持的FPS范围
  • 检查m_usecaseNumBatchedFrames计算值

在实际项目中,我们发现ZSL场景下如果预览分辨率设置过高,容易导致ISP带宽不足。这时需要在QuadCFAMatchingUsecase()中添加分辨率校验逻辑,当检测到预览分辨率超过传感器binning模式输出时,自动降级到普通拍照模式。

http://www.jsqmd.com/news/661893/

相关文章:

  • 余杭永鸿再生资源:杭州市废旧金属回收推荐哪几家 - LYL仔仔
  • STM32H743实战(三)-- 时钟树配置与性能调优实战
  • 5款AI工具大测评,助你轻松实现低查重的AI教材生成梦想!
  • 别再死记硬背了!用H模型和Π模型,手把手教你搞定三极管高频电路设计
  • 从光场相机到手机摄影:聊聊那些让你‘先拍照后对焦’的黑科技是怎么实现的
  • 漂浮式半潜风机(二)环境荷载:从理论谱分析到工程实践的关键考量
  • 基于MAVROS的Offboard模式实现无人机精准悬停控制
  • OP-TEE安全存储深度解析(一):密钥体系与文件加密流程
  • 从CTF题[鹤城杯 2021]EasyP剖析PHP安全:$_SERVER变量、正则绕过与basename的攻防实战
  • 2026天津协议离婚vs诉讼离婚律所测评!快速办结+权益保障指南 - 速递信息
  • 别再手动敲AT指令了!用正点原子官方软件搞定以太网转串口模块配置(附静态IP设置避坑点)
  • 如何在Chrome浏览器中实现一键画中画视频播放:终极免费扩展指南
  • Python中的常用函数使用及说明
  • 神经网络遗传算法函数极值寻优(非线性函数极值)
  • Attention U-Net:让模型学会“看”哪里
  • 从零开始构建SaaS多租户架构:SpringBoot + MyBatis-Plus动态数据源实战
  • 用Java Stream一行代码搞定彩票随机选号(双色球/大乐透)
  • Mysql--基础知识点--102--redo log内容
  • Kubernetes资源配额实战:LimitRange配置指南
  • PINN实战:从零构建一个偏微分方程求解器
  • 海洋CMS资源接口实战:XML数据格式与API调用详解
  • STM32 FOC电机库PID调参避坑指南:为什么你的定点参数调不好?
  • 邢台脱发白发理疗养发馆哪家好?黑奥秘参与行业标准制定,专业有据可依 - 美业信息观察
  • AMD平台ESXI 7.0实战:避坑部署Win11与TrueNAS虚拟化存储方案
  • Flask-Admin进阶指南:从基础增删改查到自定义视图和权限控制的完整配置流程
  • 从入门到实战:在UniApp中高效集成uCharts图表(组件与原生双模式详解)
  • 大模型应用开发实战(19)——Andrej Karpathy Skills 为什么突然火了?一份 CLAUDE.md,把 Claude Code 从“会写”拉回“会做事”
  • 2026年团鱼脚鱼甲鱼养殖基地推荐:中华鳖老鳖水鱼专业供应与回收服务选型指南 - 品牌推荐官
  • ContextMenuManager:Windows右键菜单终极解决方案,3个核心功能重塑你的操作效率
  • 别再傻傻地直接扫了!手把手教你用wafw00f在Windows和Kali上优雅地“试探”网站防火墙