在 v4l2 中获取布尔控件的值

Getting value of a boolean control in 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 的原因,但后来我我无法找到任何其他方法来获取布尔值 属性.

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

某些属性(用户控件)可以禁用,因此如果我们使用 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;

}