StreamConfigurationMap 实现逻辑与解析过程详解:相机流能力的声明、匹配与验证机制全景

关键词:
StreamConfigurationMap、CameraCharacteristics、OutputFormat、InputFormat、Size 配置、帧率范围、流兼容性、配置失败调试

摘要:
StreamConfigurationMap 是 Android 相机框架中的关键数据结构之一,承载了 HAL 层报告的所有可支持流组合,包括输出格式、输入重处理格式、尺寸列表、最低帧率等信息。在开发中,无论是构建 ImageReader、配置 CaptureSession,还是校验目标尺寸是否支持,均离不开对其的正确解析与使用。本文将基于 AOSP 最新版本源码与平台实践,系统拆解 StreamConfigurationMap 的构建路径、接口实现、内部数据组织与典型问题处理策略,帮助开发者深入理解背后的匹配逻辑与流能力限制。


目录

一、系统定位:StreamConfigurationMap 的作用与关联模块概览
二、能力声明入口:HAL 如何填充 stream 配置能力并传递给 framework
三、构建路径追踪:从 HAL Metadata 到 Java 层 Map 对象的封装过程
四、关键接口详解:getOutputSizes / getInputFormats / getValidOutputFormatsForInput 行为分析
五、内部数据结构解析:Size 配置 × Format 映射 × Dynamic Range 支持方式
六、典型问题场景分析:尺寸不支持、流类型冲突、format 配置失败案例
七、性能与兼容性建议:构建 Session 前的能力预判与流选型策略
八、工程调试技巧:如何通过 dumpsys + HAL log + camera-profile.xml 还原 stream 匹配流程


一、系统定位:StreamConfigurationMap 的作用与关联模块概览

在 Android Camera 框架中,StreamConfigurationMapCameraCharacteristics 返回结构的一部分,主要承载与流配置能力相关的声明信息,其本质是 HAL 层通过 metadata 报告的一组支持的输入/输出格式、尺寸、帧率范围与重处理能力的集合,它是 Camera 流设计与 Session 创建过程的核心决策依据。

整个框架中与 StreamConfigurationMap 直接关联的关键组件包括:

  1. CameraMetadata(native 层)

    • 定义并填充 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONSANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS 等字段。
  2. CameraCharacteristics(Java 层)

    • 从 HAL metadata 映射到 Java 对象,由 CameraManager#getCameraCharacteristics() 返回。
  3. CameraDevice / CaptureSession 配置流程

    • 应用层通过 getOutputSizes() 等接口判断目标流是否受支持,并据此创建 ImageReaderSurfaceTexture 等输出对象,作为 Session 配置输入。
  4. StreamConfigurationMap(Java 封装类)

    • 封装各类接口能力,包括:

      • getOutputSizes(int format)
      • getOutputMinFrameDuration()
      • isOutputSupportedFor(Class<?> klass)
      • getValidOutputFormatsForInput()
  5. CameraCaptureSession 设备协商路径

    • session 构建前,CameraFramework 会根据 StreamConfigurationMap 中的内容对输入流和输出流组合进行合法性校验,非法配置会直接抛出 IllegalArgumentException

总结来说,StreamConfigurationMap 处于 framework 与 HAL 能力协商的关键中间层,是连接App × Framework × HAL的标准能力桥梁,其合理性直接决定了拍照、录像、预览、AI流等功能是否能够顺利启用。


二、能力声明入口:HAL 如何填充 stream 配置能力并传递给 framework

HAL 通过向系统上报静态 metadata 的方式,向上层暴露 Camera 的流配置能力。其核心字段包括:

1. ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS

该字段是最关键的配置列表,格式如下:

typedef struct camera3_stream_configuration {int32_t format;         // 输出或输入格式,如 YUV_420_888、JPEG、RAW_SENSORuint32_t width;         // 分辨率宽度uint32_t height;        // 分辨率高度uint32_t isInput;       // 0 表示输出,1 表示输入(如 reprocessing)
} camera3_stream_configuration_t;

HAL 层会在 get_camera_metadata() 时,将上述配置封装成一组 CameraMetadataEntry 条目,以静态 metadata 形式报告。

举例:

const int32_t available_stream_config[] = {HAL_PIXEL_FORMAT_YCbCr_420_888, 1920, 1080, 0,HAL_PIXEL_FORMAT_YCbCr_420_888, 1280, 720, 0,HAL_PIXEL_FORMAT_BLOB,          4032, 3024, 0,HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91659.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91659.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91659.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于“PromptPilot” 之3 -Prompt构造器核心专项能力:任务调度

本篇问题Q20. 以上设计是“原始制造商”的典型范式。在三个不同理论层级&#xff08;Prompt 构造进程的三个子进程&#xff08;线程&#xff09;&#xff09;分别适合三种不同的取向&#xff1a; 面向目标、面向结果和面向过程。不同取向将采取不同的策略 和不同的 监控方式&am…

Solana: 链上开发入门,用 Anchor 和 Rust 构建第一个程序

大家好&#xff0c;如果大家对 Solana 开发充满好奇&#xff0c;但又对 Rust 语言感到陌生&#xff0c;那么大家来对地方了。很多人在探索 Solana 这条高性能公链时&#xff0c;遇到的第一个门槛就是其原生开发语言——Rust。Rust 以其高性能和内存安全著称&#xff0c;但学习曲…

node.js之Koa框架

Koa框架介绍Koa 是一个新的 web 框架&#xff0c;由 Express 原班人马打造&#xff0c;致力于成为一个更小、更富有表现力、更健壮的 Web 框架。Koa 解决了 Express 存在的一些问题&#xff0c;例如&#xff1a;中间件嵌套回调&#xff08;callback hell&#xff09;错误处理不…

C/C++离线环境安装(VSCode + MinGW)

因为工作需要部署离线C环境&#xff0c;网上有许多大佬分享了不错的教程&#xff0c;总结一篇完整教程自用&#xff0c;使用VSCode MinGW感谢一、安装准备二、软件安装1.安装MinGW2.安装VSCode及插件三、测试环境1.创建工程文件夹2.创建cpp文件总结感谢 本教程参考了以下教程…

如何创建一个飞书应用获取自己的飞书AppID和AppSecret?

这篇文章是接下来要开发「监控 X&#xff08;原Twitter&#xff09;博主账号最新推文」 自动化工作流的先导文章&#xff0c;由于内容相对独立&#xff0c;也可用于飞书应用的其他场景&#xff0c;故单独发出来&#xff0c;方便查阅。 监控X平台指定博主最新发文&#xff0c;需…

Prompt工程记录

Prompt基本建议&#xff1a;1.在查询中包含详细信息以获得更相关的答案总结会议笔记:先将会议笔记总结为一段&#xff0c;然后写一份演讲者的打分表&#xff0c;列出他们的每个要点&#xff1b;最后列出发言者建议的下一步行动或者行动项目&#xff08;如果有的话&#xff09;2…

CTE公用表表达式的可读性与性能优化

一、可读性优化CTE通过WITH子句定义临时命名结果集&#xff0c;将复杂查询分解为逻辑独立的模块&#xff0c;显著提升代码清晰度与可维护性‌&#xff1a;‌解构嵌套查询‌&#xff1a;将多层嵌套的子查询扁平化&#xff0c;例如传统嵌套统计订单的查询可重构为分步CTE&#xf…

8.1.2 TiDB存储引擎的原理

TiDB 简介 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据 库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布 式数据库产品&#xff0c;具备水平扩容或者缩容、金融级高可用、实时 …

PTE之路--01

空格绕过:/**/ URL编码伪协议:pagezip://xxx/xx/x/x/xxx.jpg%23解压后的名字pagephar://xxx/xx/x/x/xxx.jpg/解压后的名字pageddata://ata://text/plain,<?php eval($_POST[x]) ;?>pagedata://text/plain,<?php eval($_POST[x]) ;?>127.0.0.1 | grep . ../key…

企业级日志分析系统ELK

1.什么是 Elastic Stack 如果系统和应用出现异常和问题,相关的开发和运维人员想要排查原因,就要先登录到应用运行所相应的主机,找到上面的相关日志文件再进行查找和分析,所以非常不方便,此外还会涉及到权限和安全问题,而ELK 的出现就很好的解决这一问题。 ELK 是由一家 …

ai项目多智能体

手把手教你构建一个 本地化的&#xff0c;免费的&#xff0c;企业级的&#xff0c;AI大模型知识库问答系统 - 网旭哈瑞.AI 体验 AutoGen Studio - 微软推出的友好多智能体协作框架_autogenstudio-CSDN博客 AutoGen Studio: Interactively Explore Multi-Agent Workflows | Au…

【HTML】浅谈 script 标签的 defer 和 async

The async and defer attributes are boolean attributes that indicate how the script should be evaluated. There are several possible modes that can be selected using these attributes, depending on the script’s type. async 和 defer 属性是布尔属性&#xff0c;…

Kafka Streams 并行处理机制深度解析:任务(Task)与流线程(Stream Threads)的协同设计

在构建实时流处理应用时&#xff0c;如何充分利用计算资源同时保证处理效率是一个关键问题。Kafka Streams 通过其独特的任务(Task)和流线程(Stream Threads)并行模型&#xff0c;为开发者提供了既简单又强大的并行处理能力。本文将深入解析 Kafka Streams 中任务与线程的协同工…

使用 Docker 部署 Label Studio 时本地文件无法显示的排查与解决

目录 使用 Docker 部署 Label Studio 时本地文件无法显示的排查与解决 1. 背景 2. 问题现象 3. 排查步骤 3.1 确认文件是否存在 3.2 检查环境变量配置 4. 解决方案 方法一&#xff1a;修改 Sync Storage 路径&#xff08;相对路径&#xff09; 方法二&#xff1a;修改…

ElasticJob怎么使用?

我们使用ElasticJob需要以下步骤&#xff1a; 1. 添加依赖 2. 配置任务&#xff08;可以使用Spring命名空间配置或Java配置&#xff09; 3. 实现任务逻辑&#xff08;实现SimpleJob、DataflowJob等接口&#xff09; 4. 启动任务 下面是一个详细的示例&#xff0c;包括Spring Bo…

TCP协议的特点和首部格式

文章目录TCP协议是什么&#xff1f;TCP协议的主要特点1. 面向连接2. 可靠传输3. 流量控制4. 拥塞控制TCP首部格式源端口和目标端口&#xff08;各16位&#xff09;序列号&#xff08;32位&#xff09;确认号&#xff08;32位&#xff09;数据偏移&#xff08;4位&#xff09;保…

IO流-文件的常用方法

1.关于java.io.File类- File类只能表示计算机中的文件或目录而不能获取或操作文件- 通过File类获得到文件的基本信息&#xff0c;如文件名、大小等&#xff0c;但不能获取文件内容- java中表示文件路径分隔符使用"/"或"\\"- File类中的构造方法- File(&quo…

AUTOSAR进阶图解==>AUTOSAR_SRS_E2E

AUTOSAR E2E通信保护解析 AUTOSAR End-to-End通信保护机制详解与应用目录 概述 1.1. AUTOSAR E2E通信保护的作用 1.2. E2E通信保护的应用场景AUTOSAR E2E架构 2.1. E2E组件层次结构 2.2. E2E库和E2E转换器E2E监控状态机 3.1. 状态定义与转换 3.2. 状态机实现E2E保护数据交换流…

镜像快速部署ollama+python+ai

算力租赁入口&#xff1a;https://www.jygpu.com为大家提供以上镜像快速部署方式&#xff0c;节约大家环境部署时间一键部署的便捷性传统自建GPU服务器需要经历复杂的硬件采购、驱动安装、环境配置等繁琐步骤&#xff0c;而现代​​GPU租赁价格对比​​显示&#xff0c;容器化平…

使用Gemini API开发领域智能聊天机器人的思路

以下是使用 Gemini API 开发软件自动化测试专家领域专属智能聊天机器人的详细思路及具体实现过程&#xff1a; 阶段一&#xff1a;基础准备与规划 (Foundation & Planning) 这个阶段的目标是明确方向、准备好所有必要的工具和凭证。 步骤 1&#xff1a;明确聊天机器人的目…