?? rtpsources.cpp
字號:
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;}bool RTPSources::GotoFirstSource(){ sourcelist.GotoFirstElement(); if (sourcelist.HasCurrentElement()) return true; return false;}bool RTPSources::GotoNextSource(){ sourcelist.GotoNextElement(); if (sourcelist.HasCurrentElement()) return true; return false;}bool RTPSources::GotoPreviousSource(){ sourcelist.GotoPreviousElement(); if (sourcelist.HasCurrentElement()) return true; return false;}bool RTPSources::GotoFirstSourceWithData(){ bool found = false; sourcelist.GotoFirstElement(); while (!found && sourcelist.HasCurrentElement()) { RTPInternalSourceData *srcdat; srcdat = sourcelist.GetCurrentElement(); if (srcdat->HasData()) found = true; else sourcelist.GotoNextElement(); } return found;}bool RTPSources::GotoNextSourceWithData(){ bool found = false; sourcelist.GotoNextElement(); while (!found && sourcelist.HasCurrentElement()) { RTPInternalSourceData *srcdat; srcdat = sourcelist.GetCurrentElement(); if (srcdat->HasData()) found = true; else sourcelist.GotoNextElement(); } return found;}bool RTPSources::GotoPreviousSourceWithData(){ bool found = false; sourcelist.GotoPreviousElement(); while (!found && sourcelist.HasCurrentElement()) { RTPInternalSourceData *srcdat; srcdat = sourcelist.GetCurrentElement(); if (srcdat->HasData()) found = true; else sourcelist.GotoNextElement(); } return found;}RTPSourceData *RTPSources::GetCurrentSourceInfo(){ if (!sourcelist.HasCurrentElement()) return 0; return sourcelist.GetCurrentElement();}RTPSourceData *RTPSources::GetSourceInfo(uint32_t ssrc){ if (sourcelist.GotoElement(ssrc) < 0) return 0; if (!sourcelist.HasCurrentElement()) return 0; return sourcelist.GetCurrentElement();}bool RTPSources::GotEntry(uint32_t ssrc){ return sourcelist.HasElement(ssrc);}RTPPacket *RTPSources::GetNextPacket(){ if (!sourcelist.HasCurrentElement()) return 0; RTPInternalSourceData *srcdat = sourcelist.GetCurrentElement(); RTPPacket *pack = srcdat->GetNextPacket(); return pack;}int RTPSources::ProcessRTCPSenderInfo(uint32_t ssrc,const RTPNTPTime &ntptime,uint32_t rtptime, uint32_t packetcount,uint32_t octetcount,const RTPTime &receivetime, const RTPAddress *senderaddress){ RTPInternalSourceData *srcdat; bool created; int status; status = GetRTCPSourceData(ssrc,senderaddress,&srcdat,&created); if (status < 0) return status; if (srcdat == 0) return 0; srcdat->ProcessSenderInfo(ntptime,rtptime,packetcount,octetcount,receivetime); // Call the callback if (created) OnNewSource(srcdat); return 0;}int RTPSources::ProcessRTCPReportBlock(uint32_t ssrc,uint8_t fractionlost,int32_t lostpackets, uint32_t exthighseqnr,uint32_t jitter,uint32_t lsr, uint32_t dlsr,const RTPTime &receivetime,const RTPAddress *senderaddress){ RTPInternalSourceData *srcdat; bool created; int status; status = GetRTCPSourceData(ssrc,senderaddress,&srcdat,&created); if (status < 0) return status; if (srcdat == 0) return 0; srcdat->ProcessReportBlock(fractionlost,lostpackets,exthighseqnr,jitter,lsr,dlsr,receivetime); // Call the callback if (created) OnNewSource(srcdat); return 0;}int RTPSources::ProcessSDESNormalItem(uint32_t ssrc,RTCPSDESPacket::ItemType t,size_t itemlength, const void *itemdata,const RTPTime &receivetime,const RTPAddress *senderaddress){ RTPInternalSourceData *srcdat; bool created,cnamecollis; int status; uint8_t sdesid; bool prevactive; switch(t) { case RTCPSDESPacket::CNAME: sdesid = RTCP_SDES_ID_CNAME; break; case RTCPSDESPacket::NAME: sdesid = RTCP_SDES_ID_NAME; break; case RTCPSDESPacket::EMAIL: sdesid = RTCP_SDES_ID_EMAIL; break; case RTCPSDESPacket::PHONE: sdesid = RTCP_SDES_ID_PHONE; break; case RTCPSDESPacket::LOC: sdesid = RTCP_SDES_ID_LOCATION; break; case RTCPSDESPacket::TOOL: sdesid = RTCP_SDES_ID_TOOL; break; case RTCPSDESPacket::NOTE: sdesid = RTCP_SDES_ID_NOTE; break; default: return ERR_RTP_SOURCES_ILLEGALSDESTYPE; } status = GetRTCPSourceData(ssrc,senderaddress,&srcdat,&created); if (status < 0) return status; if (srcdat == 0) return 0; prevactive = srcdat->IsActive(); status = srcdat->ProcessSDESItem(sdesid,(const uint8_t *)itemdata,itemlength,receivetime,&cnamecollis); if (!prevactive && srcdat->IsActive()) activecount++; // Call the callback if (created) OnNewSource(srcdat); if (cnamecollis) OnCNAMECollision(srcdat,senderaddress,(const uint8_t *)itemdata,itemlength); return status;}#ifdef RTP_SUPPORT_SDESPRIVint RTPSources::ProcessSDESPrivateItem(uint32_t ssrc,size_t prefixlen,const void *prefixdata, size_t valuelen,const void *valuedata,const RTPTime &receivetime, const RTPAddress *senderaddress){ RTPInternalSourceData *srcdat; bool created; int status; status = GetRTCPSourceData(ssrc,senderaddress,&srcdat,&created); if (status < 0) return status; if (srcdat == 0) return 0; status = srcdat->ProcessPrivateSDESItem((const uint8_t *)prefixdata,prefixlen,(const uint8_t *)valuedata,valuelen,receivetime); // Call the callback if (created) OnNewSource(srcdat); return status;}#endif //RTP_SUPPORT_SDESPRIVint RTPSources::ProcessBYE(uint32_t ssrc,size_t reasonlength,const void *reasondata, const RTPTime &receivetime,const RTPAddress *senderaddress){ RTPInternalSourceData *srcdat; bool created; int status; bool prevactive; status = GetRTCPSourceData(ssrc,senderaddress,&srcdat,&created); if (status < 0) return status; if (srcdat == 0) return 0; // we'll ignore BYE packets for our own ssrc if (srcdat == owndata) return 0; prevactive = srcdat->IsActive(); srcdat->ProcessBYEPacket((const uint8_t *)reasondata,reasonlength,receivetime); if (prevactive && !srcdat->IsActive()) activecount--; // Call the callback if (created) OnNewSource(srcdat); OnBYEPacket(srcdat); return 0;}int RTPSources::ObtainSourceDataInstance(uint32_t ssrc,RTPInternalSourceData **srcdat,bool *created){ RTPInternalSourceData *srcdat2; int status; if (sourcelist.GotoElement(ssrc) < 0) // No entry for this source {#ifdef RTP_SUPPORT_PROBATION srcdat2 = RTPNew(GetMemoryManager(),RTPMEM_TYPE_CLASS_RTPINTERNALSOURCEDATA) RTPInternalSourceData(ssrc,probationtype,GetMemoryManager());#else srcdat2 = RTPNew(GetMemoryManager(),RTPMEM_TYPE_CLASS_RTPINTERNALSOURCEDATA) RTPInternalSourceData(ssrc,RTPSources::NoProbation,GetMemoryManager());#endif // RTP_SUPPORT_PROBATION if (srcdat2 == 0) return ERR_RTP_OUTOFMEM; if ((status = sourcelist.AddElement(ssrc,srcdat2)) < 0) { RTPDelete(srcdat2,GetMemoryManager()); return status; } *srcdat = srcdat2; *created = true; totalcount++; } else { *srcdat = sourcelist.GetCurrentElement(); *created = false; } return 0;} int RTPSources::GetRTCPSourceData(uint32_t ssrc,const RTPAddress *senderaddress, RTPInternalSourceData **srcdat2,bool *newsource){ int status; bool created; RTPInternalSourceData *srcdat; *srcdat2 = 0; if ((status = ObtainSourceDataInstance(ssrc,&srcdat,&created)) < 0) return status; if (created) { if ((status = srcdat->SetRTCPDataAddress(senderaddress)) < 0) return status; } else // got a previously existing source { if (CheckCollision(srcdat,senderaddress,false)) return 0; // ignore packet on collision } *srcdat2 = srcdat; *newsource = created; return 0;}int RTPSources::UpdateReceiveTime(uint32_t ssrc,const RTPTime &receivetime,const RTPAddress *senderaddress){ RTPInternalSourceData *srcdat; bool created; int status; status = GetRTCPSourceData(ssrc,senderaddress,&srcdat,&created); if (status < 0) return status; if (srcdat == 0) return 0; // We got valid SSRC info srcdat->UpdateMessageTime(receivetime); // Call the callback if (created) OnNewSource(srcdat); return 0;}void RTPSources::Timeout(const RTPTime &curtime,const RTPTime &timeoutdelay){ int newtotalcount = 0; int newsendercount = 0; int newactivecount = 0; RTPTime checktime = curtime; checktime -= timeoutdelay; sourcelist.GotoFirstElement(); while (sourcelist.HasCurrentElement()) { RTPInternalSourceData *srcdat = sourcelist.GetCurrentElement(); RTPTime lastmsgtime = srcdat->INF_GetLastMessageTime(); // we don't want to time out ourselves if ((srcdat != owndata) && (lastmsgtime < checktime)) // timeout { totalcount--; if (srcdat->IsSender()) sendercount--; if (srcdat->IsActive()) activecount--; sourcelist.DeleteCurrentElement(); OnTimeout(srcdat); OnRemoveSource(srcdat); RTPDelete(srcdat,GetMemoryManager()); } else { newtotalcount++; if (srcdat->IsSender()) newsendercount++; if (srcdat->IsActive()) newactivecount++; sourcelist.GotoNextElement(); } } #ifdef RTPDEBUG if (newtotalcount != totalcount) { std::cout << "New total count " << newtotalcount << " doesnt match old total count " << totalcount << std::endl; SafeCountTotal(); } if (newsendercount != sendercount) { std::cout << "New sender count " << newsendercount << " doesnt match old sender count " << sendercount << std::endl; SafeCountSenders(); } if (newactivecount != activecount) { std::cout << "New active count " << newactivecount << " doesnt match old active count " << activecount << std::endl; SafeCountActive(); }#endif // RTPDEBUG totalcount = newtotalcount; // just to play it safe sendercount = newsendercount; activecount = newactivecount;}void RTPSources::SenderTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -