int CSDKMainctrl::OnUserOffLineNotify(CCmd* pCmd)const
{
    // 从cmd中获取xml
    CHECK_POINTER(pCmd, IVS_OPERATE_MEMORY_ERROR);

    IVS_INT32 iRet = IVS_FAIL;
    IVS_CHAR *pszInfo = CNSSOperator::instance().ParseCmd2XML(pCmd, iRet);
    CHECK_POINTER(pszInfo, IVS_OPERATE_MEMORY_ERROR);

    IVS_USER_OFFLINE_INFO pstUserOffline;
    memset(&pstUserOffline, 0, sizeof(IVS_USER_OFFLINE_INFO));

    IVS_CHAR cLoginID[LOGIN_ID_LEN + 1];
    memset(cLoginID, 0, LOGIN_ID_LEN+1);

    if (IVS_SUCCEED == iRet)
    {
        CXml xmlRsp;
        if (!xmlRsp.Parse(pszInfo))
        {
            BP_RUN_LOG_ERR(IVS_XML_INVALID, "UserOffLine Notify", "xml parsing error");
			HW_DELETE_A(pszInfo);
            return IVS_XML_INVALID;
        }
        iRet = CLoginXMLProcess::ParseUserOffLineXML(xmlRsp, cLoginID, &pstUserOffline);
    }
    if (IVS_SUCCEED != iRet)
    {
        BP_RUN_LOG_ERR(IVS_XML_INVALID, "UserOffLine Notify", "xml parsing error");
		HW_DELETE_A(pszInfo);
        return IVS_XML_INVALID;
    }
    //根据loginID获取sessionID
    //IVS_INT32 iSessionID = g_pNvs->GetSessionIDByLoginID(cLoginID);
    IVS_INT32 iSessionID = CLinkRouteMgr::instance().FindSessionIDByLinkID(pCmd->GetNetLinkID()); //lint !e1013 !e64
    if (SDK_SESSIONID_INIT == iSessionID)
    {
        BP_RUN_LOG_ERR(IVS_SDK_RET_INVALID_SESSION_ID, "UserOffLine Notify", "iSessionID is -1");
		HW_DELETE_A(pszInfo);
        return IVS_SDK_RET_INVALID_SESSION_ID;
    }
    pstUserOffline.iSessionID = iSessionID;
    (void)CEventCallBackJob::instance().PostEvent(iSessionID, IVS_EVENT_USER_OFFLINE, &pstUserOffline, sizeof(pstUserOffline));
    HW_DELETE_A(pszInfo);
    
    //清理资源
    (void)g_pNvs->Logout(iSessionID, false);

    return IVS_SUCCEED;
}
// add by zwx211831, Date:20140605 处理客户端关闭视频业务通知
int CSDKMainctrl::OnShutdownStreamNotify(CCmd* pCmd) const
{
	CHECK_POINTER(pCmd, IVS_OPERATE_MEMORY_ERROR);

	IVS_INT32 iRet = IVS_FAIL;
	IVS_CHAR *pInfo = CNSSOperator::instance().ParseCmd2XML(pCmd, iRet);
	CHECK_POINTER(pInfo, IVS_OPERATE_MEMORY_ERROR);

	IVS_SHUTDOWN_NOTIFY_INFO stShutdownNotifyInfo = {0};
	if (IVS_SUCCEED == iRet)
	{
		CXml xmlRsp;
		if (!xmlRsp.Parse(pInfo))
		{
			BP_RUN_LOG_ERR(IVS_XML_INVALID, "OnShutdownStreamNotify", "XML parse failed");
			HW_DELETE_A(pInfo);
			return IVS_XML_INVALID;
		}
		iRet = CRealXMLProcess::ParseShutdownNotifyXML(xmlRsp, &stShutdownNotifyInfo);
	}
	if (IVS_SUCCEED != iRet)
	{
		BP_RUN_LOG_ERR(IVS_XML_INVALID, "OnShutdownStreamNotify", "XML parse failed");
		HW_DELETE_A(pInfo);
		return IVS_XML_INVALID;
	}

	IVS_INT32 iSessionID = CLinkRouteMgr::instance().FindSessionIDByLinkID(pCmd->GetNetLinkID());
	if (SDK_SESSIONID_INIT == iSessionID)
	{
		BP_RUN_LOG_ERR(IVS_SDK_RET_INVALID_SESSION_ID, "OnShutdownStreamNotify", "iSessionID is -1");
		HW_DELETE_A(pInfo);
		return IVS_SDK_RET_INVALID_SESSION_ID;
	}
	(void)CEventCallBackJob::instance().PostEvent(iSessionID, IVS_EVENT_SHUTDOWN_STREAM, &stShutdownNotifyInfo, sizeof(stShutdownNotifyInfo));
	HW_DELETE_A(pInfo);

	return IVS_SUCCEED;
}
Exemplo n.º 3
0
CPs2EsProcessor::~CPs2EsProcessor()
{
	try 
	{
		ReleasePktList();
	}
	catch(...)
	{
	}

    if (NULL != m_pRtpFrameCache)
    {
        HW_DELETE_A(m_pRtpFrameCache);
        m_pWritePos = NULL;
    }
    
    if (NULL != m_pHstPESParse)
    {        
		try 
		{
			(void)m_pHstPESParse->Delete();
		}
		catch(...)
		{
		}
        
        try
        {
            HW_DELETE(m_pHstPESParse);
        }
        catch(...)
        {
            m_pHstPESParse = NULL;
        }
    }
	try 
	{
		m_pExtendHeader->release();
		m_pExtendHeader = NULL;
	}
	catch(...)
	{
	}
	m_pWritePos      = NULL;
}
Exemplo n.º 4
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
    }