#ifndef INC_SRTC_H
#define INC_SRTC_H
#include "version.h"
#include "platform_sys.h"
#include <string.h>
#include <stdlib.h>
#include "logging_api.h"
#ifdef _WIN32
#ifndef __MINGW__
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef unsigned __int32 uint32_t;
#ifndef LEGACY_WIN32
typedef unsigned __int64 uint64_t;
#else
typedef __int64 uint64_t;
#endif
#ifdef SRT_DYNAMIC
#ifdef SRT_EXPORTS
#define SRT_API __declspec(dllexport)
#else
#define SRT_API __declspec(dllimport)
#endif
#else
#define SRT_API
#endif
#else
#define SRT_API
#endif
#else
#define SRT_API __attribute__ ((visibility("default")))
#endif
#define SRT_VERSION_FEAT_HSv5 0x010300
#if defined(__cplusplus) && __cplusplus > 201406
#define SRT_HAVE_CXX17 1
#else
#define SRT_HAVE_CXX17 0
#endif
#if SRT_HAVE_CXX17
#define SRT_ATR_UNUSED [[maybe_unused]]
#define SRT_ATR_NODISCARD [[nodiscard]]
#elif defined(__GNUC__)
#define SRT_ATR_UNUSED __attribute__((unused))
#define SRT_ATR_NODISCARD __attribute__((warn_unused_result))
#elif defined(_MSC_VER)
#define SRT_ATR_UNUSED __pragma(warning(suppress: 4100 4101))
#define SRT_ATR_NODISCARD _Check_return_
#else
#define SRT_ATR_UNUSED
#define SRT_ATR_NODISCARD
#endif
#if defined(SRT_NO_DEPRECATED)
#define SRT_ATR_DEPRECATED
#define SRT_ATR_DEPRECATED_PX
#elif SRT_HAVE_CXX17
#define SRT_ATR_DEPRECATED
#define SRT_ATR_DEPRECATED_PX [[deprecated]]
#elif defined(__GNUC__)
#define SRT_ATR_DEPRECATED_PX
#define SRT_ATR_DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER)
#define SRT_ATR_DEPRECATED_PX __declspec(deprecated)
#define SRT_ATR_DEPRECATED
#else
#define SRT_ATR_DEPRECATED_PX
#define SRT_ATR_DEPRECATED
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef int32_t SRTSOCKET;
static const int32_t SRTGROUP_MASK = (1 << 30);
#ifdef _WIN32
#ifndef __MINGW__
typedef SOCKET SYSSOCKET;
#else
typedef int SYSSOCKET;
#endif
#else
typedef int SYSSOCKET;
#endif
typedef SYSSOCKET UDPSOCKET;
typedef enum SRT_SOCKSTATUS {
SRTS_INIT = 1,
SRTS_OPENED,
SRTS_LISTENING,
SRTS_CONNECTING,
SRTS_CONNECTED,
SRTS_BROKEN,
SRTS_CLOSING,
SRTS_CLOSED,
SRTS_NONEXIST
} SRT_SOCKSTATUS;
typedef enum SRT_SOCKOPT {
SRTO_MSS = 0, SRTO_SNDSYN = 1, SRTO_RCVSYN = 2, SRTO_ISN = 3, SRTO_FC = 4, SRTO_SNDBUF = 5, SRTO_RCVBUF = 6, SRTO_LINGER = 7, SRTO_UDP_SNDBUF = 8, SRTO_UDP_RCVBUF = 9, SRTO_RENDEZVOUS = 12, SRTO_SNDTIMEO = 13, SRTO_RCVTIMEO = 14, SRTO_REUSEADDR = 15, SRTO_MAXBW = 16, SRTO_STATE = 17, SRTO_EVENT = 18, SRTO_SNDDATA = 19, SRTO_RCVDATA = 20, SRTO_SENDER = 21, SRTO_TSBPDMODE = 22, SRTO_LATENCY = 23, SRTO_INPUTBW = 24, SRTO_OHEADBW, SRTO_PASSPHRASE = 26, SRTO_PBKEYLEN, SRTO_KMSTATE, SRTO_IPTTL = 29, SRTO_IPTOS, SRTO_TLPKTDROP = 31, SRTO_SNDDROPDELAY = 32, SRTO_NAKREPORT = 33, SRTO_VERSION = 34, SRTO_PEERVERSION, SRTO_CONNTIMEO = 36, SRTO_DRIFTTRACER = 37, SRTO_SNDKMSTATE = 40, SRTO_RCVKMSTATE, SRTO_LOSSMAXTTL, SRTO_RCVLATENCY, SRTO_PEERLATENCY, SRTO_MINVERSION, SRTO_STREAMID, SRTO_CONGESTION, SRTO_MESSAGEAPI, SRTO_PAYLOADSIZE, SRTO_TRANSTYPE = 50, SRTO_KMREFRESHRATE, SRTO_KMPREANNOUNCE, SRTO_ENFORCEDENCRYPTION, SRTO_IPV6ONLY, SRTO_PEERIDLETIMEO, #if ENABLE_EXPERIMENTAL_BONDING
SRTO_GROUPCONNECT, SRTO_GROUPSTABTIMEO, SRTO_GROUPTYPE, #endif
SRTO_BINDTODEVICE, SRTO_PACKETFILTER = 60, SRTO_RETRANSMITALGO = 61 } SRT_SOCKOPT;
#ifdef __cplusplus
#if __cplusplus > 199711L
#define SRT_DEPRECATED_OPTION(value) ((SRT_SOCKOPT [[deprecated]])value)
#else
typedef SRT_ATR_DEPRECATED_PX SRT_SOCKOPT SRT_SOCKOPT_DEPRECATED SRT_ATR_DEPRECATED;
#define SRT_DEPRECATED_OPTION(value) ((SRT_SOCKOPT_DEPRECATED)value)
#endif
#else
enum SRT_ATR_DEPRECATED SRT_SOCKOPT_DEPRECATED
{
SRTO_DEPRECATED_END = 0
};
#define SRT_DEPRECATED_OPTION(value) ((enum SRT_SOCKOPT_DEPRECATED)value)
#endif
typedef enum SRT_TRANSTYPE
{
SRTT_LIVE,
SRTT_FILE,
SRTT_INVALID
} SRT_TRANSTYPE;
static const int SRT_LIVE_DEF_PLSIZE = 1316;
static const int SRT_LIVE_MAX_PLSIZE = 1456;
static const int SRT_LIVE_DEF_LATENCY_MS = 120;
struct CBytePerfMon
{
int64_t msTimeStamp; int64_t pktSentTotal; int64_t pktRecvTotal; int pktSndLossTotal; int pktRcvLossTotal; int pktRetransTotal; int pktSentACKTotal; int pktRecvACKTotal; int pktSentNAKTotal; int pktRecvNAKTotal; int64_t usSndDurationTotal; int pktSndDropTotal; int pktRcvDropTotal; int pktRcvUndecryptTotal; uint64_t byteSentTotal; uint64_t byteRecvTotal; uint64_t byteRcvLossTotal; uint64_t byteRetransTotal; uint64_t byteSndDropTotal; uint64_t byteRcvDropTotal; uint64_t byteRcvUndecryptTotal;
int64_t pktSent; int64_t pktRecv; int pktSndLoss; int pktRcvLoss; int pktRetrans; int pktRcvRetrans; int pktSentACK; int pktRecvACK; int pktSentNAK; int pktRecvNAK; double mbpsSendRate; double mbpsRecvRate; int64_t usSndDuration; int pktReorderDistance; double pktRcvAvgBelatedTime; int64_t pktRcvBelated; int pktSndDrop; int pktRcvDrop; int pktRcvUndecrypt; uint64_t byteSent; uint64_t byteRecv; uint64_t byteRcvLoss; uint64_t byteRetrans; uint64_t byteSndDrop; uint64_t byteRcvDrop; uint64_t byteRcvUndecrypt;
double usPktSndPeriod; int pktFlowWindow; int pktCongestionWindow; int pktFlightSize; double msRTT; double mbpsBandwidth; int byteAvailSndBuf; int byteAvailRcvBuf; double mbpsMaxBW; int byteMSS;
int pktSndBuf; int byteSndBuf; int msSndBuf; int msSndTsbPdDelay;
int pktRcvBuf; int byteRcvBuf; int msRcvBuf; int msRcvTsbPdDelay;
int pktSndFilterExtraTotal; int pktRcvFilterExtraTotal; int pktRcvFilterSupplyTotal; int pktRcvFilterLossTotal;
int pktSndFilterExtra; int pktRcvFilterExtra; int pktRcvFilterSupply; int pktRcvFilterLoss; int pktReorderTolerance;
int64_t pktSentUniqueTotal; int64_t pktRecvUniqueTotal; uint64_t byteSentUniqueTotal; uint64_t byteRecvUniqueTotal;
int64_t pktSentUnique; int64_t pktRecvUnique; uint64_t byteSentUnique; uint64_t byteRecvUnique; };
enum CodeMajor
{
MJ_UNKNOWN = -1,
MJ_SUCCESS = 0,
MJ_SETUP = 1,
MJ_CONNECTION = 2,
MJ_SYSTEMRES = 3,
MJ_FILESYSTEM = 4,
MJ_NOTSUP = 5,
MJ_AGAIN = 6,
MJ_PEERERROR = 7
};
enum CodeMinor
{
MN_NONE = 0,
MN_TIMEOUT = 1,
MN_REJECTED = 2,
MN_NORES = 3,
MN_SECURITY = 4,
MN_CLOSED = 5,
MN_CONNLOST = 1,
MN_NOCONN = 2,
MN_THREAD = 1,
MN_MEMORY = 2,
MN_OBJECT = 3,
MN_SEEKGFAIL = 1,
MN_READFAIL = 2,
MN_SEEKPFAIL = 3,
MN_WRITEFAIL = 4,
MN_ISBOUND = 1,
MN_ISCONNECTED = 2,
MN_INVAL = 3,
MN_SIDINVAL = 4,
MN_ISUNBOUND = 5,
MN_NOLISTEN = 6,
MN_ISRENDEZVOUS = 7,
MN_ISRENDUNBOUND = 8,
MN_INVALMSGAPI = 9,
MN_INVALBUFFERAPI = 10,
MN_BUSY = 11,
MN_XSIZE = 12,
MN_EIDINVAL = 13,
MN_EEMPTY = 14,
MN_WRAVAIL = 1,
MN_RDAVAIL = 2,
MN_XMTIMEOUT = 3,
MN_CONGESTION = 4
};
#define MJ(major) (1000 * MJ_##major)
#define MN(major, minor) (1000 * MJ_##major + MN_##minor)
typedef enum SRT_ERRNO
{
SRT_EUNKNOWN = -1,
SRT_SUCCESS = MJ_SUCCESS,
SRT_ECONNSETUP = MJ(SETUP),
SRT_ENOSERVER = MN(SETUP, TIMEOUT),
SRT_ECONNREJ = MN(SETUP, REJECTED),
SRT_ESOCKFAIL = MN(SETUP, NORES),
SRT_ESECFAIL = MN(SETUP, SECURITY),
SRT_ESCLOSED = MN(SETUP, CLOSED),
SRT_ECONNFAIL = MJ(CONNECTION),
SRT_ECONNLOST = MN(CONNECTION, CONNLOST),
SRT_ENOCONN = MN(CONNECTION, NOCONN),
SRT_ERESOURCE = MJ(SYSTEMRES),
SRT_ETHREAD = MN(SYSTEMRES, THREAD),
SRT_ENOBUF = MN(SYSTEMRES, MEMORY),
SRT_ESYSOBJ = MN(SYSTEMRES, OBJECT),
SRT_EFILE = MJ(FILESYSTEM),
SRT_EINVRDOFF = MN(FILESYSTEM, SEEKGFAIL),
SRT_ERDPERM = MN(FILESYSTEM, READFAIL),
SRT_EINVWROFF = MN(FILESYSTEM, SEEKPFAIL),
SRT_EWRPERM = MN(FILESYSTEM, WRITEFAIL),
SRT_EINVOP = MJ(NOTSUP),
SRT_EBOUNDSOCK = MN(NOTSUP, ISBOUND),
SRT_ECONNSOCK = MN(NOTSUP, ISCONNECTED),
SRT_EINVPARAM = MN(NOTSUP, INVAL),
SRT_EINVSOCK = MN(NOTSUP, SIDINVAL),
SRT_EUNBOUNDSOCK = MN(NOTSUP, ISUNBOUND),
SRT_ENOLISTEN = MN(NOTSUP, NOLISTEN),
SRT_ERDVNOSERV = MN(NOTSUP, ISRENDEZVOUS),
SRT_ERDVUNBOUND = MN(NOTSUP, ISRENDUNBOUND),
SRT_EINVALMSGAPI = MN(NOTSUP, INVALMSGAPI),
SRT_EINVALBUFFERAPI = MN(NOTSUP, INVALBUFFERAPI),
SRT_EDUPLISTEN = MN(NOTSUP, BUSY),
SRT_ELARGEMSG = MN(NOTSUP, XSIZE),
SRT_EINVPOLLID = MN(NOTSUP, EIDINVAL),
SRT_EPOLLEMPTY = MN(NOTSUP, EEMPTY),
SRT_EASYNCFAIL = MJ(AGAIN),
SRT_EASYNCSND = MN(AGAIN, WRAVAIL),
SRT_EASYNCRCV = MN(AGAIN, RDAVAIL),
SRT_ETIMEOUT = MN(AGAIN, XMTIMEOUT),
SRT_ECONGEST = MN(AGAIN, CONGESTION),
SRT_EPEERERR = MJ(PEERERROR)
} SRT_ERRNO;
#undef MJ
#undef MN
enum SRT_REJECT_REASON
{
SRT_REJ_UNKNOWN, SRT_REJ_SYSTEM, SRT_REJ_PEER, SRT_REJ_RESOURCE, SRT_REJ_ROGUE, SRT_REJ_BACKLOG, SRT_REJ_IPE, SRT_REJ_CLOSE, SRT_REJ_VERSION, SRT_REJ_RDVCOOKIE, SRT_REJ_BADSECRET, SRT_REJ_UNSECURE, SRT_REJ_MESSAGEAPI, SRT_REJ_CONGESTION, SRT_REJ_FILTER, SRT_REJ_GROUP, SRT_REJ_TIMEOUT,
SRT_REJ_E_SIZE,
};
#define SRT_REJ__SIZE SRT_REJ_E_SIZE
#define SRT_REJC_VALUE(code) (1000 * (code/1000))
#define SRT_REJC_INTERNAL 0
#define SRT_REJC_PREDEFINED 1000
#define SRT_REJC_USERDEFINED 2000
#define SRT_LOGFA_GENERAL 0
#define SRT_LOGFA_SOCKMGMT 1
#define SRT_LOGFA_CONN 2
#define SRT_LOGFA_XTIMER 3
#define SRT_LOGFA_TSBPD 4
#define SRT_LOGFA_RSRC 5
#define SRT_LOGFA_CONGEST 7
#define SRT_LOGFA_PFILTER 8
#define SRT_LOGFA_API_CTRL 11
#define SRT_LOGFA_QUE_CTRL 13
#define SRT_LOGFA_EPOLL_UPD 16
#define SRT_LOGFA_API_RECV 21
#define SRT_LOGFA_BUF_RECV 22
#define SRT_LOGFA_QUE_RECV 23
#define SRT_LOGFA_CHN_RECV 24
#define SRT_LOGFA_GRP_RECV 25
#define SRT_LOGFA_API_SEND 31
#define SRT_LOGFA_BUF_SEND 32
#define SRT_LOGFA_QUE_SEND 33
#define SRT_LOGFA_CHN_SEND 34
#define SRT_LOGFA_GRP_SEND 35
#define SRT_LOGFA_INTERNAL 41
#define SRT_LOGFA_QUE_MGMT 43
#define SRT_LOGFA_CHN_MGMT 44
#define SRT_LOGFA_GRP_MGMT 45
#define SRT_LOGFA_EPOLL_API 46
#define SRT_LOGFA_HAICRYPT 6
#define SRT_LOGFA_APPLOG 10
#define SRT_LOGFA_LASTNONE 63
enum SRT_KM_STATE
{
SRT_KM_S_UNSECURED = 0, SRT_KM_S_SECURING = 1, SRT_KM_S_SECURED = 2, SRT_KM_S_NOSECRET = 3, SRT_KM_S_BADSECRET = 4 };
enum SRT_EPOLL_OPT
{
SRT_EPOLL_OPT_NONE = 0x0,
SRT_EPOLL_IN = 0x1,
SRT_EPOLL_OUT = 0x4,
SRT_EPOLL_ERR = 0x8,
SRT_EPOLL_CONNECT = SRT_EPOLL_OUT,
SRT_EPOLL_ACCEPT = SRT_EPOLL_IN,
SRT_EPOLL_UPDATE = 0x10,
SRT_EPOLL_ET = 1u << 31
};
typedef int32_t SRT_EPOLL_T;
#define SRT_EPOLL_EVENTTYPES (SRT_EPOLL_IN | SRT_EPOLL_OUT | SRT_EPOLL_UPDATE | SRT_EPOLL_ERR)
#define SRT_EPOLL_ETONLY (SRT_EPOLL_UPDATE)
enum SRT_EPOLL_FLAGS
{
SRT_EPOLL_ENABLE_EMPTY = 1,
SRT_EPOLL_ENABLE_OUTPUTCHECK = 2
};
#ifdef __cplusplus
inline SRT_EPOLL_OPT operator|(SRT_EPOLL_OPT a1, SRT_EPOLL_OPT a2)
{
return SRT_EPOLL_OPT( (int)a1 | (int)a2 );
}
#endif
typedef struct CBytePerfMon SRT_TRACEBSTATS;
static const SRTSOCKET SRT_INVALID_SOCK = -1;
static const int SRT_ERROR = -1;
SRT_API int srt_startup(void);
SRT_API int srt_cleanup(void);
SRT_ATR_DEPRECATED_PX SRT_API SRTSOCKET srt_socket(int, int, int) SRT_ATR_DEPRECATED;
SRT_API SRTSOCKET srt_create_socket(void);
typedef struct SRT_SocketGroupData_ SRT_SOCKGROUPDATA;
#if ENABLE_EXPERIMENTAL_BONDING
typedef enum SRT_GROUP_TYPE
{
SRT_GTYPE_UNDEFINED,
SRT_GTYPE_BROADCAST,
SRT_GTYPE_BACKUP,
SRT_GTYPE_BALANCING,
SRT_GTYPE_MULTICAST,
SRT_GTYPE_E_END
} SRT_GROUP_TYPE;
static const uint32_t SRT_GFLAG_SYNCONMSG = 1;
typedef enum SRT_MemberStatus
{
SRT_GST_PENDING, SRT_GST_IDLE, SRT_GST_RUNNING, SRT_GST_BROKEN } SRT_MEMBERSTATUS;
struct SRT_SocketGroupData_
{
SRTSOCKET id;
struct sockaddr_storage peeraddr; SRT_SOCKSTATUS sockstate;
uint16_t weight;
SRT_MEMBERSTATUS memberstate;
int result;
int token;
};
typedef struct SRT_SocketOptionObject SRT_SOCKOPT_CONFIG;
typedef struct SRT_GroupMemberConfig_
{
SRTSOCKET id;
struct sockaddr_storage srcaddr;
struct sockaddr_storage peeraddr; uint16_t weight;
SRT_SOCKOPT_CONFIG* config;
int errorcode;
int token;
} SRT_SOCKGROUPCONFIG;
SRT_API SRTSOCKET srt_create_group (SRT_GROUP_TYPE);
SRT_API int srt_include (SRTSOCKET socket, SRTSOCKET group);
SRT_API int srt_exclude (SRTSOCKET socket);
SRT_API SRTSOCKET srt_groupof (SRTSOCKET socket);
SRT_API int srt_group_data (SRTSOCKET socketgroup, SRT_SOCKGROUPDATA* output, size_t* inoutlen);
SRT_API int srt_group_configure(SRTSOCKET socketgroup, const char* str);
SRT_API SRT_SOCKOPT_CONFIG* srt_create_config(void);
SRT_API void srt_delete_config(SRT_SOCKOPT_CONFIG* config );
SRT_API int srt_config_add(SRT_SOCKOPT_CONFIG* config, SRT_SOCKOPT option, const void* contents, int len);
SRT_API SRT_SOCKGROUPCONFIG srt_prepare_endpoint(const struct sockaddr* src , const struct sockaddr* adr, int namelen);
SRT_API int srt_connect_group(SRTSOCKET group, SRT_SOCKGROUPCONFIG name [], int arraysize);
#endif
SRT_API int srt_bind (SRTSOCKET u, const struct sockaddr* name, int namelen);
SRT_API int srt_bind_acquire (SRTSOCKET u, UDPSOCKET sys_udp_sock);
SRT_ATR_DEPRECATED_PX static inline int srt_bind_peerof(SRTSOCKET u, UDPSOCKET sys_udp_sock) SRT_ATR_DEPRECATED;
static inline int srt_bind_peerof (SRTSOCKET u, UDPSOCKET sys_udp_sock) { return srt_bind_acquire(u, sys_udp_sock); }
SRT_API int srt_listen (SRTSOCKET u, int backlog);
SRT_API SRTSOCKET srt_accept (SRTSOCKET u, struct sockaddr* addr, int* addrlen);
SRT_API SRTSOCKET srt_accept_bond (const SRTSOCKET listeners[], int lsize, int64_t msTimeOut);
typedef int srt_listen_callback_fn (void* opaq, SRTSOCKET ns, int hsversion, const struct sockaddr* peeraddr, const char* streamid);
SRT_API int srt_listen_callback(SRTSOCKET lsn, srt_listen_callback_fn* hook_fn, void* hook_opaque);
typedef void srt_connect_callback_fn (void* opaq, SRTSOCKET ns, int errorcode, const struct sockaddr* peeraddr, int token);
SRT_API int srt_connect_callback(SRTSOCKET clr, srt_connect_callback_fn* hook_fn, void* hook_opaque);
SRT_API int srt_connect (SRTSOCKET u, const struct sockaddr* name, int namelen);
SRT_API int srt_connect_debug(SRTSOCKET u, const struct sockaddr* name, int namelen, int forced_isn);
SRT_API int srt_connect_bind (SRTSOCKET u, const struct sockaddr* source,
const struct sockaddr* target, int len);
SRT_API int srt_rendezvous (SRTSOCKET u, const struct sockaddr* local_name, int local_namelen,
const struct sockaddr* remote_name, int remote_namelen);
SRT_API int srt_close (SRTSOCKET u);
SRT_API int srt_getpeername (SRTSOCKET u, struct sockaddr* name, int* namelen);
SRT_API int srt_getsockname (SRTSOCKET u, struct sockaddr* name, int* namelen);
SRT_API int srt_getsockopt (SRTSOCKET u, int level , SRT_SOCKOPT optname, void* optval, int* optlen);
SRT_API int srt_setsockopt (SRTSOCKET u, int level , SRT_SOCKOPT optname, const void* optval, int optlen);
SRT_API int srt_getsockflag (SRTSOCKET u, SRT_SOCKOPT opt, void* optval, int* optlen);
SRT_API int srt_setsockflag (SRTSOCKET u, SRT_SOCKOPT opt, const void* optval, int optlen);
typedef struct SRT_MsgCtrl_
{
int flags; int msgttl; int inorder; int boundary; int64_t srctime; int32_t pktseq; int32_t msgno; SRT_SOCKGROUPDATA* grpdata;
size_t grpdata_size;
} SRT_MSGCTRL;
static const int32_t SRT_SEQNO_NONE = -1; static const int32_t SRT_MSGNO_NONE = -1; static const int32_t SRT_MSGNO_CONTROL = 0;
static const int SRT_MSGTTL_INF = -1;
SRT_API void srt_msgctrl_init(SRT_MSGCTRL* mctrl);
SRT_API extern const SRT_MSGCTRL srt_msgctrl_default;
SRT_API int srt_send (SRTSOCKET u, const char* buf, int len);
SRT_API int srt_sendmsg (SRTSOCKET u, const char* buf, int len, int ttl, int inorder);
SRT_API int srt_sendmsg2(SRTSOCKET u, const char* buf, int len, SRT_MSGCTRL *mctrl);
SRT_API int srt_recv (SRTSOCKET u, char* buf, int len);
SRT_API int srt_recvmsg (SRTSOCKET u, char* buf, int len);
SRT_API int srt_recvmsg2(SRTSOCKET u, char *buf, int len, SRT_MSGCTRL *mctrl);
#define SRT_DEFAULT_SENDFILE_BLOCK 364000
#define SRT_DEFAULT_RECVFILE_BLOCK 7280000
SRT_API int64_t srt_sendfile(SRTSOCKET u, const char* path, int64_t* offset, int64_t size, int block);
SRT_API int64_t srt_recvfile(SRTSOCKET u, const char* path, int64_t* offset, int64_t size, int block);
SRT_API const char* srt_getlasterror_str(void);
SRT_API int srt_getlasterror(int* errno_loc);
SRT_API const char* srt_strerror(int code, int errnoval);
SRT_API void srt_clearlasterror(void);
SRT_API int srt_bstats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear);
SRT_API int srt_bistats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear, int instantaneous);
SRT_API SRT_SOCKSTATUS srt_getsockstate(SRTSOCKET u);
SRT_API int srt_epoll_create(void);
SRT_API int srt_epoll_clear_usocks(int eid);
SRT_API int srt_epoll_add_usock(int eid, SRTSOCKET u, const int* events);
SRT_API int srt_epoll_add_ssock(int eid, SYSSOCKET s, const int* events);
SRT_API int srt_epoll_remove_usock(int eid, SRTSOCKET u);
SRT_API int srt_epoll_remove_ssock(int eid, SYSSOCKET s);
SRT_API int srt_epoll_update_usock(int eid, SRTSOCKET u, const int* events);
SRT_API int srt_epoll_update_ssock(int eid, SYSSOCKET s, const int* events);
SRT_API int srt_epoll_wait(int eid, SRTSOCKET* readfds, int* rnum, SRTSOCKET* writefds, int* wnum, int64_t msTimeOut,
SYSSOCKET* lrfds, int* lrnum, SYSSOCKET* lwfds, int* lwnum);
typedef struct SRT_EPOLL_EVENT_STR
{
SRTSOCKET fd;
int events; #ifdef __cplusplus
SRT_EPOLL_EVENT_STR(SRTSOCKET s, int ev): fd(s), events(ev) {}
SRT_EPOLL_EVENT_STR() {} #endif
} SRT_EPOLL_EVENT;
SRT_API int srt_epoll_uwait(int eid, SRT_EPOLL_EVENT* fdsSet, int fdsSize, int64_t msTimeOut);
SRT_API int32_t srt_epoll_set(int eid, int32_t flags);
SRT_API int srt_epoll_release(int eid);
SRT_API void srt_setloglevel(int ll);
SRT_API void srt_addlogfa(int fa);
SRT_API void srt_dellogfa(int fa);
SRT_API void srt_resetlogfa(const int* fara, size_t fara_size);
SRT_API void srt_setloghandler(void* opaque, SRT_LOG_HANDLER_FN* handler);
SRT_API void srt_setlogflags(int flags);
SRT_API int srt_getsndbuffer(SRTSOCKET sock, size_t* blocks, size_t* bytes);
SRT_API int srt_getrejectreason(SRTSOCKET sock);
SRT_API int srt_setrejectreason(SRTSOCKET sock, int value);
SRT_API extern const char* const srt_rejectreason_msg [];
const char* srt_rejectreason_str(int id);
SRT_API uint32_t srt_getversion(void);
SRT_API int64_t srt_time_now(void);
SRT_API int64_t srt_connection_time(SRTSOCKET sock);
#ifdef __cplusplus
}
#endif
#endif