10

最新のグラフィックカードには、AMD Avivo、NVIDIA PureVideo、IntelClearVideoなどのハードウェアビデオスケーラーが搭載されています。たとえば、AMDのAvivoホワイトペーパーには次のように書かれています。

「画像出力スケーラーは、最大6つの垂直フィルタータップと最大10の水平フィルタータップをサポートします。これらのスケーラーは、高度にプログラム可能な高精度の多相スケーラーです。実質的に任意の比率でのアップスケーリング、または最大4つのダウンスケーリングに適しています。 :1。」

質問: Windowsプログラムからビデオスケーラーハードウェアをどのように使用できますか?

たとえば、にデコードされたビデオフレームがすでに存在IDirect3DSurface9し、ハードウェアスケーラーを使用してそのビデオフレームを画面に表示することが目標であると想定します。可能であればベンダー固有のAPIではなく、MediaFoundationやDirectShowなどのWindowsAPIを使用したいと思います。私は主に1.5〜3倍程度のかなり大きな係数でのアップスケーリングに興味があります。

二次的な質問は、ビデオスケーラーのハードウェアパラメータをどのように制御できるかということです。(例えば、上記の多相フィルターのフィルター係数)

編集:バウンティが始まりました。ビデオカードでビデオスケーラーハードウェアを使用する方法の例を提供してください(これはベンダー固有であるか、DirectX / DirectShow / Media Foundation APIの任意のバージョンを使用する場合があります)。

編集:更新:ビデオスケーラーハードウェアを使用するプログラムの例:WinDVD、PowerDVD、madVR。D3Dシェーダーやテクスチャサンプラーを使用して実装されたスケーラーではなく、GPUに組み込まれているビデオハードウェアスケーラーを使用する方法を知りたいです。

4

3 に答える 3

2

ハードウェアにアクセスするだけです-Direct2D(Direct3Dがおそらくより良い選択です)は問題ありません。ただし、ビデオスケーラーにアクセスするには、DirectShowまたはWindows Media Foundationを使用する必要があります(私はこれをあまり使用していません)。

AFAIK-「ResizerDMO」フィルターは正しいハードウェアにアクセスし、ビデオのサイズ変更を実行します。このフィルターを使用するコードサンプルを次に示します。

編集: MFTを使用している場合は、ビデオプロセッサフ​​ィルターも同様に効率的である必要があります。ドキュメントに示されているように、「ビデオプロセッサは、Microsoft Direct3D 11を使用して、GPUで高速化されたビデオ処理をサポートします。詳細については、MF_SA_D3D11_AWAREを参照してください。」

また、ハードウェアMFT属性、特にそのMFTがハードウェアに実装されているかどうかを確認できるMFT_ENUM_HARDWARE_URL_Attributeに関するこのセクションを参照してください。DXVAはMediaFoundationと統合され、その機能をMFTとして公開していることに注意してください。したがって、ハードウェアに実装されているMFTは、基盤となるハードウェアを使用している可能性が高く、Windows自体で使用されている方法です。

お役に立てれば!

于 2012-12-10T21:57:21.307 に答える
2

可能なアプローチのいくつかは次のとおりです。

  1. を使用MFCreateVideoRendererしてEVRメディアシンクを作成し、フラグを設定してIMFVideoDisplayControl :: SetRenderingPrefsを呼び出しMFVideoRenderPrefs_AllowScaling(または属性を使用IMFAttributesして設定)、 IMFVideoDisplayControl::SetVideoPositionを呼び出して結果のスケーリング方法を定義します。これは、Enhanced Video Renderer(EVR)の一部です。EVRConfig_AllowScaling

  2. IDirectXVideoProcessor :: VideoProcessBltを使用DXVA2_VideoProcessBltParams::ConstrictionSizeして、結果のスケーリング方法を定義するように設定します。これもEVR/DXVAに基づいています。

  3. (ananthonlineによって提案されました)Video Resizer DSPを使用し、IWMResizerProps::SetFullCropRegion(またはMFPKEY_RESIZE_DST_WIDTHおよびMFPKEY_RESIZE_DST_HEIGHT)を使用して結果をスケーリングします。これは、DirectX Media Object(DMO)とMedia Foundation Transform(MFT)の両方です。注:ビデオMFTには属性MF_SA_D3D_AWAREがあり、DirectX 3Dハードウェアアクセラレーションをサポートしているかどうかを照会できます。これは、MFT_MESSAGE_SET_D3D_MANAGERメッセージを送信することで有効にできます。

  4. ビデオプロセッサMFTを使用IMFVideoProcessorControl::SetConstrictionSizeし、結果をスケーリングするように設定します。これはMFTです。

  5. DirectX 3Dデバイスを使用し、呼び出しStretchRectてサーフェスをスケーリングします。注:これは明らかにビデオスケーラーハードウェアを使用せず、テクスチャサンプラーハードウェアを使用します。テクスチャは、同様の効果でクワッドにレンダリングできます。

これらのアプローチのどれがビデオスケーラーハードウェアを使用しているかはまだわかりません。EVR / DXVAに直接関連付けられているため、少なくとも1と2に近づく可能性があります。アプローチ3と4は、DXVAによって加速された場合にも発生する可能性があります。決定的な答えがまだ必要です。理想的には、ドキュメントやコードサンプルへの参照が必要です。

于 2012-12-14T20:16:40.720 に答える
0

Direct2Dは、間接的ではありますが、グラフィックスハードウェアにアクセスするためのMicrosoftの方法です。Direct2D変換はスケーリングを行います。ビデオスケーラーを直接制御することはできませんが、ドライバーを信頼して正しい設定を選択する必要があります。

于 2012-12-07T22:06:27.893 に答える