Advertisement

camera API 的详细步骤_主要步骤流程

阅读量:

camera API的详细步骤

在框架层中触发函数camera_module_t->common.open()执行,并返回一个hardware_device_t类型的结构体

在框架层面上检测字段 hardware_device_t 的 version 值;基于获取到的 version 信息来确定并实例化一个与该特定 versions 相匹配的 camera 硬件设备对象以获得相应的 hardware device handle;当具体 versions 为 CAMERAL_DEVICE_API_VERSION_3_0 时,则该硬件设备会被转换为 camera3_device_t 对象。

3 在框架层上执行 camera3_device_t->ops->initialize() 函数,并提供该层的回调函数指针。该功能仅能执行一次,并且应在打开 open() 函数之后,在后续的操作中不得再被使用。

4 框架层调用了函数camera3_device_t->ops->configure_streams()并将输入输出流信息传输至HAL层设备。
/*
为了构建整个相机数据流的通信通道并为后续的数据传输做好准备, configure_stream的主要工作流程如下:
首先, 根据流配置选择相应的UseCase; 如果选择了分区域创建, 然后根据选定的UseCase ID来确定相关的Feature。
在确定了Feature之后, 根据pstreamconfig配置具体的stream参数, 并在此过程中创建使用场景对象。
当创建使用场景对象时, 还需确定featurepipelinecount参数, 并使cameraid和sessionid与pipeline建立映射关系。
完成映射后, 对每个pipeline启动回调机制, 开始创建 pipeline结构。
在pipeline全部创建完成后, 生成描述符并初始化相关节点。
最后, 根据管道深度自动生成session实例并在session创建过程中初始化并队列化request队列。
通过Postusecasecreation事件通知使用场景已成功创建完毕。
至此, configurestream操作完成.)

configure_stream的作用在于,在framework下发请求之后,
该组件会对应匹配指定的usecase;
随后根据选定的usecase来确定关联的feature,
接着基于选定的feature来构建 pipeline;
其中会创建node(负责处理 pipeline相关操作);
同时为管理 pipeline 的执行流程而建立 session,
这些 session 可以分为 offline 和 real-time 两种类型。
a. 首先根据选定的usecase来确定关联的feature;
b. 然后调用initalize方法对选定 usecase 进行初始化操作;
c. 根据获取到的 usecaseid 来定位对应的 feature(启动 feature 线程);
d. 基于 selected usecase 和 associated feature 来构建 pipeline(每条 pipeline 对应一个特定功能模块);
e. 根据 pipeline 的深度层级来生成 session(区分 offline 和 real-time session)。

在5级框架层次上配置grallocbuffer;调用camera3_device_t->ops->register_stream_buffers()函数时,请确保至少从configure_streams所列输出流中选择一个进行配置,并且同一输出流不得重复注册。

当Framework层执行该操作时会自动触发camera3_device_t->ops->construct_default_request_settings()函数以获取相关参数设置。这些参数设置可以在第三步完成后任意位置进行访问。

7 在Framework层通过预设配置方案进行配置,并确保至少一个输出通道已注册完成的基础上,在该层向HAL层发起首次捕获请求。
当HAL接收到来自上一层的请求时,
首先将该请求转发至关联的usecase模块处理,
随后将该请求转发至关联的usecase模块处理,
接着由该usecase模块根据其特定功能逻辑进行处理,
随后将该请求进一步分发至相关的pipeline组件进行处理,
最后由各节点依次执行各自的功能操作。

第8层次连续进行请求操作。该系统会调用register_stream_buffers()函数来处理尚未预先注册的流,并通过construct_default_request_settings获取相关测试案例所需的标准配置参数。

当一个请求的捕获触发时(传感器启动曝光),HAL层将执行函数camera3_callback_ops_t->notify()来通知上层SHUTTER事件的发生,并包含当前传感器启动曝光的帧编号和时间戳信息。在处理该帧号对应的数据之前,HAL层必须先发送SHUTTER通知命令。

10 经过一定时间后,HAL层从camera3_callback_ops_t->process_capture_result()函数接收处理完成后的图像数据。
这些数据输出的结果顺序与用户的提交顺序完全一致。
此外, 多个请求可以在同一时间内被提交, 其效果取决于camera HAL层设备的流水线深度.

11 工作一段时间之后,framework层可能会停止提交新的请求,等待其他请求被完成(所有buffer被填充,所有结果被返回),然后再次调用函数configure_streams()。这是为一组新的输入输出流重启camera硬件和流水线。前面配置的一些流可能会被重复使用;如果流的buffer已经注册到了HAL层,它们将不再被注册。如果有一个被注册的输出流还存在,则framework层将从第七步重新开始(否则,将从第五步开始)。
/*
flush()
关机的flush和其他的flush有些区别:
关机:会清除所有未处理的请求;
其他:调用flush时会等所有请求都被处理,所有结果都已返回,才会执行flush;
a.
b.
c.
d.
*/

12在Framework层级上将执行函数camera3_device_t->common->close()以完成相机会话的关闭。
当没有任何额外框架层级操作的情况下,在任意时间都可以执行此操作。
尽管该操作可能会阻塞直至所有捕获结果已返回并所有buffer已填满。
当function close()返回后不允许HAL进行任何相关的操作。
如果function close()已经被执行,则框架层级将无法访问或使用任何HAL层级的设备功能。

当遇到错误或其他异步事件时

未完…后续继续补充

全部评论 (0)

还没有任何评论哟~