aboutsummaryrefslogtreecommitdiffstats
path: root/src/libosmocc/session.h
blob: 0330f51eb52083fe3b64805b3745bb79e64584a9 (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
120
121
122
123
124
125
126
127
128
129
130
/* configuration */

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_config {
	enum osmo_cc_session_nettype default_nettype;
	enum osmo_cc_session_addrtype default_addrtype;
	const char *default_unicast_address;
	uint16_t rtp_port_next;
	uint16_t rtp_port_from;
	uint16_t rtp_port_to;
} osmo_cc_session_config_t;

/* 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 {
	osmo_cc_session_config_t *config;
	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: */

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, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len);
	int rtp_socket;
	int rtcp_socket;
	uint32_t tx_ssrc, rx_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 *priv);
	void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
	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(osmo_cc_session_config_t *conf, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address);
osmo_cc_session_t *osmo_cc_new_session(osmo_cc_session_config_t *conf, 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, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, 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 *priv), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), 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(osmo_cc_session_config_t *conf, 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, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, 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 *priv), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv));
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, void *codec_priv);