7.24. ioctl VIDIOC_G_CROP, VIDIOC_S_CROP¶
7.24.1. 名稱¶
VIDIOC_G_CROP - VIDIOC_S_CROP - 獲取或設定當前裁剪矩形
7.24.2. 概要¶
-
VIDIOC_G_CROP¶
int ioctl(int fd, VIDIOC_G_CROP, struct v4l2_crop *argp)
-
VIDIOC_S_CROP¶
int ioctl(int fd, VIDIOC_S_CROP, const struct v4l2_crop *argp)
7.24.3. 引數¶
7.24.4. 描述¶
要查詢裁剪矩形的大小和位置,應用程式將 struct v4l2_crop 結構的 type 欄位設定為相應的緩衝區(流)型別,並使用指向此結構的指標呼叫 VIDIOC_G_CROP ioctl。如果不支援裁剪,驅動程式會填充結構的其餘部分或返回 EINVAL 錯誤程式碼。
要更改裁剪矩形,應用程式初始化 v4l2_crop 結構的 type 和名為 c 的 struct v4l2_rect 子結構,並使用指向此結構的指標呼叫 VIDIOC_S_CROP ioctl。
驅動程式首先根據硬體限制調整請求的尺寸,即捕獲/輸出視窗給定的邊界,並將其舍入為水平和垂直偏移、寬度和高度的最接近可能值。特別是,驅動程式必須將裁剪矩形的垂直偏移量舍入為幀行模 2,這樣就不會混淆欄位順序。
其次,驅動程式調整影像大小(縮放過程的相反矩形,源或目標取決於資料方向)到最接近的可能大小,同時保持當前的水平和垂直縮放因子。
最後,驅動程式使用實際的裁剪和影像引數對硬體進行程式設計。VIDIOC_S_CROP 是一個只寫 ioctl,它不返回實際引數。要查詢它們,應用程式必須呼叫 VIDIOC_G_CROP 和 ioctl VIDIOC_G_FMT, VIDIOC_S_FMT, VIDIOC_TRY_FMT。當引數不合適時,應用程式可以修改裁剪或影像引數,並重復該迴圈,直到協商出令人滿意的引數為止。
如果不支援裁剪,則不會更改任何引數,並且 VIDIOC_S_CROP 返回 EINVAL 錯誤程式碼。
-
type v4l2_crop¶
__u32 |
|
資料流的型別,由應用程式設定。只有這些型別在此處有效: |
struct |
|
裁剪矩形。使用與 struct |
注意
不幸的是,對於多平面緩衝區型別(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE 和 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE),此 API 在 v4l2_crop type 欄位的填充方式方面搞砸了。一些驅動程式只接受 _MPLANE 緩衝區型別,而其他驅動程式只接受非多平面緩衝區型別(即,末尾沒有 _MPLANE)。
從核心 4.13 開始,允許這兩種變體。
7.24.5. 返回值¶
成功時返回 0,出錯時返回 -1,並相應地設定 errno 變數。通用錯誤程式碼在 通用錯誤程式碼 章節中進行了描述。
- ENODATA
此輸入或輸出不支援裁剪。