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/src/rtmp/chunk.c b/src/rtmp/chunk.c
new file mode 100644
index 0000000..bab08bb
--- /dev/null
+++ b/src/rtmp/chunk.c
@@ -0,0 +1,87 @@
+/**
+ * @file rtmp/chunk.c  Real Time Messaging Protocol (RTMP) -- Chunking
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+#include <string.h>
+#include <re_types.h>
+#include <re_fmt.h>
+#include <re_mem.h>
+#include <re_mbuf.h>
+#include <re_net.h>
+#include <re_sa.h>
+#include <re_tcp.h>
+#include <re_list.h>
+#include <re_rtmp.h>
+#include "rtmp.h"
+
+
+/*
+ * Stateless RTMP chunker
+ */
+int rtmp_chunker(unsigned format, uint32_t chunk_id,
+		 uint32_t timestamp, uint32_t timestamp_delta,
+		 uint8_t msg_type_id, uint32_t msg_stream_id,
+		 const uint8_t *payload, size_t payload_len,
+		 size_t max_chunk_sz, struct tcp_conn *tc)
+{
+	const uint8_t *pend = payload + payload_len;
+	struct rtmp_header hdr;
+	struct mbuf *mb;
+	size_t chunk_sz;
+	int err;
+
+	if (!payload || !payload_len || !max_chunk_sz || !tc)
+		return EINVAL;
+
+	mb = mbuf_alloc(payload_len + 256);
+	if (!mb)
+		return ENOMEM;
+
+	memset(&hdr, 0, sizeof(hdr));
+
+	hdr.format = format;
+	hdr.chunk_id = chunk_id;
+
+	hdr.timestamp       = timestamp;
+	hdr.timestamp_delta = timestamp_delta;
+	hdr.length          = (uint32_t)payload_len;
+	hdr.type_id         = msg_type_id;
+	hdr.stream_id       = msg_stream_id;
+
+	chunk_sz = min(payload_len, max_chunk_sz);
+
+	err  = rtmp_header_encode(mb, &hdr);
+	err |= mbuf_write_mem(mb, payload, chunk_sz);
+	if (err)
+		goto out;
+
+	payload += chunk_sz;
+
+	hdr.format = 3;
+
+	while (payload < pend) {
+
+		const size_t len = pend - payload;
+
+		chunk_sz = min(len, max_chunk_sz);
+
+		err  = rtmp_header_encode(mb, &hdr);
+		err |= mbuf_write_mem(mb, payload, chunk_sz);
+		if (err)
+			goto out;
+
+		payload += chunk_sz;
+	}
+
+	mb->pos = 0;
+
+	err = tcp_send(tc, mb);
+	if (err)
+		goto out;
+
+ out:
+	mem_deref(mb);
+
+	return err;
+}