android camera HAL: 请求的创建和提交

来源:互联网 发布:淘宝和京东价格不一样 编辑:程序博客网 时间:2024/05/01 03:52

1.        Request creation and submission

 

construct_default_request_settings

为标准的camera用例创建拍照设置。设备必须返回一个与所要求的用例相匹配的buffer设置,其为枚举类型CAMERA3_TEMPLATE_*之一。所有被请求的控制字段都应该包含在其中。

HAL层拥有这个结构体,但是指向该结构体的指针在设备关闭之前必须一直有效。一旦这个调用返回后,framework层和HAL层都不可以修改这个buffer。同一个buffer有可能返回并用于随后的调用,使用同在一种模板,或者其它模板。

Return values

·        Valid metadata:表示默认设置的buffer创建成功。

·        NULL:出现致命错误的情况。一旦出现了这个返回值,framework层只能成功调用close()函数。

process_capture_request

HAL层发送一个新的拍照请求。HAL直到准备好接收下一个请求,才会返回这个调用。Framework层每次只能调用一次process_capture_request(),并且是在同一个线程中调用。一旦新的请求和其相关的buffer可用,将会再次调用process_capture_request()。在普通的预览场景中,这意味着framework层将立即调用这个函数。

实际的请求处理是异步的,通过HAL层调用函数process_capture_request()来返回结果。这个调用需要可用的元数据,但是输出buffer可以简单地提供一个sync fences。许多请求都期望立即被处理,按照所期望的输出帧率。Framework层拥有请求结构体。在这个调用中它被保持是有效的。HAL层必须拷贝处理请求所需的信息。HAL层负责等待并关闭bufferfences,并将buffer的句柄返回给framework层。

如果input_buffer非空,HAL层必须向input_buffer->release_fence写入输入buffer释放sync fence的描述信息。如果HAL层为输入buffer释放sync fence返回-1framework层可以立即使用这个输入buffer。否则,framework层在重新填充和使用这个输入buffer之前,需要等待syncfence被释放。

Return values

·        0:表示成功开始处理拍照请求。

·        -EINVAL:表示输入有缺陷(例如设置为NULL0个输出buffer)并且拍照过程不能启动。请求处理中的失败需要调用camera3_callback_ops_t.notify()。这种错误发生时,framework层将保存数据流bufferfencebuffer的句柄;HAL层不能关闭这些fence或者使用process_capture_result返回这些buffer

·        -ENODEV:表示camera设备遇到了严重的错误。发生这个错误后,framework层只能成功调用close()函数。

 

2.        Miscellaneous methods

 

get_metadata_vendor_tag_ops

获取方法查询供应商扩展的元数据信息。HAL层需要填充所有供应商的操作函数,或者不处理这些操作函数如果供应商没有定义的话。可以在文件system/media/camera/include/system/camera_metadata.h中找到的vendor_tag_query_ops_t的定义。

dump

输出camera设备的调试状态。当camera service需要提供调试信息时,比如使用dumpsys工具,或者捕获bugreport framework层将调用这个函数。传递的文件描述符将用于dprintf()或者 write()写调试信息。这些信息只能使用ASCII编码。

flush

清除某个设备上当前正在处理的所有的拍照请求和流水线中的所有bufferFramework层使用这个函数尽可能快地获取所有状态,为了准备调用configure_streams()

不需要成功返回buffer,所有每个buffer都可以返回CAMERA3_BUFFER_STATUS_ERROR。注意HAL层允许返回成功填充了的有效状态(STATUS_OK)的buffer

HAL层,当前所有的请求都需要尽可能快地返回。没有在处理的请求立即返回错误。任何可中断的硬件块都需要停止,任何不可中断的都需要等待。

HAL层没有未处理的buffer或者请求时,flush()才能返回。Framework层可以调用configure_streams或者生成新的请求。

Flush()调用只能消耗100ms或者更少。最大时间为1秒。

Version information

只有设备版本大于等于CAMERA_DEVICE_API_VERSION_3_1,这个才有效。

Return values

·        0:表示flush成功

·        -EINVAL:表示输入是有缺陷的(设备无效)

·        -ENODEV:表示camera设备遇到了严重的错误。发生这个错误后,framework层只能成功调用close()函数。

原文地址:

https://source.android.com/devices/camera/camera3_requests_methods.html

 

 

0 0
原创粉丝点击