[FFmpeg-devel] [PATCH 1/2] avformat/libsrt: support bidirectional transmission

Zhao Zhili quinkblack at foxmail.com
Tue May 18 19:03:20 EEST 2021


---
There is no good use case yet. Patch 2/2 is only used for test.

 libavformat/libsrt.c | 35 +++++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
index c1e96f700e..a05921d9f0 100644
--- a/libavformat/libsrt.c
+++ b/libavformat/libsrt.c
@@ -163,10 +163,17 @@ static int libsrt_socket_nonblock(int socket, int enable)
     return srt_setsockopt(socket, 0, SRTO_RCVSYN, &blocking, sizeof(blocking));
 }
 
-static int libsrt_epoll_create(URLContext *h, int fd, int write)
+static int libsrt_epoll_create(URLContext *h, int fd, int flags)
 {
-    int modes = SRT_EPOLL_ERR | (write ? SRT_EPOLL_OUT : SRT_EPOLL_IN);
-    int eid = srt_epoll_create();
+    int modes;
+    int eid;
+
+    modes = SRT_EPOLL_ERR;
+    if (flags & AVIO_FLAG_WRITE)
+        modes |= SRT_EPOLL_OUT;
+    if (flags & AVIO_FLAG_READ)
+        modes |= SRT_EPOLL_IN;
+    eid = srt_epoll_create();
     if (eid < 0)
         return libsrt_neterrno(h);
     if (srt_epoll_add_usock(eid, fd, &modes) < 0) {
@@ -178,14 +185,26 @@ static int libsrt_epoll_create(URLContext *h, int fd, int write)
 
 static int libsrt_network_wait_fd(URLContext *h, int eid, int write)
 {
-    int ret, len = 1, errlen = 1;
+    int ret, len = 1, errlen;
     SRTSOCKET ready[1];
     SRTSOCKET error[1];
+    SRTSOCKET *error_ptr;
+    int *errlen_ptr;
+    if ((h->flags & AVIO_FLAG_READ_WRITE) == AVIO_FLAG_READ_WRITE) {
+        // cannot detect error in this case
+        errlen = 0;
+        error_ptr = NULL;
+        errlen_ptr = NULL;
+    } else {
+        errlen = 1;
+        error_ptr = error;
+        errlen_ptr = &errlen;
+    }
 
     if (write) {
-        ret = srt_epoll_wait(eid, error, &errlen, ready, &len, POLLING_TIME, 0, 0, 0, 0);
+        ret = srt_epoll_wait(eid, error_ptr, errlen_ptr, ready, &len, POLLING_TIME, 0, 0, 0, 0);
     } else {
-        ret = srt_epoll_wait(eid, ready, &len, error, &errlen, POLLING_TIME, 0, 0, 0, 0);
+        ret = srt_epoll_wait(eid, ready, &len, error_ptr, errlen_ptr, POLLING_TIME, 0, 0, 0, 0);
     }
     if (ret < 0) {
         if (srt_getlasterror(NULL) == SRT_ETIMEOUT)
@@ -435,7 +454,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags)
     if (libsrt_socket_nonblock(fd, 1) < 0)
         av_log(h, AV_LOG_DEBUG, "libsrt_socket_nonblock failed\n");
 
-    ret = write_eid = libsrt_epoll_create(h, fd, 1);
+    ret = write_eid = libsrt_epoll_create(h, fd, AVIO_FLAG_WRITE);
     if (ret < 0)
         goto fail1;
     if (s->mode == SRT_MODE_LISTENER) {
@@ -479,7 +498,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags)
             h->max_packet_size = packet_size;
     }
 
-    ret = eid = libsrt_epoll_create(h, fd, flags & AVIO_FLAG_WRITE);
+    ret = eid = libsrt_epoll_create(h, fd, flags);
     if (eid < 0)
         goto fail1;
 
-- 
2.25.1



More information about the ffmpeg-devel mailing list