7.49. ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL 和 VIDIOC_QUERYMENU¶
7.49.1. 名稱¶
VIDIOC_QUERYCTRL - VIDIOC_QUERY_EXT_CTRL - VIDIOC_QUERYMENU - 列舉控制元件和選單控制元件項
7.49.2. 概要¶
int ioctl(int fd, int VIDIOC_QUERYCTRL, struct v4l2_queryctrl *argp)
-
VIDIOC_QUERY_EXT_CTRL¶
int ioctl(int fd, VIDIOC_QUERY_EXT_CTRL, struct v4l2_query_ext_ctrl *argp)
-
VIDIOC_QUERYMENU¶
int ioctl(int fd, VIDIOC_QUERYMENU, struct v4l2_querymenu *argp)
7.49.3. 引數¶
fd由
open()返回的檔案描述符。argp指向 struct
v4l2_queryctrl、v4l2_query_ext_ctrl或v4l2_querymenu的指標(取決於 ioctl)。
7.49.4. 描述¶
要查詢控制元件的屬性,應用程式需要設定 struct v4l2_queryctrl 的 id 欄位,並使用指向此結構的指標呼叫 VIDIOC_QUERYCTRL ioctl。驅動程式會填充結構的其餘部分,或者當 id 無效時返回 EINVAL 錯誤程式碼。
可以透過從 V4L2_CID_BASE 開始,直到但不包括 V4L2_CID_LASTP1,連續呼叫 VIDIOC_QUERYCTRL 並使用遞增的 id 值來列舉控制元件。如果不支援此範圍內的控制元件,驅動程式可能會返回 EINVAL。此外,應用程式可以透過從 V4L2_CID_PRIVATE_BASE 開始並遞增 id,直到驅動程式返回 EINVAL,來列舉此規範中未定義的私有控制元件。
在這兩種情況下,當驅動程式在 flags 欄位中設定 V4L2_CTRL_FLAG_DISABLED 標誌時,此控制元件將被永久停用,應用程式應忽略它。[1]
當應用程式將 id 與 V4L2_CTRL_FLAG_NEXT_CTRL 進行 OR 運算時,驅動程式將返回下一個支援的非複合控制元件,如果沒有,則返回 EINVAL。此外,可以指定 V4L2_CTRL_FLAG_NEXT_COMPOUND 標誌來列舉所有複合控制元件(即型別 ≥ V4L2_CTRL_COMPOUND_TYPES 和/或陣列控制元件的控制元件,換句話說,包含多個值的控制元件)。同時指定 V4L2_CTRL_FLAG_NEXT_CTRL 和 V4L2_CTRL_FLAG_NEXT_COMPOUND 以列舉所有控制元件,無論是否為複合控制元件。尚不支援這些標誌的驅動程式始終返回 EINVAL。
引入 VIDIOC_QUERY_EXT_CTRL ioctl 是為了更好地支援可以使用複合型別的控制元件,並公開無法在 struct v4l2_queryctrl 中返回的其他控制元件資訊,因為該結構已滿。
VIDIOC_QUERY_EXT_CTRL 的使用方式與 VIDIOC_QUERYCTRL 相同,只是 reserved 陣列也必須清零。
選單控制元件需要額外的資訊:選單項的名稱。要查詢它們,應用程式需要設定 struct v4l2_querymenu 的 id 和 index 欄位,並使用指向此結構的指標呼叫 VIDIOC_QUERYMENU ioctl。驅動程式會填充結構的其餘部分,或者當 id 或 index 無效時返回 EINVAL 錯誤程式碼。透過呼叫 VIDIOC_QUERYMENU 並使用從 struct v4l2_queryctrl 的 minimum 到 maximum(包括兩者)的遞增的 index 值來列舉選單項。
注意
VIDIOC_QUERYMENU 可能會為 minimum 和 maximum 之間的一些索引返回 EINVAL 錯誤程式碼。在這種情況下,該特定選單項不受此驅動程式的支援。另請注意,minimum 值不一定為 0。
另請參閱 使用者控制元件 中的示例。
__u32 |
|
標識控制元件,由應用程式設定。有關預定義的 ID,請參閱 控制元件 ID。當 ID 與 V4L2_CTRL_FLAG_NEXT_CTRL 進行 OR 運算時,驅動程式會清除該標誌並返回第一個 ID 較高的控制元件。尚不支援此標誌的驅動程式始終返回 |
__u32 |
|
控制元件型別,請參閱 |
__u8 |
|
控制元件的名稱,以 NUL 結尾的 ASCII 字串。此資訊供使用者使用。 |
__s32 |
|
最小值,包括。此欄位給出了控制元件的下限。有關最小值如何用於每種可能的控制元件型別,請參閱 enum |
__s32 |
|
最大值,包括。此欄位給出了控制元件的上限。有關最大值如何用於每種可能的控制元件型別,請參閱 enum |
__s32 |
|
此欄位給出了控制元件的步長。有關步長值如何用於每種可能的控制元件型別,請參閱 enum 通常,驅動程式不應縮放硬體控制元件值。例如,當 此欄位給出了整數控制元件的最小更改,該更改實際影響硬體。通常,當用戶可以透過鍵盤或 GUI 按鈕而不是滑塊來更改控制元件時,需要此資訊。例如,當硬體暫存器接受 0-511 的值,而驅動程式報告 0-65535 時,步長應為 128。 請注意,儘管已簽名,但步長值應始終為正值。 |
__s32 |
|
注意 驅動程式僅在首次載入驅動程式時將控制元件重置為其預設值,之後不再重置。 |
__u32 |
|
控制元件標誌,請參閱 控制元件標誌。 |
__u32 |
|
為將來的擴充套件保留。驅動程式必須將陣列設定為零。 |
__u32 |
|
標識控制元件,由應用程式設定。有關預定義的 ID,請參閱 控制元件 ID。當 ID 與 |
__u32 |
|
控制元件型別,請參閱 |
char |
|
控制元件的名稱,以 NUL 結尾的 ASCII 字串。此資訊供使用者使用。 |
__s64 |
|
最小值,包括。此欄位給出了控制元件的下限。有關最小值如何用於每種可能的控制元件型別,請參閱 enum |
__s64 |
|
最大值,包括。此欄位給出了控制元件的上限。有關最大值如何用於每種可能的控制元件型別,請參閱 enum |
__u64 |
|
此欄位給出了控制元件的步長。有關步長值如何用於每種可能的控制元件型別,請參閱 enum 通常,驅動程式不應縮放硬體控制元件值。例如,當 此欄位給出了整數控制元件的最小更改,該更改實際影響硬體。通常,當用戶可以透過鍵盤或 GUI 按鈕而不是滑塊來更改控制元件時,需要此資訊。例如,當硬體暫存器接受 0-511 的值,而驅動程式報告 0-65535 時,步長應為 128。 |
__s64 |
|
注意 驅動程式僅在首次載入驅動程式時將控制元件重置為其預設值,之後不再重置。 |
__u32 |
|
控制元件標誌,請參閱 控制元件標誌。 |
__u32 |
|
陣列單個元素的大小(以位元組為單位)。給定一個指向 3 維陣列的 char 指標 |
__u32 |
|
N 維陣列中的元素數。如果此控制元件不是陣列,則 |
__u32 |
|
N 維陣列中的維數。如果此控制元件不是陣列,則此欄位為 0。 |
__u32 |
|
每個維度的大小。此陣列的前 |
__u32 |
|
為將來的擴充套件保留。應用程式和驅動程式必須將陣列設定為零。 |
__u32 |
|
標識控制元件,由應用程式從相應的 struct v4l2_queryctrl |
__u32 |
|
選單項的索引,從零開始,由應用程式設定。 |
union { |
(anonymous) |
|
__u8 |
|
選單項的名稱,以 NUL 結尾的 ASCII 字串。此資訊供使用者使用。此欄位對 |
__s64 |
|
整數選單項的值。此欄位對 |
} |
||
__u32 |
|
為將來的擴充套件保留。驅動程式必須將陣列設定為零。 |
-
type v4l2_ctrl_type¶
型別 |
|
|
|
描述 |
|---|---|---|---|---|
|
任意 |
任意 |
任意 |
一個整數值控制元件,範圍從最小值到最大值(包括)。步長值表示值之間的增量。 |
|
0 |
1 |
1 |
一個布林值控制元件。零對應於“已停用”,一表示“已啟用”。 |
|
≥ 0 |
1 |
N-1 |
控制元件具有 N 個選項的選單。可以使用 |
|
≥ 0 |
1 |
N-1 |
控制元件具有 N 個選項的選單。可以使用 |
|
0 |
n/a |
任意 |
一個位掩碼欄位。最大值是可以使用的位集,所有其他位都應為 0。最大值被解釋為 __u32,允許在位掩碼中使用位 31。 |
|
0 |
0 |
0 |
一個在設定時執行操作的控制元件。驅動程式必須忽略使用 |
|
任意 |
任意 |
任意 |
一個 64 位整數值控制元件。無法使用 |
|
≥ 0 |
≥ 1 |
≥ 0 |
最小和最大字串長度。步長表示字串的長度必須為(最小值 + N * 步長),其中 N ≥ 0。這些長度不包括終止零,因此為了將長度為 8 的字串傳遞給 VIDIOC_S_EXT_CTRLS,需要將 struct |
|
n/a |
n/a |
n/a |
這不是控制元件。當使用等於控制元件類程式碼(請參閱 控制元件類)+ 1 的控制元件 ID 呼叫 |
|
任意 |
任意 |
任意 |
一個無符號的 8 位值控制元件,範圍從最小值到最大值(包括)。步長值表示值之間的增量。 |
|
任意 |
任意 |
任意 |
一個無符號的 16 位值控制元件,範圍從最小值到最大值(包括)。步長值表示值之間的增量。 |
|
任意 |
任意 |
任意 |
一個無符號的 32 位值控制元件,範圍從最小值到最大值(包括)。步長值表示值之間的增量。 |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
n/a |
n/a |
n/a |
一個 struct |
|
0x0001 |
此控制元件已永久停用,應被應用程式忽略。任何更改控制元件的嘗試都將導致 |
|
0x0002 |
此控制元件暫時無法更改,例如因為另一個應用程式控制了相應的資源。此類控制元件可能會在使用者介面中以特殊方式顯示。 嘗試更改控制元件可能會導致 |
|
0x0004 |
此控制元件永久只讀。 任何更改控制元件的嘗試都會導致 |
|
0x0008 |
提示:更改此控制元件可能會影響同一控制元件類中其他控制元件的值。 應用程式應相應地更新其使用者介面。 |
|
0x0010 |
此控制元件不適用於當前配置,應在使用者介面中相應地顯示。 例如,當使用另一個控制元件選擇 MPEG 音訊編碼級別 1 時,可以在 MPEG 音訊級別 2 位元率控制元件上設定此標誌。 |
|
0x0020 |
提示:此控制元件最好在使用者介面中表示為類似滑塊的元素。 |
|
0x0040 |
此控制元件永久只寫。 任何讀取控制元件的嘗試都會導致 |
|
0x0080 |
此控制元件是可變的,這意味著控制元件的值會持續變化。 一個典型的例子是如果裝置處於自動增益模式,則為當前增益值。 在這種情況下,硬體會根據光照條件計算增益值,而光照條件可能會隨著時間的推移而變化。 注意 除非同時設定了 V4L2_CTRL_FLAG_EXECUTE_ON_WRITE,否則設定可變控制元件的新值將被忽略。 設定可變控制元件的新值永遠不會觸發 V4L2_EVENT_CTRL_CH_VALUE 事件。 |
|
0x0100 |
此控制元件具有指標型別,因此必須使用結構體 |
|
0x0200 |
即使提供給控制元件的值保持不變,也會將其傳播到驅動程式。 當控制元件表示硬體上的操作時,這是必需的。 例如:清除錯誤標誌或觸發閃光燈。 所有 |
|
0x0400 |
更改此控制元件值可能會修改緩衝區(對於影片裝置)或媒體匯流排格式(對於子裝置)的佈局。 一個典型的例子是 請注意,通常,當緩衝區分配或流傳輸正在進行時,具有此標誌的控制元件也將設定 |
|
0x0800 |
此控制元件是動態大小的一維陣列。 它的行為與常規陣列相同,只是 |
|
0x1000 |
此控制元件支援使用 vidioc_g_ext_ctrls 和 V4L2_CTRL_WHICH_MIN/MAX_VAL 獲取最小值和最大值。 |
7.49.5. 返回值¶
成功時返回 0,出錯時返回 -1,並相應地設定 errno 變數。 通用錯誤程式碼在 通用錯誤程式碼 章節中描述。
- EINVAL
結構體 v4l2_queryctrl 的
id無效。 結構體 v4l2_querymenu 的id無效,或者index超出範圍(小於minimum或大於maximum),或者驅動程式不支援此特定選單項。- EACCES
嘗試讀取只寫控制元件。