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

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

?? ddgrab.cpp

?? 在matlab環(huán)境下講視頻文件讀入
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
/***************************************************
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
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久99免费| 久久久www成人免费毛片麻豆| 久久国产麻豆精品| 国产精品成人网| 欧美一区二区在线观看| www.欧美日韩国产在线| 麻豆精品国产91久久久久久| 亚洲精品日日夜夜| 中文一区在线播放| 欧美精品一区二区三区蜜臀| 欧美日韩一级片网站| 92精品国产成人观看免费 | 国产精品视频免费| 日韩欧美成人一区二区| 日本国产一区二区| 99精品国产99久久久久久白柏| 精品系列免费在线观看| 午夜不卡av免费| 亚洲精品国产一区二区精华液| 久久久久一区二区三区四区| 欧美一级理论片| 欧美性视频一区二区三区| 99久久99久久综合| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 69堂成人精品免费视频| 一本大道久久a久久精二百| 成人午夜电影久久影院| 国产一区二区影院| 国产一区日韩二区欧美三区| 六月丁香综合在线视频| 日韩va亚洲va欧美va久久| 亚洲成a天堂v人片| 洋洋av久久久久久久一区| 亚洲女人的天堂| 亚洲色图一区二区三区| 亚洲欧洲在线观看av| 国产精品天干天干在线综合| 国产欧美精品一区二区三区四区| 精品国产伦一区二区三区观看方式| 91精品国产91久久综合桃花| 91精品国产色综合久久不卡电影 | 在线观看亚洲精品视频| 91亚洲精华国产精华精华液| 成人av在线影院| 91最新地址在线播放| 一本一道久久a久久精品综合蜜臀| av在线这里只有精品| 色综合久久久久综合| 99riav久久精品riav| 91久久精品国产91性色tv| 91电影在线观看| 538prom精品视频线放| 日韩一卡二卡三卡| 精品国产亚洲在线| 国产欧美日韩综合| 自拍偷拍欧美精品| 亚洲乱码中文字幕综合| 午夜视频在线观看一区二区| 日韩成人免费看| 国产乱码精品1区2区3区| 国产成人aaa| 色综合婷婷久久| 欧美美女直播网站| 欧美成人女星排名| 国产精品色哟哟网站| 亚洲激情av在线| 六月丁香综合在线视频| 成人avav影音| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 欧美日韩电影在线播放| 精品国产一区二区三区av性色| 国产欧美日本一区二区三区| 亚洲精品成人悠悠色影视| 亚洲第一av色| 国产精品综合二区| 欧洲一区二区三区在线| 精品国偷自产国产一区| 亚洲人成亚洲人成在线观看图片| 午夜视频在线观看一区二区三区| 国产在线视频精品一区| 91福利精品第一导航| 久久夜色精品一区| 一区二区三区欧美久久| 国内精品免费**视频| 91最新地址在线播放| 精品少妇一区二区| 夜夜亚洲天天久久| 从欧美一区二区三区| 91精品啪在线观看国产60岁| 国产欧美精品日韩区二区麻豆天美| 亚洲电影中文字幕在线观看| 国产剧情在线观看一区二区| 欧美在线观看一区二区| 久久久噜噜噜久噜久久综合| 午夜伊人狠狠久久| thepron国产精品| 精品国产污污免费网站入口 | 午夜婷婷国产麻豆精品| 国产成人亚洲综合色影视| 7777精品伊人久久久大香线蕉超级流畅 | 欧美亚洲国产一区在线观看网站| 精品捆绑美女sm三区| 亚洲一二三四区| av在线不卡观看免费观看| 日韩美女视频一区二区在线观看| 亚洲韩国一区二区三区| 成人av先锋影音| 亚洲精品精品亚洲| 成人激情黄色小说| 精品日韩av一区二区| 偷拍自拍另类欧美| 在线亚洲一区二区| 国产精品乱人伦中文| 国产精品一区二区三区四区| 欧美一区二区三区视频在线| 亚洲福利一区二区| 91论坛在线播放| 国产精品美女久久久久久久网站| 久久精品国产99国产| 欧美精品乱人伦久久久久久| 艳妇臀荡乳欲伦亚洲一区| 91免费在线播放| 日韩一区欧美小说| 成人av高清在线| 国产精品理论片在线观看| 懂色av一区二区三区免费看| 精品日韩欧美在线| 国产一区免费电影| 精品99一区二区| 国产精品自产自拍| 国产女同互慰高潮91漫画| 国产成人精品免费网站| 国产欧美一区二区三区沐欲| 国产精品99久久久久久有的能看 | 欧美电影免费观看高清完整版在线观看| 亚洲成人激情社区| 欧美美女黄视频| 天堂蜜桃一区二区三区| 555www色欧美视频| 麻豆精品国产91久久久久久| 精品理论电影在线观看 | 国产99精品视频| 欧美经典一区二区三区| 成人美女视频在线看| 国产精品夜夜爽| 国产欧美精品日韩区二区麻豆天美| 成人性生交大片免费 | 激情图区综合网| 337p粉嫩大胆噜噜噜噜噜91av| 激情六月婷婷久久| 国产欧美视频一区二区三区| 99re这里只有精品6| 亚洲一区自拍偷拍| 日韩一级二级三级| 国产精品88av| 亚洲欧美精品午睡沙发| 精品视频色一区| 韩国精品免费视频| 中文字幕欧美日韩一区| 色婷婷av一区二区三区之一色屋| 亚洲一二三四区| 精品理论电影在线观看| 成人avav影音| 亚欧色一区w666天堂| 欧美mv和日韩mv国产网站| 粉嫩av一区二区三区在线播放| 亚洲色图.com| 91精品国产综合久久小美女| 国产精品羞羞答答xxdd| 亚洲精品国产无天堂网2021| 欧美精选一区二区| 国产伦精品一区二区三区免费| 国产精品日日摸夜夜摸av| 欧美午夜电影网| 国产精品亚洲一区二区三区在线 | 日日骚欧美日韩| 国产喷白浆一区二区三区| 欧美专区亚洲专区| 国产一区二区电影| 亚洲图片欧美色图| 久久精品男人天堂av| 欧美午夜精品久久久久久孕妇| 国内成+人亚洲+欧美+综合在线 | 国产在线播放一区二区三区| 亚洲三级电影全部在线观看高清| 91精品一区二区三区在线观看| 成人中文字幕电影| 麻豆精品久久久| 亚洲精品视频观看| 国产欧美一区二区三区鸳鸯浴| 欧美猛男超大videosgay| 成人av集中营| 国产真实乱偷精品视频免| 亚洲综合一区二区| 国产精品午夜在线观看| 精品久久久久久综合日本欧美| 日本韩国一区二区| 不卡视频在线观看| 精品亚洲欧美一区| 日韩av电影免费观看高清完整版 |