oRTP 0.22.0

- Main Page
- Data Structures
- Files

- File List
- Globals

rtpsession.h
Go to the documentation of this file.
1 /*
2 The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.
3 Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
30 #ifndef RTPSESSION_H
31 #define RTPSESSION_H
32
33
34 #include <ortp/port.h>
35 #include <ortp/rtp.h>
36 #include <ortp/payloadtype.h>
37 #include <ortp/rtpprofile.h>
38 #include <ortp/sessionset.h>
39 #include <ortp/rtcp.h>
40 #include <ortp/str_utils.h>
41 #include <ortp/rtpsignaltable.h>
42 #include <ortp/event.h>
43
44
45
46 typedef enum {
47 RTP_SESSION_RECVONLY,
48 RTP_SESSION_SENDONLY,
49 RTP_SESSION_SENDRECV
50 } RtpSessionMode;
51
52
55 typedef struct _JBParameters{
56 int min_size;
57 int nom_size;
58 int max_size;
59 bool_t adaptive;
60 bool_t pad[3];
61 int max_packets;
62 } JBParameters;
63
64 typedef struct _JitterControl
65 {
66 unsigned int count;
67 int jitt_comp; /* the user jitt_comp in miliseconds*/
68 int jitt_comp_ts; /* the jitt_comp converted in rtp time (same unit as timestamp) */
69 int adapt_jitt_comp_ts;
70 int64_t slide;
71 int64_t prev_slide;
72 float jitter;
73 int olddiff;
74 float inter_jitter; /* interarrival jitter as defined in the RFC */
75 int corrective_step;
76 int corrective_slide;
77 uint64_t cum_jitter_buffer_size; /*in timestamp units*/
78 unsigned int cum_jitter_buffer_count; /*used for computation of jitter buffer size*/
79 int clock_rate;
80 bool_t adaptive;
81 bool_t enabled;
82 } JitterControl;
83
84 typedef struct _WaitPoint
85 {
86 ortp_mutex_t lock;
87 ortp_cond_t cond;
88 uint32_t time;
89 bool_t wakeup;
90 } WaitPoint;
91
92 typedef struct _RtpTransport
93 {
94 void *data;
95 ortp_socket_t (*t_getsocket)(struct _RtpTransport *t);
96 int (*t_sendto)(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen);
97 int (*t_recvfrom)(struct _RtpTransport *t, mblk_t *msg, int flags, struct sockaddr *from, socklen_t *fromlen);
98 struct _RtpSession *session;//<back pointer to the owning session, set by oRTP
99 void (*t_close)(struct _RtpTransport *transport, void *userData);
100 } RtpTransport;
101
102 typedef struct _OrtpNetworkSimulatorParams{
103 int enabled;
104 float max_bandwidth; /*IP bandwidth, in bit/s*/
105 float loss_rate;
106 }OrtpNetworkSimulatorParams;
107
108 typedef struct _OrtpNetworkSimulatorCtx{
109 OrtpNetworkSimulatorParams params;
110 int bit_budget;
111 int qsize;
112 queue_t q;
113 struct timeval last_check;
114 }OrtpNetworkSimulatorCtx;
115
116 typedef struct _RtpStream
117 {
118 ortp_socket_t socket;
119 struct _RtpTransport *tr;
120 int sockfamily;
121 int max_rq_size;
122 int time_jump;
123 uint32_t ts_jump;
124 queue_t rq;
125 queue_t tev_rq;
126 mblk_t *cached_mp;
127 int loc_port;
128 #ifdef ORTP_INET6
129 struct sockaddr_storage rem_addr;
130 #else
131 struct sockaddr_in rem_addr;
132 #endif
133 int rem_addrlen;
134 void *QoSHandle;
135 unsigned long QoSFlowID;
136 JitterControl jittctl;
137 uint32_t snd_time_offset;/*the scheduler time when the application send its first timestamp*/
138 uint32_t snd_ts_offset; /* the first application timestamp sent by the application */
139 uint32_t snd_rand_offset; /* a random number added to the user offset to make the stream timestamp*/
140 uint32_t snd_last_ts; /* the last stream timestamp sended */
141 uint32_t rcv_time_offset; /*the scheduler time when the application ask for its first timestamp*/
142 uint32_t rcv_ts_offset; /* the first stream timestamp */
143 uint32_t rcv_query_ts_offset; /* the first user timestamp asked by the application */
144 uint32_t rcv_last_ts; /* the last stream timestamp got by the application */
145 uint32_t rcv_last_app_ts; /* the last application timestamp asked by the application */
146 uint32_t rcv_last_ret_ts; /* the timestamp of the last sample returned (only for continuous audio)*/
147 uint32_t hwrcv_extseq; /* last received on socket extended sequence number */
148 uint32_t hwrcv_seq_at_last_SR;
149 uint32_t hwrcv_since_last_SR;
150 uint32_t last_rcv_SR_ts; /* NTP timestamp (middle 32 bits) of last received SR */
151 struct timeval last_rcv_SR_time; /* time at which last SR was received */
152 uint16_t snd_seq; /* send sequence number */
153 uint32_t last_rtcp_packet_count; /*the sender's octet count in the last sent RTCP SR*/
154 uint32_t sent_payload_bytes; /*used for RTCP sender reports*/
155 unsigned int sent_bytes; /* used for bandwidth estimation */
156 struct timeval send_bw_start; /* used for bandwidth estimation */
157 unsigned int recv_bytes; /* used for bandwidth estimation */
158 struct timeval recv_bw_start; /* used for bandwidth estimation */
159 rtp_stats_t stats;
160 int recv_errno;
161 int send_errno;
162 int snd_socket_size;
163 int rcv_socket_size;
164 int ssrc_changed_thres;
165 jitter_stats_t jitter_stats;
166 }RtpStream;
167
168 typedef struct _RtcpStream
169 {
170 ortp_socket_t socket;
171 int sockfamily;
172 struct _RtpTransport *tr;
173 mblk_t *cached_mp;
174 int loc_port;
175 #ifdef ORTP_INET6
176 struct sockaddr_storage rem_addr;
177 #else
178 struct sockaddr_in rem_addr;
179 #endif
180 int rem_addrlen;
181 int interval;
182 uint32_t last_rtcp_report_snt_r; /* the time of the last rtcp report sent, in recv timestamp unit */
183 uint32_t last_rtcp_report_snt_s; /* the time of the last rtcp report sent, in send timestamp unit */
184 uint32_t rtcp_report_snt_interval_r; /* the interval in timestamp unit for receive path between rtcp report sent */
185 uint32_t rtcp_report_snt_interval_s; /* the interval in timestamp unit for send path between rtcp report sent */
186 bool_t enabled; /*tells whether we can send RTCP packets */
187 } RtcpStream;
188
189 typedef struct _RtpSession RtpSession;
190
191
200 struct _RtpSession
201 {
202 RtpSession *next; /* next RtpSession, when the session are enqueued by the scheduler */
203 int mask_pos; /* the position in the scheduler mask of RtpSession : do not move this field: it is part of the ABI since the session_set macros use it*/
204 struct {
205 RtpProfile *profile;
206 int pt;
207 unsigned int ssrc;
208 WaitPoint wp;
209 int telephone_events_pt; /* the payload type used for telephony events */
210 } snd,rcv;
211 unsigned int inc_ssrc_candidate;
212 int inc_same_ssrc_count;
213 int hw_recv_pt; /* recv payload type before jitter buffer */
214 int recv_buf_size;
215 RtpSignalTable on_ssrc_changed;
216 RtpSignalTable on_payload_type_changed;
217 RtpSignalTable on_telephone_event_packet;
218 RtpSignalTable on_telephone_event;
219 RtpSignalTable on_timestamp_jump;
220 RtpSignalTable on_network_error;
221 RtpSignalTable on_rtcp_bye;
222 struct _OList *signal_tables;
223 struct _OList *eventqs;
224 msgb_allocator_t allocator;
225 RtpStream rtp;
226 RtcpStream rtcp;
227 RtpSessionMode mode;
228 struct _RtpScheduler *sched;
229 uint32_t flags;
230 int dscp;
231 int multicast_ttl;
232 int multicast_loopback;
233 void * user_data;
234 /* FIXME: Should be a table for all session participants. */
235 struct timeval last_recv_time; /* Time of receiving the RTP/RTCP packet. */
236 mblk_t *pending;
237 /* telephony events extension */
238 mblk_t *current_tev; /* the pending telephony events */
239 mblk_t *sd;
240 queue_t contributing_sources;
241 unsigned int lost_packets_test_vector;
242 unsigned int interarrival_jitter_test_vector;
243 unsigned int delay_test_vector;
244 float rtt;/*last round trip delay calculated*/
245 OrtpNetworkSimulatorCtx *net_sim_ctx;
246 bool_t symmetric_rtp;
247 bool_t permissive; /*use the permissive algorithm*/
248 bool_t use_connect; /* use connect() on the socket */
249 bool_t ssrc_set;
250 bool_t reuseaddr; /*setsockopt SO_REUSEADDR */
251 };
252
253
254
255
256 #ifdef __cplusplus
257 extern "C"
258 {
259 #endif
260
261 /* public API */
262 ORTP_PUBLIC RtpSession *rtp_session_new(int mode);
263 ORTP_PUBLIC void rtp_session_set_scheduling_mode(RtpSession *session, int yesno);
264 ORTP_PUBLIC void rtp_session_set_blocking_mode(RtpSession *session, int yesno);
265 ORTP_PUBLIC void rtp_session_set_profile(RtpSession *session, RtpProfile *profile);
266 ORTP_PUBLIC void rtp_session_set_send_profile(RtpSession *session,RtpProfile *profile);
267 ORTP_PUBLIC void rtp_session_set_recv_profile(RtpSession *session,RtpProfile *profile);
268 ORTP_PUBLIC RtpProfile *rtp_session_get_profile(RtpSession *session);
269 ORTP_PUBLIC RtpProfile *rtp_session_get_send_profile(RtpSession *session);
270 ORTP_PUBLIC RtpProfile *rtp_session_get_recv_profile(RtpSession *session);
271 ORTP_PUBLIC int rtp_session_signal_connect(RtpSession *session,const char *signal_name, RtpCallback cb, unsigned long user_data);
272 ORTP_PUBLIC int rtp_session_signal_disconnect_by_callback(RtpSession *session,const char *signal_name, RtpCallback cb);
273 ORTP_PUBLIC void rtp_session_set_ssrc(RtpSession *session, uint32_t ssrc);
274 ORTP_PUBLIC uint32_t rtp_session_get_send_ssrc(RtpSession* session);
275 ORTP_PUBLIC uint32_t rtp_session_get_recv_ssrc(RtpSession *session);
276 ORTP_PUBLIC void rtp_session_set_seq_number(RtpSession *session, uint16_t seq);
277 ORTP_PUBLIC uint16_t rtp_session_get_seq_number(RtpSession *session);
278 ORTP_PUBLIC uint32_t rtp_session_get_rcv_ext_seq_number(RtpSession *session);
279
280 ORTP_PUBLIC void rtp_session_enable_jitter_buffer(RtpSession *session , bool_t enabled);
281 ORTP_PUBLIC bool_t rtp_session_jitter_buffer_enabled(const RtpSession *session);
282 ORTP_PUBLIC void rtp_session_set_jitter_buffer_params(RtpSession *session, const JBParameters *par);
283 ORTP_PUBLIC void rtp_session_get_jitter_buffer_params(RtpSession *session, JBParameters *par);
284
285 /*deprecated jitter control functions*/
286 ORTP_PUBLIC void rtp_session_set_jitter_compensation(RtpSession *session, int milisec);
287 ORTP_PUBLIC void rtp_session_enable_adaptive_jitter_compensation(RtpSession *session, bool_t val);
288 ORTP_PUBLIC bool_t rtp_session_adaptive_jitter_compensation_enabled(RtpSession *session);
289
290 ORTP_PUBLIC void rtp_session_set_time_jump_limit(RtpSession *session, int miliseconds);
291 ORTP_PUBLIC int rtp_session_set_local_addr(RtpSession *session,const char *addr, int rtp_port, int rtcp_port);
292 ORTP_PUBLIC int rtp_session_get_local_port(const RtpSession *session);
293
294 ORTP_PUBLIC int
295 rtp_session_set_remote_addr_full (RtpSession * session, const char * rtp_addr, int rtp_port, const char * rtcp_addr, int rtcp_port);
296 /*same as previous function, old name:*/
297 ORTP_PUBLIC int rtp_session_set_remote_addr_and_port (RtpSession * session, const char * addr, int rtp_port, int rtcp_port);
298 ORTP_PUBLIC int rtp_session_set_remote_addr(RtpSession *session,const char *addr, int port);
299 /* alternatively to the set_remote_addr() and set_local_addr(), an application can give
300 a valid socket (potentially connect()ed )to be used by the RtpSession */
301 ORTP_PUBLIC void rtp_session_set_sockets(RtpSession *session, int rtpfd, int rtcpfd);
302 ORTP_PUBLIC void rtp_session_set_transports(RtpSession *session, RtpTransport *rtptr, RtpTransport *rtcptr);
303
304 /*those methods are provided for people who wants to send non-RTP messages using the RTP/RTCP sockets */
305 ORTP_PUBLIC ortp_socket_t rtp_session_get_rtp_socket(const RtpSession *session);
306 ORTP_PUBLIC ortp_socket_t rtp_session_get_rtcp_socket(const RtpSession *session);
307
308
309 /* QOS / DSCP */
310 ORTP_PUBLIC int rtp_session_set_dscp(RtpSession *session, int dscp);
311 ORTP_PUBLIC int rtp_session_get_dscp(const RtpSession *session);
312
313
314 /* Packet info */
315 ORTP_PUBLIC int rtp_session_set_pktinfo(RtpSession *session, int activate);
316
317 /* Multicast methods */
318 ORTP_PUBLIC int rtp_session_set_multicast_ttl(RtpSession *session, int ttl);
319 ORTP_PUBLIC int rtp_session_get_multicast_ttl(RtpSession *session);
320
321 ORTP_PUBLIC int rtp_session_set_multicast_loopback(RtpSession *session, int yesno);
322 ORTP_PUBLIC int rtp_session_get_multicast_loopback(RtpSession *session);
323
324
325
326 ORTP_PUBLIC int rtp_session_set_send_payload_type(RtpSession *session, int paytype);
327 ORTP_PUBLIC int rtp_session_get_send_payload_type(const RtpSession *session);
328
329 ORTP_PUBLIC int rtp_session_get_recv_payload_type(const RtpSession *session);
330 ORTP_PUBLIC int rtp_session_set_recv_payload_type(RtpSession *session, int pt);
331
332 ORTP_PUBLIC int rtp_session_set_payload_type(RtpSession *session, int pt);
333
334 ORTP_PUBLIC void rtp_session_set_symmetric_rtp (RtpSession * session, bool_t yesno);
335
336 ORTP_PUBLIC void rtp_session_set_connected_mode(RtpSession *session, bool_t yesno);
337
338 ORTP_PUBLIC void rtp_session_enable_rtcp(RtpSession *session, bool_t yesno);
339
340 ORTP_PUBLIC void rtp_session_set_rtcp_report_interval(RtpSession *session, int value_ms);
341
342 ORTP_PUBLIC void rtp_session_set_ssrc_changed_threshold(RtpSession *session, int numpackets);
343
344 /*low level recv and send functions */
345 ORTP_PUBLIC mblk_t * rtp_session_recvm_with_ts (RtpSession * session, uint32_t user_ts);
346 ORTP_PUBLIC mblk_t * rtp_session_create_packet(RtpSession *session,int header_size, const uint8_t *payload, int payload_size);
347 ORTP_PUBLIC mblk_t * rtp_session_create_packet_with_data(RtpSession *session, uint8_t *payload, int payload_size, void (*freefn)(void*));
348 ORTP_PUBLIC mblk_t * rtp_session_create_packet_in_place(RtpSession *session,uint8_t *buffer, int size, void (*freefn)(void*) );
349 ORTP_PUBLIC int rtp_session_sendm_with_ts (RtpSession * session, mblk_t *mp, uint32_t userts);
350 /* high level recv and send functions */
351 ORTP_PUBLIC int rtp_session_recv_with_ts(RtpSession *session, uint8_t *buffer, int len, uint32_t ts, int *have_more);
352 ORTP_PUBLIC int rtp_session_send_with_ts(RtpSession *session, const uint8_t *buffer, int len, uint32_t userts);
353
354 /* event API*/
355 ORTP_PUBLIC void rtp_session_register_event_queue(RtpSession *session, OrtpEvQueue *q);
356 ORTP_PUBLIC void rtp_session_unregister_event_queue(RtpSession *session, OrtpEvQueue *q);
357
358
359 /* IP bandwidth usage estimation functions, returning bits/s*/
360 ORTP_PUBLIC float rtp_session_compute_send_bandwidth(RtpSession *session);
361 ORTP_PUBLIC float rtp_session_compute_recv_bandwidth(RtpSession *session);
362
363 ORTP_PUBLIC void rtp_session_send_rtcp_APP(RtpSession *session, uint8_t subtype, const char *name, const uint8_t *data, int datalen);
364
365 ORTP_PUBLIC uint32_t rtp_session_get_current_send_ts(RtpSession *session);
366 ORTP_PUBLIC uint32_t rtp_session_get_current_recv_ts(RtpSession *session);
367 ORTP_PUBLIC void rtp_session_flush_sockets(RtpSession *session);
368 ORTP_PUBLIC void rtp_session_release_sockets(RtpSession *session);
369 ORTP_PUBLIC void rtp_session_resync(RtpSession *session);
370 ORTP_PUBLIC void rtp_session_reset(RtpSession *session);
371 ORTP_PUBLIC void rtp_session_destroy(RtpSession *session);
372
373 ORTP_PUBLIC const rtp_stats_t * rtp_session_get_stats(const RtpSession *session);
374 ORTP_PUBLIC const jitter_stats_t * rtp_session_get_jitter_stats( const RtpSession *session );
375 ORTP_PUBLIC void rtp_session_reset_stats(RtpSession *session);
376
377 ORTP_PUBLIC void rtp_session_set_data(RtpSession *session, void *data);
378 ORTP_PUBLIC void *rtp_session_get_data(const RtpSession *session);
379
380 ORTP_PUBLIC void rtp_session_set_recv_buf_size(RtpSession *session, int bufsize);
381 ORTP_PUBLIC void rtp_session_set_rtp_socket_send_buffer_size(RtpSession * session, unsigned int size);
382 ORTP_PUBLIC void rtp_session_set_rtp_socket_recv_buffer_size(RtpSession * session, unsigned int size);
383
384 /* in use with the scheduler to convert a timestamp in scheduler time unit (ms) */
385 ORTP_PUBLIC uint32_t rtp_session_ts_to_time(RtpSession *session,uint32_t timestamp);
386 ORTP_PUBLIC uint32_t rtp_session_time_to_ts(RtpSession *session, int millisecs);
387 /* this function aims at simulating senders with "imprecise" clocks, resulting in
388 rtp packets sent with timestamp uncorrelated with the system clock .
389 This is only availlable to sessions working with the oRTP scheduler */
390 ORTP_PUBLIC void rtp_session_make_time_distorsion(RtpSession *session, int milisec);
391
392 /*RTCP functions */
393 ORTP_PUBLIC void rtp_session_set_source_description(RtpSession *session, const char *cname,
394 const char *name, const char *email, const char *phone,
395 const char *loc, const char *tool, const char *note);
396 ORTP_PUBLIC void rtp_session_add_contributing_source(RtpSession *session, uint32_t csrc,
397 const char *cname, const char *name, const char *email, const char *phone,
398 const char *loc, const char *tool, const char *note);
399 ORTP_PUBLIC void rtp_session_remove_contributing_sources(RtpSession *session, uint32_t csrc);
400 ORTP_PUBLIC mblk_t* rtp_session_create_rtcp_sdes_packet(RtpSession *session);
401
402 ORTP_PUBLIC void rtp_session_get_last_recv_time(RtpSession *session, struct timeval *tv);
403 ORTP_PUBLIC int rtp_session_bye(RtpSession *session, const char *reason);
404
405 ORTP_PUBLIC int rtp_session_get_last_send_error_code(RtpSession *session);
406 ORTP_PUBLIC void rtp_session_clear_send_error_code(RtpSession *session);
407 ORTP_PUBLIC int rtp_session_get_last_recv_error_code(RtpSession *session);
408 ORTP_PUBLIC void rtp_session_clear_recv_error_code(RtpSession *session);
409
410
411 ORTP_PUBLIC float rtp_session_get_round_trip_propagation(RtpSession *session);
412
413
414 ORTP_PUBLIC void rtp_session_enable_network_simulation(RtpSession *session, const OrtpNetworkSimulatorParams *params);
415 ORTP_PUBLIC void rtp_session_rtcp_set_lost_packet_value( RtpSession *session, const unsigned int value );
416 ORTP_PUBLIC void rtp_session_rtcp_set_jitter_value(RtpSession *session, const unsigned int value );
417 ORTP_PUBLIC void rtp_session_rtcp_set_delay_value(RtpSession *session, const unsigned int value );
418 ORTP_PUBLIC mblk_t * rtp_session_pick_with_cseq (RtpSession * session, const uint16_t sequence_number);
419 /*private */
420 ORTP_PUBLIC void rtp_session_init(RtpSession *session, int mode);
421 #define rtp_session_set_flag(session,flag) (session)->flags|=(flag)
422 #define rtp_session_unset_flag(session,flag) (session)->flags&=~(flag)
423 ORTP_PUBLIC void rtp_session_uninit(RtpSession *session);
424 ORTP_PUBLIC void rtp_session_dispatch_event(RtpSession *session, OrtpEvent *ev);
425
426 ORTP_PUBLIC void rtp_session_set_reuseaddr(RtpSession *session, bool_t yes);
427
428 #ifdef __cplusplus
429 }
430 #endif
431
432 #endif