4.3. 影片輸出介面¶
影片輸出裝置將靜態影像或影像序列編碼為模擬影片訊號。透過此介面,應用程式可以控制編碼過程並將影像從使用者空間傳輸到驅動程式。
通常,V4L2 影片輸出裝置透過字元裝置特殊檔案訪問,這些檔名為 /dev/video 以及從 /dev/video0 到 /dev/video63 的檔案,主裝置號為 81,次裝置號為 0 到 63。/dev/video 通常是指向首選影片裝置的符號連結。
注意
相同的裝置檔名也用於影片捕獲裝置。
4.3.1. 查詢功能¶
支援影片輸出介面的裝置會在 ioctl VIDIOC_QUERYCAP ioctl 返回的 struct v4l2_capability 的 capabilities 欄位中設定 V4L2_CAP_VIDEO_OUTPUT 或 V4L2_CAP_VIDEO_OUTPUT_MPLANE 標誌。作為次要裝置功能,它們也可能支援 原始 VBI 輸出 (V4L2_CAP_VBI_OUTPUT) 介面。必須至少支援讀/寫或流式 I/O 方法中的一種。調製器和音訊輸出是可選的。
4.3.2. 輔助功能¶
影片輸出裝置應根據需要支援 音訊輸出、調製器、控制、裁剪和縮放 以及 流引數 ioctl。所有影片輸出裝置都必須支援 影片輸出 ioctl。
4.3.3. 影像格式協商¶
輸出由裁剪和影像格式引數決定。前者選擇影片影像中影像將出現的區域,後者決定影像在記憶體中的儲存方式,即 RGB 或 YUV 格式、每畫素位數或寬度和高度。它們共同還定義了影像在此過程中的縮放方式。
通常,這些引數在 open() 時不會重置,以允許 Unix 工具鏈像操作普通檔案一樣對裝置進行程式設計和寫入。編寫良好的 V4L2 應用程式會確保它們真正獲得所需結果,包括裁剪和縮放。
裁剪初始化至少需要將引數重置為預設值。示例請參見影像裁剪、插入和縮放——CROP API。
要查詢當前影像格式,應用程式將 struct v4l2_format 的 type 欄位設定為 V4L2_BUF_TYPE_VIDEO_OUTPUT 或 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,並呼叫 VIDIOC_G_FMT ioctl,傳入指向此結構的指標。驅動程式會填充 fmt 聯合體中的 struct v4l2_pix_format pix 或 struct v4l2_pix_format_mplane pix_mp 成員。
要請求不同的引數,應用程式將 struct v4l2_format 的 type 欄位如上所述設定,並初始化 fmt 聯合體中 struct v4l2_pix_format 的 pix 成員的所有欄位,或者更好地是直接修改 VIDIOC_G_FMT 的結果,然後呼叫 VIDIOC_S_FMT ioctl,傳入指向此結構的指標。驅動程式可能會調整引數,並最終像 VIDIOC_G_FMT 那樣返回實際引數。
與 VIDIOC_S_FMT 類似,可以使用 VIDIOC_TRY_FMT ioctl 來了解硬體限制,而無需停用 I/O 或可能耗時的硬體準備。
struct v4l2_pix_format 和 struct v4l2_pix_format_mplane 的內容在 影像格式 中討論。詳情另請參閱 VIDIOC_G_FMT、VIDIOC_S_FMT 和 VIDIOC_TRY_FMT ioctl 的規範。影片輸出裝置必須實現 VIDIOC_G_FMT 和 VIDIOC_S_FMT ioctl,即使 VIDIOC_S_FMT 忽略所有請求並始終返回預設引數,就像 VIDIOC_G_FMT 所做的那樣。VIDIOC_TRY_FMT 是可選的。
4.3.4. 寫入影像¶
影片輸出裝置可能支援 write() 函式 和/或流式 (記憶體對映 或 使用者指標) I/O。詳情請參見 輸入/輸出。