7.66. ioctl VIDIOC_SUBSCRIBE_EVENT, VIDIOC_UNSUBSCRIBE_EVENT

7.66.1. 名稱

VIDIOC_SUBSCRIBE_EVENT - VIDIOC_UNSUBSCRIBE_EVENT - 訂閱或取消訂閱事件

7.66.2. 概要

VIDIOC_SUBSCRIBE_EVENT

int ioctl(int fd, VIDIOC_SUBSCRIBE_EVENT, struct v4l2_event_subscription *argp)

VIDIOC_UNSUBSCRIBE_EVENT

int ioctl(int fd, VIDIOC_UNSUBSCRIBE_EVENT, struct v4l2_event_subscription *argp)

7.66.3. 引數

fd

open() 返回的檔案描述符。

argp

指向結構體 v4l2_event_subscription 的指標。

7.66.4. 描述

訂閱或取消訂閱 V4L2 事件。訂閱的事件透過使用 ioctl VIDIOC_DQEVENT ioctl 出隊。

type v4l2_event_subscription
struct v4l2_event_subscription

__u32

type

事件型別,請參閱 事件型別

注意

V4L2_EVENT_ALL 可以與 VIDIOC_UNSUBSCRIBE_EVENT 一起使用,用於一次取消訂閱所有事件。

__u32

id

事件源的 ID。 如果沒有與事件源關聯的 ID,則將其設定為 0。 事件是否需要 ID 取決於事件型別。

__u32

flags

事件標誌,請參閱 事件標誌

__u32

reserved[5]

保留供將來擴充套件使用。 驅動程式和應用程式必須將陣列設定為零。

事件標誌

V4L2_EVENT_SUB_FL_SEND_INITIAL

0x0001

當訂閱此事件時,將傳送包含當前狀態的初始事件。 這僅對由狀態更改觸發的事件有意義,例如 V4L2_EVENT_CTRL。 其他事件將忽略此標誌。

V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK

0x0002

如果設定,則由 ioctl 直接引起的事件也將傳送到呼叫該 ioctl 的檔案控制代碼。 例如,使用 VIDIOC_S_CTRL 更改控制元件將導致 V4L2_EVENT_CTRL 傳送回該相同的檔案控制代碼。 通常,此類事件會被抑制,以防止反饋迴圈,其中應用程式將控制元件更改為一個值,然後再更改為另一個值,然後收到一個事件,告知它該控制元件已更改為第一個值。

由於它無法判斷該事件是由另一個應用程式引起的還是由 VIDIOC_S_CTRL 呼叫引起的,因此很難決定是否將控制元件設定為事件中的值,還是忽略它。

設定此標誌時請仔細考慮,這樣您就不會陷入類似的情況。

7.66.5. 返回值

成功時返回 0,出錯時返回 -1,並適當設定 errno 變數。 通用錯誤程式碼在 通用錯誤程式碼 章節中描述。