TInt32 CPipe::ReturnMsgBuff(TUChar *pMsg,TUInt32 len) { TUInt32 dataLen = GetDataLen(); if (len > dataLen) { return INPUT_PARA_ERROR; } if (m_pRear != pMsg) { return SUCCESS; } TUChar * pPipeRear = (m_pMemPool + m_memPoolSize); TUChar *pNewRear = (TUChar*)m_pRear; pNewRear += len; //m_pRear += len; #ifdef _DEBUG if (pNewRear > pPipeRear) { pNewRear = m_pMemPool + (pPipeRear - m_pRear); //cout<<"Error in CPipe::PrepareMsg, wrong format!"<<endl; return INPUT_PARA_ERROR; } #endif if (pNewRear == pPipeRear) { m_pRear = m_pMemPool; } else { m_pRear = pNewRear; } return SUCCESS; }
//读数据到pData TInt32 CPipe::ReadData(TUChar *pTo,TUInt32 len) { TUInt32 dataLen = GetDataLen(); if (len > dataLen) { return OUT_OF_RANGE; } TUChar *pRear = (TUChar *)(m_pRear); TUChar *pHeader = (TUChar *)(m_pHeader); #ifdef _DEBUG bool needRecycle = false; #endif if (pRear < pHeader) { dataLen = (pHeader - pRear); } else { #ifdef _DEBUG needRecycle = true; #endif dataLen = (m_pMemPool + m_memPoolSize - pRear); } if (dataLen >= len) { memcpy(pTo,pRear,len); pRear += len; if (pRear == (m_pMemPool + m_memPoolSize)) { m_pRear = m_pMemPool; } else { m_pRear = pRear; } } else { #ifdef _DEBUG if (!needRecycle) { return FAIL; } #endif memcpy(pTo,pRear,dataLen); TInt32 remainLen = len - dataLen; memcpy((pTo+dataLen),m_pMemPool,remainLen); m_pRear = m_pMemPool + remainLen; } return len; }
TUChar *CPipe::GetData(TUInt32& len) { if (GetDataLen() < len) { return NULL; } TUChar *pRear = (TUChar *)(m_pRear); TUChar *pHeader = (TUChar *)(m_pHeader); if (pRear <= pHeader) { len = pHeader - pRear; } else { len = (m_pMemPool + m_memPoolSize - pRear); } return pRear; }
TUChar *CPipe::Peek(TUChar *pBuffer,TUInt32 len) { TUInt32 result = GetDataLen(); if (result < len) { return NULL; } TUChar *pHeader = (TUChar *)m_pHeader; TUChar *pRear = (TUChar *)m_pRear; if (pHeader >= pRear) { TUInt32 buffLen = pHeader - pRear; if (len <= buffLen) { //memcpy(pBuffer,m_pRear,len); return (TUChar*)(pRear); } else { //not enough data;something wrong return NULL; } } else { TUInt32 buffLen = m_pMemPool + m_memPoolSize - pRear; if (buffLen >= len) { //memcpy(pBuffer,(const void*)(m_pRear),len); return (TUChar*)(pRear); } else { memcpy(pBuffer,(const void*)(pRear),buffLen); memcpy(pBuffer + buffLen,m_pMemPool,(len - buffLen)); return pBuffer; } } }
bool DVFrame::IsComplete( void ) { return GetDataLen() == GetFrameSize(); }