⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddgrab.h

📁 mmread.m是matlab官方网站上公布的一个函数
💻 H
字号:
/***************************************************
This is the header file for the Grabber code.  Include this
in your files.

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
**************************************************/

#if defined(_DEBUG) && defined(_MSC_VER)
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif

#include "dshow.h"
#include "qedit.h"
#include <assert.h>

template<class T> class vector
{
	public:
		vector()
		{
			datavec = NULL;
			datavecSize = 0;
			nr = 0;
			datavecSize = resize(128);
		}

		~vector()
		{
			free(datavec);
		}

		T at(unsigned int i)
		{
			if (i >= nr) return NULL;
			return datavec[i];
		}

		int size()
		{
			return nr;
		}

		void assign(unsigned int i, T data)
		{
			if (i >= nr) return;
			datavec[i] = data;
		}

		void add(T data)
		{
			nr++;
			if (nr > datavecSize)
			{
				datavecSize = resize(datavecSize*2);
				if (nr > datavecSize)
				{
					_RPT0(_CRT_WARN,"RESIZE FAILED!!!\n");
					//we've failed, but can't return an error here...
					nr--;
					return;
				}
			}
			datavec[nr-1] = data;
		}

		void clear()
		{
			nr = 0;
			datavecSize = resize(128);
		}

	private:
		T* datavec;
		unsigned int nr;
		unsigned int datavecSize;

		int resize(int newsize)
		{
			_RPT0(_CRT_WARN,"resize\n");
			void* tmp = realloc(datavec,newsize*sizeof(T));
			if (tmp)
			{
				datavec = (T*)tmp;
				return newsize;
			}
			return datavecSize;
		}
};

// since the Audio and Video CB vectors are public we need to make the CB interface public too
class CSampleGrabberCB : public ISampleGrabberCB
{
public:
	CSampleGrabberCB();
	virtual ~CSampleGrabberCB();

	vector<BYTE*> frames;
	vector<int> frameBytes;
	vector<int> frameNrs;
	vector<double> frameTimes;

	// use this to get data format information, ie. bit depth, sampling rate...
	BYTE *pbFormat;
	GUID subtype; // what is the encoding

	unsigned int frameNr;
	bool disabled;
	bool done;
	bool isAudio;

	int bytesPerWORD;
	double rate;
	double startTime, stopTime;

	// Fake out any COM ref counting
	//
	STDMETHODIMP_(ULONG) AddRef() { return 2; }
	STDMETHODIMP_(ULONG) Release() { return 1; }

	// Fake out any COM QI'ing
	//
	STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);

	// We don't implement this one
	//
	STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample ){ return 0; }

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

// this is the main grabber class.  I think the interfaces and names are fairly self explanatory
class DDGrabber
{
public:
	vector<CSampleGrabberCB*> VideoCBs;
	vector<CSampleGrabberCB*> AudioCBs;
	DDGrabber();

	HRESULT buildGraph(char* filename);
	HRESULT doCapture();
	HRESULT getVideoInfo(unsigned int id, int* width, int* height, double* rate, int* nrFramesCaptured, int* nrFramesTotal, double* totalDuration);
	HRESULT getAudioInfo(unsigned int id, int* nrChannels, double* rate, int* bits, int* nrFramesCaptured, int* nrFramesTotal, GUID* subtype, double* totalDuration);
	void getCaptureInfo(int* nrVideo, int* nrAudio);
	// data must be freed by caller
	HRESULT getVideoFrame(unsigned int id, int frameNr, BYTE** data, int* nrBytes, double* time);
	// data must be freed by caller
	HRESULT getAudioFrame(unsigned int id, int frameNr, BYTE** data, int* nrBytes, double* time);
	void setFrames(int* frameNrs, int nrFrames);
	void setTime(double startTime, double stopTime);
	void setTrySeeking(int tryseek);
	void disableVideo();
	void disableAudio();
	void cleanUp(); // must be called at the end, in order to render anything afterward.

#ifdef MATLAB_MEX_FILE
	void setMatlabCommand(char * matlabCommand);
	void runMatlabCommand();
#endif
private:
	IGraphBuilder* pGraphBuilder;
	bool stopForced;
    bool tryseeking;
	vector<int> frameNrs;
    double startTime, stopTime;

#ifdef MATLAB_MEX_FILE
	vector<int> lastFrames;
	char* matlabCommand;
#endif

	void MyFreeMediaType(AM_MEDIA_TYPE& mt);
	PIN_INFO getPinInfo(IPin* pin);
	IPin* getInputPin(IBaseFilter* filt);
	IPin* getOutputPin(IBaseFilter* filt);
	bool isRenderer(IBaseFilter* filt);
	IPin* connectedToInput(IBaseFilter* filt);
	GUID getMajorType(IBaseFilter* filt);
	HRESULT insertCapture(IGraphBuilder* pGraphBuilder, IBaseFilter* pRenderer, AM_MEDIA_TYPE* mt, CSampleGrabberCB** grabberCB);
	HRESULT insertVideoCapture(IGraphBuilder* pGraphBuilder, IBaseFilter* pRenderer);
	HRESULT insertAudioCapture(IGraphBuilder* pGraphBuilder, IBaseFilter* pRenderer);
	HRESULT changeToNull(IGraphBuilder* pGraphBuilder, IBaseFilter* pRenderer);
	HRESULT mangleGraph(IGraphBuilder* pGraphBuilder);
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -