| /** |
| * @file re_sdp.h Interface to Session Description Protocol (SDP) |
| * |
| * Copyright (C) 2010 Creytiv.com |
| */ |
| |
| |
| enum { |
| SDP_VERSION = 0 |
| }; |
| |
| /** SDP Direction */ |
| enum sdp_dir { |
| SDP_INACTIVE = 0, |
| SDP_RECVONLY = 1, |
| SDP_SENDONLY = 2, |
| SDP_SENDRECV = 3, |
| }; |
| |
| /** SDP Bandwidth type */ |
| enum sdp_bandwidth { |
| SDP_BANDWIDTH_MIN = 0, |
| SDP_BANDWIDTH_CT = 0, /**< [kbit/s] Conference Total */ |
| SDP_BANDWIDTH_AS, /**< [kbit/s] Application Specific */ |
| SDP_BANDWIDTH_RS, /**< [bit/s] RTCP Senders (RFC 3556) */ |
| SDP_BANDWIDTH_RR, /**< [bit/s] RTCP Receivers (RFC 3556) */ |
| SDP_BANDWIDTH_TIAS, /**< [bit/s] Transport Independent Application |
| Specific Maximum (RFC 3890) */ |
| SDP_BANDWIDTH_MAX, |
| }; |
| |
| |
| struct sdp_format; |
| |
| typedef int(sdp_media_enc_h)(struct mbuf *mb, bool offer, void *arg); |
| typedef int(sdp_fmtp_enc_h)(struct mbuf *mb, const struct sdp_format *fmt, |
| bool offer, void *data); |
| typedef bool(sdp_fmtp_cmp_h)(const char *params1, const char *params2, |
| void *data); |
| typedef bool(sdp_format_h)(struct sdp_format *fmt, void *arg); |
| typedef bool(sdp_attr_h)(const char *name, const char *value, void *arg); |
| |
| /** SDP Format */ |
| struct sdp_format { |
| struct le le; |
| char *id; |
| char *params; |
| char *rparams; |
| char *name; |
| sdp_fmtp_enc_h *ench; |
| sdp_fmtp_cmp_h *cmph; |
| void *data; |
| bool ref; |
| bool sup; |
| int pt; |
| uint32_t srate; |
| uint8_t ch; |
| }; |
| |
| |
| /* session */ |
| struct sdp_session; |
| |
| int sdp_session_alloc(struct sdp_session **sessp, const struct sa *laddr); |
| void sdp_session_set_laddr(struct sdp_session *sess, const struct sa *laddr); |
| void sdp_session_set_lbandwidth(struct sdp_session *sess, |
| enum sdp_bandwidth type, int32_t bw); |
| int sdp_session_set_lattr(struct sdp_session *sess, bool replace, |
| const char *name, const char *value, ...); |
| void sdp_session_del_lattr(struct sdp_session *sess, const char *name); |
| int32_t sdp_session_lbandwidth(const struct sdp_session *sess, |
| enum sdp_bandwidth type); |
| int32_t sdp_session_rbandwidth(const struct sdp_session *sess, |
| enum sdp_bandwidth type); |
| const char *sdp_session_rattr(const struct sdp_session *sess, |
| const char *name); |
| const char *sdp_session_rattr_apply(const struct sdp_session *sess, |
| const char *name, |
| sdp_attr_h *attrh, void *arg); |
| const struct list *sdp_session_medial(const struct sdp_session *sess, |
| bool local); |
| int sdp_session_debug(struct re_printf *pf, const struct sdp_session *sess); |
| |
| |
| /* media */ |
| struct sdp_media; |
| |
| int sdp_media_add(struct sdp_media **mp, struct sdp_session *sess, |
| const char *name, uint16_t port, const char *proto); |
| int sdp_media_set_alt_protos(struct sdp_media *m, unsigned protoc, ...); |
| void sdp_media_set_encode_handler(struct sdp_media *m, sdp_media_enc_h *ench, |
| void *arg); |
| void sdp_media_set_fmt_ignore(struct sdp_media *m, bool fmt_ignore); |
| void sdp_media_set_disabled(struct sdp_media *m, bool disabled); |
| void sdp_media_set_lport(struct sdp_media *m, uint16_t port); |
| void sdp_media_set_laddr(struct sdp_media *m, const struct sa *laddr); |
| void sdp_media_set_lbandwidth(struct sdp_media *m, enum sdp_bandwidth type, |
| int32_t bw); |
| void sdp_media_set_lport_rtcp(struct sdp_media *m, uint16_t port); |
| void sdp_media_set_laddr_rtcp(struct sdp_media *m, const struct sa *laddr); |
| void sdp_media_set_ldir(struct sdp_media *m, enum sdp_dir dir); |
| int sdp_media_set_lattr(struct sdp_media *m, bool replace, |
| const char *name, const char *value, ...); |
| void sdp_media_del_lattr(struct sdp_media *m, const char *name); |
| const char *sdp_media_proto(const struct sdp_media *m); |
| uint16_t sdp_media_rport(const struct sdp_media *m); |
| const struct sa *sdp_media_raddr(const struct sdp_media *m); |
| const struct sa *sdp_media_laddr(const struct sdp_media *m); |
| void sdp_media_raddr_rtcp(const struct sdp_media *m, struct sa *raddr); |
| int32_t sdp_media_rbandwidth(const struct sdp_media *m, |
| enum sdp_bandwidth type); |
| enum sdp_dir sdp_media_ldir(const struct sdp_media *m); |
| enum sdp_dir sdp_media_rdir(const struct sdp_media *m); |
| enum sdp_dir sdp_media_dir(const struct sdp_media *m); |
| const struct sdp_format *sdp_media_lformat(const struct sdp_media *m, int pt); |
| const struct sdp_format *sdp_media_rformat(const struct sdp_media *m, |
| const char *name); |
| struct sdp_format *sdp_media_format(const struct sdp_media *m, |
| bool local, const char *id, |
| int pt, const char *name, |
| int32_t srate, int8_t ch); |
| struct sdp_format *sdp_media_format_apply(const struct sdp_media *m, |
| bool local, const char *id, |
| int pt, const char *name, |
| int32_t srate, int8_t ch, |
| sdp_format_h *fmth, void *arg); |
| const struct list *sdp_media_format_lst(const struct sdp_media *m, bool local); |
| const char *sdp_media_rattr(const struct sdp_media *m, const char *name); |
| const char *sdp_media_session_rattr(const struct sdp_media *m, |
| const struct sdp_session *sess, |
| const char *name); |
| const char *sdp_media_rattr_apply(const struct sdp_media *m, const char *name, |
| sdp_attr_h *attrh, void *arg); |
| const char *sdp_media_name(const struct sdp_media *m); |
| int sdp_media_debug(struct re_printf *pf, const struct sdp_media *m); |
| |
| |
| /* format */ |
| int sdp_format_add(struct sdp_format **fmtp, struct sdp_media *m, |
| bool prepend, const char *id, const char *name, |
| uint32_t srate, uint8_t ch, sdp_fmtp_enc_h *ench, |
| sdp_fmtp_cmp_h *cmph, void *data, bool ref, |
| const char *params, ...); |
| int sdp_format_set_params(struct sdp_format *fmt, const char *params, ...); |
| bool sdp_format_cmp(const struct sdp_format *fmt1, |
| const struct sdp_format *fmt2); |
| int sdp_format_debug(struct re_printf *pf, const struct sdp_format *fmt); |
| |
| |
| /* encode/decode */ |
| int sdp_encode(struct mbuf **mbp, struct sdp_session *sess, bool offer); |
| int sdp_decode(struct sdp_session *sess, struct mbuf *mb, bool offer); |
| |
| |
| /* strings */ |
| const char *sdp_dir_name(enum sdp_dir dir); |
| const char *sdp_bandwidth_name(enum sdp_bandwidth type); |
| |
| |
| extern const char sdp_attr_fmtp[]; |
| extern const char sdp_attr_maxptime[]; |
| extern const char sdp_attr_ptime[]; |
| extern const char sdp_attr_rtcp[]; |
| extern const char sdp_attr_rtpmap[]; |
| |
| extern const char sdp_media_audio[]; |
| extern const char sdp_media_video[]; |
| extern const char sdp_media_text[]; |
| |
| extern const char sdp_proto_rtpavp[]; |
| extern const char sdp_proto_rtpsavp[]; |
| |
| |
| /* utility functions */ |
| |
| /** RTP Header Extensions, as defined in RFC 5285 */ |
| struct sdp_extmap { |
| struct pl name; |
| struct pl attrs; |
| enum sdp_dir dir; |
| bool dir_set; |
| uint32_t id; |
| }; |
| |
| int sdp_extmap_decode(struct sdp_extmap *ext, const char *val); |