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++; } } }
void RTCPCompoundPacket::Dump() { std::list<RTCPPacket *>::const_iterator it; for (it = rtcppacklist.begin() ; it != rtcppacklist.end() ; it++) { RTCPPacket *p = *it; p->Dump(); } }
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; }