⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.cpp

📁 VLC Player Source Code
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -