YUV→RGB変換
Media FoundationのdecoderがYUV(Y'CbCr)系で出力する非圧縮フレームを、画像処理や保存で使うRGB系の画素列へ変換する処理。
YUVからRGBへの変換
NV12ピクセル形式
輝度(Y)プレーンと、間引かれた色差(UV)プレーンを持つ4:2:0のYUV系ピクセル形式。幅・高さが偶数である必要がある。
YUY2ピクセル形式
横方向に2画素でU/Vを共有する、packedな4:2:2のYUV系ピクセル形式。幅が偶数である必要がある。
クロマサブサンプリング(4:4:4/4:2:2/4:2:0)
人間の目が色の細かさより明るさの細かさに敏感であることを利用して、色差成分U/Vを輝度Yより粗く保持する標本化方式。4:4:4/4:2:2/4:2:0で間引き方が異なる。
色差の間引き
MF_MT_YUV_MATRIX属性
メディアタイプが持つ、YUVからRGBへの変換にBT.601とBT.709のどちらの係数を使うかを示す属性。
MF_MT_VIDEO_NOMINAL_RANGE属性
メディアタイプが持つ、YとU/Vが16..235/16..240のlimited rangeか、0..255のfull rangeかを示す属性。
Y'CbCr
輝度成分Yと色差成分Cb/Crで色を表すデジタルvideoの色空間で、Windowsの動画API群が広く使う「YUV」という呼び名は実質的にこれを指す。
IMFSourceReader(Source Reader)
Media Foundationが提供する、メディアファイルからサンプルを同期的または非同期的に読み出すための入口となるインターフェイス。
MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING
Source Readerに設定すると、内部のsoftware処理でYUV系フレームをRGB32へ自動変換させられる属性。リアルタイム再生向けには最適化されていない。
Source Readerの自動video processing
MFVideoFormat_RGB32
Media Foundationの32bit RGBピクセル形式。byte0-2がB,G,Rで、byte3はalphaとは限らずARGB32ではない。
Video Processor MFT
色空間変換・サイズ変更・インターレース解除・フレームレート変換をまとめて扱えるMedia FoundationのTransform。
stride(画像の行送りバイト数)
画像バッファで1行分が占めるバイト数。幅×1画素のバイト数と一致するとは限らず、行末にpaddingが入ることがある。
2Dの画像バッファをロックし、scan line 0の先頭ポインタと実際のstrideを取得するMedia FoundationのAPI。
IMFMediaType
IMFAttributesを継承し、major type・subtype・フレームサイズ・色情報などメディア形式の情報を属性として保持するMedia FoundationのCOMインターフェース。
メディアタイプ
IMFAttributes
GUIDをキーにしたkey/valueストアを表すMedia FoundationのCOMインターフェースで、設定値やメディア形式の情報を保持する。
BT.601
SDTV(標準画質)以下のvideoで使われる、YUVからRGBへの変換係数セット。
BT.709
SDを超える解像度のvideoで優先して使われる、YUVからRGBへの変換係数セット。
Media Foundation
Windowsが提供する、メディアの再生・変換・エンコード/デコードを行うためのCOMベースのフレームワーク。
YUVからRGBへの変換は、まずサブサンプリングで間引かれたU/Vを各pixelへ割り当て直す(chroma upsampling)必要がある
自前変換(NV12/YUY2を自分でBGRAへ変換する経路)では、変換で使う係数(BT.601かBT.709か)はMF_MT_YUV_MATRIX属性で構成される
自前変換(NV12/YUY2を自分でBGRAへ変換する経路)では、変換の前段で戻すべきrange(16..235など)はMF_MT_VIDEO_NOMINAL_RANGE属性で構成される
NV12は4:2:0で、2x2ブロックの4画素が1組のU/Vを共有する
YUY2は4:2:2で、横方向に2画素が1組のU/Vを共有する
NV12のYとUVプレーンが表すのはY'CbCrの標本である
YUY2のY/U/Vが表すのはY'CbCrの標本である
MF_SOURCE_READER_ENABLE_VIDEO_PROCESSINGを明示的に設定した場合、Source Readerの内部でYUV->RGB32のvideo processingが有効になる
MF_SOURCE_READER_ENABLE_VIDEO_PROCESSINGは限定的なYUV->RGB32のvideo processingの実装を担うが、software処理でありplayback向けには最適化されていない
video processingを有効にしてSetCurrentMediaTypeでMFVideoFormat_RGB32を要求すると、自動変換の出力形式になる
リアルタイム再生やD3Dベースのrendering、大量frame処理では、Source Readerの自動変換よりVideo Processor MFTでの変換が選択肢になる
pixelの行を読み進めるには、width×bytesPerPixelではなく実際のbufferのstrideを使う必要がある
IMF2DBuffer::Lock2Dが使えるbufferでは、実際のstride(actual pitch)はLock2Dが返す値で確認できる(使えないbufferではIMFMediaBuffer::Lockと既定strideの計算にフォールバックする)
buffer取得ではIMF2DBuffer::Lock2Dが使えるならそれを優先して使うことが推奨される
Source Readerに要求したいsubtype(NV12/YUY2/RGB32など)はIMFMediaTypeで組み立ててSetCurrentMediaTypeへ渡す
IMFMediaTypeはIMFAttributesを継承した属性ストアで、MF_MT_YUV_MATRIXやMF_MT_VIDEO_NOMINAL_RANGEなどの色情報を保持する
IMFMediaTypeにMF_MT_DEFAULT_STRIDE属性が設定されている場合、既定のstrideはその値で構成される(未設定なら別途計算が必要で、これは最小stride値であり実際のbufferのstrideとは限らない)
NV12のUV plane先頭はwidth×heightではなくstride×heightで決まるため、strideを正しく扱わないとplane境界がずれる
MF_MT_YUV_MATRIXが取り得る値の1つがBT.601で、SDTV以下のvideoで使われる
MF_MT_YUV_MATRIXが取り得る値の1つがBT.709で、SDを超えるvideoで優先される
ファイルから直接フレームを取り出す用途(本記事の経路)では、Media FoundationはメディアファイルからYUVフレームを取り出す入口としてSource Readerを提供する
自前変換では、NV12を受け取ってBGRA32へ変換する経路を扱う
自前変換では、YUY2を受け取ってBGRA32へ変換する経路も扱う