视频渲染器过滤器拒绝样本

时间:2014-03-12 15:51:32

标签: c++ video directshow

目前我的过滤器只是将数据从一个输入引脚转发到渲染器过滤器。我在graphstudio中测试它。 现在,一切似乎都工作得很好,除了在我的输出引脚的Deliver方法中调用 连接的输入引脚返回一个拒绝采样的错误代码。 ( VFW_E_SAMPLE_REJECTED 0x8004022B)

根据MSDN,如果满足以下条件,则会发生这种情况:

  • 针脚正在冲洗(参见冲洗)。
  • 引脚未连接。
  • 过滤器已停止。
  • 发生了其他一些错误

我不认为第一个是真的。它无法刷新所有输入样本

第二个不可能是真的,因为过滤器已被连接。

第三个不太可能。为什么要停止过滤器。

所以我认为这肯定是其他一些错误,但我找不到很多有用的信息。

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;

}

这是我在预输入过滤器的输入引脚中获取样本的地方:

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);



}

传递方法已在上面发布

enter image description here

1 个答案:

答案 0 :(得分:2)

最近问了很多问题,你仍然没有问他们正确的方法。这是checklist在发布之前检查您的问题。

你有拒绝?那么错误代码是什么。

出于性能原因,视频渲染对于输入很挑剔。因此,如果您要连接到视频渲染器,则必须正确执行所有操作。即使您可以使用其他滤镜进行切角,也无法使用视频渲染器。

我的猜测是你忽略了针连接上的媒体样本必须属于商定的分配器的规则。 VMR只接受来自其自己的分配器的样本(由视频表面有效支持)。人们不会简单地将媒体样本从属于另一个分配器的输入引脚“转发”到VMR的输入。我最好的是你遇到的问题。 您必须复制数据而不是在引脚之间传递媒体示例指针(或者您必须传播VMR的分配器,这是一项非常高级的任务)。

此外,VMR / EVR对视频步幅有特定要求。只要我看到VMR与您的过滤器之间的直接连接,我怀疑您可能会忽略它,在这种情况下您将在以后遇到此问题,但您可以立即开始阅读MSDN:Handling Format Changes from the Video Renderer