1.8. 數字影片(DV)時序¶
到目前為止討論的影片標準都是關於模擬電視及相應的影片時序。現在有更多不同的硬體介面,如高畫質電視介面(HDMI)、VGA、DVI 聯結器等,它們傳輸影片訊號,因此需要擴充套件 API 以選擇這些介面的影片時序。由於 v4l2_std_id 可用的位數有限,無法擴充套件,因此添加了一組新的 ioctl 來設定/獲取輸入和輸出的影片時序。
這些 ioctl 處理定義每個影片格式的詳細數字影片時序。這包括諸如有效影片寬度和高度、訊號極性、前沿(frontporches)、後沿(backporches)、同步寬度等引數。linux/v4l2-dv-timings.h 標頭檔案可用於獲取 CEA-861-E 和 VESA DMT 標準中的格式時序。
要列舉和查詢裝置支援的 DV 時序的屬性,應用程式使用 ioctl VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGS 和 ioctl VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP ioctl。要為裝置設定 DV 時序,應用程式使用 VIDIOC_S_DV_TIMINGS ioctl;要獲取當前 DV 時序,它們使用 VIDIOC_G_DV_TIMINGS ioctl。要檢測影片接收器檢測到的 DV 時序,應用程式使用 ioctl VIDIOC_QUERY_DV_TIMINGS ioctl。
當硬體檢測到影片源變化(例如,影片訊號出現或消失,或影片解析度改變)時,它會發出一個 V4L2_EVENT_SOURCE_CHANGE 事件。使用 ioctl VIDIOC_SUBSCRIBE_EVENT 和 ioctl VIDIOC_DQEVENT 來檢查此事件是否已報告。
如果影片訊號發生變化,應用程式必須停止流傳輸,釋放所有緩衝區,並呼叫 ioctl VIDIOC_QUERY_DV_TIMINGS 獲取新的影片時序,如果有效,則可以透過呼叫 ioctl VIDIOC_S_DV_TIMINGS 來設定這些時序。這將同時更新格式,因此使用 ioctl VIDIOC_G_FMT 來獲取新格式。現在應用程式可以分配新的緩衝區並重新開始流傳輸。
ioctl VIDIOC_QUERY_DV_TIMINGS 只會報告硬體檢測到的內容,它永遠不會改變配置。如果當前設定的時序與實際檢測到的時序不同,則通常意味著您將無法捕獲任何影片。正確的方法是依賴 V4L2_EVENT_SOURCE_CHANGE 事件,這樣您就知道何時發生了變化。