0
votes

When I try to connect my custom written filter to an avi mux filter in graphedt it automaticaly adds a Microsoft DTV-DVD Audio Decoder in between, which isnt need because i proces video streams. How does graphedt decide to do that and how can i prevent that?

How do two filters decide if they are compatible?

Here is the header file of my output pin:

#pragma once

#include <streams.h>
#include "MyFilter.h"


class MCMyOutputPin : public CBaseOutputPin
{
private:
    // parent
    CBaseFilter     *mux;
    IUnknown        *position;

public:
    MCMyOutputPin(MyFilter* filter, HRESULT *phr, LPCWSTR pName);
    virtual ~MCMyOutputPin();

    STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);

    // overriden
    virtual HRESULT CheckMediaType(const CMediaType *pmt);
    virtual HRESULT SetMediaType(const CMediaType *pmt);
    virtual HRESULT CompleteConnect(IPin *pReceivePin);
    virtual HRESULT BreakConnect();
    virtual HRESULT GetMediaType(int i, CMediaType *pmt);
    virtual HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProps);
    virtual HRESULT Deliver(IMediaSample* sample);
    virtual HRESULT AgreeMediaType(IPin* recievePin, const CMediaType *pmt);

    // qual prop
    STDMETHODIMP Notify(IBaseFilter *pSender, Quality q);

    CMediaType &CurrentMediaType() { return m_mt; }

};

And here its implementation:

#include "CMyOutPutPin.h"
#include <fstream>

MCMyOutputPin::MCMyOutputPin(MyFilter* parent, HRESULT *phr, LPCWSTR pName) : CBaseOutputPin(NAME("MyOutPutPin"), parent, &parent->m_lock_filter, phr, pName)
{


}

MCMyOutputPin::~MCMyOutputPin()
{

}


STDMETHODIMP MCMyOutputPin::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
    return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv);
}

HRESULT MCMyOutputPin::CheckMediaType(const CMediaType *pmt)
{

    return S_OK;
}

HRESULT MCMyOutputPin::SetMediaType(const CMediaType *pmt)
{

    return CBaseOutputPin::SetMediaType(pmt);
}

HRESULT MCMyOutputPin::CompleteConnect(IPin *pReceivePin)
{


    return CBaseOutputPin::CompleteConnect(pReceivePin);
}

HRESULT MCMyOutputPin::BreakConnect()
{

    return CBaseOutputPin::BreakConnect();
}

HRESULT MCMyOutputPin::GetMediaType(int i, CMediaType *pmt)
{
    return CBaseOutputPin::GetMediaType(i, pmt);
}

HRESULT MCMyOutputPin::DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProps)
{

    ALLOCATOR_PROPERTIES    act;
    HRESULT                 hr;

    // by default we do something like this...
    pProps->cbAlign     = 1;
    pProps->cBuffers    = 1;
    pProps->cbBuffer    = this->CurrentMediaType().lSampleSize;
    pProps->cbPrefix    = 0;

    hr = pAlloc->SetProperties(pProps, &act);
    if (FAILED(hr)) return hr;

    // make sure the allocator is OK with it.
    if ((pProps->cBuffers > act.cBuffers)  ||
        (pProps->cbBuffer > act.cbBuffer) ||
        (pProps->cbAlign > act.cbAlign)) 
        return E_FAIL;

    return NOERROR;
}

STDMETHODIMP MCMyOutputPin::Notify(IBaseFilter *pSender, Quality q)
{
    // right now we don't do anything ...
    return NOERROR;
}

HRESULT MCMyOutputPin::Deliver(IMediaSample* sample)
{

    std::ofstream outfile;
    outfile.open("C:\\TEMP\\yc1.log", std::ios_base::app);
    outfile << "receiving data on outputpin" << std::endl;

    outfile.close();
    m_pInputPin->Receive(sample);
    return CBaseOutputPin::Deliver(sample);
    //Forward to filter
}

HRESULT MCMyOutputPin::AgreeMediaType(IPin * pin, const CMediaType* pmt)
{
    return S_OK;
}
1

1 Answers

1
votes

It happens first of all because pins cannot connect directly. So basically preventing means you would not be able to connect pins, and you would have an error instead.

  • Additional filter insertion is called Intelligent Connect
  • Compatibility is ability to connect, to succeeded in IPin::Connect and IPin::ReceiveConnection method