blob: ec672043d65546a87046ab8c7b25a817be75ac14 [file] [log] [blame]
/**
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <RtpService.h>
#include <RtpGlobal.h>
#include <RtpImpl.h>
#include <RtpStack.h>
#include <RtpTrace.h>
#include <RtpError.h>
RtpStack* g_pobjRtpStack = RTP_NULL;
RtpDt_Void addSdesItem(
OUT RtcpConfigInfo* pobjRtcpCfgInfo, IN RtpDt_UChar* sdesName, IN RtpDt_UInt32 uiLength)
{
tRTCP_SDES_ITEM stSdesItem;
memset(&stSdesItem, RTP_ZERO, sizeof(tRTCP_SDES_ITEM));
RtpDt_UInt32 uiIndex = RTP_ZERO;
stSdesItem.ucType = RTP_ONE; // RTCP_SDES_CNAME
stSdesItem.ucLength = uiLength;
stSdesItem.pValue = sdesName;
pobjRtcpCfgInfo->addRtcpSdesItem(&stSdesItem, uiIndex);
return;
} // addSdesItem
RtpDt_Void populateReceiveRtpIndInfo(
OUT tRtpSvcIndSt_ReceiveRtpInd* pstRtpIndMsg, IN RtpPacket* pobjRtpPkt)
{
RtpHeader* pobjRtpHeader = pobjRtpPkt->getRtpHeader();
pstRtpIndMsg->bMbit = pobjRtpHeader->getMarker() > 0 ? eRTP_TRUE : eRTP_FALSE;
pstRtpIndMsg->dwTimestamp = pobjRtpHeader->getRtpTimestamp();
pstRtpIndMsg->dwPayloadType = pobjRtpHeader->getPayloadType();
pstRtpIndMsg->dwSeqNum = pobjRtpHeader->getSequenceNumber();
// Header length
pstRtpIndMsg->wMsgHdrLen = RTP_FIXED_HDR_LEN;
pstRtpIndMsg->wMsgHdrLen += RTP_WORD_SIZE * pobjRtpHeader->getCsrcCount();
if (pobjRtpPkt->getExtHeader())
{
pstRtpIndMsg->wMsgHdrLen += pobjRtpPkt->getExtHeader()->getLength();
pstRtpIndMsg->bExtension = eRTP_TRUE;
RtpDt_UChar* pbuf = pobjRtpPkt->getExtHeader()->getBuffer();
pstRtpIndMsg->extensionData = ((((unsigned)*pbuf) << 8) & 0xff00) | ((pbuf[1] & 0x00ff));
}
else
{
pstRtpIndMsg->bExtension = eRTP_FALSE;
pstRtpIndMsg->extensionData = RTP_NULL;
}
// End Header length
// play the payload
RtpBuffer* pobjRtpPayload = pobjRtpPkt->getRtpPayload();
// Header
// body
if (!pobjRtpPayload)
{
pstRtpIndMsg->wMsgBodyLen = 0;
pstRtpIndMsg->pMsgBody = NULL;
return;
}
pstRtpIndMsg->wMsgBodyLen = pobjRtpPayload->getLength();
pstRtpIndMsg->pMsgBody = reinterpret_cast<RtpDt_UChar*>(pobjRtpPayload->getBuffer());
}
eRtp_Bool populateRcvdReportFromStk(
IN std::list<RtcpReportBlock*>& pobjRepBlkList, OUT tRtpSvcRecvReport* pstRcvdReport)
{
if (pobjRepBlkList.size() > RTP_ZERO)
{
// application supports one RR
RtcpReportBlock* pobjRepBlkElm = pobjRepBlkList.front();
if (pobjRepBlkElm == RTP_NULL)
{
return eRTP_FALSE;
}
pstRcvdReport->ssrc = pobjRepBlkElm->getSsrc();
pstRcvdReport->fractionLost = pobjRepBlkElm->getFracLost();
pstRcvdReport->cumPktsLost = pobjRepBlkElm->getCumNumPktLost();
pstRcvdReport->extHighSeqNum = pobjRepBlkElm->getExtHighSeqRcv();
pstRcvdReport->jitter = pobjRepBlkElm->getJitter();
pstRcvdReport->lsr = pobjRepBlkElm->getLastSR();
pstRcvdReport->delayLsr = pobjRepBlkElm->getDelayLastSR();
RTP_TRACE_MESSAGE("Received RR info : [SSRC = %u] [FRAC LOST = %u]", pstRcvdReport->ssrc,
pstRcvdReport->fractionLost);
RTP_TRACE_MESSAGE("Received RR info : [CUM PKTS LOST = %u] [EXT HIGE SEQ NUM = %u]",
pstRcvdReport->cumPktsLost, pstRcvdReport->extHighSeqNum);
RTP_TRACE_MESSAGE("Received RR info : [JITTER = %u] [LSR = %u]", pstRcvdReport->jitter,
pstRcvdReport->lsr);
RTP_TRACE_MESSAGE(
"Received RR info : [DELAY SINCE LSR = %u] ", pstRcvdReport->delayLsr, RTP_NULL);
}
else
{
pstRcvdReport->ssrc = RTP_ZERO;
pstRcvdReport->fractionLost = RTP_ZERO;
pstRcvdReport->cumPktsLost = RTP_ZERO;
pstRcvdReport->extHighSeqNum = RTP_ZERO;
pstRcvdReport->jitter = RTP_ZERO;
pstRcvdReport->lsr = RTP_ZERO;
pstRcvdReport->delayLsr = RTP_ZERO;
}
return eRTP_TRUE;
} // populateRcvdReportFromStk
eRtp_Bool populateRcvdRrInfoFromStk(
IN std::list<RtcpRrPacket*>& pobjRrList, OUT tNotifyReceiveRtcpRrInd* pstRrInfo)
{
if (pobjRrList.empty())
{
return eRTP_FALSE;
}
// application supports one RR
RtcpRrPacket* pobjRrPkt = pobjRrList.front();
if (pobjRrPkt == RTP_NULL)
{
return eRTP_FALSE;
}
tRtpSvcRecvReport* pstRcvdReport = &(pstRrInfo->stRecvRpt);
std::list<RtcpReportBlock*>& pobjRepBlkList = pobjRrPkt->getReportBlockList();
return populateRcvdReportFromStk(pobjRepBlkList, pstRcvdReport);
} // populateRcvdRrInfoFromStk
eRtp_Bool populateRcvdSrInfoFromStk(
IN std::list<RtcpSrPacket*>& pobjSrList, OUT tNotifyReceiveRtcpSrInd* pstSrInfo)
{
if (pobjSrList.empty())
{
return eRTP_FALSE;
}
// get SR packet data
RtcpSrPacket* pobjSrPkt = pobjSrList.front();
if (pobjSrPkt == RTP_NULL)
{
return eRTP_FALSE;
}
pstSrInfo->ntpTimestampMsw = pobjSrPkt->getNtpTime()->m_uiNtpHigh32Bits;
pstSrInfo->ntpTimestampLsw = pobjSrPkt->getNtpTime()->m_uiNtpLow32Bits;
pstSrInfo->rtpTimestamp = pobjSrPkt->getRtpTimestamp();
pstSrInfo->sendPktCount = pobjSrPkt->getSendPktCount();
pstSrInfo->sendOctCount = pobjSrPkt->getSendOctetCount();
RTP_TRACE_MESSAGE("Received SR info : [NTP High 32 = %u] [NTP LOW 32 = %u]",
pstSrInfo->ntpTimestampMsw, pstSrInfo->ntpTimestampLsw);
RTP_TRACE_MESSAGE(
"Received SR info : [RTP timestamp = %u] ", pstSrInfo->rtpTimestamp, RTP_NULL);
RTP_TRACE_MESSAGE("Received SR info : [SEND PKT COUNT = %u] [SEND OCTET COUNT = %u]",
pstSrInfo->sendPktCount, pstSrInfo->sendOctCount);
// populate tRtpSvcRecvReport
tRtpSvcRecvReport* pstRcvdReport = &(pstSrInfo->stRecvRpt);
RtcpRrPacket* pobjRepBlk = pobjSrPkt->getRrPktInfo();
std::list<RtcpReportBlock*>& pobjRepBlkList = pobjRepBlk->getReportBlockList();
return populateRcvdReportFromStk(pobjRepBlkList, pstRcvdReport);
}
eRtp_Bool populateRcvdFbInfoFromStk(
IN RtcpFbPacket* m_pobjRtcpFbPkt, OUT tRtpSvcIndSt_ReceiveRtcpFeedbackInd* stFbRtcpMsg)
{
if (m_pobjRtcpFbPkt != RTP_NULL)
{
stFbRtcpMsg->wPayloadType = m_pobjRtcpFbPkt->getRtcpHdrInfo()->getPacketType();
stFbRtcpMsg->wFmt = m_pobjRtcpFbPkt->getRtcpHdrInfo()->getReceptionReportCount();
stFbRtcpMsg->dwMediaSsrc = m_pobjRtcpFbPkt->getMediaSsrc();
stFbRtcpMsg->wMsgLen = m_pobjRtcpFbPkt->getRtcpHdrInfo()->getLength();
if (m_pobjRtcpFbPkt->getFCI() != RTP_NULL)
{
stFbRtcpMsg->pMsg = m_pobjRtcpFbPkt->getFCI()->getBuffer();
}
return eRTP_TRUE;
}
return eRTP_FALSE;
}
RtpDt_Void populateRtpProfile(OUT RtpStackProfile* pobjStackProfile)
{
pobjStackProfile->setRtcpBandwidth(RTP_DEF_RTCP_BW_SIZE);
pobjStackProfile->setMtuSize(RTP_CONF_MTU_SIZE);
pobjStackProfile->setTermNumber(RTP_CONF_SSRC_SEED);
}
RtpBuffer* GetCVOXHdr(IN tRtpSvc_SendRtpPacketParm* pstRtpParam)
{
RtpBuffer* pobjXHdr = new RtpBuffer();
// HDR extension
if (pstRtpParam->bXbit)
{
RtpDt_UChar* pBuf = new RtpDt_UChar[8];
pBuf[0] = (((unsigned)pstRtpParam->nDefinedByProfile) >> 8) & 0x00ff;
pBuf[1] = pstRtpParam->nDefinedByProfile & 0x00ff;
pBuf[2] = (((unsigned)pstRtpParam->nLength) >> 8) & 0x00ff;
pBuf[3] = (pstRtpParam->nLength) & 0x00ff;
pBuf[4] = (((unsigned)pstRtpParam->nExtensionData) >> 8) & 0x00ff;
pBuf[5] = (pstRtpParam->nExtensionData) & 0x00ff;
pBuf[6] = 0;
pBuf[7] = 0;
pobjXHdr->setBufferInfo(8, pBuf);
}
else
{
pobjXHdr->setBufferInfo(0, RTP_NULL);
}
return pobjXHdr;
}
RtpDt_UInt16 GetCVOXHdrLen(eRtp_Bool bEnableCVO)
{
if (bEnableCVO)
return RTP_CVO_XHDR_LEN;
return 0;
}
GLOBAL eRtp_Bool IMS_RtpSvc_Initialize()
{
if (g_pobjRtpStack == RTP_NULL)
{
g_pobjRtpStack = new RtpStack();
if (g_pobjRtpStack == RTP_NULL)
{
return eRTP_FALSE;
}
RtpStackProfile* pobjStackProfile = new RtpStackProfile();
if (pobjStackProfile == RTP_NULL)
{
return eRTP_FALSE;
}
populateRtpProfile(pobjStackProfile);
g_pobjRtpStack->setStackProfile(pobjStackProfile);
}
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_Deinitialize()
{
if (g_pobjRtpStack)
{
delete g_pobjRtpStack;
g_pobjRtpStack = RTP_NULL;
}
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_CreateSession(IN RtpDt_Char* szLocalIP, IN RtpDt_UInt32 port,
IN RtpDt_Void* pAppData, OUT RtpDt_UInt32* puSsrc, OUT RTPSESSIONID* hRtpSession)
{
if (g_pobjRtpStack == RTP_NULL || szLocalIP == RTP_NULL)
{
return eRTP_FALSE;
}
RtpSession* pobjRtpSession = g_pobjRtpStack->createRtpSession();
if (pobjRtpSession == RTP_NULL)
{
return eRTP_FALSE;
}
// set ip and port
RtpBuffer* pobjTransAddr = new RtpBuffer();
RtpDt_UInt32 uiIpLen = strlen(szLocalIP) + 1;
RtpDt_UChar* pcIpAddr = new RtpDt_UChar[uiIpLen];
memcpy(pcIpAddr, szLocalIP, uiIpLen);
pobjTransAddr->setBufferInfo(uiIpLen, pcIpAddr);
pobjRtpSession->setRtpTransAddr(pobjTransAddr);
pobjRtpSession->setRtpPort((RtpDt_UInt16)port);
*puSsrc = pobjRtpSession->getSsrc();
*hRtpSession = reinterpret_cast<RtpDt_Void*>(pobjRtpSession);
RtpImpl* pobjRtpImpl = new RtpImpl();
if (pobjRtpImpl == RTP_NULL)
{
return eRTP_FALSE;
}
pobjRtpImpl->setAppdata(pAppData);
RtcpConfigInfo* pobjRtcpConfigInfo = new RtcpConfigInfo();
addSdesItem(
pobjRtcpConfigInfo, reinterpret_cast<RtpDt_UChar*>(szLocalIP), strlen(szLocalIP) + 1);
eRTP_STATUS_CODE eInitSta = pobjRtpSession->initSession(pobjRtpImpl, pobjRtcpConfigInfo);
if (eInitSta != RTP_SUCCESS)
{
return eRTP_FALSE;
}
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SetPayload(IN RTPSESSIONID hRtpSession,
IN tRtpSvc_SetPayloadParam* pstPayloadInfo, IN eRtp_Bool bEnableXHdr,
IN RtpDt_UInt32 nNumOfPayloadParam)
{
RtpDt_UInt32 payloadType[RTP_MAX_PAYLOAD_TYPE] = {0};
for (RtpDt_UInt32 i = 0; i < nNumOfPayloadParam; i++)
{
RTP_TRACE_MESSAGE(
"IMS_RtpSvc_SetPayload payloadtype = %d", pstPayloadInfo[i].payloadType, 0);
payloadType[i] = pstPayloadInfo[i].payloadType;
}
RtpPayloadInfo* pobjlPayloadInfo =
new RtpPayloadInfo(payloadType, pstPayloadInfo[0].samplingRate, nNumOfPayloadParam);
if (pobjlPayloadInfo == RTP_NULL)
{
return eRTP_FALSE;
}
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
{
delete pobjlPayloadInfo;
return eRTP_FALSE;
}
eRTP_STATUS_CODE eInitSta =
pobjRtpSession->setPayload(pobjlPayloadInfo, GetCVOXHdrLen(bEnableXHdr));
delete pobjlPayloadInfo;
if (eInitSta != RTP_SUCCESS)
{
return eRTP_FALSE;
}
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SetRTCPInterval(IN RTPSESSIONID hRtpSession, IN RtpDt_UInt32 nInterval)
{
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(reinterpret_cast<RtpSession*>(hRtpSession)) ==
eRTP_FAILURE)
return eRTP_FALSE;
(reinterpret_cast<RtpSession*>(hRtpSession))->setRTCPTimerValue(nInterval);
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_DeleteSession(IN RTPSESSIONID hRtpSession)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
eRTP_STATUS_CODE eDelRtpStrm = g_pobjRtpStack->deleteRtpSession(pobjRtpSession);
if (eDelRtpStrm != RTP_SUCCESS)
{
return eRTP_FALSE;
}
delete pobjRtpSession;
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SendRtpPacket(IN RtpServiceListener* pobjRtpServiceListener,
IN RTPSESSIONID hRtpSession, IN RtpDt_Char* pBuffer, IN RtpDt_UInt16 wBufferLength,
IN tRtpSvc_SendRtpPacketParm* pstRtpParam)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
if (pobjRtpSession->isRtpEnabled() == eRTP_FALSE)
{
return eRTP_FALSE;
}
RtpBuffer* pobjRtpPayload = new RtpBuffer();
if (pobjRtpPayload == RTP_NULL)
{
RTP_TRACE_WARNING(
"IMS_RtpSvc_SendRtpPacket pobjRtpPayload - Malloc failed", RTP_ZERO, RTP_ZERO);
return eRTP_FALSE;
}
RtpBuffer* pobjRtpBuf = new RtpBuffer();
if (pobjRtpBuf == RTP_NULL)
{
delete pobjRtpPayload;
RTP_TRACE_MESSAGE(
"IMS_RtpSvc_SendRtpPacket pobjRtpBuf - Malloc failed", RTP_ZERO, RTP_ZERO);
return eRTP_FALSE;
}
// Create RTP packet
// 1. Set Marker bit
eRtp_Bool bMbit = eRTP_FALSE;
if (pstRtpParam->bMbit == eRTP_TRUE)
{
bMbit = eRTP_TRUE;
}
// 2. Set Payload
pobjRtpPayload->setBufferInfo(wBufferLength, reinterpret_cast<RtpDt_UChar*>(pBuffer));
eRtp_Bool bUseLastTimestamp = pstRtpParam->bUseLastTimestamp ? eRTP_TRUE : eRTP_FALSE;
eRTP_STATUS_CODE eRtpCreateStat = pobjRtpSession->createRtpPacket(pobjRtpPayload, bMbit,
pstRtpParam->byPayLoadType, bUseLastTimestamp, pstRtpParam->diffFromLastRtpTimestamp,
GetCVOXHdr(pstRtpParam), pobjRtpBuf);
// 3. de-init and free the temp variable both in success and failure case
pobjRtpPayload->setBufferInfo(RTP_ZERO, RTP_NULL);
delete pobjRtpPayload;
if (eRtpCreateStat != RTP_SUCCESS)
{
delete pobjRtpBuf;
RTP_TRACE_WARNING(
"IMS_RtpSvc_SendRtpPacket - eRtpCreateStat != RTP_SUCCESS ", RTP_ZERO, RTP_ZERO);
return eRTP_FALSE;
}
// End Create RTP packet
if (pobjRtpSession->isRtpEnabled() == eRTP_FALSE)
{
delete pobjRtpBuf;
return eRTP_FALSE;
}
// dispatch to peer
if (pobjRtpServiceListener->OnRtpPacket(pobjRtpBuf->getBuffer(), pobjRtpBuf->getLength()) == -1)
{
delete pobjRtpBuf;
RTP_TRACE_WARNING("On Rtp packet failed ..! OnRtpPacket", RTP_ZERO, RTP_ZERO);
return eRTP_FALSE;
}
delete pobjRtpBuf;
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_ProcRtpPacket(IN RtpServiceListener* pvIRtpSession,
IN RTPSESSIONID hRtpSession, IN RtpDt_UChar* pMsg, IN RtpDt_UInt16 uiMsgLength,
IN RtpDt_Char* pPeerIp, IN RtpDt_UInt16 uiPeerPort, OUT RtpDt_UInt32& uiPeerSsrc)
{
tRtpSvc_IndicationFromStack stackInd = RTPSVC_RECEIVE_RTP_IND;
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
{
return eRTP_FALSE;
}
if (pobjRtpSession->isRtpEnabled() == eRTP_FALSE)
{
return eRTP_FALSE;
}
RtpPacket* pobjRtpPkt = new RtpPacket();
if (pobjRtpPkt == RTP_NULL)
{
RTP_TRACE_WARNING(
"IMS_RtpSvc_ProcRtpPacket pobjRtpPkt - Malloc failed", RTP_ZERO, RTP_ZERO);
return eRTP_FALSE;
}
RtpBuffer objRtpBuf;
objRtpBuf.setBufferInfo(uiMsgLength, pMsg);
RtpDt_UInt32 uiTransLen = strlen(reinterpret_cast<const RtpDt_Char*>(pPeerIp));
RtpBuffer objRmtAddr;
objRmtAddr.setBufferInfo(uiTransLen + 1, reinterpret_cast<RtpDt_UChar*>(pPeerIp));
eRTP_STATUS_CODE eStatus =
pobjRtpSession->processRcvdRtpPkt(&objRmtAddr, uiPeerPort, &objRtpBuf, pobjRtpPkt);
objRtpBuf.setBufferInfo(RTP_ZERO, RTP_NULL);
objRmtAddr.setBufferInfo(RTP_ZERO, RTP_NULL);
if (eStatus != RTP_SUCCESS)
{
if (eStatus == RTP_OWN_SSRC_COLLISION)
pobjRtpSession->sendRtcpByePacket();
RTP_TRACE_WARNING("process packet failed with reason [%d]", eStatus, RTP_ZERO);
delete pobjRtpPkt;
return eRTP_FALSE;
}
uiPeerSsrc = pobjRtpPkt->getRtpHeader()->getRtpSsrc();
// populate stRtpIndMsg
tRtpSvcIndSt_ReceiveRtpInd stRtpIndMsg;
stRtpIndMsg.pMsgHdr = pMsg;
populateReceiveRtpIndInfo(&stRtpIndMsg, pobjRtpPkt);
if (pobjRtpSession->isRtpEnabled() == eRTP_FALSE)
{
delete pobjRtpPkt;
return eRTP_FALSE;
}
pvIRtpSession->OnPeerInd(stackInd, (RtpDt_Void*)&stRtpIndMsg);
delete pobjRtpPkt;
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SessionEnableRTP(IN RTPSESSIONID rtpSessionId)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(rtpSessionId);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
if (pobjRtpSession->enableRtp() == RTP_SUCCESS)
return eRTP_TRUE;
return eRTP_FALSE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SessionDisableRTP(IN RTPSESSIONID rtpSessionId)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(rtpSessionId);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
if (pobjRtpSession->disableRtp() == RTP_SUCCESS)
return eRTP_TRUE;
return eRTP_FALSE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SessionEnableRTCP(
IN RTPSESSIONID hRtpSession, IN eRtp_Bool enableRTCPBye)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
eRTP_STATUS_CODE eRtcpStatus = pobjRtpSession->enableRtcp((eRtp_Bool)enableRTCPBye);
if (eRtcpStatus != RTP_SUCCESS)
{
return eRTP_FALSE;
}
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SessionDisableRTCP(IN RTPSESSIONID hRtpSession)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
eRTP_STATUS_CODE eRtcpStatus = RTP_SUCCESS;
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
eRtcpStatus = pobjRtpSession->disableRtcp();
if (eRtcpStatus != RTP_SUCCESS)
{
return eRTP_FALSE;
}
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SendRtcpByePacket(IN RTPSESSIONID hRtpSession)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
pobjRtpSession->sendRtcpByePacket();
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SendRtcpRtpFbPacket(IN RTPSESSIONID hRtpSession,
IN RtpDt_UInt32 uiFbType, IN RtpDt_Char* pcBuff, IN RtpDt_UInt32 uiLen,
IN RtpDt_UInt32 uiMediaSsrc)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
pobjRtpSession->sendRtcpRtpFbPacket(uiFbType, pcBuff, uiLen, uiMediaSsrc);
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SendRtcpPayloadFbPacket(IN RTPSESSIONID hRtpSession,
IN RtpDt_UInt32 uiFbType, IN RtpDt_Char* pcBuff, IN RtpDt_UInt32 uiLen,
IN RtpDt_UInt32 uiMediaSsrc)
{
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
pobjRtpSession->sendRtcpPayloadFbPacket(uiFbType, pcBuff, uiLen, uiMediaSsrc);
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_ProcRtcpPacket(IN RtpServiceListener* pobjRtpServiceListener,
IN RTPSESSIONID hRtpSession, IN RtpDt_UChar* pMsg, IN RtpDt_UInt16 uiMsgLength,
IN RtpDt_Char* pcIpAddr, IN RtpDt_UInt32 uiRtcpPort, OUT RtpDt_UInt32* uiPeerSsrc)
{
(RtpDt_Void) uiPeerSsrc;
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
if (g_pobjRtpStack == RTP_NULL ||
g_pobjRtpStack->isValidRtpSession(pobjRtpSession) == eRTP_FAILURE)
return eRTP_FALSE;
if (pMsg == RTP_NULL || uiMsgLength == RTP_ZERO || pcIpAddr == RTP_NULL)
{
return eRTP_FALSE;
}
RtpBuffer objRmtAddr;
objRmtAddr.setBuffer(reinterpret_cast<RtpDt_UChar*>(pcIpAddr));
objRmtAddr.setLength(strlen(pcIpAddr) + 1);
// decrypt RTCP message
RtpBuffer objRtcpBuf;
objRtcpBuf.setBufferInfo(uiMsgLength, pMsg);
// process RTCP message
RtcpPacket objRtcpPkt;
eRTP_STATUS_CODE eProcRtcpSta =
pobjRtpSession->processRcvdRtcpPkt(&objRmtAddr, uiRtcpPort, &objRtcpBuf, &objRtcpPkt);
// clean the data
objRtcpBuf.setBufferInfo(RTP_ZERO, RTP_NULL);
objRmtAddr.setBufferInfo(RTP_ZERO, RTP_NULL);
RtpBuffer objRtpPayload;
objRtpPayload.setBufferInfo(RTP_ZERO, RTP_NULL);
if (eProcRtcpSta != RTP_SUCCESS)
{
RTP_TRACE_WARNING("Rtcp packet processing is failed", RTP_ZERO, RTP_ZERO);
return eRTP_FALSE;
}
// inform to application
std::list<RtcpSrPacket*>& pobjSrList = objRtcpPkt.getSrPacketList();
if (pobjSrList.size() > RTP_ZERO)
{
tRtpSvc_IndicationFromStack stackInd = RTPSVC_RECEIVE_RTCP_SR_IND;
tNotifyReceiveRtcpSrInd stSrRtcpMsg;
if (populateRcvdSrInfoFromStk(pobjSrList, &stSrRtcpMsg) == eRTP_TRUE)
{
pobjRtpServiceListener->OnPeerInd(stackInd, (RtpDt_Void*)&stSrRtcpMsg);
}
RtpDt_UInt32 rttd = pobjRtpSession->getRTTD();
pobjRtpServiceListener->OnPeerRtcpComponents((RtpDt_Void*)&rttd);
}
else
{
std::list<RtcpRrPacket*>& pobjRrList = objRtcpPkt.getRrPacketList();
if (pobjRrList.size() > RTP_ZERO)
{
tRtpSvc_IndicationFromStack stackInd = RTPSVC_RECEIVE_RTCP_RR_IND;
tNotifyReceiveRtcpRrInd stRrRtcpMsg;
if (populateRcvdRrInfoFromStk(pobjRrList, &stRrRtcpMsg) == eRTP_TRUE)
{
pobjRtpServiceListener->OnPeerInd(stackInd, (RtpDt_Void*)&stRrRtcpMsg);
}
RtpDt_UInt32 rttd = pobjRtpSession->getRTTD();
pobjRtpServiceListener->OnPeerRtcpComponents((RtpDt_Void*)&rttd);
}
} // end else
// process rtcp fb packet and inform to application
std::list<RtcpFbPacket*>& pobjFbList = objRtcpPkt.getFbPacketList();
for (auto& pobjFbPkt : pobjFbList)
{
// get Fb packet data
if (pobjFbPkt == RTP_NULL)
{
return eRTP_FALSE;
}
tRtpSvc_IndicationFromStack stackInd = RTPSVC_RECEIVE_RTCP_FB_IND;
if (pobjFbPkt->getRtcpHdrInfo()->getPacketType() == RTCP_PSFB)
{
stackInd = RTPSVC_RECEIVE_RTCP_PAYLOAD_FB_IND;
}
tRtpSvcIndSt_ReceiveRtcpFeedbackInd stFbRtcpMsg;
if (populateRcvdFbInfoFromStk(pobjFbPkt, &stFbRtcpMsg) == eRTP_TRUE)
pobjRtpServiceListener->OnPeerInd(stackInd, (RtpDt_Void*)&stFbRtcpMsg);
} // pobjFbList End
return eRTP_TRUE;
}
GLOBAL eRtp_Bool IMS_RtpSvc_SendRtcpXrPacket(IN RTPSESSIONID hRtpSession,
IN RtpDt_UChar* m_pBlockBuffer, IN RtpDt_UInt16 nblockLength, IN RtpDt_UInt16 nRttdOffset)
{
RTP_TRACE_MESSAGE("IMS_RtpSvc_SendRtcpXrPacket", 0, 0);
RtpSession* pobjRtpSession = reinterpret_cast<RtpSession*>(hRtpSession);
pobjRtpSession->sendRtcpXrPacket(m_pBlockBuffer, nblockLength, nRttdOffset);
return eRTP_TRUE;
}