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

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

?? amfilter.cpp

?? 用DirectX制作高級動畫-[Advanced.Animation.with.DirectX]
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
//------------------------------------------------------------------------------
// File: AMFilter.cpp
//
// Desc: DirectShow base classes - implements class hierarchy for streams
//       architecture.
//
// Copyright (c) 1992-2002 Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------


//=====================================================================
//=====================================================================
// The following classes are declared in this header:
//
//
// CBaseMediaFilter            Basic IMediaFilter support (abstract class)
// CBaseFilter                 Support for IBaseFilter (incl. IMediaFilter)
// CEnumPins                   Enumerate input and output pins
// CEnumMediaTypes             Enumerate the preferred pin formats
// CBasePin                    Abstract base class for IPin interface
//    CBaseOutputPin           Adds data provider member functions
//    CBaseInputPin            Implements IMemInputPin interface
// CMediaSample                Basic transport unit for IMemInputPin
// CBaseAllocator              General list guff for most allocators
//    CMemAllocator            Implements memory buffer allocation
//
//=====================================================================
//=====================================================================

#include <streams.h>



//=====================================================================
// Helpers
//=====================================================================
STDAPI CreateMemoryAllocator(IMemAllocator **ppAllocator)
{
    return CoCreateInstance(CLSID_MemoryAllocator,
                            0,
                            CLSCTX_INPROC_SERVER,
                            IID_IMemAllocator,
                            (void **)ppAllocator);
}

//  Put this one here rather than in ctlutil.cpp to avoid linking
//  anything brought in by ctlutil.cpp
STDAPI CreatePosPassThru(
    LPUNKNOWN pAgg,
    BOOL bRenderer,
    IPin *pPin,
    IUnknown **ppPassThru
)
{
    *ppPassThru = NULL;
    IUnknown *pUnkSeek;
    HRESULT hr = CoCreateInstance(CLSID_SeekingPassThru,
                                  pAgg,
                                  CLSCTX_INPROC_SERVER,
                                  IID_IUnknown,
                                  (void **)&pUnkSeek
                                 );
    if (FAILED(hr)) {
        return hr;
    }

    ISeekingPassThru *pPassThru;
    hr = pUnkSeek->QueryInterface(IID_ISeekingPassThru, (void**)&pPassThru);
    if (FAILED(hr)) {
        pUnkSeek->Release();
        return hr;
    }
    hr = pPassThru->Init(bRenderer, pPin);
    pPassThru->Release();
    if (FAILED(hr)) {
        pUnkSeek->Release();
        return hr;
    }
    *ppPassThru = pUnkSeek;
    return S_OK;
}



#define CONNECT_TRACE_LEVEL 3

//=====================================================================
//=====================================================================
// Implements CBaseMediaFilter
//=====================================================================
//=====================================================================


/* Constructor */

CBaseMediaFilter::CBaseMediaFilter(const TCHAR  *pName,
                   LPUNKNOWN    pUnk,
                   CCritSec *pLock,
                   REFCLSID clsid) :
    CUnknown(pName, pUnk),
    m_pLock(pLock),
    m_clsid(clsid),
    m_State(State_Stopped),
    m_pClock(NULL)
{
}


/* Destructor */

CBaseMediaFilter::~CBaseMediaFilter()
{
    // must be stopped, but can't call Stop here since
    // our critsec has been destroyed.

    /* Release any clock we were using */

    if (m_pClock) {
        m_pClock->Release();
        m_pClock = NULL;
    }
}


/* Override this to say what interfaces we support and where */

STDMETHODIMP
CBaseMediaFilter::NonDelegatingQueryInterface(
    REFIID riid,
    void ** ppv)
{
    if (riid == IID_IMediaFilter) {
        return GetInterface((IMediaFilter *) this, ppv);
    } else if (riid == IID_IPersist) {
        return GetInterface((IPersist *) this, ppv);
    } else {
        return CUnknown::NonDelegatingQueryInterface(riid, ppv);
    }
}

/* Return the filter's clsid */
STDMETHODIMP
CBaseMediaFilter::GetClassID(CLSID *pClsID)
{
    CheckPointer(pClsID,E_POINTER);
    ValidateReadWritePtr(pClsID,sizeof(CLSID));
    *pClsID = m_clsid;
    return NOERROR;
}

/* Override this if your state changes are not done synchronously */

STDMETHODIMP
CBaseMediaFilter::GetState(DWORD dwMSecs, FILTER_STATE *State)
{
    UNREFERENCED_PARAMETER(dwMSecs);
    CheckPointer(State,E_POINTER);
    ValidateReadWritePtr(State,sizeof(FILTER_STATE));

    *State = m_State;
    return S_OK;
}


/* Set the clock we will use for synchronisation */

STDMETHODIMP
CBaseMediaFilter::SetSyncSource(IReferenceClock *pClock)
{
    CAutoLock cObjectLock(m_pLock);

    // Ensure the new one does not go away - even if the same as the old
    if (pClock) {
        pClock->AddRef();
    }

    // if we have a clock, release it
    if (m_pClock) {
        m_pClock->Release();
    }

    // Set the new reference clock (might be NULL)
    // Should we query it to ensure it is a clock?  Consider for a debug build.
    m_pClock = pClock;

    return NOERROR;
}

/* Return the clock we are using for synchronisation */
STDMETHODIMP
CBaseMediaFilter::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;
}


/* Put the filter into a stopped state */

STDMETHODIMP
CBaseMediaFilter::Stop()
{
    CAutoLock cObjectLock(m_pLock);

    m_State = State_Stopped;
    return S_OK;
}


/* Put the filter into a paused state */

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

    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 CBaseMediaFilter::StreamTime and compare that against
// the sample timestamp.

STDMETHODIMP
CBaseMediaFilter::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;
        }
    }
    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
CBaseMediaFilter::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;
}


//=====================================================================
//=====================================================================
// Implements CBaseFilter
//=====================================================================
//=====================================================================


/* Override this to say what interfaces we support and where */

STDMETHODIMP CBaseFilter::NonDelegatingQueryInterface(REFIID riid,
                                                      void **ppv)
{
    /* Do we have this interface */

    if (riid == IID_IBaseFilter) {
        return GetInterface((IBaseFilter *) this, ppv);
    } else if (riid == IID_IMediaFilter) {
        return GetInterface((IMediaFilter *) this, ppv);
    } else if (riid == IID_IPersist) {
        return GetInterface((IPersist *) this, ppv);
    } else if (riid == IID_IAMovieSetup) {
        return GetInterface((IAMovieSetup *) this, ppv);
    } else {
        return CUnknown::NonDelegatingQueryInterface(riid, ppv);
    }
}

#ifdef DEBUG
STDMETHODIMP_(ULONG) CBaseFilter::NonDelegatingRelease()
{
    if (m_cRef == 1) {
        KASSERT(m_pGraph == NULL);
    }
    return CUnknown::NonDelegatingRelease();
}
#endif


/* Constructor */

CBaseFilter::CBaseFilter(const TCHAR    *pName,
             LPUNKNOWN  pUnk,
             CCritSec   *pLock,
             REFCLSID   clsid) :
    CUnknown( pName, pUnk ),
    m_pLock(pLock),
    m_clsid(clsid),
    m_State(State_Stopped),
    m_pClock(NULL),
    m_pGraph(NULL),
    m_pSink(NULL),
    m_pName(NULL),
    m_PinVersion(1)
{

    ASSERT(pLock != NULL);
}

/* Passes in a redundant HRESULT argument */

CBaseFilter::CBaseFilter(TCHAR     *pName,
                         LPUNKNOWN  pUnk,
                         CCritSec  *pLock,
                         REFCLSID   clsid,
                         HRESULT   *phr) :
    CUnknown( pName, pUnk ),
    m_pLock(pLock),
    m_clsid(clsid),
    m_State(State_Stopped),
    m_pClock(NULL),
    m_pGraph(NULL),
    m_pSink(NULL),
    m_pName(NULL),
    m_PinVersion(1)
{

    ASSERT(pLock != NULL);
    UNREFERENCED_PARAMETER(phr);
}

#ifdef UNICODE
CBaseFilter::CBaseFilter(const CHAR *pName,
             LPUNKNOWN  pUnk,
             CCritSec   *pLock,
             REFCLSID   clsid) :
    CUnknown( pName, pUnk ),
    m_pLock(pLock),
    m_clsid(clsid),
    m_State(State_Stopped),
    m_pClock(NULL),
    m_pGraph(NULL),
    m_pSink(NULL),
    m_pName(NULL),
    m_PinVersion(1)
{

    ASSERT(pLock != NULL);
}
CBaseFilter::CBaseFilter(CHAR     *pName,
                         LPUNKNOWN  pUnk,
                         CCritSec  *pLock,
                         REFCLSID   clsid,
                         HRESULT   *phr) :
    CUnknown( pName, pUnk ),
    m_pLock(pLock),
    m_clsid(clsid),
    m_State(State_Stopped),
    m_pClock(NULL),
    m_pGraph(NULL),
    m_pSink(NULL),
    m_pName(NULL),
    m_PinVersion(1)
{

    ASSERT(pLock != NULL);
    UNREFERENCED_PARAMETER(phr);
}
#endif

/* Destructor */

CBaseFilter::~CBaseFilter()
{

    // NOTE we do NOT hold references on the filtergraph for m_pGraph or m_pSink
    // When we did we had the circular reference problem.  Nothing would go away.

    delete[] m_pName;

    // must be stopped, but can't call Stop here since
    // our critsec has been destroyed.

    /* Release any clock we were using */
    if (m_pClock) {
        m_pClock->Release();
        m_pClock = NULL;
    }
}

/* Return the filter's clsid */
STDMETHODIMP
CBaseFilter::GetClassID(CLSID *pClsID)
{
    CheckPointer(pClsID,E_POINTER);
    ValidateReadWritePtr(pClsID,sizeof(CLSID));
    *pClsID = m_clsid;
    return NOERROR;
}

/* Override this if your state changes are not done synchronously */
STDMETHODIMP
CBaseFilter::GetState(DWORD dwMSecs, FILTER_STATE *State)
{
    UNREFERENCED_PARAMETER(dwMSecs);
    CheckPointer(State,E_POINTER);
    ValidateReadWritePtr(State,sizeof(FILTER_STATE));

    *State = m_State;
    return S_OK;
}


/* Set the clock we will use for synchronisation */

STDMETHODIMP
CBaseFilter::SetSyncSource(IReferenceClock *pClock)
{
    CAutoLock cObjectLock(m_pLock);

    // Ensure the new one does not go away - even if the same as the old
    if (pClock) {
        pClock->AddRef();
    }

    // if we have a clock, release it
    if (m_pClock) {
        m_pClock->Release();
    }

    // Set the new reference clock (might be NULL)
    // Should we query it to ensure it is a clock?  Consider for a debug build.
    m_pClock = pClock;

    return NOERROR;
}

/* Return the clock we are using for synchronisation */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日产国产高清一区二区三区| 9191成人精品久久| 中文字幕一区免费在线观看| 亚洲午夜成aⅴ人片| 国模少妇一区二区三区| 91黄色激情网站| 日韩欧美视频在线| 一区二区三区欧美激情| 日韩高清一区二区| 一本大道久久a久久综合| 欧美成人欧美edvon| 亚洲午夜久久久久久久久电影网| 狠狠色丁香婷婷综合| 精品视频999| 自拍偷拍国产精品| 国产福利不卡视频| 精品99久久久久久| 日本欧美一区二区| 欧美怡红院视频| 国产精品美女久久久久久久| 精品中文av资源站在线观看| 在线电影一区二区三区| 亚洲在线视频免费观看| 91蝌蚪porny九色| 国产精品伦一区| 风间由美一区二区av101| 26uuu国产日韩综合| 奇米影视7777精品一区二区| 欧美高清dvd| 五月婷婷另类国产| 欧美日韩国产美女| 五月综合激情婷婷六月色窝| 欧美日韩精品二区第二页| 亚洲国产一区二区在线播放| 91浏览器打开| 亚洲色欲色欲www在线观看| 成人18视频在线播放| 最新国产精品久久精品| 91丝袜国产在线播放| 日本一区二区电影| av中文字幕在线不卡| 国产精品成人网| 色综合久久中文字幕| 日韩美女精品在线| 色噜噜狠狠成人网p站| 亚洲综合一二三区| 91精品欧美综合在线观看最新 | 亚洲综合一区在线| 欧美午夜精品一区二区三区| 天天亚洲美女在线视频| 欧美一区二区三区影视| 国产在线国偷精品产拍免费yy | 日本麻豆一区二区三区视频| 日韩欧美国产三级| 国产精品一级在线| 1024成人网| 欧美美女激情18p| 久久99精品久久久久久动态图| 久久久久久麻豆| 97精品超碰一区二区三区| 亚洲午夜视频在线| 日韩欧美中文一区| 不卡一区在线观看| 亚洲午夜精品17c| 久久久久久久久久久电影| 成人av电影在线观看| 亚洲成人av一区二区| 精品免费一区二区三区| 成人av电影在线| 午夜久久久久久电影| 国产婷婷色一区二区三区在线| 色香蕉久久蜜桃| 久久99这里只有精品| 一区在线中文字幕| 日韩欧美电影在线| 一本大道综合伊人精品热热 | 亚洲激情成人在线| 精品精品国产高清a毛片牛牛| 成人精品鲁一区一区二区| 亚洲777理论| 国产精品区一区二区三| 欧美日韩高清在线播放| 成人黄色a**站在线观看| 青娱乐精品在线视频| 中文字幕日韩精品一区| 精品久久久久久综合日本欧美| 99久久精品费精品国产一区二区| 日本va欧美va精品| 亚洲精品第一国产综合野| 欧美精品一区男女天堂| 欧美精品一二三| 色综合色狠狠天天综合色| 国产一区二区视频在线| 天堂资源在线中文精品| 国产精品伦一区| 久久精品人人做| 欧美一级一区二区| 欧美性猛片aaaaaaa做受| 成人免费视频一区二区| 国产毛片精品视频| 免费人成在线不卡| 香蕉成人伊视频在线观看| 亚洲丝袜自拍清纯另类| 中文在线资源观看网站视频免费不卡| 日韩区在线观看| 欧美一级日韩不卡播放免费| 欧美性受xxxx黑人xyx性爽| 99久久婷婷国产精品综合| 国产精品一区二区久久不卡 | 日韩欧美激情一区| 欧美丰满高潮xxxx喷水动漫 | 成人免费看黄yyy456| 国产丶欧美丶日本不卡视频| 久久电影国产免费久久电影 | 国产精品小仙女| 国产资源在线一区| 国产伦精品一区二区三区视频青涩| 奇米影视一区二区三区小说| 日韩成人伦理电影在线观看| 天堂成人免费av电影一区| 日韩激情av在线| 国产精品99久久久久久久女警| 另类小说综合欧美亚洲| 美国十次了思思久久精品导航| 奇米在线7777在线精品| 秋霞午夜鲁丝一区二区老狼| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产一区二区女| 国产sm精品调教视频网站| 成人激情免费网站| 色呦呦一区二区三区| 5566中文字幕一区二区电影| 欧美一区二区高清| 国产喂奶挤奶一区二区三区| 国产精品动漫网站| 亚洲h在线观看| 久久精品久久精品| 成人免费毛片片v| 色又黄又爽网站www久久| 欧美日韩免费观看一区二区三区| 在线91免费看| 中文字幕乱码亚洲精品一区| 亚洲欧美影音先锋| 日韩国产欧美在线播放| 国产精品资源站在线| 99久久精品久久久久久清纯| 欧美日韩一区精品| 久久午夜羞羞影院免费观看| 亚洲男人的天堂在线aⅴ视频| 亚洲成在线观看| 国产精品一二三四区| 色婷婷综合久久久中文字幕| 日韩欧美一区二区视频| 综合色中文字幕| 久久精品久久精品| 色999日韩国产欧美一区二区| 欧美电影免费观看高清完整版在| 亚洲欧洲日本在线| 久久国产综合精品| 91久久精品国产91性色tv| 精品成人在线观看| 亚洲国产视频一区二区| 国产精品一区二区三区99| 欧美日韩三级在线| 国产欧美一区二区在线| 五月天丁香久久| 粉嫩绯色av一区二区在线观看| 欧美在线播放高清精品| 成人av在线看| 精品国产第一区二区三区观看体验| 中文字幕精品三区| 一区二区三区视频在线观看| 男女男精品视频| 99精品视频一区二区| 日韩一级片网站| 一区二区视频在线| 激情五月婷婷综合| 97久久精品人人爽人人爽蜜臀 | 国产在线视视频有精品| 93久久精品日日躁夜夜躁欧美| 欧美军同video69gay| 中文字幕中文乱码欧美一区二区| 精品一区二区在线播放| 一本色道久久综合亚洲aⅴ蜜桃 | 成人性生交大片免费看中文| 欧美一区永久视频免费观看| 国产精品色噜噜| 麻豆精品在线观看| 粉嫩高潮美女一区二区三区| 2021国产精品久久精品| 亚洲大片免费看| 99re这里只有精品视频首页| 国产精品欧美经典| 久久99国产精品免费| 精品视频一区二区不卡| 国产精品色呦呦| 成人18精品视频| 国产日韩精品一区| 日本sm残虐另类| 欧美白人最猛性xxxxx69交|