aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2012-06-19 13:21:09 +0200
committerMartin Storsjö <martin@martin.st>2012-06-19 20:21:21 +0300
commit9d811fd80fbd94a0e44d87cf8ccdab96c2a4af04 (patch)
tree81457d4b90739017fb5f4f210fa59c2791cf7717
parent4cc2920dd2c0ce4e64e709da4f78508e1ec9871e (diff)
downloadffmpeg-9d811fd80fbd94a0e44d87cf8ccdab96c2a4af04.tar.gz
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ö <martin@martin.st>
-rw-r--r--libavformat/rtmphttp.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/libavformat/rtmphttp.c b/libavformat/rtmphttp.c
index fdcff50bed..544b493500 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);