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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cfiltermpeg2dec.cpp

?? mpeg2 decoder filter過濾服務(wù)端
?? CPP
字號:
//
// CFilterMpeg2Dec.cpp
//

#include <streams.h>          // quartz, includes windows
// Eliminate two expected level 4 warnings from the Microsoft compiler.
// The class does not have an assignment or copy operator, and so cannot
// be passed by value.  This is normal.  This file compiles clean at the
// highest (most picky) warning level (-W4).
#pragma warning(disable: 4511 4512)

#include <measure.h>          // performance measurement (MSR_)
#include <initguid.h>

#if (1100 > _MSC_VER)
#include <olectlid.h>
#else
#include <olectl.h>
#endif

#include <dvdmedia.h>
#include <stdio.h>

#include "CFilterMpeg2Dec.h"
#include "CFilterMpeg2DecInputPin.h"
#include "CDecodedStream.h"


// {151CFBD1-4626-49b8-9D22-C8A8132DA494}
DEFINE_GUID(CLSID_MyFilterMpeg2Dec, 
			0x151cfbd1, 0x4626, 0x49b8, 0x9d, 0x22, 0xc8, 0xa8, 0x13, 0x2d, 0xa4, 0x94);





//
// setup data
//
const AMOVIESETUP_MEDIATYPE sudPinTypes0 =
{
    &MEDIATYPE_Stream,           // Major type
	&MEDIASUBTYPE_MPEG2_PROGRAM          // Minor type
};

const AMOVIESETUP_MEDIATYPE sudPinTypes1 =
{
    &MEDIATYPE_Video,           // Major type
    &MEDIASUBTYPE_NULL          // Minor type
};

const AMOVIESETUP_MEDIATYPE sudPinTypes2 =
{
    &MEDIATYPE_Audio,           // Major type
	&MEDIASUBTYPE_NULL          // Minor type
};

const AMOVIESETUP_PIN psudPins[] =
{
    {
        L"Input",           // String pin name
        FALSE,              // Is it rendered
        FALSE,              // Is it an output
        FALSE,              // Allowed none
        FALSE,              // Allowed many
        &CLSID_NULL,        // Connects to filter
        L"Output",          // Connects to pin
        1,                  // Number of types
        &sudPinTypes0 },     // The pin details
      { L"VOutput",          // String pin name
        FALSE,              // Is it rendered
        TRUE,               // Is it an output
        FALSE,              // Allowed none
        FALSE,              // Allowed many
        &CLSID_NULL,        // Connects to filter
        L"Input",           // Connects to pin
        1,                  // Number of types
        &sudPinTypes1        // The pin details
    },
		{ L"AOutput",          // String pin name
        FALSE,              // Is it rendered
        TRUE,               // Is it an output
        FALSE,              // Allowed none
        FALSE,              // Allowed many
        &CLSID_NULL,        // Connects to filter
        L"Input",           // Connects to pin
        1,                  // Number of types
        &sudPinTypes2        // The pin details
		}
};


const AMOVIESETUP_FILTER sudFilter =
{
    &CLSID_MyFilterMpeg2Dec,       // Filter CLSID
    L"My Mpeg2Dec Filter",      // Filter name
    MERIT_PREFERRED,            // Its merit
    3,                       // Number of pins
    psudPins                 // Pin details
};


// List of class IDs and creator functions for the class factory. This
// provides the link between the OLE entry point in the DLL and an object
// being created. The class factory will call the static CreateInstance
CFactoryTemplate g_Templates[] = 
{
    { 
		L"My Mpeg2Dec Filter",
		&CLSID_MyFilterMpeg2Dec,
		CFilterMpeg2Dec::CreateInstance,
		NULL,
		&sudFilter 
	}
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);


static int decoderInstances = 0;
// ----------------------------------------------------------------------------
//            Filter implementation
// ----------------------------------------------------------------------------
CFilterMpeg2Dec::CFilterMpeg2Dec(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr) :
CSource(tszName, punk, CLSID_MyFilterMpeg2Dec)
{	
	decoderInstances++;

	mSampleDuration = 0;
	mImageWidth     = 0;
	mImageHeight    = 0;
	mOutputImageSize = 0;

	mIsFlushing    = FALSE;
	mEOSDelivered  = FALSE;
	mEOSReceived   = FALSE;

	*phr = NOERROR;
	mMpegInputPin = NULL;
	CDecodedStream * outStream = new CDecodedStream(NAME("VOutput"), phr, this);
	if (outStream == NULL)
	{
		*phr = E_OUTOFMEMORY;	
	}
	else
	{
		outStream->SetController(&mMpeg2Controller);
		// 添加處理類構(gòu)造函數(shù)
	}
}

CFilterMpeg2Dec::~CFilterMpeg2Dec()
{
	if (mMpegInputPin)
	{
		delete mMpegInputPin;
		mMpegInputPin = NULL;
	}
	decoderInstances--;
}

//
// CreateInstance
//
// Override CClassFactory method.
// Provide the way for COM to create a CNullInPlace object
//
CUnknown * WINAPI CFilterMpeg2Dec::CreateInstance(LPUNKNOWN punk, HRESULT *phr) 
{
#if 0
	char    szCreatorPath[256], szCreatorName[256];
	::strcpy(szCreatorPath, "");
	::strcpy(szCreatorName, "");
	HMODULE hModule = ::GetModuleHandle(NULL);
	::GetModuleFileName(hModule, szCreatorPath, 256);
	char * backSlash = ::strrchr(szCreatorPath, '\\');
	if (backSlash)
	{
		strcpy(szCreatorName, backSlash);
	}
	::_strlwr(szCreatorName);
	// Please specify your app name with lowercase
	if (::strstr(szCreatorName, "graphedt") == NULL)
	{
		*phr = E_FAIL;
		return NULL;
	}
#endif 

	// Never use more than two instances of this decoder in the same application
	// Beccause of global variable problems!
	// 2002-12-26
	if (decoderInstances == 1)
	{
		*phr = E_FAIL;
		return NULL;
	}

    CFilterMpeg2Dec *pNewObject = new CFilterMpeg2Dec(NAME("My Mpeg2Dec Filter"), punk, phr);
    if (pNewObject == NULL) 
	{
        *phr = E_OUTOFMEMORY;
    }
    return pNewObject;

} 

//
// Basic COM - used here to reveal our own interfaces
STDMETHODIMP CFilterMpeg2Dec::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
{
	CheckPointer(ppv, E_POINTER);
	
//	if (riid == IID_ISpecifyPropertyPages) 
//	{
	//	return GetInterface((ISpecifyPropertyPages *) this, ppv);
//	}
//	else 
	{
        return CSource::NonDelegatingQueryInterface(riid, ppv);
    }
} // NonDelegatingQueryInterface

int CFilterMpeg2Dec::GetPinCount()
{
	return 2;
}

CBasePin * CFilterMpeg2Dec::GetPin(int n)
{
	if (mMpegInputPin == NULL)
	{
		HRESULT hr = NOERROR;
		mMpegInputPin = new CFilterMpeg2DecInputPin(NAME("TS Input"), this, &hr);
		ASSERT(mMpegInputPin);
	}

	switch (n)
	{
	case 0:
		return mMpegInputPin;
	case 1:
		return m_paStreams[0];
	default:
		return NULL;
	}
}

STDMETHODIMP CFilterMpeg2Dec::FindPin(LPCWSTR Id, IPin ** ppPin)
{
	return CBaseFilter::FindPin(Id, ppPin);
}

STDMETHODIMP CFilterMpeg2Dec::Stop()
{
	CAutoLock lck1(&m_cStateLock);
	if (m_State == State_Stopped) 
	{
		return NOERROR;
	}

	// Succeed the Stop if we are not completely connected
	ASSERT(mMpegInputPin == NULL || m_paStreams[0] != NULL);
	if (mMpegInputPin == NULL || mMpegInputPin->IsConnected() == FALSE ||
		m_paStreams[0]->IsConnected() == FALSE) 
	{
		m_State = State_Stopped;
		mEOSDelivered = FALSE;
		return NOERROR;
	}

	// Important!!! Refuse to receive any more samples
	mMpeg2Controller.FlushAllPending();
	// decommit the input pin before locking or we can deadlock
	mMpegInputPin->Inactive();	

	// synchronize with Receive calls
	CAutoLock lck2(&m_csReceive);
	OutputPin()->BeginFlush();
	OutputPin()->Inactive();
	OutputPin()->EndFlush();

	// allow a class derived from CTransformFilter
	// to know about starting and stopping streaming
	HRESULT hr = StopStreaming();
	if (SUCCEEDED(hr)) 
	{
		// complete the state transition
		m_State = State_Stopped;
		mEOSDelivered = FALSE;
	}
	return hr;
}

STDMETHODIMP CFilterMpeg2Dec::Pause()
{
	CAutoLock lck(&m_cStateLock);
	
	HRESULT hr = NOERROR;
	if (m_State == State_Paused) 
	{
		// (This space left deliberately blank)
	}
	
	// If we have no input pin or it isn't yet connected then when we are
	// asked to pause we deliver an end of stream to the downstream filter.
	// This makes sure that it doesn't sit there forever waiting for
	// samples which we cannot ever deliver without an input connection.
	else if (mMpegInputPin == NULL || mMpegInputPin->IsConnected() == FALSE) 
	{
		if(m_paStreams[0]->IsConnected() && mEOSDelivered == FALSE) 
		{
			m_paStreams[0]->DeliverEndOfStream();
			mEOSDelivered = TRUE;
		}
		m_State = State_Paused;
	}

	// We may have an input connection but no output connection
	// However, if we have an input pin we do have an output pin
	else if (m_paStreams[0]->IsConnected() == FALSE) 
	{
		m_State = State_Paused;
	}
	else 
	{
		if (m_State == State_Stopped) 
		{
			// allow a class derived from CTransformFilter
			// to know about starting and stopping streaming
			CAutoLock lck2(&m_csReceive);
			hr = StartStreaming();
		}
		if (SUCCEEDED(hr)) 
		{
			// Make sure the receive not blocking
			// Make sure the out-sending thread not working
			mMpeg2Controller.FlushAllPending();

			hr = CBaseFilter::Pause();
		}
	}
	return hr;
}

HRESULT CFilterMpeg2Dec::StartStreaming()
{
	mIsFlushing  = FALSE;
	mEOSReceived = FALSE;
	return NOERROR;
}

HRESULT CFilterMpeg2Dec::StopStreaming()
{
	mIsFlushing  = FALSE;
	mEOSReceived = FALSE;
	return NOERROR;
}

HRESULT CFilterMpeg2Dec::Receive(IMediaSample *pSample)
{
	// Check for other streams and pass them on
	AM_SAMPLE2_PROPERTIES * const pProps = mMpegInputPin->SampleProps();
	if (pProps->dwStreamId != AM_STREAM_MEDIA) 
	{
		return m_paStreams[0]->Deliver(pSample);
	}

	// Receive mpeg2 data to buffer
	ASSERT(pSample);
	long lSourceSize = pSample->GetActualDataLength();
	BYTE * pSourceBuffer;
	pSample->GetPointer(&pSourceBuffer);
	mMpeg2Controller.ReceiveMpeg(pSourceBuffer, lSourceSize);
	return NOERROR;
}

HRESULT CFilterMpeg2Dec::EndOfStream(void)
{
	// Ignoring the more than twice EOS
	if (!mEOSReceived)
	{
		mEOSReceived  = TRUE;
		mMpeg2Controller.BeginEndOfStream();
		// Wait for all caching data having been fetched out
	//	while (!mMpegController.IsCacheOutputWaiting() && 
	//		!mMpegController.IsCacheEmpty())
	//	{
	//		Sleep(10);
	//	}
	//	mMpegController.EndEndOfStream();

	//	mEOSDelivered = TRUE;
	//	return m_paStreams[0]->DeliverEndOfStream();
	}
	return NOERROR;
}

HRESULT CFilterMpeg2Dec::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
	return m_paStreams[0]->DeliverNewSegment(tStart, tStop, dRate);
}

HRESULT CFilterMpeg2Dec::BeginFlush(void)
{
	HRESULT hr  = m_paStreams[0]->DeliverBeginFlush(); // Call downstreamly
	mIsFlushing = TRUE;
	OutputPin()->BeginFlush();
	return hr;
}

HRESULT CFilterMpeg2Dec::EndFlush(void)
{
	mEOSReceived = FALSE;
	OutputPin()->EndFlush();
	mIsFlushing = FALSE;
	return m_paStreams[0]->DeliverEndFlush();
}

HRESULT CFilterMpeg2Dec::CompleteConnect(PIN_DIRECTION inDirection, IPin * inReceivePin)
{
	if (inDirection == PINDIR_INPUT)
	{
		CMediaType  mtIn = mMpegInputPin->CurrentMediaType();
		if (mtIn.formattype == FORMAT_MPEG2Video)
		{
			MPEG2VIDEOINFO * pFormat = (MPEG2VIDEOINFO *) mtIn.pbFormat;
			mSampleDuration = pFormat->hdr.AvgTimePerFrame;
			mImageWidth     = pFormat->hdr.bmiHeader.biWidth;
			mImageHeight    = pFormat->hdr.bmiHeader.biHeight;
			// Init the mpeg decoder system
			mMpeg2Controller.Uninitialize();
			mMpeg2Controller.Initialize();
			return S_OK;
		}
	}
	else
	{
		CMediaType  mtOut = OutputPin()->CurrentMediaType();
		int bitcount = 2;
		if (mtOut.subtype == MEDIASUBTYPE_YUY2)
		{
			bitcount = 2;
			mMpeg2Controller.SetOutputType(2);
		}
		else if (mtOut.subtype == MEDIASUBTYPE_RGB24)
		{
			bitcount = 3;
			mMpeg2Controller.SetOutputType(1);
		}
		mOutputImageSize = mImageWidth * mImageHeight * bitcount;
		mMpeg2Controller.SetOutputImageSize(mOutputImageSize);
		return S_OK;
	}
	return E_FAIL;
}



/*
//
STDMETHODIMP CFilterMpeg2Dec::GetPages(CAUUID *pPages)
{
	pPages->cElems = 1;
    pPages->pElems = (GUID *) CoTaskMemAlloc(sizeof(GUID));
    if (pPages->pElems == NULL) 
	{
        return E_OUTOFMEMORY;
    }
    *(pPages->pElems) = CLSID_FilterMpeg2VDProp;
    return NOERROR;
}
*/












/******************************Public Routine******************************\
* exported entry points for registration and
* unregistration (in this case they only call
* through to default implmentations).
*
*
*
* History:
*
\**************************************************************************/
STDAPI DllRegisterServer()
{
	return AMovieDllRegisterServer2( TRUE );
}

STDAPI DllUnregisterServer()
{
	return AMovieDllRegisterServer2( FALSE );
}

// Microsoft C Compiler will give hundreds of warnings about
// unused inline functions in header files.  Try to disable them.
#pragma warning( disable:4514)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久国产综合精品女国产盗摄| 一区二区三区在线免费视频| 色哟哟日韩精品| 久久97超碰国产精品超碰| 亚洲精品中文在线影院| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美优质美女网站| 国产91富婆露脸刺激对白| 奇米色777欧美一区二区| 亚洲人午夜精品天堂一二香蕉| 日韩视频在线你懂得| 91久久香蕉国产日韩欧美9色| 国产成人鲁色资源国产91色综 | 在线一区二区视频| 成人av资源下载| 精品亚洲porn| 视频一区视频二区中文| 亚洲精品v日韩精品| 国产精品日韩精品欧美在线| 精品国产免费人成电影在线观看四季 | 亚洲高清免费视频| 亚洲图片你懂的| 国产日韩成人精品| 欧美精品一区二区三区在线| 日韩一区二区精品| 欧美一区国产二区| 欧美一区二区国产| 欧美一区二区观看视频| 91麻豆精品久久久久蜜臀| 欧美日韩一级片在线观看| 色综合天天综合网天天狠天天| 成人午夜av影视| 东方aⅴ免费观看久久av| 国产成人自拍网| 国产电影精品久久禁18| 国产剧情av麻豆香蕉精品| 极品尤物av久久免费看| 精品中文av资源站在线观看| 秋霞午夜av一区二区三区| 日本特黄久久久高潮| 日本欧美大码aⅴ在线播放| 婷婷久久综合九色综合绿巨人| 亚洲国产成人porn| 日韩在线一区二区三区| 日韩 欧美一区二区三区| 日韩福利视频导航| 久久国产精品色婷婷| 麻豆精品国产传媒mv男同| 久久er99热精品一区二区| 极品尤物av久久免费看| 国产很黄免费观看久久| 成人av在线资源网站| 91视频.com| 欧美日韩第一区日日骚| 欧美一区二区三区日韩视频| 精品av久久707| 国产欧美日韩视频在线观看| 中文字幕视频一区| 一区二区三区欧美在线观看| 性做久久久久久久久| 久久机这里只有精品| 大尺度一区二区| 色系网站成人免费| 欧美一区二区在线播放| 国产欧美一区在线| 一区二区三区在线高清| 美国十次了思思久久精品导航| 国内精品国产成人| 91免费看视频| 欧美一卡二卡在线| 国产精品久久久久婷婷| 亚洲综合精品自拍| 国内欧美视频一区二区 | 欧美日韩国产免费一区二区| 欧美一区二区人人喊爽| 久久老女人爱爱| 亚洲女厕所小便bbb| 日韩中文字幕麻豆| 成人动漫视频在线| 欧美日本国产一区| 国产精品沙发午睡系列990531| 亚洲国产日韩a在线播放| 国产乱码字幕精品高清av| 色综合天天综合在线视频| 欧美成人a∨高清免费观看| 国产精品久久久久久妇女6080 | 久久成人免费网站| 91小视频在线免费看| 欧美xxxx在线观看| 一区二区三区在线影院| 国产一区二区三区高清播放| 91成人网在线| 国产三级精品三级| 日韩电影在线一区| 色婷婷激情综合| 国产无遮挡一区二区三区毛片日本| 一区二区三区在线高清| 国产成人精品综合在线观看| 欧美精品久久久久久久久老牛影院| 国产精品女主播av| 九九国产精品视频| 在线电影一区二区三区| 亚洲色图一区二区三区| 国产在线播精品第三| 欧美视频一区二| 亚洲欧洲日韩在线| 国产成人超碰人人澡人人澡| 日韩欧美一区电影| 午夜视频在线观看一区二区三区| 成人一区二区三区视频在线观看 | 国产欧美一区二区在线观看| 日韩电影免费在线看| 91国产视频在线观看| 国产精品成人一区二区艾草| 久久99国产精品尤物| 欧美一区二区三区四区五区 | 亚洲天堂免费在线观看视频| 国模一区二区三区白浆| 欧美一区二区三区不卡| 亚洲 欧美综合在线网络| 日本高清视频一区二区| 国产精品初高中害羞小美女文| 国产精华液一区二区三区| 2020国产精品| 久久国产成人午夜av影院| 欧美一区二区国产| 青青草伊人久久| 日韩一区二区三区视频| 日韩高清中文字幕一区| 91精品国产丝袜白色高跟鞋| 亚洲午夜激情av| 欧美日韩成人综合天天影院| 亚洲伊人色欲综合网| 在线国产电影不卡| 亚洲激情av在线| 欧美伊人久久久久久久久影院| 一区二区三区四区激情| 色婷婷亚洲综合| 亚洲国产日韩综合久久精品| 欧美丝袜丝nylons| 三级影片在线观看欧美日韩一区二区 | 五月婷婷欧美视频| 69堂成人精品免费视频| 免费看欧美女人艹b| 精品福利av导航| 国产成人午夜电影网| 亚洲国产精品成人综合色在线婷婷| 丁香五精品蜜臀久久久久99网站| 国产精品欧美精品| 欧洲视频一区二区| 天天操天天色综合| 精品少妇一区二区三区免费观看 | 国产高清久久久久| 日韩美女啊v在线免费观看| 日本高清免费不卡视频| 日韩在线一区二区三区| 精品嫩草影院久久| 成人av在线影院| 亚洲国产综合视频在线观看| 91精品国产综合久久精品图片| 麻豆精品视频在线| 国产精品免费久久久久| 日本二三区不卡| 人人超碰91尤物精品国产| 久久精品视频免费| 日本韩国欧美一区| 精品一区二区三区蜜桃| 中文乱码免费一区二区| 欧美日韩在线一区二区| 国产制服丝袜一区| 一区二区三区蜜桃| 欧美一级夜夜爽| av网站免费线看精品| 日本女人一区二区三区| 国产精品麻豆视频| 欧美日韩夫妻久久| 国产成人综合在线播放| 一区二区三区四区蜜桃| 精品国产乱码久久久久久1区2区| 成人av在线播放网站| 日本不卡中文字幕| 最新久久zyz资源站| 日韩丝袜美女视频| 色一区在线观看| 国产综合色视频| 亚洲国产精品久久久久秋霞影院 | 亚洲色图视频网站| 日韩亚洲欧美一区二区三区| 不卡在线观看av| 精品一区二区三区免费视频| 亚洲精选在线视频| 国产亚洲一区字幕| 91精品麻豆日日躁夜夜躁| 波多野结衣欧美| 精品亚洲欧美一区| 五月天一区二区| 亚洲嫩草精品久久| 国产精品视频在线看| 欧美xxxx老人做受| 777午夜精品视频在线播放|