转眼一看,上一次发博文都快是三年之前了,惭愧 ! 主要是三年前找的这份工作,虽然是世界500强的技术大牛公司,但是工作可一点都不高大上,非常的忙,一天不但要处理各种camera的bug,还要开发camera的各种feature和sensor驱动,还要和内部、外部的人各种扯皮,你懂的。忙的三年了才有闲心来发表这片博文。
牢骚已完,言归正传。
在Android 5.0上,Google正式的将Camera HAL 3.0作为一个标准配置进行了发行,当然Camera HAL V1也是作为兼容标准是可以用的。但是很多有实力的芯片厂商都第一时间切换到了HAL V3。 HAL V3与V1最大的本质区别,我认为就是把帧的参数和帧的图像数据绑定到了一起,比如V1的时候一张preview上来的YUV帧,APP是不知道这个YUV帧采用的Gain和曝光时间究竟是多少。但是在V3里面,每一帧都有一个数据结构来描述,其中包括了帧的参数和帧的数据,当APP发送一个request的时候是需要指定使用什么样的参数,到request返回的时候,返回数据中就有图像数据和相关的参数配置。
在V1里面,如果想增加一些厂商特定的参数,比如增加Saturation的设置,最简单的方法就是直接使用CameraParameters.set来实现,即在APP中,
Camera.Parameters mParameters = mCamera.getParameters();
mParameters.set("saturation", 10);
mCamera.setParameters(parameters);
由于HAL V1的参数传递是通过字符串来完成的,也就是最后传到HAL的字符串里面会有“saturation=10” 这样的字符串,在HAL直接解析这些字符串就OK了。
但是到了HAL V3,从framework到hal的参数传递都是通过metadata的方式来传递,简单的说就是每一个设置现在都变成了一个参数对,比如假设要设置AE mode为auto,以前V1可能是“AE mode=auto”这样的字符串,在V3就是比如AE mode的功能序号是10,参数auto为