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

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

?? ddgrab.cpp

?? 在matlab環境下講視頻文件讀入
?? 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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久9999亚洲精品| 亚洲成人精品影院| 亚洲综合视频在线观看| 日本在线不卡一区| 99re热视频这里只精品| 日韩丝袜美女视频| 一区二区三区精品在线| 国产精品88888| 777色狠狠一区二区三区| 国产精品激情偷乱一区二区∴| 日韩精品视频网站| 欧美性生活一区| 国产精品美女久久久久久| 欧美aaaaa成人免费观看视频| 成人黄色综合网站| 久久久www成人免费毛片麻豆| 日韩黄色免费电影| 欧美日韩一本到| 亚洲一卡二卡三卡四卡无卡久久| 成人午夜激情影院| 国产亚洲精品中文字幕| 麻豆精品视频在线| 91精品欧美综合在线观看最新| 亚洲伦在线观看| av一二三不卡影片| 中文字幕的久久| 成人免费视频免费观看| 2020国产精品自拍| 极品少妇xxxx精品少妇| 欧美一级免费观看| 免费观看一级欧美片| 884aa四虎影成人精品一区| 亚洲mv在线观看| 欧美肥胖老妇做爰| 三级欧美韩日大片在线看| 欧美日韩在线电影| 丝袜亚洲另类欧美| 制服丝袜av成人在线看| 蜜桃一区二区三区在线观看| 日韩精品专区在线| 黑人巨大精品欧美一区| 精品电影一区二区| 国产成人精品影视| 中文字幕亚洲电影| 91婷婷韩国欧美一区二区| 一区二区三区国产| 欧美日韩精品一区二区三区| 三级影片在线观看欧美日韩一区二区| 欧美男生操女生| 韩国av一区二区三区在线观看| 日本一区二区三区国色天香| 不卡视频在线观看| 亚洲国产日韩av| 欧美mv日韩mv国产网站app| 国产成都精品91一区二区三 | 国产毛片精品一区| 日本一区二区综合亚洲| 91免费观看视频| 日韩经典中文字幕一区| 久久美女高清视频| 91一区二区在线观看| 日韩—二三区免费观看av| 亚洲精品一区二区三区在线观看| 粉嫩欧美一区二区三区高清影视| 一区二区三区四区乱视频| 欧美一区二区三区在线| 顶级嫩模精品视频在线看| 亚洲综合在线免费观看| 日韩免费视频线观看| 91免费版在线| 精品一区二区在线观看| 亚洲免费在线看| 精品久久久久久久久久久院品网| av亚洲精华国产精华精| 奇米色一区二区三区四区| 中文字幕一区在线观看| 日韩一区二区三免费高清| 91啦中文在线观看| 久久69国产一区二区蜜臀| 亚洲欧美日韩国产综合在线| 精品噜噜噜噜久久久久久久久试看| 91在线视频免费91| 韩国一区二区三区| 亚洲成人一二三| 国产精品久久看| 日韩欧美中文字幕制服| 欧美这里有精品| 成人中文字幕电影| 韩国视频一区二区| 视频在线观看一区| 一区二区在线观看视频在线观看| 久久久久久麻豆| 欧美一区二区三区婷婷月色| 色综合视频在线观看| 国产成人夜色高潮福利影视| 日本不卡在线视频| 亚洲成va人在线观看| 亚洲欧洲日韩av| 中文字幕av免费专区久久| 欧美不卡一区二区三区| 欧美三级三级三级爽爽爽| 成人av电影在线| 国产成人精品网址| 久久激五月天综合精品| 免费人成在线不卡| 视频在线在亚洲| 日韩高清不卡在线| 五月综合激情日本mⅴ| 一区二区三区欧美久久| 中文字幕一区二区三区av| 国产精品久久毛片| 国产精品嫩草99a| 欧美国产成人精品| 国产亚洲一本大道中文在线| 精品日韩在线观看| 精品日本一线二线三线不卡| 欧美一区二区三区公司| 5858s免费视频成人| 4438x亚洲最大成人网| 欧美日韩国产经典色站一区二区三区 | 亚洲午夜久久久久久久久电影院 | 精品国产污污免费网站入口 | 亚洲一区在线观看免费观看电影高清| 中文在线免费一区三区高中清不卡| 久久综合给合久久狠狠狠97色69| 国产精品成人午夜| 中文字幕 久热精品 视频在线| 国产精品久久久久久久久免费丝袜 | 日韩激情av在线| 免费精品99久久国产综合精品| 蜜臀av一区二区三区| 国产乱码精品一区二区三区忘忧草 | 奇米影视7777精品一区二区| 狂野欧美性猛交blacked| 国产在线精品免费| 国产成人在线网站| jizz一区二区| 一本久久综合亚洲鲁鲁五月天| 欧美色爱综合网| 日韩美女一区二区三区四区| 国产三级精品在线| 中文字幕一区二区三区四区| 亚洲一区二区在线免费看| 五月天亚洲精品| 国产在线不卡一区| 成人午夜电影网站| 欧美日韩免费电影| 精品剧情v国产在线观看在线| 欧美韩国一区二区| 亚洲欧美日韩在线播放| 日韩综合小视频| 懂色一区二区三区免费观看| 欧美丝袜丝nylons| 精品国产乱码久久久久久闺蜜| 国产精品人人做人人爽人人添| 亚洲高清视频的网址| 激情欧美一区二区三区在线观看| 99国产精品久久久久| 欧美精品九九99久久| 欧美精彩视频一区二区三区| 午夜精品久久久久| 成人爱爱电影网址| 欧美精品黑人性xxxx| 国产精品青草综合久久久久99| 五月天久久比比资源色| 成人小视频在线| 日韩欧美亚洲国产另类 | 99视频精品在线| 精品久久人人做人人爽| 一区二区视频在线| 国产成人av一区二区三区在线观看| 欧美在线免费观看视频| 国产亚洲婷婷免费| 免费在线观看视频一区| 在线视频一区二区三| 中文成人综合网| 极品销魂美女一区二区三区| 欧美精品自拍偷拍动漫精品| 专区另类欧美日韩| 国产mv日韩mv欧美| 日韩一级完整毛片| 五月婷婷综合激情| 91麻豆自制传媒国产之光| 久久久不卡网国产精品二区| 另类人妖一区二区av| 欧美日韩精品二区第二页| 亚洲色图欧洲色图婷婷| 国产成a人亚洲精品| 精品国产精品网麻豆系列| 亚洲成a人片综合在线| 色综合久久综合网97色综合| 国产精品色一区二区三区| 国产xxx精品视频大全| 日韩欧美123| 久久成人久久鬼色| 精品国产乱码久久久久久1区2区| 日韩成人一区二区| 制服丝袜日韩国产| 蜜桃一区二区三区在线| 日韩欧美你懂的|