GPU を使用してビデオ ストリームを効率的にレンダリングおよび処理するにはどうすればよいですか?
質問
C++、Qt、OpenGL を使用してリアルタイムビデオ操作ツールを開発する予定です。フレーム処理にはシェーダーを使用する必要があるため、ビデオ オーバーレイはオプションではありません。現時点では、次のような一連の手順を想像しています。
- ビデオのデコード (CPU)
- 前処理します (オプション、CPU)
- それをビデオ メモリに転送します (DMA を使用する GPU)
- 頂点シェーダーとフラグメント シェーダー (GPU) を使用してさらに処理します。
- レンダリングする(GPU)
ここで使用できる拡張機能や技術について説明する一般的なアドバイスを探しています。代わりに Direct3D を使用する正当な理由はありますか?
解決
まず最初に、PC上でDMAを使用するための明示的な方法はありません。ドライバはががそれを使用するかもしれない、または何か他のものを使用する場合があります。
いずれの場合も、ステップ3は、「グラフィックスカード上のテクスチャデータを変更する」となります。 PBO(ピクセルバッファオブジェクト)拡張や古き良きglTexSubImageの*機能のOpenGLで。 D3D9では、テクスチャ又は他の方法(例えばLockRectスクラッチテクスチャに、次いで、GPUテクスチャにブリット)にLockRectをです。これらのいずれかが潜在的にDMAを使用しますが、あなたは確認することはできません。
次に、データは、テクスチャです。あなたは(例えば、ブラー/グロー/...).
いくつかのシェーダ(例えばYCbCr変換を行う)と、それを画面に描画する、またはより複雑な処理効果を行うために他のテクスチャ(複数可)にレンダリングすることができますDirect3Dのを使用すると、ものを行うための明確に定義された「ワストの方法」があるという意味で、より簡単です。 OpenGLであり何もする多くのオプションがあり、あなたが何らかの形で(時々速いパスが異なるプラットフォームやハードウェアに異なる)に高速であるものを把握する必要があります。
他のヒント
Linuxをしている場合は、180.xxシリーズのNVIDIAの最近のドライバーはVDPAU APIを介してビデオデコーディングのサポートが追加されました(動画像復号化とプレゼンテーション何か)。多くの主要なプロジェクトはmplayerを、VLC、ffmpegの、とMythTVのを含め、APIと統合しています。私は詳細のすべてを知りませんが、彼らは共通のサブ操作やビットストリーム操作を含む多くのコーデックのためのAPIを提供します。
私は(私はVDPAUを使用することを前提と)CUDA
にまっすぐに行く前にこちらを見てねあなたは、このようなATIからNVIDIAまたはストリームSDKからCUDAなどの汎用GPUプログラミング(GPGPU)を実行するためのさまざまな言語のいくつかを見ることができます別の方法として。あなたが選択したかに応じて、あなたは、しかし、GPUの1つのブランドに自分自身を制限することができます。これらの言語を使用する理由は、通常、高レベルのプログラミングに近い代わりのシェーダでの作業である抽象化のレベルで動作するようになります。
私はあなたがそうシェーダは、実際に仕事に適していますが、それはあなたが見て考えることができるものであれば、私が言うことができない何をしたいかとの経験がありません。これは、アルゴリズム設計は、まだ通常のコードよりもやや異なっており、それは(私はCUDAで働いているが、それらはすべて同様の抽象化を使用するように見える)それのこつを取得いくつかの努力を要すると言わなければなりません。
私はあなたのシェーダの仕事の経験のまともな量を持っているthaat場合は、新しいプラットフォームを学ぶために、それは面倒な価値はないかもしれないと仮定します。
以下の手順をなすべきで
ビデオデコードYUV
これは通常のデコーダlibいます。
負荷OpenGLとしての質感
変換YUV RGB
かんを利用したいオーバーレイには、変換になります。 こちらの 例を用シェーダー.
置換テクスチャダレンダリング画面