在捕获会话初始化阶段,会话参数功能使摄像头客户端可以主动配置一部分耗时较长的请求参数(即会话参数),从而减少延迟。借助此功能,您的 HAL 实现会在信息流配置阶段(而不是第一个捕获请求期间)接收客户端参数,并且可以根据它们的值更高效地准备和构建内部流水线。
在 Android 10 中,您可以使用可选的会话重新配置查询功能来更好地控制内部会话参数重新配置逻辑,从而提高性能。如需了解详情,请参阅会话重新配置查询。
示例和源代码
参考会话参数实现已经成为 CameraHal 的一部分。此 HAL 使用旧版 Hal API。实现 Camera HIDL API 的绑定式 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 测试用例验证会话重新配置查询功能。