Android5.0对camera framework层进行了较大的调整,使用了支持HAL3的Camera3Device架构。下面就分析一下这个架构的结构和主要代码逻辑。
HAL3的设计思想:
其实HAL的代码复杂但是理清楚他的设计思想后还是比较简单的。Camera应用端与CameraService的交互还是一模一样的,只是以前的CameraClient变成了Camera2Client。在Camera2Client,有六个Processor(StreamingProcessor,CallbackProcessor,FrameProcessor,CaptureProcessor,CaptureSequencer,ZslProcessor,JpegProcessor),分别处理不同的请求,比如StreamingProcessor对应的是预览,JpegProcessor对应的是jpeg拍照。跟HAL1一样,Camera2Client也有一个device对象Camera3Device,他与Hal层的camera3_device_t对应。每个操作比如拍,照录像都会交给其中的一个或多个Processor处理。每个Processor都有一个或多个Stream。Stream分为Camera3OutputStream和Camera3InputStream。每个Camera3OutputStream其实就是一个生产者消费者功能单元,每个Camera3OutputStream都有一个consumer,目前consumer有CPUConsumer和SurfaceFilnger两个类型。所有的操作请求通过一个或多个Processor构建一个或多个OutputStream和InputStream。然后将这些Stream汇总起来封装成一个个Request。目前的Request主要有mPreviewRequest,mCaptureRequest,mRecordingRequest三种Request。而所有的Request在发给HAL层前都统一转化为CaptureRequest。请求的内容封装完成后就会通知RequestThread通过mHal3Device->ops->process_capture_request()通知HAL去处理这个请求,比如拍照啊,截取数据帧啊。在发送的Request还携带了的各个OutputStream的buffer,这些buffer是调用Stream的Consumer的dequeueBuffer获取的,我的理解是HAL层在获取到数据后可以在HAL层直接填充这些buffer。
请求已经下发完成,接下来就是数据的回调,Camera3Devcie继承自camera3_callback_ops,这个类有两个重要的函数notify和process_capture_result。底层拍照或者截取数据流等成功和失败后会把对应的信息通过这两个函数回调上来,然后交给Camera3Device处理,进而遍历之前创建的每个Stream处理,Stream会把数据交给SurfaceFilinger和CpuComsumer。如此完成数据的获取或推送到渲染引擎。
其中总结起来,app的请求通过Processor创建各个Stream,其实就是产生一个数组,包括所有提供食物的人(数据),消费数据的人。然后封装成一个个Request,通知HAL处理这个类型的请求。完成后回调Device的接口,然后Device遍历他里面的所有的OutPutStream,数据已经准备好了,挨个给他们喂食就好了,然后大家吃饱了,事情就算结束了。
主要函数调用:
设置previewTarget
Camera2Client::setPreviewTarget()àStreamingProcessor::setPreviewWindow()--->mPreviewWindow = window
数据回调:
camera3_callback_ops_t.process_capture_result()--->sProcessCaptureResult()--->Camera3Device.processCaptureResult()--->Camera3Device.returnOutputBuffers()--->Camera3Stream.returnBuffer()---> Camera3Stream.returnBufferLocked()