/** * 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 /// CUSTOMIZABLE PARAMETERS //////////////////////////////////////////////// #define TINYRTC_MAX_ICE_CANDIDATE_SIZE 256 #define TINYRTC_MAX_ICE_SERVER_CREDENTIAL_SIZE 128 #define TINYRTC_MAX_ICE_SERVERS 2 #define TINYRTC_MAX_ICE_SERVER_URL_SIZE 128 #define TINYRTC_MAX_ICE_SERVER_URLS 3 #define TINYRTC_MAX_ICE_SERVER_USERNAME_SIZE 128 #define TINYRTC_MAX_ICE_CANDIDATE_USERNAME_FRAGMENT_SIZE 8 #define TINYRTC_MAX_ICE_CANDIDATE_SDP_MID_SIZE 32 #define TINYRTC_MAX_PEER_CONNECTIONS 5 #define TINYRTC_MAX_SDP_SIZE 4096 #define TINYRTC_MAX_ICE_UFRAG_SIZE 5 #define TINYRTC_MAX_ICE_PWD_SIZE 32 /// PUBLIC ENUMS /////////////////////////////////////////////////////////// enum rtc_session_description_type { RTC_SESSION_DESCRIPTION_TYPE_NONE = 0, RTC_SESSION_DESCRIPTION_TYPE_OFFER, RTC_SESSION_DESCRIPTION_TYPE_ANSWER }; /// PUBLIC STRUCTS ///////////////////////////////////////////////////////// struct rtc_peer_connection; struct rtc_ice_server { char credential[TINYRTC_MAX_ICE_SERVER_CREDENTIAL_SIZE]; char urls[TINYRTC_MAX_ICE_SERVER_URLS][TINYRTC_MAX_ICE_SERVER_URL_SIZE]; char username[TINYRTC_MAX_ICE_SERVER_USERNAME_SIZE]; }; struct rtc_configuration { struct rtc_ice_server ice_servers[TINYRTC_MAX_ICE_SERVERS]; }; struct rtc_ice_candidate { char candidate[TINYRTC_MAX_ICE_CANDIDATE_SIZE]; int sdp_mline_index; char sdp_mid[TINYRTC_MAX_ICE_CANDIDATE_SDP_MID_SIZE]; char username_fragment[TINYRTC_MAX_ICE_CANDIDATE_USERNAME_FRAGMENT_SIZE]; }; struct rtc_session_description { char sdp[TINYRTC_MAX_SDP_SIZE]; enum rtc_session_description_type type; }; /// CALLBACKS ////////////////////////////////////////////////////////////// typedef void (rtc_on_ice_candidate)(const struct rtc_ice_candidate c, void *arg); /// RTC PEER CONNECTION API //////////////////////////////////////////////// /** * Initialize library. Must call once before calling other functions. */ void rtc_init(); /** * Create new peer connection * * \param cfg[in] Configuration. * * \return Peer connection. NULL if all peer connections are already in use. */ struct rtc_peer_connection* rtc_peer_connection_create( struct rtc_configuration cfg); void rtc_peer_connection_destroy(struct rtc_peer_connection* 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 rtc_add_ice_candidate( struct rtc_peer_connection* pc, const struct rtc_ice_candidate c); /** * Create SDP answer in response to a received SDP offer. * * \param pc[in] Peer connection. * * \return SDP answer. NULL on error. */ const char* rtc_create_answer(struct rtc_peer_connection* 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 rtc_set_on_ice_candidate( struct rtc_peer_connection* pc, rtc_on_ice_candidate* cb, void* arg); int rtc_set_local_description(struct rtc_peer_connection* pc, const char* sdp); int rtc_set_remote_description(struct rtc_peer_connection* pc, const char* sdp); #endif /* vim: set et ts=4 sw=4 : */