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