Android 10 引入了一些功能,允許攝像頭客戶端為特定用例選擇最佳攝像頭流,並確保攝像頭設備支持某些流組合。流配置是指在攝像頭設備中配置的單個攝像頭流,流組合是指在攝像頭設備中配置的一組或多組流。有關這些功能的更多信息,請參閱推薦的流配置和查詢流組合的 API 。
參考實現
有推薦的配置流的供應商端參考實現和用於查詢流組合功能的 API。你可以在QCamera3HWI.cpp找到這個實現
推薦的流配置
攝像頭供應商可以向攝像頭客戶端宣傳針對特定用例的推薦流配置。這些推薦的流配置是StreamConfigurationMap的子集,可以幫助相機客戶端選擇最佳配置。
儘管StreamConfigurationMap為攝像頭客戶端提供了詳盡的流配置信息,但它沒有提供有關選擇一個流而不是另一個流的效率、功率或性能影響的任何信息。攝像頭客戶端可以從所有可能的流配置中自由選擇,但在許多情況下,這會導致客戶端使用次優攝像頭配置和應用程序進行耗時的詳盡搜索。
例如,雖然需要並且必須支持某些經過處理的 YUV 格式,但相機設備可能不具備對這些格式的原生支持。這會導致格式轉換的額外處理過程並降低效率。尺寸和相應的縱橫比也可以產生類似的影響,從而使特定尺寸在功率和性能方面更可取。
與StreamConfigurationMap相比,您推薦的流配置映射不需要詳盡。建議的配置映射必須遵循實現部分中的要求,並且可以包含StreamConfigurationMap中的任何可用格式、大小或其他值。 StreamConfigurationMap 中找不到的隱藏格式、大小或其他值不能包含在推薦的流配置映射中。
根據推薦的流配置,所有測試都保持不變並且不會放鬆。
相機實現提供的推薦流配置是可選的,相機客戶端可以忽略它們。
執行
請按照以下步驟實現此功能。
元數據條目
要啟用此功能,Camera HAL 必須填充以下靜態元數據條目:
android.scaler.availableRecommendedStreamConfigurations
:針對特定用例推薦的流配置子集。聲明使用簡單的位圖,以[1 << PREVIEW | 1 << RECORD..]
的形式指示建議的用例。[1 << PREVIEW | 1 << RECORD..]
。用例擴展了常規(格式、寬度、高度、輸入)元組,增加了一個條目。禁止在[PUBLIC_END, VENDOR_START]
範圍內設置不存在的公共用例或任何其他位。此信息存儲在
availableRecommendedStreamConfigurations
元數據標記中。以下示例顯示了僅支持 4K 和 1080p 的相機設備的推薦流配置的數組,其中兩種分辨率均適合視頻錄製,但建議僅使用 1080p 進行預覽。
[3840, 2160, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT), 1920, 1080, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, (1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PREVIEW | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT | 1 << ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VIDEO_SNAPSHOT)]
android.depth.availableRecommendedDepthStreamConfigurations
(僅在設備支持時可用):建議為此相機設備推薦的深度數據空間流配置。與上述元數據條目類似,附加用例位圖指示建議的用例。此信息存儲在
availableRecommendedInputOutputFormatsMap
元數據標記中。android.scaler.availableRecommendedInputOutputFormatsMap
(僅當設備支持時才可用):將此相機設備建議用於輸入流的推薦圖像格式映射到相應的輸出格式。此信息存儲在
availableRecommendedDepthStreamConfigurations
元數據標記中。
此信息可通過RecommendedStreamConfigurationMap API 提供給相機客戶端。
所需用例
必須為以下用例提供推薦的流配置並滿足相應的要求:
用例 | 要求 |
---|---|
PREVIEW | 預覽必須僅包括具有輸出格式(例如YUV_420_888 和IMPLEMENTATION_DEFINED )的非停滯處理流配置。 |
RECORD | 視頻記錄必須包含與廣告支持的媒體 配置文件與IMPLEMENTATION_DEFINED 格式相匹配的流配置。 |
VIDEO_SNAPSHOT | 視頻快照必須包含至少與最大 RECORD 分辨率一樣大的流配置,並且只能使用 BLOB + DATASPACE_JFIF 格式/數據空間組合 (JPEG)。配置不應導致預覽故障,並且應該能夠以 30 fps 的速度運行。 |
SNAPSHOT | 快照流配置必須至少包含一個大小接近android.sensor.info.activeArraySize 且採用 BLOB + DATASPACE_JFIF 格式/數據空間組合 (JPEG) 的配置。考慮到縱橫比、對齊和其他供應商特定的限制,最大建議尺寸的區域不應小於傳感器陣列尺寸區域的 97%。 |
ZSL (如果支持) | 如果相機設備支持,推薦的輸入流配置只能與其他已處理或停止的輸出格式一起公佈。 |
RAW (如果支持) | 如果相機設備支持,推薦的原始流配置必須僅包含基於 RAW 的輸出格式。 |
其他用例
您可以為特定於您的實施的用例提供額外的推薦配置流。
驗證
要測試推薦配置流的實施,請運行以下 CTS 和 VTS 測試:
用於查詢流組合的 API
Android 平台支持 API 來查詢流組合。實施此 API 允許相機客戶端在接收到有效的CameraDevice實例後的任何時間點安全地查詢流組合,從而消除初始化相機捕獲會話的開銷以及出現包括相機破損在內的後續相機異常的可能性,並允許更快的查詢。
此功能還允許攝像頭客戶端接收根據 CameraDevice指南和支持的硬件級別編譯的流組合列表。 CTS 測試可用於強制查詢結果的正確性,盡可能覆蓋最常見流組合的一小部分。
您可以選擇通過在相機 HAL 中實現一個額外的 HIDL API 調用來支持此功能。
執行
要支持 API 來查詢流組合,Camera HAL 必須提供isStreamCombinationSupported
HIDL API 接口的實現。該接口檢查攝像頭設備是否支持指定的攝像頭流組合。
調用時,API 必須返回以下狀態代碼之一:
-
OK
: 流組合查詢成功。 -
METHOD_NOT_SUPPORTED
:攝像頭設備不支持碼流查詢。 -
INTERNAL_ERROR
:由於內部錯誤,無法完成流組合查詢。
如果支持流組合,則 API 返回 true。否則,它返回 false。
該框架使用公共 API isSessionConfigurationSupported
來檢查相機設備是否支持特定的會話配置。
對 API 的調用不得對正常的相機操作產生任何副作用。 API 調用不得改變任何內部狀態或降低相機性能。確保 Camera HAL 成功驗證流組合後,攝像頭客戶端可以成功配置流組合。為避免出現問題,請確保實現不會在流組合查詢期間存儲任何信息、更改其內部狀態或進行耗時的操作。
驗證
要驗證此功能,請運行以下攝像機 CTS 和 VTS 測試用例:
相機 CTS 模塊:
攝像機 VTS:
VtsHalCameraProviderV2_4TargetTest.cpp