James Kuszmaul | 82f6c04 | 2021-01-17 11:30:16 -0800 | [diff] [blame^] | 1 | /** |
| 2 | * @file re_sdp.h Interface to Session Description Protocol (SDP) |
| 3 | * |
| 4 | * Copyright (C) 2010 Creytiv.com |
| 5 | */ |
| 6 | |
| 7 | |
| 8 | enum { |
| 9 | SDP_VERSION = 0 |
| 10 | }; |
| 11 | |
| 12 | /** SDP Direction */ |
| 13 | enum sdp_dir { |
| 14 | SDP_INACTIVE = 0, |
| 15 | SDP_RECVONLY = 1, |
| 16 | SDP_SENDONLY = 2, |
| 17 | SDP_SENDRECV = 3, |
| 18 | }; |
| 19 | |
| 20 | /** SDP Bandwidth type */ |
| 21 | enum sdp_bandwidth { |
| 22 | SDP_BANDWIDTH_MIN = 0, |
| 23 | SDP_BANDWIDTH_CT = 0, /**< [kbit/s] Conference Total */ |
| 24 | SDP_BANDWIDTH_AS, /**< [kbit/s] Application Specific */ |
| 25 | SDP_BANDWIDTH_RS, /**< [bit/s] RTCP Senders (RFC 3556) */ |
| 26 | SDP_BANDWIDTH_RR, /**< [bit/s] RTCP Receivers (RFC 3556) */ |
| 27 | SDP_BANDWIDTH_TIAS, /**< [bit/s] Transport Independent Application |
| 28 | Specific Maximum (RFC 3890) */ |
| 29 | SDP_BANDWIDTH_MAX, |
| 30 | }; |
| 31 | |
| 32 | |
| 33 | struct sdp_format; |
| 34 | |
| 35 | typedef int(sdp_media_enc_h)(struct mbuf *mb, bool offer, void *arg); |
| 36 | typedef int(sdp_fmtp_enc_h)(struct mbuf *mb, const struct sdp_format *fmt, |
| 37 | bool offer, void *data); |
| 38 | typedef bool(sdp_fmtp_cmp_h)(const char *params1, const char *params2, |
| 39 | void *data); |
| 40 | typedef bool(sdp_format_h)(struct sdp_format *fmt, void *arg); |
| 41 | typedef bool(sdp_attr_h)(const char *name, const char *value, void *arg); |
| 42 | |
| 43 | /** SDP Format */ |
| 44 | struct sdp_format { |
| 45 | struct le le; |
| 46 | char *id; |
| 47 | char *params; |
| 48 | char *rparams; |
| 49 | char *name; |
| 50 | sdp_fmtp_enc_h *ench; |
| 51 | sdp_fmtp_cmp_h *cmph; |
| 52 | void *data; |
| 53 | bool ref; |
| 54 | bool sup; |
| 55 | int pt; |
| 56 | uint32_t srate; |
| 57 | uint8_t ch; |
| 58 | }; |
| 59 | |
| 60 | |
| 61 | /* session */ |
| 62 | struct sdp_session; |
| 63 | |
| 64 | int sdp_session_alloc(struct sdp_session **sessp, const struct sa *laddr); |
| 65 | void sdp_session_set_laddr(struct sdp_session *sess, const struct sa *laddr); |
| 66 | void sdp_session_set_lbandwidth(struct sdp_session *sess, |
| 67 | enum sdp_bandwidth type, int32_t bw); |
| 68 | int sdp_session_set_lattr(struct sdp_session *sess, bool replace, |
| 69 | const char *name, const char *value, ...); |
| 70 | void sdp_session_del_lattr(struct sdp_session *sess, const char *name); |
| 71 | int32_t sdp_session_lbandwidth(const struct sdp_session *sess, |
| 72 | enum sdp_bandwidth type); |
| 73 | int32_t sdp_session_rbandwidth(const struct sdp_session *sess, |
| 74 | enum sdp_bandwidth type); |
| 75 | const char *sdp_session_rattr(const struct sdp_session *sess, |
| 76 | const char *name); |
| 77 | const char *sdp_session_rattr_apply(const struct sdp_session *sess, |
| 78 | const char *name, |
| 79 | sdp_attr_h *attrh, void *arg); |
| 80 | const struct list *sdp_session_medial(const struct sdp_session *sess, |
| 81 | bool local); |
| 82 | int sdp_session_debug(struct re_printf *pf, const struct sdp_session *sess); |
| 83 | |
| 84 | |
| 85 | /* media */ |
| 86 | struct sdp_media; |
| 87 | |
| 88 | int sdp_media_add(struct sdp_media **mp, struct sdp_session *sess, |
| 89 | const char *name, uint16_t port, const char *proto); |
| 90 | int sdp_media_set_alt_protos(struct sdp_media *m, unsigned protoc, ...); |
| 91 | void sdp_media_set_encode_handler(struct sdp_media *m, sdp_media_enc_h *ench, |
| 92 | void *arg); |
| 93 | void sdp_media_set_fmt_ignore(struct sdp_media *m, bool fmt_ignore); |
| 94 | void sdp_media_set_disabled(struct sdp_media *m, bool disabled); |
| 95 | void sdp_media_set_lport(struct sdp_media *m, uint16_t port); |
| 96 | void sdp_media_set_laddr(struct sdp_media *m, const struct sa *laddr); |
| 97 | void sdp_media_set_lbandwidth(struct sdp_media *m, enum sdp_bandwidth type, |
| 98 | int32_t bw); |
| 99 | void sdp_media_set_lport_rtcp(struct sdp_media *m, uint16_t port); |
| 100 | void sdp_media_set_laddr_rtcp(struct sdp_media *m, const struct sa *laddr); |
| 101 | void sdp_media_set_ldir(struct sdp_media *m, enum sdp_dir dir); |
| 102 | int sdp_media_set_lattr(struct sdp_media *m, bool replace, |
| 103 | const char *name, const char *value, ...); |
| 104 | void sdp_media_del_lattr(struct sdp_media *m, const char *name); |
| 105 | const char *sdp_media_proto(const struct sdp_media *m); |
| 106 | uint16_t sdp_media_rport(const struct sdp_media *m); |
| 107 | const struct sa *sdp_media_raddr(const struct sdp_media *m); |
| 108 | const struct sa *sdp_media_laddr(const struct sdp_media *m); |
| 109 | void sdp_media_raddr_rtcp(const struct sdp_media *m, struct sa *raddr); |
| 110 | int32_t sdp_media_rbandwidth(const struct sdp_media *m, |
| 111 | enum sdp_bandwidth type); |
| 112 | enum sdp_dir sdp_media_ldir(const struct sdp_media *m); |
| 113 | enum sdp_dir sdp_media_rdir(const struct sdp_media *m); |
| 114 | enum sdp_dir sdp_media_dir(const struct sdp_media *m); |
| 115 | const struct sdp_format *sdp_media_lformat(const struct sdp_media *m, int pt); |
| 116 | const struct sdp_format *sdp_media_rformat(const struct sdp_media *m, |
| 117 | const char *name); |
| 118 | struct sdp_format *sdp_media_format(const struct sdp_media *m, |
| 119 | bool local, const char *id, |
| 120 | int pt, const char *name, |
| 121 | int32_t srate, int8_t ch); |
| 122 | struct sdp_format *sdp_media_format_apply(const struct sdp_media *m, |
| 123 | bool local, const char *id, |
| 124 | int pt, const char *name, |
| 125 | int32_t srate, int8_t ch, |
| 126 | sdp_format_h *fmth, void *arg); |
| 127 | const struct list *sdp_media_format_lst(const struct sdp_media *m, bool local); |
| 128 | const char *sdp_media_rattr(const struct sdp_media *m, const char *name); |
| 129 | const char *sdp_media_session_rattr(const struct sdp_media *m, |
| 130 | const struct sdp_session *sess, |
| 131 | const char *name); |
| 132 | const char *sdp_media_rattr_apply(const struct sdp_media *m, const char *name, |
| 133 | sdp_attr_h *attrh, void *arg); |
| 134 | const char *sdp_media_name(const struct sdp_media *m); |
| 135 | int sdp_media_debug(struct re_printf *pf, const struct sdp_media *m); |
| 136 | |
| 137 | |
| 138 | /* format */ |
| 139 | int sdp_format_add(struct sdp_format **fmtp, struct sdp_media *m, |
| 140 | bool prepend, const char *id, const char *name, |
| 141 | uint32_t srate, uint8_t ch, sdp_fmtp_enc_h *ench, |
| 142 | sdp_fmtp_cmp_h *cmph, void *data, bool ref, |
| 143 | const char *params, ...); |
| 144 | int sdp_format_set_params(struct sdp_format *fmt, const char *params, ...); |
| 145 | bool sdp_format_cmp(const struct sdp_format *fmt1, |
| 146 | const struct sdp_format *fmt2); |
| 147 | int sdp_format_debug(struct re_printf *pf, const struct sdp_format *fmt); |
| 148 | |
| 149 | |
| 150 | /* encode/decode */ |
| 151 | int sdp_encode(struct mbuf **mbp, struct sdp_session *sess, bool offer); |
| 152 | int sdp_decode(struct sdp_session *sess, struct mbuf *mb, bool offer); |
| 153 | |
| 154 | |
| 155 | /* strings */ |
| 156 | const char *sdp_dir_name(enum sdp_dir dir); |
| 157 | const char *sdp_bandwidth_name(enum sdp_bandwidth type); |
| 158 | |
| 159 | |
| 160 | extern const char sdp_attr_fmtp[]; |
| 161 | extern const char sdp_attr_maxptime[]; |
| 162 | extern const char sdp_attr_ptime[]; |
| 163 | extern const char sdp_attr_rtcp[]; |
| 164 | extern const char sdp_attr_rtpmap[]; |
| 165 | |
| 166 | extern const char sdp_media_audio[]; |
| 167 | extern const char sdp_media_video[]; |
| 168 | extern const char sdp_media_text[]; |
| 169 | |
| 170 | extern const char sdp_proto_rtpavp[]; |
| 171 | extern const char sdp_proto_rtpsavp[]; |
| 172 | |
| 173 | |
| 174 | /* utility functions */ |
| 175 | |
| 176 | /** RTP Header Extensions, as defined in RFC 5285 */ |
| 177 | struct sdp_extmap { |
| 178 | struct pl name; |
| 179 | struct pl attrs; |
| 180 | enum sdp_dir dir; |
| 181 | bool dir_set; |
| 182 | uint32_t id; |
| 183 | }; |
| 184 | |
| 185 | int sdp_extmap_decode(struct sdp_extmap *ext, const char *val); |