Android 包含一些功能,让相机客户端可以选择适用于特定用例的最佳相机流,并确保相机设备支持某些流组合。流配置是指在相机设备中配置的单个相机流,而流组合是指在相机设备中配置的一组或多组流。如需详细了解这些功能,请参阅推荐的流配置和用于查询功能组合的 API。
参考实现
提供了推荐配置流和用于查询流组合功能的 API 的供应商端参考实现。您可以在 QCamera3HWI.cpp 中找到此实现
推荐的流配置
相机供应商可以为特定用例向相机客户端宣传推荐的流配置。这些推荐的流配置是 StreamConfigurationMap 的子集,可以帮助相机客户端选择最佳配置。
尽管 StreamConfigurationMap 向相机客户端提供了详尽的流配置信息,但它没有提供关于选择一个流而不是另一个流的效率、功耗或性能影响的任何信息。相机客户端可以自由地从所有可能的流配置中进行选择,但在许多情况下,这会导致客户端使用次优的相机配置,并且应用会进行耗时的穷举搜索。
例如,尽管某些经过处理的 YUV 格式是必需的并且必须支持,但相机设备可能没有对这些格式的原生支持。这会导致格式转换需要额外的处理过程并降低效率。尺寸和相应的宽高比也可能产生类似的影响,从而使特定尺寸在功耗和性能方面更佳。
与 StreamConfigurationMap 相比,您的推荐流配置映射不需要详尽无遗。建议的配置映射必须遵循实现部分中的要求,并且可以包含 StreamConfigurationMap 中可用的任何格式、尺寸或其他值。StreamConfigurationMap 中未找到的隐藏格式、尺寸或其他值不能包含在推荐的流配置映射中。
所有测试保持不变,不会因推荐的流配置而放宽。
相机实现提供的推荐流配置是可选的,相机客户端可以忽略它们。
实现
请按照以下步骤实现此功能。
元数据条目
为了启用此功能,相机 HAL 必须填充以下静态元数据条目
android.scaler.availableRecommendedStreamConfigurations
:特定用例的推荐流配置子集。声明使用位图指示建议的用例,格式为[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 获取此信息。
必需用例
必须为以下用例提供推荐的流配置,并满足相应的要求
用例 | 要求 |
---|---|
预览 |
预览必须仅包含非阻塞处理的流配置,输出格式如 YUV_420_888 和 IMPLEMENTATION_DEFINED 。 |
录制 |
视频录制必须包含与宣传的支持的媒体 配置文件 匹配的流配置,格式为 IMPLEMENTATION_DEFINED 。 |
视频快照 |
视频快照必须包含至少与最大录制分辨率一样大的流配置,并且仅使用 BLOB + DATASPACE_JFIF 格式/数据空间组合 (JPEG)。这些配置不应导致预览故障,并且应能够以 30 fps 的速度运行。 |
快照 |
快照流配置必须至少包含一个尺寸接近 android.sensor.info.activeArraySize 的配置,并使用 BLOB + DATASPACE_JFIF 格式/数据空间组合 (JPEG)。考虑到宽高比、对齐方式和其他供应商特定限制,最大建议尺寸的面积不应小于传感器阵列尺寸面积的 97%。 |
ZSL (如果支持) |
如果相机设备支持,则推荐的输入流配置必须仅与其他处理过的或阻塞的输出格式一起宣传。 |
RAW (如果支持) |
如果相机设备支持,则推荐的原始流配置必须仅包含基于 RAW 的输出格式。 |
其他用例
您可以为特定于您的实现的用例提供其他推荐的配置流。
验证
要测试您对推荐配置流的实现,请运行以下 CTS 和 VTS 测试
用于查询功能组合的 API
从 Android 15 开始,Android 平台提供了一个 API 来查询功能组合。此 API 让相机客户端可以查询设备是否可以支持指定的功能组合。此 API 是必要的,因为 camera2 API 将不同的功能(如 4k、60fps、HDR 视频、UltraHDR、超广角变焦和防抖)建模为正交控件。
要求
为了支持用于查询功能组合的 API,相机 HAL 必须实现版本 3 的 ICameraDevice
接口。有关详细信息,请参阅实现部分。
当 API 受到支持时,预览防抖必须与其他功能正交。这意味着,对于支持预览防抖的相机设备,当预览防抖开启或关闭时,特定组合的 isStreamCombinationWithSettingsSupported
的返回值必须是相同的值。这减少了功能组合查询的搜索空间。
此外,对于媒体性能等级 15,主后置摄像头必须支持预览防抖,并支持 10 位 HLG10 预览,适用于 1080p 和 720p 预览以及最大尺寸 JPEG。有关这些要求的更多详细信息,请参阅 CDD 的2.2.7.2. 相机部分。
实现
为了支持用于查询功能组合的 API,请在版本 3 的 ICameraDevice
中实现以下功能组合查询 API
constructDefaultRequestSettings
:为指定的CaptureRequest
类型创建默认设置。HAL 可以使用ICameraDeviceSession::constructDefaultRequestSettings
实现。isStreamCombinationWithSettingsSupported
:检查设备是否支持指定的相机流组合,包括会话参数和其他CaptureRequest
密钥。对于支持的组合,必须返回true
,对于不支持的功能组合,必须返回false
。HAL 可以使用isStreamCombinationSupported
实现,并添加支持以检查在sessionParams
中传递的CaptureRequest
设置。getSessionCharacteristics
:采用支持的流组合和会话参数,并返回会话特定的特性。INFO_SESSION_CONFIGURATION_QUERY_VERSION
:列出所有常用的会话配置。这些配置通过合规性测试进行验证。
对于低于版本 3 的 ICameraDevice
接口版本,HAL 应实现 isStreamCombinationSupported
方法。
有关 API 查询的功能组合的更多信息,请参阅 system/media/camera/docs/metadata_definitions.xml
中关于 sessionConfigurationQueryVersion
的文档。
有关此功能的参考实现,请参阅 hardware/google/camera/devices/EmulatedCamera/hwl/
。
公共 API
应用可以使用以下公共 API 来查询设备支持的功能组合
CameraDevice.CameraDeviceSetup
:CameraDevice
的有限表示形式,可用于查询功能组合,而无需CameraDevice
实例。getCameraDeviceSetup
:如果isCameraDeviceSetupSupported
返回true
,则为给定的相机 ID 获取CameraDeviceSetup
对象。INFO_SESSION_CONFIGURATION_QUERY_VERSION
:如果此值是VANILLA_ICE_CREAM
或更高版本,则支持功能组合查询。OutputConfiguration
:一个描述相机输出的类,可以包含一个延迟 Surface,用于低延迟功能组合查询。SessionConfiguration
:一个实用程序类,描述会话配置,包括流组合和会话参数,可用于功能组合查询。
验证
要验证您对此功能的实现,请使用以下 VTS、CTS 和 Camera ITS(CTS 验证程序)测试
VTS
CTS
- cts/tests/camera/src/android/hardware/camera2/cts/FeatureCombinationTest.java
- cts/tests/camera/src/android/hardware/camera2/cts/CameraDeviceSetupTest.java
Camera ITS