📄 m803xxrtcp.c
字号:
*((UINT32 *)PacketEnd+1) = Swap_DwordM((((RTCPInfo[PortNo].RTPSSRC)&0xff000000)>>8)
|(((RTCPInfo[PortNo].RTPSSRC)&0x00ff0000)<<8)
|(((RTCPInfo[PortNo].RTPSSRC)&0x0000ff00)>>8)
|(((RTCPInfo[PortNo].RTPSSRC)&0x000000ff)<<8)
);
/**((UINT32 *)PacketEnd+2) = Swap_DwordM(0x01075a54);*/
*((UINT32 *)PacketEnd+2) = Swap_DwordM(0x02115a54);
*((UINT32 *)PacketEnd+3) = Swap_DwordM(0x452d5a58);
*((UINT32 *)PacketEnd+4) = Swap_DwordM(0x52313047);
*((UINT32 *)PacketEnd+5) = Swap_DwordM(0x41522d56);
/**((UINT32 *)PacketEnd+6) = Swap_DwordM(0x4f495020);*/
*((UINT32 *)PacketEnd+6) = Swap_DwordM(0x4f495000);
#if 0
RTCPSwapSRPacket(Buffer);
#endif
return (char *)((char *)PacketEnd+28);
}
/***************************************************************************************/
/* Function name: RTCPBuildRRPacket */
/* Description : builds Receiverer Report packet */
/* Return type : char* - pointer to the end of the packet + 1 (start of next packet) */
/* Argument : PortNo - the channel on the board */
/* Buffer - pointer to buffer to hold the packet, */
/* The USER MUST SUPPLY ENOUGH SPACE FOR THE PACKET! */
/* Author/Date : */
/* Note: called before sending RTCP packet */
/***************************************************************************************/
char *RTCPBuildRRPacket(UINT8 PortNo,char *Buffer)
{
char *PacketEnd;
unsigned int delta,frac;
RTCPPacket=(TRTCP*)Buffer;
/*Header*/
RTCPPacket->Common.RTCPVer=RTP_VERSION;
RTCPPacket->Common.RTCPPadding=0;
RTCPPacket->Common.RTCPCount=0;
RTCPPacket->Common.RTCPPT=RTCP_RR;
RTCPPacket->Common.RTCPLength=1;
RTCPPacket->Common.RTCPSsrc=Swap_DwordM((((RTCPInfo[PortNo].RTPSSRC)&0xff000000)>>8)
|(((RTCPInfo[PortNo].RTPSSRC)&0x00ff0000)<<8)
|(((RTCPInfo[PortNo].RTPSSRC)&0x0000ff00)>>8)
|(((RTCPInfo[PortNo].RTPSSRC)&0x000000ff)<<8)
);
PacketEnd=(char*)(&(RTCPPacket->Report.RR[0]));
/*RR*/
if (RTCPInfo[PortNo].PacketRcvdSinceSR)
{
/*fill fraction and cumolative losts*/
RTCPRRLostFill(RTCPPacket,PortNo);
/*fill other params*/
RTCPPacket->Report.RR[0].RTCPSsrc =RTCPInfo[PortNo].RemoteSSRC;
RTCPPacket->Report.RR[0].RTCPLast_seq=RTCPInfo[PortNo].MaxSeq;
RTCPPacket->Report.RR[0].RTCPJitter =RTCPJitter(PortNo,0,0,0);
RTCPPacket->Report.RR[0].RTCPLsr =RTCPInfo[PortNo].Lsr;
delta=(unsigned int)(RecordRTPTimeStamp[PortNo]-RTCPInfo[PortNo].LastSRArrival);
/*this is the equivelent of 65536/8000=8.192*/
frac =(unsigned int)((unsigned int)delta*(unsigned int)192);
frac =(unsigned int)((unsigned int)frac/(unsigned int)1000);
RTCPPacket->Report.RR[0].RTCPDlsr=(unsigned int)((unsigned int)delta*(unsigned int)8)+(unsigned int)frac;
/*calculate total length*/
RTCPPacket->Common.RTCPLength=Swap_WordM((UINT16)((((unsigned int)(&(RTCPPacket->Report.RR[1]))-(unsigned int)(Buffer))/sizeof(unsigned int))-1));
RTCPPacket->Common.RTCPCount=1;
PacketEnd=(char*)(&(RTCPPacket->Report.RR[1]));
}
/*add extension if necessary*/
if (RTCPInfo[PortNo].TxExtLength)
{
memcpy(PacketEnd,RTCPInfo[PortNo].TxExtension,RTCPInfo[PortNo].TxExtLength);
RTCPPacket->Common.RTCPLength+=RTCPInfo[PortNo].TxExtLength/sizeof(unsigned int);
PacketEnd+=RTCPInfo[PortNo].TxExtLength;
if (RTCPInfo[PortNo].SendExtOnce)
RTCPInfo[PortNo].TxExtLength=0;
}
/*send event to PC*/
RTCPRepBuff[PortNo].PacketCount =(unsigned int )RTCPInfo[PortNo].SenderPacketCount; ;
RTCPRepBuff[PortNo].OctetCount =(unsigned int )RTCPInfo[PortNo].SenderOctetCount; ;
RTCPRepBuff[PortNo].RoundTrip =(unsigned int )0 ;
RTCPRepBuff[PortNo].ReportType =RTCP_RR_Tx;
if (RTCPInfo[PortNo].PacketRcvdSinceSR)
{
RTCPRepBuff[PortNo].Jitter =(unsigned int )RTCPPacket->Report.RR[0].RTCPJitter;
RTCPRepBuff[PortNo].CumLost =(unsigned int )(RTCPPacket->Report.RR[0].RTCPCumLost & 0xFFFFFFFF);
RTCPRepBuff[PortNo].FractionLost =(unsigned int )RTCPPacket->Report.RR[0].RTCPFraction;
RTCPRepBuff[PortNo].ExtHighSeq =(unsigned int )RTCPPacket->Report.RR[0].RTCPLast_seq ;
}
else
{
RTCPRepBuff[PortNo].Jitter =(unsigned int )-1;
RTCPRepBuff[PortNo].CumLost =(unsigned int )-1;
RTCPRepBuff[PortNo].FractionLost =(unsigned int )-1;
RTCPRepBuff[PortNo].ExtHighSeq =(unsigned int )-1;
}
RtpValue[PortNo].Rcvr_RrTime = 0;
RTCPInfo[PortNo].PacketRcvdSinceSR=0;
RTCPInfo[PortNo].PacketSentSinceSR=0;
#if 0
RTCPSwapRRPacket(Buffer);
#endif
return (PacketEnd);
}
#if 1
/***************************************************************************************/
/* Function name: RTCPDecodeSRPacket */
/* Description : Decodes Received SR packet */
/* Return type : void */
/* Argument : PortNo - the channel on the board */
/* RTCPFrame- pointer to the beginning of the SR packet */
/* Author/Date : */
/* Note: called after receiving RTCP SR packet */
/***************************************************************************************/
void RTCPDecodeSRPacket(UINT8 PortNo, char *RTCPFrame)
{
unsigned int A,LSR,DLSR;
unsigned short LSRSec,LSRFrac;
int RoundTrip;
TRTCP* ptr;
ptr = (TRTCP*)RTCPFrame;
RTCPInfo[PortNo].Lsr=((ptr->Report.SR.RTCPNtpSec)<<16)|
((ptr->Report.SR.RTCPNtpFrac)>>16);
/* RTCPInfo[PortNo].LastSRArrival=TxChInfo[PortNo].RTPTimeStamp;*/
RTCPInfo[PortNo].LastSRArrival=RecordRTPTimeStamp[PortNo];
if ((ptr->Common.RTCPCount)==1)
{
/*Last SR in mSec*/
if (((ptr->Report.SR.RR[0].RTCPLsr)!=0))
{
/*Arrival of the packet in mSec*/
/* A=TxChInfo[PortNo].RTPTimeStamp/SAMPLES_PER_MSEC ;*/
A=RecordRTPTimeStamp[PortNo]/SAMPLES_PER_MSEC ;
LSRSec =(unsigned short)((ptr->Report.SR.RR[0].RTCPLsr)>>16);
LSRFrac=(unsigned short)((ptr->Report.SR.RR[0].RTCPLsr) & 0x0000FFFF);
LSR=(unsigned int)LSRSec*1000+(unsigned int)LSRFrac/((unsigned int)FracmSecTimeShort) ;
/*Delay of last SR at the Remote in mSec*/
DLSR=(unsigned int)((ptr->Report.SR.RR[0].RTCPDlsr)*125/8192);
RoundTrip=(A-LSR-DLSR);
if (RoundTrip<0) RoundTrip=0;
RoundTrip%=ROUND_TRIP_WRAP_AROUND;
}
else
{
RoundTrip=(int)0xFFFFFFFF;
}
RTCPRepBuff[PortNo].PacketCount = (unsigned int )(ptr->Report.SR.RTCPPsent);
RTCPRepBuff[PortNo].OctetCount = (unsigned int )(ptr->Report.SR.RTCPOsent);
RTCPRepBuff[PortNo].Jitter = (unsigned int )(ptr->Report.SR.RR[0].RTCPJitter/SAMPLES_PER_MSEC);
RTCPRepBuff[PortNo].RoundTrip = (unsigned int )RoundTrip;
RTCPRepBuff[PortNo].FractionLost = (unsigned int )(ptr->Report.SR.RR[0].RTCPFraction);
RTCPRepBuff[PortNo].CumLost = (unsigned int )(ptr->Report.SR.RR[0].RTCPCumLost & 0xFFFFFFFF);
RTCPRepBuff[PortNo].ExtHighSeq = (unsigned int )(ptr->Report.SR.RR[0].RTCPLast_seq);
RTCPRepBuff[PortNo].ReportType = RTCP_SR_Rx;
}
else
{ /*empty SR or for more than one source*/
RTCPRepBuff[PortNo].PacketCount =(unsigned int )(ptr->Report.SR.RTCPPsent);
RTCPRepBuff[PortNo].OctetCount =(unsigned int )(ptr->Report.SR.RTCPOsent);
RTCPRepBuff[PortNo].Jitter =(unsigned int )-1;
RTCPRepBuff[PortNo].RoundTrip =(unsigned int )-1;
RTCPRepBuff[PortNo].FractionLost =(unsigned int )-1;
RTCPRepBuff[PortNo].CumLost =(unsigned int )-1;
RTCPRepBuff[PortNo].ExtHighSeq =(unsigned int )-1;
RTCPRepBuff[PortNo].ReportType =RTCP_SR_Rx;
}
RtpValue[PortNo].Rcvr_LostPackets = RTCPRepBuff[PortNo].CumLost;
RtpValue[PortNo].Rcvr_Jitter = RTCPRepBuff[PortNo].Jitter;
RtpValue[PortNo].Rcvr_Rtt = RTCPRepBuff[PortNo].RoundTrip;
RtpValue[PortNo].Sender_SrTime =0;
/*check for extensions*/
if ((ptr->Common.RTCPLength)>(7-1+(ptr->Common.RTCPCount)*6))
{
if (4*(ptr->Common.RTCPLength)-4*(7+(ptr->Common.RTCPCount)*6)<256)
{
RTCPInfo[PortNo].RxExtLength=4*(ptr->Common.RTCPLength)-4*(7+(ptr->Common.RTCPCount)*6)+4;
memcpy(RTCPInfo[PortNo].RxExtension,RTCPFrame+4*(7+(ptr->Common.RTCPCount)*6),RTCPInfo[PortNo].RxExtLength);
}
}
}
/***************************************************************************************/
/* Function name: RTCPDecodeRRPacket */
/* Description : Decodes Received RR packet */
/* Return type : void */
/* Argument : PortNo - the channel on the board */
/* RTCPFrame- pointer to the beginning of the SR packet */
/* Author/Date : */
/* Note: called after receiving RTCP RR packet */
/***************************************************************************************/
void RTCPDecodeRRPacket(UINT8 PortNo, char *RTCPFrame)
{
unsigned int A,LSR,DLSR;
unsigned short LSRSec,LSRFrac;
int RoundTrip;
TRTCP* ptr;
ptr = (TRTCP*)RTCPFrame;
RtpValue[PortNo].Rcvr_Rrs++;
if ((ptr->Common.RTCPCount)==1)
{
/* if (((ptr->Report.SR.RR[0].RTCPLsr)!=0))*/
if (((ptr->Report.RR[0].RTCPLsr)!=0))
{
/*Arrival of the packet in mSec*/
/* A=TxChInfo[PortNo].RTPTimeStamp/SAMPLES_PER_MSEC ;*/
A=RecordRTPTimeStamp[PortNo]/SAMPLES_PER_MSEC ;
/*Last SR in mSec*/
LSRSec =(unsigned short)((ptr->Report.RR[0].RTCPLsr)>>16);
LSRFrac=(unsigned short)((ptr->Report.RR[0].RTCPLsr) & 0x0000FFFF);
LSR=(unsigned int)LSRSec*1000+(unsigned int)LSRFrac/((unsigned int)FracmSecTimeShort) ;
/*Delay of last SR at the Remote in mSec*/
DLSR=(unsigned int)((ptr->Report.RR[0].RTCPDlsr)*125/8192);
RoundTrip=(A-LSR-DLSR);
if (RoundTrip<0) RoundTrip=0;
RoundTrip%=ROUND_TRIP_WRAP_AROUND;
}
else
{
RoundTrip=(int)0xFFFFFFFF;
}
RTCPRepBuff[PortNo].PacketCount =(unsigned int )RTCPInfo[PortNo].SenderPacketCount;
RTCPRepBuff[PortNo].OctetCount =(unsigned int )RTCPInfo[PortNo].SenderOctetCount;
RTCPRepBuff[PortNo].Jitter =(unsigned int )(ptr->Report.RR[0].RTCPJitter/SAMPLES_PER_MSEC) ;
RTCPRepBuff[PortNo].RoundTrip =(unsigned int )RoundTrip ;
RTCPRepBuff[PortNo].FractionLost =(unsigned int )(ptr->Report.RR[0].RTCPFraction) ;
RTCPRepBuff[PortNo].CumLost =(unsigned int )(ptr->Report.RR[0].RTCPCumLost & 0xFFFFFFFF) ;
RTCPRepBuff[PortNo].ExtHighSeq =(unsigned int )(ptr->Report.RR[0].RTCPLast_seq) ;
RTCPRepBuff[PortNo].ReportType =RTCP_RR_Rx;
}
else
{ /*empty RR or for more than one source*/
RTCPRepBuff[PortNo].PacketCount =(unsigned int )RTCPInfo[PortNo].SenderPacketCount;
RTCPRepBuff[PortNo].OctetCount =(unsigned int )RTCPInfo[PortNo].SenderOctetCount;
RTCPRepBuff[PortNo].Jitter =(unsigned int )-1;
RTCPRepBuff[PortNo].RoundTrip =(unsigned int )-1;
RTCPRepBuff[PortNo].FractionLost =(unsigned int )-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -