视频渲染器滤波器抑制样品(Video Renderer Filter rejects sample)

2019-10-29 20:51发布

目前我只过滤转发从一个输入引脚的数据渲染器,过滤器。 我在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);



}

该递送方法已经在上面张贴

Answer 1:

所以很多问题最近问了,你还是不要问他们以正确的方式。 这里是清单 ,在发布前检查您的问题反对。

你有拒绝? 什么是错误代码,然后。

视频渲染是挑剔的输入,性能方面的原因。 所以,如果你要连接到视频渲染器,你必须正确地做好每一件事。 即使你可以切断与其他过滤器的角落,它不与视频渲染器锻炼。

我的猜测是,你忽略了引脚连接介质样品必须属于约定的分配规则。 VMR只会从自己的分配器(由视频面有效支持)接受样品。 一个人不是简单的“前进”从输入引脚,这属于另一个分配器,以VMR的输入媒体采样。 我最好最好的是你遇到的问题。 你要复制的数据,而不是通过引脚之间的媒体采样指针 (或者你有传播VMR的分配,这是一个非常先进的任务)。

此外,VMR / EVR对视频步幅具体要求。 只要我看到VMR和你的过滤器之间的直接连接,我怀疑你可能会忽略它,在这种情况下,你将在以后面对这个问题,但你可以开始阅读MSDN马上: 处理从视频渲染器格式更改 。



文章来源: Video Renderer Filter rejects sample