-
android camera HAL
v3.0
详细介绍(二)
android camera HAL
v3.0
详细介绍(二)
2015-12-21
11:11
412
人阅读
评论
(0)
收藏
举报分类:
android camera
(
20
)
p and
expected
operation sequence
这段描述了使用
camera API
的详细步骤。其中涉及到的结
构体和函数请参考文件:
plat
form/hardware/libhardware/include/hardware/camera3
.
h
1.
Framework
层调用函数
p>
camera_module_t->()
,将返回一个
p>
hardware_device_t
类型的结构体。
2.
p>
Framework
层检查字段
hardw
are_device_t->version
,根据版本信息,实例化一
个适合这个版本的
camera
硬件设备的句
柄。例如版本号是
CAMERA_DEVICE_API_VERSION_3_0
p>
,则这个设备将被
转化为
camera3_
device_t
。
3.
Framework
层调用函数
camera3_device_t->ops->
initialize()
,并传递了
framework
p>
层的回调函数指针。这个函数只能被调用一次,
且在调用函数
open()
之后,在其他函数被调用之前。
4.
Fra
mework
层调用函数
camera3_device_t-
>ops->configure_streams()
,向这
个
HAL
层设备传递了输入输出的流信息。
5.
p>
Framework
层分配
gralloc
buffer
;调用函数
camera3_device_t-
>ops->register_stream_buffers()
,<
/p>
至少使用一个
configure_streams
中列举的输出流。同一个
流只能被注册一次。
6.
Fra
mework
层通过调用
camera3_device_t-
>ops->construct_default_request_
s
ettings()
获取用例的默认设置。
这个在第三步之后任
意地方
进行调用。
7.
Framework
层使用默认设置集合中某一套设置,
且保证之前注册了至少一个输出流,
p>
创建并向
HAL
层发第一
< br>个捕获请求。这个请求将通过调用函数
camera3_device_t-&g
t;ops->process_capture_request()
发送到<
/p>
HAL
层。
HAL
必须阻止函数返回,直到
HAL
准备好
接收下一个请求。
8.
Framework
层连续地提交请
求。可能会调用函数
register_stream_buffers()
来注册没有注册过的流,
调用函数
constru
ct_default_request_settings
获取其他用例所需的默
p>
认设置。
9.
当一个请求的捕获开始时
(
sensor
开始曝光)
,
HAL
层将调用函数
camera3_callback_
ops_t->notify()
通知上
层
SHUTTER
事件,其中包括
sensor
开始曝光的帧号和时
间戳。
调用函数
process_capture_result()
处理这个帧号对应
的数据之前,
HAL
层必须发出
SHUTTER
通知。
10.
流水线持续一些时间后,
HAL
层开始
使用函数
camera3_callback_ops_t->process_
capture_result()
向
framework
p>
层返回处理完的图像数据。返回结果的次序与提
交请求的次序完全一
致。多个请求可以被一次提交,但这取
决于
camera
HAL
层设备的流水线深度。
11.
工作一段时间之后,
framework
层可能会停止提交新
的请求,等待其他请求被完成(所有
bu
ffer
被填充,所有结
果被返回)
,
然后再次调用函数
configure_streams()
。
这是
为一组新的输入输出流重启
camera
< br>硬件和流水线。前面配
置的一些流可能会被重复使用;如果流的
< br>buffer
已经注册到
了
HA
L
层,
它们将不再被注册。
如果有一个
被注册的输出流
还存在,则
framework
层将从第七步重新开始(否则,将从
第五步开始)
。<
/p>
12.
Framework
层将调用函数<
/p>
camera3_device_t->common->close()<
/p>
结束
camera
会
话。当
framework
层没有其他调用时,可以在任何
时间调用
这个函数,尽管这个调用会阻塞,直到所有正在处理的捕获
被完成
(所有结果被返回,
所有
b
uffer
被填充)
。
函数
close()
返回之后,不允许
HAL
调用
camera3_callback_ops_t
< br>的任
何函数。一旦函数
close()
< br>被调用,
framework
层将不能调用
其他任何
HAL
层设备函数。
13.
如果发生错误或者其他异步事件,
H
AL
层必须调用
函数
camera3_
callback_ops_t->notify()
告知上层对应的
错误或者事件信息。一个与设备相关的致命错误被通知上层
后,
HAL
应该像被调用了函数
close()
一样。
但是,
在调用函
数
notify()
之前,
HAL<
/p>
必须取消或者完成所有未结束的数据
捕获操作,以便致命错误被上
报之后,
framework
不会收到
设备的任何回调函数。
除了函数
close()
,
致命错误信息发出
后,其他函数只能返回
-ENODEV
或者
NULL
。
Figure4.
Camera operational flow
ional modes
Camera HAL
层
v3
版本的设备实现两种可能的操作模式之
一:
limited
模式和
< br>full
模式。新的高端设备预计会支持
full
模式。
Limited
模式与
camera
HAL
层
v1
版本一样,对硬件需求很低,用于旧的或者低价
设备。
Full
模式是
limited
模式的超集,如上面所述,它们有
着基本上一样的操作流程。
< br>
Camera HAL
层必须使用静态元数据
tedHardwareLevel
指明其所支持的模式。
0
表示支持
limited
模式,
1
表示支持
full
模式。
简单来讲,
li
mited
模式设备不允许应用程序控制捕获数据信
息的设置<
/p>
(
3A
控制除外)
,
大分辨率图像的高帧率捕获,
raw
数据的获取,或者上面所说的最大视频分辨率的
YUV
输出<
/p>
流(对于大图像只支持
JPEG
)
。
Limited
模式行为的细节如下:
·
p>
Limited
模式的设备不需要实现请求配置与实际捕
获图像数据的完全匹配。
相反,
将来有时改变配置
将更高效,
可能也不需要一个配置必须对应一个同样的输出帧。快速改
< br>变配置可能会使得某些配置从来没有被使用过。但是,有高
分辨率(大于
1080P
)输出
buffer
的捕获必须使用指定的配
置(处理速度的描述如下)
。
·
在
limited
< br>模式下,有高分辨率(大于
1080P
)输
出
buffer
的捕获在函数
process_capture_request()
中会阻塞,
< br>直到所有输出
buffer
都被填充。
< br>Full
模式
HAL
层设备必须
按
照静态元数据中指定的速率,处理相应像素格式的高分辨率
请
求的序列。
HAL
层调用函数
proc
ess_capture_result()
产生
输出结果;<
/p>
framework
层需要为函数
pro
cess_capture_request()
做好准备,
然
后阻塞,
直到
limited
模式设备
的高分辨率捕获请求被函数
process_capture_result()
执行完毕。
·
Limited
< br>设备不需要支持大多数的配置、结果、静
态信息。只有下面的配置期待被
limited
模式
HAL
层设备所
支持:
o
bandingMode(controls)
o
sureCompensation(controls)
o
(controls)
o
(controls)
o
[OFF meansON_FLASH_TORCH]
o
ons(controls)
o
etFpsRange(controls)
o
(controls)
o
[OFF means infinityfocus]
o
ons(controls)
o
k(controls)
o
e(controls)
o
[OFF not supported]
o
ions(controls)
-
-
-
-
-
-
-
-
-
上一篇:cadence学习笔记-画原理图库
下一篇:GoldenGate(故障处理)