现象

  1. 手动切换没有问题
  2. 单路摄像头自动切换日夜没有问题
  3. 双路摄像头自动切换日夜不受控制

思路

  • 查看两路camera是如何实现对应参数的传递
  • 了解如何实现两路摄像头的分别控制
  • 了解日夜切换的逻辑

过程

  1. 两路camera是如何实现不同的参数的?
    需要看HAL层camera类的构造函数。可以看到HWI中是总的类,里面包含状态机,回调函数等等函数封装,初始化用QCamera2HardwareInterface(camera_id),多一个摄像头就增加一个对象。
    在hal层里面加一个对cameraid的判断,由于是创建了两个对象,互不干扰,因此只需要对id号进行判断,赋值还是一样的赋值。
    注意了ispctrl参数是用QCameraParameters进行传递,它是在QCameraParametersIntf类里面的,随着QCamera2HardwareInterface类的定义而定义。QCamera2HardwareInterface又是在QCamera2HardwareInterface中定义的,也就是说随着一个摄像头的创建,会创建这个摄像头的整个实现方法。
  2. 高通代码是以面向对象的思想去写的,日夜切换的代码只有一套,由上层创建了两个摄像头,分别进行控制,两个摄像头的运行互不干扰。
  3. 问题就出现在两个摄像头的运行受到了干扰,每个摄像头都需要保存上次切换的时间,而这个时间应该是分离的,但是用的是static变量,导致这两个摄像头用的是同一个变量。

原因

C++中的static变量是静态数据成员
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
但是遇到一个问题,需要保存上一个动作的时间,以前都是用static的方法保存,但是用对象的方法时,就不能这样了,创建一个新的对象,这个时间不能自动增加一个。就会导致异常!!
因此static变量要注意使用的时机。

解决方案

将static变量转成私有的类成员变量,既能保证私有性,又能保证创建新对象的时候自动新建变量。

小结

c++:面向对象的写法中,慎重使用static变量