目前我只过滤转发从一个输入引脚的数据渲染器,过滤器。 我在graphstudio测试它。 现在,一切似乎都工作得很好,只是在我输出的交付方法钉住调用连接的输入引脚返回一个样品被拒绝的错误代码。 (VFW_E_SAMPLE_REJECTED 0x8004022B)
根据MSDN会发生这种情况如果符合下列条件:
- 该引脚被冲洗(见冲洗)。
- 销未连接。
- 过滤器被停止。
- 发生其他一些错误
我不认为第一个是真实的。 它不能被冲洗所有输入样本
由于过滤器已conncected第二个不可能是真实的。
第三个是不太可能的。 为什么要过滤停止。
所以我觉得一定是有其他错误,但我无法找到太多有用的信息。
HRESULT MCMyOutputPin::Deliver(IMediaSample* sample)
{
HRESULT hr = NO_ERROR;
myLogger->LogDebug("In Outputpin Deliver", L"D:\\TEMP\\yc.log");
if (sample->GetActualDataLength() > 0)
{
hr = m_pInputPin->Receive(sample);
sample->AddRef();
}
return hr;
//Forward to filter
}
正如你可以看到我确信使用由输入引脚提供的IMemAllocator
HRESULT MCMyOutputPin::DecideAllocator(IMemInputPin *pPin, IMemAllocator **ppAlloc)
{
ALLOCATOR_PROPERTIES *pprops = new ALLOCATOR_PROPERTIES;
/*HRESULT hr = pPin->GetAllocatorRequirements(pprops);
if (FAILED(hr))*/
//return hr;
HRESULT hr = pPin->GetAllocator(ppAlloc);
if (hr == VFW_E_NO_ALLOCATOR)
{
hr = InitAllocator(ppAlloc);
if (FAILED(hr))
return hr;
}
hr = DecideBufferSize(*ppAlloc, pprops);
if (FAILED(hr))
return hr;
hr = pPin->NotifyAllocator(*ppAlloc, TRUE);
if (FAILED(hr))
{
return hr;
}
*ppAlloc = m_pAllocator;
m_pAllocator->AddRef();
return hr;
}
这里是我从precdeing过滤我inputpin得到样本:
HRESULT CMyInputPin::Receive(IMediaSample *pSample)
{
mylogger->LogDebug("In Inputpin Receive", L"D:\\TEMP\\yc.log");
//Forward to filter
filter->acceptFilterInput(pinname, pSample);
return S_OK;
}
这在我的过滤器调用acceptFilterInput:
void MyFilter::acceptFilterInput(LPCWSTR pinname, IMediaSample* sample)
{
//samplesPin0.insert(samplesPin0.end(), sample);
mylogger->LogDebug("In acceptFIlterInput", L"D:\\TEMP\\yc.log");
outpin->Deliver(sample);
}
该递送方法已经在上面张贴