00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00037 #ifndef RTPSOURCEDATA_H
00038
00039 #define RTPSOURCEDATA_H
00040
00041 #include "rtpconfig.h"
00042 #include "rtptimeutilities.h"
00043 #include "rtppacket.h"
00044 #include "rtcpsdesinfo.h"
00045 #include "rtptypes.h"
00046 #include "rtpsources.h"
00047 #include "rtpmemoryobject.h"
00048 #include <list>
00049
00050 class RTPAddress;
00051
00052 class RTCPSenderReportInfo
00053 {
00054 public:
00055 RTCPSenderReportInfo():ntptimestamp(0,0),receivetime(0,0) { hasinfo = false; rtptimestamp = 0; packetcount = 0; bytecount = 0; }
00056 void Set(const RTPNTPTime &ntptime,uint32_t rtptime,uint32_t pcount,
00057 uint32_t bcount,const RTPTime &rcvtime) { ntptimestamp = ntptime; rtptimestamp = rtptime; packetcount = pcount; bytecount = bcount; receivetime = rcvtime; hasinfo = true; }
00058
00059 bool HasInfo() const { return hasinfo; }
00060 RTPNTPTime GetNTPTimestamp() const { return ntptimestamp; }
00061 uint32_t GetRTPTimestamp() const { return rtptimestamp; }
00062 uint32_t GetPacketCount() const { return packetcount; }
00063 uint32_t GetByteCount() const { return bytecount; }
00064 RTPTime GetReceiveTime() const { return receivetime; }
00065 private:
00066 bool hasinfo;
00067 RTPNTPTime ntptimestamp;
00068 uint32_t rtptimestamp;
00069 uint32_t packetcount;
00070 uint32_t bytecount;
00071 RTPTime receivetime;
00072 };
00073
00074 class RTCPReceiverReportInfo
00075 {
00076 public:
00077 RTCPReceiverReportInfo():receivetime(0,0) { hasinfo = false; fractionlost = 0; packetslost = 0; exthighseqnr = 0; jitter = 0; lsr = 0; dlsr = 0; }
00078 void Set(uint8_t fraclost,int32_t plost,uint32_t exthigh,
00079 uint32_t jit,uint32_t l,uint32_t dl,const RTPTime &rcvtime) { fractionlost = ((double)fraclost)/256.0; packetslost = plost; exthighseqnr = exthigh; jitter = jit; lsr = l; dlsr = dl; receivetime = rcvtime; hasinfo = true; }
00080
00081 bool HasInfo() const { return hasinfo; }
00082 double GetFractionLost() const { return fractionlost; }
00083 int32_t GetPacketsLost() const { return packetslost; }
00084 uint32_t GetExtendedHighestSequenceNumber() const { return exthighseqnr; }
00085 uint32_t GetJitter() const { return jitter; }
00086 uint32_t GetLastSRTimestamp() const { return lsr; }
00087 uint32_t GetDelaySinceLastSR() const { return dlsr; }
00088 RTPTime GetReceiveTime() const { return receivetime; }
00089 private:
00090 bool hasinfo;
00091 double fractionlost;
00092 int32_t packetslost;
00093 uint32_t exthighseqnr;
00094 uint32_t jitter;
00095 uint32_t lsr;
00096 uint32_t dlsr;
00097 RTPTime receivetime;
00098 };
00099
00100 class RTPSourceStats
00101 {
00102 public:
00103 RTPSourceStats();
00104 void ProcessPacket(RTPPacket *pack,const RTPTime &receivetime,double tsunit,bool ownpacket,bool *accept,bool applyprobation,bool *onprobation);
00105
00106 bool HasSentData() const { return sentdata; }
00107 uint32_t GetNumPacketsReceived() const { return packetsreceived; }
00108 uint32_t GetBaseSequenceNumber() const { return baseseqnr; }
00109 uint32_t GetExtendedHighestSequenceNumber() const { return exthighseqnr; }
00110 uint32_t GetJitter() const { return jitter; }
00111
00112 int32_t GetNumPacketsReceivedInInterval() const { return numnewpackets; }
00113 uint32_t GetSavedExtendedSequenceNumber() const { return savedextseqnr; }
00114 void StartNewInterval() { numnewpackets = 0; savedextseqnr = exthighseqnr; }
00115
00116 void SetLastMessageTime(const RTPTime &t) { lastmsgtime = t; }
00117 RTPTime GetLastMessageTime() const { return lastmsgtime; }
00118 void SetLastRTPPacketTime(const RTPTime &t) { lastrtptime = t; }
00119 RTPTime GetLastRTPPacketTime() const { return lastrtptime; }
00120
00121 void SetLastNoteTime(const RTPTime &t) { lastnotetime = t; }
00122 RTPTime GetLastNoteTime() const { return lastnotetime; }
00123 private:
00124 bool sentdata;
00125 uint32_t packetsreceived;
00126 uint32_t numcycles;
00127 uint32_t baseseqnr;
00128 uint32_t exthighseqnr,prevexthighseqnr;
00129 uint32_t jitter,prevtimestamp;
00130 double djitter;
00131 RTPTime prevpacktime;
00132 RTPTime lastmsgtime;
00133 RTPTime lastrtptime;
00134 RTPTime lastnotetime;
00135 uint32_t numnewpackets;
00136 uint32_t savedextseqnr;
00137 #ifdef RTP_SUPPORT_PROBATION
00138 uint16_t prevseqnr;
00139 int probation;
00140 RTPSources::ProbationType probationtype;
00141 #endif // RTP_SUPPORT_PROBATION
00142 };
00143
00144 inline RTPSourceStats::RTPSourceStats():prevpacktime(0,0),lastmsgtime(0,0),lastrtptime(0,0),lastnotetime(0,0)
00145 {
00146 sentdata = false;
00147 packetsreceived = 0;
00148 baseseqnr = 0;
00149 exthighseqnr = 0;
00150 prevexthighseqnr = 0;
00151 jitter = 0;
00152 numcycles = 0;
00153 numnewpackets = 0;
00154 prevtimestamp = 0;
00155 djitter = 0;
00156 savedextseqnr = 0;
00157 #ifdef RTP_SUPPORT_PROBATION
00158 probation = 0;
00159 prevseqnr = 0;
00160 #endif // RTP_SUPPORT_PROBATION
00161 }
00162
00164 class RTPSourceData : public RTPMemoryObject
00165 {
00166 protected:
00167 RTPSourceData(uint32_t ssrc, RTPMemoryManager *mgr = 0);
00168 virtual ~RTPSourceData();
00169 public:
00171 RTPPacket *GetNextPacket();
00172
00174 void FlushPackets();
00175
00177 bool HasData() const { if (!validated) return false; return packetlist.empty()?false:true; }
00178
00180 uint32_t GetSSRC() const { return ssrc; }
00181
00185 bool IsOwnSSRC() const { return ownssrc; }
00186
00188 bool IsCSRC() const { return iscsrc; }
00189
00191 bool IsSender() const { return issender; }
00192
00197 bool IsValidated() const { return validated; }
00198
00200 bool IsActive() const { if (!validated) return false; if (receivedbye) return false; return true; }
00201
00205 void SetProcessedInRTCP(bool v) { processedinrtcp = v; }
00206
00210 bool IsProcessedInRTCP() const { return processedinrtcp; }
00211
00215 bool IsRTPAddressSet() const { return isrtpaddrset; }
00216
00220 bool IsRTCPAddressSet() const { return isrtcpaddrset; }
00221
00227 const RTPAddress *GetRTPDataAddress() const { return rtpaddr; }
00228
00234 const RTPAddress *GetRTCPDataAddress() const { return rtcpaddr; }
00235
00237 bool ReceivedBYE() const { return receivedbye; }
00238
00243 uint8_t *GetBYEReason(size_t *len) const { *len = byereasonlen; return byereason; }
00244
00246 RTPTime GetBYETime() const { return byetime; }
00247
00254 void SetTimestampUnit(double tsu) { timestampunit = tsu; }
00255
00257 double GetTimestampUnit() const { return timestampunit; }
00258
00260 bool SR_HasInfo() const { return SRinf.HasInfo(); }
00261
00263 RTPNTPTime SR_GetNTPTimestamp() const { return SRinf.GetNTPTimestamp(); }
00264
00266 uint32_t SR_GetRTPTimestamp() const { return SRinf.GetRTPTimestamp(); }
00267
00269 uint32_t SR_GetPacketCount() const { return SRinf.GetPacketCount(); }
00270
00272 uint32_t SR_GetByteCount() const { return SRinf.GetByteCount(); }
00273
00275 RTPTime SR_GetReceiveTime() const { return SRinf.GetReceiveTime(); }
00276
00278 bool SR_Prev_HasInfo() const { return SRprevinf.HasInfo(); }
00279
00281 RTPNTPTime SR_Prev_GetNTPTimestamp() const { return SRprevinf.GetNTPTimestamp(); }
00282
00284 uint32_t SR_Prev_GetRTPTimestamp() const { return SRprevinf.GetRTPTimestamp(); }
00285
00287 uint32_t SR_Prev_GetPacketCount() const { return SRprevinf.GetPacketCount(); }
00288
00290 uint32_t SR_Prev_GetByteCount() const { return SRprevinf.GetByteCount(); }
00291
00293 RTPTime SR_Prev_GetReceiveTime() const { return SRprevinf.GetReceiveTime(); }
00294
00296 bool RR_HasInfo() const { return RRinf.HasInfo(); }
00297
00299 double RR_GetFractionLost() const { return RRinf.GetFractionLost(); }
00300
00302 int32_t RR_GetPacketsLost() const { return RRinf.GetPacketsLost(); }
00303
00305 uint32_t RR_GetExtendedHighestSequenceNumber() const { return RRinf.GetExtendedHighestSequenceNumber(); }
00306
00308 uint32_t RR_GetJitter() const { return RRinf.GetJitter(); }
00309
00311 uint32_t RR_GetLastSRTimestamp() const { return RRinf.GetLastSRTimestamp(); }
00312
00314 uint32_t RR_GetDelaySinceLastSR() const { return RRinf.GetDelaySinceLastSR(); }
00315
00317 RTPTime RR_GetReceiveTime() const { return RRinf.GetReceiveTime(); }
00318
00322 bool RR_Prev_HasInfo() const { return RRprevinf.HasInfo(); }
00323
00325 double RR_Prev_GetFractionLost() const { return RRprevinf.GetFractionLost(); }
00326
00328 int32_t RR_Prev_GetPacketsLost() const { return RRprevinf.GetPacketsLost(); }
00329
00331 uint32_t RR_Prev_GetExtendedHighestSequenceNumber() const { return RRprevinf.GetExtendedHighestSequenceNumber(); }
00332
00334 uint32_t RR_Prev_GetJitter() const { return RRprevinf.GetJitter(); }
00335
00337 uint32_t RR_Prev_GetLastSRTimestamp() const { return RRprevinf.GetLastSRTimestamp(); }
00338
00340 uint32_t RR_Prev_GetDelaySinceLastSR() const { return RRprevinf.GetDelaySinceLastSR(); }
00341
00343 RTPTime RR_Prev_GetReceiveTime() const { return RRprevinf.GetReceiveTime(); }
00344
00346 bool INF_HasSentData() const { return stats.HasSentData(); }
00347
00349 int32_t INF_GetNumPacketsReceived() const { return stats.GetNumPacketsReceived(); }
00350
00352 uint32_t INF_GetBaseSequenceNumber() const { return stats.GetBaseSequenceNumber(); }
00353
00355 uint32_t INF_GetExtendedHighestSequenceNumber() const { return stats.GetExtendedHighestSequenceNumber(); }
00356
00358 uint32_t INF_GetJitter() const { return stats.GetJitter(); }
00359
00361 RTPTime INF_GetLastMessageTime() const { return stats.GetLastMessageTime(); }
00362
00364 RTPTime INF_GetLastRTPPacketTime() const { return stats.GetLastRTPPacketTime(); }
00365
00367 double INF_GetEstimatedTimestampUnit() const;
00368
00370 uint32_t INF_GetNumPacketsReceivedInInterval() const { return stats.GetNumPacketsReceivedInInterval(); }
00371
00373 uint32_t INF_GetSavedExtendedSequenceNumber() const { return stats.GetSavedExtendedSequenceNumber(); }
00374
00378 void INF_StartNewInterval() { stats.StartNewInterval(); }
00379
00381 RTPTime INF_GetRoundtripTime() const;
00382
00384 RTPTime INF_GetLastSDESNoteTime() const { return stats.GetLastNoteTime(); }
00385
00387 uint8_t *SDES_GetCNAME(size_t *len) const { return SDESinf.GetCNAME(len); }
00388
00390 uint8_t *SDES_GetName(size_t *len) const { return SDESinf.GetName(len); }
00391
00393 uint8_t *SDES_GetEMail(size_t *len) const { return SDESinf.GetEMail(len); }
00394
00396 uint8_t *SDES_GetPhone(size_t *len) const { return SDESinf.GetPhone(len); }
00397
00399 uint8_t *SDES_GetLocation(size_t *len) const { return SDESinf.GetLocation(len); }
00400
00402 uint8_t *SDES_GetTool(size_t *len) const { return SDESinf.GetTool(len); }
00403
00405 uint8_t *SDES_GetNote(size_t *len) const { return SDESinf.GetNote(len); }
00406
00407 #ifdef RTP_SUPPORT_SDESPRIV
00408
00409 void SDES_GotoFirstPrivateValue() { SDESinf.GotoFirstPrivateValue(); }
00410
00414 bool SDES_GetNextPrivateValue(uint8_t **prefix,size_t *prefixlen,uint8_t **value,size_t *valuelen) { return SDESinf.GetNextPrivateValue(prefix,prefixlen,value,valuelen); }
00415
00420 bool SDES_GetPrivateValue(uint8_t *prefix,size_t prefixlen,uint8_t **value,size_t *valuelen) const { return SDESinf.GetPrivateValue(prefix,prefixlen,value,valuelen); }
00421 #endif // RTP_SUPPORT_SDESPRIV
00422
00423 #ifdef RTPDEBUG
00424 virtual void Dump();
00425 #endif // RTPDEBUG
00426 protected:
00427 std::list<RTPPacket *> packetlist;
00428
00429 uint32_t ssrc;
00430 bool ownssrc;
00431 bool iscsrc;
00432 double timestampunit;
00433 bool receivedbye;
00434 bool validated;
00435 bool processedinrtcp;
00436 bool issender;
00437
00438 RTCPSenderReportInfo SRinf,SRprevinf;
00439 RTCPReceiverReportInfo RRinf,RRprevinf;
00440 RTPSourceStats stats;
00441 RTCPSDESInfo SDESinf;
00442
00443 bool isrtpaddrset,isrtcpaddrset;
00444 RTPAddress *rtpaddr,*rtcpaddr;
00445
00446 RTPTime byetime;
00447 uint8_t *byereason;
00448 size_t byereasonlen;
00449 };
00450
00451 inline RTPPacket *RTPSourceData::GetNextPacket()
00452 {
00453 if (!validated)
00454 return 0;
00455
00456 RTPPacket *p;
00457
00458 if (packetlist.empty())
00459 return 0;
00460 p = *(packetlist.begin());
00461 packetlist.pop_front();
00462 return p;
00463 }
00464
00465 inline void RTPSourceData::FlushPackets()
00466 {
00467 std::list<RTPPacket *>::const_iterator it;
00468
00469 for (it = packetlist.begin() ; it != packetlist.end() ; ++it)
00470 RTPDelete(*it,GetMemoryManager());
00471 packetlist.clear();
00472 }
00473 #endif // RTPSOURCEDATA_H
00474