RTP Trace System
1.0
|
00001 // ########################################################################## 00002 // #### #### 00003 // #### RTP Audio Server Project #### 00004 // #### ============================ #### 00005 // #### #### 00006 // #### RTCP Packet #### 00007 // #### #### 00008 // #### Version 1.00 -- February 16, 2001 #### 00009 // #### #### 00010 // #### Copyright (C) 1999 Thomas Dreibholz #### 00011 // #### 2000 Universität Bonn, Abt. IV #### 00012 // #### 2001 EMail: dreibh@iem.uni-due.de #### 00013 // #### WWW: https://www.uni-due.de/~be0001 #### 00014 // #### #### 00015 // ########################################################################## 00016 00017 00018 #ifndef RTCPPACKET_H 00019 #define RTCPPACKET_H 00020 00021 00022 #include <endian.h> 00023 00024 00025 #include "system.h" 00026 #include "rtppacket.h" 00027 00028 00029 namespace Coral { 00030 00031 00035 enum RTCP_Type 00036 { 00037 RTCP_SR = 200, 00038 RTCP_RR = 201, 00039 RTCP_SDES = 202, 00040 RTCP_BYE = 203, 00041 RTCP_APP = 204 00042 }; 00043 00044 00048 enum RTCP_SDES_Type 00049 { 00050 RTCP_SDES_END = 0, 00051 RTCP_SDES_CNAME = 1, 00052 RTCP_SDES_NAME = 2, 00053 RTCP_SDES_EMAIL = 3, 00054 RTCP_SDES_PHONE = 4, 00055 RTCP_SDES_LOC = 5, 00056 RTCP_SDES_TOOL = 6, 00057 RTCP_SDES_NOTE = 7, 00058 RTCP_SDES_PRIV = 8 00059 }; 00060 00061 00073 class RTCPCommonHeader 00074 { 00075 // ====== Constructor ==================================================== 00076 public: 00080 RTCPCommonHeader(); 00081 00082 00083 // ====== Get methods ==================================================== 00089 inline card8 getVersion() const; 00090 00096 inline card8 getPadding() const; 00097 00103 inline card8 getCount() const; 00104 00110 inline card8 getPacketType() const; 00111 00117 inline card16 getLength() const; 00118 00119 00120 // ====== Set methods ==================================================== 00126 inline void setVersion(const card8 version); 00127 00133 inline void setPadding(const card8 padding); 00134 00140 inline void setCount(const card8 count); 00141 00147 inline void setPacketType(const card8 packetType); 00148 00154 inline void setLength(const card16 length); 00155 00156 00157 // ====== Protected data ================================================= 00158 protected: 00159 #if CPU_BYTEORDER == BIG_ENDIAN 00160 card8 V:2; // Protocol Version 00161 card8 P:1; // Padding Flag 00162 card8 C:5; // Count varies by Packet Type (RC/SC) 00163 #elif CPU_BYTEORDER == LITTLE_ENDIAN 00164 card8 C:5; // Count varies by Packet Type (RC/SC) 00165 card8 P:1; // Padding Flag 00166 card8 V:2; // Protocol Version 00167 #else 00168 #error "Unknown CPU_BYTEORDER setting!" 00169 #endif 00170 card8 PT:8; // RTCP Packet Type 00171 card16 Length; // Packet length in words minus one 00172 }; 00173 00174 00186 class RTCPSenderInfoBlock 00187 { 00188 // ====== Constructor ==================================================== 00189 public: 00193 RTCPSenderInfoBlock(); 00194 00195 00196 // ====== Get methods ==================================================== 00202 inline card64 getNTPTimeStamp() const; 00203 00209 inline card32 getRTPTimeStamp() const; 00210 00211 00217 inline card32 getPacketsSent() const; 00218 00224 inline card32 getOctetsSent() const; 00225 00226 00227 // ====== Set methods ==================================================== 00233 inline void setNTPTimeStamp(const card64 timeStamp); 00234 00240 inline void setRTPTimeStamp(const card32 timeStamp); 00241 00247 inline void setPacketsSent(const card32 packets); 00248 00254 inline void setOctetsSent(const card32 octets); 00255 00256 00257 // ====== Protected data ================================================= 00258 protected: 00259 card32 NTP_MostSignificant; // NTP Timestamp (most significant word) 00260 card32 NTP_LeastSignificant; // NTP Timestamp (least significant word) 00261 card32 RTPTimeStamp; // RTP Timestamp 00262 card32 PacketsSent; // Packets sent 00263 card32 OctetsSent; // Octets sent 00264 }; 00265 00266 00278 class RTCPReceptionReportBlock 00279 { 00280 // ====== Constructor ==================================================== 00281 public: 00285 RTCPReceptionReportBlock(); 00286 00292 RTCPReceptionReportBlock(const card32 ssrc); 00293 00294 00300 void init(const card32 ssrc); 00301 00302 00303 // ====== Get methods ==================================================== 00309 inline card32 getSSRC() const; 00310 00316 inline double getFractionLost() const; 00317 00323 inline card32 getPacketsLost() const; 00324 00330 inline card32 getLastSeqNum() const; 00331 00337 inline card32 getJitter() const; 00338 00344 inline card32 getLSR() const; 00345 00351 inline card32 getDLSR() const; 00352 00353 00354 // ====== Set methods ==================================================== 00360 inline void setSSRC(card32 ssrc); 00361 00367 inline void setFractionLost(const double fraction); 00368 00374 inline void setPacketsLost(const card32 packetsLost); 00375 00381 inline void setLastSeqNum(const card32 lastSeq); 00382 00388 inline void setJitter(const card32 jitter); 00389 00395 inline void setLSR(const card32 lsr); 00396 00402 inline void setDLSR(const card32 dlsr); 00403 00404 00405 // ====== Protected data ================================================= 00406 protected: 00407 card32 SSRC; // Data Source being reported 00408 card32 Fraction:8; // Fraction lost since last SR/RR 00409 card32 Lost:24; // Cumulative no. of Packets lost (signed!) 00410 card32 LastSeq; // Extended last sequence no. received 00411 card32 Jitter; // Interarrival Jitter 00412 card32 LSR; // Last SR Packet from this source 00413 card32 DLSR; // Delay since last SR Packet 00414 }; 00415 00416 00428 class RTCPReport : public RTCPCommonHeader 00429 { 00430 // ====== Constructor ==================================================== 00431 public: 00435 RTCPReport(); 00436 00437 00438 // ====== Get methods ==================================================== 00444 inline card32 getSSRC() const; 00445 00446 00447 // ====== Set methods ==================================================== 00453 inline void setSSRC(const card32 ssrc); 00454 00455 00456 // ====== Protected data ================================================= 00457 protected: 00458 card32 SSRC; // Sender or Receiver generating this report 00459 }; 00460 00461 00473 class RTCPSenderReport : public RTCPReport, public RTCPSenderInfoBlock 00474 { 00475 // ====== Constructor ==================================================== 00476 public: 00480 RTCPSenderReport(); 00481 00488 RTCPSenderReport(const card32 syncSource, const card8 count = 0); 00489 00490 00497 void init(const card32 syncSource, const card8 count = 0); 00498 00499 00503 RTCPReceptionReportBlock rr[0]; // Variable length RR list 00504 }; 00505 00506 00518 class RTCPReceiverReport : public RTCPReport 00519 { 00520 // ====== Constructor ==================================================== 00521 public: 00525 RTCPReceiverReport(); 00526 00533 RTCPReceiverReport(const card32 syncSource, const card8 count = 0); 00534 00535 00542 void init(const card32 syncSource, const card8 count = 0); 00543 00544 00548 RTCPReceptionReportBlock rr[0]; // Variable length RR list 00549 }; 00550 00551 00563 class RTCPSourceDescriptionItem 00564 { 00565 public: 00569 card8 Type; 00570 00574 card8 Length; 00575 00579 char Data[0]; 00580 }; 00581 00582 00594 class RTCPSourceDescriptionChunk 00595 { 00596 public: 00600 card32 SRC; 00601 00605 RTCPSourceDescriptionItem Item[1]; 00606 }; 00607 00608 00620 class RTCPSourceDescription : public RTCPCommonHeader 00621 { 00622 // ====== Constructor ==================================================== 00623 public: 00627 RTCPSourceDescription(); 00628 00634 RTCPSourceDescription(const card8 count); 00635 00636 00642 void init(const card8 count); 00643 00644 00648 RTCPSourceDescriptionChunk Chunk[1]; 00649 }; 00650 00651 00663 class RTCPBye : public RTCPCommonHeader 00664 { 00665 // ====== Constructor ==================================================== 00666 public: 00670 RTCPBye(); 00671 00677 RTCPBye(const card8 count); 00678 00679 00685 void init(const card8 count); 00686 00687 00688 // ====== Get methods ==================================================== 00695 inline card32 getSource(const cardinal index) const; 00696 00697 00698 // ====== Set methods ==================================================== 00705 inline void setSource(const cardinal index, const card32 source); 00706 00707 00708 // ====== Private data =================================================== 00709 private: 00710 card32 Source[0]; 00711 }; 00712 00713 00725 class RTCPApp : public RTCPCommonHeader 00726 { 00727 // ====== Constructor ==================================================== 00728 public: 00732 RTCPApp(); 00733 00738 RTCPApp(const card8 subtype); 00739 00740 00741 /* 00742 * Initialize. 00743 * @param subtype RTCP APP subtype. 00744 */ 00745 void init(const card8 subtype); 00746 00747 00748 // ====== Get methods ==================================================== 00754 inline card32 getSource() const; 00755 00761 inline char* getName(); 00762 00768 inline char* getData(); 00769 00770 00771 // ====== Set methods ==================================================== 00777 inline void setSource(const card32 source); 00778 00779 00780 // ====== Private data =================================================== 00781 private: 00782 card32 Source; 00783 char Name[4]; 00784 char Data[0]; 00785 }; 00786 00787 00788 } 00789 00790 00791 #include "rtcppacket.icc" 00792 00793 00794 #endif