2015-03-25 37 views
1

我正在嘗試調整攝像頭的亮度。在設置亮度之前,我正在嘗試檢查亮度是否處於自動模式。我們可以通過檢查易失性標誌來實現,但是我正在運行內核版本2.6.32,它沒有這個功能。所以,另一種選擇是檢查V4L2_CID_AUTOBRIGHTNESS,這是我正在做的,但它正在返回EINVAL。在v4l2中獲取布爾值控件的值

我使用下面的代碼來獲取值:

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

某些屬性(用戶控件)可以被禁用,所以如果我們直接使用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; 

} 
2

在V4L2中,IOCTL集合主要在實際傳感器的一側實現(或未實現)。這一個不是例外。因此,這裏有兩個潛在的問題:a)實際傳感器的驅動程序沒有實現特定的IOCTL,b)IOCTL只是設置一個屬性,儘管我認爲你仍然可以讀取最後的設置值。

+0

感謝您的回覆。你在(b)點提到,** IOCTL只是設置一個屬性**,但你也可以使用IOCTL來獲得一個屬性。它受**請求**的價值支配。在我的情況下,如果您將通過** VIDIOC_G_CTRL **,那麼您將獲得該屬性,並在** VIDIOC_S_CTRL **的情況下,您將獲得該屬性。 – techbull 2015-03-27 08:13:24

+0

是的,因爲通常屬性被緩存在內部結構中(對於某些驅動程序來說可能不是這樣)。 – 0andriy 2015-03-27 14:48:59