Video Renderer Filter rejects sample

0

Currently my filter just forwards data from one input pin to a renderer-filter. I am testing it in graphstudio. Now, everything seems to work just fine except that in the Deliver method of my output pin the call to the connected input pin returns a sample-rejected error code. ( VFW_E_SAMPLE_REJECTED 0x8004022B )

According to MSDN this can happen if one the following is true:

  • The pin is flushing (see Flushing).
  • The pin is not connected.
  • The filter is stopped.
  • Some other error occurred

I don't think the first one is true. It can't be flushing for all input samples

The second one cannot be true because the filters have been conncected.

Third one is unlikely. Why should the filter be stopped.

So I think it must be some other error, but I couldn't find much helpful information.

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
}

As you can see i made sure to use the IMemAllocator provided by the input pin

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;

}

Here is where i get sample in my inputpin from the precdeing filter:

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

This calls acceptFilterInput in my filter:

void MyFilter::acceptFilterInput(LPCWSTR pinname, IMediaSample* sample)
{

    //samplesPin0.insert(samplesPin0.end(), sample);
    mylogger->LogDebug("In acceptFIlterInput", L"D:\\TEMP\\yc.log");
    outpin->Deliver(sample);



}

the deliver method is already posted above

enter image description here

c++
video
directshow
asked on Stack Overflow Mar 12, 2014 by Luke • edited Mar 12, 2014 by Luke

1 Answer

2

So many question asked recently, and you still don't ask them the right way. Here is the checklist to check your questions against before posting.

You have a rejection? What is the error code then.

Video renders are picky for input, for performance reasons. So if you are connecting to video renderer, you have to do everything correctly. Even if you can cut corners with other filters, it does not work out with video renderers.

My guess is that you ignore the rule that media samples on pin connection have to belong to the agreed allocator. VMR will only accept samples from its own allocator (effectively backed by video surfaces). One does not simply "forward" a media sample from input pin, which belongs to another allocator, to VMR's input. My best best it is the problem you are having. You have to copy data instead of passing media sample pointer between pins (or you have to propagate VMR's allocator, which is a pretty advanced task).

Additionally, VMR/EVR have specific requirements for video stride. As long as I see direct connection between VMR and your filter, I suspect you might be ignoring it, in which case you will face this problem later, but you can start reading MSDN right away: Handling Format Changes from the Video Renderer.

answered on Stack Overflow Mar 12, 2014 by Roman R. • edited Mar 20, 2017 by Community

User contributions licensed under CC BY-SA 3.0