会话参数功能通过允许相机客户端主动配置代价高昂的请求参数子集(即会话参数)作为捕获会话初始化阶段的一部分,从而减少延迟。借助此功能,您的 HAL 实现会在流配置阶段(而不是第一个捕获请求期间)接收客户端参数,并且可以根据这些参数的值更高效地准备和构建内部管道。
在 Android 10 中,您可以使用可选的会话重新配置查询功能来提高性能,以便更好地控制内部会话参数重新配置逻辑。如需了解详情,请参阅会话重新配置查询。
示例和源代码
参考会话参数实现已是 CameraHal 的一部分。此 HAL 使用旧版 Hal API。实现相机 HIDL API 的 binderized CameraHal 必须使用相应的 HIDL sessionParams 条目,以便在流配置期间访问任何新的传入会话参数。
相机客户端可以通过调用 getAvailableSessionKeys()
查询所有受支持的会话参数的键,并最终通过 setSessionParameters()
设置其初始值。
实现
您的 CameraHal 实现必须在相应的静态相机元数据中填充 ANDROID_REQUEST_AVAILABLE_SESSION_KEYS
,并提供 ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS
的子集,其中包含在每帧应用时很困难且在捕获会话生命周期内修改时可能导致意外延迟的键列表。
典型示例包括需要耗时的硬件重新配置或内部相机管道更改的参数。对会话参数的控制仍然可以在捕获请求中进行,但客户端应意识到并预期其应用中会出现延迟。
框架会监控所有传入的请求,如果检测到会话参数值发生变化,它会在内部重新配置相机。然后,传递到 CameraHal 的新流配置会包含更新后的会话参数值,这些值用于更高效地配置相机管道。
自定义
您可以在 CameraHal 端填充的可用会话参数列表中定义标记。如果 CameraHal 将可用会话参数列表留空,则此功能不会激活。
验证
CTS 包含以下用于测试会话参数的新用例
CameraDeviceTest#testSessionConfiguration
CameraDeviceTest#testCreateSessionWithParameters
CameraDeviceTest#testSessionParametersStateLeak
NativeCameraDeviceTest#testCameraDevicePreviewWithSessionParameters
一般来说,在某个参数成为会话键列表的一部分后,其当前值将作为会话参数的一部分包含在 HAL 层的流配置期间传递。
必须仔细选择会话参数。在流配置之间,这些值不应频繁更改,即使更改也应尽量避免。频繁更改的参数(例如捕获 intent)不适用,将它们添加到会话参数列表可能会因内部重新配置过多而导致 CTS 失败。
会话重新配置查询
Android 10 引入了可选的会话重新配置查询功能,以提高性能,因为会话参数值修改导致的内部流重新配置可能会降低性能。为了解决此问题,HIDL ICameraDeviceSession
3.5 及更高版本支持 isReconfigurationRequired
方法,该方法可对内部会话参数重新配置逻辑进行精细控制。使用此方法,可以在确切需要时进行流重新配置。
isReconfigurationRequired
的参数提供有关每个待处理会话参数修改的必要信息,从而允许进行各种设备特定的自定义。
此功能仅在相机服务和相机 HAL 中实现。没有面向公众的 API。如果实现了此功能,则相机客户端在使用会话参数时应该会看到性能改进。
实现
为了支持会话重新配置查询,您必须实现 isReconfigurationRequired
方法,以检查新的会话参数值是否需要完整的流重新配置。
如果客户端更改任何已公布的会话参数的值,相机框架会调用 isReconfigurationRequired
方法。HAL 会根据具体的值来决定是否需要完整的流重新配置。如果 HAL 返回 false
,相机框架会跳过内部重新配置。如果 HAL 返回 true
,框架会重新配置流并相应地传递新的会话参数值。
框架可以在将包含新参数的请求提交到 HAL 之前调用 isReconfigurationRequired
方法,并且可以在提交之前取消该请求。因此,HAL 不得使用此方法调用来以任何方式更改其行为。
HAL 实现必须满足以下要求
- 框架必须能够在活动会话配置后的任何时间调用
isReconfigurationRequired
方法。 - 不得对正在进行的相机请求的性能产生任何影响。特别是,在正常的相机流式传输期间不得出现任何故障或延迟。
设备和 HAL 实现必须满足以下性能要求
- 不得更改硬件和软件相机设置。
- 不得对用户可见的相机性能产生影响。
isReconfigurationRequired
方法接受以下参数
oldSessionParams
:来自上一个会话的会话参数。通常是现有的会话参数。newSessionParams
:由客户端设置的新会话参数。
预期的返回状态代码是
OK
:成功完成重新配置所需查询。METHOD_NOT_SUPPORTED
:相机设备不支持重新配置查询。INTERNAL_ERROR
:由于内部错误,重新配置查询无法完成。
返回值是
true
:需要流重新配置。false
:不需要流重新配置。
要忽略会话重新配置查询,HAL 返回 METHOD_NOT_SUPPORTED
或 false
。这将导致默认的相机服务行为,即在每次会话参数更改时都会触发流重新配置。
验证
可以使用 CameraHidlTest#configureStreamsWithSessionParameters
中的 VTS 测试用例来验证会话重新配置查询功能。