⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m803xxrtcp.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    *((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 + -