簡體   English   中英

在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;

}

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM