ref: 3938bfd0e1bc846d92f3509b7c52a5ebae34b092
parent: d1a0b0d116f2fd4d528b59754b31c49252960e9f
author: Ralph Giles <[email protected]>
date: Mon Oct 1 11:39:44 EDT 2012
Add serialize_rtp_header. Start of rtp packet send support.
--- a/src/opusrtp.c
+++ b/src/opusrtp.c
@@ -70,7 +70,6 @@
p[3] = (v >> 24) & 0xff;
}
-
/* helper, write a little-endian 16 bit int to memory */
void le16(unsigned char *p, int v)
{
@@ -78,6 +77,23 @@
p[1] = (v >> 8) & 0xff;
}
+/* helper, write a big-endian 32 bit int to memory */
+void be32(unsigned char *p, int v)
+{
+ p[0] = (v >> 24) & 0xff;
+ p[1] = (v >> 16) & 0xff;
+ p[2] = (v >> 8) & 0xff;
+ p[3] = v & 0xff;
+}
+
+/* helper, write a big-endian 16 bit int to memory */
+void be16(unsigned char *p, int v)
+{
+ p[0] = (v >> 8) & 0xff;
+ p[1] = v & 0xff;
+}
+
+
/* manufacture a generic OpusHead packet */
ogg_packet *op_opushead(void)
{
@@ -360,6 +376,39 @@
if (size < rtp->header_size) {
fprintf(stderr, "Packet too short for RTP header\n");
return -1;
+ }
+
+ return 0;
+}
+
+int serialize_rtp_header(unsigned char *packet, int size, rtp_header *rtp)
+{
+ int i;
+
+ if (!packet || !rtp) {
+ return -2;
+ }
+ if (size < RTP_HEADER_MIN) {
+ fprintf(stderr, "Packet buffer too short for RTP\n");
+ return -1;
+ }
+ if (size < rtp->header_size) {
+ fprintf(stderr, "Packet buffer too short for declared RTP header size\n");
+ return -3;
+ }
+ packet[0] = ((rtp->version & 3) << 6) |
+ ((rtp->pad & 1) << 5) |
+ ((rtp->ext & 1) << 4) |
+ ((rtp->cc & 7));
+ packet[1] = ((rtp->mark & 1) << 7) |
+ ((rtp->type & 127));
+ be16(packet+2, rtp->seq);
+ be32(packet+4, rtp->time);
+ be32(packet+8, rtp->ssrc);
+ if (rtp->cc && rtp->csrc) {
+ for (i = 0; i < rtp->cc; i++) {
+ be32(packet + 12 + i*4, rtp->csrc[i]);
+ }
}
return 0;