YUY2のリンクされたエントリと、YV12 に関するウィキペディアの記事は、これを明確に示しているようです。
YUY2 は、2 つの隣接する水平ピクセルごとに 4 バイトとして格納します[Y1, U, Y2, V]
。
YV12 は、M × NM*N + 2 * (M/2 * N/2)
フレーム全体を連続したバイト配列に格納します。array と呼びましょうbyte frame[M * N * 3 / 2]
。我々は持っています:
frame[i]
i
in[0, M * N)
はピクセルのY値です。
frame[j]
for j
in[M * N, M * N * 5/4)
は、各 2 × 2 ピクセル タイルのV値です。
frame[j]
k
inは[M * N * 5/4, M * N * 6/4)
、各 2 × 2 ピクセル タイルのU値です。
したがって、YUY2 から YV12 に変換する場合、隣接する 2 つの行の平均を取ることで、UおよびVデータの量を半分にする必要があります。
例:
byte YUY2Source[M * N * 2] = /* source frame */;
byte YV12Dest[M * N * 3/2];
for (unsigned int i = 0; i != M * N; ++i)
{
YV12Dest[i] = YUY2Source[2 * i];
}
for (unsigned int j = 0; j != M * N / 4; ++j)
{
YV12Dest[M * N + j] = ( YUY2Source[N*(j / N/2 ) + 4 * j + 3]
+ YUY2Source[N*(j / N/2 + 1) + 4 * j + 3] ) / 2;
YV12Dest[M * N * 5/4 + j] = ( YUY2Source[N*(j / N/2 ) + 4 * j + 1]
+ YUY2Source[N*(j / N/2 + 1) + 4 * j + 1] ) / 2;
}