7.61. ioctl VIDIOC_SUBDEV_G_FRAME_INTERVAL, VIDIOC_SUBDEV_S_FRAME_INTERVAL¶
7.61.1. 名稱¶
VIDIOC_SUBDEV_G_FRAME_INTERVAL - VIDIOC_SUBDEV_S_FRAME_INTERVAL - 獲取或設定子裝置 pad 上的幀間隔
7.61.2. 概要¶
-
VIDIOC_SUBDEV_G_FRAME_INTERVAL¶
int ioctl(int fd, VIDIOC_SUBDEV_G_FRAME_INTERVAL, struct v4l2_subdev_frame_interval *argp)
-
VIDIOC_SUBDEV_S_FRAME_INTERVAL¶
int ioctl(int fd, VIDIOC_SUBDEV_S_FRAME_INTERVAL, struct v4l2_subdev_frame_interval *argp)
7.61.3. 引數¶
fd由
open()返回的檔案描述符。argp指向 struct
v4l2_subdev_frame_interval的指標。
7.61.4. 描述¶
這些 ioctl 用於獲取和設定影像管道中特定子裝置 pad 上的幀間隔。幀間隔僅對可以自行控制幀週期的子裝置有意義。這包括例如影像感測器和電視調諧器。不支援幀間隔的子裝置不得實現這些 ioctl。
要檢索當前幀間隔,應用程式將 struct v4l2_subdev_frame_interval 的 pad 欄位設定為媒體控制器 API 報告的所需 pad 編號。當他們使用指向此結構的指標呼叫 VIDIOC_SUBDEV_G_FRAME_INTERVAL ioctl 時,驅動程式會填充 interval 成員。
要更改當前幀間隔,應用程式需要設定 pad 欄位和 interval 欄位的所有成員。當他們使用指向此結構的指標呼叫 VIDIOC_SUBDEV_S_FRAME_INTERVAL ioctl 時,驅動程式會驗證請求的間隔,根據硬體功能對其進行調整,並配置裝置。返回後,struct v4l2_subdev_frame_interval 包含當前的幀間隔,與 VIDIOC_SUBDEV_G_FRAME_INTERVAL 呼叫返回的結果相同。
如果子裝置節點以只讀模式註冊,則只有在 which 欄位設定為 V4L2_SUBDEV_FORMAT_TRY 時,呼叫 VIDIOC_SUBDEV_S_FRAME_INTERVAL 才有效,否則將返回錯誤,並且 errno 變數設定為 -EPERM。
驅動程式不得僅僅因為請求的間隔與裝置功能不匹配而返回錯誤。它們必須修改間隔以匹配硬體可以提供的間隔。修改後的間隔應儘可能接近原始請求。
更改幀間隔不應更改格式。另一方面,更改格式可能會更改幀間隔。
支援幀間隔 ioctl 的子裝置應僅在單個 pad 上實現它們。在同一子裝置的多個 pad 上支援它們時的行為未定義。
-
type v4l2_subdev_frame_interval¶
__u32 |
|
媒體控制器 API 報告的 Pad 編號。 |
struct |
|
連續影片幀之間的週期,以秒為單位。 |
__u32 |
|
流識別符號。 |
__u32 |
|
從 enum v4l2_subdev_format_whence 中獲取的活動或嘗試幀間隔。 |
__u32 |
|
保留供將來擴充套件使用。應用程式和驅動程式必須將陣列設定為零。 |
7.61.5. 返回值¶
成功時返回 0,錯誤時返回 -1,並適當設定 errno 變數。通用錯誤程式碼在 通用錯誤程式碼 章節中描述。
- EBUSY
由於 pad 當前正忙,無法更改幀間隔。例如,這可能是由 pad 上的活動影片流引起的。在執行另一個操作來解決問題之前,不得重試 ioctl。僅由
VIDIOC_SUBDEV_S_FRAME_INTERVAL返回- EINVAL
struct
v4l2_subdev_frame_intervalpad引用了一個不存在的 pad,which欄位具有不支援的值,或者 pad 不支援幀間隔。- EPERM
已經在一個只讀子裝置上呼叫了
VIDIOC_SUBDEV_S_FRAME_INTERVALioctl,並且which欄位設定為V4L2_SUBDEV_FORMAT_ACTIVE。