数据流配置

Android 10 引入了一些功能,允许相机客户端针对具体使用情形选择最佳的摄像头数据流,并确保摄像头设备支持某些数据流组合。数据流配置是指在摄像头设备中配置的单个摄像头数据流,而数据流组合是指在摄像头设备中配置的一组或多组数据流。如需详细了解这些功能,请参阅推荐的数据流配置用于查询数据流组合的 API

参考实现

我们提供了推荐的数据流配置和用于查询数据流组合功能的 API 的供应商端参考实现。您可以在 QCamera3HWI.cpp 找到此实现。

摄像头供应商可以向相机客户端发布针对特定使用情形推荐的数据流配置。这些推荐的数据流配置是 StreamConfigurationMap 的子集,可以帮助相机客户端选择最佳配置。

尽管 StreamConfigurationMap 为相机客户端提供了详尽的数据流配置信息,但它并未提供任何有关选择某个数据流(而非另一个数据流)对效率、耗电量或性能有何影响的信息。相机客户端可以从所有可能的数据流配置中任意选择一个,但在许多情况下,这会导致客户端使用次优的摄像头配置,还会导致应用执行耗时而彻底的搜索。

例如,虽然某些已处理的 YUV 格式是必需的并且必须受支持,但摄像头设备可能无法对此类格式提供原生支持。这会导致需要对格式转换进行额外的处理,并且会降低效率。尺寸和相应的宽高比也可能具有类似的影响,因此就耗电量和性能而言,使用特定尺寸更好。

StreamConfigurationMap 相比,推荐的数据流配置映射不必详尽无遗。 推荐的配置映射必须遵循实现部分中的要求,可以包括 StreamConfigurationMap 中存在的任何可用格式、尺寸或其他值。StreamConfigurationMap 中不存在的隐藏格式、尺寸或其他值不能包含在推荐的数据流配置映射中。

根据推荐的数据流配置,所有测试都保持不变,并且不会放宽要求。

相机实现提供的推荐数据流配置是可选的,相机客户端可以将其忽略。

实现

请按照以下步骤实现此功能。

元数据条目

要启用此功能,Camera 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,相机客户端可以使用这些信息。

必需的使用情形

必须为以下使用情形提供推荐的数据流配置,并满足相应的要求:

用例 要求
PREVIEW 预览必须仅包含具有输出格式(如 YUV_420_888IMPLEMENTATION_DEFINED)的非停滞处理式数据流配置。
RECORD 视频录制必须包含用于将发布的受支持媒体配置文件IMPLEMENTATION_DEFINED 格式相匹配的数据流配置。
VIDEO_SNAPSHOT 视频快照必须包含至少与最大 RECORD 分辨率一样大的数据流配置,并且仅包含 BLOB + DATASPACE_JFIF 格式/数据空间组合 (JPEG)。配置不应引起预览故障,并且应该能够以 30fps 的速度运行。
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,相机 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