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 中实现的“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 认为他需要将样本的时间戳归零的原因。

谢谢你的帮助!

4

1 回答 1

0

这是 的行为DMO Wrapper Filter。如果在流式传输时它发现底层 DMO 不再产生输出,但不接受新输入,则过滤器刷新 DMO 并指示流式传输错误。

于 2012-08-03T08:17:37.607 回答