V4L2文件翻譯(四)

2021-06-22 18:49:04 字數 1985 閱讀 8551



介紹不幸的是,原始的控制api缺少一些新環境下需要的特性,所以這裡也就應運而生了擴充套件控制api。

mpeg編碼api是第乙個使用擴充套件api的,如今也有了其他型別的擴充套件控制,如相機控制、fm傳輸控制等。下邊就描述一下所有型別的擴充套件控制api。

擴充套件控制api

這裡有三個新的ioctl:vidioc_g_ext_ctrls,vidioc_s_ext_ctrls,vidioc_try_ext_ctrls。這寫ioctl作用於多個控制(這與vidioc_g_ctrl和vidioc_s_ctrl相反,他們是作用與乙個控制)。這是因為他們經常被用來一次修改多個控制。

每乙個新的ioctl都需要乙個struct v4l2_ext_controls型別指標。這個型別結構體包含了乙個控制集合指標,乙個集合中的成員數以及控制型別。一組相似的控制為乙個控制類。比如,控制型別v4l2_ctrl_class_user包含所有的使用者操作(可以使用vidioc_s_ctrl進行設定)。v4l2_ctrl_classs_mpeg包含了所有mpeg編碼相關控制。

在控制集合中的所有控制必須依附於乙個特定控制類,如果不是的話,將返回錯誤。

可以通過空的控制集合(count=0集合成員數為0)來檢測這個特定的控制型別是否能夠支援。

struct v4l2_ext_controls與struct v4l2_control十分相似,除了支援64位值和指標。

考慮到控制的靈活性,檢查其是否被驅動支援以及其值的有效範圍尤其重要。使用vidioc_queryctrl和vidioc_querymenu進行檢查。同時,要注意控制的選單索引可能不支援v4l2_ctrl_type_menu型別(vidioc_querymenu會返回錯誤)。乙個很好的例子是mpeg支援的聲音波特率。一些驅動只支援乙個或兩個波特率,其他則支援更寬的範圍。

所有控制按機器位元組順序排列。

列舉擴充套件控制

推薦使用vidioc_queryctrl與v4l2_ctrl_flag_next_ctrl標誌組合來列舉擴充套件控制:

struct v4l2_queryctrl qctrl;

qctrl.id = v4l2_ctrl_flag_next_ctrl;

while (0 == ioctl (fd, vidioc_queryctrl, &qctrl))

初始控制id為0,帶有v4l2_ctrl_flag_next_ctrl標籤。vidioc_queryctrl會返回第乙個比規定的id高的那個id,如果沒有找到則返回錯誤。

如果你想要獲取規定控制類的全部控制,你可以通過初始化qctrl.id的值為特定控制類,並外加乙個檢測:

qctrl.id = v4l2_ctrl_class_mpeg | v4l2_ctrl_flag_next_ctrl;

while (0 == ioctl (fd, vidioc_queryctrl, &qctrl))

qutrl.id為32位的值,有三個位區域:最高4位為標籤保留位,並不是id的一部分。其餘的28位是控制id的格式,高12位定義控制類,低16位是此型別中的控制識別符號。這樣保證了最後16位都是非0值。0x1000的範圍被保留為驅動特許控制,v4l2_ctrl_id2class巨集返回的是基於控制id的控制類id。

若驅動不支援擴充套件控制,vidioc_queryctrl在帶v4l2_ctrl_flag_next_ctrl的請求將會失敗。這時,列舉控制應該使用老方法(如例1.8),但如果支援的話,它可以將所有的控制都列舉出來,包括驅動私有控制。

建立控制盤

可以為圖形使用者介面建立控制盤,使用者可以通過它選擇多種控制。基本上,你不得不使用上邊的方法來一次次的處理所有控制。每個控制類都以型別v4l2_ctrl_type_ctrl_class開始,vidioc_queryctrl將會返回控制表盤中標籤頁的名字對應的控制類名稱。

struct v4l2_queryctrl結構體中的flags成員同樣包含了控制的行為。vidioc_queryctrl的文件包含了更多的細節。

編碼控制參考

更多

V4L2文件翻譯(一)

相關資料 裝置命名 每乙個驅動註冊乙個或多個裝置節點後他們的主裝置號都是81,而子裝置號在0 255之間。除非通過config video fixed minor ranges編譯選項編譯核心,否則子裝置號是動態分配的。而且,子裝置號分配範圍與裝置節點型別有關 video radio等 很多驅動支援...

V4L2文件翻譯(八)

struct v4l2 pix format型別 成員名描述 u32 width 寬度 畫素 u32 height 高度 畫素 若field是v4l2 field top v4l2 field bottom v4l2 field alternate之一那麼高度指的是此區域的行數,否則的話指的是此幀的...

V4L2文件翻譯(三)

裝置通常有一些使用者可設定的控制器,如亮度和飽和度等等一些會展示在圖形使用者介面的東西。但不同裝置會有不同的可用設定,而且此外其可設定值範圍 預設值在不同裝置上也不盡相同。控制ioctl提供創造乙個良好使用者介面的資訊和機制,這會讓這些控制器在任何裝置上都能正確的工作。所有控制器都需通過id值進行訪...