android camera HAL 错误数据流处理

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

重启HALcamera设备的处理流程,建立新的输入和输出数据流。这个调用将使用stream_list中定义的数据流信息来代替之前的数据流配置。在initialize()之后,使用process_capture_request()提交请求之前,这个函数至少被调用一次。
stream_list
必须包含至少一条输出数据流信息,可以只包含一条输入数据流的信息。
stream_list
可以包含当前激活的数据流集合(通过以前调用configure_stream())。这些数据流已经拥有有效的usage数值,maxbuffers和私有指针。如果一个数据流已经有注册的buffer,那函数register_stream_buffers()将不会为这个数据流调用,并且这个数据流的buffer能立即在输入请求中使用。

如果HAL层因为新的配置,要修改已存在数据流的配置,在配置调用时,它可以修改usage的数值和/maxbuffersFramework层发现这个改变后,会重新分配数据流buffer,在使用这些buffer前再次调用函数register_stream_buffers()。如果当前激活的数据流没有包含到stream_listHAL可以安全地去除这个数据流的相关设置。在之后的configure()调用中,framework层将不会再使用它,并且它的所有gralloc buffer在函数configure_streams()返回之后释放掉。
stream_list
结构体为framework层所有,这个调用一旦完成将不会再被访问。camera3streamt结构体还可以被HAL层访问,直到configure_stream()调用了不包含camera3streamt的参数。HAL层不能改变私有指针的数据流结构体中的数值,除了usagemaxbuffers成员。

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

 

Preconditions

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

Postconditions

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

Performance expectations

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

Return values

·        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_buffersFramework层在提交第一个拍照请求之前,它不需要为所有配置过的数据流注册buffer。这个机制方便其他数据流还在配置时,就快速启动预览(或者类似情况)。这个方法想让HAL层设备影射或者提前准备buffer。被使用的buffer将会被锁住。调用结束之后,所有的buffer将会返回给数据流。参数bufferset只有在这个方法调用过程中有效。

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

Return values

·        0:成功注册了数据流所需buffer

·        -EINVAL:如果streambufferset与有效且激活的数据流无关,或者buffer对列是无效的

·        -ENOMEM:如果注册buffer失败。Framework层注销了所有buffer,之后又尝试重新注册。

·        - ENODEV:如果出现致命错误,设备不能正常运行。这种错误发生后,只能framework层调用close()函数。

原文地址:

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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值