亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? amfilter.cpp

?? 用DirectX制作高級動畫-[Advanced.Animation.with.DirectX]
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
STDMETHODIMP
CBaseFilter::GetSyncSource(IReferenceClock **pClock)
{
    CheckPointer(pClock,E_POINTER);
    ValidateReadWritePtr(pClock,sizeof(IReferenceClock *));
    CAutoLock cObjectLock(m_pLock);

    if (m_pClock) {
        // returning an interface... addref it...
        m_pClock->AddRef();
    }
    *pClock = (IReferenceClock*)m_pClock;
    return NOERROR;
}



// override CBaseMediaFilter Stop method, to deactivate any pins this
// filter has.
STDMETHODIMP
CBaseFilter::Stop()
{
    CAutoLock cObjectLock(m_pLock);
    HRESULT hr = NOERROR;

    // notify all pins of the state change
    if (m_State != State_Stopped) {
        int cPins = GetPinCount();
        for (int c = 0; c < cPins; c++) {

            CBasePin *pPin = GetPin(c);

            // Disconnected pins are not activated - this saves pins worrying
            // about this state themselves. We ignore the return code to make
            // sure everyone is inactivated regardless. The base input pin
            // class can return an error if it has no allocator but Stop can
            // be used to resync the graph state after something has gone bad

            if (pPin->IsConnected()) {
                HRESULT hrTmp = pPin->Inactive();
                if (FAILED(hrTmp) && SUCCEEDED(hr)) {
                    hr = hrTmp;
                }
            }
        }
    }


    m_State = State_Stopped;
    return hr;
}


// override CBaseMediaFilter Pause method to activate any pins
// this filter has (also called from Run)

STDMETHODIMP
CBaseFilter::Pause()
{
    CAutoLock cObjectLock(m_pLock);

    // notify all pins of the change to active state
    if (m_State == State_Stopped) {
        int cPins = GetPinCount();
        for (int c = 0; c < cPins; c++) {

            CBasePin *pPin = GetPin(c);

            // Disconnected pins are not activated - this saves pins
            // worrying about this state themselves

            if (pPin->IsConnected()) {
                HRESULT hr = pPin->Active();
                if (FAILED(hr)) {
                    return hr;
                }
            }
        }
    }



    m_State = State_Paused;
    return S_OK;
}

// Put the filter into a running state.

// The time parameter is the offset to be added to the samples'
// stream time to get the reference time at which they should be presented.
//
// you can either add these two and compare it against the reference clock,
// or you can call CBaseFilter::StreamTime and compare that against
// the sample timestamp.

STDMETHODIMP
CBaseFilter::Run(REFERENCE_TIME tStart)
{
    CAutoLock cObjectLock(m_pLock);

    // remember the stream time offset
    m_tStart = tStart;

    if (m_State == State_Stopped){
    HRESULT hr = Pause();

    if (FAILED(hr)) {
        return hr;
    }
    }
    // notify all pins of the change to active state
    if (m_State != State_Running) {
        int cPins = GetPinCount();
        for (int c = 0; c < cPins; c++) {

            CBasePin *pPin = GetPin(c);

            // Disconnected pins are not activated - this saves pins
            // worrying about this state themselves

            if (pPin->IsConnected()) {
                HRESULT hr = pPin->Run(tStart);
                if (FAILED(hr)) {
                    return hr;
                }
            }
        }
    }


    m_State = State_Running;
    return S_OK;
}

//
// return the current stream time - samples with start timestamps of this
// time or before should be rendered by now
HRESULT
CBaseFilter::StreamTime(CRefTime& rtStream)
{
    // Caller must lock for synchronization
    // We can't grab the filter lock because we want to be able to call
    // this from worker threads without deadlocking

    if (m_pClock == NULL) {
        return VFW_E_NO_CLOCK;
    }

    // get the current reference time
    HRESULT hr = m_pClock->GetTime((REFERENCE_TIME*)&rtStream);
    if (FAILED(hr)) {
        return hr;
    }

    // subtract the stream offset to get stream time
    rtStream -= m_tStart;

    return S_OK;
}


/* Create an enumerator for the pins attached to this filter */

STDMETHODIMP
CBaseFilter::EnumPins(IEnumPins **ppEnum)
{
    CheckPointer(ppEnum,E_POINTER);
    ValidateReadWritePtr(ppEnum,sizeof(IEnumPins *));

    /* Create a new ref counted enumerator */

    *ppEnum = new CEnumPins(this,
                        NULL);

    return *ppEnum == NULL ? E_OUTOFMEMORY : NOERROR;
}


// default behaviour of FindPin is to assume pins are named
// by their pin names
STDMETHODIMP
CBaseFilter::FindPin(
    LPCWSTR Id,
    IPin ** ppPin
)
{
    CheckPointer(ppPin,E_POINTER);
    ValidateReadWritePtr(ppPin,sizeof(IPin *));

    //  We're going to search the pin list so maintain integrity
    CAutoLock lck(m_pLock);
    int iCount = GetPinCount();
    for (int i = 0; i < iCount; i++) {
        CBasePin *pPin = GetPin(i);
        ASSERT(pPin != NULL);

        if (0 == lstrcmpW(pPin->Name(), Id)) {
            //  Found one that matches
            //
            //  AddRef() and return it
            *ppPin = pPin;
            pPin->AddRef();
            return S_OK;
        }
    }
    *ppPin = NULL;
    return VFW_E_NOT_FOUND;
}

/* Return information about this filter */

STDMETHODIMP
CBaseFilter::QueryFilterInfo(FILTER_INFO * pInfo)
{
    CheckPointer(pInfo,E_POINTER);
    ValidateReadWritePtr(pInfo,sizeof(FILTER_INFO));

    if (m_pName) {
        lstrcpynW(pInfo->achName, m_pName, sizeof(pInfo->achName)/sizeof(WCHAR));
    } else {
        pInfo->achName[0] = L'\0';
    }
    pInfo->pGraph = m_pGraph;
    if (m_pGraph)
        m_pGraph->AddRef();
    return NOERROR;
}


/* Provide the filter with a filter graph */

STDMETHODIMP
CBaseFilter::JoinFilterGraph(
    IFilterGraph * pGraph,
    LPCWSTR pName)
{
    CAutoLock cObjectLock(m_pLock);

    // NOTE: we no longer hold references on the graph (m_pGraph, m_pSink)

    m_pGraph = pGraph;
    if (m_pGraph) {
        HRESULT hr = m_pGraph->QueryInterface(IID_IMediaEventSink,
                        (void**) &m_pSink);
        if (FAILED(hr)) {
            ASSERT(m_pSink == NULL);
        }
        else m_pSink->Release();        // we do NOT keep a reference on it.
    } else {
        // if graph pointer is null, then we should
        // also release the IMediaEventSink on the same object - we don't
        // refcount it, so just set it to null
        m_pSink = NULL;
    }


    if (m_pName) {
        delete[] m_pName;
        m_pName = NULL;
    }

    if (pName) {
        DWORD nameLen = lstrlenW(pName)+1;
        m_pName = new WCHAR[nameLen];
        if (m_pName) {
            CopyMemory(m_pName, pName, nameLen*sizeof(WCHAR));
        } else {
            // !!! error here?
            ASSERT(FALSE);
        }
    }


    return NOERROR;
}


// return a Vendor information string. Optional - may return E_NOTIMPL.
// memory returned should be freed using CoTaskMemFree
// default implementation returns E_NOTIMPL
STDMETHODIMP
CBaseFilter::QueryVendorInfo(
    LPWSTR* pVendorInfo)
{
    UNREFERENCED_PARAMETER(pVendorInfo);
    return E_NOTIMPL;
}


// send an event notification to the filter graph if we know about it.
// returns S_OK if delivered, S_FALSE if the filter graph does not sink
// events, or an error otherwise.
HRESULT
CBaseFilter::NotifyEvent(
    long EventCode,
    LONG_PTR EventParam1,
    LONG_PTR EventParam2)
{
    // Snapshot so we don't have to lock up
    IMediaEventSink *pSink = m_pSink;
    if (pSink) {
        if (EC_COMPLETE == EventCode) {
            EventParam2 = (LONG_PTR)(IBaseFilter*)this;
        }

        return pSink->Notify(EventCode, EventParam1, EventParam2);
    } else {
        return E_NOTIMPL;
    }
}

// Request reconnect
// pPin is the pin to reconnect
// pmt is the type to reconnect with - can be NULL
// Calls ReconnectEx on the filter graph
HRESULT
CBaseFilter::ReconnectPin(
    IPin *pPin,
    AM_MEDIA_TYPE const *pmt
)
{
    IFilterGraph2 *pGraph2;
    if (m_pGraph != NULL) {
        HRESULT hr = m_pGraph->QueryInterface(IID_IFilterGraph2, (void **)&pGraph2);
        if (SUCCEEDED(hr)) {
            hr = pGraph2->ReconnectEx(pPin, pmt);
            pGraph2->Release();
            return hr;
        } else {
            return m_pGraph->Reconnect(pPin);
        }
    } else {
        return E_NOINTERFACE;
    }
}



/* This is the same idea as the media type version does for type enumeration
   on pins but for the list of pins available. So if the list of pins you
   provide changes dynamically then either override this virtual function
   to provide the version number, or more simply call IncrementPinVersion */

LONG CBaseFilter::GetPinVersion()
{
    return m_PinVersion;
}


/* Increment the current pin version cookie */

void CBaseFilter::IncrementPinVersion()
{
    InterlockedIncrement(&m_PinVersion);
}

/* register filter */

STDMETHODIMP CBaseFilter::Register()
{
    // get setup data, if it exists
    //
    LPAMOVIESETUP_FILTER psetupdata = GetSetupData();

    // check we've got data
    //
    if( NULL == psetupdata ) return S_FALSE;

    // init is ref counted so call just in case
    // we're being called cold.
    //
    HRESULT hr = CoInitialize( (LPVOID)NULL );
    ASSERT( SUCCEEDED(hr) );

    // get hold of IFilterMapper
    //
    IFilterMapper *pIFM;
    hr = CoCreateInstance( CLSID_FilterMapper
                             , NULL
                             , CLSCTX_INPROC_SERVER
                             , IID_IFilterMapper
                             , (void **)&pIFM       );
    if( SUCCEEDED(hr) )
    {
        hr = AMovieSetupRegisterFilter( psetupdata, pIFM, TRUE );
        pIFM->Release();
    }

    // and clear up
    //
    CoFreeUnusedLibraries();
    CoUninitialize();

    return NOERROR;
}


/* unregister filter */

STDMETHODIMP CBaseFilter::Unregister()
{
    // get setup data, if it exists
    //
    LPAMOVIESETUP_FILTER psetupdata = GetSetupData();

    // check we've got data
    //
    if( NULL == psetupdata ) return S_FALSE;

    // OLE init is ref counted so call
    // just in case we're being called cold.
    //
    HRESULT hr = CoInitialize( (LPVOID)NULL );
    ASSERT( SUCCEEDED(hr) );

    // get hold of IFilterMapper
    //
    IFilterMapper *pIFM;
    hr = CoCreateInstance( CLSID_FilterMapper
                             , NULL
                             , CLSCTX_INPROC_SERVER
                             , IID_IFilterMapper
                             , (void **)&pIFM       );
    if( SUCCEEDED(hr) )
    {
        hr = AMovieSetupRegisterFilter( psetupdata, pIFM, FALSE );

        // release interface
        //
        pIFM->Release();
    }

    // clear up
    //
    CoFreeUnusedLibraries();
    CoUninitialize();

    // handle one acceptable "error" - that
    // of filter not being registered!
    // (couldn't find a suitable #define'd
    // name for the error!)
    //
    if( 0x80070002 == hr)
      return NOERROR;
    else
      return hr;
}


//=====================================================================
//=====================================================================
// Implements CEnumPins
//=====================================================================
//=====================================================================


CEnumPins::CEnumPins(CBaseFilter *pFilter,
             CEnumPins *pEnumPins) :
    m_Position(0),
    m_PinCount(0),
    m_pFilter(pFilter),
    m_cRef(1),               // Already ref counted
    m_PinCache(NAME("Pin Cache"))
{

#ifdef DEBUG
    m_dwCookie = DbgRegisterObjectCreation("CEnumPins", 0);
#endif

    /* We must be owned by a filter derived from CBaseFilter */

    ASSERT(pFilter != NULL);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产一区二区三区久久影院| 最近中文字幕一区二区三区| 国产欧美日韩激情| 一区二区三区精品在线| 久久97超碰色| 91国偷自产一区二区开放时间| 日韩欧美成人一区| 亚洲综合免费观看高清完整版 | 婷婷成人激情在线网| 国产成人小视频| 欧美日本国产一区| 一区二区免费看| 成人午夜伦理影院| 日韩久久精品一区| 亚洲成a人片在线不卡一二三区| 国产成人99久久亚洲综合精品| 欧美高清www午色夜在线视频| 亚洲国产精品精华液2区45| 日本欧洲一区二区| 欧洲av在线精品| 国产精品久久久久久久久搜平片 | 欧美电影免费提供在线观看| 一区二区三区成人在线视频| 国产不卡一区视频| 337p日本欧洲亚洲大胆精品| 日韩国产成人精品| 欧美日韩www| 亚洲福利视频导航| 欧美综合视频在线观看| 最新日韩在线视频| a亚洲天堂av| 国产精品欧美极品| 国产91色综合久久免费分享| 久久久亚洲综合| 国产精品一二三四五| 精品动漫一区二区三区在线观看| 蜜桃久久av一区| 精品久久久网站| 久久99热99| 久久午夜电影网| 国产高清成人在线| 国产欧美久久久精品影院| 国产成人精品综合在线观看| 国产欧美精品在线观看| 粉嫩av一区二区三区| 欧美激情综合在线| 99视频一区二区| 一区二区三区 在线观看视频| 在线免费观看日本一区| 亚洲动漫第一页| 日韩三级免费观看| 国产一区二区三区在线观看免费 | 国产精品一级黄| 国产精品久久久久一区| 91在线你懂得| 亚洲123区在线观看| 日韩一区二区三免费高清| 麻豆国产欧美日韩综合精品二区 | 91亚洲精品一区二区乱码| 亚洲人成在线观看一区二区| 欧日韩精品视频| 日韩av在线免费观看不卡| 日韩久久久精品| 99久久久久久| 日本在线不卡一区| 国产欧美视频一区二区三区| 91片黄在线观看| 天堂久久一区二区三区| 久久影院电视剧免费观看| 99在线精品免费| 日韩国产欧美一区二区三区| 国产色一区二区| 欧美三区在线视频| 国产一区二区三区蝌蚪| 亚洲精品老司机| 久久久国产一区二区三区四区小说| 99精品视频一区二区| 日本91福利区| 亚洲女人的天堂| 久久综合色婷婷| 欧美视频在线一区二区三区| 国产一区二区三区四区在线观看 | 欧洲中文字幕精品| 韩国成人在线视频| 亚洲一区二区影院| 国产视频一区二区在线| 欧美三级日韩在线| 粉嫩av一区二区三区粉嫩| 日日夜夜一区二区| 亚洲日穴在线视频| 久久久久久久久99精品| 欧美丰满少妇xxxbbb| 99久久夜色精品国产网站| 久久精品国产一区二区三| 亚洲精品国产a| 国产日韩高清在线| 制服丝袜中文字幕一区| 9人人澡人人爽人人精品| 精品中文av资源站在线观看| 亚洲自拍偷拍麻豆| 国产精品国产三级国产普通话三级| 欧美人与禽zozo性伦| 91社区在线播放| 丁香啪啪综合成人亚洲小说| 免费人成黄页网站在线一区二区| 亚洲精品水蜜桃| 国产精品久久久久久久久搜平片| 久久综合成人精品亚洲另类欧美| 欧美无砖砖区免费| 91久久精品日日躁夜夜躁欧美| 成人综合在线观看| 国产精品一区专区| 精东粉嫩av免费一区二区三区| 日韩在线a电影| 日精品一区二区三区| 亚洲午夜久久久久久久久电影院 | 中文字幕精品三区| 欧美精品一区二区三区一线天视频| 91精品国产日韩91久久久久久| 欧美亚洲日本国产| 欧美影视一区在线| 91激情五月电影| 在线视频亚洲一区| 在线亚洲一区二区| 91久久精品国产91性色tv| 91黄色小视频| 欧美久久久久久久久久| 欧美挠脚心视频网站| 在线成人免费视频| 日韩精品一区二区三区三区免费| 欧美大尺度电影在线| 精品国产凹凸成av人网站| 久久只精品国产| 欧美激情中文不卡| 综合久久久久久久| 亚洲国产另类精品专区| 亚洲不卡av一区二区三区| 日韩二区三区四区| 国产做a爰片久久毛片| 国产精品香蕉一区二区三区| 成人免费精品视频| 在线视频综合导航| 91精品黄色片免费大全| 久久看人人爽人人| 亚洲美女在线国产| 日韩高清在线电影| 国产精品88av| 色婷婷狠狠综合| 欧美一区二区在线观看| 久久久精品人体av艺术| 亚洲三级在线免费| 日韩精品色哟哟| 国产成人在线观看免费网站| 色综合久久久久综合99| 欧美欧美欧美欧美| 久久精品在线免费观看| 亚洲免费毛片网站| 另类小说综合欧美亚洲| 94-欧美-setu| 日韩一区二区三区电影在线观看| 国产欧美一区二区精品忘忧草| 一卡二卡三卡日韩欧美| 六月丁香婷婷久久| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩欧美不卡在线观看视频| 国产精品另类一区| 日本不卡一二三| 91在线视频网址| 精品国产伦理网| 亚洲国产精品久久不卡毛片| 国产传媒日韩欧美成人| 欧美日韩精品欧美日韩精品一| 久久久久久免费| 日日夜夜免费精品视频| 91免费精品国自产拍在线不卡| 欧美大白屁股肥臀xxxxxx| 一区二区三区日韩欧美精品 | 国产欧美久久久精品影院| 亚洲成人免费在线| 成人精品免费看| 欧美精品一区二区三区蜜桃| 午夜视频在线观看一区| 成人国产一区二区三区精品| 日韩精品一区国产麻豆| 亚洲成人www| 色综合久久九月婷婷色综合| 国产午夜亚洲精品理论片色戒| 日韩av一区二区三区| 欧美性一二三区| 尤物在线观看一区| www.亚洲国产| 国产日韩欧美不卡| 国产一区二区久久| 精品久久久久久亚洲综合网| 婷婷综合五月天| 在线这里只有精品| 一区二区三区国产豹纹内裤在线| 成人国产精品免费网站| 久久精品男人天堂av| 国产精品一区2区|