From d6b9da1178a8e84d1bf999337c058440826d3f54 Mon Sep 17 00:00:00 2001
From: Jordi Ortiz <nenjordi@gmail.com>
Date: Fri, 17 Aug 2012 18:38:59 +0200
Subject: [PATCH] avio: add (ff)url_get_multi_file_handle() for getting more
 than one fd
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Martin Storsjö <martin@martin.st>
---
 libavformat/avio.c     | 15 +++++++++++++++
 libavformat/rtpproto.c | 30 ++++++++++++++++++++++--------
 libavformat/url.h      |  9 +++++++++
 3 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/libavformat/avio.c b/libavformat/avio.c
index 5acaf30e908..45ee86688f3 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -344,6 +344,21 @@ int ffurl_get_file_handle(URLContext *h)
     return h->prot->url_get_file_handle(h);
 }
 
+int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
+{
+    if (!h->prot->url_get_multi_file_handle) {
+        if (!h->prot->url_get_file_handle)
+            return AVERROR(ENOSYS);
+        *handles = av_malloc(sizeof(*handles));
+        if (!*handles)
+            return AVERROR(ENOMEM);
+        *numhandles = 1;
+        *handles[0] = h->prot->url_get_file_handle(h);
+        return 0;
+    }
+    return h->prot->url_get_multi_file_handle(h, handles, numhandles);
+}
+
 int ffurl_shutdown(URLContext *h, int flags)
 {
     if (!h->prot->url_shutdown)
diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index e70b89ec9e8..fc1ae06df39 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -320,13 +320,27 @@ int ff_rtp_get_rtcp_file_handle(URLContext *h) {
     return s->rtcp_fd;
 }
 
+static int rtp_get_multi_file_handle(URLContext *h, int **handles,
+                                     int *numhandles)
+{
+    RTPContext *s = h->priv_data;
+    int *hs       = *handles = av_malloc(sizeof(**handles) * 2);
+    if (!hs)
+        return AVERROR(ENOMEM);
+    hs[0] = s->rtp_fd;
+    hs[1] = s->rtcp_fd;
+    *numhandles = 2;
+    return 0;
+}
+
 URLProtocol ff_rtp_protocol = {
-    .name                = "rtp",
-    .url_open            = rtp_open,
-    .url_read            = rtp_read,
-    .url_write           = rtp_write,
-    .url_close           = rtp_close,
-    .url_get_file_handle = rtp_get_file_handle,
-    .priv_data_size      = sizeof(RTPContext),
-    .flags               = URL_PROTOCOL_FLAG_NETWORK,
+    .name                      = "rtp",
+    .url_open                  = rtp_open,
+    .url_read                  = rtp_read,
+    .url_write                 = rtp_write,
+    .url_close                 = rtp_close,
+    .url_get_file_handle       = rtp_get_file_handle,
+    .url_get_multi_file_handle = rtp_get_multi_file_handle,
+    .priv_data_size            = sizeof(RTPContext),
+    .flags                     = URL_PROTOCOL_FLAG_NETWORK,
 };
diff --git a/libavformat/url.h b/libavformat/url.h
index 0f0de7881cc..195a8ff6585 100644
--- a/libavformat/url.h
+++ b/libavformat/url.h
@@ -81,6 +81,8 @@ typedef struct URLProtocol {
     int64_t (*url_read_seek)(URLContext *h, int stream_index,
                              int64_t timestamp, int flags);
     int (*url_get_file_handle)(URLContext *h);
+    int (*url_get_multi_file_handle)(URLContext *h, int **handles,
+                                     int *numhandles);
     int (*url_shutdown)(URLContext *h, int flags);
     int priv_data_size;
     const AVClass *priv_data_class;
@@ -201,6 +203,13 @@ int64_t ffurl_size(URLContext *h);
  */
 int ffurl_get_file_handle(URLContext *h);
 
+/**
+ * Return the file descriptors associated with this URL.
+ *
+ * @return 0 on success or <0 on error.
+ */
+int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles);
+
 /**
  * Signal the URLContext that we are done reading or writing the stream.
  *
-- 
GitLab