summaryrefslogtreecommitdiff
path: root/src/rexmpp_jingle.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/rexmpp_jingle.h')
-rw-r--r--src/rexmpp_jingle.h74
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