7.10. ioctl VIDIOC_ENCODER_CMD, VIDIOC_TRY_ENCODER_CMD¶
7.10.1. 名稱¶
VIDIOC_ENCODER_CMD - VIDIOC_TRY_ENCODER_CMD - 執行編碼器命令
7.10.2. 概要¶
-
VIDIOC_ENCODER_CMD¶
int ioctl(int fd, VIDIOC_ENCODER_CMD, struct v4l2_encoder_cmd *argp)
-
VIDIOC_TRY_ENCODER_CMD¶
int ioctl(int fd, VIDIOC_TRY_ENCODER_CMD, struct v4l2_encoder_cmd *argp)
7.10.3. 引數¶
fd由
open()返回的檔案描述符。argp指向 struct
v4l2_encoder_cmd的指標。
7.10.4. 描述¶
這些 ioctl 控制音訊/影片(通常是 MPEG)編碼器。VIDIOC_ENCODER_CMD 向編碼器傳送命令,VIDIOC_TRY_ENCODER_CMD 可用於嘗試命令而無需實際執行它。
要傳送命令,應用程式必須初始化 struct v4l2_encoder_cmd 的所有欄位,並使用指向此結構的指標呼叫 VIDIOC_ENCODER_CMD 或 VIDIOC_TRY_ENCODER_CMD。
cmd 欄位必須包含命令程式碼。一些命令使用 flags 欄位獲取其他資訊。
在 STOP 命令之後,read() 呼叫將讀取驅動程式緩衝的剩餘資料。當緩衝區為空時,read() 將返回零,並且下一個 read() 呼叫將重新啟動編碼器。
如果編碼器尚未啟動,read() 或 VIDIOC_STREAMON 呼叫會向編碼器傳送隱式 START 命令。適用於 mem2mem 編碼器的兩個佇列。
流式檔案描述符的 close() 或 VIDIOC_STREAMOFF 呼叫會向編碼器傳送隱式立即 STOP,並且所有緩衝的資料都將被丟棄。適用於 mem2mem 編碼器的兩個佇列。
這些 ioctl 是可選的,並非所有驅動程式都支援它們。它們是在 Linux 2.6.21 中引入的。但是,對於有狀態 mem2mem 編碼器來說,它們是強制性的(如 記憶體到記憶體有狀態影片編碼器介面 中進一步記錄的)。
-
type v4l2_encoder_cmd¶
__u32 |
|
編碼器命令,請參見 編碼器命令。 |
__u32 |
|
與命令一起使用的標誌,請參見 編碼器命令標誌。如果未為此命令定義任何標誌,則驅動程式和應用程式必須將此欄位設定為零。 |
__u32 |
|
保留供將來擴充套件。驅動程式和應用程式必須將陣列設定為零。 |
|
0 |
啟動編碼器。當編碼器已經在執行或暫停時,此命令不執行任何操作。未為此命令定義任何標誌。 對於實現 記憶體到記憶體有狀態影片編碼器介面 的裝置,一旦使用 |
|
1 |
停止編碼器。當設定了 對於實現 記憶體到記憶體有狀態影片編碼器介面 的裝置,該命令將啟動 記憶體到記憶體有狀態影片編碼器介面 中記錄的排空序列。在這種情況下,不接受任何標誌或其他引數。在序列完成之前再次嘗試呼叫該命令將觸發 |
|
2 |
暫停編碼器。當編碼器尚未啟動時,驅動程式將返回 |
|
3 |
在 PAUSE 命令後恢復編碼。當編碼器尚未啟動時,驅動程式將返回 |
|
0x0001 |
在當前影像組的末尾停止編碼,而不是立即停止。 不適用於 記憶體到記憶體有狀態影片編碼器介面。 |
7.10.5. 返回值¶
成功時返回 0,出錯時返回 -1,並適當設定 errno 變數。通用錯誤程式碼在 通用錯誤程式碼 章節中描述。
- EBUSY
實現 記憶體到記憶體有狀態影片編碼器介面 的裝置的排空序列仍在進行中。在它完成之前,不允許發出另一個編碼器命令。
- EINVAL
cmd欄位無效。- EPERM
當編碼器未執行時,應用程式傳送了 PAUSE 或 RESUME 命令。