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;
}