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/

10-11 21:58