📄 filter.cpp
字号:
#ifdef DEBUG_DSHOW_L1 msg_Dbg( p_input, "CaptureFilter::AddRef (ref: %i)", i_ref );#endif return i_ref++;};STDMETHODIMP_(ULONG) CaptureFilter::Release(){#ifdef DEBUG_DSHOW_L1 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 p_pin->EndFlush(); 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 memcpy(pInfo->achName, FILTER_NAME, sizeof(FILTER_NAME)); 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( vlc_object_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_L1 msg_Dbg( p_input, "CaptureEnumPins::~CaptureEnumPins" );#endif p_filter->Release();}/* IUnknown methods */STDMETHODIMP CaptureEnumPins::QueryInterface( REFIID riid, void **ppv ){#ifdef DEBUG_DSHOW_L1 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_L1 msg_Dbg( p_input, "CaptureEnumPins::AddRef (ref: %i)", i_ref );#endif return i_ref++;};STDMETHODIMP_(ULONG) CaptureEnumPins::Release(){#ifdef DEBUG_DSHOW_L1 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_L1 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_L1 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_L1 msg_Dbg( p_input, "CaptureEnumPins::Reset" );#endif i_position = 0; return S_OK;};STDMETHODIMP CaptureEnumPins::Clone( IEnumPins **ppEnum ){#ifdef DEBUG_DSHOW_L1 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( vlc_object_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 ) { CopyMediaType(&cx_media_type, &p_pin->cx_media_type); i_position = 0; } else { CopyMediaType(&cx_media_type, &pEnumMediaTypes->cx_media_type); i_position = pEnumMediaTypes->i_position; }}CaptureEnumMediaTypes::~CaptureEnumMediaTypes(){#ifdef DEBUG_DSHOW_L1 msg_Dbg( p_input, "CaptureEnumMediaTypes::~CaptureEnumMediaTypes" );#endif FreeMediaType(cx_media_type); p_pin->Release();}/* IUnknown methods */STDMETHODIMP CaptureEnumMediaTypes::QueryInterface( REFIID riid, void **ppv ){#ifdef DEBUG_DSHOW_L1 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_L1 msg_Dbg( p_input, "CaptureEnumMediaTypes::AddRef (ref: %i)", i_ref );#endif return i_ref++;};STDMETHODIMP_(ULONG) CaptureEnumMediaTypes::Release(){#ifdef DEBUG_DSHOW_L1 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_L1 msg_Dbg( p_input, "CaptureEnumMediaTypes::Next " );#endif ULONG copied = 0; ULONG offset = 0; ULONG max = p_pin->media_type_count; if( ! ppMediaTypes ) return E_POINTER; if( (! pcFetched) && (cMediaTypes > 1) ) return E_POINTER; /* ** use connection media type as first entry in iterator if it exists */ copied = 0; if( cx_media_type.subtype != GUID_NULL ) { ++max; if( i_position == 0 ) { ppMediaTypes[copied] = (AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); if( CopyMediaType(ppMediaTypes[copied], &cx_media_type) != S_OK ) return E_OUTOFMEMORY; ++i_position; ++copied; } } while( (copied < cMediaTypes) && (i_position < max) ) { ppMediaTypes[copied] = (AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); if( CopyMediaType( ppMediaTypes[copied], &p_pin->media_types[i_position-offset]) != S_OK ) return E_OUTOFMEMORY; ++copied; ++i_position; } if( pcFetched ) *pcFetched = copied; return (copied == cMediaTypes) ? S_OK : S_FALSE;};STDMETHODIMP CaptureEnumMediaTypes::Skip( ULONG cMediaTypes ){ ULONG max = p_pin->media_type_count; if( cx_media_type.subtype != GUID_NULL ) { max = 1; }#ifdef DEBUG_DSHOW_L1 msg_Dbg( p_input, "CaptureEnumMediaTypes::Skip" );#endif i_position += cMediaTypes; return (i_position < max) ? S_OK : S_FALSE;};STDMETHODIMP CaptureEnumMediaTypes::Reset(){#ifdef DEBUG_DSHOW_L1 msg_Dbg( p_input, "CaptureEnumMediaTypes::Reset" );#endif FreeMediaType(cx_media_type); CopyMediaType(&cx_media_type, &p_pin->cx_media_type); i_position = 0; return S_OK;};STDMETHODIMP CaptureEnumMediaTypes::Clone( IEnumMediaTypes **ppEnum ){#ifdef DEBUG_DSHOW_L1 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -