oRTP  0.23.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/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];
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;
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 _RtpTransportModifier
93 {
94  void *data;
95  struct _RtpSession *session;//<back pointer to the owning session, set by oRTP
96  int (*t_process_on_send)(struct _RtpTransportModifier *t, mblk_t *msg);
97  int (*t_process_on_receive)(struct _RtpTransportModifier *t, mblk_t *msg);
102  void (*t_destroy)(struct _RtpTransportModifier *transport);
104 
105 typedef struct _RtpTransport
106 {
107  void *data;
108  struct _RtpSession *session;//<back pointer to the owning session, set by oRTP
109  ortp_socket_t (*t_getsocket)(struct _RtpTransport *t);
110  int (*t_sendto)(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen);
111  int (*t_recvfrom)(struct _RtpTransport *t, mblk_t *msg, int flags, struct sockaddr *from, socklen_t *fromlen);
112  void (*t_close)(struct _RtpTransport *transport, void *userData);
117  void (*t_destroy)(struct _RtpTransport *transport);
118 } RtpTransport;
119 
120 
122  int enabled;
123  float max_bandwidth; /*IP bandwidth, in bit/s*/
124  int max_buffer_size; /*Max number of bit buffered before being discarded*/
125  float loss_rate; /*Percentage*/
126  uint32_t latency; /*Packet transmission delay, in ms*/
127  float consecutive_loss_probability;/* a probablity of having a subsequent loss after a loss occured, in a 0-1 range.*/
128  float jitter_burst_density; /*density of gap/bursts events. A value of 1 means one gap/burst per second approximately*/
129  float jitter_strength; /*percentage of max_bandwidth */
131 
134  int bit_budget;
135  int qsize;
136  queue_t q;
137  queue_t latency_q;
138  struct timeval last_check;
139  uint64_t last_jitter_event;
140  int consecutive_drops;
141  int drops_to_ignore;
142  int drop_by_congestion;
143  int drop_by_loss;
144  int total_count; /*total number of packets gone through the simulator*/
145  bool_t in_jitter_event;
147 
148 typedef struct OrtpRtcpSendAlgorithm {
149  uint64_t tn; /* Time of the next scheduled RTCP RR transmission in milliseconds. */
150  uint64_t tp; /* Time of the last scheduled RTCP RR transmission in milliseconds. */
151  uint64_t t_rr_last; /* Time of the last regular RTCP packet sent in milliseconds. */
152  uint32_t T_rr; /* Interval for the scheduling of the next regular RTCP packet. */
153  uint32_t T_max_fb_delay; /* Interval within which a feeback message is considered to be useful to the sender. */
154  uint32_t T_rr_interval; /* Minimal interval to be used between regular RTCP packets. */
155  uint32_t T_rr_current_interval;
156  uint32_t Tmin; /* Minimal interval between RTCP packets. */
157  float avg_rtcp_size;
158  mblk_t *fb_packets;
159  bool_t initialized; /* Whether the RTCP send algorithm is fully initialized. */
160  bool_t initial;
161  bool_t allow_early;
163 
164 #define ORTP_RTCP_XR_UNAVAILABLE_PARAMETER 127
165 
166 typedef enum {
167  OrtpRtcpXrNoPlc,
168  OrtpRtcpXrSilencePlc,
169  OrtpRtcpXrEnhancedPlc
170 } OrtpRtcpXrPlcStatus;
171 
172 typedef OrtpRtcpXrPlcStatus (*OrtpRtcpXrPlcCallback)(unsigned long userdata);
173 typedef int (*OrtpRtcpXrSignalLevelCallback)(unsigned long userdata);
174 typedef int (*OrtpRtcpXrNoiseLevelCallback)(unsigned long userdata);
175 typedef float (*OrtpRtcpXrAverageQualityIndicatorCallback)(unsigned long userdata);
176 
177 typedef struct OrtpRtcpXrMediaCallbacks {
178  OrtpRtcpXrPlcCallback plc;
179  OrtpRtcpXrSignalLevelCallback signal_level;
180  OrtpRtcpXrNoiseLevelCallback noise_level;
181  OrtpRtcpXrAverageQualityIndicatorCallback average_qi;
182  OrtpRtcpXrAverageQualityIndicatorCallback average_lq_qi;
183  unsigned long userdata;
185 
186 typedef enum {
187  OrtpRtcpXrRcvrRttNone,
188  OrtpRtcpXrRcvrRttAll,
189  OrtpRtcpXrRcvrRttSender
190 } OrtpRtcpXrRcvrRttMode;
191 
192 typedef enum {
193  OrtpRtcpXrStatSummaryLoss = (1 << 7),
194  OrtpRtcpXrStatSummaryDup = (1 << 6),
195  OrtpRtcpXrStatSummaryJitt = (1 << 5),
196  OrtpRtcpXrStatSummaryTTL = (1 << 3),
197  OrtpRtcpXrStatSummaryHL = (1 << 4)
198 } OrtpRtcpXrStatSummaryFlag;
199 
200 typedef struct OrtpRtcpXrConfiguration {
201  bool_t enabled;
202  bool_t stat_summary_enabled;
203  bool_t voip_metrics_enabled;
204  OrtpRtcpXrRcvrRttMode rcvr_rtt_mode;
205  int rcvr_rtt_max_size;
206  OrtpRtcpXrStatSummaryFlag stat_summary_flags;
208 
209 typedef struct OrtpRtcpXrStats {
210  uint32_t last_rcvr_rtt_ts; /* NTP timestamp (middle 32 bits) of last received XR rcvr-rtt */
211  struct timeval last_rcvr_rtt_time; /* Time at which last XR rcvr-rtt was received */
212  uint16_t rcv_seq_at_last_stat_summary; /* Received sequence number at last XR stat-summary sent */
213  uint32_t rcv_since_last_stat_summary; /* The number of packets received since last XR stat-summary was sent */
214  uint32_t dup_since_last_stat_summary; /* The number of duplicate packets received since last XR stat-summary was sent */
215  uint32_t min_jitter_since_last_stat_summary; /* The minimum value of jitter since last XR stat-summary was sent */
216  uint32_t max_jitter_since_last_stat_summary; /* The maximum value of jitter since last XR stat-summary was sent */
217  double olds_jitter_since_last_stat_summary;
218  double oldm_jitter_since_last_stat_summary;
219  double news_jitter_since_last_stat_summary;
220  double newm_jitter_since_last_stat_summary;
221  int64_t last_jitter_diff_since_last_stat_summary;
222  double olds_ttl_or_hl_since_last_stat_summary;
223  double oldm_ttl_or_hl_since_last_stat_summary;
224  double news_ttl_or_hl_since_last_stat_summary;
225  double newm_ttl_or_hl_since_last_stat_summary;
226  uint8_t min_ttl_or_hl_since_last_stat_summary; /* The minimum value of TTL/HL since last XR stat-summary was sent */
227  uint8_t max_ttl_or_hl_since_last_stat_summary; /* The maximum value of TTL/HL since last XR stat-summary was sent */
228  uint32_t first_rcv_seq;
229  uint32_t last_rcv_seq;
230  uint32_t rcv_count;
231  uint32_t discarded_count;
233 
234 typedef struct _OrtpAddress{
235  struct sockaddr_storage addr;
236  socklen_t len;
237 }OrtpAddress;
238 
239 typedef struct _OrtpStream {
240  ortp_socket_t socket;
241  int sockfamily;
242  int loc_port;
243  socklen_t rem_addrlen;
244  struct sockaddr_storage rem_addr;
245  struct _RtpTransport *tr;
246  mblk_t *cached_mp;
247  struct timeval send_bw_start; /* used for bandwidth estimation */
248  struct timeval recv_bw_start; /* used for bandwidth estimation */
249  unsigned int sent_bytes; /* used for bandwidth estimation */
250  unsigned int recv_bytes; /* used for bandwidth estimation */
251  float upload_bw;
252  float download_bw;
253  OList *aux_destinations; /*list of OrtpAddress */
254 } OrtpStream;
255 
256 typedef struct _RtpStream
257 {
258  OrtpStream gs;
259  int max_rq_size;
260  int time_jump;
261  uint32_t ts_jump;
262  queue_t rq;
263  queue_t tev_rq;
264  void *QoSHandle;
265  unsigned long QoSFlowID;
266  JitterControl jittctl;
267  uint32_t snd_time_offset;/*the scheduler time when the application send its first timestamp*/
268  uint32_t snd_ts_offset; /* the first application timestamp sent by the application */
269  uint32_t snd_rand_offset; /* a random number added to the user offset to make the stream timestamp*/
270  uint32_t snd_last_ts; /* the last stream timestamp sended */
271  uint32_t rcv_time_offset; /*the scheduler time when the application ask for its first timestamp*/
272  uint32_t rcv_ts_offset; /* the first stream timestamp */
273  uint32_t rcv_query_ts_offset; /* the first user timestamp asked by the application */
274  uint32_t rcv_last_ts; /* the last stream timestamp got by the application */
275  uint16_t rcv_last_seq; /* the last stream sequence number got by the application*/
276  uint16_t pad;
277  uint32_t rcv_last_app_ts; /* the last application timestamp asked by the application */
278  uint32_t rcv_last_ret_ts; /* the timestamp of the last sample returned (only for continuous audio)*/
279  uint32_t hwrcv_extseq; /* last received on socket extended sequence number */
280  uint32_t hwrcv_seq_at_last_SR;
281  uint32_t hwrcv_since_last_SR;
282  uint32_t last_rcv_SR_ts; /* NTP timestamp (middle 32 bits) of last received SR */
283  struct timeval last_rcv_SR_time; /* time at which last SR was received */
284  uint16_t snd_seq; /* send sequence number */
285  uint32_t last_rtcp_packet_count; /*the sender's octet count in the last sent RTCP SR*/
286  uint32_t sent_payload_bytes; /*used for RTCP sender reports*/
287  rtp_stats_t stats;
288  int recv_errno;
289  int send_errno;
290  int snd_socket_size;
291  int rcv_socket_size;
292  int ssrc_changed_thres;
294 }RtpStream;
295 
296 typedef struct _RtcpStream
297 {
298  OrtpStream gs;
299  OrtpRtcpSendAlgorithm send_algo;
300  OrtpRtcpXrConfiguration xr_conf;
301  OrtpRtcpXrMediaCallbacks xr_media_callbacks;
302  bool_t enabled; /*tells whether we can send RTCP packets */
303  bool_t rtcp_xr_dlrr_to_send;
304  uint8_t rtcp_fb_fir_seq_nr; /* The FIR command sequence number */
305  uint32_t last_rtcp_fb_pli_snt;
306 } RtcpStream;
307 
308 typedef struct _RtpSession RtpSession;
309 
310 
320 {
321  RtpSession *next; /* next RtpSession, when the session are enqueued by the scheduler */
322  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*/
323  struct {
324  RtpProfile *profile;
325  int pt;
326  unsigned int ssrc;
327  WaitPoint wp;
328  int telephone_events_pt; /* the payload type used for telephony events */
329  } snd,rcv;
330  unsigned int inc_ssrc_candidate;
331  int inc_same_ssrc_count;
332  int hw_recv_pt; /* recv payload type before jitter buffer */
333  int recv_buf_size;
334  int target_upload_bandwidth; /* Target upload bandwidth at nework layer (with IP and UDP headers) in bits/s */
335  RtpSignalTable on_ssrc_changed;
336  RtpSignalTable on_payload_type_changed;
337  RtpSignalTable on_telephone_event_packet;
338  RtpSignalTable on_telephone_event;
339  RtpSignalTable on_timestamp_jump;
340  RtpSignalTable on_network_error;
341  RtpSignalTable on_rtcp_bye;
342  struct _OList *signal_tables;
343  struct _OList *eventqs;
344  msgb_allocator_t allocator;
345  RtpStream rtp;
346  RtcpStream rtcp;
347  OrtpRtcpXrStats rtcp_xr_stats;
348  RtpSessionMode mode;
349  struct _RtpScheduler *sched;
350  uint32_t flags;
351  int dscp;
352  int multicast_ttl;
353  int multicast_loopback;
354  float duplication_ratio; /* Number of times a packet should be duplicated */
355  float duplication_left ; /* Remainder of the duplication ratio */
356  void * user_data;
357  /* FIXME: Should be a table for all session participants. */
358  struct timeval last_recv_time; /* Time of receiving the RTP/RTCP packet. */
359  mblk_t *pending;
360  /* telephony events extension */
361  mblk_t *current_tev; /* the pending telephony events */
362  mblk_t *minimal_sdes;
363  mblk_t *full_sdes;
364  queue_t contributing_sources;
365  int64_t lost_packets_test_vector;
366  unsigned int interarrival_jitter_test_vector;
367  unsigned int delay_test_vector;
368  float rtt;/*last round trip delay calculated*/
369  int cum_loss;
370  OrtpNetworkSimulatorCtx *net_sim_ctx;
371  bool_t symmetric_rtp;
372  bool_t permissive; /*use the permissive algorithm*/
373  bool_t use_connect; /* use connect() on the socket */
374  bool_t ssrc_set;
375  bool_t reuseaddr; /*setsockopt SO_REUSEADDR */
376 };
377 
378 
379 
380 
381 #ifdef __cplusplus
382 extern "C"
383 {
384 #endif
385 
386 /* public API */
387 ORTP_PUBLIC RtpSession *rtp_session_new(int mode);
388 ORTP_PUBLIC void rtp_session_set_scheduling_mode(RtpSession *session, int yesno);
389 ORTP_PUBLIC void rtp_session_set_blocking_mode(RtpSession *session, int yesno);
390 ORTP_PUBLIC void rtp_session_set_profile(RtpSession *session, RtpProfile *profile);
391 ORTP_PUBLIC void rtp_session_set_send_profile(RtpSession *session,RtpProfile *profile);
392 ORTP_PUBLIC void rtp_session_set_recv_profile(RtpSession *session,RtpProfile *profile);
393 ORTP_PUBLIC RtpProfile *rtp_session_get_profile(RtpSession *session);
394 ORTP_PUBLIC RtpProfile *rtp_session_get_send_profile(RtpSession *session);
395 ORTP_PUBLIC RtpProfile *rtp_session_get_recv_profile(RtpSession *session);
396 ORTP_PUBLIC int rtp_session_signal_connect(RtpSession *session,const char *signal_name, RtpCallback cb, void *user_data);
397 ORTP_PUBLIC int rtp_session_signal_disconnect_by_callback(RtpSession *session,const char *signal_name, RtpCallback cb);
398 ORTP_PUBLIC void rtp_session_set_ssrc(RtpSession *session, uint32_t ssrc);
399 ORTP_PUBLIC uint32_t rtp_session_get_send_ssrc(RtpSession* session);
400 ORTP_PUBLIC uint32_t rtp_session_get_recv_ssrc(RtpSession *session);
401 ORTP_PUBLIC void rtp_session_set_seq_number(RtpSession *session, uint16_t seq);
402 ORTP_PUBLIC uint16_t rtp_session_get_seq_number(RtpSession *session);
403 ORTP_PUBLIC uint32_t rtp_session_get_rcv_ext_seq_number(RtpSession *session);
404 ORTP_PUBLIC int rtp_session_get_cum_loss(RtpSession *session);
405 ORTP_PUBLIC void rtp_session_set_duplication_ratio(RtpSession *session, float ratio);
406 
407 ORTP_PUBLIC void rtp_session_enable_jitter_buffer(RtpSession *session , bool_t enabled);
408 ORTP_PUBLIC bool_t rtp_session_jitter_buffer_enabled(const RtpSession *session);
409 ORTP_PUBLIC void rtp_session_set_jitter_buffer_params(RtpSession *session, const JBParameters *par);
410 ORTP_PUBLIC void rtp_session_get_jitter_buffer_params(RtpSession *session, JBParameters *par);
411 
412 /*deprecated jitter control functions*/
413 ORTP_PUBLIC void rtp_session_set_jitter_compensation(RtpSession *session, int milisec);
414 ORTP_PUBLIC void rtp_session_enable_adaptive_jitter_compensation(RtpSession *session, bool_t val);
415 ORTP_PUBLIC bool_t rtp_session_adaptive_jitter_compensation_enabled(RtpSession *session);
416 
417 ORTP_PUBLIC void rtp_session_set_time_jump_limit(RtpSession *session, int miliseconds);
418 ORTP_PUBLIC int rtp_session_set_local_addr(RtpSession *session,const char *addr, int rtp_port, int rtcp_port);
419 ORTP_PUBLIC int rtp_session_get_local_port(const RtpSession *session);
420 ORTP_PUBLIC int rtp_session_get_local_rtcp_port(const RtpSession *session);
421 
422 ORTP_PUBLIC int
423 rtp_session_set_remote_addr_full (RtpSession * session, const char * rtp_addr, int rtp_port, const char * rtcp_addr, int rtcp_port);
424 /*same as previous function, old name:*/
425 ORTP_PUBLIC int rtp_session_set_remote_addr_and_port (RtpSession * session, const char * addr, int rtp_port, int rtcp_port);
426 ORTP_PUBLIC int rtp_session_set_remote_addr(RtpSession *session,const char *addr, int port);
427 ORTP_PUBLIC int rtp_session_add_aux_remote_addr_full(RtpSession * session, const char * rtp_addr, int rtp_port, const char * rtcp_addr, int rtcp_port);
428 ORTP_PUBLIC void rtp_session_clear_aux_remote_addr(RtpSession * session);
429 /* alternatively to the set_remote_addr() and set_local_addr(), an application can give
430 a valid socket (potentially connect()ed )to be used by the RtpSession */
431 ORTP_PUBLIC void rtp_session_set_sockets(RtpSession *session, int rtpfd, int rtcpfd);
432 ORTP_PUBLIC void rtp_session_set_transports(RtpSession *session, RtpTransport *rtptr, RtpTransport *rtcptr);
433 ORTP_PUBLIC void rtp_session_get_transports(RtpSession *session, RtpTransport **rtptr, RtpTransport **rtcptr);
434 /*those methods are provided for people who wants to send non-RTP messages using the RTP/RTCP sockets */
435 ORTP_PUBLIC ortp_socket_t rtp_session_get_rtp_socket(const RtpSession *session);
436 ORTP_PUBLIC ortp_socket_t rtp_session_get_rtcp_socket(const RtpSession *session);
437 
438 
439 /* QOS / DSCP */
440 ORTP_PUBLIC int rtp_session_set_dscp(RtpSession *session, int dscp);
441 ORTP_PUBLIC int rtp_session_get_dscp(const RtpSession *session);
442 
443 
444 /* Packet info */
445 ORTP_PUBLIC int rtp_session_set_pktinfo(RtpSession *session, int activate);
446 
447 /* Multicast methods */
448 ORTP_PUBLIC int rtp_session_set_multicast_ttl(RtpSession *session, int ttl);
449 ORTP_PUBLIC int rtp_session_get_multicast_ttl(RtpSession *session);
450 
451 ORTP_PUBLIC int rtp_session_set_multicast_loopback(RtpSession *session, int yesno);
452 ORTP_PUBLIC int rtp_session_get_multicast_loopback(RtpSession *session);
453 
454 
455 
456 ORTP_PUBLIC int rtp_session_set_send_payload_type(RtpSession *session, int paytype);
457 ORTP_PUBLIC int rtp_session_get_send_payload_type(const RtpSession *session);
458 
459 ORTP_PUBLIC int rtp_session_get_recv_payload_type(const RtpSession *session);
460 ORTP_PUBLIC int rtp_session_set_recv_payload_type(RtpSession *session, int pt);
461 
462 ORTP_PUBLIC int rtp_session_set_payload_type(RtpSession *session, int pt);
463 
464 ORTP_PUBLIC void rtp_session_set_symmetric_rtp (RtpSession * session, bool_t yesno);
465 
466 ORTP_PUBLIC void rtp_session_set_connected_mode(RtpSession *session, bool_t yesno);
467 
468 ORTP_PUBLIC void rtp_session_enable_rtcp(RtpSession *session, bool_t yesno);
469 
470 ORTP_PUBLIC void rtp_session_set_rtcp_report_interval(RtpSession *session, int value_ms);
471 
472 ORTP_PUBLIC void rtp_session_set_target_upload_bandwidth(RtpSession *session, int target_bandwidth);
473 
474 ORTP_PUBLIC void rtp_session_configure_rtcp_xr(RtpSession *session, const OrtpRtcpXrConfiguration *config);
475 ORTP_PUBLIC void rtp_session_set_rtcp_xr_media_callbacks(RtpSession *session, const OrtpRtcpXrMediaCallbacks *cbs);
476 
477 ORTP_PUBLIC void rtp_session_set_ssrc_changed_threshold(RtpSession *session, int numpackets);
478 
479 /*low level recv and send functions */
480 ORTP_PUBLIC mblk_t * rtp_session_recvm_with_ts (RtpSession * session, uint32_t user_ts);
481 ORTP_PUBLIC mblk_t * rtp_session_create_packet(RtpSession *session,int header_size, const uint8_t *payload, int payload_size);
482 ORTP_PUBLIC mblk_t * rtp_session_create_packet_raw(const uint8_t *packet, int packet_size);
483 ORTP_PUBLIC mblk_t * rtp_session_create_packet_with_data(RtpSession *session, uint8_t *payload, int payload_size, void (*freefn)(void*));
484 ORTP_PUBLIC mblk_t * rtp_session_create_packet_in_place(RtpSession *session,uint8_t *buffer, int size, void (*freefn)(void*) );
485 ORTP_PUBLIC int rtp_session_sendm_with_ts (RtpSession * session, mblk_t *mp, uint32_t userts);
486 /* high level recv and send functions */
487 ORTP_PUBLIC int rtp_session_recv_with_ts(RtpSession *session, uint8_t *buffer, int len, uint32_t ts, int *have_more);
488 ORTP_PUBLIC int rtp_session_send_with_ts(RtpSession *session, const uint8_t *buffer, int len, uint32_t userts);
489 
490 /* event API*/
491 ORTP_PUBLIC void rtp_session_register_event_queue(RtpSession *session, OrtpEvQueue *q);
492 ORTP_PUBLIC void rtp_session_unregister_event_queue(RtpSession *session, OrtpEvQueue *q);
493 
494 
495 /* IP bandwidth usage estimation functions, returning bits/s*/
496 ORTP_PUBLIC float rtp_session_compute_send_bandwidth(RtpSession *session);
497 ORTP_PUBLIC float rtp_session_compute_recv_bandwidth(RtpSession *session);
498 ORTP_PUBLIC float rtp_session_get_send_bandwidth(RtpSession *session);
499 ORTP_PUBLIC float rtp_session_get_recv_bandwidth(RtpSession *session);
500 ORTP_PUBLIC float rtp_session_get_rtp_send_bandwidth(RtpSession *session);
501 ORTP_PUBLIC float rtp_session_get_rtp_recv_bandwidth(RtpSession *session);
502 ORTP_PUBLIC float rtp_session_get_rtcp_send_bandwidth(RtpSession *session);
503 ORTP_PUBLIC float rtp_session_get_rtcp_recv_bandwidth(RtpSession *session);
504 
505 ORTP_PUBLIC void rtp_session_send_rtcp_APP(RtpSession *session, uint8_t subtype, const char *name, const uint8_t *data, int datalen);
506 
507 ORTP_PUBLIC uint32_t rtp_session_get_current_send_ts(RtpSession *session);
508 ORTP_PUBLIC uint32_t rtp_session_get_current_recv_ts(RtpSession *session);
509 ORTP_PUBLIC void rtp_session_flush_sockets(RtpSession *session);
510 ORTP_PUBLIC void rtp_session_release_sockets(RtpSession *session);
511 ORTP_PUBLIC void rtp_session_resync(RtpSession *session);
512 ORTP_PUBLIC void rtp_session_reset(RtpSession *session);
513 ORTP_PUBLIC void rtp_session_destroy(RtpSession *session);
514 
515 ORTP_PUBLIC const rtp_stats_t * rtp_session_get_stats(const RtpSession *session);
516 ORTP_PUBLIC const jitter_stats_t * rtp_session_get_jitter_stats( const RtpSession *session );
517 ORTP_PUBLIC void rtp_session_reset_stats(RtpSession *session);
518 
519 ORTP_PUBLIC void rtp_session_set_data(RtpSession *session, void *data);
520 ORTP_PUBLIC void *rtp_session_get_data(const RtpSession *session);
521 
522 ORTP_PUBLIC void rtp_session_set_recv_buf_size(RtpSession *session, int bufsize);
523 ORTP_PUBLIC void rtp_session_set_rtp_socket_send_buffer_size(RtpSession * session, unsigned int size);
524 ORTP_PUBLIC void rtp_session_set_rtp_socket_recv_buffer_size(RtpSession * session, unsigned int size);
525 
526 /* in use with the scheduler to convert a timestamp in scheduler time unit (ms) */
527 ORTP_PUBLIC uint32_t rtp_session_ts_to_time(RtpSession *session,uint32_t timestamp);
528 ORTP_PUBLIC uint32_t rtp_session_time_to_ts(RtpSession *session, int millisecs);
529 /* this function aims at simulating senders with "imprecise" clocks, resulting in
530 rtp packets sent with timestamp uncorrelated with the system clock .
531 This is only availlable to sessions working with the oRTP scheduler */
532 ORTP_PUBLIC void rtp_session_make_time_distorsion(RtpSession *session, int milisec);
533 
534 /*RTCP functions */
535 ORTP_PUBLIC void rtp_session_set_source_description(RtpSession *session, const char *cname,
536  const char *name, const char *email, const char *phone,
537  const char *loc, const char *tool, const char *note);
538 ORTP_PUBLIC void rtp_session_add_contributing_source(RtpSession *session, uint32_t csrc,
539  const char *cname, const char *name, const char *email, const char *phone,
540  const char *loc, const char *tool, const char *note);
541 /* DEPRECATED: Use rtp_session_remove_contributing_source instead of rtp_session_remove_contributing_sources */
542 #define rtp_session_remove_contributing_sources rtp_session_remove_contributing_source
543 ORTP_PUBLIC void rtp_session_remove_contributing_source(RtpSession *session, uint32_t csrc);
544 ORTP_PUBLIC mblk_t* rtp_session_create_rtcp_sdes_packet(RtpSession *session, bool_t full);
545 
546 ORTP_PUBLIC void rtp_session_get_last_recv_time(RtpSession *session, struct timeval *tv);
547 ORTP_PUBLIC int rtp_session_bye(RtpSession *session, const char *reason);
548 
549 ORTP_PUBLIC int rtp_session_get_last_send_error_code(RtpSession *session);
550 ORTP_PUBLIC void rtp_session_clear_send_error_code(RtpSession *session);
551 ORTP_PUBLIC int rtp_session_get_last_recv_error_code(RtpSession *session);
552 ORTP_PUBLIC void rtp_session_clear_recv_error_code(RtpSession *session);
553 
554 
555 ORTP_PUBLIC float rtp_session_get_round_trip_propagation(RtpSession *session);
556 
557 
558 ORTP_PUBLIC void rtp_session_enable_network_simulation(RtpSession *session, const OrtpNetworkSimulatorParams *params);
559 ORTP_PUBLIC void rtp_session_rtcp_set_lost_packet_value( RtpSession *session, const int64_t value );
560 ORTP_PUBLIC void rtp_session_rtcp_set_jitter_value(RtpSession *session, const unsigned int value );
561 ORTP_PUBLIC void rtp_session_rtcp_set_delay_value(RtpSession *session, const unsigned int value );
562 ORTP_PUBLIC mblk_t * rtp_session_pick_with_cseq (RtpSession * session, const uint16_t sequence_number);
563 
564 
565 ORTP_PUBLIC void rtp_session_send_rtcp_xr_rcvr_rtt(RtpSession *session);
566 ORTP_PUBLIC void rtp_session_send_rtcp_xr_dlrr(RtpSession *session);
567 ORTP_PUBLIC void rtp_session_send_rtcp_xr_stat_summary(RtpSession *session);
568 ORTP_PUBLIC void rtp_session_send_rtcp_xr_voip_metrics(RtpSession *session);
569 
570 
571 ORTP_PUBLIC bool_t rtp_session_avpf_enabled(RtpSession *session);
572 ORTP_PUBLIC bool_t rtp_session_avpf_feature_enabled(RtpSession *session, unsigned char feature);
573 ORTP_PUBLIC uint16_t rtp_session_get_avpf_rr_interval(RtpSession *session);
574 ORTP_PUBLIC void rtp_session_send_rtcp_fb_pli(RtpSession *session);
575 ORTP_PUBLIC void rtp_session_send_rtcp_fb_fir(RtpSession *session);
576 ORTP_PUBLIC void rtp_session_send_rtcp_fb_sli(RtpSession *session, uint16_t first, uint16_t number, uint8_t picture_id);
577 ORTP_PUBLIC void rtp_session_send_rtcp_fb_rpsi(RtpSession *session, uint8_t *bit_string, uint16_t bit_string_len);
578 
579 
580 /*private */
581 ORTP_PUBLIC void rtp_session_init(RtpSession *session, int mode);
582 #define rtp_session_set_flag(session,flag) (session)->flags|=(flag)
583 #define rtp_session_unset_flag(session,flag) (session)->flags&=~(flag)
584 ORTP_PUBLIC void rtp_session_uninit(RtpSession *session);
585 ORTP_PUBLIC void rtp_session_dispatch_event(RtpSession *session, OrtpEvent *ev);
586 
587 ORTP_PUBLIC void rtp_session_set_reuseaddr(RtpSession *session, bool_t yes);
588 
600 ORTP_PUBLIC int meta_rtp_transport_modifier_inject_packet(RtpTransport *t, RtpTransportModifier *tpm, mblk_t *msg , int flags);
601 ORTP_PUBLIC int meta_rtp_transport_new(RtpTransport **t, bool_t is_rtp, RtpTransport *endpoint, unsigned modifiers_count, ...);
602 ORTP_PUBLIC void meta_rtp_transport_destroy(RtpTransport *tp);
603 ORTP_PUBLIC void meta_rtp_transport_append_modifier(RtpTransport *tp,RtpTransportModifier *tpm);
604 #ifdef __cplusplus
605 }
606 #endif
607 
608 #endif
ORTP_PUBLIC int rtp_session_set_payload_type(RtpSession *session, int pt)
Definition: rtpsession.c:737
ORTP_PUBLIC RtpProfile * rtp_session_get_send_profile(RtpSession *session)
Definition: rtpsession.c:470
ORTP_PUBLIC mblk_t * rtp_session_create_packet_with_data(RtpSession *session, uint8_t *payload, int payload_size, void(*freefn)(void *))
Definition: rtpsession.c:818
Definition: rtpsession.h:296
Definition: rtpsession.h:209
Definition: rtpsession.h:200
ORTP_PUBLIC void rtp_session_rtcp_set_delay_value(RtpSession *session, const unsigned int value)
For test purpose only, simulates a constant RTT (Round Trip Time) value by setting the LSR field with...
Definition: rtpsession.c:1640
ORTP_PUBLIC void rtp_session_set_connected_mode(RtpSession *session, bool_t yesno)
Definition: rtpsession.c:1695
ORTP_PUBLIC int rtp_session_get_multicast_ttl(RtpSession *session)
Definition: rtpsession_inet.c:454
ORTP_PUBLIC void rtp_session_rtcp_set_jitter_value(RtpSession *session, const unsigned int value)
For test purpose only, sets a constant interarrival_jitter value within all RTCP output packets...
Definition: rtpsession.c:1614
Definition: rtpsession.h:121
ORTP_PUBLIC mblk_t * rtp_session_create_packet_raw(const uint8_t *packet, int packet_size)
Definition: rtpsession.c:791
ORTP_PUBLIC uint32_t rtp_session_get_rcv_ext_seq_number(RtpSession *session)
Definition: rtpsession.c:610
int max_packets
Definition: rtpsession.h:61
ORTP_PUBLIC int rtp_session_get_dscp(const RtpSession *session)
Definition: rtpsession_inet.c:656
Definition of payload types.
ORTP_PUBLIC int rtp_session_set_remote_addr_full(RtpSession *session, const char *rtp_addr, int rtp_port, const char *rtcp_addr, int rtcp_port)
Definition: rtpsession_inet.c:713
ORTP_PUBLIC uint32_t rtp_session_get_recv_ssrc(RtpSession *session)
Definition: rtpsession.c:650
Definition: rtpsession.h:319
ORTP_PUBLIC void rtp_session_flush_sockets(RtpSession *session)
Definition: rtpsession_inet.c:923
Definition: str_utils.h:49
Definition: rtpsession.h:234
ORTP_PUBLIC RtpProfile * rtp_session_get_recv_profile(RtpSession *session)
Definition: rtpsession.c:480
ORTP_PUBLIC uint16_t rtp_session_get_seq_number(RtpSession *session)
Definition: rtpsession.c:603
ORTP_PUBLIC void rtp_session_set_recv_buf_size(RtpSession *session, int bufsize)
Definition: rtpsession.c:492
ORTP_PUBLIC RtpSession * rtp_session_new(int mode)
Definition: rtpsession.c:305
ORTP_PUBLIC mblk_t * rtp_session_recvm_with_ts(RtpSession *session, uint32_t user_ts)
Definition: rtpsession.c:1071
ORTP_PUBLIC int rtp_session_set_multicast_loopback(RtpSession *session, int yesno)
Definition: rtpsession_inet.c:470
Definition: rtpsession.h:256
ORTP_PUBLIC int rtp_session_set_local_addr(RtpSession *session, const char *addr, int rtp_port, int rtcp_port)
Definition: rtpsession_inet.c:295
ORTP_PUBLIC const jitter_stats_t * rtp_session_get_jitter_stats(const RtpSession *session)
Definition: rtpsession.c:1591
ORTP_PUBLIC int rtp_session_set_multicast_ttl(RtpSession *session, int ttl)
Definition: rtpsession_inet.c:403
Definition: rtpsession.h:84
int min_size
Definition: rtpsession.h:56
ORTP_PUBLIC void rtp_session_destroy(RtpSession *session)
Definition: rtpsession.c:1805
Definition: rtpsession.h:148
Definition: rtpsession.h:177
Definition: rtpsignaltable.h:27
ORTP_PUBLIC void rtp_session_set_blocking_mode(RtpSession *session, int yesno)
Definition: rtpsession.c:367
Definition: str_utils.h:78
ORTP_PUBLIC float rtp_session_get_send_bandwidth(RtpSession *session)
Definition: rtpsession.c:1748
ORTP_PUBLIC int rtp_session_get_local_port(const RtpSession *session)
Definition: rtpsession_inet.c:672
ORTP_PUBLIC void rtp_session_get_last_recv_time(RtpSession *session, struct timeval *tv)
Definition: rtpsession.c:1896
ORTP_PUBLIC int rtp_session_get_cum_loss(RtpSession *session)
Definition: rtpsession.c:617
ORTP_PUBLIC void rtp_session_set_rtp_socket_recv_buffer_size(RtpSession *session, unsigned int size)
Definition: rtpsession.c:508
struct _JBParameters JBParameters
Definition: rtp.h:79
int max_size
Definition: rtpsession.h:58
ORTP_PUBLIC int rtp_session_get_multicast_loopback(RtpSession *session)
Definition: rtpsession_inet.c:526
ORTP_PUBLIC int rtp_session_signal_connect(RtpSession *session, const char *signal_name, RtpCallback cb, void *user_data)
Definition: rtpsession.c:546
ORTP_PUBLIC uint32_t rtp_session_get_send_ssrc(RtpSession *session)
Definition: rtpsession.c:640
ORTP_PUBLIC void rtp_session_set_time_jump_limit(RtpSession *session, int miliseconds)
Definition: rtpsession.c:1362
Definition: event.h:80
Definition: rtpsession.h:132
ORTP_PUBLIC int rtp_session_recv_with_ts(RtpSession *session, uint8_t *buffer, int len, uint32_t ts, int *have_more)
Definition: rtpsession.c:1261
Definition: utils.h:33
ORTP_PUBLIC void rtp_session_set_ssrc_changed_threshold(RtpSession *session, int numpackets)
Definition: rtpsession.c:1521
Definition: rtpsession.h:105
ORTP_PUBLIC mblk_t * rtp_session_pick_with_cseq(RtpSession *session, const uint16_t sequence_number)
Definition: rtpsession.c:1028
ORTP_PUBLIC void rtp_session_set_recv_profile(RtpSession *session, RtpProfile *profile)
Definition: rtpsession.c:446
Definition: rtp.h:63
ORTP_PUBLIC void rtp_session_reset(RtpSession *session)
Definition: rtpsession.c:1555
ORTP_PUBLIC float rtp_session_get_recv_bandwidth(RtpSession *session)
Definition: rtpsession.c:1740
ORTP_PUBLIC int rtp_session_set_pktinfo(RtpSession *session, int activate)
Definition: rtpsession_inet.c:343
ORTP_PUBLIC void rtp_session_set_seq_number(RtpSession *session, uint16_t seq)
Definition: rtpsession.c:591
ORTP_PUBLIC int rtp_session_send_with_ts(RtpSession *session, const uint8_t *buffer, int len, uint32_t userts)
Definition: rtpsession.c:991
Definition: rtpsession.h:239
ORTP_PUBLIC int rtp_session_set_recv_payload_type(RtpSession *session, int pt)
Definition: rtpsession.c:707
ORTP_PUBLIC int rtp_session_add_aux_remote_addr_full(RtpSession *session, const char *rtp_addr, int rtp_port, const char *rtcp_addr, int rtcp_port)
Definition: rtpsession_inet.c:874
ORTP_PUBLIC mblk_t * rtp_session_create_packet_in_place(RtpSession *session, uint8_t *buffer, int size, void(*freefn)(void *))
Definition: rtpsession.c:850
ORTP_PUBLIC void rtp_session_set_send_profile(RtpSession *session, RtpProfile *profile)
Definition: rtpsession.c:428
Definition: rtpsession.h:55
ORTP_PUBLIC void rtp_session_set_source_description(RtpSession *session, const char *cname, const char *name, const char *email, const char *phone, const char *loc, const char *tool, const char *note)
Definition: rtcp.c:128
int nom_size
Definition: rtpsession.h:57
ORTP_PUBLIC int meta_rtp_transport_modifier_inject_packet(RtpTransport *t, RtpTransportModifier *tpm, mblk_t *msg, int flags)
Definition: rtpsession.c:2030
ORTP_PUBLIC void rtp_session_set_data(RtpSession *session, void *data)
Definition: rtpsession.c:1655
Definition: str_utils.h:152
ORTP_PUBLIC void rtp_session_set_symmetric_rtp(RtpSession *session, bool_t yesno)
Definition: rtpsession.c:1677
void(* t_destroy)(struct _RtpTransport *transport)
Definition: rtpsession.h:117
Definition: scheduler.h:28
ORTP_PUBLIC void rtp_session_set_rtp_socket_send_buffer_size(RtpSession *session, unsigned int size)
Definition: rtpsession.c:500
ORTP_PUBLIC void rtp_session_set_profile(RtpSession *session, RtpProfile *profile)
Definition: rtpsession.c:386
ORTP_PUBLIC void rtp_session_enable_rtcp(RtpSession *session, bool_t yesno)
Definition: rtpsession.c:401
ORTP_PUBLIC RtpProfile * rtp_session_get_profile(RtpSession *session)
Definition: rtpsession.c:459
ORTP_PUBLIC const rtp_stats_t * rtp_session_get_stats(const RtpSession *session)
Definition: rtpsession.c:1584
ORTP_PUBLIC uint32_t rtp_session_get_current_recv_ts(RtpSession *session)
Definition: rtpsession.c:1335
ORTP_PUBLIC int rtp_session_set_send_payload_type(RtpSession *session, int paytype)
Definition: rtpsession.c:680
Sending and receiving multiple streams together with only one thread.
ORTP_PUBLIC void rtp_session_release_sockets(RtpSession *session)
Definition: rtpsession.c:1373
ORTP_PUBLIC void rtp_session_rtcp_set_lost_packet_value(RtpSession *session, const int64_t value)
For test purpose only, sets a constant lost packet value within all RTCP output packets. .
Definition: rtpsession.c:1602
ORTP_PUBLIC int rtp_session_signal_disconnect_by_callback(RtpSession *session, const char *signal_name, RtpCallback cb)
Definition: rtpsession.c:570
ORTP_PUBLIC void rtp_session_set_ssrc(RtpSession *session, uint32_t ssrc)
Definition: rtpsession.c:629
ORTP_PUBLIC int rtp_session_get_recv_payload_type(const RtpSession *session)
Definition: rtpsession.c:724
ORTP_PUBLIC float rtp_session_get_round_trip_propagation(RtpSession *session)
Definition: rtpsession.c:1795
Using and creating standart and custom RTP profiles.
ORTP_PUBLIC int rtp_session_get_send_payload_type(const RtpSession *session)
Definition: rtpsession.c:691
Definition: rtpprofile.h:41
ORTP_PUBLIC int rtp_session_set_dscp(RtpSession *session, int dscp)
Definition: rtpsession_inet.c:541
Definition: rtpsession.h:64
Definition: rtpsession.h:92
ORTP_PUBLIC mblk_t * rtp_session_create_packet(RtpSession *session, int header_size, const uint8_t *payload, int payload_size)
Definition: rtpsession.c:769
void(* t_destroy)(struct _RtpTransportModifier *transport)
Definition: rtpsession.h:102
ORTP_PUBLIC int rtp_session_bye(RtpSession *session, const char *reason)
Definition: rtcp.c:616
ORTP_PUBLIC void rtp_session_set_scheduling_mode(RtpSession *session, int yesno)
Definition: rtpsession.c:332
ORTP_PUBLIC void rtp_session_set_jitter_compensation(RtpSession *session, int milisec)
Definition: jitterctl.c:164
ORTP_PUBLIC int rtp_session_set_remote_addr(RtpSession *session, const char *addr, int port)
Definition: rtpsession_inet.c:693
ORTP_PUBLIC int rtp_session_sendm_with_ts(RtpSession *session, mblk_t *mp, uint32_t userts)
Definition: rtpsession.c:971
ORTP_PUBLIC void * rtp_session_get_data(const RtpSession *session)
Definition: rtpsession.c:1663
ORTP_PUBLIC void rtp_session_register_event_queue(RtpSession *session, OrtpEvQueue *q)
Definition: rtpsession.c:1412
ORTP_PUBLIC void rtp_session_resync(RtpSession *session)
Definition: rtpsession.c:1531
ORTP_PUBLIC uint32_t rtp_session_get_current_send_ts(RtpSession *session)
Definition: rtpsession.c:1309
ORTP_PUBLIC void rtp_session_set_rtcp_report_interval(RtpSession *session, int value_ms)
Definition: rtpsession.c:409