00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00030 #ifndef RTPSESSION_H
00031 #define RTPSESSION_H
00032
00033
00034 #include <ortp/port.h>
00035 #include <ortp/rtp.h>
00036 #include <ortp/payloadtype.h>
00037 #include <ortp/sessionset.h>
00038 #include <ortp/rtcp.h>
00039 #include <ortp/str_utils.h>
00040 #include <ortp/rtpsignaltable.h>
00041 #include <ortp/event.h>
00042
00043
00044
00045 typedef enum {
00046 RTP_SESSION_RECVONLY,
00047 RTP_SESSION_SENDONLY,
00048 RTP_SESSION_SENDRECV
00049 } RtpSessionMode;
00050
00051
00054 typedef struct _JBParameters{
00055 int min_size;
00056 int nom_size;
00057 int max_size;
00058 bool_t adaptive;
00059 } JBParameters;
00060
00061 typedef struct _JitterControl
00062 {
00063 int jitt_comp;
00064 int jitt_comp_ts;
00065 int adapt_jitt_comp_ts;
00066 float slide;
00067 float jitter;
00068 int count;
00069 int olddiff;
00070 float inter_jitter;
00071 int corrective_step;
00072 int corrective_slide;
00073 bool_t adaptive;
00074 bool_t enabled;
00075 } JitterControl;
00076
00077 typedef struct _WaitPoint
00078 {
00079 ortp_mutex_t lock;
00080 ortp_cond_t cond;
00081 uint32_t time;
00082 bool_t wakeup;
00083 } WaitPoint;
00084
00085 typedef struct _RtpTransport
00086 {
00087 void *data;
00088 ortp_socket_t (*t_getsocket)(struct _RtpTransport *t);
00089 int (*t_sendto)(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen);
00090 int (*t_recvfrom)(struct _RtpTransport *t, mblk_t *msg, int flags, struct sockaddr *from, socklen_t *fromlen);
00091 struct _RtpSession *session;
00092 } RtpTransport;
00093
00094
00095
00096 typedef struct _RtpStream
00097 {
00098 ortp_socket_t socket;
00099 struct _RtpTransport *tr;
00100 int sockfamily;
00101 int max_rq_size;
00102 int time_jump;
00103 uint32_t ts_jump;
00104 queue_t rq;
00105 queue_t tev_rq;
00106 mblk_t *cached_mp;
00107 int loc_port;
00108 #ifdef ORTP_INET6
00109 struct sockaddr_storage rem_addr;
00110 #else
00111 struct sockaddr_in rem_addr;
00112 #endif
00113 int rem_addrlen;
00114 JitterControl jittctl;
00115 uint32_t snd_time_offset;
00116 uint32_t snd_ts_offset;
00117 uint32_t snd_rand_offset;
00118 uint32_t snd_last_ts;
00119 uint32_t rcv_time_offset;
00120 uint32_t rcv_ts_offset;
00121 uint32_t rcv_query_ts_offset;
00122 uint32_t rcv_diff_ts;
00123 uint32_t hwrcv_diff_ts;
00124 uint32_t rcv_last_ts;
00125 uint32_t rcv_last_app_ts;
00126 uint32_t rcv_last_ret_ts;
00127 uint32_t hwrcv_extseq;
00128 uint32_t hwrcv_seq_at_last_SR;
00129 uint32_t hwrcv_since_last_SR;
00130 uint32_t last_rcv_SR_ts;
00131 struct timeval last_rcv_SR_time;
00132 uint16_t snd_seq;
00133 uint32_t last_rtcp_report_snt_r;
00134 uint32_t last_rtcp_report_snt_s;
00135 uint32_t rtcp_report_snt_interval;
00136 uint32_t last_rtcp_packet_count;
00137 unsigned int sent_bytes;
00138 struct timeval send_bw_start;
00139 unsigned int recv_bytes;
00140 struct timeval recv_bw_start;
00141 rtp_stats_t stats;
00142 int recv_errno;
00143 int send_errno;
00144 }RtpStream;
00145
00146 typedef struct _RtcpStream
00147 {
00148 ortp_socket_t socket;
00149 int sockfamily;
00150 struct _RtpTransport *tr;
00151
00152 mblk_t *cached_mp;
00153 #ifdef ORTP_INET6
00154 struct sockaddr_storage rem_addr;
00155 #else
00156 struct sockaddr_in rem_addr;
00157 #endif
00158 int rem_addrlen;
00159 bool_t enabled;
00160 } RtcpStream;
00161
00162 typedef struct _RtpSession RtpSession;
00163
00164
00173 struct _RtpSession
00174 {
00175 RtpSession *next;
00176 int mask_pos;
00177 struct {
00178 RtpProfile *profile;
00179 int pt;
00180 int ssrc;
00181 WaitPoint wp;
00182 int telephone_events_pt;
00183 } snd,rcv;
00184 int hw_recv_pt;
00185 int recv_buf_size;
00186 RtpSignalTable on_ssrc_changed;
00187 RtpSignalTable on_payload_type_changed;
00188 RtpSignalTable on_telephone_event_packet;
00189 RtpSignalTable on_telephone_event;
00190 RtpSignalTable on_timestamp_jump;
00191 RtpSignalTable on_network_error;
00192 RtpSignalTable on_rtcp_bye;
00193 struct _OList *signal_tables;
00194 struct _OList *eventqs;
00195 RtpStream rtp;
00196 RtcpStream rtcp;
00197 RtpSessionMode mode;
00198 struct _RtpScheduler *sched;
00199 uint32_t flags;
00200 int dscp;
00201 int multicast_ttl;
00202 int multicast_loopback;
00203 void * user_data;
00204
00205 struct timeval last_recv_time;
00206
00207
00208 mblk_t *current_tev;
00209 mblk_t *sd;
00210 queue_t contributing_sources;
00211 bool_t symmetric_rtp;
00212 bool_t permissive;
00213 bool_t use_connect;
00214 };
00215
00216
00217
00218
00219 #ifdef __cplusplus
00220 extern "C"
00221 {
00222 #endif
00223
00224
00225 RtpSession *rtp_session_new(int mode);
00226 void rtp_session_set_scheduling_mode(RtpSession *session, int yesno);
00227 void rtp_session_set_blocking_mode(RtpSession *session, int yesno);
00228 void rtp_session_set_profile(RtpSession *session, RtpProfile *profile);
00229 void rtp_session_set_send_profile(RtpSession *session,RtpProfile *profile);
00230 void rtp_session_set_recv_profile(RtpSession *session,RtpProfile *profile);
00231 RtpProfile *rtp_session_get_profile(RtpSession *session);
00232 RtpProfile *rtp_session_get_send_profile(RtpSession *session);
00233 RtpProfile *rtp_session_get_recv_profile(RtpSession *session);
00234 int rtp_session_signal_connect(RtpSession *session,const char *signal_name, RtpCallback cb, unsigned long user_data);
00235 int rtp_session_signal_disconnect_by_callback(RtpSession *session,const char *signal_name, RtpCallback cb);
00236 void rtp_session_set_ssrc(RtpSession *session, uint32_t ssrc);
00237 void rtp_session_set_seq_number(RtpSession *session, uint16_t seq);
00238 uint16_t rtp_session_get_seq_number(RtpSession *session);
00239
00240 void rtp_session_enable_jitter_buffer(RtpSession *session , bool_t enabled);
00241 bool_t rtp_session_jitter_buffer_enabled(const RtpSession *session);
00242 void rtp_session_set_jitter_buffer_params(RtpSession *session, const JBParameters *par);
00243 void rtp_session_get_jitter_buffer_params(RtpSession *session, JBParameters *par);
00244
00245
00246 void rtp_session_set_jitter_compensation(RtpSession *session, int milisec);
00247 void rtp_session_enable_adaptive_jitter_compensation(RtpSession *session, bool_t val);
00248 bool_t rtp_session_adaptive_jitter_compensation_enabled(RtpSession *session);
00249
00250 void rtp_session_set_time_jump_limit(RtpSession *session, int miliseconds);
00251 int rtp_session_set_local_addr(RtpSession *session,const char *addr, int port);
00252 int rtp_session_get_local_port(const RtpSession *session);
00253 int rtp_session_set_remote_addr(RtpSession *session,const char *addr, int port);
00254
00255
00256 void rtp_session_set_sockets(RtpSession *session, int rtpfd, int rtcpfd);
00257 void rtp_session_set_transports(RtpSession *session, RtpTransport *rtptr, RtpTransport *rtcptr);
00258
00259
00260 ortp_socket_t rtp_session_get_rtp_socket(const RtpSession *session);
00261 ortp_socket_t rtp_session_get_rtcp_socket(const RtpSession *session);
00262
00263
00264
00265 int rtp_session_set_dscp(RtpSession *session, int dscp);
00266 int rtp_session_get_dscp(const RtpSession *session);
00267
00268
00269
00270 int rtp_session_set_multicast_ttl(RtpSession *session, int ttl);
00271 int rtp_session_get_multicast_ttl(RtpSession *session);
00272
00273 int rtp_session_set_multicast_loopback(RtpSession *session, int yesno);
00274 int rtp_session_get_multicast_loopback(RtpSession *session);
00275
00276
00277
00278 int rtp_session_set_send_payload_type(RtpSession *session, int paytype);
00279 int rtp_session_get_send_payload_type(const RtpSession *session);
00280
00281 int rtp_session_get_recv_payload_type(const RtpSession *session);
00282 int rtp_session_set_recv_payload_type(RtpSession *session, int pt);
00283
00284 int rtp_session_set_payload_type(RtpSession *session, int pt);
00285
00286 void rtp_session_set_symmetric_rtp (RtpSession * session, bool_t yesno);
00287
00288 void rtp_session_set_connected_mode(RtpSession *session, bool_t yesno);
00289
00290 void rtp_session_enable_rtcp(RtpSession *session, bool_t yesno);
00291
00292
00293 mblk_t * rtp_session_recvm_with_ts (RtpSession * session, uint32_t user_ts);
00294 mblk_t * rtp_session_create_packet(RtpSession *session,int header_size, const uint8_t *payload, int payload_size);
00295 mblk_t * rtp_session_create_packet_with_data(RtpSession *session, uint8_t *payload, int payload_size, void (*freefn)(void*));
00296 mblk_t * rtp_session_create_packet_in_place(RtpSession *session,uint8_t *buffer, int size, void (*freefn)(void*) );
00297 int rtp_session_sendm_with_ts (RtpSession * session, mblk_t *mp, uint32_t userts);
00298
00299 int rtp_session_recv_with_ts(RtpSession *session, uint8_t *buffer, int len, uint32_t ts, int *have_more);
00300 int rtp_session_send_with_ts(RtpSession *session, const uint8_t *buffer, int len, uint32_t userts);
00301
00302
00303 void rtp_session_register_event_queue(RtpSession *session, OrtpEvQueue *q);
00304 void rtp_session_unregister_event_queue(RtpSession *session, OrtpEvQueue *q);
00305
00306
00307
00308 float rtp_session_compute_send_bandwidth(RtpSession *session);
00309 float rtp_session_compute_recv_bandwidth(RtpSession *session);
00310
00311 void rtp_session_send_rtcp_APP(RtpSession *session, uint8_t subtype, const char *name, const uint8_t *data, int datalen);
00312
00313 uint32_t rtp_session_get_current_send_ts(RtpSession *session);
00314 uint32_t rtp_session_get_current_recv_ts(RtpSession *session);
00315 void rtp_session_flush_sockets(RtpSession *session);
00316 void rtp_session_release_sockets(RtpSession *session);
00317 void rtp_session_resync(RtpSession *session);
00318 void rtp_session_reset(RtpSession *session);
00319 void rtp_session_destroy(RtpSession *session);
00320
00321 const rtp_stats_t * rtp_session_get_stats(const RtpSession *session);
00322 void rtp_session_reset_stats(RtpSession *session);
00323
00324 void rtp_session_set_data(RtpSession *session, void *data);
00325 void *rtp_session_get_data(const RtpSession *session);
00326
00327 void rtp_session_set_recv_buf_size(RtpSession *session, int bufsize);
00328
00329
00330 uint32_t rtp_session_ts_to_time(RtpSession *session,uint32_t timestamp);
00331 uint32_t rtp_session_time_to_ts(RtpSession *session, int millisecs);
00332
00333
00334
00335 void rtp_session_make_time_distorsion(RtpSession *session, int milisec);
00336
00337
00338 void rtp_session_set_source_description(RtpSession *session, const char *cname,
00339 const char *name, const char *email, const char *phone,
00340 const char *loc, const char *tool, const char *note);
00341 void rtp_session_add_contributing_source(RtpSession *session, uint32_t csrc,
00342 const char *cname, const char *name, const char *email, const char *phone,
00343 const char *loc, const char *tool, const char *note);
00344 void rtp_session_remove_contributing_sources(RtpSession *session, uint32_t csrc);
00345 mblk_t* rtp_session_create_rtcp_sdes_packet(RtpSession *session);
00346
00347 void rtp_session_get_last_recv_time(RtpSession *session, struct timeval *tv);
00348 int rtp_session_bye(RtpSession *session, const char *reason);
00349
00350 int rtp_session_get_last_send_error_code(RtpSession *session);
00351 void rtp_session_clear_send_error_code(RtpSession *session);
00352 int rtp_session_get_last_recv_error_code(RtpSession *session);
00353 void rtp_session_clear_recv_error_code(RtpSession *session);
00354
00355
00356 void rtp_session_init(RtpSession *session, int mode);
00357 #define rtp_session_set_flag(session,flag) (session)->flags|=(flag)
00358 #define rtp_session_unset_flag(session,flag) (session)->flags&=~(flag)
00359 void rtp_session_uninit(RtpSession *session);
00360
00361 #ifdef __cplusplus
00362 }
00363 #endif
00364
00365 #endif