ritoseo 3bb1079674 UI 변경 진행 중
메뉴 버튼 팝업 처리 추가
2025-04-02 10:54:23 +09:00

1876 lines
62 KiB
C

/**
* @file baresip.h Public Interface to Baresip
*
* Copyright (C) 2010 Alfred E. Heggestad
*/
#ifndef BARESIP_H__
#define BARESIP_H__
#ifdef __cplusplus
extern "C" {
#endif
/** Defines the Baresip version string */
#define BARESIP_VERSION "3.19.0"
#ifndef NET_MAX_NS
#define NET_MAX_NS (4)
#endif
/*
* Clock-rate for audio timestamp
*/
#define AUDIO_TIMEBASE 1000000U
/*
* Clock-rate for video timestamp
*/
#define VIDEO_TIMEBASE 1000000U
/* forward declarations */
struct sa;
struct sdp_media;
struct sdp_session;
struct sip_msg;
struct stream;
struct ua;
struct auframe;
struct vidframe;
struct vidrect;
struct vidsz;
/*
* Account
*/
/** Defines the answermodes */
enum answermode {
ANSWERMODE_MANUAL = 0,
ANSWERMODE_EARLY,
ANSWERMODE_AUTO,
ANSWERMODE_EARLY_AUDIO,
ANSWERMODE_EARLY_VIDEO,
};
/** Defines the DTMF send type */
enum dtmfmode {
DTMFMODE_RTP_EVENT = 0,
DTMFMODE_SIP_INFO,
DTMFMODE_AUTO
};
/** SIP auto answer beep modes */
enum sipansbeep {
SIPANSBEEP_OFF,
SIPANSBEEP_ON,
SIPANSBEEP_LOCAL,
};
/** Jitter buffer type */
enum jbuf_type {
JBUF_OFF,
JBUF_FIXED,
JBUF_ADAPTIVE
};
/** Defines the incoming out-of-dialog request mode */
enum inreq_mode {
INREQ_MODE_OFF = 0,
INREQ_MODE_ON,
};
struct account;
int account_alloc(struct account **accp, const char *sipaddr);
int account_debug(struct re_printf *pf, const struct account *acc);
int account_json_api(struct odict *odacc, struct odict *odcfg,
const struct account *acc);
int account_set_auth_user(struct account *acc, const char *user);
int account_set_auth_pass(struct account *acc, const char *pass);
int account_set_outbound(struct account *acc, const char *ob, unsigned ix);
int account_set_sipnat(struct account *acc, const char *sipnat);
int account_set_answermode(struct account *acc, enum answermode mode);
int account_set_rel100_mode(struct account *acc, enum rel100_mode mode);
int account_set_dtmfmode(struct account *acc, enum dtmfmode mode);
int account_set_inreq_mode(struct account *acc, enum inreq_mode mode);
int account_set_display_name(struct account *acc, const char *dname);
int account_set_regint(struct account *acc, uint32_t regint);
int account_set_stun_uri(struct account *acc, const char *uri);
int account_set_stun_host(struct account *acc, const char *host);
int account_set_stun_port(struct account *acc, uint16_t port);
int account_set_stun_user(struct account *acc, const char *user);
int account_set_stun_pass(struct account *acc, const char *pass);
int account_set_ausrc_dev(struct account *acc, const char *dev);
int account_set_auplay_dev(struct account *acc, const char *dev);
int account_set_mediaenc(struct account *acc, const char *mediaenc);
int account_set_medianat(struct account *acc, const char *medianat);
int account_set_audio_codecs(struct account *acc, const char *codecs);
int account_set_video_codecs(struct account *acc, const char *codecs);
int account_set_mwi(struct account *acc, bool value);
int account_set_call_transfer(struct account *acc, bool value);
int account_set_rtcp_mux(struct account *acc, bool value);
void account_set_catchall(struct account *acc, bool value);
int account_auth(const struct account *acc, char **username, char **password,
const char *realm);
struct list *account_aucodecl(const struct account *acc);
struct list *account_vidcodecl(const struct account *acc);
struct sip_addr *account_laddr(const struct account *acc);
struct uri *account_luri(const struct account *acc);
uint32_t account_regint(const struct account *acc);
uint32_t account_fbregint(const struct account *acc);
uint32_t account_pubint(const struct account *acc);
uint32_t account_ptime(const struct account *acc);
uint32_t account_prio(const struct account *acc);
enum answermode account_answermode(const struct account *acc);
enum rel100_mode account_rel100_mode(const struct account *acc);
enum dtmfmode account_dtmfmode(const struct account *acc);
enum inreq_mode account_inreq_mode(const struct account *acc);
const char *account_display_name(const struct account *acc);
const char *account_aor(const struct account *acc);
const char *account_auth_user(const struct account *acc);
const char *account_auth_pass(const struct account *acc);
const char *account_outbound(const struct account *acc, unsigned ix);
const char *account_sipnat(const struct account *acc);
const char *account_stun_user(const struct account *acc);
const char *account_stun_pass(const struct account *acc);
const char *account_stun_host(const struct account *acc);
const struct stun_uri *account_stun_uri(const struct account *acc);
uint16_t account_stun_port(const struct account *acc);
const char *account_mediaenc(const struct account *acc);
const char *account_medianat(const struct account *acc);
bool account_mwi(const struct account *acc);
bool account_call_transfer(const struct account *acc);
bool account_rtcp_mux(const struct account *acc);
const char *account_extra(const struct account *acc);
int account_uri_complete_strdup(const struct account *acc, char **strp,
const struct pl *uri);
int account_uri_complete(const struct account *acc, struct mbuf *buf,
const char *uri);
int account_answerdelay(const struct account *acc);
void account_set_answerdelay(struct account *acc, int adelay);
bool account_sip_autoanswer(const struct account *acc);
void account_set_sip_autoanswer(struct account *acc, bool allow);
bool account_sip_autoredirect(const struct account *acc);
void account_set_sip_autoredirect(struct account *acc, bool allow);
enum sipansbeep account_sipansbeep(const struct account *acc);
void account_set_sipansbeep(struct account *acc, enum sipansbeep beep);
void account_set_autelev_pt(struct account *acc, uint32_t pt);
uint32_t account_autelev_pt(struct account *acc);
const char* account_uas_user(const struct account *acc);
const char* account_uas_pass(const struct account *acc);
bool account_uas_isset(const struct account *acc);
/*
* Call
*/
enum call_event {
CALL_EVENT_INCOMING,
CALL_EVENT_OUTGOING,
CALL_EVENT_RINGING,
CALL_EVENT_PROGRESS,
CALL_EVENT_ANSWERED,
CALL_EVENT_ESTABLISHED,
CALL_EVENT_CLOSED,
CALL_EVENT_TRANSFER,
CALL_EVENT_TRANSFER_FAILED,
CALL_EVENT_MENC,
};
/** Call States */
enum call_state {
CALL_STATE_IDLE = 0,
CALL_STATE_INCOMING,
CALL_STATE_OUTGOING,
CALL_STATE_RINGING,
CALL_STATE_EARLY,
CALL_STATE_ESTABLISHED,
CALL_STATE_TERMINATED,
CALL_STATE_TRANSFER,
CALL_STATE_UNKNOWN
};
/** Supported tags */
enum supported_tags {
REPLACES = 1,
};
/** Video mode */
enum vidmode {
VIDMODE_OFF = 0, /**< Video disabled */
VIDMODE_ON, /**< Video enabled */
};
struct call;
typedef void (call_event_h)(struct call *call, enum call_event ev,
const char *str, void *arg);
typedef void (call_dtmf_h)(struct call *call, char key, void *arg);
typedef bool (call_match_h)(const struct call *call, void *arg);
typedef void (call_list_h)(struct call *call, void *arg);
int call_connect(struct call *call, const struct pl *paddr);
int call_answer(struct call *call, uint16_t scode, enum vidmode vmode);
int call_progress_dir(struct call *call,
enum sdp_dir adir, enum sdp_dir vdir);
int call_progress(struct call *call);
void call_hangup(struct call *call, uint16_t scode, const char *reason);
void call_hangupf(struct call *call, uint16_t scode, const char *reason,
const char *fmt, ...);
int call_modify(struct call *call);
int call_hold(struct call *call, bool hold);
void call_set_audio_ldir(struct call *call, enum sdp_dir dir);
void call_set_video_ldir(struct call *call, enum sdp_dir dir);
int call_set_video_dir(struct call *call, enum sdp_dir dir);
int call_update_media(struct call *call);
int call_send_digit(struct call *call, char key);
bool call_has_audio(const struct call *call);
bool call_has_video(const struct call *call);
bool call_early_video_available(const struct call *call);
bool call_refresh_allowed(const struct call *call);
bool call_ack_pending(const struct call *call);
bool call_sess_cmp(const struct call *call, const struct sip_msg *msg);
int call_transfer(struct call *call, const char *uri);
int call_replace_transfer(struct call *target_call, struct call *source_call);
int call_status(struct re_printf *pf, const struct call *call);
int call_debug(struct re_printf *pf, const struct call *call);
int call_notify_sipfrag(struct call *call, uint16_t scode,
const char *reason, ...);
void call_set_handlers(struct call *call, call_event_h *eh,
call_dtmf_h *dtmfh, void *arg);
struct account *call_account(const struct call *call);
uint16_t call_scode(const struct call *call);
enum call_state call_state(const struct call *call);
uint32_t call_duration(const struct call *call);
uint32_t call_setup_duration(const struct call *call);
const char *call_id(const struct call *call);
const char *call_peeruri(const struct call *call);
const char *call_peername(const struct call *call);
const char *call_localuri(const struct call *call);
const char *call_alerturi(const struct call *call);
const char *call_diverteruri(const struct call *call);
struct audio *call_audio(const struct call *call);
struct video *call_video(const struct call *call);
struct list *call_streaml(const struct call *call);
struct ua *call_get_ua(const struct call *call);
bool call_is_onhold(const struct call *call);
bool call_is_outgoing(const struct call *call);
void call_enable_rtp_timeout(struct call *call, uint32_t timeout_ms);
uint32_t call_linenum(const struct call *call);
int32_t call_answer_delay(const struct call *call);
void call_set_answer_delay(struct call *call, int32_t adelay);
struct call *call_find_linenum(const struct list *calls, uint32_t linenum);
struct call *call_find_id(const struct list *calls, const char *id);
void call_set_current(struct list *calls, struct call *call);
const struct list *call_get_custom_hdrs(const struct call *call);
void call_set_media_direction(struct call *call, enum sdp_dir a,
enum sdp_dir v);
void call_set_mdir(struct call *call, enum sdp_dir a, enum sdp_dir v);
void call_get_mdir(struct call *call, enum sdp_dir *ap, enum sdp_dir *vp);
void call_set_media_estdir(struct call *call, enum sdp_dir a, enum sdp_dir v);
void call_start_answtmr(struct call *call, uint32_t ms);
bool call_supported(struct call *call, uint16_t tags);
const char *call_user_data(const struct call *call);
int call_set_user_data(struct call *call, const char *user_data);
void call_set_evstop(struct call *call, bool stop);
bool call_is_evstop(struct call *call);
int call_msg_src(const struct call *call, struct sa *sa);
enum sip_transp call_transp(const struct call *call);
enum sdp_neg_state call_sdp_neg_state(const struct call *call);
bool call_sdp_change_allowed(const struct call *call);
/*
* Custom headers
*/
typedef int (custom_hdrs_h)(const struct pl *name, const struct pl *val,
void *arg); /* returns error code if any */
int custom_hdrs_add(struct list *hdrs, const char *name, const char *fmt, ...);
int custom_hdrs_apply(const struct list *hdrs, custom_hdrs_h *h, void *arg);
/*
* Conf (utils)
*/
/** A range of numbers */
struct range {
uint32_t min; /**< Minimum number */
uint32_t max; /**< Maximum number */
};
/** Defines the configuration line handler */
typedef int (confline_h)(const struct pl *addr, void *arg);
int conf_configure(void);
int conf_configure_buf(const uint8_t *buf, size_t sz);
int conf_modules(void);
int conf_path_set(const char *path);
int conf_path_get(char *path, size_t sz);
int conf_parse(const char *filename, confline_h *ch, void *arg);
int conf_get_range(const struct conf *conf, const char *name,
struct range *rng);
int conf_get_vidsz(const struct conf *conf, const char *name,
struct vidsz *sz);
int conf_get_sa(const struct conf *conf, const char *name, struct sa *sa);
enum jbuf_type conf_get_jbuf_type(const struct pl *pl);
bool conf_aubuf_adaptive(const struct pl *pl);
void conf_close(void);
struct conf *conf_cur(void);
int conf_loadfile(struct mbuf **mbp, const char *filename);
const char *fs_file_extension(const char *filename);
/*
* Config (core configuration)
*/
static inline bool in_range(const struct range *rng, uint32_t val)
{
return rng ? (val >= rng->min && val <= rng->max) : false;
}
/** Audio transmit mode */
enum audio_mode {
AUDIO_MODE_POLL = 0, /**< Polling mode */
AUDIO_MODE_THREAD, /**< Use dedicated thread */
};
/** RTP receive mode */
enum rtp_receive_mode {
RECEIVE_MODE_MAIN = 0, /**< RTP RX is processed in main thread */
RECEIVE_MODE_THREAD, /**< RTP RX is processed in separate thread */
};
enum rtp_receive_mode resolve_receive_mode(const struct pl *fmt);
const char *rtp_receive_mode_str(enum rtp_receive_mode rxmode);
/** SIP User-Agent */
struct config_sip {
char uuid[64]; /**< Universally Unique Identifier */
char local[64]; /**< Local SIP Address */
char cert[256]; /**< SIP Certificate */
char cafile[256]; /**< SIP CA-file */
char capath[256]; /**< SIP CA-path */
uint32_t transports; /**< Supported transports mask */
enum sip_transp transp; /**< Default outgoing SIP transport protocol */
bool verify_server; /**< Enable SIP TLS verify server */
bool verify_client; /**< Enable SIP TLS verify client */
enum tls_resume_mode tls_resume; /** TLS resumption mode */
uint8_t tos; /**< Type-of-Service for SIP */
uint32_t reg_filt; /**< Registrar filter transport mask*/
};
/** Call config */
struct config_call {
uint32_t local_timeout; /**< Incoming call timeout [sec] 0=off */
uint32_t max_calls; /**< Maximum number of calls, 0=unlimited */
bool hold_other_calls; /**< Hold other calls */
bool accept; /**< Accept call by baresip core */
};
/** Audio */
struct config_audio {
char audio_path[256]; /**< Audio file directory */
char src_mod[16]; /**< Audio source module */
char src_dev[128]; /**< Audio source device */
char play_mod[16]; /**< Audio playback module */
char play_dev[128]; /**< Audio playback device */
char alert_mod[16]; /**< Audio alert module */
char alert_dev[128]; /**< Audio alert device */
uint32_t srate_play; /**< Opt. sampling rate for player */
uint32_t srate_src; /**< Opt. sampling rate for source */
uint32_t channels_play; /**< Opt. channels for player */
uint32_t channels_src; /**< Opt. channels for source */
enum audio_mode txmode; /**< Audio transmit mode */
bool level; /**< Enable audio level indication */
int src_fmt; /**< Audio source sample format */
int play_fmt; /**< Audio playback sample format */
int enc_fmt; /**< Audio encoder sample format */
int dec_fmt; /**< Audio decoder sample format */
struct range buffer; /**< Audio receive buffer in [ms] */
bool adaptive; /**< Enable adaptive audio buffer */
double silence; /**< Silence volume in [dB] */
uint32_t telev_pt; /**< Payload type for tel.-event */
};
/** Video */
struct config_video {
char src_mod[16]; /**< Video source module */
char src_dev[128]; /**< Video source device */
char disp_mod[16]; /**< Video display module */
char disp_dev[128]; /**< Video display device */
unsigned width, height; /**< Video resolution */
uint32_t bitrate; /**< Encoder bitrate in [bit/s] */
uint32_t send_bitrate; /**< Sender bitrate in [bit/s] */
uint32_t burst_bits; /**< Number of Burst bits */
double fps; /**< Video framerate */
bool fullscreen; /**< Enable fullscreen display */
int enc_fmt; /**< Encoder pixelfmt (enum vidfmt) */
};
/** Audio/Video Transport */
struct config_avt {
uint8_t rtp_tos; /**< Type-of-Service for outg. RTP */
uint8_t rtpv_tos; /**< TOS for outg. video RTP */
struct range rtp_ports; /**< RTP port range */
struct range rtp_bw; /**< RTP Bandwidth range [bit/s] */
bool rtcp_mux; /**< RTP/RTCP multiplexing */
struct {
enum jbuf_type jbtype; /**< Jitter buffer type */
struct range jbuf_del; /**< Delay, number of frames*/
} audio;
struct {
enum jbuf_type jbtype; /**< Jitter buffer type */
struct range jbuf_del; /**< Delay, number of frames*/
} video;
bool rtp_stats; /**< Enable RTP statistics */
uint32_t rtp_timeout; /**< RTP Timeout in seconds (0=off) */
bool bundle; /**< Media Multiplexing (BUNDLE) */
enum rtp_receive_mode rxmode; /**< RTP RX processing mode */
};
/** Network Configuration */
struct config_net {
int af; /**< AF_UNSPEC, AF_INET or AF_INET6 */
char ifname[64]; /**< Bind to interface (optional) */
struct {
char addr[64];
bool fallback;
} nsv[NET_MAX_NS]; /**< Configured DNS nameservers */
size_t nsc; /**< Number of DNS nameservers */
bool use_linklocal; /**< Use v4/v6 link-local addresses */
bool use_getaddrinfo; /**< Use getaddrinfo for A/AAAA records */
};
/** Core configuration */
struct config {
struct config_sip sip;
struct config_call call;
struct config_audio audio;
struct config_video video;
struct config_avt avt;
struct config_net net;
};
int config_parse_conf(struct config *cfg, const struct conf *conf);
int config_print(struct re_printf *pf, const struct config *cfg);
int config_write_template(const char *file, const struct config *cfg);
struct config *conf_config(void);
/*
* Contact
*/
enum presence_status {
PRESENCE_UNKNOWN,
PRESENCE_OPEN,
PRESENCE_CLOSED,
PRESENCE_BUSY
};
struct contact;
typedef void (contact_update_h)(struct contact *c, bool removed, void *arg);
struct contacts;
int contact_init(struct contacts **contactsp);
int contact_add(struct contacts *contacts,
struct contact **contactp, const struct pl *addr);
void contact_remove(struct contacts *contacts, struct contact *c);
void contacts_enable_presence(struct contacts *contacts, bool enabled);
void contact_set_update_handler(struct contacts *contacs,
contact_update_h *updateh, void *arg);
int contact_print(struct re_printf *pf, const struct contact *cnt);
int contacts_print(struct re_printf *pf, const struct contacts *contacts);
enum presence_status contact_presence(const struct contact *c);
void contact_set_presence(struct contact *c, enum presence_status status);
bool contact_block_access(const struct contacts *contacts, const char *uri);
struct contact *contact_find(const struct contacts *contacts,
const char *uri);
struct sip_addr *contact_addr(const struct contact *c);
struct list *contact_list(const struct contacts *contacts);
const char *contact_str(const struct contact *c);
const char *contact_uri(const struct contact *c);
const char *contact_presence_str(enum presence_status status);
struct le *contact_le(struct contact *cnt);
void contacts_set_current(struct contacts *contacts, struct contact *cnt);
struct contact *contacts_current(const struct contacts *contacts);
/*
* Media Device
*/
/** Defines a media device */
struct mediadev {
struct le le;
char *name;
/* Generic: */
struct {
uint32_t channels;
bool is_default;
} src, play;
/* Module/driver specific: */
int host_index;
int device_index;
};
int mediadev_add(struct list *dev_list, const char *name);
struct mediadev *mediadev_find(const struct list *dev_list, const char *name);
struct mediadev *mediadev_get_default(const struct list *dev_list);
int mediadev_print(struct re_printf *pf, const struct list *dev_list);
/*
* Message
*/
typedef void (message_recv_h)(struct ua *ua, const struct pl *peer,
const struct pl *ctype,
struct mbuf *body, void *arg);
struct message;
int message_init(struct message **messagep);
int message_listen(struct message *message,
message_recv_h *h, void *arg);
void message_unlisten(struct message *message, message_recv_h *recvh);
int message_send(struct ua *ua, const char *peer, const char *msg,
sip_resp_h *resph, void *arg);
int message_encode_dict(struct odict *od, struct account *acc,
const struct pl *peer, const struct pl *ctype,
struct mbuf *body);
/*
* Audio Source
*/
struct ausrc;
struct ausrc_st;
/** Audio Source parameters */
struct ausrc_prm {
uint32_t srate; /**< Sampling rate in [Hz] */
uint8_t ch; /**< Number of channels */
uint32_t ptime; /**< Wanted packet-time in [ms] */
int fmt; /**< Sample format (enum aufmt) */
size_t duration; /**< Duration in [ms], 0 for infinite */
};
typedef void (ausrc_read_h)(struct auframe *af, void *arg);
typedef void (ausrc_error_h)(int err, const char *str, void *arg);
typedef int (ausrc_alloc_h)(struct ausrc_st **stp, const struct ausrc *ausrc,
struct ausrc_prm *prm, const char *device,
ausrc_read_h *rh, ausrc_error_h *errh, void *arg);
typedef int (ausrc_info_h)(const struct ausrc *ausrc,
struct ausrc_prm *prm, const char *device);
/** Defines an Audio Source */
struct ausrc {
struct le le;
const char *name;
struct list dev_list;
ausrc_alloc_h *alloch;
ausrc_info_h *infoh;
};
int ausrc_register(struct ausrc **asp, struct list *ausrcl, const char *name,
ausrc_alloc_h *alloch);
const struct ausrc *ausrc_find(const struct list *ausrcl, const char *name);
int ausrc_alloc(struct ausrc_st **stp, struct list *ausrcl,
const char *name,
struct ausrc_prm *prm, const char *device,
ausrc_read_h *rh, ausrc_error_h *errh, void *arg);
int ausrc_info(struct list *ausrcl,
const char *name, struct ausrc_prm *prm, const char *device);
/*
* Audio Player
*/
struct auplay;
struct auplay_st;
/** Audio Player parameters */
struct auplay_prm {
uint32_t srate; /**< Sampling rate in [Hz] */
uint8_t ch; /**< Number of channels */
uint32_t ptime; /**< Wanted packet-time in [ms] */
int fmt; /**< Sample format (enum aufmt) */
};
typedef void (auplay_write_h)(struct auframe *af, void *arg);
typedef int (auplay_alloc_h)(struct auplay_st **stp, const struct auplay *ap,
struct auplay_prm *prm, const char *device,
auplay_write_h *wh, void *arg);
/** Defines an Audio Player */
struct auplay {
struct le le;
const char *name;
struct list dev_list;
auplay_alloc_h *alloch;
};
int auplay_register(struct auplay **pp, struct list *auplayl,
const char *name, auplay_alloc_h *alloch);
const struct auplay *auplay_find(const struct list *auplayl, const char *name);
int auplay_alloc(struct auplay_st **stp, struct list *auplayl,
const char *name,
struct auplay_prm *prm, const char *device,
auplay_write_h *wh, void *arg);
/*
* Audio Filter
*/
struct aufilt;
/* Base class */
struct aufilt_enc_st {
const struct aufilt *af;
struct le le;
};
struct aufilt_dec_st {
const struct aufilt *af;
struct le le;
};
/** Audio Filter Parameters */
struct aufilt_prm {
uint32_t srate; /**< Sampling rate in [Hz] */
uint8_t ch; /**< Number of channels */
int fmt; /**< Sample format (enum aufmt) */
};
typedef int (aufilt_encupd_h)(struct aufilt_enc_st **stp, void **ctx,
const struct aufilt *af, struct aufilt_prm *prm,
const struct audio *au);
typedef int (aufilt_encode_h)(struct aufilt_enc_st *st,
struct auframe *af);
typedef int (aufilt_decupd_h)(struct aufilt_dec_st **stp, void **ctx,
const struct aufilt *af, struct aufilt_prm *prm,
const struct audio *au);
typedef int (aufilt_decode_h)(struct aufilt_dec_st *st,
struct auframe *af);
struct aufilt {
struct le le;
const char *name;
bool enabled;
aufilt_encupd_h *encupdh;
aufilt_encode_h *ench;
aufilt_decupd_h *decupdh;
aufilt_decode_h *dech;
};
void aufilt_register(struct list *aufiltl, struct aufilt *af);
void aufilt_unregister(struct aufilt *af);
void aufilt_enable(struct list *aufiltl, const char *name, bool enable);
/*
* Log
*/
enum log_level {
LEVEL_DEBUG = 0,
LEVEL_INFO,
LEVEL_WARN,
LEVEL_ERROR,
};
typedef void (log_h)(uint32_t level, const char *msg);
struct log {
struct le le;
log_h *h;
};
void log_register_handler(struct log *logh);
void log_unregister_handler(struct log *logh);
void log_level_set(enum log_level level);
enum log_level log_level_get(void);
const char *log_level_name(enum log_level level);
void log_enable_debug(bool enable);
void log_enable_info(bool enable);
void log_enable_stdout(bool enable);
void log_enable_timestamps(bool enable);
void log_enable_color(bool enable);
void vlog(enum log_level level, const char *fmt, va_list ap);
void loglv(enum log_level level, const char *fmt, ...);
void debug(const char *fmt, ...);
void info(const char *fmt, ...);
void warning(const char *fmt, ...);
/*
* Menc - Media encryption (for RTP)
*/
struct menc;
struct menc_sess;
struct menc_media;
/** Defines a media encryption event */
enum menc_event {
MENC_EVENT_SECURE, /**< Media is secured */
MENC_EVENT_VERIFY_REQUEST, /**< Request user to verify a code */
MENC_EVENT_PEER_VERIFIED, /**< Peer was verified successfully */
};
typedef void (menc_event_h)(enum menc_event event, const char *prm,
struct stream *strm, void *arg);
typedef void (menc_error_h)(int err, void *arg);
typedef int (menc_sess_h)(struct menc_sess **sessp, struct sdp_session *sdp,
bool offerer, menc_event_h *eventh,
menc_error_h *errorh, void *arg);
typedef int (menc_media_h)(struct menc_media **mp, struct menc_sess *sess,
struct rtp_sock *rtp,
struct udp_sock *rtpsock, struct udp_sock *rtcpsock,
const struct sa *raddr_rtp,
const struct sa *raddr_rtcp,
struct sdp_media *sdpm,
const struct stream *strm);
typedef int (menc_txrekey_h)(struct menc_media *m);
struct menc {
struct le le;
const char *id;
const char *sdp_proto;
bool wait_secure;
menc_sess_h *sessh;
menc_media_h *mediah;
menc_txrekey_h *txrekeyh;
};
void menc_register(struct list *mencl, struct menc *menc);
void menc_unregister(struct menc *menc);
const struct menc *menc_find(const struct list *mencl, const char *id);
const char *menc_event_name(enum menc_event event);
/*
* Net - Networking
*/
struct network;
typedef void (net_change_h)(void *arg);
int net_alloc(struct network **netp, const struct config_net *cfg);
int net_use_nameserver(struct network *net,
const struct sa *srvv, size_t srvc);
int net_set_address(struct network *net, const struct sa *ip);
int net_add_address(struct network *net, const struct sa *ip);
int net_add_address_ifname(struct network *net, const struct sa *sa,
const char *ifname);
int net_flush_addresses(struct network *net);
int net_rm_address(struct network *net, const struct sa *ip);
bool net_af_enabled(const struct network *net, int af);
int net_set_af(struct network *net, int af);
void net_dns_refresh(struct network *net);
int net_dns_debug(struct re_printf *pf, const struct network *net);
int net_debug(struct re_printf *pf, const struct network *net);
bool net_laddr_apply(const struct network *net, net_ifaddr_h *ifh, void *arg);
bool net_ifaddr_filter(const struct network *net, const char *ifname,
const struct sa *sa);
const struct sa *net_laddr_af(const struct network *net, int af);
const struct sa *net_laddr_for(const struct network *net,
const struct sa *dst);
bool net_is_laddr(const struct network *net, struct sa *sa);
int net_set_dst_scopeid(const struct network *net, struct sa *dst);
struct dnsc *net_dnsc(const struct network *net);
int net_set_dnsc(struct network *net, struct dnsc *dnsc);
/*
* Play - audio file player
*/
struct play;
struct player;
typedef void (play_finish_h)(struct play *play, void *arg);
int play_file(struct play **playp, struct player *player,
const char *filename, int repeat,
const char *play_mod, const char *play_dev);
int play_tone(struct play **playp, struct player *player,
struct mbuf *tone,
uint32_t srate, uint8_t ch, int repeat,
const char *play_mod, const char *play_dev);
void play_set_finish_handler(struct play *play, play_finish_h *fh, void *arg);
int play_init(struct player **playerp);
void play_set_path(struct player *player, const char *path);
/*
* User Agent
*/
struct ua;
/** Events from User-Agent */
enum ua_event {
UA_EVENT_REGISTERING = 0,
UA_EVENT_REGISTER_OK,
UA_EVENT_REGISTER_FAIL,
UA_EVENT_UNREGISTERING,
UA_EVENT_FALLBACK_OK,
UA_EVENT_FALLBACK_FAIL,
UA_EVENT_MWI_NOTIFY,
UA_EVENT_CREATE,
UA_EVENT_SHUTDOWN,
UA_EVENT_EXIT,
UA_EVENT_CALL_INCOMING,
UA_EVENT_CALL_OUTGOING,
UA_EVENT_CALL_RINGING,
UA_EVENT_CALL_PROGRESS,
UA_EVENT_CALL_ANSWERED,
UA_EVENT_CALL_ESTABLISHED,
UA_EVENT_CALL_CLOSED,
UA_EVENT_CALL_TRANSFER,
UA_EVENT_CALL_REDIRECT,
UA_EVENT_CALL_TRANSFER_FAILED,
UA_EVENT_CALL_DTMF_START,
UA_EVENT_CALL_DTMF_END,
UA_EVENT_CALL_RTPESTAB,
UA_EVENT_CALL_RTCP,
UA_EVENT_CALL_MENC,
UA_EVENT_VU_TX,
UA_EVENT_VU_RX,
UA_EVENT_AUDIO_ERROR,
UA_EVENT_CALL_LOCAL_SDP, /**< param: offer or answer */
UA_EVENT_CALL_REMOTE_SDP, /**< param: offer or answer */
UA_EVENT_CALL_HOLD, /**< Call put on-hold by peer */
UA_EVENT_CALL_RESUME, /**< Call resumed by peer */
UA_EVENT_REFER,
UA_EVENT_MODULE,
UA_EVENT_END_OF_FILE,
UA_EVENT_CUSTOM,
UA_EVENT_SIPSESS_CONN,
UA_EVENT_MAX,
};
struct bevent;
/** SIP auto answer method */
enum answer_method {
ANSM_NONE = 0,
ANSM_RFC5373,
ANSM_CALLINFO,
ANSM_ALERTINFO,
};
/** Defines the User-Agent event handler */
typedef void (ua_event_h)(struct ua *ua, enum ua_event ev,
struct call *call, const char *prm, void *arg);
typedef void (bevent_h)(enum ua_event ev, struct bevent *event, void *arg);
typedef void (options_resp_h)(int err, const struct sip_msg *msg, void *arg);
typedef void (refer_resp_h)(int err, const struct sip_msg *msg, void *arg);
typedef void (ua_exit_h)(void *arg);
/* Multiple instances */
int ua_alloc(struct ua **uap, const char *aor);
int ua_connect(struct ua *ua, struct call **callp,
const char *from_uri, const char *req_uri,
enum vidmode vmode);
int ua_connect_dir(struct ua *ua, struct call **callp,
const char *from_uri, const char *req_uri,
enum vidmode vmode, enum sdp_dir adir, enum sdp_dir vdir);
void ua_hangup(struct ua *ua, struct call *call,
uint16_t scode, const char *reason);
void ua_hangupf(struct ua *ua, struct call *call,
uint16_t scode, const char *reason, const char *fmt, ...);
int ua_accept(struct ua *ua, const struct sip_msg *msg);
int ua_answer(struct ua *ua, struct call *call, enum vidmode vmode);
int ua_hold_answer(struct ua *ua, struct call *call, enum vidmode vmode);
int ua_options_send(struct ua *ua, const char *uri,
options_resp_h *resph, void *arg);
int ua_refer_send(struct ua *ua, const char *uri, const char *referto,
refer_resp_h *resph, void *arg);
int ua_debug(struct re_printf *pf, const struct ua *ua);
int ua_state_json_api(struct odict *od, const struct ua *ua);
int ua_print_calls(struct re_printf *pf, const struct ua *ua);
int ua_print_status(struct re_printf *pf, const struct ua *ua);
int ua_print_supported(struct re_printf *pf, const struct ua *ua);
int ua_update_account(struct ua *ua);
int ua_register(struct ua *ua);
int ua_fallback(struct ua *ua);
void ua_unregister(struct ua *ua);
void ua_stop_register(struct ua *ua);
bool ua_isregistered(const struct ua *ua);
bool ua_regfailed(const struct ua *ua);
unsigned ua_destroy(struct ua *ua);
void ua_pub_gruu_set(struct ua *ua, const struct pl *pval);
const char *ua_cuser(const struct ua *ua);
const char *ua_local_cuser(const struct ua *ua);
struct account *ua_account(const struct ua *ua);
const char *ua_outbound(const struct ua *ua);
struct call *ua_call(const struct ua *ua);
struct list *ua_calls(const struct ua *ua);
enum presence_status ua_presence_status(const struct ua *ua);
void ua_presence_status_set(struct ua *ua, enum presence_status status);
void ua_set_catchall(struct ua *ua, bool enabled);
int ua_add_xhdr_filter(struct ua *ua, const char *hdr_name);
int ua_set_custom_hdrs(struct ua *ua, struct list *custom_hdrs);
int ua_add_custom_hdr(struct ua *ua, const struct pl *name,
const struct pl *value);
int ua_rm_custom_hdr(struct ua *ua, struct pl *name);
int ua_enable_autoanswer(struct ua *ua, int32_t adelay,
enum answer_method met);
int ua_disable_autoanswer(struct ua *ua, enum answer_method met);
int ua_call_alloc(struct call **callp, struct ua *ua,
enum vidmode vidmode, const struct sip_msg *msg,
struct call *xcall, const char *local_uri,
bool use_rtp);
struct call *ua_find_call_state(const struct ua *ua, enum call_state st);
struct call *ua_find_call_msg(struct ua *ua, const struct sip_msg *msg);
int ua_raise(struct ua *ua);
int ua_set_autoanswer_value(struct ua *ua, const char *value);
void ua_add_extension(struct ua *ua, const char *extension);
void ua_remove_extension(struct ua *ua, const char *extension);
bool ua_req_allowed(const struct ua *ua, const struct sip_msg *msg);
bool ua_req_check_origin(const struct ua *ua, const struct sip_msg *msg);
/* One instance */
int ua_init(const char *software, bool udp, bool tcp, bool tls);
void ua_close(void);
void ua_stop_all(bool forced);
int uag_hold_resume(struct call *call);
int uag_hold_others(struct call *call);
void uag_set_nodial(bool nodial);
bool uag_nodial(void);
void uag_set_exit_handler(ua_exit_h *exith, void *arg);
void uag_enable_sip_trace(bool enable);
int uag_reset_transp(bool reg, bool reinvite);
void uag_set_sub_handler(sip_msg_h *subh);
int uag_set_extra_params(const char *eprm);
int uag_enable_transport(enum sip_transp tp, bool en);
struct ua *uag_find(const struct pl *cuser);
struct ua *uag_find_msg(const struct sip_msg *msg);
struct ua *uag_find_aor(const char *aor);
struct ua *uag_find_param(const char *name, const char *val);
struct ua *uag_find_requri_pl(const struct pl *requri);
struct ua *uag_find_requri(const char *requri);
struct sip *uag_sip(void);
struct list *uag_list(void);
uint32_t uag_call_count(void);
struct tls *uag_tls(void);
struct sipsess_sock *uag_sipsess_sock(void);
struct sipevent_sock *uag_sipevent_sock(void);
struct call *uag_call_find(const char *id);
void uag_filter_calls(call_list_h *listh, call_match_h *matchh, void *arg);
/*
* User Interface
*/
struct ui_sub {
struct list uil; /**< List of UIs (struct ui) */
struct cmd_ctx *uictx; /**< Command context */
};
typedef int (ui_output_h)(const char *str);
/** Defines a User-Interface module */
struct ui {
struct le le; /**< Linked-list element */
const char *name; /**< Name of the UI-module */
ui_output_h *outputh; /**< Handler for output strings (optional) */
};
void ui_register(struct ui_sub *uis, struct ui *ui);
void ui_unregister(struct ui *ui);
void ui_reset(struct ui_sub *uis);
void ui_input_key(struct ui_sub *uis, char key, struct re_printf *pf);
void ui_input_str(const char *str);
int ui_input_pl(struct re_printf *pf, const struct pl *pl);
int ui_input_long_command(struct re_printf *pf, const struct pl *pl);
void ui_output(struct ui_sub *uis, const char *fmt, ...);
bool ui_isediting(const struct ui_sub *uis);
int ui_password_prompt(char **passwordp);
/*
* Command interface
*/
/* special keys */
#define KEYCODE_NONE (0x00) /* No key */
#define KEYCODE_REL (0x04) /* Key was released */
#define KEYCODE_ESC (0x1b) /* Escape key */
/** Command flags */
enum {
CMD_PRM = (1<<0), /**< Command with parameter */
};
/** Command arguments */
struct cmd_arg {
char key; /**< Which key was pressed */
char *prm; /**< Optional parameter */
void *data; /**< Application data */
};
/** Defines a command */
struct cmd {
const char *name; /**< Long command */
char key; /**< Short command */
int flags; /**< Optional command flags */
const char *desc; /**< Description string */
re_printf_h *h; /**< Command handler */
};
struct cmd_ctx;
struct commands;
int cmd_init(struct commands **commandsp);
int cmd_register(struct commands *commands,
const struct cmd *cmdv, size_t cmdc);
void cmd_unregister(struct commands *commands, const struct cmd *cmdv);
int cmd_process(struct commands *commands, struct cmd_ctx **ctxp, char key,
struct re_printf *pf, void *data);
int cmd_process_long(struct commands *commands, const char *str, size_t len,
struct re_printf *pf_resp, void *data);
int cmd_print(struct re_printf *pf, const struct commands *commands);
const struct cmd *cmd_find_long(const struct commands *commands,
const char *name);
struct cmds *cmds_find(const struct commands *commands,
const struct cmd *cmdv);
/*
* Video Source
*/
struct vidsrc;
struct vidsrc_st;
/** Video Source parameters */
struct vidsrc_prm {
double fps; /**< Wanted framerate */
int fmt; /**< Wanted pixel format (enum vidfmt) */
};
struct vidpacket {
uint8_t *buf; /**< Buffer memory */
size_t size; /**< Size of buffer */
uint64_t timestamp; /**< Timestamp in VIDEO_TIMEBASE units */
bool keyframe; /**< True=keyframe, False=deltaframe */
bool picup; /**< Picture update requested */
};
/* Declare function pointer */
typedef void (vidsrc_packet_h)(struct vidpacket *packet, void *arg);
/**
* Provides video frames to the core
*
* @param frame Video frame
* @param timestamp Frame timestamp in VIDEO_TIMEBASE units
* @param arg Handler argument
*/
typedef void (vidsrc_frame_h)(struct vidframe *frame, uint64_t timestamp,
void *arg);
typedef void (vidsrc_error_h)(int err, void *arg);
typedef int (vidsrc_alloc_h)(struct vidsrc_st **vsp, const struct vidsrc *vs,
struct vidsrc_prm *prm,
const struct vidsz *size,
const char *fmt, const char *dev,
vidsrc_frame_h *frameh,
vidsrc_packet_h *packeth,
vidsrc_error_h *errorh, void *arg);
typedef void (vidsrc_update_h)(struct vidsrc_st *st, struct vidsrc_prm *prm,
const char *dev);
/** Defines a video source */
struct vidsrc {
struct le le;
const char *name;
struct list dev_list;
vidsrc_alloc_h *alloch;
vidsrc_update_h *updateh;
};
int vidsrc_register(struct vidsrc **vp, struct list *vidsrcl, const char *name,
vidsrc_alloc_h *alloch, vidsrc_update_h *updateh);
const struct vidsrc *vidsrc_find(const struct list *vidsrcl, const char *name);
int vidsrc_alloc(struct vidsrc_st **stp, struct list *vidsrcl,
const char *name,
struct vidsrc_prm *prm,
const struct vidsz *size, const char *fmt, const char *dev,
vidsrc_frame_h *frameh, vidsrc_packet_h *packeth,
vidsrc_error_h *errorh, void *arg);
/*
* Video Display
*/
struct vidisp;
struct vidisp_st;
/** Video Display parameters */
struct vidisp_prm {
bool fullscreen; /**< Enable fullscreen display */
};
typedef void (vidisp_resize_h)(const struct vidsz *size, void *arg);
typedef int (vidisp_alloc_h)(struct vidisp_st **vp,
const struct vidisp *vd, struct vidisp_prm *prm,
const char *dev,
vidisp_resize_h *resizeh, void *arg);
typedef int (vidisp_update_h)(struct vidisp_st *st, bool fullscreen,
int orient, const struct vidrect *window);
typedef int (vidisp_disp_h)(struct vidisp_st *st, const char *title,
const struct vidframe *frame, uint64_t timestamp);
typedef void (vidisp_hide_h)(struct vidisp_st *st);
/** Defines a Video display */
struct vidisp {
struct le le;
const char *name;
vidisp_alloc_h *alloch;
vidisp_update_h *updateh;
vidisp_disp_h *disph;
vidisp_hide_h *hideh;
};
int vidisp_register(struct vidisp **vp, struct list *vidispl, const char *name,
vidisp_alloc_h *alloch, vidisp_update_h *updateh,
vidisp_disp_h *disph, vidisp_hide_h *hideh);
int vidisp_alloc(struct vidisp_st **stp, struct list *vidispl,
const char *name,
struct vidisp_prm *prm, const char *dev,
vidisp_resize_h *resizeh, void *arg);
const struct vidisp *vidisp_find(const struct list *vidispl, const char *name);
/*
* Audio Codec
*/
/** Audio Codec parameters */
struct auenc_param {
uint32_t bitrate; /**< Wanted bitrate in [bit/s] */
};
struct auenc_state;
struct audec_state;
struct aucodec;
typedef int (auenc_update_h)(struct auenc_state **aesp,
const struct aucodec *ac,
struct auenc_param *prm, const char *fmtp);
typedef int (auenc_encode_h)(struct auenc_state *aes,
bool *marker, uint8_t *buf, size_t *len,
int fmt, const void *sampv, size_t sampc);
typedef int (audec_update_h)(struct audec_state **adsp,
const struct aucodec *ac, const char *fmtp);
typedef int (audec_decode_h)(struct audec_state *ads,
int fmt, void *sampv, size_t *sampc,
bool marker, const uint8_t *buf, size_t len);
typedef int (audec_plc_h)(struct audec_state *ads,
int fmt, void *sampv, size_t *sampc,
const uint8_t *buf, size_t len);
struct aucodec {
struct le le;
const char *pt;
const char *name;
uint32_t srate; /* Audio samplerate */
uint32_t crate; /* RTP Clock rate */
uint8_t ch;
uint8_t pch; /* RTP packet channels */
uint32_t ptime; /* Packet time in [ms] (optional) */
const char *fmtp;
auenc_update_h *encupdh;
auenc_encode_h *ench;
audec_update_h *decupdh;
audec_decode_h *dech;
audec_plc_h *plch;
sdp_fmtp_enc_h *fmtp_ench;
sdp_fmtp_cmp_h *fmtp_cmph;
};
void aucodec_register(struct list *aucodecl, struct aucodec *ac);
void aucodec_unregister(struct aucodec *ac);
const struct aucodec *aucodec_find(const struct list *aucodecl,
const char *name, uint32_t srate,
uint8_t ch);
/*
* Video Codec
*/
/** Video Codec parameters */
struct videnc_param {
unsigned bitrate; /**< Encoder bitrate in [bit/s] */
unsigned pktsize; /**< RTP packetsize in [bytes] */
double fps; /**< Video framerate (max) */
uint32_t max_fs;
};
struct videnc_state;
struct viddec_state;
struct vidcodec;
struct viddec_packet {
bool intra; /**< True=keyframe, False=deltaframe */
const struct rtp_header *hdr; /**< RTP Header */
uint64_t timestamp; /**< Timestamp in VIDEO_TIMEBASE units */
struct mbuf *mb; /**< RTP Buffer memory */
};
typedef int (videnc_packet_h)(bool marker, uint64_t rtp_ts,
const uint8_t *hdr, size_t hdr_len,
const uint8_t *pld, size_t pld_len,
const struct video *vid);
typedef int (videnc_update_h)(struct videnc_state **vesp,
const struct vidcodec *vc,
struct videnc_param *prm, const char *fmtp,
videnc_packet_h *pkth, const struct video *vid);
typedef int (videnc_encode_h)(struct videnc_state *ves, bool update,
const struct vidframe *frame,
uint64_t timestamp);
typedef int (videnc_packetize_h)(struct videnc_state *ves,
const struct vidpacket *packet);
typedef int(viddec_update_h)(struct viddec_state **vdsp,
const struct vidcodec *vc, const char *fmtp,
const struct video *vid);
typedef int (viddec_decode_h)(struct viddec_state *vds, struct vidframe *frame,
struct viddec_packet *pkt);
struct vidcodec {
struct le le;
const char *pt;
const char *name;
const char *variant;
const char *fmtp;
videnc_update_h *encupdh;
videnc_encode_h *ench;
viddec_update_h *decupdh;
viddec_decode_h *dech;
sdp_fmtp_enc_h *fmtp_ench;
sdp_fmtp_cmp_h *fmtp_cmph;
videnc_packetize_h *packetizeh;
};
void vidcodec_register(struct list *vidcodecl, struct vidcodec *vc);
void vidcodec_unregister(struct vidcodec *vc);
const struct vidcodec *vidcodec_find(const struct list *vidcodecl,
const char *name, const char *variant);
const struct vidcodec *vidcodec_find_encoder(const struct list *vidcodecl,
const char *name);
const struct vidcodec *vidcodec_find_decoder(const struct list *vidcodecl,
const char *name);
/*
* Video Filter
*/
struct vidfilt;
/* Base class */
struct vidfilt_enc_st {
const struct vidfilt *vf;
struct le le;
};
struct vidfilt_dec_st {
const struct vidfilt *vf;
struct le le;
};
/** Video Filter Parameters */
struct vidfilt_prm {
unsigned width; /**< Picture width */
unsigned height; /**< Picture height */
int fmt; /**< Pixel format (enum vidfmt) */
double fps; /**< Video framerate */
};
typedef int (vidfilt_encupd_h)(struct vidfilt_enc_st **stp, void **ctx,
const struct vidfilt *vf,
struct vidfilt_prm *prm,
const struct video *vid);
typedef int (vidfilt_encode_h)(struct vidfilt_enc_st *st,
struct vidframe *frame, uint64_t *timestamp);
typedef int (vidfilt_decupd_h)(struct vidfilt_dec_st **stp, void **ctx,
const struct vidfilt *vf,
struct vidfilt_prm *prm,
const struct video *vid);
typedef int (vidfilt_decode_h)(struct vidfilt_dec_st *st,
struct vidframe *frame, uint64_t *timestamp);
struct vidfilt {
struct le le;
const char *name;
vidfilt_encupd_h *encupdh;
vidfilt_encode_h *ench;
vidfilt_decupd_h *decupdh;
vidfilt_decode_h *dech;
};
void vidfilt_register(struct list *vidfiltl, struct vidfilt *vf);
void vidfilt_unregister(struct vidfilt *vf);
int vidfilt_enc_append(struct list *filtl, void **ctx,
const struct vidfilt *vf, struct vidfilt_prm *prm,
const struct video *vid);
int vidfilt_dec_append(struct list *filtl, void **ctx,
const struct vidfilt *vf, struct vidfilt_prm *prm,
const struct video *vid);
/*
* Audio stream
*/
struct audio;
struct stream_param;
struct mnat;
struct mnat_sess;
typedef void (audio_event_h)(int key, bool end, void *arg);
typedef void (audio_level_h)(bool tx, double lvl, void *arg);
typedef void (audio_err_h)(int err, const char *str, void *arg);
int audio_alloc(struct audio **ap, struct list *streaml,
const struct stream_param *stream_prm,
const struct config *cfg,
struct account *acc, struct sdp_session *sdp_sess,
const struct mnat *mnat, struct mnat_sess *mnat_sess,
const struct menc *menc, struct menc_sess *menc_sess,
uint32_t ptime, const struct list *aucodecl, bool offerer,
audio_event_h *eventh, audio_level_h *levelh,
audio_err_h *errh, void *arg);
void audio_mute(struct audio *a, bool muted);
bool audio_ismuted(const struct audio *a);
int audio_set_devicename(struct audio *a, const char *src, const char *play);
int audio_set_source(struct audio *au, const char *mod, const char *device);
int audio_set_player(struct audio *au, const char *mod, const char *device);
void audio_level_put(const struct audio *au, bool tx, double lvl);
int audio_level_get(const struct audio *au, double *level);
int audio_debug(struct re_printf *pf, const struct audio *a);
struct stream *audio_strm(const struct audio *au);
uint64_t audio_jb_current_value(const struct audio *au);
int audio_set_bitrate(struct audio *au, uint32_t bitrate);
bool audio_rxaubuf_started(const struct audio *au);
int audio_update(struct audio *a);
int audio_start(struct audio *a);
int audio_start_source(struct audio *a, struct list *ausrcl,
struct list *aufiltl);
void audio_stop(struct audio *a);
bool audio_started(const struct audio *a);
void audio_set_hold(struct audio *au, bool hold);
int audio_set_conference(struct audio *au, bool conference);
bool audio_is_conference(const struct audio *au);
int audio_encoder_set(struct audio *a, const struct aucodec *ac,
int pt_tx, const char *params);
int audio_decoder_set(struct audio *a, const struct aucodec *ac,
int pt_rx, const char *params);
const struct aucodec *audio_codec(const struct audio *au, bool tx);
struct config_audio *audio_config(struct audio *au);
bool audio_txtelev_empty(const struct audio *au);
void audio_call_telev_handler(const struct audio *au, int key, bool end);
/*
* Video stream
*/
struct video;
typedef void (video_err_h)(int err, const char *str, void *arg);
int video_alloc(struct video **vp, struct list *streaml,
const struct stream_param *stream_prm,
const struct config *cfg,
const struct account *acc,
struct sdp_session *sdp_sess,
const struct mnat *mnat, struct mnat_sess *mnat_sess,
const struct menc *menc, struct menc_sess *menc_sess,
const char *content, const struct list *vidcodecl,
const struct list *vidfiltl, bool offerer,
video_err_h *errh, void *arg);
int video_encoder_set(struct video *v, struct vidcodec *vc,
int pt_tx, const char *params);
int video_update(struct video *v, const char *peer);
int video_start_source(struct video *v);
int video_start_display(struct video *v, const char *peer);
void video_stop_display(struct video *v);
void video_stop(struct video *v);
int video_set_fullscreen(struct video *v, bool fs);
void video_vidsrc_set_device(struct video *v, const char *dev);
int video_set_source(struct video *v, const char *name, const char *dev);
void video_set_devicename(struct video *v, const char *src, const char *disp);
const char *video_get_src_dev(const struct video *v);
const char *video_get_disp_dev(const struct video *v);
int video_debug(struct re_printf *pf, const struct video *v);
struct stream *video_strm(const struct video *v);
const struct vidcodec *video_codec(const struct video *vid, bool tx);
void video_sdp_attr_decode(struct video *v);
void video_req_keyframe(struct video *vid);
void video_set_source_mute(struct video *vid, bool mute); // added by ritoseo
double video_calc_seconds(uint64_t rtp_ts);
double video_timestamp_to_seconds(uint64_t timestamp);
uint64_t video_calc_rtp_timestamp_fix(uint64_t timestamp);
uint64_t video_calc_timebase_timestamp(uint64_t rtp_ts);
/*
* Generic stream
*/
/** Common parameters for media stream */
struct stream_param {
bool use_rtp; /**< Enable or disable RTP */
bool rtcp_mux; /**< Enable or disable rtcp_mux */
int af; /**< Wanted address family */
const char *cname; /**< Canonical name */
const char *peer; /**< Peer uri/name or identifier */
};
struct jbuf_stat;
typedef void (stream_mnatconn_h)(struct stream *strm, void *arg);
typedef void (stream_rtpestab_h)(struct stream *strm, void *arg);
typedef void (stream_rtcp_h)(struct stream *strm,
struct rtcp_msg *msg, void *arg);
typedef void (stream_error_h)(struct stream *strm, int err, void *arg);
int stream_update(struct stream *s);
const struct rtcp_stats *stream_rtcp_stats(const struct stream *strm);
int stream_jbuf_stats(const struct stream *strm, struct jbuf_stat *s);
struct sdp_media *stream_sdpmedia(const struct stream *s);
uint32_t stream_metric_get_tx_n_packets(const struct stream *strm);
uint32_t stream_metric_get_tx_n_bytes(const struct stream *strm);
uint32_t stream_metric_get_tx_n_err(const struct stream *strm);
uint32_t stream_metric_get_tx_bitrate(const struct stream *strm);
double stream_metric_get_tx_avg_bitrate(const struct stream *strm);
uint32_t stream_metric_get_rx_n_packets(const struct stream *strm);
uint32_t stream_metric_get_rx_n_bytes(const struct stream *strm);
uint32_t stream_metric_get_rx_n_err(const struct stream *strm);
uint32_t stream_metric_get_rx_bitrate(const struct stream *strm);
double stream_metric_get_rx_avg_bitrate(const struct stream *strm);
void stream_set_secure(struct stream *strm, bool secure);
bool stream_is_secure(const struct stream *strm);
int stream_start_mediaenc(struct stream *strm);
int stream_start_rtcp(const struct stream *strm);
int stream_enable(struct stream *strm, bool enable);
int stream_enable_tx(struct stream *strm, bool enable);
int stream_enable_rx(struct stream *strm, bool enable);
void stream_mnat_attr(struct stream *strm, const char *name,
const char *value);
void stream_set_session_handlers(struct stream *strm,
stream_mnatconn_h *mnatconnh,
stream_rtpestab_h *rtpestabh,
stream_rtcp_h *rtcph,
stream_error_h *errorh, void *arg);
struct stream *stream_lookup_mid(const struct list *streaml,
const char *mid, size_t len);
const char *stream_name(const struct stream *strm);
const char *stream_cname(const struct stream *strm);
const char *stream_peer(const struct stream *strm);
int stream_bundle_init(struct stream *strm, bool offerer);
int stream_debug(struct re_printf *pf, const struct stream *s);
void stream_enable_rtp_timeout(struct stream *strm, uint32_t timeout_ms);
/**
* Jitter Buffer
*/
struct jbuf;
struct rtp_header;
/** Jitter buffer statistics */
struct jbuf_stat {
uint32_t n_put; /**< Number of frames put into jitter buffer */
uint32_t n_get; /**< Number of frames got from jitter buffer */
uint32_t n_oos; /**< Number of out-of-sequence frames */
uint32_t n_dups; /**< Number of duplicate frames detected */
uint32_t n_late; /**< Number of frames arriving too late */
uint32_t n_lost; /**< Number of lost frames */
uint32_t n_overflow; /**< Number of overflows */
uint32_t n_underflow; /**< Number of underflows */
uint32_t n_flush; /**< Number of times jitter buffer flushed */
};
int jbuf_alloc(struct jbuf **jbp, uint32_t min, uint32_t max);
int jbuf_set_type(struct jbuf *jb, enum jbuf_type jbtype);
void jbuf_set_gnack(struct jbuf *jb, struct rtp_sock *rtp);
int jbuf_put(struct jbuf *jb, const struct rtp_header *hdr, void *mem);
int jbuf_get(struct jbuf *jb, struct rtp_header *hdr, void **mem);
int jbuf_drain(struct jbuf *jb, struct rtp_header *hdr, void **mem);
void jbuf_flush(struct jbuf *jb);
int jbuf_stats(const struct jbuf *jb, struct jbuf_stat *jstat);
int jbuf_debug(struct re_printf *pf, const struct jbuf *jb);
uint32_t jbuf_frames(const struct jbuf *jb);
uint32_t jbuf_packets(const struct jbuf *jb);
/*
* STUN URI
*/
/** Defines the STUN uri scheme */
enum stun_scheme {
STUN_SCHEME_STUN, /**< STUN scheme */
STUN_SCHEME_STUNS, /**< Secure STUN scheme */
STUN_SCHEME_TURN, /**< TURN scheme */
STUN_SCHEME_TURNS, /**< Secure TURN scheme */
};
/** Defines a STUN/TURN uri */
struct stun_uri {
enum stun_scheme scheme; /**< STUN Scheme */
char *host; /**< Hostname or IP-address */
uint16_t port; /**< Port number */
int proto; /**< Transport protocol */
};
int stunuri_decode(struct stun_uri **sup, const struct pl *pl);
int stunuri_set_host(struct stun_uri *su, const char *host);
int stunuri_set_port(struct stun_uri *su, uint16_t port);
int stunuri_print(struct re_printf *pf, const struct stun_uri *su);
const char *stunuri_scheme_name(enum stun_scheme scheme);
/*
* Media NAT
*/
struct mnat;
struct mnat_sess;
struct mnat_media;
typedef void (mnat_estab_h)(int err, uint16_t scode, const char *reason,
void *arg);
typedef void (mnat_connected_h)(const struct sa *raddr1,
const struct sa *raddr2, void *arg);
typedef int (mnat_sess_h)(struct mnat_sess **sessp,
const struct mnat *mnat, struct dnsc *dnsc,
int af, const struct stun_uri *srv,
const char *user, const char *pass,
struct sdp_session *sdp, bool offerer,
mnat_estab_h *estabh, void *arg);
typedef int (mnat_media_h)(struct mnat_media **mp, struct mnat_sess *sess,
struct udp_sock *sock1, struct udp_sock *sock2,
struct sdp_media *sdpm,
mnat_connected_h *connh, void *arg);
typedef int (mnat_update_h)(struct mnat_sess *sess);
typedef void (mnat_attr_h)(struct mnat_media *mm,
const char *name, const char *value);
struct mnat {
struct le le;
const char *id;
const char *ftag;
bool wait_connected;
mnat_sess_h *sessh;
mnat_media_h *mediah;
mnat_update_h *updateh;
mnat_attr_h *attrh;
};
void mnat_register(struct list *mnatl, struct mnat *mnat);
void mnat_unregister(struct mnat *mnat);
const struct mnat *mnat_find(const struct list *mnatl, const char *id);
/*
* SDP
*/
bool sdp_media_has_media(const struct sdp_media *m);
int sdp_fingerprint_decode(const char *attr, struct pl *hash,
uint8_t *md, size_t *sz);
/*
* SIP Request
*/
int sip_req_send(struct ua *ua, const char *method, const char *uri,
sip_resp_h *resph, void *arg, const char *fmt, ...);
/*
* Modules
*/
#ifdef STATIC
#define DECL_EXPORTS(name) exports_ ##name
#else
#define DECL_EXPORTS(name) exports
#endif
int module_preload(const char *module);
int module_load(const char *path, const char *name);
void module_unload(const char *name);
void module_app_unload(void);
/*
* Generic event
*/
int event_encode_dict(struct odict *od, struct ua *ua, enum ua_event ev,
struct call *call, const char *prm);
int odict_encode_bevent(struct odict *od, struct bevent *event);
int event_add_au_jb_stat(struct odict *od_parent, const struct call *call);
int uag_event_register(ua_event_h *eh, void *arg);
void uag_event_unregister(ua_event_h *eh);
int bevent_register(bevent_h *eh, void *arg);
void bevent_unregister(bevent_h *eh);
void ua_event(struct ua *ua, enum ua_event ev, struct call *call,
const char *fmt, ...);
int bevent_app_emit(enum ua_event ev, void *arg, const char *fmt, ...);
int bevent_ua_emit(enum ua_event ev, struct ua *ua, const char *fmt, ...);
int bevent_call_emit(enum ua_event ev, struct call *call,
const char *fmt, ...);
int bevent_sip_msg_emit(enum ua_event ev, const struct sip_msg *msg,
const char *fmt, ...);
void module_event(const char *module, const char *event, struct ua *ua,
struct call *call, const char *fmt, ...);
const char *uag_event_str(enum ua_event ev);
struct call *bevent_get_call(const struct bevent *event);
struct ua *bevent_get_ua(const struct bevent *event);
const struct sip_msg *bevent_get_msg(const struct bevent *event);
void *bevent_get_apparg(const struct bevent *event);
enum ua_event bevent_get_type(const struct bevent *event);
const char *bevent_get_text(const struct bevent *event);
void bevent_set_error(struct bevent *event, int err);
void bevent_stop(struct bevent *event);
/*
* Baresip instance
*/
int baresip_init(struct config *cfg);
void baresip_close(void);
struct network *baresip_network(void);
struct contacts *baresip_contacts(void);
struct commands *baresip_commands(void);
struct player *baresip_player(void);
struct message *baresip_message(void);
struct list *baresip_mnatl(void);
struct list *baresip_mencl(void);
struct list *baresip_aucodecl(void);
struct list *baresip_ausrcl(void);
struct list *baresip_auplayl(void);
struct list *baresip_aufiltl(void);
struct list *baresip_vidcodecl(void);
struct list *baresip_vidsrcl(void);
struct list *baresip_vidispl(void);
struct list *baresip_vidfiltl(void);
struct ui_sub *baresip_uis(void);
/*
* Dialing numbers helpers
*/
int clean_number(char* str);
/* bundle */
int bundle_sdp_encode(struct sdp_session *sdp, const struct list *streaml);
int bundle_sdp_decode(struct sdp_session *sdp, struct list *streaml);
/*
* Session Description
*/
/* RTCSdpType */
enum sdp_type {
SDP_NONE,
SDP_OFFER,
SDP_ANSWER,
SDP_ROLLBACK /* special type */
};
/*
* https://developer.mozilla.org/en-US/docs/Web/API/RTCSessionDescription
*
* format:
*
* {
* "type" : "answer",
* "sdp" : "v=0\r\ns=-\r\n..."
* }
*/
struct session_description {
enum sdp_type type;
struct mbuf *sdp;
};
int session_description_encode(struct odict **odp,
enum sdp_type type, struct mbuf *sdp);
int session_description_decode(struct session_description *sd,
struct mbuf *mb);
void session_description_reset(struct session_description *sd);
const char *sdptype_name(enum sdp_type type);
/*
* WebRTC Media Track
*/
enum media_kind {
MEDIA_KIND_AUDIO,
MEDIA_KIND_VIDEO,
};
struct media_track;
int mediatrack_start_audio(struct media_track *media,
struct list *ausrcl, struct list *aufiltl);
int mediatrack_start_video(struct media_track *media);
struct stream *media_get_stream(const struct media_track *media);
struct audio *media_get_audio(const struct media_track *media);
struct video *media_get_video(const struct media_track *media);
enum media_kind mediatrack_kind(const struct media_track *media);
const char *media_kind_name(enum media_kind kind);
/*
* WebRTC RTCPeerConnection
*
* https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection
*/
/* RTCPeerConnection.signalingState */
enum signaling_st {
SS_STABLE,
SS_HAVE_LOCAL_OFFER,
SS_HAVE_REMOTE_OFFER
};
/* RTCConfiguration */
struct rtc_configuration {
struct stun_uri *ice_server;
const char *stun_user;
const char *credential;
bool offerer;
};
struct peer_connection;
typedef void (peerconnection_gather_h)(void *arg);
typedef void (peerconnection_estab_h)(struct media_track *media,
void *arg);
typedef void (peerconnection_close_h)(int err, void *arg);
int peerconnection_new(struct peer_connection **pcp,
const struct rtc_configuration *config,
const struct mnat *mnat, const struct menc *menc,
peerconnection_gather_h *gatherh,
peerconnection_estab_h,
peerconnection_close_h *closeh, void *arg);
int peerconnection_add_audio_track(struct peer_connection *pc,
const struct config *cfg,
struct list *aucodecl, enum sdp_dir dir);
int peerconnection_add_video_track(struct peer_connection *pc,
const struct config *cfg,
struct list *vidcodecl, enum sdp_dir dir);
int peerconnection_set_remote_descr(struct peer_connection *pc,
const struct session_description *sd);
int peerconnection_create_offer(struct peer_connection *sess,
struct mbuf **mb);
int peerconnection_create_answer(struct peer_connection *sess,
struct mbuf **mb);
int peerconnection_start_ice(struct peer_connection *pc);
void peerconnection_close(struct peer_connection *pc);
void peerconnection_add_ice_candidate(struct peer_connection *pc,
const char *cand, const char *mid);
enum signaling_st peerconnection_signaling(const struct peer_connection *pc);
/*
* HTTP functions
*/
const char *http_extension_to_mimetype(const char *ext);
int http_reply_json(struct http_conn *conn, const char *sessid,
const struct odict *od);
#ifdef __cplusplus
}
#endif
#endif /* BARESIP_H__ */