[英]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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.