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
}
Пример #3
0
/*****************************************************************************
 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
    }