web-dev-qa-db-ja.com

メモリ内の画像フォーマットNV12ストレージ

問題のNV12フォーマットのサイズについて完全に理解しています

NV12フォーマットとUVプレーン

現在、この形式でのUVプレーンの保存について2つのソースから読んでいます。1つは https://msdn.Microsoft.com/en-us/library/windows/desktop/dd206750(v = vs.85) ).aspx

NV12

すべてのYサンプルは、偶数行のunsignedchar値の配列としてメモリに最初に表示されます。 Y平面の直後には、パックされたU(Cb)およびV(Cr)サンプルを含むunsignedchar値の配列が続きます。結合されたU-V配列がリトルエンディアンのワード値の配列としてアドレス指定される場合、LSBにはU値が含まれ、MSBにはV値が含まれます。 NV12は、DirectX VAに推奨される4:2:0ピクセル形式です。 DirectX VAアクセラレータは4:2:0ビデオをサポートするため、中期的な要件になると予想されます。次の図は、YプレーンとパックされたUおよびVサンプルを含むアレイを示しています。

私が理解しているのは、UV平面では、各UとVが1バイトに格納されていることです。

これについてウィキペディアから読んだとき: https://wiki.videolan.org/YUV#NV12

それは言う:

NV12

I420に関連して、NV12には1つの輝度「輝度」平面Yと、U値とV値がインターリーブされた1つの平面があります。 NV12では、クロマ平面(青と赤)が水平方向と垂直方向の両方で2倍にサブサンプリングされます。2x2のピクセルグループの場合、4つのYサンプルと1つのUおよび1Vのサンプルがあります。 NV12を、UプレーンとVプレーンがインターリーブされたI420と考えると便利です。これがNV12のグラフィック表現です。各文字は1ビットを表します:1 NV12ピクセルの場合:YYYYYYYY UVUV 2ピクセルNV12フレームの場合:YYYYYYYYYYYYYYYY UVUVUVUV 50ピクセルNV12フレームの場合:Y * 8 * 50(UV)* 2 * 50nピクセルNV12フレームの場合:Y * 8 * n(UV)* 2 * n

ここで私が理解しているのは:各UとVは各バイトでビットごとにインターリーブされています。したがって、UVプレーンの各バイトには4Uビットと4Vビットがインターリーブされます。

誰かが私の疑問を明確にすることができますか?

11
Manish Kumar

TL; DR:MSDNは正しい

これを検証する(または少なくともビットレベルでインターリーブがないことを検証する)には、広く使用されているビデオツールであるffmpegを使用できます。私は次の実験をしました:

  1. テキストを含むファイルを作成します(Lorem Ipsumテキストの例を取り上げました)
  2. ffmpegに、小さなサイズのI420ビデオフレームとして読み取るように指示します
  3. ffmpegNV12形式に変換するように指示します
  4. 印刷する

(2)と(3)のコマンドラインの例を次に示します。

ffmpeg -s 96x4 -i example_i420.yuv -pix_fmt nv12 example_nv12.yuv

これが私が出力で得たものです:

Lorem ipsum dolor sit amet、consectetur adipiscing elit、sed do eiusmod tempor incididunt ut Labore et dolore magnaaliqua。 Ut enim ad minim veniam、quis nostrud exercitation ullamco labis nisi ut aliquip ex ea commodoconsequat。 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nullapariatur。 Excepteur sint occaecat cupidatat non proident、sutnett uirn acduilppias cqiunig oeflfiitc、i as edde sdeor uenitu smmooldl itte mapnoirm iindc iedsitd ulnatb ourtu ml.a bLoorree me。 cUotn sawci

彩度(UおよびV)サンプルを太字でマークしました。これらがスクランブルされた順序で同じ値(ASCII文字)であることは明らかです。ビットインターリーブが実行された場合、異なる値を取得します。

したがって、VLC wiki(BTW it'snotWikipedia)の説明は正しくありません。 「Edwardw」という名前の誰かが、ピクセルに言及する「イラスト」を追加しました ここ 、後でそれを「ビット」に変更しました ここ 。誤解を招かないように誰かが変更してくれることを願っています(wikiは登録が必要なので編集できません)。

18
anatolyg