PR #21415 opened by colekas
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21415
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21415.patch

According to 
https://github.com/Haivision/srt/blob/master/docs/apps/srt-live-transmit.md#medium-srt
 a local port and adapter can be specified to allow for NAT traversal when 
setting up a Rendezvous mode connection.

Slight re-working from this patch from 2018 - 
https://patchwork.ffmpeg.org/project/ffmpeg/patch/db8pr09mb29692763876cd366a90bc048c5...@db8pr09mb2969.eurprd09.prod.outlook.com/


>From ced2f184d9b38fd854992a740101461a32bc5886 Mon Sep 17 00:00:00 2001
From: Christopher Olekas <[email protected]>
Date: Thu, 8 Jan 2026 15:47:53 -0500
Subject: [PATCH] libavformat/libsrt: Allow for specifying different port and
 adapter in SRT Rendezvous mode.

According to 
https://github.com/Haivision/srt/blob/master/docs/apps/srt-live-transmit.md#medium-srt
a local port and adapter can be specified to allow for NAT traversal when 
setting up a
Rendezvous mode connection.
---
 libavformat/libsrt.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
index ba04d9f782..d490244efc 100644
--- a/libavformat/libsrt.c
+++ b/libavformat/libsrt.c
@@ -93,6 +93,8 @@ typedef struct SRTContext {
     SRT_TRANSTYPE transtype;
     int linger;
     int tsbpd;
+    char *adapter;
+    int port;
 } SRTContext;
 
 #define D AV_OPT_FLAG_DECODING_PARAM
@@ -146,6 +148,8 @@ static const AVOption libsrt_options[] = {
     { "file",           NULL, 0, AV_OPT_TYPE_CONST,  { .i64 = SRTT_FILE }, 
INT_MIN, INT_MAX, .flags = D|E, .unit = "transtype" },
     { "linger",         "Number of seconds that the socket waits for unsent 
data when closing", OFFSET(linger),           AV_OPT_TYPE_INT,      { .i64 = -1 
}, -1, INT_MAX,   .flags = D|E },
     { "tsbpd",          "Timestamp-based packet delivery",                     
                 OFFSET(tsbpd),            AV_OPT_TYPE_BOOL,     { .i64 = -1 }, 
-1, 1,         .flags = D|E },
+    { "adapter",        "IP address of network card to use in rendezvous 
mode",                 OFFSET(adapter),          AV_OPT_TYPE_STRING,   { .str = 
NULL },              .flags = D|E },
+    { "port",           "Local port to use in rendezvous mode",                
                 OFFSET(port),             AV_OPT_TYPE_INT,      { .i64 = -1 }, 
-1, 65535,     .flags = D|E },
     { NULL }
 };
 
@@ -384,13 +388,14 @@ static int libsrt_set_options_pre(URLContext *h, int fd)
 static int libsrt_setup(URLContext *h, const char *uri, int flags)
 {
     struct addrinfo hints = { 0 }, *ai, *cur_ai;
-    int port, fd;
+    int port, fd = -1;
     SRTContext *s = h->priv_data;
     int ret;
     char hostname[1024],proto[1024],path[1024];
     char portstr[10];
     int64_t open_timeout = 0;
     int eid;
+    struct sockaddr_in la = { 0 };
 
     av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname),
         &port, path, sizeof(path), uri);
@@ -418,6 +423,22 @@ static int libsrt_setup(URLContext *h, const char *uri, 
int flags)
 
     cur_ai = ai;
 
+    if (s->mode == SRT_MODE_RENDEZVOUS) {
+        // Copy remote port to local address struct in case port is not set
+        if (cur_ai->ai_family == AF_INET) {
+            struct sockaddr_in *sin = (struct sockaddr_in *)cur_ai->ai_addr;
+            la.sin_family = AF_INET;
+            la.sin_port = sin->sin_port;
+        }
+
+        if (s->port != -1) {
+            la.sin_port = htons(s->port);
+        }
+        if (s->adapter != NULL) {
+            la.sin_addr.s_addr = inet_addr(s->adapter);
+        }
+    }
+
  restart:
 
 #if SRT_VERSION_VALUE >= 0x010401
@@ -461,7 +482,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int 
flags)
         if (ret < 0)
             goto fail1;
         if (s->mode == SRT_MODE_RENDEZVOUS) {
-            if (srt_bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen)) {
+            if (srt_bind(fd, (struct sockaddr *)&la, sizeof(struct 
sockaddr_in))) {
                 ret = libsrt_neterrno(h);
                 srt_epoll_release(write_eid);
                 goto fail1;
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to