rtpTypes.h
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:11k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef RTPTYPES_H
  2. #define RTPTYPES_H
  3. /* ====================================================================
  4.  * The Vovida Software License, Version 1.0 
  5.  * 
  6.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  7.  * 
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  * 
  20.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  21.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  22.  *    not be used to endorse or promote products derived from this
  23.  *    software without prior written permission. For written
  24.  *    permission, please contact vocal@vovida.org.
  25.  *
  26.  * 4. Products derived from this software may not be called "VOCAL", nor
  27.  *    may "VOCAL" appear in their name, without prior written
  28.  *    permission of Vovida Networks, Inc.
  29.  * 
  30.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  31.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  33.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  34.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  35.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  36.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  37.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  38.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  39.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  40.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  41.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  42.  * DAMAGE.
  43.  * 
  44.  * ====================================================================
  45.  * 
  46.  * This software consists of voluntary contributions made by Vovida
  47.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  48.  * Inc.  For more information on Vovida Networks, Inc., please see
  49.  * <http://www.vovida.org/>.
  50.  *
  51.  */
  52. static const char* const rtpTypes_h_Version =
  53.     "$Id: rtpTypes.h,v 1.39 2001/07/17 22:08:11 chok Exp $";
  54. #include <stdlib.h>
  55. #include <sys/types.h>
  56. #include "vtypes.h"
  57. #include <unistd.h>
  58. #include "vovida-endian.h"
  59. #include "NtpTime.hxx"
  60. /// Version of this RTP, always 2
  61. const int RTP_VERSION = 2;
  62. const int RTP_SEQ_MOD = 1 << 16;
  63. const u_int32_t RTP_TIME_MOD = 1 << 32 - 1;
  64. /// Maximum UDP packet size, 8129
  65. const int RTP_MTU = 8129;
  66. /// 32-bit sequence number
  67. typedef u_int16_t RtpSeqNumber;
  68. /// Middle 32-bit of NTP
  69. typedef u_int32_t RtpTime;
  70. /// 32-bit source number
  71. typedef u_int32_t RtpSrc;
  72. /* ----------------------------------------------------------------- */
  73. /* --- RTP Structures ---------------------------------------------- */
  74. /* ----------------------------------------------------------------- */
  75. typedef void* RtpPacketPtr;
  76. typedef void* RtpReceiverPtr;
  77. typedef void* RtpTransmitterPtr;
  78. typedef void* RtpSessionPtr;
  79. class RtpTransmitter;
  80. class RtpReceiver;
  81. // Supported RTP payloads
  82. typedef enum
  83. {
  84.     rtpPayloadPCMU = 0,
  85.     rtpPayload1016 = 1,
  86.     rtpPayloadG726_32 = 2,
  87.     rtpPayloadGSM = 3,
  88.     rtpPayloadG723 = 4,
  89.     rtpPayloadDVI4_8KHz = 5,
  90.     rtpPayloadDVI4_16KHz = 6,
  91.     rtpPayloadLPC = 7,
  92.     rtpPayloadPCMA = 8,
  93.     rtpPayloadG722 = 9,
  94.     rtpPayloadL16_stereo = 10,
  95.     rtpPayloadL16_mono = 11,
  96.     rtpPayloadQCELP = 12,
  97.     rtpPayloadMPA = 14,
  98.     rtpPayloadG728 = 15,
  99.     rtpPayloadDVI4_11KHz = 16,
  100.     rtpPayloadDVI4_22KHz = 17,
  101.     rtpPayloadG729 = 18,
  102.     rtpPayloadCN = 19,
  103.     rtpPayloadGSMFR = 20,
  104.     rtpPayloadG726_24 = 22,
  105.     rtpPayloadG726_16 = 23,
  106.     rtpPayloadCelB = 25,
  107.     rtpPayloadJPEG = 26,
  108.     rtpPayloadNV = 28,
  109.     rtpPayloadH261 = 31,
  110.     rtpPayloadMPV = 32,
  111.     rtpPayloadMP2T = 33,
  112.     rtpPayloadH263 = 34,
  113.     rtpPayloadDTMF_RFC2833 = 100,
  114.     rtpPayloadCiscoRtp = 121,
  115.     rtpPayloadL16_8k_mono = 122,
  116.     rtpPayloadUndefined = 127    /* max int of 7-bit unsigned int */
  117. } RtpPayloadType;
  118. /// RTP packet header
  119. struct RtpHeaderStruct
  120. {
  121. #if __BYTE_ORDER == __LITTLE_ENDIAN
  122. u_int32_t count:
  123.     4;
  124. u_int32_t extension:
  125.     1;
  126. u_int32_t padding:
  127.     1;
  128. u_int32_t version:
  129.     2;
  130. u_int32_t type:
  131.     7;
  132. u_int32_t marker:
  133.     1;
  134. #elif __BYTE_ORDER == __BIG_ENDIAN
  135.     /// protocal version
  136. u_int32_t version:
  137.     2;
  138.     /// padding flag - for encryption
  139. u_int32_t padding:
  140.     1;
  141.     /// header extension flag
  142. u_int32_t extension:
  143.     1;
  144.     /// csrc count
  145. u_int32_t count:
  146.     4;
  147.     /// marker bit - for profile
  148. u_int32_t marker:
  149.     1;
  150.     /// payload type
  151. u_int32_t type:
  152.     7;
  153. #else
  154. #error "Problem in <endian.h>"
  155. #endif
  156.     /// sequence number of this packet
  157. u_int32_t sequence :
  158.     16;
  159.     /// timestamp of this packet
  160.     RtpTime timestamp;
  161.     /// source of packet
  162.     RtpSrc ssrc;
  163.     /// list of contributing sources
  164.     RtpSrc startOfCsrc;
  165. };
  166. typedef struct RtpHeaderStruct RtpHeader;
  167. // Transmitter errors
  168. typedef enum
  169. {
  170.     tran_success = 0
  171. } RtpTransmitterError;
  172. // Receiver errors
  173. typedef enum
  174. {
  175.     recv_success = 0,
  176.     recv_bufferEmpty = 20,
  177.     recv_lostPacket = 21
  178. } RtpReceiverError;
  179. /* ----------------------------------------------------------------- */
  180. /* --- RTCP Structures --------------------------------------------- */
  181. /* ----------------------------------------------------------------- */
  182. typedef void* RtcpPacketPtr;
  183. typedef void* RtcpReceiverPtr;
  184. typedef void* RtcpTransmitterPtr;
  185. // Supported RTCP types
  186. typedef enum
  187. {
  188.     rtcpTypeSR = 200,
  189.     rtcpTypeRR = 201,
  190.     rtcpTypeSDES = 202,
  191.     rtcpTypeBYE = 203,
  192.     rtcpTypeAPP = 204             // not implemented
  193. } RtcpType;
  194. // Supported SDES types
  195. typedef enum
  196. {
  197.     rtcpSdesEnd = 0,
  198.     rtcpSdesCname = 1,
  199.     rtcpSdesName = 2,
  200.     rtcpSdesEmail = 3,
  201.     rtcpSdesPhone = 4,
  202.     rtcpSdesLoc = 5,
  203.     rtcpSdesTool = 6,
  204.     rtcpSdesNote = 7,
  205.     rtcpSdesPriv = 8              // not implemented
  206. } RtcpSDESType;
  207. /// RTCP header
  208. struct RtcpHeaderStruct
  209. {
  210. #if __BYTE_ORDER == __LITTLE_ENDIAN
  211. u_int32_t count:
  212.     5;
  213. u_int32_t padding:
  214.     1;
  215. u_int32_t version:
  216.     2;
  217. #elif __BYTE_ORDER == __BIG_ENDIAN
  218. /// protocal version
  219. u_int32_t version:
  220.     2;
  221.     /// padding flag
  222. u_int32_t padding:
  223.     1;
  224.     /// depending on packet type
  225. u_int32_t count:
  226.     5;
  227. #else
  228. #error "Problem in <endian.h>"
  229. #endif
  230.     /// type of RTCP packet
  231. u_int32_t type:
  232.     8;
  233.     /// lenght of RTCP packet in octlets minus 1
  234. u_int32_t length:
  235.     16;
  236. };
  237. typedef struct RtcpHeaderStruct RtcpHeader;
  238. /// report block
  239. struct RtcpReportStruct
  240. {
  241.     /// source being reported
  242.     RtpSrc ssrc;
  243.     /* endian problem here? - kle */
  244.     /// fraction lost since last report
  245. u_int32_t fracLost:
  246.     8;
  247.     /// cumulative packet lost - signed
  248.     unsigned char cumLost[3];
  249.     /// number of cycles
  250. u_int32_t recvCycles:
  251.     16;
  252.     /// last seq number received
  253. u_int32_t lastSeqRecv:
  254.     16;
  255.     /// interval jitter
  256.     u_int32_t jitter;
  257.     /// last SR packet received from ssrc
  258.     u_int32_t lastSRTimeStamp;
  259.     /// delay since last SR packet
  260.     u_int32_t lastSRDelay;
  261. };
  262. typedef struct RtcpReportStruct RtcpReport;
  263. /// sender info
  264. struct RtcpSenderStruct
  265. {
  266.     /// source of sender
  267.     RtpSrc ssrc;
  268.     /// seconds of NTP
  269.     RtpTime ntpTimeSec;
  270.     /// fractional seconds of NTP
  271.     RtpTime ntpTimeFrac;
  272.     /// transmitter RTP timestamp
  273.     RtpTime rtpTime;
  274.     /// number of packets sent
  275.     u_int32_t packetCount;
  276.     /// number of octlets sent
  277.     u_int32_t octetCount;
  278. };
  279. typedef struct RtcpSenderStruct RtcpSender;
  280. /// bye reason item
  281. struct RtcpByeStruct
  282. {
  283.     /// lenght of text
  284.     u_int8_t length;
  285.     /// reason for leaving, not null-term
  286.     char startOfText;
  287. };
  288. typedef struct RtcpByeStruct RtcpBye;
  289. /// source descrp item
  290. struct RtcpSDESItemStruct
  291. {
  292.     /// type of description
  293.     u_int8_t type;
  294.     /// lenght of item
  295.     u_int8_t length;
  296.     /// text description not null-term
  297.     char startOfText;
  298. };
  299. typedef struct RtcpSDESItemStruct RtcpSDESItem;
  300. /// source descrp chunk
  301. struct RtcpChunkStruct
  302. {
  303.     /// source being described
  304.     RtpSrc ssrc;
  305.     /// list of SDES information, ending with rtcpSdesEnd
  306.     RtcpSDESItem startOfItem;
  307. };
  308. typedef struct RtcpChunkStruct RtcpChunk;
  309. /// SDES information
  310. struct SDESdataStruct
  311. {
  312.     /// CNAME for this source
  313.     char cname [256];
  314.     /// NAME for this source
  315.     char name [256];
  316.     /// EMAIL for this source
  317.     char email [256];
  318.     /// PHONE for this source
  319.     char phone [256];
  320.     /// LOC for this source
  321.     char loc [256];
  322.     /// TOOL for this source
  323.     char tool [256];
  324.     /// NOTE for this source
  325.     char note [256];
  326. };
  327. typedef struct SDESdataStruct SDESdata;
  328. /// receiver information
  329. struct RtpTranInfoStruct
  330. {
  331.     /// SSRC number for recv
  332.     RtpSrc ssrc;
  333.     /// pointer to receiver for specific information
  334.     RtpReceiver* recv;
  335.     /// number packets expected in last interval
  336.     int expectedPrior;
  337.     /// number of packets actually received in last RTCP interval
  338.     int receivedPrior;
  339.     /// SDES information
  340.     SDESdata SDESInfo;
  341.     /// LSR timestamp which will be one of the fields of the next SR sent out
  342.     u_int32_t lastSRTimestamp;
  343.     /// receiveing time of the last SR received
  344.     NtpTime recvLastSRTimestamp;
  345. };
  346. typedef struct RtpTranInfoStruct RtpTranInfo;
  347. /* ----------------------------------------------------------------- */
  348. /* --- RTP Session ------------------------------------------------- */
  349. /* ----------------------------------------------------------------- */
  350. // States
  351. typedef enum
  352. {
  353.     rtp_session_undefined = -1,
  354.     rtp_session_inactive = 0,
  355.     rtp_session_sendonly = 1,
  356.     rtp_session_recvonly = 2,
  357.     rtp_session_sendrecv = 3
  358. } RtpSessionState;
  359. // Session errors
  360. typedef enum
  361. {
  362.     session_success = 0,
  363.     session_wrongState = 20
  364. } RtpSessionError;
  365. /* ----------------------------------------------------------------- */
  366. /* --- RTP Events -------------------------------------------------- */
  367. /* ----------------------------------------------------------------- */
  368. struct RtpEventDTMFRFC2833Struct
  369. {
  370. u_int32_t event:
  371.     8;
  372. #if __BYTE_ORDER == __LITTLE_ENDIAN
  373. u_int32_t volume:
  374.     6;
  375. u_int32_t reserved:
  376.     1;
  377. u_int32_t edge:
  378.     1;
  379. #elif __BYTE_ORDER == __BIG_ENDIAN
  380. u_int32_t edge:
  381.     1;
  382. u_int32_t reserved:
  383.     1;
  384. u_int32_t volume:
  385.     6;
  386. #else
  387. #error "Problem in <endian.h>"
  388. #endif
  389. u_int32_t duration:
  390.     16;
  391. };
  392. typedef struct RtpEventDTMFRFC2833Struct RtpEventDTMFRFC2833;
  393. struct RtpEventDTMFCiscoRtp
  394. {
  395. u_int32_t sequence:
  396.     8;
  397. #if __BYTE_ORDER == __LITTLE_ENDIAN
  398. u_int32_t level:
  399.     5;
  400. u_int32_t reserved0:
  401.     3;
  402. u_int32_t edge:
  403.     5;
  404. u_int32_t digitType:
  405.     3;
  406. u_int32_t digitCode:
  407.     5;
  408. u_int32_t reserved1:
  409.     3;
  410. #elif __BYTE_ORDER == __BIG_ENDIAN
  411. u_int32_t reserved0:
  412.     3;
  413. u_int32_t level:
  414.     5;
  415. u_int32_t digitType:
  416.     3;
  417. u_int32_t edge:
  418.     5;
  419. u_int32_t reserved1:
  420.     3;
  421. u_int32_t digitCode:
  422.     5;
  423. #else
  424. #error "Problem in <endian.h>"
  425. #endif
  426. };
  427. typedef struct RtpEventDTMFCiscoRtpStruct RtpEventCiscoRtp;
  428.         
  429. enum DTMFEvent
  430. {
  431.     DTMFEventNULL = -1,
  432.     DTMFEventDigit0,
  433.     DTMFEventDigit1,
  434.     DTMFEventDigit2,
  435.     DTMFEventDigit3,
  436.     DTMFEventDigit4,
  437.     DTMFEventDigit5,
  438.     DTMFEventDigit6,
  439.     DTMFEventDigit7,
  440.     DTMFEventDigit8,
  441.     DTMFEventDigit9,
  442.     DTMFEventDigitStar,
  443.     DTMFEventDigitHash
  444. };
  445. enum KeyEvent
  446. {
  447.     KeyEventNULL,
  448.     KeyEventOn,
  449.     KeyEventEdge,
  450.     KeyEventOff
  451. };
  452. #endif // RTPTYPES_H