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