我正在尝试调整相机的亮度。在设置亮度之前,我正在尝试检查亮度是否处于自动模式。我们可以通过检查 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 ,但是后来我无法找到任何其他方法来获取值布尔属性。
答案 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;
}