7.55. ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF

7.55.1. 名稱

VIDIOC_STREAMON - VIDIOC_STREAMOFF - 啟動或停止流式 I/O

7.55.2. 概要

VIDIOC_STREAMON

int ioctl(int fd, VIDIOC_STREAMON, const int *argp)

VIDIOC_STREAMOFF

int ioctl(int fd, VIDIOC_STREAMOFF, const int *argp)

7.55.3. 引數

fd

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

argp

指向整數的指標。

7.55.4. 描述

VIDIOC_STREAMONVIDIOC_STREAMOFF ioctl 在流式 I/O 期間啟動和停止捕獲或輸出過程 (記憶體對映使用者指標DMABUF)。

在呼叫 VIDIOC_STREAMON 之前,捕獲硬體將被停用,並且不會填充任何輸入緩衝區(如果在傳入佇列中有任何空緩衝區)。在呼叫 VIDIOC_STREAMON 之前,輸出硬體將被停用,並且不會產生任何影片訊號。

在捕獲和輸出流型別都呼叫 VIDIOC_STREAMON 之前,記憶體到記憶體裝置不會啟動。

如果 VIDIOC_STREAMON 失敗,則任何已排隊的緩衝區將保持排隊狀態。

除了中止或完成任何正在進行的 DMA 之外,VIDIOC_STREAMOFF ioctl 還會解鎖物理記憶體中鎖定的任何使用者指標緩衝區,並從傳入和傳出佇列中刪除所有緩衝區。這意味著所有捕獲但尚未出列的影像都將丟失,同樣所有已排隊用於輸出但尚未傳輸的影像也將丟失。I/O 返回到呼叫 ioctl VIDIOC_REQBUFS 後的狀態,並且可以相應地重新啟動。

如果緩衝區已使用 ioctl VIDIOC_QBUF, VIDIOC_DQBUF 排隊,並且在從未呼叫 VIDIOC_STREAMON 的情況下呼叫了 VIDIOC_STREAMOFF,那麼這些排隊的緩衝區也將從傳入佇列中刪除,並且所有緩衝區都將返回到呼叫 ioctl VIDIOC_REQBUFS 後的狀態,並且可以相應地重新啟動。

這兩個 ioctl 都採用指向整數的指標,即所需的緩衝區或流型別。這與 struct v4l2_requestbuffers type 相同。

如果在流式傳輸已經在進行中時呼叫 VIDIOC_STREAMON,或者如果在流式傳輸已經停止時呼叫 VIDIOC_STREAMOFF,則返回 0。VIDIOC_STREAMON 的情況下不會發生任何事情,但 VIDIOC_STREAMOFF 會將排隊的緩衝區返回到如上所述的起始狀態。

注意

應用程式可以在 VIDIOC_STREAMONVIDIOC_STREAMOFF 呼叫之前或之後的不確定時間內被搶佔,沒有“立即”啟動或停止的概念。可以使用緩衝區時間戳與其他事件同步。

7.55.5. 返回值

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

EINVAL

不支援緩衝區 type,或者尚未分配緩衝區(記憶體對映)或排隊(輸出)。

EPIPE

驅動程式實現了 pad 級別格式配置 並且管道配置無效。

ENOLINK

驅動程式實現了媒體控制器介面並且管道連結配置無效。