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

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

?? ddgrab.cpp

?? mmread reads virtually any media file. If Windows Media Play can play it, so should mmread. It uses
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/***************************************************
This is the main Grabber code.  It builds the Direct Show graphs
and then inserts SampleGrabbers right before the renderers.  It
then changes all of the renderers to NullRenderers.  This code
supports any number of audio or video streams.  Raw midi streams
are not supported -- I didn't think I should bother.

This code was intended to be used inside of a matlab interface,
but can be used as a generic grabber class for anyone who needs
one.

Written by Micah Richert.
07/14/2005
Modified 09/21/2005, fixed a bug that when no frames are specified it wouldn't capture all frames
**************************************************/

#include "DDGrab.h"
#include <math.h>
#include <assert.h>

GUID NULLGUID = {0};

CSampleGrabberCB::CSampleGrabberCB()
{
	pbFormat = NULL;
	frameNr = 0;
	disabled = false;
	done = false;
	bytesPerWORD = 0;
	rate = 0;
	startTime = 0;
	stopTime = 0;

#ifdef REMOVEMSDLL
	frames = new intListEntry();
	frameBytes = new intListEntry();
	frameNrs = new intListEntry();
#else
	frames = new vector<BYTE*>;
	frameBytes = new vector<int>;
	frameNrs = new vector<int>;
#endif
}

CSampleGrabberCB::~CSampleGrabberCB()
{
	if (pbFormat) free(pbFormat);

#ifdef REMOVEMSDLL
	intListEntry* f=frames, *pf;
	f=f->next; //first is just a place holder
	while(f)
	{
		if(f->data) delete[] ((void*)f->data);
		pf = f;
		f=f->next;
		delete pf;
	}
	frames->next = NULL;
#else
	for (int f=0;f<frames->size();f++) if (frames->at(f)) delete[] (frames->at(f));
#endif
}

// Fake out any COM QI'ing
//
STDMETHODIMP CSampleGrabberCB::QueryInterface(REFIID riid, void ** ppv)
{
	if (!ppv) return E_POINTER;

	if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown )
	{
		*ppv = (void *) static_cast<ISampleGrabberCB*> ( this );
		return NOERROR;
	}

	return E_NOINTERFACE;
}

// The sample grabber is calling us back on its deliver thread.
// This is NOT the main app thread!
//
STDMETHODIMP CSampleGrabberCB::BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
{
	if (disabled) return 0;

	if (!pBuffer) return E_POINTER;

	frameNr++;

	int nrWORDs = lBufferSize/bytesPerWORD;

	int offset=0, len=0;

	if (frameNrs->size() > 0)
	{
		//frames are being specified, so we must be a videoCB...
		// check to see if the frame is in our list
		bool foundNr = false;
		int lastFrameNr = 0;
		for (int i=0;i<frameNrs->size();i++)
		{
			if (frameNrs->at(i) == frameNr) foundNr = true;
			if (frameNrs->at(i) > lastFrameNr) lastFrameNr = frameNrs->at(i);
		}

		if (frameNr > lastFrameNr)
		{
			done = true;
			return 0;
		}

		if (foundNr) len = lBufferSize; // since this has to be a video frame, we just capture everything
	} else {
		// either no frames are specified (capture all), or we have time specified
		if (stopTime)
		{
			// time is being used...
			offset = min(max(0,(int)((startTime-dblSampleTime)*rate)*bytesPerWORD),lBufferSize);
			len = min(lBufferSize,(int)((stopTime-dblSampleTime)*rate)*bytesPerWORD)-offset;
			// if we have gone past our stop time...
			if (len < 0)
			{
				done = true;
				return 0;
			}
		} else {
			// capture everything... video or audio
			len = lBufferSize;
		}
	}

	if (len)
	{
		BYTE* tmp = new BYTE[len];
		if (!tmp) return E_OUTOFMEMORY;

		memcpy(tmp,pBuffer+offset,len);
#ifdef REMOVEMSDLL
		new intListEntry((int)tmp,frames);
		new intListEntry(len,frameBytes);
#else
		frames->push_back(tmp);
		frameBytes->push_back(len);
#endif
	}

	return 0;
}

DDGrabber::DDGrabber()
{
#ifdef REMOVEMSDLL
	VideoCBs = new intListEntry();
	AudioCBs = new intListEntry();
#else
	VideoCBs = new vector<CSampleGrabberCB*>;
	AudioCBs = new vector<CSampleGrabberCB*>;
#endif
	stopForced = false;
}

void DDGrabber::cleanUp()
{
	IEnumFilters* filterList;
	IBaseFilter* filt;
	ULONG tmp;
	int i;

#ifdef REMOVEMSDLL
	intListEntry* e=VideoCBs, *pe;
	e=e->next; //first is just a place holder
	while(e)
	{
		if(e->data) delete((CSampleGrabberCB*)e->data);
		pe = e;
		e=e->next;
		delete pe;
	}
	VideoCBs->next = NULL;

	e=AudioCBs;
	e=e->next; //first is just a place holder
	while(e)
	{
		if(e->data) delete((CSampleGrabberCB*)e->data);
		pe = e;
		e=e->next;
		delete pe;
	}
	AudioCBs->next = NULL;
#else
	for (i=0; i<VideoCBs->size(); i++) delete VideoCBs->at(i);
	for (i=0; i<AudioCBs->size(); i++) delete AudioCBs->at(i);

	VideoCBs->clear();
	AudioCBs->clear();
#endif

	if (!FAILED(pGraphBuilder->EnumFilters(&filterList)))
	{
		filterList->Reset();
		while (filterList->Next(1, &filt, &tmp) == S_OK)
		{
			filt->Release();
		}
		filterList->Release();
	}
	pGraphBuilder = NULL;
}

void DDGrabber::MyFreeMediaType(AM_MEDIA_TYPE& mt)
{
	if (mt.cbFormat != 0)
	{
		CoTaskMemFree((PVOID)mt.pbFormat);
		mt.cbFormat = 0;
		mt.pbFormat = NULL;
	}
	if (mt.pUnk != NULL)
	{
		// Unecessary because pUnk should not be used, but safest.
		mt.pUnk->Release();
		mt.pUnk = NULL;
	}
}

PIN_INFO DDGrabber::getPinInfo(IPin* pin)
{
	PIN_INFO	info = {0};

	if (pin)
	{
		if (!FAILED(pin->QueryPinInfo(&info)))
		{
			info.pFilter->Release();
		}
	}

	return info;
}

IPin* DDGrabber::getInputPin(IBaseFilter* filt)
{
	IPin* pin = NULL;
	IEnumPins* pinList;
	ULONG tmp;

	if (!filt) return NULL;

	//get the input
	if (!FAILED(filt->EnumPins(&pinList)))
	{
		pinList->Reset();
		while (pinList->Next(1, &pin, &tmp) == S_OK && getPinInfo(pin).dir != PINDIR_INPUT);
		pinList->Release();

		if (getPinInfo(pin).dir != PINDIR_INPUT) return NULL;
	}

	return pin;
}

IPin* DDGrabber::getOutputPin(IBaseFilter* filt)
{
	IPin* pin = NULL;
	IEnumPins* pinList;
	ULONG tmp;

	if (!filt) return NULL;

	//get the output
	if (!FAILED(filt->EnumPins(&pinList)))
	{
		pinList->Reset();
		while (pinList->Next(1, &pin, &tmp) == S_OK && getPinInfo(pin).dir != PINDIR_OUTPUT);
		pinList->Release();

		if (getPinInfo(pin).dir != PINDIR_OUTPUT) return NULL;
	}

	return pin;
}

bool DDGrabber::isRenderer(IBaseFilter* filt)
{
	if (!filt) return false;

	IEnumPins*	pinList;
	int nrOutput = 0;
	int nrInput = 0;
	IPin*		pin = NULL;
	ULONG		tmp;

	if (FAILED(filt->EnumPins(&pinList))) return false;
	pinList->Reset();
	while (pinList->Next(1, &pin, &tmp) == S_OK)
	{
		if (getPinInfo(pin).dir == PINDIR_OUTPUT) nrOutput++;
		else nrInput++;
	}
	pinList->Release();

	#ifdef _DEBUG
		FILTER_INFO info;
		filt->QueryFilterInfo(&info);
		char str[100];
		WideCharToMultiByte( CP_ACP, 0, info.achName, -1, str, 100, NULL, NULL );
		_RPT0(_CRT_WARN,str);
		_RPT2(_CRT_WARN," %d %d\n", nrOutput, nrInput);
	#endif

	return nrOutput == 0 && nrInput == 1;  // the only filters that have no outputs are renderers
}

IPin* DDGrabber::connectedToInput(IBaseFilter* filt)
{
	if (!filt) return NULL;

	IPin* inPin;
	IPin* outPin;

	inPin = getInputPin(filt);
	if (!inPin) return NULL;

	if (FAILED(inPin->ConnectedTo(&outPin))) return NULL;
	return outPin;
}

GUID DDGrabber::getMajorType(IBaseFilter* filt)
{
	if (!filt) return NULLGUID;

	IPin* inPin;
	inPin = getInputPin(filt);
	if (!inPin) return NULLGUID;

	AM_MEDIA_TYPE mt = {0};
	if (FAILED(inPin->ConnectionMediaType(&mt))) return NULLGUID;

	GUID ret = mt.majortype;
	MyFreeMediaType(mt);

	return ret;
}

HRESULT DDGrabber::getVideoInfo(unsigned int id, int* width, int* height, int* rate, int* nrFramesCaptured, int* nrFramesTotal)
{
	if (!width || !height || !nrFramesCaptured || !nrFramesTotal) return E_POINTER;

	if (id >= VideoCBs->size()) return E_NOINTERFACE;
	CSampleGrabberCB* CB = (CSampleGrabberCB*)VideoCBs->at(id);

	if (!CB) return E_POINTER;

	if (!CB->pbFormat)
	{
		*width = 0;
		*height = 0;
		*rate = 0;
	} else {
		VIDEOINFOHEADER * h = (VIDEOINFOHEADER*) CB->pbFormat;
		if (!h) return E_POINTER;
		*width  = h->bmiHeader.biWidth;
		*height = h->bmiHeader.biHeight;
		if (h->AvgTimePerFrame == 0) *rate = 0; // can't calc rate correctly...
		else *rate = 10000000.0/h->AvgTimePerFrame; // make it samples per second.
	}
	*nrFramesCaptured = CB->frames->size();
	*nrFramesTotal = CB->frameNr;

	// see if we can get more reliable nrFramesTotal and rate information
	CComPtr<IMediaSeeking> pMediaSeeking;
	pGraphBuilder->QueryInterface(IID_IMediaSeeking, (void **)&pMediaSeeking);
	if (pMediaSeeking)
	{
		LONGLONG duration = 0;
		LONGLONG durationus = 0;

		if (SUCCEEDED(pMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME))) pMediaSeeking->GetDuration(&durationus);

		if (SUCCEEDED(pMediaSeeking->SetTimeFormat(&TIME_FORMAT_FRAME)) && SUCCEEDED(pMediaSeeking->GetDuration(&duration)))
		{
			if (stopForced) *nrFramesTotal = duration; // if we stopped early, calculate nrFramesTotal
			if (*rate == 0 && durationus) *rate = duration/(durationus/10000000.0);
		} else {
			 // if we stopped early, calculate nrFramesTotal
			if (stopForced && durationus && *rate) *nrFramesTotal = -(*rate)*(durationus/10000000.0);
		}
	}

	// some things don't work right if rate is 0
	if (*rate == 0) *rate = 1;

	return S_OK;
}

HRESULT DDGrabber::getAudioInfo(unsigned int id, int* nrChannels, int* rate, int* bits, int* nrFramesCaptured, int* nrFramesTotal)
{
	if (!nrChannels || !rate || !bits || !nrFramesCaptured || !nrFramesTotal) return E_POINTER;

	if (id >= AudioCBs->size()) return E_NOINTERFACE;
	CSampleGrabberCB* CB = (CSampleGrabberCB*)AudioCBs->at(id);

	if (!CB) return E_POINTER;

	if (!CB->pbFormat)
	{
		*nrChannels = 0;
		*rate = 0;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩成人一区二区三区在线观看| 国产精品久久一级| 午夜不卡av在线| 欧美性色黄大片| 亚洲v中文字幕| 欧美精品三级日韩久久| 欧美日韩成人一区二区| 亚洲成在线观看| 精品国一区二区三区| 国产伦精品一区二区三区免费迷| 日本一区二区三区久久久久久久久不| 成人av网站大全| 亚洲国产综合色| 日韩美女在线视频| 波多野结衣一区二区三区| 亚洲欧美日韩国产成人精品影院| 欧美区在线观看| 激情另类小说区图片区视频区| 国产亚洲人成网站| 91精品福利视频| 久久精品二区亚洲w码| 久久久久久久久免费| 色噜噜狠狠成人网p站| 日韩激情av在线| 欧美韩国日本综合| 欧美日本视频在线| 豆国产96在线|亚洲| 亚洲综合色视频| 精品国产乱子伦一区| 91亚洲精品乱码久久久久久蜜桃| 亚洲aaa精品| 欧美国产精品专区| 欧美日韩免费一区二区三区| 国产一区二区成人久久免费影院| 亚洲视频一区在线| 26uuu国产一区二区三区| 91色九色蝌蚪| 国产盗摄一区二区| 日韩精品电影在线观看| 国产精品嫩草影院com| 日韩欧美色综合| 日本久久一区二区三区| 国产精品一区二区x88av| 亚洲一区二区精品视频| 国产精品国产三级国产普通话蜜臀| 91精品综合久久久久久| 91蝌蚪porny| 国产福利一区二区三区视频在线| 午夜久久久久久久久久一区二区| 国产精品沙发午睡系列990531| 日韩一区二区精品| 欧美视频一二三区| 99精品视频一区二区三区| 韩国中文字幕2020精品| 图片区小说区区亚洲影院| 中文字幕一区二区三区不卡| 欧美成人午夜电影| 91精品国产91综合久久蜜臀| 欧美中文字幕一区二区三区| 成人免费高清在线| 国产制服丝袜一区| 美女mm1313爽爽久久久蜜臀| 亚洲不卡一区二区三区| 一区二区三区免费在线观看| 国产精品亲子乱子伦xxxx裸| 国产校园另类小说区| 精品理论电影在线观看| 777午夜精品视频在线播放| 国产精品久久久久久久久久免费看 | 欧美影院一区二区三区| 丰满放荡岳乱妇91ww| 国产福利视频一区二区三区| 国产露脸91国语对白| 免费看精品久久片| 日本成人在线网站| 日韩av在线免费观看不卡| 午夜精品久久一牛影视| 图片区小说区区亚洲影院| 亚洲国产va精品久久久不卡综合| 亚洲国产成人av网| 午夜欧美在线一二页| 日韩精品欧美精品| 美女任你摸久久| 精品伊人久久久久7777人| 激情综合网av| 国产精品原创巨作av| 高清不卡在线观看| av动漫一区二区| 色天使久久综合网天天| 欧美性一区二区| 欧美一区二区国产| 精品国产一区二区三区av性色 | 久久精品国产99国产| 极品瑜伽女神91| 国产激情一区二区三区| 粉嫩欧美一区二区三区高清影视| 国产69精品久久777的优势| 97精品久久久午夜一区二区三区| 91麻豆自制传媒国产之光| 欧美日韩在线三区| 精品久久久久久最新网址| 欧美激情一区二区三区不卡 | 日本韩国欧美一区二区三区| 在线观看视频一区二区欧美日韩| 欧美精品久久99久久在免费线 | 国产伦精品一区二区三区免费迷 | 久久久久久久久久久黄色| 国产日韩一级二级三级| 亚洲人被黑人高潮完整版| 日韩精品亚洲专区| 国产精品1区2区3区在线观看| 97精品久久久午夜一区二区三区 | 久久99热这里只有精品| 成人激情综合网站| 欧美色精品天天在线观看视频| 日韩一区二区三区av| 中文字幕中文字幕一区| 日韩高清在线一区| 成人蜜臀av电影| 91精品国产手机| 国产精品久久久久影院亚瑟| 丝袜美腿一区二区三区| 国产一区二区三区日韩| 国产精品久久综合| 免费观看久久久4p| 北条麻妃一区二区三区| 日韩一区二区精品| 中文字幕日韩一区| 麻豆久久久久久久| 在线视频综合导航| 国产日韩欧美一区二区三区乱码| 亚洲一区二区欧美| 不卡一区二区中文字幕| 91麻豆精品国产无毒不卡在线观看 | 国产高清视频一区| 91精品欧美一区二区三区综合在| 国产欧美一区二区精品忘忧草 | 国模一区二区三区白浆| 欧美最猛黑人xxxxx猛交| 国产日产精品一区| 日本午夜一本久久久综合| 91农村精品一区二区在线| 日韩一区二区三区视频在线观看| 亚洲裸体xxx| 国产成人免费视| 26uuu欧美| 久久国产婷婷国产香蕉| 777欧美精品| 亚洲国产日韩a在线播放性色| 成人丝袜18视频在线观看| 精品国产乱子伦一区| 奇米精品一区二区三区在线观看一| 91久久线看在观草草青青| 国产精品白丝在线| 国产成人在线影院 | 欧美va亚洲va| 日韩成人午夜精品| 欧美美女一区二区在线观看| 亚洲人成影院在线观看| 国产精品1区2区3区| 日韩欧美资源站| 日本亚洲最大的色成网站www| 欧美亚洲日本一区| 亚洲尤物在线视频观看| 一本高清dvd不卡在线观看| 国产精品久久久久影院老司| 国产精品香蕉一区二区三区| 日韩欧美黄色影院| 蜜桃视频第一区免费观看| 在线电影欧美成精品| 婷婷国产在线综合| 欧美放荡的少妇| 午夜av一区二区三区| 在线成人av影院| 蜜臀av性久久久久蜜臀av麻豆| 欧美一区二区三区男人的天堂| 日韩一区欧美二区| 欧美电影一区二区| 免播放器亚洲一区| 日韩欧美一区在线| 精品一区二区三区久久| 精品国产乱码久久久久久蜜臀| 麻豆91在线看| 久久久av毛片精品| 懂色一区二区三区免费观看| 国产精品女同一区二区三区| 99re这里只有精品视频首页| 亚洲黄色性网站| 欧美一区二区三区在线| 激情欧美一区二区| 最近日韩中文字幕| 欧美色窝79yyyycom| 日韩电影免费一区| 久久久蜜桃精品| 91蜜桃免费观看视频| 亚洲成人综合在线| 26uuu亚洲| 一本久久综合亚洲鲁鲁五月天| 午夜影视日本亚洲欧洲精品| 日韩视频在线你懂得|