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_rtp.h b/include/re_rtp.h
new file mode 100644
index 0000000..06c7ff3
--- /dev/null
+++ b/include/re_rtp.h
@@ -0,0 +1,239 @@
+/**
+ * @file re_rtp.h  Interface to Real-time Transport Protocol and RTCP
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+
+
+/** RTP protocol values */
+enum {
+	RTP_VERSION     =  2,  /**< Defines the RTP version we support */
+	RTCP_VERSION    =  2,  /**< Supported RTCP Version             */
+	RTP_HEADER_SIZE = 12   /**< Number of bytes in RTP Header      */
+};
+
+
+/** Defines the RTP header */
+struct rtp_header {
+	uint8_t  ver;       /**< RTP version number     */
+	bool     pad;       /**< Padding bit            */
+	bool     ext;       /**< Extension bit          */
+	uint8_t  cc;        /**< CSRC count             */
+	bool     m;         /**< Marker bit             */
+	uint8_t  pt;        /**< Payload type           */
+	uint16_t seq;       /**< Sequence number        */
+	uint32_t ts;        /**< Timestamp              */
+	uint32_t ssrc;      /**< Synchronization source */
+	uint32_t csrc[16];  /**< Contributing sources   */
+	struct {
+		uint16_t type;  /**< Defined by profile     */
+		uint16_t len;   /**< Number of 32-bit words */
+	} x;
+};
+
+/** RTCP Packet Types */
+enum rtcp_type {
+	RTCP_FIR   = 192,  /**< Full INTRA-frame Request (RFC 2032)    */
+	RTCP_NACK  = 193,  /**< Negative Acknowledgement (RFC 2032)    */
+	RTCP_SR    = 200,  /**< Sender Report                          */
+	RTCP_RR    = 201,  /**< Receiver Report                        */
+	RTCP_SDES  = 202,  /**< Source Description                     */
+	RTCP_BYE   = 203,  /**< Goodbye                                */
+	RTCP_APP   = 204,  /**< Application-defined                    */
+	RTCP_RTPFB = 205,  /**< Transport layer FB message (RFC 4585)  */
+	RTCP_PSFB  = 206,  /**< Payload-specific FB message (RFC 4585) */
+	RTCP_XR    = 207,  /**< Extended Report (RFC 3611)             */
+	RTCP_AVB   = 208,  /**< AVB RTCP Packet (IEEE1733)             */
+};
+
+/** SDES Types */
+enum rtcp_sdes_type {
+	RTCP_SDES_END   = 0,  /**< End of SDES list               */
+	RTCP_SDES_CNAME = 1,  /**< Canonical name                 */
+	RTCP_SDES_NAME  = 2,  /**< User name                      */
+	RTCP_SDES_EMAIL = 3,  /**< User's electronic mail address */
+	RTCP_SDES_PHONE = 4,  /**< User's phone number            */
+	RTCP_SDES_LOC   = 5,  /**< Geographic user location       */
+	RTCP_SDES_TOOL  = 6,  /**< Name of application or tool    */
+	RTCP_SDES_NOTE  = 7,  /**< Notice about the source        */
+	RTCP_SDES_PRIV  = 8   /**< Private extension              */
+};
+
+/** Transport Layer Feedback Messages */
+enum rtcp_rtpfb {
+	RTCP_RTPFB_GNACK = 1  /**< Generic NACK */
+};
+
+/** Payload-Specific Feedback Messages */
+enum rtcp_psfb {
+	RTCP_PSFB_PLI  = 1,   /**< Picture Loss Indication (PLI) */
+	RTCP_PSFB_SLI  = 2,   /**< Slice Loss Indication (SLI)   */
+	RTCP_PSFB_AFB  = 15,  /**< Application layer Feedback Messages */
+};
+
+/** Reception report block */
+struct rtcp_rr {
+	uint32_t ssrc;            /**< Data source being reported      */
+	unsigned int fraction:8;  /**< Fraction lost since last SR/RR  */
+	int lost:24;              /**< Cumul. no. pkts lost (signed!)  */
+	uint32_t last_seq;        /**< Extended last seq. no. received */
+	uint32_t jitter;          /**< Interarrival jitter             */
+	uint32_t lsr;             /**< Last SR packet from this source */
+	uint32_t dlsr;            /**< Delay since last SR packet      */
+};
+
+/** SDES item */
+struct rtcp_sdes_item {
+	enum rtcp_sdes_type type; /**< Type of item (enum rtcp_sdes_type) */
+	uint8_t length;           /**< Length of item (in octets)         */
+	char *data;               /**< Text, not null-terminated          */
+};
+
+/** One RTCP Message */
+struct rtcp_msg {
+	/** RTCP Header */
+	struct rtcp_hdr {
+		unsigned int version:2;  /**< Protocol version       */
+		unsigned int p:1;        /**< Padding flag           */
+		unsigned int count:5;    /**< Varies by packet type  */
+		unsigned int pt:8;       /**< RTCP packet type       */
+		uint16_t length;         /**< Packet length in words */
+	} hdr;
+	union {
+		/** Sender report (SR) */
+		struct {
+			uint32_t ssrc;        /**< Sender generating report  */
+			uint32_t ntp_sec;     /**< NTP timestamp - seconds   */
+			uint32_t ntp_frac;    /**< NTP timestamp - fractions */
+			uint32_t rtp_ts;      /**< RTP timestamp             */
+			uint32_t psent;       /**< RTP packets sent          */
+			uint32_t osent;       /**< RTP octets sent           */
+			struct rtcp_rr *rrv;  /**< Reception report blocks   */
+		} sr;
+
+		/** Reception report (RR) */
+		struct {
+			uint32_t ssrc;        /**< Receiver generating report*/
+			struct rtcp_rr *rrv;  /**< Reception report blocks   */
+		} rr;
+
+		/** Source Description (SDES) */
+		struct rtcp_sdes {
+			uint32_t src;         /**< First SSRC/CSRC           */
+			struct rtcp_sdes_item *itemv;  /**< SDES items       */
+			uint32_t n;           /**< Number of SDES items      */
+		} *sdesv;
+
+		/** BYE */
+		struct {
+			uint32_t *srcv;    /**< List of sources              */
+			char *reason;      /**< Reason for leaving (opt.)    */
+		} bye;
+
+		/** Application-defined (APP) */
+		struct {
+			uint32_t src;      /**< SSRC/CSRC                  */
+			char name[4];      /**< Name (ASCII)               */
+			uint8_t *data;     /**< Application data (32 bits) */
+			size_t data_len;   /**< Number of data bytes       */
+		} app;
+
+		/** Full INTRA-frame Request (FIR) packet */
+		struct {
+			uint32_t ssrc;  /**< SSRC for sender of this packet */
+		} fir;
+
+		/** Negative ACKnowledgements (NACK) packet */
+		struct {
+			uint32_t ssrc;  /**< SSRC for sender of this packet */
+			uint16_t fsn;   /**< First Sequence Number lost     */
+			uint16_t blp;   /**< Bitmask of lost packets        */
+		} nack;
+
+		/** Feedback (RTPFB or PSFB) packet */
+		struct {
+			uint32_t ssrc_packet;
+			uint32_t ssrc_media;
+			uint32_t n;
+			/** Feedback Control Information (FCI) */
+			union {
+				struct gnack {
+					uint16_t pid;
+					uint16_t blp;
+				} *gnackv;
+				struct sli {
+					uint16_t first;
+					uint16_t number;
+					uint8_t picid;
+				} *sliv;
+				struct mbuf *afb;
+				void *p;
+			} fci;
+		} fb;
+	} r;
+};
+
+/** RTCP Statistics */
+struct rtcp_stats {
+	struct {
+		uint32_t sent;  /**< Tx RTP Packets                  */
+		int lost;       /**< Tx RTP Packets Lost             */
+		uint32_t jit;   /**< Tx Inter-arrival Jitter in [us] */
+	} tx;
+	struct {
+		uint32_t sent;  /**< Rx RTP Packets                  */
+		int lost;       /**< Rx RTP Packets Lost             */
+		uint32_t jit;   /**< Rx Inter-Arrival Jitter in [us] */
+	} rx;
+	uint32_t rtt;           /**< Current Round-Trip Time in [us] */
+};
+
+struct sa;
+struct re_printf;
+struct rtp_sock;
+
+typedef void (rtp_recv_h)(const struct sa *src, const struct rtp_header *hdr,
+			  struct mbuf *mb, void *arg);
+typedef void (rtcp_recv_h)(const struct sa *src, struct rtcp_msg *msg,
+			   void *arg);
+
+/* RTP api */
+int   rtp_alloc(struct rtp_sock **rsp);
+int   rtp_listen(struct rtp_sock **rsp, int proto, const struct sa *ip,
+		 uint16_t min_port, uint16_t max_port, bool enable_rtcp,
+		 rtp_recv_h *recvh, rtcp_recv_h *rtcph, void *arg);
+int   rtp_hdr_encode(struct mbuf *mb, const struct rtp_header *hdr);
+int   rtp_hdr_decode(struct rtp_header *hdr, struct mbuf *mb);
+int   rtp_encode(struct rtp_sock *rs, bool ext, bool marker, uint8_t pt,
+		 uint32_t ts, struct mbuf *mb);
+int   rtp_decode(struct rtp_sock *rs, struct mbuf *mb, struct rtp_header *hdr);
+int   rtp_send(struct rtp_sock *rs, const struct sa *dst, bool ext,
+	       bool marker, uint8_t pt, uint32_t ts, struct mbuf *mb);
+int   rtp_debug(struct re_printf *pf, const struct rtp_sock *rs);
+void *rtp_sock(const struct rtp_sock *rs);
+uint32_t rtp_sess_ssrc(const struct rtp_sock *rs);
+const struct sa *rtp_local(const struct rtp_sock *rs);
+
+/* RTCP session api */
+void  rtcp_start(struct rtp_sock *rs, const char *cname,
+		 const struct sa *peer);
+void  rtcp_enable_mux(struct rtp_sock *rs, bool enabled);
+void  rtcp_set_srate(struct rtp_sock *rs, uint32_t sr_tx, uint32_t sr_rx);
+void  rtcp_set_srate_tx(struct rtp_sock *rs, uint32_t srate_tx);
+void  rtcp_set_srate_rx(struct rtp_sock *rs, uint32_t srate_rx);
+int   rtcp_send_app(struct rtp_sock *rs, const char name[4],
+		    const uint8_t *data, size_t len);
+int   rtcp_send_fir(struct rtp_sock *rs, uint32_t ssrc);
+int   rtcp_send_nack(struct rtp_sock *rs, uint16_t fsn, uint16_t blp);
+int   rtcp_send_pli(struct rtp_sock *rs, uint32_t fb_ssrc);
+int   rtcp_debug(struct re_printf *pf, const struct rtp_sock *rs);
+void *rtcp_sock(const struct rtp_sock *rs);
+int   rtcp_stats(struct rtp_sock *rs, uint32_t ssrc, struct rtcp_stats *stats);
+
+/* RTCP utils */
+int   rtcp_encode(struct mbuf *mb, enum rtcp_type type, uint32_t count, ...);
+int   rtcp_decode(struct rtcp_msg **msgp, struct mbuf *mb);
+int   rtcp_msg_print(struct re_printf *pf, const struct rtcp_msg *msg);
+int   rtcp_sdes_encode(struct mbuf *mb, uint32_t src, uint32_t itemc, ...);
+const char *rtcp_type_name(enum rtcp_type type);
+const char *rtcp_sdes_name(enum rtcp_sdes_type sdes);