4

これは私が思っているよりもはるかに簡単であるとほぼ確信していますが、フリッグが2つのフォーマットを変換する方法を理解しようとすることを認めるよりもはるかに長い間インターネットを精査してきました. 符号なしバイト (unsigned char) のストリームから Y0、Cb、Y1、Cr データを抽出できますが、これらのバイトがYV12でどのように配置されているかわかりません。このドキュメントは、さまざまな値が実際に含まれていることを意味していますか?異なる行?

私は文字通り、「C++ で YUY2 を YV12 に変換する」のようなものを 1 日中探していましたが、チュートリアルやコード サンプルはまったく見つかりませんでした。これには、私が使用できる何らかの形式のドキュメントがあると思いますが、この特定の主題に関する情報は不足しているようです.

4

2 に答える 2

4

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]iin[0, M * N)はピクセルのY値です。
    • frame[j]for jin[M * N, M * N * 5/4)は、各 2 × 2 ピクセル タイルのV値です。
    • frame[j]kinは[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;
}
于 2012-09-12T21:24:04.470 に答える
3
  1. Y、U、およびVの値を別々の配列に分割します。
  2. U配列とV配列の偶数行と奇数行の値を平均して、2つの行を1つに結合します。これにより、これらのアレイの高さが半分になります。Y配列はにw * hなり、U配列とV配列はになりますw/2 * h/2
  3. Y、V、およびU配列を連結します。
于 2012-09-12T21:24:09.703 に答える