summaryrefslogtreecommitdiffstats
path: root/src/libosmocc/session.h
blob: cab8fea2944a7f1165a2f3a024c325de5e654fd4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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);