]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
satip server: configure TCP socket send buffer size for TCP data mode
authorJaroslav Kysela <perex@perex.cz>
Tue, 8 Aug 2017 14:39:01 +0000 (16:39 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 18 Sep 2017 13:18:10 +0000 (15:18 +0200)
src/satip/rtp.c

index cdb1abe437b26da18e6f1b94617a276cab015237..d0d88fafd511399ca03ba3a8e90acb93817ac11c 100644 (file)
@@ -36,6 +36,9 @@
 #define RTP_TCP_PAYLOAD (87*188+12+4) /* cca 16kB */
 #define RTCP_PAYLOAD (1420)
 
+#define RTP_TCP_BUFFER_SIZE (64*1024*1024)
+#define RTP_TCP_BUFFER_ROOM (2048)
+
 typedef struct satip_rtp_table {
   TAILQ_ENTRY(satip_rtp_table) link;
   mpegts_psi_table_t tbl;
@@ -63,6 +66,8 @@ typedef struct satip_rtp_session {
   udp_multisend_t um;
   struct iovec *um_iovec;
   struct iovec tcp_data;
+  uint32_t tcp_payload;
+  uint32_t tcp_buffer_size;
   int um_packet;
   uint16_t seq;
   signal_status_t sig;
@@ -294,18 +299,17 @@ satip_rtp_append_tcp_data(satip_rtp_session_t *rtp, uint8_t *data, size_t len)
   int r = 0;
 
   if (v->iov_base == NULL) {
-    v->iov_base = malloc(RTP_TCP_PAYLOAD);
+    v->iov_base = malloc(rtp->tcp_payload);
     satip_rtp_header(rtp, v, 4);
   }
-  assert(v->iov_len + len <= RTP_TCP_PAYLOAD);
+  assert(v->iov_len + len <= rtp->tcp_payload);
   memcpy(v->iov_base + v->iov_len, data, len);
   v->iov_len += len;
-  if (v->iov_len == RTP_TCP_PAYLOAD)
+  if (v->iov_len == rtp->tcp_payload)
     r = satip_rtp_flush_tcp_data(rtp);
   return r;
 }
 
-
 static int
 satip_rtp_tcp_loop(satip_rtp_session_t *rtp, uint8_t *data, int len)
 {
@@ -459,6 +463,8 @@ void *satip_rtp_queue(th_subscription_t *subs,
                       void *no_data_opaque)
 {
   satip_rtp_session_t *rtp = calloc(1, sizeof(*rtp));
+  size_t len;
+  socklen_t socklen;
   int dscp;
 
   if (rtp == NULL)
@@ -485,6 +491,22 @@ void *satip_rtp_queue(th_subscription_t *subs,
   if (port != RTSP_TCP_DATA) {
     udp_multisend_init(&rtp->um, RTP_PACKETS, RTP_PAYLOAD, &rtp->um_iovec);
     satip_rtp_header(rtp, rtp->um_iovec, 0);
+  } else {
+    socklen = sizeof(len);
+    if (getsockopt(fd_rtp, SOL_SOCKET, SO_SNDBUF, &len, &socklen) == 0 &&
+        len < RTP_TCP_BUFFER_SIZE) {
+      len = RTP_TCP_BUFFER_SIZE;
+      setsockopt(fd_rtp, SOL_SOCKET, SO_SNDBUF, &len, sizeof(len));
+    }
+    socklen = sizeof(len);
+    if (getsockopt(fd_rtp, SOL_SOCKET, SO_SNDBUF, &len, &socklen) == 0) {
+      rtp->tcp_buffer_size = len;
+      if (len - RTP_TCP_BUFFER_ROOM < rtp->tcp_payload) {
+        rtp->tcp_payload = len - RTP_TCP_BUFFER_ROOM;
+        rtp->tcp_payload -= rtp->tcp_payload % 188;
+        rtp->tcp_payload += 12 + 4;
+      }
+    }
   }
   rtp->frontend = frontend;
   rtp->dmc = *dmc;