擴充色彩資訊

如果您知道任何有關 RGB 色彩的資訊,您知道 (255, 255, 255) 是色彩白色8 位 RGB 三重奏。 但是這個三重奏所定義的實際 色彩 是什麼?

答案可能令人驚訝:如果沒有一些額外的資訊,這個三重奏不會定義任何特定的色彩! 任何 RGB 值的意義取決於 色彩空間。 如果我們不知道色彩空間,那麼嚴格地說,我們不知道色彩。

色彩空間會定義指定色彩值的數值表示應如何重現為實體光線。 當視訊以一個色彩空間編碼,但在另一個色彩空間中顯示時,除非影片已更正色彩,否則會產生扭曲的色彩。 若要達到精確的色彩逼真度,因此請務必瞭解來源視訊的色彩空間。 先前,Windows 中的視訊管線並未攜帶預定色彩空間的相關信息。 從 Windows Vista 開始,DirectShow 和 Media Foundation 都支援媒體類型中的擴充色彩資訊。 此資訊也適用於 DirectX 視訊加速 (DXVA)。

以數學方式描述色彩空間的標準方法是使用國際照明委員會(CIE)定義的 CIE XYZ 色彩空間。 直接在視訊中使用 CIE XYZ 值並不實用,但 CIE XYZ 色彩空間可以在色彩空格之間轉換時做為中繼表示法。

若要正確重現色彩,需要下列資訊:

  • 色彩初選。 色彩主要定義 CIE XYZ 三imulus 值如何表示為 RGB 元件。 實際上,色彩初選會定義指定 RGB 值的「意義」。
  • 傳輸函式。 傳輸函式是將線性 RGB 值轉換成非線性 R'G'B' 值的函式。 此函式也稱為 gamma 修正
  • 傳輸矩陣。 傳輸矩陣會定義 R'G'B' 如何轉換成 Y'PbPr。
  • 色度取樣。 大部分 YUV 視訊的傳輸解析度比 luma 低。 色度取樣是以視訊格式的FOURCC表示。 例如,YUY2 是 4:2:2 格式,這表示色度樣本會以 2 的因子水平取樣。
  • 色度坐著。 取樣色度時,色度樣本相對於 luma 樣本的位置會決定遺漏樣本的插補方式。
  • 名義範圍。 名義範圍會定義如何將 Y'PbPr 值調整為 Y'CbCr。

媒體類型的色彩空間

DirectShow、Media Foundation 和 DirectX Video Acceleration (DXVA) 都有不同的方式來表示視訊格式。 幸運的是,很容易將色彩空間資訊從一個轉譯到另一個,因為相關的列舉是相同的。

  • DXVA 1.0:DXVA_ExtendedFormat 結構中會提供色彩空間資訊。

  • DXVA 2.0:色彩空間資訊是在 DXVA2_ExtendedFormat 結構中提供。 這個結構與 DXVA 1.0 結構相同,而且欄位的意義相同。

  • DirectShow:VIDEOINFOHEADER2 結構中會提供色彩空間資訊。 信息會儲存在 dwControlFlags 欄位的上方 24 位。 如果色彩空間資訊存在,請在 dwControlFlags 中設定AMCONTROL_COLORINFO_PRESENT旗標。 設定此旗標時,dwControlFlags 字段應該解譯為DXVA_ExtendedFormat結構,不同之處在於結構中較低的 8 位會保留給AMCONTROL_xxx旗標。

  • 視訊擷取驅動程式:KS_VIDEOINFOHEADER2 結構中會提供色彩空間資訊。 這個結構與 VIDEOINFOHEADER2 結構相同,而且字段的意義相同。

  • 媒體基礎:色彩空間資訊會儲存為媒體類型的屬性:

    色彩資訊 屬性
    色彩主要 MF_MT_VIDEO_PRIMARIES
    傳輸函式 MF_MT_TRANSFER_FUNCTION
    傳輸矩陣 MF_MT_YUV_MATRIX
    色度子取樣 MF_MT_SUBTYPE
    (由 FOURCC 提供,儲存在第一個 子類型 GUID 的 DWORD 。)
    色度坐著 MF_MT_VIDEO_CHROMA_SITING
    名義範圍 MF_MT_VIDEO_NOMINAL_RANGE

     

色彩空間轉換

從一個 Y'CbCr 空間轉換成另一個空間需要下列步驟。

  1. 反向量化:使用來源名義範圍,將 Y'CbCr 表示法轉換成 Y'PbPr 表示法。

  2. 向上取樣:藉由插補色度值,將取樣的色度值轉換為 4:4:4。

  3. YUV 轉換為 RGB 轉換:使用來源傳輸矩陣,從 Y'PbPr 轉換為非線性 R'G'B'。

  4. 反向傳輸函式:使用傳輸函式的反轉函數,將非線性 R'G'B' 轉換為線性 RGB。

  5. RGB 色彩空間轉換:使用色彩初選,從來源 RGB 空間轉換成目標 RGB 空間。

  6. 傳輸函式:使用目標傳輸函式,將線性 RGB 轉換為非線性 R'G'B。

  7. RGB 到 YUV 轉換:使用目標傳輸矩陣,將 R'G'B' 轉換為 Y'PbPr。

  8. 向下取樣:藉由篩選色度值,將 4:4:4 轉換為 4:2:2、4:2:0 或 4:1:1。

  9. 量化:使用目標名義範圍,將 Y'PbPr 轉換為 Y'CbCr。

步驟 1–4 發生在來源色彩空間中,而步驟 6–9 則發生在目標色彩空間中。 在實際實作中,中繼步驟可以是近似值,而相鄰步驟可以合併。 精確度和計算成本之間通常有取捨。

例如,若要從 RT.601 轉換為 RT.709,需要下列階段:

  • 反量化:Y'CbCr(601) 到 Y'PbPr(601)

  • 向上取樣: Y'PbPr(601)

  • YUV 至 RGB: Y'PbPr(601) 至 R'G'B'(601)

  • 反向傳輸函式:R'G'B'(601) 至 RGB(601)

  • RGB 色彩空間轉換:RGB(601) 至 RGB(709)

  • 傳輸函式:RGB(709) 至 R'G'B'(709)

  • RGB 至 YUV:R'G'B'(709) 至 Y'PbPr(709)

  • 降級:Y'PbPr(709)

  • 量化:Y'PbPr(709) 至 Y'CbCr(709)

使用延伸色彩資訊

若要在整個管線中保留色彩逼真度,必須在來源或譯碼器引進色彩空間資訊,並一路透過管線傳遞至接收。

視訊擷取裝置

大部分的類比擷取裝置在擷取視訊時會使用定義完善的色彩空間。 擷取驅動程式應提供包含 色彩資訊的KS_VIDEOINFOHEADER2 格式區塊格式。 為了保持回溯相容性,驅動程序應該接受不包含色彩資訊的格式。 這可讓驅動程式使用不接受擴充色彩信息的元件。

檔案型來源

剖析視訊檔案時,媒體來源(或 DirectShow 中的剖析器篩選條件)可能會提供一些色彩資訊。 例如,DVD 導覽器可以根據 DVD 內容來判斷色彩空間。 譯碼器可能可以使用其他色彩資訊。 例如,MPEG-2 基礎視訊串流會提供sequence_display_extension字段中的色彩資訊。 如果來源中未明確描述色彩資訊,則可能由內容類型隱含定義。 例如,DV 視訊的NTSC和 PAL 品種各使用不同的色彩空間。 最後,譯碼器可以使用它從來源媒體類型取得的任何色彩資訊。

其他元件

其他元件可能需要在媒體類型中使用色彩空間資訊:

  • 軟體色彩空間轉換器在選取轉換演算法時,應該使用色彩空間資訊。
  • 視訊混音器,例如增強式視訊轉譯器(EVR)混音器,在混合不同內容類型的視訊串流時,應該使用色彩資訊。
  • DXVA 視訊處理 API 和 DIS 可讓呼叫端指定色彩空間資訊。 GPU 在執行硬式視訊混合時,應該使用這項資訊。

視訊媒體類型

DirectX 影片加速 2.0