[FFmpeg-cvslog] rtpproto: Simplify the rtp_read function by looping over the fds

Martin Storsjö git at videolan.org
Thu Aug 1 12:02:15 CEST 2013


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Wed Jul 31 12:21:47 2013 +0300| [892b0be1dfbdeaf71235fb6c593286e4f5c7e4ec] | committer: Martin Storsjö

rtpproto: Simplify the rtp_read function by looping over the fds

This avoids having duplicate code where only the fd parameter
differs.

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=892b0be1dfbdeaf71235fb6c593286e4f5c7e4ec
---

 libavformat/rtpproto.c |   25 ++++++-------------------
 1 file changed, 6 insertions(+), 19 deletions(-)

diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index 2ec57ee..c857318 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -324,7 +324,7 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size)
     RTPContext *s = h->priv_data;
     struct sockaddr_storage from;
     socklen_t from_len;
-    int len, n;
+    int len, n, i;
     struct pollfd p[2] = {{s->rtp_fd, POLLIN, 0}, {s->rtcp_fd, POLLIN, 0}};
     int poll_delay = h->flags & AVIO_FLAG_NONBLOCK ? 0 : 100;
 
@@ -333,25 +333,12 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size)
             return AVERROR_EXIT;
         n = poll(p, 2, poll_delay);
         if (n > 0) {
-            /* first try RTCP */
-            if (p[1].revents & POLLIN) {
-                from_len = sizeof(from);
-                len = recvfrom (s->rtcp_fd, buf, size, 0,
-                                (struct sockaddr *)&from, &from_len);
-                if (len < 0) {
-                    if (ff_neterrno() == AVERROR(EAGAIN) ||
-                        ff_neterrno() == AVERROR(EINTR))
-                        continue;
-                    return AVERROR(EIO);
-                }
-                if (rtp_check_source_lists(s, &from))
+            /* first try RTCP, then RTP */
+            for (i = 1; i >= 0; i--) {
+                if (!(p[i].revents & POLLIN))
                     continue;
-                break;
-            }
-            /* then RTP */
-            if (p[0].revents & POLLIN) {
                 from_len = sizeof(from);
-                len = recvfrom (s->rtp_fd, buf, size, 0,
+                len = recvfrom(p[i].fd, buf, size, 0,
                                 (struct sockaddr *)&from, &from_len);
                 if (len < 0) {
                     if (ff_neterrno() == AVERROR(EAGAIN) ||
@@ -361,7 +348,7 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size)
                 }
                 if (rtp_check_source_lists(s, &from))
                     continue;
-                break;
+                return len;
             }
         } else if (n < 0) {
             if (ff_neterrno() == AVERROR(EINTR))



More information about the ffmpeg-cvslog mailing list