1. 程式人生 > >V4L2文件翻譯(四)

V4L2文件翻譯(四)

擴充套件控制

介紹

控制機制原本是用於使用者設定(如亮度,飽和度等)。但無論如何,它恰恰證明了對於複雜驅動他是個非常有用的模型,如每個驅動包含一個大型API的子模組。
MPEG編碼API就是在這樣的設計理念下:MPEG標準十分龐大,當前支援MPEG編碼的硬體只是聲明瞭這個標準的一小部分。另外,許多關係到怎樣將視訊編碼到MPEG流的引數是定義在MPEG編碼晶片中,因為MPEG標準只定義了最終MPEG流的格式,並沒有規定視訊如何成為MPEG格式。

不幸的是,原始的控制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)) {
    /* ... */
    qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
}

初始控制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)) {
    if (V4L2_CTRL_ID2CLASS (qctrl.id) != V4L2_CTRL_CLASS_MPEG)
        break;
        /* ... */
        qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
    }

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的文件包含了更多的細節。

編碼控制參考

  • 一般編碼控制
  • MFC 5.1 MPEG控制
  • CX2341x MPEG控制
  • VPX 控制參考