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 控制參考

由於項目過多,不一一列舉,包含了編碼、相機控制、視頻控制、FM傳輸控制、閃光燈控制等。詳見http://linuxtv.org/downloads/v4l-dvb-apis/extended-controls.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章