在v4l2中获取布尔控件的值

时间:2015-03-25 08:29:39

标签: linux linux-device-driver v4l2

我正在尝试调整相机的亮度。在设置亮度之前,我正在尝试检查亮度是否处于自动模式。我们可以通过检查 volatile 标志来执行此操作,但我正在运行没有此功能的内核版本2.6.32。所以,另一种选择是检查我正在做的 V4L2_CID_AUTOBRIGHTNESS ,但它正在返回EINVAL。

我使用以下代码来获取值:

struct v4l2_control control;

control.id = V4L2_CID_BRIGHTNESS;       // This is working fine
//control.id = V4L2_CID_AUTOBRIGHTNESS; // This is giving EINVAL in ioctl


if (-1 == ioctl(camDesc, VIDIOC_G_CTRL, &control))
   cerr << "VIDIOC_G_CTRL" << "   ::  " << errno << endl ;
else
   cout << "Successfully got property. Value :: " << control.value << endl;

可能 V4L2_CID_AUTOBRIGHTNESS 是一个布尔属性,这就是为什么它提供 EINVAL ,但是后来我无法找到任何其他方法来获取值布尔属性。

2 个答案:

答案 0 :(得分:2)

在V4L2中,IOCTL集合主要在实际传感器侧实现(或未实现)。这个也不例外。因此,这里有两个潜在的问题:a)实际传感器的驱动程序没有实现特定的IOCTL,b)IOCTL只是设置属性,但我认为你仍然可以读取最后的设置值。

答案 1 :(得分:0)

可以禁用某些属性(用户控件),因此如果我们使用 v4l2_control 直接更改该值,则可能会出现一些错误。

最好的方法是,使用 queryctrl 检查相应的标记,然后设置实际值。

struct v4l2_queryctrl queryctrl;
queryctrl.id = V4L2_CID_BRIGHTNESS;  // V4L2_CID_AUTOBRIGHTNESS i.e. any user ctrl

if (-1 == ioctl(camDesc, VIDIOC_QUERYCTRL, &queryctrl))
{
   if (errno != EINVAL)
      exit(EXIT_FAILURE);
   else
   {
      cerr << "ERROR :: Unable to set property (NOT SUPPORTED)\n";
      exit(EXIT_FAILURE);
    }
}
else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
{
   cout << "ERROR :: Unable to set property (DISABLED).\n";
   exit(EXIT_FAILURE);
}
else
{
  struct v4l2_control control;
  control.id = queryctrl.id;
  control.value = eValue;      // Any value

  if (-1 == ioctl(camDesc, VIDIOC_S_CTRL, &control))
     exit(EXIT_FAILURE);
  cout << "Successfully set property." << endl;

}