filter.cpp

来自「VLC媒体播放程序」· C++ 代码 · 共 946 行 · 第 1/2 页

CPP
946
字号
        samples_queue.pop_back();        msg_Dbg( p_input, "CapturePin::Receive trashing late input sample" );        vlc_sample.p_sample->Release();    }    vlc_cond_signal( &p_sys->wait );    vlc_mutex_unlock( &p_sys->lock );    return S_OK;}STDMETHODIMP CapturePin::ReceiveMultiple( IMediaSample **pSamples,                                          long nSamples,                                          long *nSamplesProcessed ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CapturePin::ReceiveMultiple" );#endif    HRESULT hr = S_OK;    *nSamplesProcessed = 0;    while( nSamples-- > 0 )    {         hr = Receive( pSamples[*nSamplesProcessed] );         if( hr != S_OK ) break;         (*nSamplesProcessed)++;    }    return hr;}STDMETHODIMP CapturePin::ReceiveCanBlock( void ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CapturePin::ReceiveCanBlock" );#endif    return S_FALSE; /* Thou shalt not block */}/**************************************************************************** * Implementation of our dummy directshow filter class ****************************************************************************/CaptureFilter::CaptureFilter( input_thread_t * _p_input, AM_MEDIA_TYPE mt )  : p_input( _p_input ), p_pin( new CapturePin( _p_input, this, mt ) ),    media_type( mt ), state( State_Stopped ), i_ref( 1 ){}CaptureFilter::~CaptureFilter(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::~CaptureFilter" );#endif    p_pin->Release();}/* IUnknown methods */STDMETHODIMP CaptureFilter::QueryInterface( REFIID riid, void **ppv ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::QueryInterface" );#endif    if( riid == IID_IUnknown )    {        AddRef();        *ppv = (IUnknown *)this;        return NOERROR;    }    if( riid == IID_IPersist )    {        AddRef();        *ppv = (IPersist *)this;        return NOERROR;    }    if( riid == IID_IMediaFilter )    {        AddRef();        *ppv = (IMediaFilter *)this;        return NOERROR;    }    if( riid == IID_IBaseFilter )    {        AddRef();        *ppv = (IBaseFilter *)this;        return NOERROR;    }    else    {        *ppv = NULL;        return E_NOINTERFACE;    }};STDMETHODIMP_(ULONG) CaptureFilter::AddRef(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::AddRef (ref: %i)", i_ref );#endif    return i_ref++;};STDMETHODIMP_(ULONG) CaptureFilter::Release(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::Release (ref: %i)", i_ref );#endif    if( !InterlockedDecrement(&i_ref) ) delete this;    return 0;};/* IPersist method */STDMETHODIMP CaptureFilter::GetClassID(CLSID *pClsID){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::GetClassID" );#endif    return E_NOTIMPL;};/* IMediaFilter methods */STDMETHODIMP CaptureFilter::GetState(DWORD dwMSecs, FILTER_STATE *State){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::GetState %i", state );#endif    *State = state;    return S_OK;};STDMETHODIMP CaptureFilter::SetSyncSource(IReferenceClock *pClock){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::SetSyncSource" );#endif    return S_OK;};STDMETHODIMP CaptureFilter::GetSyncSource(IReferenceClock **pClock){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::GetSyncSource" );#endif    *pClock = NULL;    return NOERROR;};STDMETHODIMP CaptureFilter::Stop(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::Stop" );#endif    state = State_Stopped;    return S_OK;};STDMETHODIMP CaptureFilter::Pause(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::Pause" );#endif    state = State_Paused;    return S_OK;};STDMETHODIMP CaptureFilter::Run(REFERENCE_TIME tStart){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::Run" );#endif    state = State_Running;    return S_OK;};/* IBaseFilter methods */STDMETHODIMP CaptureFilter::EnumPins( IEnumPins ** ppEnum ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::EnumPins" );#endif    /* Create a new ref counted enumerator */    *ppEnum = new CaptureEnumPins( p_input, this, NULL );    return *ppEnum == NULL ? E_OUTOFMEMORY : NOERROR;};STDMETHODIMP CaptureFilter::FindPin( LPCWSTR Id, IPin ** ppPin ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::FindPin" );#endif    return E_NOTIMPL;};STDMETHODIMP CaptureFilter::QueryFilterInfo( FILTER_INFO * pInfo ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::QueryFilterInfo" );#endif    pInfo->achName[0] = L'\0';    pInfo->pGraph = p_graph;    if( p_graph ) p_graph->AddRef();    return NOERROR;};STDMETHODIMP CaptureFilter::JoinFilterGraph( IFilterGraph * pGraph,                                             LPCWSTR pName ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::JoinFilterGraph" );#endif    p_graph = pGraph;    return NOERROR;};STDMETHODIMP CaptureFilter::QueryVendorInfo( LPWSTR* pVendorInfo ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureFilter::QueryVendorInfo" );#endif    return E_NOTIMPL;};/* Custom methods */CapturePin *CaptureFilter::CustomGetPin(){    return p_pin;}/**************************************************************************** * Implementation of our dummy directshow enumpins class ****************************************************************************/CaptureEnumPins::CaptureEnumPins( input_thread_t * _p_input,                                  CaptureFilter *_p_filter,                                  CaptureEnumPins *pEnumPins )  : p_input( _p_input ), p_filter( _p_filter ), i_ref( 1 ){    /* Hold a reference count on our filter */    p_filter->AddRef();    /* Are we creating a new enumerator */    if( pEnumPins == NULL )    {        i_position = 0;    }    else    {        i_position = pEnumPins->i_position;    }}CaptureEnumPins::~CaptureEnumPins(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumPins::~CaptureEnumPins" );#endif    p_filter->Release();}/* IUnknown methods */STDMETHODIMP CaptureEnumPins::QueryInterface( REFIID riid, void **ppv ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumPins::QueryInterface" );#endif    if( riid == IID_IUnknown ||        riid == IID_IEnumPins )    {        AddRef();        *ppv = (IEnumPins *)this;        return NOERROR;    }    else    {        *ppv = NULL;        return E_NOINTERFACE;    }};STDMETHODIMP_(ULONG) CaptureEnumPins::AddRef(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumPins::AddRef (ref: %i)", i_ref );#endif    return i_ref++;};STDMETHODIMP_(ULONG) CaptureEnumPins::Release(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumPins::Release (ref: %i)", i_ref );#endif    if( !InterlockedDecrement(&i_ref) ) delete this;    return 0;};/* IEnumPins */STDMETHODIMP CaptureEnumPins::Next( ULONG cPins, IPin ** ppPins,                                    ULONG * pcFetched ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumPins::Next" );#endif    unsigned int i_fetched = 0;    if( i_position < 1 && cPins > 0 )    {        IPin *pPin = p_filter->CustomGetPin();        *ppPins = pPin;        pPin->AddRef();        i_fetched = 1;        i_position++;    }    if( pcFetched ) *pcFetched = i_fetched;    return (i_fetched == cPins) ? S_OK : S_FALSE;};STDMETHODIMP CaptureEnumPins::Skip( ULONG cPins ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumPins::Skip" );#endif    i_position += cPins;    if( i_position > 1 )    {        return S_FALSE;    }    return S_OK;};STDMETHODIMP CaptureEnumPins::Reset(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumPins::Reset" );#endif    i_position = 0;    return S_OK;};STDMETHODIMP CaptureEnumPins::Clone( IEnumPins **ppEnum ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumPins::Clone" );#endif    *ppEnum = new CaptureEnumPins( p_input, p_filter, this );    if( *ppEnum == NULL ) return E_OUTOFMEMORY;    return NOERROR;};/**************************************************************************** * Implementation of our dummy directshow enummediatypes class ****************************************************************************/CaptureEnumMediaTypes::CaptureEnumMediaTypes( input_thread_t * _p_input,                                  CapturePin *_p_pin,                                  CaptureEnumMediaTypes *pEnumMediaTypes )  : p_input( _p_input ), p_pin( _p_pin ), i_ref( 1 ){    /* Hold a reference count on our filter */    p_pin->AddRef();    /* Are we creating a new enumerator */    if( pEnumMediaTypes == NULL )    {        i_position = 0;    }    else    {        i_position = pEnumMediaTypes->i_position;    }}CaptureEnumMediaTypes::~CaptureEnumMediaTypes(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumMediaTypes::~CaptureEnumMediaTypes" );#endif    p_pin->Release();}/* IUnknown methods */STDMETHODIMP CaptureEnumMediaTypes::QueryInterface( REFIID riid, void **ppv ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumMediaTypes::QueryInterface" );#endif    if( riid == IID_IUnknown ||        riid == IID_IEnumMediaTypes )    {        AddRef();        *ppv = (IEnumMediaTypes *)this;        return NOERROR;    }    else    {        *ppv = NULL;        return E_NOINTERFACE;    }};STDMETHODIMP_(ULONG) CaptureEnumMediaTypes::AddRef(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumMediaTypes::AddRef (ref: %i)", i_ref );#endif    return i_ref++;};STDMETHODIMP_(ULONG) CaptureEnumMediaTypes::Release(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumMediaTypes::Release (ref: %i)", i_ref );#endif    if( !InterlockedDecrement(&i_ref) ) delete this;    return 0;};/* IEnumMediaTypes */STDMETHODIMP CaptureEnumMediaTypes::Next( ULONG cMediaTypes,                                          AM_MEDIA_TYPE ** ppMediaTypes,                                          ULONG * pcFetched ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumMediaTypes::Next" );#endif    if( pcFetched ) *pcFetched = 0;    return S_FALSE;};STDMETHODIMP CaptureEnumMediaTypes::Skip( ULONG cMediaTypes ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumMediaTypes::Skip" );#endif    return S_FALSE;};STDMETHODIMP CaptureEnumMediaTypes::Reset(){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumMediaTypes::Reset" );#endif    i_position = 0;    return S_OK;};STDMETHODIMP CaptureEnumMediaTypes::Clone( IEnumMediaTypes **ppEnum ){#ifdef DEBUG_DSHOW    msg_Dbg( p_input, "CaptureEnumMediaTypes::Clone" );#endif    *ppEnum = new CaptureEnumMediaTypes( p_input, p_pin, this );    if( *ppEnum == NULL ) return E_OUTOFMEMORY;    return NOERROR;};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?