Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b

Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/include/re_sdp.h b/include/re_sdp.h
new file mode 100644
index 0000000..f34bab5
--- /dev/null
+++ b/include/re_sdp.h
@@ -0,0 +1,185 @@
+/**
+ * @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);