7.60. ioctl VIDIOC_SUBDEV_G_FMT, VIDIOC_SUBDEV_S_FMT

7.60.1. 名稱

VIDIOC_SUBDEV_G_FMT - VIDIOC_SUBDEV_S_FMT - 獲取或設定 subdev pad 上的資料格式

7.60.2. 概要

VIDIOC_SUBDEV_G_FMT

int ioctl(int fd, VIDIOC_SUBDEV_G_FMT, struct v4l2_subdev_format *argp)

VIDIOC_SUBDEV_S_FMT

int ioctl(int fd, VIDIOC_SUBDEV_S_FMT, struct v4l2_subdev_format *argp)

7.60.3. 引數

fd

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

argp

指向 struct v4l2_subdev_format 的指標。

7.60.4. 描述

這些 ioctl 用於協商影像流水線中特定 subdev pad 的幀格式。

要檢索當前格式,應用程式將 struct v4l2_subdev_formatpad 欄位設定為媒體 API 報告的所需 pad 編號,並將 which 欄位設定為 V4L2_SUBDEV_FORMAT_ACTIVE。 當它們使用指向此結構的指標呼叫 VIDIOC_SUBDEV_G_FMT ioctl 時,驅動程式會填充 format 欄位的成員。

要更改當前格式,應用程式同時設定 padwhich 欄位以及 format 欄位的所有成員。 當它們使用指向此結構的指標呼叫 VIDIOC_SUBDEV_S_FMT ioctl 時,驅動程式會驗證請求的格式,根據硬體功能對其進行調整並配置裝置。 返回時,struct v4l2_subdev_format 包含當前格式,就像 VIDIOC_SUBDEV_G_FMT 呼叫返回的一樣。

應用程式可以透過將 which 設定為 V4L2_SUBDEV_FORMAT_TRY 來查詢裝置功能。 設定後,驅動程式不會將“try”格式應用於裝置,而是像活動格式一樣進行更改並存儲在子裝置檔案控制代碼中。 因此,兩個查詢同一子裝置的應用程式不會相互影響。

例如,要在子裝置的輸出 pad 上嘗試一種格式,應用程式首先使用 VIDIOC_SUBDEV_S_FMT ioctl 在子裝置輸入處設定 try 格式。 然後,它們將使用 VIDIOC_SUBDEV_G_FMT ioctl 檢索輸出 pad 上的預設格式,或者使用 VIDIOC_SUBDEV_S_FMT ioctl 設定所需的輸出 pad 格式並檢查返回值。

Try 格式不依賴於活動格式,但可以依賴於當前的連結配置或子裝置控制元件值。 例如,低通噪聲濾波器可能會裁剪幀邊界處的畫素,從而修改其輸出幀大小。

如果子裝置節點已在只讀模式下注冊,則僅當 which 欄位設定為 V4L2_SUBDEV_FORMAT_TRY 時,對 VIDIOC_SUBDEV_S_FMT 的呼叫才有效,否則會返回錯誤,並將 errno 變數設定為 -EPERM

驅動程式不能僅僅因為請求的格式與裝置功能不匹配而返回錯誤。 相反,它們必須修改格式以匹配硬體可以提供的格式。 修改後的格式應儘可能接近原始請求。

type v4l2_subdev_format
struct v4l2_subdev_format

__u32

pad

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

__u32

which

要修改的格式,來自 enum v4l2_subdev_format_whence

struct v4l2_mbus_framefmt

format

影像格式的定義,有關詳細資訊,請參見 v4l2_mbus_framefmt

__u32

stream

流識別符號。

__u32

reserved[7]

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

enum v4l2_subdev_format_whence

V4L2_SUBDEV_FORMAT_TRY

0

Try 格式,用於查詢裝置功能。

V4L2_SUBDEV_FORMAT_ACTIVE

1

活動格式,應用於硬體。

7.60.5. 返回值

成功時返回 0,錯誤時返回 -1,並適當地設定 errno 變數。 泛型錯誤程式碼在 泛型錯誤程式碼 章節中進行了描述。

EBUSY

由於 pad 當前正忙,無法更改格式。 例如,這可能是由 pad 上的活動影片流引起的。 在執行其他操作以首先解決問題之前,不得重試 ioctl。 僅由 VIDIOC_SUBDEV_S_FMT 返回

EINVAL

struct v4l2_subdev_format pad 引用了不存在的 pad,或者 which 欄位具有不支援的值。

EPERM

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


成功時返回 0,錯誤時返回 -1,並適當地設定 errno 變數。 泛型錯誤程式碼在 泛型錯誤程式碼 章節中進行了描述。