MediaSink で DXVA を使うには。
Windows-classic-samples/Samples/DX11VideoRenderer at main · microsoft/Windows-classic-samples
This repo contains samples that demonstrate the API used in Windows classic desktop applications. - microsoft/Windows-classic-samples
https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/DX11VideoRenderer
解読の後半。
DXVA が何かということについてはぼんやりとしているのだけれど、VideoSample のバッファーに D3D のテクスチャを使うということぽい。
DirectX Surface Buffer
ということは Pipeline のどこかのタイミングで CPU 上の bitmap を CreateTexture して GPU に移動するのだけど、Decoder なり Renderer なりのなるべく上流で GPU に上げた方がうれしいという話。
ID3D11Device を MediaSession に供給する
Pipeline でテクスチャをやりとりするのだからデバイスを共有しましょうと。MediaSession の場合は、レンダラがデバイスを作成して IMFDXGIDeviceManager を公開する。
公開するのは IMFGetService を通してぽい。
この辺。
実験
まだ IMFGetService を実装していない VideoRenderer で、
ProcessSample に入ってくる IMFSample から IMFDXGIBuffer が取得できるか試してみよう。
実験2
StreamSink に IMFGetService を実装した。
IMFSample から ID3D11Texture2D を取得できた。
上流が、DXVA 化されて Sample のバッファがテクスチャになった。
どんなテクスチャなのか
ArraySize = 13
Format = DXGI_FORMAT_NV12
中身がよくわからぬ。
Decode された yuv フレームを Swapchain にコピーする
deinterlace
YUV To RGB
サイズ調整
等をしてデコード済みのフレームを RGB 画像にする工程。
2種類の実装がある。
Windows-classic-samples/Samples/DX11VideoRenderer/cpp/Presenter.cpp at main · microsoft/Windows-classic-samples
This repo contains samples that demonstrate the API used in Windows classic desktop applications. - microsoft/Windows-classic-samples
https://github.com/Microsoft/Windows-classic-samples/blob/master/Samples/DX11VideoRenderer/cpp/Presenter.cpp
の以下の部分。
どちらでもだいたい同じ動きになると思う。
ProcessFrameUsingXVP
Video Processor MFT
初期化時に IDXGIDeviceManager を直接渡して DXVA を有効にしている。
Texture の入ったサンプルを処理して、Texture の入ったサンプルに出力できる。
ProcessFrameUsingD3D11
D3D11VideoDevice を使う。
こっちの方が手順が長くて大変。
おそらく、VideoProcessorMFT は D3D11VideoDevice を使って実装していてこちらの方がローレベルなのであろう。
Decode
API の説明としてはこれ。
Supporting Direct3D 11 Video Decoding in Media Foundation
DX11VideoRenderer サンプルでは、直接使っていない。
Video Processing
DX11VideoRenderer サンプルでは、D3D11VideoDevice を最後の色変換等で使っている。
DXVA Video Processing
Video Process Blit
DXVA2.0+D3D9 のドキュメントぽい。
D3D11 ではこの関数。
D3D11VideoContext::VideoProcessorBlt