您的位置:首页 > 移动开发 > Android开发

android camera HAL 错误数据流处理

2016-01-23 10:07 260 查看

1. Error management

如果发生严重的错误,有返回值的camera HAL层设备操作函数将统一返回-ENODEV / NULL。这意味着这个设备不能继续操作了,必须被framework层关闭。一旦通过某种方式返回了这个错误,或者使用notify()发送了ERROR_DEVICE,那就只有close()函数才能被成功地调用。其他所有函数将都会返回-ENODEV
/ NULL。如果按照错误的顺序调用设备的操作函数,比如framework层在调用initialize()之前调用configure_streams(),设备将得到-ENOSYS的返回值,什么也没有做。

在拍照中需要通过notify()报告的错误如下:
· 拍照失败,HAL层必须通过notify()函数发送消息ERROR_REQUEST。在这种情况下,个别的元数据或者输出buffer出错,不允许报告。
· 如果某张拍照照片的元数据不能产生,但是某些输出buffer已经被填充,HAL必须通过notify()发送消息ERROR_RESULT。
· 如果某个输出buffer没有被填充,而元数据已经产生或者其他buffer已经被填充,HAL必须通过notify()为每个失败的buffer发送消息ERROR_BUFFER。
在这些失败场景下,HAL必须使用有效的参数buffer_handle_t调用函数process_capture_result。如果元数据不能产生,那应该使用NULL参数。如果某些buffer没有被填充,它们的同步状态应该被设置为错误状态。
属性方法将会对无效的输出参数返回-EINVAL。在这种情况,framework层将假装从来没有调用过那个函数。
2. Stream management



configure_streams

重启HAL层camera设备的处理流程,建立新的输入和输出数据流。这个调用将使用stream_list中定义的数据流信息来代替之前的数据流配置。在initialize()之后,使用process_capture_request()提交请求之前,这个函数至少被调用一次。

stream_list必须包含至少一条输出数据流信息,可以只包含一条输入数据流的信息。

stream_list可以包含当前激活的数据流集合(通过以前调用configure_stream())。这些数据流已经拥有有效的usage数值,maxbuffers和私有指针。如果一个数据流已经有注册的buffer,那函数register_stream_buffers()将不会为这个数据流调用,并且这个数据流的buffer能立即在输入请求中使用。

如果HAL层因为新的配置,要修改已存在数据流的配置,在配置调用时,它可以修改usage的数值和/或maxbuffers。Framework层发现这个改变后,会重新分配数据流buffer,在使用这些buffer前再次调用函数register_stream_buffers()。如果当前激活的数据流没有包含到stream_list,HAL可以安全地去除这个数据流的相关设置。在之后的configure()调用中,framework层将不会再使用它,并且它的所有gralloc
buffer在函数configure_streams()返回之后释放掉。

stream_list结构体为framework层所有,这个调用一旦完成将不会再被访问。camera3streamt结构体还可以被HAL层访问,直到configure_stream()调用了不包含camera3streamt的参数。HAL层不能改变私有指针的数据流结构体中的数值,除了usage和maxbuffers成员。

如果数据流是新的,数据流结构体的usage、maxbuffers和私有指针字段都为0。HAL层必须在configure_streams()调用返回之前设置这些字段。这些字段被framework层所使用,gralloc模块为每一个数据流分配gralloc
buffer。在一个拍照请求中,一个新的数据流拥有自己的buffer之前,framework层需要调用函数register_stream_buffers()来注册buffer。但是,在提交请求之前,framework层不需要为所有的数据流注册buffer。这个允许快速启动预览数据流,同时为之后发生的其他数据流分配资源。



[b]Preconditions[/b]

没有拍照请求正在被处理时,framework层将只调用这个方法。也就是说,所有结果已经返回给framework层,所有的输入和输出buffer也都已经返回,并且HAL层释放了所有相关资源。configure_streams()没有返回,framework层不会新的拍照请求。

[b]Postconditions[/b]

HAL层设备必须根据输出数据流的大小和格式提供最大的输出帧率,如camera设备的静态元数据中所描述的。

[b]Performance expectations[/b]

这个调用的完成可能会花去几百毫秒,因为它可能需要重启和重新配置sensor和图像处理流水线。不过,HAL层设备试图最小化重新配置的延迟,减少app切换操作模式(比如从拍照切换到视频录制)用户所感知的停顿。

[b]Return values[/b]

· 0:成功的数据流配置
· 无定义
· -EINVAL:请求的数据流配置是无效的。一些无效数据流配置的例子如下:
o 包括了多于一个的输入数据流(INPUT or BIDIRECTIONAL)
o 不包括任何输出数据流(OUTPUT or BIDIRECTIONAL)
o 包括的数据流不支持的格式,或者不支持的那种格式的大小
o 包括了多于特定格式所需要的输出数据流
o 注意:framework提交无效数据流配置并非正常操作,因为配置之前会对配置信息进行检查。一个无效的配置意味着framework层存在一个bug,或者HAL层静态元数据与数据流的请求之间有不匹配。
· –ENODEV:如果有致命的错误并且设备不能正常运行。这种错误发生后,framework层只能成功调用close()函数。
register_stream_buffers

HAL层设备为所要使用的数据流注册buffer。一个数据流被configure_streams定义以后,且该buffer被用于拍照请求中之前,framework层需要调用这个方法注册buffer。如果在多个configure_streams()调用中包含同一个数据流,不会为该数据流多次调用register_stream_buffers。Framework层在提交第一个拍照请求之前,它不需要为所有配置过的数据流注册buffer。这个机制方便其他数据流还在配置时,就快速启动预览(或者类似情况)。这个方法想让HAL层设备影射或者提前准备buffer。被使用的buffer将会被锁住。调用结束之后,所有的buffer将会返回给数据流。参数bufferset只有在这个方法调用过程中有效。

如果数据流格式是HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,HAL层将检查所用的buffer,以确定其平台私有的像素格式信息。

[b]Return values[/b]

· 0:成功注册了数据流所需buffer。
· -EINVAL:如果streambufferset与有效且激活的数据流无关,或者buffer对列是无效的
· -ENOMEM:如果注册buffer失败。Framework层注销了所有buffer,之后又尝试重新注册。
· - ENODEV:如果出现致命错误,设备不能正常运行。这种错误发生后,只能framework层调用close()函数。
原文地址:

https://source.android.com/devices/camera/camera3_error_stream.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: