CTransInPlaceFilter似乎未在其输入引脚中实现GetAllocatorRequirements
。因为尝试在上游过滤器上调用此方法时收到E_NOTIMPL错误。
我知道CTransInPlace筛选器只有一个缓冲区,而不是输入和输出缓冲区。
但是,如何在上游过滤器中处理此问题?
如何实现DecideAllocator支持CTransInPlaceFilters?
这是我在上游过滤器中的DecideAllocator函数:
HRESULT MCMyOutputPin::DecideAllocator(IMemInputPin *pPin, IMemAllocator **ppAlloc)
{
ALLOCATOR_PROPERTIES *pprops = new ALLOCATOR_PROPERTIES;
HRESULT hr = pPin->GetAllocatorRequirements(pprops); //returns E_NOTIMPL
if (FAILED(hr))
return hr;
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 = *ppAlloc;
m_pAllocator->Commit();
m_pAllocator->AddRef();
return hr;
}
还是我错过了某些东西,而错误的原因又有所不同?
最佳答案
关于原位穿孔的部分与问题无关并且是多余的。您正在询问如何处理未实现IMemInputPin::GetAllocatorRequirements
的对等过滤器/引脚。从MSDN:
不需要输入引脚即可实现此方法。如果过滤器具有特定的对齐方式或前缀要求,则应实施此方法。
此方法的实施不是强制性的。这意味着您可以在输出管脚上自由决定是否配置内存分配器,而无需考虑对分配器属性的对等管脚意见。
关于c++ - 使用transinplacefilter决定分配器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22958655/