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_CMDVIDIOC_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
struct v4l2_encoder_cmd

__u32

cmd

編碼器命令,請參見 編碼器命令

__u32

flags

與命令一起使用的標誌,請參見 編碼器命令標誌。如果未為此命令定義任何標誌,則驅動程式和應用程式必須將此欄位設定為零。

__u32

data[8]

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

編碼器命令

V4L2_ENC_CMD_START

0

啟動編碼器。當編碼器已經在執行或暫停時,此命令不執行任何操作。未為此命令定義任何標誌。

對於實現 記憶體到記憶體有狀態影片編碼器介面 的裝置,一旦使用 V4L2_ENC_CMD_STOP 命令啟動排空序列,就必須驅動到完成狀態,然後才能呼叫此命令。在排空序列正在進行時嘗試呼叫該命令將觸發 EBUSY 錯誤程式碼。有關更多詳細資訊,請參見 記憶體到記憶體有狀態影片編碼器介面

V4L2_ENC_CMD_STOP

1

停止編碼器。當設定了 V4L2_ENC_CMD_STOP_AT_GOP_END 標誌時,編碼將繼續到當前影像組的末尾,否則編碼將立即停止。當編碼器已經停止時,此命令不執行任何操作。

對於實現 記憶體到記憶體有狀態影片編碼器介面 的裝置,該命令將啟動 記憶體到記憶體有狀態影片編碼器介面 中記錄的排空序列。在這種情況下,不接受任何標誌或其他引數。在序列完成之前再次嘗試呼叫該命令將觸發 EBUSY 錯誤程式碼。

V4L2_ENC_CMD_PAUSE

2

暫停編碼器。當編碼器尚未啟動時,驅動程式將返回 EPERM 錯誤程式碼。當編碼器已經暫停時,此命令不執行任何操作。未為此命令定義任何標誌。

V4L2_ENC_CMD_RESUME

3

在 PAUSE 命令後恢復編碼。當編碼器尚未啟動時,驅動程式將返回 EPERM 錯誤程式碼。當編碼器已經在執行時,此命令不執行任何操作。未為此命令定義任何標誌。

編碼器命令標誌

V4L2_ENC_CMD_STOP_AT_GOP_END

0x0001

在當前影像組的末尾停止編碼,而不是立即停止。

不適用於 記憶體到記憶體有狀態影片編碼器介面

7.10.5. 返回值

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

EBUSY

實現 記憶體到記憶體有狀態影片編碼器介面 的裝置的排空序列仍在進行中。在它完成之前,不允許發出另一個編碼器命令。

EINVAL

cmd 欄位無效。

EPERM

當編碼器未執行時,應用程式傳送了 PAUSE 或 RESUME 命令。