summaryrefslogtreecommitdiff
path: root/tinyrtc.h
blob: ff29e1520a8c9f755b42ecfe8fde1642dc46665e (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
/**
 * WebRTC implementation for tiny devices
 *
 * Copyright (c) 2022 Chris Hiszpanski. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 */

#ifndef TINYRTC_H
#define TINYRTC_H

#define TRTC_MAX_ICE_CANDIDATE_SIZE						256
#define TRTC_MAX_ICE_SERVER_CREDENTIAL_SIZE				128
#define	TRTC_MAX_ICE_SERVERS							2
#define	TRTC_MAX_ICE_SERVER_URL_SIZE					128
#define TRTC_MAX_ICE_SERVER_URLS						3
#define TRTC_MAX_ICE_SERVER_USERNAME_SIZE				128
#define TRTC_MAX_ICE_CANDIDATE_USERNAME_FRAGMENT_SIZE	8
#define	TRTC_MAX_ICE_CANDIDATE_SDP_MID_SIZE				32
#define	TRTC_MAX_PEER_CONNECTIONS						5
#define	TRTC_MAX_SDP_SIZE								4096
#define TRTC_MAX_ICE_UFRAG_SIZE							5
#define	TRTC_MAX_ICE_PWD_SIZE							32


///  PRIVATE TYPE DEFINITIONS  ///////////////////////////////////////////////

struct trtc_peerconn_t;


///  PUBLIC TYPE DEFINITIONS  ////////////////////////////////////////////////

struct trtc_ice_server_t {
	char credential[TRTC_MAX_ICE_SERVER_CREDENTIAL_SIZE];
	char urls[3][TRTC_MAX_ICE_SERVER_URL_SIZE];
	char username[TRTC_MAX_ICE_SERVER_USERNAME_SIZE];
};

struct trtc_config_t {
	struct trtc_ice_server_t ice_servers[TRTC_MAX_ICE_SERVERS];
};

struct trtc_ice_candidate_t {
	char candidate[TRTC_MAX_ICE_CANDIDATE_SIZE];
	int  sdp_mline_index;
	char sdp_mid[TRTC_MAX_ICE_CANDIDATE_SDP_MID_SIZE];
	char username_fragment[TRTC_MAX_ICE_CANDIDATE_USERNAME_FRAGMENT_SIZE];
};


///  CALLBACKS  //////////////////////////////////////////////////////////////

typedef void (trtc_on_ice_candidate_t)(const struct trtc_ice_candidate_t c, void *arg);


///  RTC PEER CONNECTION API  ////////////////////////////////////////////////

/**
 * Initialize library. Must call once before calling other functions.
 */
void trtc_init();

/**
 * Create new peer connection
 *
 * \param cfg[in] Configuration.
 *
 * \return Peer connection. NULL if all peer connections are already in use.
 */
struct trtc_peerconn_t* trtc_peer_connection(struct trtc_config_t cfg);
void trtc_peer_connection_destroy(struct trtc_peerconn_t* pc);

/**
 * Adds remote ICE candidate to local ICE agent
 *
 * \param pc[in] Peer connection.
 * \param c[in] ICE candidate from remote peer.
 *
 * \return 0 on success. -1 on error.
 */
int trtc_add_ice_candidate(
	struct trtc_peerconn_t *pc, const struct trtc_ice_candidate_t c);

int trtc_add_track(struct trtc_peerconn_t *pc);

/**
 * Create SDP answer in response to a received SDP offer.
 *
 * \param pc[in] Peer connection.
 *
 * \return SDP answer. NULL on error.
 */
const char * trtc_create_answer(struct trtc_peerconn_t *pc);

/**
 * Sets callback to call for each discovered local ICE candidate
 *
 * \param pc[in] Peer connection.
 * \param cb[in] Callback function.
 * \param arg[in] User-specified argument to pass to callback function.
 *
 * \return 0 on success. -1 on error.
 */
int trtc_set_on_ice_candidate(
	struct trtc_peerconn_t* pc, trtc_on_ice_candidate_t* cb, void* arg);

int trtc_set_local_description(struct trtc_peerconn_t *pc, const char *sdp);
int trtc_set_remote_description(struct trtc_peerconn_t *pc, const char *sdp);

#endif