packet.h
上传用户:hnnddl
上传日期:2007-01-06
资源大小:3580k
文件大小:10k
源码类别:

IP电话/视频会议

开发平台:

WINDOWS

  1. /*
  2.  * $Revision: 1.5 $
  3.  * $Date: 1997/11/20 19:23:11 $
  4.  */
  5. ////////////////////////////////////////////////////////////////
  6. //               Copyright (c) 1996,97 Lucent Technologies    //
  7. //                       All Rights Reserved                  //
  8. //                                                            //
  9. //                       THIS IS UNPUBLISHED                  //
  10. //                       PROPRIETARY SOURCE                   //
  11. //                   CODE OF Lucent Technologies              //
  12. //      AND elemedia    //
  13. //                                                            //
  14. //           The copyright notice above does not evidence any //
  15. //          actual or intended publication of such source code//
  16. ////////////////////////////////////////////////////////////////
  17. //
  18. /////////////////////////////////////////////////////////////////
  19. // File : pkt.h        //
  20. //                                                             //
  21. // This file declares  RTPPacket and RTCPPacket classes        //
  22. //    //
  23. //                                                            //
  24. // History:    //
  25. //  20_Jan_1997 Created    //
  26. // 17_Feb_1997                                                //
  27. //  14_Feb_1997 Cosmetic changes to fn names and arg list.     //
  28. // 01_May_1997 max_payload_length, max_datagram_length..    //
  29. // 08_Jul_1997 Merged Sun5 changes.    //
  30. // 20_Aug_1997 Another Frame function in RTPPacket, for    //
  31. // retransissions..    //
  32. // 04_Nov_1997 Updated the payload types for RTP    //
  33. // 17_Nov_1997 Added 2 new variants of RTPPacket::Frame    //
  34. // these methods allow the caller to supply    //
  35. // the buffer, hence avoiding a copy operation.   //
  36. //    //
  37. /////////////////////////////////////////////////////////////////
  38. #if !defined(__PKT_H__)
  39. #define __PKT_H__
  40. #define MASK(BITS,SHIFT) (((1 << (BITS)) - 1) << (SHIFT))
  41. enum
  42. {
  43. RTP_VERSION_BITS = 2U,
  44. RTP_VERSION_SHIFT = 14U,
  45. RTP_VERSION_MASK = MASK(RTP_VERSION_BITS,RTP_VERSION_SHIFT),
  46. RTP_PADDING_BITS = 1U,
  47. RTP_PADDING_SHIFT = 13U,
  48. RTP_PADDING_MASK = MASK(RTP_PADDING_BITS,RTP_PADDING_SHIFT),
  49. RTP_EXTENSION_BITS = 1U,
  50. RTP_EXTENSION_SHIFT = 12U,
  51. RTP_EXTENSION_MASK = MASK(RTP_EXTENSION_BITS,RTP_EXTENSION_SHIFT),
  52. RTP_CC_BITS = 4U,
  53. RTP_CC_SHIFT = 8U,
  54. RTP_CC_MASK = MASK(RTP_CC_BITS,RTP_CC_SHIFT),
  55. RTP_MARKER_BITS = 1U,
  56. RTP_MARKER_SHIFT = 7U,
  57. RTP_MARKER_MASK = MASK(RTP_MARKER_BITS,RTP_MARKER_SHIFT),
  58. RTP_PT_BITS = 7U,
  59. RTP_PT_SHIFT = 0U,
  60. RTP_PT_MASK = MASK(RTP_PT_BITS,RTP_PT_SHIFT)
  61. };
  62. #define RTP_GET_VERSION(F) (((F) & RTP_VERSION_MASK) >> RTP_VERSION_SHIFT)
  63. #define RTP_GET_PADDING(F) (((F) & RTP_PADDING_MASK) >> RTP_PADDING_SHIFT)
  64. #define RTP_GET_CC(F) (((F) & RTP_CC_MASK) >> RTP_CC_SHIFT)
  65. #define RTP_GET_PT(F) (((F) & RTP_PT_MASK) >> RTP_PT_SHIFT)
  66. #define RTP_GET_EXTENSION(F) (((F) & RTP_EXTENSION_MASK) >>
  67. RTP_EXTENSION_SHIFT)
  68. #define RTP_GET_MARKER(F) (((F) & RTP_MARKER_MASK) >> RTP_MARKER_SHIFT)
  69. #define RTP_SET_VERSION(F,V)
  70. {
  71. (F) &= ~RTP_VERSION_MASK;
  72. (F) |= ((V) << RTP_VERSION_SHIFT)
  73. & RTP_VERSION_MASK;
  74. }
  75. #define RTP_SET_PADDING(F,P)
  76. {
  77. (F) &= ~RTP_PADDING_MASK;
  78. (F) |= ((P) << RTP_PADDING_SHIFT)
  79. & RTP_PADDING_MASK;
  80. }
  81. #define RTP_SET_EXTENSION(F,E)
  82. {
  83. (F) &= ~RTP_EXTENSION_MASK;
  84. (F) |= ((E) << RTP_EXTENSION_SHIFT)
  85. & RTP_EXTENSION_MASK;
  86. }
  87. #define RTP_SET_CC(F,COUNT)
  88. {
  89. (F) &= ~RTP_CC_MASK;
  90. (F) |= ((COUNT) << RTP_CC_SHIFT)
  91. & RTP_CC_MASK;
  92. }
  93. #define RTP_SET_MARKER(F,M)
  94. {
  95. (F) &= ~RTP_MARKER_MASK;
  96. (F) |= ((M) << RTP_MARKER_SHIFT)
  97. & RTP_MARKER_MASK;
  98. }
  99. #define RTP_SET_PT(F,PT)
  100. {
  101. (F) &= ~RTP_PT_MASK;
  102. (F) |= ((PT) << RTP_PT_SHIFT)
  103. & RTP_PT_MASK;
  104. }
  105. #define RTCP_GET_CUMULATIVE_LOSS(L)
  106. ((((unsigned long)L) & (unsigned long)0xFFFFFF00) >> 8)
  107. #define RTCP_GET_INCREMENTAL_LOSS(L) ((L) & 0xFF)
  108. enum
  109. {
  110. RTCP_VERSION_BITS = 2U,
  111. RTCP_VERSION_SHIFT = 14U,
  112. RTCP_VERSION_MASK = MASK(RTCP_VERSION_BITS,RTCP_VERSION_SHIFT),
  113. RTCP_PADDING_BITS = 1U,
  114. RTCP_PADDING_SHIFT = 13U,
  115. RTCP_PADDING_MASK = MASK(RTCP_PADDING_BITS,RTCP_PADDING_SHIFT),
  116. RTCP_CC_BITS = 5U,
  117. RTCP_CC_SHIFT = 8U,
  118. RTCP_CC_MASK = MASK(RTCP_CC_BITS,RTCP_CC_SHIFT),
  119. RTCP_PT_BITS = 8U,
  120. RTCP_PT_SHIFT = 0U,
  121. RTCP_PT_MASK = MASK(RTCP_PT_BITS,RTCP_PT_SHIFT)
  122. };
  123. #define RTCP_GET_VERSION(F)
  124. (((F) & RTCP_VERSION_MASK) >> RTCP_VERSION_SHIFT)
  125. #define RTCP_GET_PADDING(F)
  126. (((F) & RTCP_PADDING_MASK) >> RTCP_PADDING_SHIFT)
  127. #define RTCP_GET_COUNT(F)
  128. (((F) & RTCP_CC_MASK) >> RTCP_CC_SHIFT)
  129. #define RTCP_GET_PT(F)
  130. (((F) & RTCP_PT_MASK) >> RTCP_PT_SHIFT)
  131. #define RTCP_SET_VERSION(F,V)
  132. {
  133. (F) &= ~RTCP_VERSION_MASK;
  134. (F) |= ((V) << RTCP_VERSION_SHIFT)
  135. & RTCP_VERSION_MASK;
  136. }
  137. #define RTCP_SET_PADDING(F,P)
  138. {
  139. (F) &= ~RTCP_PADDING_MASK;
  140. (F) |= ((P) << RTCP_PADDING_SHIFT)
  141. & RTCP_PADDING_MASK;
  142. }
  143. #define RTCP_SET_COUNT(F,COUNT)
  144. {
  145. (F) &= ~RTCP_CC_MASK;
  146. (F) |= ((COUNT) << RTCP_CC_SHIFT)
  147. & RTCP_CC_MASK;
  148. }
  149. #define RTCP_SET_PT(F,PT)
  150. {
  151. (F) &= ~RTCP_PT_MASK;
  152. (F) |= ((PT) << RTCP_PT_SHIFT)
  153. & RTCP_PT_MASK;
  154. }
  155. #undef MASK
  156. class Logger;
  157. class DLLEXPORT RTCPPacket 
  158. {
  159. public:
  160. friend class RTPSession;
  161. enum PayloadTypes
  162. {
  163. PT_SENDER_REPORT = 200,
  164. PT_RECEIVER_REPORT = 201,
  165. PT_SDES = 202,
  166. PT_BYE = 203,
  167. PT_APP = 204
  168. };
  169. enum SDESTypes
  170. {
  171. ST_CNAME = 1,
  172. ST_NAME = 2,
  173. ST_EMAIL = 3,
  174. ST_PHONE = 4,
  175. ST_LOC = 5,
  176. ST_TOOL = 6,
  177. ST_NOTE = 7,
  178. ST_PRIV = 8
  179. };
  180. RTCPPacket(RTPSession *session);
  181. ~RTCPPacket();
  182. void GetSenderInfo(RTCPSenderInfo *&sender_info);
  183. int GetReceptionReports(
  184. RTCPReceptionReport *&reception_report_list);
  185. // Get the raw bytes for an RTCP packet,
  186. // for sending out on the n/w.
  187. char *GetPacket();
  188. int GetPacketLength();
  189. unsigned int GetSSRC();
  190. ProtReturnCode Deframe(char *data, int length, unsigned int ntp_sec,
  191. unsigned int ntp_frac);
  192. ProtReturnCode Frame(unsigned int rtp_time, unsigned int ntp_sec,
  193. unsigned int ntp_frac, int extra_sdes,
  194. int bye, char *bye_reason, int length);
  195. protected:
  196. char *data;
  197. int  length;
  198. // SSRC of the sender.
  199. unsigned int ssrc;
  200. // these are maintained in host byte order.
  201. RTCPSenderInfo *sender_info;
  202. RTCPReceptionReport *reception_reports;
  203. int rr_count;
  204. // The session to which this packet belongs
  205. RTPSession *session;
  206. private:
  207. Logger *_logger;
  208. };
  209. struct RTPHeader;
  210. // 
  211. // The RTP packet class.
  212. //
  213. class DLLEXPORT RTPPacket
  214. {
  215. public:
  216. friend class RTPSession;
  217. // List of RTP payload types
  218. enum PayloadType
  219. {
  220. // Video encodings...
  221. // PT_RGB8 = 23,  // 8-bit dithered RGB  --> UNASSIGNED
  222. // PT_HDCC = 24,  // SGI proprietary  --> UNASSIGNED
  223. PT_CELLB = 25,  // Sun CellB, 90000Hz
  224. PT_JPEG = 26, // JPEG, 90000Hz
  225. // PT_CUSEEME = 27,// Cornell CU-SeeMe --> UNASSIGNED
  226. PT_NV = 28, // Xerox PARC nv, 90000Hz
  227. // PT_PICW = 29, // BB&N PictureWindow --> UNASSIGNED
  228. // PT_CPV = 30, // Concept/Bolter/Viewpoint codec --> UNASSIGNED
  229. PT_H261 = 31, // ITU H.261, 90000Hz
  230. PT_MPEG = 32,  // MPEG-I & MPEG-II, 90000Hz
  231. PT_MP2T = 33,  // MPEG-II either audio or video, 90000Hz
  232. PT_H263 = 34, // ITU H.263, 90000Hz
  233. // Audio encodings...
  234. PT_PCMU = 0, // ITU G.711 Ulaw,8000Hz,1ch
  235. PT_CELP = 1, // 1016 audio,8000Hz,1ch
  236. PT_G726_32 = 2, // ITU G726, 8000Hz, 1ch (previously ITU G.721)
  237. PT_GSM = 3, // Group Speciale Mobile, GSM 6.10 audio,8000Hz,1ch
  238. PT_G723 = 4, // ITU G723.1,8000Hz,1ch
  239. PT_DVI4_8K = 5, // 8000Hz,1ch
  240. PT_DVI4_16K = 6,// 16000Hz,1ch
  241. PT_LPC = 7, // 8000Hz,1ch
  242. PT_PCMA = 8, // ITU G.711 Alaw,8000Hz,1ch
  243. PT_G722 = 9, // ITU G.722, 16000Hz,1ch
  244. PT_L16_2C = 10, // 44100Hz,2ch
  245. PT_L16_1C = 11, // 44100Hz,1ch
  246. PT_MPA = 14, // MPEG Audio,90000Hz
  247. PT_G728 = 15, // ITU G.728,8000Hz,1ch
  248. PT_DVI4_11 = 16,// DVI4 audio,11025Hz,1ch
  249. PT_DVI4_22 = 17,// DVI4 audio,22050Hz,1ch
  250. PT_G729 = 18,  // ITU G.729,8000Hz,1ch
  251. PT_CN = 19 // Comfort Noise?,8000Hz,1ch
  252. };
  253. // session: pointer to the session class to which
  254. // this packet belongs.
  255. // payload_length: The maximum length of the payload 
  256. // that is expected to be recd or sent in this session.
  257. RTPPacket(RTPSession *session, int max_payload_length = 0);
  258. ~RTPPacket();
  259. char *GetHeader();
  260. int GetHeaderLength();
  261. char* GetHeaderExt();
  262. int GetHeaderExtLength();
  263. int GetHeaderExtType();
  264. char *GetPayload();
  265. int GetPayloadLength();
  266. char *GetPacket();
  267. int GetPacketLength();
  268. // The following methods return information in
  269. // host byte order.
  270. unsigned short GetSequenceNumber();
  271. unsigned short GetFlags();
  272. ProtReturnCode SetFlags(unsigned short flags);
  273. unsigned int GetSSRC();
  274. unsigned int GetTimestamp();
  275. // Return the CSRC list.
  276. unsigned int *GetCSRCList();
  277. // Called to un-frame an incoming RTP packet.
  278. ProtReturnCode Deframe(char *data, int length,
  279. unsigned int arrival_time);
  280. // Called for framing an RTP packet, to be sent out. Sequence
  281. // numbers are generated internally.
  282. ProtReturnCode Frame(unsigned int rtp_time,
  283. int marker, int payload_length);
  284. // Buffer is user supplied, and note that the RTP header is
  285. // copied at the beginning of the buffer. 
  286. // Caveat: the buffer has to be aligned to a longword boundary
  287. //         in architectures that do not support misaligned accesses.
  288. ProtReturnCode Frame(char *buffer, int buffer_length,
  289. unsigned int rtp_time, int marker, int payload_length);
  290. // Called for framing an RTP packet to be sent out. Sequence
  291. // number can be supplied. This is used whenever a retransmission
  292. // of a lost packet is deemed necessary.
  293. ProtReturnCode Frame(unsigned short sequence_no, unsigned int rtp_time,
  294. int marker, int payload_length);
  295. // buffer is user supplied and note that the RTP header is
  296. // copied at the beginning of the buffer.
  297. // Caveat: the buffer has to be aligned to a longword boundary
  298. //         in architectures that do not support misaligned accesses.
  299. ProtReturnCode Frame(char *buffer, int buffer_length,
  300. unsigned short sequence_no, unsigned int rtp_time,
  301. int marker, int payload_length);
  302. // Methods return the maximum payload/packet lengths.
  303. int GetMaxPayloadLength();
  304. int GetMaxPacketLength();
  305. protected:
  306. RTPHeader *header;
  307. unsigned int * csrc_list;
  308. char *header_extension;
  309. int header_extension_length;
  310. int header_extension_type;
  311. char *payload;
  312. int max_payload_length;
  313. int cur_payload_length;
  314. unsigned short rtp_flags;
  315. // saved datagram.
  316. char *datagram;
  317. int max_datagram_length;
  318. int cur_datagram_length;
  319. RTPSession* session;
  320. private:
  321. Logger *_logger;
  322. };
  323. #endif