diff options
Diffstat (limited to 'src/rexmpp_jingle.h')
-rw-r--r-- | src/rexmpp_jingle.h | 74 |
1 files changed, 51 insertions, 23 deletions
diff --git a/src/rexmpp_jingle.h b/src/rexmpp_jingle.h index cd23efb..189614a 100644 --- a/src/rexmpp_jingle.h +++ b/src/rexmpp_jingle.h @@ -16,15 +16,20 @@ #ifdef ENABLE_CALLS #include <glib.h> #include <agent.h> -#include <gnutls/gnutls.h> #include <srtp2/srtp.h> -#define DTLS_SRTP_BUF_SIZE 0x4000 +#include "portaudio.h" +#ifdef HAVE_OPUS +#include <opus/opus.h> +#endif +#define PA_BUF_SIZE 0x4000 #endif #include "rexmpp.h" +#include "rexmpp_tls.h" + /** @brief Processes incoming Jingle IQs. */ -int rexmpp_jingle_iq (rexmpp_t *s, xmlNodePtr elem); +int rexmpp_jingle_iq (rexmpp_t *s, rexmpp_xml_t *elem); /** @brief Destroys Jingle sessions. */ void rexmpp_jingle_stop (rexmpp_t *s); @@ -45,7 +50,7 @@ rexmpp_jingle_send_file (rexmpp_t *s, rexmpp_err_t rexmpp_jingle_session_terminate (rexmpp_t *s, const char *sid, - xmlNodePtr reason_node, + rexmpp_xml_t *reason_node, const char *reason_text); typedef struct rexmpp_jingle_component rexmpp_jingle_component_t; @@ -57,6 +62,13 @@ enum rexmpp_jingle_session_type { REXMPP_JINGLE_SESSION_MEDIA }; +enum rexmpp_codec { + REXMPP_CODEC_UNDEFINED, + REXMPP_CODEC_PCMU, + REXMPP_CODEC_PCMA, + REXMPP_CODEC_OPUS +}; + #ifdef ENABLE_CALLS /* A structure used for callbacks, to pass rexmpp_t, rexmpp_jingle_session_t, and the component ID. */ @@ -64,23 +76,31 @@ struct rexmpp_jingle_component { rexmpp_t *s; rexmpp_jingle_session_t *session; int component_id; - gnutls_session_t dtls_session; - char dtls_buf[DTLS_SRTP_BUF_SIZE]; + rexmpp_tls_t *dtls; enum tls_st dtls_state; - size_t dtls_buf_len; srtp_t srtp_in; srtp_t srtp_out; - uint16_t udp_port_in; - uint16_t udp_port_out; - int udp_socket; +}; + +struct ring_buf +{ + int16_t buf[PA_BUF_SIZE]; + unsigned int write_pos; + unsigned int read_pos; +}; + +struct pa_buffers +{ + struct ring_buf capture; + struct ring_buf playback; }; #endif struct rexmpp_jingle_session { char *jid; char *sid; - xmlNodePtr initiate; - xmlNodePtr accept; + rexmpp_xml_t *initiate; + rexmpp_xml_t *accept; rexmpp_jingle_session_t *next; /* Sessions are commonly passed to callbacks by external libraries, so it's convenient to have the corresponding rexmpp_t accessible @@ -107,13 +127,25 @@ struct rexmpp_jingle_session { int rtcp_mux; NiceAgent *ice_agent; int ice_stream_id; -#endif + PaStream *pa_stream; + /* The default codec and payload type for this stream. */ + enum rexmpp_codec codec; + uint8_t payload_type; + struct pa_buffers ring_buffers; + uint16_t rtp_seq_num; + uint16_t rtp_last_seq_num; + uint32_t rtp_timestamp; + uint32_t rtp_ssrc; +#ifdef HAVE_OPUS + OpusEncoder *opus_enc; + OpusDecoder *opus_dec; +#endif /* HAVE_POUS */ +#endif /* ENABLE_CALLS */ }; struct rexmpp_jingle_ctx { #ifdef ENABLE_CALLS GMainLoop* gloop; - gnutls_certificate_credentials_t dtls_cred; #endif rexmpp_jingle_session_t *sessions; }; @@ -121,20 +153,16 @@ struct rexmpp_jingle_ctx { int rexmpp_jingle_init (rexmpp_t *s); rexmpp_err_t rexmpp_jingle_run (rexmpp_t *s, fd_set *read_fds, fd_set *write_fds); -struct timeval * rexmpp_jingle_timeout (rexmpp_t *s, - struct timeval *max_tv, - struct timeval *tv); +struct timespec * rexmpp_jingle_timeout (rexmpp_t *s, + struct timespec *max_tv, + struct timespec *tv); int rexmpp_jingle_fds(rexmpp_t *s, fd_set *read_fds, fd_set *write_fds); rexmpp_err_t rexmpp_jingle_call (rexmpp_t *s, - const char *jid, - uint16_t rtp_port_in, - uint16_t rtp_port_out); + const char *jid); rexmpp_err_t rexmpp_jingle_call_accept (rexmpp_t *s, - const char *sid, - uint16_t rtp_port_in, - uint16_t rtp_port_out); + const char *sid); #endif |