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>
This commit is contained in:
Samuel Pitoiset 2012-06-19 13:21:09 +02:00 committed by Martin Storsjö
parent 4cc2920dd2
commit 9d811fd80f
1 changed files with 13 additions and 0 deletions

View File

@ -24,6 +24,8 @@
* RTMP HTTP protocol * RTMP HTTP protocol
*/ */
#include <unistd.h>
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "libavutil/intfloat.h" #include "libavutil/intfloat.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
@ -44,6 +46,7 @@ typedef struct RTMP_HTTPContext {
int out_capacity; ///< current output buffer capacity int out_capacity; ///< current output buffer capacity
int initialized; ///< flag indicating when the http context is initialized int initialized; ///< flag indicating when the http context is initialized
int finishing; ///< flag indicating when the client closes the connection int finishing; ///< flag indicating when the client closes the connection
int nb_bytes_read; ///< number of bytes read since the last request
} RTMP_HTTPContext; } RTMP_HTTPContext;
static int rtmp_http_send_cmd(URLContext *h, const char *cmd) 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) if ((ret = ffurl_read(rt->stream, &c, 1)) < 0)
return ret; return ret;
/* re-init the number of bytes read */
rt->nb_bytes_read = 0;
return ret; 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) if ((ret = rtmp_http_send_cmd(h, "send")) < 0)
return ret; return ret;
} else { } 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) if ((ret = rtmp_http_write(h, "", 1)) < 0)
return ret; return ret;
@ -131,6 +143,7 @@ static int rtmp_http_read(URLContext *h, uint8_t *buf, int size)
} else { } else {
off += ret; off += ret;
size -= ret; size -= ret;
rt->nb_bytes_read += ret;
} }
} while (off <= 0); } while (off <= 0);