]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Send metadata too large for UDP maximum message size into chunks. 533/head
authorPaul Guyot <paulguyot@ieee.org>
Sun, 4 Jun 2017 14:15:13 +0000 (14:15 +0000)
committerPaul Guyot <paulguyot@ieee.org>
Sun, 4 Jun 2017 14:15:13 +0000 (14:15 +0000)
rtsp.c

diff --git a/rtsp.c b/rtsp.c
index b2c08ca936c73aae8a90c4946b9433460495506b..af8ada5105b64fbf84d67699add4f27a7ebd13eb 100644 (file)
--- a/rtsp.c
+++ b/rtsp.c
@@ -1083,6 +1083,44 @@ void metadata_process(uint32_t type, uint32_t code, char *data, uint32_t length)
     memcpy(ptr, data, length);
     sendto(metadata_sock, metadata_sockmsg, length + 8, 0, (struct sockaddr *)&metadata_sockaddr,
            sizeof(metadata_sockaddr));
+  } else if (metadata_sock >= 0) {
+    // send metadata in numbered chunks
+    uint32_t chunk_ix = 0;
+    uint32_t chunk_total = length / (config.metadata_sockmsglength - 24);
+    if (chunk_total * (config.metadata_sockmsglength - 24) < length) {
+        chunk_total++;
+    }
+    uint32_t remaining = length;
+    uint32_t v;
+    char* data_crsr = data;
+    do {
+      char *ptr = metadata_sockmsg;
+      memcpy(ptr, "ssncchnk", 8);
+      ptr += 8;
+      v = htonl(chunk_ix);
+      memcpy(ptr, &v, 4);
+      ptr += 4;
+      v = htonl(chunk_total);
+      memcpy(ptr, &v, 4);
+      ptr += 4;
+      v = htonl(type);
+      memcpy(ptr, &v, 4);
+      ptr += 4;
+      v = htonl(code);
+      memcpy(ptr, &v, 4);
+      ptr += 4;
+      uint32_t datalen = remaining;
+      if (datalen > config.metadata_sockmsglength - 24) {
+          datalen = config.metadata_sockmsglength - 24;
+      }
+      memcpy(ptr, data_crsr, datalen);
+      data_crsr += datalen;
+      sendto(metadata_sock, metadata_sockmsg, datalen + 24, 0, (struct sockaddr *)&metadata_sockaddr,
+             sizeof(metadata_sockaddr));
+      chunk_ix++;
+      remaining -= datalen;
+      if (remaining == 0) break;
+    } while (1);
   }
 
   // readers may go away and come back