特定の 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 がサンプルのタイムスタンプをゼロにする必要があると考える理由にもっと興味があります。
ご協力いただきありがとうございます!