CCmd* CNSSOperator::BuildCmd(const std::string& strLinkID, int iNetElementType,unsigned short iReqID,const char* pData, const std::string& strTransID) const { CCmd* pCmd = NULL; HW_NEW(pCmd, CCmd); //lint !e774 CHECK_POINTER(pCmd, NULL); pCmd->SetNetElemType(iNetElementType); pCmd->SetNetLinkID(strLinkID); pCmd->SetServiceID(SERVICE_COMMU); pCmd->SetReqID(iReqID); pCmd->SetCmdType(CMD_SEND); if (IVS_SUCCEED != ConfCmd(pCmd,iReqID,pData,strTransID)) { return NULL; } return pCmd;//lint !e429 }
// 直接传入拼装完成的内容部分,组成CMD,传递文件使用 CCmd* CNSSOperator::BuildCmd(const std::string& strLinkID, int iNetElementType, unsigned short iReqID, const char* pData, int length) const { CCmd* pCmd = NULL; HW_NEW(pCmd, CCmd); //lint !e774 CHECK_POINTER(pCmd, NULL); pCmd->SetNetElemType(iNetElementType); pCmd->SetNetLinkID(strLinkID); pCmd->SetServiceID(SERVICE_COMMU); pCmd->SetReqID(iReqID); pCmd->SetCmdType(CMD_SEND); // 生成事务ID std::string strTransID = CMKTransID::Instance().GenerateTransID(); pCmd->SetTransID(strTransID); // NSS头 TNssMsgHeader m_header; memset(&m_header, 0, sizeof(TNssMsgHeader)); m_header.usiProtocolVersion = 0x0100; m_header.usiMsgType = iReqID; m_header.uiSeqID = 0; m_header.uiTraceID = 0; strncpy(m_header.szTransactionNo, strTransID.c_str(), MaxTransactionNoLength - 1); m_header.uiRspCode = 0; m_header.uiPacketLength = sizeof(TNssMsgHeader) + static_cast<IVS_UINT32>(length); // 转换网络字节序 m_header.usiProtocolVersion = ntohs(m_header.usiProtocolVersion); m_header.usiMsgType = ntohs(m_header.usiMsgType); m_header.uiSeqID = ntohl(m_header.uiSeqID); m_header.uiTraceID = ntohl(m_header.uiTraceID); m_header.uiRspCode = ntohl(m_header.uiRspCode); m_header.uiPacketLength = ntohl(m_header.uiPacketLength); // 定义ACE的消息缓冲,这个在cmd里面去释放,这里不释放 ACE_Message_Block* pMsgBlock = new ACE_Message_Block(sizeof(TNssMsgHeader) + static_cast<IVS_UINT32>(length)); //lint !e429 pMsgBlock->copy((char*)&m_header, sizeof(TNssMsgHeader)); pMsgBlock->copy(pData, static_cast<IVS_UINT32>(length)); // 设置数据到CMD,数据应该由CMD统一释放掉 pCmd->SetMsgBlock(pMsgBlock);//lint !e613 return pCmd;//lint !e429 }
/***************************************************************************** Function: HSPspkt2ESFrm Description: 拼完一帧PS数据后处理媒体数据 Input: pPacket PS帧数据缓存 iPktLen PS帧数据长度 Output: pFrame 转换后数据存储缓存 iVideoLen 视频长度 iAudioLen 音频长度 Return: IVS_SUCCEED 成功 其他 失败 *****************************************************************************/ int CPs2EsProcessor::HSPspkt2ESFrm(unsigned char * pPacket, int iPktLen, unsigned char *&pFrame, int &iVideoLen, int &iAudioLen) { if (m_pHstPESParse == NULL) { HW_NEW(m_pHstPESParse, CHstPESParse); //lint !e774 !e831 if(NULL == m_pHstPESParse) { ERROR_LOG("m_pHstPESParse is NULL"); return IVS_ALLOC_MEMORY_ERROR; } if (m_pHstPESParse->Create()) { HW_DELETE(m_pHstPESParse); ERROR_LOG("Create PS parse fail"); return IVS_FAIL; } } int nStreamId = 0; HstPSHeader stPSHeader; HstPSFrame stPSFrame; stPSFrame.buf = m_pHstPESParse->mRawFrameBuffer.pPayLoad; stPSFrame.length = 0; stPSFrame.audio_length = 0; stPSFrame.max = m_pHstPESParse->mRawFrameBuffer.nMaxLength; int nConsumedBytes = 0; int nPSPacketLength = 0; int nVideoPayloadLength = 0; int nAudioPayloadLength = 0; unsigned char* pPSFrame = pPacket; unsigned char* pVideoPayload = m_pHstPESParse->mRawFrameBuffer.pCurPSPacketPayLoad; int uiTimes = 0; while (1) //lint !e716 { nPSPacketLength = m_pHstPESParse->ParsePSPacket( &stPSHeader, pPSFrame + nConsumedBytes, iPktLen - nConsumedBytes, &stPSFrame, &nStreamId); if (nPSPacketLength <= 0) { ERROR_LOG("Parse ps packet fail, it's a bad ps packet"); // 保证前面解析出来的数据不被抛弃 if (0 != uiTimes) { break; } return IVS_FAIL; } nConsumedBytes += nPSPacketLength; if (nConsumedBytes > iPktLen) { ERROR_LOG("Parse ps packet fail, ps packet length is wrong."); return IVS_FAIL; } memcpy(pVideoPayload + nVideoPayloadLength, stPSFrame.buf, (unsigned int)(stPSFrame.length + stPSFrame.audio_length)); nVideoPayloadLength += stPSFrame.length; nAudioPayloadLength += stPSFrame.audio_length; if (nConsumedBytes == iPktLen) { break; } ++uiTimes; // 此处为异常处理,出现失败直接恢复到原来的状态 if (m_RtpFrameOrganizer.checkLostPacket()) //lint !e1013 !e1055 !e746 { int iBuffLen = stPSFrame.length + stPSFrame.audio_length; unsigned char *pFindPESBuff = NULL; HW_NEW_A(pFindPESBuff, unsigned char, (unsigned int)iBuffLen); if (NULL == pFindPESBuff) //lint !e831 { ERROR_LOG("Alloc finde PES header buff fail"); continue; } memcpy(pFindPESBuff, stPSFrame.buf, (unsigned int)(stPSFrame.length + stPSFrame.audio_length)); for (int i = iBuffLen - (SEGMENT_MAX_SIZE_T / 2); i >= SEGMENT_MAX_SIZE_T; --i) { unsigned char ucType = 0; int iRet = m_pHstPESParse->CheckPSHeader(pFindPESBuff + i, 4, ucType); if (IVS_SUCCEED != iRet) { continue; } else { if (0xc0 == ucType) { nAudioPayloadLength -= (iBuffLen - i); } else { nVideoPayloadLength -= (iBuffLen - i); } nConsumedBytes -= (iBuffLen - i); //BP_DBG_LOG("Find pes header success, index=%d", i); break; } } HW_DELETE_A(pFindPESBuff); } //lint !e438 }