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

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

?? source.cpp

?? 用DirectX制作高級動畫-[Advanced.Animation.with.DirectX]
?? CPP
字號:
//------------------------------------------------------------------------------
// File: Source.cpp
//
// Desc: DirectShow  base classes - implements CSource, which is a Quartz
//       source filter 'template.'
//
// Copyright (c) 1992-2002 Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------


// Locking Strategy.
//
// Hold the filter critical section (m_pFilter->pStateLock()) to serialise
// access to functions. Note that, in general, this lock may be held
// by a function when the worker thread may want to hold it. Therefore
// if you wish to access shared state from the worker thread you will
// need to add another critical section object. The execption is during
// the threads processing loop, when it is safe to get the filter critical
// section from within FillBuffer().

#include <streams.h>


//
// CSource::Constructor
//
// Initialise the pin count for the filter. The user will create the pins in
// the derived class.
CSource::CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid)
    : CBaseFilter(pName, lpunk, &m_cStateLock, clsid),
      m_iPins(0),
      m_paStreams(NULL)
{
}

CSource::CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr)
    : CBaseFilter(pName, lpunk, &m_cStateLock, clsid),
      m_iPins(0),
      m_paStreams(NULL)
{
    UNREFERENCED_PARAMETER(phr);
}

#ifdef UNICODE
CSource::CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid)
    : CBaseFilter(pName, lpunk, &m_cStateLock, clsid),
      m_iPins(0),
      m_paStreams(NULL)
{
}

CSource::CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr)
    : CBaseFilter(pName, lpunk, &m_cStateLock, clsid),
      m_iPins(0),
      m_paStreams(NULL)
{
    UNREFERENCED_PARAMETER(phr);
}
#endif

//
// CSource::Destructor
//
CSource::~CSource()
{
    /*  Free our pins and pin array */
    while (m_iPins != 0) {
	// deleting the pins causes them to be removed from the array...
	delete m_paStreams[m_iPins - 1];
    }

    ASSERT(m_paStreams == NULL);
}


//
//  Add a new pin
//
HRESULT CSource::AddPin(CSourceStream *pStream)
{
    CAutoLock lock(&m_cStateLock);

    /*  Allocate space for this pin and the old ones */
    CSourceStream **paStreams = new CSourceStream *[m_iPins + 1];
    if (paStreams == NULL) {
        return E_OUTOFMEMORY;
    }
    if (m_paStreams != NULL) {
        CopyMemory((PVOID)paStreams, (PVOID)m_paStreams,
                   m_iPins * sizeof(m_paStreams[0]));
        paStreams[m_iPins] = pStream;
        delete [] m_paStreams;
    }
    m_paStreams = paStreams;
    m_paStreams[m_iPins] = pStream;
    m_iPins++;
    return S_OK;
}

//
//  Remove a pin - pStream is NOT deleted
//
HRESULT CSource::RemovePin(CSourceStream *pStream)
{
    int i;
    for (i = 0; i < m_iPins; i++) {
        if (m_paStreams[i] == pStream) {
            if (m_iPins == 1) {
                delete [] m_paStreams;
                m_paStreams = NULL;
            } else {
                /*  no need to reallocate */
		while (++i < m_iPins)
		    m_paStreams[i - 1] = m_paStreams[i];
            }
            m_iPins--;
            return S_OK;
        }
    }
    return S_FALSE;
}

//
// FindPin
//
// Set *ppPin to the IPin* that has the id Id.
// or to NULL if the Id cannot be matched.
STDMETHODIMP CSource::FindPin(LPCWSTR Id, IPin **ppPin)
{
    CheckPointer(ppPin,E_POINTER);
    ValidateReadWritePtr(ppPin,sizeof(IPin *));
    // The -1 undoes the +1 in QueryId and ensures that totally invalid
    // strings (for which WstrToInt delivers 0) give a deliver a NULL pin.
    int i = WstrToInt(Id) -1;
    *ppPin = GetPin(i);
    if (*ppPin!=NULL){
        (*ppPin)->AddRef();
        return NOERROR;
    } else {
        return VFW_E_NOT_FOUND;
    }
}

//
// FindPinNumber
//
// return the number of the pin with this IPin* or -1 if none
int CSource::FindPinNumber(IPin *iPin) {
    int i;
    for (i=0; i<m_iPins; ++i) {
        if ((IPin *)(m_paStreams[i])==iPin) {
            return i;
        }
    }
    return -1;
}

//
// GetPinCount
//
// Returns the number of pins this filter has
int CSource::GetPinCount(void) {

    CAutoLock lock(&m_cStateLock);
    return m_iPins;
}


//
// GetPin
//
// Return a non-addref'd pointer to pin n
// needed by CBaseFilter
CBasePin *CSource::GetPin(int n) {

    CAutoLock lock(&m_cStateLock);

    // n must be in the range 0..m_iPins-1
    // if m_iPins>n  && n>=0 it follows that m_iPins>0
    // which is what used to be checked (i.e. checking that we have a pin)
    if ((n >= 0) && (n < m_iPins)) {

        ASSERT(m_paStreams[n]);
	return m_paStreams[n];
    }
    return NULL;
}


//


// *
// * --- CSourceStream ----
// *

//
// Set Id to point to a CoTaskMemAlloc'd
STDMETHODIMP CSourceStream::QueryId(LPWSTR *Id) {
    CheckPointer(Id,E_POINTER);
    ValidateReadWritePtr(Id,sizeof(LPWSTR));

    // We give the pins id's which are 1,2,...
    // FindPinNumber returns -1 for an invalid pin
    int i = 1+ m_pFilter->FindPinNumber(this);
    if (i<1) return VFW_E_NOT_FOUND;
    *Id = (LPWSTR)CoTaskMemAlloc(8);
    if (*Id==NULL) {
       return E_OUTOFMEMORY;
    }
    IntToWstr(i, *Id);
    return NOERROR;
}



//
// CSourceStream::Constructor
//
// increments the number of pins present on the filter
CSourceStream::CSourceStream(
    TCHAR *pObjectName,
    HRESULT *phr,
    CSource *ps,
    LPCWSTR pPinName)
    : CBaseOutputPin(pObjectName, ps, ps->pStateLock(), phr, pPinName),
      m_pFilter(ps) {

     *phr = m_pFilter->AddPin(this);
}

#ifdef UNICODE
CSourceStream::CSourceStream(
    char *pObjectName,
    HRESULT *phr,
    CSource *ps,
    LPCWSTR pPinName)
    : CBaseOutputPin(pObjectName, ps, ps->pStateLock(), phr, pPinName),
      m_pFilter(ps) {

     *phr = m_pFilter->AddPin(this);
}
#endif
//
// CSourceStream::Destructor
//
// Decrements the number of pins on this filter
CSourceStream::~CSourceStream(void) {

     m_pFilter->RemovePin(this);
}


//
// CheckMediaType
//
// Do we support this type? Provides the default support for 1 type.
HRESULT CSourceStream::CheckMediaType(const CMediaType *pMediaType) {

    CAutoLock lock(m_pFilter->pStateLock());

    CMediaType mt;
    GetMediaType(&mt);

    if (mt == *pMediaType) {
        return NOERROR;
    }

    return E_FAIL;
}


//
// GetMediaType/3
//
// By default we support only one type
// iPosition indexes are 0-n
HRESULT CSourceStream::GetMediaType(int iPosition, CMediaType *pMediaType) {

    CAutoLock lock(m_pFilter->pStateLock());

    if (iPosition<0) {
        return E_INVALIDARG;
    }
    if (iPosition>0) {
        return VFW_S_NO_MORE_ITEMS;
    }
    return GetMediaType(pMediaType);
}


//
// Active
//
// The pin is active - start up the worker thread
HRESULT CSourceStream::Active(void) {

    CAutoLock lock(m_pFilter->pStateLock());

    HRESULT hr;

    if (m_pFilter->IsActive()) {
	return S_FALSE;	// succeeded, but did not allocate resources (they already exist...)
    }

    // do nothing if not connected - its ok not to connect to
    // all pins of a source filter
    if (!IsConnected()) {
        return NOERROR;
    }

    hr = CBaseOutputPin::Active();
    if (FAILED(hr)) {
        return hr;
    }

    ASSERT(!ThreadExists());

    // start the thread
    if (!Create()) {
        return E_FAIL;
    }

    // Tell thread to initialize. If OnThreadCreate Fails, so does this.
    hr = Init();
    if (FAILED(hr))
	return hr;

    return Pause();
}


//
// Inactive
//
// Pin is inactive - shut down the worker thread
// Waits for the worker to exit before returning.
HRESULT CSourceStream::Inactive(void) {

    CAutoLock lock(m_pFilter->pStateLock());

    HRESULT hr;

    // do nothing if not connected - its ok not to connect to
    // all pins of a source filter
    if (!IsConnected()) {
        return NOERROR;
    }

    // !!! need to do this before trying to stop the thread, because
    // we may be stuck waiting for our own allocator!!!

    hr = CBaseOutputPin::Inactive();  // call this first to Decommit the allocator
    if (FAILED(hr)) {
	return hr;
    }

    if (ThreadExists()) {
	hr = Stop();

	if (FAILED(hr)) {
	    return hr;
	}

	hr = Exit();
	if (FAILED(hr)) {
	    return hr;
	}

	Close();	// Wait for the thread to exit, then tidy up.
    }

    // hr = CBaseOutputPin::Inactive();  // call this first to Decommit the allocator
    //if (FAILED(hr)) {
    //	return hr;
    //}

    return NOERROR;
}


//
// ThreadProc
//
// When this returns the thread exits
// Return codes > 0 indicate an error occured
DWORD CSourceStream::ThreadProc(void) {

    HRESULT hr;  // the return code from calls
    Command com;

    do {
	com = GetRequest();
	if (com != CMD_INIT) {
	    DbgLog((LOG_ERROR, 1, TEXT("Thread expected init command")));
	    Reply((DWORD) E_UNEXPECTED);
	}
    } while (com != CMD_INIT);

    DbgLog((LOG_TRACE, 1, TEXT("CSourceStream worker thread initializing")));

    hr = OnThreadCreate(); // perform set up tasks
    if (FAILED(hr)) {
        DbgLog((LOG_ERROR, 1, TEXT("CSourceStream::OnThreadCreate failed. Aborting thread.")));
        OnThreadDestroy();
	Reply(hr);	// send failed return code from OnThreadCreate
        return 1;
    }

    // Initialisation suceeded
    Reply(NOERROR);

    Command cmd;
    do {
	cmd = GetRequest();

	switch (cmd) {

	case CMD_EXIT:
	    Reply(NOERROR);
	    break;

	case CMD_RUN:
	    DbgLog((LOG_ERROR, 1, TEXT("CMD_RUN received before a CMD_PAUSE???")));
	    // !!! fall through???
	
	case CMD_PAUSE:
	    Reply(NOERROR);
	    DoBufferProcessingLoop();
	    break;

	case CMD_STOP:
	    Reply(NOERROR);
	    break;

	default:
	    DbgLog((LOG_ERROR, 1, TEXT("Unknown command %d received!"), cmd));
	    Reply((DWORD) E_NOTIMPL);
	    break;
	}
    } while (cmd != CMD_EXIT);

    hr = OnThreadDestroy();	// tidy up.
    if (FAILED(hr)) {
        DbgLog((LOG_ERROR, 1, TEXT("CSourceStream::OnThreadDestroy failed. Exiting thread.")));
        return 1;
    }

    DbgLog((LOG_TRACE, 1, TEXT("CSourceStream worker thread exiting")));
    return 0;
}


//
// DoBufferProcessingLoop
//
// Grabs a buffer and calls the users processing function.
// Overridable, so that different delivery styles can be catered for.
HRESULT CSourceStream::DoBufferProcessingLoop(void) {

    Command com;

    OnThreadStartPlay();

    do {
	while (!CheckRequest(&com)) {

	    IMediaSample *pSample;

	    HRESULT hr = GetDeliveryBuffer(&pSample,NULL,NULL,0);
	    if (FAILED(hr)) {
                Sleep(1);
		continue;	// go round again. Perhaps the error will go away
			    // or the allocator is decommited & we will be asked to
			    // exit soon.
	    }

	    // Virtual function user will override.
	    hr = FillBuffer(pSample);

	    if (hr == S_OK) {
		hr = Deliver(pSample);
                pSample->Release();

                // downstream filter returns S_FALSE if it wants us to
                // stop or an error if it's reporting an error.
                if(hr != S_OK)
                {
                  DbgLog((LOG_TRACE, 2, TEXT("Deliver() returned %08x; stopping"), hr));
                  return S_OK;
                }

	    } else if (hr == S_FALSE) {
                // derived class wants us to stop pushing data
		pSample->Release();
		DeliverEndOfStream();
		return S_OK;
	    } else {
                // derived class encountered an error
                pSample->Release();
		DbgLog((LOG_ERROR, 1, TEXT("Error %08lX from FillBuffer!!!"), hr));
                DeliverEndOfStream();
                m_pFilter->NotifyEvent(EC_ERRORABORT, hr, 0);
                return hr;
	    }

            // all paths release the sample
	}

        // For all commands sent to us there must be a Reply call!

	if (com == CMD_RUN || com == CMD_PAUSE) {
	    Reply(NOERROR);
	} else if (com != CMD_STOP) {
	    Reply((DWORD) E_UNEXPECTED);
	    DbgLog((LOG_ERROR, 1, TEXT("Unexpected command!!!")));
	}
    } while (com != CMD_STOP);

    return S_FALSE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
婷婷激情综合网| 国产真实乱对白精彩久久| 香蕉乱码成人久久天堂爱免费| 午夜视频一区在线观看| 国模套图日韩精品一区二区| 99久久精品免费精品国产| 51精品国自产在线| 亚洲欧美日韩精品久久久久| 麻豆91在线看| 色av一区二区| 亚洲国产精品av| 美女尤物国产一区| 色先锋aa成人| 国产精品不卡视频| 国内成人精品2018免费看| 欧美日韩另类国产亚洲欧美一级| 国产精品女人毛片| 精品亚洲porn| 日韩一区二区免费在线观看| 亚洲精品中文在线| av中文字幕在线不卡| 精品盗摄一区二区三区| 日韩高清一级片| 欧美在线免费播放| 1000部国产精品成人观看| 国产成人综合亚洲网站| 亚洲精品一线二线三线| 美女视频黄a大片欧美| 欧美日韩精品一区二区| 一级做a爱片久久| 91免费观看视频在线| 国产精品色噜噜| 高清在线不卡av| 国产婷婷色一区二区三区 | 精品久久久久久最新网址| 亚洲国产三级在线| 欧美三级日韩在线| 香蕉成人啪国产精品视频综合网 | 日韩欧美成人一区| 日本特黄久久久高潮| 制服.丝袜.亚洲.中文.综合| 亚洲高清久久久| 欧美日韩美女一区二区| 日韩成人免费在线| 日韩视频一区在线观看| 极品少妇一区二区| 久久久久久久精| 成人午夜伦理影院| 中文字幕日韩精品一区 | 国产一区二区伦理片| 精品电影一区二区| 成人爱爱电影网址| 亚洲精品国产第一综合99久久| 色综合激情久久| 亚洲6080在线| 欧美videos大乳护士334| 日韩高清不卡一区二区三区| 精品国产123| 91在线视频观看| 性感美女极品91精品| 精品美女一区二区| 91一区一区三区| 三级欧美韩日大片在线看| 欧美mv和日韩mv国产网站| 国产99精品视频| 亚洲一区二区三区四区不卡| 91精品国产综合久久福利软件| 国产在线精品一区二区三区不卡| 成人欧美一区二区三区1314| 欧美三级日韩三级国产三级| 精品一区二区三区视频在线观看 | 精品一区在线看| 国产精品久线在线观看| 欧美人妖巨大在线| 国产99久久久精品| 天堂一区二区在线| 国产精品久久一级| 欧美一区二区成人| 91丝袜高跟美女视频| 久久精品国产免费看久久精品| 国产精品免费久久久久| 欧美一区二区三区爱爱| 97精品久久久久中文字幕| 日本成人在线网站| 亚洲日本免费电影| 久久久久久久综合狠狠综合| 欧美在线观看视频在线| 丁香啪啪综合成人亚洲小说 | 欧美性videosxxxxx| 国产一级精品在线| 99精品国产一区二区三区不卡| 亚洲成a人片在线观看中文| 国产欧美1区2区3区| 4438x成人网最大色成网站| 99亚偷拍自图区亚洲| 国产精品综合一区二区| 日本不卡一区二区三区高清视频| ●精品国产综合乱码久久久久| 久久人人爽人人爽| 欧美不卡在线视频| 欧美男同性恋视频网站| 在线视频国产一区| 99九九99九九九视频精品| 国产寡妇亲子伦一区二区| 日本aⅴ免费视频一区二区三区| 亚洲天堂a在线| 亚洲欧洲另类国产综合| 国产精品毛片大码女人| 亚洲精品在线网站| 精品国偷自产国产一区| 欧美精品丝袜中出| 欧美日韩成人一区二区| 欧美日韩一区二区在线视频| 日本久久一区二区| 在线一区二区三区做爰视频网站| 成人免费观看av| www.爱久久.com| av动漫一区二区| 91在线观看免费视频| 91啦中文在线观看| 欧洲av在线精品| 欧美日韩精品电影| 91精品国产色综合久久不卡蜜臀| 欧美精品日韩精品| 欧美一区二区视频在线观看| 91精品国产综合久久久久久漫画| 欧美日韩一级二级三级| 678五月天丁香亚洲综合网| 51午夜精品国产| 精品国产乱码久久久久久老虎 | 亚洲一二三四在线| 午夜精品免费在线| 强制捆绑调教一区二区| 久久成人免费网站| 国产一区二区三区精品视频| 成人午夜视频网站| 日本二三区不卡| 欧美日韩国产综合草草| 欧美成人猛片aaaaaaa| 久久免费视频一区| 国产精品美女久久久久久2018| 亚洲人精品一区| 午夜精品成人在线| 国产一区二区在线观看免费| 成人理论电影网| 一本到一区二区三区| 91精品国产福利在线观看| 国产亚洲女人久久久久毛片| 亚洲少妇中出一区| 日韩高清在线一区| 成人一区二区视频| 欧美另类z0zxhd电影| 2021中文字幕一区亚洲| 综合久久久久久久| 久久国产福利国产秒拍| 成人免费看片app下载| 欧美日韩国产大片| 欧美国产精品一区二区三区| 亚洲成人久久影院| 成人高清免费观看| 91精品国产黑色紧身裤美女| 欧美国产激情二区三区| 视频一区二区三区在线| 成人影视亚洲图片在线| 日韩丝袜美女视频| 玉米视频成人免费看| 国产尤物一区二区| 欧美精品电影在线播放| 国产精品入口麻豆原神| 美国十次综合导航| 久久麻豆一区二区| 婷婷亚洲久悠悠色悠在线播放| 成人在线视频一区二区| 精品久久国产老人久久综合| 一区二区三区在线免费| 国产91精品露脸国语对白| 日韩一区国产二区欧美三区| 亚洲欧美福利一区二区| 国产精品亚洲综合一区在线观看| 欧美丰满少妇xxxbbb| 亚洲精品日韩专区silk| 风间由美性色一区二区三区| 日韩欧美国产综合| 亚洲国产精品久久人人爱蜜臀 | 日本中文在线一区| 色拍拍在线精品视频8848| 国产色产综合产在线视频| 喷白浆一区二区| 欧美日韩一区二区欧美激情 | 久久久久久电影| 日本亚洲三级在线| 欧美日韩午夜在线视频| 夜夜嗨av一区二区三区四季av| 成人午夜在线视频| 国产日韩视频一区二区三区| 精品一区二区三区欧美| 日韩视频在线你懂得| 日本美女一区二区三区| 欧美一区二区三区四区五区 | 蜜桃一区二区三区四区|