6.2. V4L2 API 的變更

V4L API 被新增到核心後不久,它因過於僵化而受到批評。1998 年 8 月,Bill Dirks 提出了一些改進建議,並開始著手編寫文件、示例驅動和應用程式。在其他志願者的幫助下,這最終發展成為 V4L2 API,它不僅僅是 V4L API 的擴充套件,更是對其的替代。然而,又經過了四年和兩個穩定的核心版本釋出,這個新 API 才最終以其當前的形式被接受並納入核心。

6.2.1. 早期版本

1998-08-20:第一個版本。

1998-08-27:引入了 select() 函式。

1998-09-10:新的影片標準介面。

1998-09-18:VIDIOC_NONCAP ioctl 被替換為原本無意義的 O_TRUNC open() 標誌,並定義了別名 O_NONCAPO_NOIO。應用程式如果只打算訪問控制,而不是需要獨佔訪問的捕獲應用程式,可以設定此標誌。VIDEO_STD_XXX 識別符號現在是序號而不是標誌,並且 video_std_construct() 輔助函式接受 id 和傳輸引數。

1998-09-28:影片標準重新設計。使影片控制元件可單獨列舉。

1998-10-02:從結構體 video_standard 中移除了 id 欄位,並重新命名了彩色副載波欄位。ioctl VIDIOC_QUERYSTD, VIDIOC_SUBDEV_QUERYSTD ioctl 被重新命名為 ioctl VIDIOC_ENUMSTD, VIDIOC_SUBDEV_ENUMSTDVIDIOC_G_INPUT 被重新命名為 ioctl VIDIOC_ENUMINPUT。Codec API 的初稿釋出。

1998-11-08:許多微小改動。大多數符號已重新命名。對 struct v4l2_capability 進行了一些實質性修改。

1998-11-12:一些 ioctl 的讀/寫方向定義錯誤。

1998-11-14:V4L2_PIX_FMT_RGB24 變更為 V4L2_PIX_FMT_BGR24V4L2_PIX_FMT_RGB32 變更為 V4L2_PIX_FMT_BGR32。現在可以使用以 V4L2_CID_AUDIO 開頭的名稱,透過 VIDIOC_G_CTRLVIDIOC_S_CTRL ioctl 訪問音訊控制。V4L2_MAJOR 定義從 videodev.h 中移除,因為它只在 videodev 核心模組中使用了一次。添加了 YUV422YUV411 平面圖像格式。

1998-11-28:少數 ioctl 符號發生變化。添加了用於編解碼器和影片輸出裝置的介面。

1999-01-14:添加了原始 VBI 捕獲介面。

1999-01-19:VIDIOC_NEXTBUF ioctl 被移除。

6.2.2. V4L2 版本 0.16 1999-01-31

1999-01-27:現在只有一個 QBUF ioctl,VIDIOC_QWBUF 和 VIDIOC_QRBUF 已移除。VIDIOC_QBUF 接受一個 v4l2_buffer 作為引數。添加了數字變焦(裁剪)控制。

6.2.3. V4L2 版本 0.18 1999-03-16

在 videodev.c 中添加了一個 v4l 到 V4L2 ioctl 相容層。驅動編寫者請注意,這改變了您實現 ioctl 處理器的方式。請參閱《驅動編寫者指南》。添加了更多的控制 id 程式碼。

6.2.4. V4L2 版本 0.19 1999-06-05

1999-03-18:在將 v4l2_queryctrl 物件的 category 和 catname 欄位傳遞給驅動程式之前,請填寫它們。這需要對示例驅動程式中的 VIDIOC_QUERYCTRL 處理器進行少量更改。

1999-03-31:v4l 記憶體捕獲 ioctl 的相容性更好。需要更改驅動程式以完全支援新的相容性特性,請參閱《驅動編寫者指南》和 v4l2cap.c。添加了新的控制 ID:V4L2_CID_HFLIP, _VFLIP。將 V4L2_PIX_FMT_YUV422P 更改為 _YUV422P,將 _YUV411P 更改為 _YUV411P。

1999-04-04:添加了更多的控制 ID。

1999-04-07:添加了按鈕控制型別。

1999-05-02:修復了 videodev.h 中的一個錯別字,並添加了 V4L2_CTRL_FLAG_GRAYED(後來改為 V4L2_CTRL_FLAG_GRABBED)標誌。

1999-05-20:VIDIOC_G_CTRL 的定義有誤,導致此 ioctl 功能異常。

1999-06-05:更改了 V4L2_CID_WHITENESS 的值。

6.2.5. V4L2 版本 0.20 (1999-09-10)

版本 0.20 引入了一些與 0.19 及更早版本不向後相容的更改。這些更改的目的是簡化 API,同時使其更具可擴充套件性並遵循常見的 Linux 驅動程式 API 約定。

  1. 修復了 V4L2_FMT_FLAG 符號中的一些錯別字。為了與 v4l 相容,更改了 struct v4l2_clip。(1999-08-30)

  2. V4L2_TUNER_SUB_LANG1 已新增。(1999-09-05)

  3. 所有使用整數引數的 ioctl() 命令現在都接受一個指向整數的指標。在有意義的情況下,ioctl 將在引數指向的整數中返回實際的新值,這是 V4L2 API 中的常見約定。受影響的 ioctl 包括:VIDIOC_PREVIEW, VIDIOC_STREAMON, VIDIOC_STREAMOFF, VIDIOC_S_FREQ, VIDIOC_S_INPUT, VIDIOC_S_OUTPUT, VIDIOC_S_EFFECT。例如

    err = ioctl (fd, VIDIOC_XXX, V4L2_XXX);
    

    變為

    int a = V4L2_XXX; err = ioctl(fd, VIDIOC_XXX, &a);
    
  4. 所有不同的獲取和設定格式命令都被合併到單個 VIDIOC_G_FMTVIDIOC_S_FMT ioctl 中,它們接受一個聯合體和一個選擇聯合體成員的型別欄位作為引數。目的是透過消除多個 ioctl 來簡化 API,並允許新的和驅動私有的資料流,而無需新增新的 ioctl。

    此更改廢棄了以下 ioctl:VIDIOC_S_INFMT, VIDIOC_G_INFMT, VIDIOC_S_OUTFMT, VIDIOC_G_OUTFMT, VIDIOC_S_VBIFMTVIDIOC_G_VBIFMT。影像格式 struct v4l2_format 被重新命名為 struct v4l2_pix_format,而 struct v4l2_format 現在是所有格式協商的封裝結構體。

  5. 與上述更改類似,VIDIOC_G_PARMVIDIOC_S_PARM ioctl 與 VIDIOC_G_OUTPARMVIDIOC_S_OUTPARM 合併。新的 struct v4l2_streamparm 中的 type 欄位選擇相應的聯合體成員。

    此更改廢棄了 VIDIOC_G_OUTPARMVIDIOC_S_OUTPARM ioctl。

  6. 控制列舉得到簡化,引入了兩個新的控制標誌並刪除一個。catname 欄位被 group 欄位取代。

    驅動程式現在可以使用 V4L2_CTRL_FLAG_DISABLEDV4L2_CTRL_FLAG_GRABBED 分別標記不支援和暫時不可用的控制元件。group 名稱表示可能比 category 更窄的分類。換句話說,一個類別中可能有多個組。一個組內的控制元件通常會繪製在一個組框內。不同類別的控制元件可能會有更大的間隔,甚至可能出現在單獨的視窗中。

  7. 結構體 v4l2_buffertimestamp 欄位變更為 64 位整數,其中包含幀的取樣或輸出時間(納秒)。此外,時間戳將是絕對系統時間,而不是從流開始時的零點。時間戳的資料型別名為 stamp_t,定義為有符號 64 位整數。輸出裝置不應在時間戳欄位中的時間到達之前傳送緩衝區。我希望遵循 SGI 的做法,採用像其 UST(未調整系統時間)這樣的多媒體時間戳系統。請參閱 http://web.archive.org/web/*/http://reality.sgi.com /cpirazzi_engr/lg/time/intro.html。UST 使用 64 位有符號整數(而不是 struct timeval)作為時間戳,單位為納秒。UST 時鐘在系統啟動時從零開始,並持續均勻執行。UST 溢位大約需要 292 年。無法設定 UST 時鐘。常規的 Linux 日期時間時鐘可以定期更改,如果將其用於多媒體流的時間戳,可能會導致錯誤。真正的 UST 風格時鐘將需要核心中尚不存在的一些支援。但為了預見未來,我將把時間戳欄位更改為 64 位整數,並將 v4l2_masterclock_gettime() 函式(僅由驅動程式使用)更改為返回 64 位整數。

  8. 結構體 v4l2_buffer 中添加了一個 sequence 欄位。sequence 欄位計算捕獲的幀數,輸出裝置會忽略它。當捕獲驅動程式丟棄一幀時,該幀的序列號將被跳過。

6.2.6. V4L2 版本 0.20 增量更改

1999-12-23:在 struct v4l2_vbi_format 中,reserved1 欄位變更為 offset。此前,驅動程式需要清除 reserved1 欄位。

2000-01-13:添加了 V4L2_FMT_FLAG_NOT_INTERLACED 標誌。

2000-07-31:為了與原始的 videodev.h 檔案相容,videodev.h 標頭檔案現在包含 linux/poll.h

2000-11-20:添加了 V4L2_TYPE_VBI_OUTPUTV4L2_PIX_FMT_Y41P

2000-11-25:添加了 V4L2_TYPE_VBI_INPUT

2000-12-04:修復了符號名稱中的幾個錯別字。

2001-01-18:為了避免名稱空間衝突,videodev.h 標頭檔案中定義的 fourcc 宏被重新命名為 v4l2_fourcc

2001-01-25:修復了 Linux 2.4.0 中的 videodev.h 檔案與 videodevX 補丁中包含的 videodev.h 檔案之間可能存在的驅動級相容性問題。Linux 2.4.0 上 videodevX 早期版本的使用者應重新編譯其 V4L 和 V4L2 驅動程式。

2001-01-26:修復了 videodevX 補丁中的 videodev.h 檔案與應用了 devfs 補丁的 Linux 2.2.x 中 videodev.h 檔案之間可能存在的核心級不相容性。

2001-03-02:某些 V4L ioctl 儘管定義為只讀引數,但卻雙向傳遞資料,透過向後相容層無法正常工作。[解決方案?]

2001-04-13:添加了大端 16 位 RGB 格式。

2001-09-17:添加了新的 YUV 格式以及 VIDIOC_G_FREQUENCYVIDIOC_S_FREQUENCY ioctl。(舊的 VIDIOC_G_FREQVIDIOC_S_FREQ ioctl 沒有考慮多個調諧器。)

2000-09-18:添加了 V4L2_BUF_TYPE_VBI。這可能會破壞相容性,因為如果結構體 v4l2_fmttype 欄位不包含 V4L2_BUF_TYPE_VBI,則 VIDIOC_G_FMTVIDIOC_S_FMT ioctl 現在可能會失敗。在 struct v4l2_vbi_format 的文件中,offset 欄位中模糊的短語“上升沿”更改為“前沿”。

6.2.7. V4L2 版本 0.20 2000-11-23

對原始 VBI 介面進行了一些更改。

  1. V4L2 API 規範中添加了闡明行編號方案的圖。 start[0] 和 start[1] 欄位不再從零開始計數行號。理由:a) 以前的定義不明確。b) start[] 值是序數。c) 沒有必要發明新的行編號方案。我們現在使用 ITU-R 定義的行號。相容性:將起始值加一。依賴於先前語義的應用程式可能無法正常執行。

  2. 限制“count[0] > 0 且 count[1] > 0”已放寬為“(count[0] + count[1]) > 0”。理由:驅動程式可以按掃描行粒度分配資源,並且某些資料服務僅在第一個欄位上傳輸。關於兩個 count 值通常會相等的註釋具有誤導性且毫無意義,已被刪除。此更改破壞了與早期版本的相容性:驅動程式可能返回 EINVAL,應用程式可能無法正常執行。

  3. 驅動程式再次被允許返回負(未知)的起始值,如之前所提議。此功能為何被刪除尚不清楚。此更改可能破壞依賴於起始值為正數的應用程式的相容性。澄清了 VIDIOC_S_FMT ioctl 中 EBUSYEINVAL 錯誤程式碼的使用。EBUSY 錯誤程式碼最終被文件化,以及此前只在 videodev.h 標頭檔案中提及的 reserved2 欄位。

  4. 添加了新的緩衝區型別 V4L2_TYPE_VBI_INPUTV4L2_TYPE_VBI_OUTPUT。前者是舊 V4L2_TYPE_VBI 的別名,後者在 videodev.h 檔案中缺失。

6.2.8. V4L2 版本 0.20 2002-07-25

添加了切片 VBI 介面提案。

6.2.9. Linux 2.5.46 中的 V4L2,2002-10

大約在 2002 年 10 月至 11 月,在 Linux 2.5 宣佈功能凍結之前,API 經過修訂,借鑑了 V4L2 0.20 的經驗。這個未命名的版本最終合併到 Linux 2.5.46 中。

  1. 相關裝置 中所述,驅動程式必須在所有次裝置號下提供相關裝置功能。

  2. open() 函式要求訪問模式為 O_RDWR,無論裝置型別如何。所有與應用程式交換資料的 V4L2 驅動程式都必須支援 O_NONBLOCK 標誌。用於指示無資料交換(面板應用程式)訪問的 O_NOIO 標誌(一個將無意義的 O_TRUNC 別名化的 V4L2 符號)已被移除。驅動程式必須保持在“面板模式”,直到應用程式嘗試啟動資料交換,請參閱 開啟和關閉裝置

  3. 結構體 v4l2_capability 發生了巨大變化。請注意,結構體的大小也發生了變化,這編碼在 ioctl 請求程式碼中,因此舊的 V4L2 裝置將對新的 ioctl VIDIOC_QUERYCAP ioctl 返回 EINVAL 錯誤程式碼。

    新增了用於識別驅動程式的欄位,一個新的 RDS 裝置功能 V4L2_CAP_RDS_CAPTUREV4L2_CAP_AUDIO 標誌指示裝置是否具有任何音訊聯結器,另一個 I/O 能力 V4L2_CAP_ASYNCIO 可以被標記。為了響應這些變化,type 欄位變為一個位集併合併到 flags 欄位中。V4L2_FLAG_TUNER 被重新命名為 V4L2_CAP_TUNERV4L2_CAP_VIDEO_OVERLAY 替換了 V4L2_FLAG_PREVIEWV4L2_CAP_VBI_CAPTUREV4L2_CAP_VBI_OUTPUT 替換了 V4L2_FLAG_DATA_SERVICEV4L2_FLAG_READV4L2_FLAG_WRITE 合併到 V4L2_CAP_READWRITE 中。

    冗餘欄位 inputsoutputsaudios 已被移除。這些屬性可以按照 影片輸入和輸出 以及 音訊輸入和輸出 中的描述來確定。

    相對不穩定且因此幾乎無用的欄位 maxwidth, maxheight, minwidth, minheight, maxframerate 已被移除。這些資訊可參見 資料格式影片標準 中的描述獲取。

    V4L2_FLAG_SELECT 已被移除。我們認為 select() 函式足夠重要,以至於所有與應用程式交換資料的 V4L2 驅動程式都必須支援它。冗餘的 V4L2_FLAG_MONOCHROME 標誌已移除,此資訊可參見 資料格式 中的描述獲取。

  4. struct v4l2_input 中,assoc_audio 欄位和 capability 欄位及其唯一的標誌 V4L2_INPUT_CAP_AUDIO 被新的 audioset 欄位取代。該欄位不再將一個影片輸入連結到一個音訊輸入,而是報告此影片輸入組合的所有音訊輸入。

    新增的欄位是 tuner(反轉了以前從調諧器到影片輸入的連結)、stdstatus

    相應地,struct v4l2_output 失去了 capabilityassoc_audio 欄位。取而代之的是添加了 audiosetmodulatorstd

  5. 為了與其他結構體保持一致,struct v4l2_audio 欄位 audio 被重新命名為 index。添加了一個新的能力標誌 V4L2_AUDCAP_STEREO,以指示相關的音訊輸入是否支援立體聲。V4L2_AUDCAP_EFFECTS 和相應的 V4L2_AUDMODE 標誌被移除。這可以使用控制元件輕鬆實現。(然而,這同樣適用於 AVL,它仍然存在。)

    同樣為了保持一致性,struct v4l2_audioout 欄位 audio 被重新命名為 index

  6. struct v4l2_tunerinput 欄位被 index 欄位取代,允許裝置具有多個調諧器。影片輸入和調諧器之間的連結現在被反轉,輸入指向其調諧器。std 子結構體變為一個簡單集(更多內容見下文),並移至 struct v4l2_input 中。添加了 type 欄位。

    因此,在 struct v4l2_modulator 中,outputindex 欄位取代。

    struct v4l2_frequency 中,port 欄位被 tuner 欄位取代,該欄位包含相應的調諧器或調製器索引號。添加了一個調諧器 type 欄位,並且 reserved 欄位變大以支援未來擴充套件(特別是衛星調諧器)。

  7. 完全透明影片標準的想法被放棄了。經驗表明,應用程式必須能夠處理影片標準,而不僅僅是向用戶呈現選單。應用程式現在可以透過 v4l2_std_idvideodev2.h 標頭檔案中定義的符號來引用標準,而不是透過 ioctl 列舉支援的標準。詳情請參閱 影片標準VIDIOC_G_STDVIDIOC_S_STD 現在以指向此型別的指標作為引數。如果硬體具有此功能,則添加了 ioctl VIDIOC_QUERYSTD, VIDIOC_SUBDEV_QUERYSTD 以自動檢測接收到的標準。在 struct v4l2_standard 中,為 ioctl VIDIOC_ENUMSTD, VIDIOC_SUBDEV_ENUMSTD 添加了一個 index 欄位。添加了一個名為 idv4l2_std_id 欄位作為機器可讀識別符號,也取代了 transmission 欄位。具有誤導性的 framerate 欄位被重新命名為 frameperiod。現在已廢棄的 colorstandard 資訊(最初用於區分標準變體)已被刪除。

    結構體 v4l2_enumstd 不再存在。ioctl VIDIOC_ENUMSTD, VIDIOC_SUBDEV_ENUMSTD 現在直接採用指向 struct v4l2_standard 的指標。特定影片輸入或輸出所支援標準的資訊已分別移至 struct v4l2_inputstruct v4l2_output 中名為 std 的欄位。

  8. 結構體 v4l2_queryctrl 中的 categorygroup 欄位並未普及和/或未按預期實現,因此被移除。

  9. 添加了 VIDIOC_TRY_FMT ioctl,用於像 VIDIOC_S_FMT 一樣協商資料格式,但無需硬體程式設計開銷,也無需考慮正在進行的 I/O。

    struct v4l2_format 中,fmt 聯合體已擴充套件,包含 struct v4l2_window。現在所有影像格式協商都可以透過 VIDIOC_G_FMTVIDIOC_S_FMTVIDIOC_TRY_FMT ioctl 進行。用於準備影片疊加的 VIDIOC_G_WINVIDIOC_S_WIN ioctl 已被移除。type 欄位更改為型別 enum v4l2_buf_type,並且緩衝區型別名稱更改如下。

    舊定義

    enum v4l2_buf_type

    V4L2_BUF_TYPE_CAPTURE

    V4L2_BUF_TYPE_VIDEO_CAPTURE

    V4L2_BUF_TYPE_CODECIN

    暫時省略

    V4L2_BUF_TYPE_CODECOUT

    暫時省略

    V4L2_BUF_TYPE_EFFECTSIN

    暫時省略

    V4L2_BUF_TYPE_EFFECTSIN2

    暫時省略

    V4L2_BUF_TYPE_EFFECTSOUT

    暫時省略

    V4L2_BUF_TYPE_VIDEOOUT

    V4L2_BUF_TYPE_VIDEO_OUTPUT

    -

    V4L2_BUF_TYPE_VIDEO_OVERLAY

    -

    V4L2_BUF_TYPE_VBI_CAPTURE

    -

    V4L2_BUF_TYPE_VBI_OUTPUT

    -

    V4L2_BUF_TYPE_SLICED_VBI_CAPTURE

    -

    V4L2_BUF_TYPE_SLICED_VBI_OUTPUT

    V4L2_BUF_TYPE_PRIVATE_BASE

    V4L2_BUF_TYPE_PRIVATE (但已廢棄)

  10. struct v4l2_fmtdesc 中,添加了一個名為 typeenum v4l2_buf_type 欄位,與 struct v4l2_format 中相同。VIDIOC_ENUM_FBUFFMT ioctl 不再需要,並已被移除。這些呼叫可以用型別為 V4L2_BUF_TYPE_VIDEO_OVERLAYioctl VIDIOC_ENUM_FMT 代替。

  11. struct v4l2_pix_format 中,depth 欄位已被移除,因為假設透過四字元程式碼識別格式的應用程式已經知道顏色深度,而其他應用程式則不關心它。同樣的理由導致 V4L2_FMT_FLAG_COMPRESSED 標誌被移除。V4L2_FMT_FLAG_SWCONVECOMPRESSED 標誌被移除,因為驅動程式不應在核心空間中轉換影像。相反,應提供一個使用者層的轉換函式庫。V4L2_FMT_FLAG_BYTESPERLINE 標誌是多餘的。應用程式可以將 bytesperline 欄位設定為零以獲得合理的預設值。由於其餘標誌也已被替換,flags 欄位本身也已被移除。

    隔行掃描標誌已被新新增的 field 欄位中的 enum v4l2_field 值取代。

    舊標誌

    enum v4l2_field

    V4L2_FMT_FLAG_NOT_INTERLACED

    ?

    V4L2_FMT_FLAG_INTERLACED = V4L2_FMT_FLAG_COMBINED

    V4L2_FIELD_INTERLACED

    V4L2_FMT_FLAG_TOPFIELD = V4L2_FMT_FLAG_ODDFIELD

    V4L2_FIELD_TOP

    V4L2_FMT_FLAG_BOTFIELD = V4L2_FMT_FLAG_EVENFIELD

    V4L2_FIELD_BOTTOM

    -

    V4L2_FIELD_SEQ_TB

    -

    V4L2_FIELD_SEQ_BT

    -

    V4L2_FIELD_ALTERNATE

    顏色空間標誌已被新新增的 colorspace 欄位中的 enum v4l2_colorspace 值取代,其中 V4L2_COLORSPACE_SMPTE170MV4L2_COLORSPACE_BT878V4L2_COLORSPACE_470_SYSTEM_MV4L2_COLORSPACE_470_SYSTEM_BG 中的一個取代 V4L2_FMT_CS_601YUV

  12. struct v4l2_requestbuffers 中,type 欄位被正確定義為 enum v4l2_buf_type。緩衝區型別如上所述發生了變化。添加了一個型別為 enum v4l2_memory 的新 memory 欄位,以區分使用驅動程式或應用程式分配的緩衝區的 I/O 方法。詳情請參閱 輸入/輸出

  13. struct v4l2_buffer 中,type 欄位被正確定義為 enum v4l2_buf_type。緩衝區型別如上所述發生了變化。添加了一個型別為 enum v4l2_fieldfield 欄位,以指示緩衝區是否包含頂場或底場。舊的欄位標誌已被移除。由於未能按計劃在核心中新增未調整的系統時間時鐘,timestamp 欄位從型別 stamp_t(一個表示納秒級取樣時間的無符號64位整數)改回 struct timeval。隨著第二種記憶體對映方法的新增,offset 欄位移入了聯合體 m 中,並添加了一個型別為 enum v4l2_memory 的新 memory 欄位,以區分 I/O 方法。詳情請參閱 輸入/輸出

    V4L2_BUF_REQ_CONTIG 標誌曾被 V4L 相容層使用,但在程式碼更改後不再需要。V4L2_BUF_ATTR_DEVICEMEM 標誌將指示緩衝區是否確實分配在裝置記憶體中,而非支援 DMA 的系統記憶體中。它幾乎沒有用處,因此被移除。

  14. struct v4l2_framebuffer 中,預期在離屏影片記憶體中進行雙緩衝和三緩衝的 base[3] 陣列(但未定義同步機制)已被單個指標取代。V4L2_FBUF_CAP_SCALEUPV4L2_FBUF_CAP_SCALEDOWN 標誌已被移除。應用程式可以使用新的裁剪和縮放介面更準確地確定此功能。V4L2_FBUF_CAP_CLIPPING 標誌已被 V4L2_FBUF_CAP_LIST_CLIPPINGV4L2_FBUF_CAP_BITMAP_CLIPPING 取代。

  15. struct v4l2_clip 中,xywidthheight 欄位已移至型別為 struct v4l2_rectc 子結構體中。xy 欄位已重新命名為 lefttop,即相對於上下文相關原點的偏移量。

  16. struct v4l2_window 中,xywidthheight 欄位已如上所述移至 w 子結構體中。添加了一個型別為 enum v4l2_fieldfield 欄位,以區分場和幀(隔行)疊加。

  17. 數字變焦介面,包括 struct v4l2_zoomcap、struct v4l2_zoomV4L2_ZOOM_NONCAPV4L2_ZOOM_WHILESTREAMING,已被新的裁剪和縮放介面取代。以前未使用的 struct v4l2_cropcapstruct v4l2_crop 為此目的重新定義。詳情請參閱 影像裁剪、插入和縮放 -- CROP API

  18. struct v4l2_vbi_format 中,SAMPLE_FORMAT 欄位現在包含一個用於識別影片影像格式的四字元程式碼,並且 V4L2_PIX_FMT_GREY 取代了 V4L2_VBI_SF_UBYTE 定義。reserved 欄位已擴充套件。

  19. struct v4l2_captureparm 中,timeperframe 欄位的型別從 unsigned long 變為 struct v4l2_fract。這允許精確表達 NTSC-M 幀速率 30000 / 1001 的倍數。添加了一個新欄位 readbuffers,用於控制讀取 I/O 模式下的驅動程式行為。

    struct v4l2_outputparm 也進行了類似更改。

  20. 結構體 v4l2_performanceVIDIOC_G_PERF ioctl 已被移除。除了使用 讀/寫 I/O 方法(無論如何都有限制)外,此資訊應用程式已可獲得。

  21. 舊版 V4L2 文件中 RGB 到 YCbCr 顏色空間的轉換示例不準確,這已在 影像格式 中得到更正。

6.2.10. V4L2 2003-06-19

  1. 為無線電裝置添加了一個新的功能標誌 V4L2_CAP_RADIO。在此更改之前,無線電裝置僅透過擁有一個型別欄位為 V4L2_TUNER_RADIO 的調諧器來識別。

  2. 添加了一個可選的驅動程式訪問優先順序機制,詳情請參閱 應用程式優先順序

  3. 發現音訊輸入和輸出介面不完整。

    以前 VIDIOC_G_AUDIO ioctl 會列舉可用的音訊輸入。不存在一個 ioctl 來確定當前的音訊輸入(如果多個音訊輸入與當前影片輸入結合)。因此 VIDIOC_G_AUDIO 被重新命名為 VIDIOC_G_AUDIO_OLD,此 ioctl 在 Kernel 2.6.39 中被移除。添加了 ioctl VIDIOC_ENUMAUDIO ioctl 來列舉音訊輸入,而 VIDIOC_G_AUDIO 現在報告當前的音訊輸入。

    VIDIOC_G_AUDOUTVIDIOC_ENUMAUDOUT 也進行了相同的更改。

    在此之前,“videodev”模組將自動在新舊 ioctl 之間進行轉換,但驅動程式和應用程式必須更新才能再次成功編譯。

  4. ioctl VIDIOC_OVERLAY ioctl 被錯誤地定義為讀寫引數。它被更改為只寫,而讀寫版本被重新命名為 VIDIOC_OVERLAY_OLD。舊的 ioctl 在 Kernel 2.6.39 中被移除。在此之前,“videodev”核心模組將自動轉換為新版本,因此驅動程式必須重新編譯,但應用程式不必。

  5. 影片疊加介面 錯誤地指出裁剪矩形定義了影片可見的區域。正確的說法是裁剪矩形定義了*不*顯示影片的區域,因此可以看到圖形表面。

  6. VIDIOC_S_PARMVIDIOC_S_CTRL ioctl 被定義為只寫引數,這與其他修改其引數的 ioctl 不一致。它們被更改為讀寫,而只寫版本則添加了 _OLD 字尾。舊的 ioctl 在 Kernel 2.6.39 中被移除。假設引數不變的驅動程式和應用程式需要更新。

6.2.11. V4L2 2003-11-05

  1. RGB 格式 中,以下畫素格式從 Bill Dirks 的 V4L2 規範中錯誤地轉移過來。下面的描述指記憶體中的位元組,按地址升序排列。

    符號

    本文件 0.5 版修訂前

    已更正

    V4L2_PIX_FMT_RGB24

    B, G, R

    R, G, B

    V4L2_PIX_FMT_BGR24

    R, G, B

    B, G, R

    V4L2_PIX_FMT_RGB32

    B, G, R, X

    R, G, B, X

    V4L2_PIX_FMT_BGR32

    R, G, B, X

    B, G, R, X

    V4L2_PIX_FMT_BGR24 示例始終是正確的。

    影像屬性 中,V4L VIDEO_PALETTE_RGB24VIDEO_PALETTE_RGB32 格式到 V4L2 畫素格式的對映已相應更正。

  2. 與上述修復無關,驅動程式可能仍然以不同方式解釋某些 V4L2 RGB 畫素格式。這些問題尚待解決,詳情請參閱 RGB 格式

6.2.12. V4L2 in Linux 2.6.6, 2004-05-09

  1. ioctl VIDIOC_CROPCAP ioctl 被錯誤地定義為只讀引數。它現在被定義為讀寫 ioctl,而只讀版本被重新命名為 VIDIOC_CROPCAP_OLD。舊的 ioctl 在 Kernel 2.6.39 中被移除。

6.2.13. V4L2 in Linux 2.6.8

  1. struct v4l2_buffer 中添加了一個新欄位 input(以前是 reserved[0])。此欄位的目的是在影片捕獲過程中與影片輸入(例如攝像機)交替。必須使用新的 V4L2_BUF_FLAG_INPUT 標誌啟用此功能。flags 欄位不再是隻讀的。

6.2.14. V4L2 spec erratum 2004-08-01

  1. V4L2 open() 函式的返回值被錯誤地記錄。

  2. 音訊輸出 ioctl 以 -AUDOUT 結尾,而不是 -AUDIOOUT。

  3. 在當前音訊輸入示例中,VIDIOC_G_AUDIO ioctl 採用了錯誤的引數。

  4. ioctl VIDIOC_QBUF, VIDIOC_DQBUFVIDIOC_DQBUF ioctl 的文件沒有提到 struct v4l2_buffermemory 欄位。示例中也缺少它。此外,在 VIDIOC_DQBUF 頁面上,EIO 錯誤程式碼未被記錄。

6.2.15. V4L2 in Linux 2.6.14

  1. 添加了一個新的切片 VBI 介面。它在 切片 VBI 資料介面 中有所記載,並取代了 V4L2 規範 0.8 中首次提出的介面。

6.2.16. V4L2 in Linux 2.6.15

  1. 添加了 ioctl VIDIOC_LOG_STATUS ioctl。

  2. 定義了新的影片標準 V4L2_STD_NTSC_443V4L2_STD_SECAM_LCV4L2_STD_SECAM_DK(SECAM D、K 和 K1 的集合)以及 V4L2_STD_ATSCV4L2_STD_ATSC_8_VSBV4L2_STD_ATSC_16_VSB 的集合)。請注意,V4L2_STD_525_60 集現在包含 V4L2_STD_NTSC_443。另請參閱 typedef v4l2_std_id

  3. VIDIOC_G_COMPVIDIOC_S_COMP ioctl 分別重新命名為 VIDIOC_G_MPEGCOMPVIDIOC_S_MPEGCOMP。它們的引數被 struct v4l2_mpeg_compression 指標取代。(VIDIOC_G_MPEGCOMPVIDIOC_S_MPEGCOMP ioctl 在 Linux 2.6.25 中被移除。)

6.2.17. V4L2 spec erratum 2005-11-27

影片捕獲示例中呼叫 VIDIOC_S_CROP ioctl 時未檢查是否支援裁剪。在影片標準選擇示例中,VIDIOC_S_STD 呼叫使用了錯誤的引數型別。

6.2.18. V4L2 spec erratum 2006-01-10

  1. struct v4l2_input 中的 V4L2_IN_ST_COLOR_KILL 標誌不僅指示顏色殺手是否啟用,還指示它是否處於活動狀態。(顏色殺手在檢測到影片訊號中沒有顏色時停用顏色解碼以提高影像質量。)

  2. VIDIOC_S_PARM 是一個讀寫 ioctl,而不是其參考頁面上所述的只寫 ioctl。此 ioctl 已在 2003 年更改,如上所述。

6.2.19. V4L2 spec erratum 2006-02-03

  1. struct v4l2_captureparmstruct v4l2_outputparm 中,timeperframe 欄位表示時間以秒為單位,而不是微秒。

6.2.20. V4L2 spec erratum 2006-02-04

  1. struct v4l2_window 中的 clips 欄位必須指向 struct v4l2_clip 的陣列,而不是連結串列,因為驅動程式會忽略 struct v4l2_clipnext 指標。

6.2.21. V4L2 in Linux 2.6.17

  1. 添加了新的影片標準宏:V4L2_STD_NTSC_M_KR(NTSC M 韓國),以及集合 V4L2_STD_MNV4L2_STD_BV4L2_STD_GHV4L2_STD_DKV4L2_STD_NTSCV4L2_STD_SECAM 集合現在分別包含 V4L2_STD_NTSC_M_KRV4L2_STD_SECAM_LC

  2. 定義了新的 V4L2_TUNER_MODE_LANG1_LANG2 以錄製雙語節目的兩種語言。為此目的使用 V4L2_TUNER_MODE_STEREO 現已棄用。詳見 VIDIOC_G_TUNER 部分。

6.2.22. V4L2 規範勘誤 2006-09-23 (草案 0.15)

  1. 在多處,切片 VBI 介面的 V4L2_BUF_TYPE_SLICED_VBI_CAPTUREV4L2_BUF_TYPE_SLICED_VBI_OUTPUT 未與其他緩衝區型別一同提及。

  2. VIDIOC_G_AUDIO 中,澄清了 struct v4l2_audiomode 欄位是一個標誌欄位。

  3. ioctl VIDIOC_QUERYCAP 未提及切片 VBI 和無線電功能標誌。

  4. VIDIOC_G_FREQUENCY 中,澄清了應用程式在呼叫 VIDIOC_S_FREQUENCY 之前必須初始化 struct v4l2_frequency 的調諧器 type 欄位。

  5. struct v4l2_requestbuffers 中的 reserved 陣列有 2 個元素,而不是 32 個。

  6. 在“影片輸出介面”和“原始 VBI 資料介面”中,從未普及的裝置檔名 /dev/vout/dev/video 取代。

  7. 在 Linux 2.6.15 中,VBI 裝置次要號的可能範圍從 224-239 擴充套件到 224-255。因此,現在可以使用裝置檔名 /dev/vbi0/dev/vbi31

6.2.23. Linux 2.6.18 中的 V4L2

  1. 添加了新的 ioctl 命令 VIDIOC_G_EXT_CTRLSVIDIOC_S_EXT_CTRLSVIDIOC_TRY_EXT_CTRLS,以及一個跳過不支援的控制的標誌,配合 ioctls VIDIOC_QUERYCTRL, VIDIOC_QUERY_EXT_CTRL 和 VIDIOC_QUERYMENU 使用;新增了控制型別 V4L2_CTRL_TYPE_INTEGER64V4L2_CTRL_TYPE_CTRL_CLASS (enum v4l2_ctrl_type);以及新的控制標誌 V4L2_CTRL_FLAG_READ_ONLYV4L2_CTRL_FLAG_UPDATEV4L2_CTRL_FLAG_INACTIVEV4L2_CTRL_FLAG_SLIDER (控制標誌)。詳見擴充套件控制 API

6.2.24. Linux 2.6.19 中的 V4L2

  1. struct v4l2_sliced_vbi_cap 中,添加了一個緩衝區型別欄位,替換了一個保留欄位。請注意,在 enum 型別大小與 int 型別大小不同的架構上,該結構的大小已發生變化。VIDIOC_G_SLICED_VBI_CAP ioctl 從只讀重新定義為讀寫。應用程式現在必須初始化 type 欄位並清除保留欄位。這些更改可能會 破壞 與舊版驅動程式和應用程式的 相容性

  2. 添加了 ioctl 命令 ioctl VIDIOC_ENUM_FRAMESIZESioctl VIDIOC_ENUM_FRAMEINTERVALS

  3. 添加了新的畫素格式 V4L2_PIX_FMT_RGB444 (RGB 格式)。

6.2.25. V4L2 規範勘誤 2006-10-12 (草案 0.17)

  1. V4L2_PIX_FMT_HM12 (保留影像格式) 是 YUV 4:2:0 格式,而不是 4:2:2 格式。

6.2.26. Linux 2.6.21 中的 V4L2

  1. videodev2.h 標頭檔案現在採用 GNU 通用公共許可證第二版或更高版本,以及三條款 BSD 風格許可證雙重許可。

6.2.27. Linux 2.6.22 中的 V4L2

  1. 添加了兩種新的欄位順序 V4L2_FIELD_INTERLACED_TBV4L2_FIELD_INTERLACED_BT。詳見 enum v4l2_field

  2. 影片疊加介面添加了三種新的剪裁/混合方法,帶有全域性或直向或反轉的區域性 alpha 值。詳見 VIDIOC_G_FBUFVIDIOC_S_FBUF ioctl 的描述。

    struct v4l2_window 中添加了一個新的 global_alpha 欄位,擴充套件了該結構。這可能會**破壞**直接使用 struct v4l2_window 的應用程式的**相容性**。然而,VIDIOC_G/S/TRY_FMT ioctl 命令不受影響,這些命令接受指向 struct v4l2_format 父結構(末尾帶有填充位元組)的指標。

  3. struct v4l2_windowchromakey 欄位的格式從“主機位元組序 RGB32”更改為與幀緩衝區相同格式的畫素值。這可能會**破壞**現有應用程式的**相容性**。目前尚不清楚是否有驅動程式支援“主機位元組序 RGB32”格式。

6.2.28. Linux 2.6.24 中的 V4L2

  1. 添加了畫素格式 V4L2_PIX_FMT_PAL8V4L2_PIX_FMT_YUV444V4L2_PIX_FMT_YUV555V4L2_PIX_FMT_YUV565V4L2_PIX_FMT_YUV32

6.2.29. Linux 2.6.25 中的 V4L2

  1. 添加了畫素格式 V4L2_PIX_FMT_Y16V4L2_PIX_FMT_SBGGR16

  2. 添加了新的控制功能:V4L2_CID_POWER_LINE_FREQUENCYV4L2_CID_HUE_AUTOV4L2_CID_WHITE_BALANCE_TEMPERATUREV4L2_CID_SHARPNESSV4L2_CID_BACKLIGHT_COMPENSATION。控制 V4L2_CID_BLACK_LEVELV4L2_CID_WHITENESSV4L2_CID_HCENTERV4L2_CID_VCENTER 已棄用。

  3. 添加了一個攝像頭控制類,包含新的控制:V4L2_CID_EXPOSURE_AUTOV4L2_CID_EXPOSURE_ABSOLUTEV4L2_CID_EXPOSURE_AUTO_PRIORITYV4L2_CID_PAN_RELATIVEV4L2_CID_TILT_RELATIVEV4L2_CID_PAN_RESETV4L2_CID_TILT_RESETV4L2_CID_PAN_ABSOLUTEV4L2_CID_TILT_ABSOLUTEV4L2_CID_FOCUS_ABSOLUTEV4L2_CID_FOCUS_RELATIVEV4L2_CID_FOCUS_AUTO

  4. VIDIOC_G_MPEGCOMPVIDIOC_S_MPEGCOMP ioctl 命令在 Linux 2.6.18 中已被擴充套件控制介面取代,最終從 videodev2.h 標頭檔案中移除。

6.2.30. Linux 2.6.26 中的 V4L2

  1. 添加了畫素格式 V4L2_PIX_FMT_Y16V4L2_PIX_FMT_SBGGR16

  2. 添加了使用者控制 V4L2_CID_CHROMA_AGCV4L2_CID_COLOR_KILLER

6.2.31. Linux 2.6.27 中的 V4L2

  1. 添加了 ioctl VIDIOC_S_HW_FREQ_SEEK ioctl 命令和 V4L2_CAP_HW_FREQ_SEEK 功能。

  2. 添加了畫素格式 V4L2_PIX_FMT_YVYUV4L2_PIX_FMT_PCA501V4L2_PIX_FMT_PCA505V4L2_PIX_FMT_PCA508V4L2_PIX_FMT_PCA561V4L2_PIX_FMT_SGBRG8V4L2_PIX_FMT_PAC207V4L2_PIX_FMT_PJPG

6.2.32. Linux 2.6.28 中的 V4L2

  1. 添加了 V4L2_MPEG_AUDIO_ENCODING_AACV4L2_MPEG_AUDIO_ENCODING_AC3 MPEG 音訊編碼。

  2. 添加了 V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC MPEG 影片編碼。

  3. 添加了畫素格式 V4L2_PIX_FMT_SGRBG10V4L2_PIX_FMT_SGRBG10DPCM8

6.2.33. Linux 2.6.29 中的 V4L2

  1. VIDIOC_G_CHIP_IDENT ioctl 命令已重新命名為 VIDIOC_G_CHIP_IDENT_OLD,並引入了 VIDIOC_DBG_G_CHIP_IDENT 取代它。舊的 struct v4l2_chip_ident 已重新命名為 struct v4l2_chip_ident_old

  2. 添加了畫素格式 V4L2_PIX_FMT_VYUYV4L2_PIX_FMT_NV16V4L2_PIX_FMT_NV61

  3. 添加了攝像頭控制 V4L2_CID_ZOOM_ABSOLUTEV4L2_CID_ZOOM_RELATIVEV4L2_CID_ZOOM_CONTINUOUSV4L2_CID_PRIVACY

6.2.34. Linux 2.6.30 中的 V4L2

  1. 添加了新的控制標誌 V4L2_CTRL_FLAG_WRITE_ONLY

  2. 添加了新的控制 V4L2_CID_COLORFX

6.2.35. Linux 2.6.32 中的 V4L2

  1. 為了便於比較 V4L2 API 和核心版本,現在 V4L2 API 使用 Linux 核心版本編號。

  2. RDS 捕獲 API 已最終確定。詳見 RDS 介面

  3. 為調製器和 RDS 編碼器添加了新功能。

  4. 添加了 libv4l API 的描述。

  5. 透過新型別 V4L2_CTRL_TYPE_STRING 添加了對字串控制的支援。

  6. 添加了 V4L2_CID_BAND_STOP_FILTER 文件。

  7. 添加了 FM 調製器(FM TX)擴充套件控制類:V4L2_CTRL_CLASS_FM_TX 及其控制 ID。

  8. 添加了 FM 接收器(FM RX)擴充套件控制類:V4L2_CTRL_CLASS_FM_RX 及其控制 ID。

  9. 添加了遙控器章節,描述了媒體裝置的預設遙控器對映。

6.2.36. Linux 2.6.33 中的 V4L2

  1. 添加了數字影片時序支援,以支援 HDTV 接收器和發射器。

6.2.37. Linux 2.6.34 中的 V4L2

  1. 攝像頭控制類添加了 V4L2_CID_IRIS_ABSOLUTEV4L2_CID_IRIS_RELATIVE 控制。

6.2.38. Linux 2.6.37 中的 V4L2

  1. 移除了 vtx(圖文電視/字幕電視)API。該 API 已不再使用,也沒有硬體可驗證該 API。也未發現任何使用它的使用者空間應用程式。它原定於 2.6.35 版本中移除。

6.2.39. Linux 2.6.39 中的 V4L2

  1. 移除了舊的 VIDIOC_*_OLD 符號和 V4L1 支援。

  2. 添加了多平面 API。不影響當前驅動程式和應用程式的相容性。詳見多平面 API

6.2.40. Linux 3.1 中的 V4L2

  1. VIDIOC_QUERYCAP 現在返回每個子系統版本,而不是每個驅動程式版本。

    對無效 ioctl 進行了錯誤程式碼標準化。

    添加了 V4L2_CTRL_TYPE_BITMASK。

6.2.41. Linux 3.2 中的 V4L2

  1. 添加了 V4L2_CTRL_FLAG_VOLATILE 以向用戶空間指示易失性控制。

  2. 添加了用於裁剪和合成的擴充套件控制的選擇 API。不影響當前驅動程式和應用程式的相容性。詳見選擇 API

6.2.42. Linux 3.3 中的 V4L2

  1. 使用者控制類添加了 V4L2_CID_ALPHA_COMPONENT 控制。

  2. struct v4l2_capabilities 中添加了 device_caps 欄位,並添加了新的 V4L2_CAP_DEVICE_CAPS 功能。

6.2.43. Linux 3.4 中的 V4L2

  1. 添加了JPEG 壓縮控制類

  2. 擴充套件了 DV 時序 API:ioctl VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGSioctl VIDIOC_QUERY_DV_TIMINGSioctl VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP

6.2.44. Linux 3.5 中的 V4L2

  1. 添加了整數選單,新型別將是 V4L2_CTRL_TYPE_INTEGER_MENU

  2. 添加了 V4L2 子裝置介面的選擇 API:ioctl VIDIOC_SUBDEV_G_SELECTION, VIDIOC_SUBDEV_S_SELECTIONVIDIOC_SUBDEV_S_SELECTION

  3. V4L2_CID_COLORFX 控制添加了 V4L2_COLORFX_ANTIQUEV4L2_COLORFX_ART_FREEZEV4L2_COLORFX_AQUAV4L2_COLORFX_SILHOUETTEV4L2_COLORFX_SOLARIZATIONV4L2_COLORFX_VIVIDV4L2_COLORFX_ARBITRARY_CBCR 選單項。

  4. 添加了 V4L2_CID_COLORFX_CBCR 控制。

  5. 添加了攝像頭控制 V4L2_CID_AUTO_EXPOSURE_BIASV4L2_CID_AUTO_N_PRESET_WHITE_BALANCEV4L2_CID_IMAGE_STABILIZATIONV4L2_CID_ISO_SENSITIVITYV4L2_CID_ISO_SENSITIVITY_AUTOV4L2_CID_EXPOSURE_METERINGV4L2_CID_SCENE_MODEV4L2_CID_3A_LOCKV4L2_CID_AUTO_FOCUS_STARTV4L2_CID_AUTO_FOCUS_STOPV4L2_CID_AUTO_FOCUS_STATUSV4L2_CID_AUTO_FOCUS_RANGE

6.2.45. Linux 3.6 中的 V4L2

  1. struct v4l2_buffer 中的 input 替換為 reserved2 並移除了 V4L2_BUF_FLAG_INPUT

  2. 添加了 V4L2_CAP_VIDEO_M2MV4L2_CAP_VIDEO_M2M_MPLANE 功能。

  3. 添加了對頻帶列舉的支援:ioctl VIDIOC_ENUM_FREQ_BANDS

6.2.46. Linux 3.9 中的 V4L2

  1. struct v4l2_bufferflags 欄位中添加了時間戳型別。詳見緩衝區標誌

  2. 添加了 V4L2_EVENT_CTRL_CH_RANGE 控制事件更改標誌。詳見控制更改

6.2.47. Linux 3.10 中的 V4L2

  1. 移除了過時且未使用的 DV_PRESET ioctl 命令 VIDIOC_G_DV_PRESET、VIDIOC_S_DV_PRESET、VIDIOC_QUERY_DV_PRESET 和 VIDIOC_ENUM_DV_PRESET。移除了相關的 v4l2_input/output 功能標誌 V4L2_IN_CAP_PRESETSV4L2_OUT_CAP_PRESETS

  2. 添加了新的除錯 ioctl 命令 ioctl VIDIOC_DBG_G_CHIP_INFO

6.2.48. Linux 3.11 中的 V4L2

  1. 移除了過時的 VIDIOC_DBG_G_CHIP_IDENT ioctl 命令。

6.2.49. Linux 3.14 中的 V4L2

  1. struct v4l2_rect 中,widthheight 欄位的型別從 _s32 更改為 _u32。

6.2.50. Linux 3.15 中的 V4L2

  1. 添加了軟體定義無線電(SDR)介面。

6.2.51. Linux 3.16 中的 V4L2

  1. 添加了事件 V4L2_EVENT_SOURCE_CHANGE

6.2.52. Linux 3.17 中的 V4L2

  1. 擴充套件了 struct v4l2_pix_format。添加了格式標誌。

  2. 添加了複合控制型別和 VIDIOC_QUERY_EXT_CTRL

6.2.53. Linux 3.18 中的 V4L2

  1. 添加了 V4L2_CID_PAN_SPEEDV4L2_CID_TILT_SPEED 攝像頭控制。

6.2.54. Linux 3.19 中的 V4L2

  1. 重寫了顏色空間章節,在 struct v4l2_pix_formatstruct v4l2_pix_format_mplanestruct v4l2_mbus_framefmt 中添加了新的 enum v4l2_ycbcr_encodingenum v4l2_quantization 欄位。

6.2.55. Linux 4.4 中的 V4L2

  1. V4L2_TUNER_ADC 重新命名為 V4L2_TUNER_SDRV4L2_TUNER_ADC 的使用現已棄用。

  2. 添加了 V4L2_CID_RF_TUNER_RF_GAIN 射頻調諧器控制。

  3. 為軟體定義無線電(SDR)介面添加了發射器支援。

6.2.56. V4L2 與其他 Linux 多媒體 API 的關係

6.2.56.1. X 影片擴充套件

X 影片擴充套件(簡稱 XVideo 或 Xv)是 X Window 系統的一個擴充套件,例如由 XFree86 專案實現。其範圍類似於 V4L2,是一個為 X 客戶端提供影片捕獲和輸出裝置的 API。Xv 允許應用程式在視窗中顯示即時影片,將視窗內容傳送到電視輸出,並在 XPixmaps 中捕獲或輸出靜態影像 [1]。透過它們的實現,XFree86 使該擴充套件可在許多作業系統和架構上使用。

由於驅動程式嵌入在 X 伺服器中,Xv 相對於 V4L2 的影片疊加介面具有多項優勢。驅動程式可以輕鬆確定疊加目標,即可見圖形記憶體或用於破壞性疊加的螢幕外緩衝區。它可以對 RAMDAC 進行程式設計,以實現非破壞性疊加、縮放或色度鍵控,或實現影片捕獲硬體的剪裁功能,始終與繪圖操作或視窗移動或更改其堆疊順序保持同步。

為了結合 Xv 和 V4L 的優勢,XFree86 和 XOrg 中存在一個特殊的 Xv 驅動程式,它只對找到的任何支援疊加的 Video4Linux 裝置進行程式設計。要啟用它,/etc/X11/XF86Config 必須包含以下行

Section "Module"
    Load "v4l"
EndSection

截至 XFree86 4.2,此驅動程式仍然僅支援 V4L ioctl 命令,但透過 V4L2 向後相容層,它應該可以很好地與所有 V4L2 裝置配合使用。由於 V4L2 允許多次開啟,因此當 X 客戶端請求影片疊加時,如果 V4L2 驅動程式支援,則可以捕獲影片。有關同時捕獲和疊加的限制,請參閱影片疊加介面中的討論。

僅與 V4L2 略有相關,XFree86 擴充套件了 Xv 以支援硬體 YUV 到 RGB 轉換和縮放,從而實現更快的影片播放,並添加了 MPEG-2 解碼硬體介面。此 API 對於顯示使用 V4L2 裝置捕獲的影像很有用。

6.2.56.2. 數字影片

V4L2 不支援數字地面、有線或衛星廣播。存在一個針對數字接收器的獨立專案。您可以在 https://linuxtv.org 找到其主頁。Linux DVB API 與 V4L2 API 沒有關聯,除非混合硬體的驅動程式可能同時支援兩者。

6.2.56.3. 音訊介面

[待辦 - OSS/ALSA]

6.2.57. 實驗性 API 元素

以下 V4L2 API 元素目前處於實驗階段,未來可能會發生變化。

6.2.58. 廢棄的 API 元素

以下 V4L2 API 元素已被新介面取代,不應在新的驅動程式中實現。