OSDN Git Service

rtmp: Reduce the number of idle posts sent by sleeping 50ms
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 19 Jun 2012 11:21:09 +0000 (13:21 +0200)
committerMartin Storsjö <martin@martin.st>
Tue, 19 Jun 2012 17:21:21 +0000 (20:21 +0300)
Rtmpt is effectively half duplex - the server can't return any
data unless we send a request (to which the server responds). If
we don't have any data to send currently, and the server didn't
return any data either, wait a little before doing the next request.

This avoids busy looping with idle posts with empty replies, while
waiting for more data from the server.

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

index fdcff50..544b493 100644 (file)
@@ -24,6 +24,8 @@
  * RTMP HTTP protocol
  */
 
+#include <unistd.h>
+
 #include "libavutil/avstring.h"
 #include "libavutil/intfloat.h"
 #include "libavutil/opt.h"
@@ -44,6 +46,7 @@ typedef struct RTMP_HTTPContext {
     int          out_capacity;      ///< current output buffer capacity
     int          initialized;       ///< flag indicating when the http context is initialized
     int          finishing;         ///< flag indicating when the client closes the connection
+    int          nb_bytes_read;     ///< number of bytes read since the last request
 } RTMP_HTTPContext;
 
 static int rtmp_http_send_cmd(URLContext *h, const char *cmd)
@@ -70,6 +73,9 @@ static int rtmp_http_send_cmd(URLContext *h, const char *cmd)
     if ((ret = ffurl_read(rt->stream, &c, 1)) < 0)
         return ret;
 
+    /* re-init the number of bytes read */
+    rt->nb_bytes_read = 0;
+
     return ret;
 }
 
@@ -117,6 +123,12 @@ static int rtmp_http_read(URLContext *h, uint8_t *buf, int size)
                 if ((ret = rtmp_http_send_cmd(h, "send")) < 0)
                     return ret;
             } else {
+                if (rt->nb_bytes_read == 0) {
+                    /* Wait 50ms before retrying to read a server reply in
+                     * order to reduce the number of idle requets. */
+                    usleep(50000);
+                }
+
                 if ((ret = rtmp_http_write(h, "", 1)) < 0)
                     return ret;
 
@@ -131,6 +143,7 @@ static int rtmp_http_read(URLContext *h, uint8_t *buf, int size)
         } else {
             off  += ret;
             size -= ret;
+            rt->nb_bytes_read += ret;
         }
     } while (off <= 0);