ビデオ レンダリングに推奨される 8 ビット YUV 形式
Gary Sullivan と Stephen Estrop
Microsoft Corporation
2002 年 4 月、2008 年 11 月に更新
このトピックでは、Windows オペレーティング システムでのビデオ レンダリングに推奨される 8 ビットの YUV カラー形式について説明します。 この記事では、YUV 形式と RGB 形式の間で変換する手法と、YUV 形式をアップサンプリングする手法についても説明します。 この記事は、Windows で YUV ビデオのデコードまたはレンダリングを使用するユーザーを対象としています。
はじめに
多くの YUV 形式は、ビデオ業界全体で定義されています。 この記事では、Windows でのビデオ レンダリングに推奨される 8 ビット YUV 形式を特定します。 デコーダー ベンダーとディスプレイ ベンダーは、この記事で説明する形式をサポートすることをお勧めします。 この記事では、YUV カラーの他の用途 (静止写真など) については説明しません。
この記事で説明する形式はすべて、ピクセル位置あたり 8 ビットを使用して Y チャネル (luma チャネルとも呼ばれます) をエンコードし、サンプルごとに 8 ビットを使用して各 U または V クロマ サンプルをエンコードします。 ただし、ほとんどの YUV 形式では、Y より少ないサンプルと V のサンプルが含まれているため、1 ピクセルあたり平均で 24 ビット未満が使用されます。この記事では、10 ビット以上の Y チャネルを持つ YUV 形式については説明しません。
注意
この記事の目的上、用語 U は Cb に相当し、用語 V は Cr に相当します。
この記事では、次のトピックについて説明します。
- YUV サンプリング。 最も一般的な YUV サンプリング手法について説明します。
- サーフェス定義。 推奨される YUV 形式について説明します。
- 色空間とクロマ サンプリング レートの変換。 YUV 形式と RGB 形式間の変換と、異なる YUV 形式間での変換に関するいくつかのガイドラインを提供します。
- Media Foundation での YUV 形式の識別。 Media Foundation で YUV 形式の種類を記述する方法について説明します。
YUV サンプリング
クロマチャンネルは、知覚品質を劇的に失うことなく、ルマチャネルよりも低いサンプリングレートを有することができる。 "A:B:C" 表記と呼ばれる表記は、Y を基準にしてサンプリングされるユーザーと V の頻度を示すために使用されます。
- 4:4:4はクロマチャンネルのダウンサンプリングがないことを意味します。
- 4:2:2 は 2:1 水平ダウンサンプリングを意味し、垂直ダウンサンプリングは行われません。 すべてのスキャン ラインには、2 つの U または V サンプルごとに 4 つの Y サンプルが含まれています。
- 4:2:0 は 2:1 の水平ダウンサンプリングを意味し、垂直ダウンサンプリングは 2:1 です。
- 4:1:1 は 4:1 水平ダウンサンプリングを意味し、垂直ダウンサンプリングは行われません。 すべてのスキャン行には、you サンプルと V サンプルごとに 4 つの Y サンプルが含まれています。 4:1:1 サンプリングは他の形式よりも一般的ではなく、この記事では詳しく説明しません。
次の図は、ダウンサンプリングレートごとにクロマがどのようにサンプリングされるかを示しています。 ルマサンプルはクロスで表され、クロマサンプルは円で表されます。
4:2:2 サンプリングの主要な形式は、ITU-R Recommendation BT.601 で定義されています。 4:2:0 サンプリングには 2 つの一般的なバリエーションがあります。 これらの 1 つは MPEG-2 ビデオで使用され、もう 1 つは MPEG-1 と ITU-T Recommendations H.261 および H.263 で使用されます。
MPEG-1 スキームと比較すると、MPEG-2 スキームと、4:2:2 および 4:4:4 形式で定義されているサンプリング グリッドの間で変換する方が簡単です。 このため、WINDOWS では MPEG-2 スキームが優先され、4:2:0 形式の既定の解釈と見なす必要があります。
サーフェス定義
このセクションでは、ビデオ レンダリングに推奨される 8 ビットの YUV 形式について説明します。 これらはいくつかのカテゴリに分類されます。
まず、次の内容を理解するために、次の概念に注意する必要があります。
- サーフェスの原点。 この記事で説明する YUV 形式の場合、原点 (0,0) は常にサーフェスの左上隅です。
- ストライド。 サーフェスのストライド (ピッチとも呼ばれる) は、サーフェスの幅 (バイト単位) です。 左上隅にサーフェスの原点がある場合、ストライドは常に正です。
- 配置。 サーフェスの配置は、グラフィックス ディスプレイ ドライバーの裁量によって決定されます。 サーフェスは常に DWORD で配置する必要があります。つまり、サーフェス内の個々の行は、32 ビット (DWORD) 境界で発生することが保証されます。 ただし、ハードウェアのニーズに応じて、アラインメントは 32 ビットを超える場合があります。
- パック形式と平面形式。 YUV 形式は、 パック 形式と 平面 形式に分割されます。 パック形式では、Y、U、V の各コンポーネントが 1 つの配列に格納されます。 ピクセルはマクロピクセルのグループに編成され、レイアウトは形式によって異なります。 平面形式では、Y、U、および V コンポーネントは 3 つの別々の平面として格納されます。
この記事で説明する YUV 形式にはそれぞれ、FOURCC コードが割り当てられます。 FOURCC コードは、4 つの ASCII 文字を連結して作成される 32 ビット符号なし整数です。
- 4:4:4 (32 bpp)
- 4:2:2 (16 bpp)
- 4:2:0 (16 bpp)
- 4:2:0 (12 bpp)
4:4:4 形式、ピクセルあたり 32 ビット
AYUV
FOURCC コード AYUV を使用して、単一の 4:4:4 形式を使用することをお勧めします。 これはパック形式です。各ピクセルは 4 つの連続したバイトとしてエンコードされ、次の図に示すシーケンスに配置されます。
A とマークされたバイトにはアルファの値が含まれます。
4:2:2 形式、ピクセルあたり 16 ビット
次の FOURCC コードを使用して、2 つの 4:2:2 形式をお勧めします。
- YUY2
- UYVY
どちらもパック形式であり、各マクロピクセルは 4 つの連続したバイトとしてエンコードされた 2 ピクセルです。 これにより、クロマの水平方向のダウンサンプリングが 2 倍になります。
YUY2
YUY2 形式では、データは符号なし char 値の配列として扱うことができます。最初のバイトには最初の Y サンプルが含まれており、2 番目のバイトには最初の U (Cb) サンプルが含まれており、3 番目のバイトには 2 番目の Y サンプルが含まれており、4 番目のバイトには最初の V (Cr) サンプルが含まれています。次の図に示すように。
画像がリトル エンディアン WORD 値の配列としてアドレス指定されている場合、最初の WORD には、最上位ビット (LSB) の最初の Y サンプルと、最上位ビット (MSB) の最初の U (Cb) サンプルが含まれます。 2 番目の WORD には、LSB の 2 番目の Y サンプルと、MSB の最初の V (Cr) サンプルが含まれています。
YUY2 は、Microsoft DirectX ビデオ アクセラレーション (DirectX VA) に推奨される 4:2:2 ピクセル形式です。 これは、4:2:2 ビデオをサポートする DirectX VA アクセラレータの中間的な要件であると予想されます。
UYVY
この形式は YUY2 形式と同じですが、バイトオーダーが逆になっている点、つまり、彩度とルマバイトが反転されます (図 4)。 イメージが 2 つのリトル エンディアン WORD 値の配列としてアドレス指定されている場合、最初の WORD には LSB に U、MSB に Y0 が、2 番目の WORD には LSB に V、MSB に Y1 が含まれます。
4:2:0 形式、ピクセルあたり 16 ビット
次の FOURCC コードを使用して、4:2:0 16 ビット/ピクセル (bpp) 形式を 2 つ使用することをお勧めします。
- IMC1
- IMC3
これらの YUV 形式はどちらも平面形式です。 彩度チャンネルは、水平寸法と垂直寸法の両方で2の係数によってサブサンプリングされます。
IMC1
すべての Y サンプルは、最初にメモリ内で符号なし char 値の配列として表示されます。 その後、すべての V (Cr) サンプル、およびすべての U (Cb) サンプルが続きます。 V 平面と U 平面は Y 平面と同じストライドを持ち、図 5 に示すようにメモリ領域が未使用になります。 You プレーンと V プレーンは、16 行の倍数であるメモリ境界で開始する必要があります。 図 5 は、352 x 240 ビデオ フレームのあなたと V の原点を示しています。 You 平面と V 平面の開始アドレスは、次のように計算されます。
BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);
ここで、pY は、次の図に示すように、メモリ配列の先頭へのバイト ポインターです。
IMC3
この形式は IMC1 と同じですが、次の図に示すように、YOU プレーンと V プレーンはスワップされます。
4:2:0 形式、ピクセルあたり 12 ビット
次の FOURCC コードを使用して、4 つの 4:2:0 12-bpp 形式をお勧めします。
- IMC2
- IMC4
- YV12
- NV12
いずれの形式でも、彩度チャネルは水平寸法と垂直寸法の両方で 2 の係数でサブサンプリングされます。
IMC2
この形式は IMC1 と同じですが、次の違いを除きます。V (Cr) と U (Cb) の行は、ハーフストライド境界でインターリーブされます。 つまり、彩度領域の各フルストライドラインはVサンプルのラインから始まり、次のハーフストライド境界から始まるUサンプルのラインが続きます(図7)。 このレイアウトでは、IMC1 よりもアドレス空間を効率的に使用できます。 これは、彩度アドレス空間を半分にカットし、合計アドレス空間を25%削減します。 4:2:0 形式の中で、IMC2 は NV12 の後で 2 番目に優先される形式です。 次の図は、このプロセスを示しています。
IMC4
この形式は IMC2 と同じですが、次の図に示すように、U (Cb) 行と V (Cr) 行が入れ替わる点が除きます。
YV12
すべての Y サンプルは、最初にメモリ内で符号なし char 値の配列として表示されます。 この配列の直後に、すべての V (Cr) サンプルが続きます。 V平面のストライドはY平面の半分のストライドです。V 平面には、Y 平面の半分の数の線が含まれています。 次の図に示すように、V プレーンの直後に、V プレーンと同じストライドとライン数を持つすべての U (Cb) サンプルが続きます。
NV12
すべての Y サンプルは、偶数行の符号なし char 値の配列としてメモリ内で最初に表示されます。 Y 平面の直後に、パックされた U (Cb) サンプルと V (Cr) サンプルを含む符号なし char 値の配列が続きます。 結合された U-V 配列がリトル エンディアン WORD 値の配列としてアドレス指定されている場合、LSB には U 値が含まれており、MSB には V 値が含まれます。 NV12 は、DirectX VA に推奨される 4:2:0 ピクセル形式です。 これは、4:2:0 ビデオをサポートする DirectX VA アクセラレータの中間的な要件であると予想されます。 次の図は、Y 平面と、パックされた you サンプルと V サンプルを含む配列を示しています。
色空間と彩度サンプリングレートの変換
このセクションでは、YUV と RGB の間の変換と、いくつかの異なる YUV 形式間の変換に関するガイドラインを示します。 このセクションでは、 8 ビット コンピューター RGB (sRGB または "フルスケール" RGB とも呼ばれます) と スタジオ ビデオ RGB、または "ヘッドルームとトゥ ルームを含む RGB" という 2 つの RGB エンコード スキームを検討します。これらは次のように定義されます。
- コンピューター RGB では、赤、緑、青のサンプルごとに 8 ビットが使用されます。 黒は R = G = B = 0 で表され、白は R = G = B = 255 で表されます。
- Studio ビデオ RGB では、赤、緑、青のサンプルごとにビット数 N が使用されます。N は 8 以上です。 Studio ビデオ RGB は、コンピューター RGB とは異なる倍率を使用し、オフセットを持っています。 黒は R = G = B = 16*2^(N-8) で表され、白は R = G = B = 235*2^(N-8) で表されます。 ただし、実際の値がこの範囲外になる可能性があります。
Studio ビデオ RGB は Windows のビデオに推奨される RGB 定義ですが、コンピューター RGB はビデオ以外のアプリケーションに推奨される RGB 定義です。 RGB のどちらの形式でも、色度座標は、RGB カラー プライマリの定義に対して ITU-R BT.709 で指定されています。 R、G、B の (x,y) 座標はそれぞれ (0.64、0.33)、(0.30、0.60)、および (0.15、0.06) です。 参照白は座標 (0.3127、0.3290) を持つ D65 です。 名目ガンマは 1/0.45 (約 2.2) で、正確なガンマは ITU-R BT.709 で詳細に定義されています。
RGB と 4:4:4 YUV の間の変換
まず、RGB と 4:4:4 YUV の間の変換について説明します。 4:2:0 または 4:2:2 YUV を RGB に変換するには、YUV データを 4:4:4 YUV に変換してから、4:4:4 YUV から RGB に変換することをお勧めします。 4:4:4 形式の AYUV 形式では、Y、U、V のサンプルにそれぞれ 8 ビットが使用されます。 一部のアプリケーションでは、サンプルあたり 8 ビットを超えるビットを使用して YUV を定義することもできます。
RGB からの 2 つの主要な YUV 変換は、デジタル ビデオ用に定義されています。 どちらも ITU-R Recommendation BT.709 と呼ばれる仕様に基づいています。 最初の変換は、BT.709 で 50 Hz を使用するために定義された古い YUV 形式です。 これは、以前の名前 CCIR 601 でも知られている ITU-R Recommendation BT.601 で指定された関係と同じです。 これは、標準定義テレビ解像度 (720 x 576) と低解像度のビデオに推奨される YUV 形式と見なす必要があります。 これは、2 つの定数 Kr と Kb の値によって特徴付 けます。
Kr = 0.299
Kb = 0.114
2 番目の変換は、BT.709 で 60 Hz を使用するために定義された新しい YUV 形式であり、SDTV より上のビデオ解像度の推奨形式と見なす必要があります。 これは、これら 2 つの定数に対して異なる値によって特徴付けされます。
Kr = 0.2126
Kb = 0.0722
RGB から YUV への変換は、次から始めて定義されます。
L = Kr * R + Kb * B + (1 - Kr - Kb) * G
次に、YUV 値を次のように取得します。
Y = floor(2^(M-8) * (219*(L-Z)/S + 16) + 0.5)
U = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))
V = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))
where
- M は YUV サンプルあたりのビット数です (M >= 8)。
- Z は黒レベル変数です。 コンピューター RGB の場合、Z は 0 になります。 スタジオ ビデオ RGB の場合、Z は 16*2^(N-8) と等しくなります。N は RGB サンプルあたりのビット数 (N >= 8) です。
- S はスケーリング変数です。 コンピューター RGB の場合、S は 255 です。 スタジオ ビデオ RGB の場合、S は 219*2^(N-8) と等しくなります。
関数 floor(x) は、x 以下の最大の整数を返します。 関数 clip3(x, y, z) は次のように定義されます。
clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))
注意
clip3 はプリプロセッサ マクロではなく関数として実装する必要があります。それ以外の場合は、引数の複数の評価が行われます。
Y サンプルは明るさを表し、You サンプルと V サンプルはそれぞれ青と赤に向かって色の偏差を表します。 Y の公称範囲は 16*2^(M-8) ~ 235*2^(M-8) です。 黒は 16*2^(M-8) として表され、白は 235*2^(M-8) として表されます。 あなたと V の名目の範囲は 16*2^(M-8) ~ 240*2^(M-8) で、値 128*2^(M-8) は中性彩度を表します。 ただし、実際の値は、これらの範囲外になる可能性があります。
スタジオ ビデオ RGB 形式の入力データの場合、U と V の値を 0 ~ (2^M)-1 の範囲内に保つために、クリップ操作が必要です。 入力がコンピューター RGB の場合、変換式はこの範囲外の値を生成できないため、クリップ操作は必要ありません。
これらは近似のない正確な数式です。 このドキュメントに記載されている内容はすべて、これらの数式から派生しています。 このセクションでは、次の変換について説明します。
- RGB888 を YUV 4:4:4 に変換する
- 8 ビット YUV から RGB888 への変換
- 4:2:0 YUV から 4:2:2 YUV への変換
- 4:2:2 YUV から 4:4:4 YUV への変換
- 4:2:0 YUV から 4:4:4 YUV への変換
RGB888 を YUV 4:4:4 に変換する
コンピューターの RGB 入力と 8 ビット BT.601 YUV 出力の場合、前のセクションで指定した数式は、次のように合理的に近似できると考えています。
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
これらの数式では、8 ビット以下の (符号なし) 精度を必要とする係数を使用して 8 ビットの結果が生成されます。 中間結果には、最大 16 ビットの精度が必要です。
8 ビット YUV から RGB888 への変換
元の RGB から YUV の数式から、BT.601 の次のリレーションシップを派生させることができます。
Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) + 16
U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128
したがって、次のように指定します。
C = Y - 16
D = U - 128
E = V - 128
YUV を RGB に変換する数式は、次のように派生できます。
R = clip( round( 1.164383 * C + 1.596027 * E ) )
G = clip( round( 1.164383 * C - (0.391762 * D) - (0.812968 * E) ) )
B = clip( round( 1.164383 * C + 2.017232 * D ) )
where clip()
は [0...255] の範囲へのクリッピングを示します。 これらの数式は、次のように合理的に近似できると考えています。
R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)
これらの数式では、各 8 ビットの結果を生成するために 8 ビットを超える精度を必要とするいくつかの係数が使用され、中間結果には 16 ビットを超える精度が必要になります。
4:2:0 または 4:2:2 YUV を RGB に変換するには、YUV データを 4:4:4 YUV に変換してから、4:4:4 YUV から RGB に変換することをお勧めします。 以降のセクションでは、4:2:0 と 4:2:2 形式を 4:4:4 に変換するためのいくつかの方法を示します。
4:2:0 YUV から 4:2:2 YUV への変換
4:2:0 YUV から 4:2:2 YUV に変換するには、2 倍の垂直アップコンバージョンが必要です。 このセクションでは、アップコンバージョンを実行するためのメソッドの例について説明します。 メソッドは、ビデオ画像がプログレッシブ スキャンであることを前提としています。
注意
4:2:0 から 4:2:2 のインターレース スキャン変換プロセスでは、非定型の問題が発生し、実装が困難です。 この記事では、インターレース スキャンを 4:2:0 から 4:2:2 に変換する問題については説明しません。
入力クロマ サンプルの各垂直線を、0 から N - 1 の範囲の配列 Cin[]
にします。 出力イメージの対応する垂直線は、0 ~ 2N - 1 の範囲の配列 Cout[]
になります。 各垂直線を変換するには、次のプロセスを実行します。
Cout[0] = Cin[0];
Cout[1] = clip((9 * (Cin[0] + Cin[1]) - (Cin[0] + Cin[2]) + 8) >> 4);
Cout[2] = Cin[1];
Cout[3] = clip((9 * (Cin[1] + Cin[2]) - (Cin[0] + Cin[3]) + 8) >> 4);
Cout[4] = Cin[2]
Cout[5] = clip((9 * (Cin[2] + Cin[3]) - (Cin[1] + Cin[4]) + 8) >> 4);
...
Cout[2*i] = Cin[i]
Cout[2*i+1] = clip((9 * (Cin[i] + Cin[i+1]) - (Cin[i-1] + Cin[i+2]) + 8) >> 4);
...
Cout[2*N-3] = clip((9 * (Cin[N-2] + Cin[N-1]) - (Cin[N-3] + Cin[N-1]) + 8) >> 4);
Cout[2*N-2] = Cin[N-1];
Cout[2*N-1] = clip((9 * (Cin[N-1] + Cin[N-1]) - (Cin[N-2] + Cin[N-1]) + 8) >> 4);
ここで、clip() は [0...255] の範囲へのクリッピングを示します。
注意
エッジを処理するための数式は、数学的に簡略化できます。 画像の端でのクランプ効果を示すために、この形式で示します。
実際、このメソッドは、隣接する 4 つのピクセルに対して曲線を補間し、2 つの最も近いピクセルの値に向かって重み付けして、各欠損値を計算します (図 11)。 この例で使用する特定の補間方法は、3 次畳み込み補間とも呼ばれる、Catmull-Rom補間と呼ばれる既知の方法を使用して、半整数位置で欠落サンプルを生成します。
信号処理の観点から、垂直アップコンバージョンには、4:2:0 のサンプリング ラインの位置と他の 4:2:2 サンプル ラインの位置との間の半ピクセルの垂直オフセット (出力 4:2:2 サンプリング グリッドに対する相対位置) を考慮する位相シフト補正を含めるのが理想的です。 ただし、このオフセットを導入すると、サンプルの生成に必要な処理量が増加し、アップサンプリングされた 4:2:2 画像から元の 4:2:0 サンプルを再構築できなくなります。 また、ビデオを 4:2:2 サーフェスに直接デコードし、それらのサーフェスをストリーム内の後続の画像をデコードするための参照画像として使用することもできなくなります。 したがって、ここで提供される方法では、サンプルの正確な垂直方向の配置は考慮されません。 そうすることは、おそらく合理的に高い画像解像度で視覚的に有害ではありません。
H.261、H.263、または MPEG-1 ビデオで定義されているサンプリング グリッドを使用する 4:2:0 ビデオで開始した場合、出力 4:2:2 のクロマ サンプルの位相も、luma サンプリング グリッドの間隔 (4:2:2 の彩度サンプリング グリッドの間隔に対する 4 ピクセルオフセット) に対して 5 ピクセルの水平オフセットでシフトされます。 ただし、4:2:0 ビデオの MPEG-2 形式は、おそらく PC でより一般的に使用され、この問題に苦しんでいません。 さらに、この区別は、合理的に高い画像解像度では視覚的に害を受けないでしょう。 この問題を修正しようとすると、垂直位相オフセットについて説明したのと同じ種類の問題が発生します。
4:2:2 YUV から 4:4:4 YUV への変換
4:2:2 YUV から 4:4:4 YUV に変換するには、2 倍の水平方向のアップコンバージョンが必要です。 垂直アップコンバージョンについて前述した方法は、水平アップコンバージョンにも適用できます。 MPEG-2 および ITU-R BT.601 ビデオの場合、このメソッドは正しい位相アラインメントを持つサンプルを生成します。
4:2:0 YUV から 4:4:4 YUV への変換
4:2:0 YUV を 4:4:4 YUV に変換するには、前に説明した 2 つの方法に従うだけです。 4:2:0 イメージを 4:2:2 に変換し、4:2:2 イメージを 4:4:4 に変換します。 また、2 つのアップコンバージョン プロセスの順序を切り替えることもできます。操作の順序は、結果の視覚的品質にとって重要ではありません。
その他の YUV 形式
その他の一般的でない YUV 形式には、次のようなものがあります。
- AI44 は、サンプルあたり 8 ビットの淡色化された YUV 形式です。 各サンプルには、4 つの最上位ビット (MSP) のインデックスと、4 つの最下位ビット (LSB) のアルファ値が含まれています。 インデックスは YUV パレット エントリの配列を参照します。これは、形式のメディアタイプで定義する必要があります。 この形式は、主にサブ画像に使用されます。
- NV11 は、ピクセルあたり 12 ビットの 4:1:1 平面形式です。 Y サンプルはメモリ内で最初に表示されます。 Y 平面の後に、パックされた U (Cb) サンプルと V (Cr) サンプルの配列が続きます。 結合された U-V 配列がリトル エンディアン WORD 値の配列としてアドレス指定されると、U サンプルは各 WORD の LSB に含まれており、V サンプルは MSB に含まれます。 (このメモリ レイアウトは NV12 に似ていますが、クロマ サンプリングは異なります)。
- Y41P は 4:1:1 パック形式で、あなたと V は水平方向に 4 ピクセルごとにサンプリングされます。 各マクロピクセルには 3 バイトで 8 ピクセルが含まれています。バイト レイアウトは次のとおりです。
U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
- Y41T は Y41P と同じですが、各 Y サンプルの最下位ビットはクロマ キー (0 = 透明、1 = 不透明) を指定します。
- Y42T は UYVY と同じですが、各 Y サンプルの最下位ビットはクロマ キー (0 = 透明、1 = 不透明) を指定します。
- YVYU は、YOU サンプルと V サンプルがスワップされる点を除き、YUYV と同等です。
Media Foundation での YUV 形式の識別
この記事で説明する YUV 形式にはそれぞれ、FOURCC コードが割り当てられます。 FOURCC コードは、4 つの ASCII 文字を連結して作成される 32 ビット符号なし整数です。
ソース コードで FOURCC 値を簡単に宣言できるようにするさまざまな C/C++ マクロがあります。 たとえば、 MAKEFOURCC マクロは Mmsystem.h で宣言され、 FCC マクロは Aviriff.h で宣言されます。 次のように使用します。
DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2');
DWORD fccYUY2 = FCC('YUY2');
また、文字の順序を逆にするだけで、FOURCC コードを文字列リテラルとして直接宣言することもできます。 次に例を示します。
DWORD fccYUY2 = '2YUY'; // Declares the FOURCC 'YUY2'
Windows オペレーティング システムはリトル エンディアン アーキテクチャを使用するため、順序を逆にすることが必要です。 'Y' = 0x59、'U' = 0x55、および '2' = 0x32であるため、'2YUY' は0x32595559。
Media Foundation では、形式はメジャー型 GUID とサブタイプ GUID によって識別されます。 コンピューター のビデオ形式の主な種類は、常に MFMediaType_Videoです。 サブタイプは、次のように FOURCC コードを GUID にマッピングすることによって構築できます。
XXXXXXXX-0000-0010-8000-00AA00389B71
は XXXXXXXX
FOURCC コードです。 したがって、YUY2 のサブタイプ GUID は次のとおりです。
32595559-0000-0010-8000-00AA00389B71
最も一般的な YUV 形式 GUID の定数は、ヘッダー ファイル mfapi.h で定義されます。 これらの定数の一覧については、「 ビデオ サブタイプ GUID」を参照してください。
関連トピック