我试图将某个 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 中实现的“Flush”函数重新初始化我的样本时间戳。
我不确定发生了什么,但据我所知没有任何差距,在短片上,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 认为他需要将样本的时间戳归零的原因。
谢谢你的帮助!