camera3_capture_result结构参考
#include < camera3.h >
数据字段 | |
uint32_t | 帧号 |
常量camera_metadata_t * | 结果 |
uint32_t | num_output_buffers |
常量camera3_stream_buffer_t * | 输出缓冲区 |
常量camera3_stream_buffer_t * | 输入缓冲区 |
uint32_t | 部分结果 |
详细说明
camera3_capture_result_t:
相机 HAL 设备单次捕获/再处理的结果。这是使用 process_capture_result() 异步发送到框架的,以响应使用 process_capture_request() 发送到 HAL 的单个捕获请求。 HAL 可以针对每个请求执行多个 process_capture_result() 调用。
每个调用都具有相同的帧号,可能包含输出缓冲区的某个子集和/或结果元数据。对于给定的帧编号,元数据只能提供一次;所有其他调用必须将结果元数据设置为 NULL。
结果结构包含来自此捕获的输出元数据,以及已经/将要为此捕获填充的输出缓冲区集。每个输出缓冲区可能带有一个释放同步栅栏,框架将在读取之前等待该栅栏,以防缓冲区尚未被 HAL 填充。
>= CAMERA_DEVICE_API_VERSION_3_2:
对于单个帧号可以多次提供元数据。框架将通过将每个部分结果组合在一起形成总结果集来累积最终结果集。
如果请求中给出了输入缓冲区,则 HAL 必须在 process_capture_result 调用之一中返回它,并且该调用可能只是返回输入缓冲区,而不返回元数据和输出缓冲区;同步栅栏的处理方式必须与处理输出缓冲区的方式相同。
性能考虑:
应用程序还将立即收到这些部分结果,因此强烈建议发送部分结果,以避免在发送管道中早期已知的结果之前出现总管道延迟。
一个典型的用例可能是在管道中途计算 AF 状态;通过立即将状态发送回框架,我们获得了 50% 的性能提升和自动对焦的感知响应能力。
现场文档
uint32_t 帧号 |
帧编号是框架在提交的请求中设置的递增整数,用于唯一标识此捕获。它还用于识别发送到camera3_callback_ops_t.notify()的异步通知中的请求。
常量camera3_stream_buffer_t * input_buffer |
>= CAMERA_DEVICE_API_VERSION_3_2:
此捕获的输入流缓冲区的句柄。 HAL 调用 process_capture_result() 时它可能尚未被消耗;在重用缓冲区之前,框架将等待 HAL 提供的释放同步栅栏。
HAL 应该以与处理 output_buffers 相同的方式处理同步栅栏。
每个请求只允许发送一个输入缓冲区。与输出缓冲区类似,返回的输入缓冲区的顺序必须由 HAL 维护。
性能考虑:
应尽早返回输入缓冲区。如果 HAL 支持同步栅栏,它可以调用 process_capture_result 来将其返回,并适当设置同步栅栏。如果不支持同步栅栏,则缓冲区只能在消耗时才返回,这可能需要很长时间; HAL 可能会选择复制此输入缓冲区以使缓冲区更快返回。
uint32_t num_output_buffers |
常量camera3_stream_buffer_t * output_buffers |
此捕获的输出流缓冲区的句柄。当 HAL 调用 process_capture_result() 时,它们可能尚未被填充;在读取缓冲区之前,框架将等待 HAL 提供的释放同步栅栏。
HAL 必须将流缓冲区的释放同步栅栏设置为有效的同步 fd,如果缓冲区已被填充,则设置为 -1。
如果 HAL 在处理缓冲区时遇到错误,并且缓冲区未填充,则缓冲区的状态字段必须设置为 CAMERA3_BUFFER_STATUS_ERROR。如果 HAL 在遇到错误之前没有在获取栅栏上等待,则应将获取栅栏复制到释放栅栏中,以允许框架在重用缓冲区之前在栅栏上等待。
对于所有输出缓冲区,获取栅栏必须设置为 -1。如果 num_output_buffers 为零,则这可能为 NULL。在这种情况下,HAL 必须至少再调用一次 process_capture_result 来提供输出缓冲区。
当使用帧的新缓冲区调用 process_capture_result 时,该相应流的所有先前帧的缓冲区必须已经交付(栅栏不需要尚未发出信号)。
>= CAMERA_DEVICE_API_VERSION_3_2:
帧的 Gralloc 缓冲区可以在相应的 SHUTTER 通知之前发送到框架。
性能考虑:
在通过 SHUTTER notification() 调用接收到曝光开始时间戳之前,传递到框架的缓冲区不会被分派到应用程序层。强烈建议尽早拨打该电话。
uint32_t 部分结果 |
>= CAMERA_DEVICE_API_VERSION_3_2:
为了利用部分结果,HAL 必须将静态元数据 android.request.partialResultCount 设置为它将为每帧发送的部分结果的数量。
每个具有部分结果的新捕获结果必须将此字段 (partial_result) 设置为 1 到 android.request.partialResultCount 之间的不同包含值。
不希望利用此功能的 HAL 不得将 android.request.partialResultCount 或partial_result 设置为 1 以外的值。
当捕获结果仅包含缓冲区且不包含元数据时,该值必须设置为 0。
常量camera_metadata_t *结果 |
此捕获的结果元数据。其中包含有关最终捕获参数、捕获和后处理硬件的状态、3A 算法的状态(如果启用)以及任何启用的统计单元的输出的信息。
对于给定的frame_number,只有一次对process_capture_result() 的调用可能包含结果元数据。对同一frame_number 的所有其他调用必须将其设置为NULL。
如果生成结果元数据时发生错误,则结果必须是空的元数据缓冲区,并且必须使用 ERROR_RESULT 调用 notification()。
>= CAMERA_DEVICE_API_VERSION_3_2:
使用给定的frame_number对process_capture_result()进行多次调用可能包括结果元数据。
提交的部分元数据不应包括给定帧的先前部分结果中返回的任何元数据键。该帧的每个新部分结果还必须设置不同的partial_result 值。
如果使用 ERROR_RESULT 调用通知,则框架将忽略该帧的所有进一步部分结果。
该结构的文档是从以下文件生成的: