2017-04-16 8 views
1

「インテル®クイック・シンク・ビデオH.264エンコーダMFT」を使用してビデオをエンコードしたいとします。 システムバッファからIMFSampleを作成するとうまくいきます。ただ、次のように:インテルMFTエンコーダのD11テクスチャからIMFSampleを作成する方法

IMFMediaBuffer *pBuffer = NULL; 
MFCreateMemoryBuffer(cbSize, &pBuffer); 
BYTE *pData = NULL; 
pBuffer->Lock(&pData, NULL, NULL); 
memcpy(pData, bufferIhaveinYYYYUV format, buffer size); 
pBuffer->Unlock(); 
IMFSample *pSample = NULL; 
MFCreateSample(&pSample); 
pSample->AddBuffer(pBuffer); 

は今、私はそれがパフォーマンスを向上させるために、表面入力として(DXGI_FORMAT_NV12、1280×720)をID3D11Texture2D養うことができるかどうかを調査しています。 IMFTransform :: ProcessInputにMFCreateVideoSampleFromSurfaceまたはMFCreateDXGISurfaceBufferで作成したIMFSサンプルインスタンスを渡そうとしましたが、複数の実験を行いました(異なるテクスチャ作成フラグを試しています)が、すべての入力サンプルが受け入れられましたが、出力サンプルは生成されませんでした。それが重要な場合は、実際にはゴミのピクセルデータで満たされたテクスチャと違いがないと仮定して、テクスチャにデータをアップロードしようとしたことはありませんでした。

何か間違っていますか?

+0

あなたのような問題が発生したときに助けてもらえますか? [ここ](https://stackoverflow.com/questions/48512660/how-to-create-imfsample-from-d11-texture-for-mft-encode)! –

答えて

0

基本的にはearlier questionを繰り返していますが、まだ動作しないコードは追加しません。

通常の(メモリ内の)サンプルをフィードしてエンコーダを動作させることができるということは、あなたがすべて正しいことをしていることを示唆しています。 Direct3Dモードでは、Direct3D 9サーフェスまたはDirect3D 11テクスチャを提供するだけでなく、MFTのそれぞれの初期化も遵守する必要があります。特に、テクスチャとMFTの内部は、同じDirect3Dデバイスに属していなければならず、したがってストリーミングが開始される前に必要なステップに属している必要があります。呼び出す必要があるのはMFCreateDXGISurfaceBufferだけではありません。

一般的に、このアプローチはMSDNのSupporting Direct3D 11 Video Decoding in Media Foundationの記事で概説されています。同じことがエンコードシナリオにも同様に当てはまります。あなたはIMFDXGIDeviceManagerポインターを使用すると予想され、MFT_MESSAGE_SET_D3D_MANAGERメッセージを使用することが期待されています。 MFTは、入力フレームデータを保持するテクスチャベースのサンプルを受け入れるDirect3D 11モードに切り替えるようにMSDNが動作するように動作します。

+0

MFT_MESSAGE_SET_D3D_MANAGERメッセージを使用した後、正常に動作します。 @ローマン、ありがとう。 –

関連する問題