0

特定の DMO を DirectShow Graph に挿入しようとしています。適切なインターフェイスを使用してこの DMO をラップしました。

ATL::CComPtr< IBaseFilter >         spDMOWrapper;
ATL::CComPtr< IDMOWrapperFilter >   spDMOWrapperEx;

if(FAILED(hr = spDMOWrapper.CoCreateInstance(CLSID_DMOWrapperFilter)))
    return hr;
if(FAILED(hr = spDMOWrapper.QueryInterface(&spDMOWrapperEx)))
    return hr;

IDMOWrapperFilter->Init(SomeDMO)

connecting pins and so on

if(FAILED(hr = pGraph->AddFilter(spDMOWrapper, L"WM DMO Video Encoder")))
        return hr;

次の問題は、同じ入力でランダムに発生します。

qasf.dll!CMediaWrapperFilter::NewSample() は、DMO に実装されている「フラッシュ」関数を使用して、サンプルのタイムスタンプを再初期化します。

何が起こっているのかよくわかりませんが、私が言える限りギャップはなく、短いクリップでは DMO は問題なく機能します。コールスタックを調べたい場合:

    DMO::Compression::Mainconcept::H264Encoder::Flush()  Line 1165  C++
    qasf.dll!CMediaWrapperFilter::NewSample()  + 0x48 bytes 
    qasf.dll!CWrapperInputPin::Receive()  + 0x16 bytes  
    Filters::Helpers::CPipeOutT<Filters::Helpers::CGenericPipe>::Deliver(IMediaSample * pSample)  Line 383 + 0x20 bytes C++
    Filters::Helpers::CPipeInT<Filters::Helpers::CGenericPipe,Filters::Helpers::CGenericInputPin>::Receive(IMediaSample * pSample)  Line 178 + 0x23 bytes   C++
    CBaseOutputPin::Deliver(IMediaSample * pSample)  Line 2695 + 0x20 bytes C++

この問題を解決することに加えて、CMediaWrapperFilter がサンプルのタイムスタンプをゼロにする必要があると考える理由にもっと興味があります。

ご協力いただきありがとうございます!

4

1 に答える 1

0

これはの動作ですDMO Wrapper Filter。ストリーミング時に、基になるDMOがそれ以上出力を生成しないことを確認し、それでも新しい入力を受け入れない場合、フィルターはDMOをフラッシュし、ストリーミングエラーを示します。

于 2012-08-03T08:17:37.607 に答える