/usr/include/uclmmbase/rtp.h is in libuclmmbase1-dev 1.2.16.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | /*
* FILE: rtp.h
* AUTHOR: Colin Perkins <c.perkins@cs.ucl.ac.uk>
*
* $Revision: 1.58 $
* $Date: 2002/04/15 22:40:05 $
*
* Copyright (c) 1998-2000 University College London
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, is permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the Computer Science
* Department at University College London.
* 4. Neither the name of the University nor of the Department may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef __RTP_H__
#define __RTP_H__
#if defined(__cplusplus)
extern "C" {
#endif
#define RTP_VERSION 2
#define RTP_PACKET_HEADER_SIZE ((sizeof(char *) * 2) + sizeof(uint32_t *) + (2 * sizeof(int)))
#define RTP_MAX_PACKET_LEN 1500
#if !defined(WORDS_BIGENDIAN) && !defined(WORDS_SMALLENDIAN)
#error RTP library requires WORDS_BIGENDIAN or WORDS_SMALLENDIAN to be defined.
#endif
struct rtp;
/* XXX gtkdoc doesn't seem to be able to handle functions that return
* struct *'s. */
typedef struct rtp *rtp_t;
typedef struct {
/* The following are pointers to the data in the packet as */
/* it came off the wire. The packet it read in such that the */
/* header maps onto the latter part of this struct, and the */
/* fields in this first part of the struct point into it. The */
/* entire packet can be freed by freeing this struct, without */
/* having to free the csrc, data and extn blocks separately. */
/* WARNING: Don't change the size of the first portion of the */
/* struct without changing RTP_PACKET_HEADER_SIZE to match. */
uint32_t *csrc;
char *data;
int data_len;
unsigned char *extn;
uint16_t extn_len; /* Size of the extension in 32 bit words minus one */
uint16_t extn_type; /* Extension type field in the RTP packet header */
/* The following map directly onto the RTP packet header... */
#ifdef WORDS_BIGENDIAN
unsigned short v:2; /* packet type */
unsigned short p:1; /* padding flag */
unsigned short x:1; /* header extension flag */
unsigned short cc:4; /* CSRC count */
unsigned short m:1; /* marker bit */
unsigned short pt:7; /* payload type */
#else
unsigned short cc:4; /* CSRC count */
unsigned short x:1; /* header extension flag */
unsigned short p:1; /* padding flag */
unsigned short v:2; /* packet type */
unsigned short pt:7; /* payload type */
unsigned short m:1; /* marker bit */
#endif
uint16_t seq; /* sequence number */
uint32_t ts; /* timestamp */
uint32_t ssrc; /* synchronization source */
/* The csrc list, header extension and data follow, but can't */
/* be represented in the struct. */
} rtp_packet;
typedef struct {
uint32_t ssrc;
uint32_t ntp_sec;
uint32_t ntp_frac;
uint32_t rtp_ts;
uint32_t sender_pcount;
uint32_t sender_bcount;
} rtcp_sr;
typedef struct {
uint32_t ssrc; /* The ssrc to which this RR pertains */
#ifdef WORDS_BIGENDIAN
uint32_t fract_lost:8;
uint32_t total_lost:24;
#else
uint32_t total_lost:24;
uint32_t fract_lost:8;
#endif
uint32_t last_seq;
uint32_t jitter;
uint32_t lsr;
uint32_t dlsr;
} rtcp_rr;
typedef struct {
#ifdef WORDS_BIGENDIAN
unsigned short version:2; /* RTP version */
unsigned short p:1; /* padding flag */
unsigned short subtype:5; /* application dependent */
#else
unsigned short subtype:5; /* application dependent */
unsigned short p:1; /* padding flag */
unsigned short version:2; /* RTP version */
#endif
unsigned short pt:8; /* packet type */
uint16_t length; /* packet length */
uint32_t ssrc;
char name[4]; /* four ASCII characters */
char data[1]; /* variable length field */
} rtcp_app;
/* rtp_event type values. */
typedef enum {
RX_RTP,
RX_SR,
RX_RR,
RX_SDES,
RX_BYE, /* Source is leaving the session, database entry is still valid */
SOURCE_CREATED,
SOURCE_DELETED, /* Source has been removed from the database */
RX_RR_EMPTY, /* We've received an empty reception report block */
RX_RTCP_START, /* Processing a compound RTCP packet about to start. The SSRC is not valid in this event. */
RX_RTCP_FINISH, /* Processing a compound RTCP packet finished. The SSRC is not valid in this event. */
RR_TIMEOUT,
RX_APP
} rtp_event_type;
typedef struct {
uint32_t ssrc;
rtp_event_type type;
void *data;
struct timeval *ts;
} rtp_event;
/* Callback types */
typedef void (*rtp_callback)(struct rtp *session, rtp_event *e);
typedef rtcp_app* (*rtcp_app_callback)(struct rtp *session, uint32_t rtp_ts, int max_size);
/* SDES packet types... */
typedef enum {
RTCP_SDES_END = 0,
RTCP_SDES_CNAME = 1,
RTCP_SDES_NAME = 2,
RTCP_SDES_EMAIL = 3,
RTCP_SDES_PHONE = 4,
RTCP_SDES_LOC = 5,
RTCP_SDES_TOOL = 6,
RTCP_SDES_NOTE = 7,
RTCP_SDES_PRIV = 8
} rtcp_sdes_type;
typedef struct {
uint8_t type; /* type of SDES item */
uint8_t length; /* length of SDES item (in bytes) */
char data[1]; /* text, not zero-terminated */
} rtcp_sdes_item;
/* RTP options */
typedef enum {
RTP_OPT_PROMISC = 1,
RTP_OPT_WEAK_VALIDATION = 2,
RTP_OPT_FILTER_MY_PACKETS = 3,
RTP_OPT_REUSE_PACKET_BUFS = 4 /* Each data packet is written into the same buffer, */
/* rather than malloc()ing a new buffer each time. */
} rtp_option;
/* API */
rtp_t rtp_init(const char *addr,
uint16_t rx_port, uint16_t tx_port,
int ttl, double rtcp_bw,
rtp_callback callback,
uint8_t *userdata);
rtp_t rtp_init_if(const char *addr, char *iface,
uint16_t rx_port, uint16_t tx_port,
int ttl, double rtcp_bw,
rtp_callback callback,
uint8_t *userdata);
void rtp_send_bye(struct rtp *session);
void rtp_done(struct rtp *session);
int rtp_set_option(struct rtp *session, rtp_option optname, int optval);
int rtp_get_option(struct rtp *session, rtp_option optname, int *optval);
int rtp_recv(struct rtp *session,
struct timeval *timeout, uint32_t curr_rtp_ts);
int rtp_send_data(struct rtp *session,
uint32_t rtp_ts, char pt, int m,
int cc, uint32_t csrc[],
char *data, int data_len,
char *extn, uint16_t extn_len, uint16_t extn_type);
#ifndef WIN32
int rtp_send_data_iov(struct rtp *session,
uint32_t rtp_ts, char pt, int m,
int cc, uint32_t csrc[],
struct iovec *iov, int iov_count,
char *extn, uint16_t extn_len, uint16_t extn_type);
#endif
void rtp_send_ctrl(struct rtp *session, uint32_t rtp_ts,
rtcp_app_callback appcallback);
void rtp_update(struct rtp *session);
uint32_t rtp_my_ssrc(struct rtp *session);
int rtp_add_csrc(struct rtp *session, uint32_t csrc);
int rtp_del_csrc(struct rtp *session, uint32_t csrc);
int rtp_set_sdes(struct rtp *session, uint32_t ssrc,
rtcp_sdes_type type,
const char *value, int length);
const char *rtp_get_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type);
const rtcp_sr *rtp_get_sr(struct rtp *session, uint32_t ssrc);
const rtcp_rr *rtp_get_rr(struct rtp *session, uint32_t reporter, uint32_t reportee);
int rtp_set_encryption_key(struct rtp *session, const char *passphrase);
int rtp_set_my_ssrc(struct rtp *session, uint32_t ssrc);
char *rtp_get_addr(struct rtp *session);
uint16_t rtp_get_rx_port(struct rtp *session);
uint16_t rtp_get_tx_port(struct rtp *session);
int rtp_get_ttl(struct rtp *session);
uint8_t *rtp_get_userdata(struct rtp *session);
#if defined(__cplusplus)
}
#endif
#endif /* __RTP_H__ */
|