rtpproto: Simplify the rtp_read function by looping over the fds
authorMartin Storsjö <martin@martin.st>
Wed, 31 Jul 2013 09:21:47 +0000 (12:21 +0300)
committerMartin Storsjö <martin@martin.st>
Wed, 31 Jul 2013 18:12:34 +0000 (21:12 +0300)
This avoids having duplicate code where only the fd parameter
differs.

Signed-off-by: Martin Storsjö <martin@martin.st>
libavformat/rtpproto.c

index 2ec57ee..c857318 100644 (file)
@@ -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))