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

camera API的详细步骤

1 Framework层调用函数camera_module_t->common.open(),将返回一个hardware_device_t类型的结构体。

2 Framework层检查字段hardware_device_t->version,根据版本信息,实例化一个适合这个版本的camera硬件设备的句柄。例如版本号是CAMERA_DEVICE_API_VERSION_3_0,则这个设备将被转化为camera3_device_t。

3 Framework层调用函数camera3_device_t->ops->initialize(),并传递了framework层的回调函数指针。这个函数只能被调用一次,且在调用函数open()之后,在其他函数被调用之前。

4 Framework层调用函数camera3_device_t->ops->configure_streams(),向这个HAL层设备传递了输入输出的流信息。
/*
configure_stream 就是为了打道整个相机数据流的通道,为后续的数据
流通做准备.而它的主要过程如下:
(先依据流配置选择对应的usecase,如果为选到区创建,然后依据usecaseid选择
对应的feature,确定feature后,根据pstreamconfig,配置stream,并去创建usease对象
在其创建的过程中确定featurepipelinecount.并使cameraid和 sessionid 映射到
pipeline.完成映射后为每条pipeline注时回调,然后开始创建 pipeline.
完成后去创建rescriptor,在创建描述符的过程中创建 node,并完成初始化
当pipeline创建完成后.根据管道深度创建session.并在过程中创建并初始化
request队列,等待唤醒执行,在session创建完成后,通过Postusecasecreation
通知用例的建成功,至此configstream结束.)

( configure_stream旨在:当framework下发请求之后,configure_stream针对请求匹配相应的usecase;通过usecase选择feature,依据usecase以及feature选择创建pipeline;(创建node); 创建session(session用来管理pipeline);
a. 匹配usecase返回相应的usecaseid;(先依据流配置对应的usecase,依据xml文件的和选择);
b. 创建usecase对象,调用initalize对usecase进行初始化操作;
c. 根据usecaseid选择对应的feature(创建feature线程);
d. 依据usecase以及feature选择创建pipeline;(一个usecase对应多条pipeline,根据numpipeline成员遍历创建;创建node);
e. 根据管道深度创建session;(offlinesession; realtime session; )
)
*/

5 Framework层分配grallocbuffer;调用函数camera3_device_t->ops->register_stream_buffers(),至少使用一个configure_streams中列举的输出流。同一个流只能被注册一次。

6 Framework层通过调用camera3_device_t->ops->construct_default_request_settings()获取用例的默认设置。这个在第三步之后任意地方进行调用。

7 Framework层使用默认设置集合中某一套设置,且保证之前注册了至少一个输出流,创建并向HAL层发第一个捕获请求。这个请求将通过调用函数camera3_device_t->ops->process_capture_request()发送到HAL层。HAL必须阻止函数返回,直到HAL准备好接收下一个请求。
/*
在process_capture_request()中;HAL收到上层下发的request后;先将请求下发给usecase,在当前的usecase中执行(部分usecase下有不同的feature,决定了pipeline)查找usecase对应的feature,将请求下发给feature,feature负责将request分发给各条pipeline;再由pipeline将请求下发给每个node;各个node执行具体的功能操作;
a.
b.
c.
d.
*/

8 Framework层连续地提交请求。可能会调用函数register_stream_buffers()来注册没有注册过的流,调用函数construct_default_request_settings获取其他用例所需的默认设置。

9 当一个请求的捕获开始时(sensor开始曝光),HAL层将调用函数camera3_callback_ops_t->notify()通知上层SHUTTER事件,其中包括sensor开始曝光的帧号和时间戳。调用函数process_capture_result()处理这个帧号对应的数据之前,HAL层必须发出SHUTTER通知。
/*
process_capture_result()
*/

10 流水线持续一些时间后,HAL层开始使用函数camera3_callback_ops_t->process_capture_result()向framework层返回处理完的图像数据。返回结果的次序与提交请求的次序完全一致。多个请求可以被一次提交,但这取决于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()结束camera会话。当framework层没有其他调用时,可以在任何时间调用这个函数,尽管这个调用会阻塞,直到所有正在处理的捕获被完成(所有结果被返回,所有buffer被填充)。函数close()返回之后,不允许HAL调用camera3_callback_ops_t的任何函数。一旦函数close()被调用,framework层将不能调用其他任何HAL层设备函数。

13 如果发生错误或者其他异步事件,HAL层必须调用函数camera3_callback_ops_t->notify()告知上层对应的错误或者事件信息。一个与设备相关的致命错误被通知上层后,HAL应该像被调用了函数close()一样。但是,在调用函数notify()之前,HAL必须取消或者完成所有未结束的数据捕获操作,以便致命错误被上报之后,framework不会收到设备的任何回调函数。除了函数close(),致命错误信息发出后,其他函数只能返回-ENODEV或者NULL。

未完…后续继续补充

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页