拡張色情報
RGB 色について少しでも知っていると、(255、255、255) が色 "白" の 8 ビット RGB トリプレットであるとわかります。 しかし、このトリプレットによって定義された "色" とは実際は何でしょう?
答えに驚かれるかもしれません。追加情報がなければ、このトリプレットは特定の色を定義しないのです。 RGB 値の意味は、"色空間" によって異なります。 色空間がわからない場合は、厳密に言うと、色がわかりません。
色空間は、特定の色値の数値表現を物理的な光として再現する方法を定義します。 ビデオがある色空間でエンコードされているが、別のもので表示されると、ビデオが色補正されない限り、色が歪みます。 そのため、正確な色の忠実さを実現するには、ソース ビデオの色空間を把握することが重要です。 以前は、Windows のビデオ パイプラインには、目的の色空間に関する情報が含まれていませんでした。 Windows Vista 以降では、DirectShow とメディア ファンデーションの両方が、メディアの種類で拡張色情報をサポートしています。 この情報は、DirectX ビデオ アクセラレータ (DXVA) でも使用できます。
色空間を数学的に記述する標準的な方法は、国際照明委員会 (CIE) によって定義された CIE XYZ 色空間を使用することです。 ビデオで CIE XYZ 値を直接使用することは実用的ではありませんが、色空間の間で変換するときに中間表現として CIE XYZ 色空間を使用できます。
色を正確に再現するには、次の情報が必要です。
- 原色。 原色は、CIE XYZ 三刺激値を RGB コンポーネントとして表す方法を定義します。 実際には、原色は、指定された RGB 値の "意味" を定義します。
- 伝達関数。 伝達関数は、線形 RGB 値を非線形 R'G'B' 値に変換する関数です。 この関数は "ガンマ補正" とも呼ばれます。
- 伝達行列。 伝達行列は、R'G'B' を Y'PbPr に変換する方法を定義します。
- クロマ サンプリング。 ほとんどの YUV ビデオは、ルーマよりもクロマ成分の解像度を低くして送信されます。 クロマ サンプリングは、ビデオ形式の FOURCC によって示されます。 たとえば、YUY2 は 4:2:2 形式です。つまり、クロマ サンプルは水平係数 2 でサンプリングされます。
- クロマ位置。 クロマをサンプリングするときに、ルーマ サンプルに対するクロマ サンプルの相対位置が、欠落しているサンプルを補間する方法を決定します。
- 公称範囲。 公称範囲は、Y'PbPr 値を Y'CbCr にスケーリングする方法を定義します。
DirectShow、メディア ファンデーション、DirectX ビデオ アクセラレータ (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 空間から別のものへの変換には、次の手順が必要です。
逆量子化: ソースの公称範囲を使用して、Y'CbCr 表現を Y'PbPr 表現に変換します。
アップサンプリング: クロマ値を補間して、サンプリングしたクロマ値を 4:4:4 に変換します。
YUV から RGB への変換: ソースの伝達行列を使用して、Y'PbPr から非線形 R'G'B' に変換します。
逆伝達関数: 伝達の逆関数を使用して、非線形 R'G'B' を線形 RGB に変換します。
RGB 色空間変換: 原色を使用して、ソース RGB 空間からターゲット RGB 空間に変換します。
伝達関数: ターゲットの伝達関数を使用して、線形 RGB を非線形 R'G'B に変換します。
RGB から YUV への変換: ターゲットの伝達行列を使用して、R'G'B' を Y'PbPr に変換します。
ダウンサンプリング: クロマ値をフィルター処理して、4:4:4 から 4:2:2、4:2:0、または 4:1:1 に変換します。
量子化: ターゲットの公称範囲を使用して、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 フィールドで色情報を提供します。 ソースで色情報が明示的に記述されていない場合は、コンテンツの種類によって暗黙的に定義されている可能性があります。 たとえば、NTSC と PAL の種類の DV ビデオは、それぞれ異なる色空間を使用します。 最終的に、デコーダーは、ソースのメディアの種類から取得したすべての色情報を使用できます。
他のコンポーネントは、次のように、メディアの種類にある色空間情報を使用することが必要な場合があります。
- ソフトウェアの色空間コンバーターは、変換アルゴリズムを選択するときに色空間情報を使用する必要があります。
- ビデオ ミキサー (Enhanced Video Renderer (EVR) ミキサーなど) は、異なる種類のコンテンツのビデオ ストリームを混在させるときに色情報を使用する必要があります。
- DXVA ビデオ処理 API と DDI を使用すると、呼び出し元で色空間情報を指定できます。 GPU は、ハードウェアでビデオ ミキシングを実行するときに、この情報を使用する必要があります。