summaryrefslogtreecommitdiffstats
path: root/src/libosmocc/session.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libosmocc/session.h')
-rw-r--r--src/libosmocc/session.h119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/libosmocc/session.h b/src/libosmocc/session.h
new file mode 100644
index 0000000..cab8fea
--- /dev/null
+++ b/src/libosmocc/session.h
@@ -0,0 +1,119 @@
+
+/* session description, global part: */
+
+typedef struct osmo_cc_session_origin {
+ const char *username;
+ const char *sess_id;
+ const char *sess_version;
+ const char *nettype;
+ const char *addrtype;
+ const char *unicast_address;
+} osmo_cc_session_origin_t;
+
+/* session instance */
+typedef struct osmo_cc_session {
+ void *priv;
+ osmo_cc_session_origin_t origin_local, origin_remote;
+ const char *name;
+ struct osmo_cc_session_media *media_list;
+} osmo_cc_session_t;
+
+/* connection description: */
+
+enum osmo_cc_session_nettype {
+ osmo_cc_session_nettype_unknown = 0,
+ osmo_cc_session_nettype_inet,
+};
+
+enum osmo_cc_session_addrtype {
+ osmo_cc_session_addrtype_unknown = 0,
+ osmo_cc_session_addrtype_ipv4,
+ osmo_cc_session_addrtype_ipv6,
+};
+
+typedef struct osmo_cc_session_connection_data {
+ enum osmo_cc_session_nettype nettype;
+ const char *nettype_name;
+ enum osmo_cc_session_addrtype addrtype;
+ const char *addrtype_name;
+ const char *address;
+} osmo_cc_session_connection_data_t;
+
+/* one media of session description: */
+
+enum osmo_cc_session_media_type {
+ osmo_cc_session_media_type_unknown,
+ osmo_cc_session_media_type_audio,
+ osmo_cc_session_media_type_video,
+};
+
+enum osmo_cc_session_media_proto {
+ osmo_cc_session_media_proto_unknown,
+ osmo_cc_session_media_proto_rtp,
+};
+
+typedef struct osmo_cc_session_media_description {
+ enum osmo_cc_session_media_type type;
+ const char *type_name;
+ uint16_t port_local, port_remote;
+ enum osmo_cc_session_media_proto proto;
+ const char *proto_name;
+} osmo_cc_session_media_description_t;
+
+/* media entry */
+typedef struct osmo_cc_session_media {
+ struct osmo_cc_session_media *next;
+ osmo_cc_session_t *session;
+ osmo_cc_session_media_description_t description;
+ osmo_cc_session_connection_data_t connection_data_local, connection_data_remote;
+ struct osmo_cc_session_codec *codec_list;
+ int send, receive;
+ void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len);
+ int rtp_socket;
+ int rtcp_socket;
+ uint32_t rtp_ssrc;
+ uint16_t tx_sequence, rx_sequence;
+ uint32_t tx_timestamp, rx_timestamp;
+ int accepted;
+} osmo_cc_session_media_t;
+
+/* codec entry */
+typedef struct osmo_cc_session_codec {
+ struct osmo_cc_session_codec *next;
+ osmo_cc_session_media_t *media;
+ uint8_t payload_type_local, payload_type_remote; /* local = towards local, remote = toward remote */
+ const char *payload_name;
+ uint32_t payload_rate;
+ int payload_channels;
+ void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len);
+ void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len);
+ int accepted;
+} osmo_cc_session_codec_t;
+
+#define osmo_cc_session_for_each_media(head, m) \
+ for (m = (head); m; m = m->next)
+
+#define osmo_cc_session_for_each_codec(head, c) \
+ for (c = (head); c; c = c->next)
+
+void osmo_cc_set_local_peer(enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address);
+osmo_cc_session_t *osmo_cc_new_session(void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug);
+void osmo_cc_free_session(osmo_cc_session_t *session);
+osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len), int debug);
+void osmo_cc_free_media(osmo_cc_session_media_t *media);
+osmo_cc_session_codec_t *osmo_cc_add_codec(osmo_cc_session_media_t *media, const char *playload_name, uint32_t playload_rate, int playload_channels, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len), int debug);
+void osmo_cc_free_codec(osmo_cc_session_codec_t *codec);
+int osmo_cc_session_check(struct osmo_cc_session *session, int remote);
+const char *osmo_cc_session_send_offer(osmo_cc_session_t *session);
+osmo_cc_session_t *osmo_cc_session_receive_offer(void *priv, const char *sdp);
+void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint8_t *data, int len));
+void osmo_cc_session_accept_codec(osmo_cc_session_codec_t *codec, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len));
+const char *osmo_cc_session_send_answer(osmo_cc_session_t *session);
+int osmo_cc_session_receive_answer(osmo_cc_session_t *session, const char *sdp);
+const char *osmo_cc_session_nettype2string(enum osmo_cc_session_nettype nettype);
+const char *osmo_cc_session_addrtype2string(enum osmo_cc_session_addrtype addrtype);
+const char *osmo_cc_session_media_type2string(enum osmo_cc_session_media_type media_type);
+const char *osmo_cc_session_media_proto2string(enum osmo_cc_session_media_proto media_proto);
+int osmo_cc_session_if_codec(osmo_cc_session_codec_t *codec, const char *name, uint32_t rate, int channels);
+int osmo_cc_session_handle(osmo_cc_session_t *session);
+