Module: libav
Branch: master
Commit: 9d811fd80fbd94a0e44d87cf8ccdab96c2a4af04

Author:    Samuel Pitoiset <samuel.pitoi...@gmail.com>
Committer: Martin Storsjö <mar...@martin.st>
Date:      Tue Jun 19 13:21:09 2012 +0200

rtmp: Reduce the number of idle posts sent by sleeping 50ms

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ö <mar...@martin.st>

---

 libavformat/rtmphttp.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/libavformat/rtmphttp.c b/libavformat/rtmphttp.c
index fdcff50..544b493 100644
--- a/libavformat/rtmphttp.c
+++ b/libavformat/rtmphttp.c
@@ -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);
 

_______________________________________________
libav-commits mailing list
libav-commits@libav.org
https://lists.libav.org/mailman/listinfo/libav-commits

Reply via email to