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 + -
显示快捷键?