好久没有写博客了,前段时间做项目需要一个缓冲机制用来缓存视频帧。下面是自己实现的视频缓冲类。在此类中用循环队列实现了视频帧数据的入队、出队。在类中使用互斥对象避免出入队出现错误。下面是代码。

 /*****************头文件****************/

using namespace std;

#define  MAXSIZE  50

typedef struct
{
	int iSize;//数据的大小
	char *cdata;	
}bufData;
typedef struct 
{
	bufData mdata[MAXSIZE];
	int iRead;//队头
	int iWrite;//队尾
}bufferPara;

class CycleBuffer
{
public:
	CycleBuffer(void);
	~CycleBuffer(void);
	
	BOOL push(bufferPara *Q,char* src,int strLen);//缓冲区存入

	char* pop(bufferPara *Q,long &dsLen);//弹出数据

	BOOL InitQueue(bufferPara *Q);//初始化队列
	bufferPara  mbufferPara;
	char *dest;
private:
	
	HANDLE mutexHandle;
	char *item;

};


/**************************实现*******************/

#include "StdAfx.h" #include "CycleBuffer.h" CycleBuffer::CycleBuffer(void) { InitQueue(&mbufferPara); dest = new char[1024*500]; memset(dest,0,1024*500); mutexHandle = CreateMutex(NULL,FALSE,NULL ); } CycleBuffer::~CycleBuffer(void) { CloseHandle(mutexHandle); for (int i=0;i<MAXSIZE;i++) { delete[] mbufferPara.mdata[i].cdata; } } BOOL CycleBuffer::push(bufferPara *Q,char* src,int srcLen) { WaitForSingleObject(mutexHandle,INFINITE); if ((Q->iWrite+1)%MAXSIZE!=Q->iRead) { memcpy(Q->mdata[Q->iWrite].cdata,src,srcLen); //Q->mdata[Q->iWrite].cdata = src; Q->mdata[Q->iWrite].iSize = srcLen; Q->iWrite = (Q->iWrite+1)%MAXSIZE; ReleaseMutex(mutexHandle); return TRUE; } else { ReleaseMutex(mutexHandle); return FALSE; } } char* CycleBuffer::pop(bufferPara *Q,long &dstLen) { WaitForSingleObject(mutexHandle,INFINITE); if (Q->iRead!=Q->iWrite) { dest = Q->mdata[Q->iRead].cdata; dstLen = Q->mdata[Q->iRead].iSize; memcpy(dest,Q->mdata[Q->iRead].cdata,dstLen); Q->iRead = (Q->iRead+1)%MAXSIZE; ReleaseMutex(mutexHandle); return dest; } else { ReleaseMutex(mutexHandle); return NULL; } } BOOL CycleBuffer::InitQueue(bufferPara * Q) { Q->iRead =0; Q->iWrite=0; for (int i=0;i<MAXSIZE;i++) { Q->mdata[i].cdata = new char[1024*500]; memset(Q->mdata[i].cdata,0,1024*500); Q->mdata[i].iSize = 0; } return TRUE; }

  

      注意头文件中的两个结构体,结构体bufferPara定义的是基本的队列的结构,bufferData结构体中定义的是要存入队列的数据。此类还不完善,日后有时间完善再上传。请各位大牛们提出宝贵意见。