`StreamConfigurationMap` 實現邏輯與解析過程詳解:相機流能力的聲明、匹配與驗證機制全景

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;明確聊天機器人的目…