Qcom platform Android通过Ais_client获取QNX侧camera数据流程:
1.数据发起比如是Android的app,通过camera2Api访问和控制camera,具体细节不展开,可以参考之前的文章有介绍,这里重点介绍AndroidHAL的适配。
2.正常的Android手机camera调用流程到Hal之后,直接通过V4L2驱动去Kernel拿camera的数据,但是对于虚拟化平台,camera的驱动是在QNX侧,camera数据源也即是在QNX,所以Android侧要拿camera数据是通过qcom封装的ais_client接口获取到的,ais_client和ais_sever之间使用的是HAB链路。HAB介绍:
- 消息传递(实际上就是domain socket实现的),比如camera的打开,buffer的设置等操作
- 数据共享(Camera data flow is transparent to the message channel. Memory is mapped during set_buffer(). The Getframe() call returns which buffer contains data, allowing the application to use the data and then call releaseFrame() to give it back to the system to use again.)所以参考上图,buffers的申请是在V4L2_proxy里面申请的
3.这里有一个感觉不合理的点就是Android这边通过上面的ais_client拿到数据后又灌倒了V4L2Loopback设备节点里面了,最终被Camera app中的suface消费。这个设计可能是为了适配Android CameraHal吧。