include/ortp/rtcp.h

00001 /*
00002   The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.
00003   Copyright (C) 2001  Simon MORLAT simon.morlat@linphone.org
00004 
00005   This library is free software; you can redistribute it and/or
00006   modify it under the terms of the GNU Lesser General Public
00007   License as published by the Free Software Foundation; either
00008   version 2.1 of the License, or (at your option) any later version.
00009 
00010   This library is distributed in the hope that it will be useful,
00011   but WITHOUT ANY WARRANTY; without even the implied warranty of
00012   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013   Lesser General Public License for more details.
00014 
00015   You should have received a copy of the GNU Lesser General Public
00016   License along with this library; if not, write to the Free Software
00017   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00018 */
00019 
00020 
00021 #ifndef RTCP_H
00022 #define RTCP_H
00023 
00024 #include <ortp/port.h>
00025 
00026 #define RTCP_MAX_RECV_BUFSIZE 1024
00027 
00028 #define RTCP_SENDER_INFO_SIZE 20
00029 #define RTCP_REPORT_BLOCK_SIZE 24
00030 #define RTCP_COMMON_HEADER_SIZE 4
00031 #define RTCP_SSRC_FIELD_SIZE 4
00032 
00033 #ifdef __cplusplus
00034 extern "C"{
00035 #endif
00036 
00037 /* RTCP common header */
00038 
00039 typedef enum {
00040     RTCP_SR     = 200,
00041     RTCP_RR     = 201,
00042     RTCP_SDES   = 202,
00043     RTCP_BYE    = 203,
00044     RTCP_APP    = 204
00045 } rtcp_type_t;
00046  
00047  
00048 typedef struct rtcp_common_header
00049 {
00050 #ifdef ORTP_BIGENDIAN
00051         uint16_t version:2;
00052         uint16_t padbit:1;
00053         uint16_t rc:5;
00054         uint16_t packet_type:8;
00055 #else
00056         uint16_t rc:5;
00057         uint16_t padbit:1;
00058         uint16_t version:2;
00059         uint16_t packet_type:8;
00060 #endif
00061         uint16_t length:16;
00062 } rtcp_common_header_t;
00063 
00064 #define rtcp_common_header_set_version(ch,v) (ch)->version=v
00065 #define rtcp_common_header_set_padbit(ch,p) (ch)->padbit=p
00066 #define rtcp_common_header_set_rc(ch,rc) (ch)->rc=rc
00067 #define rtcp_common_header_set_packet_type(ch,pt) (ch)->packet_type=pt
00068 #define rtcp_common_header_set_length(ch,l)     (ch)->length=htons(l)
00069 
00070 #define rtcp_common_header_get_version(ch) ((ch)->version)
00071 #define rtcp_common_header_get padbit(ch) ((ch)->padbit)
00072 #define rtcp_common_header_get_rc(ch) ((ch)->rc)
00073 #define rtcp_common_header_get_packet_type(ch) ((ch)->packet_type)
00074 #define rtcp_common_header_get_length(ch)       ntohs((ch)->length)
00075 
00076 
00077 /* SR or RR  packets */
00078 
00079 typedef struct sender_info
00080 {
00081         uint32_t ntp_timestamp_msw;
00082         uint32_t ntp_timestamp_lsw;
00083         uint32_t rtp_timestamp;
00084         uint32_t senders_packet_count;
00085         uint32_t senders_octet_count;
00086 } sender_info_t;
00087 
00088 uint64_t sender_info_get_ntp_timestamp(const sender_info_t *si);
00089 #define sender_info_get_rtp_timestamp(si)       ((si)->rtp_timestamp)
00090 #define sender_info_get_packet_count(si) \
00091         ntohl((si)->senders_packet_count)
00092 #define sender_info_get_octet_count(si) \
00093         ntohl((si)->senders_octet_count)
00094 
00095 
00096 typedef struct report_block
00097 {
00098         uint32_t ssrc;
00099         uint32_t fl_cnpl;/*fraction lost + cumulative number of packet lost*/
00100         uint32_t ext_high_seq_num_rec; /*extended highest sequence number received */
00101         uint32_t interarrival_jitter;
00102         uint32_t lsr; /*last SR */
00103         uint32_t delay_snc_last_sr; /*delay since last sr*/
00104 } report_block_t;
00105 
00106 #define report_block_get_ssrc(rb) \
00107         ntohl((rb)->ssrc)
00108 #define report_block_get_fraction_lost(rb) \
00109         (((uint32_t)ntohl((rb)->fl_cnpl))>>24)
00110 #define report_block_get_cum_packet_loss(rb) \
00111         (((uint32_t)ntohl((rb)->fl_cnpl)) & 0xFFFFFF)
00112 #define report_block_get_high_ext_seq(rb) \
00113         ntohl(((report_block_t*)(rb))->ext_high_seq_num_rec)
00114 #define report_block_get_interarrival_jitter(rb) \
00115         ntohl(((report_block_t*)(rb))->interarrival_jitter)
00116 #define report_block_get_last_SR_time(rb) \
00117         ntohl(((report_block_t*)(rb))->lsr)
00118 #define report_block_get_last_SR_delay(rb) \
00119         ntohl(((report_block_t*)(rb))->delay_snc_last_sr)
00120 
00121 #define report_block_set_fraction_lost(rb,fl)\
00122         ((rb)->fl_cnpl)=htonl( (ntohl((rb)->fl_cnpl) & 0xFFFFFF) | (((fl) & 0xFF)<<24))
00123 
00124 #define report_block_set_cum_packet_lost(rb,cpl)\
00125         ((rb)->fl_cnpl)=htonl( (ntohl((rb)->fl_cnpl) & 0xFF000000) | (((cpl) & 0xFFFFFF)))
00126 
00127 /* SDES packets */
00128 
00129 typedef enum {
00130     RTCP_SDES_END               = 0,
00131     RTCP_SDES_CNAME     = 1,
00132     RTCP_SDES_NAME      = 2,
00133     RTCP_SDES_EMAIL     = 3,
00134     RTCP_SDES_PHONE     = 4,
00135     RTCP_SDES_LOC               = 5,
00136     RTCP_SDES_TOOL      = 6,
00137     RTCP_SDES_NOTE      = 7,
00138     RTCP_SDES_PRIV              = 8,
00139     RTCP_SDES_MAX               = 9
00140 } rtcp_sdes_type_t;
00141 
00142 typedef struct sdes_chunk
00143 {
00144         uint32_t csrc;
00145 } sdes_chunk_t;
00146 
00147 
00148 #define sdes_chunk_get_csrc(c)  ntohl((c)->csrc)
00149 
00150 typedef struct sdes_item
00151 {
00152         uint8_t item_type;
00153         uint8_t len;
00154         char content[1];        
00155 } sdes_item_t;
00156 
00157 #define RTCP_SDES_MAX_STRING_SIZE 255
00158 #define RTCP_SDES_ITEM_HEADER_SIZE 2
00159 #define RTCP_SDES_CHUNK_DEFAULT_SIZE 1024
00160 #define RTCP_SDES_CHUNK_HEADER_SIZE (sizeof(sdes_chunk_t))
00161 
00162 /* RTCP bye packet */
00163 
00164 typedef struct rtcp_bye_reason
00165 {
00166         uint8_t len;
00167         char content[1];
00168 } rtcp_bye_reason_t;
00169  
00170 typedef struct rtcp_bye
00171 {
00172         rtcp_common_header_t ch;
00173         uint32_t ssrc[1];  /* the bye may contain several ssrc/csrc */
00174 } rtcp_bye_t;
00175 #define RTCP_BYE_HEADER_SIZE sizeof(rtcp_bye_t)
00176 #define RTCP_BYE_REASON_MAX_STRING_SIZE 255
00177 
00178 
00179 
00180 typedef struct rtcp_sr{
00181         rtcp_common_header_t ch;
00182         uint32_t ssrc;
00183         sender_info_t si;
00184         report_block_t rb[1];
00185 } rtcp_sr_t;
00186 
00187 typedef struct rtcp_rr{
00188         rtcp_common_header_t ch;
00189         uint32_t ssrc;
00190         report_block_t rb[1];
00191 } rtcp_rr_t;
00192 
00193 typedef struct rtcp_app{
00194         rtcp_common_header_t ch;
00195         uint32_t ssrc;
00196         char name[4];
00197 } rtcp_app_t;
00198 
00199 struct _RtpSession;
00200 void rtp_session_rtcp_process_send(struct _RtpSession *s);
00201 void rtp_session_rtcp_process_recv(struct _RtpSession *s);
00202 
00203 #define RTCP_DEFAULT_REPORT_INTERVAL 5
00204 
00205 
00206 /* packet parsing api */
00207 
00208 /*in case of coumpound packet, set read pointer of m to the beginning of the next RTCP
00209 packet */
00210 bool_t rtcp_next_packet(mblk_t *m);
00211 /* put the read pointer at the first RTCP packet of the compound packet (as before any previous calls ot rtcp_next_packet() */
00212 void rtcp_rewind(mblk_t *m);
00213 /* get common header*/
00214 const rtcp_common_header_t * rtcp_get_common_header(const mblk_t *m);
00215 
00216 /*Sender Report accessors */
00217 /* check if this packet is a SR and if it is correct */
00218 bool_t rtcp_is_SR(const mblk_t *m);
00219 uint32_t rtcp_SR_get_ssrc(const mblk_t *m);
00220 const sender_info_t * rtcp_SR_get_sender_info(const mblk_t *m);
00221 const report_block_t * rtcp_SR_get_report_block(const mblk_t *m, int idx);
00222 
00223 /*Receiver report accessors*/
00224 bool_t rtcp_is_RR(const mblk_t *m);
00225 uint32_t rtcp_RR_get_ssrc(const mblk_t *m);
00226 const report_block_t * rtcp_RR_get_report_block(const mblk_t *m,int idx);
00227 
00228 /*SDES accessors */
00229 bool_t rtcp_is_SDES(const mblk_t *m);
00230 typedef void (*SdesItemFoundCallback)(void *user_data, uint32_t csrc, rtcp_sdes_type_t t, const char *content, uint8_t content_len); 
00231 void rtcp_sdes_parse(const mblk_t *m, SdesItemFoundCallback cb, void *user_data);
00232 
00233 /*BYE accessors */
00234 bool_t rtcp_is_BYE(const mblk_t *m);
00235 bool_t rtcp_BYE_get_ssrc(const mblk_t *m, int idx, uint32_t *ssrc);
00236 bool_t rtcp_BYE_get_reason(const mblk_t *m, const char **reason, int *reason_len);
00237 
00238 /*APP accessors */
00239 bool_t rtcp_is_APP(const mblk_t *m);
00240 int rtcp_APP_get_subtype(const mblk_t *m);
00241 uint32_t rtcp_APP_get_ssrc(const mblk_t *m);
00242 /* name argument is supposed to be at least 4 characters (note: no '\0' written)*/
00243 void rtcp_APP_get_name(const mblk_t *m, char *name); 
00244 /* retrieve the data. when returning, data points directly into the mblk_t */
00245 void rtcp_APP_get_data(const mblk_t *m, uint8_t **data, int *len);
00246 
00247 
00248 #ifdef __cplusplus
00249 }
00250 #endif
00251 
00252 #endif

Generated on Tue Feb 5 21:35:36 2008 for oRTP by  doxygen 1.5.4