1.25. 資料格式¶
1.25.1. 資料格式協商¶
不同的裝置與應用程式交換不同型別的資料,例如影片影像、原始或切片 VBI 資料、RDS 資料報。即使在同一型別中,也有許多不同的格式,特別是影像格式非常豐富。儘管驅動程式必須提供一個預設值,並且選擇在裝置關閉和重新開啟後仍然存在,但應用程式在進行資料交換之前應始終協商資料格式。協商意味著應用程式請求特定格式,驅動程式選擇並報告硬體為滿足請求所能提供的最佳方案。當然,應用程式也可以只查詢當前選擇。
存在一種單一機制,透過使用聚合結構體 v4l2_format 和 VIDIOC_G_FMT 和 VIDIOC_S_FMT ioctl 來協商所有資料格式。此外,VIDIOC_TRY_FMT ioctl 可用於檢查硬體可以做什麼,而無需實際選擇新的資料格式。V4L2 API 支援的資料格式涵蓋在 介面 中的相應裝置部分。要更詳細地瞭解影像格式,請參閱 影像格式。
VIDIOC_S_FMT ioctl 是初始化序列中的一個重要轉折點。在此之前,多個面板應用程式可以併發訪問同一裝置以選擇當前輸入、更改控制元件或修改其他屬性。第一個 VIDIOC_S_FMT 將邏輯流(影片資料、VBI 資料等)獨佔分配給一個檔案描述符。
獨佔意味著沒有其他應用程式,更準確地說,沒有其他檔案描述符可以抓取此流或更改與協商引數不一致的裝置屬性。例如,當新標準使用不同數量的掃描行時,影片標準更改可能會使所選影像格式無效。因此,只有擁有該流的檔案描述符才能進行無效更改。相應地,抓取不同邏輯流的多個檔案描述符會相互阻止干擾其設定。例如,當影片疊加即將開始或已經在進行中時,同時影片捕獲可能會被限制為相同的裁剪和影像大小。
當應用程式省略 VIDIOC_S_FMT ioctl 時,其鎖定副作用由下一步(使用 ioctl VIDIOC_REQBUFS ioctl 選擇 I/O 方法)或第一次 read() 或 write() 呼叫隱式地發生。
通常,一個檔案描述符只能分配一個邏輯流,例外情況是驅動程式允許同時進行影片捕獲和疊加,並使用相同的檔案描述符以相容 V4L 和 V4L2 的早期版本。透過關閉並重新開啟裝置可以切換邏輯流或返回“面板模式”。驅動程式可能支援使用 VIDIOC_S_FMT 進行切換。
所有與應用程式交換資料的驅動程式都必須支援 VIDIOC_G_FMT 和 VIDIOC_S_FMT ioctl。強烈建議但可選地實現 VIDIOC_TRY_FMT。
1.25.2. 影像格式列舉¶
除了通用格式協商函式外,還有一個特殊的 ioctl 可用於列舉影片捕獲、疊加或輸出裝置支援的所有影像格式。[1]
ioctl VIDIOC_ENUM_FMT ioctl 必須由所有與應用程式交換影像資料的驅動程式支援。
重要提示
驅動程式不應在核心空間中轉換影像格式。它們必須只列舉硬體直接支援的格式。如有必要,驅動程式編寫者應釋出示例轉換例程或庫以整合到應用程式中。