示例#1
0
void RTCPScheduler::AnalyseIncoming(RTCPCompoundPacket &rtcpcomppack)
{
    bool isbye = false;
    RTCPPacket *p;

    rtcpcomppack.GotoFirstPacket();
    while (!isbye && ((p = rtcpcomppack.GetNextPacket()) != 0))
    {
        if (p->GetPacketType() == RTCPPacket::BYE)
            isbye = true;
    }

    if (!isbye)
    {
        size_t packsize = headeroverhead+rtcpcomppack.GetCompoundPacketLength();
        avgrtcppacksize = (size_t)((1.0/16.0)*((double)packsize)+(15.0/16.0)*((double)avgrtcppacksize));
    }
    else
    {
        if (byescheduled)
        {
            size_t packsize = headeroverhead+rtcpcomppack.GetCompoundPacketLength();
            avgbyepacketsize = (size_t)((1.0/16.0)*((double)packsize)+(15.0/16.0)*((double)avgbyepacketsize));
            byemembers++;
        }
    }
}
示例#2
0
void RTCPCompoundPacket::Dump()
{
	std::list<RTCPPacket *>::const_iterator it;
	for (it = rtcppacklist.begin() ; it != rtcppacklist.end() ; it++)
	{
		RTCPPacket *p = *it;

		p->Dump();
	}
}
示例#3
0
int RTPSources::ProcessRTCPCompoundPacket(RTCPCompoundPacket *rtcpcomppack, const RTPTime &receivetime, const RTPAddress *senderaddress)
{
    RTCPPacket *rtcppack;
    int status;
    bool gotownssrc = ((owndata == 0) ? false : true);
    uint32_t ownssrc = ((owndata != 0) ? owndata->GetSSRC() : 0);

    OnRTCPCompoundPacket(rtcpcomppack, receivetime, senderaddress);

    rtcpcomppack->GotoFirstPacket();
    while ((rtcppack = rtcpcomppack->GetNextPacket()) != 0)
    {
        if (rtcppack->IsKnownFormat())
        {
            switch (rtcppack->GetPacketType())
            {
            case RTCPPacket::SR:
            {
                RTCPSRPacket *p = (RTCPSRPacket *) rtcppack;
                uint32_t senderssrc = p->GetSenderSSRC();

                status = ProcessRTCPSenderInfo(senderssrc, p->GetNTPTimestamp(), p->GetRTPTimestamp(), p->GetSenderPacketCount(), p->GetSenderOctetCount(), receivetime,
                        senderaddress);
                if (status < 0)
                    return status;

                bool gotinfo = false;
                if (gotownssrc)
                {
                    int i;
                    int num = p->GetReceptionReportCount();
                    for (i = 0; i < num; i++)
                    {
                        if (p->GetSSRC(i) == ownssrc) // data is meant for us
                        {
                            gotinfo = true;
                            status = ProcessRTCPReportBlock(senderssrc, p->GetFractionLost(i), p->GetLostPacketCount(i), p->GetExtendedHighestSequenceNumber(i), p->GetJitter(i),
                                    p->GetLSR(i), p->GetDLSR(i), receivetime, senderaddress);
                            if (status < 0)
                                return status;
                        }
                    }
                }
                if (!gotinfo)
                {
                    status = UpdateReceiveTime(senderssrc, receivetime, senderaddress);
                    if (status < 0)
                        return status;
                }
            }
                break;
            case RTCPPacket::RR:
            {
                RTCPRRPacket *p = (RTCPRRPacket *) rtcppack;
                uint32_t senderssrc = p->GetSenderSSRC();

                bool gotinfo = false;

                if (gotownssrc)
                {
                    int i;
                    int num = p->GetReceptionReportCount();
                    for (i = 0; i < num; i++)
                    {
                        if (p->GetSSRC(i) == ownssrc)
                        {
                            gotinfo = true;
                            status = ProcessRTCPReportBlock(senderssrc, p->GetFractionLost(i), p->GetLostPacketCount(i), p->GetExtendedHighestSequenceNumber(i), p->GetJitter(i),
                                    p->GetLSR(i), p->GetDLSR(i), receivetime, senderaddress);
                            if (status < 0)
                                return status;
                        }
                    }
                }
                if (!gotinfo)
                {
                    status = UpdateReceiveTime(senderssrc, receivetime, senderaddress);
                    if (status < 0)
                        return status;
                }
            }
                break;
            case RTCPPacket::SDES:
            {
                RTCPSDESPacket *p = (RTCPSDESPacket *) rtcppack;

                if (p->GotoFirstChunk())
                {
                    do
                    {
                        uint32_t sdesssrc = p->GetChunkSSRC();
                        bool updated = false;
                        if (p->GotoFirstItem())
                        {
                            do
                            {
                                RTCPSDESPacket::ItemType t;

                                if ((t = p->GetItemType()) != RTCPSDESPacket::PRIV)
                                {
                                    updated = true;
                                    status = ProcessSDESNormalItem(sdesssrc, t, p->GetItemLength(), p->GetItemData(), receivetime, senderaddress);
                                    if (status < 0)
                                        return status;
                                }
#ifdef RTP_SUPPORT_SDESPRIV
                                else
                                {
                                    updated = true;
                                    status = ProcessSDESPrivateItem(sdesssrc, p->GetPRIVPrefixLength(), p->GetPRIVPrefixData(), p->GetPRIVValueLength(), p->GetPRIVValueData(),
                                            receivetime, senderaddress);
                                    if (status < 0)
                                        return status;
                                }
#endif // RTP_SUPPORT_SDESPRIV
                            } while (p->GotoNextItem());
                        }
                        if (!updated)
                        {
                            status = UpdateReceiveTime(sdesssrc, receivetime, senderaddress);
                            if (status < 0)
                                return status;
                        }
                    } while (p->GotoNextChunk());
                }
            }
                break;
            case RTCPPacket::BYE:
            {
                RTCPBYEPacket *p = (RTCPBYEPacket *) rtcppack;
                int i;
                int num = p->GetSSRCCount();

                for (i = 0; i < num; i++)
                {
                    uint32_t byessrc = p->GetSSRC(i);
                    status = ProcessBYE(byessrc, p->GetReasonLength(), p->GetReasonData(), receivetime, senderaddress);
                    if (status < 0)
                        return status;
                }
            }
                break;
            case RTCPPacket::APP:
            {
                RTCPAPPPacket *p = (RTCPAPPPacket *) rtcppack;

                OnAPPPacket(p, receivetime, senderaddress);
            }
                break;
            case RTCPPacket::Unknown:
            default:
            {
                OnUnknownPacketType(rtcppack, receivetime, senderaddress);
            }
                break;
            }
        }
        else
        {
            OnUnknownPacketFormat(rtcppack, receivetime, senderaddress);
        }
    }

    return 0;
}