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_intervalpad 欄位設定為媒體控制器 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
struct v4l2_subdev_frame_interval

__u32

pad

媒體控制器 API 報告的 Pad 編號。

struct v4l2_fract

interval

連續影片幀之間的週期,以秒為單位。

__u32

stream

流識別符號。

__u32

which

從 enum v4l2_subdev_format_whence 中獲取的活動或嘗試幀間隔。

__u32

reserved[7]

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

7.61.5. 返回值

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

EBUSY

由於 pad 當前正忙,無法更改幀間隔。例如,這可能是由 pad 上的活動影片流引起的。在執行另一個操作來解決問題之前,不得重試 ioctl。僅由 VIDIOC_SUBDEV_S_FRAME_INTERVAL 返回

EINVAL

struct v4l2_subdev_frame_interval pad 引用了一個不存在的 pad,which 欄位具有不支援的值,或者 pad 不支援幀間隔。

EPERM

已經在一個只讀子裝置上呼叫了 VIDIOC_SUBDEV_S_FRAME_INTERVAL ioctl,並且 which 欄位設定為 V4L2_SUBDEV_FORMAT_ACTIVE