/** * 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 /* vim: set et ts=4 sw=4 : */