www.pudn.com > H264RtpSource.rar > Queue.cpp


/******************************************************************** 
	created:	2007/04/28 
	created:	28:4:2007   11:09 
	filename: 	d:\My Documents\远程无线变电站监控系统\RDVMS_Client\src\H264SourceFilter\Queue.cpp 
	file path:	d:\My Documents\远程无线变电站监控系统\RDVMS_Client\src\H264SourceFilter 
	file base:	Queue 
	file ext:	cpp 
	author:		 
	 
	purpose:	为缓冲音视频数据的链表 
*********************************************************************/ 
#include "StdAfx.h" 
#include "Queue.h" 
 
//************************************ 
// Method:    CGoldNode 
// FullName:  CGoldNode::CGoldNode 
// Access:    public  
// Returns:   缓冲一帧音视频数据的结点 
// Qualifier: :pVbuf(NULL) ,VideoLen(0) ,pNext(NULL) ,m_syn_time_stamp(0) 
// Parameter: unsigned char* pVideoBuf -- 一帧数据的缓冲区 
// Parameter: int VideoFrameLen-- 一帧数据的长度 
//************************************ 
CGoldNode::CGoldNode(unsigned char* pVideoBuf, int VideoFrameLen) 
:pVbuf(NULL) 
,VideoLen(0) 
,pNext(NULL) 
,m_syn_time_stamp(0) 
{ 
	if (pVideoBuf == NULL) 
		return; 
	if (0 == VideoFrameLen) 
		return; 
 
	VideoLen=VideoFrameLen; 
 
	if (0!=VideoLen) 
	{ 
		pVbuf = new unsigned char[VideoLen]; 
		memcpy(pVbuf, pVideoBuf, VideoLen); 
	} 
} 
 
CGoldNode::CGoldNode(unsigned char* pBuf, int Len, int syn_time_stamp) 
:pVbuf(NULL) 
,VideoLen(0) 
,pNext(NULL) 
,m_syn_time_stamp(0) 
{ 
	if( (pBuf == NULL) || (Len == 0) ) 
	{ 
		return; 
	} 
 
	VideoLen = Len; 
	m_syn_time_stamp = syn_time_stamp; 
 
	pVbuf = new unsigned char[VideoLen]; 
	memcpy(pVbuf, pBuf, VideoLen); 
} 
 
CGoldNode::CGoldNode() 
:pVbuf(NULL) 
,VideoLen(0) 
,pNext(NULL) 
,m_syn_time_stamp(0) 
{ 
	if (pVbuf) 
	{ 
		delete pVbuf; 
		pVbuf = NULL; 
	} 
} 
 
CGoldNode::CGoldNode(CGoldNode &m_Node) 
{ 
	VideoLen = m_Node.VideoLen; 
 
	if (0!=VideoLen) 
	{ 
		pVbuf=new unsigned char[VideoLen]; 
		memcpy(pVbuf, m_Node.pVbuf, VideoLen); 
	} 
	else 
	{ 
		pVbuf = NULL; 
	} 
 
	pNext = NULL; 
} 
 
CGoldNode::~CGoldNode() 
{ 
	if (pVbuf) 
	{ 
		delete pVbuf; 
		pVbuf = NULL; 
	} 
} 
 
bool CGoldNode::attach(CGoldNode *m_Node) 
{ 
	VideoLen  =m_Node->VideoLen; 
 
	if (NULL == m_Node) 
		return false; 
 
	if (0!=VideoLen) 
	{ 
		pVbuf=new unsigned char[VideoLen]; 
		memcpy(pVbuf, m_Node->pVbuf, VideoLen); 
	} 
	return true; 
} 
 
//************************************ 
// Method:    GetVideoFrame 
// FullName:  CGoldNode::GetVideoFrame 
// Access:    public  
// Returns:   int --数据长度 
// Qualifier:从数据结点里取出数据及其长度 
// Parameter: unsigned char* pVideoBuf -- 接收数据的缓冲区首地址  
//************************************ 
int CGoldNode::GetVideoFrame(unsigned char* pVideoBuf) 
{ 
	if ( 0 != VideoLen ) 
	{ 
		memcpy(pVideoBuf, pVbuf, VideoLen); 
		return VideoLen; 
	} 
	return 0; 
} 
 
//************************************ 
// Method:    GetSynTimeStamp 
// FullName:  CGoldNode::GetSynTimeStamp 
// Access:    public  
// Returns:   int 
// Qualifier:这是为音视频同步使用的同步序列号 
//************************************ 
int CGoldNode::GetSynTimeStamp() 
{ 
	return m_syn_time_stamp; 
} 
 
/*********************************** 
*********队列*********** 
************************************/ 
CGoldQueue::CGoldQueue() 
:pQueueHead(NULL) 
,pQueueTail(NULL) 
,NodeNum(0) 
{ 
 
} 
 
CGoldQueue::~CGoldQueue() 
{ 
	CAutoLock autolock(&m_Sec); 
 
	for (int i=0; ipNext; 
		delete pNode; 
		pNode = NULL; 
	} 
	NodeNum = 0; 
} 
 
//************************************ 
// Method:    GetNode 
// FullName:  CGoldQueue::GetNode 
// Access:    public  
// Returns:   bool 
// Qualifier:从链表里取出一个结点 
// Parameter: CGoldNode **Node 
//************************************ 
bool CGoldQueue::GetNode(CGoldNode **Node) 
{ 
	CAutoLock autolock(&m_Sec); 
 
	if (0 >= NodeNum) 
	{ 
		return false; 
	} 
	*Node=pQueueHead; 
	pQueueHead=pQueueHead->pNext; 
	if( NULL == pQueueHead ) 
	{ 
		pQueueTail = NULL; 
	} 
	NodeNum--; 
 
	(*Node)->pNext = NULL; 
 
	return true; 
} 
//************************************ 
// Method:    PutNode 
// FullName:  CGoldQueue::PutNode 
// Access:    public  
// Returns:   bool 
// Qualifier:加入一个结点到链表中去 
// Parameter: CGoldNode *Node 
//************************************ 
bool CGoldQueue::PutNode(CGoldNode *Node) 
{ 
	CAutoLock autolock(&m_Sec); 
 
	if ( NULL == Node) 
		return false; 
	if ( pQueueHead == NULL ) 
	{ 
		pQueueTail=pQueueHead=Node; 
	} 
	else 
	{ 
		pQueueTail->pNext=Node; 
		pQueueTail=pQueueTail->pNext; 
	} 
 
	NodeNum++; 
	return true; 
} 
 
//************************************ 
// Method:    GetCount 
// FullName:  CGoldQueue::GetCount 
// Access:    public  
// Returns:   int 
// Qualifier:查看当前链表中的结点数目 
//************************************ 
int CGoldQueue::GetCount() 
{ 
	CAutoLock autolock(&m_Sec); 
	return NodeNum; 
}